From 6a64c56acb7e188f60c8c2d20cb4560f7f236766 Mon Sep 17 00:00:00 2001 From: Minxing Chu Date: Mon, 12 Oct 2026 07:35:29 +0000 Subject: [PATCH 1/7] glayout.sharing: explicit diffusion and gate sharing across transistors A SharingPlan fixes, for one group of same-polarity transistors, the finger order, the orientations, which neighbouring fingers share a diffusion node and how the gates are tied into poly straps. validate_plan checks a plan before any geometry is drawn (structured errors), build_mos_group draws it for any MappedPDK, and the sharing that really happened is measured again on the drawn shapes. group_candidates / named_plans enumerate plans over six discrete axes. Co-Authored-By: Claude Opus 5.5 --- src/glayout/sharing/README.md | 47 ++++ src/glayout/sharing/__init__.py | 16 ++ src/glayout/sharing/enumeration.py | 195 +++++++++++++ src/glayout/sharing/evidence.py | 109 +++++++ src/glayout/sharing/group.py | 438 +++++++++++++++++++++++++++++ src/glayout/sharing/rules.py | 269 ++++++++++++++++++ src/glayout/sharing/spec.py | 152 ++++++++++ 7 files changed, 1226 insertions(+) create mode 100644 src/glayout/sharing/README.md create mode 100644 src/glayout/sharing/__init__.py create mode 100644 src/glayout/sharing/enumeration.py create mode 100644 src/glayout/sharing/evidence.py create mode 100644 src/glayout/sharing/group.py create mode 100644 src/glayout/sharing/rules.py create mode 100644 src/glayout/sharing/spec.py diff --git a/src/glayout/sharing/README.md b/src/glayout/sharing/README.md new file mode 100644 index 00000000..908aa024 --- /dev/null +++ b/src/glayout/sharing/README.md @@ -0,0 +1,47 @@ +# glayout.sharing + +Diffusion and gate sharing across the transistors of one device group, written as an explicit plan that is checked +before any geometry is drawn and measured again on the geometry afterwards. Design notes: +[`benchmarks/textbook_sharing/docs/DESIGN.md`](../../../benchmarks/textbook_sharing/docs/DESIGN.md). + +| name | what it does | +|---|---| +| `DeviceSpec` | one SPICE transistor: id, `nfet`/`pfet`, drain, gate, source, body net, total width, length, finger count | +| `SharingPlan`, `FingerRef`, `GateGroup` | finger order, orientations, diffusion joins and gate straps of one group | +| `validate_plan(rules, devices, plan)` | checks a plan without drawing; returns an `EligibilityReport` (`ok`, `errors` with `code`, `message`, `where`) | +| `build_mos_group(pdk, devices, plan=...)` | draws the group for a `MappedPDK`; returns a `GroupResult` (component, metal-2 pins, applied plan, sharing evidence, geometry stats); raises `SharingPlanRejected` for an illegal plan | +| `independent_plan(devices)` | every transistor on its own (what base gLayout builds) | +| `group_candidates(pdk, devices)`, `named_plans(pdk, devices)` | the six-axis enumeration with legality and de-duplication; the named modes `independent`, `diffusion_only`, `gate_only`, `combined` | +| `evidence_from_gds(...)` | the sharing evidence recomputed from a GDS file | +| `rules_for(pdk)`, `OVERRIDES` | design-rule values used by the builder, with the audited deviations from the generic rule table | + +## Example: the PMOS mirror of a five-transistor OTA (SKY130) + +```python +from glayout.pdk.sky130_mapped import sky130_mapped_pdk as pdk +from glayout.sharing import (DeviceSpec, SharingPlan, FingerRef, GateGroup, validate_plan, build_mos_group, + rules_for, group_candidates) + +m4 = DeviceSpec("M4", "pfet", d="net22", g="net22", s="VDD", b="VDD", width_total=2.0, length=0.3, nf=4) +m5 = DeviceSpec("M5", "pfet", d="VOUT1", g="net22", s="VDD", b="VDD", width_total=2.0, length=0.3, nf=4) + +# M4's four fingers, then M5's; alternating orientation, every boundary shared (the M4|M5 boundary is VDD on both +# sides), and one poly strap on top for both gates (net22) with its pad at the right end +plan = SharingPlan(finger_order=[FingerRef("M4", k) for k in range(4)] + [FingerRef("M5", k) for k in range(4)], + orientations=["SD", "DS"] * 4, diffusion_joins=[True] * 7, + gate_groups=[GateGroup(tuple(range(8)), "top", "right")]) +assert validate_plan(rules_for(pdk), [m4, m5], plan).ok + +res = build_mos_group(pdk, [m4, m5], plan=plan, name="pmos_mirror") +ev = res.physical_sharing_evidence # measured on the drawn shapes, not taken from the plan +print(ev["active_islands"], ev["n_cross_device_shared_nodes"], ev["n_cross_device_gate_conductors"]) # 1 1 1 + +plan.orientations[4] = "DS" # M5 now shows its drain (VOUT1) to M4's source (VDD) +print(validate_plan(rules_for(pdk), [m4, m5], plan).errors[0]["code"]) # join_net_mismatch + +print(group_candidates(pdk, [m4, m5])["counts"]) # {'raw': 256, 'static_illegal': 8, 'equivalent_duplicate': 147, 'unique': 101} +``` + +The same calls work for `gf180_mapped_pdk` and `ihp130_mapped_pdk`. The plan never changes the netlist: widths, +lengths, finger counts and body nets come from the `DeviceSpec`s, and a plan that would need a different netlist is +rejected. diff --git a/src/glayout/sharing/__init__.py b/src/glayout/sharing/__init__.py new file mode 100644 index 00000000..4fcbe46f --- /dev/null +++ b/src/glayout/sharing/__init__.py @@ -0,0 +1,16 @@ +"""glayout.sharing: diffusion and gate sharing across the transistors of a device group. + +A SharingPlan states, for one group of same-polarity transistors, the order of the unit fingers, their orientation, +which neighbours share a diffusion node and how the gates are grouped into poly straps. validate_plan checks a plan +before any geometry is drawn; build_mos_group draws it for the active PDK and recomputes, from the drawn rectangles, +how many diffusion nodes and gate conductors are really shared. group_candidates / named_plans enumerate plans over +six discrete axes. +""" +from .spec import DeviceSpec, SharingPlan, FingerRef, GateGroup, GroupResult, EligibilityReport, SharingPlanRejected +from .rules import rules_for, GroupRules, OVERRIDES +from .group import build_mos_group, validate_plan, independent_plan +from .enumeration import group_candidates, named_plans, AXES, RAW_PER_GROUP +from .evidence import evidence_from_gds, evidence_from_regions +__all__ = ["DeviceSpec", "SharingPlan", "FingerRef", "GateGroup", "GroupResult", "EligibilityReport", "SharingPlanRejected", + "rules_for", "GroupRules", "OVERRIDES", "build_mos_group", "validate_plan", "independent_plan", + "evidence_from_gds", "evidence_from_regions", "group_candidates", "named_plans", "AXES", "RAW_PER_GROUP"] diff --git a/src/glayout/sharing/enumeration.py b/src/glayout/sharing/enumeration.py new file mode 100644 index 00000000..5d1b6002 --- /dev/null +++ b/src/glayout/sharing/enumeration.py @@ -0,0 +1,195 @@ +"""Candidate enumeration: six discrete axes per device group. + +Axis values meaning +arrangement block | interleave | abba | mirror finger order family (abba: exactly 2 devices with + even nf; mirror: every device has even nf; + otherwise the tuple is rejected) +orientation alt_SD | alt_DS | seek_SD | seek_DS alt_*: orientations alternate along the row starting + with source-left (SD) or drain-left (DS); + seek_*: start SD/DS, then every finger takes the + orientation whose left terminal carries the net of the + previous finger's right terminal (else it alternates) +diffusion none | all_legal none: only joins between adjacent fingers of the SAME + device (standard multi-finger device); all_legal: + every adjacent boundary whose facing nets are equal +gate per_device | per_net one poly strap per device | one per gate net +strap_start bottom | top side of the first strap group (by first finger); + later groups take that side unless their interval + overlaps a group already there, then the other side; + overlap on both sides -> rejected (unroutable) +contact_end left | right pad end of every strap (two top straps: the left one + must reach left, the right one right; a contradicting + value is rejected) + +Raw tuples per group: 4 x 4 x 2 x 2 x 2 x 2 = 256. Orientation uses the 'seek' policies rather than a uniform +source-left or source-right orientation: a uniform orientation puts S|D of the same device face to face at every finger +boundary, so no node could be shared even inside one device, and every such candidate is dominated by its alternating +counterpart, while the seek policies make cross-device sharing reachable for block and interleaved orders. +Each tuple -> SharingPlan -> static legality (validate_plan + strap routability) -> canonical plan id (geometry-relevant +fields) -> duplicates removed. No geometry is generated and no measurement is used here. Plans written directly as a +SharingPlan can express more than these axes (any finger order or strap partition); the enumeration is a family, not +the whole plan space.""" +from __future__ import annotations +import itertools +from .spec import DeviceSpec, SharingPlan, FingerRef, GateGroup +from .group import validate_plan, independent_plan +from .rules import rules_for + +ARRANGEMENTS = ("block", "interleave", "abba", "mirror") +ORIENTATIONS = ("alt_SD", "alt_DS", "seek_SD", "seek_DS") +DIFFUSION = ("none", "all_legal") +GATE = ("per_device", "per_net") +STRAP_START = ("bottom", "top") +CONTACT_END = ("left", "right") +AXES = {"arrangement": ARRANGEMENTS, "orientation": ORIENTATIONS, "diffusion": DIFFUSION, "gate": GATE, + "strap_start": STRAP_START, "contact_end": CONTACT_END} +RAW_PER_GROUP = 4 * 4 * 2 * 2 * 2 * 2 + + +def _order(devices, arrangement): + ids = [d.logical_id for d in devices]; nf = {d.logical_id: d.nf for d in devices} + fingers = {i: [FingerRef(i, k) for k in range(nf[i])] for i in ids} + if arrangement == "block": + return [f for i in ids for f in fingers[i]], None + if arrangement == "interleave": + if len(ids) < 2: return [f for i in ids for f in fingers[i]], None + out = []; q = {i: list(fingers[i]) for i in ids} + while any(q.values()): + for i in ids: + if q[i]: out.append(q[i].pop(0)) + return out, None + if arrangement == "abba": + if len(ids) != 2 or any(nf[i] % 2 for i in ids): + return None, "abba needs exactly two devices with even finger counts" + a, b = ids; fa, fb = list(fingers[a]), list(fingers[b]); out = [] + while fa or fb: + if fa: out.append(fa.pop(0)) + if fb: out.append(fb.pop(0)) + if fb: out.append(fb.pop(0)) + if fa: out.append(fa.pop(0)) + return out, None + if arrangement == "mirror": + if any(nf[i] % 2 for i in ids): + return None, "mirror needs even finger counts for every device" + halves = [fingers[i][: nf[i] // 2] for i in ids]; rest = [fingers[i][nf[i] // 2:] for i in ids] + return [f for h in halves for f in h] + [f for h in reversed(rest) for f in h], None + raise ValueError(arrangement) + + +def _orientations(order, dev, policy): + out = [] + start = "SD" if policy.endswith("SD") else "DS" + for i, f in enumerate(order): + if i == 0: + out.append(start); continue + if policy.startswith("alt"): + out.append("DS" if out[-1] == "SD" else "SD"); continue + pd = dev[order[i - 1].device]; d = dev[f.device] + prev_right = pd.d if out[-1] == "SD" else pd.s + if d.s == prev_right: out.append("SD") + elif d.d == prev_right: out.append("DS") + else: out.append("DS" if out[-1] == "SD" else "SD") + return out + + +def _joins(order, orient, dev, diffusion): + j = [] + for i in range(len(order) - 1): + a, b = order[i], order[i + 1]; da, db = dev[a.device], dev[b.device] + ar = da.d if orient[i] == "SD" else da.s + bl = db.s if orient[i + 1] == "SD" else db.d + same = a.device == b.device + j.append(bool(ar == bl and (same or diffusion == "all_legal"))) + return j + + +def _gate_groups(order, dev, gate, strap_start, contact_end): + n = len(order) + key = (lambda p: order[p].device) if gate == "per_device" else (lambda p: dev[order[p].device].g) + groups = {} + for p in range(n): groups.setdefault(key(p), []).append(p) + glist = sorted((tuple(v) for v in groups.values()), key=lambda g: g[0]) + other = "top" if strap_start == "bottom" else "bottom" + def reach(g, side, end): + lo, hi = min(g), max(g) + if side == "top": return (0, hi) if end == "left" else (lo, n - 1) + return (lo, hi) + assigned = [] # (group, side) + for g in glist: + lo, hi = min(g), max(g) + def clash(side): + for h, s in assigned: + if s != side: continue + if lo <= max(h) and min(h) <= hi: return True + return False + if not clash(strap_start): assigned.append((g, strap_start)) + elif not clash(other): assigned.append((g, other)) + else: return None, "gate straps overlap on both sides (unroutable)" + tops = [g for g, s in assigned if s == "top"] + ends = {} + if len(tops) > 2: + return None, "more than two top straps" + if len(tops) == 2: + a, b = sorted(tops, key=lambda g: min(g)) + ends[a] = "left"; ends[b] = "right" + if contact_end == "right": + return None, "two top straps need left/right pad ends; contact_end=right contradicts the left strap" + out = [] + for g, s in assigned: + out.append(GateGroup(tuple(g), s, ends.get(g, contact_end))) + return out, None + + +def group_candidates(pdk, devices: list[DeviceSpec]): + """Enumerate all raw tuples of one group. Returns {'rows': [...], 'unique': {plan_id: (tuple, plan)}, 'counts': {...}}.""" + rules = rules_for(pdk); dev = {d.logical_id: d for d in devices} + rows = []; unique = {} + for t in itertools.product(*AXES.values()): + tup = dict(zip(AXES.keys(), t)) + order, why = _order(devices, tup["arrangement"]) + if order is None: + rows.append({"tuple": tup, "status": "static_illegal", "reason": why}); continue + orient = _orientations(order, dev, tup["orientation"]) + joins = _joins(order, orient, dev, tup["diffusion"]) + gg, why = _gate_groups(order, dev, tup["gate"], tup["strap_start"], tup["contact_end"]) + if gg is None: + rows.append({"tuple": tup, "status": "static_illegal", "reason": why}); continue + plan = SharingPlan(order, orient, joins, gg, mode_label="axes:" + ",".join(f"{v}" for v in t)) + rep = validate_plan(rules, devices, plan) + if not rep.ok: + rows.append({"tuple": tup, "status": "static_illegal", "reason": "; ".join(e["code"] if isinstance(e, dict) else str(e) for e in rep.errors)}); continue + pid = plan.plan_id() + if pid in unique: + rows.append({"tuple": tup, "status": "equivalent_duplicate", "plan_id": pid, "duplicate_of": unique[pid][0]}); continue + unique[pid] = (tup, plan) + rows.append({"tuple": tup, "status": "unique", "plan_id": pid, "summary": plan.summary()}) + counts = {"raw": len(rows), "static_illegal": sum(r["status"] == "static_illegal" for r in rows), + "equivalent_duplicate": sum(r["status"] == "equivalent_duplicate" for r in rows), "unique": len(unique)} + return {"rows": rows, "unique": unique, "counts": counts} + + +NAMED_FLAGS = {"diffusion_only": ("all_legal", "per_device"), "gate_only": ("none", "per_net"), "combined": ("all_legal", "per_net")} + + +def named_plans(pdk, devices, cand=None): + """Named modes of one group. independent = devices in order, alternating fingers per device, one bottom strap per + device (what a generator that builds one transistor at a time produces). diffusion_only / gate_only / combined = the first unique candidate, + in the fixed axis order of AXES, whose diffusion/gate values are the mode's and that really shares (>= 1 + cross-device diffusion join for diffusion modes, >= 1 multi-device strap for gate modes; both for combined).""" + cand = cand or group_candidates(pdk, devices) + out = {"independent": independent_plan(devices)} + for mode, (dflag, gflag) in NAMED_FLAGS.items(): + pick = None + for row in cand["rows"]: + if row["status"] != "unique": continue + t = row["tuple"] + if t["diffusion"] != dflag or t["gate"] != gflag: continue + s = row["summary"] + need_d = mode in ("diffusion_only", "combined"); need_g = mode in ("gate_only", "combined") + if need_d and s["cross_device_diffusion_joins"] == 0: continue + if need_g and s["cross_device_gate_groups"] == 0: continue + pick = cand["unique"][row["plan_id"]][1]; break + if pick is not None: + pick.mode_label = mode + ":" + pick.mode_label + out[mode] = pick + return out diff --git a/src/glayout/sharing/evidence.py b/src/glayout/sharing/evidence.py new file mode 100644 index 00000000..fc04b34e --- /dev/null +++ b/src/glayout/sharing/evidence.py @@ -0,0 +1,109 @@ +"""Physical sharing evidence derived from geometry (never from plan labels). + +Two entry points: + evidence_from_rects - used by build_mos_group on the rectangles it just drew + evidence_from_gds - used by the evaluator on a written GDS file (independent re-derivation) +Both reduce to evidence_from_regions, which works on merged klayout Regions. +""" +from __future__ import annotations +import klayout.db as kdb + +DBU = 0.001 + + +def _region(rects, layer, dbu=DBU): + r = kdb.Region() + for (x0, y0, x1, y1) in rects.get(tuple(layer), []): + r.insert(kdb.Box(int(round(x0 / dbu)), int(round(y0 / dbu)), int(round(x1 / dbu)), int(round(y1 / dbu)))) + r.merge() + return r + + +def evidence_from_regions(active: kdb.Region, poly: kdb.Region, cont: kdb.Region, met1: kdb.Region, + node_records, gate_records, W, n_devices, dbu=DBU) -> dict: + """node_records: [{node, x, net, terminals:[dev:T], ...}], gate_records: [{device, x, net, group}]""" + def pt(x, y): + return kdb.Point(int(round(x / dbu)), int(round(y / dbu))) + islands = [p for p in active.merged().each()] + def island_of(x, y): + p = pt(x, y) + for i, isl in enumerate(islands): + if isl.inside(p): return i + return None + # diffusion nodes -> islands; a node shared across devices is a cross-device diffusion share + node_island = {}; cross_nodes = []; dev_islands = {} + for nd in node_records: + isl = island_of(nd["x"], W / 2) + node_island[nd["node"]] = isl + devs = sorted({t.split(":")[0] for t in nd["terminals"]}) + for d in devs: dev_islands.setdefault(d, set()).add(isl) + if len(devs) > 1: + cross_nodes.append({"node": nd["node"], "island": isl, "net": nd["net"], "terminals": nd["terminals"]}) + # gate conductors: connected poly components containing gates of >1 device + polys = [p for p in poly.merged().each()] + comp_devs = {} + for g in gate_records: + p = pt(g["x"], W / 2) + for i, pp in enumerate(polys): + if pp.inside(p): + comp_devs.setdefault(i, set()).add(g["device"]); break + shared_gate = [{"poly_component": i, "devices": sorted(d)} for i, d in comp_devs.items() if len(d) > 1] + # transistor count = connected regions of poly AND active + chan = (poly & active).merged() + n_channels = chan.count() + # contacts on active vs on poly + cont_act = (cont & active).count(); cont_poly = (cont & poly).count() + # island sharing: islands hosting >1 device + isl_devs = {} + for d, s in dev_islands.items(): + for i in s: isl_devs.setdefault(i, set()).add(d) + shared_islands = [{"island": i, "devices": sorted(ds)} for i, ds in isl_devs.items() if len(ds) > 1] + return { + "active_islands": len(islands), + "shared_diffusion_islands": shared_islands, + "cross_device_shared_nodes": cross_nodes, + "n_cross_device_shared_nodes": len(cross_nodes), + "shared_gate_conductors": shared_gate, + "n_cross_device_gate_conductors": len(shared_gate), + "poly_components": len(polys), + "channel_regions": n_channels, + "expected_fingers": len(gate_records), + "extra_mos_check": "ok" if n_channels == len(gate_records) else f"mismatch: {n_channels} channel regions vs {len(gate_records)} fingers", + "contacts_on_active": cont_act, "contacts_on_poly": cont_poly, + "active_area_um2": round(active.area() * dbu * dbu, 6), + "active_perimeter_um": round(active.merged().perimeter() * dbu, 4), + "poly_area_um2": round(poly.area() * dbu * dbu, 6), + "met1_area_um2": round(met1.area() * dbu * dbu, 6), + } + + +def evidence_from_rects(rules, rects, node_records, gate_records, W, n_devices, plan) -> dict: + lay = rules.layers + ev = evidence_from_regions(_region(rects, lay["active"]), _region(rects, lay["poly"]), _region(rects, lay["cont"]), _region(rects, lay["met1"]), + node_records, gate_records, W, n_devices) + ev["source"] = "builder_rectangles" + ev["plan_summary"] = plan.summary() + ev["consistency"] = { + "cross_device_joins_requested": plan.summary()["cross_device_diffusion_joins"], + "cross_device_nodes_found": ev["n_cross_device_shared_nodes"], + "cross_device_gate_groups_requested": plan.summary()["cross_device_gate_groups"], + "cross_device_gate_conductors_found": ev["n_cross_device_gate_conductors"], + } + return ev + + +def evidence_from_gds(gds_path: str, rules, node_records, gate_records, W, n_devices, cell=None, origin=(0.0, 0.0)) -> dict: + """Re-derive the evidence from a GDS file. node/gate records are in the group's local frame; origin shifts them.""" + ly = kdb.Layout(); ly.read(str(gds_path)) + top = ly.cell(cell) if cell else ly.top_cell() + dbu = ly.dbu + def reg(layer): + li = ly.layer(kdb.LayerInfo(int(layer[0]), int(layer[1]))) + return kdb.Region(top.begin_shapes_rec(li)).merged() + lay = rules.layers + ox = origin[0] + nr = [dict(n, x=n["x"] + ox) for n in node_records] + gr = [dict(g, x=g["x"] + ox) for g in gate_records] + ev = evidence_from_regions(reg(lay["active"]), reg(lay["poly"]), reg(lay["cont"]), reg(lay["met1"]), nr, gr, W, n_devices, dbu=dbu) + ev["source"] = "gds_file" + return ev diff --git a/src/glayout/sharing/group.py b/src/glayout/sharing/group.py new file mode 100644 index 00000000..0226829f --- /dev/null +++ b/src/glayout/sharing/group.py @@ -0,0 +1,438 @@ +"""build_mos_group: connection-aware joint construction of several logical MOS devices. + +Geometry is generated column by column from the plan (not by boolean-merging +finished devices): unit fingers are placed in the requested order, a diffusion +node between two fingers is drawn once and shared only when the plan joins the +fingers and the facing terminals carry the same net, and gate fingers of one +gate group are tied by a single poly strap outside the channel with its own +contact pad. All pins are exported as met2 pads on the top edge (source/drain +and top-strap gates) or on the bottom edge (bottom-strap gates), so that a +row-based channel router can connect them without knowing the internals. + +Coordinate convention (local): the channel active spans y in [0, W]; fingers +are ordered left to right along x. +""" +from __future__ import annotations +import math +from dataclasses import dataclass, field +from typing import Optional +from .spec import DeviceSpec, SharingPlan, FingerRef, GateGroup, EligibilityReport, SharingPlanRejected, GroupResult +from .rules import rules_for, snap, snap_up, GRID + + +@dataclass +class _Node: + index: int + island: int + x: float # contact column centre + net: str + terminals: list # [(device, 'S'|'D')] + is_end: bool + pin_row: int = 0 # 0 or 1 (staggered) + pin_name: str = "" + + +@dataclass +class _Gate: + pos: int + device: str + k: int + net: str + x: float # gate centre + group: int + island: int + + +@dataclass +class _Rects: + rects: dict = field(default_factory=dict) # layer tuple -> list of (x0,y0,x1,y1) + + def add(self, layer, x0, y0, x1, y1): + if layer is None: + return + if x1 < x0: x0, x1 = x1, x0 + if y1 < y0: y0, y1 = y1, y0 + self.rects.setdefault(tuple(layer), []).append((snap(x0), snap(y0), snap(x1), snap(y1))) + + +def validate_plan(rules, devices: list[DeviceSpec], plan: SharingPlan) -> EligibilityReport: + rep = EligibilityReport(ok=True) + if not devices: + rep.add_error("no_devices", "group needs at least one device"); return rep + ids = [d.logical_id for d in devices] + if len(set(ids)) != len(ids): + rep.add_error("duplicate_ids", "logical ids must be unique") + roles = {d.model_role for d in devices} + if len(roles) > 1: + rep.add_error("mixed_polarity", f"cannot share across polarities {sorted(roles)}") + if any(d.m != 1 for d in devices): + rep.add_error("multiplier_unsupported", "SPICE m>1 must be expanded into fingers before building a group") + Ls = {round(d.length, 4) for d in devices} + if len(Ls) > 1: + rep.add_error("length_mismatch", f"all devices of a group must share L, got {sorted(Ls)}") + uws = {round(d.unit_width, 4) for d in devices} + if len(uws) > 1: + rep.add_error("unit_width_mismatch", f"all devices of a group must share the unit finger width, got {sorted(uws)}") + bodies = {d.b for d in devices} + if len(bodies) > 1: + rep.add_error("body_mismatch", f"devices of one group must share the body net, got {sorted(bodies)}") + uw = devices[0].unit_width + if uw + 1e-9 < rules.min_contactable_width: + rep.add_error("unit_width_below_contactable", f"unit width {uw:.3f} < contactable minimum {rules.min_contactable_width:.3f} (dogbone not supported)") + if devices[0].length + 1e-9 < rules.L_min: + rep.add_error("length_below_min", f"L={devices[0].length} < min {rules.L_min}") + if rep.errors: + return rep + # finger coverage + expected = {(d.logical_id, k) for d in devices for k in range(d.nf)} + got = [(f.device, f.index) for f in plan.finger_order] + if len(got) != len(set(got)) or set(got) != expected: + rep.add_error("finger_coverage", "finger_order must list every unit finger of every device exactly once", + {"missing": sorted(expected - set(got)), "extra": sorted(set(got) - expected)}) + return rep + n = len(got) + if len(plan.orientations) != n or any(o not in ("SD", "DS") for o in plan.orientations): + rep.add_error("orientations", "orientations must be a list of 'SD'/'DS' with one entry per finger"); return rep + if len(plan.diffusion_joins) != n - 1: + rep.add_error("joins_length", "diffusion_joins must have n-1 entries"); return rep + dev = {d.logical_id: d for d in devices} + def lr(p): + f = plan.finger_order[p]; d = dev[f.device] + return (d.s, d.d) if plan.orientations[p] == "SD" else (d.d, d.s) + for i in range(n - 1): + if plan.diffusion_joins[i]: + rn = lr(i)[1]; ln = lr(i + 1)[1 - 1] + if rn != ln: + rep.add_error("join_net_mismatch", f"fingers {i} and {i+1} cannot share a diffusion node: nets {rn} vs {ln}", {"position": i}) + # gate groups + seen = {} + for gi, g in enumerate(plan.gate_groups): + for p in g.fingers: + if p < 0 or p >= n: + rep.add_error("gate_group_index", f"gate group {gi} references position {p}") + elif p in seen: + rep.add_error("gate_group_partition", f"position {p} is in gate groups {seen[p]} and {gi}") + seen[p] = gi + nets = {dev[plan.finger_order[p].device].g for p in g.fingers if 0 <= p < n} + if len(nets) > 1: + rep.add_error("gate_group_net_mismatch", f"gate group {gi} ties different gate nets {sorted(nets)}", {"group": gi}) + if g.side not in ("bottom", "top") or g.pad_end not in ("left", "right"): + rep.add_error("gate_group_fields", f"gate group {gi} has invalid side/pad_end") + if len(seen) != n: + rep.add_error("gate_group_partition", "every finger must belong to exactly one gate group") + if rep.errors: + return rep + # strap routability: bottom straps span their own interval; top straps reach from their fingers to the pad end + bottom = [(min(g.fingers), max(g.fingers), gi) for gi, g in enumerate(plan.gate_groups) if g.side == "bottom"] + top = [] + for gi, g in enumerate(plan.gate_groups): + if g.side == "top": + lo, hi = min(g.fingers), max(g.fingers) + if plan.gate_contact_policy == "both_ends": + lo, hi = 0, n - 1 + elif g.pad_end == "left": + lo = 0 + else: + hi = n - 1 + top.append((lo, hi, gi)) + for a in range(len(bottom)): + for b in range(a + 1, len(bottom)): + la, ha, ga = bottom[a]; lb, hb, gb = bottom[b] + if la <= hb and lb <= ha: + rep.add_error("gate_strap_interleave_unroutable", f"bottom straps of gate groups {ga} and {gb} overlap; move one to side 'top'", {"groups": [ga, gb]}) + for a in range(len(top)): + for b in range(a + 1, len(top)): + la, ha, ga = top[a]; lb, hb, gb = top[b] + if la <= hb and lb <= ha: + rep.add_error("gate_strap_interleave_unroutable", f"top straps of gate groups {ga} and {gb} overlap in reach", {"groups": [ga, gb]}) + rep.checks = {"fingers": n, "islands": len(plan.islands()), "bottom_groups": len(bottom), "top_groups": len(top)} + return rep + + +def independent_plan(devices: list[DeviceSpec]) -> SharingPlan: + """Canonical plan with no cross-device sharing: devices consecutive, own strap each.""" + order, orient, joins, groups = [], [], [], [] + pos = 0 + for di, d in enumerate(devices): + start = pos + for k in range(d.nf): + order.append(FingerRef(d.logical_id, k)); orient.append("SD" if k % 2 == 0 else "DS") + if k > 0: joins.append(True) + pos += 1 + if di < len(devices) - 1: joins.append(False) + groups.append(GateGroup(tuple(range(start, pos)), "bottom", "left")) + return SharingPlan(order, orient, joins, groups, mode_label="independent") + + +def build_mos_group(pdk, devices: list[DeviceSpec], connectivity=None, plan: Optional[SharingPlan] = None, + constraints: Optional[dict] = None, name: str = "mos_group") -> GroupResult: + from glayout.backend import Component + rules = rules_for(pdk) + constraints = constraints or {} + if plan is None: + plan = independent_plan(devices) + rep = validate_plan(rules, devices, plan) + if not rep.ok: + raise SharingPlanRejected(rep) + dev = {d.logical_id: d for d in devices} + n = plan.n(); W = snap(devices[0].unit_width); L = snap(devices[0].length) + pol = devices[0].model_role + R = rules + + # ---------------- x layout ---------------- + islands = plan.islands() + nodes: list[_Node] = []; gates: list[_Gate] = [] + gate_group_of = {} + for gi, g in enumerate(plan.gate_groups): + for p in g.fingers: gate_group_of[p] = gi + x = 0.0 + island_x = [] # (x0, x1) active extents + def lr(p): + f = plan.finger_order[p]; d = dev[f.device] + return (("S", d.s), ("D", d.d)) if plan.orientations[p] == "SD" else (("D", d.d), ("S", d.s)) + # inner node width: contact rules, and metal-1 bar spacing between adjacent nodes (bars are cont_w + 2*m1 enclosure wide) + inner_node = snap_up(max(2 * R.cont_gate_sep + R.cont_w, R.m1_sep + R.m1_bar_w() - L)) + # gap between islands: active spacing, and metal-1 spacing between the end bars / pin pads that stick out past the active end + outer_m1_half = max(R.m1_bar_w(), R.via1_m1_w()) / 2 + active_end_half = R.cont_w / 2 + R.act_enc_cont + island_gap = snap_up(max(R.act_sep, R.m1_sep + 2 * max(0.0, outer_m1_half - active_end_half))) + # end node: same gate-to-contact offset as inner nodes so that end bars keep metal spacing to the first inner bar + end_off = max(snap_up(R.cont_gate_sep + R.cont_w / 2), snap_up(inner_node / 2)) + end_ext = snap_up(end_off + R.cont_w / 2 + R.act_enc_cont) # active beyond last gate at an island end + end_ext = max(end_ext, snap_up(R.act_sd_ext_min)) + for isl, (a, b) in enumerate(islands): + x0 = x + # left end node + cx = snap(x0 + end_ext - end_off) + t, net = lr(a)[0] + nodes.append(_Node(len(nodes), isl, cx, net, [(plan.finger_order[a].device, t)], True)) + xg = snap(x0 + end_ext) + for p in range(a, b + 1): + f = plan.finger_order[p] + gates.append(_Gate(p, f.device, f.index, dev[f.device].g, xg + L / 2, gate_group_of[p], isl)) + right_t, right_net = lr(p)[1] + if p < b: + cx = snap(xg + L + inner_node / 2) + nxt_t, nxt_net = lr(p + 1)[0] + assert nxt_net == right_net + nodes.append(_Node(len(nodes), isl, cx, right_net, [(f.device, right_t), (plan.finger_order[p + 1].device, nxt_t)], False)) + xg = snap(xg + L + inner_node) + else: + cx = snap(xg + L + end_off) + nodes.append(_Node(len(nodes), isl, cx, right_net, [(f.device, right_t)], True)) + x1 = snap(xg + L + end_ext) + island_x.append((x0, x1)) + x = snap(x1 + island_gap) + x_act_min, x_act_max = island_x[0][0], island_x[-1][1] + + # ---------------- vertical structure ---------------- + strap_w = snap_up(R.poly_w_min) + bottom_groups = [gi for gi, g in enumerate(plan.gate_groups) if g.side == "bottom"] + top_groups = [gi for gi, g in enumerate(plan.gate_groups) if g.side == "top"] + pos_side = {p: plan.gate_groups[gate_group_of[p]].side for p in range(n)} + def interval(gi): + g = plan.gate_groups[gi]; lo, hi = min(g.fingers), max(g.fingers) + if g.side == "top": + if plan.gate_contact_policy == "both_ends": lo, hi = 0, n - 1 + elif g.pad_end == "left": lo = 0 + else: hi = n - 1 + return lo, hi + need_off_bottom = False + for gi in bottom_groups: + lo, hi = interval(gi) + if any(pos_side[p] == "top" for p in range(lo, hi + 1)): need_off_bottom = True + need_off_top = False + for gi in top_groups: + lo, hi = interval(gi) + if any(pos_side[p] == "bottom" for p in range(lo, hi + 1)): need_off_top = True + y_sb_top = snap(-R.endcap - (R.poly_sep if need_off_bottom else 0.0)) # bottom strap band top edge + y_sb_bot = snap(y_sb_top - strap_w) + y_st_bot = snap(W + R.endcap + (R.poly_sep if need_off_top else 0.0)) + y_st_top = snap(y_st_bot + strap_w) + # gate pad sizes + gpad_poly = snap_up(max(R.cont_w + 2 * R.poly_enc_cont, R.poly_w_min, R.sq_from_area(R.poly_area_min))) + gpad_m1 = snap_up(max(R.cont_w + 2 * R.m1_enc_cont, R.m1_w, R.sq_from_area(R.m1_area_min), R.via1_m1_w())) + gpad_m2 = R.via1_pad_w() + gpad = snap_up(max(gpad_poly, gpad_m1)) + # bottom gate pad levels: level0 directly below strap band, level1 further down + pad_pitch_y = snap_up(gpad + max(R.poly_sep, R.m1_sep, R.m2_sep)) + y_pad0_top = y_sb_bot + def pad_y(level): + top = snap(y_pad0_top - level * pad_pitch_y) + return top - gpad, top + # S/D pin rows above the top band (or above endcap if no top band) + m1_bar_w = R.m1_bar_w() + pin_pad = R.via1_pad_w() + pin_m1 = R.via1_m1_w() + y_top_geom = y_st_top if top_groups else snap(W + R.endcap) + pin_row_pitch = snap_up(pin_pad + R.m2_sep) + y_pinA = snap(y_top_geom + max(R.m1_sep, R.poly_act_sep, 0.1)) + y_pinB = snap(y_pinA + pin_row_pitch) + pin_rows = (y_pinA, y_pinB) + + rects = _Rects(); lay = R.layers + comp = Component(name) + ports = {}; pin_nets = {}; pin_meta = {} + + # ---------------- active / implant / well ---------------- + for (x0, x1) in island_x: + rects.add(lay["active"], x0, 0, x1, W) + if pol == "nfet": + enc = R.nimp_enc_act + if R.nimp_layer is not None: + rects.add(R.nimp_layer, x_act_min - enc, -enc, x_act_max + enc, W + enc) + else: + enc = max(R.pimp_enc_act, R.pimp_enc_gate) + rects.add(R.pimp_layer, x_act_min - enc, -enc, x_act_max + enc, W + enc) + nwe = R.nwell_enc_pact + rects.add(R.nwell_layer, x_act_min - nwe, -nwe, x_act_max + nwe, W + nwe) + + # ---------------- contacts and S/D bars ---------------- + ncont = max(1, int(math.floor((W - 2 * R.act_enc_cont - R.cont_w) / (R.cont_w + R.cont_sep) + 1e-9)) + 1) + while ncont > 1 and (ncont * R.cont_w + (ncont - 1) * R.cont_sep) > W - 2 * R.act_enc_cont + 1e-9: + ncont -= 1 + hcol = ncont * R.cont_w + (ncont - 1) * R.cont_sep + yc0 = snap((W - hcol) / 2) + if yc0 < R.act_enc_cont - 1e-9: + yc0 = snap_up(R.act_enc_cont) + for i, nd in enumerate(nodes): + nd.pin_row = i % 2 + half = R.cont_w / 2 + for c in range(ncont): + y0 = snap(yc0 + c * (R.cont_w + R.cont_sep)) + rects.add(lay["cont"], nd.x - half, y0, nd.x + half, y0 + R.cont_w) + bar_y0 = snap(yc0 - R.m1_enc_cont) + ypin = pin_rows[nd.pin_row] + rects.add(lay["met1"], nd.x - m1_bar_w / 2, bar_y0, nd.x + m1_bar_w / 2, ypin + pin_m1 / 2) + # via1 + met2 pad (pin) + rects.add(lay["met1"], nd.x - pin_m1 / 2, ypin - pin_m1 / 2, nd.x + pin_m1 / 2, ypin + pin_m1 / 2) + rects.add(lay["via1"], nd.x - R.via1_w / 2, ypin - R.via1_w / 2, nd.x + R.via1_w / 2, ypin + R.via1_w / 2) + rects.add(lay["met2"], nd.x - pin_pad / 2, ypin - pin_pad / 2, nd.x + pin_pad / 2, ypin + pin_pad / 2) + pname = f"sd{i}" + nd.pin_name = pname + comp.add_port(name=pname, center=(nd.x, snap(ypin + pin_pad / 2)), width=pin_pad, orientation=90, layer=lay["met2"]) + pin_nets[pname] = nd.net + pin_meta[pname] = {"side": "top", "x": nd.x, "y": snap(ypin + pin_pad / 2), "width": pin_pad, "net": nd.net, + "terminals": [f"{d}:{t}" for d, t in nd.terminals], "node": i, "island": nd.island} + for d, t in nd.terminals: + ports.setdefault(f"{d}:{t}", []).append(pname) + + # ---------------- gates, straps, gate pads ---------------- + gate_pin_count = 0 + bottom_level = {} + for li, gi in enumerate(sorted(bottom_groups, key=lambda gi: min(plan.gate_groups[gi].fingers))): + bottom_level[gi] = li % 2 + gpad_records = [] + for gi, g in enumerate(plan.gate_groups): + gxs = [gates[p].x for p in g.fingers] + lo, hi = min(g.fingers), max(g.fingers) + net = dev[plan.finger_order[lo].device].g + if g.side == "bottom": + yb0, yb1 = y_sb_bot, y_sb_top + # strap over the finger interval + rects.add(lay["poly"], min(gxs) - L / 2, yb0, max(gxs) + L / 2, yb1) + # pads: at the strap's first gate (and last gate if both_ends) + level = bottom_level[gi] + pad_xs = [gates[lo].x] if plan.gate_contact_policy == "single_end" else sorted({gates[lo].x, gates[hi].x}) + if plan.gate_contact_policy == "single_end" and g.pad_end == "right": + pad_xs = [gates[hi].x] + for pxe in pad_xs: + px = snap(pxe) # pad/contact geometry on the 5 nm grid; the stub follows the exact gate edges + py0, py1 = pad_y(level) + rects.add(lay["poly"], pxe - L / 2, py1 - GRID, pxe + L / 2, yb0 + GRID) # poly stub from strap to pad + rects.add(lay["poly"], px - gpad / 2, py0, px + gpad / 2, py1) + cy = snap((py0 + py1) / 2) + rects.add(lay["cont"], px - R.cont_w / 2, cy - R.cont_w / 2, px + R.cont_w / 2, cy + R.cont_w / 2) + if R.pdk_name == "sky130": # nitride poly cut around every poly contact (npc.1 width 0.27, enclosure 0.10) + npc_h = max(0.27, R.cont_w + 0.2) / 2 + rects.add((95, 20), px - npc_h, cy - npc_h, px + npc_h, cy + npc_h) + rects.add(lay["met1"], px - gpad_m1 / 2, cy - gpad_m1 / 2, px + gpad_m1 / 2, cy + gpad_m1 / 2) + rects.add(lay["via1"], px - R.via1_w / 2, cy - R.via1_w / 2, px + R.via1_w / 2, cy + R.via1_w / 2) + rects.add(lay["met2"], px - gpad_m2 / 2, cy - gpad_m2 / 2, px + gpad_m2 / 2, cy + gpad_m2 / 2) + pname = f"g{gate_pin_count}"; gate_pin_count += 1 + comp.add_port(name=pname, center=(px, snap(cy - gpad_m2 / 2)), width=gpad_m2, orientation=270, layer=lay["met2"]) + pin_nets[pname] = net + pin_meta[pname] = {"side": "bottom", "x": px, "y": snap(cy - gpad_m2 / 2), "width": gpad_m2, "net": net, + "terminals": sorted({f"{plan.finger_order[p].device}:G" for p in g.fingers}), "gate_group": gi} + for d in sorted({plan.finger_order[p].device for p in g.fingers}): + ports.setdefault(f"{d}:G", []).append(pname) + gpad_records.append({"group": gi, "x": px, "y": cy, "side": "bottom"}) + else: + yb0, yb1 = y_st_bot, y_st_top + d_pad = snap_up(max(R.contpoly_act_sep, R.m1_sep + 2 * R.m1_enc_cont - R.act_enc_cont, R.poly_act_sep + R.poly_enc_cont)) + ends = [] + if plan.gate_contact_policy == "both_ends": + ends = ["left", "right"] + else: + ends = [g.pad_end] + xs_reach = [min(gxs) - L / 2, max(gxs) + L / 2] + for e in ends: + if e == "left": + px = snap(x_act_min - d_pad - R.cont_w / 2 - R.poly_enc_cont - (gpad - R.cont_w - 2 * R.poly_enc_cont) / 2) + xs_reach[0] = min(xs_reach[0], px - gpad / 2) + else: + px = snap(x_act_max + d_pad + R.cont_w / 2 + R.poly_enc_cont + (gpad - R.cont_w - 2 * R.poly_enc_cont) / 2) + xs_reach[1] = max(xs_reach[1], px + gpad / 2) + cy = snap((yb0 + yb1) / 2) + pad_bot = snap(cy - gpad / 2); pad_top = snap(cy + gpad / 2) + rects.add(lay["poly"], px - gpad / 2, pad_bot, px + gpad / 2, pad_top) + rects.add(lay["cont"], px - R.cont_w / 2, cy - R.cont_w / 2, px + R.cont_w / 2, cy + R.cont_w / 2) + if R.pdk_name == "sky130": + npc_h = max(0.27, R.cont_w + 0.2) / 2 + rects.add((95, 20), px - npc_h, cy - npc_h, px + npc_h, cy + npc_h) + # met1 pad and riser to the pin row (use the row opposite to the nearest end node) + near_node = nodes[0] if e == "left" else nodes[-1] + row = 1 - near_node.pin_row + ypin = pin_rows[row] + rects.add(lay["met1"], px - gpad_m1 / 2, cy - gpad_m1 / 2, px + gpad_m1 / 2, cy + gpad_m1 / 2) + rects.add(lay["met1"], px - m1_bar_w / 2, cy, px + m1_bar_w / 2, ypin + pin_m1 / 2) + rects.add(lay["met1"], px - pin_m1 / 2, ypin - pin_m1 / 2, px + pin_m1 / 2, ypin + pin_m1 / 2) + rects.add(lay["via1"], px - R.via1_w / 2, ypin - R.via1_w / 2, px + R.via1_w / 2, ypin + R.via1_w / 2) + rects.add(lay["met2"], px - pin_pad / 2, ypin - pin_pad / 2, px + pin_pad / 2, ypin + pin_pad / 2) + pname = f"g{gate_pin_count}"; gate_pin_count += 1 + comp.add_port(name=pname, center=(px, snap(ypin + pin_pad / 2)), width=pin_pad, orientation=90, layer=lay["met2"]) + pin_nets[pname] = net + pin_meta[pname] = {"side": "top", "x": px, "y": snap(ypin + pin_pad / 2), "width": pin_pad, "net": net, + "terminals": sorted({f"{plan.finger_order[p].device}:G" for p in g.fingers}), "gate_group": gi} + for d in sorted({plan.finger_order[p].device for p in g.fingers}): + ports.setdefault(f"{d}:G", []).append(pname) + gpad_records.append({"group": gi, "x": px, "y": cy, "side": "top"}) + rects.add(lay["poly"], xs_reach[0], yb0, xs_reach[1], yb1) + # gate fingers + for gt in gates: + side = plan.gate_groups[gt.group].side + y0 = y_sb_top - GRID if side == "bottom" else snap(-R.endcap) + y1 = y_st_bot + GRID if side == "top" else snap(W + R.endcap) + rects.add(lay["poly"], gt.x - L / 2, y0, gt.x + L / 2, y1) + + # ---------------- emit ---------------- + for layer, rl in rects.rects.items(): + for (x0, y0, x1, y1) in rl: + comp.add_polygon([(x0, y0), (x1, y0), (x1, y1), (x0, y1)], layer=layer) + bbox = _bbox(rects) + device_map = {} + for d in devices: + device_map[d.logical_id] = { + "fingers": [{"position": gt.pos, "k": gt.k, "x": gt.x, "island": gt.island, "gate_group": gt.group} for gt in gates if gt.device == d.logical_id], + "terminals": {t: ports.get(f"{d.logical_id}:{t}", []) for t in ("D", "G", "S")}, + "nets": d.nets(), "width_total": d.width_total, "unit_width": W, "length": L, "nf": d.nf, + } + node_records = [{"node": nd.index, "island": nd.island, "x": nd.x, "net": nd.net, "terminals": [f"{a}:{b}" for a, b in nd.terminals], "is_end": nd.is_end, "pin": nd.pin_name} for nd in nodes] + from .evidence import evidence_from_rects + evidence = evidence_from_rects(rules, rects.rects, node_records, [{"pos": g.pos, "device": g.device, "x": g.x, "net": g.net, "group": g.group} for g in gates], W, len(devices), plan) + stats = {"bbox": bbox, "width": snap(bbox[2] - bbox[0]), "height": snap(bbox[3] - bbox[1]), "n_fingers": n, "n_islands": len(islands), + "n_sd_nodes": len(nodes), "n_sd_contacts": len(nodes) * ncont, "contacts_per_node": ncont, "n_gate_pads": gate_pin_count, + "unit_width": W, "length": L, "pin_rows": pin_rows, "active_bbox": (x_act_min, 0.0, x_act_max, W), "bands": {"bottom": [y_sb_bot, y_sb_top], "top": [y_st_bot, y_st_top] if top_groups else None}} + comp.info["pin_meta"] = pin_meta + comp.info["pin_nets"] = pin_nets + comp.info["group_stats"] = stats + return GroupResult(component=comp, ports=ports, pin_nets=pin_nets, device_map=device_map, applied_plan=plan.to_json(), + eligibility_report=rep.to_json(), physical_sharing_evidence=evidence, geometry_stats=stats) + + +def _bbox(rects: _Rects): + xs0 = []; ys0 = []; xs1 = []; ys1 = [] + for rl in rects.rects.values(): + for (x0, y0, x1, y1) in rl: + xs0.append(x0); ys0.append(y0); xs1.append(x1); ys1.append(y1) + return (min(xs0), min(ys0), max(xs1), max(ys1)) diff --git a/src/glayout/sharing/rules.py b/src/glayout/sharing/rules.py new file mode 100644 index 00000000..f7d113c1 --- /dev/null +++ b/src/glayout/sharing/rules.py @@ -0,0 +1,269 @@ +"""Design-rule adapter for the shared-group builder. + +All numbers come from the MappedPDK generic rule table (``pdk.get_grule``) +except where that table is missing an entry or is known to disagree with the +foundry rule deck. Those cases are listed explicitly in ``OVERRIDES`` with the +foundry rule identifier so that they can be audited. Nothing here relaxes a +foundry rule: every override is equal to or more conservative than the deck. +""" +from __future__ import annotations +from dataclasses import dataclass, field +from typing import Optional + +GRID = 0.005 # manufacturing grid used by all three PDKs (sky130, gf180mcu, sg13g2) + + +def snap(x: float, grid: float = GRID) -> float: + return round(round(x / grid) * grid, 4) + + +def snap_up(x: float, grid: float = GRID) -> float: + import math + return round(math.ceil(round(x / grid, 6)) * grid, 4) + + +def snap2(x: float, grid: float = GRID) -> float: + """Snap to twice the grid (keeps centred shapes on grid).""" + return snap(x, 2 * grid) + + +# Explicit, auditable overrides: pdk -> key -> (value, rule id / justification) +OVERRIDES = { + "ihp130": { + "act_enc_cont": (0.07, "Cnt.c"), + "poly_enc_cont": (0.07, "Cnt.d"), + "cont_gate_sep": (0.11, "Cnt.f (Cont on Activ to GatPoly)"), + "contpoly_act_sep": (0.14, "Cnt.e (Cont on GatPoly to Activ)"), + "m1_enc_cont": (0.05, "M1.c1 endcap (M1.c is 0.00)"), + "m1_enc_via1": (0.05, "V1.c1 endcap"), + "m2_enc_via1": (0.05, "M2.c1 endcap"), + "m2_enc_via2": (0.05, "V2.c1 endcap"), + "m3_enc_via2": (0.05, "M3.c1 endcap"), + "endcap": (0.18, "Gat.c"), + "poly_act_sep": (0.07, "Gat.d"), + "poly_sep": (0.18, "Gat.b"), + "pimp_enc_act": (0.18, "pSD.c"), + "pimp_enc_gate": (0.30, "pSD.i (pSD enclosure of PFET gate)"), + "pimp_w_min": (0.31, "pSD.a"), + "pimp_sep": (0.31, "pSD.b"), + "pimp_to_nact": (0.18, "pSD.d"), + "nimp_layer": (None, "SG13G2 Activ is n+ by default; nSD drawing is not required for NMOS"), + "nwell_enc_pact": (0.31, "NW.c"), + "nwell_enc_ntap": (0.24, "NW.e"), + "nwell_to_nact": (0.31, "NW.d"), + "nwell_to_ptap": (0.24, "NW.f"), + "nwell_w_min": (0.62, "NW.a"), + "m1_area_min": (0.09, "M1.d"), + "m2_area_min": (0.144, "M2.d"), + "m3_area_min": (0.144, "M3.d"), + "poly_area_min": (0.09, "Gat.e"), + "act_area_min": (0.122, "Act.d"), + "act_sd_ext_min": (0.23, "Act.c"), + "m3_w": (0.20, "M3.a"), "m3_sep": (0.21, "M3.b"), + "via2_w": (0.19, "V2.a"), "via2_sep": (0.22, "V2.b"), + "tap_act_sep": (0.21, "Act.b (same layer) + pSD.d 0.18 implant spacing handled separately"), + "pimp_to_ntap": (0.16, "Cnt.g1 0.09 pSD space to Cont on nSD-Activ + Cnt.c 0.07 (and pSD.d1 0.03)"), + }, + "sky130": { + # sky130 generic layers in gLayout: met1=li1, via1=mcon, met2=met1, via2=via, met3=met2 + "contpoly_act_sep": (0.19, "licon.11/poly licon to diff (conservative)"), + "poly_act_sep": (0.075, "poly.7"), + "m1_area_min": (0.0561, "li.6"), + "m2_area_min": (0.083, "m1.6"), + "m3_area_min": (0.0676, "m2.6"), + "poly_area_min": (0.0, "n/a"), + "act_area_min": (0.0, "n/a"), + "act_sd_ext_min": (0.0, "n/a"), + "pimp_enc_gate": (0.125, "psdm enclosure (same as diff)"), + "nwell_enc_pact": (0.18, "nwell.3"), + "nwell_enc_ntap": (0.18, "nwell.3"), + "nwell_to_nact": (0.34, "difftap.9 / nwell spacing to ndiff (conservative)"), + "nwell_to_ptap": (0.13, "difftap.10"), + "nwell_w_min": (0.84, "nwell.1"), + "tap_act_sep": (0.27, "difftap.3"), + "pimp_to_nact": (0.13, "nsdm/psdm spacing to diff"), + "pimp_to_ntap": (0.13, "psdm spacing to n+ tap diffusion"), + }, + "gf180": { + "poly_sep": (0.24, "PL.3a (generic table has no poly spacing entry)"), + "contpoly_act_sep": (0.15, "poly contact to COMP, conservative value (rule id not confirmed)"), + "poly_act_sep": (0.1, "PL.5a"), + "m1_area_min": (0.1444, "metal-1 minimum area, conservative value (rule id not confirmed)"), + "m2_area_min": (0.1444, "M2.3"), + "m3_area_min": (0.1444, "M3.3"), + "poly_area_min": (0.0, "n/a"), + "act_area_min": (0.2025, "DF.6"), + "act_sd_ext_min": (0.24, "DF.3a"), + "pimp_enc_gate": (0.16, "PP.5 (same as comp enclosure)"), + "nwell_enc_pact": (0.43, "nwell enclosure of PCOMP, conservative value (rule id not confirmed)"), + "nwell_enc_ntap": (0.12, "NW enclosure of ncomp tap"), + "nwell_to_nact": (0.43, "NW spacing to ncomp (conservative)"), + "nwell_to_ptap": (0.12, "nwell to pcomp tap"), + "nwell_w_min": (0.86, "NW.1a"), + "tap_act_sep": (0.28, "DF.4"), + "pimp_to_nact": (0.16, "PP spacing to NCOMP"), + "pimp_to_ntap": (0.16, "PP spacing to NCOMP tap"), + }, +} + + +@dataclass +class GroupRules: + pdk_name: str + grid: float + L_min: float + poly_w_min: float + poly_sep: float + endcap: float + poly_act_sep: float + act_w_min: float + act_sep: float + cont_w: float + cont_sep: float + act_enc_cont: float + poly_enc_cont: float + cont_gate_sep: float + contpoly_act_sep: float + m1_w: float + m1_sep: float + m1_enc_cont: float + via1_w: float + via1_sep: float + m1_enc_via1: float + m2_enc_via1: float + m2_w: float + m2_sep: float + via2_w: float + via2_sep: float + m2_enc_via2: float + m3_enc_via2: float + m3_w: float + m3_sep: float + nimp_layer: Optional[tuple] + pimp_layer: Optional[tuple] + nimp_enc_act: float + pimp_enc_act: float + pimp_enc_gate: float + imp_w_min: float + imp_sep: float + pimp_to_nact: float + pimp_to_ntap: float + nwell_layer: tuple + nwell_enc_pact: float + nwell_enc_ntap: float + nwell_to_nact: float + nwell_to_ptap: float + nwell_w_min: float + tap_act_sep: float + act_enc_cont_tap: float + m1_area_min: float + m2_area_min: float + m3_area_min: float + poly_area_min: float + act_area_min: float + act_sd_ext_min: float + layers: dict = field(default_factory=dict) + overrides_used: dict = field(default_factory=dict) + + # ---- derived ------------------------------------------------------- + @property + def min_contactable_width(self) -> float: + """Smallest unit finger width that hosts one contact without a dogbone.""" + return snap_up(self.cont_w + 2 * self.act_enc_cont) + + def m1_bar_w(self) -> float: + return snap_up(max(self.m1_w, self.cont_w + 2 * self.m1_enc_cont)) + + def via1_pad_w(self) -> float: + return snap_up(max(self.m2_w, self.via1_w + 2 * self.m2_enc_via1, self.sq_from_area(self.m2_area_min))) + + def via1_m1_w(self) -> float: + return snap_up(max(self.m1_w, self.via1_w + 2 * self.m1_enc_via1)) + + @staticmethod + def sq_from_area(area: float) -> float: + import math + return math.sqrt(area) if area > 0 else 0.0 + + def to_json(self) -> dict: + d = {k: v for k, v in self.__dict__.items() if k not in ("layers",)} + d["layers"] = {k: list(v) if v else None for k, v in self.layers.items()} + return d + + +def _ov(pdk_name: str, key: str, default, used: dict): + ov = OVERRIDES.get(pdk_name, {}) + if key in ov: + used[key] = {"value": ov[key][0], "rule": ov[key][1]} + return ov[key][0] + return default + + +def rules_for(pdk) -> GroupRules: + g = pdk.get_grule + name = pdk.name + used = {} + + def ovr(key, default): + return _ov(name, key, default, used) + + def gr(a, b=None, key="min_separation", default=None): + try: + v = g(a, b)[key] if b else g(a)[key] + return v if v is not None else default + except Exception: + return default + + layers = { + "active": pdk.get_glayer("active_diff"), "poly": pdk.get_glayer("poly"), "cont": pdk.get_glayer("mcon"), + "met1": pdk.get_glayer("met1"), "via1": pdk.get_glayer("via1"), "met2": pdk.get_glayer("met2"), + "via2": pdk.get_glayer("via2"), "met3": pdk.get_glayer("met3"), + "nwell": pdk.get_glayer("nwell"), "nimp": pdk.get_glayer("n+s/d"), "pimp": pdk.get_glayer("p+s/d"), + "tap": pdk.get_glayer("active_tap"), + } + for lay in ("met1", "met2", "met3"): + for suf in ("_pin", "_label"): + try: layers[lay + suf] = pdk.get_glayer(lay + suf) + except Exception: layers[lay + suf] = None + nimp = ovr("nimp_layer", layers["nimp"]) + r = GroupRules( + pdk_name=name, grid=GRID, + L_min=gr("poly", key="min_width"), poly_w_min=gr("poly", key="min_width"), + poly_sep=ovr("poly_sep", gr("poly", key="min_separation")), + endcap=ovr("endcap", gr("poly", "active_diff", "overhang")), + poly_act_sep=ovr("poly_act_sep", gr("poly", "active_diff", "min_separation", 0.1)), + act_w_min=gr("active_diff", key="min_width"), act_sep=gr("active_diff", key="min_separation"), + cont_w=gr("mcon", key="width"), cont_sep=gr("mcon", key="min_separation"), + act_enc_cont=ovr("act_enc_cont", gr("active_diff", "mcon", "min_enclosure")), + poly_enc_cont=ovr("poly_enc_cont", max(gr("poly", "mcon", "min_enclosure", 0.0), gr("mcon", "poly", "min_enclosure", 0.0))), + cont_gate_sep=ovr("cont_gate_sep", gr("poly", "mcon", "min_separation")), + contpoly_act_sep=ovr("contpoly_act_sep", 0.2), + m1_w=gr("met1", key="min_width"), m1_sep=gr("met1", key="min_separation"), + m1_enc_cont=ovr("m1_enc_cont", gr("mcon", "met1", "min_enclosure", 0.0)), + via1_w=gr("via1", key="width"), via1_sep=gr("via1", key="min_separation"), + m1_enc_via1=ovr("m1_enc_via1", gr("met1", "via1", "min_enclosure", 0.0)), + m2_enc_via1=ovr("m2_enc_via1", gr("via1", "met2", "min_enclosure", 0.0)), + m2_w=gr("met2", key="min_width"), m2_sep=gr("met2", key="min_separation"), + via2_w=ovr("via2_w", gr("via2", key="width")), via2_sep=ovr("via2_sep", gr("via2", key="min_separation")), + m2_enc_via2=ovr("m2_enc_via2", gr("met2", "via2", "min_enclosure", 0.0)), + m3_enc_via2=ovr("m3_enc_via2", gr("via2", "met3", "min_enclosure", 0.0)), + m3_w=ovr("m3_w", gr("met3", key="min_width")), m3_sep=ovr("m3_sep", gr("met3", key="min_separation")), + nimp_layer=nimp, pimp_layer=layers["pimp"], + nimp_enc_act=gr("n+s/d", "active_diff", "min_enclosure", 0.13), + pimp_enc_act=ovr("pimp_enc_act", gr("p+s/d", "active_diff", "min_enclosure", 0.13)), + pimp_enc_gate=ovr("pimp_enc_gate", gr("p+s/d", "active_diff", "min_enclosure", 0.13)), + imp_w_min=ovr("pimp_w_min", gr("p+s/d", key="min_width", default=0.38)), + imp_sep=ovr("pimp_sep", gr("p+s/d", key="min_separation", default=0.38)), + pimp_to_nact=ovr("pimp_to_nact", 0.18), pimp_to_ntap=ovr("pimp_to_ntap", 0.18), + nwell_layer=layers["nwell"], + nwell_enc_pact=ovr("nwell_enc_pact", gr("nwell", "active_tap", "min_enclosure", 0.18)), + nwell_enc_ntap=ovr("nwell_enc_ntap", gr("nwell", "active_tap", "min_enclosure", 0.18)), + nwell_to_nact=ovr("nwell_to_nact", 0.34), nwell_to_ptap=ovr("nwell_to_ptap", 0.24), + nwell_w_min=ovr("nwell_w_min", gr("nwell", key="min_width")), + tap_act_sep=ovr("tap_act_sep", gr("active_diff", "active_tap", "min_separation", 0.27)), + act_enc_cont_tap=max(gr("active_tap", "mcon", "min_enclosure", 0.0), ovr("act_enc_cont", gr("active_diff", "mcon", "min_enclosure"))), + m1_area_min=ovr("m1_area_min", 0.0), m2_area_min=ovr("m2_area_min", 0.0), m3_area_min=ovr("m3_area_min", 0.0), + poly_area_min=ovr("poly_area_min", 0.0), act_area_min=ovr("act_area_min", 0.0), act_sd_ext_min=ovr("act_sd_ext_min", 0.0), + layers=layers, overrides_used=used, + ) + return r diff --git a/src/glayout/sharing/spec.py b/src/glayout/sharing/spec.py new file mode 100644 index 00000000..91a73072 --- /dev/null +++ b/src/glayout/sharing/spec.py @@ -0,0 +1,152 @@ +"""Data model for connection-aware shared MOS construction. + +A *logical device* (DeviceSpec) is one SPICE transistor with its four nets and +its electrical size (total width, length, number of unit fingers). A +*SharingPlan* describes only the physical organisation of the unit fingers of a +group of logical devices: finger order, finger orientation, which adjacent +fingers share a diffusion node, and which gate fingers are tied together by a +poly strap. A plan never changes the netlist: it cannot remove a device, +change a width/length or a body connection. Illegal plans are rejected with a +structured EligibilityReport instead of silently producing an independent +layout. +""" +from __future__ import annotations +from dataclasses import dataclass, field, asdict +from typing import Literal +import hashlib, json + +Polarity = Literal["nfet", "pfet"] +Side = Literal["bottom", "top"] +End = Literal["left", "right"] + + +@dataclass(frozen=True) +class DeviceSpec: + logical_id: str + model_role: Polarity # 'nfet' or 'pfet' (resolved to a PDK model name by the PDK) + d: str + g: str + s: str + b: str + width_total: float # um, electrical total width (sum over fingers) + length: float # um + nf: int = 1 # number of unit fingers; unit width = width_total / nf + m: int = 1 # SPICE multiplier is not supported for shared groups (must be 1) + + @property + def unit_width(self) -> float: + return self.width_total / self.nf + + def nets(self) -> dict: + return {"D": self.d, "G": self.g, "S": self.s, "B": self.b} + + +@dataclass(frozen=True) +class FingerRef: + device: str + index: int # 0..nf-1 within the device + + +@dataclass(frozen=True) +class GateGroup: + fingers: tuple[int, ...] # positions in finger_order (0..n-1) + side: Side = "bottom" # strap side (poly strap below or above the active) + pad_end: End = "left" # which end of the group hosts the contact pad(s) + + +@dataclass +class SharingPlan: + finger_order: list[FingerRef] + orientations: list[Literal["SD", "DS"]] # per position: left terminal then right terminal + diffusion_joins: list[bool] # len n-1: True -> fingers i and i+1 share one diffusion node + gate_groups: list[GateGroup] # partition of positions into poly-strap groups + gate_contact_policy: Literal["single_end", "both_ends"] = "single_end" + access_sides: dict = field(default_factory=lambda: {"sd": "top", "gate": "strap_side"}) + dummy_policy: Literal["none"] = "none" + mode_label: str = "custom" # free text: independent / diffusion_only / gate_only / combined / custom + + # ---- canonical form ------------------------------------------------- + def canonical(self) -> dict: + return { + "finger_order": [[f.device, f.index] for f in self.finger_order], + "orientations": list(self.orientations), + "diffusion_joins": [bool(x) for x in self.diffusion_joins], + "gate_groups": sorted([[sorted(g.fingers), g.side, g.pad_end] for g in self.gate_groups]), + "gate_contact_policy": self.gate_contact_policy, + "access_sides": dict(sorted(self.access_sides.items())), + "dummy_policy": self.dummy_policy, + } + + def plan_id(self) -> str: + return hashlib.sha256(json.dumps(self.canonical(), sort_keys=True).encode()).hexdigest()[:16] + + def to_json(self) -> dict: + d = self.canonical(); d["mode_label"] = self.mode_label; d["plan_id"] = self.plan_id(); return d + + @staticmethod + def from_json(d: dict) -> "SharingPlan": + return SharingPlan( + finger_order=[FingerRef(a, int(b)) for a, b in d["finger_order"]], + orientations=list(d["orientations"]), + diffusion_joins=[bool(x) for x in d["diffusion_joins"]], + gate_groups=[GateGroup(tuple(int(i) for i in g[0]), g[1], g[2]) for g in d["gate_groups"]], + gate_contact_policy=d.get("gate_contact_policy", "single_end"), + access_sides=d.get("access_sides", {"sd": "top", "gate": "strap_side"}), + dummy_policy=d.get("dummy_policy", "none"), + mode_label=d.get("mode_label", "custom"), + ) + + # ---- derived structure --------------------------------------------- + def n(self) -> int: + return len(self.finger_order) + + def islands(self) -> list[tuple[int, int]]: + """Return [(first_pos, last_pos)] of maximal runs of joined fingers.""" + out = []; start = 0 + for i in range(self.n() - 1): + if not self.diffusion_joins[i]: + out.append((start, i)); start = i + 1 + out.append((start, self.n() - 1)) + return out + + def summary(self) -> dict: + n_cross = 0; n_cross_gate = 0 + for i, j in enumerate(self.diffusion_joins): + if j and self.finger_order[i].device != self.finger_order[i + 1].device: n_cross += 1 + for g in self.gate_groups: + if len({self.finger_order[p].device for p in g.fingers}) > 1: n_cross_gate += 1 + return {"fingers": self.n(), "islands": len(self.islands()), "cross_device_diffusion_joins": n_cross, + "cross_device_gate_groups": n_cross_gate, "gate_groups": len(self.gate_groups)} + + +@dataclass +class EligibilityReport: + ok: bool + errors: list[dict] = field(default_factory=list) # {"code":..., "message":..., "where":...} + warnings: list[dict] = field(default_factory=list) + checks: dict = field(default_factory=dict) + + def add_error(self, code: str, message: str, where=None): + self.ok = False; self.errors.append({"code": code, "message": message, "where": where}) + + def to_json(self) -> dict: + return asdict(self) + + +class SharingPlanRejected(ValueError): + """Raised by build_mos_group when a plan is illegal. Carries the structured report.""" + def __init__(self, report: EligibilityReport): + self.report = report + super().__init__("; ".join(f"{e['code']}: {e['message']}" for e in report.errors)) + + +@dataclass +class GroupResult: + component: object # layout Component (gdsfactory / gdstk backend) + ports: dict # terminal key "dev:T" -> list of port names (met2 pins) + pin_nets: dict # port name -> net + device_map: dict # logical device -> fingers/nodes/islands in the geometry + applied_plan: dict # canonical plan + plan_id + eligibility_report: dict + physical_sharing_evidence: dict # derived from the produced geometry, not from the plan + geometry_stats: dict # bbox, widths, counts From 81c4043ffd89c1d069bd2ea45dcea5f42aa8a331 Mon Sep 17 00:00:00 2001 From: Minxing Chu Date: Mon, 12 Oct 2026 07:35:29 +0000 Subject: [PATCH 2/7] textbook_sharing: benchmark package, tests and scripts 18 textbook topologies on SKY130, GF180MCU and IHP SG13G2: size derivation and schematic qualification, row and channel assembly of the sharing groups, verification (official DRC decks, LVS, extracted-size check, R+C extraction, post-layout simulation against frozen specifications, blinded visual review), the plan-selection study with a plan-level cost rule, model sessions through a restricted plan interface, every analysis behind the results, and checks that rebuild recorded layouts. Runs in the pinned IIC-OSIC-TOOLS image with a locked Python environment. Co-Authored-By: Claude Opus 5.5 --- benchmarks/textbook_sharing/.gitignore | 3 + benchmarks/textbook_sharing/pytest.ini | 5 + .../textbook_sharing/requirements-lock.txt | 100 +++ .../textbook_sharing/scripts/env_lock.sh | 12 + .../scripts/reproduce_clean.sh | 38 ++ .../textbook_sharing/scripts/run_all.sh | 33 + .../scripts/run_in_container.sh | 19 + .../textbook_sharing/scripts/setup_env.sh | 15 + benchmarks/textbook_sharing/tests/conftest.py | 4 + .../textbook_sharing/tests/test_data.py | 26 + .../textbook_sharing/tests/test_docs.py | 89 +++ .../tests/test_enumeration.py | 20 + .../tests/test_layout_reproduces_records.py | 23 + .../tests/test_plan_parser.py | 33 + .../tests/test_sharing_plan.py | 35 + .../textbook_sharing/__init__.py | 3 + .../textbook_sharing/analysis/__init__.py | 0 .../textbook_sharing/analysis/all.py | 40 ++ .../analysis/arrangement_bandwidth.py | 36 + .../analysis/benchmark_table.py | 69 ++ .../analysis/cost_decomposition.py | 108 +++ .../analysis/cost_validation.py | 96 +++ .../textbook_sharing/analysis/example.py | 57 ++ .../analysis/geometry_check.py | 65 ++ .../textbook_sharing/analysis/interface.py | 55 ++ .../textbook_sharing/analysis/ledger.py | 115 ++++ .../textbook_sharing/analysis/models.py | 96 +++ .../analysis/pex_sensitivity.py | 32 + .../textbook_sharing/analysis/pvt.py | 84 +++ .../textbook_sharing/analysis/report.py | 243 +++++++ .../analysis/review_coverage.py | 76 +++ .../textbook_sharing/analysis/scope.py | 107 +++ .../textbook_sharing/analysis/selection.py | 104 +++ .../textbook_sharing/assembly/__init__.py | 14 + .../textbook_sharing/assembly/adapters.py | 20 + .../textbook_sharing/assembly/engine.py | 625 ++++++++++++++++++ .../textbook_sharing/assembly/passives.py | 195 ++++++ .../textbook_sharing/assembly/pincell.py | 32 + .../textbook_sharing/build_cases.py | 125 ++++ .../textbook_sharing/calibrate_res.py | 29 + .../textbook_sharing/cases.py | 42 ++ .../textbook_sharing/circuits.py | 138 ++++ .../textbook_sharing/freeze.py | 41 ++ .../textbook_sharing/textbook_sharing/grid.py | 77 +++ .../textbook_sharing/layout.py | 100 +++ .../textbook_sharing/llm/__init__.py | 0 .../textbook_sharing/llm/agent_sessions.py | 141 ++++ .../textbook_sharing/llm/evaluate.py | 104 +++ .../textbook_sharing/llm/interface_base.md | 45 ++ .../textbook_sharing/llm/interface_sharing.md | 71 ++ .../textbook_sharing/llm/make_examples.py | 67 ++ .../textbook_sharing/llm/plan_parser.py | 163 +++++ .../textbook_sharing/llm/run_codex.py | 117 ++++ .../textbook_sharing/llm/tasks.py | 82 +++ .../textbook_sharing/matching.py | 58 ++ .../textbook_sharing/netlist.py | 89 +++ .../textbook_sharing/nominal.py | 118 ++++ .../textbook_sharing/overrides.py | 50 ++ .../textbook_sharing/paths.py | 62 ++ .../textbook_sharing/textbook_sharing/pdk.py | 20 + .../textbook_sharing/presim.py | 26 + .../textbook_sharing/qualify.py | 89 +++ .../textbook_sharing/redesign_search.py | 57 ++ .../textbook_sharing/resim.py | 81 +++ .../textbook_sharing/review/__init__.py | 0 .../review/check_connectivity.py | 83 +++ .../review/check_gate_pads.py | 44 ++ .../textbook_sharing/review/composite.py | 114 ++++ .../textbook_sharing/review/render_gds.py | 98 +++ .../textbook_sharing/review/resolve_auto.py | 36 + .../textbook_sharing/review/reviewer_guide.md | 59 ++ .../textbook_sharing/review/visual_review.py | 173 +++++ .../textbook_sharing/run_case.py | 111 ++++ .../textbook_sharing/run_grid.py | 55 ++ .../textbook_sharing/selection/__init__.py | 0 .../textbook_sharing/selection/catalogue.py | 68 ++ .../textbook_sharing/selection/cost.py | 130 ++++ .../textbook_sharing/selection/fixed_order.py | 38 ++ .../selection/run_selection.py | 110 +++ .../textbook_sharing/selection/strategies.py | 157 +++++ .../textbook_sharing/selection/timing.py | 59 ++ .../textbook_sharing/testbench.py | 508 ++++++++++++++ .../textbook_sharing/verify/__init__.py | 0 .../textbook_sharing/verify/drc.py | 81 +++ .../textbook_sharing/verify/lvs.py | 149 +++++ .../textbook_sharing/verify/pex_sim.py | 100 +++ .../textbook_sharing/verify/physical.py | 69 ++ .../textbook_sharing/verify/pipeline.py | 82 +++ .../textbook_sharing/verify/record.py | 38 ++ .../textbook_sharing/verify/sizing.py | 95 +++ 90 files changed, 7176 insertions(+) create mode 100644 benchmarks/textbook_sharing/.gitignore create mode 100644 benchmarks/textbook_sharing/pytest.ini create mode 100644 benchmarks/textbook_sharing/requirements-lock.txt create mode 100755 benchmarks/textbook_sharing/scripts/env_lock.sh create mode 100755 benchmarks/textbook_sharing/scripts/reproduce_clean.sh create mode 100755 benchmarks/textbook_sharing/scripts/run_all.sh create mode 100755 benchmarks/textbook_sharing/scripts/run_in_container.sh create mode 100755 benchmarks/textbook_sharing/scripts/setup_env.sh create mode 100644 benchmarks/textbook_sharing/tests/conftest.py create mode 100644 benchmarks/textbook_sharing/tests/test_data.py create mode 100644 benchmarks/textbook_sharing/tests/test_docs.py create mode 100644 benchmarks/textbook_sharing/tests/test_enumeration.py create mode 100644 benchmarks/textbook_sharing/tests/test_layout_reproduces_records.py create mode 100644 benchmarks/textbook_sharing/tests/test_plan_parser.py create mode 100644 benchmarks/textbook_sharing/tests/test_sharing_plan.py create mode 100644 benchmarks/textbook_sharing/textbook_sharing/__init__.py create mode 100644 benchmarks/textbook_sharing/textbook_sharing/analysis/__init__.py create mode 100644 benchmarks/textbook_sharing/textbook_sharing/analysis/all.py create mode 100644 benchmarks/textbook_sharing/textbook_sharing/analysis/arrangement_bandwidth.py create mode 100644 benchmarks/textbook_sharing/textbook_sharing/analysis/benchmark_table.py create mode 100644 benchmarks/textbook_sharing/textbook_sharing/analysis/cost_decomposition.py create mode 100644 benchmarks/textbook_sharing/textbook_sharing/analysis/cost_validation.py create mode 100644 benchmarks/textbook_sharing/textbook_sharing/analysis/example.py create mode 100644 benchmarks/textbook_sharing/textbook_sharing/analysis/geometry_check.py create mode 100644 benchmarks/textbook_sharing/textbook_sharing/analysis/interface.py create mode 100644 benchmarks/textbook_sharing/textbook_sharing/analysis/ledger.py create mode 100644 benchmarks/textbook_sharing/textbook_sharing/analysis/models.py create mode 100644 benchmarks/textbook_sharing/textbook_sharing/analysis/pex_sensitivity.py create mode 100644 benchmarks/textbook_sharing/textbook_sharing/analysis/pvt.py create mode 100644 benchmarks/textbook_sharing/textbook_sharing/analysis/report.py create mode 100644 benchmarks/textbook_sharing/textbook_sharing/analysis/review_coverage.py create mode 100644 benchmarks/textbook_sharing/textbook_sharing/analysis/scope.py create mode 100644 benchmarks/textbook_sharing/textbook_sharing/analysis/selection.py create mode 100644 benchmarks/textbook_sharing/textbook_sharing/assembly/__init__.py create mode 100644 benchmarks/textbook_sharing/textbook_sharing/assembly/adapters.py create mode 100644 benchmarks/textbook_sharing/textbook_sharing/assembly/engine.py create mode 100644 benchmarks/textbook_sharing/textbook_sharing/assembly/passives.py create mode 100644 benchmarks/textbook_sharing/textbook_sharing/assembly/pincell.py create mode 100644 benchmarks/textbook_sharing/textbook_sharing/build_cases.py create mode 100644 benchmarks/textbook_sharing/textbook_sharing/calibrate_res.py create mode 100644 benchmarks/textbook_sharing/textbook_sharing/cases.py create mode 100644 benchmarks/textbook_sharing/textbook_sharing/circuits.py create mode 100644 benchmarks/textbook_sharing/textbook_sharing/freeze.py create mode 100644 benchmarks/textbook_sharing/textbook_sharing/grid.py create mode 100644 benchmarks/textbook_sharing/textbook_sharing/layout.py create mode 100644 benchmarks/textbook_sharing/textbook_sharing/llm/__init__.py create mode 100644 benchmarks/textbook_sharing/textbook_sharing/llm/agent_sessions.py create mode 100644 benchmarks/textbook_sharing/textbook_sharing/llm/evaluate.py create mode 100644 benchmarks/textbook_sharing/textbook_sharing/llm/interface_base.md create mode 100644 benchmarks/textbook_sharing/textbook_sharing/llm/interface_sharing.md create mode 100644 benchmarks/textbook_sharing/textbook_sharing/llm/make_examples.py create mode 100644 benchmarks/textbook_sharing/textbook_sharing/llm/plan_parser.py create mode 100644 benchmarks/textbook_sharing/textbook_sharing/llm/run_codex.py create mode 100644 benchmarks/textbook_sharing/textbook_sharing/llm/tasks.py create mode 100644 benchmarks/textbook_sharing/textbook_sharing/matching.py create mode 100644 benchmarks/textbook_sharing/textbook_sharing/netlist.py create mode 100644 benchmarks/textbook_sharing/textbook_sharing/nominal.py create mode 100644 benchmarks/textbook_sharing/textbook_sharing/overrides.py create mode 100644 benchmarks/textbook_sharing/textbook_sharing/paths.py create mode 100644 benchmarks/textbook_sharing/textbook_sharing/pdk.py create mode 100644 benchmarks/textbook_sharing/textbook_sharing/presim.py create mode 100644 benchmarks/textbook_sharing/textbook_sharing/qualify.py create mode 100644 benchmarks/textbook_sharing/textbook_sharing/redesign_search.py create mode 100644 benchmarks/textbook_sharing/textbook_sharing/resim.py create mode 100644 benchmarks/textbook_sharing/textbook_sharing/review/__init__.py create mode 100644 benchmarks/textbook_sharing/textbook_sharing/review/check_connectivity.py create mode 100644 benchmarks/textbook_sharing/textbook_sharing/review/check_gate_pads.py create mode 100644 benchmarks/textbook_sharing/textbook_sharing/review/composite.py create mode 100644 benchmarks/textbook_sharing/textbook_sharing/review/render_gds.py create mode 100644 benchmarks/textbook_sharing/textbook_sharing/review/resolve_auto.py create mode 100644 benchmarks/textbook_sharing/textbook_sharing/review/reviewer_guide.md create mode 100644 benchmarks/textbook_sharing/textbook_sharing/review/visual_review.py create mode 100644 benchmarks/textbook_sharing/textbook_sharing/run_case.py create mode 100644 benchmarks/textbook_sharing/textbook_sharing/run_grid.py create mode 100644 benchmarks/textbook_sharing/textbook_sharing/selection/__init__.py create mode 100644 benchmarks/textbook_sharing/textbook_sharing/selection/catalogue.py create mode 100644 benchmarks/textbook_sharing/textbook_sharing/selection/cost.py create mode 100644 benchmarks/textbook_sharing/textbook_sharing/selection/fixed_order.py create mode 100644 benchmarks/textbook_sharing/textbook_sharing/selection/run_selection.py create mode 100644 benchmarks/textbook_sharing/textbook_sharing/selection/strategies.py create mode 100644 benchmarks/textbook_sharing/textbook_sharing/selection/timing.py create mode 100644 benchmarks/textbook_sharing/textbook_sharing/testbench.py create mode 100644 benchmarks/textbook_sharing/textbook_sharing/verify/__init__.py create mode 100644 benchmarks/textbook_sharing/textbook_sharing/verify/drc.py create mode 100644 benchmarks/textbook_sharing/textbook_sharing/verify/lvs.py create mode 100644 benchmarks/textbook_sharing/textbook_sharing/verify/pex_sim.py create mode 100644 benchmarks/textbook_sharing/textbook_sharing/verify/physical.py create mode 100644 benchmarks/textbook_sharing/textbook_sharing/verify/pipeline.py create mode 100644 benchmarks/textbook_sharing/textbook_sharing/verify/record.py create mode 100644 benchmarks/textbook_sharing/textbook_sharing/verify/sizing.py diff --git a/benchmarks/textbook_sharing/.gitignore b/benchmarks/textbook_sharing/.gitignore new file mode 100644 index 00000000..0e2102c7 --- /dev/null +++ b/benchmarks/textbook_sharing/.gitignore @@ -0,0 +1,3 @@ +# unpacked run records or new runs, and the local Python environment +runs/ +.env/ diff --git a/benchmarks/textbook_sharing/pytest.ini b/benchmarks/textbook_sharing/pytest.ini new file mode 100644 index 00000000..3a7b43c2 --- /dev/null +++ b/benchmarks/textbook_sharing/pytest.ini @@ -0,0 +1,5 @@ +[pytest] +testpaths = tests +# Pydantic deprecation warnings raised by the upstream gLayout primitives and by gdsfactory +filterwarnings = + ignore::DeprecationWarning diff --git a/benchmarks/textbook_sharing/requirements-lock.txt b/benchmarks/textbook_sharing/requirements-lock.txt new file mode 100644 index 00000000..fd21fc39 --- /dev/null +++ b/benchmarks/textbook_sharing/requirements-lock.txt @@ -0,0 +1,100 @@ +annotated-doc==0.0.5 +annotated-types==0.8.0 +asttokens==3.0.2 +attrs==26.1.0 +certifi==2026.7.22 +cffi==2.1.1 +charset-normalizer==3.5.2 +click==8.5.0 +cloudpickle==3.1.2 +cmd2==2.7.0 +colorama==0.4.6 +comm==0.2.3 +contourpy==1.3.2 +cycler==0.12.1 +defusedxml==0.7.1 +docopt==0.6.2 +executing==2.2.1 +flatdict==4.1.0 +fonttools==4.66.1 +gdsfactory==7.7.0 +gdstk==0.9.62 +idna==3.20 +iniconfig==2.3.1 +ipython==9.17.1 +ipython_pygments_lexers==1.1.1 +ipywidgets==8.1.9 +jedi==0.20.0 +Jinja2==3.1.6 +joblib==1.6.0 +jsonschema==4.26.0 +jsonschema-specifications==2025.9.1 +jupyterlab_widgets==3.0.17 +kiwisolver==1.5.1 +klayout==0.28.17.post1 +loguru==0.7.3 +lxml==6.1.3 +markdown-it-py==4.2.0 +MarkupSafe==3.0.4 +matplotlib==3.10.0 +matplotlib-inline==0.2.2 +mdurl==0.1.2 +networkx==3.6.1 +nltk==3.10.3 +numpy==1.24.0 +omegaconf==2.4.0 +orjson==3.13.0 +packaging==26.3 +pandas==2.3.0 +parso==0.8.7 +pexpect==4.9.0 +pillow==12.3.0 +pluggy==1.6.0 +ply==3.11 +prettyprint==0.1.5 +PrettyPrintTree==2.0.2 +prompt_toolkit==3.0.53 +psutil==7.2.2 +ptyprocess==0.7.0 +pure_eval==0.2.4 +pycparser==3.11 +pydantic==2.14.0 +pydantic-extra-types==2.11.1 +pydantic-settings==2.15.0 +pydantic_core==2.50.0 +Pygments==2.21.0 +pymupdf==1.28.2 +pyparsing==3.3.3 +pyperclip==1.11.0 +PySpice==1.5 +pytest==9.1.1 +python-dateutil==2.9.0.post0 +python-dotenv==1.2.4 +pytz==2026.5 +PyYAML==6.0.3 +qrcode==8.2 +rectpack==0.2.2 +referencing==0.37.0 +regex==2026.9.29 +requests==2.34.2 +rich==15.0.0 +rich-argparse==1.8.0 +rpds-py==2026.9.1 +scipy==1.15.3 +shapely==2.1.2 +shellingham==1.5.4 +six==1.17.0 +stack-data==0.6.3 +svgutils==0.3.4 +toolz==1.2.0 +tqdm==4.70.1 +traitlets==5.16.1 +typer==0.27.3 +types-PyYAML==6.0.12.20260906 +typing-inspection==0.4.4 +typing_extensions==4.16.0 +tzdata==2026.5 +urllib3==2.8.0 +watchdog==6.0.0 +wcwidth==0.9.2 +widgetsnbextension==4.0.16 diff --git a/benchmarks/textbook_sharing/scripts/env_lock.sh b/benchmarks/textbook_sharing/scripts/env_lock.sh new file mode 100755 index 00000000..30d5431b --- /dev/null +++ b/benchmarks/textbook_sharing/scripts/env_lock.sh @@ -0,0 +1,12 @@ +#!/bin/bash +# Record the environment of a run into /environment/: container image digest, EDA tool and PDK versions, +# Python packages and the repository commit. +set -e +HERE=$(cd "$(dirname "$0")/.." && pwd) +O=${TSB_RESULTS:-$HERE/results}/environment; mkdir -p "$O" +IMAGE=${TSB_IMAGE:-hpretl/iic-osic-tools@sha256:7ef29be71a33b5b8994cde7f7476dfefd1af94f2922354242d1579346feec462} +docker image inspect "$IMAGE" --format '{{.Id}} {{index .RepoDigests 0}}' > "$O/container_image.txt" +"$HERE/scripts/run_in_container.sh" "magic --version; netgen -batch quit 2>&1 | head -1; ngspice -v 2>&1 | grep ngspice | head -1; klayout -v; python --version; ls /foss/pdks" > "$O/tools_and_pdks.txt" 2>&1 +"$HERE/scripts/run_in_container.sh" "python -m pip freeze" > "$O/python_freeze.txt" 2>/dev/null +git -C "$HERE" rev-parse HEAD > "$O/git_head.txt" +echo "written $O"; ls -la "$O" diff --git a/benchmarks/textbook_sharing/scripts/reproduce_clean.sh b/benchmarks/textbook_sharing/scripts/reproduce_clean.sh new file mode 100755 index 00000000..78aa7e70 --- /dev/null +++ b/benchmarks/textbook_sharing/scripts/reproduce_clean.sh @@ -0,0 +1,38 @@ +#!/bin/bash +# Clean-process reproduction: export the committed tree (git archive HEAD) into a fresh folder, rebuild and verify a +# few cases there from scratch (geometry, DRC, LVS, extraction, post-layout simulation), then compare geometry hash, +# area, status, every verification stage and the post-layout measures with the recorded runs (default: +# /runs). Nothing from the recorded runs is copied into the fresh tree. +# usage: scripts/reproduce_clean.sh [CASE/PDK/SIZE/MODE ...] +set -e +HERE=$(cd "$(dirname "$0")/.." && pwd); REPO=$(cd "$HERE/../.." && pwd) +REF=${TSB_RUNS:-$HERE/runs}; OUT=${TSB_RESULTS:-$HERE/results}/analysis +STAMP=$(date -u +%Y%m%dT%H%M%SZ); C=${TSB_REPRO_DIR:-/tmp/tsb_repro_$STAMP} +CASES=${*:-"C08/sky130/sW1_sL1/combined C08/gf180/sW1_sL1/combined C08/ihp130/sW1_sL1/combined C11/ihp130/sW1_sL1/gate_only C02/gf180/sW1_sL1/combined"} +mkdir -p "$C/tree"; git -C "$REPO" archive HEAD | tar -x -C "$C/tree" +git -C "$REPO" rev-parse HEAD > "$C/SOURCE_COMMIT.txt" +TSB_RUNS="$C/runs" TSB_RESULTS="$C/results" TSB_ENV=${TSB_ENV:-$HERE/.env} \ + "$C/tree/benchmarks/textbook_sharing/scripts/run_in_container.sh" "python - <<'PY' +from textbook_sharing.run_case import run +from textbook_sharing import paths +for spec in '$CASES'.split(): + cid, pdk, size, mode = spec.split('/') + r = run(paths.CASES / cid / pdk / size, paths.GRID_RUNS / cid / pdk / size / mode, mode=mode, label='repro') + print(spec, r.get('primary_status'), r.get('area_um2'), flush=True) +PY" +mkdir -p "$OUT" +python3 - "$C" "$REF" "$OUT/repro_clean_$STAMP.json" $CASES <<'PY' +import json, sys +from pathlib import Path +fresh, ref, out, specs = Path(sys.argv[1]), Path(sys.argv[2]), sys.argv[3], sys.argv[4:] +runs = [] +for spec in specs: + a = json.load(open(fresh / "runs/grid" / spec / "result.json")); b = json.load(open(ref / "grid" / spec / "result.json")) + match = {k: a.get(k) == b.get(k) for k in ("geometry_hash", "area_um2", "primary_status", "verify")} + ma, mb = (a.get("postsim") or {}).get("measures") or {}, (b.get("postsim") or {}).get("measures") or {} + diffs = [abs(ma[k] - mb[k]) / max(abs(mb[k]), 1e-30) for k in mb if isinstance(mb[k], (int, float)) and isinstance(ma.get(k), (int, float))] + runs.append({"run": spec, "match": match, "max_rel_measure_diff": max(diffs) if diffs else None}) + print(spec, match, "largest relative difference of a post-layout measure:", runs[-1]["max_rel_measure_diff"]) +json.dump({"commit": (fresh / "SOURCE_COMMIT.txt").read_text().strip(), "runs": runs}, open(out, "w"), indent=1) +PY +echo "fresh tree in $C; summary in $OUT/repro_clean_$STAMP.json" diff --git a/benchmarks/textbook_sharing/scripts/run_all.sh b/benchmarks/textbook_sharing/scripts/run_all.sh new file mode 100755 index 00000000..9ae52120 --- /dev/null +++ b/benchmarks/textbook_sharing/scripts/run_all.sh @@ -0,0 +1,33 @@ +#!/bin/bash +# Run the whole benchmark in the order of the protocol: case definitions and rules first; the development sizes next, +# from which the fixed mode order is frozen and the cost rule is checked; then the held-out sizes, the selection study, +# the corner simulations and the analyses. Every stage is resumable (finished runs are skipped); frozen rules +# (data/frozen/) and freeze checkpoints (/freeze/) are never overwritten. The model sessions are not started +# here: they need a logged-in model CLI or an agent interface (docs/MODELS.md). The grid and the selection study take +# days of CPU time on a 16-core machine. +set -e +HERE=$(cd "$(dirname "$0")/.." && pwd); C="$HERE/scripts/run_in_container.sh"; J=${JOBS:-16} +RES=${TSB_RESULTS:-$HERE/results}; DEV=sW1_sL1,sW1_sL1.5 +stage() { echo "== $1"; } +freeze() { [ -f "$RES/freeze/$1.json" ] || $C "python -m textbook_sharing.freeze $1 '$2'"; } +stage "1 cases: derive sizes, qualify, freeze specifications" +$C "python -m textbook_sharing.build_cases --jobs $J" +freeze cases_and_rules "size grid, qualification rule and frozen specifications, before any layout" +stage "2 main grid, development sizes" +$C "python -m textbook_sharing.run_grid --sizes $DEV --jobs $J" +stage "3 fixed mode order and cost rule, from the development sizes only" +[ -f "$HERE/data/frozen/fixed_order.json" ] || $C "python -m textbook_sharing.selection.fixed_order --sizes $DEV" +$C "python -m textbook_sharing.analysis.cost_validation --sizes $DEV --out $RES/analysis/cost_validation_dev.json" +freeze cost_and_order "cost rule and fixed mode order, before the held-out sizes" +stage "4 main grid, all sizes" +$C "python -m textbook_sharing.run_grid --jobs $J" +stage "5 selection catalogues and their full evaluation" +$C "python -m textbook_sharing.selection.run_selection --stage all --jobs $J" +stage "6 controlled timing of the selection methods" +$C "python -m textbook_sharing.selection.timing --jobs 10 --out $RES/analysis/timing_controlled.json" +stage "7 corners (PVT)" +$C "python -m textbook_sharing.analysis.pvt --jobs $J --out $RES/analysis/pvt.json" +stage "8 analyses and the generated documents" +$C "python -m textbook_sharing.analysis.all --with-geometry" +stage "9 clean-process reproduction" +"$HERE/scripts/reproduce_clean.sh" diff --git a/benchmarks/textbook_sharing/scripts/run_in_container.sh b/benchmarks/textbook_sharing/scripts/run_in_container.sh new file mode 100755 index 00000000..83b8771e --- /dev/null +++ b/benchmarks/textbook_sharing/scripts/run_in_container.sh @@ -0,0 +1,19 @@ +#!/bin/bash +# Run a command inside the pinned IIC-OSIC-TOOLS image (EDA tools and PDKs), with this repository mounted at the same +# absolute path and the Python environment created by scripts/setup_env.sh. +# usage: scripts/run_in_container.sh "" (the command starts in benchmarks/textbook_sharing) +set -e +HERE=$(cd "$(dirname "$0")/.." && pwd) # benchmarks/textbook_sharing +REPO=$(cd "$HERE/../.." && pwd) # repository root (provides src/glayout) +ENV=${TSB_ENV:-$HERE/.env} +IMAGE=${TSB_IMAGE:-hpretl/iic-osic-tools@sha256:7ef29be71a33b5b8994cde7f7476dfefd1af94f2922354242d1579346feec462} +MOUNTS=(-v "$REPO:$REPO") +for d in "${TSB_RUNS:-}" "${TSB_RESULTS:-}" "${TSB_ENV:-}"; do + if [ -n "$d" ]; then mkdir -p "$d"; MOUNTS+=(-v "$d:$d"); fi +done +exec docker run --rm -u "$(id -u):$(id -g)" "${MOUNTS[@]}" -w "$HERE" \ + -e HOME="$ENV/home" -e PDK_ROOT=/foss/pdks \ + -e PATH="$ENV/py311/bin:/foss/tools/bin:/foss/tools/klayout:/usr/local/bin:/usr/bin:/bin" \ + -e PYTHONPATH="$REPO/src:$HERE" -e GLAYOUT_BACKEND=gdsfactory -e TSB_RUNS -e TSB_RESULTS \ + -e PYTHONDONTWRITEBYTECODE=1 -e MPLCONFIGDIR="$ENV/home/mpl" -e OMP_NUM_THREADS=1 -e OPENBLAS_NUM_THREADS=1 \ + -e TZ=UTC -e LC_ALL=C.UTF-8 -e LANG=C.UTF-8 --entrypoint /bin/bash "$IMAGE" -c "$*" diff --git a/benchmarks/textbook_sharing/scripts/setup_env.sh b/benchmarks/textbook_sharing/scripts/setup_env.sh new file mode 100755 index 00000000..8a26551c --- /dev/null +++ b/benchmarks/textbook_sharing/scripts/setup_env.sh @@ -0,0 +1,15 @@ +#!/bin/bash +# Create the pinned Python 3.11 environment used by every step (micromamba + pip, versions from requirements-lock.txt) +# under benchmarks/textbook_sharing/.env (or $TSB_ENV). Run once on a Linux x86-64 host with network access. +set -e +HERE=$(cd "$(dirname "$0")/.." && pwd) +ENV=${TSB_ENV:-$HERE/.env} +mkdir -p "$ENV/home" +if [ ! -x "$ENV/bin/micromamba" ]; then + curl -Ls https://micro.mamba.pm/api/micromamba/linux-64/2.9.0 | tar -xj -C "$ENV" bin/micromamba +fi +[ -x "$ENV/py311/bin/python" ] || "$ENV/bin/micromamba" create -y -p "$ENV/py311" -c conda-forge python=3.11.17 pip +"$ENV/py311/bin/python" -m pip install --no-deps -r "$HERE/requirements-lock.txt" +# ngspice: one thread per simulation (parallelism comes from running many simulations at once) +printf 'set num_threads=1\n' > "$ENV/home/.spiceinit" +echo "environment ready in $ENV" diff --git a/benchmarks/textbook_sharing/tests/conftest.py b/benchmarks/textbook_sharing/tests/conftest.py new file mode 100644 index 00000000..2b1f85c7 --- /dev/null +++ b/benchmarks/textbook_sharing/tests/conftest.py @@ -0,0 +1,4 @@ +import os +os.environ.setdefault("GLAYOUT_BACKEND", "gdsfactory") +from textbook_sharing import paths +paths.setup_imports() diff --git a/benchmarks/textbook_sharing/tests/test_data.py b/benchmarks/textbook_sharing/tests/test_data.py new file mode 100644 index 00000000..1ef7e618 --- /dev/null +++ b/benchmarks/textbook_sharing/tests/test_data.py @@ -0,0 +1,26 @@ +"""Consistency of the shipped case data and of the run records (when extracted into ).""" +import json, hashlib, collections +import pytest +from textbook_sharing import paths + + +def test_case_manifests(): + dirs = sorted(paths.CASES.glob("*/*/*/manifest.json")) + assert len(dirs) == 639 # 648 requests minus 9 parameter-illegal ones + for m in dirs: + man = json.load(open(m)) + for name, sha in man.items(): + assert hashlib.sha256((m.parent / name).read_bytes()).hexdigest() == sha, (m.parent, name) + + +def test_case_build_counts(): + recs = json.load(open(paths.RESULTS / "case_build.json")) + c = collections.Counter(r["stage"] for r in recs) + assert len(recs) == 648 and c["parameter_illegal"] == 9 and c["schematic_not_qualified"] == 88 and c["qualified"] == 551 + + +@pytest.mark.skipif(not (paths.GRID_RUNS).exists(), reason="run records not extracted (tar -xJf results/run_records.tar.xz)") +def test_ledger_matches_records(): + L = json.load(open(paths.RESULTS / "count_ledger.json"))["cases"] + assert (L["requested"], L["formal_entries"], L["mode_rows"]["total"]) == (648, 547, 2204) + assert L["mode_rows"]["by_status"] == {"auto_passed": 1608, "NA": 592, "spec_failed": 4} diff --git a/benchmarks/textbook_sharing/tests/test_docs.py b/benchmarks/textbook_sharing/tests/test_docs.py new file mode 100644 index 00000000..720082b7 --- /dev/null +++ b/benchmarks/textbook_sharing/tests/test_docs.py @@ -0,0 +1,89 @@ +"""The documents agree with the result tables: the generated documents are up to date, and every number quoted in the +hand-written documents is the number in results/.""" +import json, tarfile +from textbook_sharing import paths +from textbook_sharing.analysis import report + + +def J(name): + return json.load(open(paths.RESULTS / name)) + + +def doc(name): + return " ".join((paths.ROOT / name).read_text().split()) # whitespace-normalised, so line breaks do not matter + + +def pct(x, nd=1): + return f"{100 * x:.{nd}f}" + + +def present(name, expected): + text = doc(name) + missing = [e for e in expected if " ".join(e.split()) not in text] + assert not missing, f"{name}: {missing}" + + +def test_generated_documents_are_current(): + assert (paths.ROOT / "docs/PARAMETER_SPACE.md").read_text() == report.parameter_space() + assert (paths.ROOT / "docs/RESULTS.md").read_text() == report.results() + + +def test_readme(): + ex = J("analysis/running_example.json"); st = ex["steps"] + L = J("count_ledger.json")["cases"]; bt = J("analysis/benchmark_table.json") + cd = J("analysis/cost_decomposition.json"); c = cd["by_mode"]["combined"]; im = cd["increase_mechanisms"] + ho = J("analysis/cost_validation_heldout.json")["summary"]; sel = J("analysis/selection_summary.json")["summary"]["by_method"] + sa = J("analysis/scope_audit.json"); b = sa["interface_comparison"]["base-gLayout interface"] + sharing = sum(1 for r in bt["rows"] if r["outcomes"].get("formal") and r["modes_applicable_in_formal"]) + assert {round(s["gain_db"], 1) for s in st} == {round(st[-1]["gain_db"], 1)} and {round(s["ugf_hz"] / 1e6, 1) for s in st} == {round(st[-1]["ugf_hz"] / 1e6, 1)} + present("README.md", [ + f"unshared layout is {st[0]['area_um2']:.1f} um^2", + f"{st[-1]['area_um2']:.1f} um^2, {pct(-st[-1]['change_vs_unshared'])} % smaller", + f"the gain ({st[-1]['gain_db']:.1f} dB) and unity-gain frequency ({st[-1]['ugf_hz'] / 1e6:.1f} MHz)", + f"gives {ex['named_mode_combined']['area_um2']:.1f} um^2", + f"{L['requested']} requests (18 topologies x 3 PDKs x 12 sizes) give {L['formal_entries']} formal entries in " + f"{bt['totals']['topologies_with_formal_entries']} topologies; {sharing} topologies admit sharing", + f"makes {c['classes']['positive']} of {c['n']} verified layouts smaller (mean {pct(c['mean_rel'])} %, up to {pct(c['min_rel'])} %)", + f"Of the {im['n']} area increases over all modes, {im['assembly_only']} come from routing and row assembly", + f"and {im['by_primary']['wider_row']} from a shared cell", + f"for {pct(ho['sign_correct'] / ho['n_pairs'], 0)} % of the pairs", + f"within {pct(sel['cost_rank']['1']['gap_balanced_when_found'])} % of the best of a 64-plan catalogue", + f"in {sa['best_known_source']['model proposal']} of {sa['task_sets']['model_tasks']} tasks", + f"{b['sessions_equal_to_reference']} of {b['sessions']} sessions end at the unshared area", + f"{len(list(paths.CASES.glob('*/*/*/case.json')))} case folders"]) + + +def test_models_doc(): + sa = J("analysis/scope_audit.json"); b = sa["interface_comparison"]["base-gLayout interface"]; s = sa["interface_comparison"]["sharing interface"] + li = J("analysis/llm_interface.json"); au = J("analysis/agent_session_audit.json")["summary"] + oai = [x for x in J("analysis/llm_summary.json")["sessions"] if x["tag"].startswith("openai")] + present("docs/MODELS.md", [ + f"In {sa['best_known_source']['model proposal']} of the {sa['task_sets']['model_tasks']} tasks a model found", + f"{b['sessions_equal_to_reference']} of {b['sessions']} sessions end at the area of the unshared layout", + f"the same model saves {pct(-s['vs_reference'])} % on average", + f"is on average {pct(li['summary']['capability']['mean_gap_of_best_base_expressible_candidate'])} % above", + f"All {len(oai) + li['summary']['base']['sessions']} OpenAI sessions ({len(oai)} main, {li['summary']['base']['sessions']} interface comparison)", + f"Of the {au['sessions']} sessions, {au['clean']} made only allowed calls; {au['in_folder_edit_sessions']} also edited", + f"{au['auto_flagged']} were flagged automatically", + f"The first {au['launch_text_counts']['A']} sessions received launch text A, the last {au['launch_text_counts']['B']} text B"]) + assert all(x["isolation_breach"] is False for x in oai) + assert au["after_manual_review"]["foreign_information_access"] == 0 + + +def test_verification_doc(): + rs = J("analysis/resim_after_testbench_fix.json")["counts"] + worse = sum(n for k, n in rs.items() if k.startswith("auto_passed->") and not k.endswith("auto_passed")) + pex = J("analysis/pex_sensitivity_C10_gf180.json")[0]["rc_measures"] + assert worse == 0 + present("docs/VERIFICATION.md", [f"no passing layout failed, {rs.get('spec_failed->auto_passed', 0)} failing layouts passed", + f"settled {abs(pex['vo1'] - pex['vo2']):.2f} V apart"]) + + +def test_data_doc(): + cases = list(paths.CASES.glob("*/*/*/case.json")); nominal = list((paths.DATA / "nominal").glob("*/*.json")) + build = J("case_build.json") + with tarfile.open(paths.RESULTS / "run_records.tar.xz") as t: + files = sum(1 for m in t.getmembers() if m.isfile()) + present("docs/DATA.md", [f"JSON and model text ({files:,} files)".replace(",", " "), f"passed the size derivation ({len(cases)})", f"every topology and PDK ({len(nominal)})", + f"one record per request ({len(build)})", + f"including the {sum(r['stage'] == 'parameter_illegal' for r in build)} parameter-illegal ones"]) diff --git a/benchmarks/textbook_sharing/tests/test_enumeration.py b/benchmarks/textbook_sharing/tests/test_enumeration.py new file mode 100644 index 00000000..152da30d --- /dev/null +++ b/benchmarks/textbook_sharing/tests/test_enumeration.py @@ -0,0 +1,20 @@ +"""Six-axis enumeration of the five-transistor OTA at its nominal size (SKY130): 256 raw tuples per group, 10 distinct +legal plans for the NMOS group and 101 for the PMOS group, i.e. 1010 plans for the circuit.""" +from glayout.sharing import group_candidates, named_plans, RAW_PER_GROUP +from textbook_sharing import paths +from textbook_sharing.run_case import load_case_dir +from textbook_sharing.circuits import CIRCUITS +from textbook_sharing.layout import device_specs, sharing_groups +from textbook_sharing.pdk import pdk_obj + + +def test_ota_plan_space(): + case, _ = load_case_dir(paths.CASES / "C08" / "sky130" / "sW1_sL1") + groups = sharing_groups(device_specs(CIRCUITS["C08"], case.sizing)) + assert [[d.logical_id for d in g] for g in groups] == [["M1", "M2", "M3"], ["M4", "M5"]] + pdk = pdk_obj("sky130") + counts = [group_candidates(pdk, g)["counts"] for g in groups] + assert all(c["raw"] == RAW_PER_GROUP == 256 for c in counts) + assert [c["unique"] for c in counts] == [10, 101] + named = named_plans(pdk, groups[0]) + assert named["gate_only"] is None and named["combined"] is None # M1, M2, M3 have three different gate nets diff --git a/benchmarks/textbook_sharing/tests/test_layout_reproduces_records.py b/benchmarks/textbook_sharing/tests/test_layout_reproduces_records.py new file mode 100644 index 00000000..ce9c6c85 --- /dev/null +++ b/benchmarks/textbook_sharing/tests/test_layout_reproduces_records.py @@ -0,0 +1,23 @@ +"""Rebuilding two recorded OTA layouts (SKY130, nominal size) reproduces their recorded bounding-box areas exactly: +the unshared plan (256.0048 um^2) and the best verified plan of its catalogue (196.0921 um^2).""" +from textbook_sharing import paths +from textbook_sharing.run_case import load_case_dir +from textbook_sharing.circuits import CIRCUITS +from textbook_sharing.layout import build, device_specs, sharing_groups +from textbook_sharing.llm.plan_parser import parse_program, to_sharing_plan +from textbook_sharing.pdk import pdk_obj +from test_plan_parser import PROGRAM + + +def test_unshared_and_best_plan_areas(): + case, _ = load_case_dir(paths.CASES / "C08" / "sky130" / "sW1_sL1"); circ = CIRCUITS["C08"]; pdk = pdk_obj("sky130") + ref = build(pdk, circ, case.sizing, mode="independent", name="test_ota_unshared") + assert round(ref["assembly_stats"]["area_um2"], 4) == 256.0048 + groups = sharing_groups(device_specs(circ, case.sizing)); calls = parse_program(PROGRAM) + plans = {str(i): to_sharing_plan(calls[i], g, pdk).to_json() for i, g in enumerate(groups)} + best = build(pdk, circ, case.sizing, name="test_ota_best", plans=plans) + assert round(best["assembly_stats"]["area_um2"], 4) == 196.0921 + chans = {} + for tr in ref["trunks"]: chans.setdefault(tr["channel"], set()).add(tr["net"]) + assert chans.get(2) == {"net22"} # unshared: a top channel only for net22 + assert 2 not in {tr["channel"] for tr in best["trunks"]} # best plan: no top channel diff --git a/benchmarks/textbook_sharing/tests/test_plan_parser.py b/benchmarks/textbook_sharing/tests/test_plan_parser.py new file mode 100644 index 00000000..c97246a3 --- /dev/null +++ b/benchmarks/textbook_sharing/tests/test_plan_parser.py @@ -0,0 +1,33 @@ +"""The restricted program format: accepted constructs expand into SharingPlans, anything else is rejected.""" +import pytest +from textbook_sharing.llm.plan_parser import parse_program, to_sharing_plan, ParseError +from textbook_sharing import paths +from textbook_sharing.run_case import load_case_dir +from textbook_sharing.circuits import CIRCUITS +from textbook_sharing.layout import device_specs, sharing_groups +from textbook_sharing.pdk import pdk_obj + +PROGRAM = '''plans = { + 0: axis_plan(arrangement="block", orientation="seek_SD", diffusion="all_legal", gate="per_device", + strap_start="bottom", contact_end="left"), + 1: SharingPlan(finger_order=[("M4",0),("M4",1),("M4",2),("M4",3),("M5",0),("M5",1),("M5",2),("M5",3)], + orientations=["SD","DS"]*4, diffusion_joins=[True]*7, + gate_groups=[GateGroup(fingers=tuple(range(8)), side="top", pad_end="right")])}''' + + +def groups(): + case, _ = load_case_dir(paths.CASES / "C08" / "sky130" / "sW1_sL1") + return sharing_groups(device_specs(CIRCUITS["C08"], case.sizing)) + + +def test_program_expands_to_plans(): + g = groups(); pdk = pdk_obj("sky130"); calls = parse_program(PROGRAM) + p0 = to_sharing_plan(calls[0], g[0], pdk); p1 = to_sharing_plan(calls[1], g[1], pdk) + assert all(p0.diffusion_joins) and p0.orientations[16] == "DS" # M3 turned so that net23 meets net23 + assert p1.summary()["cross_device_gate_groups"] == 1 and p1.summary()["islands"] == 1 + + +@pytest.mark.parametrize("code", ["import os\nplans = {}", "plans = {0: __import__('os')}", "x = 1"]) +def test_anything_else_is_rejected(code): + with pytest.raises(ParseError): + parse_program(code) diff --git a/benchmarks/textbook_sharing/tests/test_sharing_plan.py b/benchmarks/textbook_sharing/tests/test_sharing_plan.py new file mode 100644 index 00000000..3741a88c --- /dev/null +++ b/benchmarks/textbook_sharing/tests/test_sharing_plan.py @@ -0,0 +1,35 @@ +"""SharingPlan legality, construction and the sharing evidence recomputed from the drawn geometry (the PMOS mirror +M4/M5 of the five-transistor OTA, SKY130, nominal size).""" +from glayout.sharing import DeviceSpec, SharingPlan, FingerRef, GateGroup, validate_plan, build_mos_group, rules_for, independent_plan +from textbook_sharing.pdk import pdk_obj + +M4 = DeviceSpec("M4", "pfet", d="net22", g="net22", s="VDD", b="VDD", width_total=2.0, length=0.3, nf=4) +M5 = DeviceSpec("M5", "pfet", d="VOUT1", g="net22", s="VDD", b="VDD", width_total=2.0, length=0.3, nf=4) + + +def shared_plan(): + return SharingPlan(finger_order=[FingerRef("M4", k) for k in range(4)] + [FingerRef("M5", k) for k in range(4)], + orientations=["SD", "DS"] * 4, diffusion_joins=[True] * 7, + gate_groups=[GateGroup(tuple(range(8)), "top", "right")]) + + +def test_independent_plan_is_legal(): + pdk = pdk_obj("sky130") + assert validate_plan(rules_for(pdk), [M4, M5], independent_plan([M4, M5])).ok + + +def test_join_across_different_nets_is_rejected(): + pdk = pdk_obj("sky130"); plan = shared_plan() + plan.orientations[4] = "DS" # M5's first finger now shows its drain (VOUT1) to M4's source (VDD) + rep = validate_plan(rules_for(pdk), [M4, M5], plan) + assert not rep.ok and rep.errors[0]["code"] == "join_net_mismatch" + + +def test_shared_plan_builds_and_evidence_is_recomputed(): + pdk = pdk_obj("sky130") + res = build_mos_group(pdk, [M4, M5], plan=shared_plan(), name="test_pmos_mirror") + ev = res.physical_sharing_evidence + assert ev["active_islands"] == 1 # VDD shared at the M4|M5 boundary + assert ev["n_cross_device_shared_nodes"] == 1 + assert ev["n_cross_device_gate_conductors"] == 1 # one net22 strap for both gates + assert ev["consistency"]["cross_device_nodes_found"] == ev["consistency"]["cross_device_joins_requested"] diff --git a/benchmarks/textbook_sharing/textbook_sharing/__init__.py b/benchmarks/textbook_sharing/textbook_sharing/__init__.py new file mode 100644 index 00000000..ec16fb44 --- /dev/null +++ b/benchmarks/textbook_sharing/textbook_sharing/__init__.py @@ -0,0 +1,3 @@ +"""Textbook layout-sharing benchmark for gLayout: 18 textbook analog topologies on SKY130, GF180MCU and IHP SG13G2, +the size grid and frozen specifications, the row assembler, the verification flow, plan selection, the language-model +protocol, visual review and the analyses behind every reported number. See ../README.md.""" diff --git a/benchmarks/textbook_sharing/textbook_sharing/analysis/__init__.py b/benchmarks/textbook_sharing/textbook_sharing/analysis/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/benchmarks/textbook_sharing/textbook_sharing/analysis/all.py b/benchmarks/textbook_sharing/textbook_sharing/analysis/all.py new file mode 100644 index 00000000..2ccff058 --- /dev/null +++ b/benchmarks/textbook_sharing/textbook_sharing/analysis/all.py @@ -0,0 +1,40 @@ +"""Recompute every analysis table from the run records, in dependency order, into / and /analysis/. + +By default only the analyses that read run records are run. --with-geometry also re-runs the cost-rule validation +(it rebuilds the unshared assembly of every case, a few minutes); the corner simulations (analysis.pvt) and the +controlled timing (selection.timing) are separate commands because they run simulations or time geometry builds. +usage: python -m textbook_sharing.analysis.all [--with-geometry]""" +import argparse, subprocess, sys +from textbook_sharing import paths + +DEV = "sW1_sL1,sW1_sL1.5" +HELD_OUT = "sW0.5_sL1,sW0.5_sL1.5,sW0.5_sL2,sW1_sL2,sW1.5_sL1,sW1.5_sL1.5,sW1.5_sL2,sW2_sL1,sW2_sL1.5,sW2_sL2" + + +def run(mod, *args): + print("==", mod, *args, flush=True) + subprocess.run([sys.executable, "-m", f"textbook_sharing.{mod}", *args], check=True) + + +def main(): + ap = argparse.ArgumentParser(); ap.add_argument("--with-geometry", action="store_true"); a = ap.parse_args() + A = paths.ANALYSIS; A.mkdir(parents=True, exist_ok=True) + run("analysis.ledger") + run("analysis.benchmark_table", "--out", str(A / "benchmark_table.json")) + run("analysis.cost_decomposition", "--out", str(A / "cost_decomposition.json")) + if a.with_geometry: + run("analysis.cost_validation", "--sizes", DEV, "--out", str(A / "cost_validation_dev.json")) + run("analysis.cost_validation", "--sizes", DEV, "--channel-rule", "none", "--out", str(A / "cost_validation_dev_no_channel.json")) + run("analysis.cost_validation", "--sizes", HELD_OUT, "--out", str(A / "cost_validation_heldout.json")) + run("analysis.selection", "--out", str(A / "selection_summary.json")) + run("analysis.models", "--out", str(A / "llm_summary.json"), "--tags", "openai_gpt-6.1-sol,anthropic_claude-sonnet") + run("analysis.interface", "--out", str(A / "llm_interface.json")) + run("analysis.scope", "--out", str(A / "scope_audit.json")) + run("analysis.arrangement_bandwidth", "--topology", "C16", "--out", str(A / "arrangement_bandwidth_C16.json")) + run("analysis.review_coverage", "--out", str(A / "review_coverage.json")) + run("analysis.example", "--out", str(A / "running_example.json")) + run("analysis.report") + + +if __name__ == "__main__": + main() diff --git a/benchmarks/textbook_sharing/textbook_sharing/analysis/arrangement_bandwidth.py b/benchmarks/textbook_sharing/textbook_sharing/analysis/arrangement_bandwidth.py new file mode 100644 index 00000000..7bb7d677 --- /dev/null +++ b/benchmarks/textbook_sharing/textbook_sharing/analysis/arrangement_bandwidth.py @@ -0,0 +1,36 @@ +"""Electrical cost of finger arrangement in the selection catalogue: per task and per group axis value, status counts +and mean post-layout f3db / gain (all evaluated candidates). Written for the C16 bandwidth failures (resistor-loaded +pair: f3db ~ 1/(2 pi R_L C_out), interleaving lengthens the output nets). +usage: python -m textbook_sharing.analysis.arrangement_bandwidth --topology C16 --out /analysis/arrangement_bandwidth_C16.json""" +import json, glob, argparse, collections, statistics +from pathlib import Path +from textbook_sharing import paths + + +def main(): + ap = argparse.ArgumentParser(); ap.add_argument("--topology", default="C16"); ap.add_argument("--out", required=True); a = ap.parse_args() + out = {} + for td in sorted(glob.glob(str(paths.SELECTION_RUNS / f"{a.topology}_*"))): + cat = json.load(open(Path(td) / "catalogue.json")); agg = collections.defaultdict(lambda: {"status": collections.Counter(), "f3db": [], "gain_lf": [], "area": []}) + for cid, e in cat["entries"].items(): + rp = Path(td) / cid / "result.json" + if not rp.exists(): continue + r = json.load(open(rp)); m = (r.get("postsim") or {}).get("measures") or {} + for gi, pid in enumerate(e["plan_ids"]): + tup = next((t for p, t in cat["tables"][gi]["unique"] if p == pid), None) + for ax in ("arrangement", "orientation", "diffusion", "gate", "strap_start"): + k = f"group{gi}.{ax}={tup[ax] if tup else 'independent'}" + agg[k]["status"][r["primary_status"]] += 1 + if m.get("f3db"): agg[k]["f3db"].append(m["f3db"]) + if m.get("gain_lf") is not None: agg[k]["gain_lf"].append(m["gain_lf"]) + if r.get("area_um2"): agg[k]["area"].append(r["area_um2"]) + out[Path(td).name] = {k: {"status": dict(v["status"]), "mean_f3db_MHz": statistics.mean(v["f3db"]) / 1e6 if v["f3db"] else None, + "mean_gain_dB": statistics.mean(v["gain_lf"]) if v["gain_lf"] else None, "mean_area_um2": statistics.mean(v["area"]) if v["area"] else None} + for k, v in sorted(agg.items())} + json.dump(out, open(a.out, "w"), indent=1) + for t, d in out.items(): + print(t); [print(" ", k, v["status"], None if v["mean_f3db_MHz"] is None else round(v["mean_f3db_MHz"], 1)) for k, v in d.items() if ".arrangement=" in k] + + +if __name__ == "__main__": + main() diff --git a/benchmarks/textbook_sharing/textbook_sharing/analysis/benchmark_table.py b/benchmarks/textbook_sharing/textbook_sharing/analysis/benchmark_table.py new file mode 100644 index 00000000..6fc81b6d --- /dev/null +++ b/benchmarks/textbook_sharing/textbook_sharing/analysis/benchmark_table.py @@ -0,0 +1,69 @@ +"""Per-topology benchmark table: devices, sharing groups, plan space at the nominal size, request outcomes over the +36 size/PDK points, applicable sharing modes among the formal entries, and membership in the selection and model +studies. No layout is generated: plan counts come from the static enumeration (legality + de-duplication only). +usage: python -m textbook_sharing.analysis.benchmark_table --out /analysis/benchmark_table.json""" +import json, glob, argparse, collections, math +from pathlib import Path +from textbook_sharing import paths +MODES = ("independent", "diffusion_only", "gate_only", "combined") + + +def main(): + ap = argparse.ArgumentParser(); ap.add_argument("--out", required=True); a = ap.parse_args() + from textbook_sharing.circuits import CIRCUITS + from textbook_sharing.testbench import CATEGORY + from textbook_sharing.run_case import load_case_dir, pdk_obj + from textbook_sharing.layout import device_specs, sharing_groups + from glayout.sharing import group_candidates + L = json.load(open(paths.LEDGER)); formal = set(L["formal_entries"]) + diag = {d["case_id"]: d["reason"] for d in L["diagnostic"]} + illegal = set() + for f in glob.glob(str(paths.CASES / "*/*/*/case.json")): + c = json.load(open(f)) + if c.get("status") == "parameter_illegal" or c.get("parameter_illegal"): illegal.add(c.get("case_id")) + sel = {Path(d).parent.name for d in glob.glob(str(paths.SELECTION_RUNS / "*/catalogue.json"))} + llm = {Path(d).name for d in glob.glob(str(paths.MODEL_RUNS / "openai_gpt-6.1-sol" / "*")) if Path(d).is_dir()} + pdk = pdk_obj("sky130"); rows = [] + for cid in sorted(CIRCUITS): + c = CIRCUITS[cid]; kinds = collections.Counter(d.kind for d in c.devices) + case, _ = load_case_dir(str(paths.CASES / cid / "sky130" / "sW1_sL1")) + groups = sharing_groups(device_specs(c, case.sizing)); per = [] + for g in groups: + cnt = group_candidates(pdk, g)["counts"] + per.append({"devices": [d.logical_id for d in g], "fingers": sum(d.nf for d in g), "unique_plans": cnt["unique"], "raw": cnt.get("raw", 256), + "static_illegal": cnt.get("static_illegal"), "equivalent_duplicate": cnt.get("equivalent_duplicate")}) + ids = [f"{cid}_{p}_{s}" for p in ("sky130", "gf180", "ihp130") for s in + [f"sW{sw:g}_sL{sl:g}" for sw in (0.5, 1, 1.5, 2) for sl in (1, 1.5, 2)]] + outcome = collections.Counter() + for i in ids: + if i in formal: outcome["formal"] += 1 + else: outcome[diag.get(i, "parameter_illegal")] += 1 + appl = collections.Counter() + for i in ids: + if i not in formal: continue + _, pk, sz = i.split("_", 2) + for m in MODES[1:]: + f = paths.GRID_RUNS / cid / pk / sz / m / "result.json" + if f.exists() and json.load(open(f)).get("primary_status") not in (None, "NA"): appl[m] += 1 + rows.append({"topology": cid, "name": c.name if hasattr(c, "name") else getattr(c, "family", ""), "category": CATEGORY[cid], + "mos": kinds.get("nfet", 0) + kinds.get("pfet", 0), "res": kinds.get("res", 0), "cap": kinds.get("cap", 0), + "groups_nominal_sky130": per, "plan_space_nominal_sky130": math.prod(g["unique_plans"] for g in per), + "requests": len(ids), "outcomes": dict(outcome), + "formal_by_pdk": {p: sum(1 for i in ids if i in formal and f"_{p}_" in i) for p in ("sky130", "gf180", "ihp130")}, + "modes_applicable_in_formal": dict(appl), "selection_tasks": sum(1 for t in sel if t.startswith(cid + "_")), + "model_tasks": sum(1 for t in llm if t.startswith(cid + "_"))}) + tot = collections.Counter() + for r in rows: + for k, v in r["outcomes"].items(): tot[k] += v + out = {"rows": rows, "totals": {"requests": sum(r["requests"] for r in rows), "outcomes": dict(tot), + "topologies_with_formal_entries": sum(1 for r in rows if r["outcomes"].get("formal")), + "selection_tasks": sum(r["selection_tasks"] for r in rows), "model_tasks": sum(r["model_tasks"] for r in rows)}} + json.dump(out, open(a.out, "w"), indent=1) + for r in rows: + print(r["topology"], r["category"], r["mos"], r["res"], r["cap"], [g["unique_plans"] for g in r["groups_nominal_sky130"]], r["plan_space_nominal_sky130"], + r["outcomes"], r["formal_by_pdk"], r["modes_applicable_in_formal"], r["selection_tasks"], r["model_tasks"]) + print(out["totals"]) + + +if __name__ == "__main__": + main() diff --git a/benchmarks/textbook_sharing/textbook_sharing/analysis/cost_decomposition.py b/benchmarks/textbook_sharing/textbook_sharing/analysis/cost_decomposition.py new file mode 100644 index 00000000..24f05840 --- /dev/null +++ b/benchmarks/textbook_sharing/textbook_sharing/analysis/cost_decomposition.py @@ -0,0 +1,108 @@ +"""Physical cost of sharing on the main grid (measured geometry; every pair = one case, one sharing mode vs. the +independent reference of the same case, both built by the same assembler). + A0 = W0*H0 (reference), A1 = W1*H1; dW = W0 - W1 (width saved), dH = H1 - H0 (height added) + A1 = (W0 - dW)(H0 + dH) -> sharing reduces area iff H0*dW > (W0 - dW)*dH +dW is split into: group width change of the row that sets the DUT width (shared diffusion / fewer island gaps / pad +overhang) and the rest (row-dominance changes, x shifts). dH is split into MOS row height change (strap bands, pad +levels) and routing-channel height change (tracks). passive_dominated: the widest row is a passive row in both layouts +(so MOS width savings cannot reduce the DUT width). +Area terms (exact: they add up to A1 - A0), with S = the largest row span (cells + tap strips): + wider_row = (S1 - S0) * H1 the row that sets the width got wider (its cells are wider) + stub_separation = ((W1 - W0) - (S1 - S0)) * H1 + width added outside the rows: a row shifted sideways, or a net split into + two trunks joined beyond the row ends, to keep the metal-2 stubs of two + rows apart in a channel + taller_mos_rows = W0 * dH_mos_rows, routing_tracks = W0 * dH_channels, other_height = W0 * dH_other +For every area increase the positive terms are listed and the largest one is its primary mechanism. +Classes: positive (A1 < A0 by > 0.5 %), negative (A1 > A0 by > 0.5 %), neutral. Only pairs where both layouts pass +every automatic stage are used for area statements; all pairs are listed. +usage: python -m textbook_sharing.analysis.cost_decomposition --out /analysis/cost_decomposition.json""" +import json, glob, argparse, collections, statistics +from pathlib import Path +from textbook_sharing import paths +DEAD = 0.005 +MODES = ("diffusion_only", "gate_only", "combined") + + +def span(row): + return row["width"] + 2 * row["tap_extent"] + + +def main(): + ap = argparse.ArgumentParser(); ap.add_argument("--out", required=True); a = ap.parse_args() + rows = [] + for ind in sorted(glob.glob(str(paths.GRID_RUNS / "*/*/*/independent/result.json"))): + b = json.load(open(ind)); cid, pdk, size = Path(ind).parts[-5:-2] + if not b.get("assembly_stats"): continue + sb = b["assembly_stats"] + for m in MODES: + f = Path(ind).parent.parent / m / "result.json" + if not f.exists(): continue + r = json.load(open(f)) + if r.get("primary_status") == "NA" or not r.get("assembly_stats"): continue + s1 = r["assembly_stats"] + W0, H0, W1, H1 = sb["width"], sb["height"], s1["width"], s1["height"] + A0, A1 = W0 * H0, W1 * H1; dW, dH = W0 - W1, H1 - H0 + rd0, rd1 = sb["row_dims"], s1["row_dims"] + w0i = max(range(len(rd0)), key=lambda i: span(rd0[i])); w1i = max(range(len(rd1)), key=lambda i: span(rd1[i])) + mos_dh = sum(x["height"] - y["height"] for x, y in zip(rd1, rd0) if x["kind"] in ("n", "p")) + ch_dh = sum(s1["channel_heights"]) - sum(sb["channel_heights"]) + mos_spans0 = {x["kind"]: span(x) for x in rd0 if x["kind"] in ("n", "p")}; mos_spans1 = {x["kind"]: span(x) for x in rd1 if x["kind"] in ("n", "p")} + row_dw = {k: round(mos_spans0[k] - mos_spans1.get(k, mos_spans0[k]), 4) for k in mos_spans0} + rel = A1 / A0 - 1 + cls = "positive" if rel < -DEAD else "negative" if rel > DEAD else "neutral" + dS = round(max(map(span, rd1)) - max(map(span, rd0)), 4); r4 = lambda v: round(v, 4) # lengths on the 0.1 nm scale + terms = {"wider_row": dS * H1, "stub_separation": r4(W1 - W0 - dS) * H1, "taller_mos_rows": W0 * r4(mos_dh), + "routing_tracks": W0 * r4(ch_dh), "other_height": W0 * r4(dH - mos_dh - ch_dh)} + rows.append({"case": f"{cid}_{pdk}_{size}", "topology": cid, "pdk": pdk, "size": size, "mode": m, + "both_auto_passed": b.get("primary_status") == "auto_passed" and r.get("primary_status") == "auto_passed", + "status_ref": b.get("primary_status"), "status_mode": r.get("primary_status"), + "A0": round(A0, 3), "A1": round(A1, 3), "rel": round(rel, 5), "class": cls, "W0": W0, "H0": H0, "W1": W1, "H1": H1, + "dW": round(dW, 4), "dH": round(dH, 4), "condition_lhs_H0dW": round(H0 * dW, 4), "condition_rhs_W1dH": round((W0 - dW) * dH, 4), + "dH_mos_rows": round(mos_dh, 4), "dH_channels": round(ch_dh, 4), "dH_other": round(dH - mos_dh - ch_dh, 4), + "row_span_saving": row_dw, "max_mos_row_span_saving": max(row_dw.values()) if row_dw else 0.0, + "widest_row_ref": rd0[w0i]["kind"], "widest_row_mode": rd1[w1i]["kind"], + "passive_dominated": rd0[w0i]["kind"] == "passive" and rd1[w1i]["kind"] == "passive", + "area_terms": {k: round(v, 3) for k, v in terms.items()}, + "channel_strategy_ref": sb.get("channel_strategy"), "channel_strategy_mode": s1.get("channel_strategy"), + "gds_ref": b.get("gds"), "gds_mode": r.get("gds"), "geometry_hash_ref": b.get("geometry_hash"), "geometry_hash_mode": r.get("geometry_hash"), + "geometry_identical": b.get("geometry_hash") == r.get("geometry_hash")}) + ok = [x for x in rows if x["both_auto_passed"]] + def summ(xs): + c = collections.Counter(x["class"] for x in xs) + rel = [x["rel"] for x in xs] + return {"n": len(xs), "classes": dict(c), "mean_rel": statistics.mean(rel) if rel else None, "median_rel": statistics.median(rel) if rel else None, + "min_rel": min(rel) if rel else None, "max_rel": max(rel) if rel else None, + "passive_dominated": sum(x["passive_dominated"] for x in xs), "geometry_identical_to_ref": sum(x["geometry_identical"] for x in xs)} + by_mode = {m: summ([x for x in ok if x["mode"] == m]) for m in MODES} + by_topo = {t: {m: summ([x for x in ok if x["topology"] == t and x["mode"] == m]) for m in MODES} for t in sorted({x["topology"] for x in ok})} + by_pdk = {p: {m: summ([x for x in ok if x["pdk"] == p and x["mode"] == m]) for m in MODES} for p in ("sky130", "gf180", "ihp130")} + # area increases: which terms add area, and the largest one + neg = [x for x in ok if x["class"] == "negative"] + for x in neg: + pos = {k: v for k, v in x["area_terms"].items() if v > 1e-6} + x["increase_terms"] = sorted(pos, key=lambda k: -pos[k]); x["primary_mechanism"] = x["increase_terms"][0] + terms = ("routing_tracks", "stub_separation", "wider_row", "taller_mos_rows", "other_height") + mech = {"n": len(neg), "by_primary": dict(collections.Counter(x["primary_mechanism"] for x in neg)), + "with_term": {t: sum(t in x["increase_terms"] for x in neg) for t in terms}, + "tracks_and_stub_separation": sum({"routing_tracks", "stub_separation"} <= set(x["increase_terms"]) for x in neg), + "assembly_only": sum(set(x["increase_terms"]) <= {"routing_tracks", "stub_separation", "other_height"} for x in neg), + "pairs": [{k: x[k] for k in ("case", "mode", "rel", "dW", "dH", "area_terms", "increase_terms", "primary_mechanism", + "channel_strategy_ref", "channel_strategy_mode", "row_span_saving")} for x in sorted(neg, key=lambda x: -x["rel"])]} + # examples: largest saving, largest loss, a passive-dominated pair (same scale figures are made from these) + ex = {} + pos = sorted([x for x in ok if x["class"] == "positive"], key=lambda x: x["rel"]) + if pos: ex["positive"] = pos[0] + if neg: ex["negative"] = sorted(neg, key=lambda x: -x["rel"])[0] + pdom = sorted([x for x in ok if x["passive_dominated"] and x["max_mos_row_span_saving"] > 0.5], key=lambda x: -x["max_mos_row_span_saving"]) + if pdom: ex["passive_dominated"] = pdom[0] + out = {"n_pairs_all": len(rows), "n_pairs_both_auto_passed": len(ok), "by_mode": by_mode, "by_topology": by_topo, "by_pdk": by_pdk, + "increase_mechanisms": mech, "examples": ex, "rows": rows, "dead_band": DEAD} + json.dump(out, open(a.out, "w"), indent=1) + print(json.dumps({k: out[k] for k in ("n_pairs_all", "n_pairs_both_auto_passed", "by_mode")}, indent=1)) + print(json.dumps({k: v for k, v in mech.items() if k != "pairs"})) + for k, v in ex.items(): print(k, v["case"], v["mode"], v["rel"], "dW", v["dW"], "dH", v["dH"], "pdom", v["passive_dominated"]) + + +if __name__ == "__main__": + main() diff --git a/benchmarks/textbook_sharing/textbook_sharing/analysis/cost_validation.py b/benchmarks/textbook_sharing/textbook_sharing/analysis/cost_validation.py new file mode 100644 index 00000000..cea363b1 --- /dev/null +++ b/benchmarks/textbook_sharing/textbook_sharing/analysis/cost_validation.py @@ -0,0 +1,96 @@ +"""Validate the cost rule (cost.py) on main-grid runs: for every case whose independent run produced geometry and every +other mode that produced geometry, predict the mode's area from its plans + the independent run's assembly only, and +compare with the measured bounding-box area. Reports sign accuracy of (A_mode - A_independent) with a dead band, and +every sign error with its type. usage: python -m textbook_sharing.analysis.cost_validation --sizes sW1_sL1,sW1_sL1.5 --out """ +from __future__ import annotations +import json, glob, argparse, collections +from pathlib import Path +from textbook_sharing import paths +DEAD = 0.005 # |relative change| below 0.5 % counts as "no change" + + +def sign(x): + return 0 if abs(x) < DEAD else (1 if x > 0 else -1) + + +def main(): + ap = argparse.ArgumentParser(); ap.add_argument("--sizes", default=None); ap.add_argument("--out", required=True); ap.add_argument("--channel-rule", default=None); a = ap.parse_args() + from textbook_sharing.run_case import load_case_dir, pdk_obj + from textbook_sharing.circuits import CIRCUITS + from textbook_sharing.layout import device_specs, sharing_groups + from glayout.sharing import SharingPlan, rules_for + from textbook_sharing.selection import cost + from textbook_sharing.layout import build + sizes = a.sizes.split(",") if a.sizes else None + rows = []; model_mismatch = [] + for ind in sorted(glob.glob(str(paths.GRID_RUNS / "*/*/*/independent/result.json"))): + base = json.load(open(ind)); parts = Path(ind).parts; cid, pdkn, size = parts[-5], parts[-4], parts[-3] + if sizes and size not in sizes: continue + if not base.get("assembly_stats") or "row_dims" not in base["assembly_stats"]: continue + case, cj = load_case_dir(base["case_dir"]); circ = CIRCUITS[cid]; pdk = pdk_obj(pdkn); R = rules_for(pdk) + groups = sharing_groups(device_specs(circ, case.sizing)) + base_plans = [SharingPlan.from_json(ap_["plan"]) for ap_ in base["applied_plans"]] + # the estimate procedure builds the baseline once (grid runs predate the channel_net_sources stat): rebuild it + # and confirm it is the same assembly + rb = build(pdk, circ, case.sizing, mode="independent", name=f"{cid}_{pdkn}_{size}_costbase".replace(".", "p")) + if abs(rb["assembly_stats"]["area_um2"] - base["assembly_stats"]["area_um2"]) > 1e-3: + raise SystemExit(f"rebuilt baseline differs for {cid} {pdkn} {size}") + bstats = rb["assembly_stats"] + Nmodel = cost.channel_nets(bstats, groups, base_plans, [f"grp{i}" for i in range(len(groups))]) + Nreal = [set() for _ in Nmodel] + for d in bstats["channel_net_sources"]["cells"].values(): + for ch, nets in d.items(): Nreal[int(ch)] |= set(nets) + for ch, nets in bstats["channel_net_sources"]["taps"].items(): Nreal[int(ch)] |= set(nets) + if Nmodel != Nreal: model_mismatch.append(f"{cid}_{pdkn}_{size}") + bd = [cost.group_dims(R, g, p) for g, p in zip(groups, base_plans)] + kinds = [r["kind"] for r in base["assembly_stats"]["row_dims"]] + grow = [kinds.index("n" if g[0].model_role == "nfet" else "p") for g in groups] + A0 = base["assembly_stats"]["area_um2"] + for m in ("diffusion_only", "gate_only", "combined"): + mp = Path(ind).parent.parent / m / "result.json" + if not mp.exists(): continue + r = json.load(open(mp)) + if not r.get("assembly_stats"): continue + plans = [SharingPlan.from_json(ap_["plan"]) for ap_ in r["applied_plans"]] + e = cost.estimate(R, groups, plans, bd, bstats, grow, base_plans=base_plans, channel_rule=a.channel_rule) + A1 = r["assembly_stats"]["area_um2"]; d_true = (A1 - A0) / A0; d_hat = (e["area_hat"] - A0) / A0 + row = {"case": f"{cid}_{pdkn}_{size}", "mode": m, "A0": A0, "A_true": A1, "A_hat": e["area_hat"], "d_true": round(d_true, 5), "d_hat": round(d_hat, 5), + "sign_true": sign(d_true), "sign_hat": sign(d_hat), "passive_dominated": e["passive_dominated"], + "row_shift_true": r["assembly_stats"].get("row_x_shift"), "channel_true": r["assembly_stats"].get("channel_heights"), + "channel_base": base["assembly_stats"].get("channel_heights"), "strategy": r["assembly_stats"].get("channel_strategy"), + "channel_dh_hat": e.get("channel_dh")} + if row["sign_true"] != row["sign_hat"]: + ch_change = [round(x - y, 3) for x, y in zip(row["channel_true"] or [], row["channel_base"] or [])] + pred = e.get("channel_dh") or [0.0] * len(ch_change) + sh0 = base["assembly_stats"].get("row_x_shift") or []; sh1 = r["assembly_stats"].get("row_x_shift") or [] + d_shift = max([abs((a1 - a0)) for a0, a1 in zip(sh0, sh1)] + [0.0]) + ch_err = any(abs(x - y) > 1e-6 for x, y in zip(ch_change, pred)) + row["row_shift_change_um"] = round(d_shift, 3) + if ch_err and d_shift > 0.3: row["error_type"] = "routing channel height mis-predicted + row x-shift changed" + elif ch_err: row["error_type"] = "routing channel height mis-predicted" + elif d_shift > 0.3: row["error_type"] = "row x-shift changed (cross-row via conflict, not modelled)" + elif row["strategy"] != base["assembly_stats"].get("channel_strategy"): row["error_type"] = "assembly channel strategy changed" + else: row["error_type"] = "group dimension estimate" + row["channel_change"] = ch_change + rows.append(row) + n = len(rows); ok = sum(r["sign_true"] == r["sign_hat"] for r in rows) + conf = collections.Counter((r["sign_true"], r["sign_hat"]) for r in rows) + errs = collections.Counter(r.get("error_type") for r in rows if r["sign_true"] != r["sign_hat"]) + abs_err = sorted(abs(r["d_hat"] - r["d_true"]) for r in rows) + import collections as _c + def acc(key): + d = _c.defaultdict(lambda: [0, 0]) + for r in rows: d[key(r)][0] += r["sign_true"] == r["sign_hat"]; d[key(r)][1] += 1 + return {k: {"correct": v[0], "n": v[1]} for k, v in sorted(d.items())} + by = {"pdk": acc(lambda r: r["case"].split("_")[1]), "topology": acc(lambda r: r["case"].split("_")[0]), "mode": acc(lambda r: r["mode"])} + summ = {"by": by, "n_pairs": n, "sign_correct": ok, "confusion(true,hat)": {f"{k[0]},{k[1]}": v for k, v in conf.items()}, "error_types": dict(errs), + "median_abs_error_rel": abs_err[n // 2] if n else None, "p90_abs_error_rel": abs_err[int(0.9 * n)] if n else None, "dead_band": DEAD, "pin_model_mismatch_cases": model_mismatch, + "rule": "textbook_sharing.selection.cost v2", "channel_rule": a.channel_rule or cost.CHANNEL_RULE} + json.dump({"summary": summ, "rows": rows}, open(a.out, "w"), indent=1) + print(json.dumps(summ, indent=1)) + for r in rows: + if r["sign_true"] != r["sign_hat"]: print(" ERR", r["case"], r["mode"], r["d_true"], r["d_hat"], r.get("error_type"), r.get("channel_change"), r.get("channel_dh_hat")) + + +if __name__ == "__main__": + main() diff --git a/benchmarks/textbook_sharing/textbook_sharing/analysis/example.py b/benchmarks/textbook_sharing/textbook_sharing/analysis/example.py new file mode 100644 index 00000000..dfbddbdb --- /dev/null +++ b/benchmarks/textbook_sharing/textbook_sharing/analysis/example.py @@ -0,0 +1,57 @@ +"""The running example of the documentation: the five-transistor OTA (C08) in SKY130 at the nominal size, taken from the +unshared layout to the best catalogue plan one decision at a time. All five layouts are candidates of the selection +catalogue of this case, so each was built and fully verified; this module only reads their records. +usage: python -m textbook_sharing.analysis.example --out /analysis/running_example.json""" +import argparse, json +from textbook_sharing import paths + +TASK = "C08_sky130_sW1_sL1" +STEPS = [("c1ebe43136e1", "unshared reference"), + ("cc0a97e9039c", "group 0 shares its net23 diffusion nodes"), + ("c051fabe4412", "group 1 also shares its VDD node (side case)"), + ("cd7b91d3467f", "group 1 shares VDD and drives both gates (net22) with one strap"), + ("c15f7f08c7b4", "that strap is turned toward the middle channel")] + + +def group_summary(plan, ev): + return {"devices": plan["devices"], + "shared_diffusion_nets": [n["net"] for n in ev["cross_device_shared_nodes"]], + "gate_straps": [{"fingers": len(g[0]), "side": g[1], "pad_end": g[2]} for g in plan["plan"]["gate_groups"]], + "shared_gate_conductors": [g["devices"] for g in ev["shared_gate_conductors"]], + "active_islands": ev["active_islands"]} + + +def main(): + ap = argparse.ArgumentParser(); ap.add_argument("--out", required=True); a = ap.parse_args() + d = paths.SELECTION_RUNS / TASK + cat = json.load(open(d / "catalogue.json"))["ledger"] + case = json.load(open(paths.CASES / "C08/sky130/sW1_sL1/specs.json")) + steps = [] + for cid, what in STEPS: + r = json.load(open(d / cid / "result.json")); st = r["assembly_stats"] + rv = json.load(open(d / cid / "verify/review/review_record.json")) + steps.append({"candidate": cid, "decision": what, "status": r["primary_status"], "visual_review": rv["visual"]["verdict"], + "area_um2": r["area_um2"], "width_um": st["width"], "height_um": st["height"], + "rows": [{"kind": x["kind"], "width_um": x["width"], "height_um": x["height"]} for x in st["row_dims"]], + "channel_heights_um": st["channel_heights"], + "groups": [group_summary(p, e) for p, e in zip(r["applied_plans"], r["evidence"])], + "gain_db": r["postsim"]["measures"].get("gain_lf"), "ugf_hz": r["postsim"]["measures"].get("ugf")}) + ref = steps[0]["area_um2"] + for s in steps: + s["change_vs_unshared"] = round(s["area_um2"] / ref - 1, 5) + comb = json.load(open(paths.GRID_RUNS / "C08/sky130/sW1_sL1/combined/result.json")) + out = {"task": TASK, "steps": steps, + "plan_space": {"plans_per_group": [g["unique"] for g in cat["per_group"]], "plans": cat["global_product_of_unique"], + "catalogue_size": cat["selected_for_evaluation"]}, + "named_mode_combined": {"area_um2": comb["area_um2"], "status": comb["primary_status"], + "unshared_groups": [i for i, p in enumerate(comb["applied_plans"]) if p["plan"]["mode_label"] == "independent"], + "change_vs_unshared": round(comb["area_um2"] / ref - 1, 5), + "above_best": round(comb["area_um2"] / steps[-1]["area_um2"] - 1, 5)}, + "specs": {"gain_db_min": case["gain_lf"]["min"], "ugf_hz_min": case["ugf"]["min"]}} + json.dump(out, open(a.out, "w"), indent=1) + for s in steps: + print(s["candidate"], s["area_um2"], s["width_um"], s["height_um"], f"{100 * s['change_vs_unshared']:+.1f} %", s["status"], s["visual_review"]) + + +if __name__ == "__main__": + main() diff --git a/benchmarks/textbook_sharing/textbook_sharing/analysis/geometry_check.py b/benchmarks/textbook_sharing/textbook_sharing/analysis/geometry_check.py new file mode 100644 index 00000000..414518b5 --- /dev/null +++ b/benchmarks/textbook_sharing/textbook_sharing/analysis/geometry_check.py @@ -0,0 +1,65 @@ +"""Rebuild the geometry of every recorded layout with this code (geometry only, no verification) and compare the +cell-name-independent geometry hash and the bounding box with the record. This needs only Python and KLayout, so it is +a quick check that the recorded runs and the code in this repository describe the same layouts. +usage: python -m textbook_sharing.analysis.geometry_check [--roots grid,selection,models] [--jobs 16] --out """ +import argparse, glob, json, tempfile, collections +from multiprocessing import Pool +from pathlib import Path +from textbook_sharing import paths + + +def records(roots): + out = [] + for root in roots: + for f in sorted(glob.glob(str(paths.RUNS / root / "**" / "result.json"), recursive=True)): + if "/verify/" in f: continue + r = json.load(open(f)) + if r.get("geometry_hash") and r.get("applied_plans"): + out.append(f) + return out + + +def check(job): + i, f = job + from textbook_sharing.layout import build + from textbook_sharing.run_case import load_case_dir + from textbook_sharing.circuits import CIRCUITS + from textbook_sharing.pdk import pdk_obj + from textbook_sharing.analysis.ledger import geometry_hash + r = json.load(open(f)); case, _ = load_case_dir(r["case_dir"]) + plans = {str(p["group"]): p["plan"] for p in r["applied_plans"]} + try: + b = build(pdk_obj(case.pdk), CIRCUITS[case.circuit_id], case.sizing, name=f"chk{i}", plans=plans) + with tempfile.TemporaryDirectory() as td: + g = Path(td) / "chk.gds"; b["component"].write_gds(str(g)); h = geometry_hash(str(g)) + st = b["assembly_stats"] + return {"record": paths.rel(Path(f).parent), "hash_match": h == r["geometry_hash"], + "bbox_match": (round(st["width"], 4), round(st["height"], 4)) == (round(r["assembly_stats"]["width"], 4), round(r["assembly_stats"]["height"], 4)), + "hash": h, "recorded_hash": r["geometry_hash"]} + except Exception as e: + return {"record": paths.rel(Path(f).parent), "error": repr(e)[:300]} + + +def main(): + ap = argparse.ArgumentParser(); ap.add_argument("--roots", default="grid,selection,models"); ap.add_argument("--jobs", type=int, default=16) + ap.add_argument("--out", required=True); a = ap.parse_args() + fs = records(a.roots.split(",")) + res = [] + with Pool(a.jobs, maxtasksperchild=200) as pool: + for x in pool.imap_unordered(check, enumerate(fs), chunksize=4): + res.append(x) + if len(res) % 200 == 0 or len(res) == len(fs): + print(f"{len(res)}/{len(fs)} rebuilt, {sum(1 for y in res if not y.get('hash_match'))} not matching", flush=True) + res.sort(key=lambda x: x["record"]) + by_root = collections.defaultdict(collections.Counter) + for x in res: + root = x["record"].split("/")[1] + by_root[root]["records"] += 1 + by_root[root]["error" if "error" in x else ("hash_match" if x["hash_match"] else ("bbox_match_only" if x["bbox_match"] else "differs"))] += 1 + out = {"summary": {k: dict(v) for k, v in by_root.items()}, "not_matching": [x for x in res if not x.get("hash_match")]} + json.dump(out, open(a.out, "w"), indent=1) + print(json.dumps(out["summary"], indent=1)) + + +if __name__ == "__main__": + main() diff --git a/benchmarks/textbook_sharing/textbook_sharing/analysis/interface.py b/benchmarks/textbook_sharing/textbook_sharing/analysis/interface.py new file mode 100644 index 00000000..fb62b62b --- /dev/null +++ b/benchmarks/textbook_sharing/textbook_sharing/analysis/interface.py @@ -0,0 +1,55 @@ +"""Interface comparison (same model, same settings, same tasks): sharing interface (main-experiment sessions) vs the +base-gLayout capability interface (fet_row). Also capability coverage: on each task, the best feasible candidate of the +selection catalogue among plans the base interface can express (no cross-device diffusion node, no shared gate +conductor) vs the overall best. +usage: python -m textbook_sharing.analysis.interface --out /analysis/llm_interface.json""" +import json, glob, argparse, statistics +from pathlib import Path +from textbook_sharing import paths +ARMS = {"sharing": "openai_gpt-6.1-sol", "base": "openai_gpt-6.1-sol_baseiface"} + + +def main(): + ap = argparse.ArgumentParser(); ap.add_argument("--out", required=True); a = ap.parse_args() + from textbook_sharing.analysis.models import session_rows, ref_area, best_evaluated + from textbook_sharing.selection.strategies import share_score + tasks = sorted({Path(d).name for d in glob.glob(str(paths.MODEL_RUNS / ARMS["base"] / "*"))}) + rows = {}; summ = {} + for arm, tag in ARMS.items(): + rs = [] + for t in tasks: + for sd in sorted(glob.glob(str(paths.MODEL_RUNS / tag / t / "r*"))): + sess, done, reps = session_rows(sd) + if not reps: continue + feas = [r["run"]["area_um2"] for r in reps if r["status"] == "evaluated" and r["run"]["primary_status"] == "auto_passed" and r["run"].get("area_um2")] + b = min(feas) if feas else None; ra = ref_area(t); be, _ = best_evaluated(t) + rs.append({"task": t, "rep": Path(sd).name, "proposals": len(reps), "first_legal": reps[0]["status"] == "evaluated", + "best": b, "vs_reference": (b / ra - 1) if b and ra else None, "vs_best_evaluated": (b / be - 1) if b and be else None}) + rows[arm] = rs + ok = [r for r in rs if r["vs_best_evaluated"] is not None] + summ[arm] = {"sessions": len(rs), "tasks": len({r["task"] for r in rs}), "first_legal_rate": statistics.mean(r["first_legal"] for r in rs) if rs else None, + "gap8": statistics.mean(r["vs_best_evaluated"] for r in ok) if ok else None, + "ref8": statistics.mean(r["vs_reference"] for r in ok if r["vs_reference"] is not None) if ok else None} + cov = {} + for t in tasks: + td = paths.SELECTION_RUNS / t + if not (td / "catalogue.json").exists(): continue + cat = json.load(open(td / "catalogue.json")); allf = []; basef = [] + for c in cat["entries"]: + rp = td / c / "result.json" + if not rp.exists(): continue + r = json.load(open(rp)) + if r.get("primary_status") == "auto_passed" and r.get("area_um2"): + allf.append(r["area_um2"]) + if share_score(cat, c) == 0: basef.append(r["area_um2"]) + cov[t] = {"best_all": min(allf) if allf else None, "best_base_expressible": min(basef) if basef else None, + "base_gap": (min(basef) / min(allf) - 1) if allf and basef else None} + gaps = [v["base_gap"] for v in cov.values() if v["base_gap"] is not None] + summ["capability"] = {"tasks": len(cov), "mean_gap_of_best_base_expressible_candidate": statistics.mean(gaps) if gaps else None, + "note": "base-expressible = catalogue candidates with no cross-device diffusion join and no shared gate conductor"} + json.dump({"summary": summ, "rows": rows, "coverage": cov, "tasks": tasks}, open(a.out, "w"), indent=1) + print(json.dumps(summ, indent=1)) + + +if __name__ == "__main__": + main() diff --git a/benchmarks/textbook_sharing/textbook_sharing/analysis/ledger.py b/benchmarks/textbook_sharing/textbook_sharing/analysis/ledger.py new file mode 100644 index 00000000..6df097bc --- /dev/null +++ b/benchmarks/textbook_sharing/textbook_sharing/analysis/ledger.py @@ -0,0 +1,115 @@ +"""Count ledger (machine-readable + reader table). Every class is mutually exclusive; totals are asserted. +Case level (648 requested = 18 topologies x 3 PDKs x 12 size points): + requested = parameter_illegal + duplicate + distinct_legal + distinct_legal = schematic_not_qualified + qualified + qualified = reference_first_failure[stage] (independent-mode run of the main grid; or not_run) + reference_auto_passed + formal entry = reference_auto_passed (diagnostic set = everything else that was requested, with its reason) +Mode level (main grid, qualified cases x 4 modes): NA (mode not applicable) / not_run / first failing stage / auto_passed, + plus geometry-identical-to-another-mode counts (same GDS content apart from the cell name). +Candidate level (selection): per task raw tuples / static illegal / equivalent duplicates / unique per group, + global product, selected, evaluated, first failing stage / auto_passed. +Visual review is a separate dimension: pending / pass / suspicious / fail, and its intersection with auto_passed. +usage: python -m textbook_sharing.analysis.ledger -> /count_ledger.json + count_ledger.md""" +from __future__ import annotations +import json, glob, collections, hashlib +from pathlib import Path +from textbook_sharing import paths +STAGES = ["rejected_plan", "build_failed", "drc_failed", "lvs_failed", "constraints_failed", "pex_failed", "simulation_failed", "spec_failed", "physical_review_failed"] + + +def review_verdict(res): + rp = paths.resolve(res["gds"]).parent / "verify" / "review" / "review_record.json" if res.get("gds") else None + if rp is None: return "no_record" + if rp.exists(): + rec = json.load(open(rp)); v = (rec.get("visual") or {}).get("verdict", "review_pending") + if v in ("suspicious", "fail"): # the reviewer's verdict is kept; the objective resolution is shown next to it + v += "(" + (rec.get("visual_resolution") or {}).get("outcome", "unresolved") + ")" + return v + return "no_record" + + +def geometry_hash(gds): + """GDS content hash with the cell name removed (modes that produced identical geometry share it).""" + try: + import klayout.db as kdb + ly = kdb.Layout(); ly.read(gds); top = ly.top_cell(); h = hashlib.sha256() + for li in sorted(ly.layer_indexes(), key=lambda i: (ly.get_info(i).layer, ly.get_info(i).datatype)): + info = ly.get_info(li); reg = kdb.Region(top.begin_shapes_rec(li)); reg.merge() + h.update(f"{info.layer}/{info.datatype}:".encode()) + for poly in sorted(str(p) for p in reg.each()): h.update(poly.encode()) + return h.hexdigest()[:16] + except Exception as e: + return None + + +def main(): + by_id = {r["case_id"]: r for r in json.load(open(paths.RESULTS / "case_build.json"))} # one record per request + req = list(by_id.values()) + L = {"requested": len(req)} + st = collections.Counter(r["stage"] for r in req) + L["parameter_illegal"] = st["parameter_illegal"]; L["duplicate"] = st["duplicate"] + L["distinct_legal"] = st["schematic_not_qualified"] + st["qualified"] + L["schematic_not_qualified"] = st["schematic_not_qualified"]; L["qualified"] = st["qualified"] + assert L["requested"] == L["parameter_illegal"] + L["duplicate"] + L["distinct_legal"] + ref = collections.Counter(); formal = []; diag = []; mode_rows = collections.Counter(); mode_by = collections.defaultdict(collections.Counter) + identical = collections.Counter(); review = collections.Counter(); review_auto = collections.Counter() + for r in req: + if r["stage"] != "qualified": + diag.append({"case_id": r["case_id"], "reason": r["stage"], "detail": (r.get("derivation") or {}).get("reason") or "; ".join((r.get("qualification") or {}).get("reasons", [])[:3]) or r.get("duplicate_of")}); continue + base = paths.GRID_RUNS / r["circuit_id"] / r["pdk"] / r["size"] + rr = base / "independent" / "result.json" + s = json.load(open(rr)).get("primary_status") if rr.exists() else "not_run" + ref[s] += 1 + if s == "auto_passed": formal.append(r["case_id"]) + else: diag.append({"case_id": r["case_id"], "reason": "reference_" + s}) + hashes = {} + for m in ("independent", "diffusion_only", "gate_only", "combined"): + mp = base / m / "result.json" + ms = json.load(open(mp)) if mp.exists() else {"primary_status": "not_run"} + mode_rows[ms["primary_status"]] += 1; mode_by[m][ms["primary_status"]] += 1 + if ms.get("gds"): + v = review_verdict(ms); review[v] += 1 + if ms["primary_status"] == "auto_passed": review_auto[v] += 1 + gp = paths.resolve(ms["gds"]) + gh = ms.get("geometry_hash") or (geometry_hash(str(gp)) if gp.exists() else None); hashes[m] = gh + if hashes: + seen = {} + for m, gh in hashes.items(): + if gh and gh in seen: identical[f"{m}=={seen[gh]}"] += 1 + else: seen[gh] = m + L["reference"] = dict(ref); L["formal_entries"] = len(formal); L["diagnostic"] = len(diag) + assert L["qualified"] == sum(ref.values()) + assert L["requested"] == L["formal_entries"] + L["diagnostic"] + L["mode_rows"] = {"total": sum(mode_rows.values()), "by_status": dict(mode_rows), "by_mode": {m: dict(c) for m, c in mode_by.items()}, + "geometry_identical_pairs": dict(identical)} + L["visual_review_main_grid"] = {"all_kept_gds": dict(review), "auto_passed_gds": dict(review_auto)} + # candidates + cand = {"tasks": 0, "per_task": {}} + agg = collections.Counter() + for td in sorted(glob.glob(str(paths.SELECTION_RUNS / "*/catalogue.json"))): + cat = json.load(open(td)); tdir = Path(td).parent; cand["tasks"] += 1 + ev = collections.Counter(); rv = collections.Counter() + for cid in cat["entries"]: + rp = tdir / cid / "result.json" + if rp.exists(): + rs = json.load(open(rp)); ev[rs.get("primary_status")] += 1 + if rs.get("gds"): rv[review_verdict(rs)] += 1 + else: ev["not_run"] += 1 + cand["per_task"][cat["task_id"]] = {"ledger": cat["ledger"], "evaluated": dict(ev), "review": dict(rv)} + agg["selected"] += cat["ledger"]["selected_for_evaluation"] + for k, v in ev.items(): agg[f"eval:{k}"] += v + for k, v in rv.items(): agg[f"review:{k}"] += v + cand["totals"] = dict(agg) + out = paths.RESULTS; out.mkdir(parents=True, exist_ok=True) + json.dump({"cases": L, "formal_entries": formal, "diagnostic": diag, "candidates": cand}, open(out / "count_ledger.json", "w"), indent=1) + md = ["# Count ledger", "", "| level | count |", "|---|---|"] + for k in ("requested", "parameter_illegal", "duplicate", "distinct_legal", "schematic_not_qualified", "qualified", "formal_entries", "diagnostic"): + md.append(f"| {k} | {L[k]} |") + md += ["", "reference (independent mode) first status: " + json.dumps(dict(ref)), "", "mode rows: " + json.dumps(L["mode_rows"]["by_status"]), + "", "selection candidates: " + json.dumps(cand["totals"])] + (out / "count_ledger.md").write_text("\n".join(md) + "\n") + print("\n".join(md)) + + +if __name__ == "__main__": + main() diff --git a/benchmarks/textbook_sharing/textbook_sharing/analysis/models.py b/benchmarks/textbook_sharing/textbook_sharing/analysis/models.py new file mode 100644 index 00000000..9e1e7491 --- /dev/null +++ b/benchmarks/textbook_sharing/textbook_sharing/analysis/models.py @@ -0,0 +1,96 @@ +"""Aggregate model sessions (/models///r/). +Per session: proposals made (each counts, incl. rejected and repeated), first proposal legal (passed parse + legality), +EDA verifications actually run (non-duplicate evaluated proposals), statuses, best feasible (auto_passed) area after +k = 1, 2, 4, 8 proposals, its ratio to the task's reference (independent) area and to the best feasible candidate of the +selection catalogue of the same task when that task was evaluated ("best of the evaluated set"), wall time. +Aggregates per model tag: session-level rates, topology-balanced means, and per-task paired comparisons. +usage: python -m textbook_sharing.analysis.models --out /analysis/llm_summary.json [--tags a,b]""" +import json, glob, argparse, statistics, collections +from pathlib import Path +from textbook_sharing import paths +KS = (1, 2, 4, 8) + + +def session_rows(sd): + sd = Path(sd); reps = [] + for f in sorted(sd.glob("p*_report.json"), key=lambda p: int(p.name[1:].split("_")[0])): + reps.append(json.load(open(f))) + sess = json.load(open(sd / "session.json")) if (sd / "session.json").exists() else {} + done = json.load(open(sd / "session_done.json")) if (sd / "session_done.json").exists() else {} + return sess, done, reps + + +def ref_area(task_id): + cid, pdk, size = task_id.split("_", 2) + f = paths.GRID_RUNS / cid / pdk / size / "independent/result.json" + r = json.load(open(f)) if f.exists() else {} + return r.get("area_um2") if r.get("primary_status") == "auto_passed" else None + + +def best_evaluated(task_id): + td = paths.SELECTION_RUNS / task_id + if not (td / "catalogue.json").exists(): return None, None + cat = json.load(open(td / "catalogue.json")); vals = []; done = 0 + for c in cat["entries"]: + rp = td / c / "result.json" + if rp.exists(): + done += 1; r = json.load(open(rp)) + if r.get("primary_status") == "auto_passed" and r.get("area_um2"): vals.append(r["area_um2"]) + return (min(vals) if vals else None), done == len(cat["entries"]) + + +def main(): + ap = argparse.ArgumentParser(); ap.add_argument("--out", required=True); ap.add_argument("--tags", default=None); a = ap.parse_args() + tags = a.tags.split(",") if a.tags else sorted(p.name for p in (paths.MODEL_RUNS).iterdir() if p.is_dir()) + sessions = [] + for tag in tags: + for sd in sorted(glob.glob(str(paths.MODEL_RUNS / tag / "*" / "r*"))): + sess, done, reps = session_rows(sd) + if not reps: continue + task = Path(sd).parent.name; ra = ref_area(task); be, be_complete = best_evaluated(task) + first_legal = reps[0]["status"] == "evaluated" + evaluated = [r for r in reps if r["status"] == "evaluated"] + fresh = [r for r in evaluated if not r.get("duplicate_of")] + st = collections.Counter((r["run"]["primary_status"] if r["status"] == "evaluated" else "rejected_program") for r in reps) + best = {} + for k in KS: + feas = [r["run"]["area_um2"] for r in reps[:k] if r["status"] == "evaluated" and r["run"]["primary_status"] == "auto_passed" and r["run"].get("area_um2")] + b = min(feas) if feas else None + best[str(k)] = {"best_area": b, "vs_reference": (b / ra - 1) if (b and ra) else None, "vs_best_evaluated": (b / be - 1) if (b and be) else None} + sessions.append({"tag": tag, "task": task, "topology": task.split("_")[0], "rep": Path(sd).name, "n_proposals": len(reps), "first_legal": first_legal, + "n_rejected": sum(1 for r in reps if r["status"] != "evaluated"), "n_duplicates": sum(1 for r in evaluated if r.get("duplicate_of")), + "eda_verifications": len(fresh), "statuses": dict(st), + "drc_lvs_clean": sum(1 for r in evaluated if (r["run"].get("verify") or {}).get("drc") == "passed" and (r["run"].get("verify") or {}).get("lvs") == "passed"), + "auto_passed": sum(1 for r in evaluated if r["run"]["primary_status"] == "auto_passed"), + "best": best, "reference_area": ra, "best_evaluated_area": be, "best_evaluated_complete": be_complete, + "evaluator_s": round(sum(r.get("evaluator_s", 0) for r in reps), 1), + "model_s": round(sum(c.get("seconds", 0) for c in (done.get("calls") or [])), 1) if done else None, + "usage": [c.get("usage") for c in (done.get("calls") or [])] if done else None, + "isolation_breach": done.get("isolation_breach_any") if done else None, "interface": sess.get("interface", "sharing")}) + summ = {} + for tag in tags: + ss = [s for s in sessions if s["tag"] == tag] + if not ss: continue + evald = sum(s["n_proposals"] - s["n_rejected"] for s in ss) + d = {"sessions": len(ss), "tasks": len({s["task"] for s in ss}), "proposals": sum(s["n_proposals"] for s in ss), + "eda_verifications": sum(s["eda_verifications"] for s in ss), "first_legal_rate": statistics.mean(s["first_legal"] for s in ss), + "rejected_rate": sum(s["n_rejected"] for s in ss) / max(1, sum(s["n_proposals"] for s in ss)), + "drc_lvs_clean_rate_of_evaluated": sum(s["drc_lvs_clean"] for s in ss) / max(1, evald), + "auto_passed_rate_of_evaluated": sum(s["auto_passed"] for s in ss) / max(1, evald), "by_k": {}} + for k in KS: + found = [s["best"][str(k)]["best_area"] is not None for s in ss] + vr = {}; vb = {} + for s in ss: + x = s["best"][str(k)] + if x["vs_reference"] is not None: vr.setdefault(s["topology"], []).append(x["vs_reference"]) + if x["vs_best_evaluated"] is not None: vb.setdefault(s["topology"], []).append(x["vs_best_evaluated"]) + bal = lambda dd: statistics.mean(statistics.mean(v) for v in dd.values()) if dd else None + d["by_k"][str(k)] = {"found_rate": statistics.mean(found), "vs_reference_balanced": bal(vr), "vs_best_evaluated_balanced": bal(vb), + "n_vs_best_evaluated": sum(len(v) for v in vb.values())} + summ[tag] = d + json.dump({"summary": summ, "sessions": sessions}, open(a.out, "w"), indent=1) + print(json.dumps(summ, indent=1)) + + +if __name__ == "__main__": + main() diff --git a/benchmarks/textbook_sharing/textbook_sharing/analysis/pex_sensitivity.py b/benchmarks/textbook_sharing/textbook_sharing/analysis/pex_sensitivity.py new file mode 100644 index 00000000..3342c0cc --- /dev/null +++ b/benchmarks/textbook_sharing/textbook_sharing/analysis/pex_sensitivity.py @@ -0,0 +1,32 @@ +"""Extraction sensitivity (separate from the formal results): re-extract a kept layout with capacitance only, run the +SAME testbench deck against that netlist, and compare the measures with the formal R+C result. +usage: python -m textbook_sharing.analysis.pex_sensitivity [ ...] --out """ +import re, json, argparse +from pathlib import Path + + +def main(): + ap = argparse.ArgumentParser(); ap.add_argument("runs", nargs="+"); ap.add_argument("--out", required=True); a = ap.parse_args() + from textbook_sharing.verify import pex_sim + from textbook_sharing.verify.lvs import run + rows = [] + for rd in a.runs: + rd = Path(rd).resolve(); r = json.load(open(rd / "result.json")); pdk = r["case_dir"].split("/")[-2] + rc_net = next((rd / "verify/pex").glob("*_pex.spice")); top = re.search(r"^\.subckt\s+(\S+)", rc_net.read_text(), re.M | re.I).group(1) + od = rd / "sensitivity_c_only"; od.mkdir(exist_ok=True) + saved = dict(pex_sim.PEX_POLICY[pdk]); pex_sim.PEX_POLICY[pdk] = {"with_resist": False, "extresist_tolerance": None, "note": "sensitivity: C only"} + try: px = pex_sim.pex(pdk, r["gds"], top, od) + finally: pex_sim.PEX_POLICY[pdk] = saved + deck = next((rd / "postsim").glob("tb_*.spice")).read_text() + deck = deck.replace(str(rc_net), px["spice"]); assert px["spice"] in deck + (od / "tb_c_only.spice").write_text(deck) + run(f"ngspice -b {od}/tb_c_only.spice -o {od}/tb_c_only.out", str(od), od / "tb_c_only.log", timeout=900) + m = pex_sim.read_measures((od / "tb_c_only.out").read_text(errors="replace")) + row = {"run": paths.rel(rd), "status": r["primary_status"], "rc_measures": r["postsim"].get("measures"), "c_only_measures": m, + "c_only_counts": {k: px.get(k) for k in ("n_res", "n_cap", "n_devices")}, "spec": {k: v["spec"] for k, v in (r["postsim"].get("spec") or {}).items()}} + rows.append(row); print(json.dumps({k: row[k] for k in ("run", "status")}), {k: (row["rc_measures"] or {}).get(k) for k in row["spec"]}, {k: m.get(k) for k in row["spec"]}) + json.dump(rows, open(a.out, "w"), indent=1) + + +if __name__ == "__main__": + main() diff --git a/benchmarks/textbook_sharing/textbook_sharing/analysis/pvt.py b/benchmarks/textbook_sharing/textbook_sharing/analysis/pvt.py new file mode 100644 index 00000000..10beaac6 --- /dev/null +++ b/benchmarks/textbook_sharing/textbook_sharing/analysis/pvt.py @@ -0,0 +1,84 @@ +"""PVT robustness of declared configurations (post-layout, extracted netlists unchanged; interconnect R/C at nominal). +Conditions (device corner, temperature, supply): TT 27 C VDD | SS 27 C VDD | FF 27 C VDD | SS 85 C 0.9 VDD | FF -40 C 1.1 VDD. +Layouts per (topology, PDK) at the nominal size sW1_sL1 of the selection topologies: the formal reference (independent), +the named combined mode (main grid), and the best feasible candidate of the selection catalogue ("best of the evaluated +set"). Every layout is checked against the case's frozen NOMINAL specifications under every condition (no re-freezing); +this measures how often sharing adds or removes failures relative to the reference, not corner sign-off. +No Monte Carlo is run (no mismatch statistics are claimed). +usage: python -m textbook_sharing.analysis.pvt --jobs 16 --out /analysis/pvt.json""" +from __future__ import annotations +import json, glob, copy, re, argparse, collections +from pathlib import Path +from multiprocessing import Pool +from textbook_sharing import paths +CONDITIONS = [("TT_27C_VDD", "tt", 27, 1.0), ("SS_27C_VDD", "ss", 27, 1.0), ("FF_27C_VDD", "ff", 27, 1.0), + ("SS_85C_0.9VDD", "ss", 85, 0.9), ("FF_m40C_1.1VDD", "ff", -40, 1.1)] +SIZE = "sW1_sL1" + + +def targets(): + from textbook_sharing.grid import SELECTION_TOPOLOGIES + out = [] + for cid in SELECTION_TOPOLOGIES: + for pdk in ("sky130", "gf180", "ihp130"): + g = paths.GRID_RUNS / cid / pdk / SIZE + ind = g / "independent/result.json" + if not ind.exists() or json.load(open(ind)).get("primary_status") != "auto_passed": continue + out.append((f"{cid}_{pdk}", "reference", str(ind))) + comb = g / "combined/result.json" + if comb.exists() and json.load(open(comb)).get("primary_status") == "auto_passed": out.append((f"{cid}_{pdk}", "combined", str(comb))) + td = paths.SELECTION_RUNS / f"{cid}_{pdk}_{SIZE}" + feas = [] + for rp in glob.glob(str(td / "*/result.json")): + r = json.load(open(rp)) + if r.get("primary_status") == "auto_passed" and r.get("area_um2"): feas.append((r["area_um2"], rp)) + if feas: out.append((f"{cid}_{pdk}", "best_evaluated", sorted(feas)[0][1])) + return out + + +def job(args): + key, role, rp, cond = args + from textbook_sharing.run_case import load_case_dir + from textbook_sharing.circuits import CIRCUITS + from textbook_sharing.testbench import make_testbench + from textbook_sharing.testbench import check_specs, derived + from textbook_sharing.verify.pex_sim import simulate, read_measures + name, corner, temp, vs = cond + r = json.load(open(rp)); od = Path(rp).parent + pexsp = next((od / "verify" / "pex").glob("*_pex.spice")) + top = re.search(r"^\.subckt\s+(\S+)", pexsp.read_text(), re.M | re.I).group(1) + case, cj = load_case_dir(r["case_dir"]); case = copy.deepcopy(case) + case.supply = {k: (v * vs if k == "VDD" else v) for k, v in case.supply.items()} + tb = make_testbench(CIRCUITS[case.circuit_id], top, str(pexsp), case, case.pdk) + tb = f".temp {temp}\n" + tb + out = paths.PVT_RUNS / key / role / name + s = simulate(case.pdk, tb, out, name="tb", corner=corner) + meas = derived(read_measures(Path(s["out"]).read_text(errors="replace"))) if Path(s["out"]).exists() else {} + sp = check_specs(meas, case.specs) + st = s["status"] if s["status"] != "passed" else sp["status"] + return {"key": key, "role": role, "condition": name, "status": st, "measures": meas, "spec": sp.get("details"), "result": rp, "geometry_hash": r.get("geometry_hash"), + "area_um2": r.get("area_um2")} + + +def main(): + ap = argparse.ArgumentParser(); ap.add_argument("--jobs", type=int, default=16); ap.add_argument("--out", required=True); a = ap.parse_args() + T = targets(); jobs = [(k, role, rp, c) for k, role, rp in T for c in CONDITIONS] + print("layouts", len(T), "simulations", len(jobs), flush=True) + with Pool(a.jobs) as pool: rows = pool.map(job, jobs, chunksize=1) + by = collections.defaultdict(dict) + for x in rows: by[(x["key"], x["condition"])][x["role"]] = x["status"] == "passed" + comp = {} + for role in ("combined", "best_evaluated"): + c = collections.Counter() + for (k, cond), d in by.items(): + if role not in d or "reference" not in d: continue + ref, sh = d["reference"], d[role] + c["co_pass" if ref and sh else "co_fail" if (not ref and not sh) else "sharing_added_failure" if ref else "sharing_removed_failure"] += 1 + comp[role] = dict(c) + json.dump({"conditions": CONDITIONS, "targets": T, "rows": rows, "comparison_vs_reference": comp, + "note": "interconnect R/C extracted at nominal; device corners only; frozen nominal specs; no Monte Carlo"}, open(a.out, "w"), indent=1, default=str) + print(json.dumps(comp, indent=1)) + + +if __name__ == "__main__": + main() diff --git a/benchmarks/textbook_sharing/textbook_sharing/analysis/report.py b/benchmarks/textbook_sharing/textbook_sharing/analysis/report.py new file mode 100644 index 00000000..a2b33026 --- /dev/null +++ b/benchmarks/textbook_sharing/textbook_sharing/analysis/report.py @@ -0,0 +1,243 @@ +"""Write docs/RESULTS.md and docs/PARAMETER_SPACE.md from the result tables, so that every number in these two documents +is read from a file in / (each section names its source file). +usage: python -m textbook_sharing.analysis.report""" +import json, glob +from pathlib import Path +from textbook_sharing import paths + +DOCS = paths.ROOT / "docs" +NAMES = {"C01": "basic current mirror", "C02": "cascode current mirror", "C03": "Wilson current mirror", "C04": "CS amplifier, current-source load", + "C05": "source follower", "C06": "cascode amplifier, cascode load", "C07": "diff. pair, current-source loads", "C08": "five-transistor OTA", + "C09": "telescopic OTA", "C10": "folded-cascode OTA (fully differential)", "C11": "two-stage Miller op amp", "C12": "CMOS inverter amplifier", + "C13": "wide-swing cascode mirror", "C14": "regulated cascode mirror", "C15": "CS amplifier, resistor load", "C16": "diff. pair, resistor loads", + "C17": "degenerated diff. pair", "C18": "class-AB output stage"} +ORDER = ["C01", "C02", "C03", "C13", "C14", "C04", "C06", "C12", "C15", "C05", "C07", "C16", "C17", "C08", "C09", "C10", "C11", "C18"] +MODEL_LABEL = {"openai_gpt-6.1-sol": "OpenAI (Codex CLI)", "anthropic_claude-sonnet": "Anthropic (agent session)"} + + +def J(name): + return json.load(open(paths.RESULTS / name)) + + +def pct(x, nd=1): + return f"{100 * x:.{nd}f}" + + +def r2(x): + """Two decimals, rounding half up on the decimal value.""" + from decimal import Decimal, ROUND_HALF_UP + return str(Decimal(repr(round(x, 6))).quantize(Decimal("0.01"), rounding=ROUND_HALF_UP)) + + +def signed(x, nd=1): + return ("+" if x > 0 else "") + pct(x, nd) + + +def parameter_space(): + bt = J("analysis/benchmark_table.json"); rows = {r["topology"]: r for r in bt["rows"]}; t = bt["totals"] + L = J("count_ledger.json")["cases"] + out = ["# Parameter space and counts", "", + "Generated by `python -m textbook_sharing.analysis.report` from `results/analysis/benchmark_table.json`, " + "`results/count_ledger.json` and `results/analysis/scope_audit.json`; do not edit by hand.", "", + "## Three nested levels", "", + "1. **Process**: SKY130 (1.8 V devices), GF180MCU (3.3 V), IHP SG13G2 (1.2 V low-voltage devices).", + "2. **Size**: every transistor width is scaled by sW in {0.5, 1, 1.5, 2} and every length by sL in {1, 1.5, 2}, i.e. " + "12 size points per topology and process. Widths are scaled through the finger count when that stays an integer " + "for every device, otherwise through the unit finger width, so every width ratio inside a circuit is kept; a request " + "whose unit finger width falls below the PDK minimum or off the 5 nm grid is parameter-illegal " + "(`textbook_sharing/grid.py`). Resistor and capacitor values, supply, bias and load are not scaled.", + "3. **Plan**: for each sharing group, six discrete axes (arrangement 4 values, orientation policy 4, diffusion 2, gate 2, " + "first strap side 2, pad end 2) give 256 tuples; illegal tuples and tuples that build the same geometry as another " + "are removed (`src/glayout/sharing/enumeration.py`). The plans of a circuit are the product over its groups. Plans " + "written directly as a `SharingPlan` can express more than these axes.", "", + f"Requests: {len(rows)} topologies x 3 PDKs x 12 sizes = **{t['requests']}**.", "", + "## Per topology", "", + "Columns: devices; distinct legal plans per sharing group and per circuit at the nominal size in SKY130 (static " + "enumeration, no layout built); outcome of the 36 size/PDK requests; sharing kinds that apply to at least one formal " + "entry (D diffusion, G gate; 'none' = every group holds a single transistor).", "", + "| ID | topology | MOS / R / C | plans per group | plans per circuit | formal SKY130 / GF180 / IHP | not qualified | illegal | reference misses spec | sharing |", + "|---|---|---|---|---:|---|---:|---:|---:|---|"] + for cid in ORDER: + r = rows[cid]; o = r["outcomes"]; m = r["modes_applicable_in_formal"]; f = r["formal_by_pdk"] + if not o.get("formal"): + share = "(no formal entry)" + else: + share = " ".join(x for x, k in (("D", "diffusion_only"), ("G", "gate_only")) if m.get(k)) or "none" + out.append(f"| {cid} | {NAMES[cid]} | {r['mos']} / {r['res']} / {r['cap']} | {' x '.join(str(g['unique_plans']) for g in r['groups_nominal_sky130'])} | " + f"{r['plan_space_nominal_sky130']:,} | {f['sky130']} / {f['gf180']} / {f['ihp130']} | {o.get('schematic_not_qualified', 0)} | " + f"{o.get('parameter_illegal', 0)} | {o.get('reference_spec_failed', 0)} | {share} |") + noshare = [c for c in ORDER if not rows[c]["modes_applicable_in_formal"] and rows[c]["outcomes"].get("formal")] + out += ["", "## Count ledger (mutually exclusive classes)", "", + "| class | count |", "|---|---:|", + f"| requests | {L['requested']} |", f"| parameter-illegal | {L['parameter_illegal']} |", + f"| schematic not qualified (diagnostic) | {L['schematic_not_qualified']} |", f"| qualified | {L['qualified']} |", + f"| unshared reference misses a frozen specification (diagnostic) | {L['qualified'] - L['formal_entries']} |", + f"| **formal entries** | **{L['formal_entries']}** |", "", + f"* {t['topologies_with_formal_entries']} of {len(rows)} topologies have formal entries. Every point of the class-AB " + "stage (C18) misses its schematic floors, also after a bounded redesign search (`results/redesign_search/`).", + f"* {t['topologies_with_formal_entries'] - len(noshare)} topologies admit sharing across devices. In " + f"{', '.join(noshare)} no two transistors of the same polarity, length and unit width share a source/drain or gate " + "net, so every group holds one transistor and only the unshared layout exists.", + f"* Main grid: every qualified request in the four named modes = {L['mode_rows']['total']} runs: " + + ", ".join(f"{k} {v}" for k, v in L["mode_rows"]["by_status"].items()) + ". NA = the mode shares nothing in any " + "group of that circuit (no run is made); the failures are the unshared references of the table above.", ""] + S = J("analysis/scope_audit.json")["task_sets"] + others = sorted(k for k in S["dropped"] if not k.startswith("C18")) + out += ["## Task sets of the plan-selection and model studies", "", + f"* Selection: {S['designed_selection']} points designed (C02, C08, C09, C11, C16, C18 x 3 PDKs x sW in {{1, 2}} x " + f"sL in {{1, 2}}). The class-AB points and {len(others)} others are not qualified ({', '.join(others)}), leaving " + f"**{S['selection']} tasks** in {len(S['selection_topologies'])} topologies. Per task the catalogue holds at most 64 " + "plans: the four named modes plus a seeded stratified sample, or every plan when the circuit has at most 64 " + "(C02: 64, C16: 49).", + f"* Model sessions: the **{S['model_tasks']}** selection tasks at sW = 2 (sL 1 and 2), 3 sessions per task and model.", + f"* Interface comparison: the **{S['interface_tasks']}** model tasks at sW2_sL1, OpenAI model only, 3 sessions per task.", ""] + return "\n".join(out) + "\n" + + +def results(): + o = ["# Results", "", "Generated by `python -m textbook_sharing.analysis.report` from the tables in `results/`; do not edit by " + "hand. The tables themselves are recomputed from the run records with `python -m textbook_sharing.analysis.all`.", ""] + ex = J("analysis/running_example.json"); g0, g1 = (", ".join(g["devices"]) for g in ex["steps"][0]["groups"]) + ps = ex["plan_space"]; nm = ex["named_mode_combined"] + o += ["## Running example", "", f"Source: `results/analysis/running_example.json`. Five-transistor OTA (C08), SKY130, nominal size; " + f"group 0 = {g0} (NMOS), group 1 = {g1} (PMOS). The circuit has {' x '.join(map(str, ps['plans_per_group']))} = {ps['plans']} " + f"distinct plans; its selection catalogue holds {ps['catalogue_size']}. Specifications: gain >= {ex['specs']['gain_db_min']} dB, " + f"unity-gain frequency >= {ex['specs']['ugf_hz_min'] / 1e6:.2f} MHz.", "", + "| candidate | decision | shared diffusion nets (group 0; group 1) | gate straps (group 0; group 1) | W x H (um) | area (um^2) | change | gain (dB) | UGF (MHz) | checks, review |", + "|---|---|---|---|---|---:|---:|---:|---:|---|"] + for st in ex["steps"]: + nets = "; ".join(", ".join(g["shared_diffusion_nets"]) or "-" for g in st["groups"]) + straps = "; ".join(f"{len(g['gate_straps'])} " + "/".join(sorted({x["side"] for x in g["gate_straps"]})) for g in st["groups"]) + o.append(f"| `{st['candidate']}` | {st['decision']} | {nets} | {straps} | {r2(st['width_um'])} x {r2(st['height_um'])} | {st['area_um2']:.1f} | " + f"{signed(st['change_vs_unshared'])} % | {st['gain_db']:.2f} | {st['ugf_hz'] / 1e6:.1f} | {st['status']}, {st['visual_review']} |") + left = ", ".join(f"group {i}" for i in nm["unshared_groups"]) or "no group" + o += ["", f"For comparison, the named mode 'combined' (in each group the first plan in axis order that shares both diffusion and " + f"gates; a group that cannot share both stays unshared, here {left}): {nm['area_um2']:.1f} um^2 ({signed(nm['change_vs_unshared'])} %), " + f"{pct(nm['above_best'])} % above the last step. The last step removes the top routing channel: channel heights " + f"{ex['steps'][-2]['channel_heights_um']} -> {ex['steps'][-1]['channel_heights_um']} um.", ""] + cd = J("analysis/cost_decomposition.json") + o += ["## What sharing gains and costs (main grid)", "", f"Source: `results/analysis/cost_decomposition.json`. {cd['n_pairs_both_auto_passed']} pairs " + "(one case, one sharing mode against the unshared layout of the same case) in which both layouts pass every check. " + "Smaller / larger: area change beyond +-0.5 %.", "", + "| mode | pairs | smaller | larger | mean change | min | max | a passive row sets the width |", "|---|---:|---:|---:|---:|---:|---:|---:|"] + for m in ("diffusion_only", "gate_only", "combined"): + s = cd["by_mode"][m] + o.append(f"| {m} | {s['n']} | {s['classes'].get('positive', 0)} | {s['classes'].get('negative', 0)} | {signed(s['mean_rel'])} % | " + f"{signed(s['min_rel'])} % | {signed(s['max_rel'])} % | {s['passive_dominated']} |") + im = cd["increase_mechanisms"]; wt = im["with_term"] + stub = [x for x in im["pairs"] if "stub_separation" in x["increase_terms"]] + cell = [x for x in im["pairs"] if x["primary_mechanism"] == "wider_row"] + o += ["", f"**Where the {im['n']} area increases come from.** Each increase A1 - A0 is split exactly into five terms " + "(definitions in `analysis/cost_decomposition.py`); a pair can have several positive terms.", "", + "| term | pairs with this term | largest term |", "|---|---:|---:|", + f"| extra routing tracks (taller channels) | {wt['routing_tracks']} | {im['by_primary'].get('routing_tracks', 0)} |", + f"| width outside the rows to keep the metal-2 stubs of two rows apart ({sum(x['channel_strategy_mode'] != 'split' for x in stub)} by " + f"shifting a row, {sum(x['channel_strategy_mode'] == 'split' for x in stub)} by splitting a net into two trunks joined beyond the row ends) | " + f"{wt['stub_separation']} | {im['by_primary'].get('stub_separation', 0)} |", + f"| wider row that sets the width (shared cell wider) | {wt['wider_row']} | {im['by_primary'].get('wider_row', 0)} |", + f"| taller MOS rows | {wt['taller_mos_rows']} | {im['by_primary'].get('taller_mos_rows', 0)} |", "", + f"{im['assembly_only']} of {im['n']} increases come from routing and row assembly only ({im['tracks_and_stub_separation']} have both " + f"assembly terms). In the other {len(cell)} ({', '.join(sorted({x['case'] + ' ' + x['mode'] for x in cell}))}) the shared cell itself is " + f"wider: the gate straps that overlap on the bottom side move to the top, and a top strap's contact pad sits beyond the end " + f"of the active area, so the PMOS row grows by {-min(cell[0]['row_span_saving'].values()):.2f} um while the layout gets " + f"{-cell[0]['dH']:.2f} um lower.", ""] + dv = J("analysis/cost_validation_dev.json")["summary"]; dn = J("analysis/cost_validation_dev_no_channel.json")["summary"]; ho = J("analysis/cost_validation_heldout.json")["summary"] + o += ["## Plan-level cost rule", "", + "The rule estimates each candidate's width and height from its plans, the design rules and one unshared assembly per " + "case, without building the candidate (`selection/cost.py`).", "", + f"* Development sizes (sW1_sL1, sW1_sL1.5): sign of the area change correct for {dv['sign_correct']}/{dv['n_pairs']} pairs, " + f"{dn['sign_correct']}/{dn['n_pairs']} without the routing-channel term (`results/analysis/cost_validation_dev*.json`).", + f"* The ten held-out sizes, rule frozen before they were measured: {ho['sign_correct']}/{ho['n_pairs']} " + f"({pct(ho['sign_correct'] / ho['n_pairs'], 0)} %) (`results/analysis/cost_validation_heldout.json`).", ""] + sel = J("analysis/selection_summary.json")["summary"]; bm = sel["by_method"] + o += ["## Choosing a plan within the catalogue", "", f"Source: `results/analysis/selection_summary.json`. {sel['n_tasks_with_feasible']} tasks; every " + "catalogue plan was built and verified, and each method is replayed on the same records. Gap = area of the best passing " + "plan found after n full verifications over the best passing catalogue plan, minus 1 (topology-balanced mean). Minutes = " + "wall time per task, including the method's own geometry work.", "", + "| method | gap n = 1 | gap n = 4 | gap n = 16 | min at n = 1 | min at n = 16 |", "|---|---:|---:|---:|---:|---:|"] + for k, lab in (("baseline_independent", "unshared plan only"), ("fixed_mode", "fixed mode order"), ("share_most", "share most"), ("random", "random (10 seeds)"), + ("neighbourhood", "neighbourhood search"), ("geometry_first", "build all, then rank"), ("cost_rank", "cost rule")): + g = lambda n: (pct(bm[k][n]["gap_balanced_when_found"]) + " %") if bm[k][n]["gap_balanced_when_found"] is not None else "-" + o.append(f"| {lab} | {g('1')} | {g('4')} | {g('16')} | {bm[k]['1']['time_s_balanced'] / 60:.1f} | {bm[k]['16']['time_s_balanced'] / 60:.1f} |") + L = J("analysis/llm_summary.json")["summary"]; SA = J("analysis/scope_audit.json"); C = SA["same_task_comparison_model_tasks"] + o += ["", "## Language models on the same tasks", "", "Sources: `results/analysis/llm_summary.json`, `results/analysis/scope_audit.json`, " + "`results/analysis/llm_interface.json`, `results/analysis/agent_session_audit.json`. Protocol: `docs/MODELS.md`.", "", + "| model | sessions | proposals | EDA verifications | first program legal | built layouts passing every check |", "|---|---:|---:|---:|---:|---:|"] + for tag in ("openai_gpt-6.1-sol", "anthropic_claude-sonnet"): + s = L[tag] + o.append(f"| {MODEL_LABEL[tag]} | {s['sessions']} | {s['proposals']} | {s['eda_verifications']} | {pct(s['first_legal_rate'], 0)} % | " + f"{pct(s['auto_passed_rate_of_evaluated'])} % |") + o += ["", f"Models are not limited to the catalogue: in {SA['best_known_source'].get('model proposal', 0)} of {SA['task_sets']['model_tasks']} tasks " + "a model's layout is smaller than every catalogue plan. On these tasks every method is therefore measured against the best " + "layout known for the task (catalogue and every model proposal); gap in %, topology-balanced:", "", + "| method | after 1 | after 2 | after 4 | after 8 |", "|---|---:|---:|---:|---:|"] + for k, lab, unit in (("cost_rank", "cost rule (verifications)", "ver."), ("random", "random order (verifications)", "ver."), + ("openai_gpt-6.1-sol", "OpenAI model (proposals)", "prop."), ("anthropic_claude-sonnet", "Anthropic model (proposals)", "prop.")): + o.append(f"| {lab} | " + " | ".join(pct(C[k][f'{n} {unit}']['vs_best_known']) for n in (1, 2, 4, 8)) + " |") + o.append(f"| unshared layout | {pct(C['unshared reference']['vs_best_known'])} | | | |") + I = SA["interface_comparison"]; b = I["base-gLayout interface"]; s2 = I["sharing interface"] + au = J("analysis/agent_session_audit.json")["summary"]; mr = au["after_manual_review"] + oai = [x for x in J("analysis/llm_summary.json")["sessions"] if x["tag"].startswith("openai")] + o += ["", "**Interface comparison** (OpenAI model, same tasks, settings and budget). With an interface that offers only what base " + f"gLayout expresses per group, {b['sessions_equal_to_reference']} of {b['sessions']} sessions end at the area of the unshared " + f"layout (mean change {100 * b['vs_reference']:.2f} %); with the sharing interface the mean change is {100 * s2['vs_reference']:.1f} %. " + "The comparison measures what an interface lets a model express, not how well a model searches.", "", + f"**Isolation.** {sum(x['isolation_breach'] is False for x in oai)} of {len(oai)} OpenAI sessions contain no tool call in their " + f"event logs. Of the {au['sessions']} " + f"Anthropic agent sessions, {au['clean']} made only allowed tool calls, {au['in_folder_edit_sessions']} also edited their own " + f"proposal files with text tools, and {au['auto_flagged']} were flagged automatically; on manual review one was benign and one read " + f"the output file of its own backgrounded submit command (its own tool report); {mr['foreign_information_access']} sessions " + "accessed outside information.", ""] + pv = J("analysis/pvt.json")["comparison_vs_reference"]; ab = J("analysis/arrangement_bandwidth_C16.json") + drops = [1 - d["group0.arrangement=interleave"]["mean_f3db_MHz"] / d["group0.arrangement=block"]["mean_f3db_MHz"] for d in ab.values() + if d.get("group0.arrangement=block", {}).get("mean_f3db_MHz") and d.get("group0.arrangement=interleave", {}).get("mean_f3db_MHz")] + lab = {"combined": "named mode 'combined'", "best_evaluated": "best catalogue plan"} + o += ["## Electrical side and robustness", "", + f"* Resistor-loaded pair (C16): interleaving the input fingers lowers the bandwidth by {pct(min(drops), 0)}-{pct(max(drops), 0)} % against " + "block placement (`results/analysis/arrangement_bandwidth_C16.json`).", + "* Five corner, temperature and supply conditions, interconnect at nominal R+C, no Monte Carlo, against the nominal frozen " + "specifications (`results/analysis/pvt.json`), compared with the unshared reference of the same case: " + + "; ".join(f"{lab.get(role, role)}: {c.get('co_pass', 0)} joint passes, {c.get('co_fail', 0)} joint failures, " + f"{c.get('sharing_added_failure', 0)} failures added by sharing" for role, c in pv.items()) + ".", ""] + rc = J("analysis/review_coverage.json"); te = J("analysis/testbench_equivalence.json") + setlab = {"main_grid": "every main-grid layout", "reported": "every reported layout", "pvt_targets": "every PVT layout"} + o += ["## Visual review and reproducibility", "", + "* Blind visual review (`results/analysis/review_coverage.json`; protocol in `textbook_sharing/review/reviewer_guide.md`): " + + "; ".join(f"{setlab.get(k, k)}: {v['n']}, effective verdict " + ", ".join(f"{a} {n}" for a, n in v["group_effective"].items()) + for k, v in rc.items() if k != "all_records_effective") + + f". {rc['all_records_effective'].get('review_pending', 0)} selection-catalogue records outside the reported set were not reviewed.", + f"* The testbench generator in this repository reproduces the recorded decks of all {te['cases']} case folders apart from " + f"comment lines ({te['identical_without_comments']} of {te['cases']}; `results/analysis/testbench_equivalence.json`)."] + gp, dp = paths.ANALYSIS / "geometry_check.json", paths.ANALYSIS / "geometry_check_diagnosis.json" + if gp.exists(): + g = json.load(open(gp)); sm = g["summary"]; tot = sum(v["records"] for v in sm.values()); same = sum(v.get("hash_match", 0) for v in sm.values()) + names = {"grid": "main-grid layout", "selection": "selection candidate", "models": "model proposal"} + full = [names.get(k, k) for k, v in sm.items() if v.get("hash_match", 0) == v["records"]] + line = (f"* Geometry of every recorded layout rebuilt with this code (`results/analysis/geometry_check.json`): {same} of {tot} have the " + f"recorded geometry hash, including every {' and every '.join(full)}.") + if dp.exists() and tot > same: + d = json.load(open(dp)); rv = d["reverification"] + line += (f" The other {d['n']} ({d['description']}) differ only on layer {', '.join(d['layers'])} ({d['layer_names']}): the rebuild adds " + f"{d['added_um2'][0]:.2f} um^2 and removes nothing, and every bounding box is unchanged. A full re-verification of all {rv['n']} with " + f"this code gives the recorded status, area and stage results for " + f"{'every one of them' if rv['same_status_area_stages'] == rv['n'] else str(rv['same_status_area_stages'])}; post-layout measures differ by at most " + f"{rv['max_rel_measure_diff']:.1e} (relative) (`results/analysis/geometry_check_diagnosis.json`).") + o.append(line) + rp = sorted(glob.glob(str(paths.ANALYSIS / "repro_clean_*.json"))) + if rp: + r = json.load(open(rp[-1])); ok = sum(1 for x in r["runs"] if all(x["match"].values())) + worst = max((x["max_rel_measure_diff"] or 0.0) for x in r["runs"]) + o.append(f"* Clean-checkout rebuild of commit `{r['commit'][:12]}` (`results/analysis/{Path(rp[-1]).name}`): {ok} of " + f"{len(r['runs'])} layouts, built and verified from scratch, match the recorded geometry hash, area, status and every " + f"verification stage; the post-layout measures differ by at most {worst:.1e} (relative).") + return "\n".join(o) + "\n" + + +def main(): + DOCS.mkdir(parents=True, exist_ok=True) + (DOCS / "PARAMETER_SPACE.md").write_text(parameter_space()); (DOCS / "RESULTS.md").write_text(results()) + print("written docs/PARAMETER_SPACE.md, docs/RESULTS.md") + + +if __name__ == "__main__": + main() diff --git a/benchmarks/textbook_sharing/textbook_sharing/analysis/review_coverage.py b/benchmarks/textbook_sharing/textbook_sharing/analysis/review_coverage.py new file mode 100644 index 00000000..42a6c59c --- /dev/null +++ b/benchmarks/textbook_sharing/textbook_sharing/analysis/review_coverage.py @@ -0,0 +1,76 @@ +"""Visual-review coverage of the reported layouts. + +Effective verdict of a layout: the reviewer's verdict, where a 'suspicious' or 'fail' verdict counts as passed only when +it was resolved by objective checks (visual_resolution.outcome == 'resolved_ok'). Verdicts are taken over the +cell-name-independent geometry group, so a verdict reused from an identical layout counts. +Checked sets: every main-grid layout; the reported set (the best passing proposal of every model session, the best +passing plan and the named-mode plans of every selection task); the PVT targets; optional extra run folders. +usage: python -m textbook_sharing.analysis.review_coverage [--extra ] --out /analysis/review_coverage.json""" +import json, glob, argparse, collections +from pathlib import Path +from textbook_sharing.review.visual_review import groups, ROOTS +from textbook_sharing import paths + + +def eff(rec): + v = rec["visual"]["verdict"] + if v in ("suspicious", "fail"): + o = rec.get("visual_resolution", {}).get("outcome") + return "pass" if o == "resolved_ok" else ("confirmed_issue" if o else "unresolved_" + v) + return v + + +def reported_set(): + """Run folders of the layouts that are reported: best passing proposal per model session, best passing plan and + named-mode plans per selection task.""" + out = [] + for sd in glob.glob(str(paths.MODEL_RUNS / "*" / "*" / "r*")): + best = None + for f in glob.glob(sd + "/p*_report.json"): + r = json.load(open(f)) + if r.get("status") == "evaluated" and not r.get("duplicate_of") and r["run"]["primary_status"] == "auto_passed" and r["run"].get("area_um2"): + k = int(Path(f).name[1:].split("_")[0]) + if best is None or r["run"]["area_um2"] < best[0]: best = (r["run"]["area_um2"], f"{sd}/p{k}_run") + if best: out.append(best[1]) + for cat_f in glob.glob(str(paths.SELECTION_RUNS / "*" / "catalogue.json")): + td = Path(cat_f).parent; cat = json.load(open(cat_f)); feas = [] + for cid, e in cat["entries"].items(): + rp = td / cid / "result.json" + if not rp.exists(): continue + r = json.load(open(rp)) + if any(l.startswith("named:") for l in e.get("labels", [])): out.append(str(td / cid)) + if r.get("primary_status") == "auto_passed" and r.get("area_um2"): feas.append((r["area_um2"], str(td / cid))) + if feas: out.append(min(feas)[1]) + return sorted({str(Path(x).resolve()) for x in out}) + + +def main(): + ap = argparse.ArgumentParser(); ap.add_argument("--extra", default=None); ap.add_argument("--out", default=str(paths.ANALYSIS / "review_coverage.json")); a = ap.parse_args() + g = groups(ROOTS); by_dir = {} + for k, recs in g.items(): + es = {eff(r) for _, r in recs} + ge = "pass" if "pass" in es and not (es & {"confirmed_issue", "unresolved_suspicious", "unresolved_fail"}) else sorted(es)[0] + for rp, r in recs: + by_dir[str(Path(rp).parent.parent.parent.resolve())] = (ge, eff(r)) + grid_root = str(paths.GRID_RUNS.resolve()) + "/" + sets = {"main_grid": sorted(d for d in by_dir if d.startswith(grid_root)), "reported": reported_set()} + pv = paths.ANALYSIS / "pvt.json" + if pv.exists(): + sets["pvt_targets"] = sorted({str(paths.resolve(t[2]).parent.resolve()) for t in json.load(open(pv))["targets"]}) + if a.extra: + sets["extra"] = sorted({str(paths.resolve(l.strip()).resolve()) for l in open(a.extra) if l.strip()}) + out = {} + for name, dirs in sets.items(): + c = collections.Counter(); bad = [] + for d in dirs: + ge = by_dir.get(d, ("no_record", None))[0]; c[ge] += 1 + if ge != "pass": bad.append([paths.rel(d), ge]) + out[name] = {"n": len(dirs), "group_effective": dict(c), "not_pass": bad[:50]} + out["all_records_effective"] = dict(collections.Counter(v[1] for v in by_dir.values())) + Path(a.out).parent.mkdir(parents=True, exist_ok=True) + json.dump(out, open(a.out, "w"), indent=1) + print(json.dumps({k: (v if k == "all_records_effective" else {"n": v["n"], "eff": v["group_effective"]}) for k, v in out.items()}, indent=1)) + + +if __name__ == "__main__": + main() diff --git a/benchmarks/textbook_sharing/textbook_sharing/analysis/scope.py b/benchmarks/textbook_sharing/textbook_sharing/analysis/scope.py new file mode 100644 index 00000000..35c891cf --- /dev/null +++ b/benchmarks/textbook_sharing/textbook_sharing/analysis/scope.py @@ -0,0 +1,107 @@ +"""Scope audit of the comparisons (no new runs; reads the existing results). +1. Task sets: designed selection grid (6 topologies x 3 PDKs x 4 sizes), what drops out and why, the selection set, + the model-session set and the interface-comparison set. +2. Same-task comparison on the model-session tasks: every selection method after n verifications and every model + after n proposals, measured against (a) the best feasible candidate of the task's sampled catalogue and (b) the best + feasible layout known for the task (catalogue + every model proposal of every arm). The catalogue is a sample of + at most 64 plans, so a model can beat (a); (b) puts all methods on one reference. +3. Interface comparison: per arm, change vs the unshared reference and gap to the best known layout. +Topology-balanced means (mean over topologies of the mean over that topology's tasks; repetitions/seeds averaged +inside a task first). usage: python -m textbook_sharing.analysis.scope --out /analysis/scope_audit.json""" +import json, glob, argparse, statistics, collections +from pathlib import Path +from textbook_sharing import paths +SEL_TOPOS = ["C02", "C08", "C09", "C11", "C16", "C18"]; PDKS = ["sky130", "gf180", "ihp130"] +SEL_SIZES = ["sW1_sL1", "sW1_sL2", "sW2_sL1", "sW2_sL2"] +MAIN_TAGS = ["openai_gpt-6.1-sol", "anthropic_claude-sonnet"]; BASE_TAG = "openai_gpt-6.1-sol_baseiface" + + +def bal(vals): + """vals: {task: [values]} -> topology-balanced mean.""" + by = collections.defaultdict(list) + for t, v in vals.items(): + v = [x for x in v if x is not None] + if v: by[t.split("_")[0]].append(statistics.mean(v)) + return statistics.mean(statistics.mean(v) for v in by.values()) if by else None + + +def main(): + ap = argparse.ArgumentParser(); ap.add_argument("--out", required=True); a = ap.parse_args() + from textbook_sharing.selection.strategies import evaluate_task, FIXED_ORDER + from textbook_sharing.analysis.models import ref_area, best_evaluated, session_rows + L = json.load(open(paths.LEDGER)) + diag = {d["case_id"]: d for d in L["diagnostic"]} + designed = [f"{c}_{p}_{s}" for c in SEL_TOPOS for p in PDKS for s in SEL_SIZES] + sel = sorted(Path(d).parent.name for d in glob.glob(str(paths.SELECTION_RUNS / "*/catalogue.json"))) + dropped = {t: (diag.get(t, {}).get("reason", "not formal") + (": " + diag[t]["detail"] if t in diag and diag[t].get("detail") else "")) for t in designed if t not in sel} + llm_tasks = sorted({Path(d).name for tag in MAIN_TAGS for d in glob.glob(str(paths.MODEL_RUNS / tag / "*")) if Path(d).is_dir()}) + if_tasks = sorted({Path(d).name for d in glob.glob(str(paths.MODEL_RUNS / BASE_TAG / "*")) if Path(d).is_dir()}) + sets = {"designed_selection": len(designed), "dropped": dropped, "selection": len(sel), "selection_topologies": sorted({t.split("_")[0] for t in sel}), + "model_tasks": len(llm_tasks), "model_tasks_rule": "selection tasks at sW = 2 (sL 1 and 2)", "model_tasks_ok": all(t in sel and "_sW2_" in t for t in llm_tasks), + "interface_tasks": len(if_tasks), "interface_tasks_rule": "model tasks at sW2_sL1", "interface_tasks_ok": all(t.endswith("sW2_sL1") and t in llm_tasks for t in if_tasks)} + # ---- sessions: best feasible area after k proposals + sess = collections.defaultdict(lambda: collections.defaultdict(list)) # tag -> task -> [ {k: area} ] + for tag in MAIN_TAGS + [BASE_TAG]: + for sd in sorted(glob.glob(str(paths.MODEL_RUNS / tag / "*" / "r*"))): + _, _, reps = session_rows(sd) + if not reps: continue + best = {}; cur = None + for i, r in enumerate(reps, 1): + if r.get("status") == "evaluated" and r["run"]["primary_status"] == "auto_passed" and r["run"].get("area_um2"): + cur = r["run"]["area_um2"] if cur is None else min(cur, r["run"]["area_um2"]) + if i in (1, 2, 4, 8): best[i] = cur + for k in (1, 2, 4, 8): best.setdefault(k, cur) + sess[tag][Path(sd).parent.name].append(best) + # ---- selection methods on the model tasks + meth = {} + for t in llm_tasks: + rows = evaluate_task(paths.SELECTION_RUNS / t, fixed_order=FIXED_ORDER) + for r in rows: + for n in ("1", "2", "4", "8", "16"): + meth.setdefault(r["method"], collections.defaultdict(lambda: collections.defaultdict(list)))[n][t].append(r["prefix"][n]["best_area"]) + best_cat = {t: best_evaluated(t)[0] for t in llm_tasks} + best_known = {} + for t in llm_tasks: + cands = [best_cat[t]] + [b[8] for tag in sess for b in sess[tag].get(t, []) if b.get(8)] + best_known[t] = min(c for c in cands if c) + src = {t: ("catalogue" if abs(best_known[t] - best_cat[t]) < 1e-9 else "model proposal") for t in llm_tasks} + who = {} + for t in llm_tasks: + if src[t] == "catalogue": continue + who[t] = sorted({tag for tag in sess for b in sess[tag].get(t, []) if b.get(8) and abs(b[8] - best_known[t]) < 1e-9}) + def gaps(area_by_task, ref): + return {t: [(x / ref[t] - 1) if x else None for x in v] for t, v in area_by_task.items()} + same = {} + for m, d in meth.items(): + same[m] = {f"{n} ver.": {"vs_catalogue_best": bal(gaps(d[n], best_cat)), "vs_best_known": bal(gaps(d[n], best_known))} for n in ("1", "2", "4", "8", "16")} + for tag in MAIN_TAGS: + same[tag] = {} + for k in (1, 2, 4, 8): + ab = {t: [b[k] for b in v] for t, v in sess[tag].items()} + same[tag][f"{k} prop."] = {"vs_catalogue_best": bal(gaps(ab, best_cat)), "vs_best_known": bal(gaps(ab, best_known)), + "sessions": sum(len(v) for v in ab.values())} + g8 = [b[8] / best_cat[t] - 1 for t, v in sess[tag].items() for b in v if b[8]] + same[tag]["sessions_below_catalogue_best"] = sum(g < -1e-9 for g in g8); same[tag]["sessions_equal"] = sum(abs(g) < 1e-9 for g in g8) + same[tag]["sessions_above"] = sum(g > 1e-9 for g in g8) + ref = {t: ref_area(t) for t in llm_tasks} + same["unshared reference"] = {"vs_catalogue_best": bal({t: [ref[t] / best_cat[t] - 1] for t in llm_tasks}), "vs_best_known": bal({t: [ref[t] / best_known[t] - 1] for t in llm_tasks})} + # ---- interface comparison (14 tasks) + itf = {} + for arm, tag in (("sharing interface", MAIN_TAGS[0]), ("base-gLayout interface", BASE_TAG)): + ab = {t: [b[8] for b in sess[tag][t]] for t in if_tasks} + itf[arm] = {"sessions": sum(len(v) for v in ab.values()), "vs_reference": bal({t: [(x / ref[t] - 1) if x else None for x in v] for t, v in ab.items()}), + "vs_catalogue_best": bal(gaps(ab, best_cat)), "vs_best_known": bal(gaps(ab, best_known)), + "sessions_equal_to_reference": sum(1 for t, v in ab.items() for x in v if x and abs(x / ref[t] - 1) < 1e-3)} + itf["unshared reference"] = {"vs_catalogue_best": bal({t: [ref[t] / best_cat[t] - 1] for t in if_tasks}), "vs_best_known": bal({t: [ref[t] / best_known[t] - 1] for t in if_tasks})} + out = {"task_sets": sets, "model_tasks": llm_tasks, "interface_tasks": if_tasks, "best_known_source": dict(collections.Counter(src.values())), + "best_known_found_by": who, + "best_known_by_task": {t: {"catalogue_best": best_cat[t], "best_known": best_known[t], "source": src[t], "reference": ref[t]} for t in llm_tasks}, + "same_task_comparison_model_tasks": same, "interface_comparison": itf, + "note": "selection methods choose only among the <=64 sampled catalogue plans; models may propose any legal plan"} + json.dump(out, open(a.out, "w"), indent=1) + print(json.dumps({k: out[k] for k in ("task_sets", "best_known_source", "interface_comparison")}, indent=1)) + for m, d in same.items(): print(m, json.dumps(d)) + + +if __name__ == "__main__": + main() diff --git a/benchmarks/textbook_sharing/textbook_sharing/analysis/selection.py b/benchmarks/textbook_sharing/textbook_sharing/analysis/selection.py new file mode 100644 index 00000000..c1be4dc8 --- /dev/null +++ b/benchmarks/textbook_sharing/textbook_sharing/analysis/selection.py @@ -0,0 +1,104 @@ +"""Aggregate the plan-selection experiment (offline replay on fully verified catalogues). +Per task and method: best feasible area after n verifications (n = 1, 2, 4, 8, 16), gap to the best feasible candidate +of the evaluated set ("best of the evaluated set", not a global optimum), found/not found, time. Random = mean over 10 +seeds. Aggregates: (a) per-task paired comparison vs the cost ranking, (b) topology-balanced mean (mean over +topologies of the mean over that topology's tasks), (c) 95 % intervals by cluster bootstrap over topologies (B = 2000, +seed 20261011). Tasks whose evaluated set has no feasible candidate are reported separately. +usage: python -m textbook_sharing.analysis.selection --out /analysis/selection_summary.json""" +import json, glob, random, statistics, argparse, collections +from pathlib import Path +from textbook_sharing.selection.strategies import evaluate_task, PREFIXES, FIXED_ORDER +from textbook_sharing import paths + +METHODS = ["baseline_independent", "fixed_mode", "share_most", "random", "neighbourhood", "cost_rank", "geometry_first"] + + +def per_task_rows(td): + rows = evaluate_task(td, fixed_order=FIXED_ORDER) + out = {} + for m in METHODS: + rs = [r for r in rows if r["method"] == m] + if not rs: continue + d = {} + for n in PREFIXES: + ps = [r["prefix"][str(n)] for r in rs] + found = [p["best_area"] is not None for p in ps] + gaps = [p["gap"] for p in ps if p["gap"] is not None] + d[str(n)] = {"found_rate": sum(found) / len(found), "gap_mean_found": statistics.mean(gaps) if gaps else None, + "gap_or_inf": statistics.mean([p["gap"] if p["gap"] is not None else float("inf") for p in ps]), + "time_s": statistics.mean(p["time_s"] for p in ps)} + out[m] = {"prefix": d, "precompute_s": statistics.mean(r["precompute_s"] for r in rs), "n_runs": len(rs), + "first_feasible_query": [r["first_feasible_query"] for r in rs]} + r0 = rows[0] + return {"task": Path(td).name, "n_evaluated": r0["n_evaluated"], "n_feasible": r0["n_feasible"], "best_evaluated": r0["best_evaluated"], "methods": out} + + +def topo(task): + return task.split("_")[0] + + +def balanced(vals_by_task, tasks): + by = collections.defaultdict(list) + for t in tasks: + v = vals_by_task.get(t) + if v is not None: by[topo(t)].append(v) + means = [statistics.mean(v) for v in by.values() if v] + return statistics.mean(means) if means else None, by + + +def boot(vals_by_task, tasks, B=2000, seed=20261011): + _, by = balanced(vals_by_task, tasks); keys = sorted(by); r = random.Random(seed); est = [] + for _ in range(B): + samp = [r.choice(keys) for _ in keys] + est.append(statistics.mean(statistics.mean(by[k]) for k in samp)) + est.sort(); return [est[int(0.025 * B)], est[int(0.975 * B) - 1]] + + +def main(): + ap = argparse.ArgumentParser(); ap.add_argument("--out", required=True); a = ap.parse_args() + tds = sorted(d for d in glob.glob(str(paths.SELECTION_RUNS / "*")) if (Path(d) / "catalogue.json").exists()) + tasks = []; incomplete = [] + for td in tds: + cat = json.load(open(Path(td) / "catalogue.json")) + done = sum(1 for c in cat["entries"] if (Path(td) / c / "result.json").exists()) + if done < len(cat["entries"]): incomplete.append({"task": Path(td).name, "done": done, "n": len(cat["entries"])}); continue + tasks.append(per_task_rows(td)) + feas = [t for t in tasks if t["n_feasible"] > 0]; nofeas = [t["task"] for t in tasks if t["n_feasible"] == 0] + names = [t["task"] for t in feas] + summ = {"n_tasks_complete": len(tasks), "n_tasks_with_feasible": len(feas), "tasks_without_feasible": nofeas, "incomplete": incomplete, + "topologies": sorted({topo(t) for t in names}), "fixed_order": FIXED_ORDER, "by_method": {}} + for m in METHODS: + mm = {} + for n in PREFIXES: + fr = {t["task"]: t["methods"][m]["prefix"][str(n)]["found_rate"] for t in feas if m in t["methods"]} + gp = {t["task"]: t["methods"][m]["prefix"][str(n)]["gap_mean_found"] for t in feas if m in t["methods"] and t["methods"][m]["prefix"][str(n)]["gap_mean_found"] is not None} + tm = {t["task"]: t["methods"][m]["prefix"][str(n)]["time_s"] for t in feas if m in t["methods"]} + zero = {t["task"]: 1.0 if (t["methods"][m]["prefix"][str(n)]["gap_mean_found"] is not None and t["methods"][m]["prefix"][str(n)]["gap_mean_found"] < 1e-9) else 0.0 for t in feas if m in t["methods"]} + mm[str(n)] = {"found_rate_balanced": balanced(fr, names)[0], "found_rate_ci": boot(fr, names), + "gap_balanced_when_found": balanced(gp, names)[0], "gap_ci": boot(gp, list(gp)) if gp else None, + "hit_best_rate_balanced": balanced(zero, names)[0], "time_s_balanced": balanced(tm, names)[0], "n_tasks": len(fr)} + summ["by_method"][m] = mm + # paired comparison vs cost_rank at each budget: fraction of tasks where the method's best area is better / equal / worse + pair = {} + for m in METHODS: + if m == "cost_rank": continue + pm = {} + for n in PREFIXES: + w = e = l = 0 + for t in feas: + a_ = t["methods"].get(m, {}).get("prefix", {}).get(str(n), {}).get("gap_or_inf"); b_ = t["methods"]["cost_rank"]["prefix"][str(n)]["gap_or_inf"] + if a_ is None: continue + if abs(a_ - b_) < 1e-9 or (a_ == b_): e += 1 + elif a_ < b_: w += 1 + else: l += 1 + pm[str(n)] = {"better": w, "equal": e, "worse": l} + pair[m] = pm + summ["paired_vs_cost_rank"] = pair + json.dump({"summary": summ, "tasks": tasks}, open(a.out, "w"), indent=1) + print(json.dumps({k: summ[k] for k in ("n_tasks_complete", "n_tasks_with_feasible", "tasks_without_feasible", "incomplete")}, indent=1)[:1500]) + for m in METHODS: + print(m, {n: (round(v["found_rate_balanced"] or 0, 3), None if v["gap_balanced_when_found"] is None else round(v["gap_balanced_when_found"], 4), round(v["time_s_balanced"] or 0)) for n, v in summ["by_method"][m].items()}) + + +if __name__ == "__main__": + main() diff --git a/benchmarks/textbook_sharing/textbook_sharing/assembly/__init__.py b/benchmarks/textbook_sharing/textbook_sharing/assembly/__init__.py new file mode 100644 index 00000000..92bcc976 --- /dev/null +++ b/benchmarks/textbook_sharing/textbook_sharing/assembly/__init__.py @@ -0,0 +1,14 @@ +"""textbook_sharing.assembly: harness-provided row/channel assembly for small analog cells. + +Used identically by the baseline (upstream gLayout primitives) and the extended +(glayout.sharing groups) tracks. It knows nothing about sharing: it takes +*pin cells* (a layout component plus a list of net-labelled pins on its top or +bottom edge), stacks them in polarity-homogeneous rows, connects equal nets +with met3 trunks in the channels between rows via met2 stubs, adds tap strips, +row-level well/implant blankets and port labels, and reports geometry +statistics (bounding box, wire length, via counts). +""" +from .pincell import PinCell, Pin +from .engine import RowSpec, assemble, AssemblyError +from glayout.sharing.rules import rules_for, GroupRules +__all__ = ["PinCell", "Pin", "RowSpec", "assemble", "AssemblyError", "rules_for", "GroupRules"] diff --git a/benchmarks/textbook_sharing/textbook_sharing/assembly/adapters.py b/benchmarks/textbook_sharing/textbook_sharing/assembly/adapters.py new file mode 100644 index 00000000..3ad4a7be --- /dev/null +++ b/benchmarks/textbook_sharing/textbook_sharing/assembly/adapters.py @@ -0,0 +1,20 @@ +"""Adapters that turn layout components into textbook_sharing.assembly PinCells.""" +from __future__ import annotations +from .pincell import PinCell, Pin + + +def from_group_result(res, name: str, polarity: str, body_net: str) -> PinCell: + """glayout.sharing GroupResult -> PinCell (pins are already met2 pads on the top/bottom edges).""" + comp = res.component + meta = comp.info["pin_meta"] + pins = [] + for pname, m in meta.items(): + pins.append(Pin(pname, m["net"], m["x"], m["y"], m["side"], m["width"], tuple(comp.ports[pname].layer), m.get("terminals", []))) + bb = res.geometry_stats["bbox"] + W = res.geometry_stats["unit_width"] + # active extent: from the outermost diffusion pins when the group does not report it (y spans [0, W]) + act_x0 = min(m["x"] for m in meta.values() if m["side"] == "top" and "node" in m) - 0.5 + act_x1 = max(m["x"] for m in meta.values() if m["side"] == "top" and "node" in m) + 0.5 + active_bbox = res.geometry_stats.get("active_bbox", (act_x0, 0.0, act_x1, W)) + return PinCell(name, comp, pins, polarity, tuple(bb), active_bbox=active_bbox, body_net=body_net, + info={"group_stats": res.geometry_stats, "evidence": res.physical_sharing_evidence, "device_map": res.device_map, "applied_plan": res.applied_plan}) diff --git a/benchmarks/textbook_sharing/textbook_sharing/assembly/engine.py b/benchmarks/textbook_sharing/textbook_sharing/assembly/engine.py new file mode 100644 index 00000000..73cdd109 --- /dev/null +++ b/benchmarks/textbook_sharing/textbook_sharing/assembly/engine.py @@ -0,0 +1,625 @@ +"""Row/channel assembly engine (see package docstring).""" +from __future__ import annotations +import math +from dataclasses import dataclass +from typing import Optional +from glayout.sharing.rules import rules_for, snap, snap_up, GRID + + +class AssemblyError(RuntimeError): + pass + + +@dataclass +class RowSpec: + cells: list # list[PinCell], left to right + polarity: str # 'n', 'p', 'passive' + flip: bool = False # mirror vertically (pins that were 'top' face down) + body_net: Optional[str] = None # net for the tap strips of this row + taps: bool = True + gap: Optional[float] = None # override cell gap + + +@dataclass +class _PlacedPin: + net: str; x: float; y: float; width: float; row: int; channel: int; name: str; cell: str; key: str = "" + + def k(self): + return self.key or self.net + + +class _Rects: + def __init__(self): + self.r = {} + def add(self, layer, x0, y0, x1, y1): + if layer is None: return + if x1 < x0: x0, x1 = x1, x0 + if y1 < y0: y0, y1 = y1, y0 + self.r.setdefault(tuple(layer), []).append((snap(x0), snap(y0), snap(x1), snap(y1))) + + +def _flip_component(comp, y0, y1): + """Return a mirrored copy (y -> y0+y1-y) of a component via a reference.""" + return comp + + +def assemble(pdk, rows: list, ports: list, name: str = "dut", labels: bool = True, extra_nets_order: Optional[list] = None, + channel_margin: Optional[float] = None, port_layer: str = "met3") -> dict: + """Channel rule (identical for every sharing mode): assemble with the 'shared' channel strategy (one trunk per + net and channel; cross-row stub conflicts are resolved by shifting the upper row) and, when some net is fed from both + rows of a channel, also with the 'split' strategy (such a net gets one trunk for the lower-row stubs and one for the + upper-row stubs, joined by a met2 jumper beyond the pins, so lower and upper stubs never overlap and no row shift is + needed). The result with the smaller bounding-box area is returned (ties: shared); both areas are recorded.""" + trials = {} + try: + trials["shared"] = _assemble(pdk, rows, ports, name + "__trial_shared", labels, extra_nets_order, channel_margin, port_layer, split_shared=False) + except AssemblyError as e: + trials["shared_error"] = repr(e) + if any(_cross_fed(rows)): + try: + trials["split"] = _assemble(pdk, rows, ports, name + "__trial_split", labels, extra_nets_order, channel_margin, port_layer, split_shared=True) + except AssemblyError as e: + trials["split_error"] = repr(e) + cands = [(trials[k]["stats"]["area_um2"], 0 if k == "shared" else 1, k) for k in ("shared", "split") if k in trials] + if not cands: + raise AssemblyError(f"both channel strategies failed: {trials}") + best = min(cands)[2]; out = trials[best] + # trials are built under distinct internal cell names (no registry collision); the kept one gets the requested name + comp = out["component"] + if hasattr(comp, "unlock"): comp.unlock() + comp.name = name + if comp.name != name: + raise AssemblyError(f"could not rename assembled cell to {name!r} (got {comp.name!r})") + out["stats"]["channel_strategy"] = best + out["stats"]["channel_strategy_trials"] = {k: (v["stats"]["area_um2"] if isinstance(v, dict) else v) for k, v in trials.items()} + out["component"].info["assembly_stats"] = out["stats"] + return out + + +def _cross_fed(rows): + """yield True for every (channel, net) that receives pins from both the row below and the row above.""" + feed = {} + for ri, row in enumerate(rows): + for c in row.cells: + for p in c.pins: + side = p.side if not row.flip else ("bottom" if p.side == "top" else "top") + ch = ri + 1 if side == "top" else ri + feed.setdefault((ch, p.net), set()).add("lower" if ch == ri + 1 else "upper") + for v in feed.values(): + yield v == {"lower", "upper"} + + +def _channel_net_sources(rows) -> dict: + """{"cells": {cell_name: {channel: [nets]}}, "taps": {channel: [nets]}} for the row/flip structure of `rows`.""" + cells = {}; taps = {} + for ri, row in enumerate(rows): + for c in row.cells: + d = cells.setdefault(c.name, {}) + for p in c.pins: + side = p.side if not row.flip else ("bottom" if p.side == "top" else "top") + ch = ri + 1 if side == "top" else ri + d.setdefault(str(ch), set()).add(p.net) + if row.taps and row.body_net: + ch = ri + 1 if not row.flip else ri + taps.setdefault(str(ch), set()).add(row.body_net) + return {"cells": {k: {ch: sorted(v) for ch, v in d.items()} for k, d in cells.items()}, + "taps": {ch: sorted(v) for ch, v in taps.items()}, + "row_of_cell": {c.name: ri for ri, row in enumerate(rows) for c in row.cells}, + "row_flip": [bool(row.flip) for row in rows]} + + +def _assemble(pdk, rows: list, ports: list, name: str = "dut", labels: bool = True, extra_nets_order: Optional[list] = None, + channel_margin: Optional[float] = None, port_layer: str = "met3", split_shared: bool = False) -> dict: + """Place rows bottom-to-top, route nets through channels, add taps/blankets/labels. + Returns {"component", "stats", "pin_map", "trunks", ...}.""" + from glayout.backend import Component + R = rules_for(pdk); lay = R.layers + comp = Component(name + "_hier") + rects = _Rects() + trunk_w = snap_up(max(R.m3_w, R.via2_w + 2 * R.m3_enc_via2, R.sq_from_area(R.m3_area_min))) + track_pitch = snap_up(trunk_w + R.m3_sep) + via2_m2_pad = snap_up(max(R.m2_w, R.via2_w + 2 * R.m2_enc_via2)) + stub_w = snap_up(R.m2_w) + ch_margin = channel_margin if channel_margin is not None else snap_up(max(R.m2_sep, R.m3_sep) + via2_m2_pad / 2 + R.m2_sep) + tap_w = snap_up(R.cont_w + 2 * R.act_enc_cont_tap) + nrows = len(rows) + + # ---------- 1. place cells in rows (x), compute row heights ---------- + placed = [] # per row: list of (cell, x_offset, y_offset, flipped) + row_dims = [] + for ri, row in enumerate(rows): + gap = row.gap if row.gap is not None else snap_up(max(R.act_sep, R.poly_sep, R.m1_sep, R.m2_sep, R.imp_sep if row.polarity == "p" else 0.0) + 0.1) + x = 0.0; items = [] + ymin = min(c.bbox[1] for c in row.cells); ymax = max(c.bbox[3] for c in row.cells) + for ci, c in enumerate(row.cells): + items.append((c, snap(x - c.bbox[0]))) + x = snap(x + (c.bbox[2] - c.bbox[0]) + gap) + width = snap(x - gap) + # MOS rows carry a horizontal tie strip on their gate side (cell-local bottom): reserve its height + if row.taps and row.body_net and row.polarity in ("n", "p"): + ymin = snap(ymin - snap_up(max(R.tap_act_sep, R.pimp_to_nact + R.pimp_enc_act) + tap_w + 0.1)) + placed.append(items); row_dims.append((width, ymin, ymax)) + + # ---------- 2. determine channel nets ---------- + # channel c lies between row c-1 (below) and row c (above); c in 0..nrows + chan_nets = [dict() for _ in range(nrows + 1)] # channel -> net -> list of pins (filled after y placement) + pin_channel = {} + for ri, row in enumerate(rows): + for c in row.cells: + for p in c.pins: + side = p.side if not row.flip else ("bottom" if p.side == "top" else "top") + ch = ri + 1 if side == "top" else ri + pin_channel[(ri, c.name, p.name)] = ch + chan_nets[ch].setdefault(p.net, []) + if row.taps and row.body_net: + ch = ri + 1 if not row.flip else ri + chan_nets[ch].setdefault(row.body_net, []) + # track order: deterministic by first appearance in the port list, then alphabetic + order_hint = {n: i for i, n in enumerate(list(ports) + list(extra_nets_order or []))} + # which rows feed each (channel, net): lower row = ch-1, upper row = ch + feed = {} + for ri, row in enumerate(rows): + for c in row.cells: + for p in c.pins: + side = p.side if not row.flip else ("bottom" if p.side == "top" else "top") + ch = ri + 1 if side == "top" else ri + feed.setdefault((ch, p.net), set()).add("lower" if ch == ri + 1 else "upper") + if row.taps and row.body_net: + ch = ri + 1 if not row.flip else ri + feed.setdefault((ch, row.body_net), set()).add("lower" if ch == ri + 1 else "upper") + # ---- split channel strategy: trunk entities keyed per (net, feeding side) for nets fed from both rows ---- + split_set = {k for k, v in feed.items() if v == {"lower", "upper"}} if split_shared else set() + def K(ch, net, ri): + if (ch, net) in split_set: + return f"{net}|{'L' if ch == ri + 1 else 'U'}" + return net + def ORIG(k): + return k.split("|")[0] + if split_set: + chan_nets = [dict() for _ in range(nrows + 1)]; feed2 = {} + for ri, row in enumerate(rows): + for c in row.cells: + for p in c.pins: + side = p.side if not row.flip else ("bottom" if p.side == "top" else "top") + ch = ri + 1 if side == "top" else ri + k = K(ch, p.net, ri); chan_nets[ch].setdefault(k, []) + feed2.setdefault((ch, k), set()).add("lower" if ch == ri + 1 else "upper") + if row.taps and row.body_net: + ch = ri + 1 if not row.flip else ri + k = K(ch, row.body_net, ri); chan_nets[ch].setdefault(k, []) + feed2.setdefault((ch, k), set()).add("lower" if ch == ri + 1 else "upper") + feed = feed2 + def band(ch, n): + f = feed.get((ch, n), set()) + if f == {"lower"}: return 0 + if f == {"upper"}: return 2 + return 1 + # x-extent of each (channel, net) trunk, used to pack non-overlapping trunks on one track. + # Extents depend on the final row x shifts, which depend on channel heights (track counts): iterate to a fixed point. + def compute_net_x(shifts): + nx = {} + for ri, row in enumerate(rows): + for c, xoff in placed[ri]: + for p in c.pins: + side = p.side if not row.flip else ("bottom" if p.side == "top" else "top") + ch = ri + 1 if side == "top" else ri + gx = shifts[ri] + xoff + p.x + kk = K(ch, p.net, ri) + lo, hi = nx.get((ch, kk), (1e9, -1e9)) + nx[(ch, kk)] = (min(lo, gx), max(hi, gx)) + return nx + + def pack_tracks(net_x): + multi_hint = {} + for (ch, n), _ in net_x.items(): + multi_hint.setdefault(ORIG(n), set()).add((ch, n)) + for ch in range(nrows + 1): + for n in chan_nets[ch]: + multi_hint.setdefault(ORIG(n), set()).add((ch, n)) + chan_tracks = []; chan_ntracks = []; chan_ivs = [] + for ch in range(nrows + 1): + nets = sorted(chan_nets[ch].keys(), key=lambda n: (band(ch, n), order_hint.get(n, 10 ** 6), n)) + tracks = {}; occ = [] + for n in nets: + lo, hi = net_x.get((ch, n), (0.0, 0.0)) + if len(multi_hint.get(ORIG(n), ())) > 1: + hi = 1e9 # reaches the riser on the right + if (ch - 1 >= 0 and ORIG(n) == rows[ch - 1].body_net) or (ch < nrows and ORIG(n) == rows[ch].body_net): + lo, hi = -1e9, 1e9 # tap strips sit at both ends of the row + lo -= trunk_w + R.m3_sep; hi += trunk_w + R.m3_sep + t = None + for ti, iv in enumerate(occ): + if iv["band"] != band(ch, n): continue + if all(hi < a or lo > b for a, b in iv["ivs"]): + t = ti; break + if t is None: + occ.append({"band": band(ch, n), "ivs": []}); t = len(occ) - 1 + occ[t]["ivs"].append((lo, hi)); tracks[n] = t + chan_tracks.append(tracks); chan_ntracks.append(len(occ)); chan_ivs.append(occ) + return chan_tracks, chan_ntracks + + def tracks_valid(net_x, chan_tracks): + """No two nets on one track may overlap in x (with spacing margin).""" + for ch in range(nrows + 1): + per = {} + for n, t in chan_tracks[ch].items(): + lo, hi = net_x.get((ch, n), (0.0, 0.0)) + if (ch - 1 >= 0 and ORIG(n) == rows[ch - 1].body_net) or (ch < nrows and ORIG(n) == rows[ch].body_net): lo, hi = -1e9, 1e9 + per.setdefault(t, []).append((lo - trunk_w - R.m3_sep, hi + trunk_w + R.m3_sep, n)) + for t, ivs in per.items(): + for i in range(len(ivs)): + for j in range(i + 1, len(ivs)): + a, b = ivs[i], ivs[j] + if not (a[1] < b[0] or b[1] < a[0]): return False + return True + + shifts0 = [0.0] * nrows + net_x = compute_net_x(shifts0) + chan_tracks, chan_ntracks = pack_tracks(net_x) + chan_height = [ (chan_ntracks[ch] * track_pitch + 2 * ch_margin) if chan_tracks[ch] else 0.0 for ch in range(nrows + 1)] + for _pass in range(4): + # ---------- 3. vertical placement of rows and channels ---------- + y = 0.0 + chan_y0 = []; row_y = [] + for ri in range(nrows): + chan_y0.append(y); y = snap(y + chan_height[ri]) + width, ymin, ymax = row_dims[ri] + row_y.append(y) # row local y=ymin maps to row_y + y = snap(y + (ymax - ymin)) + chan_y0.append(y); y = snap(y + chan_height[nrows]) + + # tap strips: positions at the row ends + tap_gap_n = snap_up(max(R.tap_act_sep, R.pimp_to_nact + R.pimp_enc_act, R.nimp_enc_act + R.imp_sep * 0)) # p+ tap next to n+ active + tap_gap_p = snap_up(max(R.tap_act_sep, max(R.pimp_enc_act, R.pimp_enc_gate) + R.pimp_to_ntap)) # n+ tap next to p+ active (implant blanket to tap) + row_x_shift = [0.0] * nrows + tap_extent = {} + for ri, row in enumerate(rows): + if row.taps and row.body_net and row.polarity in ("n", "p"): + tg = tap_gap_n if row.polarity == "n" else tap_gap_p + tap_extent[ri] = snap_up(tg + tap_w + max(R.m1_sep, 0.1)) + else: + tap_extent[ri] = 0.0 + # centre rows horizontally relative to the widest (keeps things compact); taps add to the left of each row + max_w = max(row_dims[ri][0] + 2 * tap_extent[ri] for ri in range(nrows)) + for ri in range(nrows): + row_x_shift[ri] = snap((max_w - (row_dims[ri][0] + 2 * tap_extent[ri])) / 2 + tap_extent[ri]) + + # ---------- 4. collect pins in global coordinates ---------- + def pin_global(ri, c, xoff, p): + row = rows[ri]; width, ymin, ymax = row_dims[ri] + gx = snap(row_x_shift[ri] + xoff + p.x) + if not row.flip: + gy = snap(row_y[ri] + (p.y - ymin)) + side = p.side + else: + gy = snap(row_y[ri] + (ymax - p.y)) + side = "bottom" if p.side == "top" else "top" + return gx, gy, side + + pins_g = [] + for ri, items in enumerate(placed): + for c, xoff in items: + for p in c.pins: + gx, gy, side = pin_global(ri, c, xoff, p) + ch = ri + 1 if side == "top" else ri + pins_g.append(_PlacedPin(p.net, gx, gy, p.width, ri, ch, p.name, c.name, K(ch, p.net, ri))) + + # a via2 pad of one net next to the stub of another net (pads of different nets never share a track) + min_dx = snap_up(max(stub_w, via2_m2_pad, R.via1_pad_w()) / 2 + stub_w / 2 + R.m2_sep) + # ---------- 4b. tap strips: compute pin positions (row-relative) before conflict resolution ---------- + tap_specs = [] # dicts with row-relative geometry; drawn after row shifts are final + for ri, row in enumerate(rows): + if not (row.taps and row.body_net and row.polarity in ("n", "p")): continue + width, ymin, ymax = row_dims[ri] + tg = tap_gap_n if row.polarity == "n" else tap_gap_p + acts = [c.active_bbox or c.bbox for c, _ in placed[ri]] + ay0 = min(a[1] for a in acts); ay1 = max(a[3] for a in acts) + if not row.flip: + gy0 = snap(row_y[ri] + (ay0 - ymin)); gy1 = snap(row_y[ri] + (ay1 - ymin)) + else: + gy0 = snap(row_y[ri] + (ymax - ay1)); gy1 = snap(row_y[ri] + (ay0 - ymin) * 0 + (ymax - ay0)) + # minimum tap length for active min area, centred on the row active span + span = gy1 - gy0 + need = snap_up(max(span, R.act_area_min / tap_w if tap_w > 0 else 0.0, R.act_w_min)) + if need > span: + ext = snap_up((need - span) / 2); gy0 = snap(gy0 - ext); gy1 = snap(gy1 + ext) + rx0_act = min((c.active_bbox or c.bbox)[0] + xo for c, xo in placed[ri]) + rx1_act = max((c.active_bbox or c.bbox)[2] + xo for c, xo in placed[ri]) + ch = ri + 1 if not row.flip else ri + pad = R.via1_pad_w() + row_pins_x = [p.x + xo for c, xo in placed[ri] for p in c.pins] + tap_clear = snap_up(max(min_dx, max(p.width for c, _ in placed[ri] for p in c.pins) / 2 + pad / 2 + R.m2_sep)) + # the cell bbox may extend beyond the active (gate pads / risers): keep metal spacing from it as well + rx0_bb = min(c.bbox[0] + xo for c, xo in placed[ri]); rx1_bb = max(c.bbox[2] + xo for c, xo in placed[ri]) + bb_clear = snap_up(max(R.m1_sep, R.m2_sep, R.act_sep) + tap_w / 2 + 0.05) + rxc_L = min(snap(rx0_act - tg - tap_w / 2), snap(min(row_pins_x) - tap_clear), snap(rx0_bb - bb_clear)) + rxc_R = max(snap(rx1_act + tg + tap_w / 2), snap(max(row_pins_x) + tap_clear), snap(rx1_bb + bb_clear)) + for side, rxc in (("L", rxc_L), ("R", rxc_R)): + pin_y = snap(row_y[ri] + (ymax - ymin)) if ch == ri + 1 else snap(row_y[ri]) + vy = snap(pin_y - pad / 2) if ch == ri + 1 else snap(pin_y + pad / 2) + edge_y = snap(vy + pad / 2) if ch == ri + 1 else snap(vy - pad / 2) + pp = _PlacedPin(row.body_net, snap(row_x_shift[ri] + rxc), edge_y, pad, ri, ch, f"tap{side}", f"row{ri}", K(ch, row.body_net, ri)) + pins_g.append(pp) + tap_specs.append({"row": ri, "side": side, "rxc": rxc, "gy0": gy0, "gy1": gy1, "vy": vy, "pin_y": pin_y, "ch": ch, "pin": pp, + "rx0_act": rx0_act, "rx1_act": rx1_act, "tg": tg}) + + # ---------- 5. stub conflict check and row shifting (upper rows shift right) ---------- + def trunk_y(ch, net): + return snap(chan_y0[ch] + ch_margin + chan_tracks[ch][net] * track_pitch + trunk_w / 2) + def stub_span(pp): + ty = trunk_y(pp.channel, pp.k()) + return (min(pp.y, ty), max(pp.y, ty)) + def conflicts_for(pins): + out = [] + for i in range(len(pins)): + for j in range(i + 1, len(pins)): + a, b = pins[i], pins[j] + if a.channel != b.channel: continue + if a.net == b.net and a.k() != b.k(): + continue # split entities of one net: lower stub ends below the upper trunk entity, no overlap + if a.net == b.net: + # same net: vias on the same trunk must either coincide exactly or keep via spacing + dx = abs(a.x - b.x) + if dx > 1e-9 and dx + 1e-9 < R.via2_w + R.via2_sep: + out.append((a, b)) + continue + if abs(a.x - b.x) + 1e-9 >= min_dx: continue + sa, sb = stub_span(a), stub_span(b) + if sa[0] <= sb[1] + R.m2_sep and sb[0] <= sa[1] + R.m2_sep: + out.append((a, b)) + return out + # same-row conflicts cannot be fixed by shifting rows + for a, b in conflicts_for(pins_g): + if a.row == b.row: + raise AssemblyError(f"stub conflict inside row {a.row} between {a.cell}.{a.name} ({a.net}) and {b.cell}.{b.name} ({b.net}) at x={a.x},{b.x}") + # resolve cross-row conflicts row by row (from row 1 upwards) with the smallest |shift| that clears them + for ri in range(1, nrows): + lower = [pp for pp in pins_g if pp.row < ri]; mine = [pp for pp in pins_g if pp.row == ri] + def ok(shift): + moved = [_PlacedPin(pp.net, snap(pp.x + shift), pp.y, pp.width, pp.row, pp.channel, pp.name, pp.cell, pp.key) for pp in mine] + return not any(a.row != b.row for a, b in conflicts_for(lower + moved)) + chosen = None + step = 2 * GRID + span = max(8.0, sum(row_dims[r][0] for r in range(nrows)) + 4.0) + for k in range(0, int(span / step)): + for sgn in ((1,) if k == 0 else (1, -1)): + sh = snap(sgn * k * step) + if ok(sh): chosen = sh; break + if chosen is not None: break + if chosen is None: + raise AssemblyError(f"could not resolve stub conflicts for row {ri} by shifting") + if chosen != 0.0: + for pp in pins_g: + if pp.row == ri: pp.x = snap(pp.x + chosen) + row_x_shift[ri] = snap(row_x_shift[ri] + chosen) + # keep everything at x >= 0 + xmin_all = min(min(row_x_shift[ri] + min(c.bbox[0] + xo for c, xo in placed[ri]) for ri in range(nrows)), min(pp.x - pp.width for pp in pins_g)) + if xmin_all < 0: + d = snap_up(-xmin_all) + for pp in pins_g: pp.x = snap(pp.x + d) + for ri in range(nrows): row_x_shift[ri] = snap(row_x_shift[ri] + d) + + # verify the packed tracks against the final x shifts; repack and re-place when they overlap + net_x = compute_net_x(row_x_shift) + if tracks_valid(net_x, chan_tracks): + break + chan_tracks, chan_ntracks = pack_tracks(net_x) + chan_height = [ (chan_ntracks[ch] * track_pitch + 2 * ch_margin) if chan_tracks[ch] else 0.0 for ch in range(nrows + 1)] + else: + raise AssemblyError("track packing did not converge") + # ---------- 6. place cell geometry ---------- + for ri, items in enumerate(placed): + row = rows[ri]; width, ymin, ymax = row_dims[ri] + for c, xoff in items: + ref = comp << c.component + if row.flip: + ref.mirror_y() if hasattr(ref, "mirror_y") else ref.mirror((0, 0), (1, 0)) + ref.move((snap(row_x_shift[ri] + xoff), snap(row_y[ri] + ymax))) + else: + ref.move((snap(row_x_shift[ri] + xoff), snap(row_y[ri] - ymin))) + + # ---------- 7. trunks, stubs, vias ---------- + for pp in pins_g: + if not pp.name.startswith("tap"): + chan_nets[pp.channel].setdefault(pp.k(), []).append(pp) + tap_records = [] + for ts in tap_specs: + ri = ts["row"]; row = rows[ri]; pp = ts["pin"] + xc = snap(row_x_shift[ri] + ts["rxc"]); pp.x = xc + ty0, ty1 = ts["gy0"], ts["gy1"]; vy = ts["vy"]; pin_y = ts["pin_y"]; ch = ts["ch"] + rects.add(lay["tap"], xc - tap_w / 2, ty0, xc + tap_w / 2, ty1) + imp = R.pimp_layer if row.polarity == "n" else R.nimp_layer + ienc = R.pimp_enc_act if row.polarity == "n" else R.nimp_enc_act + if imp is not None: + rects.add(imp, xc - tap_w / 2 - ienc, ty0 - ienc, xc + tap_w / 2 + ienc, ty1 + ienc) + ncont = max(1, int(math.floor((ty1 - ty0 - 2 * R.act_enc_cont_tap - R.cont_w) / (R.cont_w + R.cont_sep) + 1e-9)) + 1) + hcol = ncont * R.cont_w + (ncont - 1) * R.cont_sep + cy = snap((ty0 + ty1 - hcol) / 2) + for k in range(ncont): + yy = snap(cy + k * (R.cont_w + R.cont_sep)) + rects.add(lay["cont"], xc - R.cont_w / 2, yy, xc + R.cont_w / 2, yy + R.cont_w) + m1w = R.m1_bar_w(); pad = R.via1_pad_w(); pm1 = R.via1_m1_w() + if ch == ri + 1: + rects.add(lay["met1"], xc - m1w / 2, cy - R.m1_enc_cont, xc + m1w / 2, vy) + else: + rects.add(lay["met1"], xc - m1w / 2, vy, xc + m1w / 2, cy + hcol + R.m1_enc_cont) + rects.add(lay["met1"], xc - pm1 / 2, vy - pm1 / 2, xc + pm1 / 2, vy + pm1 / 2) + rects.add(lay["via1"], xc - R.via1_w / 2, vy - R.via1_w / 2, xc + R.via1_w / 2, vy + R.via1_w / 2) + rects.add(lay["met2"], xc - pad / 2, vy - pad / 2, xc + pad / 2, vy + pad / 2) + chan_nets[ch].setdefault(pp.k(), []).append(pp) + tap_records.append({"row": ri, "side": ts["side"], "x": xc, "y0": ty0, "y1": ty1, "net": row.body_net, "contacts": ncont}) + # horizontal tie strip along the gate side of each MOS row, joined to the two end strips by metal-1 (U-shaped tie) + implant_bridges = [] + for ri, row in enumerate(rows): + if not (row.taps and row.body_net and row.polarity in ("n", "p")): continue + width, ymin, ymax = row_dims[ri] + taps_here = [t for t in tap_records if t["row"] == ri] + if len(taps_here) < 2: continue + xl = min(t["x"] for t in taps_here); xr = max(t["x"] for t in taps_here) + strip_local_y = snap(ymin + 0.1 + tap_w / 2) # local y of the strip centre (below the cells' bottom) + if not row.flip: gy = snap(row_y[ri] + (strip_local_y - ymin)) + else: gy = snap(row_y[ri] + (ymax - strip_local_y)) + y0s, y1s = snap(gy - tap_w / 2), snap(gy + tap_w / 2) + rects.add(lay["tap"], xl - tap_w / 2, y0s, xr + tap_w / 2, y1s) + imp = R.pimp_layer if row.polarity == "n" else R.nimp_layer + ienc = R.pimp_enc_act if row.polarity == "n" else R.nimp_enc_act + if imp is not None: rects.add(imp, xl - tap_w / 2 - ienc, y0s - ienc, xr + tap_w / 2 + ienc, y1s + ienc) + # when the implant of an end strip and the implant of the gate-side strip are closer than the implant + # spacing rule (happens when a row's cells have no bottom strap band, e.g. all gate straps on top), the two + # same-net implants are merged by a bridge over the end strip; layouts with a legal gap are unchanged. + if imp is not None: + for t in taps_here: + lo_gap = (y0s - ienc) - (t["y1"] + ienc); hi_gap = (t["y0"] - ienc) - (y1s + ienc) + for gap, yb0 in ((lo_gap, t["y1"] + ienc), (hi_gap, y1s + ienc)): + if 1e-9 < gap < R.imp_sep - 1e-9: + rects.add(imp, t["x"] - tap_w / 2 - ienc, snap(yb0), t["x"] + tap_w / 2 + ienc, snap(yb0 + gap)) + implant_bridges.append({"row": ri, "x": t["x"], "gap_um": round(gap, 4)}) + nc = max(1, int(math.floor((xr - xl - R.cont_w) / (R.cont_w + R.cont_sep) + 1e-9)) + 1) + cx0 = snap((xl + xr - (nc * R.cont_w + (nc - 1) * R.cont_sep)) / 2) + for k in range(nc): + xx = snap(cx0 + k * (R.cont_w + R.cont_sep)) + rects.add(lay["cont"], xx, gy - R.cont_w / 2, xx + R.cont_w, gy + R.cont_w / 2) + m1w = R.m1_bar_w() + rects.add(lay["met1"], xl - m1w / 2, gy - m1w / 2, xr + m1w / 2, gy + m1w / 2) + # extend the vertical strips' metal-1 to the horizontal strip + for t in taps_here: + ylo, yhi = (min(t["y0"], gy), max(t["y1"], gy)) + rects.add(lay["met1"], t["x"] - m1w / 2, ylo, t["x"] + m1w / 2, yhi) + t["y_strip"] = gy + tap_records.append({"row": ri, "side": "H", "x0": xl, "x1": xr, "y": gy, "net": row.body_net, "contacts": nc}) + # row blankets: well and implant over the whole row (including taps) + for ri, row in enumerate(rows): + if row.polarity not in ("n", "p"): continue + width, ymin, ymax = row_dims[ri] + acts = [c.active_bbox or c.bbox for c, _ in placed[ri]] + ay0 = min(a[1] for a in acts); ay1 = max(a[3] for a in acts) + if not row.flip: + gy0 = snap(row_y[ri] + (ay0 - ymin)); gy1 = snap(row_y[ri] + (ay1 - ymin)) + else: + gy0 = snap(row_y[ri] + (ymax - ay1)); gy1 = snap(row_y[ri] + (ymax - ay0)) + ax0_act = snap(row_x_shift[ri] + min((c.active_bbox or c.bbox)[0] + xo for c, xo in placed[ri])) + ax1_act = snap(row_x_shift[ri] + max((c.active_bbox or c.bbox)[2] + xo for c, xo in placed[ri])) + taps_here = [t for t in tap_records if t["row"] == ri and t["side"] != "H"] + hstrips = [t for t in tap_records if t["row"] == ri and t["side"] == "H"] + if row.polarity == "p": + wenc = R.nwell_enc_pact; tenc = R.nwell_enc_ntap + x0 = min([ax0_act - wenc] + [t["x"] - tap_w / 2 - tenc for t in taps_here]); x1 = max([ax1_act + wenc] + [t["x"] + tap_w / 2 + tenc for t in taps_here]) + y0 = min([gy0 - wenc] + [t["y0"] - tenc for t in taps_here] + [t["y"] - tap_w / 2 - tenc for t in hstrips]); y1 = max([gy1 + wenc] + [t["y1"] + tenc for t in taps_here] + [t["y"] + tap_w / 2 + tenc for t in hstrips]) + rects.add(R.nwell_layer, snap(x0), snap(y0), snap(x1), snap(y1)) + penc = max(R.pimp_enc_act, R.pimp_enc_gate) + rects.add(R.pimp_layer, snap(ax0_act - penc), snap(gy0 - penc), snap(ax1_act + penc), snap(gy1 + penc)) + else: + if R.nimp_layer is not None: + nenc = R.nimp_enc_act + rects.add(R.nimp_layer, snap(ax0_act - nenc), snap(gy0 - nenc), snap(ax1_act + nenc), snap(gy1 + nenc)) + + # risers for nets present in several channels + net_channels = {}; net_ents = {} + for ch in range(nrows + 1): + for key, pl in chan_nets[ch].items(): + if pl: + net_channels.setdefault(ORIG(key), []).append(ch); net_ents.setdefault(ORIG(key), []).append((ch, key)) + multi = sorted([n for n, ents in net_ents.items() if len(ents) > 1], key=lambda n: (order_hint.get(n, 10 ** 6), n)) + x_all_max = max([pp.x + pp.width / 2 for pp in pins_g] + [snap(row_x_shift[ri] + row_dims[ri][0] + tap_extent[ri]) for ri in range(nrows)]) + riser_pitch = snap_up(max(stub_w, via2_m2_pad) + R.m2_sep) + riser_x = {} + for k, net in enumerate(multi): + riser_x[net] = snap(x_all_max + ch_margin + via2_m2_pad / 2 + k * riser_pitch) + trunks = []; wire_len = 0.0; n_via2 = 0 + for ch in range(nrows + 1): + for key, pl in chan_nets[ch].items(): + if not pl: continue + net = ORIG(key) + ty = trunk_y(ch, key) + xs = [pp.x for pp in pl] + x0 = min(xs) - trunk_w / 2; x1 = max(xs) + trunk_w / 2 + if net in riser_x: + x1 = max(x1, riser_x[net] + via2_m2_pad / 2) + if x1 - x0 < trunk_w: x1 = x0 + trunk_w + rects.add(lay["met3"], x0, ty - trunk_w / 2, x1, ty + trunk_w / 2) + trunks.append({"channel": ch, "net": net, "key": key, "y": ty, "x0": snap(x0), "x1": snap(x1)}) + wire_len += (x1 - x0) + # same-net via pads that are closer than the metal spacing are bridged (one merged met2 strip) + xs_sorted = sorted(set(pp.x for pp in pl)) + for xa, xb in zip(xs_sorted, xs_sorted[1:]): + if xb - xa < via2_m2_pad + R.m2_sep + 1e-9: + rects.add(lay["met2"], xa, ty - via2_m2_pad / 2, xb, ty + via2_m2_pad / 2) + for pp in pl: + # stub from pin edge to trunk + y_lo, y_hi = min(pp.y, ty), max(pp.y, ty) + rects.add(lay["met2"], pp.x - stub_w / 2, y_lo, pp.x + stub_w / 2, y_hi) + wire_len += (y_hi - y_lo) + rects.add(lay["met2"], pp.x - via2_m2_pad / 2, ty - via2_m2_pad / 2, pp.x + via2_m2_pad / 2, ty + via2_m2_pad / 2) + rects.add(lay["via2"], pp.x - R.via2_w / 2, ty - R.via2_w / 2, pp.x + R.via2_w / 2, ty + R.via2_w / 2) + n_via2 += 1 + for net, rx in riser_x.items(): + ys = [trunk_y(ch, key) for ch, key in net_ents[net]] + rects.add(lay["met2"], rx - stub_w / 2, min(ys), rx + stub_w / 2, max(ys)) + wire_len += (max(ys) - min(ys)) + for ty in ys: + rects.add(lay["met2"], rx - via2_m2_pad / 2, ty - via2_m2_pad / 2, rx + via2_m2_pad / 2, ty + via2_m2_pad / 2) + rects.add(lay["via2"], rx - R.via2_w / 2, ty - R.via2_w / 2, rx + R.via2_w / 2, ty + R.via2_w / 2) + n_via2 += 1 + + # ---------- 8. labels for external ports ---------- + label_records = [] + missing = [p for p in ports if p not in net_channels] + if missing: + raise AssemblyError(f"port nets without any pin: {missing}") + for net in ports: + ch = net_channels[net][0] + tr = next(t for t in trunks if t["channel"] == ch and t["net"] == net) + lx = snap((tr["x0"] + tr["x1"]) / 2); ly_ = tr["y"] + if lay.get("met3_label") is not None: + comp.add_label(text=net, position=(lx, ly_), layer=lay["met3_label"]) + if lay.get("met3_pin") is not None and lay.get("met3_pin") != lay.get("met3_label"): + rects.add(lay["met3_pin"], lx - trunk_w / 2, ly_ - trunk_w / 2, lx + trunk_w / 2, ly_ + trunk_w / 2) + # drawing-layer text too (magic attaches text to the paint under it) + comp.add_label(text=net, position=(lx, ly_), layer=lay["met3"]) + label_records.append({"net": net, "x": lx, "y": ly_, "layer": "met3"}) + comp.add_port(name=net, center=(lx, ly_), width=trunk_w, orientation=0, layer=lay["met3"]) + + for layer, rl in rects.r.items(): + for (x0, y0, x1, y1) in rl: + comp.add_polygon([(x0, y0), (x1, y0), (x1, y1), (x0, y1)], layer=layer) + bb = comp.bbox + bbox = (snap(bb[0][0]), snap(bb[0][1]), snap(bb[1][0]), snap(bb[1][1])) + stats = {"bbox": bbox, "width": snap(bbox[2] - bbox[0]), "height": snap(bbox[3] - bbox[1]), + "area_um2": round((bbox[2] - bbox[0]) * (bbox[3] - bbox[1]), 4), "wire_length_um": round(wire_len, 3), + "n_via2": n_via2, "n_trunks": len(trunks), "n_risers": len(riser_x), "channels": chan_height, "rows": nrows, + "row_x_shift": row_x_shift, "tap_records": tap_records, "track_pitch": track_pitch, "trunk_w": trunk_w, + "split_trunks": sorted(f"{ch}:{n}" for ch, n in split_set), + "row_dims": [{"kind": rows[ri].polarity, "width": snap(row_dims[ri][0]), "height": snap(row_dims[ri][2] - row_dims[ri][1]), + "tap_extent": tap_extent[ri], "x_shift": row_x_shift[ri], "y": row_y[ri], + "cells": [{"name": c.name, "w": snap(c.bbox[2] - c.bbox[0]), "h": snap(c.bbox[3] - c.bbox[1])} for c, _ in placed[ri]]} for ri in range(nrows)], + "channel_heights": chan_height, "channel_margin": ch_margin, "implant_bridges": implant_bridges, + # bookkeeping for the plan-level cost rule (no effect on geometry): which nets each cell / tap strip brings + # into each channel, under the shared (unsplit) channel strategy + "channel_net_sources": _channel_net_sources(rows)} + # self-check: met2 / met3 spacing between shapes (any net) using klayout regions + try: + import klayout.db as kdb + viol = {} + for lname, sep in (("met2", R.m2_sep), ("met3", R.m3_sep), ("met1", R.m1_sep)): + reg = kdb.Region() + for (x0, y0, x1, y1) in rects.r.get(tuple(lay[lname]), []): + reg.insert(kdb.Box(int(round(x0 * 1000)), int(round(y0 * 1000)), int(round(x1 * 1000)), int(round(y1 * 1000)))) + reg.merge() + ep = reg.space_check(int(round(sep * 1000))) + viol[lname] = [[e.first.p1.x / 1000, e.first.p1.y / 1000, e.second.p1.x / 1000, e.second.p1.y / 1000] for e in ep.each()][:10] + stats["self_check_spacing"] = {k: v for k, v in viol.items() if v} + except Exception as e: + stats["self_check_spacing"] = {"error": str(e)} + comp.info["assembly_stats"] = stats + # flatten: the DUT is delivered as a single flat cell (hierarchy-free GDS for extraction and review) + try: + flat = comp.flatten() + flat.name = name + flat.unlock() if hasattr(flat, 'unlock') else None + for k, v in comp.info.items(): flat.info[k] = v + for pname, port in comp.ports.items(): + if pname not in flat.ports: flat.add_port(name=pname, port=port) + comp = flat + except Exception as e: + stats["flatten_error"] = repr(e) + return {"component": comp, "stats": stats, "trunks": trunks, "labels": label_records, "pins": [pp.__dict__ for pp in pins_g]} diff --git a/benchmarks/textbook_sharing/textbook_sharing/assembly/passives.py b/benchmarks/textbook_sharing/textbook_sharing/assembly/passives.py new file mode 100644 index 00000000..d427f50d --- /dev/null +++ b/benchmarks/textbook_sharing/textbook_sharing/assembly/passives.py @@ -0,0 +1,195 @@ +"""Passive pin cells: PDK poly resistors (and later MIM capacitors) as textbook_sharing.assembly PinCells. + +Resistor devices (one per PDK, chosen because each PDK's LVS deck and ngspice models support them): + sky130 sky130_fd_pr__res_high_po_0p35 W fixed 0.35 um, Rs ~ 320 ohm/sq layers poly(66/20)+poly_res(66/13)+rpm(86/20)+psdm(94/20) + gf180 ppolyf_u Rs ~ 315 ohm/sq (p+ unsalicided) layers poly2(30/0)+pplus(31/0)+sab(49/0)+res_mk(110/5) + ihp130 rppd Rs 260 ohm/sq layers gatpoly(5/0)+psd(14/0)+salblock(28/0)+polyres(128/0)+extblock(111/0) +The body is a single straight poly strip of width w and length l (between the two contact heads); the heads carry +contact arrays and a metal-1 pad, lifted with via1 to a met2 pin on the top edge. Series segments (m) are not used. +""" +from __future__ import annotations +import math +from .pincell import PinCell, Pin +from glayout.sharing.rules import snap, snap_up + +RES = { + "sky130": {"model": "sky130_fd_pr__res_high_po_0p35", "w_fixed": 0.35, "rsh": 319.8, "poly": (66, 20), "markers": [(66, 13), (86, 20), (94, 20)], + "marker_enc": {"(66, 13)": 0.0, "(86, 20)": 0.2, "(94, 20)": 0.125}, "head_sep": 0.0, "cont": (66, 44), "cont_w": 0.17, "cont_sp": 0.17, "poly_enc_cont": 0.08, + "met1": (67, 20), "m1_enc_cont": 0.08, "via1": (67, 44), "via1_w": 0.17, "m1_enc_via1": 0.0, "met2": (68, 20), "m2_enc_via1": 0.06, "m2_w": 0.14, "terminals": 3, "min_l": 0.5, "slot_contact": 0.19, "sab_to_cont": 0.0}, + "gf180": {"model": "ppolyf_u", "w_fixed": None, "rsh": 315.0, "poly": (30, 0), "markers": [(31, 0), (49, 0), (110, 5)], + "marker_enc": {"(31, 0)": 0.3, "(49, 0)": 0.28, "(110, 5)": 0.0}, "head_sep": 0.0, "cont": (33, 0), "cont_w": 0.22, "cont_sp": 0.28, "poly_enc_cont": 0.07, + "met1": (34, 0), "m1_enc_cont": 0.12, "via1": (35, 0), "via1_w": 0.26, "m1_enc_via1": 0.12, "met2": (36, 0), "m2_enc_via1": 0.12, "m2_w": 0.28, "terminals": 3, "min_l": 1.0, "sab_to_cont": 0.28}, + "ihp130": {"model": "rppd", "w_fixed": None, "rsh": 260.0, "poly": (5, 0), "markers": [(14, 0), (28, 0), (128, 0), (111, 0)], + "marker_enc": {"(14, 0)": 0.18, "(28, 0)": 0.2, "(128, 0)": 0.0, "(111, 0)": 0.31}, "head_sep": 0.0, "cont": (6, 0), "cont_w": 0.16, "cont_sp": 0.18, "poly_enc_cont": 0.07, + "met1": (8, 0), "m1_enc_cont": 0.05, "via1": (19, 0), "via1_w": 0.19, "m1_enc_via1": 0.05, "met2": (10, 0), "m2_enc_via1": 0.05, "m2_w": 0.2, "terminals": 2, "min_l": 0.5, "sab_to_cont": 0.2}, +} + + +# R(l) = a*l + b fitted from two schematic simulations per PDK at the width given (calibrate_res.py, data/res_calibration.json) +CALIB = {"sky130": {"w": 0.35, "a": 1104.2757, "b": 623.2853}, "gf180": {"w": 1.0, "a": 368.7439, "b": 126.0623}, "ihp130": {"w": 1.0, "a": 257.1089, "b": 74.5953}} + + +def resistor_geometry(pdk_name: str, r_ohm: float, w: float | None = None, max_l: float = 60.0): + """Choose (w, l) for the requested resistance from the calibrated model R = a*l + b (at the calibration width).""" + t = RES[pdk_name]; c = CALIB[pdk_name] + w = t["w_fixed"] or c["w"] + l = snap_up(max(t["min_l"], (r_ohm - c["b"]) / c["a"])) + return w, min(l, max_l) + + +def resistor_pincell(pdk, name: str, net_p: str, net_n: str, r_ohm: float, body_net: str = "VSS", w: float | None = None) -> PinCell: + """Build the resistor as a flat set of rectangles in a Component. Body horizontal along x.""" + from glayout.backend import Component + t = RES[pdk.name]; w, l = resistor_geometry(pdk.name, r_ohm, w) + comp = Component(name) + rects = [] + def add(layer, x0, y0, x1, y1): + rects.append((tuple(layer), snap(x0), snap(y0), snap(x1), snap(y1))) + # body between x=0 and x=l, y in [0,w]; heads beyond + cw, csp = t["cont_w"], t["cont_sp"] + head_len = snap_up(t.get("sab_to_cont", 0.2) + cw + t["poly_enc_cont"]) # salicide-block/marker edge to contact + enclosure + ncont = max(1, int(math.floor((w - 2 * t["poly_enc_cont"] - cw) / (cw + csp) + 1e-9)) + 1) + while ncont > 1 and ncont * cw + (ncont - 1) * csp > w - 2 * t["poly_enc_cont"] + 1e-9: ncont -= 1 + hcol = ncont * cw + (ncont - 1) * csp; y0c = snap((w - hcol) / 2) + add(t["poly"], -head_len, 0, l + head_len, w) + for key in t["markers"]: + enc = t["marker_enc"][str(key)] + if key == (94, 20) or key == (31, 0) or key == (14, 0): # implant: covers heads too + add(key, -head_len - enc, -enc, l + head_len + enc, w + enc) + else: # resistor body markers (res id / salicide block): body only + add(key, 0 - (enc if key in ((86, 20),) else 0), -enc, l + (enc if key in ((86, 20),) else 0), w + enc) + pins = [] + m1w = snap_up(max(cw + 2 * t["m1_enc_cont"], t["via1_w"] + 2 * t["m1_enc_via1"])) + pad = snap_up(max(t["m2_w"], t["via1_w"] + 2 * t["m2_enc_via1"])) + slot = t.get("slot_contact") + for side, net, xc in (("P", net_p, -(t.get("sab_to_cont", 0.2) + (slot or cw) / 2)), ("N", net_n, l + t.get("sab_to_cont", 0.2) + (slot or cw) / 2)): + if slot: # one contact slot spanning the full resistor width (sky130 licon.1b) + add(t["cont"], xc - slot / 2, 0, xc + slot / 2, w) + m1w = snap_up(max(slot + 2 * t["m1_enc_cont"], t["via1_w"] + 2 * t["m1_enc_via1"])) + y0c = 0.0 + else: + for c in range(ncont): + yy = snap(y0c + c * (cw + csp)) + add(t["cont"], xc - cw / 2, yy, xc + cw / 2, yy + cw) + ytop = snap(w + 0.3) + add(t["met1"], xc - m1w / 2, y0c - t["m1_enc_cont"], xc + m1w / 2, ytop + m1w / 2) + add(t["via1"], xc - t["via1_w"] / 2, ytop - t["via1_w"] / 2, xc + t["via1_w"] / 2, ytop + t["via1_w"] / 2) + add(t["met2"], xc - pad / 2, ytop - pad / 2, xc + pad / 2, ytop + pad / 2) + pname = f"r{side}" + comp.add_port(name=pname, center=(snap(xc), snap(ytop + pad / 2)), width=pad, orientation=90, layer=t["met2"]) + pins.append(Pin(pname, net, snap(xc), snap(ytop + pad / 2), "top", pad, t["met2"], [f"{name}:{side}"])) + if pdk.name == "sky130": + # NPC (95/20) must enclose the resistor body (rpm.5, 0.095) and the poly head contacts (0.10); one rectangle over the whole poly + add((95, 20), -head_len - 0.1, -0.1, l + head_len + 0.1, w + 0.1) + for (layer, x0, y0, x1, y1) in rects: + comp.add_polygon([(x0, y0), (x1, y0), (x1, y1), (x0, y1)], layer=layer) + xs0 = min(r[1] for r in rects); ys0 = min(r[2] for r in rects); xs1 = max(r[3] for r in rects); ys1 = max(r[4] for r in rects) + comp.info["pin_meta"] = {p.name: {"side": "top", "x": p.x, "y": p.y, "width": p.width, "net": p.net, "terminals": p.terminals} for p in pins} + return PinCell(name, comp, pins, "passive", (xs0, ys0, xs1, ys1), active_bbox=None, body_net=body_net, info={"device": "resistor", "model": t["model"], "w": w, "l": l, "r_ohm_nominal": r_ohm, "rsh": t["rsh"]}) + + +def resistor_spice_line(pdk_name: str, name: str, p: str, n: str, body: str, w: float, l: float, lvs: bool = False) -> str: + """Simulation form (X-subckt) or LVS form (gf180 deck reads resistors as R elements with the model name).""" + t = RES[pdk_name] + if pdk_name == "sky130": + return f"XR{name} {p} {n} {body} {t['model']} l={l:g} mult=1" + if pdk_name == "gf180": + return (f"R{name} {p} {n} {body} {t['model']} L={l:g}u W={w:g}u" if lvs else f"XR{name} {p} {n} {body} {t['model']} r_width={w:g}u r_length={l:g}u") + return f"XR{name} {p} {n} {t['model']} w={w:g}u l={l:g}u m=1" + + +# ---------------------------------------------------------------------------------------------------------------- +# MIM capacitors. Layer stacks (foundry layer numbers), plates and the via stack down to the generic met2 pin level. +# sky130 cap_mim_m3_1 : bottom met3 (70/20), top capm (89/44), via3 (70/44) on capm to met4 (71/20); generic: met4=met3, met5=met4 +# gf180 cap_mim_2f0fF (option B): bottom metal4 (46/0), top fusetop (75/0), via4 (41/0) to metal5 (81/0); markers cap_mk (117/5), mim_l_mk (117/10) +# ihp130 cap_cmim : bottom metal5 (67/0), mim (36/0), vmim (129/0) to topmetal1 (126/0) +# Capacitance densities (model): sky130 2.0 fF/um^2, gf180 2.0 fF/um^2, ihp 1.5 fF/um^2 (nominal; the model computes the value from w,l). +MIM = { + # bot/top: bottom plate metal and MIM dielectric (top plate) layers; topvia: via on the top plate to topmet; + # colvia: ordinary via from topmet down to the bottom-plate metal level used at the lead columns (IHP needs TopVia1, + # not the MIM via); stack_down: (from, via, to, via_w, enc_from, enc_to) down to the generic met2 pin level. + # lead_h: lead/pad height at the plate metal levels (SKY130 > 3 um so that the deck's "huge metal" spacing rule + # m3.3/m4.5 does not fire on a narrow stub attached to the plate); lead_gap: clearance between the plate and the + # top-plate lead column at the bottom-plate metal level (GF180 MIMTM.1: 1.2 um); pad_min: min pad side (metal area). + "sky130": {"model": "sky130_fd_pr__cap_mim_m3_1", "cdens": 2.0e-15, "bot": (70, 20), "top": (89, 44), "topvia": (70, 44), "topmet": (71, 20), "markers": [], + "bot_enc_top": 0.2, "top_enc_via": 0.14, "topvia_w": 0.2, "topvia_sp": 0.2, "topmet_enc_via": 0.065, "min_side": 1.0, + "colvia": (70, 44), "colvia_w": 0.2, "colvia_enc_top": 0.065, "colvia_enc_bot": 0.09, "lead_h": 3.2, "lead_gap": 0.5, "pad_min": 0.65, + "stack_down": [((70, 20), (69, 44), (69, 20), 0.2, 0.085, 0.085), ((69, 20), (68, 44), (68, 20), 0.15, 0.085, 0.085)], "pin_layer": (68, 20), "pin_w": 0.3}, + # gf180 sim model: legacy 2 fF/um^2 subcircuit cap_mim_2f0fF (the cap_mim_new section fails to parse in ngspice 44: "Syntax error: letter [$]"); lvs_model: KLayout runset class + "gf180": {"model": "cap_mim_2f0fF", "lvs_model": "cap_mim_2f0_m4m5_noshield", "cdens": 2.0e-15, "bot": (46, 0), "top": (75, 0), "topvia": (41, 0), "topmet": (81, 0), "markers": [(117, 5), (117, 10)], + "bot_enc_top": 0.6, "top_enc_via": 0.4, "topvia_w": 0.26, "topvia_sp": 0.5, "topmet_enc_via": 0.12, "min_side": 5.0, + "colvia": (41, 0), "colvia_w": 0.26, "colvia_enc_top": 0.12, "colvia_enc_bot": 0.12, "lead_h": 1.0, "lead_gap": 1.3, "pad_min": 0.5, + "stack_down": [((46, 0), (40, 0), (42, 0), 0.26, 0.12, 0.12), ((42, 0), (38, 0), (36, 0), 0.26, 0.12, 0.12)], "pin_layer": (36, 0), "pin_w": 0.5}, + "ihp130": {"model": "cap_cmim", "cdens": 1.5e-15, "bot": (67, 0), "top": (36, 0), "topvia": (129, 0), "topmet": (126, 0), "markers": [], + "bot_enc_top": 0.6, "top_enc_via": 0.3, "topvia_w": 0.42, "topvia_sp": 0.42, "topmet_enc_via": 0.42, "min_side": 1.14, + "colvia": (125, 0), "colvia_w": 0.42, "colvia_enc_top": 0.42, "colvia_enc_bot": 0.42, "lead_h": 1.7, "lead_gap": 0.5, "pad_min": 0.4, + "stack_down": [((67, 0), (66, 0), (50, 0), 0.19, 0.065, 0.065), ((50, 0), (49, 0), (30, 0), 0.19, 0.065, 0.065), ((30, 0), (29, 0), (10, 0), 0.19, 0.065, 0.065)], "pin_layer": (10, 0), "pin_w": 0.3}, +} + + +def mim_geometry(pdk_name: str, c_farad: float): + t = MIM[pdk_name]; side = snap_up(max(t["min_side"], math.sqrt(c_farad / t["cdens"]))) # cdens is F per um^2 -> side in um + return side, side + + +def mimcap_pincell(pdk, name: str, net_top: str, net_bot: str, c_farad: float) -> PinCell: + """Square MIM capacitor. The top plate is contacted by a sea of top-plate vias to the top metal, which leads to a + column at the LEFT of the plate; the bottom plate leads to a column at the RIGHT. Both columns stack down to the + generic met2 pin level, where a short strip to the cell top makes the two pins (cT = top plate, cB = bottom plate).""" + from glayout.backend import Component + t = MIM[pdk.name]; w, l = mim_geometry(pdk.name, c_farad) + comp = Component(name); rects = [] + def add(layer, x0, y0, x1, y1): rects.append((tuple(layer), snap(x0), snap(y0), snap(x1), snap(y1))) + e = t["bot_enc_top"]; lead_h = t["lead_h"]; yc = snap(l / 2) + add(t["bot"], -e, -e, w + e, l + e) # bottom plate + add(t["top"], 0, 0, w, l) # top plate (dielectric capacitor layer) + for mk in t["markers"]: add(mk, -e, -e, w + e, l + e) + # sea of vias on the top plate -> top metal + vw, vs, ve = t["topvia_w"], t["topvia_sp"], t["top_enc_via"] + n = max(1, int((w - 2 * ve + vs) // (vw + vs))) + pitch = vw + vs; x0 = snap((w - (n * vw + (n - 1) * vs)) / 2) + for i in range(n): + for j in range(n): + add(t["topvia"], x0 + i * pitch, x0 + j * pitch, x0 + i * pitch + vw, x0 + j * pitch + vw) + tm = t["topmet_enc_via"] + add(t["topmet"], x0 - tm, x0 - tm, w - x0 + tm, l - x0 + tm) + # column positions + cw = t["colvia_w"]; pad_bot = max(t["pad_min"], cw + 2 * t["colvia_enc_bot"]); pad_top = max(lead_h, cw + 2 * t["colvia_enc_top"]) + xL = snap(-(e + t["lead_gap"] + max(pad_bot, pad_top) / 2)); xR = snap(w + e + 0.3 + max(pad_bot, pad_top) / 2) + # LEFT column (top plate): top-metal lead from the via sea to the column, pad, column via, bottom-metal pad, stack down + add(t["topmet"], xL - pad_top / 2, yc - lead_h / 2, x0 - tm + 0.1, yc + lead_h / 2) + add(t["topmet"], xL - pad_top / 2, yc - pad_top / 2, xL + pad_top / 2, yc + pad_top / 2) + add(t["colvia"], xL - cw / 2, yc - cw / 2, xL + cw / 2, yc + cw / 2) + add(t["bot"], xL - pad_bot / 2, yc - pad_bot / 2, xL + pad_bot / 2, yc + pad_bot / 2) + # RIGHT column (bottom plate): bottom-metal lead attached to the plate, pad, stack down + add(t["bot"], w + e - 0.1, yc - lead_h / 2, xR + pad_bot / 2, yc + lead_h / 2) + add(t["bot"], xR - pad_bot / 2, yc - max(pad_bot, lead_h) / 2, xR + pad_bot / 2, yc + max(pad_bot, lead_h) / 2) + def stack(xc): + for (frm, via, to, vw2, ef, et) in t["stack_down"]: + pf = max(t["pad_min"], vw2 + 2 * ef); pt = max(t["pad_min"], vw2 + 2 * et) + add(frm, xc - pf / 2, yc - pf / 2, xc + pf / 2, yc + pf / 2) + add(via, xc - vw2 / 2, yc - vw2 / 2, xc + vw2 / 2, yc + vw2 / 2) + add(to, xc - pt / 2, yc - pt / 2, xc + pt / 2, yc + pt / 2) + stack(xL); stack(xR) + pins = [] + pw = t["pin_w"]; ytop = snap(l + e + 0.6) + for pname, xc, net in (("cT", xL, net_top), ("cB", xR, net_bot)): + add(t["pin_layer"], xc - pw / 2, yc, xc + pw / 2, ytop) + comp.add_port(name=pname, center=(snap(xc), ytop), width=pw, orientation=90, layer=t["pin_layer"]) + pins.append(Pin(pname, net, snap(xc), ytop, "top", pw, t["pin_layer"], [f"{name}:{pname}"])) + for (layer, x0_, y0_, x1_, y1_) in rects: + comp.add_polygon([(x0_, y0_), (x1_, y0_), (x1_, y1_), (x0_, y1_)], layer=layer) + xs0 = min(r[1] for r in rects); ys0 = min(r[2] for r in rects); xs1 = max(r[3] for r in rects); ys1 = max(r[4] for r in rects) + comp.info["pin_meta"] = {p.name: {"side": "top", "x": p.x, "y": p.y, "width": p.width, "net": p.net, "terminals": p.terminals} for p in pins} + return PinCell(name, comp, pins, "passive", (xs0, ys0, xs1, ys1), active_bbox=None, body_net=None, info={"device": "mimcap", "model": t["model"], "w": w, "l": l, "c_nominal": c_farad}) + + +def mimcap_spice_line(pdk_name: str, name: str, top: str, bot: str, w: float, l: float, lvs: bool = False) -> str: + t = MIM[pdk_name] + if pdk_name == "sky130": + return f"XC{name} {top} {bot} {t['model']} w={w:g} l={l:g}" + if pdk_name == "gf180": + # KLayout's gf180 runset extracts MIM caps as device class cap_mim_2f0_m4m5_noshield compared on A and P, which its + # schematic reader (SubcircuitModelsReader in custom_classes.lvs) derives from W and L of a 'C' element + return (f"C{name} {top} {bot} {t['lvs_model']} W={w:g}u L={l:g}u" if lvs else f"XC{name} {top} {bot} {t['model']} c_width={w:g}u c_length={l:g}u") + return f"XC{name} {top} {bot} {t['model']} w={w:g}u l={l:g}u" diff --git a/benchmarks/textbook_sharing/textbook_sharing/assembly/pincell.py b/benchmarks/textbook_sharing/textbook_sharing/assembly/pincell.py new file mode 100644 index 00000000..0e08f086 --- /dev/null +++ b/benchmarks/textbook_sharing/textbook_sharing/assembly/pincell.py @@ -0,0 +1,32 @@ +from __future__ import annotations +from dataclasses import dataclass, field +from typing import Literal + + +@dataclass +class Pin: + name: str + net: str + x: float # local coordinates of the cell + y: float # edge position (top edge y for side 'top', bottom edge y for 'bottom') + side: Literal["top", "bottom"] + width: float + layer: tuple # met2 layer tuple + terminals: list = field(default_factory=list) + + +@dataclass +class PinCell: + name: str + component: object # Component in local coordinates + pins: list # list[Pin] + polarity: Literal["n", "p", "passive"] + bbox: tuple # (x0,y0,x1,y1) in local coordinates + active_bbox: tuple | None = None # extent of diffusion (for tap spacing) + well_bbox: tuple | None = None # extent of the cell's own nwell (p cells) + implant_bbox: tuple | None = None + body_net: str | None = None + info: dict = field(default_factory=dict) + + def pins_on(self, side): + return [p for p in self.pins if p.side == side] diff --git a/benchmarks/textbook_sharing/textbook_sharing/build_cases.py b/benchmarks/textbook_sharing/textbook_sharing/build_cases.py new file mode 100644 index 00000000..d965cbb4 --- /dev/null +++ b/benchmarks/textbook_sharing/textbook_sharing/build_cases.py @@ -0,0 +1,125 @@ +"""Build the requested case set (18 topologies x 3 PDKs x 12 size points = 648 requests). + +For every request: derive sizes (grid.derive_sizing) -> parameter-illegal? -> duplicate signature? -> schematic +pre-simulation (mirrors: pass 1 finds the compliance voltage, the test point is frozen, pass 2 measures at it) -> +qualification + frozen spec (qualify.py) -> case directory data/cases////. +The nominal design point of every topology and PDK is read from data/nominal//.json. Every request (including +illegal ones) is recorded in /case_build.json, which the count ledger reads. +No layout is built here. usage: python -m textbook_sharing.build_cases [--circuits C01,..] [--pdks ..] [--jobs 12] +""" +from __future__ import annotations +import json, copy, time, argparse, hashlib +from pathlib import Path +from multiprocessing import Pool + +from textbook_sharing.circuits import CIRCUITS, ORDER +from textbook_sharing.cases import CaseSpec, PDK_POINT +from textbook_sharing.nominal import nominal +from textbook_sharing.presim import presim +from textbook_sharing.testbench import CATEGORY, make_testbench +from textbook_sharing.netlist import emit_subckt +from textbook_sharing.grid import GRID, size_tag, derive_sizing, signature +TB_RULE = hashlib.sha256(open(Path(__file__).with_name("testbench.py"), "rb").read()).hexdigest()[:16] # identity of the testbench generator +from textbook_sharing.qualify import floors_for, qualify_and_freeze, mirror_test_point +from textbook_sharing import overrides +from textbook_sharing import paths + +OUT = paths.CASES +PDKS = ["sky130", "gf180", "ihp130"] + + +def nominal_point(cid, pdk): + """Nominal design point (sizing, supply, bias, load, notes) of a topology and PDK.""" + return json.load(open(paths.NOMINAL / cid / f"{pdk}.json")) + + +def target_of(category, case, vdd): + if category in ("single",): return None # servo sets V_in = V_out; no separate target + if category in ("ota", "twostage"): return case.load.get("vout_target", vdd / 2) + if category == "buffer_ab": return case.load.get("vout_target", vdd / 2) + return None + + +def build_one(job): + cid, pdk = job + circ = CIRCUITS[cid]; cat = CATEGORY[cid]; vdd = PDK_POINT[pdk]["vdd"] + c0 = nominal_point(cid, pdk); nom = nominal(cid, pdk) + base_sizing, base_bias, base_load, ov_notes = overrides.apply(cid, pdk, c0["sizing"], c0["bias"], c0["load"]) + floors = floors_for(cid, nom.specs, vdd) + results = []; seen = {} + for sw, sl in GRID: + tag = size_tag(sw, sl) + rec = {"case_id": f"{cid}_{pdk}_{tag}", "circuit_id": cid, "pdk": pdk, "size": tag, "sW": sw, "sL": sl, "category": cat} + sizing, drec = derive_sizing(base_sizing, pdk, sw, sl) + rec["derivation"] = drec + if sizing is None: + rec["stage"] = "parameter_illegal"; results.append(rec); continue + sig = signature(circ, pdk, sizing); rec["signature"] = sig + if sig in seen: + rec["stage"] = "duplicate"; rec["duplicate_of"] = seen[sig]; results.append(rec); continue + seen[sig] = rec["case_id"] + d = OUT / cid / pdk / tag + if (d / "qualification.json").exists() and (d / "manifest.json").exists(): + old = json.load(open(d / "qualification.json")) # resume: this request was completed earlier + if old.get("signature") == sig and old.get("testbench_rule") == TB_RULE: + results.append(old); continue + case = CaseSpec(rec["case_id"], cid, pdk, tag, sizing, dict(c0["supply"]), copy.deepcopy(base_bias), copy.deepcopy(base_load), {}, list(c0.get("notes", [])) + ov_notes) + d = OUT / cid / pdk / tag; d.mkdir(parents=True, exist_ok=True) + t0 = time.time() + if cat == "mirror": + case.load["vout_test"] = case.load.get("vout_nom", vdd / 2) + p1 = presim(pdk, circ, case, d / "presim_pass1", dut_name=rec["case_id"]) + vt = mirror_test_point(p1["measures"].get("vmin"), vdd) + rec["mirror_pass1"] = {"vmin": p1["measures"].get("vmin"), "status": p1["sim"]["status"], "vout_test": vt} + if vt is None: + q = {"qualified": False, "reasons": [f"compliance voltage not found in the schematic sweep (vmin={p1['measures'].get('vmin')})"], "spec": {}} + pre = p1 + else: + case.load["vout_test"] = vt + pre = presim(pdk, circ, case, d / "presim", dut_name=rec["case_id"]) + q = qualify_and_freeze(cat, floors, pre["measures"], pre["sim"]["status"], vdd) + else: + pre = presim(pdk, circ, case, d / "presim", dut_name=rec["case_id"]) + q = qualify_and_freeze(cat, floors, pre["measures"], pre["sim"]["status"], vdd, target_of(cat, case, vdd)) + case.specs = q["spec"] + rec.update({"stage": "qualified" if q["qualified"] else "schematic_not_qualified", "qualification": q, "presim_status": pre["sim"]["status"], + "presim_errors": pre["sim"].get("errors", [])[:3], "schematic_measures": pre["measures"], "presim_s": round(time.time() - t0, 1)}) + # case files (evaluator side) + name = rec["case_id"] + cj = {"case_id": name, "circuit_id": cid, "pdk": pdk, "size": tag, "sW": sw, "sL": sl, "dut_name": name, "ports": circ.ports, + "sizing": sizing, "supply": case.supply, "bias": case.bias, "load": case.load, "category": cat, "notes": case.notes, + "derivation": drec, "signature": sig, "testbench_rule": TB_RULE, + "test_auxiliaries": overrides.test_auxiliaries(cid, case), "core_devices": [x.name for x in circ.devices]} + json.dump(cj, open(d / "case.json", "w"), indent=1) + json.dump(case.specs, open(d / "specs.json", "w"), indent=1) + json.dump({k: v for k, v in rec.items() if k not in ("schematic_measures",)} | {"schematic_measures": pre["measures"]}, open(d / "qualification.json", "w"), indent=1, default=str) + (d / "target.spice").write_text(emit_subckt(pdk, circ, sizing, name, per_finger=False)) + (d / "target_lvs.spice").write_text(emit_subckt(pdk, circ, sizing, name, per_finger=True, lvs=True)) + (d / "testbench.spice").write_text(make_testbench(circ, name, "DUT_INCLUDE_PATH", case, pdk)) + manifest = {f.name: hashlib.sha256(f.read_bytes()).hexdigest() for f in sorted(d.iterdir()) if f.is_file() and f.name != "manifest.json"} + json.dump(manifest, open(d / "manifest.json", "w"), indent=1) + results.append(rec) + return results + + +def main(): + ap = argparse.ArgumentParser(); ap.add_argument("--circuits", default=",".join(ORDER)); ap.add_argument("--pdks", default=",".join(PDKS)) + ap.add_argument("--jobs", type=int, default=12) + a = ap.parse_args() + jobs = [(c, p) for c in a.circuits.split(",") for p in a.pdks.split(",")] + with Pool(a.jobs) as pool: + allres = [r for rs in pool.map(build_one, jobs) for r in rs] + OUT.mkdir(parents=True, exist_ok=True) + out = paths.RESULTS / "case_build.json"; out.parent.mkdir(parents=True, exist_ok=True) + merged = {r["case_id"]: r for r in (json.load(open(out)) if out.exists() else [])} + merged.update({r["case_id"]: r for r in allres}) # a partial rebuild replaces only its own requests + json.dump(sorted(merged.values(), key=lambda r: r["case_id"]), open(out, "w"), indent=1, default=str) + import collections + c = collections.Counter(r["stage"] for r in allres) + print("requests", len(allres), dict(c)) + for r in allres: + if r["stage"] == "schematic_not_qualified": print(" NQ", r["case_id"], r["qualification"]["reasons"][:3]) + + +if __name__ == "__main__": + main() diff --git a/benchmarks/textbook_sharing/textbook_sharing/calibrate_res.py b/benchmarks/textbook_sharing/textbook_sharing/calibrate_res.py new file mode 100644 index 00000000..3ca1150f --- /dev/null +++ b/benchmarks/textbook_sharing/textbook_sharing/calibrate_res.py @@ -0,0 +1,29 @@ +"""Fit R(l) = a*l + b for each PDK resistor model from two schematic simulations: the documented calibration of the +length formula used by assembly.passives.resistor_geometry (its CALIB table). Writes data/res_calibration.json. +usage: python -m textbook_sharing.calibrate_res""" +import json +from pathlib import Path +from textbook_sharing import paths +from textbook_sharing.assembly.passives import RES, resistor_spice_line +from textbook_sharing.verify.pex_sim import simulate, read_measures + + +def main(): + out = {} + for pdk in ("sky130", "gf180", "ihp130"): + t = RES[pdk]; w = t["w_fixed"] or 1.0; pts = [] + for l in (5.0, 20.0): + tb = (f".subckt rtest A B VSS\n{resistor_spice_line(pdk, '1', 'A', 'B', 'VSS', w, l)}\n.ends rtest\nX1 A B VSS rtest\n" + "VA A 0 1\nVB B 0 0\nVS VSS 0 0\n.control\nop\nlet r = 1/(-i(VA))\nprint r\nquit\n.endc\n.end\n") + s = simulate(pdk, tb, paths.RUNS / "calib_res" / pdk, name=f"r_{l:g}") + m = read_measures(open(s["out"]).read()) if Path(s["out"]).exists() else {} + pts.append((l, m.get("r"))) + (l1, r1), (l2, r2) = pts + a = (r2 - r1) / (l2 - l1); b = r1 - a * l1 + out[pdk] = {"w": w, "points": pts, "a_ohm_per_um": a, "b_ohm": b, "rsh_nominal_table": t["rsh"]} + print(pdk, out[pdk]) + json.dump(out, open(paths.DATA / "res_calibration.json", "w"), indent=1) + + +if __name__ == "__main__": + main() diff --git a/benchmarks/textbook_sharing/textbook_sharing/cases.py b/benchmarks/textbook_sharing/textbook_sharing/cases.py new file mode 100644 index 00000000..b794f1d1 --- /dev/null +++ b/benchmarks/textbook_sharing/textbook_sharing/cases.py @@ -0,0 +1,42 @@ +"""Case data model: circuit x PDK x size point -> sizing, supply, bias, loads, specs. + +Sizing convention: per MOS device we store the total width w (um), the length l (um) and the finger count nf; the unit +width w/nf must be at least the contactable minimum of the PDK (checked when the case is derived and again by the +builder). The SPICE multiplier m is always 1 (parallel devices are expressed by nf). +PDK operating points: sky130 1.8 V, gf180 3.3 V, ihp130 1.2 V (low-voltage devices). +""" +from __future__ import annotations +import json, hashlib, copy +from dataclasses import dataclass, field, asdict + +PDK_POINT = { + "sky130": {"vdd": 1.8, "lmin": 0.15, "uw_min": 0.29, "ibias": 20e-6, "model_note": "sky130_fd_pr__nfet_01v8 / pfet_01v8, tt"}, + "gf180": {"vdd": 3.3, "lmin": 0.28, "uw_min": 0.36, "ibias": 20e-6, "model_note": "nfet_03v3 / pfet_03v3, typical"}, + "ihp130": {"vdd": 1.2, "lmin": 0.13, "uw_min": 0.30, "ibias": 20e-6, "model_note": "sg13_lv_nmos / pmos, mos_tt (PSP103 via OSDI)"}, +} + + +@dataclass +class CaseSpec: + case_id: str + circuit_id: str + pdk: str + size: str # size-point tag, e.g. sW1_sL1 (or 'nominal') + sizing: dict # device -> {w,l,nf} or {r}/{c} + supply: dict # {"VDD": v, "VSS": 0} + bias: dict # port -> value (V for VBx, A for IBx/IINx/IREFx) + load: dict # testbench loads + specs: dict # metric -> {"min":..,"max":..,"unit":..} + notes: list = field(default_factory=list) + + def sha(self): + return hashlib.sha256(json.dumps(asdict(self), sort_keys=True).encode()).hexdigest() + + +def scale_sizing(sizing, wscale=1.0, lscale=1.0, nf_fn=None): + out = copy.deepcopy(sizing) + for k, v in out.items(): + if "w" in v and "l" in v: + v["w"] = round(v["w"] * wscale, 3); v["l"] = round(v["l"] * lscale, 3) + if nf_fn: v["nf"] = nf_fn(k, v) + return out diff --git a/benchmarks/textbook_sharing/textbook_sharing/circuits.py b/benchmarks/textbook_sharing/textbook_sharing/circuits.py new file mode 100644 index 00000000..19678c28 --- /dev/null +++ b/benchmarks/textbook_sharing/textbook_sharing/circuits.py @@ -0,0 +1,138 @@ +"""The 18 textbook topologies: normalised device lists, ports and source provenance. + +Device lines follow the AnalogGenie convention (D G S B for MOS, P N for R/C) with +the original net names kept wherever they are meaningful. Device names are +normalised to M1.. / R1.. / C1.. in order of appearance; the mapping to the +source names is recorded in ``source["device_name_map"]``. Every modification +of the source netlist is listed in ``source["modifications"]``. +""" +from __future__ import annotations +from .netlist import Circuit, Device + +AG = "https://github.com/xz-group/AnalogGenie" +AG_SHA = "efc25358939c6bedd247f28d3df61066964f3a90" +BOOKS = { + "razavi": "B. Razavi, Design of Analog CMOS Integrated Circuits, 2nd ed., McGraw-Hill, 2017", + "johns": "T. C. Carusone, D. A. Johns, K. W. Martin, Analog Integrated Circuit Design, 2nd ed., Wiley, 2012", + "gray": "P. R. Gray, P. J. Hurst, S. H. Lewis, R. G. Meyer, Analysis and Design of Analog Integrated Circuits, 5th ed., Wiley, 2009", + "allen": "P. E. Allen, D. R. Holberg, CMOS Analog Circuit Design, 3rd ed., Oxford University Press, 2012", + "camenzind": "H. Camenzind, Designing Analog Chips, Virtualbookworm, 2005", +} + + +IMAGE_OBS = {726: 'Johns p.305 scan: Q1 diode-connected NMOS, Q2 output NMOS gate tied through a long wire (bias-distribution figure); basic 1:1 mirror', 672: 'Johns p.129 scan: Q1/Q2 bottom pair, Q3/Q4 cascode pair, Q3 and Q1 diode-connected, Iin source on top; cascode mirror', 840: 'Gray p.272 scan: bipolar Wilson mirror Q3 (input), Q1 (diode), Q2 (output, emitter on Q1 collector); MOS form authored with identical graph', 709: 'Johns p.261 scan: Q5 bias diode (W/L)/(n+1)^2, Q4/Q1 cascodes (W/L)/n^2, Q3/Q2 bottom devices W/L; wide-swing cascode mirror with Ibias and Iin sources', 934: 'Allen p.135 scan: M4 1/4-size diode, M5/M2 cascodes, M3/M1 bottom; corroborates the C13 graph', 936: 'Allen p.147 scan: M4 diode (II), M2 mirror, M1 regulating device biased by IREG, M3 output cascode; regulated cascode', 9: 'Razavi p.58 scan: M1 NMOS input, M2 PMOS current-source load biased by Vb', 20: 'Razavi p.72 scan: M1 follower, M2 NMOS current source (Vb), RL load resistor drawn as an external load to ground', 38: 'Razavi p.88 scan: M1/M2 NMOS cascode, M3/M4 PMOS cascode current source (Vb1..Vb3)', 195: 'Razavi p.268 scan: M1 NMOS and M2 PMOS with common gate input and common drain output (inverter amplifier)', 235: 'Razavi p.283 scan (partial): only M1 with an output current Iout is visible in the crop; the resistor R0 (VDD-VOUT1) of the dataset netlist is not visible. Treated as CS stage with resistive load per Razavi Sec. 3.2.1', 192: 'Razavi p.260 scan: M1/M2 pair with ideal tail current source symbol, M3/M4 PMOS current sources (Vb)', 157: 'Razavi p.171 scan: M1/M2 pair, M3 diode / M4 mirror PMOS load, M5 tail (Vb)', 71: 'Razavi p.107 scan: M1/M2 pair, RD1/RD2 loads, ideal tail source ISS', 220: 'Razavi p.272 scan: M1/M2 pair with RS/RS degeneration joined at the tail node, M3 tail (Vb), R1/R1 loads', 296: 'Razavi p.360 scan: M1/M2 pair, M3/M4 cascodes (Vb), M5/M6 PMOS cascodes and M7/M8 PMOS current sources with M5 and M7 diode-connected (X node), ideal tail ISS', 294: 'Razavi p.357 scan: M1/M2 PMOS pair (ISS tail), M5/M6 NMOS current sources (Vb4), M3/M4 NMOS cascodes (Vb1), M7/M8 PMOS cascodes (Vb2), M9/M10 PMOS sources (Vb3), differential Vout', 705: 'Johns p.243 scan: Q8 diode (3) with 20 uA source, Q5 (30) tail, Q1/Q2 (36) PMOS pair, Q3/Q4 (6) NMOS mirror, Q6 (45) PMOS load, Q7 (18) NMOS second stage, RC and CC compensation; W/L ratios annotated', 877: 'Gray p.380 scan: M3 PMOS current source (BIAS), M4 NMOS diode and M5 PMOS diode stack, M1 NMOS and M2 PMOS source followers driving RL, M6 NMOS input device'} + + +def src(ag_id, book, page, names, level, mods=None, extra=None): + d = {"dataset": "AnalogGenie", "dataset_url": AG, "dataset_sha": AG_SHA, "dataset_license": "MIT (code and dataset repository)", + "analoggenie_id": ag_id, "files": [f"Dataset/{ag_id}/{ag_id}.cir", f"Dataset/{ag_id}/Port{ag_id}.txt", f"Dataset/{ag_id}/Pagenumber{ag_id}.txt", f"Dataset/{ag_id}/Book{ag_id}.png", f"Dataset/{ag_id}/Cadence{ag_id}.png"] if ag_id else [], + "book": BOOKS[book], "book_key": book, "page_ref": page, "device_name_map": names, + "source_verification_level": level, "image_review": {"file": f"Dataset/{ag_id}/Book{ag_id}.png", "observation": IMAGE_OBS.get(ag_id)}, "modifications": mods or [], + "textbook_image_note": "Book.png (textbook scan) and Cadence.png (schematic capture) ship inside the public AnalogGenie repository; for entries marked 'image_checked' the scan was compared with the netlist when the benchmark was built. The scans are not redistributed here."} + if extra: d.update(extra) + return d + + +CIRCUITS = {} + + +def _add(c: Circuit): + CIRCUITS[c.circuit_id] = c + + +# ---- current mirrors ------------------------------------------------------- +_add(Circuit("C01", "basic_current_mirror", ["VSS", "IB1", "IOUT1"], + [Device("M1", "nfet", ["IB1", "IB1", "VSS", "VSS"]), Device("M2", "nfet", ["IOUT1", "IB1", "VSS", "VSS"])], + src(726, "johns", "305", {"M1": "M3", "M2": "M5"}, "netlist_matched_isomorphic+image_checked"))) +_add(Circuit("C02", "cascode_current_mirror", ["VSS", "IIN1", "IOUT1"], + [Device("M1", "nfet", ["IIN1", "IIN1", "net6", "VSS"]), Device("M2", "nfet", ["net6", "net6", "VSS", "VSS"]), + Device("M3", "nfet", ["IOUT1", "IIN1", "net12", "VSS"]), Device("M4", "nfet", ["net12", "net6", "VSS", "VSS"])], + src(672, "johns", "129", {"M1": "M3", "M2": "M2", "M3": "M1", "M4": "M0"}, "netlist_matched_isomorphic+image_checked"))) +_add(Circuit("C03", "wilson_current_mirror", ["VSS", "IIN1", "IOUT1"], + [Device("M1", "nfet", ["IIN1", "Y", "VSS", "VSS"]), Device("M2", "nfet", ["Y", "Y", "VSS", "VSS"]), Device("M3", "nfet", ["IOUT1", "IIN1", "Y", "VSS"])], + src(840, "gray", "272 (bipolar Wilson mirror; MOS form from Gray et al. Sec. 4.2.5 'Wilson current mirror', MOS subsection)", + {"M1": "Q0 (npn)", "M2": "Q1 (npn)", "M3": "Q2 (npn)"}, + "topology_from_textbook_section;netlist_authored (AnalogGenie has no MOS Wilson entry: isomorphism search over 3350 netlists found only bipolar versions #606 and #840)", + ["bipolar devices replaced by NMOS with the same connection graph (C->D, B->G, E->S, bulk to VSS)"]))) +_add(Circuit("C13", "wide_swing_cascode_current_mirror", ["VSS", "IIN1", "IOUT1", "IB1"], + [Device("M1", "nfet", ["IB1", "IB1", "VSS", "VSS"]), Device("M2", "nfet", ["IIN1", "IB1", "net15", "VSS"]), Device("M3", "nfet", ["net15", "IIN1", "VSS", "VSS"]), + Device("M4", "nfet", ["IOUT1", "IB1", "net14", "VSS"]), Device("M5", "nfet", ["net14", "IIN1", "VSS", "VSS"])], + src(709, "johns", "261", {"M1": "M4", "M2": "M1", "M3": "M0", "M4": "M3", "M5": "M2"}, "netlist_matched_isomorphic+image_checked", + extra={"corroborating_entry": {"analoggenie_id": 934, "book": BOOKS["allen"], "page_ref": "135", "note": "same connection graph (IREF1<->IB1, IREF2<->IIN1)"}}))) +_add(Circuit("C14", "regulated_cascode_current_mirror", ["VSS", "IIN1", "IOUT1", "IREF1"], + [Device("M1", "nfet", ["IIN1", "IIN1", "VSS", "VSS"]), Device("M2", "nfet", ["net11", "IIN1", "VSS", "VSS"]), + Device("M3", "nfet", ["IREF1", "net11", "VSS", "VSS"]), Device("M4", "nfet", ["IOUT1", "IREF1", "net11", "VSS"])], + src(936, "allen", "147", {"M1": "M3", "M2": "M1", "M3": "M2", "M4": "M0"}, "netlist_matched_isomorphic+image_checked"))) +# ---- single-stage amplifiers ------------------------------------------------ +_add(Circuit("C04", "cs_amplifier_current_source_load", ["VDD", "VSS", "VIN1", "VOUT1", "VB1"], + [Device("M1", "pfet", ["VOUT1", "VB1", "VDD", "VDD"]), Device("M2", "nfet", ["VOUT1", "VIN1", "VSS", "VSS"])], + src(9, "razavi", "58", {"M1": "M0", "M2": "M1"}, "netlist_matched_isomorphic+image_checked"))) +_add(Circuit("C05", "source_follower_mos_current_source", ["VDD", "VSS", "VIN1", "VOUT1", "VB1"], + [Device("M1", "nfet", ["VOUT1", "VB1", "VSS", "VSS"]), Device("M2", "nfet", ["VDD", "VIN1", "VOUT1", "VSS"])], + src(20, "razavi", "72", {"M1": "M0", "M2": "M1"}, "netlist_matched_isomorphic+image_checked", + ["source resistor R0 (VOUT1-VSS) is interpreted as the external load R_L and lives in the testbench, not in the DUT"]))) +_add(Circuit("C06", "cascode_amplifier_cascode_load", ["VDD", "VSS", "VIN1", "VOUT1", "VB1", "VB2", "VB3"], + [Device("M1", "pfet", ["VOUT1", "VB2", "net10", "VDD"]), Device("M2", "pfet", ["net10", "VB3", "VDD", "VDD"]), + Device("M3", "nfet", ["net9", "VIN1", "VSS", "VSS"]), Device("M4", "nfet", ["VOUT1", "VB1", "net9", "VSS"])], + src(38, "razavi", "88", {"M1": "M1", "M2": "M0", "M3": "M3", "M4": "M2"}, "netlist_matched_isomorphic+image_checked"))) +_add(Circuit("C12", "cmos_inverter_amplifier", ["VDD", "VSS", "VIN1", "VOUT1"], + [Device("M1", "nfet", ["VOUT1", "VIN1", "VSS", "VSS"]), Device("M2", "pfet", ["VOUT1", "VIN1", "VDD", "VDD"])], + src(195, "razavi", "268", {"M1": "M0", "M2": "M1"}, "netlist_matched_isomorphic+image_checked"))) +_add(Circuit("C15", "cs_amplifier_resistor_load", ["VDD", "VSS", "VIN1", "VOUT1"], + [Device("M1", "nfet", ["VOUT1", "VIN1", "VSS", "VSS"]), Device("R1", "res", ["VDD", "VOUT1"])], + src(235, "razavi", "283", {"M1": "M1", "R1": "R0"}, "netlist_matched_isomorphic+image_partial (resistor not visible in crop)"))) +# ---- differential ---------------------------------------------------------- +_add(Circuit("C07", "diff_pair_current_source_loads", ["VDD", "VSS", "VIN1", "VIN2", "VOUT1", "VOUT2", "VB1", "IB1"], + [Device("M1", "nfet", ["VOUT1", "VIN1", "IB1", "VSS"]), Device("M2", "nfet", ["VOUT2", "VIN2", "IB1", "VSS"]), + Device("M3", "pfet", ["VOUT1", "VB1", "VDD", "VDD"]), Device("M4", "pfet", ["VOUT2", "VB1", "VDD", "VDD"])], + src(192, "razavi", "260", {"M1": "M0", "M2": "M1", "M3": "M2", "M4": "M3"}, "netlist_matched_isomorphic+image_checked", + ["tail node IB1 is a port: the tail current source is an ideal (disclosed) testbench source"]))) +_add(Circuit("C08", "five_transistor_ota", ["VDD", "VSS", "VIN1", "VIN2", "VOUT1", "VB1"], + [Device("M1", "nfet", ["net22", "VIN1", "net23", "VSS"]), Device("M2", "nfet", ["VOUT1", "VIN2", "net23", "VSS"]), Device("M3", "nfet", ["net23", "VB1", "VSS", "VSS"]), + Device("M4", "pfet", ["net22", "net22", "VDD", "VDD"]), Device("M5", "pfet", ["VOUT1", "net22", "VDD", "VDD"])], + src(157, "razavi", "171", {"M1": "M2", "M2": "M3", "M3": "M4", "M4": "M0", "M5": "M1"}, "netlist_matched_isomorphic+image_checked"))) +_add(Circuit("C16", "diff_pair_resistor_loads", ["VDD", "VSS", "VIN1", "VIN2", "VOUT1", "VOUT2", "IB1"], + [Device("M1", "nfet", ["VOUT1", "VIN1", "IB1", "VSS"]), Device("M2", "nfet", ["VOUT2", "VIN2", "IB1", "VSS"]), + Device("R1", "res", ["VDD", "VOUT1"]), Device("R2", "res", ["VDD", "VOUT2"])], + src(71, "razavi", "107", {"M1": "M0", "M2": "M1", "R1": "R0", "R2": "R1"}, "netlist_matched_isomorphic+image_checked", + ["tail node IB1 is a port: ideal (disclosed) testbench current source"]))) +_add(Circuit("C17", "degenerated_diff_pair", ["VDD", "VSS", "VIN1", "VIN2", "VOUT1", "VOUT2", "VB1"], + [Device("M1", "nfet", ["VOUT1", "VIN1", "net07", "VSS"]), Device("M2", "nfet", ["VOUT2", "VIN2", "net09", "VSS"]), Device("M3", "nfet", ["net06", "VB1", "VSS", "VSS"]), + Device("R1", "res", ["VDD", "VOUT1"]), Device("R2", "res", ["VDD", "VOUT2"]), Device("R3", "res", ["net07", "net06"]), Device("R4", "res", ["net09", "net06"])], + src(220, "razavi", "272", {"M1": "M0", "M2": "M2", "M3": "M1", "R1": "R0", "R2": "R1", "R3": "R2", "R4": "R3"}, "netlist_matched_isomorphic+image_checked"))) +# ---- op amps --------------------------------------------------------------- +_add(Circuit("C09", "telescopic_ota_single_ended", ["VDD", "VSS", "VIN1", "VIN2", "VOUT1", "VB1", "IB1"], + [Device("M1", "nfet", ["net018", "VIN1", "IB1", "VSS"]), Device("M2", "nfet", ["net016", "VIN2", "IB1", "VSS"]), + Device("M3", "nfet", ["net04", "VB1", "net018", "VSS"]), Device("M4", "nfet", ["VOUT1", "VB1", "net016", "VSS"]), + Device("M5", "pfet", ["net04", "net04", "net019", "VDD"]), Device("M6", "pfet", ["VOUT1", "net04", "net017", "VDD"]), + Device("M7", "pfet", ["net019", "net019", "VDD", "VDD"]), Device("M8", "pfet", ["net017", "net019", "VDD", "VDD"])], + src(296, "razavi", "360", {"M1": "M1", "M2": "M3", "M3": "M4", "M4": "M5", "M5": "M6", "M6": "M7", "M7": "M8", "M8": "M9"}, "netlist_matched_isomorphic+image_checked", + ["tail node IB1 is a port: ideal (disclosed) testbench current source"]))) +_add(Circuit("C10", "folded_cascode_ota_fully_differential", ["VDD", "VSS", "VIN1", "VIN2", "VOUT1", "VOUT2", "VB1", "VB2", "VB3", "VB4", "IB1"], + [Device("M1", "pfet", ["net022", "VIN1", "IB1", "VDD"]), Device("M2", "pfet", ["net018", "VIN2", "IB1", "VDD"]), + Device("M3", "nfet", ["net022", "VB4", "VSS", "VSS"]), Device("M4", "nfet", ["net018", "VB4", "VSS", "VSS"]), + Device("M5", "nfet", ["VOUT1", "VB1", "net022", "VSS"]), Device("M6", "nfet", ["VOUT2", "VB1", "net018", "VSS"]), + Device("M7", "pfet", ["VOUT1", "VB2", "net023", "VDD"]), Device("M8", "pfet", ["VOUT2", "VB2", "net021", "VDD"]), + Device("M9", "pfet", ["net023", "VB3", "VDD", "VDD"]), Device("M10", "pfet", ["net021", "VB3", "VDD", "VDD"])], + src(294, "razavi", "357", {"M1": "M0", "M2": "M2", "M3": "M1", "M4": "M3", "M5": "M4", "M6": "M5", "M7": "M6", "M8": "M7", "M9": "M8", "M10": "M9"}, "netlist_matched_isomorphic+image_checked", + ["tail node IB1 is a port: ideal (disclosed) testbench current source", "output common mode is set by a disclosed ideal common-mode feedback in the testbench acting on VB4"]))) +_add(Circuit("C11", "two_stage_miller_opamp", ["VDD", "VSS", "VIN1", "VIN2", "VOUT1", "IB1"], + [Device("M1", "pfet", ["IB1", "IB1", "VDD", "VDD"]), Device("M2", "pfet", ["net97", "IB1", "VDD", "VDD"]), + Device("M3", "pfet", ["net014", "VIN1", "net97", "VDD"]), Device("M4", "pfet", ["net016", "VIN2", "net97", "VDD"]), + Device("M5", "nfet", ["net014", "net014", "VSS", "VSS"]), Device("M6", "nfet", ["net016", "net014", "VSS", "VSS"]), + Device("M7", "pfet", ["VOUT1", "IB1", "VDD", "VDD"]), Device("M8", "nfet", ["VOUT1", "net016", "VSS", "VSS"]), + Device("R1", "res", ["net016", "net022"]), Device("C1", "cap", ["net022", "VOUT1"])], + src(705, "johns", "243", {"M1": "M10", "M2": "M12", "M3": "M14", "M4": "M13", "M5": "M15", "M6": "M16", "M7": "M17", "M8": "M18", "R1": "R0", "C1": "C0"}, "netlist_matched_isomorphic+image_checked", + ["input-pair bodies (source net023, floating in the dataset) tied to VDD", "compensation resistor R1 and capacitor C1 are DUT elements realised with PDK devices"]))) +_add(Circuit("C18", "class_ab_output_buffer", ["VDD", "VSS", "VIN1", "VOUT1", "VB1"], + [Device("M1", "nfet", ["net13", "VIN1", "VSS", "VSS"]), Device("M2", "pfet", ["net9", "VB1", "VDD", "VDD"]), + Device("M3", "nfet", ["net9", "net9", "net22", "VSS"]), Device("M4", "pfet", ["net13", "net13", "net22", "VDD"]), + Device("M5", "nfet", ["VDD", "net9", "VOUT1", "VSS"]), Device("M6", "pfet", ["VSS", "net13", "VOUT1", "VDD"])], + src(877, "gray", "380", {"M1": "M5", "M2": "M4", "M3": "M0", "M4": "M2", "M5": "M1", "M6": "M3"}, "netlist_matched_isomorphic+image_checked", + ["load resistor R0 (VOUT1-VSS) is the external load R_L in the testbench", "bias network (M2 current source, M3/M4 diode stack) is part of the DUT"]))) + +ORDER = sorted(CIRCUITS) +DEV_SPLIT = ["C01", "C04", "C05", "C07", "C13", "C15"] # development topologies (6) +TEST_SPLIT = [c for c in ORDER if c not in DEV_SPLIT] # 12 test topologies +E3_CIRCUITS = ["C02", "C08", "C09", "C11", "C16", "C18"] # E3 selection: mirrors, differential structures, amplifiers +E4_CIRCUITS = ["C02", "C08", "C11", "C17"] # E4 hold-out circuits diff --git a/benchmarks/textbook_sharing/textbook_sharing/freeze.py b/benchmarks/textbook_sharing/textbook_sharing/freeze.py new file mode 100644 index 00000000..0bd04d82 --- /dev/null +++ b/benchmarks/textbook_sharing/textbook_sharing/freeze.py @@ -0,0 +1,41 @@ +"""Record a freeze checkpoint: the sha256 of every rule-bearing source file and of every case manifest, with a note. + +Rules are frozen in stages before the measurements they govern (size grid and qualification rule before any layout; +cost rule and fixed mode order on the two development sizes before the held-out sizes; testbench fixes before +requalification). A checkpoint is never overwritten, so it documents which rules were in force at that time. +usage: python -m textbook_sharing.freeze ["note"] -> /freeze/.json""" +import sys, json, hashlib, glob, time, subprocess +from pathlib import Path +from textbook_sharing import paths + +PKG = Path(__file__).resolve().parent +FILES = ["grid.py", "qualify.py", "overrides.py", "build_cases.py", "testbench.py", "run_case.py", "matching.py", "layout.py", + "run_grid.py", "assembly/engine.py", "assembly/passives.py", "verify/pipeline.py", "verify/drc.py", "verify/lvs.py", + "verify/pex_sim.py", "selection/catalogue.py", "selection/cost.py", "selection/strategies.py", "selection/run_selection.py", + "selection/fixed_order.py", "llm/plan_parser.py", "llm/evaluate.py", "llm/tasks.py", "llm/interface_sharing.md"] +SHARING = ["enumerate.py", "group.py", "rules.py", "spec.py", "evidence.py"] + + +def sha(p): + return hashlib.sha256(open(p, "rb").read()).hexdigest() + + +def main(): + name = sys.argv[1]; out = paths.RESULTS / "freeze"; out.mkdir(parents=True, exist_ok=True) + f = out / f"{name}.json" + if f.exists(): + sys.exit(f"{f} exists; freeze checkpoints are never overwritten") + files = {f"textbook_sharing/{x}": sha(PKG / x) for x in FILES if (PKG / x).exists()} + files.update({f"glayout/sharing/{x}": sha(paths.REPO / "src/glayout/sharing" / x) for x in SHARING}) + frozen = {str(Path(p).relative_to(paths.ROOT)): sha(p) for p in sorted(glob.glob(str(paths.FROZEN / "*.json")))} + cases = {str(Path(m).parent.relative_to(paths.ROOT)): sha(m) for m in sorted(glob.glob(str(paths.CASES / "*/*/*/manifest.json")))} + lock = {"name": name, "utc": time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime()), "files": files, "frozen_data": frozen, + "case_manifests": cases, "n_cases": len(cases), + "git_head": subprocess.run(["git", "-C", str(paths.REPO), "rev-parse", "HEAD"], capture_output=True, text=True).stdout.strip(), + "note": sys.argv[2] if len(sys.argv) > 2 else ""} + json.dump(lock, open(f, "w"), indent=1) + print(f, len(files), "files", len(cases), "cases") + + +if __name__ == "__main__": + main() diff --git a/benchmarks/textbook_sharing/textbook_sharing/grid.py b/benchmarks/textbook_sharing/textbook_sharing/grid.py new file mode 100644 index 00000000..7819d772 --- /dev/null +++ b/benchmarks/textbook_sharing/textbook_sharing/grid.py @@ -0,0 +1,77 @@ +"""Size grid and size-derivation rule (fixed before any layout was built). + +Grid: total-width multiplier sW in {0.5, 1.0, 1.5, 2.0} x gate-length multiplier sL in {1.0, 1.5, 2.0} +-> 12 size points per (topology, PDK); 18 x 3 x 12 = 648 requested cases. + +Nominal point (sW = sL = 1) = the nominal design point of the topology and PDK (data/nominal//.json); +the changes in overrides.py are applied on top and recorded in every case. + +Derivation rule (identical for every device of a case, so every width ratio inside the circuit is preserved exactly): + L' = L0 * sL, snapped to the 5 nm grid; + W' = W0 * sW for every MOS device; + nf' = nf0 * sW when that is an integer for ALL MOS devices of the case (unit finger width unchanged); + otherwise nf' = nf0 and the unit finger width becomes uw0 * sW for all devices; + the request is REJECTED (parameter-illegal) when the resulting unit finger width is below the PDK minimum + (contactable / model-valid width, PDK_POINT[pdk]['uw_min']) or is not on the 5 nm grid. +nf is therefore derived, never an independent sweep axis. Passive R/C values, supply, bias currents and loads are +part of the circuit definition and are not scaled. Two requests whose derived target netlists are identical +(same signature) are counted once (duplicates).""" +from __future__ import annotations +import copy, hashlib, json + +SW = (0.5, 1.0, 1.5, 2.0) +SL = (1.0, 1.5, 2.0) +GRID = [(sw, sl) for sw in SW for sl in SL] +SELECTION_SIZES = [(1.0, 1.0), (2.0, 1.0), (1.0, 2.0), (2.0, 2.0)] +LLM_SIZES = [(2.0, 1.0), (2.0, 2.0)] +INTERFACE_SIZES = [(2.0, 1.0)] +SELECTION_TOPOLOGIES = ["C02", "C08", "C09", "C11", "C16", "C18"] +UW_MIN = {"sky130": 0.29, "gf180": 0.36, "ihp130": 0.30} # = cases.PDK_POINT[pdk]['uw_min'] +GRID_NM = 5 + + +def size_tag(sw, sl): + return f"sW{sw:g}_sL{sl:g}" + + +def _on_grid(x): + return abs(round(x * 1000 / GRID_NM) * GRID_NM - x * 1000) < 1e-6 + + +def snap5(x): + return round(round(x * 1000 / GRID_NM) * GRID_NM / 1000, 4) + + +def derive_sizing(sizing0: dict, pdk: str, sw: float, sl: float): + """Returns (sizing, derivation_record) or (None, rejection_record).""" + mos = {k: v for k, v in sizing0.items() if "nf" in v} + rec = {"sW": sw, "sL": sl, "rule": "grid.derive_sizing v1"} + nf_scaled = {k: v["nf"] * sw for k, v in mos.items()} + integer_nf = all(abs(x - round(x)) < 1e-9 and round(x) >= 1 for x in nf_scaled.values()) + out = copy.deepcopy(sizing0); per = {} + for k, v in mos.items(): + uw0 = v["w"] / v["nf"] + if integer_nf: + nf = int(round(nf_scaled[k])); uw = uw0 + else: + nf = v["nf"]; uw = uw0 * sw + l = snap5(v["l"] * sl) + if uw + 1e-9 < UW_MIN[pdk]: + return None, {**rec, "status": "parameter_illegal", "reason": f"unit finger width {uw:.4g} um of {k} below the {pdk} minimum {UW_MIN[pdk]} um"} + if not _on_grid(uw): + return None, {**rec, "status": "parameter_illegal", "reason": f"unit finger width {uw:.6g} um of {k} not on the 5 nm grid"} + w = round(uw * nf, 4) + out[k] = {**v, "w": w, "l": l, "nf": nf} + per[k] = {"w0": v["w"], "l0": v["l"], "nf0": v["nf"], "uw0": round(uw0, 4), "w": w, "l": l, "nf": nf, "uw": round(uw, 4), + "w_ratio": round(w / v["w"], 6), "l_ratio_exact": round(l / v["l"], 6)} + rec.update({"status": "derived", "finger_rule": "nf scaled (unit width kept)" if integer_nf else "unit width scaled (nf kept)", "devices": per}) + return out, rec + + +def signature(circuit, pdk, sizing): + """Identity of a derived target netlist: topology + PDK + every device's model-relevant size.""" + devs = [] + for d in circuit.devices: + s = sizing[d.name] + devs.append([d.name, d.kind, list(d.nets), {k: s.get(k) for k in ("w", "l", "nf", "r", "c") if k in s}]) + return hashlib.sha256(json.dumps([circuit.circuit_id, pdk, devs], sort_keys=True).encode()).hexdigest()[:16] diff --git a/benchmarks/textbook_sharing/textbook_sharing/layout.py b/benchmarks/textbook_sharing/textbook_sharing/layout.py new file mode 100644 index 00000000..c1ba2076 --- /dev/null +++ b/benchmarks/textbook_sharing/textbook_sharing/layout.py @@ -0,0 +1,100 @@ +"""Layout of a whole benchmark circuit from per-group sharing plans. + +Grouping rule (identical for every circuit and plan): + * devices are split by polarity (rows) and body net; + * within a row, devices form *sharing groups*: the connected components of the graph whose edges join two devices + that (a) have the same length and unit finger width and (b) share a source/drain net or a gate net; + * each group is drawn by glayout.sharing.build_mos_group from its plan; + * rows: NMOS (bottom), PMOS (top, mirrored), passives (top row, if any); assembly.assemble adds body ties, routing + channels with metal-3 trunks, risers and port labels. +A plan changes only what is inside a group cell; placement order, routing policy, taps and labels are the same for every +plan, so area differences between two layouts of one circuit come from their plans. +""" +from __future__ import annotations +from glayout.sharing import DeviceSpec, build_mos_group +from textbook_sharing.assembly import RowSpec, assemble +from textbook_sharing.assembly.adapters import from_group_result +from textbook_sharing.assembly.passives import resistor_pincell, mimcap_pincell +from textbook_sharing.netlist import Circuit + +MODES = ("independent", "diffusion_only", "gate_only", "combined") + + +def device_specs(circuit: Circuit, sizing: dict) -> list[DeviceSpec]: + out = [] + for d in circuit.devices: + if d.kind in ("nfet", "pfet"): + sz = sizing[d.name] + out.append(DeviceSpec(d.name, d.kind, d.nets[0], d.nets[1], d.nets[2], d.nets[3], float(sz["w"]), float(sz["l"]), int(sz.get("nf", 1)))) + return out + + +def sharing_groups(devs: list[DeviceSpec]) -> list[list[DeviceSpec]]: + """Connected components over (same polarity, body, L, unit width) devices that share an S/D or gate net.""" + n = len(devs); parent = list(range(n)) + def find(i): + while parent[i] != i: parent[i] = parent[parent[i]]; i = parent[i] + return i + def union(i, j): parent[find(i)] = find(j) + for i in range(n): + for j in range(i + 1, n): + a, b = devs[i], devs[j] + if a.model_role != b.model_role or a.b != b.b: continue + if abs(a.length - b.length) > 1e-6 or abs(a.unit_width - b.unit_width) > 1e-6: continue + if ({a.s, a.d} & {b.s, b.d}) or a.g == b.g: + union(i, j) + comps = {} + for i in range(n): comps.setdefault(find(i), []).append(devs[i]) + # keep netlist order inside and across groups + return sorted(comps.values(), key=lambda g: min(devs.index(d) for d in g)) + + +def applicability(pdk, circuit: Circuit, sizing: dict) -> dict: + """A named mode applies to a circuit when at least one sharing group has a named plan for it (named_plans: a legal + plan in the fixed axis order that really shares that kind).""" + from glayout.sharing import group_candidates, named_plans + devs = device_specs(circuit, sizing); groups = sharing_groups(devs) + per = [] + for g in groups: + cand = group_candidates(pdk, g); nm = named_plans(pdk, g, cand) + per.append({"devices": [d.logical_id for d in g], "counts": cand["counts"], "named": {k: (v.plan_id() if v else None) for k, v in nm.items()}}) + modes = {m: any(pg["named"].get(m) for pg in per) for m in MODES}; modes["independent"] = True + return {"modes": modes, "groups": per} + + + +def build(pdk, circuit: Circuit, sizing: dict, mode: str = "independent", name: str | None = None, plans: dict | None = None): + """Build a whole circuit. plans: {group_index(str): SharingPlan json} (an explicit candidate); otherwise every group + uses its named plan for `mode`, or its independent plan when the mode does not apply to that group. Every plan gets + the same rows, assembly rule (assembly.assemble with the two-strategy channel rule), taps and labels.""" + from glayout.sharing import SharingPlan, group_candidates, named_plans + devs = device_specs(circuit, sizing); groups = sharing_groups(devs) + rows = {"n": [], "p": [], "passive": []} + for d in circuit.devices: + if d.kind == "res": + sz = sizing[d.name] + rows["passive"].append(resistor_pincell(pdk, d.name, d.nets[0], d.nets[1], float(sz["r"]), body_net=sz.get("body", "VSS"))) + elif d.kind == "cap": + sz = sizing[d.name] + rows["passive"].append(mimcap_pincell(pdk, d.name, d.nets[0], d.nets[1], float(sz["c"]))) + applied = []; evidence = []; nf_total = 0 + for gi, g in enumerate(groups): + pol = "n" if g[0].model_role == "nfet" else "p" + if plans and str(gi) in plans: + plan = SharingPlan.from_json(plans[str(gi)]); src = "explicit" + else: + nm = named_plans(pdk, g) + plan = nm.get(mode) or nm["independent"]; src = "named" if nm.get(mode) else "named_fallback_independent" + res = build_mos_group(pdk, g, plan=plan, name=f"grp{gi}") + rows[pol].append(from_group_result(res, f"grp{gi}", pol, g[0].b)) + applied.append({"group": gi, "devices": [d.logical_id for d in g], "plan": res.applied_plan, "mode_requested": mode, "plan_source": src, + "plan_mode_label": plan.mode_label}) + evidence.append(res.physical_sharing_evidence); nf_total += sum(d.nf for d in g) + row_specs = [] + if rows["n"]: row_specs.append(RowSpec(rows["n"], "n", False, rows["n"][0].body_net)) + if rows["p"]: row_specs.append(RowSpec(rows["p"], "p", True, rows["p"][0].body_net)) + if rows["passive"]: row_specs.append(RowSpec(rows["passive"], "passive", True, None, taps=False)) + top = name or f"{circuit.circuit_id}_{pdk.name}_{mode}" + asm = assemble(pdk, row_specs, circuit.ports, name=top) + return {"component": asm["component"], "name": top, "groups": [[d.logical_id for d in g] for g in groups], "applied_plans": applied, "evidence": evidence, + "assembly_stats": asm["stats"], "expected_fingers": nf_total, "trunks": asm["trunks"]} diff --git a/benchmarks/textbook_sharing/textbook_sharing/llm/__init__.py b/benchmarks/textbook_sharing/textbook_sharing/llm/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/benchmarks/textbook_sharing/textbook_sharing/llm/agent_sessions.py b/benchmarks/textbook_sharing/textbook_sharing/llm/agent_sessions.py new file mode 100644 index 00000000..9df5781c --- /dev/null +++ b/benchmarks/textbook_sharing/textbook_sharing/llm/agent_sessions.py @@ -0,0 +1,141 @@ +"""Model sessions run through an agent interface (used for the Anthropic model). + +Each session is a folder that holds only README.md (the session rules), interface.md, examples.md, task.md and +submit.sh. The agent writes p_answer.md and runs `bash submit.sh `, which hands the answer to the evaluator +(llm/evaluate.py, the same evaluator as for the Codex sessions) and prints the tool report. The agent is started with +LAUNCH_TEXT (folder filled in); nothing else is given to it. Afterwards every tool call in the agent transcripts is +audited: allowed are Read/Write/Edit of a file inside the session folder and `bash submit.sh ` run inside it. + + prepare + config keys: model_tag, workspace (folder for the agent-side session folders), reps, max_proposals (default 8), + interface ("sharing" | "base"), examples (path to examples.md), only (optional task ids), model (optional), + evaluator_cmd (optional; '{session}' and '{k}' are filled in, default runs the evaluator in this Python). + Creates ///r/ and the evaluator-side /models///r/ + session.json, and writes //sessions.json (the list of agent-side folders). + launch + prints the text to start the agent with. + audit + map.json: agent id -> session folder; transcripts are JSONL files agent-.jsonl in which every assistant + message lists its tool calls as content items {"type": "tool_use", "name", "input"}. + Classes of a flagged call: in_folder_edit (text processing of the session's own files: a protocol deviation that + gives the agent no outside information) and isolation_breach (anything else: outside paths, listing or search, + network). Flagged sessions are then reviewed by hand.""" +import json, re, shlex, sys +from pathlib import Path +from textbook_sharing import paths + +RULES = """# Session rules +You are the model under test in a controlled experiment. Work ONLY with the files in this folder: +read README.md, interface.md, examples.md and task.md; write your proposals as p1_answer.md, p2_answer.md, ... +(each containing exactly one ```python block with `plans = {{...}}`, as interface.md describes); after writing +p_answer.md run exactly `bash submit.sh ` (k = proposal number) and read the tool report it prints. +You have at most {max_proposals} proposals; rejected and repeated proposals also count. You may stop early. +Do not open, list or search any other file or directory, and do not run any other command. +When you stop, reply with one line: the number of the proposal you consider best. +""" + +LAUNCH_TEXT = """You are the model under test in a controlled analog-layout experiment. Your session folder is: +{folder} + +Read README.md in that folder first and follow it exactly. Use only the files in that folder (README.md, interface.md, examples.md, task.md). Write each proposal with the Write tool as p_answer.md in that folder, then run exactly this Bash command (with k replaced by the proposal number) to submit it and read the tool report: +cd {folder} && bash submit.sh k +Do not open, list or search any other file or directory, and do not run any other command. Run the submit command in the foreground and wait for its report. You have at most {max_proposals} proposals. When you stop, reply with one line: the number of the proposal you consider best.""" + +SUBMIT = """#!/bin/bash +# sends p$1_answer.md to the evaluator and prints the tool report (the only command the model may run) +set -e +k=$1; [ -f "p${{k}}_answer.md" ] || {{ echo "missing p${{k}}_answer.md"; exit 1; }} +cp "p${{k}}_answer.md" {session}/"p${{k}}_answer.md" +(cd {root} && {evaluator}) >/dev/null 2>&1 || true +cat {session}/"p${{k}}_feedback.txt" +""" + + +def prepare(cfg): + tag = cfg["model_tag"]; ws = Path(cfg["workspace"]).resolve(); nmax = cfg.get("max_proposals", 8) + interface = Path(__file__).with_name("interface_base.md" if cfg.get("interface") == "base" else "interface_sharing.md").read_text() + examples = Path(cfg["examples"]).read_text() + tasks = json.load(open(paths.MODEL_TASKS / "tasks.json"))["tasks"] + if cfg.get("only"): + tasks = [t for t in tasks if t["task_id"] in cfg["only"]] + made = [] + for rep in range(1, cfg["reps"] + 1): + for t in tasks: + sd = ws / tag / t["task_id"] / f"r{rep}"; sd.mkdir(parents=True, exist_ok=True) + ev = (paths.MODEL_RUNS / tag / t["task_id"] / f"r{rep}").resolve(); ev.mkdir(parents=True, exist_ok=True) + (sd / "README.md").write_text(RULES.format(max_proposals=nmax)) + (sd / "interface.md").write_text(interface); (sd / "examples.md").write_text(examples) + (sd / "task.md").write_text((paths.MODEL_TASKS / t["task_id"] / "task.md").read_text()) + tmpl = cfg.get("evaluator_cmd") or f"{shlex.quote(sys.executable)} -m textbook_sharing.llm.evaluate {{session}} {{k}}" + (sd / "submit.sh").write_text(SUBMIT.format(session=shlex.quote(str(ev)), root=shlex.quote(str(paths.ROOT)), + evaluator=tmpl.format(session=shlex.quote(str(ev)), k='"$k"'))) + sess = {"task_id": t["task_id"], "case_dir": t["case_dir"], "model_tag": tag, "rep": rep, + "entry": "agent session, file-scoped workspace, every tool call audited", "max_proposals": nmax, + "interface": cfg.get("interface", "sharing")} + if cfg.get("model"): + sess["model"] = cfg["model"] + json.dump(sess, open(ev / "session.json", "w"), indent=1) + made.append(str(sd)) + json.dump(made, open(ws / tag / "sessions.json", "w"), indent=1) + print(len(made), "sessions prepared under", ws / tag) + + +def classify(cmd, folder): + """Class of a Bash command that is not exactly `bash submit.sh `.""" + roots = r"(?:Users|private|home|tmp|etc|var|opt|Applications|System|Library|usr|bin|dev|proc)" + outside = [x for x in re.findall(rf"(?:^|(?<=[\s'\"=]))(/{roots}\b[^\s'\"<>|;&]*)", cmd) if not x.startswith(folder) and x != "/dev/null"] + risky = re.search(r"\.\./|\bls\b|\bfind\b|\bgrep\s+-\w*[rR]|\bcat\s+/|\bcurl\b|\bwget\b|\bssh\b|\bscp\b|~/|\$HOME", cmd) + return "isolation_breach" if (outside or risky) else "in_folder_edit" + + +def audit(amap, tdir): + out = {} + for aid, folder in amap.items(): + folder = folder.rstrip("/"); f = Path(tdir) / f"agent-{aid}.jsonl" + if not f.exists(): + out[aid] = {"folder": folder, "error": "transcript not found"}; continue + calls = []; flags = [] + for line in open(f): + try: + e = json.loads(line) + except ValueError: + continue + content = (e.get("message") or {}).get("content") + for c in content if isinstance(content, list) else []: + if c.get("type") != "tool_use": + continue + name = c.get("name"); inp = c.get("input") or {} + call = {"tool": name, "input": {k: str(v)[:200] for k, v in inp.items()}}; calls.append(call) + if name in ("Read", "Write", "Edit"): + ok = str(inp.get("file_path", "")).startswith(folder + "/") + elif name == "Bash": + cmd = str(inp.get("command", "")).strip() + ok = bool(re.fullmatch(rf"(cd {re.escape(folder)} && )?bash submit\.sh \d+", cmd)) + if not ok: + call["class"] = classify(cmd, folder) + else: + ok = False + if not ok: + call.setdefault("class", "isolation_breach"); flags.append(call) + out[aid] = {"folder": folder, "n_tool_calls": len(calls), "flagged": flags, "clean": not flags, + "tools": sorted({c["tool"] for c in calls}), "breach": any(x["class"] == "isolation_breach" for x in flags), + "in_folder_edits": sum(1 for x in flags if x["class"] == "in_folder_edit")} + return out + + +def main(): + cmd = sys.argv[1] + if cmd == "prepare": + prepare(json.load(open(sys.argv[2]))) + elif cmd == "launch": + print(LAUNCH_TEXT.format(folder=Path(sys.argv[2]).resolve(), max_proposals=int(sys.argv[3]) if len(sys.argv) > 3 else 8)) + elif cmd == "audit": + res = audit(json.load(open(sys.argv[2])), sys.argv[3]); json.dump(res, open(sys.argv[4], "w"), indent=1) + print(sum(1 for v in res.values() if v.get("clean")), "clean of", len(res), "| flagged as breach", + sum(1 for v in res.values() if v.get("breach")), "| sessions with in-folder edits", sum(1 for v in res.values() if v.get("in_folder_edits"))) + else: + raise SystemExit(__doc__) + + +if __name__ == "__main__": + main() diff --git a/benchmarks/textbook_sharing/textbook_sharing/llm/evaluate.py b/benchmarks/textbook_sharing/textbook_sharing/llm/evaluate.py new file mode 100644 index 00000000..e6393bdd --- /dev/null +++ b/benchmarks/textbook_sharing/textbook_sharing/llm/evaluate.py @@ -0,0 +1,104 @@ +"""Evaluate one model proposal for one task (evaluator side; the model never sees this folder). +usage: python -m textbook_sharing.llm.evaluate +Reads /session.json (task_id, case_dir, model, rep) and /p_answer.md; writes +/p_report.json (full, evaluator-side) and /p_feedback.txt (what the model sees). +Every proposal consumes one unit of the proposal budget; a full EDA verification is run only for a legal plan that +was not proposed before in the same session (duplicates return the earlier feedback, flagged).""" +from __future__ import annotations +import sys, json, time, hashlib +from pathlib import Path +from textbook_sharing.llm.plan_parser import extract_code, parse_program, to_sharing_plan, ParseError + + +def feedback_text(rep): + if rep["status"] == "rejected_program": + lines = [f"Proposal {rep['k']}: REJECTED before building (no geometry was generated)."] + for e in rep["errors"]: lines.append(f" - [{e.get('code')}] {e.get('message')}" + (f" (line {e['line']})" if e.get("line") else "") + (f" group {e['group']}" if "group" in e else "")) + return "\n".join(lines) + r = rep["run"] + lines = [f"Proposal {rep['k']}: built and verified" + (" (DUPLICATE of an earlier proposal; same result)" if rep.get("duplicate_of") else "") + f". Overall status: {r['primary_status']}."] + v = r.get("verify", {}) + lines.append(" stages: " + ", ".join(f"{k}={v.get(k)}" for k in ("drc", "lvs", "constraints", "pex", "physical") if k in v) + f", post-layout simulation/spec={(r.get('postsim') or {}).get('status')}") + if r.get("area_um2") is not None: + st = r.get("assembly_stats", {}) + lines.append(f" full-DUT bounding box: {st.get('width')} x {st.get('height')} um = {r['area_um2']} um^2") + for row in st.get("row_dims", []): + lines.append(f" row {row['kind']}: width {row['width']} um (+ taps {2 * row['tap_extent']:.2f}), height {row['height']} um; cells " + ", ".join(f"{c['name']} {c['w']}x{c['h']}" for c in row["cells"])) + lines.append(f" routing channels: heights {[round(x, 3) for x in st.get('channel_heights', [])]} um; channel strategy {st.get('channel_strategy')}") + for gi, ev in enumerate(r.get("evidence") or []): + lines.append(f" group {gi}: active islands {ev.get('active_islands')}, cross-device shared diffusion nodes {ev.get('n_cross_device_shared_nodes')}, cross-device shared gate conductors {ev.get('n_cross_device_gate_conductors')}") + det = r.get("detail", {}) + for k in ("drc_categories", "lvs_final", "sizing", "spec_failures", "error"): + if det.get(k): lines.append(f" {k}: {det[k]}") + return "\n".join(lines) + + +def main(): + sd = Path(sys.argv[1]).resolve(); k = int(sys.argv[2]) + sess = json.load(open(sd / "session.json")) + from textbook_sharing.run_case import load_case_dir, pdk_obj, run + from textbook_sharing.circuits import CIRCUITS + from textbook_sharing.layout import device_specs, sharing_groups + from glayout.sharing import validate_plan, rules_for + case, cj = load_case_dir(sess["case_dir"]); circ = CIRCUITS[case.circuit_id]; pdk = pdk_obj(case.pdk) + groups = sharing_groups(device_specs(circ, case.sizing)) + ans = (sd / f"p{k}_answer.md").read_text() + rep = {"k": k, "t": time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime()), "answer_chars": len(ans)} + t0 = time.time(); errors = []; plans = {} + try: + code = extract_code(ans); rep["program_chars"] = len(code) + calls = parse_program(code, sess.get("interface", "sharing")) + missing = [gi for gi in range(len(groups)) if gi not in calls]; extra = [gi for gi in calls if gi >= len(groups)] + if missing: errors.append({"code": "missing_group", "message": f"no plan for group(s) {missing}"}) + if extra: errors.append({"code": "unknown_group", "message": f"group index(es) {extra} do not exist (groups 0..{len(groups) - 1})"}) + R = rules_for(pdk) + for gi, call in calls.items(): + if gi >= len(groups): continue + try: + plan = to_sharing_plan(call, groups[gi], pdk) + except ParseError as e: + errors.append({**e.to_json(), "group": gi}); continue + vr = validate_plan(R, groups[gi], plan) + if not vr.ok: + for e in vr.errors: errors.append({"code": e["code"], "message": e["message"], "group": gi}) + continue + plans[str(gi)] = plan.to_json() + except ParseError as e: + errors.append(e.to_json()) + rep["parse_check_s"] = round(time.time() - t0, 3) + if errors: + rep.update({"status": "rejected_program", "errors": errors}) + else: + gid = hashlib.sha256(json.dumps([plans[str(i)]["plan_id"] for i in range(len(groups))]).encode()).hexdigest()[:16] + rep["global_plan_id"] = gid + seen = json.load(open(sd / "seen.json")) if (sd / "seen.json").exists() else {} + if gid in seen: + old = json.load(open(sd / f"p{seen[gid]}_report.json")) + rep.update({"status": "evaluated", "duplicate_of": seen[gid], "run": old["run"]}) + else: + od = sd / f"p{k}_run" + r = run(sess["case_dir"], od, plans=plans, label=f"{sess['model_tag']}_r{sess['rep']}_p{k}", context={"experiment": "llm", "task": sess["task_id"], "model": sess["model_tag"]}, + nominal_sizing=sess.get("nominal_sizing")) + det = {} + vr = json.load(open(od / "verify" / "result.json")) if (od / "verify" / "result.json").exists() else {} + stg = vr.get("stages", {}) + if stg.get("drc", {}).get("categories"): det["drc_categories"] = stg["drc"]["categories"] + lv = stg.get("lvs", {}) + if lv.get("status") not in (None, "passed"): det["lvs_final"] = (lv.get("parsed") or {}).get("final") or lv.get("reason") + if stg.get("constraints", {}).get("status") not in (None, "passed"): det["sizing"] = {k2: v2 for k2, v2 in stg["constraints"].items() if k2 in ("status", "mismatches", "error")} + sp = (r.get("postsim") or {}).get("spec") or {} + fails = {m: {"value": d.get("value"), "limit": d.get("spec")} for m, d in sp.items() if not d.get("ok")} + if fails: det["spec_failures"] = fails + if r.get("error"): det["error"] = r["error"][:300] + r["detail"] = det + rep.update({"status": "evaluated", "run": {k2: r.get(k2) for k2 in ("primary_status", "verify", "area_um2", "assembly_stats", "evidence", "postsim", "detail", "timing_s", "gds_sha256", "applied_plans", "matching")}}) + seen[gid] = k; json.dump(seen, open(sd / "seen.json", "w")) + rep["evaluator_s"] = round(time.time() - t0, 2) + json.dump(rep, open(sd / f"p{k}_report.json", "w"), indent=1, default=str) + fb = feedback_text(rep) + (sd / f"p{k}_feedback.txt").write_text(fb) + print(fb) + + +if __name__ == "__main__": + main() diff --git a/benchmarks/textbook_sharing/textbook_sharing/llm/interface_base.md b/benchmarks/textbook_sharing/textbook_sharing/llm/interface_base.md new file mode 100644 index 00000000..9815f23a --- /dev/null +++ b/benchmarks/textbook_sharing/textbook_sharing/llm/interface_base.md @@ -0,0 +1,45 @@ +# Device-placement interface (what you can control) + +You are choosing the physical organisation of the transistors of an analog circuit. The circuit (devices, nets, +total widths W, lengths L, finger counts nf, body connections), the process, the row skeleton and the grouping of +transistors are FIXED by the task; you cannot change them. A deterministic generator (gLayout) builds the layout from your plan, and independent tools (official DRC deck, LVS against the target netlist, +an extracted-width check, parasitic extraction and post-layout simulation against frozen specifications) judge it. + +## Fixed skeleton +* Every MOS transistor is split into nf unit fingers of width W/nf (finger k of device "M3" is ("M3", k)). +* Transistors are pre-assigned to sharing groups (same polarity, body net, length and finger width). Each group + becomes one row cell; NMOS groups go in the bottom row, PMOS groups in the row above, resistors/capacitors in a top + row. Routing channels between rows, body ties, wells, metal-3 trunks and pin labels are generated automatically and + identically for every plan. +* Objective: the smallest full bounding-box area among plans that pass every check. A plan that fails a check has no area value. + +## What you choose for one group +This interface offers the device-level options of base gLayout: multi-finger transistors (neighbouring fingers of the +SAME transistor share a source/drain diffusion region) and the interdigitated / common-centroid placement of the +transistors of a group in one row. Different transistors never share a diffusion region or a gate conductor here: +every transistor has its own gate strap below the row, and fingers of different transistors are separated by an +active-island gap. + +For every group write `fet_row(arrangement=..., orientation=..., contact_end=...)`: +* arrangement: "block" = transistors one after another; "interleave" = round-robin finger by finger (interdigitated); + "abba" = A B B A ... (two transistors with an even finger count, common centroid); "mirror" = first halves in + order, then second halves in reverse order (even finger counts). +* orientation: "alt_SD" or "alt_DS" = the fingers alternate source/drain along the row starting with source-left or + drain-left (this is what lets neighbouring fingers of one transistor share their diffusion). +* contact_end: "left" or "right" = end of each transistor's gate strap where its contact pad sits. + +## How to write it +Answer with ONE ```python block containing exactly one statement, `plans = {group_index: fet_row(...), ...}`, with an +entry for every group, e.g. + +```python +plans = {0: fet_row(arrangement="interleave", orientation="alt_SD", contact_end="left"), + 1: fet_row(arrangement="block", orientation="alt_DS", contact_end="right")} +``` +Only this call with keyword arguments is accepted; anything else is rejected with a reason and still counts as a proposal. + +## Feedback you will get +After each proposal: either the list of reasons it was rejected before building, or the tool report (status of every +check, bounding box, row and cell sizes, how many diffusion nodes / gate conductors are shared across devices, and +failure details). Each proposal (including rejected and repeated ones) uses one unit of your proposal budget. +You may stop early by answering with the single word FINAL (your best passing proposal is kept). diff --git a/benchmarks/textbook_sharing/textbook_sharing/llm/interface_sharing.md b/benchmarks/textbook_sharing/textbook_sharing/llm/interface_sharing.md new file mode 100644 index 00000000..3a989d2e --- /dev/null +++ b/benchmarks/textbook_sharing/textbook_sharing/llm/interface_sharing.md @@ -0,0 +1,71 @@ +# Sharing-plan interface (what you can control) + +You are choosing the physical organisation of the transistors of an analog circuit. The circuit (devices, nets, +total widths W, lengths L, finger counts nf, body connections), the process, the row skeleton and the grouping of +transistors are FIXED by the task; you cannot change them. A deterministic generator (gLayout with a shared-construction +extension) builds the layout from your plan, and independent tools (official DRC deck, LVS against the target netlist, +an extracted-width check, parasitic extraction and post-layout simulation against frozen specifications) judge it. + +## Fixed skeleton +* Every MOS transistor is split into nf unit fingers of width W/nf (finger k of device "M3" is ("M3", k)). +* Transistors are pre-assigned to sharing groups (same polarity, body net, length and finger width). Each group + becomes one row cell; NMOS groups go in the bottom row, PMOS groups in the row above, resistors/capacitors in a top + row. Routing channels between rows, body ties, wells, metal-3 trunks and pin labels are generated automatically and + identically for every plan. +* Objective: the smallest full bounding-box area among plans that pass every check. A plan that fails a check has no area value. + +## What a plan of one group fixes +A plan lists the group's fingers left to right and decides, for each finger, which side is its source: +* `finger_order`: every unit finger of every device of the group exactly once, e.g. [("M1",0),("M2",0),("M1",1)]. +* `orientations`: one entry per position, "SD" (source on the left, drain on the right) or "DS". +* `diffusion_joins`: n-1 booleans; True between positions i and i+1 means the two fingers share ONE diffusion region and + contact column. This is legal only if the right terminal net of finger i equals the left terminal net of finger i+1 + (same device or different devices). Unjoined neighbours become separate active islands with a spacing gap. +* `gate_groups`: a partition of the positions into poly straps, `GateGroup(fingers=(positions...), side="bottom"|"top", + pad_end="left"|"right")`. All gates of one strap must carry the same gate net. A bottom strap runs below the + active over the span of its fingers with its contact pad at the left or right end of that span. A top strap runs above + the active and reaches from its fingers to the left or right end of the group, where its pad sits. Two straps on the + same side must not overlap in span (top straps: in reach); at most two top straps (one reaching left, one right). +* Each extra active island costs width (island gap); each top strap costs height (an extra strap band); straps on both + sides of one span need an extra spacing offset; more bottom straps need a second pad level (height). + +## How to write it +Answer with ONE ```python block containing exactly one statement, `plans = {group_index: plan, ...}`, with an +entry for every group. A plan is either + +```python +SharingPlan(finger_order=[("M1", 0), ("M2", 0), ("M2", 1), ("M1", 1)], + orientations=["SD", "DS", "SD", "DS"], + diffusion_joins=[True, True, True], + gate_groups=[GateGroup(fingers=(0, 3), side="bottom", pad_end="left"), + GateGroup(fingers=(1, 2), side="top", pad_end="right")]) +``` + +or the axis shorthand (expands deterministically into a SharingPlan): + +```python +axis_plan(arrangement="block"|"interleave"|"abba"|"mirror", + orientation="alt_SD"|"alt_DS"|"seek_SD"|"seek_DS", + diffusion="none"|"all_legal", gate="per_device"|"per_net", + strap_start="bottom"|"top", contact_end="left"|"right") +``` +* arrangement: block = devices one after another; interleave = round-robin finger by finger; abba = A B B A ... (two + devices, even nf); mirror = first halves in order, then second halves in reverse order (even nf). +* orientation: alt_* alternate SD/DS along the row starting with SD or DS; seek_* start with SD/DS and then give each + finger the orientation whose left net equals the previous finger's right net (otherwise alternate). +* diffusion: none = join only neighbouring fingers of the same device; all_legal = join every neighbouring pair whose + facing nets are equal (this is where different devices share a diffusion node). +* gate: per_device = one strap per device; per_net = one strap per gate net (different devices with the same gate net + share one poly conductor). +* strap_start: side of the first strap (by first finger); later straps take that side unless they overlap a strap + already there, then the other side. contact_end: pad end of the straps. + +Only literals, lists/tuples/dicts, list concatenation `+` and repetition `*` by an integer, `range(...)`, `list(...)`, +`tuple(...)` and calls of `SharingPlan`, `GateGroup`, `axis_plan` with keyword arguments are accepted; this is a +restricted program format, not general Python. Anything else is rejected with a reason and still counts as a proposal. + +## Feedback you will get +After each proposal: either the list of reasons it was rejected before building, or the tool report (status of every +check, bounding box, row and cell sizes, how many diffusion nodes / gate conductors are shared across devices, and +failure details). Each proposal (including rejected and repeated ones) uses one unit of your proposal budget. +You may stop early by answering with the single word FINAL (your best passing proposal is kept). diff --git a/benchmarks/textbook_sharing/textbook_sharing/llm/make_examples.py b/benchmarks/textbook_sharing/textbook_sharing/llm/make_examples.py new file mode 100644 index 00000000..8f0ce255 --- /dev/null +++ b/benchmarks/textbook_sharing/textbook_sharing/llm/make_examples.py @@ -0,0 +1,67 @@ +"""Build examples.md for the model sessions from REAL evaluator runs on two development topologies (C01 basic mirror, +C07 differential pair with current-source loads; SKY130, nominal size). Neither topology is a task topology. +For each: program A in the axis shorthand, program B as an explicit SharingPlan (text rendered from a legal named plan of +that development case), and for C07 also one deliberately illegal program, so the rejection format is shown. Every +report shown is the evaluator's own feedback text for that program. +usage: python -m textbook_sharing.llm.make_examples [--interface base] -> /model_tasks/examples.md (+ /model_examples// sessions)""" +from __future__ import annotations +import sys, json, subprocess +from textbook_sharing import paths +CASES = [("C01", "sky130", "sW1_sL1"), ("C07", "sky130", "sW1_sL1")] + + +def plan_python(pj): + fo = ", ".join(f'("{d}", {k})' for d, k in pj["finger_order"]) + gg = ", ".join(f'GateGroup(fingers=({", ".join(str(x) for x in f)}{"," if len(f) == 1 else ""}), side="{s}", pad_end="{e}")' for f, s, e in pj["gate_groups"]) + return (f"SharingPlan(finger_order=[{fo}],\n" + f" orientations={json.dumps(pj['orientations'])},\n" + f" diffusion_joins={str(pj['diffusion_joins'])},\n" + f" gate_groups=[{gg}])") + + +def main(): + import argparse + ap = argparse.ArgumentParser(); ap.add_argument("--interface", default="sharing"); a = ap.parse_args(); base = a.interface == "base" + from textbook_sharing.run_case import load_case_dir, pdk_obj + from textbook_sharing.circuits import CIRCUITS + from textbook_sharing.layout import device_specs, sharing_groups + from glayout.sharing import named_plans + from textbook_sharing.llm.tasks import task_text + parts = ["Each example shows a development circuit (NOT your task circuit), programs that were submitted for it, and the tool " + "report each program received. Areas of development circuits say nothing about your task's areas."] + for cid, pdk, size in CASES: + cdir = paths.CASES / cid / pdk / size + case, cj = load_case_dir(str(cdir)); groups = sharing_groups(device_specs(CIRCUITS[cid], case.sizing)); pk = pdk_obj(pdk) + sd = paths.MODEL_EXAMPLES / (f"{cid}_{pdk}_{size}" + ("_base" if base else "")); sd.mkdir(parents=True, exist_ok=True) + json.dump({"task_id": f"example_{cid}", "case_dir": paths.rel(cdir), "model_tag": "examples", "rep": 0, "interface": a.interface}, open(sd / "session.json", "w")) + axis = ", ".join(f'{gi}: axis_plan(arrangement="block", orientation="alt_SD", diffusion="none", gate="per_device", strap_start="bottom", contact_end="left")' for gi in range(len(groups))) + progs = [f"plans = {{{axis}}}"] + expl = [] + for gi, g in enumerate(groups): + nm = named_plans(pk, g); pl = nm.get("combined") or nm.get("diffusion_only") or nm["independent"] + expl.append(f"{gi}: {plan_python(pl.to_json())}") + progs.append("plans = {" + ",\n ".join(expl) + "}") + if cid == "C07": + g0 = groups[0]; d0 = g0[0].logical_id + bad = (f'plans = {{0: SharingPlan(finger_order=[("{d0}", 0), ("{d0}", 1)], orientations=["SD", "SD"], diffusion_joins=[True], ' + f'gate_groups=[GateGroup(fingers=(0, 1), side="bottom", pad_end="left")])' + "".join(f", {gi}: axis_plan(arrangement=\"block\", orientation=\"alt_SD\", diffusion=\"none\", gate=\"per_device\", strap_start=\"bottom\", contact_end=\"left\")" for gi in range(1, len(groups))) + "}") + progs.append(bad) + if base: + fr = lambda arr, ori, ce: f'fet_row(arrangement="{arr}", orientation="{ori}", contact_end="{ce}")' + progs = ["plans = {" + ", ".join(f"{gi}: " + fr("block", "alt_SD", "left") for gi in range(len(groups))) + "}", + "plans = {" + ", ".join(f"{gi}: " + fr("interleave", "alt_DS", "right") for gi in range(len(groups))) + "}"] + if cid == "C07": + progs.append("plans = {" + ", ".join(f'{gi}: fet_row(arrangement="block", orientation="alt_SD", contact_end="left", diffusion="all_legal")' for gi in range(len(groups))) + "}") + parts.append(f"\n## Example: {cid} ({pdk}, development size)\n" + task_text(str(cdir)).replace("# Task", "Case")) + for k, prog in enumerate(progs, start=1): + (sd / f"p{k}_answer.md").write_text(f"```python\n{prog}\n```\n") + r = subprocess.run([sys.executable, "-m", "textbook_sharing.llm.evaluate", str(sd), str(k)], capture_output=True, text=True, cwd=str(paths.ROOT)) + fb = (sd / f"p{k}_feedback.txt").read_text() if (sd / f"p{k}_feedback.txt").exists() else ("EVALUATOR ERROR\n" + r.stderr[-800:]) + parts.append(f"\n### Program {k}\n```python\n{prog}\n```\n### Tool report for program {k}\n```\n{fb}\n```") + out = paths.MODEL_TASKS / ("examples_base.md" if base else "examples.md"); out.parent.mkdir(parents=True, exist_ok=True) + out.write_text("\n".join(parts) + "\n") + print("written", out, len(out.read_text()), "chars") + + +if __name__ == "__main__": + main() diff --git a/benchmarks/textbook_sharing/textbook_sharing/llm/plan_parser.py b/benchmarks/textbook_sharing/textbook_sharing/llm/plan_parser.py new file mode 100644 index 00000000..13be9650 --- /dev/null +++ b/benchmarks/textbook_sharing/textbook_sharing/llm/plan_parser.py @@ -0,0 +1,163 @@ +"""Restricted-Python front end for model-written sharing programs. + +A model answer must contain one ```python block whose only statement is + + plans = { : , ... } # one entry per sharing group of the task + + is either + SharingPlan(finger_order=[("M1", 0), ...], orientations=["SD", ...], diffusion_joins=[True, ...], + gate_groups=[GateGroup(fingers=(0, 2), side="bottom", pad_end="left"), ...]) +or axis_plan(arrangement=..., orientation=..., diffusion=..., gate=..., strap_start=..., contact_end=...) + +This is NOT a Python interpreter: the AST is walked by `_ev`, which accepts only literals, list/tuple/dict displays, +unary minus, list/tuple concatenation and repetition by an integer literal, `range(...)`, `list(...)`, `tuple(...)`, +and calls of the three names above with keyword arguments. Anything else is rejected with a structured error +(code, message, line). The parsed plans are then checked by glayout.sharing.validate_plan (the same legality check +the builders use) and built by textbook_sharing.layout.build.""" +from __future__ import annotations +import ast, re + +ALLOWED_CALLS = {"SharingPlan", "GateGroup", "axis_plan", "fet_row", "range", "list", "tuple"} +# interface variants: "sharing" (the sharing interface) and "base" (capability of base gLayout multi-finger devices and +# interdigitated / common-centroid placement helpers: per-device finger arrangement, orientation and contact end, +# fingers of one device share diffusion, NO cross-device diffusion node and NO shared gate conductor) +INTERFACE_CALLS = {"sharing": ("SharingPlan", "axis_plan"), "base": ("fet_row",)} +BASE_FIXED = {"diffusion": "none", "gate": "per_device", "strap_start": "bottom"} +BASE_AXES = {"arrangement": ("block", "interleave", "abba", "mirror"), "orientation": ("alt_SD", "alt_DS"), "contact_end": ("left", "right")} + + +class ParseError(Exception): + def __init__(self, code, message, line=None): + super().__init__(message); self.code = code; self.message = message; self.line = line + + def to_json(self): + return {"code": self.code, "message": self.message, "line": self.line} + + +def extract_code(answer: str) -> str: + m = re.findall(r"```(?:python|py)?\s*\n(.*?)```", answer, re.S) + if not m: + raise ParseError("no_code_block", "the answer must contain exactly one ```python code block") + if len(m) > 1: + raise ParseError("multiple_code_blocks", f"found {len(m)} code blocks; give exactly one") + return m[0] + + +def _ev(node): + if isinstance(node, ast.Constant): + if isinstance(node.value, (int, float, str, bool)) or node.value is None: return node.value + raise ParseError("literal_type", f"literal of type {type(node.value).__name__} not allowed", node.lineno) + if isinstance(node, ast.UnaryOp) and isinstance(node.op, ast.USub): + v = _ev(node.operand) + if isinstance(v, (int, float)): return -v + raise ParseError("operator", "unary minus only on numbers", node.lineno) + if isinstance(node, (ast.List, ast.Tuple)): + vals = [_ev(e) for e in node.elts] + return vals if isinstance(node, ast.List) else tuple(vals) + if isinstance(node, ast.Dict): + return {_ev(k): _ev(v) for k, v in zip(node.keys, node.values)} + if isinstance(node, ast.BinOp) and isinstance(node.op, (ast.Add, ast.Mult)): + a, b = _ev(node.left), _ev(node.right) + if isinstance(node.op, ast.Add) and isinstance(a, (list, tuple)) and type(a) == type(b): return a + b + if isinstance(node.op, ast.Mult) and isinstance(a, (list, tuple)) and isinstance(b, int) and 0 <= b <= 512: return a * b + if isinstance(node.op, ast.Mult) and isinstance(b, (list, tuple)) and isinstance(a, int) and 0 <= a <= 512: return b * a + raise ParseError("operator", "only list/tuple concatenation and repetition by a small integer are allowed", node.lineno) + if isinstance(node, ast.Call): + if not isinstance(node.func, ast.Name) or node.func.id not in ALLOWED_CALLS: + raise ParseError("call_not_allowed", f"only {sorted(ALLOWED_CALLS)} may be called", node.lineno) + name = node.func.id + args = [_ev(a) for a in node.args]; kw = {k.arg: _ev(k.value) for k in node.keywords if k.arg} + if any(k.arg is None for k in node.keywords): + raise ParseError("syntax", "**kwargs not allowed", node.lineno) + if name == "range": + if kw or not (1 <= len(args) <= 3) or not all(isinstance(a, int) for a in args): + raise ParseError("range", "range takes 1-3 integer arguments", node.lineno) + r = list(range(*args)) + if len(r) > 4096: raise ParseError("range", "range too long", node.lineno) + return r + if name in ("list", "tuple"): + if kw or len(args) != 1 or not isinstance(args[0], (list, tuple)): + raise ParseError("call_args", f"{name}() takes one list/tuple/range", node.lineno) + return list(args[0]) if name == "list" else tuple(args[0]) + if args: + raise ParseError("call_args", f"{name}() takes keyword arguments only", node.lineno) + return {"__call__": name, **kw, "__line__": node.lineno} + raise ParseError("syntax", f"construct {type(node).__name__} is not allowed in a plan program", getattr(node, "lineno", None)) + + +def parse_program(code: str, interface: str = "sharing") -> dict: + """Returns {group_index: call-dict}. Raises ParseError.""" + try: + tree = ast.parse(code) + except SyntaxError as e: + raise ParseError("python_syntax", f"Python syntax error: {e.msg}", e.lineno) + stmts = [s for s in tree.body if not (isinstance(s, ast.Expr) and isinstance(s.value, ast.Constant) and isinstance(s.value.value, str))] + if len(stmts) != 1 or not isinstance(stmts[0], ast.Assign) or len(stmts[0].targets) != 1 or not isinstance(stmts[0].targets[0], ast.Name) or stmts[0].targets[0].id != "plans": + raise ParseError("program_shape", "the program must consist of exactly one statement: plans = {...}") + val = _ev(stmts[0].value) + if not isinstance(val, dict): + raise ParseError("program_shape", "plans must be a dict {group_index: plan}") + out = {} + for k, v in val.items(): + if not isinstance(k, int): raise ParseError("group_key", f"group keys must be integers, got {k!r}") + allowed = INTERFACE_CALLS[interface] + if not (isinstance(v, dict) and v.get("__call__") in allowed): + raise ParseError("plan_value", f"group {k}: value must be one of {' / '.join(a + '(...)' for a in allowed)} in this interface") + out[k] = v + return out + + +def to_sharing_plan(call: dict, devices, pdk): + """Turn a parsed call into a glayout.sharing.SharingPlan (or raise ParseError with a structured reason).""" + from glayout.sharing import SharingPlan, GateGroup, FingerRef + from glayout.sharing import enumeration as E + line = call.get("__line__") + if call["__call__"] == "fet_row": + keys = set(k for k in call if not k.startswith("__")) + if keys != set(BASE_AXES): + raise ParseError("fet_row_args", f"fet_row needs exactly {sorted(BASE_AXES)}; got {sorted(keys)}", line) + for k, vals in BASE_AXES.items(): + if call[k] not in vals: raise ParseError("axis_value", f"{k}={call[k]!r} not in {list(vals)}", line) + call = {**{k: v for k, v in call.items()}, **BASE_FIXED, "__call__": "axis_plan"} + pl = to_sharing_plan(call, devices, pdk); pl.mode_label = "llm:fet_row"; return pl + if call["__call__"] == "axis_plan": + keys = set(k for k in call if not k.startswith("__")) + need = set(E.AXES) + if keys != need: + raise ParseError("axis_plan_args", f"axis_plan needs exactly {sorted(need)}; got {sorted(keys)}", line) + for k in need: + if call[k] not in E.AXES[k]: + raise ParseError("axis_value", f"{k}={call[k]!r} not in {list(E.AXES[k])}", line) + dev = {d.logical_id: d for d in devices} + order, why = E._order(devices, call["arrangement"]) + if order is None: raise ParseError("axis_illegal", why, line) + orient = E._orientations(order, dev, call["orientation"]) + joins = E._joins(order, orient, dev, call["diffusion"]) + gg, why = E._gate_groups(order, dev, call["gate"], call["strap_start"], call["contact_end"]) + if gg is None: raise ParseError("axis_illegal", why, line) + return SharingPlan(order, orient, joins, gg, mode_label="llm:axis_plan") + req = {"finger_order", "orientations", "diffusion_joins", "gate_groups"} + keys = set(k for k in call if not k.startswith("__")) + if not req <= keys or keys - req: + raise ParseError("sharingplan_args", f"SharingPlan needs exactly {sorted(req)}; got {sorted(keys)}", line) + try: + fo = [FingerRef(str(a), int(b)) for a, b in call["finger_order"]] + except Exception: + raise ParseError("finger_order", "finger_order must be a list of (device_name, finger_index) pairs", line) + gg = [] + for g in call["gate_groups"]: + if not (isinstance(g, dict) and g.get("__call__") == "GateGroup"): + raise ParseError("gate_groups", "gate_groups must be a list of GateGroup(...)", line) + gk = set(k for k in g if not k.startswith("__")) + if gk != {"fingers", "side", "pad_end"}: + raise ParseError("gategroup_args", f"GateGroup needs fingers, side, pad_end; got {sorted(gk)}", g.get("__line__")) + try: + gg.append(GateGroup(tuple(int(x) for x in g["fingers"]), str(g["side"]), str(g["pad_end"]))) + except Exception: + raise ParseError("gategroup_args", "GateGroup fingers must be integer positions", g.get("__line__")) + ori = call["orientations"]; joins = call["diffusion_joins"] + if not (isinstance(ori, list) and all(isinstance(o, str) for o in ori)): + raise ParseError("orientations", "orientations must be a list of 'SD'/'DS' strings", line) + if not (isinstance(joins, list) and all(isinstance(j, bool) for j in joins)): + raise ParseError("diffusion_joins", "diffusion_joins must be a list of True/False", line) + return SharingPlan(fo, list(ori), list(joins), gg, mode_label="llm:SharingPlan") diff --git a/benchmarks/textbook_sharing/textbook_sharing/llm/run_codex.py b/benchmarks/textbook_sharing/textbook_sharing/llm/run_codex.py new file mode 100644 index 00000000..650613a4 --- /dev/null +++ b/benchmarks/textbook_sharing/textbook_sharing/llm/run_codex.py @@ -0,0 +1,117 @@ +"""Run model sessions with an OpenAI model through the official Codex CLI (`codex exec`, non-interactive). + +Isolation: every call runs in an empty temporary directory with the shell tool and every other tool family disabled, +web search disabled, user configuration and rules ignored, and no session files kept (ephemeral). The model therefore +sees only the prompt text. The JSONL event log of every call is stored and checked: any item other than a message or +reasoning (for example a command execution) marks the call as an isolation breach and the session is flagged. +The CLI must already be logged in; this script never reads or writes credentials. +Conversation: each proposal is a fresh, stateless call whose prompt contains the interface, the worked examples, the +task and every earlier proposal with its tool report. Budget per session: max_proposals (rejected and repeated +proposals count). After each proposal the evaluator (llm/evaluate.py) builds and verifies the plan and writes the +report that goes into the next prompt. + +usage: python -m textbook_sharing.llm.run_codex +config keys: model, model_tag, effort, max_proposals, reps, parallel (default 3), interface ("sharing" | "base"), + examples (path to examples.md), only (optional list of task ids), reps_only (optional list of repetition numbers), + codex (optional path of the CLI, default "codex" on PATH), + evaluator_cmd (optional; default runs the evaluator in this Python; use e.g. + "scripts/run_in_container.sh 'python -m textbook_sharing.llm.evaluate {session} {k}'" when the EDA tools live in the + container).""" +import json, shlex, subprocess, sys, tempfile, time, threading +from concurrent.futures import ThreadPoolExecutor +from pathlib import Path +from textbook_sharing import paths + +DISABLE = ["shell_tool", "apps", "plugins", "browser_use", "browser_use_external", "computer_use", "in_app_browser", "image_generation", "skill_search", "sleep_tool"] +lock = threading.Lock() + + +def call_codex(codex, prompt, model, effort, logdir, tag): + with tempfile.TemporaryDirectory(prefix="codex_iso_") as tmp: + cmd = [codex, "exec", "--ephemeral", "--ignore-user-config", "--ignore-rules", "--skip-git-repo-check", "-s", "read-only", "-C", tmp, + "-m", model, "-c", f'model_reasoning_effort="{effort}"', "-c", 'web_search="disabled"', "--json"] + for f in DISABLE: + cmd += ["--disable", f] + cmd += ["-"] + t0 = time.time() + r = subprocess.run(cmd, input=prompt, capture_output=True, text=True, timeout=1800, cwd=tmp) + dt = time.time() - t0 + (logdir / f"{tag}_events.jsonl").write_text(r.stdout); (logdir / f"{tag}_stderr.txt").write_text(r.stderr[-20000:]) + msg = ""; usage = None; kinds = {}; breach = False + for line in r.stdout.splitlines(): + try: + e = json.loads(line) + except Exception: + continue + it = e.get("item") or {} + if it.get("type"): + kinds[it["type"]] = kinds.get(it["type"], 0) + 1 + if it.get("type") == "agent_message": + msg = it.get("text", "") + elif it.get("type") and it.get("type") not in ("agent_message", "reasoning"): + breach = True + if e.get("type") == "turn.completed": + usage = e.get("usage") + return {"answer": msg, "usage": usage, "item_kinds": kinds, "isolation_breach": breach, "rc": r.returncode, "seconds": round(dt, 1)} + + +def evaluate(cfg, sd, k): + tmpl = cfg.get("evaluator_cmd") + if tmpl: + cmd = tmpl.format(session=shlex.quote(str(sd)), k=k) + r = subprocess.run(cmd, shell=True, capture_output=True, text=True, cwd=str(paths.ROOT)) + else: + r = subprocess.run([sys.executable, "-m", "textbook_sharing.llm.evaluate", str(sd), str(k)], capture_output=True, text=True, cwd=str(paths.ROOT)) + fb = sd / f"p{k}_feedback.txt" + return fb.read_text() if fb.exists() and fb.read_text().strip() else f"(evaluator error: {r.stderr[-400:]})" + + +def run_session(cfg, task, rep): + model, tag = cfg["model"], cfg["model_tag"] + sd = paths.MODEL_RUNS / tag / task["task_id"] / f"r{rep}"; sd.mkdir(parents=True, exist_ok=True) + if (sd / "session_done.json").exists(): + return json.load(open(sd / "session_done.json")) + tdir = paths.MODEL_TASKS / task["task_id"] + interface = Path(__file__).with_name("interface_base.md" if cfg.get("interface") == "base" else "interface_sharing.md").read_text() + taskmd = (tdir / "task.md").read_text(); examples = Path(cfg["examples"]).read_text() + sess = {"task_id": task["task_id"], "case_dir": task["case_dir"], "model_tag": tag, "model": model, "rep": rep, "entry": "codex-cli exec (OpenAI)", + "reasoning_effort": cfg["effort"], "max_proposals": cfg["max_proposals"], "interface": cfg.get("interface", "sharing"), + "started": time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime())} + json.dump(sess, open(sd / "session.json", "w"), indent=1) + history = []; calls = [] + for k in range(1, cfg["max_proposals"] + 1): + hist = "".join(f"\n## Your proposal {h['k']}\n{h['answer']}\n\n## Tool report for proposal {h['k']}\n{h['feedback']}\n" for h in history) + prompt = (f"{interface}\n\n# Worked examples (development circuits, not the task circuit)\n{examples}\n\n{taskmd}\n{hist}\n" + f"Now give proposal {k} of at most {cfg['max_proposals']} (remaining after this one: {cfg['max_proposals'] - k}). " + "Reply with exactly one ```python block containing `plans = {...}`, or with the single word FINAL to stop.") + (sd / f"p{k}_prompt.md").write_text(prompt) + c = call_codex(cfg.get("codex", "codex"), prompt, model, cfg["effort"], sd, f"p{k}") + calls.append({"k": k, **{x: c[x] for x in ("usage", "item_kinds", "isolation_breach", "rc", "seconds")}, "prompt_chars": len(prompt), "answer_chars": len(c["answer"])}) + (sd / f"p{k}_answer.md").write_text(c["answer"]) + if c["answer"].strip().upper().startswith("FINAL") and "```" not in c["answer"]: + break + fb = evaluate(cfg, sd, k) + history.append({"k": k, "answer": c["answer"], "feedback": fb}) + with lock: + print(tag, task["task_id"], f"r{rep}", f"p{k}", fb.splitlines()[0][:150] if fb else "", c["seconds"], "s", flush=True) + done = {"task_id": task["task_id"], "rep": rep, "model_tag": tag, "n_proposals": len(history), "calls": calls, + "isolation_breach_any": any(x["isolation_breach"] for x in calls), "finished": time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime())} + json.dump(done, open(sd / "session_done.json", "w"), indent=1) + return done + + +def main(): + cfg = json.load(open(sys.argv[1])) + tasks = json.load(open(paths.MODEL_TASKS / "tasks.json"))["tasks"] + if cfg.get("only"): + tasks = [t for t in tasks if t["task_id"] in cfg["only"]] + jobs = [(t, rep) for rep in range(1, cfg["reps"] + 1) for t in tasks] + if cfg.get("reps_only"): + jobs = [(t, rep) for t, rep in jobs if rep in cfg["reps_only"]] + with ThreadPoolExecutor(cfg.get("parallel", 3)) as ex: + for d in ex.map(lambda tr: run_session(cfg, *tr), jobs): + print("DONE", d["task_id"], d["rep"], d["n_proposals"], "breach" if d["isolation_breach_any"] else "", flush=True) + + +if __name__ == "__main__": + main() diff --git a/benchmarks/textbook_sharing/textbook_sharing/llm/tasks.py b/benchmarks/textbook_sharing/textbook_sharing/llm/tasks.py new file mode 100644 index 00000000..ad7beb28 --- /dev/null +++ b/benchmarks/textbook_sharing/textbook_sharing/llm/tasks.py @@ -0,0 +1,82 @@ +"""Build the model-visible task packages. Evaluator-side; writes only allowed content into +/model_tasks// (task.md, interface.md, examples.md). Nothing from the selection catalogue, no measured +area of any other plan, no reference program of the test topology, and no hidden case data is written there. +Main LLM tasks: topologies C02 C08 C09 C11 C16 C18 x 3 PDKs x sizes (2,1),(2,2) -> 36 requested; a task is eligible +only when its case is qualified and its reference implementation (independent mode in the main grid) passes every +automatic stage. Examples: two development topologies (C01 basic mirror, C07 differential pair) at the nominal size in +SKY130, each with two programs and the tool reports they received (from the main-grid runs of those dev cases). +usage: python -m textbook_sharing.llm.tasks""" +from __future__ import annotations +import json +from pathlib import Path +from textbook_sharing.grid import LLM_SIZES, SELECTION_TOPOLOGIES, size_tag +from textbook_sharing import paths + +OUT = paths.MODEL_TASKS +TOPO_NAMES = {"C01": "basic current mirror", "C02": "cascode current mirror", "C07": "differential pair with current-source loads", + "C08": "five-transistor OTA", "C09": "telescopic OTA (single-ended)", "C11": "two-stage Miller op amp with RC compensation", + "C16": "differential pair with resistor loads", "C18": "class-AB source-follower output stage"} +PDK_NAMES = {"sky130": "SkyWater SKY130 (1.8 V devices)", "gf180": "GlobalFoundries GF180MCU (3.3 V devices)", "ihp130": "IHP SG13G2 (1.2 V low-voltage devices)"} + + +def groups_text(case_dir): + from textbook_sharing.run_case import load_case_dir + from textbook_sharing.circuits import CIRCUITS + from textbook_sharing.layout import device_specs, sharing_groups + case, cj = load_case_dir(case_dir); circ = CIRCUITS[case.circuit_id] + groups = sharing_groups(device_specs(circ, case.sizing)) + lines = [] + for gi, g in enumerate(groups): + row = "bottom (NMOS) row" if g[0].model_role == "nfet" else "middle (PMOS) row" + lines.append(f"group {gi} ({row}, body {g[0].b}, unit finger width {g[0].unit_width:g} um, L {g[0].length:g} um):") + for d in g: + lines.append(f" {d.logical_id}: {d.model_role} D={d.d} G={d.g} S={d.s} B={d.b}, nf={d.nf}, total W={d.width_total:g} um") + passives = [d for d in circ.devices if d.kind in ("res", "cap")] + if passives: + lines.append("passive row (fixed, not part of any plan): " + ", ".join(f"{d.name} ({d.kind} {d.nets[0]}-{d.nets[1]})" for d in passives)) + return "\n".join(lines), len(groups) + + +def task_text(case_dir): + cj = json.load(open(Path(case_dir) / "case.json")) + gt, ng = groups_text(case_dir) + netlist = (Path(case_dir) / "target.spice").read_text() + return f"""# Task {cj['case_id']} +Circuit: {TOPO_NAMES.get(cj['circuit_id'], cj['circuit_id'])} (textbook topology {cj['circuit_id']}). +Process: {PDK_NAMES[cj['pdk']]}. +Target netlist (fixed; sizes in um): +```spice +{netlist.strip()} +``` +Fixed sharing groups and rows ({ng} groups; you must give a plan for every group index): +{gt} +Goal: propose plans so that the generated layout passes every check with the smallest full bounding-box area. +""" + + +def main(): + OUT.mkdir(parents=True, exist_ok=True) + tasks = []; excluded = [] + for cid in SELECTION_TOPOLOGIES: + for pdk in ("sky130", "gf180", "ihp130"): + for sw, sl in LLM_SIZES: + tag = size_tag(sw, sl); tid = f"{cid}_{pdk}_{tag}" + cdir = paths.CASES / cid / pdk / tag + q = cdir / "qualification.json" + if not q.exists(): excluded.append({"task_id": tid, "reason": "no case (parameter-illegal or duplicate request)"}); continue + if json.load(open(q))["stage"] != "qualified": + excluded.append({"task_id": tid, "reason": "schematic not qualified: " + "; ".join(json.load(open(q))["qualification"]["reasons"][:2])}); continue + ref = paths.GRID_RUNS / cid / pdk / tag / "independent" / "result.json" + if not ref.exists() or json.load(open(ref)).get("primary_status") != "auto_passed": + excluded.append({"task_id": tid, "reason": "no passing reference implementation" if ref.exists() else "reference not run"}); continue + td = OUT / tid; td.mkdir(parents=True, exist_ok=True) + (td / "task.md").write_text(task_text(cdir)) + (td / "interface.md").write_text(Path(__file__).with_name("interface_sharing.md").read_text()) + tasks.append({"task_id": tid, "case_dir": paths.rel(cdir)}) + json.dump({"tasks": tasks, "excluded": excluded}, open(OUT / "tasks.json", "w"), indent=1) + print("eligible", len(tasks), "excluded", len(excluded)) + for e in excluded: print(" ", e) + + +if __name__ == "__main__": + main() diff --git a/benchmarks/textbook_sharing/textbook_sharing/matching.py b/benchmarks/textbook_sharing/textbook_sharing/matching.py new file mode 100644 index 00000000..2a6f4156 --- /dev/null +++ b/benchmarks/textbook_sharing/textbook_sharing/matching.py @@ -0,0 +1,58 @@ +"""Declared matching constraints of the 18 topologies and their geometric check. + +Only what a case declares is checked. Declared per matched set: + ratio (hard): the total-width ratio of the devices equals the nominal ratio of the case definition (the sizing check + of the extracted netlist verifies absolute widths; here the plan's finger counts x unit width are compared); + orientation_balance (reported): per device, |#SD - #DS| fingers (0 = current flows both ways equally); + centroid_offset (reported): distance in finger pitches between the finger-position centroids of the devices when they + sit in the same group/row ('n/a: different groups' otherwise). +No case declares common-centroid as a requirement, so centroid and orientation are reported, never pass/fail. +These are geometry checks of the drawn plan; they are not silicon mismatch measurements.""" +from __future__ import annotations + +MATCHED = { + "C01": [("M1", "M2")], + "C02": [("M2", "M4"), ("M1", "M3")], + "C03": [("M1", "M2")], + "C13": [("M3", "M5"), ("M2", "M4")], + "C14": [("M1", "M2")], + "C07": [("M1", "M2"), ("M3", "M4")], + "C08": [("M1", "M2"), ("M4", "M5")], + "C09": [("M1", "M2"), ("M3", "M4"), ("M5", "M6"), ("M7", "M8")], + "C10": [("M1", "M2"), ("M3", "M4"), ("M5", "M6"), ("M7", "M8"), ("M9", "M10")], + "C11": [("M3", "M4"), ("M5", "M6"), ("M1", "M2")], + "C16": [("M1", "M2"), ("R1", "R2")], + "C17": [("M1", "M2"), ("R1", "R2"), ("R3", "R4")], + "C18": [("M3", "M5"), ("M4", "M6")], +} + + +def check(cid, sizing_nominal, sizing_case, applied_plans): + """applied_plans: list of {'devices': [...], 'plan': canonical plan json} from the builder.""" + out = []; hard_ok = True + where = {} + for gi, ap in enumerate(applied_plans): + pl = ap["plan"] + for pos, (dev, k) in enumerate(pl["finger_order"]): + where.setdefault(dev, {"group": gi, "pos": [], "orient": []}) + where[dev]["pos"].append(pos); where[dev]["orient"].append(pl["orientations"][pos]) + for a, b in MATCHED.get(cid, []): + rec = {"pair": [a, b]} + sa, sb = sizing_case.get(a, {}), sizing_case.get(b, {}); na, nb = sizing_nominal.get(a, {}), sizing_nominal.get(b, {}) + if "w" in sa and "w" in sb and "w" in na and "w" in nb and "nf" in sa: + r_case = sa["w"] / sb["w"]; r_nom = na["w"] / nb["w"] + rec["ratio"] = {"case": round(r_case, 6), "nominal": round(r_nom, 6), "ok": abs(r_case / r_nom - 1) < 1e-6} + hard_ok = hard_ok and rec["ratio"]["ok"] + elif "r" in sa: + rec["ratio"] = {"case": round(sa["r"] / sb["r"], 6), "nominal": round(na["r"] / nb["r"], 6), "ok": abs((sa["r"] / sb["r"]) / (na["r"] / nb["r"]) - 1) < 1e-6} + hard_ok = hard_ok and rec["ratio"]["ok"] + if a in where and b in where: + wa, wb = where[a], where[b] + rec["orientation_balance"] = {a: abs(wa["orient"].count("SD") - wa["orient"].count("DS")), b: abs(wb["orient"].count("SD") - wb["orient"].count("DS"))} + if wa["group"] == wb["group"]: + ca = sum(wa["pos"]) / len(wa["pos"]); cb = sum(wb["pos"]) / len(wb["pos"]) + rec["centroid_offset_pitches"] = round(abs(ca - cb), 3) + else: + rec["centroid_offset_pitches"] = "n/a: different groups" + out.append(rec) + return {"status": "passed" if hard_ok else "constraints_failed", "declared_pairs": out, "rule": "textbook_sharing.matching v1"} diff --git a/benchmarks/textbook_sharing/textbook_sharing/netlist.py b/benchmarks/textbook_sharing/textbook_sharing/netlist.py new file mode 100644 index 00000000..6565627a --- /dev/null +++ b/benchmarks/textbook_sharing/textbook_sharing/netlist.py @@ -0,0 +1,89 @@ +"""Circuit data model and SPICE emitters (schematic target netlists per PDK).""" +from __future__ import annotations +from dataclasses import dataclass, field, asdict +import json, hashlib + +PDK_MODELS = { + "sky130": {"nfet": "sky130_fd_pr__nfet_01v8", "pfet": "sky130_fd_pr__pfet_01v8", "res": "sky130_fd_pr__res_high_po_0p35", "cap": "sky130_fd_pr__cap_mim_m3_1", "rsh": 319.8, + "prefix": "X", "unit": "", "vdd": 1.8}, + "gf180": {"nfet": "nfet_03v3", "pfet": "pfet_03v3", "res": "ppolyf_u", "cap": "cap_mim_2f0fF", "rsh": 315.0, "prefix": "M", "unit": "u", "vdd": 3.3}, + "ihp130": {"nfet": "sg13_lv_nmos", "pfet": "sg13_lv_pmos", "res": "rppd", "cap": "cap_cmim", "rsh": 260.0, "prefix": "X", "unit": "u", "vdd": 1.2}, +} + + +@dataclass +class Device: + name: str + kind: str # nfet | pfet | res | cap + nets: list # MOS: [d,g,s,b]; res/cap: [p,n] + params: dict = field(default_factory=dict) # MOS: w (total, um), l (um), nf; res: r (ohm) or w/l; cap: c (F) or w/l + + def to_json(self): + return asdict(self) + + +@dataclass +class Circuit: + circuit_id: str + name: str + ports: list + devices: list # list[Device] + source: dict = field(default_factory=dict) + notes: list = field(default_factory=list) + + def nets(self): + s = set() + for d in self.devices: s.update(d.nets) + return sorted(s) + + def to_json(self): + return {"circuit_id": self.circuit_id, "name": self.name, "ports": self.ports, "devices": [d.to_json() for d in self.devices], "source": self.source, "notes": self.notes} + + @staticmethod + def from_json(d): + return Circuit(d["circuit_id"], d["name"], list(d["ports"]), [Device(x["name"], x["kind"], list(x["nets"]), dict(x.get("params", {}))) for x in d["devices"]], d.get("source", {}), d.get("notes", [])) + + def sha(self): + return hashlib.sha256(json.dumps(self.to_json(), sort_keys=True).encode()).hexdigest() + + +def mos_line(pdk: str, dev: Device, w: float, l: float, nf: int = 1, name=None, per_finger=False) -> list[str]: + m = PDK_MODELS[pdk]; u = m["unit"]; nm = name or dev.name + model = m[dev.kind] + d, g, s, b = dev.nets + if per_finger: + wf = w / nf + return [f"{m['prefix']}{nm}_f{k} {d} {g} {s} {b} {model} w={wf:g}{u} l={l:g}{u}" for k in range(nf)] + if pdk == "ihp130": + return [f"{m['prefix']}{nm} {d} {g} {s} {b} {model} w={w:g}{u} l={l:g}{u} ng={nf} m=1"] + if pdk == "gf180": + return [f"{m['prefix']}{nm} {d} {g} {s} {b} {model} w={w:g}{u} l={l:g}{u} nf={nf} m=1"] + return [f"{m['prefix']}{nm} {d} {g} {s} {b} {model} w={w:g} l={l:g} nf={nf}"] + + +def emit_subckt(pdk: str, circuit: Circuit, sizing: dict, name: str, per_finger: bool = False, passives: str = "pdk", lvs: bool = False) -> str: + """sizing: device name -> {"w":..,"l":..,"nf":..} for MOS; {"r":..,"w":..,"l":..} for res; {"c":..,"w":..,"l":..} for cap.""" + lines = [f".subckt {name} {' '.join(circuit.ports)}"] + m = PDK_MODELS[pdk] + for dev in circuit.devices: + sz = sizing[dev.name] + if dev.kind in ("nfet", "pfet"): + lines += mos_line(pdk, dev, float(sz["w"]), float(sz["l"]), int(sz.get("nf", 1)), per_finger=per_finger) + elif dev.kind == "res": + p, n = dev.nets + if passives == "ideal" or "w" not in sz: + lines.append(f"R{dev.name} {p} {n} {sz['r']:g}") + else: + body = sz.get("body", "VSS") + if pdk == "sky130": lines.append(f"XR{dev.name} {p} {n} {body} {m['res']} l={sz['l']:g} mult=1") + elif pdk == "gf180": lines.append(f"R{dev.name} {p} {n} {body} {m['res']} L={sz['l']:g}u W={sz['w']:g}u" if lvs else f"XR{dev.name} {p} {n} {body} {m['res']} r_width={sz['w']:g}u r_length={sz['l']:g}u") + else: lines.append(f"XR{dev.name} {p} {n} {m['res']} w={sz['w']:g}u l={sz['l']:g}u m=1") + elif dev.kind == "cap": + p, n = dev.nets + if passives == "ideal" or "w" not in sz: + lines.append(f"C{dev.name} {p} {n} {sz['c']:g}") + else: + from textbook_sharing.assembly.passives import mimcap_spice_line # MIM capacitor (geometry from the sizing: w, l in um) + lines.append(mimcap_spice_line(pdk, dev.name, p, n, sz["w"], sz["l"], lvs=lvs)) + lines.append(f".ends {name}") + return "\n".join(lines) + "\n" diff --git a/benchmarks/textbook_sharing/textbook_sharing/nominal.py b/benchmarks/textbook_sharing/textbook_sharing/nominal.py new file mode 100644 index 00000000..6bfda379 --- /dev/null +++ b/benchmarks/textbook_sharing/textbook_sharing/nominal.py @@ -0,0 +1,118 @@ +"""First-pass design points and specification floors of every topology and PDK. + +The floors (specs) returned here are the category floors that every schematic must meet before its specification is +frozen (see qualify.py). The sizing, bias and load values were the starting points of a schematic pre-simulation loop; +the tuned nominal design points that the size grid is derived from are stored as data in data/nominal//.json. + +Units: w, l in um; currents in A; voltages in V. 'uw' = unit finger width helper per PDK. +Design intent per PDK: VDD sky130 1.8 V (lv 1.8 V devices), gf180 3.3 V, ihp 1.2 V; bias 20 uA branches; +L = 2*Lmin for analog devices (mirrors use 4*Lmin for output resistance), input pairs wider. +""" +from __future__ import annotations +from .cases import CaseSpec, PDK_POINT +from textbook_sharing.assembly.passives import resistor_geometry, mim_geometry, MIM + +LMIN = {"sky130": 0.15, "gf180": 0.28, "ihp130": 0.13} +UW = {"sky130": 0.5, "gf180": 0.5, "ihp130": 0.5} # unit finger width of the first-pass points (above the contactable minimum) + + +def M(pdk, nf, lmult=2): + return {"w": round(UW[pdk] * nf, 3), "l": round(LMIN[pdk] * lmult, 3), "nf": nf} + + +def nominal(cid, pdk): + vdd = PDK_POINT[pdk]["vdd"]; ib = 20e-6 + vcm = {"sky130": 0.9, "gf180": 1.5, "ihp130": 0.6}[pdk] + S = {}; bias = {}; load = {}; specs = {} + lmir = 8 if pdk == "ihp130" else 4 + if cid == "C01": + S = {"M1": M(pdk, 4, lmir), "M2": M(pdk, 4, lmir)}; bias = {"IB1": {"i": ib, "from": "VDD"}}; load = {"vout_nom": vdd / 2, "tol": 0.05}; bias["IREF"] = ib + specs = {"err": {"abs_max": 0.05}, "vmin": {"max": 0.35 * vdd}} + elif cid == "C02": + S = {k: M(pdk, 4, lmir // 2) for k in ("M1", "M2", "M3", "M4")}; bias = {"IIN1": {"i": ib, "from": "VDD"}, "IREF": ib}; load = {"vout_nom": 0.65 * vdd, "tol": 0.03} + specs = {"err": {"abs_max": 0.03}, "vmin": {"max": 0.6 * vdd}} + elif cid == "C03": + S = {k: M(pdk, 8, 16 if pdk == "ihp130" else 8) for k in ("M1", "M2", "M3")}; bias = {"IIN1": {"i": ib, "from": "VDD"}, "IREF": ib}; load = {"vout_nom": 0.65 * vdd, "tol": 0.10} + specs = {"err": {"abs_max": 0.10}, "vmin": {"max": 0.65 * vdd}} + elif cid == "C13": + S = {"M1": M(pdk, 1, lmir // 2), "M2": M(pdk, 4, lmir // 2), "M3": M(pdk, 4, lmir // 2), "M4": M(pdk, 4, lmir // 2), "M5": M(pdk, 4, lmir // 2)} + bias = {"IB1": {"i": ib, "from": "VDD"}, "IIN1": {"i": ib, "from": "VDD"}, "IREF": ib}; load = {"vout_nom": vdd / 2, "tol": 0.03} + specs = {"err": {"abs_max": 0.03}, "vmin": {"max": 0.4 * vdd}} + elif cid == "C14": + S = {"M1": M(pdk, 4, lmir), "M2": M(pdk, 4, lmir), "M3": M(pdk, 2, lmir), "M4": M(pdk, 4, lmir)} + bias = {"IIN1": {"i": ib, "from": "VDD"}, "IREF1": {"i": ib / 4, "from": "VDD"}, "IREF": ib}; load = {"vout_nom": 0.65 * vdd, "tol": 0.03} + specs = {"err": {"abs_max": 0.03}, "vmin": {"max": 0.6 * vdd}} + elif cid == "C04": + S = {"M1": M(pdk, 8, 2), "M2": M(pdk, 4, 2)}; bias = {"VB1": {"replica": "M1", "current": ib}}; load = {"CL": 100e-15} + specs = {"gain_lf": {"min": 20.0}, "f3db": {"min": 1e6}} + elif cid == "C05": + S = {"M1": M(pdk, 4, 2), "M2": M(pdk, 8, 2)}; bias = {"VB1": {"replica": "M1", "current": ib}}; load = {"vin_nom": 0.65 * vdd, "RL": 20e3, "CL": 1e-12} + specs = {"gain_at_nom": {"min": 0.6}, "f3db": {"min": 10e6}} + elif cid == "C06": + S = {"M1": M(pdk, 8, 2), "M2": M(pdk, 8, 2), "M3": M(pdk, 4, 2), "M4": M(pdk, 4, 2)} + bias = {"VB1": {"replica": "M4", "current": ib, "kind": "cascode"}, "VB2": {"replica": "M1", "current": ib, "kind": "cascode"}, "VB3": {"replica": "M2", "current": ib}}; load = {"CL": 100e-15} + specs = {"gain_lf": {"min": 30.0}, "f3db": {"min": 1e5}} + elif cid == "C12": + S = {"M1": M(pdk, 4, 2), "M2": M(pdk, 8, 2)}; bias = {}; load = {"CL": 100e-15} + specs = {"gain_lf": {"min": 15.0}, "f3db": {"min": 1e6}} + elif cid == "C07": + S = {"M1": M(pdk, 8, 2), "M2": M(pdk, 8, 2), "M3": M(pdk, 8, 2), "M4": M(pdk, 8, 2)} + bias = {"VB1": {"replica": "M3", "current": ib}, "IB1": {"i": 2 * ib, "from": "VSS"}}; load = {"vcm": vcm, "CL": 100e-15, "vocm": vdd / 2} + specs = {"gain_lf": {"min": 20.0}, "f3db": {"min": 1e5}} + elif cid == "C08": + lm = 3 if pdk == "ihp130" else 2 + S = {"M1": M(pdk, 8, lm), "M2": M(pdk, 8, lm), "M3": M(pdk, 8, lm), "M4": M(pdk, 4, lm), "M5": M(pdk, 4, lm)} + bias = {"VB1": {"replica": "M3", "current": 2 * ib}}; load = {"vcm": vcm, "CL": 1e-12, "inv_input": "VIN2"} + specs = {"gain_lf": {"min": 25.0}, "ugf": {"min": 5e6}} + elif cid == "C09": + lm = 2 + nfp = 32 if pdk in ("sky130", "ihp130") else 8 + S = {k: M(pdk, 16 if pdk != "gf180" else 8, lm) for k in ("M1", "M2", "M3", "M4")} + S.update({k: M(pdk, nfp, lm) for k in ("M5", "M6", "M7", "M8")}) + ib = 10e-6 if pdk in ("sky130", "ihp130") else ib + # cascode gate = V_T + 2 V_ov (W/4-equivalent replica); input CM keeps the pair in saturation (found by a grid search on the schematic) + bias = {"VB1": {"replica": "M3", "current": ib, "kind": "cascode"}, "IB1": {"i": 2 * ib, "from": "VSS"}} + load = {"vcm": {"expr": "v(VB1) - gs(M3) + gs(M1) - 0.1", "currents": {"M3": ib, "M1": ib}}, "CL": 1e-12, "inv_input": "VIN2", "vout_target": 0.45 * vdd} + specs = {"gain_lf": {"min": 35.0}, "ugf": {"min": 2e6}} + elif cid == "C10": + lm = 4 if pdk in ("sky130", "ihp130") else 2 + S = {k: M(pdk, 8, lm) for k in ("M1", "M2", "M3", "M4", "M5", "M6", "M7", "M8", "M9", "M10")} + bias = {"VB1": {"replica": "M5", "current": ib, "kind": "cascode3"}, "VB2": {"replica": "M7", "current": ib, "kind": "cascode3"}, "VB3": {"replica": "M9", "current": ib}, "VB4": {"replica": "M3", "current": 2 * ib}, "IB1": {"i": 2 * ib, "from": "VDD"}}; load = {"vcm": vcm, "CL": 500e-15, "cmfb_gain": 20.0, "vocm": vdd / 2} + specs = {"gain_lf": {"min": 35.0}, "ugf": {"min": 5e6}} + elif cid == "C18": + # wide output followers and a 1:1 diode stack keep V_gs,n + V_sg,p below VDD at low V_ov (textbook stage needs headroom) + S = {"M1": M(pdk, 4, 2), "M2": M(pdk, 8, 2), "M3": M(pdk, 16, 2), "M4": M(pdk, 32, 2), "M5": M(pdk, 32, 2), "M6": M(pdk, 64, 2)} + bias = {"VB1": {"replica": "M2", "current": ib}} + load = {"RL": 20e3, "CL": 5e-12, "vamp": 0.02, "vout_target": 0.5 * vdd, "vin_center": 0.3 * vdd, "servo_slope": 200.0, "options": ".option method=gear reltol=1e-3"} + specs = {"thd_pct": {"max": 3.0}, "iq": {"max": 300e-6}, "f3db": {"min": 5e6}} + elif cid == "C15": + rl = {"sky130": 20e3, "gf180": 40e3, "ihp130": 12e3}[pdk] + S = {"M1": M(pdk, 4, 2), "R1": {"r": rl, "body": "VSS"}}; bias = {}; load = {"CL": 100e-15} + specs = {"gain_lf": {"min": 8.0}, "f3db": {"min": 1e6}} + elif cid == "C16": + rl = {"sky130": 20e3, "gf180": 40e3, "ihp130": 12e3}[pdk] + S = {"M1": M(pdk, 8, 2), "M2": M(pdk, 8, 2), "R1": {"r": rl, "body": "VSS"}, "R2": {"r": rl, "body": "VSS"}} + bias = {"IB1": {"i": 2 * ib, "from": "VSS"}}; load = {"vcm": vcm, "CL": 100e-15} + specs = {"gain_lf": {"min": 8.0}, "f3db": {"min": 1e6}} + elif cid == "C17": + rl = {"sky130": 20e3, "gf180": 40e3, "ihp130": 15e3}[pdk]; rs = 2e3 if pdk != "ihp130" else 1e3 + S = {"M1": M(pdk, 8, 2), "M2": M(pdk, 8, 2), "M3": M(pdk, 8, 2), "R1": {"r": rl, "body": "VSS"}, "R2": {"r": rl, "body": "VSS"}, "R3": {"r": rs, "body": "VSS"}, "R4": {"r": rs, "body": "VSS"}} + bias = {"VB1": {"replica": "M3", "current": 2 * ib}}; load = {"vcm": vcm, "CL": 100e-15} + specs = {"gain_lf": {"min": 6.0}, "f3db": {"min": 1e6}} + elif cid == "C11": + # two-stage Miller OTA (PMOS input pair, NMOS mirror load, NMOS CS second stage with PMOS current source, + # RC Miller compensation). IB1 is a current sink into the diode M1; M2/M7 mirror it (2x). VIN1 is the inverting input. + lm = 2 + S = {"M1": M(pdk, 4, lm), "M2": M(pdk, 8, lm), "M3": M(pdk, 8, lm), "M4": M(pdk, 8, lm), "M5": M(pdk, 4, lm), "M6": M(pdk, 4, lm), + "M7": M(pdk, 8, lm), "M8": M(pdk, 8, lm), "R1": {"r": 3000.0, "body": "VSS"}, "C1": {"c": 1e-12}} + bias = {"IB1": {"i": ib, "from": "VSS"}} + load = {"vcm": 0.4 * vdd, "CL": 1e-12, "inv_input": "VIN1", "vout_target": 0.5 * vdd} + specs = {"gain_lf": {"min": 40.0}, "ugf": {"min": 2e6}, "pm": {"min": 45.0}} + else: + raise KeyError(cid) + for k, v in S.items(): + if "r" in v and "w" not in v: + w, l = resistor_geometry(pdk, v["r"]); v["w"] = w; v["l"] = l + if "c" in v and "w" not in v: + w, l = mim_geometry(pdk, v["c"]); v["w"] = w; v["l"] = l; v["model"] = MIM[pdk]["model"] + return CaseSpec(f"{cid}_{pdk}_nominal", cid, pdk, "nominal", S, {"VDD": vdd, "VSS": 0.0}, bias, load, specs, notes=["first-pass sizing"]) diff --git a/benchmarks/textbook_sharing/textbook_sharing/overrides.py b/benchmarks/textbook_sharing/textbook_sharing/overrides.py new file mode 100644 index 00000000..17e2c3c0 --- /dev/null +++ b/benchmarks/textbook_sharing/textbook_sharing/overrides.py @@ -0,0 +1,50 @@ +"""Changes to the nominal design points, each with its reason, and the explicit list of test +auxiliaries of every case (they live in the testbench, never in the DUT layout, and never count towards core area). +Edited only before qualification; every change is recorded in the case notes.""" +from __future__ import annotations +import copy + +# sizing / bias / load changes applied to the nominal point before the grid derivation: cid -> pdk -> dict +CHANGES = { + # class-AB output stage: the test returns RL/CL to mid-supply (see testbench.tb_buffer_ab) + "C18": {"*": {"load": {"RL": 20e3, "CL": 5e-12, "vout_amp": 0.1}, "note": "RL/CL returned to an ideal mid-supply source; open-loop output-swing metric added"}}, +} + + +def apply(cid, pdk, sizing, bias, load): + s, b, l = copy.deepcopy(sizing), copy.deepcopy(bias), copy.deepcopy(load); notes = [] + for key in ("*", pdk): + ch = CHANGES.get(cid, {}).get(key) + if not ch: continue + for dev, v in ch.get("sizing", {}).items(): s[dev] = {**s.get(dev, {}), **v} + b.update(ch.get("bias", {})); l.update(ch.get("load", {})) + if ch.get("note"): notes.append(ch["note"]) + return s, b, l, notes + + +def test_auxiliaries(cid, case): + """Everything the testbench adds around the DUT (disclosed; not part of the core layout or its area).""" + aux = [] + for port, v in case.bias.items(): + if isinstance(v, dict) and "replica" in v: + aux.append({"kind": "replica_bias", "port": port, "replica_of": v["replica"], "current_A": v["current"], "variant": v.get("kind", "diode")}) + elif isinstance(v, dict) and "expr" in v: + aux.append({"kind": "behavioural_bias", "port": port, "expr": v["expr"]}) + elif isinstance(v, dict) and "i" in v: + aux.append({"kind": "ideal_current_source", "port": port, "current_A": v["i"], "from": v.get("from", "VDD")}) + elif port == "IREF": + aux.append({"kind": "reference_current_value", "value_A": v}) + cat_aux = { + "single": ["DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc", "load capacitor"], + "ota": ["bounded tanh DC servo setting V_out,dc", "ideal input common-mode source", "load capacitor"], + "twostage": ["bounded tanh DC servo setting V_out,dc", "ideal input common-mode source", "load capacitor"], + "ota_fd": ["ideal common-mode feedback on VB4", "ideal input common-mode source", "load capacitors"], + "diff_cs": ["ideal common-mode feedback on VB1", "ideal input common-mode source", "load capacitors"], + "diff_r": ["ideal input common-mode source", "load capacitors"], + "follower": ["ideal input source", "load resistor and capacitor"], + "buffer_ab": ["bounded tanh DC servo (freezable)", "mid-supply load return", "load resistor and capacitor"], + "mirror": ["ideal reference current source(s)", "ideal output voltage source (swept)"], + } + from textbook_sharing.testbench import CATEGORY + aux += [{"kind": "testbench_element", "what": w} for w in cat_aux[CATEGORY[cid]]] + return aux diff --git a/benchmarks/textbook_sharing/textbook_sharing/paths.py b/benchmarks/textbook_sharing/textbook_sharing/paths.py new file mode 100644 index 00000000..3e61fe95 --- /dev/null +++ b/benchmarks/textbook_sharing/textbook_sharing/paths.py @@ -0,0 +1,62 @@ +"""Where the benchmark reads and writes. + +Everything lives under the benchmark folder (``benchmarks/textbook_sharing``) unless an environment variable points +elsewhere: + + TSB_RUNS run outputs: GDS, verification logs and one ``result.json`` per layout (default: /runs) + TSB_RESULTS analysis outputs: the JSON tables behind every reported number (default: /results) + +Inputs that are part of the repository (frozen case definitions, nominal design points, frozen rules) are always read +from ``/data``. +""" +from __future__ import annotations +import os, sys +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[1] # benchmarks/textbook_sharing +REPO = ROOT.parents[1] # repository root (provides src/glayout) +DATA = ROOT / "data" +CASES = DATA / "cases" # one folder per request: /// +NOMINAL = DATA / "nominal" # nominal design point of every topology and PDK +FROZEN = DATA / "frozen" # rules and orders frozen before the measurements they govern +RUNS = Path(os.environ.get("TSB_RUNS", ROOT / "runs")) +RESULTS = Path(os.environ.get("TSB_RESULTS", ROOT / "results")) +GRID_RUNS = RUNS / "grid" # main grid: //// +SELECTION_RUNS = RUNS / "selection" # plan selection: // +MODEL_RUNS = RUNS / "models" # model sessions: //r/ +MODEL_TASKS = RUNS / "model_tasks" # task folders handed to the models +MODEL_EXAMPLES = RUNS / "model_examples" # worked examples shown to the models +PVT_RUNS = RUNS / "pvt" +REVIEW_BATCHES = RUNS / "review" # visual-review batches (rendered images and verdicts) +ANALYSIS = RESULTS / "analysis" +LEDGER = RESULTS / "count_ledger.json" + + +def setup_imports(): + """Make ``glayout`` (from this repository) and ``textbook_sharing`` importable when running from a checkout.""" + for p in (str(REPO / "src"), str(ROOT)): + if p not in sys.path: + sys.path.insert(0, p) + os.environ.setdefault("GLAYOUT_BACKEND", "gdsfactory") + + +def rel(path) -> str: + """Path relative to the run or benchmark root, for records that must not contain machine-specific prefixes.""" + p = Path(path).resolve() + for base, tag in ((RUNS.resolve(), "runs"), (ROOT.resolve(), "")): + try: + r = p.relative_to(base) + return str(Path(tag) / r) if tag else str(r) + except ValueError: + continue + return str(p) + + +def resolve(path) -> Path: + """Inverse of rel(): a recorded path ('runs/...', 'data/...' or absolute) back to a file on this machine.""" + p = Path(path) + if p.is_absolute(): + return p + if p.parts and p.parts[0] == "runs": + return RUNS.joinpath(*p.parts[1:]) + return ROOT / p diff --git a/benchmarks/textbook_sharing/textbook_sharing/pdk.py b/benchmarks/textbook_sharing/textbook_sharing/pdk.py new file mode 100644 index 00000000..7162f991 --- /dev/null +++ b/benchmarks/textbook_sharing/textbook_sharing/pdk.py @@ -0,0 +1,20 @@ +"""The three open PDKs, as mapped by gLayout.""" +from __future__ import annotations +import importlib + +PDKS = {"sky130": "glayout.pdk.sky130_mapped:sky130_mapped_pdk", + "gf180": "glayout.pdk.gf180_mapped:gf180_mapped_pdk", + "ihp130": "glayout.pdk.ihp130_mapped:ihp130_mapped_pdk"} +_CACHE = {} + + +def load_pdk(name: str): + mod, attr = PDKS[name].split(":") + return getattr(importlib.import_module(mod), attr) + + +def pdk_obj(name: str): + """Cached MappedPDK object for 'sky130', 'gf180' or 'ihp130'.""" + if name not in _CACHE: + _CACHE[name] = load_pdk(name) + return _CACHE[name] diff --git a/benchmarks/textbook_sharing/textbook_sharing/presim.py b/benchmarks/textbook_sharing/textbook_sharing/presim.py new file mode 100644 index 00000000..8101c54a --- /dev/null +++ b/benchmarks/textbook_sharing/textbook_sharing/presim.py @@ -0,0 +1,26 @@ +"""Schematic-level pre-simulation of a case (PDK models, ideal passives) to validate sizing/bias/specs +before any layout exists. Also used post-layout with the PEX netlist by passing include_override.""" +from __future__ import annotations +import json +from pathlib import Path +from .netlist import emit_subckt +from .testbench import make_testbench, check_specs, derived +from .verify.pex_sim import simulate, read_measures + + +def presim(pdk, circuit, case, out_dir, include_override=None, dut_name=None, corner="tt", passives="pdk"): + out_dir = Path(out_dir); out_dir.mkdir(parents=True, exist_ok=True) + name = dut_name or f"{circuit.circuit_id}_{pdk}_{case.size}" + if include_override is None: + inc = out_dir / f"{name}_schematic.spice" + inc.write_text(emit_subckt(pdk, circuit, case.sizing, name, per_finger=True, passives=passives)) + else: + inc = Path(include_override) + tb = make_testbench(circuit, name, str(inc), case, pdk) + s = simulate(pdk, tb, out_dir, name=f"tb_{name}", corner=corner) + meas = derived(read_measures(Path(s["out"]).read_text(errors="replace"))) if Path(s["out"]).exists() else {} + sp = check_specs(meas, case.specs) if case.specs else {"ok": None, "status": "no_specs", "details": {}} + res = {"sim": {k: v for k, v in s.items() if k != "errors"} | {"errors": s["errors"]}, "measures": meas, "spec": sp, "include": str(inc), "dut": name, + "status": s["status"] if s["status"] != "passed" else sp["status"]} + json.dump(res, open(out_dir / f"presim_{name}.json", "w"), indent=1, default=str) + return res diff --git a/benchmarks/textbook_sharing/textbook_sharing/qualify.py b/benchmarks/textbook_sharing/textbook_sharing/qualify.py new file mode 100644 index 00000000..e1e73342 --- /dev/null +++ b/benchmarks/textbook_sharing/textbook_sharing/qualify.py @@ -0,0 +1,89 @@ +"""Schematic qualification and specification-freezing rule (fixed before any layout was built). + +Input: the schematic pre-simulation of a derived case (PDK device models, PDK resistor/MIM models, disclosed test +auxiliaries). Output: qualified / not qualified with reasons, and the frozen specification used for EVERY layout of +that case (all modes, all candidates, all methods). No layout result is ever used here. + +Category floors (absolute, per topology) are the floors in nominal.nominal() plus the class-AB floors in +FLOOR_OVERRIDES. A schematic that misses a floor is NOT qualified (the specification is never +relaxed to the schematic value). + +Frozen spec per metric (sim = schematic value): + gain_lf (dB, min) ........ spec_min = max(floor, sim - 3 dB) + ugf, f3db (Hz, min) ...... spec_min = max(floor, 0.6 * sim) + gain_at_nom (V/V, min) ... spec_min = max(floor, sim - 0.05) + out_swing (V, min) ....... spec_min = max(floor, 0.8 * sim) + pm (deg, min) ............ spec_min = floor + thd_pct, iq (max) ........ spec_max = floor + vmin (V, max) ............ spec_max = min(floor, sim + 0.1 V) + err (abs_max) ............ spec_abs_max = floor +Universal operating-point checks (qualification only): + * simulator status passed, every floor metric present; + * servo-based tests (single, ota, twostage, buffer_ab): |vout0 - target| <= 0.02 VDD (servo converged); + * mirrors: compliance vmin found and test point vout_test = round((vmin + VDD)/2, 2 decimals) inside (vmin, VDD). +""" +from __future__ import annotations +import math + +FLOOR_OVERRIDES = { + # class-AB output stage (see testbench.tb_buffer_ab): linear output range and quiescent current + # are the defining figures of an output stage; distortion is kept at a fixed output amplitude. + # out_swing floor: the follower pair limits the linear output range to about VDD - |V_GS5| - |V_SG6| - V_dsat1 - V_dsat2 + # with body-effect-raised thresholds (bodies tied to the rails as in the source netlist); 0.25 VDD is the floor + # (0.4 VDD would exceed that headroom bound at every supply; the floor was set before any layout existed). + "C18": {"thd_pct": {"max": 3.0}, "iq": {"max": 300e-6}, "f3db": {"min": 5e6}, "out_swing": {"min_frac_vdd": 0.25}}, +} +SERVO_CATEGORIES = ("single", "ota", "twostage", "buffer_ab") + + +def floors_for(cid, nominal_specs, vdd): + fl = {} + for m, sp in nominal_specs.items(): + if m.startswith("_") or not isinstance(sp, dict): continue + fl[m] = dict(sp) + for m, sp in FLOOR_OVERRIDES.get(cid, {}).items(): + sp = dict(sp) + if "min_frac_vdd" in sp: sp = {"min": round(sp.pop("min_frac_vdd") * vdd, 4)} + fl[m] = sp + return fl + + +def _bad(v): + return v is None or (isinstance(v, float) and (math.isnan(v) or math.isinf(v))) + + +def qualify_and_freeze(category, floors, meas, sim_status, vdd, target=None): + reasons = []; spec = {} + if sim_status != "passed": + reasons.append(f"schematic simulation status {sim_status}") + if category in SERVO_CATEGORIES and target is not None: + v0 = meas.get("vout0") + if _bad(v0) or abs(v0 - target) > 0.02 * vdd: + reasons.append(f"servo did not reach the output target: vout0={v0} target={target:g} (tol {0.02 * vdd:.3g} V)") + for m, fl in floors.items(): + sim = meas.get(m) + if _bad(sim): + reasons.append(f"{m}: not measurable in the schematic"); continue + if "min" in fl: + if sim < fl["min"]: reasons.append(f"{m}={sim:.4g} below floor {fl['min']:g}") + if m == "gain_lf": smin = max(fl["min"], sim - 3.0) + elif m in ("ugf", "f3db"): smin = max(fl["min"], 0.6 * sim) + elif m == "gain_at_nom": smin = max(fl["min"], sim - 0.05) + elif m == "out_swing": smin = max(fl["min"], 0.8 * sim) + else: smin = fl["min"] + spec[m] = {"min": float(f"{smin:.4g}")} + if "max" in fl: + if sim > fl["max"]: reasons.append(f"{m}={sim:.4g} above floor {fl['max']:g}") + smax = min(fl["max"], sim + 0.1) if m == "vmin" else fl["max"] + spec[m] = {"max": float(f"{smax:.4g}")} + if "abs_max" in fl: + if abs(sim) > fl["abs_max"]: reasons.append(f"|{m}|={abs(sim):.4g} above floor {fl['abs_max']:g}") + spec[m] = {"abs_max": fl["abs_max"]} + spec["_frozen_from"] = {"schematic": {m: meas.get(m) for m in floors}, "floors": floors, "rule": "textbook_sharing.qualify v1"} + return {"qualified": not reasons, "reasons": reasons, "spec": spec} + + +def mirror_test_point(vmin, vdd): + if _bad(vmin) or vmin >= vdd - 0.02: + return None + return round((vmin + vdd) / 2, 2) diff --git a/benchmarks/textbook_sharing/textbook_sharing/redesign_search.py b/benchmarks/textbook_sharing/textbook_sharing/redesign_search.py new file mode 100644 index 00000000..22a57fe5 --- /dev/null +++ b/benchmarks/textbook_sharing/textbook_sharing/redesign_search.py @@ -0,0 +1,57 @@ +"""Bounded redesign search for the class-AB output stage (C18) at the nominal size point, schematic only. +Topology and body connections are those of the source netlist (fixed). Searched: bias current of the replica-biased +current source M2 (ib), width multiplier of the diode stack M3/M4 (wd) and of the followers M5/M6 (wf), common length +multiplier (lm). Every attempt and its schematic metrics are recorded; the first configuration (in the fixed search +order below, smallest current first) that meets every floor becomes the nominal point, otherwise the topology/PDK goes +to the diagnostic set. Output: /redesign_search/attempts_.json. +usage: python -m textbook_sharing.redesign_search --pdks gf180,sky130,ihp130""" +import json, copy, argparse, itertools +from multiprocessing import Pool +from textbook_sharing.circuits import CIRCUITS +from textbook_sharing.cases import CaseSpec, PDK_POINT +from textbook_sharing.nominal import nominal +from textbook_sharing.presim import presim +from textbook_sharing.qualify import floors_for, qualify_and_freeze +from textbook_sharing import overrides +from textbook_sharing import paths + +IB = (5e-6, 10e-6, 20e-6); WD = (1, 2, 4); WF = (1, 2); LM = (1.0, 2.0) + + +def attempt(job): + pdk, ib, wd, wf, lm = job + c0 = json.load(open(paths.NOMINAL / "C18" / f"{pdk}.json")) + s, b, l, notes = overrides.apply("C18", pdk, c0["sizing"], c0["bias"], c0["load"]) + s = copy.deepcopy(s) + for d, mult in (("M3", wd), ("M4", wd), ("M5", wf), ("M6", wf)): + uw = s[d]["w"] / s[d]["nf"]; s[d]["nf"] = s[d]["nf"] * mult; s[d]["w"] = round(uw * s[d]["nf"], 4) + for d in s: + if "nf" in s[d]: s[d]["l"] = round(round(s[d]["l"] * lm * 200) / 200, 4) + b = copy.deepcopy(b); b["VB1"] = {**b["VB1"], "current": ib} + vdd = PDK_POINT[pdk]["vdd"] + tag = f"ib{ib*1e6:g}u_wd{wd}_wf{wf}_lm{lm:g}" + case = CaseSpec(f"C18_{pdk}_{tag}", "C18", pdk, tag, s, dict(c0["supply"]), b, l, {}, notes) + pre = presim(pdk, CIRCUITS["C18"], case, paths.RESULTS / "redesign_search" / pdk / tag, dut_name=f"C18s_{pdk}_{tag}") + floors = floors_for("C18", nominal("C18", pdk).specs, vdd) + q = qualify_and_freeze("buffer_ab", floors, pre["measures"], pre["sim"]["status"], vdd, l.get("vout_target", vdd / 2)) + return {"pdk": pdk, "ib": ib, "wd": wd, "wf": wf, "lm": lm, "tag": tag, "qualified": q["qualified"], "reasons": q["reasons"], + "measures": {k: pre["measures"].get(k) for k in ("vout0", "vin0", "iq", "gain_lf", "f3db", "out_swing", "thd_pct")}, "sizing": s, "bias": b} + + +def main(): + ap = argparse.ArgumentParser(); ap.add_argument("--pdks", default="gf180,sky130,ihp130"); ap.add_argument("--jobs", type=int, default=16) + a = ap.parse_args() + jobs = [(p, ib, wd, wf, lm) for p in a.pdks.split(",") for ib, wd, wf, lm in itertools.product(IB, WD, WF, LM)] + with Pool(a.jobs) as pool: + res = pool.map(attempt, jobs) + out = paths.RESULTS / "redesign_search" / f"attempts_{a.pdks.replace(',', '_')}.json"; out.parent.mkdir(parents=True, exist_ok=True) # one file per PDK set + json.dump(res, open(out, "w"), indent=1) + for p in a.pdks.split(","): + ok = [r for r in res if r["pdk"] == p and r["qualified"]] + print(p, "attempts", sum(1 for r in res if r["pdk"] == p), "qualified", len(ok), ("first: " + ok[0]["tag"] + " " + json.dumps(ok[0]["measures"])) if ok else "") + best = sorted([r for r in res if r["pdk"] == p], key=lambda r: len(r["reasons"]))[:3] + for r in best: print(" ", r["tag"], {k: (round(v, 4) if isinstance(v, float) else v) for k, v in r["measures"].items()}, r["reasons"][:2]) + + +if __name__ == "__main__": + main() diff --git a/benchmarks/textbook_sharing/textbook_sharing/resim.py b/benchmarks/textbook_sharing/textbook_sharing/resim.py new file mode 100644 index 00000000..8476baf5 --- /dev/null +++ b/benchmarks/textbook_sharing/textbook_sharing/resim.py @@ -0,0 +1,81 @@ +"""Re-run ONLY the post-layout simulation of existing runs after a testbench change (geometry, DRC, LVS, sizing check +and PEX are unchanged and not repeated). For every result.json under the given roots whose case uses a testbench whose +text changed, the old postsim block is kept in res["postsim_history"], the post-layout simulation is repeated on the same +extracted netlist with the current testbench (against the case's CURRENT frozen specs), and fail_reasons/primary_status +are recomputed. Runs whose regenerated deck is identical to the one they used are skipped. +usage: python -m textbook_sharing.resim --roots grid,selection --jobs 20 --tag (roots are relative to the run folder)""" +from __future__ import annotations +import json, glob, time, argparse, shutil, re, collections +from pathlib import Path +from multiprocessing import Pool +from textbook_sharing import paths +ORDER = None + + +def strip_header(deck): + # the stored deck = header (title, model includes, optional osdi block) + testbench text; compare from the DUT instance on + i = deck.find("\nX1 ") + return deck[i:] if i >= 0 else deck + + +def job(args): + rp, tag = args + from textbook_sharing.run_case import load_case_dir, ORDER as ORD + from textbook_sharing.circuits import CIRCUITS + from textbook_sharing.testbench import make_testbench + from textbook_sharing.presim import presim + rp = Path(rp); res = json.load(open(rp)) + if res.get("primary_status") in ("NA", "rejected_plan", "build_failed") or not res.get("postsim") or res["postsim"].get("status") == "NOT_RUN": + return "skipped_no_postsim" + od = rp.parent; ps = od / "postsim" + old_decks = sorted(ps.glob("tb_*.spice")) + if not old_decks: return "skipped_no_deck" + pexsp = next((od / "verify" / "pex").glob("*_pex.spice"), None) + if pexsp is None: return "skipped_no_pex" + case, cj = load_case_dir(res["case_dir"]); circ = CIRCUITS[case.circuit_id] + top = re.search(r"^\.subckt\s+(\S+)", pexsp.read_text(), re.M | re.I).group(1) + new_tb = make_testbench(circ, top, str(pexsp), case, case.pdk) + if strip_header(old_decks[0].read_text()).strip() == ("\n" + new_tb).strip() or strip_header(old_decks[0].read_text()).strip() == new_tb.strip(): + return "unchanged_deck" + keep = od / f"postsim_superseded_{tag}" + if not keep.exists(): shutil.move(str(ps), str(keep)) + else: shutil.rmtree(ps, ignore_errors=True) + ts = time.time() + s = presim(case.pdk, circ, case, ps, include_override=str(pexsp), dut_name=top) + hist = res.get("postsim_history", []) + hist.append({"tag": tag, "old_postsim": res["postsim"], "old_primary_status": res["primary_status"], "old_fail_reasons": res.get("fail_reasons"), + "old_post_layout_simulation_s": (res.get("timing_s") or {}).get("post_layout_simulation"), "moved_to": keep.name}) + res["postsim_history"] = hist + res["postsim"] = {"status": s["status"], "measures": s["measures"], "spec": s["spec"].get("details") if s.get("spec") else None, "errors": s["sim"]["errors"][:3]} + fr = [f for f in (res.get("fail_reasons") or []) if f not in ("spec_failed", "simulation_failed")] + if s["status"] != "passed": fr.append("simulation_failed" if s["status"].startswith("simulation") else "spec_failed") + res["fail_reasons"] = fr + prim = next((o for o in ORD if o in fr), None); res["primary_status"] = prim or "auto_passed" + res.setdefault("timing_s", {})["post_layout_simulation"] = round(time.time() - ts, 2) + json.dump(res, open(rp, "w"), indent=1, default=str) + return f"{hist[-1]['old_primary_status']}->{res['primary_status']}" + + +def main(): + ap = argparse.ArgumentParser(); ap.add_argument("--roots", required=True); ap.add_argument("--jobs", type=int, default=16); ap.add_argument("--tag", required=True) + ap.add_argument("--circuits", default=None); a = ap.parse_args() + files = [] + for root in a.roots.split(","): + files += sorted(glob.glob(str(paths.RUNS / root / "**" / "result.json"), recursive=True)) + files = [f for f in files if "/verify/" not in f and "postsim" not in f] + if a.circuits: + cs = set(a.circuits.split(",")) + files = [f for f in files if any(f"/{c}/" in f or f"/{c}_" in f for c in cs)] + print("result files", len(files), flush=True) + c = collections.Counter(); changes = [] + with Pool(a.jobs, maxtasksperchild=8) as pool: + for f, st in zip(files, pool.imap(job, [(f, a.tag) for f in files], chunksize=1)): + c[st] += 1 + if "->" in st and st.split("->")[0] != st.split("->")[1]: changes.append((f, st)); print("CHANGED", f, st, flush=True) + out = paths.ANALYSIS / f"resim_{a.tag}.json"; out.parent.mkdir(parents=True, exist_ok=True) + json.dump({"counts": dict(c), "status_changes": changes}, open(out, "w"), indent=1) + print(dict(c)) + + +if __name__ == "__main__": + main() diff --git a/benchmarks/textbook_sharing/textbook_sharing/review/__init__.py b/benchmarks/textbook_sharing/textbook_sharing/review/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/benchmarks/textbook_sharing/textbook_sharing/review/check_connectivity.py b/benchmarks/textbook_sharing/textbook_sharing/review/check_connectivity.py new file mode 100644 index 00000000..c607cf93 --- /dev/null +++ b/benchmarks/textbook_sharing/textbook_sharing/review/check_connectivity.py @@ -0,0 +1,83 @@ +"""Objective connectivity checks used to resolve visual-review flags (independent of DRC/LVS, which are also reported). +For one GDS: + * conductor components: merged shapes of active, tap, poly, met1, met2, met3 joined through cont (active/tap/poly <-> + met1), via1 (met1 <-> met2) and via2 (met2 <-> met3); a component that carries no met3 pin/label shape is FLOATING; + * gate pads: contacts on poly (not on active/tap) whose met1 component has no via1; + * met2 pieces without a via2 (stubs that never reach a trunk). +Passive bodies (resistor poly, MIM plates) are part of the poly / metal layers or of PDK-specific layers that are not +traced; a resistor's two heads are joined through its poly body. +usage: python -m textbook_sharing.review.check_connectivity ... --out """ +import json, glob, argparse +from pathlib import Path +from textbook_sharing import paths + + +DROP = () + + +def analyse(gds, pdkname): + import klayout.db as kdb + from textbook_sharing.run_case import pdk_obj + from glayout.sharing import rules_for + L = rules_for(pdk_obj(pdkname)).layers + ly = kdb.Layout(); ly.read(gds); top = ly.top_cell(); dbu = ly.dbu + def reg(name): + spec = L.get(name) + if spec is None: return kdb.Region() + li = ly.find_layer(*spec) + return kdb.Region(top.begin_shapes_rec(li)).merged() if li is not None else kdb.Region() + R = {n: reg(n) for n in ("active", "tap", "poly", "cont", "met1", "via1", "met2", "via2", "met3", "met3_pin", "met3_label")} + R["active"] = (R["active"] - R["poly"]).merged() # source/drain regions only (channels cut by the gates) + for n in DROP: R[n] = kdb.Region() # negative control + # nodes: every merged polygon of a conductor layer + nodes = [] + for lay in ("active", "tap", "poly", "met1", "met2", "met3"): + for p in R[lay].each(): nodes.append((lay, kdb.Region(p))) + parent = list(range(len(nodes))) + def find(i): + while parent[i] != i: parent[i] = parent[parent[i]]; i = parent[i] + return i + def union(i, j): parent[find(i)] = find(j) + idx = {lay: [i for i, (l, _) in enumerate(nodes) if l == lay] for lay in ("active", "tap", "poly", "met1", "met2", "met3")} + def join(cut, lower_layers, upper): + for c in R[cut].each(): + cr = kdb.Region(c) + lows = [i for lay in lower_layers for i in idx[lay] if not nodes[i][1].interacting(cr).is_empty()] + ups = [i for i in idx[upper] if not nodes[i][1].interacting(cr).is_empty()] + for a in lows + ups[1:]: + if ups: union(a, ups[0]) + join("cont", ("active", "tap", "poly"), "met1"); join("via1", ("met1",), "met2"); join("via2", ("met2",), "met3") + pins = R["met3_pin"] + R["met3_label"] + comps = {} + for i in range(len(nodes)): comps.setdefault(find(i), []).append(i) + floating = [] + for root, members in comps.items(): + has_pin = any(nodes[i][0] == "met3" and not nodes[i][1].interacting(pins).is_empty() for i in members) if not pins.is_empty() else any(nodes[i][0] == "met3" for i in members) + if not has_pin: + bb = kdb.Region(); [bb.insert(nodes[i][1]) for i in members]; b = bb.bbox() + floating.append({"layers": sorted({nodes[i][0] for i in members}), "bbox_um": [round(b.left * dbu, 3), round(b.bottom * dbu, 3), round(b.right * dbu, 3), round(b.top * dbu, 3)]}) + gc = R["cont"].interacting(R["poly"]).not_interacting(R["active"]).not_interacting(R["tap"]) + unwired = [c for c in gc.each() if R["via1"].interacting(R["met1"].interacting(kdb.Region(c))).is_empty()] + m2_no_v2 = [p.bbox() for p in R["met2"].each() if R["via2"].interacting(kdb.Region(p)).is_empty()] + return {"components": len(comps), "floating_components": floating, "gate_pads": gc.count(), "gate_pads_without_via1": len(unwired), + "met2_without_via2": [[round(b.left * dbu, 2), round(b.bottom * dbu, 2), round(b.right * dbu, 2), round(b.top * dbu, 2)] for b in m2_no_v2]} + + +def main(): + ap = argparse.ArgumentParser(); ap.add_argument("ids", nargs="+"); ap.add_argument("--out", required=True); ap.add_argument("--drop", default=""); a = ap.parse_args() + global DROP; DROP = tuple(x for x in a.drop.split(",") if x) + want = set(a.ids); out = {} + for rp in glob.glob(str(paths.RUNS / "**" / "review_record.json"), recursive=True): + r = json.load(open(rp)) + if r["review_id"] not in want: continue + res = json.load(open(Path(rp).parent.parent.parent / "result.json")) + c = analyse(str(paths.resolve(r["gds"])), r["pdk"]); c.update({"run": paths.rel(Path(rp).parent.parent.parent), "drc": res["verify"].get("drc"), "lvs": res["verify"].get("lvs"), + "primary_status": res.get("primary_status")}) + out[r["review_id"]] = c + print(r["review_id"], c["run"], "components", c["components"], "floating", c["floating_components"][:3], "pads w/o via1", c["gate_pads_without_via1"], + "met2 w/o via2", c["met2_without_via2"][:3], c["drc"], c["lvs"], flush=True) + json.dump(out, open(a.out, "w"), indent=1) + + +if __name__ == "__main__": + main() diff --git a/benchmarks/textbook_sharing/textbook_sharing/review/check_gate_pads.py b/benchmarks/textbook_sharing/textbook_sharing/review/check_gate_pads.py new file mode 100644 index 00000000..a7b7e522 --- /dev/null +++ b/benchmarks/textbook_sharing/textbook_sharing/review/check_gate_pads.py @@ -0,0 +1,44 @@ +"""Objective check for the visual-review flag "gate contact pad without via": in a GDS, every contact that sits on poly +(and not on active) must belong to a first-metal component that also touches a via1 (i.e. the pad is wired up the +stack). Layer names come from glayout.sharing.rules (cont, poly, active, met1, via1 of the PDK mapping). +usage: python -m textbook_sharing.review.check_gate_pads ... --out (looks the records up under the run folder)""" +import json, glob, argparse +from pathlib import Path +from textbook_sharing import paths + + +def check(gds, pdkname): + import klayout.db as kdb + from textbook_sharing.run_case import pdk_obj + from glayout.sharing import rules_for + L = rules_for(pdk_obj(pdkname)).layers + ly = kdb.Layout(); ly.read(gds); top = ly.top_cell() + def reg(name): + li = ly.find_layer(*L[name]) if L.get(name) is not None else None + return kdb.Region(top.begin_shapes_rec(li)).merged() if li is not None else kdb.Region() + poly, act, cont, m1, v1 = reg("poly"), reg("active"), reg("cont"), reg("met1"), reg("via1") + tap = reg("tap") if L.get("tap") else kdb.Region() + gc = cont.interacting(poly).not_interacting(act).not_interacting(tap) + bad = []; n = 0 + for c in gc.each(): + n += 1 + comp = m1.interacting(kdb.Region(c)) + if comp.is_empty() or v1.interacting(comp).is_empty(): + b = c.bbox(); bad.append({"x": round(b.center().x * ly.dbu, 3), "y": round(b.center().y * ly.dbu, 3), "met1": not comp.is_empty()}) + return {"gate_contacts": n, "wired_to_via1": n - len(bad), "unwired": bad} + + +def main(): + ap = argparse.ArgumentParser(); ap.add_argument("ids", nargs="+"); ap.add_argument("--out", required=True); a = ap.parse_args() + want = set(a.ids); out = {} + for rp in glob.glob(str(paths.RUNS / "**" / "review_record.json"), recursive=True): + r = json.load(open(rp)) + if r["review_id"] in want: + res = json.load(open(Path(rp).parent.parent.parent / "result.json")) + c = check(str(paths.resolve(r["gds"])), r["pdk"]); c.update({"run": paths.rel(Path(rp).parent.parent.parent), "drc": res["verify"].get("drc"), "lvs": res["verify"].get("lvs")}) + out[r["review_id"]] = c; print(r["review_id"], c["gate_contacts"], c["wired_to_via1"], c["unwired"][:3], c["drc"], c["lvs"]) + json.dump(out, open(a.out, "w"), indent=1) + + +if __name__ == "__main__": + main() diff --git a/benchmarks/textbook_sharing/textbook_sharing/review/composite.py b/benchmarks/textbook_sharing/textbook_sharing/review/composite.py new file mode 100644 index 00000000..e4a5a5f4 --- /dev/null +++ b/benchmarks/textbook_sharing/textbook_sharing/review/composite.py @@ -0,0 +1,114 @@ +"""Compose the rendered views of a review record for the visual reviewer. +Output: composite.png = the three views (all layers / front end / back end) stacked vertically at full width with +panel titles, 1 um and 10 um scale bars and x/y coordinate ticks (um, DUT coordinates); for DUTs wider than +TILE_UM the all-layers view is additionally re-rendered as tile_.png windows of <= TILE_UM width (coordinate ticks +every 5 um) so that fingers and contacts remain resolvable. Paths and sha256 of all images are stored in the record.""" +import json, sys, hashlib, math, subprocess +from pathlib import Path +from PIL import Image, ImageDraw +from textbook_sharing import paths + +TILE_UM = 30.0 +VERSION = 3 + + +def sha(p): + return hashlib.sha256(open(p, "rb").read()).hexdigest() + + +def _mapping(view): + """px -> um mapping for a rendered view: x_um = cx + (px - W/2) * fit, y_um = cy - (py - H/2) * fit.""" + w, h = view.get("size_px", [1400, 1000]); x0, y0, x1, y1 = view["window_um"] + fit = max((x1 - x0) / w, (y1 - y0) / h) + return (x0 + x1) / 2, (y0 + y1) / 2, fit, w, h + + +def _ticks(d, im_w, im_h, top, cx, cy, fit, step, scale): + """draw coordinate ticks (um) along the bottom and left edges of a panel placed at vertical offset 'top'.""" + def x_px(xu): return int(round((im_w / 2 + (xu - cx) / fit) * scale)) + def y_px(yu): return int(round(top + (im_h / 2 - (yu - cy) / fit) * scale)) + xa = cx - (im_w / 2) * fit; xb = cx + (im_w / 2) * fit; ya = cy - (im_h / 2) * fit; yb = cy + (im_h / 2) * fit + for xu in range(int(math.floor(xa / step)) * step, int(math.ceil(xb / step)) * step + 1, step): + px = x_px(xu) + if 0 <= px < im_w * scale: + d.line([px, y_px(ya) - 8, px, y_px(ya)], fill=(255, 255, 0)); d.text((px + 2, y_px(ya) - 20), f"{xu}", fill=(255, 255, 0)) + for yu in range(int(math.floor(ya / step)) * step, int(math.ceil(yb / step)) * step + 1, step): + py = y_px(yu) + if top <= py < top + im_h * scale: + d.line([0, py, 8, py], fill=(255, 255, 0)); d.text((10, py - 6), f"{yu}", fill=(255, 255, 0)) + + +def composite(record_path, out_path=None, width=1500, tile_um=TILE_UM): + rec = json.load(open(record_path)); views = {k: str(paths.resolve(v)) for k, v in rec["view_paths"].items()} + rj = Path(views["full"]).with_name(Path(views["full"]).name.replace("_full.png", "_render.json")) + info = json.load(open(rj)) if rj.exists() else {} + panels = []; vinfo = {} + bb = info.get("bbox_um") + for key in ("full", "fe", "be"): + pth = views.get(key) + if not (pth and Path(pth).exists()): continue + im = Image.open(pth).convert("RGB"); v = dict(info.get("views", {}).get(key) or {}) + if v.get("window_um") and bb: + # crop the rendered view to the DUT bounding box (+ margin) so that wide/flat DUTs do not waste panel height + cx, cy, fit, w, h = _mapping(v); m = 0.05 * max(bb[2] - bb[0], bb[3] - bb[1]) + 0.4 + X0 = max(0, int((w / 2 + (bb[0] - m - cx) / fit))); X1 = min(w, int((w / 2 + (bb[2] + m - cx) / fit)) + 1) + Y0 = max(0, int((h / 2 - (bb[3] + m - cy) / fit))); Y1 = min(h, int((h / 2 - (bb[1] - m - cy) / fit)) + 1) + if X1 - X0 > 50 and Y1 - Y0 > 50: + im = im.crop((X0, Y0, X1, Y1)) + ncx = cx + ((X0 + X1) / 2 - w / 2) * fit; ncy = cy - ((Y0 + Y1) / 2 - h / 2) * fit + v["window_um"] = [ncx - (X1 - X0) / 2 * fit, ncy - (Y1 - Y0) / 2 * fit, ncx + (X1 - X0) / 2 * fit, ncy + (Y1 - Y0) / 2 * fit] + v["size_px"] = [X1 - X0, Y1 - Y0] + panels.append((key, im)); vinfo[key] = v + if not panels: return None + titles = {"full": "all layers", "fe": "front end: active / poly / contact / implant / well", "be": "back end: metals / vias / pin labels"} + hdr = 24; ph = [] + for key, im in panels: + ph.append(int(round(width * im.height / im.width))) + out = Image.new("RGB", (width, sum(ph) + hdr * len(panels) + 30), (20, 20, 20)); d = ImageDraw.Draw(out) + y = 0 + for (key, im), h in zip(panels, ph): + d.text((6, y + 5), f"{titles[key]} (DUT bbox {info.get('width_um')} x {info.get('height_um')} um; ticks in um)", fill=(230, 230, 230)) + y += hdr; out.paste(im.resize((width, h)), (0, y)) + v = vinfo.get(key) + if v and "window_um" in v: + cx, cy, fit, w, hh = _mapping(v); scale = width / w + step = 5 if (v["window_um"][2] - v["window_um"][0]) > 20 else (2 if (v["window_um"][2] - v["window_um"][0]) > 8 else 1) + _ticks(d, w, hh, y, cx, cy, fit, step, scale) + if key == "full": + px1 = int(1.0 / fit * scale); px10 = int(10.0 / fit * scale) + d.rectangle([width - 20 - px10, y + 8, width - 20, y + 14], fill=(255, 255, 0)); d.text((width - 20 - px10, y + 16), "10 um", fill=(255, 255, 0)) + d.rectangle([width - 20 - px1, y + 30, width - 20, y + 36], fill=(0, 255, 255)); d.text((width - 20 - px1 - 40, y + 28), "1 um", fill=(0, 255, 255)) + y += h + d.text((6, y + 8), f"review {rec['review_id']} pdk {rec.get('pdk')} composite v{VERSION}", fill=(200, 200, 200)) + out_path = out_path or Path(record_path).with_name("composite.png"); out.save(out_path) + comp = {"version": VERSION, "path": paths.rel(out_path), "sha256": sha(out_path), "tiles": [], "tile_windows": []} + # tiles for wide DUTs + bb = info.get("bbox_um"); wum = info.get("width_um") or 0 + if bb and wum > tile_um * 1.15: + n = int(math.ceil(wum / tile_um)); tw = wum / n; m = 0.3 + wins = [[round(bb[0] + i * tw - m, 3), round(bb[1] - m, 3), round(bb[0] + (i + 1) * tw + m, 3), round(bb[3] + m, 3)] for i in range(n)] + prefix = Path(out_path).with_name("tile") + r = subprocess.run([sys.executable, str(Path(__file__).with_name("render_gds.py")), str(paths.resolve(rec["gds"])), str(prefix), rec["pdk"], "--tiles=" + ";".join(",".join(str(c) for c in w_) for w_ in wins), "--width=1500"], + capture_output=True, text=True) + tj = Path(str(prefix) + "_tiles.json") + if r.returncode == 0 and tj.exists(): + tinfo = json.load(open(tj)) + for i, win in enumerate(wins): + v = tinfo["views"].get(f"tile{i}") + if not v: continue + im = Image.open(v["path"]).convert("RGB"); ann = Image.new("RGB", (im.width, im.height + 26), (20, 20, 20)); ann.paste(im, (0, 26)); dd = ImageDraw.Draw(ann) + dd.text((6, 6), f"tile {i + 1}/{n}: x {win[0]:.1f} .. {win[2]:.1f} um (all layers; ticks in um) review {rec['review_id']}", fill=(230, 230, 230)) + cx, cy, fit, w, hh = _mapping(v); _ticks(dd, w, hh, 26, cx, cy, fit, 5, 1.0) + px1 = int(1.0 / fit); dd.rectangle([im.width - 20 - px1, 32, im.width - 20, 38], fill=(0, 255, 255)); dd.text((im.width - 20 - px1 - 40, 30), "1 um", fill=(0, 255, 255)) + tp = Path(out_path).with_name(f"tile_{i}.png"); ann.save(tp) + comp["tiles"].append(paths.rel(tp)); comp["tile_windows"].append(win) + else: + comp["tile_error"] = (r.stderr or "")[-400:] + rec["composite"] = comp + json.dump(rec, open(record_path, "w"), indent=1) + return str(out_path) + + +if __name__ == "__main__": + for p in sys.argv[1:]: + print(composite(p)) diff --git a/benchmarks/textbook_sharing/textbook_sharing/review/render_gds.py b/benchmarks/textbook_sharing/textbook_sharing/review/render_gds.py new file mode 100644 index 00000000..1246e5de --- /dev/null +++ b/benchmarks/textbook_sharing/textbook_sharing/review/render_gds.py @@ -0,0 +1,98 @@ +"""Render a GDS to PNG views with the PDK layer properties (headless, klayout.lay). +usage: python render_gds.py [--zoom x0,y0,x1,y1] [--cell NAME] [--tiles x0,y0,x1,y1;...] +Produces _full.png, _fe.png (active/poly/contact/implant/well), _be.png (metals/vias/pins), [_zoom.png] +Also writes _render.json with image sha256, layer legend and scale bar info.""" +import os, json, hashlib, argparse +import klayout.lay as lay +import klayout.db as db + +LYP = {"sky130": "/foss/pdks/sky130A/libs.tech/klayout/tech/sky130A.lyp", + "gf180": "/foss/pdks/gf180mcuD/libs.tech/klayout/tech/gf180mcu.lyp", + "ihp130": "/foss/pdks/ihp-sg13g2/libs.tech/klayout/tech/sg13g2.lyp"} +FE = {"sky130": [(65, 20), (66, 20), (66, 44), (93, 44), (94, 20), (64, 20), (64, 44), (64, 18)], + "gf180": [(22, 0), (30, 0), (33, 0), (32, 0), (31, 0), (21, 0), (204, 0), (12, 0)], + "ihp130": [(1, 0), (5, 0), (6, 0), (14, 0), (7, 0), (31, 0), (46, 0)]} +BE = {"sky130": [(67, 20), (67, 44), (68, 20), (68, 44), (69, 20), (69, 44), (70, 20), (70, 44), (67, 16), (68, 16), (69, 16), (70, 16), (67, 5), (68, 5), (69, 5), (70, 5)], + "gf180": [(34, 0), (35, 0), (36, 0), (38, 0), (42, 0), (40, 0), (46, 0), (34, 10), (36, 10), (42, 10), (46, 10)], + "ihp130": [(8, 0), (19, 0), (10, 0), (29, 0), (30, 0), (49, 0), (50, 0), (8, 2), (10, 2), (30, 2), (50, 2), (8, 25), (10, 25), (30, 25), (50, 25)]} + + +def sha(p): + return hashlib.sha256(open(p, "rb").read()).hexdigest() + + +def render(gds, prefix, pdk, zoom=None, cell=None, width=1400, height=1000, tiles=None): + os.makedirs(os.path.dirname(os.path.abspath(str(prefix))) or '.', exist_ok=True) + ly = db.Layout(); ly.read(gds) + top = ly.cell(cell) if cell else ly.top_cell() + lv = lay.LayoutView() + lv.load_layout(gds, True) + if os.path.exists(LYP.get(pdk, "")): + lv.load_layer_props(LYP[pdk]) + lv.max_hier() + lv.set_config("background-color", "#000000") + lv.set_config("grid-visible", "false") + bb = top.dbbox() + out = {"gds": gds, "gds_sha256": sha(gds), "cell": top.name, "bbox_um": [bb.left, bb.bottom, bb.right, bb.top], + "width_um": round(bb.width(), 4), "height_um": round(bb.height(), 4), "pdk": pdk, "lyp": LYP.get(pdk), "views": {}} + margin = max(bb.width(), bb.height()) * 0.08 + 0.3 + full = db.DBox(bb.left - margin, bb.bottom - margin, bb.right + margin, bb.top + margin) + + def shoot(name, box, layers=None, size=None): + w_px, h_px = size or (width, height) + if layers is not None: + it = lv.begin_layers() + while not it.at_end(): + lp = it.current() + info = (lp.source_layer, lp.source_datatype) + vis = info in layers + nlp = lp.dup(); nlp.visible = vis + lv.set_layer_properties(it, nlp) + it.next() + else: + it = lv.begin_layers() + while not it.at_end(): + nlp = it.current().dup(); nlp.visible = True + lv.set_layer_properties(it, nlp); it.next() + lv.zoom_box(box) + path = f"{prefix}_{name}.png" + lv.save_image(path, w_px, h_px) + fit = max(box.width() / w_px, box.height() / h_px) # KLayout fits the box into the viewport keeping the aspect ratio + out["views"][name] = {"path": path, "sha256": sha(path), "window_um": [box.left, box.bottom, box.right, box.top], + "um_per_px": round(fit, 5), "size_px": [w_px, h_px], "center_um": [box.center().x, box.center().y]} + if tiles: + # tiles mode: only the requested windows, all layers, image height follows the window aspect (width fits exactly) + for i, (x0, y0, x1, y1) in enumerate(tiles): + box = db.DBox(x0, y0, x1, y1) + h_px = max(200, min(1400, int(round(width * box.height() / box.width())))) + shoot(f"tile{i}", box, None, (width, h_px)) + json.dump(out, open(f"{prefix}_tiles.json", "w"), indent=1) + return out + shoot("full", full) + shoot("fe", full, set(FE.get(pdk, []))) + shoot("be", full, set(BE.get(pdk, []))) + if zoom: + x0, y0, x1, y1 = zoom + shoot("zoom", db.DBox(x0, y0, x1, y1)) + # legend: visible layers with names from the lyp + legend = [] + it = lv.begin_layers() + while not it.at_end(): + lp = it.current() + if lp.source_layer >= 0: + legend.append({"layer": [lp.source_layer, lp.source_datatype], "name": lp.name, "fill": lp.fill_color, "frame": lp.frame_color}) + it.next() + out["legend"] = legend + json.dump(out, open(f"{prefix}_render.json", "w"), indent=1) + return out + + +if __name__ == "__main__": + ap = argparse.ArgumentParser(); ap.add_argument("gds"); ap.add_argument("prefix"); ap.add_argument("pdk") + ap.add_argument("--zoom"); ap.add_argument("--cell"); ap.add_argument("--width", type=int, default=1400); ap.add_argument("--height", type=int, default=1000) + ap.add_argument("--tiles", help="semicolon-separated windows x0,y0,x1,y1 (um); renders only these, all layers") + a = ap.parse_args() + z = [float(v) for v in a.zoom.split(",")] if a.zoom else None + t = [[float(v) for v in win.split(",")] for win in a.tiles.split(";")] if a.tiles else None + r = render(a.gds, a.prefix, a.pdk, z, a.cell, a.width, a.height, t) + print(json.dumps({k: v for k, v in r.items() if k != "legend"}, indent=1)) diff --git a/benchmarks/textbook_sharing/textbook_sharing/review/resolve_auto.py b/benchmarks/textbook_sharing/textbook_sharing/review/resolve_auto.py new file mode 100644 index 00000000..fa9caa03 --- /dev/null +++ b/benchmarks/textbook_sharing/textbook_sharing/review/resolve_auto.py @@ -0,0 +1,36 @@ +"""Resolve open visual-review flags (verdict suspicious/fail without a resolution) by objective checks. A flag is marked +resolved_ok only when ALL hold: official DRC passed, LVS passed, extraction reports no floating conductor, every gate +pad (contact on poly) reaches a via1, every met2 piece reaches a via2. Anything else stays open and is listed for manual +inspection (zoomed render). usage: python -m textbook_sharing.review.resolve_auto --out /analysis/resolve_auto_.json [--by NAME]""" +import json, glob, argparse +from pathlib import Path +from textbook_sharing import paths + + +def main(): + ap = argparse.ArgumentParser(); ap.add_argument("--out", required=True); ap.add_argument("--by", default="maintainer"); a = ap.parse_args() + from textbook_sharing.review.check_connectivity import analyse + from textbook_sharing.review.visual_review import resolve + done = {}; open_ = {} + for rp in glob.glob(str(paths.RUNS / "**" / "review_record.json"), recursive=True): + r = json.load(open(rp)); v = r["visual"] + if v["verdict"] not in ("suspicious", "fail") or v.get("reused_from") or r.get("visual_resolution"): continue + run = Path(rp).parent.parent.parent; res = json.load(open(run / "result.json")) + c = analyse(str(paths.resolve(r["gds"])), r["pdk"]) + ok = (res["verify"].get("drc") == "passed" and res["verify"].get("lvs") == "passed" and not (res.get("pex_counts") or {}).get("floating_nodes") + and c["gate_pads_without_via1"] == 0 and not c["met2_without_via2"]) + rec = {"run": paths.rel(run), "verdict": v["verdict"], "issues": v.get("issue_locations"), "drc": res["verify"].get("drc"), "lvs": res["verify"].get("lvs"), + "pex_floating": (res.get("pex_counts") or {}).get("floating_nodes"), "gate_pads_without_via1": c["gate_pads_without_via1"], "met2_without_via2": c["met2_without_via2"]} + if ok and v["verdict"] == "suspicious": + resolve(r["review_id"], "resolved_ok", "Objective checks: official DRC and LVS passed; extraction reports no floating conductor; every contact on poly reaches a via1 through its first-metal component; every met2 piece reaches a via2 (no dangling stub). The flagged structure is connected.", + "textbook_sharing.review.resolve_auto (check_connectivity gate-pad / met2-via2 checks, pex floating-node list, verify/drc, verify/lvs)", by=a.by) + done[r["review_id"]] = rec + else: + open_[r["review_id"]] = rec + json.dump({"resolved": done, "open": open_}, open(a.out, "w"), indent=1) + print("resolved", len(done), "open", len(open_)) + for k, v in open_.items(): print(" OPEN", k, v["run"], v["verdict"], v["issues"][:1] if v["issues"] else None) + + +if __name__ == "__main__": + main() diff --git a/benchmarks/textbook_sharing/textbook_sharing/review/reviewer_guide.md b/benchmarks/textbook_sharing/textbook_sharing/review/reviewer_guide.md new file mode 100644 index 00000000..fb60f2ea --- /dev/null +++ b/benchmarks/textbook_sharing/textbook_sharing/review/reviewer_guide.md @@ -0,0 +1,59 @@ +# Visual review protocol + +The reviewer (a person or a vision model) examines rendered layouts one item at a time, without knowing which plan, +mode or method produced them and without seeing DRC, LVS or simulation results. Each unique geometry is reviewed once; +the verdict is reused for every record with the same cell-name-independent geometry hash. + +## What the reviewer receives +- `.png`: three panels stacked vertically: (1) all layers, (2) front end (active / poly / contact / implant / + well), (3) back end (metals / vias / pin labels). Yellow ticks are layout coordinates in micrometres (x along the + bottom edge, y along the left edge of each panel); a 10 um (yellow) and a 1 um (cyan) scale bar are drawn in panel 1. +- optionally `_t.png`: magnified windows of the all-layers view for wide layouts; the header states the + x-range. +- `items.jsonl`: one line per item with its review id and image files. Images are 128-colour palette PNGs (layer + colours preserved). + +## What a correct layout looks like +One or more horizontal device rows (NMOS rows, PMOS rows inside an n-well, passive rows with poly resistors or MIM +capacitors). Each MOS row is a set of active islands crossed by vertical poly gates, with source/drain contacts in the +islands and gate contacts on poly pads below or above the islands; vertical tap strips at both row ends plus a +horizontal tap strip along the gate side of the row (U-shaped tie), all in the row's well and implant; metal-2 vertical +stubs from the pins up or down to horizontal metal-3 trunks in the routing channels between rows; pin text labels on the +metal-3 trunks; the whole layout is one flat cell. + +Normal structures that are easy to misread: +- a gate contact pad (poly + contact + local metal) has no via on the pad itself; a metal-1 riser runs from the pad to + the cell's pin row, where the via and the metal-2 stub to the trunk sit; +- the PMOS row is mirrored vertically: a gate strap drawn at the bottom of a PMOS cell faces up and its net is routed in + a channel above the PMOS row, a strap drawn at the top of the cell faces the channel below the row; +- passive rows (resistors, MIM capacitors) can be much taller than MOS rows; a small resistor at the far edge of a tall + passive row connected by long metal-2 stubs is legal. +Flag such structures only if a connection is actually missing. + +## Record per item (JSON) +``` +{"review_id": "...", "reviewer_type": "human" | "vision_model", "reviewer_id": "", + "images_viewed": ["file names actually looked at"], + "observed_findings": [">= 3 concrete observations with coordinates in um read from the ticks"], + "issue_locations": [{"x": .., "y": .., "description": ".."}], + "verdict": "pass" | "suspicious" | "fail"} +``` + +## Verdict rules +- "fail": clearly broken geometry (e.g. a gate without any island, a metal trunk ending in empty space with nothing + attached at either end, overlapping shapes of two different pin labels, a label placed on an empty area); +- "suspicious": something that may be wrong and must be checked against the raw DRC / LVS / extraction (e.g. an + isolated small shape far from the body, a contact that seems to sit outside active, uneven finger counts between + apparently matched devices); +- "pass": none of the above. +Do not grade aesthetics or area. Name the panel, the layer colour group and the coordinates. Never give "pass" for an +item whose images could not be seen; use "suspicious" with the issue "image not viewable" instead. + +## Blinding +Only the batch's `items.jsonl` and the image files it lists are given to the reviewer; file names carry only the review +id. Plans, modes, methods, areas and tool results are never shown. + +## Resolution of flags +A "suspicious" or "fail" verdict is never overwritten. It is resolved by objective checks (official DRC, LVS, +floating conductors in the extracted netlist, connectivity of gate pads to via1 and of metal-2 to via2), and the method +and evidence are stored in the record's `visual_resolution` field with the outcome "resolved_ok" or "confirmed_issue". diff --git a/benchmarks/textbook_sharing/textbook_sharing/review/visual_review.py b/benchmarks/textbook_sharing/textbook_sharing/review/visual_review.py new file mode 100644 index 00000000..7f996aaa --- /dev/null +++ b/benchmarks/textbook_sharing/textbook_sharing/review/visual_review.py @@ -0,0 +1,173 @@ +"""Visual review driver: one blinded review per UNIQUE layout, the verdict reused for every record of that layout. + + prepare --limit N [--roots grid,selection,models] [--width 1100] [--include ] + groups every review_record.json under the roots by (geometry_hash of the run, pdk); a group is pending when none of its records + has a verdict; for N pending groups (deterministic order by a hash of the key, so batches mix circuits, sizes and + methods) builds the composite of one representative record and copies composite + tiles into + /review//transfer/ named .png / _t.png (no path, mode or method in + any name); items.jsonl lists only review ids and file names. manifest.json (not shown to the reviewer) maps ids to + records. The reviewer follows reviewer_guide.md and returns outputs.json. + apply + writes each verdict into the representative record and copies it into every record of the same (geometry_hash, pdk) + with reused_from = representative review id; checks >= 3 observations and a known verdict, else rejects the item. + resolve [--by NAME] + records how a 'suspicious' / 'fail' verdict was settled by objective checks (the verdict itself is kept). + status + counts records / unique layouts by verdict (reviewed directly, reused, pending).""" +from __future__ import annotations +import json, glob, shutil, hashlib, argparse, time, collections +from pathlib import Path +from textbook_sharing import paths +OUT = paths.REVIEW_BATCHES +ROOTS = ["grid", "selection", "models"] # relative to the run folder +VERDICTS = ("pass", "suspicious", "fail") +TILE_W = 1200 +MAX_TILES = 99 + + +def _small(src, dst, max_w=None, colors=128): + """Transfer copy for the reviewer: 128-colour palette PNG (layer colours stay distinct), optional downscale.""" + from PIL import Image + im = Image.open(src).convert("RGB") + if max_w and im.width > max_w: im = im.resize((max_w, round(im.height * max_w / im.width)), Image.LANCZOS) + im.quantize(colors=colors, method=Image.Quantize.MEDIANCUT).save(dst, format="PNG", optimize=True) + return hashlib.sha256(open(dst, "rb").read()).hexdigest() + + +def groups(roots): + g = collections.defaultdict(list) + for root in roots: + for rp in sorted(glob.glob(str(paths.RUNS / root / "**" / "review_record.json"), recursive=True)): + try: rec = json.load(open(rp)) + except Exception: continue + # key: cell-name-independent geometry hash of the run (identical geometry under another cell name, e.g. a + # selection named mode equal to a main-grid mode, is the same layout); GDS sha256 when no hash is recorded + res_p = Path(rp).parent.parent.parent / "result.json" + gh = None + if res_p.exists(): + try: gh = json.load(open(res_p)).get("geometry_hash") + except Exception: gh = None + g[(gh or rec["gds_sha256"], rec["pdk"])].append((rp, rec)) + return g + + +def propagate(): + """Copy an existing direct verdict to the other records of the same layout key (after a key change).""" + g = groups(ROOTS); n = 0 + for key, recs in g.items(): + direct = [r for _, r in recs if r["visual"]["verdict"] != "review_pending" and not r["visual"].get("reused_from")] + if not direct: continue + src = direct[0] + for rp, r in recs: + if r["visual"]["verdict"] == "review_pending": + v = dict(src["visual"]); v["reused_from"] = src["review_id"]; v["reuse_key"] = "geometry_hash+pdk" + r["visual"] = v; r["verdict"] = v["verdict"]; json.dump(r, open(rp, "w"), indent=1); n += 1 + print("propagated to", n, "records") + + +def taken_ids(): + t = set() + for m in OUT.glob("*/manifest.json"): + d = json.load(open(m)) + if not d.get("applied"): t |= {k for k in d["items"]} + return t + + +def prepare(batch, limit, roots, width, include=None): + from textbook_sharing.review.composite import composite + bd = OUT / batch; tr = bd / "transfer" + if bd.exists(): raise SystemExit(f"{bd} exists") + tr.mkdir(parents=True) + g = groups(roots); taken = taken_ids(); items = {} + pend = [k for k, recs in g.items() if all(r["visual"]["verdict"] == "review_pending" for _, r in recs)] + if include is not None: # only layouts whose run directory is listed (for example every layout that is reported) + inc = {str(paths.resolve(x).resolve()) for x in include} + pend = [k for k in pend if any(str(Path(rp).parent.parent.parent.resolve()) in inc for rp, _ in g[k])] + pend.sort(key=lambda k: hashlib.sha256((k[0] + k[1]).encode()).hexdigest()) + for key in pend: + if len(items) >= limit: break + rp, rec = sorted(g[key])[0] + if rec["review_id"] in taken: continue + cp = composite(rp, width=width) + if not cp: continue + rec = json.load(open(rp)); comp = rec["composite"] + tsha = {} + tsha[f"{rec['review_id']}.png"] = _small(cp, tr / f"{rec['review_id']}.png") + tiles = [] + for i, t in enumerate(comp.get("tiles", [])[:MAX_TILES]): + tsha[f"{rec['review_id']}_t{i}.png"] = _small(t, tr / f"{rec['review_id']}_t{i}.png", max_w=TILE_W); tiles.append(f"{rec['review_id']}_t{i}.png") + items[rec["review_id"]] = {"record": paths.rel(rp), "layout_key": key[0], "pdk": key[1], "n_records_same_layout": len(g[key]), + "composite": f"{rec['review_id']}.png", "tiles": tiles, "composite_sha256": comp["sha256"], "transfer_sha256": tsha, + "n_tiles_total": len(comp.get("tiles", [])), "n_tiles_sent": len(tiles)} + with open(tr / "items.jsonl", "w") as f: + for rid, it in items.items(): f.write(json.dumps({"review_id": rid, "composite": it["composite"], "tiles": it["tiles"]}) + "\n") + json.dump({"batch": batch, "created_utc": time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime()), "width": width, "items": items, "applied": False}, + open(bd / "manifest.json", "w"), indent=1) + print(batch, len(items), "items", sum(len(v["tiles"]) for v in items.values()), "tiles", "pending groups", len(pend)) + + +def apply(batch, outputs): + bd = OUT / batch; man = json.load(open(bd / "manifest.json")); outs = json.load(open(outputs)) + g = groups(ROOTS); ok = 0; rejected = []; reused = 0 + rec_key = {str(Path(rp).resolve()): k for k, recs in g.items() for rp, _ in recs} + for o in outs: + it = man["items"].get(o.get("review_id")) + if not it: rejected.append({"review_id": o.get("review_id"), "why": "unknown id"}); continue + if o.get("verdict") not in VERDICTS or len(o.get("observed_findings") or []) < 3: + rejected.append({"review_id": o["review_id"], "why": "verdict unknown or fewer than 3 observations"}); continue + vis = {"reviewer_type": o.get("reviewer_type", "vision_model"), "reviewer_id": o["reviewer_id"], "observed_findings": o["observed_findings"], + "issue_locations": o.get("issue_locations", []), "verdict": o["verdict"], "reviewed_utc": time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime()), + "image_sha256": it["composite_sha256"], "batch": batch, "protocol": "blinded, one review per unique layout", + "coverage": ("full" if it.get("n_tiles_sent", 0) >= it.get("n_tiles_total", 0) else f"partial: composite + {it.get('n_tiles_sent')} of {it.get('n_tiles_total')} zoom tiles")} + rep_path = str(paths.resolve(it["record"]).resolve()); key = rec_key.get(rep_path) + if key is None: rejected.append({"review_id": o["review_id"], "why": "representative record not found"}); continue + for rp, rec in g[key]: + v = dict(vis) + if str(Path(rp).resolve()) != rep_path: v["reused_from"] = o["review_id"]; v["reuse_key"] = "geometry_hash+pdk"; reused += 1 + rec["visual"] = v; rec["verdict"] = o["verdict"]; json.dump(rec, open(rp, "w"), indent=1) + ok += 1 + man["applied"] = True; man["applied_utc"] = time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime()); man["rejected"] = rejected + missing = sorted(set(man["items"]) - {o.get("review_id") for o in outs}) + man["missing"] = missing + json.dump(man, open(bd / "manifest.json", "w"), indent=1) + shutil.copy(outputs, bd / "outputs.json") + print("applied", ok, "reused into", reused, "records; rejected", len(rejected), "missing", len(missing)) + + +def resolve(rid, outcome, note, evidence, by="maintainer"): + """Record how a 'suspicious' / 'fail' visual verdict was resolved (outcome: resolved_ok | confirmed_issue), on the + reviewed record and every record that reuses it. The reviewer's verdict itself is never overwritten.""" + assert outcome in ("resolved_ok", "confirmed_issue") + n = 0 + for k, recs in groups(ROOTS).items(): + for rp, rec in recs: + if rec["review_id"] == rid or rec["visual"].get("reused_from") == rid: + rec["visual_resolution"] = {"outcome": outcome, "note": note, "evidence": evidence, "by": by, + "utc": time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime())} + json.dump(rec, open(rp, "w"), indent=1); n += 1 + print(rid, outcome, "records", n) + + +def status(): + g = groups(ROOTS); c = collections.Counter(); cr = collections.Counter() + for k, recs in g.items(): + vs = {r["visual"]["verdict"] for _, r in recs}; c[sorted(vs)[0] if len(vs) == 1 else "mixed"] += 1 + for _, r in recs: cr[(r["visual"]["verdict"], "reused" if r["visual"].get("reused_from") else "direct")] += 1 + print(json.dumps({"unique_layouts": dict(c), "records": {f"{a}/{b}": n for (a, b), n in cr.items()}}, indent=1)) + + +def main(): + ap = argparse.ArgumentParser(); ap.add_argument("cmd"); ap.add_argument("args", nargs="*"); ap.add_argument("--limit", type=int, default=40) + ap.add_argument("--roots", default=",".join(ROOTS)); ap.add_argument("--width", type=int, default=1000); ap.add_argument("--tile-width", type=int, default=1200); ap.add_argument("--max-tiles", type=int, default=99); ap.add_argument("--include", default=None); ap.add_argument("--by", default="maintainer"); a = ap.parse_args() + global MAX_TILES; MAX_TILES = a.max_tiles + global TILE_W; TILE_W = a.tile_width + if a.cmd == "prepare": prepare(a.args[0], a.limit, a.roots.split(","), a.width, + include=[l.strip() for l in open(a.include) if l.strip()] if a.include else None) + elif a.cmd == "apply": apply(a.args[0], a.args[1]) + elif a.cmd == "status": status() + elif a.cmd == "propagate": propagate() + elif a.cmd == "resolve": resolve(*a.args[:4], by=a.by) + + +if __name__ == "__main__": + main() diff --git a/benchmarks/textbook_sharing/textbook_sharing/run_case.py b/benchmarks/textbook_sharing/textbook_sharing/run_case.py new file mode 100644 index 00000000..435692bd --- /dev/null +++ b/benchmarks/textbook_sharing/textbook_sharing/run_case.py @@ -0,0 +1,111 @@ +"""One run: one qualified case x (one named mode | one explicit candidate) -> GDS -> verification -> matching check +-> post-layout simulation against the case's frozen specification -> result.json (with per-stage timings). +Statuses (first failure wins): NA (mode not applicable), rejected_plan, build_failed, drc_failed, lvs_failed, +constraints_failed (sizing or declared matching ratio), pex_failed, simulation_failed, spec_failed, +physical_review_failed; otherwise auto_passed (visual review pending).""" +from __future__ import annotations +import json, time, traceback, re, hashlib +from pathlib import Path +from textbook_sharing.layout import build, applicability +from textbook_sharing.circuits import CIRCUITS +from textbook_sharing.cases import CaseSpec +from textbook_sharing.presim import presim +from textbook_sharing.verify.pipeline import verify_layout +from textbook_sharing.pdk import pdk_obj +from textbook_sharing import paths +from textbook_sharing import matching +from glayout.sharing import SharingPlanRejected +from textbook_sharing.assembly import AssemblyError + +ORDER = ["rejected_plan", "build_failed", "drc_failed", "lvs_failed", "constraints_failed", "pex_failed", "simulation_failed", "spec_failed", "physical_review_failed"] + + +def load_case_dir(cdir): + cdir = paths.resolve(cdir); cj = json.load(open(cdir / "case.json")); specs = json.load(open(cdir / "specs.json")) + return CaseSpec(cj["case_id"], cj["circuit_id"], cj["pdk"], cj["size"], cj["sizing"], cj["supply"], cj["bias"], cj["load"], specs, cj.get("notes", [])), cj + + +def lvs_target(cdir, top, out_dir): + src = (Path(cdir) / "target_lvs.spice").read_text() + orig = re.search(r"^\.subckt\s+(\S+)", src, re.M).group(1) + txt = re.sub(rf"^(\.subckt\s+){re.escape(orig)}\b", rf"\g<1>{top}", src, flags=re.M) + txt = re.sub(rf"^(\.ends\s+){re.escape(orig)}\b", rf"\g<1>{top}", txt, flags=re.M) + out_dir.mkdir(parents=True, exist_ok=True); p = out_dir / f"{top}_target_lvs.spice"; p.write_text(txt) + return p, hashlib.sha256(src.encode()).hexdigest() + + +def run(cdir, out_dir, mode=None, plans=None, label=None, context=None, nominal_sizing=None): + cdir = paths.resolve(cdir).resolve() + case, cj = load_case_dir(cdir); circ = CIRCUITS[case.circuit_id]; pdkname = case.pdk; pdk = pdk_obj(pdkname) + out_dir = Path(out_dir).resolve(); out_dir.mkdir(parents=True, exist_ok=True) + label = label or mode or "candidate" + res = {"case_id": case.case_id, "case_dir": paths.rel(cdir), "label": label, "mode": mode, "t_start": time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime()), "timing_s": {}} + t0 = time.time() + try: + if plans is None: + appl = applicability(pdk, circ, case.sizing); res["applicability"] = appl["modes"] + if not appl["modes"].get(mode, False): + res["primary_status"] = "NA"; json.dump(res, open(out_dir / "result.json", "w"), indent=1, default=str); return res + top = re.sub(r"[^A-Za-z0-9_]", "_", f"{case.case_id}_{label}".replace(".", "p"))[:90] # gdsfactory-safe cell name + tb = time.time() + r = build(pdk, circ, case.sizing, mode=mode or "independent", name=top, plans=plans) + gds = out_dir / f"{top}.gds"; r["component"].write_gds(str(gds)) + res["timing_s"]["geometry_generation"] = round(time.time() - tb, 2) + from textbook_sharing.analysis.ledger import geometry_hash + res["geometry_hash"] = geometry_hash(str(gds)) # cell-name independent: identical geometries share it + res.update({"gds": paths.rel(gds), "gds_sha256": hashlib.sha256(gds.read_bytes()).hexdigest(), "groups": r["groups"], "applied_plans": r["applied_plans"], + "evidence": r["evidence"], "assembly_stats": r["assembly_stats"], "area_um2_assembly": r["assembly_stats"]["area_um2"]}) + tdevs = [{"name": d.name, "model": d.kind, "d": d.nets[0], "g": d.nets[1], "s": d.nets[2], "b": d.nets[3], "w": case.sizing[d.name]["w"], "l": case.sizing[d.name]["l"], + "nf": case.sizing[d.name]["nf"]} for d in circ.devices if d.kind in ("nfet", "pfet")] + body_n = next((d.nets[3] for d in circ.devices if d.kind == "nfet"), "VSS") + tl, tsha = lvs_target(cdir, top, out_dir); res["target_lvs_sha256"] = tsha + v = verify_layout(pdkname, str(gds), top, str(tl), tdevs, circ.ports, out_dir / "verify", expected_fingers=r["expected_fingers"], + context=(context or {}) | {"case": case.case_id, "label": label}, sub_net=body_n) + res["verify"] = {k: (val.get("status") if isinstance(val, dict) else val) for k, val in v["stages"].items()} + res["timing_s"].update(v.get("timing_s", {})) + res["area_um2"] = v["area_um2"]; res["fail_reasons"] = list(v["fail_reasons"]); res["review_id"] = v["review_id"] + res["pex_policy"] = (v["stages"].get("pex") or {}).get("policy"); res["pex_counts"] = {k: (v["stages"].get("pex") or {}).get(k) for k in ("n_res", "n_cap", "n_devices", "floating_nodes")} + m = matching.check(case.circuit_id, nominal_sizing or case.sizing, case.sizing, r["applied_plans"]); res["matching"] = m + if m["status"] != "passed" and "constraints_failed" not in res["fail_reasons"]: res["fail_reasons"].append("constraints_failed") + pexsp = v["stages"].get("pex", {}).get("spice") + if pexsp: + ts = time.time() + s = presim(pdkname, circ, case, out_dir / "postsim", include_override=pexsp, dut_name=top) + res["timing_s"]["post_layout_simulation"] = round(time.time() - ts, 2) + res["postsim"] = {"status": s["status"], "measures": s["measures"], "spec": s["spec"].get("details") if s.get("spec") else None, "errors": s["sim"]["errors"][:3]} + if s["status"] != "passed": res["fail_reasons"].append("simulation_failed" if s["status"].startswith("simulation") else "spec_failed") + else: + res["postsim"] = {"status": "NOT_RUN", "reason": "no PEX netlist"} + if "pex_failed" not in res["fail_reasons"]: res["fail_reasons"].append("pex_failed") + prim = next((o for o in ORDER if o in res["fail_reasons"]), None) + res["primary_status"] = prim or "auto_passed" + except SharingPlanRejected as e: + res.update({"primary_status": "rejected_plan", "report": e.report.to_json()}) + except AssemblyError as e: + res.update({"primary_status": "build_failed", "error": f"AssemblyError: {e}"}) + except Exception as e: + res.update({"primary_status": "build_failed", "error": repr(e), "trace": traceback.format_exc()[-2500:]}) + res["timing_s"]["end_to_end"] = round(time.time() - t0, 2) + json.dump(res, open(out_dir / "result.json", "w"), indent=1, default=str) + return res + + +def main(): + import argparse + ap = argparse.ArgumentParser(description="Build and verify one layout of one case, e.g. " + "python -m textbook_sharing.run_case data/cases/C08/sky130/sW1_sL1 /tmp/out --mode combined") + ap.add_argument("case_dir"); ap.add_argument("out_dir") + how = ap.add_mutually_exclusive_group(required=True) + how.add_argument("--mode", choices=("independent", "diffusion_only", "gate_only", "combined"), help="a named mode") + how.add_argument("--plans", help="JSON file {group index: SharingPlan json}") + how.add_argument("--from-record", help="result.json of an earlier run: rebuild with the plans it recorded") + a = ap.parse_args() + plans = json.load(open(a.plans)) if a.plans else None + if a.from_record: + plans = {str(p["group"]): p["plan"] for p in json.load(open(a.from_record))["applied_plans"]} + r = run(a.case_dir, a.out_dir, mode=a.mode, plans=plans, label=a.mode or "plans") + print(json.dumps({k: r.get(k) for k in ("primary_status", "area_um2", "geometry_hash", "verify")}, indent=1)) + + +if __name__ == "__main__": + main() diff --git a/benchmarks/textbook_sharing/textbook_sharing/run_grid.py b/benchmarks/textbook_sharing/textbook_sharing/run_grid.py new file mode 100644 index 00000000..8f6f2484 --- /dev/null +++ b/benchmarks/textbook_sharing/textbook_sharing/run_grid.py @@ -0,0 +1,55 @@ +"""Main grid: every qualified case x the four named modes (independent, diffusion_only, gate_only, combined). +usage: python -m textbook_sharing.run_grid [--out /grid] [--sizes sW1_sL1,sW1_sL1.5] [--circuits ..] [--pdks ..] [--jobs 12] +Resumable: a run whose result.json exists is skipped. The development size points (used to freeze the cost rule and +the fixed mode order before anything else was measured) are sW1_sL1 and sW1_sL1.5; the other ten are held out.""" +from __future__ import annotations +import json, argparse, glob +from pathlib import Path +from multiprocessing import Pool +from textbook_sharing import paths +MODES = ("independent", "diffusion_only", "gate_only", "combined") +DEV_SIZES = ("sW1_sL1", "sW1_sL1.5") + + +def qualified_cases(circuits=None, pdks=None, sizes=None): + out = [] + for q in sorted(glob.glob(str(paths.CASES / "*/*/*/qualification.json"))): + r = json.load(open(q)) + if r.get("stage") != "qualified": continue + if circuits and r["circuit_id"] not in circuits: continue + if pdks and r["pdk"] not in pdks: continue + if sizes and r["size"] not in sizes: continue + out.append(Path(q).parent) + return out + + +def job(args): + cdir, mode, out_root = args + from textbook_sharing.run_case import run + cj = json.load(open(Path(cdir) / "case.json")) + od = Path(out_root) / cj["circuit_id"] / cj["pdk"] / cj["size"] / mode + if (od / "result.json").exists(): + return json.load(open(od / "result.json")).get("primary_status") + nom = json.load(open(paths.CASES / cj["circuit_id"] / cj["pdk"] / "sW1_sL1" / "case.json"))["sizing"] \ + if (paths.CASES / cj["circuit_id"] / cj["pdk"] / "sW1_sL1" / "case.json").exists() else cj["sizing"] + r = run(cdir, od, mode=mode, label=mode, context={"experiment": "main_grid", "size": cj["size"], "mode": mode}, nominal_sizing=nom) + print(cj["case_id"], mode, r.get("primary_status"), r.get("area_um2"), r.get("timing_s", {}).get("end_to_end"), flush=True) + return r.get("primary_status") + + +def main(): + ap = argparse.ArgumentParser(); ap.add_argument("--out", default=str(paths.GRID_RUNS)); ap.add_argument("--sizes", default=None) + ap.add_argument("--circuits", default=None); ap.add_argument("--pdks", default=None); ap.add_argument("--jobs", type=int, default=12) + ap.add_argument("--modes", default=",".join(MODES)) + a = ap.parse_args() + cases = qualified_cases(a.circuits.split(",") if a.circuits else None, a.pdks.split(",") if a.pdks else None, a.sizes.split(",") if a.sizes else None) + jobs = [(str(c), m, a.out) for c in cases for m in a.modes.split(",")] + print("cases", len(cases), "jobs", len(jobs), flush=True) + with Pool(a.jobs, maxtasksperchild=4) as pool: + st = pool.map(job, jobs, chunksize=1) + import collections + print(dict(collections.Counter(st))) + + +if __name__ == "__main__": + main() diff --git a/benchmarks/textbook_sharing/textbook_sharing/selection/__init__.py b/benchmarks/textbook_sharing/textbook_sharing/selection/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/benchmarks/textbook_sharing/textbook_sharing/selection/catalogue.py b/benchmarks/textbook_sharing/textbook_sharing/selection/catalogue.py new file mode 100644 index 00000000..d343ca21 --- /dev/null +++ b/benchmarks/textbook_sharing/textbook_sharing/selection/catalogue.py @@ -0,0 +1,68 @@ +"""Selection catalogue of one task (= one qualified case of the selection subset); fixed before any evaluation. + +Per sharing group g: all 256 raw axis tuples (glayout.sharing.enumeration) -> static legality -> equivalence +de-duplication -> p_g unique candidates. Global combination space = prod(p_g) (an upper bound on globally legal +combinations: assembly can still reject a combination; such rejections are counted when evaluated). +Sampling (no area, no verification result, no method output is used): + 1. the four named modes (per group: the named plan of the mode, else the group's independent plan); + identical global combinations are kept once; + 2. if prod(p_g) <= LIMIT: every combination (exhaustive); else strata = the vector of per-group (diffusion, gate) + axis values; strata are visited round-robin in sorted order and inside a stratum a combination is drawn uniformly + with random.Random(SEED + task hash); duplicates are skipped; stop at LIMIT candidates or when every stratum is + exhausted (300 consecutive misses). +Candidate ids are content hashes of the per-group plan ids (no ordering information).""" +from __future__ import annotations +import hashlib, random, itertools +from math import prod + +LIMIT = 64 +SEED = 20261011 + + +def cand_id(plan_ids): + return "c" + hashlib.sha256("|".join(plan_ids).encode()).hexdigest()[:11] + + +def build_catalogue(pdk, groups, task_id): + from glayout.sharing import group_candidates, named_plans, independent_plan + tables = [] + for g in groups: + c = group_candidates(pdk, g); nm = named_plans(pdk, g, c) + uniq = [(row["plan_id"], row["tuple"]) for row in c["rows"] if row["status"] == "unique"] + ind = independent_plan(g) + tables.append({"devices": [d.logical_id for d in g], "counts": c["counts"], "unique": uniq, + "plans": {pid: c["unique"][pid][1].to_json() for pid, _ in uniq} | {ind.plan_id(): ind.to_json()}, + "named": {k: (v.plan_id() if v else None) for k, v in nm.items()}, "independent": ind.plan_id(), "rows": c["rows"]}) + product = prod(len(t["unique"]) for t in tables) + entries = {}; order = [] + def add(pids, label): + cid = cand_id(pids) + if cid in entries: entries[cid]["labels"].append(label); return False + entries[cid] = {"plan_ids": list(pids), "labels": [label]}; order.append(cid); return True + for mode in ("independent", "diffusion_only", "gate_only", "combined"): + pids = [t["named"].get(mode) or t["independent"] for t in tables] + add(pids, f"named:{mode}") + if product <= LIMIT: + for combo in itertools.product(*[[pid for pid, _ in t["unique"]] for t in tables]): + add(combo, "exhaustive") + sampling = "exhaustive (prod(p_g) <= limit)" + else: + rng = random.Random(SEED + int(hashlib.sha256(task_id.encode()).hexdigest()[:8], 16)) + bykey = [] + for t in tables: + m = {} + for pid, tup in t["unique"]: m.setdefault((tup["diffusion"], tup["gate"]), []).append(pid) + bykey.append(m) + strata = sorted(itertools.product(*[sorted(m.keys()) for m in bykey])) + misses = 0; k = 0 + while len(entries) < LIMIT and misses < 300: + st = strata[k % len(strata)]; k += 1 + combo = [rng.choice(bykey[gi][key]) for gi, key in enumerate(st)] + if add(combo, "stratified_sample"): misses = 0 + else: misses += 1 + sampling = f"stratified seeded sample over {len(strata)} strata (seed {SEED}+task hash)" + ledger = {"per_group": [{"devices": t["devices"], **t["counts"]} for t in tables], "raw_per_group": 256, + "global_product_of_unique": product, "named_distinct": sum(1 for c in order if any(l.startswith("named:") for l in entries[c]["labels"])), + "selected_for_evaluation": len(order), "sampling": sampling, "limit": LIMIT} + return {"task_id": task_id, "tables": [{k: v for k, v in t.items() if k != "rows"} for t in tables], "group_rows": [t["rows"] for t in tables], + "entries": entries, "ledger": ledger} diff --git a/benchmarks/textbook_sharing/textbook_sharing/selection/cost.py b/benchmarks/textbook_sharing/textbook_sharing/selection/cost.py new file mode 100644 index 00000000..9d037727 --- /dev/null +++ b/benchmarks/textbook_sharing/textbook_sharing/selection/cost.py @@ -0,0 +1,130 @@ +"""Plan-level physical cost estimate (rule frozen before any measurement at the held-out sizes). + +Inputs: the candidate's SharingPlans, the PDK rule table, and ONE baseline assembly per task (the independent plan, +built once; its geometry cost is charged to the method as one geometry generation). No candidate geometry is +generated, no measured area or verification label of any candidate is read. + +Group level (same formulas as glayout.sharing.group.build_mos_group, evaluated without drawing): + W_g = sum_islands [2*end_ext + k*L + (k-1)*inner_node] + (n_islands-1)*island_gap + top-strap end-pad overhang + H_g = W_unit + bottom part (endcap [+poly_sep if a top strap crosses a bottom strap span] + strap + pad levels*pad_pitch) + + top part (endcap [+poly_sep] + strap, only with top straps) + S/D pin rows +Task level: rowspan_r(c) = rowspan_r(base) + sum_{g in r} (W_g(c) - W_g(base)); H_r(c) = H_r(base) + max_g H_g(c) - max_g H_g(base) + W(c) = max_r rowspan_r(c) + (W_total(base) - max_r rowspan_r(base)); H(c) = H_total(base) + sum_r (H_r(c) - H_r(base)) + Channels (added after the development-size validation, before any other size was measured): every diffusion node of a + group cell has a pin on the cell's top edge and every gate group has a pad on its strap side, so the set of nets a + candidate brings into each routing channel follows from the plan alone. With N_ch the nets of channel ch (other cells + and tap strips taken from the baseline assembly), H(c) += track_pitch * sum_ch (|N_ch(c)| - |N_ch(base)|) + (+/- 2*channel_margin when a channel appears / disappears). Track packing changes, cross-row stub shifts and the + split-channel alternative are not modelled. + A_hat(c) = W(c) * H(c). The decomposition terms (shared-node width saving, strap/pad height cost, row dominance, + passive-row dominance) are returned with the estimate.""" +from __future__ import annotations +from glayout.sharing.rules import snap, snap_up + + +def group_dims(R, devices, plan): + W = snap(devices[0].unit_width); L = snap(devices[0].length); n = plan.n() + inner_node = snap_up(max(2 * R.cont_gate_sep + R.cont_w, R.m1_sep + R.m1_bar_w() - L)) + outer_m1_half = max(R.m1_bar_w(), R.via1_m1_w()) / 2 + active_end_half = R.cont_w / 2 + R.act_enc_cont + island_gap = snap_up(max(R.act_sep, R.m1_sep + 2 * max(0.0, outer_m1_half - active_end_half))) + end_off = max(snap_up(R.cont_gate_sep + R.cont_w / 2), snap_up(inner_node / 2)) + end_ext = max(snap_up(end_off + R.cont_w / 2 + R.act_enc_cont), snap_up(R.act_sd_ext_min)) + isl = plan.islands() + w_act = sum(2 * end_ext + (b - a + 1) * L + (b - a) * inner_node for a, b in isl) + (len(isl) - 1) * island_gap + gpad = snap_up(max(R.cont_w + 2 * R.poly_enc_cont, R.poly_w_min, R.sq_from_area(R.poly_area_min), + R.cont_w + 2 * R.m1_enc_cont, R.m1_w, R.sq_from_area(R.m1_area_min), R.via1_m1_w())) + d_pad = snap_up(max(R.contpoly_act_sep, R.m1_sep + 2 * R.m1_enc_cont - R.act_enc_cont, R.poly_act_sep + R.poly_enc_cont)) + pad_out = d_pad + R.cont_w / 2 + R.poly_enc_cont + (gpad - R.cont_w - 2 * R.poly_enc_cont) / 2 + gpad / 2 + side_of = {} + for gi, g in enumerate(plan.gate_groups): + for p in g.fingers: side_of[p] = g.side + tops = [g for g in plan.gate_groups if g.side == "top"]; bottoms = [g for g in plan.gate_groups if g.side == "bottom"] + over_l = max([pad_out for g in tops if g.pad_end == "left"] + [0.0]); over_r = max([pad_out for g in tops if g.pad_end == "right"] + [0.0]) + w = w_act + over_l + over_r + def iv(g): + lo, hi = min(g.fingers), max(g.fingers) + if g.side == "top": lo, hi = (0, hi) if g.pad_end == "left" else (lo, n - 1) + return lo, hi + off_b = any(side_of[p] == "top" for g in bottoms for p in range(iv(g)[0], iv(g)[1] + 1)) + off_t = any(side_of[p] == "bottom" for g in tops for p in range(iv(g)[0], iv(g)[1] + 1)) + strap_w = snap_up(R.poly_w_min); pad_pitch = snap_up(gpad + max(R.poly_sep, R.m1_sep, R.m2_sep)) + levels = min(2, len(bottoms)) + h_bottom = R.endcap + (R.poly_sep if off_b else 0.0) + strap_w + levels * pad_pitch if bottoms else R.endcap + h_top = (R.endcap + (R.poly_sep if off_t else 0.0) + strap_w) if tops else R.endcap + pin = max(R.m1_sep, R.poly_act_sep, 0.1) + snap_up(R.via1_pad_w() + R.m2_sep) + R.via1_pad_w() + h = W + h_bottom + h_top + pin + s = plan.summary() + return {"w": round(w, 4), "h": round(h, 4), "islands": len(isl), "cross_joins": s["cross_device_diffusion_joins"], + "shared_gate_groups": s["cross_device_gate_groups"], "top_band": bool(tops), "pad_levels": levels, + "top_pad_overhang": round(over_l + over_r, 4), "active_w": round(w_act, 4)} + + +def group_side_nets(devices, plan): + """Nets a group cell exposes on its own top and bottom edges (cell-local, before any row flip).""" + by_id = {d.logical_id: d for d in devices} + top = set(); bot = set() + for d in devices: top |= {d.s, d.d} + for g in plan.gate_groups: + net = by_id[plan.finger_order[g.fingers[0]].device].g + (top if g.side == "top" else bot).add(net) + return top, bot + + +def channel_nets(base_stats, groups, plans, group_names): + """Per-channel net sets when the groups use `plans`; other cells and tap strips as in the baseline assembly.""" + src = base_stats["channel_net_sources"]; flip = src["row_flip"]; nch = len(flip) + 1 + N = [set() for _ in range(nch)] + for ch, nets in src["taps"].items(): N[int(ch)] |= set(nets) + gset = set(group_names) + for cname, d in src["cells"].items(): + if cname in gset: continue + for ch, nets in d.items(): N[int(ch)] |= set(nets) + for g, p, cname in zip(groups, plans, group_names): + ri = src["row_of_cell"][cname]; top, bot = group_side_nets(g, p) + up, down = (bot, top) if flip[ri] else (top, bot) + N[ri + 1] |= up; N[ri] |= down + return N + + +CHANNEL_RULE = "nets" # chosen on the development sizes ("nets" or "density") and frozen before the held-out sizes + + +def estimate(R, groups, plans, base_dims, base_stats, group_row, base_plans=None, group_names=None, channel_rule=None): + """groups: list of device lists; plans: list of SharingPlan (candidate); base_dims: list of group_dims of the + baseline plans; base_stats: textbook_sharing.assembly stats of the baseline assembly (row_dims, width, height); group_row: list of the + row index (in base_stats['row_dims']) holding each group.""" + dims = [group_dims(R, g, p) for g, p in zip(groups, plans)] + rows = base_stats["row_dims"] + span0 = [r["width"] + 2 * r["tap_extent"] for r in rows] + span = list(span0); hrow = [r["height"] for r in rows] + for gi, (d, d0) in enumerate(zip(dims, base_dims)): + span[group_row[gi]] += d["w"] - d0["w"] + for ri in range(len(rows)): + gs = [gi for gi in range(len(groups)) if group_row[gi] == ri] + if gs: + hrow[ri] = rows[ri]["height"] + max(dims[gi]["h"] for gi in gs) - max(base_dims[gi]["h"] for gi in gs) + Wt = max(span) + (base_stats["width"] - max(span0)) + Ht = base_stats["height"] + sum(hrow[ri] - rows[ri]["height"] for ri in range(len(rows))) + dch = None + if base_plans is not None and "channel_net_sources" in base_stats and (channel_rule or CHANNEL_RULE) != "none": + names = group_names or [f"grp{gi}" for gi in range(len(groups))] + Nb = channel_nets(base_stats, groups, base_plans, names); Nc = channel_nets(base_stats, groups, plans, names) + pitch = base_stats["track_pitch"]; marg = base_stats["channel_margin"]; dch = [] + rule = channel_rule or CHANNEL_RULE + for ch, (b, c) in enumerate(zip(Nb, Nc)): + if rule == "density" and b: + hb = base_stats["channel_heights"][ch] + tb = round((hb - 2 * marg) / pitch) if hb > 0 else 0 + dt = round((len(c) - len(b)) * tb / len(b)) + else: + dt = len(c) - len(b) + dh = dt * pitch + if b and not c: dh -= 2 * marg + if c and not b: dh += 2 * marg + dch.append(round(dh, 4)) + Ht += sum(dch) + widest = max(range(len(rows)), key=lambda ri: span[ri]) + return {"area_hat": round(Wt * Ht, 4), "w_hat": round(Wt, 4), "h_hat": round(Ht, 4), "groups": dims, + "row_spans": [round(x, 4) for x in span], "widest_row_kind": rows[widest]["kind"], + "passive_dominated": rows[widest]["kind"] == "passive", "channel_dh": dch} diff --git a/benchmarks/textbook_sharing/textbook_sharing/selection/fixed_order.py b/benchmarks/textbook_sharing/textbook_sharing/selection/fixed_order.py new file mode 100644 index 00000000..a2ff71b9 --- /dev/null +++ b/benchmarks/textbook_sharing/textbook_sharing/selection/fixed_order.py @@ -0,0 +1,38 @@ +"""Freeze the fixed-mode order for the 'fixed_mode' strategy from DEVELOPMENT-size main-grid results only. +Declared rule (written before reading the results): for each sharing mode m, over the development cases where both m and +independent passed every automatic stage, take the mean of (A_m / A_independent - 1); order the modes by that mean +ascending (ties: higher pass rate first); 'independent' is always last. Output: data/frozen/fixed_order.json +(never overwritten). usage: python -m textbook_sharing.selection.fixed_order --sizes sW1_sL1,sW1_sL1.5""" +import json, glob, argparse, statistics +from pathlib import Path +from textbook_sharing import paths +MODES = ("diffusion_only", "gate_only", "combined") + + +def main(): + ap = argparse.ArgumentParser(); ap.add_argument("--sizes", required=True); a = ap.parse_args() + sizes = a.sizes.split(","); out = paths.FROZEN / "fixed_order.json" + if out.exists(): raise SystemExit(f"{out} exists; never overwritten") + stat = {m: {"applicable": 0, "passed": 0, "rel": []} for m in MODES} + for ind in sorted(glob.glob(str(paths.GRID_RUNS / "*/*/*/independent/result.json"))): + if Path(ind).parts[-3] not in sizes: continue + b = json.load(open(ind)) + for m in MODES: + f = Path(ind).parent.parent / m / "result.json" + if not f.exists(): continue + r = json.load(open(f)) + if r.get("primary_status") == "NA": continue + stat[m]["applicable"] += 1 + if r.get("primary_status") == "auto_passed": stat[m]["passed"] += 1 + if r.get("primary_status") == "auto_passed" and b.get("primary_status") == "auto_passed": + stat[m]["rel"].append(r["area_um2"] / b["area_um2"] - 1) + rows = {m: {"applicable": s["applicable"], "passed": s["passed"], "pass_rate": s["passed"] / s["applicable"] if s["applicable"] else 0, + "n_paired": len(s["rel"]), "mean_rel_area": statistics.mean(s["rel"]) if s["rel"] else 0.0} for m, s in stat.items()} + order = sorted(MODES, key=lambda m: (rows[m]["mean_rel_area"], -rows[m]["pass_rate"])) + ["independent"] + rule = __doc__.split(" Output:")[0].strip() + json.dump({"order": order, "per_mode": rows, "sizes": sizes, "rule": rule}, open(out, "w"), indent=1) + print(json.dumps({"order": order, "per_mode": rows}, indent=1)) + + +if __name__ == "__main__": + main() diff --git a/benchmarks/textbook_sharing/textbook_sharing/selection/run_selection.py b/benchmarks/textbook_sharing/textbook_sharing/selection/run_selection.py new file mode 100644 index 00000000..80ce0a58 --- /dev/null +++ b/benchmarks/textbook_sharing/textbook_sharing/selection/run_selection.py @@ -0,0 +1,110 @@ +"""Plan-selection study: catalogue construction and full evaluation of every catalogue candidate. +Tasks: SELECTION_TOPOLOGIES x 3 PDKs x SELECTION_SIZES (72 requested); a task exists only if its case is qualified. +Per task directory /selection//: + catalogue.json (per-group candidate tables, ledger, entries = candidate id -> per-group plan ids, plans) + estimates.json (cost.py estimate of every entry; uses one baseline assembly of the independent plan) + /result.json (run_case.run with explicit plans) +usage: python -m textbook_sharing.selection.run_selection [--stage catalogue|evaluate|all] [--jobs 12] [--sizes ..] [--pdks ..] [--topologies ..]""" +from __future__ import annotations +import json, argparse, time +from pathlib import Path +from multiprocessing import Pool +from textbook_sharing.grid import SELECTION_TOPOLOGIES, SELECTION_SIZES, size_tag +from textbook_sharing import paths + +OUT = paths.SELECTION_RUNS + + +def task_dirs(topologies=None, pdks=None, sizes=None): + tasks = []; excluded = [] + for cid in (topologies or SELECTION_TOPOLOGIES): + for pdk in (pdks or ["sky130", "gf180", "ihp130"]): + for sw, sl in SELECTION_SIZES: + tag = size_tag(sw, sl) + if sizes and tag not in sizes: continue + q = paths.CASES / cid / pdk / tag / "qualification.json" + rec = {"task_id": f"{cid}_{pdk}_{tag}", "case_dir": paths.rel(q.parent)} + if not q.exists(): + # parameter-illegal or duplicate requests have no case directory: read the build record + rec["excluded"] = "no case directory (parameter-illegal or duplicate request)"; excluded.append(rec); continue + r = json.load(open(q)) + if r["stage"] != "qualified": + rec["excluded"] = "schematic_not_qualified: " + "; ".join(r["qualification"]["reasons"][:3]); excluded.append(rec); continue + tasks.append(rec) + return tasks, excluded + + +def make_catalogue(task): + from textbook_sharing.run_case import load_case_dir, pdk_obj + from textbook_sharing.circuits import CIRCUITS + from textbook_sharing.layout import device_specs, sharing_groups, build + from textbook_sharing.selection.catalogue import build_catalogue + from textbook_sharing.selection import cost + from glayout.sharing import SharingPlan, rules_for + td = OUT / task["task_id"]; td.mkdir(parents=True, exist_ok=True) + if (td / "catalogue.json").exists() and (td / "estimates.json").exists(): + return task["task_id"], "kept" + case, cj = load_case_dir(task["case_dir"]); circ = CIRCUITS[case.circuit_id]; pdk = pdk_obj(case.pdk) + groups = sharing_groups(device_specs(circ, case.sizing)) + t0 = time.time(); cat = build_catalogue(pdk, groups, task["task_id"]); t_enum = time.time() - t0 + json.dump({**cat, "timing_s": {"enumeration_and_static_checks": round(t_enum, 3)}}, open(td / "catalogue.json", "w"), indent=1, default=str) + # cost estimates: one baseline assembly (independent plan) + plan-only group formulas + R = rules_for(pdk) + t1 = time.time() + base = build(pdk, circ, case.sizing, mode="independent", name=f"{case.case_id}_costbase".replace(".", "p")) + t_base = time.time() - t1 + base_plans = [SharingPlan.from_json(ap["plan"]) for ap in base["applied_plans"]] + base_dims = [cost.group_dims(R, g, p) for g, p in zip(groups, base_plans)] + kinds = [r["kind"] for r in base["assembly_stats"]["row_dims"]] + group_row = [kinds.index("n" if g[0].model_role == "nfet" else "p") for g in groups] + est = {}; t2 = time.time() + tables = cat["tables"] + for cid_, e in cat["entries"].items(): + plans = [SharingPlan.from_json(tables[gi]["plans"][pid]) for gi, pid in enumerate(e["plan_ids"])] + est[cid_] = cost.estimate(R, groups, plans, base_dims, base["assembly_stats"], group_row, base_plans=base_plans) + t_est = time.time() - t2 + json.dump({"estimates": est, "baseline_area_um2": base["assembly_stats"]["area_um2"], "timing_s": {"baseline_geometry": round(t_base, 3), "estimates_total": round(t_est, 4)}, + "rule": "textbook_sharing.selection.cost v2 (group dims + channel nets)"}, open(td / "estimates.json", "w"), indent=1, default=str) + return task["task_id"], "built" + + +def eval_job(args): + task_id, case_dir, cand_id = args + from textbook_sharing.run_case import run + td = OUT / task_id; od = td / cand_id + if (od / "result.json").exists(): + return json.load(open(od / "result.json")).get("primary_status") + cat = json.load(open(td / "catalogue.json")); e = cat["entries"][cand_id] + plans = {str(gi): cat["tables"][gi]["plans"][pid] for gi, pid in enumerate(e["plan_ids"])} + cj = json.load(open(Path(case_dir) / "case.json")) + nomp = paths.CASES / cj["circuit_id"] / cj["pdk"] / "sW1_sL1" / "case.json" + nom = json.load(open(nomp))["sizing"] if nomp.exists() else None + r = run(case_dir, od, plans=plans, label=cand_id, context={"experiment": "selection", "task": task_id, "candidate": cand_id}, nominal_sizing=nom) + print(task_id, cand_id, r.get("primary_status"), r.get("area_um2"), flush=True) + return r.get("primary_status") + + +def main(): + ap = argparse.ArgumentParser(); ap.add_argument("--stage", default="all"); ap.add_argument("--jobs", type=int, default=12) + ap.add_argument("--sizes", default=None); ap.add_argument("--pdks", default=None); ap.add_argument("--topologies", default=None) + a = ap.parse_args() + tasks, excluded = task_dirs(a.topologies.split(",") if a.topologies else None, a.pdks.split(",") if a.pdks else None, a.sizes.split(",") if a.sizes else None) + OUT.mkdir(parents=True, exist_ok=True) + json.dump({"tasks": tasks, "excluded": excluded}, open(OUT / f"tasks_{int(time.time())}.json", "w"), indent=1) + print("tasks", len(tasks), "excluded", len(excluded), flush=True) + if a.stage in ("catalogue", "all"): + with Pool(min(a.jobs, 8)) as pool: + for tid, st in pool.imap_unordered(make_catalogue, tasks): print("catalogue", tid, st, flush=True) + if a.stage in ("evaluate", "all"): + jobs = [] + for t in tasks: + cat = json.load(open(OUT / t["task_id"] / "catalogue.json")) + jobs += [(t["task_id"], t["case_dir"], c) for c in cat["entries"]] + print("candidate evaluations", len(jobs), flush=True) + with Pool(a.jobs, maxtasksperchild=4) as pool: + st = pool.map(eval_job, jobs, chunksize=1) + import collections; print(dict(collections.Counter(st))) + + +if __name__ == "__main__": + main() diff --git a/benchmarks/textbook_sharing/textbook_sharing/selection/strategies.py b/benchmarks/textbook_sharing/textbook_sharing/selection/strategies.py new file mode 100644 index 00000000..e23ac8e7 --- /dev/null +++ b/benchmarks/textbook_sharing/textbook_sharing/selection/strategies.py @@ -0,0 +1,157 @@ +"""Plan-selection methods evaluated on the fully verified catalogue of each task (offline replay; every method +sees only what it is entitled to see and pays for it). Budget = number of full verifications (1, 2, 4, 8, 16). +Methods + fixed_mode : the named modes in a frozen order (FIXED_ORDER, set from development-size results before test + sizes were measured), then the remaining candidates by share score. + share_most : candidates ranked by (cross-device diffusion joins + shared gate conductors), more first. + random : uniform random order, 10 fixed seeds. + neighbourhood : structural beam search (width 4) over the axis vectors (neighbours differ in one axis value + of one group), starting from the independent plan, ranking unqueried neighbours by share score. + cost_rank : ascending cost.py estimate (one baseline assembly + plan formulas; no candidate geometry). + geometry_first : build EVERY candidate's geometry (charged), rank by its bounding-box area, verify in that order. + baseline_independent: verify only the independent (unshared) plan. + best_evaluated : offline upper bound = best feasible candidate among all evaluated (not an online method). +A query returns the candidate's full result (feasible = primary_status auto_passed). Result after n queries = smallest +feasible area among the queried candidates (None if none). Time = method precomputation + sum of the per-candidate +verification wall time of the queried candidates (geometry, DRC, LVS, sizing, PEX, checks, render, post-layout sim).""" +from __future__ import annotations +import json, random +from pathlib import Path +from textbook_sharing import paths + +PREFIXES = (1, 2, 4, 8, 16) + + +def _frozen_order(): + f = paths.FROZEN / "fixed_order.json" + return json.load(open(f))["order"] if f.exists() else None + + +FIXED_ORDER = _frozen_order() # frozen by selection.fixed_order from development sizes (data/frozen/fixed_order.json) +SEEDS = list(range(10)) + + +TIMING = None + + +def _timing(): + """Controlled timings (textbook_sharing.selection.timing) when available: geometry times measured one at a time, and the + per-task median end-to-end verification time charged for every full verification (same for every method).""" + global TIMING + if TIMING is None: + f = paths.ANALYSIS / "timing_controlled.json" + TIMING = json.load(open(f))["tasks"] if f.exists() else {} + return TIMING + + +def load_task(td): + td = Path(td); cat = json.load(open(td / "catalogue.json")); est = json.load(open(td / "estimates.json")) + res = {} + for cid in cat["entries"]: + rp = td / cid / "result.json" + if rp.exists(): res[cid] = json.load(open(rp)) + T = _timing().get(td.name) + if T: + for cid, r in res.items(): + r = dict(r); t = dict(r.get("timing_s") or {}) + t["geometry_generation"] = T["geometry_s"].get(cid, t.get("geometry_generation", 0.0)) + t["end_to_end"] = T["verification_median_s"]; r["timing_s"] = t; res[cid] = r + est = dict(est); est["timing_s"] = {"baseline_geometry": T["baseline_geometry_s"], "estimates_total": T["cost_estimates_total_s"]} + return cat, est, res + + +def share_score(cat, cid): + s = 0 + for gi, pid in enumerate(cat["entries"][cid]["plan_ids"]): + pl = cat["tables"][gi]["plans"][pid] + fo = pl["finger_order"] + s += sum(1 for i, j in enumerate(pl["diffusion_joins"]) if j and fo[i][0] != fo[i + 1][0]) + s += sum(1 for g in pl["gate_groups"] if len({fo[p][0] for p in g[0]}) > 1) + return s + + +def axis_vec(cat, cid): + v = [] + for gi, pid in enumerate(cat["entries"][cid]["plan_ids"]): + tup = next((t for p, t in cat["tables"][gi]["unique"] if p == pid), None) + v += [tup[k] for k in ("arrangement", "orientation", "diffusion", "gate", "strap_start", "contact_end")] if tup else ["independent"] * 6 + return tuple(v) + + +def named(cat, mode): + return next((c for c, e in cat["entries"].items() if f"named:{mode}" in e["labels"]), None) + + +def order_for(method, cat, est, res, seed=None, fixed_order=None): + ids = sorted(cat["entries"]) + if method == "share_most": + return sorted(ids, key=lambda c: (-share_score(cat, c), c)), 0.0 + if method == "random": + r = random.Random(seed); o = list(ids); r.shuffle(o); return o, 0.0 + if method == "cost_rank": + pre = est["timing_s"]["baseline_geometry"] + est["timing_s"]["estimates_total"] + return sorted(ids, key=lambda c: (est["estimates"][c]["area_hat"], c)), pre + if method == "geometry_first": + pre = sum((res.get(c, {}).get("timing_s") or {}).get("geometry_generation", 0.0) for c in ids) + return sorted(ids, key=lambda c: ((res.get(c, {}).get("area_um2_assembly") or 1e18), c)), pre + if method == "fixed_mode": + first = [named(cat, m) for m in (fixed_order or FIXED_ORDER or ["combined", "gate_only", "diffusion_only", "independent"])] + first = [c for i, c in enumerate(first) if c and c not in first[:i]] + rest = sorted([c for c in ids if c not in first], key=lambda c: (-share_score(cat, c), c)) + return first + rest, 0.0 + raise ValueError(method) + + +def neighbourhood_order(cat, width=4, budget=16): + ids = sorted(cat["entries"]); vec = {c: axis_vec(cat, c) for c in ids} + start = named(cat, "independent") or ids[0] + traj = [start]; seen = {start}; beam = [start] + while len(traj) < min(budget, len(ids)): + cand = set() + for b in beam: + for c in ids: + if c in seen: continue + if sum(1 for x, y in zip(vec[b], vec[c]) if x != y) == 1: cand.add(c) + cand = sorted(cand, key=lambda c: (-share_score(cat, c), c)) + if not cand: + cand = sorted([c for c in ids if c not in seen], key=lambda c: (-share_score(cat, c), c)) + if not cand: break + for c in cand[:width]: + if len(traj) >= budget: break + traj.append(c); seen.add(c) + beam = traj[-width:] + return traj + + +def replay(order, res, pre_s): + out = {}; best = None; t = pre_s; found_at = None + for n, c in enumerate(order[:max(PREFIXES)], start=1): + r = res.get(c, {}) + t += (r.get("timing_s") or {}).get("end_to_end", 0.0) + if r.get("primary_status") == "auto_passed" and r.get("area_um2"): + if best is None or r["area_um2"] < best: best = r["area_um2"] + found_at = found_at or n + if n in PREFIXES: out[n] = {"best_area": best, "time_s": round(t, 1)} + for n in PREFIXES: + if n not in out: out[n] = dict(out[max(k for k in out)]) if out else {"best_area": None, "time_s": round(t, 1)} + return out, found_at + + +def evaluate_task(td, fixed_order=None): + cat, est, res = load_task(td) + feas = {c: r["area_um2"] for c, r in res.items() if r.get("primary_status") == "auto_passed" and r.get("area_um2")} + best = min(feas.values()) if feas else None + rows = [] + def add(method, order, pre, seed=None): + rp, found = replay(order, res, pre) + rows.append({"task": Path(td).name, "method": method, "seed": seed, "first_feasible_query": found, "precompute_s": round(pre, 2), + "prefix": {str(n): {**v, "gap": (v["best_area"] / best - 1) if (v["best_area"] and best) else None} for n, v in rp.items()}, + "best_evaluated": best, "n_evaluated": len(res), "n_feasible": len(feas)}) + for m in ("fixed_mode", "share_most", "cost_rank", "geometry_first"): + o, pre = order_for(m, cat, est, res, fixed_order=fixed_order); add(m, o, pre) + for s in SEEDS: + o, pre = order_for("random", cat, est, res, seed=s); add("random", o, pre, seed=s) + add("neighbourhood", neighbourhood_order(cat), 0.0) + ind = named(cat, "independent") + add("baseline_independent", [ind] if ind else [], 0.0) # the unshared reference only (one verification) + return rows diff --git a/benchmarks/textbook_sharing/textbook_sharing/selection/timing.py b/benchmarks/textbook_sharing/textbook_sharing/selection/timing.py new file mode 100644 index 00000000..6a6cd4e5 --- /dev/null +++ b/benchmarks/textbook_sharing/textbook_sharing/selection/timing.py @@ -0,0 +1,59 @@ +"""Controlled timing pass for the selection comparison. The per-candidate wall times recorded during the evaluation were +measured on a shared, heavily loaded machine (median geometry generation 0.18 s, but 53 of 3404 records > 100 s caused by +stalls). Here every candidate's geometry (and each task's cost-rule baseline) is rebuilt ONE AT A TIME in a single +process and timed; the load average is recorded. The replay charges these geometry times, and for full verifications +the per-task median of the recorded end-to-end times (the same charge for every method). +usage: python -m textbook_sharing.selection.timing --out /analysis/timing_controlled.json""" +import os, json, time, glob, argparse, statistics, tempfile +from multiprocessing import Pool +from pathlib import Path +from textbook_sharing import paths + + +def one_task(td): + from textbook_sharing.run_case import load_case_dir, pdk_obj + from textbook_sharing.circuits import CIRCUITS + from textbook_sharing.layout import build, device_specs, sharing_groups + from glayout.sharing import SharingPlan, rules_for + from textbook_sharing.selection import cost + td = Path(td); outf = paths.ANALYSIS / "timing_controlled_parts" / f"{td.name}.json" + if outf.exists(): return td.name, "kept" + cat = json.load(open(td / "catalogue.json")) + anyres = next(td.glob("*/result.json")); case_dir = json.load(open(anyres))["case_dir"] + case, cj = load_case_dir(case_dir); circ = CIRCUITS[case.circuit_id]; pdk = pdk_obj(case.pdk); R = rules_for(pdk) + groups = sharing_groups(device_specs(circ, case.sizing)); tmp = Path(tempfile.mkdtemp()) + rec = {"geometry_s": {}, "load_start": os.getloadavg()} + t0 = time.perf_counter(); base = build(pdk, circ, case.sizing, mode="independent", name=f"tb_{td.name}".replace(".", "p")); base["component"].write_gds(str(tmp / "b.gds")) + rec["baseline_geometry_s"] = round(time.perf_counter() - t0, 4) + bp = [SharingPlan.from_json(x["plan"]) for x in base["applied_plans"]]; bd = [cost.group_dims(R, g, p) for g, p in zip(groups, bp)] + kinds = [r["kind"] for r in base["assembly_stats"]["row_dims"]]; grow = [kinds.index("n" if g[0].model_role == "nfet" else "p") for g in groups] + t1 = time.perf_counter() + for cid, e in cat["entries"].items(): + plans = [SharingPlan.from_json(cat["tables"][gi]["plans"][pid]) for gi, pid in enumerate(e["plan_ids"])] + cost.estimate(R, groups, plans, bd, base["assembly_stats"], grow, base_plans=bp) + rec["cost_estimates_total_s"] = round(time.perf_counter() - t1, 4) + for n, (cid, e) in enumerate(cat["entries"].items()): + plans = {str(gi): cat["tables"][gi]["plans"][pid] for gi, pid in enumerate(e["plan_ids"])} + t2 = time.perf_counter() + r = build(pdk, circ, case.sizing, name=f"t{n}_{cid}", plans=plans); r["component"].write_gds(str(tmp / "c.gds")) + rec["geometry_s"][cid] = round(time.perf_counter() - t2, 4) + e2e = [json.load(open(p)).get("timing_s", {}).get("end_to_end") for p in td.glob("*/result.json")] + e2e = [x for x in e2e if x] + rec["verification_median_s"] = statistics.median(e2e) if e2e else None + rec["load_end"] = os.getloadavg() + outf.parent.mkdir(parents=True, exist_ok=True); json.dump(rec, open(outf, "w"), indent=1) + return td.name, round(sum(rec["geometry_s"].values()), 2) + + +def main(): + ap = argparse.ArgumentParser(); ap.add_argument("--out", required=True); ap.add_argument("--jobs", type=int, default=10); a = ap.parse_args() + tds = [str(Path(t).parent) for t in sorted(glob.glob(str(paths.SELECTION_RUNS / "*/catalogue.json")))] + with Pool(a.jobs, maxtasksperchild=1) as pool: + for name, st in pool.imap_unordered(one_task, tds): print(name, st, flush=True) + parts = {Path(f).stem: json.load(open(f)) for f in glob.glob(str(paths.ANALYSIS / "timing_controlled_parts/*.json"))} + json.dump({"note": "each task in its own process, candidates built one at a time; up to --jobs tasks in parallel", "jobs": a.jobs, "tasks": parts}, + open(a.out, "w"), indent=1) + + +if __name__ == "__main__": + main() diff --git a/benchmarks/textbook_sharing/textbook_sharing/testbench.py b/benchmarks/textbook_sharing/textbook_sharing/testbench.py new file mode 100644 index 00000000..df5b708a --- /dev/null +++ b/benchmarks/textbook_sharing/textbook_sharing/testbench.py @@ -0,0 +1,508 @@ +"""Testbench generators and measurement/spec definitions per circuit category. + +Design principles (fixed before any layout was measured): + * every testbench is generated from the case (sizing, supply, bias, load) so that bias voltages come from + disclosed ideal replica bias generators built with the DUT's own device model and sizes (no hand-tuned + voltages): a current-source gate bias is the gate of a diode-connected replica of that device carrying + the branch current; a cascode gate bias uses the W/4 replica (V_T + 2 V_ov); + * amplifiers without a defined output DC point (single-stage with active load, OTAs) use a disclosed DC servo + (1e6 H inductor / 1e6 F capacitor) that fixes the DC operating point at V_out = V_in,dc while leaving AC + behaviour untouched; differential pairs with current-source loads and the fully differential OTA use a + disclosed ideal common-mode feedback on the NMOS current-source bias; + * measurements are printed as 'name = value'; a missing crossing yields no value and fails the spec check. +Categories: mirror (C01,C02,C03,C13,C14), follower (C05), buffer_ab (C18), single (C04,C06,C12,C15), +diff_r (C16,C17), diff_cs (C07), ota (C08,C09), ota_fd (C10), twostage (C11). +""" +from __future__ import annotations +import math +from .netlist import PDK_MODELS + +CATEGORY = {"C01": "mirror", "C02": "mirror", "C03": "mirror", "C13": "mirror", "C14": "mirror", "C05": "follower", "C18": "buffer_ab", + "C04": "single", "C06": "single", "C12": "single", "C15": "single", "C07": "diff_cs", "C16": "diff_r", "C17": "diff_r", + "C08": "ota", "C09": "ota", "C10": "ota_fd", "C11": "twostage"} + + +def _inst(circuit, name): + return "X1 " + " ".join(circuit.ports) + f" {name}" + + +def _mos(pdk, inst, d, g, s, b, kind, w, l): + m = PDK_MODELS[pdk]; u = m["unit"] + return f"{m['prefix']}{inst} {d} {g} {s} {b} {m[kind]} w={w:g}{u} l={l:g}{u}" + + +def _dev(circuit, name): + return next(d for d in circuit.devices if d.name == name) + + +WDIV = {"diode": 1.0, "cascode": 4.0, "cascode3": 9.0, "cascode4": 16.0} + + +def _replica(pdk, circuit, sizing, node, devname, I, kind="diode"): + """Diode-connected replica of device devname carrying current I; node is its gate/drain. Returns lines.""" + # V_T + n*V_ov is generated with the SAME device size and n^2 times the current (keeps every replica inside the + # model's valid W range; sky130 has no bins below W=0.42 um) + dev = _dev(circuit, devname); sz = sizing[dev.name]; w = sz["w"]; I = I * WDIV[kind] + if dev.kind == "nfet": + return [_mos(pdk, f"B_{node}", node, node, "VSS", "VSS", "nfet", w, sz["l"]), f"IB_{node} VDDB {node} {I:g}"] + return [_mos(pdk, f"B_{node}", node, node, "VDDB", "VDDB", "pfet", w, sz["l"]), f"IB_{node} {node} VSS {I:g}"] + + +def bias_block(pdk, circuit, sizing, bias, extra_nodes=None): + """Replica bias generators. bias[port] forms: + {'replica': dev, 'current': I, 'kind': 'diode'|'cascode'|'cascode3'} -> port = gate of a replica diode (W, W/4, W/9) + {'expr': 'v(VB1) - gs(M3) + gs(M1) - 0.1', 'currents': {'M3': I, 'M1': I}} -> B-source; gs(X) is replaced by the + gate voltage of a diode replica of X at the given current, measured relative to its own source rail + (for an NMOS: v(GS_X); for a PMOS: v(VDD)-v(GS_X)).""" + lines = []; made = set() + items = list(bias.items()) + list((extra_nodes or {}).items()) + for port, spec in items: + if not isinstance(spec, dict): continue + if "replica" in spec: + lines += _replica(pdk, circuit, sizing, port, spec["replica"], spec["current"], spec.get("kind", "diode")) + elif "expr" in spec: + expr = spec["expr"] + for devname, I in spec.get("currents", {}).items(): + node = f"GS_{devname}" + if node not in made: + lines += _replica(pdk, circuit, sizing, node, devname, I, "diode"); made.add(node) + dev = _dev(circuit, devname) + rep = f"v({node})" if dev.kind == "nfet" else f"(v(VDDB)-v({node}))" + expr = expr.replace(f"gs({devname})", rep) + lines.append(f"B_{port} {port} 0 V = {expr}") + return "\n".join(lines) + + +def _sources(circuit, supply, bias, exclude=()): + ports = circuit.ports + lines = [f"VDD VDD 0 {supply['VDD']}" if "VDD" in ports else "", "VSS VSS 0 0" if "VSS" in ports else "", f"VDDB VDDB 0 {supply['VDD']}"]; nodesets = [] + for p in ports: + if p in ("VDD", "VSS") or p in exclude: continue + v = bias.get(p) + if v is None: continue + if isinstance(v, dict) and "replica" in v: continue # generated by bias_block + if p.startswith("VB") or p.startswith("VREF") or p.startswith("VCM"): + lines.append(f"V{p} {p} 0 {v}") + elif p.startswith(("IB", "IIN", "IREF", "IIN")): + src = v.get("from", "VDD") if isinstance(v, dict) else "VDD"; val = v["i"] if isinstance(v, dict) else v + # circuits without a VDD port (NMOS mirrors) source their currents from the defined supply VDDB; an + # undefined VDD node would float (held only by gmin, an ill-conditioned DC problem) + top = "VDD" if "VDD" in ports else "VDDB" + lines.append(f"I{p} {top} {p} {val:g}" if src == "VDD" else f"I{p} {p} VSS {val:g}") + # initial guess (not a constraint) for every current-fed node. An ideal current source has no + # compliance limit, and on some extracted netlists gmin stepping accepted a non-physical DC point with the + # input node at ~6 kV (current carried by junction leakage). .nodeset only seeds the Newton iteration. + nodesets.append(f"v({p})={round((0.3 if src == 'VDD' else 0.7) * supply['VDD'], 3)}") + if nodesets: lines.append(".nodeset " + " ".join(nodesets)) + return "\n".join(l for l in lines if l) + + +# ---------------------------------------------------------------- mirrors +def tb_mirror(circuit, name, include, case, pdk): + """Mirror test. The output is swept DOWN from VDD (continuation from the saturated, unique-solution end), so every + quantity comes from one well-defined solution branch (a stand-alone .op at a fixed output voltage can land on either + of the two DC solutions of the regulated cascode). Measured: compliance voltage vmin (lowest V_out + with |I_out/I_ref - 1| <= tol; the LAST crossing of the descending sweep, because a basic mirror can already exceed the + tolerance near VDD through channel-length modulation), error and output resistance at the frozen test point vout_test (case.load, set by the + qualification rule to the middle of [vmin_schematic, VDD]), deviation near VDD.""" + supply, bias, load = case.supply, case.bias, case.load + vdd = supply["VDD"]; iref = bias["IREF"]; tol = load.get("tol", 0.05) + vt = load.get("vout_test", load.get("vout_nom", vdd / 2)) + out = [p for p in circuit.ports if p.startswith("IOUT")][0] + src = _sources(circuit, supply, bias, exclude=(out,)) + step = vdd / 400 + return f"""{_inst(circuit, name)} +.include {include} +{src} +{bias_block(pdk, circuit, case.sizing, bias)} +VOUT {out} 0 {vdd} +.control +dc VOUT {vdd} 0 -{step:g} +let iout = -i(VOUT) +let dev = abs(iout - {iref:g})/{iref:g} +meas dc iout_t find iout at={vt:g} +let err = (iout_t - {iref:g})/{iref:g} +print err +meas dc vmin find v({out}) when dev={tol} cross=last +meas dc dev_at_vdd find dev at={vdd*0.995:g} +let gout = deriv(iout) +meas dc gout_t find gout at={vt:g} +let rout_v = 1/gout +meas dc rout_t find rout_v at={vt:g} +print vt_used +quit +.endc +.end +""".replace("print vt_used", f"echo vout_test = {vt:g}") + + +# ---------------------------------------------------------------- followers / buffers +def tb_follower(circuit, name, include, case, pdk): + supply, bias, load = case.supply, case.bias, case.load + vdd = supply["VDD"]; rl = load.get("RL", 10e3); cl = load.get("CL", 1e-12); vin = load["vin_nom"] + src = _sources(circuit, supply, bias, exclude=("VIN1", "VOUT1")) + return f"""{_inst(circuit, name)} +.include {include} +{src} +{bias_block(pdk, circuit, case.sizing, bias)} +VIN1 VIN1 0 dc {vin:g} ac 1 +RL VOUT1 0 {rl:g} +CL VOUT1 0 {cl:g} +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +print vout0 idd +dc VIN1 0 {vdd} {vdd/400:g} +let gain_dc = deriv(v(VOUT1)) +meas dc gain_at_nom find gain_dc at={vin:g} +meas dc vout_at_nom find v(VOUT1) at={vin:g} +let okg = gain_dc - 0.5 +meas dc vin_lo find v(VIN1) when okg=0 cross=1 +meas dc vin_hi find v(VIN1) when okg=0 cross=last +ac dec 20 1k 10G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=1k +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end +""" + + +def tb_buffer_ab(circuit, name, include, case, pdk): + """Class-AB output stage test (inverting CS driver + complementary followers). + Load: RL and CL returned to an ideal mid-supply source (AC-coupled-load convention; returning RL to VSS would force + a DC load current through one follower). A disclosed bounded DC servo sets V_out,dc = target; the servo can be + frozen (KSW=1) at the input level it found, which gives an open-loop DC transfer around the operating point. + Measured: vout0/vin0 (servo convergence), iq (DUT supply current at the operating point, load current ~0), + gain_lf and f3db (open-loop small signal), out_swing (width of the V_out range over which the incremental gain stays + >= 50 % of its value at the operating point, open loop with the servo frozen), thd_pct at a fixed output amplitude.""" + supply, bias, load = case.supply, case.bias, case.load + vdd = supply["VDD"]; rl = load.get("RL", 20e3); cl = load.get("CL", 5e-12); vt = load.get("vout_target", vdd / 2) + vcen = load.get("vin_center", vdd / 3); slope = load.get("servo_slope", 200.0); vout_amp = load.get("vout_amp", 0.1) + src = _sources(circuit, supply, bias, exclude=("VIN1", "VOUT1")) + return f"""{_inst(circuit, name)} +.include {include} +{src} +{bias_block(pdk, circuit, case.sizing, bias)} +* DC servo (disclosed test auxiliary): VINT -> input DC level that makes V_out = VT; frozen at VHOLD when KSW = 1 +VT VT 0 {vt:g} +VMID VMID 0 {vdd / 2:g} +VKSW KSW 0 0 +VHOLD VHOLD 0 0 +BSRV VSRV 0 V = (1-v(KSW))*({vcen:g} + 0.5*tanh({slope:g}*(v(VOUT1)-v(VT)))) + v(KSW)*v(VHOLD) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EIN VIN1 VINT VAC 0 1 +VAC VAC 0 dc 0 ac 1 sin(0 1m 1meg) +RL VOUT1 VMID {rl:g} +CL VOUT1 VMID {cl:g} +{load.get('options', '')} +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let iq = -i(VDD) +print vout0 vin0 iq +set vin0_s = "$&vin0" +ac dec 20 10 10G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +set gain_s = "$&gain_lf" +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +* open-loop DC transfer around the operating point (servo frozen at the input level it found) +alter @VHOLD[dc] = $vin0_s +alter @VKSW[dc] = 1 +dc VAC -0.4 0.4 0.001 +let gin = abs(deriv(v(VOUT1))) +meas dc gmid find gin at=0 +let gn = gin/gmid +meas dc vo_a find v(VOUT1) when gn=0.5 cross=1 +meas dc vo_b find v(VOUT1) when gn=0.5 cross=last +let out_swing = abs(vo_b - vo_a) +print out_swing +* distortion at a fixed OUTPUT amplitude of {vout_amp:g} V (servo frozen, input amplitude = amplitude / |gain|) +alter @VKSW[dc] = 0 +let a_lin = 10^($gain_s/20) +let vamp2 = {vout_amp:g}/a_lin +if vamp2 > 0.3 + let vamp2 = 0.3 +end +print vamp2 +alter @VAC[sin] = [ 0 $&vamp2 1meg ] +tran 2n 6u 3u +fourier 1meg v(VOUT1) +quit +.endc +.end +""" + + +# ---------------------------------------------------------------- single-ended amplifiers with DC servo +def tb_single(circuit, name, include, case, pdk): + supply, bias, load = case.supply, case.bias, case.load + vdd = supply["VDD"]; cl = load.get("CL", 100e-15) + src = _sources(circuit, supply, bias, exclude=("VIN1", "VOUT1")) + servo = load.get("servo", True) + if servo: + inp = f"""* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1""" + else: + inp = f"VIN1 VIN1 0 dc {load['vin_nom']:g} ac 1" + return f"""{_inst(circuit, name)} +.include {include} +{src} +{bias_block(pdk, circuit, case.sizing, bias)} +{inp} +CL VOUT1 0 {cl:g} +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end +""" + + +# ---------------------------------------------------------------- differential +def tb_diff_r(circuit, name, include, case, pdk): + supply, bias, load = case.supply, case.bias, case.load + vdd = supply["VDD"]; cl = load.get("CL", 100e-15); vcm = load["vcm"] + src = _sources(circuit, supply, bias, exclude=("VIN1", "VIN2", "VOUT1", "VOUT2")) + return f"""{_inst(circuit, name)} +.include {include} +{src} +{bias_block(pdk, circuit, case.sizing, bias)} +VCM VCM 0 {vcm:g} +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 {cl:g} +CL2 VOUT2 0 {cl:g} +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end +""" + + +def tb_diff_cs(circuit, name, include, case, pdk): + """Diff pair with PMOS current-source loads: output CM set by a disclosed ideal CMFB on VB1 (PMOS gate bias).""" + supply, bias, load = case.supply, case.bias, case.load + vdd = supply["VDD"]; cl = load.get("CL", 100e-15); vcm = load["vcm"]; vocm = load.get("vocm", vdd / 2); gcm = load.get("cmfb_gain", 20.0) + src = _sources(circuit, supply, bias, exclude=("VIN1", "VIN2", "VOUT1", "VOUT2", "VB1")) + # replica for VB1 provides the nominal; the CMFB adds a correction + b2 = dict(bias); b2["VB1n"] = b2.pop("VB1") + return f"""{_inst(circuit, name)} +.include {include} +{src} +{bias_block(pdk, circuit, case.sizing, b2)} +VCM VCM 0 {vcm:g} +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 {cl:g} +CL2 VOUT2 0 {cl:g} +* ideal CMFB (disclosed): PMOS load gate = replica bias + Gcm*(Vocm - Vocm,target) +BCMFB VB1 0 V = v(VB1n) + {gcm:g}*((v(VOUT1)+v(VOUT2))/2 - {vocm:g}) +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end +""" + + +# ---------------------------------------------------------------- OTAs (single-ended output) with DC servo +def _vcm_lines(pdk, circuit, case): + vcm = case.load["vcm"] + if isinstance(vcm, dict): + return bias_block(pdk, circuit, case.sizing, {}, extra_nodes={"VCM": vcm}) + return f"VCM VCM 0 {vcm:g}" + + +def tb_ota(circuit, name, include, case, pdk): + """Single-ended-output OTA: non-inverting input at VCM (+AC drive), inverting input DC level set by a disclosed + high-gain servo so that V_out,dc = vout_target (VDD/2 by default); AC gain, UGF, phase margin, bandwidth.""" + supply, bias, load = case.supply, case.bias, case.load + vdd = supply["VDD"]; cl = load.get("CL", 1e-12); vt = load.get("vout_target", vdd / 2) + inv = load.get("inv_input", "VIN2"); noninv = "VIN1" if inv == "VIN2" else "VIN2" + src = _sources(circuit, supply, bias, exclude=("VIN1", "VIN2", "VOUT1")) + return f"""{_inst(circuit, name)} +.include {include} +{src} +{bias_block(pdk, circuit, case.sizing, bias)} +{_vcm_lines(pdk, circuit, case)} +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 {vt:g} +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV {inv} VCM VINT 0 1 +EIN {noninv} VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 {cl:g} +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v({inv}) - v({noninv}) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end +""" + + +def tb_twostage(circuit, name, include, case, pdk): + return tb_ota(circuit, name, include, case, pdk) + + +def tb_ota_fd(circuit, name, include, case, pdk): + supply, bias, load = case.supply, case.bias, case.load + vdd = supply["VDD"]; cl = load.get("CL", 500e-15); vocm = load.get("vocm", vdd / 2); gcm = load.get("cmfb_gain", 20.0) + src = _sources(circuit, supply, bias, exclude=("VIN1", "VIN2", "VOUT1", "VOUT2", "VB4")) + b2 = dict(bias); b2["VB4n"] = b2.pop("VB4") + return f"""{_inst(circuit, name)} +.include {include} +{src} +{bias_block(pdk, circuit, case.sizing, b2)} +{_vcm_lines(pdk, circuit, case)} +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 {cl:g} +CL2 VOUT2 0 {cl:g} +BCMFB VB4 0 V = v(VB4n) + {gcm:g}*((v(VOUT1)+v(VOUT2))/2 - {vocm:g}) +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +meas ac ugf when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end +""" + + +GEN = {"mirror": tb_mirror, "follower": tb_follower, "buffer_ab": tb_buffer_ab, "single": tb_single, "diff_r": tb_diff_r, "diff_cs": tb_diff_cs, + "ota": tb_ota, "ota_fd": tb_ota_fd, "twostage": tb_twostage} + + +def make_testbench(circuit, dut_name, include_path, case, pdk): + return GEN[CATEGORY[circuit.circuit_id]](circuit, dut_name, include_path, case, pdk) + + +def derived(meas: dict) -> dict: + """Derived metrics: phase margin from ph_lf/ph_ugf (inverting path has 180 deg at DC).""" + out = dict(meas) + if "vout_test" in meas and "rout_t" in meas: + out["rout_nom"] = meas["rout_t"] + if "ph_ugf" in meas and "ph_lf" in meas: + out["pm"] = 180.0 - abs(meas["ph_lf"] - meas["ph_ugf"]) + if "dev_at_vdd" in meas: + out["ok_at_vdd"] = 1.0 if meas["dev_at_vdd"] <= 0.05 else 0.0 + return out + + +def check_specs(meas: dict, specs: dict) -> dict: + details = {}; ok = True + for m, sp in specs.items(): + if m.startswith("_") or not isinstance(sp, dict): continue + v = meas.get(m.lower()) + d = {"value": v, "spec": sp} + if v is None or (isinstance(v, float) and (math.isnan(v) or math.isinf(v))): + d["ok"] = False; d["why"] = "missing or NaN" + else: + good = True + if sp.get("min") is not None and v < sp["min"]: good = False + if sp.get("max") is not None and v > sp["max"]: good = False + if sp.get("abs_max") is not None and abs(v) > sp["abs_max"]: good = False + d["ok"] = good + ok = ok and d["ok"]; details[m] = d + return {"ok": ok, "details": details, "status": "passed" if ok else "spec_failed"} diff --git a/benchmarks/textbook_sharing/textbook_sharing/verify/__init__.py b/benchmarks/textbook_sharing/textbook_sharing/verify/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/benchmarks/textbook_sharing/textbook_sharing/verify/drc.py b/benchmarks/textbook_sharing/textbook_sharing/verify/drc.py new file mode 100644 index 00000000..3a040b9a --- /dev/null +++ b/benchmarks/textbook_sharing/textbook_sharing/verify/drc.py @@ -0,0 +1,81 @@ +"""DRC with the PDK-shipped official KLayout decks (primary) and magic (secondary). + +Waivers (identical for every track and mode, declared here): + ihp130: chip-level density / filler rules of the maximal deck (AFil.*, GFil.*, M[1-5]Fil.*, M[1-5].j/k, TM[12].c/d) + are not meaningful for a DUT of a few hundred um^2 and are reported but not counted. + gf180: none. sky130: none. +""" +from __future__ import annotations +import os, re, xml.etree.ElementTree as ET +from pathlib import Path +from .lvs import run, sha, MAGICRC + +PDK_ROOT = os.environ.get("PDK_ROOT", "/foss/pdks") +DECK = {"sky130": f"{PDK_ROOT}/sky130A/libs.tech/klayout/drc/sky130A.lydrc", + "gf180": f"{PDK_ROOT}/gf180mcuD/libs.tech/klayout/tech/drc/run_drc.py", + "ihp130": f"{PDK_ROOT}/ihp-sg13g2/libs.tech/klayout/tech/drc/sg13g2_maximal.lydrc"} +WAIVED = {"ihp130": re.compile(r"^'?(AFil\.|GFil\.|M[1-5]Fil\.|M[1-5]\.j/k|TM[12]\.c/d)"), "sky130": None, "gf180": None} +DRC_VERSION = "drc-v1 (official decks; ihp density waivers)" + + +def parse_lyrdb(path): + cats = {}; items = [] + try: + root = ET.parse(path).getroot() + except Exception as e: + return {"error": repr(e), "categories": {}, "items": []} + for it in root.iter("item"): + c = it.find("category").text.strip("'") + vals = [v.text for v in it.iter("value")] + cats[c] = cats.get(c, 0) + 1 + if len(items) < 200: items.append({"category": c, "value": vals[0] if vals else None}) + return {"categories": cats, "items": items} + + +def drc_klayout(pdk, gds, out_dir, top=None): + out_dir = Path(out_dir); out_dir.mkdir(parents=True, exist_ok=True) + gds = str(Path(gds).resolve()); rpt = out_dir / "klayout_drc.lyrdb"; log = out_dir / "klayout_drc.log" + if pdk == "sky130": + rc = run(f"klayout -b -r {DECK[pdk]} -rd input={gds} -rd report={rpt}", str(out_dir), log) + elif pdk == "ihp130": + rc = run(f"klayout -b -r {DECK[pdk]} -rd in_gds={gds} -rd report_file={rpt}" + (f" -rd cell={top}" if top else ""), str(out_dir), log) + else: + rd = out_dir / "gf180_run" + rc = run(f"python {DECK[pdk]} --path={gds} --variant=D --run_dir={rd} --thr=4" + (f" --topcell={top}" if top else ""), str(out_dir), log) + src = next(rd.glob("*.lyrdb"), None) if rd.exists() else None + if src: rpt.write_bytes(src.read_bytes()) + parsed = parse_lyrdb(rpt) if rpt.exists() else {"error": "no report", "categories": {}, "items": []} + waived = {}; counted = {} + for c, n in parsed["categories"].items(): + if WAIVED[pdk] and WAIVED[pdk].match(c): waived[c] = n + else: counted[c] = n + total = sum(counted.values()) + return {"tool": "klayout", "deck": DECK[pdk], "deck_sha256": sha(DECK[pdk]), "version": DRC_VERSION, "rc": rc, "report": str(rpt) if rpt.exists() else None, + "log": str(log), "violations": total, "categories": counted, "waived_categories": waived, "items": parsed["items"][:50], + "status": "passed" if (rpt.exists() and total == 0 and "error" not in parsed) else "drc_failed"} + + +def drc_magic(pdk, gds, top, out_dir): + out_dir = Path(out_dir); out_dir.mkdir(parents=True, exist_ok=True) + tcl = out_dir / "magic_drc.tcl"; rpt = out_dir / "magic_drc.rpt" + tcl.write_text(f"""gds flatglob *\\$\\$* +gds read {gds} +load {top} +select top cell +drc euclidean on +drc style drc(full) +drc check +set fo [open {rpt} w] +foreach {{why coords}} [drc listall why] {{ puts $fo "$why"; foreach c $coords {{ puts $fo " $c" }} }} +close $fo +quit -noprompt +""") + rc = run(f"magic -rcfile {MAGICRC[pdk]} -noconsole -dnull {tcl}", str(out_dir), out_dir / "magic_drc.log") + txt = rpt.read_text() if rpt.exists() else "" + rules = {} + cur = None + for l in txt.splitlines(): + if l.startswith(" "): rules[cur] = rules.get(cur, 0) + 1 + elif l.strip(): cur = l.strip() + return {"tool": "magic", "rc": rc, "report": str(rpt) if rpt.exists() else None, "violations": sum(rules.values()), "rules": rules, + "status": "passed" if rpt.exists() and not rules else ("drc_failed" if rpt.exists() else "not_run")} diff --git a/benchmarks/textbook_sharing/textbook_sharing/verify/lvs.py b/benchmarks/textbook_sharing/textbook_sharing/verify/lvs.py new file mode 100644 index 00000000..9811b456 --- /dev/null +++ b/benchmarks/textbook_sharing/textbook_sharing/verify/lvs.py @@ -0,0 +1,149 @@ +"""Independent LVS runners (inside the container). + - sky130, ihp130: magic extraction (ext2spice lvs) + netgen with the PDK setup file + - gf180: official gf180mcu KLayout LVS deck (upstream notes magic/netgen mis-extracts the gf180 substrate) +Each runner returns a dict with status, counts and report paths; nothing is swallowed.""" +from __future__ import annotations +import os, re, subprocess, hashlib +from pathlib import Path + +PDK_ROOT = os.environ.get("PDK_ROOT", "/foss/pdks") +MAGICRC = {"sky130": f"{PDK_ROOT}/sky130A/libs.tech/magic/sky130A.magicrc", "gf180": f"{PDK_ROOT}/gf180mcuD/libs.tech/magic/gf180mcuD.magicrc", + "ihp130": f"{PDK_ROOT}/ihp-sg13g2/libs.tech/magic/ihp-sg13g2.magicrc"} +NETGEN_SETUP = {"sky130": f"{PDK_ROOT}/sky130A/libs.tech/netgen/sky130A_setup.tcl", "gf180": f"{PDK_ROOT}/gf180mcuD/libs.tech/netgen/gf180mcuD_setup.tcl", + "ihp130": f"{PDK_ROOT}/ihp-sg13g2/libs.tech/netgen/ihp-sg13g2_setup.tcl"} + + +def sha(p): + return hashlib.sha256(Path(p).read_bytes()).hexdigest() + + +def run(cmd, cwd, log, timeout=1800, env=None): + with open(log, "w") as f: + f.write("$ " + (cmd if isinstance(cmd, str) else " ".join(cmd)) + "\n") + f.flush() + try: + r = subprocess.run(cmd, shell=isinstance(cmd, str), cwd=cwd, stdout=f, stderr=subprocess.STDOUT, timeout=timeout, env=env, stdin=subprocess.DEVNULL) + return r.returncode + except subprocess.TimeoutExpired: + f.write("\nTIMEOUT\n"); return -999 + + +def magic_extract(pdk, gds, top, out_dir, mode="lvs", timeout=None, extresist_tolerance=10, with_resist=True): + """mode 'lvs': device netlist only. mode 'pex': parasitic C (and R via extresist).""" + out_dir = Path(out_dir); out_dir.mkdir(parents=True, exist_ok=True) + for stale in set(list(out_dir.glob('*.ext')) + list(out_dir.glob('*.spice')) + list(out_dir.glob('*.sim')) + list(out_dir.glob('*.nodes'))): + stale.unlink(missing_ok=True) + spice = out_dir / f"{top}_{mode}.spice" + extra = "" + if mode == "pex": + if with_resist: + extra = f"extract do local\nextract all\next2sim labels on\next2sim\nextresist tolerance {extresist_tolerance}\nextresist\next2spice lvs\next2spice cthresh 0\next2spice rthresh 0\next2spice extresist on\n" + else: + extra = "extract do local\nextract all\next2spice lvs\next2spice cthresh 0\next2spice rthresh 0\n" + else: + extra = "extract all\next2spice lvs\n" + # on gf180mcuD, 'port makeall' followed by extresist never terminates; top-level pins are taken from the labels + # there instead (checked: identical pin list) + portcmd = "" if (pdk == "gf180" and mode == "pex" and with_resist) else "port makeall" + tcl = f"""drc off +gds flatglob *\\$\\$* +gds read {gds} +load {top} +select top cell +{portcmd} +{extra}ext2spice subcircuit top on +ext2spice -o {spice} +quit -noprompt +""" + (out_dir / f"magic_{mode}.tcl").write_text(tcl) + to = timeout or (900 if mode == "pex" else 300) + rc = run(f"magic -rcfile {MAGICRC[pdk]} -noconsole -dnull {out_dir}/magic_{mode}.tcl", str(out_dir), out_dir / f"magic_{mode}.log", timeout=to) + ok = rc == 0 and spice.exists() and spice.stat().st_size > 0 + return {"tool": "magic", "rc": rc, "ok": ok, "timeout": rc == -999, "spice": str(spice) if ok else None, "log": str(out_dir / f"magic_{mode}.log"), "with_resist": with_resist if mode == "pex" else None, "extresist_tolerance": extresist_tolerance if (mode == "pex" and with_resist) else None} + + +def parse_netgen(report_text: str) -> dict: + out = {"match": False, "unmatched_nets": 0, "unmatched_instances": 0, "pin_mismatch": False, "property_errors": 0} + if "Circuits match uniquely" in report_text or "Netlists match uniquely" in report_text: + out["match"] = True + if "Netlists do not match" in report_text or "do not match" in report_text: + out["match"] = False + out["unmatched_nets"] = len(re.findall(r"\(no matching net\)", report_text)) + out["unmatched_instances"] = len(re.findall(r"\(no matching instance\)", report_text)) + out["pin_mismatch"] = "failed pin matching" in report_text + out["property_errors"] = len(re.findall(r"property .* mismatch|Property errors were found", report_text, re.I)) + m = re.search(r"Final result: (.*)", report_text) + out["final"] = m.group(1).strip() if m else None + if out["final"] and "match" in out["final"].lower() and "not" not in out["final"].lower() and "fail" not in out["final"].lower(): + out["match"] = out["match"] or ("uniquely" in out["final"].lower() or "match" in out["final"].lower()) + if out["pin_mismatch"] or out["unmatched_nets"] or out["unmatched_instances"]: + out["match"] = False + return out + + +def lvs_magic_netgen(pdk, gds, top, schematic, out_dir): + out_dir = Path(out_dir); out_dir.mkdir(parents=True, exist_ok=True) + ex = magic_extract(pdk, gds, top, out_dir, "lvs") + res = {"method": "magic+netgen", "pdk": pdk, "gds_sha256": sha(gds), "schematic_sha256": sha(schematic), "extract": ex} + if not ex["ok"]: + res.update({"status": "lvs_failed", "reason": "extraction failed"}); return res + rpt = out_dir / "netgen_lvs.rpt" + rc = run(f'netgen -batch lvs "{ex["spice"]} {top}" "{schematic} {top}" {NETGEN_SETUP[pdk]} {rpt}', str(out_dir), out_dir / "netgen.log") + txt = rpt.read_text() if rpt.exists() else "" + p = parse_netgen(txt) + res.update({"netgen_rc": rc, "report": str(rpt), "parsed": p, "status": "passed" if (rc == 0 and p["match"]) else "lvs_failed"}) + return res + + +def lvs_klayout_gf180(gds, top, schematic, out_dir, sub_net="VSS"): + # no --combine: KLayout's device combining merges series resistors through a net that has no other device, + # which deletes a port net such as VDD on a resistor-load pair (observed on C16/C17 gf180); fingers are per-finger on both sides. + out_dir = Path(out_dir); out_dir.mkdir(parents=True, exist_ok=True) + deck = f"{PDK_ROOT}/gf180mcuD/libs.tech/klayout/tech/lvs/run_lvs.py" + run_dir = out_dir / "klayout_lvs" + rc = run(f"python {deck} --layout={gds} --netlist={schematic} --variant=D --run_dir={run_dir} --thr=4 --topcell={top} --schematic_simplify --lvs_sub={sub_net}", str(out_dir), out_dir / "klayout_lvs.log") + log = (out_dir / "klayout_lvs.log").read_text(errors="replace") + logs = list(run_dir.glob("lvs_run_*.log")) if run_dir.exists() else [] + ltxt = logs[-1].read_text(errors="replace") if logs else "" + match = ("Congratulations! Netlists matched" in log + ltxt) or ("Netlists matched" in log + ltxt) or ("Netlists match" in log + ltxt) + nomatch = "Netlists don't match" in log + ltxt or "do not match" in log + ltxt + # authoritative verdict: the cross-reference stored in the LVS database (requires every circuit pair to be 'Match') + lvsdb = next(run_dir.glob("*.lvsdb"), None) if run_dir.exists() else None + xref = lvsdb_verdict(str(lvsdb)) if lvsdb else {"ok": False, "error": "no lvsdb"} + match = bool(xref.get("ok")); nomatch = not match + res = {"method": "klayout_gf180mcu_lvs", "pdk": "gf180", "gds_sha256": sha(gds), "schematic_sha256": sha(schematic), "rc": rc, "log": str(out_dir / "klayout_lvs.log"), + "deck_log": str(logs[-1]) if logs else None, "lvsdb": str(next(run_dir.glob("*.lvsdb"), "")) if run_dir.exists() else None, + "status": "passed" if (rc == 0 and match and not nomatch) else "lvs_failed", "matched": match, "xref": xref} + return res + + +def lvs(pdk, gds, top, schematic, out_dir, sub_net="VSS"): + if pdk == "gf180": + return lvs_klayout_gf180(gds, top, schematic, out_dir, sub_net) + return lvs_magic_netgen(pdk, gds, top, schematic, out_dir) + + +def lvsdb_verdict(path: str) -> dict: + """Read a KLayout LVS database and return {ok, pairs:[{layout, ref, status}], mismatched_nets, mismatched_devices}.""" + try: + import klayout.db as kdb + l = kdb.LayoutVsSchematic(); l.read(path) + x = l.xref() + if x is None: + return {"ok": False, "error": "no xref in lvsdb"} + pairs = []; bad_nets = []; bad_devs = []; ok = True + for cp in x.each_circuit_pair(): + st = str(cp.status()); a = cp.first(); b = cp.second() + pairs.append({"layout": a.name if a else None, "ref": b.name if b else None, "status": st}) + if st != "Match": ok = False + for np_ in x.each_net_pair(cp): + if str(np_.status()) not in ("Match",): + f, g = np_.first(), np_.second() + bad_nets.append({"layout": f.expanded_name() if f else None, "ref": g.expanded_name() if g else None, "status": str(np_.status())}); ok = False + for dp in x.each_device_pair(cp): + if str(dp.status()) not in ("Match",): + f, g = dp.first(), dp.second() + bad_devs.append({"layout": f.expanded_name() if f else None, "ref": g.expanded_name() if g else None, "status": str(dp.status())}); ok = False + return {"ok": ok, "pairs": pairs, "mismatched_nets": bad_nets[:50], "mismatched_devices": bad_devs[:50]} + except Exception as e: + return {"ok": False, "error": repr(e)} diff --git a/benchmarks/textbook_sharing/textbook_sharing/verify/pex_sim.py b/benchmarks/textbook_sharing/textbook_sharing/verify/pex_sim.py new file mode 100644 index 00000000..fc467289 --- /dev/null +++ b/benchmarks/textbook_sharing/textbook_sharing/verify/pex_sim.py @@ -0,0 +1,100 @@ +"""PEX (magic) and ngspice simulation runners. + +PEX: magic 'extract' with parasitic capacitance (cthresh 0) and resistance via extresist (rthresh 0), + writes _pex.spice (subckt with the DUT ports as pins, port names from the layout labels). +SIM: a testbench template is rendered with the DUT include file and run with ngspice -b; measurements are + written by the testbench with wrdata/print into files that the measurement parser reads. +""" +from __future__ import annotations +import os, re +from pathlib import Path +from .lvs import magic_extract, run, sha + +PDK_ROOT = os.environ.get("PDK_ROOT", "/foss/pdks") +MODEL_INCLUDE = { + "sky130": ".lib {root}/sky130A/libs.tech/ngspice/sky130.lib.spice {corner}", + "gf180": ".include {root}/gf180mcuD/libs.tech/ngspice/design.ngspice\n.lib {root}/gf180mcuD/libs.tech/ngspice/sm141064.ngspice {corner}\n.lib {root}/gf180mcuD/libs.tech/ngspice/sm141064.ngspice res_typical\n.lib {root}/gf180mcuD/libs.tech/ngspice/sm141064.ngspice mimcap_typical\n.lib {root}/gf180mcuD/libs.tech/ngspice/sm141064.ngspice cap_mim", # mimcap_typical only sets corner params and includes sm141064_mim.ngspice by a cwd-relative path (which also fails to parse in ngspice 44); the legacy cap_mim section defines cap_mim_2f0fF + "ihp130": ".lib {root}/ihp-sg13g2/libs.tech/ngspice/models/cornerMOSlv.lib {corner}\n.lib {root}/ihp-sg13g2/libs.tech/ngspice/models/cornerRES.lib res_typ\n.lib {root}/ihp-sg13g2/libs.tech/ngspice/models/cornerCAP.lib cap_typ", +} +CORNER = {"sky130": {"tt": "tt", "ss": "ss", "ff": "ff"}, "gf180": {"tt": "typical", "ss": "ss", "ff": "ff"}, "ihp130": {"tt": "mos_tt", "ss": "mos_ss", "ff": "mos_ff"}} +OSDI = {"ihp130": f"{PDK_ROOT}/ihp-sg13g2/libs.tech/ngspice/osdi/psp103_nqs.osdi"} + + +def model_header(pdk: str, corner: str = "tt") -> str: + c = CORNER[pdk][corner] + return MODEL_INCLUDE[pdk].format(root=PDK_ROOT, corner=c) + "\n" + + +PEX_POLICY = { + "sky130": {"with_resist": True, "extresist_tolerance": 10, "note": "magic extract + extresist (R and C)"}, + "ihp130": {"with_resist": True, "extresist_tolerance": 10, "note": "magic extract + extresist (R and C)"}, + "gf180": {"with_resist": True, "extresist_tolerance": 10, "note": "magic extract + extresist (R and C); top-level pins from labels, without 'port makeall' (with it, extresist does not terminate on gf180mcuD)"}, +} + + +def pex(pdk, gds, top, out_dir): + out_dir = Path(out_dir); out_dir.mkdir(parents=True, exist_ok=True) + pol = PEX_POLICY[pdk] + ex = magic_extract(pdk, gds, top, out_dir, "pex", with_resist=pol["with_resist"], extresist_tolerance=pol["extresist_tolerance"] or 10) + res = {"method": "magic_extresist" if pol["with_resist"] else "magic_cap_only", "policy": pol, "pdk": pdk, "gds_sha256": sha(gds), "extract": ex} + if not ex["ok"]: + res["status"] = "pex_failed"; return res + txt = Path(ex["spice"]).read_text() + m = re.search(r"^\.subckt\s+(\S+)\s+(.*)$", txt, re.M | re.I) + ports = m.group(2).split() if m else [] + # Floating conductors (magic marks their capacitors with '**FLOATING'; e.g. the poly body of an IHP rppd resistor + # that magic's tech file extracts as a separate 'pres' node) have no DC path and make the ngspice matrix singular. + # They are kept (their parasitic capacitances stay in the netlist) and tied to the DUT ground port by a 1 TOhm + # shunt, so the simulation remains solvable without hiding the extraction. The nodes are recorded. + floating = [] + for line in txt.splitlines(): + if "**FLOATING" in line and line[:1].upper() == "C": + toks = line.split() + for n in toks[1:3]: + if n not in ports and n not in floating: floating.append(n) + if floating: + gnd = "VSS" if "VSS" in ports else (ports[-1] if ports else "0") + shunts = "".join(f"Rflt{i} {n} {gnd} 1e12 $ floating-conductor shunt\n" for i, n in enumerate(floating)) + txt = re.sub(r"^\.ends", shunts + ".ends", txt, count=1, flags=re.M | re.I) + Path(ex["spice"]).write_text(txt) + nR = len(re.findall(r"^R\S+\s", txt, re.M)); nC = len(re.findall(r"^C\S+\s", txt, re.M)); nM = len(re.findall(r"^[XM]\S+\s", txt, re.M)) + res.update({"status": "passed", "spice": ex["spice"], "spice_sha256": sha(ex["spice"]), "n_res": nR, "n_cap": nC, "n_devices": nM, "ports": ports, + "floating_nodes": floating, "floating_shunt_ohm": 1e12 if floating else None}) + return res + + +def simulate(pdk, testbench_text, out_dir, name="tb", corner="tt", timeout=900, extra_env=None): + """testbench_text must be a complete ngspice deck except the model header (prepended here) and may use .control.""" + out_dir = Path(out_dir); out_dir.mkdir(parents=True, exist_ok=True) + deck = out_dir / f"{name}.spice" + hdr = f"* {name} ({pdk}, corner {corner})\n" + model_header(pdk, corner) + if pdk in OSDI: + hdr += f".control\npre_osdi {OSDI[pdk]}\n.endc\n" + deck.write_text(hdr + testbench_text) + log = out_dir / f"{name}.log" + rc = run(f"ngspice -b {deck} -o {out_dir}/{name}.out", str(out_dir), log, timeout=timeout) + outtxt = (out_dir / f"{name}.out").read_text(errors="replace") if (out_dir / f"{name}.out").exists() else "" + logtxt = log.read_text(errors="replace") + errors = [l for l in (outtxt + logtxt).splitlines() if re.search(r"^Error|error:|singular matrix|timestep too small|no convergence|doAnalyses: ", l, re.I) + and not re.search(r"^Error: measure\s", l)] # a .meas that finds no crossing yields a missing measure -> spec check, not a simulator failure + measure_errors = [l for l in (outtxt + logtxt).splitlines() if re.search(r"^Error: measure\s", l)] + return {"rc": rc, "deck": str(deck), "deck_sha256": sha(deck), "out": str(out_dir / f"{name}.out"), "log": str(log), "errors": errors[:20], "measure_errors": measure_errors[:20], + "status": "passed" if (rc == 0 and not errors) else ("simulation_failed" if rc != -999 else "simulation_timeout")} + + +def read_wrdata(path): + """Parse an ngspice wrdata file: columns alternate x,y per vector -> dict of lists (first x kept).""" + rows = [l.split() for l in Path(path).read_text().splitlines() if l.strip() and not l.startswith("*")] + cols = list(zip(*[[float(v) for v in r] for r in rows])) if rows else [] + return cols + + +def read_measures(out_text: str) -> dict: + """Collect 'name = value' lines printed by .meas / print in ngspice batch output.""" + res = {} + for m in re.finditer(r"^\s*([a-zA-Z_][\w]*)\s*=\s*([-+]?[\d.]+(?:e[-+]?\d+)?)", out_text, re.M): + try: res[m.group(1).lower()] = float(m.group(2)) + except ValueError: pass + m = re.search(r"THD:\s*([-+]?[\d.]+(?:e[-+]?\d+)?)\s*%", out_text) + if m: res["thd_pct"] = float(m.group(1)) + return res diff --git a/benchmarks/textbook_sharing/textbook_sharing/verify/physical.py b/benchmarks/textbook_sharing/textbook_sharing/verify/physical.py new file mode 100644 index 00000000..d2b84182 --- /dev/null +++ b/benchmarks/textbook_sharing/textbook_sharing/verify/physical.py @@ -0,0 +1,69 @@ +"""First-tier automated geometry/semantic checks on a written GDS (independent of the builder).""" +from __future__ import annotations +import hashlib +from pathlib import Path +import klayout.db as kdb + +LAYERS = { + "sky130": {"active": (65, 20), "poly": (66, 20), "cont": (66, 44), "met1": (67, 20), "via1": (67, 44), "met2": (68, 20), "via2": (68, 44), "met3": (69, 20), "nwell": (64, 20), "nimp": (93, 44), "pimp": (94, 20), "label": (69, 5), "pin": (69, 16)}, + "gf180": {"active": (22, 0), "poly": (30, 0), "cont": (33, 0), "met1": (34, 0), "via1": (35, 0), "met2": (36, 0), "via2": (38, 0), "met3": (42, 0), "nwell": (21, 0), "nimp": (32, 0), "pimp": (31, 0), "label": (42, 10), "pin": None}, + "ihp130": {"active": (1, 0), "poly": (5, 0), "cont": (6, 0), "met1": (8, 0), "via1": (19, 0), "met2": (10, 0), "via2": (29, 0), "met3": (30, 0), "nwell": (31, 0), "nimp": (7, 0), "pimp": (14, 0), "label": (30, 25), "pin": (30, 2)}, +} +EXPECTED_DBU = {"sky130": 0.005, "gf180": 0.005, "ihp130": 0.001} + + +def physical_checks(pdk, gds, top, expected_ports, expected_fingers=None, expected_devices=None): + ly = kdb.Layout(); ly.read(str(gds)) + cell = ly.cell(top) if ly.cell(top) else ly.top_cell() + dbu = ly.dbu; L = LAYERS[pdk] + def reg(key): + if L.get(key) is None: return kdb.Region() + return kdb.Region(cell.begin_shapes_rec(ly.layer(kdb.LayerInfo(*L[key])))).merged() + out = {"gds_sha256": hashlib.sha256(Path(gds).read_bytes()).hexdigest(), "top": cell.name, "dbu": dbu, "checks": {}, "findings": []} + bb = cell.dbbox() + out["bbox_um"] = [bb.left, bb.bottom, bb.right, bb.top]; out["area_um2"] = round(bb.area(), 4) + out["checks"]["top_nonempty"] = not bb.empty() + out["checks"]["dbu_ok"] = abs(dbu - 0.001) < 1e-9 or abs(dbu - 0.005) < 1e-9 + layers_present = sorted({(ly.get_info(li).layer, ly.get_info(li).datatype) for li in ly.layer_indexes() if not cell.bbox_per_layer(li).empty()}) + out["layers_present"] = layers_present + active, poly, cont, met1, met2, met3 = reg("active"), reg("poly"), reg("cont"), reg("met1"), reg("met2"), reg("met3") + chan = (poly & active).merged() + out["channel_regions"] = chan.count(); out["active_islands"] = active.count(); out["poly_components"] = poly.count() + if expected_fingers is not None: + out["checks"]["finger_count"] = (chan.count() == expected_fingers) + if chan.count() != expected_fingers: + out["findings"].append(f"channel regions {chan.count()} != expected fingers {expected_fingers} (extra or missing MOS)") + # labels: every expected port must have a text on the label layer sitting on met3 (or met2) metal + texts = {} + for li in ly.layer_indexes(): + info = ly.get_info(li) + for sh in cell.begin_shapes_rec(li): + if sh.shape().is_text(): + t = sh.shape().dtext.transformed(sh.dtrans()) + texts.setdefault(t.string, []).append(((info.layer, info.datatype), t.x, t.y)) + missing = []; off_metal = [] + for p in expected_ports: + if p not in texts: + missing.append(p); continue + on = False + for (lay, x, y) in texts[p]: + for r in (met3, met2, met1): + if any(pg.inside(kdb.Point(int(round(x / dbu)), int(round(y / dbu)))) for pg in r.each()): on = True + if not on: off_metal.append(p) + out["checks"]["ports_labelled"] = not missing; out["checks"]["labels_on_metal"] = not off_metal + if missing: out["findings"].append(f"ports without label: {missing}") + if off_metal: out["findings"].append(f"labels not on metal: {off_metal}") + # stray geometry: any shape farther than 2x the bbox diagonal from the centre? (should be none in a flat DUT) + out["checks"]["no_remote_instances"] = True + # floating poly: poly components with no contact and no channel + floating = 0 + for pg in poly.each(): + r = kdb.Region(pg) + if (r & cont).is_empty() and (r & active).is_empty(): floating += 1 + out["floating_poly_components"] = floating + out["checks"]["no_floating_poly"] = floating == 0 + out["metal_area_um2"] = {"met1": round(met1.area() * dbu * dbu, 4), "met2": round(met2.area() * dbu * dbu, 4), "met3": round(met3.area() * dbu * dbu, 4)} + out["contacts"] = {"on_active": (cont & active).count(), "on_poly": (cont & poly).count(), "total": cont.count()} + out["active_area_um2"] = round(active.area() * dbu * dbu, 4); out["active_perimeter_um"] = round(active.perimeter() * dbu, 4) + out["status"] = "passed" if all(out["checks"].values()) else "physical_review_failed" + return out diff --git a/benchmarks/textbook_sharing/textbook_sharing/verify/pipeline.py b/benchmarks/textbook_sharing/textbook_sharing/verify/pipeline.py new file mode 100644 index 00000000..fa473f3c --- /dev/null +++ b/benchmarks/textbook_sharing/textbook_sharing/verify/pipeline.py @@ -0,0 +1,82 @@ +"""Verification pipeline for one layout: DRC -> LVS -> sizing -> PEX -> physical -> render -> review record. + +verify_layout(pdk, gds, top, target_lvs_spice, target_devices, ports, out_dir, ...) returns a result dict with + stages: {drc, drc_magic, lvs, sizing, pex, physical, render} + primary_status: first failing stage in the fixed order, or 'review_pending' / 'passed' + fail_reasons: all failing stages +Simulation/spec stages are added by the case runner (they need the testbench). +""" +from __future__ import annotations +import json, time +from pathlib import Path +from .drc import drc_klayout, drc_magic +from .lvs import lvs, sha +from .sizing import sizing_check +from .pex_sim import pex +from .physical import physical_checks +from .record import render_views, make_record +from ..netlist import PDK_MODELS +from .. import paths + +ORDER = ["build", "drc", "lvs", "constraints", "pex", "simulation", "spec", "physical_review"] + + +def verify_layout(pdk, gds, top, target_lvs_spice, target_devices, ports, out_dir, expected_fingers=None, zoom=None, context=None, + run_magic_drc=True, run_pex=True, sub_net="VSS"): + out_dir = Path(out_dir); out_dir.mkdir(parents=True, exist_ok=True) + t0 = time.time() + res = {"pdk": pdk, "gds": paths.rel(gds), "top": top, "gds_sha256": sha(gds), "target_sha256": sha(target_lvs_spice), "stages": {}, "fail_reasons": [], "timestamps": {"start": time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime())}} + T = res.setdefault("timing_s", {}); _t = [time.time()] + def lap(k): + now = time.time(); T[k] = round(T.get(k, 0.0) + now - _t[0], 2); _t[0] = now + # DRC + d = drc_klayout(pdk, gds, out_dir / "drc", top=top); res["stages"]["drc"] = d; lap("drc") + if d["status"] != "passed": res["fail_reasons"].append("drc_failed") + if run_magic_drc: + res["stages"]["drc_magic"] = drc_magic(pdk, str(Path(gds).resolve()), top, out_dir / "drc_magic"); lap("drc_magic") + # LVS + l = lvs(pdk, str(Path(gds).resolve()), top, str(Path(target_lvs_spice).resolve()), out_dir / "lvs", sub_net=sub_net); res["stages"]["lvs"] = l; lap("lvs") + if l["status"] != "passed": res["fail_reasons"].append("lvs_failed") + # sizing from the extracted netlist (magic lvs spice or klayout .cir) + ex_text = None + if pdk == "gf180": + cir = next((out_dir / "lvs" / "klayout_lvs").glob("*.cir"), None) if (out_dir / "lvs" / "klayout_lvs").exists() else None + ex_text = cir.read_text() if cir else None + else: + sp = l.get("extract", {}).get("spice") + ex_text = Path(sp).read_text() if sp and Path(sp).exists() else None + if ex_text: + s = sizing_check(target_devices, ex_text, {k: PDK_MODELS[pdk][k] for k in ("nfet", "pfet")}, ports) + else: + s = {"status": "constraints_failed", "error": "no extracted netlist"} + res["stages"]["constraints"] = s; lap("sizing_check") + if s["status"] != "passed": res["fail_reasons"].append("constraints_failed") + # PEX + if run_pex: + p = pex(pdk, str(Path(gds).resolve()), top, out_dir / "pex"); res["stages"]["pex"] = p; lap("pex") + if p["status"] != "passed": res["fail_reasons"].append("pex_failed") + # physical first tier + try: + ph = physical_checks(pdk, gds, top, ports, expected_fingers=expected_fingers) + except Exception as e: + ph = {"status": "physical_review_failed", "error": repr(e), "checks": {}, "findings": [repr(e)]} + res["stages"]["physical"] = ph; lap("geometry_checks") + if ph["status"] != "passed": res["fail_reasons"].append("physical_review_failed") + # render + review record + (out_dir / "review").mkdir(parents=True, exist_ok=True) + rv = render_views(gds, out_dir / "review" / top, pdk, zoom=zoom, cell=top) + res["stages"]["render"] = {k: v for k, v in rv.items() if k != "legend"}; lap("render") + rec = make_record(gds, pdk, res["target_sha256"], ph, {k: v for k, v in res["stages"].items() if k in ("drc", "drc_magic", "lvs", "constraints", "pex")}, rv, context=context) + (out_dir / "review").mkdir(parents=True, exist_ok=True) + json.dump(rec, open(out_dir / "review" / "review_record.json", "w"), indent=1) + res["review_record"] = paths.rel(out_dir / "review" / "review_record.json"); res["review_id"] = rec["review_id"] + # primary status + prim = None + for st in ORDER: + if st + "_failed" in res["fail_reasons"] or (st == "physical_review" and "physical_review_failed" in res["fail_reasons"]): + prim = st + "_failed"; break + res["primary_status"] = prim or "review_pending" + res["area_um2"] = ph.get("area_um2"); res["bbox_um"] = ph.get("bbox_um") + res["timestamps"]["end"] = time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime()); res["wall_s"] = round(time.time() - t0, 2) + json.dump(res, open(out_dir / "result.json", "w"), indent=1, default=str) + return res diff --git a/benchmarks/textbook_sharing/textbook_sharing/verify/record.py b/benchmarks/textbook_sharing/textbook_sharing/verify/record.py new file mode 100644 index 00000000..46210631 --- /dev/null +++ b/benchmarks/textbook_sharing/textbook_sharing/verify/record.py @@ -0,0 +1,38 @@ +"""Per-GDS physical review records (first tier automated + second tier visual). + +A review record is created for every generated, parsable GDS. The cache key includes the GDS +sha256, the target/constraint hash, the PDK, the layer map version and the reviewer version. +Visual review requires an actual viewer (human or a vision model with a fixed protocol); until a +viewer has recorded observations the record stays 'review_pending' and the case cannot be 'passed'. +""" +from __future__ import annotations +import json, hashlib, time, subprocess, sys +from pathlib import Path +from textbook_sharing import paths + +REVIEWER_VERSION = "review-v1" +LAYERMAP_VERSION = {"sky130": "sky130A.lyp@volare-0fe599b2", "gf180": "gf180mcu.lyp@ciel-f2e289da", "ihp130": "sg13g2.lyp@iic-2025-06"} + + +def review_key(gds_sha, target_sha, pdk): + return hashlib.sha256(f"{gds_sha}|{target_sha}|{pdk}|{LAYERMAP_VERSION[pdk]}|{REVIEWER_VERSION}".encode()).hexdigest()[:20] + + +def render_views(gds, prefix, pdk, zoom=None, cell=None): + tool = Path(__file__).resolve().parents[1] / "review" / "render_gds.py" + cmd = [sys.executable, str(tool), str(gds), str(prefix), pdk] + if zoom: cmd += ["--zoom", ",".join(f"{v:.3f}" for v in zoom)] + if cell: cmd += ["--cell", cell] + r = subprocess.run(cmd, capture_output=True, text=True, timeout=600) + rj = Path(f"{prefix}_render.json") + return json.load(open(rj)) if rj.exists() else {"error": r.stderr[-500:]} + + +def make_record(gds, pdk, target_sha, physical, raw_checks, render_info, zoom_group=None, context=None): + gds_sha = physical["gds_sha256"] + rec = {"review_id": review_key(gds_sha, target_sha, pdk), "created_utc": time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime()), + "gds": paths.rel(gds), "gds_sha256": gds_sha, "target_sha256": target_sha, "pdk": pdk, "layermap_version": LAYERMAP_VERSION[pdk], "reviewer_version": REVIEWER_VERSION, + "view_paths": {k: paths.rel(v["path"]) for k, v in render_info.get("views", {}).items()}, "image_sha256": {k: v["sha256"] for k, v in render_info.get("views", {}).items()}, + "static_checks": {"physical": physical, "raw": raw_checks}, "visual": {"reviewer_type": None, "reviewer_id": None, "observed_findings": [], "issue_locations": [], "verdict": "review_pending"}, + "linked_raw_checks": {k: (v.get("status") if isinstance(v, dict) else v) for k, v in raw_checks.items()}, "context": context or {}, "verdict": "review_pending"} + return rec diff --git a/benchmarks/textbook_sharing/textbook_sharing/verify/sizing.py b/benchmarks/textbook_sharing/textbook_sharing/verify/sizing.py new file mode 100644 index 00000000..09577d26 --- /dev/null +++ b/benchmarks/textbook_sharing/textbook_sharing/verify/sizing.py @@ -0,0 +1,95 @@ +"""Independent sizing check: compare the extracted layout netlist with the logical target. + +For every logical MOS (name, d, g, s, b, w_total, l, model) the extracted devices with the same +(model, connectivity signature) are collected; their widths are summed and compared with w_total, +their lengths must all equal l. This does not rely on LVS tolerance settings. +Extracted netlists come from magic (X-instances, w/l in um) or the gf180 KLayout deck (M-instances, W/L with U suffix). +Net names in the extracted netlist are the layout labels for ports; internal nets are matched through the +port-connected signature (ports only) plus device counts per internal-net class. +""" +from __future__ import annotations +import re +from collections import defaultdict + + +def _num(v): + v = v.strip().lower() + m = re.match(r"([-+]?[\d.]+(?:e[-+]?\d+)?)([a-z]*)", v) + if not m: return None + x = float(m.group(1)); s = m.group(2) + mult = {"u": 1.0, "": 1.0, "n": 1e-3, "m": 1e3, "p": 1e-6}.get(s, 1.0) + return x * mult + + +def parse_mos(text: str, models: set): + devs = [] + for line in text.splitlines(): + t = line.strip() + if not t or t[0] in "*+.": continue + parts = t.split() + if parts[0][0].upper() not in "XM" or len(parts) < 6: continue + # find model token (first token that is a known model, case-insensitive) + idx = None + for i, p in enumerate(parts[1:], 1): + if p.lower() in models: idx = i; break + if idx is None or idx < 5: continue + d, g, s, b = parts[1:5] + params = {} + for p in parts[idx + 1:]: + if "=" in p: + k, v = p.split("=", 1); params[k.lower()] = _num(v) + devs.append({"name": parts[0], "model": parts[idx].lower(), "d": d, "g": g, "s": s, "b": b, "w": params.get("w"), "l": params.get("l"), "m": params.get("m", 1.0) or 1.0, "nf": params.get("nf") or params.get("ng") or 1}) + return devs + + +def canon_nets(devs, ports): + """Rename internal nets consistently: nets that are ports keep their names; others become int by sorted signature.""" + sig = defaultdict(set) + for d in devs: + for t in ("d", "g", "s", "b"): + sig[d[t]].add((d["model"], "sd" if t in ("d", "s") else t)) + ren = {} + for n in sorted(sig, key=lambda n: (n in ports, n)): + if n in ports: ren[n] = n + else: ren[n] = "int:" + ",".join(sorted(f"{m}.{t}" for m, t in sig[n])) + return ren + + +def sizing_check(target_devices, extracted_text, models_map, ports, tol_rel=0.02, tol_abs_um=0.01): + """target_devices: [{name, model(kind), d,g,s,b, w, l, nf}]; models_map: kind->model name.""" + models = {v.lower() for v in models_map.values()} + ex = parse_mos(extracted_text, models) + ren = canon_nets(ex, set(ports)) + # group extracted by (model, canonical nets (unordered s/d)) + groups = defaultdict(list) + for d in ex: + key = (d["model"], ren[d["g"]], ren[d["b"]], tuple(sorted((ren[d["d"]], ren[d["s"]])))) + groups[key].append(d) + # target canonical signature using the same renaming rule on the target netlist + tsig = defaultdict(set) + for t in target_devices: + for k in ("d", "g", "s", "b"): + tsig[t[k]].add((models_map[t["model"]].lower(), "sd" if k in ("d", "s") else k)) + tren = {n: (n if n in ports else "int:" + ",".join(sorted(f"{m}.{k}" for m, k in s))) for n, s in tsig.items()} + tgroups = defaultdict(list) + for t in target_devices: + key = (models_map[t["model"]].lower(), tren[t["g"]], tren[t["b"]], tuple(sorted((tren[t["d"]], tren[t["s"]])))) + tgroups[key].append(t) + report = {"ok": True, "per_group": [], "extracted_devices": len(ex), "target_devices": len(target_devices)} + for key, tl in tgroups.items(): + w_target = sum(float(t["w"]) for t in tl); l_target = {round(float(t["l"]), 4) for t in tl} + el = groups.get(key, []) + w_ex = sum((d["w"] or 0.0) * (d["m"] or 1.0) for d in el) + # klayout combined devices report W as total; magic per-finger devices report unit W: both sum correctly + l_ex = {round(d["l"], 4) for d in el if d["l"] is not None} + ok_w = abs(w_ex - w_target) <= max(tol_abs_um, tol_rel * w_target) + ok_l = l_ex == l_target + ok_n = len(el) > 0 + report["per_group"].append({"key": [k if isinstance(k, str) else list(k) for k in key], "targets": [t["name"] for t in tl], "w_target": w_target, "w_extracted": round(w_ex, 4), + "l_target": sorted(l_target), "l_extracted": sorted(l_ex), "n_extracted": len(el), "ok": ok_w and ok_l and ok_n}) + if not (ok_w and ok_l and ok_n): report["ok"] = False + extra = [k for k in groups if k not in tgroups] + if extra: + report["ok"] = False; report["extra_extracted_groups"] = [[str(x) for x in k] for k in extra] + report["status"] = "passed" if report["ok"] else "constraints_failed" + return report From 81e71cac5d75de74e6fc5b3b96e06b7c03795576 Mon Sep 17 00:00:00 2001 From: Minxing Chu Date: Mon, 12 Oct 2026 07:35:29 +0000 Subject: [PATCH 3/7] textbook_sharing: case data, result tables and run records data/: 639 case folders (sizing, frozen specification, qualification, target netlists, testbench), nominal design points and the frozen mode order. results/: the count ledger, every analysis table, the geometry check of all recorded layouts, and the run records (JSON and model text; GDS files and tool logs are rebuilt from the code). Co-Authored-By: Claude Opus 5.5 --- .../cases/C01/gf180/sW0.5_sL1.5/case.json | 105 + .../cases/C01/gf180/sW0.5_sL1.5/manifest.json | 8 + .../C01/gf180/sW0.5_sL1.5/qualification.json | 91 + .../cases/C01/gf180/sW0.5_sL1.5/specs.json | 23 + .../cases/C01/gf180/sW0.5_sL1.5/target.spice | 4 + .../C01/gf180/sW0.5_sL1.5/target_lvs.spice | 6 + .../C01/gf180/sW0.5_sL1.5/testbench.spice | 25 + .../data/cases/C01/gf180/sW0.5_sL1/case.json | 105 + .../cases/C01/gf180/sW0.5_sL1/manifest.json | 8 + .../C01/gf180/sW0.5_sL1/qualification.json | 91 + .../data/cases/C01/gf180/sW0.5_sL1/specs.json | 23 + .../cases/C01/gf180/sW0.5_sL1/target.spice | 4 + .../C01/gf180/sW0.5_sL1/target_lvs.spice | 6 + .../cases/C01/gf180/sW0.5_sL1/testbench.spice | 25 + .../data/cases/C01/gf180/sW0.5_sL2/case.json | 105 + .../cases/C01/gf180/sW0.5_sL2/manifest.json | 8 + .../C01/gf180/sW0.5_sL2/qualification.json | 91 + .../data/cases/C01/gf180/sW0.5_sL2/specs.json | 23 + .../cases/C01/gf180/sW0.5_sL2/target.spice | 4 + .../C01/gf180/sW0.5_sL2/target_lvs.spice | 6 + .../cases/C01/gf180/sW0.5_sL2/testbench.spice | 25 + .../cases/C01/gf180/sW1.5_sL1.5/case.json | 105 + .../cases/C01/gf180/sW1.5_sL1.5/manifest.json | 8 + .../C01/gf180/sW1.5_sL1.5/qualification.json | 91 + .../cases/C01/gf180/sW1.5_sL1.5/specs.json | 23 + .../cases/C01/gf180/sW1.5_sL1.5/target.spice | 4 + .../C01/gf180/sW1.5_sL1.5/target_lvs.spice | 14 + .../C01/gf180/sW1.5_sL1.5/testbench.spice | 25 + .../data/cases/C01/gf180/sW1.5_sL1/case.json | 105 + .../cases/C01/gf180/sW1.5_sL1/manifest.json | 8 + .../C01/gf180/sW1.5_sL1/qualification.json | 91 + .../data/cases/C01/gf180/sW1.5_sL1/specs.json | 23 + .../cases/C01/gf180/sW1.5_sL1/target.spice | 4 + .../C01/gf180/sW1.5_sL1/target_lvs.spice | 14 + .../cases/C01/gf180/sW1.5_sL1/testbench.spice | 25 + .../data/cases/C01/gf180/sW1.5_sL2/case.json | 105 + .../cases/C01/gf180/sW1.5_sL2/manifest.json | 8 + .../C01/gf180/sW1.5_sL2/qualification.json | 91 + .../data/cases/C01/gf180/sW1.5_sL2/specs.json | 23 + .../cases/C01/gf180/sW1.5_sL2/target.spice | 4 + .../C01/gf180/sW1.5_sL2/target_lvs.spice | 14 + .../cases/C01/gf180/sW1.5_sL2/testbench.spice | 25 + .../data/cases/C01/gf180/sW1_sL1.5/case.json | 105 + .../cases/C01/gf180/sW1_sL1.5/manifest.json | 8 + .../C01/gf180/sW1_sL1.5/qualification.json | 91 + .../data/cases/C01/gf180/sW1_sL1.5/specs.json | 23 + .../cases/C01/gf180/sW1_sL1.5/target.spice | 4 + .../C01/gf180/sW1_sL1.5/target_lvs.spice | 10 + .../cases/C01/gf180/sW1_sL1.5/testbench.spice | 25 + .../data/cases/C01/gf180/sW1_sL1/case.json | 105 + .../cases/C01/gf180/sW1_sL1/manifest.json | 8 + .../C01/gf180/sW1_sL1/qualification.json | 91 + .../data/cases/C01/gf180/sW1_sL1/specs.json | 23 + .../data/cases/C01/gf180/sW1_sL1/target.spice | 4 + .../cases/C01/gf180/sW1_sL1/target_lvs.spice | 10 + .../cases/C01/gf180/sW1_sL1/testbench.spice | 25 + .../data/cases/C01/gf180/sW1_sL2/case.json | 105 + .../cases/C01/gf180/sW1_sL2/manifest.json | 8 + .../C01/gf180/sW1_sL2/qualification.json | 91 + .../data/cases/C01/gf180/sW1_sL2/specs.json | 23 + .../data/cases/C01/gf180/sW1_sL2/target.spice | 4 + .../cases/C01/gf180/sW1_sL2/target_lvs.spice | 10 + .../cases/C01/gf180/sW1_sL2/testbench.spice | 25 + .../data/cases/C01/gf180/sW2_sL1.5/case.json | 105 + .../cases/C01/gf180/sW2_sL1.5/manifest.json | 8 + .../C01/gf180/sW2_sL1.5/qualification.json | 91 + .../data/cases/C01/gf180/sW2_sL1.5/specs.json | 23 + .../cases/C01/gf180/sW2_sL1.5/target.spice | 4 + .../C01/gf180/sW2_sL1.5/target_lvs.spice | 18 + .../cases/C01/gf180/sW2_sL1.5/testbench.spice | 25 + .../data/cases/C01/gf180/sW2_sL1/case.json | 105 + .../cases/C01/gf180/sW2_sL1/manifest.json | 8 + .../C01/gf180/sW2_sL1/qualification.json | 91 + .../data/cases/C01/gf180/sW2_sL1/specs.json | 23 + .../data/cases/C01/gf180/sW2_sL1/target.spice | 4 + .../cases/C01/gf180/sW2_sL1/target_lvs.spice | 18 + .../cases/C01/gf180/sW2_sL1/testbench.spice | 25 + .../data/cases/C01/gf180/sW2_sL2/case.json | 105 + .../cases/C01/gf180/sW2_sL2/manifest.json | 8 + .../C01/gf180/sW2_sL2/qualification.json | 91 + .../data/cases/C01/gf180/sW2_sL2/specs.json | 23 + .../data/cases/C01/gf180/sW2_sL2/target.spice | 4 + .../cases/C01/gf180/sW2_sL2/target_lvs.spice | 18 + .../cases/C01/gf180/sW2_sL2/testbench.spice | 25 + .../cases/C01/ihp130/sW0.5_sL1.5/case.json | 105 + .../C01/ihp130/sW0.5_sL1.5/manifest.json | 8 + .../C01/ihp130/sW0.5_sL1.5/qualification.json | 91 + .../cases/C01/ihp130/sW0.5_sL1.5/specs.json | 23 + .../cases/C01/ihp130/sW0.5_sL1.5/target.spice | 4 + .../C01/ihp130/sW0.5_sL1.5/target_lvs.spice | 6 + .../C01/ihp130/sW0.5_sL1.5/testbench.spice | 25 + .../data/cases/C01/ihp130/sW0.5_sL1/case.json | 105 + .../cases/C01/ihp130/sW0.5_sL1/manifest.json | 8 + .../C01/ihp130/sW0.5_sL1/qualification.json | 91 + .../cases/C01/ihp130/sW0.5_sL1/specs.json | 23 + .../cases/C01/ihp130/sW0.5_sL1/target.spice | 4 + .../C01/ihp130/sW0.5_sL1/target_lvs.spice | 6 + .../C01/ihp130/sW0.5_sL1/testbench.spice | 25 + .../data/cases/C01/ihp130/sW0.5_sL2/case.json | 105 + .../cases/C01/ihp130/sW0.5_sL2/manifest.json | 8 + .../C01/ihp130/sW0.5_sL2/qualification.json | 91 + .../cases/C01/ihp130/sW0.5_sL2/specs.json | 23 + .../cases/C01/ihp130/sW0.5_sL2/target.spice | 4 + .../C01/ihp130/sW0.5_sL2/target_lvs.spice | 6 + .../C01/ihp130/sW0.5_sL2/testbench.spice | 25 + .../cases/C01/ihp130/sW1.5_sL1.5/case.json | 105 + .../C01/ihp130/sW1.5_sL1.5/manifest.json | 8 + .../C01/ihp130/sW1.5_sL1.5/qualification.json | 93 + .../cases/C01/ihp130/sW1.5_sL1.5/specs.json | 23 + .../cases/C01/ihp130/sW1.5_sL1.5/target.spice | 4 + .../C01/ihp130/sW1.5_sL1.5/target_lvs.spice | 14 + .../C01/ihp130/sW1.5_sL1.5/testbench.spice | 25 + .../data/cases/C01/ihp130/sW1.5_sL1/case.json | 105 + .../cases/C01/ihp130/sW1.5_sL1/manifest.json | 8 + .../C01/ihp130/sW1.5_sL1/qualification.json | 93 + .../cases/C01/ihp130/sW1.5_sL1/specs.json | 23 + .../cases/C01/ihp130/sW1.5_sL1/target.spice | 4 + .../C01/ihp130/sW1.5_sL1/target_lvs.spice | 14 + .../C01/ihp130/sW1.5_sL1/testbench.spice | 25 + .../data/cases/C01/ihp130/sW1.5_sL2/case.json | 105 + .../cases/C01/ihp130/sW1.5_sL2/manifest.json | 8 + .../C01/ihp130/sW1.5_sL2/qualification.json | 91 + .../cases/C01/ihp130/sW1.5_sL2/specs.json | 23 + .../cases/C01/ihp130/sW1.5_sL2/target.spice | 4 + .../C01/ihp130/sW1.5_sL2/target_lvs.spice | 14 + .../C01/ihp130/sW1.5_sL2/testbench.spice | 25 + .../data/cases/C01/ihp130/sW1_sL1.5/case.json | 105 + .../cases/C01/ihp130/sW1_sL1.5/manifest.json | 8 + .../C01/ihp130/sW1_sL1.5/qualification.json | 91 + .../cases/C01/ihp130/sW1_sL1.5/specs.json | 23 + .../cases/C01/ihp130/sW1_sL1.5/target.spice | 4 + .../C01/ihp130/sW1_sL1.5/target_lvs.spice | 10 + .../C01/ihp130/sW1_sL1.5/testbench.spice | 25 + .../data/cases/C01/ihp130/sW1_sL1/case.json | 105 + .../cases/C01/ihp130/sW1_sL1/manifest.json | 8 + .../C01/ihp130/sW1_sL1/qualification.json | 93 + .../data/cases/C01/ihp130/sW1_sL1/specs.json | 23 + .../cases/C01/ihp130/sW1_sL1/target.spice | 4 + .../cases/C01/ihp130/sW1_sL1/target_lvs.spice | 10 + .../cases/C01/ihp130/sW1_sL1/testbench.spice | 25 + .../data/cases/C01/ihp130/sW1_sL2/case.json | 105 + .../cases/C01/ihp130/sW1_sL2/manifest.json | 8 + .../C01/ihp130/sW1_sL2/qualification.json | 91 + .../data/cases/C01/ihp130/sW1_sL2/specs.json | 23 + .../cases/C01/ihp130/sW1_sL2/target.spice | 4 + .../cases/C01/ihp130/sW1_sL2/target_lvs.spice | 10 + .../cases/C01/ihp130/sW1_sL2/testbench.spice | 25 + .../data/cases/C01/ihp130/sW2_sL1.5/case.json | 105 + .../cases/C01/ihp130/sW2_sL1.5/manifest.json | 8 + .../C01/ihp130/sW2_sL1.5/qualification.json | 93 + .../cases/C01/ihp130/sW2_sL1.5/specs.json | 23 + .../cases/C01/ihp130/sW2_sL1.5/target.spice | 4 + .../C01/ihp130/sW2_sL1.5/target_lvs.spice | 18 + .../C01/ihp130/sW2_sL1.5/testbench.spice | 25 + .../data/cases/C01/ihp130/sW2_sL1/case.json | 105 + .../cases/C01/ihp130/sW2_sL1/manifest.json | 8 + .../C01/ihp130/sW2_sL1/qualification.json | 93 + .../data/cases/C01/ihp130/sW2_sL1/specs.json | 23 + .../cases/C01/ihp130/sW2_sL1/target.spice | 4 + .../cases/C01/ihp130/sW2_sL1/target_lvs.spice | 18 + .../cases/C01/ihp130/sW2_sL1/testbench.spice | 25 + .../data/cases/C01/ihp130/sW2_sL2/case.json | 105 + .../cases/C01/ihp130/sW2_sL2/manifest.json | 8 + .../C01/ihp130/sW2_sL2/qualification.json | 91 + .../data/cases/C01/ihp130/sW2_sL2/specs.json | 23 + .../cases/C01/ihp130/sW2_sL2/target.spice | 4 + .../cases/C01/ihp130/sW2_sL2/target_lvs.spice | 18 + .../cases/C01/ihp130/sW2_sL2/testbench.spice | 25 + .../cases/C01/sky130/sW0.5_sL1.5/case.json | 105 + .../C01/sky130/sW0.5_sL1.5/manifest.json | 8 + .../C01/sky130/sW0.5_sL1.5/qualification.json | 91 + .../cases/C01/sky130/sW0.5_sL1.5/specs.json | 23 + .../cases/C01/sky130/sW0.5_sL1.5/target.spice | 4 + .../C01/sky130/sW0.5_sL1.5/target_lvs.spice | 6 + .../C01/sky130/sW0.5_sL1.5/testbench.spice | 25 + .../data/cases/C01/sky130/sW0.5_sL1/case.json | 105 + .../cases/C01/sky130/sW0.5_sL1/manifest.json | 8 + .../C01/sky130/sW0.5_sL1/qualification.json | 91 + .../cases/C01/sky130/sW0.5_sL1/specs.json | 23 + .../cases/C01/sky130/sW0.5_sL1/target.spice | 4 + .../C01/sky130/sW0.5_sL1/target_lvs.spice | 6 + .../C01/sky130/sW0.5_sL1/testbench.spice | 25 + .../data/cases/C01/sky130/sW0.5_sL2/case.json | 105 + .../cases/C01/sky130/sW0.5_sL2/manifest.json | 8 + .../C01/sky130/sW0.5_sL2/qualification.json | 91 + .../cases/C01/sky130/sW0.5_sL2/specs.json | 23 + .../cases/C01/sky130/sW0.5_sL2/target.spice | 4 + .../C01/sky130/sW0.5_sL2/target_lvs.spice | 6 + .../C01/sky130/sW0.5_sL2/testbench.spice | 25 + .../cases/C01/sky130/sW1.5_sL1.5/case.json | 105 + .../C01/sky130/sW1.5_sL1.5/manifest.json | 8 + .../C01/sky130/sW1.5_sL1.5/qualification.json | 91 + .../cases/C01/sky130/sW1.5_sL1.5/specs.json | 23 + .../cases/C01/sky130/sW1.5_sL1.5/target.spice | 4 + .../C01/sky130/sW1.5_sL1.5/target_lvs.spice | 14 + .../C01/sky130/sW1.5_sL1.5/testbench.spice | 25 + .../data/cases/C01/sky130/sW1.5_sL1/case.json | 105 + .../cases/C01/sky130/sW1.5_sL1/manifest.json | 8 + .../C01/sky130/sW1.5_sL1/qualification.json | 91 + .../cases/C01/sky130/sW1.5_sL1/specs.json | 23 + .../cases/C01/sky130/sW1.5_sL1/target.spice | 4 + .../C01/sky130/sW1.5_sL1/target_lvs.spice | 14 + .../C01/sky130/sW1.5_sL1/testbench.spice | 25 + .../data/cases/C01/sky130/sW1.5_sL2/case.json | 105 + .../cases/C01/sky130/sW1.5_sL2/manifest.json | 8 + .../C01/sky130/sW1.5_sL2/qualification.json | 91 + .../cases/C01/sky130/sW1.5_sL2/specs.json | 23 + .../cases/C01/sky130/sW1.5_sL2/target.spice | 4 + .../C01/sky130/sW1.5_sL2/target_lvs.spice | 14 + .../C01/sky130/sW1.5_sL2/testbench.spice | 25 + .../data/cases/C01/sky130/sW1_sL1.5/case.json | 105 + .../cases/C01/sky130/sW1_sL1.5/manifest.json | 8 + .../C01/sky130/sW1_sL1.5/qualification.json | 91 + .../cases/C01/sky130/sW1_sL1.5/specs.json | 23 + .../cases/C01/sky130/sW1_sL1.5/target.spice | 4 + .../C01/sky130/sW1_sL1.5/target_lvs.spice | 10 + .../C01/sky130/sW1_sL1.5/testbench.spice | 25 + .../data/cases/C01/sky130/sW1_sL1/case.json | 105 + .../cases/C01/sky130/sW1_sL1/manifest.json | 8 + .../C01/sky130/sW1_sL1/qualification.json | 91 + .../data/cases/C01/sky130/sW1_sL1/specs.json | 23 + .../cases/C01/sky130/sW1_sL1/target.spice | 4 + .../cases/C01/sky130/sW1_sL1/target_lvs.spice | 10 + .../cases/C01/sky130/sW1_sL1/testbench.spice | 25 + .../data/cases/C01/sky130/sW1_sL2/case.json | 105 + .../cases/C01/sky130/sW1_sL2/manifest.json | 8 + .../C01/sky130/sW1_sL2/qualification.json | 91 + .../data/cases/C01/sky130/sW1_sL2/specs.json | 23 + .../cases/C01/sky130/sW1_sL2/target.spice | 4 + .../cases/C01/sky130/sW1_sL2/target_lvs.spice | 10 + .../cases/C01/sky130/sW1_sL2/testbench.spice | 25 + .../data/cases/C01/sky130/sW2_sL1.5/case.json | 105 + .../cases/C01/sky130/sW2_sL1.5/manifest.json | 8 + .../C01/sky130/sW2_sL1.5/qualification.json | 91 + .../cases/C01/sky130/sW2_sL1.5/specs.json | 23 + .../cases/C01/sky130/sW2_sL1.5/target.spice | 4 + .../C01/sky130/sW2_sL1.5/target_lvs.spice | 18 + .../C01/sky130/sW2_sL1.5/testbench.spice | 25 + .../data/cases/C01/sky130/sW2_sL1/case.json | 105 + .../cases/C01/sky130/sW2_sL1/manifest.json | 8 + .../C01/sky130/sW2_sL1/qualification.json | 91 + .../data/cases/C01/sky130/sW2_sL1/specs.json | 23 + .../cases/C01/sky130/sW2_sL1/target.spice | 4 + .../cases/C01/sky130/sW2_sL1/target_lvs.spice | 18 + .../cases/C01/sky130/sW2_sL1/testbench.spice | 25 + .../data/cases/C01/sky130/sW2_sL2/case.json | 105 + .../cases/C01/sky130/sW2_sL2/manifest.json | 8 + .../C01/sky130/sW2_sL2/qualification.json | 91 + .../data/cases/C01/sky130/sW2_sL2/specs.json | 23 + .../cases/C01/sky130/sW2_sL2/target.spice | 4 + .../cases/C01/sky130/sW2_sL2/target_lvs.spice | 18 + .../cases/C01/sky130/sW2_sL2/testbench.spice | 25 + .../cases/C02/gf180/sW0.5_sL1.5/case.json | 141 + .../cases/C02/gf180/sW0.5_sL1.5/manifest.json | 8 + .../C02/gf180/sW0.5_sL1.5/qualification.json | 115 + .../cases/C02/gf180/sW0.5_sL1.5/specs.json | 23 + .../cases/C02/gf180/sW0.5_sL1.5/target.spice | 6 + .../C02/gf180/sW0.5_sL1.5/target_lvs.spice | 10 + .../C02/gf180/sW0.5_sL1.5/testbench.spice | 25 + .../data/cases/C02/gf180/sW0.5_sL1/case.json | 141 + .../cases/C02/gf180/sW0.5_sL1/manifest.json | 8 + .../C02/gf180/sW0.5_sL1/qualification.json | 115 + .../data/cases/C02/gf180/sW0.5_sL1/specs.json | 23 + .../cases/C02/gf180/sW0.5_sL1/target.spice | 6 + .../C02/gf180/sW0.5_sL1/target_lvs.spice | 10 + .../cases/C02/gf180/sW0.5_sL1/testbench.spice | 25 + .../data/cases/C02/gf180/sW0.5_sL2/case.json | 141 + .../cases/C02/gf180/sW0.5_sL2/manifest.json | 8 + .../C02/gf180/sW0.5_sL2/qualification.json | 115 + .../data/cases/C02/gf180/sW0.5_sL2/specs.json | 23 + .../cases/C02/gf180/sW0.5_sL2/target.spice | 6 + .../C02/gf180/sW0.5_sL2/target_lvs.spice | 10 + .../cases/C02/gf180/sW0.5_sL2/testbench.spice | 25 + .../cases/C02/gf180/sW1.5_sL1.5/case.json | 141 + .../cases/C02/gf180/sW1.5_sL1.5/manifest.json | 8 + .../C02/gf180/sW1.5_sL1.5/qualification.json | 115 + .../cases/C02/gf180/sW1.5_sL1.5/specs.json | 23 + .../cases/C02/gf180/sW1.5_sL1.5/target.spice | 6 + .../C02/gf180/sW1.5_sL1.5/target_lvs.spice | 26 + .../C02/gf180/sW1.5_sL1.5/testbench.spice | 25 + .../data/cases/C02/gf180/sW1.5_sL1/case.json | 141 + .../cases/C02/gf180/sW1.5_sL1/manifest.json | 8 + .../C02/gf180/sW1.5_sL1/qualification.json | 115 + .../data/cases/C02/gf180/sW1.5_sL1/specs.json | 23 + .../cases/C02/gf180/sW1.5_sL1/target.spice | 6 + .../C02/gf180/sW1.5_sL1/target_lvs.spice | 26 + .../cases/C02/gf180/sW1.5_sL1/testbench.spice | 25 + .../data/cases/C02/gf180/sW1.5_sL2/case.json | 141 + .../cases/C02/gf180/sW1.5_sL2/manifest.json | 8 + .../C02/gf180/sW1.5_sL2/qualification.json | 115 + .../data/cases/C02/gf180/sW1.5_sL2/specs.json | 23 + .../cases/C02/gf180/sW1.5_sL2/target.spice | 6 + .../C02/gf180/sW1.5_sL2/target_lvs.spice | 26 + .../cases/C02/gf180/sW1.5_sL2/testbench.spice | 25 + .../data/cases/C02/gf180/sW1_sL1.5/case.json | 141 + .../cases/C02/gf180/sW1_sL1.5/manifest.json | 8 + .../C02/gf180/sW1_sL1.5/qualification.json | 115 + .../data/cases/C02/gf180/sW1_sL1.5/specs.json | 23 + .../cases/C02/gf180/sW1_sL1.5/target.spice | 6 + .../C02/gf180/sW1_sL1.5/target_lvs.spice | 18 + .../cases/C02/gf180/sW1_sL1.5/testbench.spice | 25 + .../data/cases/C02/gf180/sW1_sL1/case.json | 141 + .../cases/C02/gf180/sW1_sL1/manifest.json | 8 + .../C02/gf180/sW1_sL1/qualification.json | 115 + .../data/cases/C02/gf180/sW1_sL1/specs.json | 23 + .../data/cases/C02/gf180/sW1_sL1/target.spice | 6 + .../cases/C02/gf180/sW1_sL1/target_lvs.spice | 18 + .../cases/C02/gf180/sW1_sL1/testbench.spice | 25 + .../data/cases/C02/gf180/sW1_sL2/case.json | 141 + .../cases/C02/gf180/sW1_sL2/manifest.json | 8 + .../C02/gf180/sW1_sL2/qualification.json | 115 + .../data/cases/C02/gf180/sW1_sL2/specs.json | 23 + .../data/cases/C02/gf180/sW1_sL2/target.spice | 6 + .../cases/C02/gf180/sW1_sL2/target_lvs.spice | 18 + .../cases/C02/gf180/sW1_sL2/testbench.spice | 25 + .../data/cases/C02/gf180/sW2_sL1.5/case.json | 141 + .../cases/C02/gf180/sW2_sL1.5/manifest.json | 8 + .../C02/gf180/sW2_sL1.5/qualification.json | 115 + .../data/cases/C02/gf180/sW2_sL1.5/specs.json | 23 + .../cases/C02/gf180/sW2_sL1.5/target.spice | 6 + .../C02/gf180/sW2_sL1.5/target_lvs.spice | 34 + .../cases/C02/gf180/sW2_sL1.5/testbench.spice | 25 + .../data/cases/C02/gf180/sW2_sL1/case.json | 141 + .../cases/C02/gf180/sW2_sL1/manifest.json | 8 + .../C02/gf180/sW2_sL1/qualification.json | 115 + .../data/cases/C02/gf180/sW2_sL1/specs.json | 23 + .../data/cases/C02/gf180/sW2_sL1/target.spice | 6 + .../cases/C02/gf180/sW2_sL1/target_lvs.spice | 34 + .../cases/C02/gf180/sW2_sL1/testbench.spice | 25 + .../data/cases/C02/gf180/sW2_sL2/case.json | 141 + .../cases/C02/gf180/sW2_sL2/manifest.json | 8 + .../C02/gf180/sW2_sL2/qualification.json | 115 + .../data/cases/C02/gf180/sW2_sL2/specs.json | 23 + .../data/cases/C02/gf180/sW2_sL2/target.spice | 6 + .../cases/C02/gf180/sW2_sL2/target_lvs.spice | 34 + .../cases/C02/gf180/sW2_sL2/testbench.spice | 25 + .../cases/C02/ihp130/sW0.5_sL1.5/case.json | 141 + .../C02/ihp130/sW0.5_sL1.5/manifest.json | 8 + .../C02/ihp130/sW0.5_sL1.5/qualification.json | 115 + .../cases/C02/ihp130/sW0.5_sL1.5/specs.json | 23 + .../cases/C02/ihp130/sW0.5_sL1.5/target.spice | 6 + .../C02/ihp130/sW0.5_sL1.5/target_lvs.spice | 10 + .../C02/ihp130/sW0.5_sL1.5/testbench.spice | 25 + .../data/cases/C02/ihp130/sW0.5_sL1/case.json | 141 + .../cases/C02/ihp130/sW0.5_sL1/manifest.json | 8 + .../C02/ihp130/sW0.5_sL1/qualification.json | 115 + .../cases/C02/ihp130/sW0.5_sL1/specs.json | 23 + .../cases/C02/ihp130/sW0.5_sL1/target.spice | 6 + .../C02/ihp130/sW0.5_sL1/target_lvs.spice | 10 + .../C02/ihp130/sW0.5_sL1/testbench.spice | 25 + .../data/cases/C02/ihp130/sW0.5_sL2/case.json | 141 + .../cases/C02/ihp130/sW0.5_sL2/manifest.json | 8 + .../C02/ihp130/sW0.5_sL2/qualification.json | 115 + .../cases/C02/ihp130/sW0.5_sL2/specs.json | 23 + .../cases/C02/ihp130/sW0.5_sL2/target.spice | 6 + .../C02/ihp130/sW0.5_sL2/target_lvs.spice | 10 + .../C02/ihp130/sW0.5_sL2/testbench.spice | 25 + .../cases/C02/ihp130/sW1.5_sL1.5/case.json | 141 + .../C02/ihp130/sW1.5_sL1.5/manifest.json | 8 + .../C02/ihp130/sW1.5_sL1.5/qualification.json | 115 + .../cases/C02/ihp130/sW1.5_sL1.5/specs.json | 23 + .../cases/C02/ihp130/sW1.5_sL1.5/target.spice | 6 + .../C02/ihp130/sW1.5_sL1.5/target_lvs.spice | 26 + .../C02/ihp130/sW1.5_sL1.5/testbench.spice | 25 + .../data/cases/C02/ihp130/sW1.5_sL1/case.json | 141 + .../cases/C02/ihp130/sW1.5_sL1/manifest.json | 8 + .../C02/ihp130/sW1.5_sL1/qualification.json | 115 + .../cases/C02/ihp130/sW1.5_sL1/specs.json | 23 + .../cases/C02/ihp130/sW1.5_sL1/target.spice | 6 + .../C02/ihp130/sW1.5_sL1/target_lvs.spice | 26 + .../C02/ihp130/sW1.5_sL1/testbench.spice | 25 + .../data/cases/C02/ihp130/sW1.5_sL2/case.json | 141 + .../cases/C02/ihp130/sW1.5_sL2/manifest.json | 8 + .../C02/ihp130/sW1.5_sL2/qualification.json | 115 + .../cases/C02/ihp130/sW1.5_sL2/specs.json | 23 + .../cases/C02/ihp130/sW1.5_sL2/target.spice | 6 + .../C02/ihp130/sW1.5_sL2/target_lvs.spice | 26 + .../C02/ihp130/sW1.5_sL2/testbench.spice | 25 + .../data/cases/C02/ihp130/sW1_sL1.5/case.json | 141 + .../cases/C02/ihp130/sW1_sL1.5/manifest.json | 8 + .../C02/ihp130/sW1_sL1.5/qualification.json | 115 + .../cases/C02/ihp130/sW1_sL1.5/specs.json | 23 + .../cases/C02/ihp130/sW1_sL1.5/target.spice | 6 + .../C02/ihp130/sW1_sL1.5/target_lvs.spice | 18 + .../C02/ihp130/sW1_sL1.5/testbench.spice | 25 + .../data/cases/C02/ihp130/sW1_sL1/case.json | 141 + .../cases/C02/ihp130/sW1_sL1/manifest.json | 8 + .../C02/ihp130/sW1_sL1/qualification.json | 115 + .../data/cases/C02/ihp130/sW1_sL1/specs.json | 23 + .../cases/C02/ihp130/sW1_sL1/target.spice | 6 + .../cases/C02/ihp130/sW1_sL1/target_lvs.spice | 18 + .../cases/C02/ihp130/sW1_sL1/testbench.spice | 25 + .../data/cases/C02/ihp130/sW1_sL2/case.json | 141 + .../cases/C02/ihp130/sW1_sL2/manifest.json | 8 + .../C02/ihp130/sW1_sL2/qualification.json | 115 + .../data/cases/C02/ihp130/sW1_sL2/specs.json | 23 + .../cases/C02/ihp130/sW1_sL2/target.spice | 6 + .../cases/C02/ihp130/sW1_sL2/target_lvs.spice | 18 + .../cases/C02/ihp130/sW1_sL2/testbench.spice | 25 + .../data/cases/C02/ihp130/sW2_sL1.5/case.json | 141 + .../cases/C02/ihp130/sW2_sL1.5/manifest.json | 8 + .../C02/ihp130/sW2_sL1.5/qualification.json | 115 + .../cases/C02/ihp130/sW2_sL1.5/specs.json | 23 + .../cases/C02/ihp130/sW2_sL1.5/target.spice | 6 + .../C02/ihp130/sW2_sL1.5/target_lvs.spice | 34 + .../C02/ihp130/sW2_sL1.5/testbench.spice | 25 + .../data/cases/C02/ihp130/sW2_sL1/case.json | 141 + .../cases/C02/ihp130/sW2_sL1/manifest.json | 8 + .../C02/ihp130/sW2_sL1/qualification.json | 115 + .../data/cases/C02/ihp130/sW2_sL1/specs.json | 23 + .../cases/C02/ihp130/sW2_sL1/target.spice | 6 + .../cases/C02/ihp130/sW2_sL1/target_lvs.spice | 34 + .../cases/C02/ihp130/sW2_sL1/testbench.spice | 25 + .../data/cases/C02/ihp130/sW2_sL2/case.json | 141 + .../cases/C02/ihp130/sW2_sL2/manifest.json | 8 + .../C02/ihp130/sW2_sL2/qualification.json | 115 + .../data/cases/C02/ihp130/sW2_sL2/specs.json | 23 + .../cases/C02/ihp130/sW2_sL2/target.spice | 6 + .../cases/C02/ihp130/sW2_sL2/target_lvs.spice | 34 + .../cases/C02/ihp130/sW2_sL2/testbench.spice | 25 + .../cases/C02/sky130/sW0.5_sL1.5/case.json | 141 + .../C02/sky130/sW0.5_sL1.5/manifest.json | 8 + .../C02/sky130/sW0.5_sL1.5/qualification.json | 115 + .../cases/C02/sky130/sW0.5_sL1.5/specs.json | 23 + .../cases/C02/sky130/sW0.5_sL1.5/target.spice | 6 + .../C02/sky130/sW0.5_sL1.5/target_lvs.spice | 10 + .../C02/sky130/sW0.5_sL1.5/testbench.spice | 25 + .../data/cases/C02/sky130/sW0.5_sL1/case.json | 141 + .../cases/C02/sky130/sW0.5_sL1/manifest.json | 8 + .../C02/sky130/sW0.5_sL1/qualification.json | 115 + .../cases/C02/sky130/sW0.5_sL1/specs.json | 23 + .../cases/C02/sky130/sW0.5_sL1/target.spice | 6 + .../C02/sky130/sW0.5_sL1/target_lvs.spice | 10 + .../C02/sky130/sW0.5_sL1/testbench.spice | 25 + .../data/cases/C02/sky130/sW0.5_sL2/case.json | 141 + .../cases/C02/sky130/sW0.5_sL2/manifest.json | 8 + .../C02/sky130/sW0.5_sL2/qualification.json | 115 + .../cases/C02/sky130/sW0.5_sL2/specs.json | 23 + .../cases/C02/sky130/sW0.5_sL2/target.spice | 6 + .../C02/sky130/sW0.5_sL2/target_lvs.spice | 10 + .../C02/sky130/sW0.5_sL2/testbench.spice | 25 + .../cases/C02/sky130/sW1.5_sL1.5/case.json | 141 + .../C02/sky130/sW1.5_sL1.5/manifest.json | 8 + .../C02/sky130/sW1.5_sL1.5/qualification.json | 115 + .../cases/C02/sky130/sW1.5_sL1.5/specs.json | 23 + .../cases/C02/sky130/sW1.5_sL1.5/target.spice | 6 + .../C02/sky130/sW1.5_sL1.5/target_lvs.spice | 26 + .../C02/sky130/sW1.5_sL1.5/testbench.spice | 25 + .../data/cases/C02/sky130/sW1.5_sL1/case.json | 141 + .../cases/C02/sky130/sW1.5_sL1/manifest.json | 8 + .../C02/sky130/sW1.5_sL1/qualification.json | 115 + .../cases/C02/sky130/sW1.5_sL1/specs.json | 23 + .../cases/C02/sky130/sW1.5_sL1/target.spice | 6 + .../C02/sky130/sW1.5_sL1/target_lvs.spice | 26 + .../C02/sky130/sW1.5_sL1/testbench.spice | 25 + .../data/cases/C02/sky130/sW1.5_sL2/case.json | 141 + .../cases/C02/sky130/sW1.5_sL2/manifest.json | 8 + .../C02/sky130/sW1.5_sL2/qualification.json | 115 + .../cases/C02/sky130/sW1.5_sL2/specs.json | 23 + .../cases/C02/sky130/sW1.5_sL2/target.spice | 6 + .../C02/sky130/sW1.5_sL2/target_lvs.spice | 26 + .../C02/sky130/sW1.5_sL2/testbench.spice | 25 + .../data/cases/C02/sky130/sW1_sL1.5/case.json | 141 + .../cases/C02/sky130/sW1_sL1.5/manifest.json | 8 + .../C02/sky130/sW1_sL1.5/qualification.json | 115 + .../cases/C02/sky130/sW1_sL1.5/specs.json | 23 + .../cases/C02/sky130/sW1_sL1.5/target.spice | 6 + .../C02/sky130/sW1_sL1.5/target_lvs.spice | 18 + .../C02/sky130/sW1_sL1.5/testbench.spice | 25 + .../data/cases/C02/sky130/sW1_sL1/case.json | 141 + .../cases/C02/sky130/sW1_sL1/manifest.json | 8 + .../C02/sky130/sW1_sL1/qualification.json | 115 + .../data/cases/C02/sky130/sW1_sL1/specs.json | 23 + .../cases/C02/sky130/sW1_sL1/target.spice | 6 + .../cases/C02/sky130/sW1_sL1/target_lvs.spice | 18 + .../cases/C02/sky130/sW1_sL1/testbench.spice | 25 + .../data/cases/C02/sky130/sW1_sL2/case.json | 141 + .../cases/C02/sky130/sW1_sL2/manifest.json | 8 + .../C02/sky130/sW1_sL2/qualification.json | 115 + .../data/cases/C02/sky130/sW1_sL2/specs.json | 23 + .../cases/C02/sky130/sW1_sL2/target.spice | 6 + .../cases/C02/sky130/sW1_sL2/target_lvs.spice | 18 + .../cases/C02/sky130/sW1_sL2/testbench.spice | 25 + .../data/cases/C02/sky130/sW2_sL1.5/case.json | 141 + .../cases/C02/sky130/sW2_sL1.5/manifest.json | 8 + .../C02/sky130/sW2_sL1.5/qualification.json | 115 + .../cases/C02/sky130/sW2_sL1.5/specs.json | 23 + .../cases/C02/sky130/sW2_sL1.5/target.spice | 6 + .../C02/sky130/sW2_sL1.5/target_lvs.spice | 34 + .../C02/sky130/sW2_sL1.5/testbench.spice | 25 + .../data/cases/C02/sky130/sW2_sL1/case.json | 141 + .../cases/C02/sky130/sW2_sL1/manifest.json | 8 + .../C02/sky130/sW2_sL1/qualification.json | 115 + .../data/cases/C02/sky130/sW2_sL1/specs.json | 23 + .../cases/C02/sky130/sW2_sL1/target.spice | 6 + .../cases/C02/sky130/sW2_sL1/target_lvs.spice | 34 + .../cases/C02/sky130/sW2_sL1/testbench.spice | 25 + .../data/cases/C02/sky130/sW2_sL2/case.json | 141 + .../cases/C02/sky130/sW2_sL2/manifest.json | 8 + .../C02/sky130/sW2_sL2/qualification.json | 115 + .../data/cases/C02/sky130/sW2_sL2/specs.json | 23 + .../cases/C02/sky130/sW2_sL2/target.spice | 6 + .../cases/C02/sky130/sW2_sL2/target_lvs.spice | 34 + .../cases/C02/sky130/sW2_sL2/testbench.spice | 25 + .../cases/C03/gf180/sW0.5_sL1.5/case.json | 123 + .../cases/C03/gf180/sW0.5_sL1.5/manifest.json | 8 + .../C03/gf180/sW0.5_sL1.5/qualification.json | 103 + .../cases/C03/gf180/sW0.5_sL1.5/specs.json | 23 + .../cases/C03/gf180/sW0.5_sL1.5/target.spice | 5 + .../C03/gf180/sW0.5_sL1.5/target_lvs.spice | 14 + .../C03/gf180/sW0.5_sL1.5/testbench.spice | 25 + .../data/cases/C03/gf180/sW0.5_sL1/case.json | 123 + .../cases/C03/gf180/sW0.5_sL1/manifest.json | 8 + .../C03/gf180/sW0.5_sL1/qualification.json | 103 + .../data/cases/C03/gf180/sW0.5_sL1/specs.json | 23 + .../cases/C03/gf180/sW0.5_sL1/target.spice | 5 + .../C03/gf180/sW0.5_sL1/target_lvs.spice | 14 + .../cases/C03/gf180/sW0.5_sL1/testbench.spice | 25 + .../data/cases/C03/gf180/sW0.5_sL2/case.json | 123 + .../cases/C03/gf180/sW0.5_sL2/manifest.json | 8 + .../C03/gf180/sW0.5_sL2/qualification.json | 103 + .../data/cases/C03/gf180/sW0.5_sL2/specs.json | 23 + .../cases/C03/gf180/sW0.5_sL2/target.spice | 5 + .../C03/gf180/sW0.5_sL2/target_lvs.spice | 14 + .../cases/C03/gf180/sW0.5_sL2/testbench.spice | 25 + .../cases/C03/gf180/sW1.5_sL1.5/case.json | 123 + .../cases/C03/gf180/sW1.5_sL1.5/manifest.json | 8 + .../C03/gf180/sW1.5_sL1.5/qualification.json | 103 + .../cases/C03/gf180/sW1.5_sL1.5/specs.json | 23 + .../cases/C03/gf180/sW1.5_sL1.5/target.spice | 5 + .../C03/gf180/sW1.5_sL1.5/target_lvs.spice | 38 + .../C03/gf180/sW1.5_sL1.5/testbench.spice | 25 + .../data/cases/C03/gf180/sW1.5_sL1/case.json | 123 + .../cases/C03/gf180/sW1.5_sL1/manifest.json | 8 + .../C03/gf180/sW1.5_sL1/qualification.json | 103 + .../data/cases/C03/gf180/sW1.5_sL1/specs.json | 23 + .../cases/C03/gf180/sW1.5_sL1/target.spice | 5 + .../C03/gf180/sW1.5_sL1/target_lvs.spice | 38 + .../cases/C03/gf180/sW1.5_sL1/testbench.spice | 25 + .../data/cases/C03/gf180/sW1.5_sL2/case.json | 123 + .../cases/C03/gf180/sW1.5_sL2/manifest.json | 8 + .../C03/gf180/sW1.5_sL2/qualification.json | 103 + .../data/cases/C03/gf180/sW1.5_sL2/specs.json | 23 + .../cases/C03/gf180/sW1.5_sL2/target.spice | 5 + .../C03/gf180/sW1.5_sL2/target_lvs.spice | 38 + .../cases/C03/gf180/sW1.5_sL2/testbench.spice | 25 + .../data/cases/C03/gf180/sW1_sL1.5/case.json | 123 + .../cases/C03/gf180/sW1_sL1.5/manifest.json | 8 + .../C03/gf180/sW1_sL1.5/qualification.json | 103 + .../data/cases/C03/gf180/sW1_sL1.5/specs.json | 23 + .../cases/C03/gf180/sW1_sL1.5/target.spice | 5 + .../C03/gf180/sW1_sL1.5/target_lvs.spice | 26 + .../cases/C03/gf180/sW1_sL1.5/testbench.spice | 25 + .../data/cases/C03/gf180/sW1_sL1/case.json | 123 + .../cases/C03/gf180/sW1_sL1/manifest.json | 8 + .../C03/gf180/sW1_sL1/qualification.json | 103 + .../data/cases/C03/gf180/sW1_sL1/specs.json | 23 + .../data/cases/C03/gf180/sW1_sL1/target.spice | 5 + .../cases/C03/gf180/sW1_sL1/target_lvs.spice | 26 + .../cases/C03/gf180/sW1_sL1/testbench.spice | 25 + .../data/cases/C03/gf180/sW1_sL2/case.json | 123 + .../cases/C03/gf180/sW1_sL2/manifest.json | 8 + .../C03/gf180/sW1_sL2/qualification.json | 103 + .../data/cases/C03/gf180/sW1_sL2/specs.json | 23 + .../data/cases/C03/gf180/sW1_sL2/target.spice | 5 + .../cases/C03/gf180/sW1_sL2/target_lvs.spice | 26 + .../cases/C03/gf180/sW1_sL2/testbench.spice | 25 + .../data/cases/C03/gf180/sW2_sL1.5/case.json | 123 + .../cases/C03/gf180/sW2_sL1.5/manifest.json | 8 + .../C03/gf180/sW2_sL1.5/qualification.json | 103 + .../data/cases/C03/gf180/sW2_sL1.5/specs.json | 23 + .../cases/C03/gf180/sW2_sL1.5/target.spice | 5 + .../C03/gf180/sW2_sL1.5/target_lvs.spice | 50 + .../cases/C03/gf180/sW2_sL1.5/testbench.spice | 25 + .../data/cases/C03/gf180/sW2_sL1/case.json | 123 + .../cases/C03/gf180/sW2_sL1/manifest.json | 8 + .../C03/gf180/sW2_sL1/qualification.json | 103 + .../data/cases/C03/gf180/sW2_sL1/specs.json | 23 + .../data/cases/C03/gf180/sW2_sL1/target.spice | 5 + .../cases/C03/gf180/sW2_sL1/target_lvs.spice | 50 + .../cases/C03/gf180/sW2_sL1/testbench.spice | 25 + .../data/cases/C03/gf180/sW2_sL2/case.json | 123 + .../cases/C03/gf180/sW2_sL2/manifest.json | 8 + .../C03/gf180/sW2_sL2/qualification.json | 103 + .../data/cases/C03/gf180/sW2_sL2/specs.json | 23 + .../data/cases/C03/gf180/sW2_sL2/target.spice | 5 + .../cases/C03/gf180/sW2_sL2/target_lvs.spice | 50 + .../cases/C03/gf180/sW2_sL2/testbench.spice | 25 + .../cases/C03/ihp130/sW0.5_sL1.5/case.json | 123 + .../C03/ihp130/sW0.5_sL1.5/manifest.json | 8 + .../C03/ihp130/sW0.5_sL1.5/qualification.json | 103 + .../cases/C03/ihp130/sW0.5_sL1.5/specs.json | 23 + .../cases/C03/ihp130/sW0.5_sL1.5/target.spice | 5 + .../C03/ihp130/sW0.5_sL1.5/target_lvs.spice | 14 + .../C03/ihp130/sW0.5_sL1.5/testbench.spice | 25 + .../data/cases/C03/ihp130/sW0.5_sL1/case.json | 123 + .../cases/C03/ihp130/sW0.5_sL1/manifest.json | 8 + .../C03/ihp130/sW0.5_sL1/qualification.json | 103 + .../cases/C03/ihp130/sW0.5_sL1/specs.json | 23 + .../cases/C03/ihp130/sW0.5_sL1/target.spice | 5 + .../C03/ihp130/sW0.5_sL1/target_lvs.spice | 14 + .../C03/ihp130/sW0.5_sL1/testbench.spice | 25 + .../data/cases/C03/ihp130/sW0.5_sL2/case.json | 123 + .../cases/C03/ihp130/sW0.5_sL2/manifest.json | 8 + .../C03/ihp130/sW0.5_sL2/qualification.json | 105 + .../cases/C03/ihp130/sW0.5_sL2/specs.json | 23 + .../cases/C03/ihp130/sW0.5_sL2/target.spice | 5 + .../C03/ihp130/sW0.5_sL2/target_lvs.spice | 14 + .../C03/ihp130/sW0.5_sL2/testbench.spice | 25 + .../cases/C03/ihp130/sW1.5_sL1.5/case.json | 123 + .../C03/ihp130/sW1.5_sL1.5/manifest.json | 8 + .../C03/ihp130/sW1.5_sL1.5/qualification.json | 103 + .../cases/C03/ihp130/sW1.5_sL1.5/specs.json | 23 + .../cases/C03/ihp130/sW1.5_sL1.5/target.spice | 5 + .../C03/ihp130/sW1.5_sL1.5/target_lvs.spice | 38 + .../C03/ihp130/sW1.5_sL1.5/testbench.spice | 25 + .../data/cases/C03/ihp130/sW1.5_sL1/case.json | 123 + .../cases/C03/ihp130/sW1.5_sL1/manifest.json | 8 + .../C03/ihp130/sW1.5_sL1/qualification.json | 103 + .../cases/C03/ihp130/sW1.5_sL1/specs.json | 23 + .../cases/C03/ihp130/sW1.5_sL1/target.spice | 5 + .../C03/ihp130/sW1.5_sL1/target_lvs.spice | 38 + .../C03/ihp130/sW1.5_sL1/testbench.spice | 25 + .../data/cases/C03/ihp130/sW1.5_sL2/case.json | 123 + .../cases/C03/ihp130/sW1.5_sL2/manifest.json | 8 + .../C03/ihp130/sW1.5_sL2/qualification.json | 103 + .../cases/C03/ihp130/sW1.5_sL2/specs.json | 23 + .../cases/C03/ihp130/sW1.5_sL2/target.spice | 5 + .../C03/ihp130/sW1.5_sL2/target_lvs.spice | 38 + .../C03/ihp130/sW1.5_sL2/testbench.spice | 25 + .../data/cases/C03/ihp130/sW1_sL1.5/case.json | 123 + .../cases/C03/ihp130/sW1_sL1.5/manifest.json | 8 + .../C03/ihp130/sW1_sL1.5/qualification.json | 103 + .../cases/C03/ihp130/sW1_sL1.5/specs.json | 23 + .../cases/C03/ihp130/sW1_sL1.5/target.spice | 5 + .../C03/ihp130/sW1_sL1.5/target_lvs.spice | 26 + .../C03/ihp130/sW1_sL1.5/testbench.spice | 25 + .../data/cases/C03/ihp130/sW1_sL1/case.json | 123 + .../cases/C03/ihp130/sW1_sL1/manifest.json | 8 + .../C03/ihp130/sW1_sL1/qualification.json | 103 + .../data/cases/C03/ihp130/sW1_sL1/specs.json | 23 + .../cases/C03/ihp130/sW1_sL1/target.spice | 5 + .../cases/C03/ihp130/sW1_sL1/target_lvs.spice | 26 + .../cases/C03/ihp130/sW1_sL1/testbench.spice | 25 + .../data/cases/C03/ihp130/sW1_sL2/case.json | 123 + .../cases/C03/ihp130/sW1_sL2/manifest.json | 8 + .../C03/ihp130/sW1_sL2/qualification.json | 103 + .../data/cases/C03/ihp130/sW1_sL2/specs.json | 23 + .../cases/C03/ihp130/sW1_sL2/target.spice | 5 + .../cases/C03/ihp130/sW1_sL2/target_lvs.spice | 26 + .../cases/C03/ihp130/sW1_sL2/testbench.spice | 25 + .../data/cases/C03/ihp130/sW2_sL1.5/case.json | 123 + .../cases/C03/ihp130/sW2_sL1.5/manifest.json | 8 + .../C03/ihp130/sW2_sL1.5/qualification.json | 103 + .../cases/C03/ihp130/sW2_sL1.5/specs.json | 23 + .../cases/C03/ihp130/sW2_sL1.5/target.spice | 5 + .../C03/ihp130/sW2_sL1.5/target_lvs.spice | 50 + .../C03/ihp130/sW2_sL1.5/testbench.spice | 25 + .../data/cases/C03/ihp130/sW2_sL1/case.json | 123 + .../cases/C03/ihp130/sW2_sL1/manifest.json | 8 + .../C03/ihp130/sW2_sL1/qualification.json | 103 + .../data/cases/C03/ihp130/sW2_sL1/specs.json | 23 + .../cases/C03/ihp130/sW2_sL1/target.spice | 5 + .../cases/C03/ihp130/sW2_sL1/target_lvs.spice | 50 + .../cases/C03/ihp130/sW2_sL1/testbench.spice | 25 + .../data/cases/C03/ihp130/sW2_sL2/case.json | 123 + .../cases/C03/ihp130/sW2_sL2/manifest.json | 8 + .../C03/ihp130/sW2_sL2/qualification.json | 103 + .../data/cases/C03/ihp130/sW2_sL2/specs.json | 23 + .../cases/C03/ihp130/sW2_sL2/target.spice | 5 + .../cases/C03/ihp130/sW2_sL2/target_lvs.spice | 50 + .../cases/C03/ihp130/sW2_sL2/testbench.spice | 25 + .../cases/C03/sky130/sW0.5_sL1.5/case.json | 123 + .../C03/sky130/sW0.5_sL1.5/manifest.json | 8 + .../C03/sky130/sW0.5_sL1.5/qualification.json | 103 + .../cases/C03/sky130/sW0.5_sL1.5/specs.json | 23 + .../cases/C03/sky130/sW0.5_sL1.5/target.spice | 5 + .../C03/sky130/sW0.5_sL1.5/target_lvs.spice | 14 + .../C03/sky130/sW0.5_sL1.5/testbench.spice | 25 + .../data/cases/C03/sky130/sW0.5_sL1/case.json | 123 + .../cases/C03/sky130/sW0.5_sL1/manifest.json | 8 + .../C03/sky130/sW0.5_sL1/qualification.json | 103 + .../cases/C03/sky130/sW0.5_sL1/specs.json | 23 + .../cases/C03/sky130/sW0.5_sL1/target.spice | 5 + .../C03/sky130/sW0.5_sL1/target_lvs.spice | 14 + .../C03/sky130/sW0.5_sL1/testbench.spice | 25 + .../data/cases/C03/sky130/sW0.5_sL2/case.json | 123 + .../cases/C03/sky130/sW0.5_sL2/manifest.json | 8 + .../C03/sky130/sW0.5_sL2/qualification.json | 103 + .../cases/C03/sky130/sW0.5_sL2/specs.json | 23 + .../cases/C03/sky130/sW0.5_sL2/target.spice | 5 + .../C03/sky130/sW0.5_sL2/target_lvs.spice | 14 + .../C03/sky130/sW0.5_sL2/testbench.spice | 25 + .../cases/C03/sky130/sW1.5_sL1.5/case.json | 123 + .../C03/sky130/sW1.5_sL1.5/manifest.json | 8 + .../C03/sky130/sW1.5_sL1.5/qualification.json | 103 + .../cases/C03/sky130/sW1.5_sL1.5/specs.json | 23 + .../cases/C03/sky130/sW1.5_sL1.5/target.spice | 5 + .../C03/sky130/sW1.5_sL1.5/target_lvs.spice | 38 + .../C03/sky130/sW1.5_sL1.5/testbench.spice | 25 + .../data/cases/C03/sky130/sW1.5_sL1/case.json | 123 + .../cases/C03/sky130/sW1.5_sL1/manifest.json | 8 + .../C03/sky130/sW1.5_sL1/qualification.json | 103 + .../cases/C03/sky130/sW1.5_sL1/specs.json | 23 + .../cases/C03/sky130/sW1.5_sL1/target.spice | 5 + .../C03/sky130/sW1.5_sL1/target_lvs.spice | 38 + .../C03/sky130/sW1.5_sL1/testbench.spice | 25 + .../data/cases/C03/sky130/sW1.5_sL2/case.json | 123 + .../cases/C03/sky130/sW1.5_sL2/manifest.json | 8 + .../C03/sky130/sW1.5_sL2/qualification.json | 103 + .../cases/C03/sky130/sW1.5_sL2/specs.json | 23 + .../cases/C03/sky130/sW1.5_sL2/target.spice | 5 + .../C03/sky130/sW1.5_sL2/target_lvs.spice | 38 + .../C03/sky130/sW1.5_sL2/testbench.spice | 25 + .../data/cases/C03/sky130/sW1_sL1.5/case.json | 123 + .../cases/C03/sky130/sW1_sL1.5/manifest.json | 8 + .../C03/sky130/sW1_sL1.5/qualification.json | 103 + .../cases/C03/sky130/sW1_sL1.5/specs.json | 23 + .../cases/C03/sky130/sW1_sL1.5/target.spice | 5 + .../C03/sky130/sW1_sL1.5/target_lvs.spice | 26 + .../C03/sky130/sW1_sL1.5/testbench.spice | 25 + .../data/cases/C03/sky130/sW1_sL1/case.json | 123 + .../cases/C03/sky130/sW1_sL1/manifest.json | 8 + .../C03/sky130/sW1_sL1/qualification.json | 103 + .../data/cases/C03/sky130/sW1_sL1/specs.json | 23 + .../cases/C03/sky130/sW1_sL1/target.spice | 5 + .../cases/C03/sky130/sW1_sL1/target_lvs.spice | 26 + .../cases/C03/sky130/sW1_sL1/testbench.spice | 25 + .../data/cases/C03/sky130/sW1_sL2/case.json | 123 + .../cases/C03/sky130/sW1_sL2/manifest.json | 8 + .../C03/sky130/sW1_sL2/qualification.json | 103 + .../data/cases/C03/sky130/sW1_sL2/specs.json | 23 + .../cases/C03/sky130/sW1_sL2/target.spice | 5 + .../cases/C03/sky130/sW1_sL2/target_lvs.spice | 26 + .../cases/C03/sky130/sW1_sL2/testbench.spice | 25 + .../data/cases/C03/sky130/sW2_sL1.5/case.json | 123 + .../cases/C03/sky130/sW2_sL1.5/manifest.json | 8 + .../C03/sky130/sW2_sL1.5/qualification.json | 103 + .../cases/C03/sky130/sW2_sL1.5/specs.json | 23 + .../cases/C03/sky130/sW2_sL1.5/target.spice | 5 + .../C03/sky130/sW2_sL1.5/target_lvs.spice | 50 + .../C03/sky130/sW2_sL1.5/testbench.spice | 25 + .../data/cases/C03/sky130/sW2_sL1/case.json | 123 + .../cases/C03/sky130/sW2_sL1/manifest.json | 8 + .../C03/sky130/sW2_sL1/qualification.json | 103 + .../data/cases/C03/sky130/sW2_sL1/specs.json | 23 + .../cases/C03/sky130/sW2_sL1/target.spice | 5 + .../cases/C03/sky130/sW2_sL1/target_lvs.spice | 50 + .../cases/C03/sky130/sW2_sL1/testbench.spice | 25 + .../data/cases/C03/sky130/sW2_sL2/case.json | 123 + .../cases/C03/sky130/sW2_sL2/manifest.json | 8 + .../C03/sky130/sW2_sL2/qualification.json | 103 + .../data/cases/C03/sky130/sW2_sL2/specs.json | 23 + .../cases/C03/sky130/sW2_sL2/target.spice | 5 + .../cases/C03/sky130/sW2_sL2/target_lvs.spice | 50 + .../cases/C03/sky130/sW2_sL2/testbench.spice | 25 + .../cases/C04/gf180/sW0.5_sL1.5/case.json | 101 + .../cases/C04/gf180/sW0.5_sL1.5/manifest.json | 8 + .../C04/gf180/sW0.5_sL1.5/qualification.json | 83 + .../cases/C04/gf180/sW0.5_sL1.5/specs.json | 23 + .../cases/C04/gf180/sW0.5_sL1.5/target.spice | 4 + .../C04/gf180/sW0.5_sL1.5/target_lvs.spice | 8 + .../C04/gf180/sW0.5_sL1.5/testbench.spice | 27 + .../data/cases/C04/gf180/sW0.5_sL1/case.json | 101 + .../cases/C04/gf180/sW0.5_sL1/manifest.json | 8 + .../C04/gf180/sW0.5_sL1/qualification.json | 83 + .../data/cases/C04/gf180/sW0.5_sL1/specs.json | 23 + .../cases/C04/gf180/sW0.5_sL1/target.spice | 4 + .../C04/gf180/sW0.5_sL1/target_lvs.spice | 8 + .../cases/C04/gf180/sW0.5_sL1/testbench.spice | 27 + .../data/cases/C04/gf180/sW0.5_sL2/case.json | 101 + .../cases/C04/gf180/sW0.5_sL2/manifest.json | 8 + .../C04/gf180/sW0.5_sL2/qualification.json | 85 + .../data/cases/C04/gf180/sW0.5_sL2/specs.json | 23 + .../cases/C04/gf180/sW0.5_sL2/target.spice | 4 + .../C04/gf180/sW0.5_sL2/target_lvs.spice | 8 + .../cases/C04/gf180/sW0.5_sL2/testbench.spice | 27 + .../cases/C04/gf180/sW1.5_sL1.5/case.json | 101 + .../cases/C04/gf180/sW1.5_sL1.5/manifest.json | 8 + .../C04/gf180/sW1.5_sL1.5/qualification.json | 83 + .../cases/C04/gf180/sW1.5_sL1.5/specs.json | 23 + .../cases/C04/gf180/sW1.5_sL1.5/target.spice | 4 + .../C04/gf180/sW1.5_sL1.5/target_lvs.spice | 20 + .../C04/gf180/sW1.5_sL1.5/testbench.spice | 27 + .../data/cases/C04/gf180/sW1.5_sL1/case.json | 101 + .../cases/C04/gf180/sW1.5_sL1/manifest.json | 8 + .../C04/gf180/sW1.5_sL1/qualification.json | 83 + .../data/cases/C04/gf180/sW1.5_sL1/specs.json | 23 + .../cases/C04/gf180/sW1.5_sL1/target.spice | 4 + .../C04/gf180/sW1.5_sL1/target_lvs.spice | 20 + .../cases/C04/gf180/sW1.5_sL1/testbench.spice | 27 + .../data/cases/C04/gf180/sW1.5_sL2/case.json | 101 + .../cases/C04/gf180/sW1.5_sL2/manifest.json | 8 + .../C04/gf180/sW1.5_sL2/qualification.json | 83 + .../data/cases/C04/gf180/sW1.5_sL2/specs.json | 23 + .../cases/C04/gf180/sW1.5_sL2/target.spice | 4 + .../C04/gf180/sW1.5_sL2/target_lvs.spice | 20 + .../cases/C04/gf180/sW1.5_sL2/testbench.spice | 27 + .../data/cases/C04/gf180/sW1_sL1.5/case.json | 101 + .../cases/C04/gf180/sW1_sL1.5/manifest.json | 8 + .../C04/gf180/sW1_sL1.5/qualification.json | 83 + .../data/cases/C04/gf180/sW1_sL1.5/specs.json | 23 + .../cases/C04/gf180/sW1_sL1.5/target.spice | 4 + .../C04/gf180/sW1_sL1.5/target_lvs.spice | 14 + .../cases/C04/gf180/sW1_sL1.5/testbench.spice | 27 + .../data/cases/C04/gf180/sW1_sL1/case.json | 101 + .../cases/C04/gf180/sW1_sL1/manifest.json | 8 + .../C04/gf180/sW1_sL1/qualification.json | 83 + .../data/cases/C04/gf180/sW1_sL1/specs.json | 23 + .../data/cases/C04/gf180/sW1_sL1/target.spice | 4 + .../cases/C04/gf180/sW1_sL1/target_lvs.spice | 14 + .../cases/C04/gf180/sW1_sL1/testbench.spice | 27 + .../data/cases/C04/gf180/sW1_sL2/case.json | 101 + .../cases/C04/gf180/sW1_sL2/manifest.json | 8 + .../C04/gf180/sW1_sL2/qualification.json | 83 + .../data/cases/C04/gf180/sW1_sL2/specs.json | 23 + .../data/cases/C04/gf180/sW1_sL2/target.spice | 4 + .../cases/C04/gf180/sW1_sL2/target_lvs.spice | 14 + .../cases/C04/gf180/sW1_sL2/testbench.spice | 27 + .../data/cases/C04/gf180/sW2_sL1.5/case.json | 101 + .../cases/C04/gf180/sW2_sL1.5/manifest.json | 8 + .../C04/gf180/sW2_sL1.5/qualification.json | 83 + .../data/cases/C04/gf180/sW2_sL1.5/specs.json | 23 + .../cases/C04/gf180/sW2_sL1.5/target.spice | 4 + .../C04/gf180/sW2_sL1.5/target_lvs.spice | 26 + .../cases/C04/gf180/sW2_sL1.5/testbench.spice | 27 + .../data/cases/C04/gf180/sW2_sL1/case.json | 101 + .../cases/C04/gf180/sW2_sL1/manifest.json | 8 + .../C04/gf180/sW2_sL1/qualification.json | 83 + .../data/cases/C04/gf180/sW2_sL1/specs.json | 23 + .../data/cases/C04/gf180/sW2_sL1/target.spice | 4 + .../cases/C04/gf180/sW2_sL1/target_lvs.spice | 26 + .../cases/C04/gf180/sW2_sL1/testbench.spice | 27 + .../data/cases/C04/gf180/sW2_sL2/case.json | 101 + .../cases/C04/gf180/sW2_sL2/manifest.json | 8 + .../C04/gf180/sW2_sL2/qualification.json | 83 + .../data/cases/C04/gf180/sW2_sL2/specs.json | 23 + .../data/cases/C04/gf180/sW2_sL2/target.spice | 4 + .../cases/C04/gf180/sW2_sL2/target_lvs.spice | 26 + .../cases/C04/gf180/sW2_sL2/testbench.spice | 27 + .../cases/C04/ihp130/sW0.5_sL1.5/case.json | 101 + .../C04/ihp130/sW0.5_sL1.5/manifest.json | 8 + .../C04/ihp130/sW0.5_sL1.5/qualification.json | 83 + .../cases/C04/ihp130/sW0.5_sL1.5/specs.json | 23 + .../cases/C04/ihp130/sW0.5_sL1.5/target.spice | 4 + .../C04/ihp130/sW0.5_sL1.5/target_lvs.spice | 8 + .../C04/ihp130/sW0.5_sL1.5/testbench.spice | 27 + .../data/cases/C04/ihp130/sW0.5_sL1/case.json | 101 + .../cases/C04/ihp130/sW0.5_sL1/manifest.json | 8 + .../C04/ihp130/sW0.5_sL1/qualification.json | 83 + .../cases/C04/ihp130/sW0.5_sL1/specs.json | 23 + .../cases/C04/ihp130/sW0.5_sL1/target.spice | 4 + .../C04/ihp130/sW0.5_sL1/target_lvs.spice | 8 + .../C04/ihp130/sW0.5_sL1/testbench.spice | 27 + .../data/cases/C04/ihp130/sW0.5_sL2/case.json | 101 + .../cases/C04/ihp130/sW0.5_sL2/manifest.json | 8 + .../C04/ihp130/sW0.5_sL2/qualification.json | 83 + .../cases/C04/ihp130/sW0.5_sL2/specs.json | 23 + .../cases/C04/ihp130/sW0.5_sL2/target.spice | 4 + .../C04/ihp130/sW0.5_sL2/target_lvs.spice | 8 + .../C04/ihp130/sW0.5_sL2/testbench.spice | 27 + .../cases/C04/ihp130/sW1.5_sL1.5/case.json | 101 + .../C04/ihp130/sW1.5_sL1.5/manifest.json | 8 + .../C04/ihp130/sW1.5_sL1.5/qualification.json | 83 + .../cases/C04/ihp130/sW1.5_sL1.5/specs.json | 23 + .../cases/C04/ihp130/sW1.5_sL1.5/target.spice | 4 + .../C04/ihp130/sW1.5_sL1.5/target_lvs.spice | 20 + .../C04/ihp130/sW1.5_sL1.5/testbench.spice | 27 + .../data/cases/C04/ihp130/sW1.5_sL1/case.json | 101 + .../cases/C04/ihp130/sW1.5_sL1/manifest.json | 8 + .../C04/ihp130/sW1.5_sL1/qualification.json | 83 + .../cases/C04/ihp130/sW1.5_sL1/specs.json | 23 + .../cases/C04/ihp130/sW1.5_sL1/target.spice | 4 + .../C04/ihp130/sW1.5_sL1/target_lvs.spice | 20 + .../C04/ihp130/sW1.5_sL1/testbench.spice | 27 + .../data/cases/C04/ihp130/sW1.5_sL2/case.json | 101 + .../cases/C04/ihp130/sW1.5_sL2/manifest.json | 8 + .../C04/ihp130/sW1.5_sL2/qualification.json | 83 + .../cases/C04/ihp130/sW1.5_sL2/specs.json | 23 + .../cases/C04/ihp130/sW1.5_sL2/target.spice | 4 + .../C04/ihp130/sW1.5_sL2/target_lvs.spice | 20 + .../C04/ihp130/sW1.5_sL2/testbench.spice | 27 + .../data/cases/C04/ihp130/sW1_sL1.5/case.json | 101 + .../cases/C04/ihp130/sW1_sL1.5/manifest.json | 8 + .../C04/ihp130/sW1_sL1.5/qualification.json | 83 + .../cases/C04/ihp130/sW1_sL1.5/specs.json | 23 + .../cases/C04/ihp130/sW1_sL1.5/target.spice | 4 + .../C04/ihp130/sW1_sL1.5/target_lvs.spice | 14 + .../C04/ihp130/sW1_sL1.5/testbench.spice | 27 + .../data/cases/C04/ihp130/sW1_sL1/case.json | 101 + .../cases/C04/ihp130/sW1_sL1/manifest.json | 8 + .../C04/ihp130/sW1_sL1/qualification.json | 83 + .../data/cases/C04/ihp130/sW1_sL1/specs.json | 23 + .../cases/C04/ihp130/sW1_sL1/target.spice | 4 + .../cases/C04/ihp130/sW1_sL1/target_lvs.spice | 14 + .../cases/C04/ihp130/sW1_sL1/testbench.spice | 27 + .../data/cases/C04/ihp130/sW1_sL2/case.json | 101 + .../cases/C04/ihp130/sW1_sL2/manifest.json | 8 + .../C04/ihp130/sW1_sL2/qualification.json | 83 + .../data/cases/C04/ihp130/sW1_sL2/specs.json | 23 + .../cases/C04/ihp130/sW1_sL2/target.spice | 4 + .../cases/C04/ihp130/sW1_sL2/target_lvs.spice | 14 + .../cases/C04/ihp130/sW1_sL2/testbench.spice | 27 + .../data/cases/C04/ihp130/sW2_sL1.5/case.json | 101 + .../cases/C04/ihp130/sW2_sL1.5/manifest.json | 8 + .../C04/ihp130/sW2_sL1.5/qualification.json | 83 + .../cases/C04/ihp130/sW2_sL1.5/specs.json | 23 + .../cases/C04/ihp130/sW2_sL1.5/target.spice | 4 + .../C04/ihp130/sW2_sL1.5/target_lvs.spice | 26 + .../C04/ihp130/sW2_sL1.5/testbench.spice | 27 + .../data/cases/C04/ihp130/sW2_sL1/case.json | 101 + .../cases/C04/ihp130/sW2_sL1/manifest.json | 8 + .../C04/ihp130/sW2_sL1/qualification.json | 83 + .../data/cases/C04/ihp130/sW2_sL1/specs.json | 23 + .../cases/C04/ihp130/sW2_sL1/target.spice | 4 + .../cases/C04/ihp130/sW2_sL1/target_lvs.spice | 26 + .../cases/C04/ihp130/sW2_sL1/testbench.spice | 27 + .../data/cases/C04/ihp130/sW2_sL2/case.json | 101 + .../cases/C04/ihp130/sW2_sL2/manifest.json | 8 + .../C04/ihp130/sW2_sL2/qualification.json | 83 + .../data/cases/C04/ihp130/sW2_sL2/specs.json | 23 + .../cases/C04/ihp130/sW2_sL2/target.spice | 4 + .../cases/C04/ihp130/sW2_sL2/target_lvs.spice | 26 + .../cases/C04/ihp130/sW2_sL2/testbench.spice | 27 + .../cases/C04/sky130/sW0.5_sL1.5/case.json | 101 + .../C04/sky130/sW0.5_sL1.5/manifest.json | 8 + .../C04/sky130/sW0.5_sL1.5/qualification.json | 83 + .../cases/C04/sky130/sW0.5_sL1.5/specs.json | 23 + .../cases/C04/sky130/sW0.5_sL1.5/target.spice | 4 + .../C04/sky130/sW0.5_sL1.5/target_lvs.spice | 8 + .../C04/sky130/sW0.5_sL1.5/testbench.spice | 27 + .../data/cases/C04/sky130/sW0.5_sL1/case.json | 101 + .../cases/C04/sky130/sW0.5_sL1/manifest.json | 8 + .../C04/sky130/sW0.5_sL1/qualification.json | 83 + .../cases/C04/sky130/sW0.5_sL1/specs.json | 23 + .../cases/C04/sky130/sW0.5_sL1/target.spice | 4 + .../C04/sky130/sW0.5_sL1/target_lvs.spice | 8 + .../C04/sky130/sW0.5_sL1/testbench.spice | 27 + .../data/cases/C04/sky130/sW0.5_sL2/case.json | 101 + .../cases/C04/sky130/sW0.5_sL2/manifest.json | 8 + .../C04/sky130/sW0.5_sL2/qualification.json | 83 + .../cases/C04/sky130/sW0.5_sL2/specs.json | 23 + .../cases/C04/sky130/sW0.5_sL2/target.spice | 4 + .../C04/sky130/sW0.5_sL2/target_lvs.spice | 8 + .../C04/sky130/sW0.5_sL2/testbench.spice | 27 + .../cases/C04/sky130/sW1.5_sL1.5/case.json | 101 + .../C04/sky130/sW1.5_sL1.5/manifest.json | 8 + .../C04/sky130/sW1.5_sL1.5/qualification.json | 83 + .../cases/C04/sky130/sW1.5_sL1.5/specs.json | 23 + .../cases/C04/sky130/sW1.5_sL1.5/target.spice | 4 + .../C04/sky130/sW1.5_sL1.5/target_lvs.spice | 20 + .../C04/sky130/sW1.5_sL1.5/testbench.spice | 27 + .../data/cases/C04/sky130/sW1.5_sL1/case.json | 101 + .../cases/C04/sky130/sW1.5_sL1/manifest.json | 8 + .../C04/sky130/sW1.5_sL1/qualification.json | 83 + .../cases/C04/sky130/sW1.5_sL1/specs.json | 23 + .../cases/C04/sky130/sW1.5_sL1/target.spice | 4 + .../C04/sky130/sW1.5_sL1/target_lvs.spice | 20 + .../C04/sky130/sW1.5_sL1/testbench.spice | 27 + .../data/cases/C04/sky130/sW1.5_sL2/case.json | 101 + .../cases/C04/sky130/sW1.5_sL2/manifest.json | 8 + .../C04/sky130/sW1.5_sL2/qualification.json | 83 + .../cases/C04/sky130/sW1.5_sL2/specs.json | 23 + .../cases/C04/sky130/sW1.5_sL2/target.spice | 4 + .../C04/sky130/sW1.5_sL2/target_lvs.spice | 20 + .../C04/sky130/sW1.5_sL2/testbench.spice | 27 + .../data/cases/C04/sky130/sW1_sL1.5/case.json | 101 + .../cases/C04/sky130/sW1_sL1.5/manifest.json | 8 + .../C04/sky130/sW1_sL1.5/qualification.json | 83 + .../cases/C04/sky130/sW1_sL1.5/specs.json | 23 + .../cases/C04/sky130/sW1_sL1.5/target.spice | 4 + .../C04/sky130/sW1_sL1.5/target_lvs.spice | 14 + .../C04/sky130/sW1_sL1.5/testbench.spice | 27 + .../data/cases/C04/sky130/sW1_sL1/case.json | 101 + .../cases/C04/sky130/sW1_sL1/manifest.json | 8 + .../C04/sky130/sW1_sL1/qualification.json | 83 + .../data/cases/C04/sky130/sW1_sL1/specs.json | 23 + .../cases/C04/sky130/sW1_sL1/target.spice | 4 + .../cases/C04/sky130/sW1_sL1/target_lvs.spice | 14 + .../cases/C04/sky130/sW1_sL1/testbench.spice | 27 + .../data/cases/C04/sky130/sW1_sL2/case.json | 101 + .../cases/C04/sky130/sW1_sL2/manifest.json | 8 + .../C04/sky130/sW1_sL2/qualification.json | 83 + .../data/cases/C04/sky130/sW1_sL2/specs.json | 23 + .../cases/C04/sky130/sW1_sL2/target.spice | 4 + .../cases/C04/sky130/sW1_sL2/target_lvs.spice | 14 + .../cases/C04/sky130/sW1_sL2/testbench.spice | 27 + .../data/cases/C04/sky130/sW2_sL1.5/case.json | 101 + .../cases/C04/sky130/sW2_sL1.5/manifest.json | 8 + .../C04/sky130/sW2_sL1.5/qualification.json | 83 + .../cases/C04/sky130/sW2_sL1.5/specs.json | 23 + .../cases/C04/sky130/sW2_sL1.5/target.spice | 4 + .../C04/sky130/sW2_sL1.5/target_lvs.spice | 26 + .../C04/sky130/sW2_sL1.5/testbench.spice | 27 + .../data/cases/C04/sky130/sW2_sL1/case.json | 101 + .../cases/C04/sky130/sW2_sL1/manifest.json | 8 + .../C04/sky130/sW2_sL1/qualification.json | 83 + .../data/cases/C04/sky130/sW2_sL1/specs.json | 23 + .../cases/C04/sky130/sW2_sL1/target.spice | 4 + .../cases/C04/sky130/sW2_sL1/target_lvs.spice | 26 + .../cases/C04/sky130/sW2_sL1/testbench.spice | 27 + .../data/cases/C04/sky130/sW2_sL2/case.json | 101 + .../cases/C04/sky130/sW2_sL2/manifest.json | 8 + .../C04/sky130/sW2_sL2/qualification.json | 83 + .../data/cases/C04/sky130/sW2_sL2/specs.json | 23 + .../cases/C04/sky130/sW2_sL2/target.spice | 4 + .../cases/C04/sky130/sW2_sL2/target_lvs.spice | 26 + .../cases/C04/sky130/sW2_sL2/testbench.spice | 27 + .../cases/C05/gf180/sW0.5_sL1.5/case.json | 103 + .../cases/C05/gf180/sW0.5_sL1.5/manifest.json | 8 + .../C05/gf180/sW0.5_sL1.5/qualification.json | 85 + .../cases/C05/gf180/sW0.5_sL1.5/specs.json | 23 + .../cases/C05/gf180/sW0.5_sL1.5/target.spice | 4 + .../C05/gf180/sW0.5_sL1.5/target_lvs.spice | 8 + .../C05/gf180/sW0.5_sL1.5/testbench.spice | 30 + .../data/cases/C05/gf180/sW0.5_sL1/case.json | 103 + .../cases/C05/gf180/sW0.5_sL1/manifest.json | 8 + .../C05/gf180/sW0.5_sL1/qualification.json | 85 + .../data/cases/C05/gf180/sW0.5_sL1/specs.json | 23 + .../cases/C05/gf180/sW0.5_sL1/target.spice | 4 + .../C05/gf180/sW0.5_sL1/target_lvs.spice | 8 + .../cases/C05/gf180/sW0.5_sL1/testbench.spice | 30 + .../data/cases/C05/gf180/sW0.5_sL2/case.json | 103 + .../cases/C05/gf180/sW0.5_sL2/manifest.json | 8 + .../C05/gf180/sW0.5_sL2/qualification.json | 87 + .../data/cases/C05/gf180/sW0.5_sL2/specs.json | 23 + .../cases/C05/gf180/sW0.5_sL2/target.spice | 4 + .../C05/gf180/sW0.5_sL2/target_lvs.spice | 8 + .../cases/C05/gf180/sW0.5_sL2/testbench.spice | 30 + .../cases/C05/gf180/sW1.5_sL1.5/case.json | 103 + .../cases/C05/gf180/sW1.5_sL1.5/manifest.json | 8 + .../C05/gf180/sW1.5_sL1.5/qualification.json | 85 + .../cases/C05/gf180/sW1.5_sL1.5/specs.json | 23 + .../cases/C05/gf180/sW1.5_sL1.5/target.spice | 4 + .../C05/gf180/sW1.5_sL1.5/target_lvs.spice | 20 + .../C05/gf180/sW1.5_sL1.5/testbench.spice | 30 + .../data/cases/C05/gf180/sW1.5_sL1/case.json | 103 + .../cases/C05/gf180/sW1.5_sL1/manifest.json | 8 + .../C05/gf180/sW1.5_sL1/qualification.json | 85 + .../data/cases/C05/gf180/sW1.5_sL1/specs.json | 23 + .../cases/C05/gf180/sW1.5_sL1/target.spice | 4 + .../C05/gf180/sW1.5_sL1/target_lvs.spice | 20 + .../cases/C05/gf180/sW1.5_sL1/testbench.spice | 30 + .../data/cases/C05/gf180/sW1.5_sL2/case.json | 103 + .../cases/C05/gf180/sW1.5_sL2/manifest.json | 8 + .../C05/gf180/sW1.5_sL2/qualification.json | 85 + .../data/cases/C05/gf180/sW1.5_sL2/specs.json | 23 + .../cases/C05/gf180/sW1.5_sL2/target.spice | 4 + .../C05/gf180/sW1.5_sL2/target_lvs.spice | 20 + .../cases/C05/gf180/sW1.5_sL2/testbench.spice | 30 + .../data/cases/C05/gf180/sW1_sL1.5/case.json | 103 + .../cases/C05/gf180/sW1_sL1.5/manifest.json | 8 + .../C05/gf180/sW1_sL1.5/qualification.json | 85 + .../data/cases/C05/gf180/sW1_sL1.5/specs.json | 23 + .../cases/C05/gf180/sW1_sL1.5/target.spice | 4 + .../C05/gf180/sW1_sL1.5/target_lvs.spice | 14 + .../cases/C05/gf180/sW1_sL1.5/testbench.spice | 30 + .../data/cases/C05/gf180/sW1_sL1/case.json | 103 + .../cases/C05/gf180/sW1_sL1/manifest.json | 8 + .../C05/gf180/sW1_sL1/qualification.json | 85 + .../data/cases/C05/gf180/sW1_sL1/specs.json | 23 + .../data/cases/C05/gf180/sW1_sL1/target.spice | 4 + .../cases/C05/gf180/sW1_sL1/target_lvs.spice | 14 + .../cases/C05/gf180/sW1_sL1/testbench.spice | 30 + .../data/cases/C05/gf180/sW1_sL2/case.json | 103 + .../cases/C05/gf180/sW1_sL2/manifest.json | 8 + .../C05/gf180/sW1_sL2/qualification.json | 85 + .../data/cases/C05/gf180/sW1_sL2/specs.json | 23 + .../data/cases/C05/gf180/sW1_sL2/target.spice | 4 + .../cases/C05/gf180/sW1_sL2/target_lvs.spice | 14 + .../cases/C05/gf180/sW1_sL2/testbench.spice | 30 + .../data/cases/C05/gf180/sW2_sL1.5/case.json | 103 + .../cases/C05/gf180/sW2_sL1.5/manifest.json | 8 + .../C05/gf180/sW2_sL1.5/qualification.json | 85 + .../data/cases/C05/gf180/sW2_sL1.5/specs.json | 23 + .../cases/C05/gf180/sW2_sL1.5/target.spice | 4 + .../C05/gf180/sW2_sL1.5/target_lvs.spice | 26 + .../cases/C05/gf180/sW2_sL1.5/testbench.spice | 30 + .../data/cases/C05/gf180/sW2_sL1/case.json | 103 + .../cases/C05/gf180/sW2_sL1/manifest.json | 8 + .../C05/gf180/sW2_sL1/qualification.json | 85 + .../data/cases/C05/gf180/sW2_sL1/specs.json | 23 + .../data/cases/C05/gf180/sW2_sL1/target.spice | 4 + .../cases/C05/gf180/sW2_sL1/target_lvs.spice | 26 + .../cases/C05/gf180/sW2_sL1/testbench.spice | 30 + .../data/cases/C05/gf180/sW2_sL2/case.json | 103 + .../cases/C05/gf180/sW2_sL2/manifest.json | 8 + .../C05/gf180/sW2_sL2/qualification.json | 85 + .../data/cases/C05/gf180/sW2_sL2/specs.json | 23 + .../data/cases/C05/gf180/sW2_sL2/target.spice | 4 + .../cases/C05/gf180/sW2_sL2/target_lvs.spice | 26 + .../cases/C05/gf180/sW2_sL2/testbench.spice | 30 + .../cases/C05/ihp130/sW0.5_sL1.5/case.json | 103 + .../C05/ihp130/sW0.5_sL1.5/manifest.json | 8 + .../C05/ihp130/sW0.5_sL1.5/qualification.json | 85 + .../cases/C05/ihp130/sW0.5_sL1.5/specs.json | 23 + .../cases/C05/ihp130/sW0.5_sL1.5/target.spice | 4 + .../C05/ihp130/sW0.5_sL1.5/target_lvs.spice | 8 + .../C05/ihp130/sW0.5_sL1.5/testbench.spice | 30 + .../data/cases/C05/ihp130/sW0.5_sL1/case.json | 103 + .../cases/C05/ihp130/sW0.5_sL1/manifest.json | 8 + .../C05/ihp130/sW0.5_sL1/qualification.json | 85 + .../cases/C05/ihp130/sW0.5_sL1/specs.json | 23 + .../cases/C05/ihp130/sW0.5_sL1/target.spice | 4 + .../C05/ihp130/sW0.5_sL1/target_lvs.spice | 8 + .../C05/ihp130/sW0.5_sL1/testbench.spice | 30 + .../data/cases/C05/ihp130/sW0.5_sL2/case.json | 103 + .../cases/C05/ihp130/sW0.5_sL2/manifest.json | 8 + .../C05/ihp130/sW0.5_sL2/qualification.json | 85 + .../cases/C05/ihp130/sW0.5_sL2/specs.json | 23 + .../cases/C05/ihp130/sW0.5_sL2/target.spice | 4 + .../C05/ihp130/sW0.5_sL2/target_lvs.spice | 8 + .../C05/ihp130/sW0.5_sL2/testbench.spice | 30 + .../cases/C05/ihp130/sW1.5_sL1.5/case.json | 103 + .../C05/ihp130/sW1.5_sL1.5/manifest.json | 8 + .../C05/ihp130/sW1.5_sL1.5/qualification.json | 85 + .../cases/C05/ihp130/sW1.5_sL1.5/specs.json | 23 + .../cases/C05/ihp130/sW1.5_sL1.5/target.spice | 4 + .../C05/ihp130/sW1.5_sL1.5/target_lvs.spice | 20 + .../C05/ihp130/sW1.5_sL1.5/testbench.spice | 30 + .../data/cases/C05/ihp130/sW1.5_sL1/case.json | 103 + .../cases/C05/ihp130/sW1.5_sL1/manifest.json | 8 + .../C05/ihp130/sW1.5_sL1/qualification.json | 85 + .../cases/C05/ihp130/sW1.5_sL1/specs.json | 23 + .../cases/C05/ihp130/sW1.5_sL1/target.spice | 4 + .../C05/ihp130/sW1.5_sL1/target_lvs.spice | 20 + .../C05/ihp130/sW1.5_sL1/testbench.spice | 30 + .../data/cases/C05/ihp130/sW1.5_sL2/case.json | 103 + .../cases/C05/ihp130/sW1.5_sL2/manifest.json | 8 + .../C05/ihp130/sW1.5_sL2/qualification.json | 85 + .../cases/C05/ihp130/sW1.5_sL2/specs.json | 23 + .../cases/C05/ihp130/sW1.5_sL2/target.spice | 4 + .../C05/ihp130/sW1.5_sL2/target_lvs.spice | 20 + .../C05/ihp130/sW1.5_sL2/testbench.spice | 30 + .../data/cases/C05/ihp130/sW1_sL1.5/case.json | 103 + .../cases/C05/ihp130/sW1_sL1.5/manifest.json | 8 + .../C05/ihp130/sW1_sL1.5/qualification.json | 85 + .../cases/C05/ihp130/sW1_sL1.5/specs.json | 23 + .../cases/C05/ihp130/sW1_sL1.5/target.spice | 4 + .../C05/ihp130/sW1_sL1.5/target_lvs.spice | 14 + .../C05/ihp130/sW1_sL1.5/testbench.spice | 30 + .../data/cases/C05/ihp130/sW1_sL1/case.json | 103 + .../cases/C05/ihp130/sW1_sL1/manifest.json | 8 + .../C05/ihp130/sW1_sL1/qualification.json | 85 + .../data/cases/C05/ihp130/sW1_sL1/specs.json | 23 + .../cases/C05/ihp130/sW1_sL1/target.spice | 4 + .../cases/C05/ihp130/sW1_sL1/target_lvs.spice | 14 + .../cases/C05/ihp130/sW1_sL1/testbench.spice | 30 + .../data/cases/C05/ihp130/sW1_sL2/case.json | 103 + .../cases/C05/ihp130/sW1_sL2/manifest.json | 8 + .../C05/ihp130/sW1_sL2/qualification.json | 85 + .../data/cases/C05/ihp130/sW1_sL2/specs.json | 23 + .../cases/C05/ihp130/sW1_sL2/target.spice | 4 + .../cases/C05/ihp130/sW1_sL2/target_lvs.spice | 14 + .../cases/C05/ihp130/sW1_sL2/testbench.spice | 30 + .../data/cases/C05/ihp130/sW2_sL1.5/case.json | 103 + .../cases/C05/ihp130/sW2_sL1.5/manifest.json | 8 + .../C05/ihp130/sW2_sL1.5/qualification.json | 85 + .../cases/C05/ihp130/sW2_sL1.5/specs.json | 23 + .../cases/C05/ihp130/sW2_sL1.5/target.spice | 4 + .../C05/ihp130/sW2_sL1.5/target_lvs.spice | 26 + .../C05/ihp130/sW2_sL1.5/testbench.spice | 30 + .../data/cases/C05/ihp130/sW2_sL1/case.json | 103 + .../cases/C05/ihp130/sW2_sL1/manifest.json | 8 + .../C05/ihp130/sW2_sL1/qualification.json | 85 + .../data/cases/C05/ihp130/sW2_sL1/specs.json | 23 + .../cases/C05/ihp130/sW2_sL1/target.spice | 4 + .../cases/C05/ihp130/sW2_sL1/target_lvs.spice | 26 + .../cases/C05/ihp130/sW2_sL1/testbench.spice | 30 + .../data/cases/C05/ihp130/sW2_sL2/case.json | 103 + .../cases/C05/ihp130/sW2_sL2/manifest.json | 8 + .../C05/ihp130/sW2_sL2/qualification.json | 85 + .../data/cases/C05/ihp130/sW2_sL2/specs.json | 23 + .../cases/C05/ihp130/sW2_sL2/target.spice | 4 + .../cases/C05/ihp130/sW2_sL2/target_lvs.spice | 26 + .../cases/C05/ihp130/sW2_sL2/testbench.spice | 30 + .../cases/C05/sky130/sW0.5_sL1.5/case.json | 103 + .../C05/sky130/sW0.5_sL1.5/manifest.json | 8 + .../C05/sky130/sW0.5_sL1.5/qualification.json | 85 + .../cases/C05/sky130/sW0.5_sL1.5/specs.json | 23 + .../cases/C05/sky130/sW0.5_sL1.5/target.spice | 4 + .../C05/sky130/sW0.5_sL1.5/target_lvs.spice | 8 + .../C05/sky130/sW0.5_sL1.5/testbench.spice | 30 + .../data/cases/C05/sky130/sW0.5_sL1/case.json | 103 + .../cases/C05/sky130/sW0.5_sL1/manifest.json | 8 + .../C05/sky130/sW0.5_sL1/qualification.json | 85 + .../cases/C05/sky130/sW0.5_sL1/specs.json | 23 + .../cases/C05/sky130/sW0.5_sL1/target.spice | 4 + .../C05/sky130/sW0.5_sL1/target_lvs.spice | 8 + .../C05/sky130/sW0.5_sL1/testbench.spice | 30 + .../data/cases/C05/sky130/sW0.5_sL2/case.json | 103 + .../cases/C05/sky130/sW0.5_sL2/manifest.json | 8 + .../C05/sky130/sW0.5_sL2/qualification.json | 85 + .../cases/C05/sky130/sW0.5_sL2/specs.json | 23 + .../cases/C05/sky130/sW0.5_sL2/target.spice | 4 + .../C05/sky130/sW0.5_sL2/target_lvs.spice | 8 + .../C05/sky130/sW0.5_sL2/testbench.spice | 30 + .../cases/C05/sky130/sW1.5_sL1.5/case.json | 103 + .../C05/sky130/sW1.5_sL1.5/manifest.json | 8 + .../C05/sky130/sW1.5_sL1.5/qualification.json | 85 + .../cases/C05/sky130/sW1.5_sL1.5/specs.json | 23 + .../cases/C05/sky130/sW1.5_sL1.5/target.spice | 4 + .../C05/sky130/sW1.5_sL1.5/target_lvs.spice | 20 + .../C05/sky130/sW1.5_sL1.5/testbench.spice | 30 + .../data/cases/C05/sky130/sW1.5_sL1/case.json | 103 + .../cases/C05/sky130/sW1.5_sL1/manifest.json | 8 + .../C05/sky130/sW1.5_sL1/qualification.json | 85 + .../cases/C05/sky130/sW1.5_sL1/specs.json | 23 + .../cases/C05/sky130/sW1.5_sL1/target.spice | 4 + .../C05/sky130/sW1.5_sL1/target_lvs.spice | 20 + .../C05/sky130/sW1.5_sL1/testbench.spice | 30 + .../data/cases/C05/sky130/sW1.5_sL2/case.json | 103 + .../cases/C05/sky130/sW1.5_sL2/manifest.json | 8 + .../C05/sky130/sW1.5_sL2/qualification.json | 85 + .../cases/C05/sky130/sW1.5_sL2/specs.json | 23 + .../cases/C05/sky130/sW1.5_sL2/target.spice | 4 + .../C05/sky130/sW1.5_sL2/target_lvs.spice | 20 + .../C05/sky130/sW1.5_sL2/testbench.spice | 30 + .../data/cases/C05/sky130/sW1_sL1.5/case.json | 103 + .../cases/C05/sky130/sW1_sL1.5/manifest.json | 8 + .../C05/sky130/sW1_sL1.5/qualification.json | 85 + .../cases/C05/sky130/sW1_sL1.5/specs.json | 23 + .../cases/C05/sky130/sW1_sL1.5/target.spice | 4 + .../C05/sky130/sW1_sL1.5/target_lvs.spice | 14 + .../C05/sky130/sW1_sL1.5/testbench.spice | 30 + .../data/cases/C05/sky130/sW1_sL1/case.json | 103 + .../cases/C05/sky130/sW1_sL1/manifest.json | 8 + .../C05/sky130/sW1_sL1/qualification.json | 85 + .../data/cases/C05/sky130/sW1_sL1/specs.json | 23 + .../cases/C05/sky130/sW1_sL1/target.spice | 4 + .../cases/C05/sky130/sW1_sL1/target_lvs.spice | 14 + .../cases/C05/sky130/sW1_sL1/testbench.spice | 30 + .../data/cases/C05/sky130/sW1_sL2/case.json | 103 + .../cases/C05/sky130/sW1_sL2/manifest.json | 8 + .../C05/sky130/sW1_sL2/qualification.json | 85 + .../data/cases/C05/sky130/sW1_sL2/specs.json | 23 + .../cases/C05/sky130/sW1_sL2/target.spice | 4 + .../cases/C05/sky130/sW1_sL2/target_lvs.spice | 14 + .../cases/C05/sky130/sW1_sL2/testbench.spice | 30 + .../data/cases/C05/sky130/sW2_sL1.5/case.json | 103 + .../cases/C05/sky130/sW2_sL1.5/manifest.json | 8 + .../C05/sky130/sW2_sL1.5/qualification.json | 85 + .../cases/C05/sky130/sW2_sL1.5/specs.json | 23 + .../cases/C05/sky130/sW2_sL1.5/target.spice | 4 + .../C05/sky130/sW2_sL1.5/target_lvs.spice | 26 + .../C05/sky130/sW2_sL1.5/testbench.spice | 30 + .../data/cases/C05/sky130/sW2_sL1/case.json | 103 + .../cases/C05/sky130/sW2_sL1/manifest.json | 8 + .../C05/sky130/sW2_sL1/qualification.json | 85 + .../data/cases/C05/sky130/sW2_sL1/specs.json | 23 + .../cases/C05/sky130/sW2_sL1/target.spice | 4 + .../cases/C05/sky130/sW2_sL1/target_lvs.spice | 26 + .../cases/C05/sky130/sW2_sL1/testbench.spice | 30 + .../data/cases/C05/sky130/sW2_sL2/case.json | 103 + .../cases/C05/sky130/sW2_sL2/manifest.json | 8 + .../C05/sky130/sW2_sL2/qualification.json | 85 + .../data/cases/C05/sky130/sW2_sL2/specs.json | 23 + .../cases/C05/sky130/sW2_sL2/target.spice | 4 + .../cases/C05/sky130/sW2_sL2/target_lvs.spice | 26 + .../cases/C05/sky130/sW2_sL2/testbench.spice | 30 + .../cases/C06/gf180/sW0.5_sL1.5/case.json | 163 + .../cases/C06/gf180/sW0.5_sL1.5/manifest.json | 8 + .../C06/gf180/sW0.5_sL1.5/qualification.json | 107 + .../cases/C06/gf180/sW0.5_sL1.5/specs.json | 23 + .../cases/C06/gf180/sW0.5_sL1.5/target.spice | 6 + .../C06/gf180/sW0.5_sL1.5/target_lvs.spice | 14 + .../C06/gf180/sW0.5_sL1.5/testbench.spice | 31 + .../data/cases/C06/gf180/sW0.5_sL1/case.json | 163 + .../cases/C06/gf180/sW0.5_sL1/manifest.json | 8 + .../C06/gf180/sW0.5_sL1/qualification.json | 107 + .../data/cases/C06/gf180/sW0.5_sL1/specs.json | 23 + .../cases/C06/gf180/sW0.5_sL1/target.spice | 6 + .../C06/gf180/sW0.5_sL1/target_lvs.spice | 14 + .../cases/C06/gf180/sW0.5_sL1/testbench.spice | 31 + .../data/cases/C06/gf180/sW0.5_sL2/case.json | 163 + .../cases/C06/gf180/sW0.5_sL2/manifest.json | 8 + .../C06/gf180/sW0.5_sL2/qualification.json | 107 + .../data/cases/C06/gf180/sW0.5_sL2/specs.json | 23 + .../cases/C06/gf180/sW0.5_sL2/target.spice | 6 + .../C06/gf180/sW0.5_sL2/target_lvs.spice | 14 + .../cases/C06/gf180/sW0.5_sL2/testbench.spice | 31 + .../cases/C06/gf180/sW1.5_sL1.5/case.json | 163 + .../cases/C06/gf180/sW1.5_sL1.5/manifest.json | 8 + .../C06/gf180/sW1.5_sL1.5/qualification.json | 107 + .../cases/C06/gf180/sW1.5_sL1.5/specs.json | 23 + .../cases/C06/gf180/sW1.5_sL1.5/target.spice | 6 + .../C06/gf180/sW1.5_sL1.5/target_lvs.spice | 38 + .../C06/gf180/sW1.5_sL1.5/testbench.spice | 31 + .../data/cases/C06/gf180/sW1.5_sL1/case.json | 163 + .../cases/C06/gf180/sW1.5_sL1/manifest.json | 8 + .../C06/gf180/sW1.5_sL1/qualification.json | 107 + .../data/cases/C06/gf180/sW1.5_sL1/specs.json | 23 + .../cases/C06/gf180/sW1.5_sL1/target.spice | 6 + .../C06/gf180/sW1.5_sL1/target_lvs.spice | 38 + .../cases/C06/gf180/sW1.5_sL1/testbench.spice | 31 + .../data/cases/C06/gf180/sW1.5_sL2/case.json | 163 + .../cases/C06/gf180/sW1.5_sL2/manifest.json | 8 + .../C06/gf180/sW1.5_sL2/qualification.json | 107 + .../data/cases/C06/gf180/sW1.5_sL2/specs.json | 23 + .../cases/C06/gf180/sW1.5_sL2/target.spice | 6 + .../C06/gf180/sW1.5_sL2/target_lvs.spice | 38 + .../cases/C06/gf180/sW1.5_sL2/testbench.spice | 31 + .../data/cases/C06/gf180/sW1_sL1.5/case.json | 163 + .../cases/C06/gf180/sW1_sL1.5/manifest.json | 8 + .../C06/gf180/sW1_sL1.5/qualification.json | 107 + .../data/cases/C06/gf180/sW1_sL1.5/specs.json | 23 + .../cases/C06/gf180/sW1_sL1.5/target.spice | 6 + .../C06/gf180/sW1_sL1.5/target_lvs.spice | 26 + .../cases/C06/gf180/sW1_sL1.5/testbench.spice | 31 + .../data/cases/C06/gf180/sW1_sL1/case.json | 163 + .../cases/C06/gf180/sW1_sL1/manifest.json | 8 + .../C06/gf180/sW1_sL1/qualification.json | 107 + .../data/cases/C06/gf180/sW1_sL1/specs.json | 23 + .../data/cases/C06/gf180/sW1_sL1/target.spice | 6 + .../cases/C06/gf180/sW1_sL1/target_lvs.spice | 26 + .../cases/C06/gf180/sW1_sL1/testbench.spice | 31 + .../data/cases/C06/gf180/sW1_sL2/case.json | 163 + .../cases/C06/gf180/sW1_sL2/manifest.json | 8 + .../C06/gf180/sW1_sL2/qualification.json | 107 + .../data/cases/C06/gf180/sW1_sL2/specs.json | 23 + .../data/cases/C06/gf180/sW1_sL2/target.spice | 6 + .../cases/C06/gf180/sW1_sL2/target_lvs.spice | 26 + .../cases/C06/gf180/sW1_sL2/testbench.spice | 31 + .../data/cases/C06/gf180/sW2_sL1.5/case.json | 163 + .../cases/C06/gf180/sW2_sL1.5/manifest.json | 8 + .../C06/gf180/sW2_sL1.5/qualification.json | 107 + .../data/cases/C06/gf180/sW2_sL1.5/specs.json | 23 + .../cases/C06/gf180/sW2_sL1.5/target.spice | 6 + .../C06/gf180/sW2_sL1.5/target_lvs.spice | 50 + .../cases/C06/gf180/sW2_sL1.5/testbench.spice | 31 + .../data/cases/C06/gf180/sW2_sL1/case.json | 163 + .../cases/C06/gf180/sW2_sL1/manifest.json | 8 + .../C06/gf180/sW2_sL1/qualification.json | 107 + .../data/cases/C06/gf180/sW2_sL1/specs.json | 23 + .../data/cases/C06/gf180/sW2_sL1/target.spice | 6 + .../cases/C06/gf180/sW2_sL1/target_lvs.spice | 50 + .../cases/C06/gf180/sW2_sL1/testbench.spice | 31 + .../data/cases/C06/gf180/sW2_sL2/case.json | 163 + .../cases/C06/gf180/sW2_sL2/manifest.json | 8 + .../C06/gf180/sW2_sL2/qualification.json | 107 + .../data/cases/C06/gf180/sW2_sL2/specs.json | 23 + .../data/cases/C06/gf180/sW2_sL2/target.spice | 6 + .../cases/C06/gf180/sW2_sL2/target_lvs.spice | 50 + .../cases/C06/gf180/sW2_sL2/testbench.spice | 31 + .../cases/C06/ihp130/sW0.5_sL1.5/case.json | 163 + .../C06/ihp130/sW0.5_sL1.5/manifest.json | 8 + .../C06/ihp130/sW0.5_sL1.5/qualification.json | 107 + .../cases/C06/ihp130/sW0.5_sL1.5/specs.json | 23 + .../cases/C06/ihp130/sW0.5_sL1.5/target.spice | 6 + .../C06/ihp130/sW0.5_sL1.5/target_lvs.spice | 14 + .../C06/ihp130/sW0.5_sL1.5/testbench.spice | 31 + .../data/cases/C06/ihp130/sW0.5_sL1/case.json | 163 + .../cases/C06/ihp130/sW0.5_sL1/manifest.json | 8 + .../C06/ihp130/sW0.5_sL1/qualification.json | 107 + .../cases/C06/ihp130/sW0.5_sL1/specs.json | 23 + .../cases/C06/ihp130/sW0.5_sL1/target.spice | 6 + .../C06/ihp130/sW0.5_sL1/target_lvs.spice | 14 + .../C06/ihp130/sW0.5_sL1/testbench.spice | 31 + .../data/cases/C06/ihp130/sW0.5_sL2/case.json | 163 + .../cases/C06/ihp130/sW0.5_sL2/manifest.json | 8 + .../C06/ihp130/sW0.5_sL2/qualification.json | 107 + .../cases/C06/ihp130/sW0.5_sL2/specs.json | 23 + .../cases/C06/ihp130/sW0.5_sL2/target.spice | 6 + .../C06/ihp130/sW0.5_sL2/target_lvs.spice | 14 + .../C06/ihp130/sW0.5_sL2/testbench.spice | 31 + .../cases/C06/ihp130/sW1.5_sL1.5/case.json | 163 + .../C06/ihp130/sW1.5_sL1.5/manifest.json | 8 + .../C06/ihp130/sW1.5_sL1.5/qualification.json | 107 + .../cases/C06/ihp130/sW1.5_sL1.5/specs.json | 23 + .../cases/C06/ihp130/sW1.5_sL1.5/target.spice | 6 + .../C06/ihp130/sW1.5_sL1.5/target_lvs.spice | 38 + .../C06/ihp130/sW1.5_sL1.5/testbench.spice | 31 + .../data/cases/C06/ihp130/sW1.5_sL1/case.json | 163 + .../cases/C06/ihp130/sW1.5_sL1/manifest.json | 8 + .../C06/ihp130/sW1.5_sL1/qualification.json | 107 + .../cases/C06/ihp130/sW1.5_sL1/specs.json | 23 + .../cases/C06/ihp130/sW1.5_sL1/target.spice | 6 + .../C06/ihp130/sW1.5_sL1/target_lvs.spice | 38 + .../C06/ihp130/sW1.5_sL1/testbench.spice | 31 + .../data/cases/C06/ihp130/sW1.5_sL2/case.json | 163 + .../cases/C06/ihp130/sW1.5_sL2/manifest.json | 8 + .../C06/ihp130/sW1.5_sL2/qualification.json | 107 + .../cases/C06/ihp130/sW1.5_sL2/specs.json | 23 + .../cases/C06/ihp130/sW1.5_sL2/target.spice | 6 + .../C06/ihp130/sW1.5_sL2/target_lvs.spice | 38 + .../C06/ihp130/sW1.5_sL2/testbench.spice | 31 + .../data/cases/C06/ihp130/sW1_sL1.5/case.json | 163 + .../cases/C06/ihp130/sW1_sL1.5/manifest.json | 8 + .../C06/ihp130/sW1_sL1.5/qualification.json | 107 + .../cases/C06/ihp130/sW1_sL1.5/specs.json | 23 + .../cases/C06/ihp130/sW1_sL1.5/target.spice | 6 + .../C06/ihp130/sW1_sL1.5/target_lvs.spice | 26 + .../C06/ihp130/sW1_sL1.5/testbench.spice | 31 + .../data/cases/C06/ihp130/sW1_sL1/case.json | 163 + .../cases/C06/ihp130/sW1_sL1/manifest.json | 8 + .../C06/ihp130/sW1_sL1/qualification.json | 107 + .../data/cases/C06/ihp130/sW1_sL1/specs.json | 23 + .../cases/C06/ihp130/sW1_sL1/target.spice | 6 + .../cases/C06/ihp130/sW1_sL1/target_lvs.spice | 26 + .../cases/C06/ihp130/sW1_sL1/testbench.spice | 31 + .../data/cases/C06/ihp130/sW1_sL2/case.json | 163 + .../cases/C06/ihp130/sW1_sL2/manifest.json | 8 + .../C06/ihp130/sW1_sL2/qualification.json | 107 + .../data/cases/C06/ihp130/sW1_sL2/specs.json | 23 + .../cases/C06/ihp130/sW1_sL2/target.spice | 6 + .../cases/C06/ihp130/sW1_sL2/target_lvs.spice | 26 + .../cases/C06/ihp130/sW1_sL2/testbench.spice | 31 + .../data/cases/C06/ihp130/sW2_sL1.5/case.json | 163 + .../cases/C06/ihp130/sW2_sL1.5/manifest.json | 8 + .../C06/ihp130/sW2_sL1.5/qualification.json | 107 + .../cases/C06/ihp130/sW2_sL1.5/specs.json | 23 + .../cases/C06/ihp130/sW2_sL1.5/target.spice | 6 + .../C06/ihp130/sW2_sL1.5/target_lvs.spice | 50 + .../C06/ihp130/sW2_sL1.5/testbench.spice | 31 + .../data/cases/C06/ihp130/sW2_sL1/case.json | 163 + .../cases/C06/ihp130/sW2_sL1/manifest.json | 8 + .../C06/ihp130/sW2_sL1/qualification.json | 107 + .../data/cases/C06/ihp130/sW2_sL1/specs.json | 23 + .../cases/C06/ihp130/sW2_sL1/target.spice | 6 + .../cases/C06/ihp130/sW2_sL1/target_lvs.spice | 50 + .../cases/C06/ihp130/sW2_sL1/testbench.spice | 31 + .../data/cases/C06/ihp130/sW2_sL2/case.json | 163 + .../cases/C06/ihp130/sW2_sL2/manifest.json | 8 + .../C06/ihp130/sW2_sL2/qualification.json | 107 + .../data/cases/C06/ihp130/sW2_sL2/specs.json | 23 + .../cases/C06/ihp130/sW2_sL2/target.spice | 6 + .../cases/C06/ihp130/sW2_sL2/target_lvs.spice | 50 + .../cases/C06/ihp130/sW2_sL2/testbench.spice | 31 + .../cases/C06/sky130/sW0.5_sL1.5/case.json | 163 + .../C06/sky130/sW0.5_sL1.5/manifest.json | 8 + .../C06/sky130/sW0.5_sL1.5/qualification.json | 107 + .../cases/C06/sky130/sW0.5_sL1.5/specs.json | 23 + .../cases/C06/sky130/sW0.5_sL1.5/target.spice | 6 + .../C06/sky130/sW0.5_sL1.5/target_lvs.spice | 14 + .../C06/sky130/sW0.5_sL1.5/testbench.spice | 31 + .../data/cases/C06/sky130/sW0.5_sL1/case.json | 163 + .../cases/C06/sky130/sW0.5_sL1/manifest.json | 8 + .../C06/sky130/sW0.5_sL1/qualification.json | 107 + .../cases/C06/sky130/sW0.5_sL1/specs.json | 23 + .../cases/C06/sky130/sW0.5_sL1/target.spice | 6 + .../C06/sky130/sW0.5_sL1/target_lvs.spice | 14 + .../C06/sky130/sW0.5_sL1/testbench.spice | 31 + .../data/cases/C06/sky130/sW0.5_sL2/case.json | 163 + .../cases/C06/sky130/sW0.5_sL2/manifest.json | 8 + .../C06/sky130/sW0.5_sL2/qualification.json | 109 + .../cases/C06/sky130/sW0.5_sL2/specs.json | 23 + .../cases/C06/sky130/sW0.5_sL2/target.spice | 6 + .../C06/sky130/sW0.5_sL2/target_lvs.spice | 14 + .../C06/sky130/sW0.5_sL2/testbench.spice | 31 + .../cases/C06/sky130/sW1.5_sL1.5/case.json | 163 + .../C06/sky130/sW1.5_sL1.5/manifest.json | 8 + .../C06/sky130/sW1.5_sL1.5/qualification.json | 107 + .../cases/C06/sky130/sW1.5_sL1.5/specs.json | 23 + .../cases/C06/sky130/sW1.5_sL1.5/target.spice | 6 + .../C06/sky130/sW1.5_sL1.5/target_lvs.spice | 38 + .../C06/sky130/sW1.5_sL1.5/testbench.spice | 31 + .../data/cases/C06/sky130/sW1.5_sL1/case.json | 163 + .../cases/C06/sky130/sW1.5_sL1/manifest.json | 8 + .../C06/sky130/sW1.5_sL1/qualification.json | 109 + .../cases/C06/sky130/sW1.5_sL1/specs.json | 23 + .../cases/C06/sky130/sW1.5_sL1/target.spice | 6 + .../C06/sky130/sW1.5_sL1/target_lvs.spice | 38 + .../C06/sky130/sW1.5_sL1/testbench.spice | 31 + .../data/cases/C06/sky130/sW1.5_sL2/case.json | 163 + .../cases/C06/sky130/sW1.5_sL2/manifest.json | 8 + .../C06/sky130/sW1.5_sL2/qualification.json | 107 + .../cases/C06/sky130/sW1.5_sL2/specs.json | 23 + .../cases/C06/sky130/sW1.5_sL2/target.spice | 6 + .../C06/sky130/sW1.5_sL2/target_lvs.spice | 38 + .../C06/sky130/sW1.5_sL2/testbench.spice | 31 + .../data/cases/C06/sky130/sW1_sL1.5/case.json | 163 + .../cases/C06/sky130/sW1_sL1.5/manifest.json | 8 + .../C06/sky130/sW1_sL1.5/qualification.json | 107 + .../cases/C06/sky130/sW1_sL1.5/specs.json | 23 + .../cases/C06/sky130/sW1_sL1.5/target.spice | 6 + .../C06/sky130/sW1_sL1.5/target_lvs.spice | 26 + .../C06/sky130/sW1_sL1.5/testbench.spice | 31 + .../data/cases/C06/sky130/sW1_sL1/case.json | 163 + .../cases/C06/sky130/sW1_sL1/manifest.json | 8 + .../C06/sky130/sW1_sL1/qualification.json | 107 + .../data/cases/C06/sky130/sW1_sL1/specs.json | 23 + .../cases/C06/sky130/sW1_sL1/target.spice | 6 + .../cases/C06/sky130/sW1_sL1/target_lvs.spice | 26 + .../cases/C06/sky130/sW1_sL1/testbench.spice | 31 + .../data/cases/C06/sky130/sW1_sL2/case.json | 163 + .../cases/C06/sky130/sW1_sL2/manifest.json | 8 + .../C06/sky130/sW1_sL2/qualification.json | 107 + .../data/cases/C06/sky130/sW1_sL2/specs.json | 23 + .../cases/C06/sky130/sW1_sL2/target.spice | 6 + .../cases/C06/sky130/sW1_sL2/target_lvs.spice | 26 + .../cases/C06/sky130/sW1_sL2/testbench.spice | 31 + .../data/cases/C06/sky130/sW2_sL1.5/case.json | 163 + .../cases/C06/sky130/sW2_sL1.5/manifest.json | 8 + .../C06/sky130/sW2_sL1.5/qualification.json | 109 + .../cases/C06/sky130/sW2_sL1.5/specs.json | 23 + .../cases/C06/sky130/sW2_sL1.5/target.spice | 6 + .../C06/sky130/sW2_sL1.5/target_lvs.spice | 50 + .../C06/sky130/sW2_sL1.5/testbench.spice | 31 + .../data/cases/C06/sky130/sW2_sL1/case.json | 163 + .../cases/C06/sky130/sW2_sL1/manifest.json | 8 + .../C06/sky130/sW2_sL1/qualification.json | 109 + .../data/cases/C06/sky130/sW2_sL1/specs.json | 23 + .../cases/C06/sky130/sW2_sL1/target.spice | 6 + .../cases/C06/sky130/sW2_sL1/target_lvs.spice | 50 + .../cases/C06/sky130/sW2_sL1/testbench.spice | 31 + .../data/cases/C06/sky130/sW2_sL2/case.json | 163 + .../cases/C06/sky130/sW2_sL2/manifest.json | 8 + .../C06/sky130/sW2_sL2/qualification.json | 109 + .../data/cases/C06/sky130/sW2_sL2/specs.json | 23 + .../cases/C06/sky130/sW2_sL2/target.spice | 6 + .../cases/C06/sky130/sW2_sL2/target_lvs.spice | 50 + .../cases/C06/sky130/sW2_sL2/testbench.spice | 31 + .../cases/C07/gf180/sW0.5_sL1.5/case.json | 156 + .../cases/C07/gf180/sW0.5_sL1.5/manifest.json | 8 + .../C07/gf180/sW0.5_sL1.5/qualification.json | 108 + .../cases/C07/gf180/sW0.5_sL1.5/specs.json | 23 + .../cases/C07/gf180/sW0.5_sL1.5/target.spice | 6 + .../C07/gf180/sW0.5_sL1.5/target_lvs.spice | 18 + .../C07/gf180/sW0.5_sL1.5/testbench.spice | 43 + .../data/cases/C07/gf180/sW0.5_sL1/case.json | 156 + .../cases/C07/gf180/sW0.5_sL1/manifest.json | 8 + .../C07/gf180/sW0.5_sL1/qualification.json | 108 + .../data/cases/C07/gf180/sW0.5_sL1/specs.json | 23 + .../cases/C07/gf180/sW0.5_sL1/target.spice | 6 + .../C07/gf180/sW0.5_sL1/target_lvs.spice | 18 + .../cases/C07/gf180/sW0.5_sL1/testbench.spice | 43 + .../data/cases/C07/gf180/sW0.5_sL2/case.json | 156 + .../cases/C07/gf180/sW0.5_sL2/manifest.json | 8 + .../C07/gf180/sW0.5_sL2/qualification.json | 108 + .../data/cases/C07/gf180/sW0.5_sL2/specs.json | 23 + .../cases/C07/gf180/sW0.5_sL2/target.spice | 6 + .../C07/gf180/sW0.5_sL2/target_lvs.spice | 18 + .../cases/C07/gf180/sW0.5_sL2/testbench.spice | 43 + .../cases/C07/gf180/sW1.5_sL1.5/case.json | 156 + .../cases/C07/gf180/sW1.5_sL1.5/manifest.json | 8 + .../C07/gf180/sW1.5_sL1.5/qualification.json | 108 + .../cases/C07/gf180/sW1.5_sL1.5/specs.json | 23 + .../cases/C07/gf180/sW1.5_sL1.5/target.spice | 6 + .../C07/gf180/sW1.5_sL1.5/target_lvs.spice | 50 + .../C07/gf180/sW1.5_sL1.5/testbench.spice | 43 + .../data/cases/C07/gf180/sW1.5_sL1/case.json | 156 + .../cases/C07/gf180/sW1.5_sL1/manifest.json | 8 + .../C07/gf180/sW1.5_sL1/qualification.json | 108 + .../data/cases/C07/gf180/sW1.5_sL1/specs.json | 23 + .../cases/C07/gf180/sW1.5_sL1/target.spice | 6 + .../C07/gf180/sW1.5_sL1/target_lvs.spice | 50 + .../cases/C07/gf180/sW1.5_sL1/testbench.spice | 43 + .../data/cases/C07/gf180/sW1.5_sL2/case.json | 156 + .../cases/C07/gf180/sW1.5_sL2/manifest.json | 8 + .../C07/gf180/sW1.5_sL2/qualification.json | 108 + .../data/cases/C07/gf180/sW1.5_sL2/specs.json | 23 + .../cases/C07/gf180/sW1.5_sL2/target.spice | 6 + .../C07/gf180/sW1.5_sL2/target_lvs.spice | 50 + .../cases/C07/gf180/sW1.5_sL2/testbench.spice | 43 + .../data/cases/C07/gf180/sW1_sL1.5/case.json | 156 + .../cases/C07/gf180/sW1_sL1.5/manifest.json | 8 + .../C07/gf180/sW1_sL1.5/qualification.json | 108 + .../data/cases/C07/gf180/sW1_sL1.5/specs.json | 23 + .../cases/C07/gf180/sW1_sL1.5/target.spice | 6 + .../C07/gf180/sW1_sL1.5/target_lvs.spice | 34 + .../cases/C07/gf180/sW1_sL1.5/testbench.spice | 43 + .../data/cases/C07/gf180/sW1_sL1/case.json | 156 + .../cases/C07/gf180/sW1_sL1/manifest.json | 8 + .../C07/gf180/sW1_sL1/qualification.json | 108 + .../data/cases/C07/gf180/sW1_sL1/specs.json | 23 + .../data/cases/C07/gf180/sW1_sL1/target.spice | 6 + .../cases/C07/gf180/sW1_sL1/target_lvs.spice | 34 + .../cases/C07/gf180/sW1_sL1/testbench.spice | 43 + .../data/cases/C07/gf180/sW1_sL2/case.json | 156 + .../cases/C07/gf180/sW1_sL2/manifest.json | 8 + .../C07/gf180/sW1_sL2/qualification.json | 108 + .../data/cases/C07/gf180/sW1_sL2/specs.json | 23 + .../data/cases/C07/gf180/sW1_sL2/target.spice | 6 + .../cases/C07/gf180/sW1_sL2/target_lvs.spice | 34 + .../cases/C07/gf180/sW1_sL2/testbench.spice | 43 + .../data/cases/C07/gf180/sW2_sL1.5/case.json | 156 + .../cases/C07/gf180/sW2_sL1.5/manifest.json | 8 + .../C07/gf180/sW2_sL1.5/qualification.json | 108 + .../data/cases/C07/gf180/sW2_sL1.5/specs.json | 23 + .../cases/C07/gf180/sW2_sL1.5/target.spice | 6 + .../C07/gf180/sW2_sL1.5/target_lvs.spice | 66 + .../cases/C07/gf180/sW2_sL1.5/testbench.spice | 43 + .../data/cases/C07/gf180/sW2_sL1/case.json | 156 + .../cases/C07/gf180/sW2_sL1/manifest.json | 8 + .../C07/gf180/sW2_sL1/qualification.json | 108 + .../data/cases/C07/gf180/sW2_sL1/specs.json | 23 + .../data/cases/C07/gf180/sW2_sL1/target.spice | 6 + .../cases/C07/gf180/sW2_sL1/target_lvs.spice | 66 + .../cases/C07/gf180/sW2_sL1/testbench.spice | 43 + .../data/cases/C07/gf180/sW2_sL2/case.json | 156 + .../cases/C07/gf180/sW2_sL2/manifest.json | 8 + .../C07/gf180/sW2_sL2/qualification.json | 108 + .../data/cases/C07/gf180/sW2_sL2/specs.json | 23 + .../data/cases/C07/gf180/sW2_sL2/target.spice | 6 + .../cases/C07/gf180/sW2_sL2/target_lvs.spice | 66 + .../cases/C07/gf180/sW2_sL2/testbench.spice | 43 + .../cases/C07/ihp130/sW0.5_sL1.5/case.json | 156 + .../C07/ihp130/sW0.5_sL1.5/manifest.json | 8 + .../C07/ihp130/sW0.5_sL1.5/qualification.json | 108 + .../cases/C07/ihp130/sW0.5_sL1.5/specs.json | 23 + .../cases/C07/ihp130/sW0.5_sL1.5/target.spice | 6 + .../C07/ihp130/sW0.5_sL1.5/target_lvs.spice | 18 + .../C07/ihp130/sW0.5_sL1.5/testbench.spice | 43 + .../data/cases/C07/ihp130/sW0.5_sL1/case.json | 156 + .../cases/C07/ihp130/sW0.5_sL1/manifest.json | 8 + .../C07/ihp130/sW0.5_sL1/qualification.json | 108 + .../cases/C07/ihp130/sW0.5_sL1/specs.json | 23 + .../cases/C07/ihp130/sW0.5_sL1/target.spice | 6 + .../C07/ihp130/sW0.5_sL1/target_lvs.spice | 18 + .../C07/ihp130/sW0.5_sL1/testbench.spice | 43 + .../data/cases/C07/ihp130/sW0.5_sL2/case.json | 156 + .../cases/C07/ihp130/sW0.5_sL2/manifest.json | 8 + .../C07/ihp130/sW0.5_sL2/qualification.json | 108 + .../cases/C07/ihp130/sW0.5_sL2/specs.json | 23 + .../cases/C07/ihp130/sW0.5_sL2/target.spice | 6 + .../C07/ihp130/sW0.5_sL2/target_lvs.spice | 18 + .../C07/ihp130/sW0.5_sL2/testbench.spice | 43 + .../cases/C07/ihp130/sW1.5_sL1.5/case.json | 156 + .../C07/ihp130/sW1.5_sL1.5/manifest.json | 8 + .../C07/ihp130/sW1.5_sL1.5/qualification.json | 108 + .../cases/C07/ihp130/sW1.5_sL1.5/specs.json | 23 + .../cases/C07/ihp130/sW1.5_sL1.5/target.spice | 6 + .../C07/ihp130/sW1.5_sL1.5/target_lvs.spice | 50 + .../C07/ihp130/sW1.5_sL1.5/testbench.spice | 43 + .../data/cases/C07/ihp130/sW1.5_sL1/case.json | 156 + .../cases/C07/ihp130/sW1.5_sL1/manifest.json | 8 + .../C07/ihp130/sW1.5_sL1/qualification.json | 108 + .../cases/C07/ihp130/sW1.5_sL1/specs.json | 23 + .../cases/C07/ihp130/sW1.5_sL1/target.spice | 6 + .../C07/ihp130/sW1.5_sL1/target_lvs.spice | 50 + .../C07/ihp130/sW1.5_sL1/testbench.spice | 43 + .../data/cases/C07/ihp130/sW1.5_sL2/case.json | 156 + .../cases/C07/ihp130/sW1.5_sL2/manifest.json | 8 + .../C07/ihp130/sW1.5_sL2/qualification.json | 108 + .../cases/C07/ihp130/sW1.5_sL2/specs.json | 23 + .../cases/C07/ihp130/sW1.5_sL2/target.spice | 6 + .../C07/ihp130/sW1.5_sL2/target_lvs.spice | 50 + .../C07/ihp130/sW1.5_sL2/testbench.spice | 43 + .../data/cases/C07/ihp130/sW1_sL1.5/case.json | 156 + .../cases/C07/ihp130/sW1_sL1.5/manifest.json | 8 + .../C07/ihp130/sW1_sL1.5/qualification.json | 108 + .../cases/C07/ihp130/sW1_sL1.5/specs.json | 23 + .../cases/C07/ihp130/sW1_sL1.5/target.spice | 6 + .../C07/ihp130/sW1_sL1.5/target_lvs.spice | 34 + .../C07/ihp130/sW1_sL1.5/testbench.spice | 43 + .../data/cases/C07/ihp130/sW1_sL1/case.json | 156 + .../cases/C07/ihp130/sW1_sL1/manifest.json | 8 + .../C07/ihp130/sW1_sL1/qualification.json | 108 + .../data/cases/C07/ihp130/sW1_sL1/specs.json | 23 + .../cases/C07/ihp130/sW1_sL1/target.spice | 6 + .../cases/C07/ihp130/sW1_sL1/target_lvs.spice | 34 + .../cases/C07/ihp130/sW1_sL1/testbench.spice | 43 + .../data/cases/C07/ihp130/sW1_sL2/case.json | 156 + .../cases/C07/ihp130/sW1_sL2/manifest.json | 8 + .../C07/ihp130/sW1_sL2/qualification.json | 108 + .../data/cases/C07/ihp130/sW1_sL2/specs.json | 23 + .../cases/C07/ihp130/sW1_sL2/target.spice | 6 + .../cases/C07/ihp130/sW1_sL2/target_lvs.spice | 34 + .../cases/C07/ihp130/sW1_sL2/testbench.spice | 43 + .../data/cases/C07/ihp130/sW2_sL1.5/case.json | 156 + .../cases/C07/ihp130/sW2_sL1.5/manifest.json | 8 + .../C07/ihp130/sW2_sL1.5/qualification.json | 108 + .../cases/C07/ihp130/sW2_sL1.5/specs.json | 23 + .../cases/C07/ihp130/sW2_sL1.5/target.spice | 6 + .../C07/ihp130/sW2_sL1.5/target_lvs.spice | 66 + .../C07/ihp130/sW2_sL1.5/testbench.spice | 43 + .../data/cases/C07/ihp130/sW2_sL1/case.json | 156 + .../cases/C07/ihp130/sW2_sL1/manifest.json | 8 + .../C07/ihp130/sW2_sL1/qualification.json | 108 + .../data/cases/C07/ihp130/sW2_sL1/specs.json | 23 + .../cases/C07/ihp130/sW2_sL1/target.spice | 6 + .../cases/C07/ihp130/sW2_sL1/target_lvs.spice | 66 + .../cases/C07/ihp130/sW2_sL1/testbench.spice | 43 + .../data/cases/C07/ihp130/sW2_sL2/case.json | 156 + .../cases/C07/ihp130/sW2_sL2/manifest.json | 8 + .../C07/ihp130/sW2_sL2/qualification.json | 108 + .../data/cases/C07/ihp130/sW2_sL2/specs.json | 23 + .../cases/C07/ihp130/sW2_sL2/target.spice | 6 + .../cases/C07/ihp130/sW2_sL2/target_lvs.spice | 66 + .../cases/C07/ihp130/sW2_sL2/testbench.spice | 43 + .../cases/C07/sky130/sW0.5_sL1.5/case.json | 156 + .../C07/sky130/sW0.5_sL1.5/manifest.json | 8 + .../C07/sky130/sW0.5_sL1.5/qualification.json | 108 + .../cases/C07/sky130/sW0.5_sL1.5/specs.json | 23 + .../cases/C07/sky130/sW0.5_sL1.5/target.spice | 6 + .../C07/sky130/sW0.5_sL1.5/target_lvs.spice | 18 + .../C07/sky130/sW0.5_sL1.5/testbench.spice | 43 + .../data/cases/C07/sky130/sW0.5_sL1/case.json | 156 + .../cases/C07/sky130/sW0.5_sL1/manifest.json | 8 + .../C07/sky130/sW0.5_sL1/qualification.json | 108 + .../cases/C07/sky130/sW0.5_sL1/specs.json | 23 + .../cases/C07/sky130/sW0.5_sL1/target.spice | 6 + .../C07/sky130/sW0.5_sL1/target_lvs.spice | 18 + .../C07/sky130/sW0.5_sL1/testbench.spice | 43 + .../data/cases/C07/sky130/sW0.5_sL2/case.json | 156 + .../cases/C07/sky130/sW0.5_sL2/manifest.json | 8 + .../C07/sky130/sW0.5_sL2/qualification.json | 108 + .../cases/C07/sky130/sW0.5_sL2/specs.json | 23 + .../cases/C07/sky130/sW0.5_sL2/target.spice | 6 + .../C07/sky130/sW0.5_sL2/target_lvs.spice | 18 + .../C07/sky130/sW0.5_sL2/testbench.spice | 43 + .../cases/C07/sky130/sW1.5_sL1.5/case.json | 156 + .../C07/sky130/sW1.5_sL1.5/manifest.json | 8 + .../C07/sky130/sW1.5_sL1.5/qualification.json | 108 + .../cases/C07/sky130/sW1.5_sL1.5/specs.json | 23 + .../cases/C07/sky130/sW1.5_sL1.5/target.spice | 6 + .../C07/sky130/sW1.5_sL1.5/target_lvs.spice | 50 + .../C07/sky130/sW1.5_sL1.5/testbench.spice | 43 + .../data/cases/C07/sky130/sW1.5_sL1/case.json | 156 + .../cases/C07/sky130/sW1.5_sL1/manifest.json | 8 + .../C07/sky130/sW1.5_sL1/qualification.json | 108 + .../cases/C07/sky130/sW1.5_sL1/specs.json | 23 + .../cases/C07/sky130/sW1.5_sL1/target.spice | 6 + .../C07/sky130/sW1.5_sL1/target_lvs.spice | 50 + .../C07/sky130/sW1.5_sL1/testbench.spice | 43 + .../data/cases/C07/sky130/sW1.5_sL2/case.json | 156 + .../cases/C07/sky130/sW1.5_sL2/manifest.json | 8 + .../C07/sky130/sW1.5_sL2/qualification.json | 108 + .../cases/C07/sky130/sW1.5_sL2/specs.json | 23 + .../cases/C07/sky130/sW1.5_sL2/target.spice | 6 + .../C07/sky130/sW1.5_sL2/target_lvs.spice | 50 + .../C07/sky130/sW1.5_sL2/testbench.spice | 43 + .../data/cases/C07/sky130/sW1_sL1.5/case.json | 156 + .../cases/C07/sky130/sW1_sL1.5/manifest.json | 8 + .../C07/sky130/sW1_sL1.5/qualification.json | 108 + .../cases/C07/sky130/sW1_sL1.5/specs.json | 23 + .../cases/C07/sky130/sW1_sL1.5/target.spice | 6 + .../C07/sky130/sW1_sL1.5/target_lvs.spice | 34 + .../C07/sky130/sW1_sL1.5/testbench.spice | 43 + .../data/cases/C07/sky130/sW1_sL1/case.json | 156 + .../cases/C07/sky130/sW1_sL1/manifest.json | 8 + .../C07/sky130/sW1_sL1/qualification.json | 108 + .../data/cases/C07/sky130/sW1_sL1/specs.json | 23 + .../cases/C07/sky130/sW1_sL1/target.spice | 6 + .../cases/C07/sky130/sW1_sL1/target_lvs.spice | 34 + .../cases/C07/sky130/sW1_sL1/testbench.spice | 43 + .../data/cases/C07/sky130/sW1_sL2/case.json | 156 + .../cases/C07/sky130/sW1_sL2/manifest.json | 8 + .../C07/sky130/sW1_sL2/qualification.json | 108 + .../data/cases/C07/sky130/sW1_sL2/specs.json | 23 + .../cases/C07/sky130/sW1_sL2/target.spice | 6 + .../cases/C07/sky130/sW1_sL2/target_lvs.spice | 34 + .../cases/C07/sky130/sW1_sL2/testbench.spice | 43 + .../data/cases/C07/sky130/sW2_sL1.5/case.json | 156 + .../cases/C07/sky130/sW2_sL1.5/manifest.json | 8 + .../C07/sky130/sW2_sL1.5/qualification.json | 108 + .../cases/C07/sky130/sW2_sL1.5/specs.json | 23 + .../cases/C07/sky130/sW2_sL1.5/target.spice | 6 + .../C07/sky130/sW2_sL1.5/target_lvs.spice | 66 + .../C07/sky130/sW2_sL1.5/testbench.spice | 43 + .../data/cases/C07/sky130/sW2_sL1/case.json | 156 + .../cases/C07/sky130/sW2_sL1/manifest.json | 8 + .../C07/sky130/sW2_sL1/qualification.json | 108 + .../data/cases/C07/sky130/sW2_sL1/specs.json | 23 + .../cases/C07/sky130/sW2_sL1/target.spice | 6 + .../cases/C07/sky130/sW2_sL1/target_lvs.spice | 66 + .../cases/C07/sky130/sW2_sL1/testbench.spice | 43 + .../data/cases/C07/sky130/sW2_sL2/case.json | 156 + .../cases/C07/sky130/sW2_sL2/manifest.json | 8 + .../C07/sky130/sW2_sL2/qualification.json | 108 + .../data/cases/C07/sky130/sW2_sL2/specs.json | 23 + .../cases/C07/sky130/sW2_sL2/target.spice | 6 + .../cases/C07/sky130/sW2_sL2/target_lvs.spice | 66 + .../cases/C07/sky130/sW2_sL2/testbench.spice | 43 + .../cases/C08/gf180/sW0.5_sL1.5/case.json | 162 + .../cases/C08/gf180/sW0.5_sL1.5/manifest.json | 8 + .../C08/gf180/sW0.5_sL1.5/qualification.json | 122 + .../cases/C08/gf180/sW0.5_sL1.5/specs.json | 23 + .../cases/C08/gf180/sW0.5_sL1.5/target.spice | 7 + .../C08/gf180/sW0.5_sL1.5/target_lvs.spice | 18 + .../C08/gf180/sW0.5_sL1.5/testbench.spice | 36 + .../data/cases/C08/gf180/sW0.5_sL1/case.json | 162 + .../cases/C08/gf180/sW0.5_sL1/manifest.json | 8 + .../C08/gf180/sW0.5_sL1/qualification.json | 122 + .../data/cases/C08/gf180/sW0.5_sL1/specs.json | 23 + .../cases/C08/gf180/sW0.5_sL1/target.spice | 7 + .../C08/gf180/sW0.5_sL1/target_lvs.spice | 18 + .../cases/C08/gf180/sW0.5_sL1/testbench.spice | 36 + .../data/cases/C08/gf180/sW0.5_sL2/case.json | 162 + .../cases/C08/gf180/sW0.5_sL2/manifest.json | 8 + .../C08/gf180/sW0.5_sL2/qualification.json | 122 + .../data/cases/C08/gf180/sW0.5_sL2/specs.json | 23 + .../cases/C08/gf180/sW0.5_sL2/target.spice | 7 + .../C08/gf180/sW0.5_sL2/target_lvs.spice | 18 + .../cases/C08/gf180/sW0.5_sL2/testbench.spice | 36 + .../cases/C08/gf180/sW1.5_sL1.5/case.json | 162 + .../cases/C08/gf180/sW1.5_sL1.5/manifest.json | 8 + .../C08/gf180/sW1.5_sL1.5/qualification.json | 122 + .../cases/C08/gf180/sW1.5_sL1.5/specs.json | 23 + .../cases/C08/gf180/sW1.5_sL1.5/target.spice | 7 + .../C08/gf180/sW1.5_sL1.5/target_lvs.spice | 50 + .../C08/gf180/sW1.5_sL1.5/testbench.spice | 36 + .../data/cases/C08/gf180/sW1.5_sL1/case.json | 162 + .../cases/C08/gf180/sW1.5_sL1/manifest.json | 8 + .../C08/gf180/sW1.5_sL1/qualification.json | 122 + .../data/cases/C08/gf180/sW1.5_sL1/specs.json | 23 + .../cases/C08/gf180/sW1.5_sL1/target.spice | 7 + .../C08/gf180/sW1.5_sL1/target_lvs.spice | 50 + .../cases/C08/gf180/sW1.5_sL1/testbench.spice | 36 + .../data/cases/C08/gf180/sW1.5_sL2/case.json | 162 + .../cases/C08/gf180/sW1.5_sL2/manifest.json | 8 + .../C08/gf180/sW1.5_sL2/qualification.json | 122 + .../data/cases/C08/gf180/sW1.5_sL2/specs.json | 23 + .../cases/C08/gf180/sW1.5_sL2/target.spice | 7 + .../C08/gf180/sW1.5_sL2/target_lvs.spice | 50 + .../cases/C08/gf180/sW1.5_sL2/testbench.spice | 36 + .../data/cases/C08/gf180/sW1_sL1.5/case.json | 162 + .../cases/C08/gf180/sW1_sL1.5/manifest.json | 8 + .../C08/gf180/sW1_sL1.5/qualification.json | 122 + .../data/cases/C08/gf180/sW1_sL1.5/specs.json | 23 + .../cases/C08/gf180/sW1_sL1.5/target.spice | 7 + .../C08/gf180/sW1_sL1.5/target_lvs.spice | 34 + .../cases/C08/gf180/sW1_sL1.5/testbench.spice | 36 + .../data/cases/C08/gf180/sW1_sL1/case.json | 162 + .../cases/C08/gf180/sW1_sL1/manifest.json | 8 + .../C08/gf180/sW1_sL1/qualification.json | 122 + .../data/cases/C08/gf180/sW1_sL1/specs.json | 23 + .../data/cases/C08/gf180/sW1_sL1/target.spice | 7 + .../cases/C08/gf180/sW1_sL1/target_lvs.spice | 34 + .../cases/C08/gf180/sW1_sL1/testbench.spice | 36 + .../data/cases/C08/gf180/sW1_sL2/case.json | 162 + .../cases/C08/gf180/sW1_sL2/manifest.json | 8 + .../C08/gf180/sW1_sL2/qualification.json | 122 + .../data/cases/C08/gf180/sW1_sL2/specs.json | 23 + .../data/cases/C08/gf180/sW1_sL2/target.spice | 7 + .../cases/C08/gf180/sW1_sL2/target_lvs.spice | 34 + .../cases/C08/gf180/sW1_sL2/testbench.spice | 36 + .../data/cases/C08/gf180/sW2_sL1.5/case.json | 162 + .../cases/C08/gf180/sW2_sL1.5/manifest.json | 8 + .../C08/gf180/sW2_sL1.5/qualification.json | 122 + .../data/cases/C08/gf180/sW2_sL1.5/specs.json | 23 + .../cases/C08/gf180/sW2_sL1.5/target.spice | 7 + .../C08/gf180/sW2_sL1.5/target_lvs.spice | 66 + .../cases/C08/gf180/sW2_sL1.5/testbench.spice | 36 + .../data/cases/C08/gf180/sW2_sL1/case.json | 162 + .../cases/C08/gf180/sW2_sL1/manifest.json | 8 + .../C08/gf180/sW2_sL1/qualification.json | 122 + .../data/cases/C08/gf180/sW2_sL1/specs.json | 23 + .../data/cases/C08/gf180/sW2_sL1/target.spice | 7 + .../cases/C08/gf180/sW2_sL1/target_lvs.spice | 66 + .../cases/C08/gf180/sW2_sL1/testbench.spice | 36 + .../data/cases/C08/gf180/sW2_sL2/case.json | 162 + .../cases/C08/gf180/sW2_sL2/manifest.json | 8 + .../C08/gf180/sW2_sL2/qualification.json | 122 + .../data/cases/C08/gf180/sW2_sL2/specs.json | 23 + .../data/cases/C08/gf180/sW2_sL2/target.spice | 7 + .../cases/C08/gf180/sW2_sL2/target_lvs.spice | 66 + .../cases/C08/gf180/sW2_sL2/testbench.spice | 36 + .../cases/C08/ihp130/sW0.5_sL1.5/case.json | 162 + .../C08/ihp130/sW0.5_sL1.5/manifest.json | 8 + .../C08/ihp130/sW0.5_sL1.5/qualification.json | 122 + .../cases/C08/ihp130/sW0.5_sL1.5/specs.json | 23 + .../cases/C08/ihp130/sW0.5_sL1.5/target.spice | 7 + .../C08/ihp130/sW0.5_sL1.5/target_lvs.spice | 18 + .../C08/ihp130/sW0.5_sL1.5/testbench.spice | 36 + .../data/cases/C08/ihp130/sW0.5_sL1/case.json | 162 + .../cases/C08/ihp130/sW0.5_sL1/manifest.json | 8 + .../C08/ihp130/sW0.5_sL1/qualification.json | 124 + .../cases/C08/ihp130/sW0.5_sL1/specs.json | 23 + .../cases/C08/ihp130/sW0.5_sL1/target.spice | 7 + .../C08/ihp130/sW0.5_sL1/target_lvs.spice | 18 + .../C08/ihp130/sW0.5_sL1/testbench.spice | 36 + .../data/cases/C08/ihp130/sW0.5_sL2/case.json | 162 + .../cases/C08/ihp130/sW0.5_sL2/manifest.json | 8 + .../C08/ihp130/sW0.5_sL2/qualification.json | 122 + .../cases/C08/ihp130/sW0.5_sL2/specs.json | 23 + .../cases/C08/ihp130/sW0.5_sL2/target.spice | 7 + .../C08/ihp130/sW0.5_sL2/target_lvs.spice | 18 + .../C08/ihp130/sW0.5_sL2/testbench.spice | 36 + .../cases/C08/ihp130/sW1.5_sL1.5/case.json | 162 + .../C08/ihp130/sW1.5_sL1.5/manifest.json | 8 + .../C08/ihp130/sW1.5_sL1.5/qualification.json | 122 + .../cases/C08/ihp130/sW1.5_sL1.5/specs.json | 23 + .../cases/C08/ihp130/sW1.5_sL1.5/target.spice | 7 + .../C08/ihp130/sW1.5_sL1.5/target_lvs.spice | 50 + .../C08/ihp130/sW1.5_sL1.5/testbench.spice | 36 + .../data/cases/C08/ihp130/sW1.5_sL1/case.json | 162 + .../cases/C08/ihp130/sW1.5_sL1/manifest.json | 8 + .../C08/ihp130/sW1.5_sL1/qualification.json | 122 + .../cases/C08/ihp130/sW1.5_sL1/specs.json | 23 + .../cases/C08/ihp130/sW1.5_sL1/target.spice | 7 + .../C08/ihp130/sW1.5_sL1/target_lvs.spice | 50 + .../C08/ihp130/sW1.5_sL1/testbench.spice | 36 + .../data/cases/C08/ihp130/sW1.5_sL2/case.json | 162 + .../cases/C08/ihp130/sW1.5_sL2/manifest.json | 8 + .../C08/ihp130/sW1.5_sL2/qualification.json | 122 + .../cases/C08/ihp130/sW1.5_sL2/specs.json | 23 + .../cases/C08/ihp130/sW1.5_sL2/target.spice | 7 + .../C08/ihp130/sW1.5_sL2/target_lvs.spice | 50 + .../C08/ihp130/sW1.5_sL2/testbench.spice | 36 + .../data/cases/C08/ihp130/sW1_sL1.5/case.json | 162 + .../cases/C08/ihp130/sW1_sL1.5/manifest.json | 8 + .../C08/ihp130/sW1_sL1.5/qualification.json | 122 + .../cases/C08/ihp130/sW1_sL1.5/specs.json | 23 + .../cases/C08/ihp130/sW1_sL1.5/target.spice | 7 + .../C08/ihp130/sW1_sL1.5/target_lvs.spice | 34 + .../C08/ihp130/sW1_sL1.5/testbench.spice | 36 + .../data/cases/C08/ihp130/sW1_sL1/case.json | 162 + .../cases/C08/ihp130/sW1_sL1/manifest.json | 8 + .../C08/ihp130/sW1_sL1/qualification.json | 122 + .../data/cases/C08/ihp130/sW1_sL1/specs.json | 23 + .../cases/C08/ihp130/sW1_sL1/target.spice | 7 + .../cases/C08/ihp130/sW1_sL1/target_lvs.spice | 34 + .../cases/C08/ihp130/sW1_sL1/testbench.spice | 36 + .../data/cases/C08/ihp130/sW1_sL2/case.json | 162 + .../cases/C08/ihp130/sW1_sL2/manifest.json | 8 + .../C08/ihp130/sW1_sL2/qualification.json | 122 + .../data/cases/C08/ihp130/sW1_sL2/specs.json | 23 + .../cases/C08/ihp130/sW1_sL2/target.spice | 7 + .../cases/C08/ihp130/sW1_sL2/target_lvs.spice | 34 + .../cases/C08/ihp130/sW1_sL2/testbench.spice | 36 + .../data/cases/C08/ihp130/sW2_sL1.5/case.json | 162 + .../cases/C08/ihp130/sW2_sL1.5/manifest.json | 8 + .../C08/ihp130/sW2_sL1.5/qualification.json | 122 + .../cases/C08/ihp130/sW2_sL1.5/specs.json | 23 + .../cases/C08/ihp130/sW2_sL1.5/target.spice | 7 + .../C08/ihp130/sW2_sL1.5/target_lvs.spice | 66 + .../C08/ihp130/sW2_sL1.5/testbench.spice | 36 + .../data/cases/C08/ihp130/sW2_sL1/case.json | 162 + .../cases/C08/ihp130/sW2_sL1/manifest.json | 8 + .../C08/ihp130/sW2_sL1/qualification.json | 124 + .../data/cases/C08/ihp130/sW2_sL1/specs.json | 23 + .../cases/C08/ihp130/sW2_sL1/target.spice | 7 + .../cases/C08/ihp130/sW2_sL1/target_lvs.spice | 66 + .../cases/C08/ihp130/sW2_sL1/testbench.spice | 36 + .../data/cases/C08/ihp130/sW2_sL2/case.json | 162 + .../cases/C08/ihp130/sW2_sL2/manifest.json | 8 + .../C08/ihp130/sW2_sL2/qualification.json | 122 + .../data/cases/C08/ihp130/sW2_sL2/specs.json | 23 + .../cases/C08/ihp130/sW2_sL2/target.spice | 7 + .../cases/C08/ihp130/sW2_sL2/target_lvs.spice | 66 + .../cases/C08/ihp130/sW2_sL2/testbench.spice | 36 + .../cases/C08/sky130/sW0.5_sL1.5/case.json | 162 + .../C08/sky130/sW0.5_sL1.5/manifest.json | 8 + .../C08/sky130/sW0.5_sL1.5/qualification.json | 122 + .../cases/C08/sky130/sW0.5_sL1.5/specs.json | 23 + .../cases/C08/sky130/sW0.5_sL1.5/target.spice | 7 + .../C08/sky130/sW0.5_sL1.5/target_lvs.spice | 18 + .../C08/sky130/sW0.5_sL1.5/testbench.spice | 36 + .../data/cases/C08/sky130/sW0.5_sL1/case.json | 162 + .../cases/C08/sky130/sW0.5_sL1/manifest.json | 8 + .../C08/sky130/sW0.5_sL1/qualification.json | 122 + .../cases/C08/sky130/sW0.5_sL1/specs.json | 23 + .../cases/C08/sky130/sW0.5_sL1/target.spice | 7 + .../C08/sky130/sW0.5_sL1/target_lvs.spice | 18 + .../C08/sky130/sW0.5_sL1/testbench.spice | 36 + .../data/cases/C08/sky130/sW0.5_sL2/case.json | 162 + .../cases/C08/sky130/sW0.5_sL2/manifest.json | 8 + .../C08/sky130/sW0.5_sL2/qualification.json | 122 + .../cases/C08/sky130/sW0.5_sL2/specs.json | 23 + .../cases/C08/sky130/sW0.5_sL2/target.spice | 7 + .../C08/sky130/sW0.5_sL2/target_lvs.spice | 18 + .../C08/sky130/sW0.5_sL2/testbench.spice | 36 + .../cases/C08/sky130/sW1.5_sL1.5/case.json | 162 + .../C08/sky130/sW1.5_sL1.5/manifest.json | 8 + .../C08/sky130/sW1.5_sL1.5/qualification.json | 122 + .../cases/C08/sky130/sW1.5_sL1.5/specs.json | 23 + .../cases/C08/sky130/sW1.5_sL1.5/target.spice | 7 + .../C08/sky130/sW1.5_sL1.5/target_lvs.spice | 50 + .../C08/sky130/sW1.5_sL1.5/testbench.spice | 36 + .../data/cases/C08/sky130/sW1.5_sL1/case.json | 162 + .../cases/C08/sky130/sW1.5_sL1/manifest.json | 8 + .../C08/sky130/sW1.5_sL1/qualification.json | 122 + .../cases/C08/sky130/sW1.5_sL1/specs.json | 23 + .../cases/C08/sky130/sW1.5_sL1/target.spice | 7 + .../C08/sky130/sW1.5_sL1/target_lvs.spice | 50 + .../C08/sky130/sW1.5_sL1/testbench.spice | 36 + .../data/cases/C08/sky130/sW1.5_sL2/case.json | 162 + .../cases/C08/sky130/sW1.5_sL2/manifest.json | 8 + .../C08/sky130/sW1.5_sL2/qualification.json | 122 + .../cases/C08/sky130/sW1.5_sL2/specs.json | 23 + .../cases/C08/sky130/sW1.5_sL2/target.spice | 7 + .../C08/sky130/sW1.5_sL2/target_lvs.spice | 50 + .../C08/sky130/sW1.5_sL2/testbench.spice | 36 + .../data/cases/C08/sky130/sW1_sL1.5/case.json | 162 + .../cases/C08/sky130/sW1_sL1.5/manifest.json | 8 + .../C08/sky130/sW1_sL1.5/qualification.json | 122 + .../cases/C08/sky130/sW1_sL1.5/specs.json | 23 + .../cases/C08/sky130/sW1_sL1.5/target.spice | 7 + .../C08/sky130/sW1_sL1.5/target_lvs.spice | 34 + .../C08/sky130/sW1_sL1.5/testbench.spice | 36 + .../data/cases/C08/sky130/sW1_sL1/case.json | 162 + .../cases/C08/sky130/sW1_sL1/manifest.json | 8 + .../C08/sky130/sW1_sL1/qualification.json | 122 + .../data/cases/C08/sky130/sW1_sL1/specs.json | 23 + .../cases/C08/sky130/sW1_sL1/target.spice | 7 + .../cases/C08/sky130/sW1_sL1/target_lvs.spice | 34 + .../cases/C08/sky130/sW1_sL1/testbench.spice | 36 + .../data/cases/C08/sky130/sW1_sL2/case.json | 162 + .../cases/C08/sky130/sW1_sL2/manifest.json | 8 + .../C08/sky130/sW1_sL2/qualification.json | 122 + .../data/cases/C08/sky130/sW1_sL2/specs.json | 23 + .../cases/C08/sky130/sW1_sL2/target.spice | 7 + .../cases/C08/sky130/sW1_sL2/target_lvs.spice | 34 + .../cases/C08/sky130/sW1_sL2/testbench.spice | 36 + .../data/cases/C08/sky130/sW2_sL1.5/case.json | 162 + .../cases/C08/sky130/sW2_sL1.5/manifest.json | 8 + .../C08/sky130/sW2_sL1.5/qualification.json | 122 + .../cases/C08/sky130/sW2_sL1.5/specs.json | 23 + .../cases/C08/sky130/sW2_sL1.5/target.spice | 7 + .../C08/sky130/sW2_sL1.5/target_lvs.spice | 66 + .../C08/sky130/sW2_sL1.5/testbench.spice | 36 + .../data/cases/C08/sky130/sW2_sL1/case.json | 162 + .../cases/C08/sky130/sW2_sL1/manifest.json | 8 + .../C08/sky130/sW2_sL1/qualification.json | 122 + .../data/cases/C08/sky130/sW2_sL1/specs.json | 23 + .../cases/C08/sky130/sW2_sL1/target.spice | 7 + .../cases/C08/sky130/sW2_sL1/target_lvs.spice | 66 + .../cases/C08/sky130/sW2_sL1/testbench.spice | 36 + .../data/cases/C08/sky130/sW2_sL2/case.json | 162 + .../cases/C08/sky130/sW2_sL2/manifest.json | 8 + .../C08/sky130/sW2_sL2/qualification.json | 122 + .../data/cases/C08/sky130/sW2_sL2/specs.json | 23 + .../cases/C08/sky130/sW2_sL2/target.spice | 7 + .../cases/C08/sky130/sW2_sL2/target_lvs.spice | 66 + .../cases/C08/sky130/sW2_sL2/testbench.spice | 36 + .../cases/C09/gf180/sW0.5_sL1.5/case.json | 235 + .../cases/C09/gf180/sW0.5_sL1.5/manifest.json | 8 + .../C09/gf180/sW0.5_sL1.5/qualification.json | 156 + .../cases/C09/gf180/sW0.5_sL1.5/specs.json | 20 + .../cases/C09/gf180/sW0.5_sL1.5/target.spice | 10 + .../C09/gf180/sW0.5_sL1.5/target_lvs.spice | 34 + .../C09/gf180/sW0.5_sL1.5/testbench.spice | 42 + .../data/cases/C09/gf180/sW0.5_sL1/case.json | 235 + .../cases/C09/gf180/sW0.5_sL1/manifest.json | 8 + .../C09/gf180/sW0.5_sL1/qualification.json | 161 + .../data/cases/C09/gf180/sW0.5_sL1/specs.json | 23 + .../cases/C09/gf180/sW0.5_sL1/target.spice | 10 + .../C09/gf180/sW0.5_sL1/target_lvs.spice | 34 + .../cases/C09/gf180/sW0.5_sL1/testbench.spice | 42 + .../data/cases/C09/gf180/sW0.5_sL2/case.json | 235 + .../cases/C09/gf180/sW0.5_sL2/manifest.json | 8 + .../C09/gf180/sW0.5_sL2/qualification.json | 156 + .../data/cases/C09/gf180/sW0.5_sL2/specs.json | 20 + .../cases/C09/gf180/sW0.5_sL2/target.spice | 10 + .../C09/gf180/sW0.5_sL2/target_lvs.spice | 34 + .../cases/C09/gf180/sW0.5_sL2/testbench.spice | 42 + .../cases/C09/gf180/sW1.5_sL1.5/case.json | 235 + .../cases/C09/gf180/sW1.5_sL1.5/manifest.json | 8 + .../C09/gf180/sW1.5_sL1.5/qualification.json | 158 + .../cases/C09/gf180/sW1.5_sL1.5/specs.json | 23 + .../cases/C09/gf180/sW1.5_sL1.5/target.spice | 10 + .../C09/gf180/sW1.5_sL1.5/target_lvs.spice | 98 + .../C09/gf180/sW1.5_sL1.5/testbench.spice | 42 + .../data/cases/C09/gf180/sW1.5_sL1/case.json | 235 + .../cases/C09/gf180/sW1.5_sL1/manifest.json | 8 + .../C09/gf180/sW1.5_sL1/qualification.json | 158 + .../data/cases/C09/gf180/sW1.5_sL1/specs.json | 23 + .../cases/C09/gf180/sW1.5_sL1/target.spice | 10 + .../C09/gf180/sW1.5_sL1/target_lvs.spice | 98 + .../cases/C09/gf180/sW1.5_sL1/testbench.spice | 42 + .../data/cases/C09/gf180/sW1.5_sL2/case.json | 235 + .../cases/C09/gf180/sW1.5_sL2/manifest.json | 8 + .../C09/gf180/sW1.5_sL2/qualification.json | 158 + .../data/cases/C09/gf180/sW1.5_sL2/specs.json | 23 + .../cases/C09/gf180/sW1.5_sL2/target.spice | 10 + .../C09/gf180/sW1.5_sL2/target_lvs.spice | 98 + .../cases/C09/gf180/sW1.5_sL2/testbench.spice | 42 + .../data/cases/C09/gf180/sW1_sL1.5/case.json | 235 + .../cases/C09/gf180/sW1_sL1.5/manifest.json | 8 + .../C09/gf180/sW1_sL1.5/qualification.json | 158 + .../data/cases/C09/gf180/sW1_sL1.5/specs.json | 23 + .../cases/C09/gf180/sW1_sL1.5/target.spice | 10 + .../C09/gf180/sW1_sL1.5/target_lvs.spice | 66 + .../cases/C09/gf180/sW1_sL1.5/testbench.spice | 42 + .../data/cases/C09/gf180/sW1_sL1/case.json | 235 + .../cases/C09/gf180/sW1_sL1/manifest.json | 8 + .../C09/gf180/sW1_sL1/qualification.json | 158 + .../data/cases/C09/gf180/sW1_sL1/specs.json | 23 + .../data/cases/C09/gf180/sW1_sL1/target.spice | 10 + .../cases/C09/gf180/sW1_sL1/target_lvs.spice | 66 + .../cases/C09/gf180/sW1_sL1/testbench.spice | 42 + .../data/cases/C09/gf180/sW1_sL2/case.json | 235 + .../cases/C09/gf180/sW1_sL2/manifest.json | 8 + .../C09/gf180/sW1_sL2/qualification.json | 160 + .../data/cases/C09/gf180/sW1_sL2/specs.json | 23 + .../data/cases/C09/gf180/sW1_sL2/target.spice | 10 + .../cases/C09/gf180/sW1_sL2/target_lvs.spice | 66 + .../cases/C09/gf180/sW1_sL2/testbench.spice | 42 + .../data/cases/C09/gf180/sW2_sL1.5/case.json | 235 + .../cases/C09/gf180/sW2_sL1.5/manifest.json | 8 + .../C09/gf180/sW2_sL1.5/qualification.json | 158 + .../data/cases/C09/gf180/sW2_sL1.5/specs.json | 23 + .../cases/C09/gf180/sW2_sL1.5/target.spice | 10 + .../C09/gf180/sW2_sL1.5/target_lvs.spice | 130 + .../cases/C09/gf180/sW2_sL1.5/testbench.spice | 42 + .../data/cases/C09/gf180/sW2_sL1/case.json | 235 + .../cases/C09/gf180/sW2_sL1/manifest.json | 8 + .../C09/gf180/sW2_sL1/qualification.json | 158 + .../data/cases/C09/gf180/sW2_sL1/specs.json | 23 + .../data/cases/C09/gf180/sW2_sL1/target.spice | 10 + .../cases/C09/gf180/sW2_sL1/target_lvs.spice | 130 + .../cases/C09/gf180/sW2_sL1/testbench.spice | 42 + .../data/cases/C09/gf180/sW2_sL2/case.json | 235 + .../cases/C09/gf180/sW2_sL2/manifest.json | 8 + .../C09/gf180/sW2_sL2/qualification.json | 158 + .../data/cases/C09/gf180/sW2_sL2/specs.json | 23 + .../data/cases/C09/gf180/sW2_sL2/target.spice | 10 + .../cases/C09/gf180/sW2_sL2/target_lvs.spice | 130 + .../cases/C09/gf180/sW2_sL2/testbench.spice | 42 + .../cases/C09/ihp130/sW0.5_sL1.5/case.json | 235 + .../C09/ihp130/sW0.5_sL1.5/manifest.json | 8 + .../C09/ihp130/sW0.5_sL1.5/qualification.json | 158 + .../cases/C09/ihp130/sW0.5_sL1.5/specs.json | 23 + .../cases/C09/ihp130/sW0.5_sL1.5/target.spice | 10 + .../C09/ihp130/sW0.5_sL1.5/target_lvs.spice | 98 + .../C09/ihp130/sW0.5_sL1.5/testbench.spice | 42 + .../data/cases/C09/ihp130/sW0.5_sL1/case.json | 235 + .../cases/C09/ihp130/sW0.5_sL1/manifest.json | 8 + .../C09/ihp130/sW0.5_sL1/qualification.json | 158 + .../cases/C09/ihp130/sW0.5_sL1/specs.json | 23 + .../cases/C09/ihp130/sW0.5_sL1/target.spice | 10 + .../C09/ihp130/sW0.5_sL1/target_lvs.spice | 98 + .../C09/ihp130/sW0.5_sL1/testbench.spice | 42 + .../data/cases/C09/ihp130/sW0.5_sL2/case.json | 235 + .../cases/C09/ihp130/sW0.5_sL2/manifest.json | 8 + .../C09/ihp130/sW0.5_sL2/qualification.json | 158 + .../cases/C09/ihp130/sW0.5_sL2/specs.json | 23 + .../cases/C09/ihp130/sW0.5_sL2/target.spice | 10 + .../C09/ihp130/sW0.5_sL2/target_lvs.spice | 98 + .../C09/ihp130/sW0.5_sL2/testbench.spice | 42 + .../cases/C09/ihp130/sW1.5_sL1.5/case.json | 235 + .../C09/ihp130/sW1.5_sL1.5/manifest.json | 8 + .../C09/ihp130/sW1.5_sL1.5/qualification.json | 158 + .../cases/C09/ihp130/sW1.5_sL1.5/specs.json | 23 + .../cases/C09/ihp130/sW1.5_sL1.5/target.spice | 10 + .../C09/ihp130/sW1.5_sL1.5/target_lvs.spice | 290 + .../C09/ihp130/sW1.5_sL1.5/testbench.spice | 42 + .../data/cases/C09/ihp130/sW1.5_sL1/case.json | 235 + .../cases/C09/ihp130/sW1.5_sL1/manifest.json | 8 + .../C09/ihp130/sW1.5_sL1/qualification.json | 158 + .../cases/C09/ihp130/sW1.5_sL1/specs.json | 23 + .../cases/C09/ihp130/sW1.5_sL1/target.spice | 10 + .../C09/ihp130/sW1.5_sL1/target_lvs.spice | 290 + .../C09/ihp130/sW1.5_sL1/testbench.spice | 42 + .../data/cases/C09/ihp130/sW1.5_sL2/case.json | 235 + .../cases/C09/ihp130/sW1.5_sL2/manifest.json | 8 + .../C09/ihp130/sW1.5_sL2/qualification.json | 158 + .../cases/C09/ihp130/sW1.5_sL2/specs.json | 23 + .../cases/C09/ihp130/sW1.5_sL2/target.spice | 10 + .../C09/ihp130/sW1.5_sL2/target_lvs.spice | 290 + .../C09/ihp130/sW1.5_sL2/testbench.spice | 42 + .../data/cases/C09/ihp130/sW1_sL1.5/case.json | 235 + .../cases/C09/ihp130/sW1_sL1.5/manifest.json | 8 + .../C09/ihp130/sW1_sL1.5/qualification.json | 158 + .../cases/C09/ihp130/sW1_sL1.5/specs.json | 23 + .../cases/C09/ihp130/sW1_sL1.5/target.spice | 10 + .../C09/ihp130/sW1_sL1.5/target_lvs.spice | 194 + .../C09/ihp130/sW1_sL1.5/testbench.spice | 42 + .../data/cases/C09/ihp130/sW1_sL1/case.json | 235 + .../cases/C09/ihp130/sW1_sL1/manifest.json | 8 + .../C09/ihp130/sW1_sL1/qualification.json | 158 + .../data/cases/C09/ihp130/sW1_sL1/specs.json | 23 + .../cases/C09/ihp130/sW1_sL1/target.spice | 10 + .../cases/C09/ihp130/sW1_sL1/target_lvs.spice | 194 + .../cases/C09/ihp130/sW1_sL1/testbench.spice | 42 + .../data/cases/C09/ihp130/sW1_sL2/case.json | 235 + .../cases/C09/ihp130/sW1_sL2/manifest.json | 8 + .../C09/ihp130/sW1_sL2/qualification.json | 158 + .../data/cases/C09/ihp130/sW1_sL2/specs.json | 23 + .../cases/C09/ihp130/sW1_sL2/target.spice | 10 + .../cases/C09/ihp130/sW1_sL2/target_lvs.spice | 194 + .../cases/C09/ihp130/sW1_sL2/testbench.spice | 42 + .../data/cases/C09/ihp130/sW2_sL1.5/case.json | 235 + .../cases/C09/ihp130/sW2_sL1.5/manifest.json | 8 + .../C09/ihp130/sW2_sL1.5/qualification.json | 158 + .../cases/C09/ihp130/sW2_sL1.5/specs.json | 23 + .../cases/C09/ihp130/sW2_sL1.5/target.spice | 10 + .../C09/ihp130/sW2_sL1.5/target_lvs.spice | 386 + .../C09/ihp130/sW2_sL1.5/testbench.spice | 42 + .../data/cases/C09/ihp130/sW2_sL1/case.json | 235 + .../cases/C09/ihp130/sW2_sL1/manifest.json | 8 + .../C09/ihp130/sW2_sL1/qualification.json | 158 + .../data/cases/C09/ihp130/sW2_sL1/specs.json | 23 + .../cases/C09/ihp130/sW2_sL1/target.spice | 10 + .../cases/C09/ihp130/sW2_sL1/target_lvs.spice | 386 + .../cases/C09/ihp130/sW2_sL1/testbench.spice | 42 + .../data/cases/C09/ihp130/sW2_sL2/case.json | 235 + .../cases/C09/ihp130/sW2_sL2/manifest.json | 8 + .../C09/ihp130/sW2_sL2/qualification.json | 158 + .../data/cases/C09/ihp130/sW2_sL2/specs.json | 23 + .../cases/C09/ihp130/sW2_sL2/target.spice | 10 + .../cases/C09/ihp130/sW2_sL2/target_lvs.spice | 386 + .../cases/C09/ihp130/sW2_sL2/testbench.spice | 42 + .../cases/C09/sky130/sW0.5_sL1.5/case.json | 235 + .../C09/sky130/sW0.5_sL1.5/manifest.json | 8 + .../C09/sky130/sW0.5_sL1.5/qualification.json | 161 + .../cases/C09/sky130/sW0.5_sL1.5/specs.json | 23 + .../cases/C09/sky130/sW0.5_sL1.5/target.spice | 10 + .../C09/sky130/sW0.5_sL1.5/target_lvs.spice | 98 + .../C09/sky130/sW0.5_sL1.5/testbench.spice | 42 + .../data/cases/C09/sky130/sW0.5_sL1/case.json | 235 + .../cases/C09/sky130/sW0.5_sL1/manifest.json | 8 + .../C09/sky130/sW0.5_sL1/qualification.json | 161 + .../cases/C09/sky130/sW0.5_sL1/specs.json | 23 + .../cases/C09/sky130/sW0.5_sL1/target.spice | 10 + .../C09/sky130/sW0.5_sL1/target_lvs.spice | 98 + .../C09/sky130/sW0.5_sL1/testbench.spice | 42 + .../data/cases/C09/sky130/sW0.5_sL2/case.json | 235 + .../cases/C09/sky130/sW0.5_sL2/manifest.json | 8 + .../C09/sky130/sW0.5_sL2/qualification.json | 156 + .../cases/C09/sky130/sW0.5_sL2/specs.json | 20 + .../cases/C09/sky130/sW0.5_sL2/target.spice | 10 + .../C09/sky130/sW0.5_sL2/target_lvs.spice | 98 + .../C09/sky130/sW0.5_sL2/testbench.spice | 42 + .../cases/C09/sky130/sW1.5_sL1.5/case.json | 235 + .../C09/sky130/sW1.5_sL1.5/manifest.json | 8 + .../C09/sky130/sW1.5_sL1.5/qualification.json | 161 + .../cases/C09/sky130/sW1.5_sL1.5/specs.json | 23 + .../cases/C09/sky130/sW1.5_sL1.5/target.spice | 10 + .../C09/sky130/sW1.5_sL1.5/target_lvs.spice | 290 + .../C09/sky130/sW1.5_sL1.5/testbench.spice | 42 + .../data/cases/C09/sky130/sW1.5_sL1/case.json | 235 + .../cases/C09/sky130/sW1.5_sL1/manifest.json | 8 + .../C09/sky130/sW1.5_sL1/qualification.json | 158 + .../cases/C09/sky130/sW1.5_sL1/specs.json | 23 + .../cases/C09/sky130/sW1.5_sL1/target.spice | 10 + .../C09/sky130/sW1.5_sL1/target_lvs.spice | 290 + .../C09/sky130/sW1.5_sL1/testbench.spice | 42 + .../data/cases/C09/sky130/sW1.5_sL2/case.json | 235 + .../cases/C09/sky130/sW1.5_sL2/manifest.json | 8 + .../C09/sky130/sW1.5_sL2/qualification.json | 161 + .../cases/C09/sky130/sW1.5_sL2/specs.json | 23 + .../cases/C09/sky130/sW1.5_sL2/target.spice | 10 + .../C09/sky130/sW1.5_sL2/target_lvs.spice | 290 + .../C09/sky130/sW1.5_sL2/testbench.spice | 42 + .../data/cases/C09/sky130/sW1_sL1.5/case.json | 235 + .../cases/C09/sky130/sW1_sL1.5/manifest.json | 8 + .../C09/sky130/sW1_sL1.5/qualification.json | 161 + .../cases/C09/sky130/sW1_sL1.5/specs.json | 23 + .../cases/C09/sky130/sW1_sL1.5/target.spice | 10 + .../C09/sky130/sW1_sL1.5/target_lvs.spice | 194 + .../C09/sky130/sW1_sL1.5/testbench.spice | 42 + .../data/cases/C09/sky130/sW1_sL1/case.json | 235 + .../cases/C09/sky130/sW1_sL1/manifest.json | 8 + .../C09/sky130/sW1_sL1/qualification.json | 158 + .../data/cases/C09/sky130/sW1_sL1/specs.json | 23 + .../cases/C09/sky130/sW1_sL1/target.spice | 10 + .../cases/C09/sky130/sW1_sL1/target_lvs.spice | 194 + .../cases/C09/sky130/sW1_sL1/testbench.spice | 42 + .../data/cases/C09/sky130/sW1_sL2/case.json | 235 + .../cases/C09/sky130/sW1_sL2/manifest.json | 8 + .../C09/sky130/sW1_sL2/qualification.json | 161 + .../data/cases/C09/sky130/sW1_sL2/specs.json | 23 + .../cases/C09/sky130/sW1_sL2/target.spice | 10 + .../cases/C09/sky130/sW1_sL2/target_lvs.spice | 194 + .../cases/C09/sky130/sW1_sL2/testbench.spice | 42 + .../data/cases/C09/sky130/sW2_sL1.5/case.json | 235 + .../cases/C09/sky130/sW2_sL1.5/manifest.json | 8 + .../C09/sky130/sW2_sL1.5/qualification.json | 160 + .../cases/C09/sky130/sW2_sL1.5/specs.json | 23 + .../cases/C09/sky130/sW2_sL1.5/target.spice | 10 + .../C09/sky130/sW2_sL1.5/target_lvs.spice | 386 + .../C09/sky130/sW2_sL1.5/testbench.spice | 42 + .../data/cases/C09/sky130/sW2_sL1/case.json | 235 + .../cases/C09/sky130/sW2_sL1/manifest.json | 8 + .../C09/sky130/sW2_sL1/qualification.json | 158 + .../data/cases/C09/sky130/sW2_sL1/specs.json | 23 + .../cases/C09/sky130/sW2_sL1/target.spice | 10 + .../cases/C09/sky130/sW2_sL1/target_lvs.spice | 386 + .../cases/C09/sky130/sW2_sL1/testbench.spice | 42 + .../data/cases/C09/sky130/sW2_sL2/case.json | 235 + .../cases/C09/sky130/sW2_sL2/manifest.json | 8 + .../C09/sky130/sW2_sL2/qualification.json | 161 + .../data/cases/C09/sky130/sW2_sL2/specs.json | 23 + .../cases/C09/sky130/sW2_sL2/target.spice | 10 + .../cases/C09/sky130/sW2_sL2/target_lvs.spice | 386 + .../cases/C09/sky130/sW2_sL2/testbench.spice | 42 + .../cases/C10/gf180/sW0.5_sL1.5/case.json | 303 + .../cases/C10/gf180/sW0.5_sL1.5/manifest.json | 8 + .../C10/gf180/sW0.5_sL1.5/qualification.json | 180 + .../cases/C10/gf180/sW0.5_sL1.5/specs.json | 23 + .../cases/C10/gf180/sW0.5_sL1.5/target.spice | 12 + .../C10/gf180/sW0.5_sL1.5/target_lvs.spice | 42 + .../C10/gf180/sW0.5_sL1.5/testbench.spice | 48 + .../data/cases/C10/gf180/sW0.5_sL1/case.json | 303 + .../cases/C10/gf180/sW0.5_sL1/manifest.json | 8 + .../C10/gf180/sW0.5_sL1/qualification.json | 180 + .../data/cases/C10/gf180/sW0.5_sL1/specs.json | 23 + .../cases/C10/gf180/sW0.5_sL1/target.spice | 12 + .../C10/gf180/sW0.5_sL1/target_lvs.spice | 42 + .../cases/C10/gf180/sW0.5_sL1/testbench.spice | 48 + .../data/cases/C10/gf180/sW0.5_sL2/case.json | 303 + .../cases/C10/gf180/sW0.5_sL2/manifest.json | 8 + .../C10/gf180/sW0.5_sL2/qualification.json | 180 + .../data/cases/C10/gf180/sW0.5_sL2/specs.json | 23 + .../cases/C10/gf180/sW0.5_sL2/target.spice | 12 + .../C10/gf180/sW0.5_sL2/target_lvs.spice | 42 + .../cases/C10/gf180/sW0.5_sL2/testbench.spice | 48 + .../cases/C10/gf180/sW1.5_sL1.5/case.json | 303 + .../cases/C10/gf180/sW1.5_sL1.5/manifest.json | 8 + .../C10/gf180/sW1.5_sL1.5/qualification.json | 180 + .../cases/C10/gf180/sW1.5_sL1.5/specs.json | 23 + .../cases/C10/gf180/sW1.5_sL1.5/target.spice | 12 + .../C10/gf180/sW1.5_sL1.5/target_lvs.spice | 122 + .../C10/gf180/sW1.5_sL1.5/testbench.spice | 48 + .../data/cases/C10/gf180/sW1.5_sL1/case.json | 303 + .../cases/C10/gf180/sW1.5_sL1/manifest.json | 8 + .../C10/gf180/sW1.5_sL1/qualification.json | 180 + .../data/cases/C10/gf180/sW1.5_sL1/specs.json | 23 + .../cases/C10/gf180/sW1.5_sL1/target.spice | 12 + .../C10/gf180/sW1.5_sL1/target_lvs.spice | 122 + .../cases/C10/gf180/sW1.5_sL1/testbench.spice | 48 + .../data/cases/C10/gf180/sW1.5_sL2/case.json | 303 + .../cases/C10/gf180/sW1.5_sL2/manifest.json | 8 + .../C10/gf180/sW1.5_sL2/qualification.json | 180 + .../data/cases/C10/gf180/sW1.5_sL2/specs.json | 23 + .../cases/C10/gf180/sW1.5_sL2/target.spice | 12 + .../C10/gf180/sW1.5_sL2/target_lvs.spice | 122 + .../cases/C10/gf180/sW1.5_sL2/testbench.spice | 48 + .../data/cases/C10/gf180/sW1_sL1.5/case.json | 303 + .../cases/C10/gf180/sW1_sL1.5/manifest.json | 8 + .../C10/gf180/sW1_sL1.5/qualification.json | 180 + .../data/cases/C10/gf180/sW1_sL1.5/specs.json | 23 + .../cases/C10/gf180/sW1_sL1.5/target.spice | 12 + .../C10/gf180/sW1_sL1.5/target_lvs.spice | 82 + .../cases/C10/gf180/sW1_sL1.5/testbench.spice | 48 + .../data/cases/C10/gf180/sW1_sL1/case.json | 303 + .../cases/C10/gf180/sW1_sL1/manifest.json | 8 + .../C10/gf180/sW1_sL1/qualification.json | 180 + .../data/cases/C10/gf180/sW1_sL1/specs.json | 23 + .../data/cases/C10/gf180/sW1_sL1/target.spice | 12 + .../cases/C10/gf180/sW1_sL1/target_lvs.spice | 82 + .../cases/C10/gf180/sW1_sL1/testbench.spice | 48 + .../data/cases/C10/gf180/sW1_sL2/case.json | 303 + .../cases/C10/gf180/sW1_sL2/manifest.json | 8 + .../C10/gf180/sW1_sL2/qualification.json | 180 + .../data/cases/C10/gf180/sW1_sL2/specs.json | 23 + .../data/cases/C10/gf180/sW1_sL2/target.spice | 12 + .../cases/C10/gf180/sW1_sL2/target_lvs.spice | 82 + .../cases/C10/gf180/sW1_sL2/testbench.spice | 48 + .../data/cases/C10/gf180/sW2_sL1.5/case.json | 303 + .../cases/C10/gf180/sW2_sL1.5/manifest.json | 8 + .../C10/gf180/sW2_sL1.5/qualification.json | 180 + .../data/cases/C10/gf180/sW2_sL1.5/specs.json | 23 + .../cases/C10/gf180/sW2_sL1.5/target.spice | 12 + .../C10/gf180/sW2_sL1.5/target_lvs.spice | 162 + .../cases/C10/gf180/sW2_sL1.5/testbench.spice | 48 + .../data/cases/C10/gf180/sW2_sL1/case.json | 303 + .../cases/C10/gf180/sW2_sL1/manifest.json | 8 + .../C10/gf180/sW2_sL1/qualification.json | 180 + .../data/cases/C10/gf180/sW2_sL1/specs.json | 23 + .../data/cases/C10/gf180/sW2_sL1/target.spice | 12 + .../cases/C10/gf180/sW2_sL1/target_lvs.spice | 162 + .../cases/C10/gf180/sW2_sL1/testbench.spice | 48 + .../data/cases/C10/gf180/sW2_sL2/case.json | 303 + .../cases/C10/gf180/sW2_sL2/manifest.json | 8 + .../C10/gf180/sW2_sL2/qualification.json | 180 + .../data/cases/C10/gf180/sW2_sL2/specs.json | 23 + .../data/cases/C10/gf180/sW2_sL2/target.spice | 12 + .../cases/C10/gf180/sW2_sL2/target_lvs.spice | 162 + .../cases/C10/gf180/sW2_sL2/testbench.spice | 48 + .../cases/C10/ihp130/sW0.5_sL1.5/case.json | 303 + .../C10/ihp130/sW0.5_sL1.5/manifest.json | 8 + .../C10/ihp130/sW0.5_sL1.5/qualification.json | 182 + .../cases/C10/ihp130/sW0.5_sL1.5/specs.json | 23 + .../cases/C10/ihp130/sW0.5_sL1.5/target.spice | 12 + .../C10/ihp130/sW0.5_sL1.5/target_lvs.spice | 42 + .../C10/ihp130/sW0.5_sL1.5/testbench.spice | 48 + .../data/cases/C10/ihp130/sW0.5_sL1/case.json | 303 + .../cases/C10/ihp130/sW0.5_sL1/manifest.json | 8 + .../C10/ihp130/sW0.5_sL1/qualification.json | 182 + .../cases/C10/ihp130/sW0.5_sL1/specs.json | 23 + .../cases/C10/ihp130/sW0.5_sL1/target.spice | 12 + .../C10/ihp130/sW0.5_sL1/target_lvs.spice | 42 + .../C10/ihp130/sW0.5_sL1/testbench.spice | 48 + .../data/cases/C10/ihp130/sW0.5_sL2/case.json | 303 + .../cases/C10/ihp130/sW0.5_sL2/manifest.json | 8 + .../C10/ihp130/sW0.5_sL2/qualification.json | 182 + .../cases/C10/ihp130/sW0.5_sL2/specs.json | 23 + .../cases/C10/ihp130/sW0.5_sL2/target.spice | 12 + .../C10/ihp130/sW0.5_sL2/target_lvs.spice | 42 + .../C10/ihp130/sW0.5_sL2/testbench.spice | 48 + .../cases/C10/ihp130/sW1.5_sL1.5/case.json | 303 + .../C10/ihp130/sW1.5_sL1.5/manifest.json | 8 + .../C10/ihp130/sW1.5_sL1.5/qualification.json | 180 + .../cases/C10/ihp130/sW1.5_sL1.5/specs.json | 23 + .../cases/C10/ihp130/sW1.5_sL1.5/target.spice | 12 + .../C10/ihp130/sW1.5_sL1.5/target_lvs.spice | 122 + .../C10/ihp130/sW1.5_sL1.5/testbench.spice | 48 + .../data/cases/C10/ihp130/sW1.5_sL1/case.json | 303 + .../cases/C10/ihp130/sW1.5_sL1/manifest.json | 8 + .../C10/ihp130/sW1.5_sL1/qualification.json | 180 + .../cases/C10/ihp130/sW1.5_sL1/specs.json | 23 + .../cases/C10/ihp130/sW1.5_sL1/target.spice | 12 + .../C10/ihp130/sW1.5_sL1/target_lvs.spice | 122 + .../C10/ihp130/sW1.5_sL1/testbench.spice | 48 + .../data/cases/C10/ihp130/sW1.5_sL2/case.json | 303 + .../cases/C10/ihp130/sW1.5_sL2/manifest.json | 8 + .../C10/ihp130/sW1.5_sL2/qualification.json | 180 + .../cases/C10/ihp130/sW1.5_sL2/specs.json | 23 + .../cases/C10/ihp130/sW1.5_sL2/target.spice | 12 + .../C10/ihp130/sW1.5_sL2/target_lvs.spice | 122 + .../C10/ihp130/sW1.5_sL2/testbench.spice | 48 + .../data/cases/C10/ihp130/sW1_sL1.5/case.json | 303 + .../cases/C10/ihp130/sW1_sL1.5/manifest.json | 8 + .../C10/ihp130/sW1_sL1.5/qualification.json | 182 + .../cases/C10/ihp130/sW1_sL1.5/specs.json | 23 + .../cases/C10/ihp130/sW1_sL1.5/target.spice | 12 + .../C10/ihp130/sW1_sL1.5/target_lvs.spice | 82 + .../C10/ihp130/sW1_sL1.5/testbench.spice | 48 + .../data/cases/C10/ihp130/sW1_sL1/case.json | 303 + .../cases/C10/ihp130/sW1_sL1/manifest.json | 8 + .../C10/ihp130/sW1_sL1/qualification.json | 180 + .../data/cases/C10/ihp130/sW1_sL1/specs.json | 23 + .../cases/C10/ihp130/sW1_sL1/target.spice | 12 + .../cases/C10/ihp130/sW1_sL1/target_lvs.spice | 82 + .../cases/C10/ihp130/sW1_sL1/testbench.spice | 48 + .../data/cases/C10/ihp130/sW1_sL2/case.json | 303 + .../cases/C10/ihp130/sW1_sL2/manifest.json | 8 + .../C10/ihp130/sW1_sL2/qualification.json | 182 + .../data/cases/C10/ihp130/sW1_sL2/specs.json | 23 + .../cases/C10/ihp130/sW1_sL2/target.spice | 12 + .../cases/C10/ihp130/sW1_sL2/target_lvs.spice | 82 + .../cases/C10/ihp130/sW1_sL2/testbench.spice | 48 + .../data/cases/C10/ihp130/sW2_sL1.5/case.json | 303 + .../cases/C10/ihp130/sW2_sL1.5/manifest.json | 8 + .../C10/ihp130/sW2_sL1.5/qualification.json | 180 + .../cases/C10/ihp130/sW2_sL1.5/specs.json | 23 + .../cases/C10/ihp130/sW2_sL1.5/target.spice | 12 + .../C10/ihp130/sW2_sL1.5/target_lvs.spice | 162 + .../C10/ihp130/sW2_sL1.5/testbench.spice | 48 + .../data/cases/C10/ihp130/sW2_sL1/case.json | 303 + .../cases/C10/ihp130/sW2_sL1/manifest.json | 8 + .../C10/ihp130/sW2_sL1/qualification.json | 180 + .../data/cases/C10/ihp130/sW2_sL1/specs.json | 23 + .../cases/C10/ihp130/sW2_sL1/target.spice | 12 + .../cases/C10/ihp130/sW2_sL1/target_lvs.spice | 162 + .../cases/C10/ihp130/sW2_sL1/testbench.spice | 48 + .../data/cases/C10/ihp130/sW2_sL2/case.json | 303 + .../cases/C10/ihp130/sW2_sL2/manifest.json | 8 + .../C10/ihp130/sW2_sL2/qualification.json | 180 + .../data/cases/C10/ihp130/sW2_sL2/specs.json | 23 + .../cases/C10/ihp130/sW2_sL2/target.spice | 12 + .../cases/C10/ihp130/sW2_sL2/target_lvs.spice | 162 + .../cases/C10/ihp130/sW2_sL2/testbench.spice | 48 + .../cases/C10/sky130/sW0.5_sL1.5/case.json | 303 + .../C10/sky130/sW0.5_sL1.5/manifest.json | 8 + .../C10/sky130/sW0.5_sL1.5/qualification.json | 182 + .../cases/C10/sky130/sW0.5_sL1.5/specs.json | 23 + .../cases/C10/sky130/sW0.5_sL1.5/target.spice | 12 + .../C10/sky130/sW0.5_sL1.5/target_lvs.spice | 42 + .../C10/sky130/sW0.5_sL1.5/testbench.spice | 48 + .../data/cases/C10/sky130/sW0.5_sL1/case.json | 303 + .../cases/C10/sky130/sW0.5_sL1/manifest.json | 8 + .../C10/sky130/sW0.5_sL1/qualification.json | 182 + .../cases/C10/sky130/sW0.5_sL1/specs.json | 23 + .../cases/C10/sky130/sW0.5_sL1/target.spice | 12 + .../C10/sky130/sW0.5_sL1/target_lvs.spice | 42 + .../C10/sky130/sW0.5_sL1/testbench.spice | 48 + .../data/cases/C10/sky130/sW0.5_sL2/case.json | 303 + .../cases/C10/sky130/sW0.5_sL2/manifest.json | 8 + .../C10/sky130/sW0.5_sL2/qualification.json | 182 + .../cases/C10/sky130/sW0.5_sL2/specs.json | 23 + .../cases/C10/sky130/sW0.5_sL2/target.spice | 12 + .../C10/sky130/sW0.5_sL2/target_lvs.spice | 42 + .../C10/sky130/sW0.5_sL2/testbench.spice | 48 + .../cases/C10/sky130/sW1.5_sL1.5/case.json | 303 + .../C10/sky130/sW1.5_sL1.5/manifest.json | 8 + .../C10/sky130/sW1.5_sL1.5/qualification.json | 180 + .../cases/C10/sky130/sW1.5_sL1.5/specs.json | 23 + .../cases/C10/sky130/sW1.5_sL1.5/target.spice | 12 + .../C10/sky130/sW1.5_sL1.5/target_lvs.spice | 122 + .../C10/sky130/sW1.5_sL1.5/testbench.spice | 48 + .../data/cases/C10/sky130/sW1.5_sL1/case.json | 303 + .../cases/C10/sky130/sW1.5_sL1/manifest.json | 8 + .../C10/sky130/sW1.5_sL1/qualification.json | 180 + .../cases/C10/sky130/sW1.5_sL1/specs.json | 23 + .../cases/C10/sky130/sW1.5_sL1/target.spice | 12 + .../C10/sky130/sW1.5_sL1/target_lvs.spice | 122 + .../C10/sky130/sW1.5_sL1/testbench.spice | 48 + .../data/cases/C10/sky130/sW1.5_sL2/case.json | 303 + .../cases/C10/sky130/sW1.5_sL2/manifest.json | 8 + .../C10/sky130/sW1.5_sL2/qualification.json | 180 + .../cases/C10/sky130/sW1.5_sL2/specs.json | 23 + .../cases/C10/sky130/sW1.5_sL2/target.spice | 12 + .../C10/sky130/sW1.5_sL2/target_lvs.spice | 122 + .../C10/sky130/sW1.5_sL2/testbench.spice | 48 + .../data/cases/C10/sky130/sW1_sL1.5/case.json | 303 + .../cases/C10/sky130/sW1_sL1.5/manifest.json | 8 + .../C10/sky130/sW1_sL1.5/qualification.json | 180 + .../cases/C10/sky130/sW1_sL1.5/specs.json | 23 + .../cases/C10/sky130/sW1_sL1.5/target.spice | 12 + .../C10/sky130/sW1_sL1.5/target_lvs.spice | 82 + .../C10/sky130/sW1_sL1.5/testbench.spice | 48 + .../data/cases/C10/sky130/sW1_sL1/case.json | 303 + .../cases/C10/sky130/sW1_sL1/manifest.json | 8 + .../C10/sky130/sW1_sL1/qualification.json | 180 + .../data/cases/C10/sky130/sW1_sL1/specs.json | 23 + .../cases/C10/sky130/sW1_sL1/target.spice | 12 + .../cases/C10/sky130/sW1_sL1/target_lvs.spice | 82 + .../cases/C10/sky130/sW1_sL1/testbench.spice | 48 + .../data/cases/C10/sky130/sW1_sL2/case.json | 303 + .../cases/C10/sky130/sW1_sL2/manifest.json | 8 + .../C10/sky130/sW1_sL2/qualification.json | 182 + .../data/cases/C10/sky130/sW1_sL2/specs.json | 23 + .../cases/C10/sky130/sW1_sL2/target.spice | 12 + .../cases/C10/sky130/sW1_sL2/target_lvs.spice | 82 + .../cases/C10/sky130/sW1_sL2/testbench.spice | 48 + .../data/cases/C10/sky130/sW2_sL1.5/case.json | 303 + .../cases/C10/sky130/sW2_sL1.5/manifest.json | 8 + .../C10/sky130/sW2_sL1.5/qualification.json | 180 + .../cases/C10/sky130/sW2_sL1.5/specs.json | 23 + .../cases/C10/sky130/sW2_sL1.5/target.spice | 12 + .../C10/sky130/sW2_sL1.5/target_lvs.spice | 162 + .../C10/sky130/sW2_sL1.5/testbench.spice | 48 + .../data/cases/C10/sky130/sW2_sL1/case.json | 303 + .../cases/C10/sky130/sW2_sL1/manifest.json | 8 + .../C10/sky130/sW2_sL1/qualification.json | 180 + .../data/cases/C10/sky130/sW2_sL1/specs.json | 23 + .../cases/C10/sky130/sW2_sL1/target.spice | 12 + .../cases/C10/sky130/sW2_sL1/target_lvs.spice | 162 + .../cases/C10/sky130/sW2_sL1/testbench.spice | 48 + .../data/cases/C10/sky130/sW2_sL2/case.json | 303 + .../cases/C10/sky130/sW2_sL2/manifest.json | 8 + .../C10/sky130/sW2_sL2/qualification.json | 180 + .../data/cases/C10/sky130/sW2_sL2/specs.json | 23 + .../cases/C10/sky130/sW2_sL2/target.spice | 12 + .../cases/C10/sky130/sW2_sL2/target_lvs.spice | 162 + .../cases/C10/sky130/sW2_sL2/testbench.spice | 48 + .../cases/C11/gf180/sW0.5_sL1.5/case.json | 230 + .../cases/C11/gf180/sW0.5_sL1.5/manifest.json | 8 + .../C11/gf180/sW0.5_sL1.5/qualification.json | 165 + .../cases/C11/gf180/sW0.5_sL1.5/specs.json | 30 + .../cases/C11/gf180/sW0.5_sL1.5/target.spice | 12 + .../C11/gf180/sW0.5_sL1.5/target_lvs.spice | 30 + .../C11/gf180/sW0.5_sL1.5/testbench.spice | 37 + .../data/cases/C11/gf180/sW0.5_sL1/case.json | 230 + .../cases/C11/gf180/sW0.5_sL1/manifest.json | 8 + .../C11/gf180/sW0.5_sL1/qualification.json | 165 + .../data/cases/C11/gf180/sW0.5_sL1/specs.json | 30 + .../cases/C11/gf180/sW0.5_sL1/target.spice | 12 + .../C11/gf180/sW0.5_sL1/target_lvs.spice | 30 + .../cases/C11/gf180/sW0.5_sL1/testbench.spice | 37 + .../data/cases/C11/gf180/sW0.5_sL2/case.json | 230 + .../cases/C11/gf180/sW0.5_sL2/manifest.json | 8 + .../C11/gf180/sW0.5_sL2/qualification.json | 165 + .../data/cases/C11/gf180/sW0.5_sL2/specs.json | 30 + .../cases/C11/gf180/sW0.5_sL2/target.spice | 12 + .../C11/gf180/sW0.5_sL2/target_lvs.spice | 30 + .../cases/C11/gf180/sW0.5_sL2/testbench.spice | 37 + .../cases/C11/gf180/sW1.5_sL1.5/case.json | 230 + .../cases/C11/gf180/sW1.5_sL1.5/manifest.json | 8 + .../C11/gf180/sW1.5_sL1.5/qualification.json | 165 + .../cases/C11/gf180/sW1.5_sL1.5/specs.json | 30 + .../cases/C11/gf180/sW1.5_sL1.5/target.spice | 12 + .../C11/gf180/sW1.5_sL1.5/target_lvs.spice | 82 + .../C11/gf180/sW1.5_sL1.5/testbench.spice | 37 + .../data/cases/C11/gf180/sW1.5_sL1/case.json | 230 + .../cases/C11/gf180/sW1.5_sL1/manifest.json | 8 + .../C11/gf180/sW1.5_sL1/qualification.json | 165 + .../data/cases/C11/gf180/sW1.5_sL1/specs.json | 30 + .../cases/C11/gf180/sW1.5_sL1/target.spice | 12 + .../C11/gf180/sW1.5_sL1/target_lvs.spice | 82 + .../cases/C11/gf180/sW1.5_sL1/testbench.spice | 37 + .../data/cases/C11/gf180/sW1.5_sL2/case.json | 230 + .../cases/C11/gf180/sW1.5_sL2/manifest.json | 8 + .../C11/gf180/sW1.5_sL2/qualification.json | 165 + .../data/cases/C11/gf180/sW1.5_sL2/specs.json | 30 + .../cases/C11/gf180/sW1.5_sL2/target.spice | 12 + .../C11/gf180/sW1.5_sL2/target_lvs.spice | 82 + .../cases/C11/gf180/sW1.5_sL2/testbench.spice | 37 + .../data/cases/C11/gf180/sW1_sL1.5/case.json | 230 + .../cases/C11/gf180/sW1_sL1.5/manifest.json | 8 + .../C11/gf180/sW1_sL1.5/qualification.json | 165 + .../data/cases/C11/gf180/sW1_sL1.5/specs.json | 30 + .../cases/C11/gf180/sW1_sL1.5/target.spice | 12 + .../C11/gf180/sW1_sL1.5/target_lvs.spice | 56 + .../cases/C11/gf180/sW1_sL1.5/testbench.spice | 37 + .../data/cases/C11/gf180/sW1_sL1/case.json | 230 + .../cases/C11/gf180/sW1_sL1/manifest.json | 8 + .../C11/gf180/sW1_sL1/qualification.json | 165 + .../data/cases/C11/gf180/sW1_sL1/specs.json | 30 + .../data/cases/C11/gf180/sW1_sL1/target.spice | 12 + .../cases/C11/gf180/sW1_sL1/target_lvs.spice | 56 + .../cases/C11/gf180/sW1_sL1/testbench.spice | 37 + .../data/cases/C11/gf180/sW1_sL2/case.json | 230 + .../cases/C11/gf180/sW1_sL2/manifest.json | 8 + .../C11/gf180/sW1_sL2/qualification.json | 165 + .../data/cases/C11/gf180/sW1_sL2/specs.json | 30 + .../data/cases/C11/gf180/sW1_sL2/target.spice | 12 + .../cases/C11/gf180/sW1_sL2/target_lvs.spice | 56 + .../cases/C11/gf180/sW1_sL2/testbench.spice | 37 + .../data/cases/C11/gf180/sW2_sL1.5/case.json | 230 + .../cases/C11/gf180/sW2_sL1.5/manifest.json | 8 + .../C11/gf180/sW2_sL1.5/qualification.json | 165 + .../data/cases/C11/gf180/sW2_sL1.5/specs.json | 30 + .../cases/C11/gf180/sW2_sL1.5/target.spice | 12 + .../C11/gf180/sW2_sL1.5/target_lvs.spice | 108 + .../cases/C11/gf180/sW2_sL1.5/testbench.spice | 37 + .../data/cases/C11/gf180/sW2_sL1/case.json | 230 + .../cases/C11/gf180/sW2_sL1/manifest.json | 8 + .../C11/gf180/sW2_sL1/qualification.json | 165 + .../data/cases/C11/gf180/sW2_sL1/specs.json | 30 + .../data/cases/C11/gf180/sW2_sL1/target.spice | 12 + .../cases/C11/gf180/sW2_sL1/target_lvs.spice | 108 + .../cases/C11/gf180/sW2_sL1/testbench.spice | 37 + .../data/cases/C11/gf180/sW2_sL2/case.json | 230 + .../cases/C11/gf180/sW2_sL2/manifest.json | 8 + .../C11/gf180/sW2_sL2/qualification.json | 165 + .../data/cases/C11/gf180/sW2_sL2/specs.json | 30 + .../data/cases/C11/gf180/sW2_sL2/target.spice | 12 + .../cases/C11/gf180/sW2_sL2/target_lvs.spice | 108 + .../cases/C11/gf180/sW2_sL2/testbench.spice | 37 + .../cases/C11/ihp130/sW0.5_sL1.5/case.json | 230 + .../C11/ihp130/sW0.5_sL1.5/manifest.json | 8 + .../C11/ihp130/sW0.5_sL1.5/qualification.json | 165 + .../cases/C11/ihp130/sW0.5_sL1.5/specs.json | 30 + .../cases/C11/ihp130/sW0.5_sL1.5/target.spice | 12 + .../C11/ihp130/sW0.5_sL1.5/target_lvs.spice | 30 + .../C11/ihp130/sW0.5_sL1.5/testbench.spice | 37 + .../data/cases/C11/ihp130/sW0.5_sL1/case.json | 230 + .../cases/C11/ihp130/sW0.5_sL1/manifest.json | 8 + .../C11/ihp130/sW0.5_sL1/qualification.json | 165 + .../cases/C11/ihp130/sW0.5_sL1/specs.json | 30 + .../cases/C11/ihp130/sW0.5_sL1/target.spice | 12 + .../C11/ihp130/sW0.5_sL1/target_lvs.spice | 30 + .../C11/ihp130/sW0.5_sL1/testbench.spice | 37 + .../data/cases/C11/ihp130/sW0.5_sL2/case.json | 230 + .../cases/C11/ihp130/sW0.5_sL2/manifest.json | 8 + .../C11/ihp130/sW0.5_sL2/qualification.json | 165 + .../cases/C11/ihp130/sW0.5_sL2/specs.json | 30 + .../cases/C11/ihp130/sW0.5_sL2/target.spice | 12 + .../C11/ihp130/sW0.5_sL2/target_lvs.spice | 30 + .../C11/ihp130/sW0.5_sL2/testbench.spice | 37 + .../cases/C11/ihp130/sW1.5_sL1.5/case.json | 230 + .../C11/ihp130/sW1.5_sL1.5/manifest.json | 8 + .../C11/ihp130/sW1.5_sL1.5/qualification.json | 165 + .../cases/C11/ihp130/sW1.5_sL1.5/specs.json | 30 + .../cases/C11/ihp130/sW1.5_sL1.5/target.spice | 12 + .../C11/ihp130/sW1.5_sL1.5/target_lvs.spice | 82 + .../C11/ihp130/sW1.5_sL1.5/testbench.spice | 37 + .../data/cases/C11/ihp130/sW1.5_sL1/case.json | 230 + .../cases/C11/ihp130/sW1.5_sL1/manifest.json | 8 + .../C11/ihp130/sW1.5_sL1/qualification.json | 165 + .../cases/C11/ihp130/sW1.5_sL1/specs.json | 30 + .../cases/C11/ihp130/sW1.5_sL1/target.spice | 12 + .../C11/ihp130/sW1.5_sL1/target_lvs.spice | 82 + .../C11/ihp130/sW1.5_sL1/testbench.spice | 37 + .../data/cases/C11/ihp130/sW1.5_sL2/case.json | 230 + .../cases/C11/ihp130/sW1.5_sL2/manifest.json | 8 + .../C11/ihp130/sW1.5_sL2/qualification.json | 165 + .../cases/C11/ihp130/sW1.5_sL2/specs.json | 30 + .../cases/C11/ihp130/sW1.5_sL2/target.spice | 12 + .../C11/ihp130/sW1.5_sL2/target_lvs.spice | 82 + .../C11/ihp130/sW1.5_sL2/testbench.spice | 37 + .../data/cases/C11/ihp130/sW1_sL1.5/case.json | 230 + .../cases/C11/ihp130/sW1_sL1.5/manifest.json | 8 + .../C11/ihp130/sW1_sL1.5/qualification.json | 165 + .../cases/C11/ihp130/sW1_sL1.5/specs.json | 30 + .../cases/C11/ihp130/sW1_sL1.5/target.spice | 12 + .../C11/ihp130/sW1_sL1.5/target_lvs.spice | 56 + .../C11/ihp130/sW1_sL1.5/testbench.spice | 37 + .../data/cases/C11/ihp130/sW1_sL1/case.json | 230 + .../cases/C11/ihp130/sW1_sL1/manifest.json | 8 + .../C11/ihp130/sW1_sL1/qualification.json | 165 + .../data/cases/C11/ihp130/sW1_sL1/specs.json | 30 + .../cases/C11/ihp130/sW1_sL1/target.spice | 12 + .../cases/C11/ihp130/sW1_sL1/target_lvs.spice | 56 + .../cases/C11/ihp130/sW1_sL1/testbench.spice | 37 + .../data/cases/C11/ihp130/sW1_sL2/case.json | 230 + .../cases/C11/ihp130/sW1_sL2/manifest.json | 8 + .../C11/ihp130/sW1_sL2/qualification.json | 165 + .../data/cases/C11/ihp130/sW1_sL2/specs.json | 30 + .../cases/C11/ihp130/sW1_sL2/target.spice | 12 + .../cases/C11/ihp130/sW1_sL2/target_lvs.spice | 56 + .../cases/C11/ihp130/sW1_sL2/testbench.spice | 37 + .../data/cases/C11/ihp130/sW2_sL1.5/case.json | 230 + .../cases/C11/ihp130/sW2_sL1.5/manifest.json | 8 + .../C11/ihp130/sW2_sL1.5/qualification.json | 165 + .../cases/C11/ihp130/sW2_sL1.5/specs.json | 30 + .../cases/C11/ihp130/sW2_sL1.5/target.spice | 12 + .../C11/ihp130/sW2_sL1.5/target_lvs.spice | 108 + .../C11/ihp130/sW2_sL1.5/testbench.spice | 37 + .../data/cases/C11/ihp130/sW2_sL1/case.json | 230 + .../cases/C11/ihp130/sW2_sL1/manifest.json | 8 + .../C11/ihp130/sW2_sL1/qualification.json | 165 + .../data/cases/C11/ihp130/sW2_sL1/specs.json | 30 + .../cases/C11/ihp130/sW2_sL1/target.spice | 12 + .../cases/C11/ihp130/sW2_sL1/target_lvs.spice | 108 + .../cases/C11/ihp130/sW2_sL1/testbench.spice | 37 + .../data/cases/C11/ihp130/sW2_sL2/case.json | 230 + .../cases/C11/ihp130/sW2_sL2/manifest.json | 8 + .../C11/ihp130/sW2_sL2/qualification.json | 165 + .../data/cases/C11/ihp130/sW2_sL2/specs.json | 30 + .../cases/C11/ihp130/sW2_sL2/target.spice | 12 + .../cases/C11/ihp130/sW2_sL2/target_lvs.spice | 108 + .../cases/C11/ihp130/sW2_sL2/testbench.spice | 37 + .../cases/C11/sky130/sW0.5_sL1.5/case.json | 230 + .../C11/sky130/sW0.5_sL1.5/manifest.json | 8 + .../C11/sky130/sW0.5_sL1.5/qualification.json | 165 + .../cases/C11/sky130/sW0.5_sL1.5/specs.json | 30 + .../cases/C11/sky130/sW0.5_sL1.5/target.spice | 12 + .../C11/sky130/sW0.5_sL1.5/target_lvs.spice | 30 + .../C11/sky130/sW0.5_sL1.5/testbench.spice | 37 + .../data/cases/C11/sky130/sW0.5_sL1/case.json | 230 + .../cases/C11/sky130/sW0.5_sL1/manifest.json | 8 + .../C11/sky130/sW0.5_sL1/qualification.json | 165 + .../cases/C11/sky130/sW0.5_sL1/specs.json | 30 + .../cases/C11/sky130/sW0.5_sL1/target.spice | 12 + .../C11/sky130/sW0.5_sL1/target_lvs.spice | 30 + .../C11/sky130/sW0.5_sL1/testbench.spice | 37 + .../data/cases/C11/sky130/sW0.5_sL2/case.json | 230 + .../cases/C11/sky130/sW0.5_sL2/manifest.json | 8 + .../C11/sky130/sW0.5_sL2/qualification.json | 165 + .../cases/C11/sky130/sW0.5_sL2/specs.json | 30 + .../cases/C11/sky130/sW0.5_sL2/target.spice | 12 + .../C11/sky130/sW0.5_sL2/target_lvs.spice | 30 + .../C11/sky130/sW0.5_sL2/testbench.spice | 37 + .../cases/C11/sky130/sW1.5_sL1.5/case.json | 230 + .../C11/sky130/sW1.5_sL1.5/manifest.json | 8 + .../C11/sky130/sW1.5_sL1.5/qualification.json | 165 + .../cases/C11/sky130/sW1.5_sL1.5/specs.json | 30 + .../cases/C11/sky130/sW1.5_sL1.5/target.spice | 12 + .../C11/sky130/sW1.5_sL1.5/target_lvs.spice | 82 + .../C11/sky130/sW1.5_sL1.5/testbench.spice | 37 + .../data/cases/C11/sky130/sW1.5_sL1/case.json | 230 + .../cases/C11/sky130/sW1.5_sL1/manifest.json | 8 + .../C11/sky130/sW1.5_sL1/qualification.json | 165 + .../cases/C11/sky130/sW1.5_sL1/specs.json | 30 + .../cases/C11/sky130/sW1.5_sL1/target.spice | 12 + .../C11/sky130/sW1.5_sL1/target_lvs.spice | 82 + .../C11/sky130/sW1.5_sL1/testbench.spice | 37 + .../data/cases/C11/sky130/sW1.5_sL2/case.json | 230 + .../cases/C11/sky130/sW1.5_sL2/manifest.json | 8 + .../C11/sky130/sW1.5_sL2/qualification.json | 165 + .../cases/C11/sky130/sW1.5_sL2/specs.json | 30 + .../cases/C11/sky130/sW1.5_sL2/target.spice | 12 + .../C11/sky130/sW1.5_sL2/target_lvs.spice | 82 + .../C11/sky130/sW1.5_sL2/testbench.spice | 37 + .../data/cases/C11/sky130/sW1_sL1.5/case.json | 230 + .../cases/C11/sky130/sW1_sL1.5/manifest.json | 8 + .../C11/sky130/sW1_sL1.5/qualification.json | 165 + .../cases/C11/sky130/sW1_sL1.5/specs.json | 30 + .../cases/C11/sky130/sW1_sL1.5/target.spice | 12 + .../C11/sky130/sW1_sL1.5/target_lvs.spice | 56 + .../C11/sky130/sW1_sL1.5/testbench.spice | 37 + .../data/cases/C11/sky130/sW1_sL1/case.json | 230 + .../cases/C11/sky130/sW1_sL1/manifest.json | 8 + .../C11/sky130/sW1_sL1/qualification.json | 165 + .../data/cases/C11/sky130/sW1_sL1/specs.json | 30 + .../cases/C11/sky130/sW1_sL1/target.spice | 12 + .../cases/C11/sky130/sW1_sL1/target_lvs.spice | 56 + .../cases/C11/sky130/sW1_sL1/testbench.spice | 37 + .../data/cases/C11/sky130/sW1_sL2/case.json | 230 + .../cases/C11/sky130/sW1_sL2/manifest.json | 8 + .../C11/sky130/sW1_sL2/qualification.json | 165 + .../data/cases/C11/sky130/sW1_sL2/specs.json | 30 + .../cases/C11/sky130/sW1_sL2/target.spice | 12 + .../cases/C11/sky130/sW1_sL2/target_lvs.spice | 56 + .../cases/C11/sky130/sW1_sL2/testbench.spice | 37 + .../data/cases/C11/sky130/sW2_sL1.5/case.json | 230 + .../cases/C11/sky130/sW2_sL1.5/manifest.json | 8 + .../C11/sky130/sW2_sL1.5/qualification.json | 165 + .../cases/C11/sky130/sW2_sL1.5/specs.json | 30 + .../cases/C11/sky130/sW2_sL1.5/target.spice | 12 + .../C11/sky130/sW2_sL1.5/target_lvs.spice | 108 + .../C11/sky130/sW2_sL1.5/testbench.spice | 37 + .../data/cases/C11/sky130/sW2_sL1/case.json | 230 + .../cases/C11/sky130/sW2_sL1/manifest.json | 8 + .../C11/sky130/sW2_sL1/qualification.json | 165 + .../data/cases/C11/sky130/sW2_sL1/specs.json | 30 + .../cases/C11/sky130/sW2_sL1/target.spice | 12 + .../cases/C11/sky130/sW2_sL1/target_lvs.spice | 108 + .../cases/C11/sky130/sW2_sL1/testbench.spice | 37 + .../data/cases/C11/sky130/sW2_sL2/case.json | 230 + .../cases/C11/sky130/sW2_sL2/manifest.json | 8 + .../C11/sky130/sW2_sL2/qualification.json | 165 + .../data/cases/C11/sky130/sW2_sL2/specs.json | 30 + .../cases/C11/sky130/sW2_sL2/target.spice | 12 + .../cases/C11/sky130/sW2_sL2/target_lvs.spice | 108 + .../cases/C11/sky130/sW2_sL2/testbench.spice | 37 + .../cases/C12/gf180/sW0.5_sL1.5/case.json | 88 + .../cases/C12/gf180/sW0.5_sL1.5/manifest.json | 8 + .../C12/gf180/sW0.5_sL1.5/qualification.json | 83 + .../cases/C12/gf180/sW0.5_sL1.5/specs.json | 23 + .../cases/C12/gf180/sW0.5_sL1.5/target.spice | 4 + .../C12/gf180/sW0.5_sL1.5/target_lvs.spice | 8 + .../C12/gf180/sW0.5_sL1.5/testbench.spice | 26 + .../data/cases/C12/gf180/sW0.5_sL1/case.json | 88 + .../cases/C12/gf180/sW0.5_sL1/manifest.json | 8 + .../C12/gf180/sW0.5_sL1/qualification.json | 83 + .../data/cases/C12/gf180/sW0.5_sL1/specs.json | 23 + .../cases/C12/gf180/sW0.5_sL1/target.spice | 4 + .../C12/gf180/sW0.5_sL1/target_lvs.spice | 8 + .../cases/C12/gf180/sW0.5_sL1/testbench.spice | 26 + .../data/cases/C12/gf180/sW0.5_sL2/case.json | 88 + .../cases/C12/gf180/sW0.5_sL2/manifest.json | 8 + .../C12/gf180/sW0.5_sL2/qualification.json | 83 + .../data/cases/C12/gf180/sW0.5_sL2/specs.json | 23 + .../cases/C12/gf180/sW0.5_sL2/target.spice | 4 + .../C12/gf180/sW0.5_sL2/target_lvs.spice | 8 + .../cases/C12/gf180/sW0.5_sL2/testbench.spice | 26 + .../cases/C12/gf180/sW1.5_sL1.5/case.json | 88 + .../cases/C12/gf180/sW1.5_sL1.5/manifest.json | 8 + .../C12/gf180/sW1.5_sL1.5/qualification.json | 83 + .../cases/C12/gf180/sW1.5_sL1.5/specs.json | 23 + .../cases/C12/gf180/sW1.5_sL1.5/target.spice | 4 + .../C12/gf180/sW1.5_sL1.5/target_lvs.spice | 20 + .../C12/gf180/sW1.5_sL1.5/testbench.spice | 26 + .../data/cases/C12/gf180/sW1.5_sL1/case.json | 88 + .../cases/C12/gf180/sW1.5_sL1/manifest.json | 8 + .../C12/gf180/sW1.5_sL1/qualification.json | 83 + .../data/cases/C12/gf180/sW1.5_sL1/specs.json | 23 + .../cases/C12/gf180/sW1.5_sL1/target.spice | 4 + .../C12/gf180/sW1.5_sL1/target_lvs.spice | 20 + .../cases/C12/gf180/sW1.5_sL1/testbench.spice | 26 + .../data/cases/C12/gf180/sW1.5_sL2/case.json | 88 + .../cases/C12/gf180/sW1.5_sL2/manifest.json | 8 + .../C12/gf180/sW1.5_sL2/qualification.json | 83 + .../data/cases/C12/gf180/sW1.5_sL2/specs.json | 23 + .../cases/C12/gf180/sW1.5_sL2/target.spice | 4 + .../C12/gf180/sW1.5_sL2/target_lvs.spice | 20 + .../cases/C12/gf180/sW1.5_sL2/testbench.spice | 26 + .../data/cases/C12/gf180/sW1_sL1.5/case.json | 88 + .../cases/C12/gf180/sW1_sL1.5/manifest.json | 8 + .../C12/gf180/sW1_sL1.5/qualification.json | 83 + .../data/cases/C12/gf180/sW1_sL1.5/specs.json | 23 + .../cases/C12/gf180/sW1_sL1.5/target.spice | 4 + .../C12/gf180/sW1_sL1.5/target_lvs.spice | 14 + .../cases/C12/gf180/sW1_sL1.5/testbench.spice | 26 + .../data/cases/C12/gf180/sW1_sL1/case.json | 88 + .../cases/C12/gf180/sW1_sL1/manifest.json | 8 + .../C12/gf180/sW1_sL1/qualification.json | 83 + .../data/cases/C12/gf180/sW1_sL1/specs.json | 23 + .../data/cases/C12/gf180/sW1_sL1/target.spice | 4 + .../cases/C12/gf180/sW1_sL1/target_lvs.spice | 14 + .../cases/C12/gf180/sW1_sL1/testbench.spice | 26 + .../data/cases/C12/gf180/sW1_sL2/case.json | 88 + .../cases/C12/gf180/sW1_sL2/manifest.json | 8 + .../C12/gf180/sW1_sL2/qualification.json | 83 + .../data/cases/C12/gf180/sW1_sL2/specs.json | 23 + .../data/cases/C12/gf180/sW1_sL2/target.spice | 4 + .../cases/C12/gf180/sW1_sL2/target_lvs.spice | 14 + .../cases/C12/gf180/sW1_sL2/testbench.spice | 26 + .../data/cases/C12/gf180/sW2_sL1.5/case.json | 88 + .../cases/C12/gf180/sW2_sL1.5/manifest.json | 8 + .../C12/gf180/sW2_sL1.5/qualification.json | 83 + .../data/cases/C12/gf180/sW2_sL1.5/specs.json | 23 + .../cases/C12/gf180/sW2_sL1.5/target.spice | 4 + .../C12/gf180/sW2_sL1.5/target_lvs.spice | 26 + .../cases/C12/gf180/sW2_sL1.5/testbench.spice | 26 + .../data/cases/C12/gf180/sW2_sL1/case.json | 88 + .../cases/C12/gf180/sW2_sL1/manifest.json | 8 + .../C12/gf180/sW2_sL1/qualification.json | 83 + .../data/cases/C12/gf180/sW2_sL1/specs.json | 23 + .../data/cases/C12/gf180/sW2_sL1/target.spice | 4 + .../cases/C12/gf180/sW2_sL1/target_lvs.spice | 26 + .../cases/C12/gf180/sW2_sL1/testbench.spice | 26 + .../data/cases/C12/gf180/sW2_sL2/case.json | 88 + .../cases/C12/gf180/sW2_sL2/manifest.json | 8 + .../C12/gf180/sW2_sL2/qualification.json | 83 + .../data/cases/C12/gf180/sW2_sL2/specs.json | 23 + .../data/cases/C12/gf180/sW2_sL2/target.spice | 4 + .../cases/C12/gf180/sW2_sL2/target_lvs.spice | 26 + .../cases/C12/gf180/sW2_sL2/testbench.spice | 26 + .../cases/C12/ihp130/sW0.5_sL1.5/case.json | 88 + .../C12/ihp130/sW0.5_sL1.5/manifest.json | 8 + .../C12/ihp130/sW0.5_sL1.5/qualification.json | 83 + .../cases/C12/ihp130/sW0.5_sL1.5/specs.json | 23 + .../cases/C12/ihp130/sW0.5_sL1.5/target.spice | 4 + .../C12/ihp130/sW0.5_sL1.5/target_lvs.spice | 8 + .../C12/ihp130/sW0.5_sL1.5/testbench.spice | 26 + .../data/cases/C12/ihp130/sW0.5_sL1/case.json | 88 + .../cases/C12/ihp130/sW0.5_sL1/manifest.json | 8 + .../C12/ihp130/sW0.5_sL1/qualification.json | 83 + .../cases/C12/ihp130/sW0.5_sL1/specs.json | 23 + .../cases/C12/ihp130/sW0.5_sL1/target.spice | 4 + .../C12/ihp130/sW0.5_sL1/target_lvs.spice | 8 + .../C12/ihp130/sW0.5_sL1/testbench.spice | 26 + .../data/cases/C12/ihp130/sW0.5_sL2/case.json | 88 + .../cases/C12/ihp130/sW0.5_sL2/manifest.json | 8 + .../C12/ihp130/sW0.5_sL2/qualification.json | 83 + .../cases/C12/ihp130/sW0.5_sL2/specs.json | 23 + .../cases/C12/ihp130/sW0.5_sL2/target.spice | 4 + .../C12/ihp130/sW0.5_sL2/target_lvs.spice | 8 + .../C12/ihp130/sW0.5_sL2/testbench.spice | 26 + .../cases/C12/ihp130/sW1.5_sL1.5/case.json | 88 + .../C12/ihp130/sW1.5_sL1.5/manifest.json | 8 + .../C12/ihp130/sW1.5_sL1.5/qualification.json | 83 + .../cases/C12/ihp130/sW1.5_sL1.5/specs.json | 23 + .../cases/C12/ihp130/sW1.5_sL1.5/target.spice | 4 + .../C12/ihp130/sW1.5_sL1.5/target_lvs.spice | 20 + .../C12/ihp130/sW1.5_sL1.5/testbench.spice | 26 + .../data/cases/C12/ihp130/sW1.5_sL1/case.json | 88 + .../cases/C12/ihp130/sW1.5_sL1/manifest.json | 8 + .../C12/ihp130/sW1.5_sL1/qualification.json | 83 + .../cases/C12/ihp130/sW1.5_sL1/specs.json | 23 + .../cases/C12/ihp130/sW1.5_sL1/target.spice | 4 + .../C12/ihp130/sW1.5_sL1/target_lvs.spice | 20 + .../C12/ihp130/sW1.5_sL1/testbench.spice | 26 + .../data/cases/C12/ihp130/sW1.5_sL2/case.json | 88 + .../cases/C12/ihp130/sW1.5_sL2/manifest.json | 8 + .../C12/ihp130/sW1.5_sL2/qualification.json | 83 + .../cases/C12/ihp130/sW1.5_sL2/specs.json | 23 + .../cases/C12/ihp130/sW1.5_sL2/target.spice | 4 + .../C12/ihp130/sW1.5_sL2/target_lvs.spice | 20 + .../C12/ihp130/sW1.5_sL2/testbench.spice | 26 + .../data/cases/C12/ihp130/sW1_sL1.5/case.json | 88 + .../cases/C12/ihp130/sW1_sL1.5/manifest.json | 8 + .../C12/ihp130/sW1_sL1.5/qualification.json | 83 + .../cases/C12/ihp130/sW1_sL1.5/specs.json | 23 + .../cases/C12/ihp130/sW1_sL1.5/target.spice | 4 + .../C12/ihp130/sW1_sL1.5/target_lvs.spice | 14 + .../C12/ihp130/sW1_sL1.5/testbench.spice | 26 + .../data/cases/C12/ihp130/sW1_sL1/case.json | 88 + .../cases/C12/ihp130/sW1_sL1/manifest.json | 8 + .../C12/ihp130/sW1_sL1/qualification.json | 83 + .../data/cases/C12/ihp130/sW1_sL1/specs.json | 23 + .../cases/C12/ihp130/sW1_sL1/target.spice | 4 + .../cases/C12/ihp130/sW1_sL1/target_lvs.spice | 14 + .../cases/C12/ihp130/sW1_sL1/testbench.spice | 26 + .../data/cases/C12/ihp130/sW1_sL2/case.json | 88 + .../cases/C12/ihp130/sW1_sL2/manifest.json | 8 + .../C12/ihp130/sW1_sL2/qualification.json | 83 + .../data/cases/C12/ihp130/sW1_sL2/specs.json | 23 + .../cases/C12/ihp130/sW1_sL2/target.spice | 4 + .../cases/C12/ihp130/sW1_sL2/target_lvs.spice | 14 + .../cases/C12/ihp130/sW1_sL2/testbench.spice | 26 + .../data/cases/C12/ihp130/sW2_sL1.5/case.json | 88 + .../cases/C12/ihp130/sW2_sL1.5/manifest.json | 8 + .../C12/ihp130/sW2_sL1.5/qualification.json | 83 + .../cases/C12/ihp130/sW2_sL1.5/specs.json | 23 + .../cases/C12/ihp130/sW2_sL1.5/target.spice | 4 + .../C12/ihp130/sW2_sL1.5/target_lvs.spice | 26 + .../C12/ihp130/sW2_sL1.5/testbench.spice | 26 + .../data/cases/C12/ihp130/sW2_sL1/case.json | 88 + .../cases/C12/ihp130/sW2_sL1/manifest.json | 8 + .../C12/ihp130/sW2_sL1/qualification.json | 83 + .../data/cases/C12/ihp130/sW2_sL1/specs.json | 23 + .../cases/C12/ihp130/sW2_sL1/target.spice | 4 + .../cases/C12/ihp130/sW2_sL1/target_lvs.spice | 26 + .../cases/C12/ihp130/sW2_sL1/testbench.spice | 26 + .../data/cases/C12/ihp130/sW2_sL2/case.json | 88 + .../cases/C12/ihp130/sW2_sL2/manifest.json | 8 + .../C12/ihp130/sW2_sL2/qualification.json | 83 + .../data/cases/C12/ihp130/sW2_sL2/specs.json | 23 + .../cases/C12/ihp130/sW2_sL2/target.spice | 4 + .../cases/C12/ihp130/sW2_sL2/target_lvs.spice | 26 + .../cases/C12/ihp130/sW2_sL2/testbench.spice | 26 + .../cases/C12/sky130/sW0.5_sL1.5/case.json | 88 + .../C12/sky130/sW0.5_sL1.5/manifest.json | 8 + .../C12/sky130/sW0.5_sL1.5/qualification.json | 83 + .../cases/C12/sky130/sW0.5_sL1.5/specs.json | 23 + .../cases/C12/sky130/sW0.5_sL1.5/target.spice | 4 + .../C12/sky130/sW0.5_sL1.5/target_lvs.spice | 8 + .../C12/sky130/sW0.5_sL1.5/testbench.spice | 26 + .../data/cases/C12/sky130/sW0.5_sL1/case.json | 88 + .../cases/C12/sky130/sW0.5_sL1/manifest.json | 8 + .../C12/sky130/sW0.5_sL1/qualification.json | 83 + .../cases/C12/sky130/sW0.5_sL1/specs.json | 23 + .../cases/C12/sky130/sW0.5_sL1/target.spice | 4 + .../C12/sky130/sW0.5_sL1/target_lvs.spice | 8 + .../C12/sky130/sW0.5_sL1/testbench.spice | 26 + .../data/cases/C12/sky130/sW0.5_sL2/case.json | 88 + .../cases/C12/sky130/sW0.5_sL2/manifest.json | 8 + .../C12/sky130/sW0.5_sL2/qualification.json | 85 + .../cases/C12/sky130/sW0.5_sL2/specs.json | 23 + .../cases/C12/sky130/sW0.5_sL2/target.spice | 4 + .../C12/sky130/sW0.5_sL2/target_lvs.spice | 8 + .../C12/sky130/sW0.5_sL2/testbench.spice | 26 + .../cases/C12/sky130/sW1.5_sL1.5/case.json | 88 + .../C12/sky130/sW1.5_sL1.5/manifest.json | 8 + .../C12/sky130/sW1.5_sL1.5/qualification.json | 83 + .../cases/C12/sky130/sW1.5_sL1.5/specs.json | 23 + .../cases/C12/sky130/sW1.5_sL1.5/target.spice | 4 + .../C12/sky130/sW1.5_sL1.5/target_lvs.spice | 20 + .../C12/sky130/sW1.5_sL1.5/testbench.spice | 26 + .../data/cases/C12/sky130/sW1.5_sL1/case.json | 88 + .../cases/C12/sky130/sW1.5_sL1/manifest.json | 8 + .../C12/sky130/sW1.5_sL1/qualification.json | 83 + .../cases/C12/sky130/sW1.5_sL1/specs.json | 23 + .../cases/C12/sky130/sW1.5_sL1/target.spice | 4 + .../C12/sky130/sW1.5_sL1/target_lvs.spice | 20 + .../C12/sky130/sW1.5_sL1/testbench.spice | 26 + .../data/cases/C12/sky130/sW1.5_sL2/case.json | 88 + .../cases/C12/sky130/sW1.5_sL2/manifest.json | 8 + .../C12/sky130/sW1.5_sL2/qualification.json | 83 + .../cases/C12/sky130/sW1.5_sL2/specs.json | 23 + .../cases/C12/sky130/sW1.5_sL2/target.spice | 4 + .../C12/sky130/sW1.5_sL2/target_lvs.spice | 20 + .../C12/sky130/sW1.5_sL2/testbench.spice | 26 + .../data/cases/C12/sky130/sW1_sL1.5/case.json | 88 + .../cases/C12/sky130/sW1_sL1.5/manifest.json | 8 + .../C12/sky130/sW1_sL1.5/qualification.json | 83 + .../cases/C12/sky130/sW1_sL1.5/specs.json | 23 + .../cases/C12/sky130/sW1_sL1.5/target.spice | 4 + .../C12/sky130/sW1_sL1.5/target_lvs.spice | 14 + .../C12/sky130/sW1_sL1.5/testbench.spice | 26 + .../data/cases/C12/sky130/sW1_sL1/case.json | 88 + .../cases/C12/sky130/sW1_sL1/manifest.json | 8 + .../C12/sky130/sW1_sL1/qualification.json | 83 + .../data/cases/C12/sky130/sW1_sL1/specs.json | 23 + .../cases/C12/sky130/sW1_sL1/target.spice | 4 + .../cases/C12/sky130/sW1_sL1/target_lvs.spice | 14 + .../cases/C12/sky130/sW1_sL1/testbench.spice | 26 + .../data/cases/C12/sky130/sW1_sL2/case.json | 88 + .../cases/C12/sky130/sW1_sL2/manifest.json | 8 + .../C12/sky130/sW1_sL2/qualification.json | 83 + .../data/cases/C12/sky130/sW1_sL2/specs.json | 23 + .../cases/C12/sky130/sW1_sL2/target.spice | 4 + .../cases/C12/sky130/sW1_sL2/target_lvs.spice | 14 + .../cases/C12/sky130/sW1_sL2/testbench.spice | 26 + .../data/cases/C12/sky130/sW2_sL1.5/case.json | 88 + .../cases/C12/sky130/sW2_sL1.5/manifest.json | 8 + .../C12/sky130/sW2_sL1.5/qualification.json | 83 + .../cases/C12/sky130/sW2_sL1.5/specs.json | 23 + .../cases/C12/sky130/sW2_sL1.5/target.spice | 4 + .../C12/sky130/sW2_sL1.5/target_lvs.spice | 26 + .../C12/sky130/sW2_sL1.5/testbench.spice | 26 + .../data/cases/C12/sky130/sW2_sL1/case.json | 88 + .../cases/C12/sky130/sW2_sL1/manifest.json | 8 + .../C12/sky130/sW2_sL1/qualification.json | 83 + .../data/cases/C12/sky130/sW2_sL1/specs.json | 23 + .../cases/C12/sky130/sW2_sL1/target.spice | 4 + .../cases/C12/sky130/sW2_sL1/target_lvs.spice | 26 + .../cases/C12/sky130/sW2_sL1/testbench.spice | 26 + .../data/cases/C12/sky130/sW2_sL2/case.json | 88 + .../cases/C12/sky130/sW2_sL2/manifest.json | 8 + .../C12/sky130/sW2_sL2/qualification.json | 83 + .../data/cases/C12/sky130/sW2_sL2/specs.json | 23 + .../cases/C12/sky130/sW2_sL2/target.spice | 4 + .../cases/C12/sky130/sW2_sL2/target_lvs.spice | 26 + .../cases/C12/sky130/sW2_sL2/testbench.spice | 26 + .../cases/C13/gf180/sW1.5_sL1.5/case.json | 170 + .../cases/C13/gf180/sW1.5_sL1.5/manifest.json | 8 + .../C13/gf180/sW1.5_sL1.5/qualification.json | 127 + .../cases/C13/gf180/sW1.5_sL1.5/specs.json | 23 + .../cases/C13/gf180/sW1.5_sL1.5/target.spice | 7 + .../C13/gf180/sW1.5_sL1.5/target_lvs.spice | 19 + .../C13/gf180/sW1.5_sL1.5/testbench.spice | 26 + .../data/cases/C13/gf180/sW1.5_sL1/case.json | 170 + .../cases/C13/gf180/sW1.5_sL1/manifest.json | 8 + .../C13/gf180/sW1.5_sL1/qualification.json | 127 + .../data/cases/C13/gf180/sW1.5_sL1/specs.json | 23 + .../cases/C13/gf180/sW1.5_sL1/target.spice | 7 + .../C13/gf180/sW1.5_sL1/target_lvs.spice | 19 + .../cases/C13/gf180/sW1.5_sL1/testbench.spice | 26 + .../data/cases/C13/gf180/sW1.5_sL2/case.json | 170 + .../cases/C13/gf180/sW1.5_sL2/manifest.json | 8 + .../C13/gf180/sW1.5_sL2/qualification.json | 127 + .../data/cases/C13/gf180/sW1.5_sL2/specs.json | 23 + .../cases/C13/gf180/sW1.5_sL2/target.spice | 7 + .../C13/gf180/sW1.5_sL2/target_lvs.spice | 19 + .../cases/C13/gf180/sW1.5_sL2/testbench.spice | 26 + .../data/cases/C13/gf180/sW1_sL1.5/case.json | 170 + .../cases/C13/gf180/sW1_sL1.5/manifest.json | 8 + .../C13/gf180/sW1_sL1.5/qualification.json | 127 + .../data/cases/C13/gf180/sW1_sL1.5/specs.json | 23 + .../cases/C13/gf180/sW1_sL1.5/target.spice | 7 + .../C13/gf180/sW1_sL1.5/target_lvs.spice | 19 + .../cases/C13/gf180/sW1_sL1.5/testbench.spice | 26 + .../data/cases/C13/gf180/sW1_sL1/case.json | 170 + .../cases/C13/gf180/sW1_sL1/manifest.json | 8 + .../C13/gf180/sW1_sL1/qualification.json | 127 + .../data/cases/C13/gf180/sW1_sL1/specs.json | 23 + .../data/cases/C13/gf180/sW1_sL1/target.spice | 7 + .../cases/C13/gf180/sW1_sL1/target_lvs.spice | 19 + .../cases/C13/gf180/sW1_sL1/testbench.spice | 26 + .../data/cases/C13/gf180/sW1_sL2/case.json | 170 + .../cases/C13/gf180/sW1_sL2/manifest.json | 8 + .../C13/gf180/sW1_sL2/qualification.json | 127 + .../data/cases/C13/gf180/sW1_sL2/specs.json | 23 + .../data/cases/C13/gf180/sW1_sL2/target.spice | 7 + .../cases/C13/gf180/sW1_sL2/target_lvs.spice | 19 + .../cases/C13/gf180/sW1_sL2/testbench.spice | 26 + .../data/cases/C13/gf180/sW2_sL1.5/case.json | 170 + .../cases/C13/gf180/sW2_sL1.5/manifest.json | 8 + .../C13/gf180/sW2_sL1.5/qualification.json | 127 + .../data/cases/C13/gf180/sW2_sL1.5/specs.json | 23 + .../cases/C13/gf180/sW2_sL1.5/target.spice | 7 + .../C13/gf180/sW2_sL1.5/target_lvs.spice | 36 + .../cases/C13/gf180/sW2_sL1.5/testbench.spice | 26 + .../data/cases/C13/gf180/sW2_sL1/case.json | 170 + .../cases/C13/gf180/sW2_sL1/manifest.json | 8 + .../C13/gf180/sW2_sL1/qualification.json | 127 + .../data/cases/C13/gf180/sW2_sL1/specs.json | 23 + .../data/cases/C13/gf180/sW2_sL1/target.spice | 7 + .../cases/C13/gf180/sW2_sL1/target_lvs.spice | 36 + .../cases/C13/gf180/sW2_sL1/testbench.spice | 26 + .../data/cases/C13/gf180/sW2_sL2/case.json | 170 + .../cases/C13/gf180/sW2_sL2/manifest.json | 8 + .../C13/gf180/sW2_sL2/qualification.json | 127 + .../data/cases/C13/gf180/sW2_sL2/specs.json | 23 + .../data/cases/C13/gf180/sW2_sL2/target.spice | 7 + .../cases/C13/gf180/sW2_sL2/target_lvs.spice | 36 + .../cases/C13/gf180/sW2_sL2/testbench.spice | 26 + .../cases/C13/ihp130/sW1.5_sL1.5/case.json | 170 + .../C13/ihp130/sW1.5_sL1.5/manifest.json | 8 + .../C13/ihp130/sW1.5_sL1.5/qualification.json | 127 + .../cases/C13/ihp130/sW1.5_sL1.5/specs.json | 23 + .../cases/C13/ihp130/sW1.5_sL1.5/target.spice | 7 + .../C13/ihp130/sW1.5_sL1.5/target_lvs.spice | 19 + .../C13/ihp130/sW1.5_sL1.5/testbench.spice | 26 + .../data/cases/C13/ihp130/sW1.5_sL1/case.json | 170 + .../cases/C13/ihp130/sW1.5_sL1/manifest.json | 8 + .../C13/ihp130/sW1.5_sL1/qualification.json | 127 + .../cases/C13/ihp130/sW1.5_sL1/specs.json | 23 + .../cases/C13/ihp130/sW1.5_sL1/target.spice | 7 + .../C13/ihp130/sW1.5_sL1/target_lvs.spice | 19 + .../C13/ihp130/sW1.5_sL1/testbench.spice | 26 + .../data/cases/C13/ihp130/sW1.5_sL2/case.json | 170 + .../cases/C13/ihp130/sW1.5_sL2/manifest.json | 8 + .../C13/ihp130/sW1.5_sL2/qualification.json | 127 + .../cases/C13/ihp130/sW1.5_sL2/specs.json | 23 + .../cases/C13/ihp130/sW1.5_sL2/target.spice | 7 + .../C13/ihp130/sW1.5_sL2/target_lvs.spice | 19 + .../C13/ihp130/sW1.5_sL2/testbench.spice | 26 + .../data/cases/C13/ihp130/sW1_sL1.5/case.json | 170 + .../cases/C13/ihp130/sW1_sL1.5/manifest.json | 8 + .../C13/ihp130/sW1_sL1.5/qualification.json | 127 + .../cases/C13/ihp130/sW1_sL1.5/specs.json | 23 + .../cases/C13/ihp130/sW1_sL1.5/target.spice | 7 + .../C13/ihp130/sW1_sL1.5/target_lvs.spice | 19 + .../C13/ihp130/sW1_sL1.5/testbench.spice | 26 + .../data/cases/C13/ihp130/sW1_sL1/case.json | 170 + .../cases/C13/ihp130/sW1_sL1/manifest.json | 8 + .../C13/ihp130/sW1_sL1/qualification.json | 127 + .../data/cases/C13/ihp130/sW1_sL1/specs.json | 23 + .../cases/C13/ihp130/sW1_sL1/target.spice | 7 + .../cases/C13/ihp130/sW1_sL1/target_lvs.spice | 19 + .../cases/C13/ihp130/sW1_sL1/testbench.spice | 26 + .../data/cases/C13/ihp130/sW1_sL2/case.json | 170 + .../cases/C13/ihp130/sW1_sL2/manifest.json | 8 + .../C13/ihp130/sW1_sL2/qualification.json | 127 + .../data/cases/C13/ihp130/sW1_sL2/specs.json | 23 + .../cases/C13/ihp130/sW1_sL2/target.spice | 7 + .../cases/C13/ihp130/sW1_sL2/target_lvs.spice | 19 + .../cases/C13/ihp130/sW1_sL2/testbench.spice | 26 + .../data/cases/C13/ihp130/sW2_sL1.5/case.json | 170 + .../cases/C13/ihp130/sW2_sL1.5/manifest.json | 8 + .../C13/ihp130/sW2_sL1.5/qualification.json | 127 + .../cases/C13/ihp130/sW2_sL1.5/specs.json | 23 + .../cases/C13/ihp130/sW2_sL1.5/target.spice | 7 + .../C13/ihp130/sW2_sL1.5/target_lvs.spice | 36 + .../C13/ihp130/sW2_sL1.5/testbench.spice | 26 + .../data/cases/C13/ihp130/sW2_sL1/case.json | 170 + .../cases/C13/ihp130/sW2_sL1/manifest.json | 8 + .../C13/ihp130/sW2_sL1/qualification.json | 127 + .../data/cases/C13/ihp130/sW2_sL1/specs.json | 23 + .../cases/C13/ihp130/sW2_sL1/target.spice | 7 + .../cases/C13/ihp130/sW2_sL1/target_lvs.spice | 36 + .../cases/C13/ihp130/sW2_sL1/testbench.spice | 26 + .../data/cases/C13/ihp130/sW2_sL2/case.json | 170 + .../cases/C13/ihp130/sW2_sL2/manifest.json | 8 + .../C13/ihp130/sW2_sL2/qualification.json | 127 + .../data/cases/C13/ihp130/sW2_sL2/specs.json | 23 + .../cases/C13/ihp130/sW2_sL2/target.spice | 7 + .../cases/C13/ihp130/sW2_sL2/target_lvs.spice | 36 + .../cases/C13/ihp130/sW2_sL2/testbench.spice | 26 + .../cases/C13/sky130/sW1.5_sL1.5/case.json | 170 + .../C13/sky130/sW1.5_sL1.5/manifest.json | 8 + .../C13/sky130/sW1.5_sL1.5/qualification.json | 127 + .../cases/C13/sky130/sW1.5_sL1.5/specs.json | 23 + .../cases/C13/sky130/sW1.5_sL1.5/target.spice | 7 + .../C13/sky130/sW1.5_sL1.5/target_lvs.spice | 19 + .../C13/sky130/sW1.5_sL1.5/testbench.spice | 26 + .../data/cases/C13/sky130/sW1.5_sL1/case.json | 170 + .../cases/C13/sky130/sW1.5_sL1/manifest.json | 8 + .../C13/sky130/sW1.5_sL1/qualification.json | 127 + .../cases/C13/sky130/sW1.5_sL1/specs.json | 23 + .../cases/C13/sky130/sW1.5_sL1/target.spice | 7 + .../C13/sky130/sW1.5_sL1/target_lvs.spice | 19 + .../C13/sky130/sW1.5_sL1/testbench.spice | 26 + .../data/cases/C13/sky130/sW1.5_sL2/case.json | 170 + .../cases/C13/sky130/sW1.5_sL2/manifest.json | 8 + .../C13/sky130/sW1.5_sL2/qualification.json | 127 + .../cases/C13/sky130/sW1.5_sL2/specs.json | 23 + .../cases/C13/sky130/sW1.5_sL2/target.spice | 7 + .../C13/sky130/sW1.5_sL2/target_lvs.spice | 19 + .../C13/sky130/sW1.5_sL2/testbench.spice | 26 + .../data/cases/C13/sky130/sW1_sL1.5/case.json | 170 + .../cases/C13/sky130/sW1_sL1.5/manifest.json | 8 + .../C13/sky130/sW1_sL1.5/qualification.json | 127 + .../cases/C13/sky130/sW1_sL1.5/specs.json | 23 + .../cases/C13/sky130/sW1_sL1.5/target.spice | 7 + .../C13/sky130/sW1_sL1.5/target_lvs.spice | 19 + .../C13/sky130/sW1_sL1.5/testbench.spice | 26 + .../data/cases/C13/sky130/sW1_sL1/case.json | 170 + .../cases/C13/sky130/sW1_sL1/manifest.json | 8 + .../C13/sky130/sW1_sL1/qualification.json | 127 + .../data/cases/C13/sky130/sW1_sL1/specs.json | 23 + .../cases/C13/sky130/sW1_sL1/target.spice | 7 + .../cases/C13/sky130/sW1_sL1/target_lvs.spice | 19 + .../cases/C13/sky130/sW1_sL1/testbench.spice | 26 + .../data/cases/C13/sky130/sW1_sL2/case.json | 170 + .../cases/C13/sky130/sW1_sL2/manifest.json | 8 + .../C13/sky130/sW1_sL2/qualification.json | 127 + .../data/cases/C13/sky130/sW1_sL2/specs.json | 23 + .../cases/C13/sky130/sW1_sL2/target.spice | 7 + .../cases/C13/sky130/sW1_sL2/target_lvs.spice | 19 + .../cases/C13/sky130/sW1_sL2/testbench.spice | 26 + .../data/cases/C13/sky130/sW2_sL1.5/case.json | 170 + .../cases/C13/sky130/sW2_sL1.5/manifest.json | 8 + .../C13/sky130/sW2_sL1.5/qualification.json | 127 + .../cases/C13/sky130/sW2_sL1.5/specs.json | 23 + .../cases/C13/sky130/sW2_sL1.5/target.spice | 7 + .../C13/sky130/sW2_sL1.5/target_lvs.spice | 36 + .../C13/sky130/sW2_sL1.5/testbench.spice | 26 + .../data/cases/C13/sky130/sW2_sL1/case.json | 170 + .../cases/C13/sky130/sW2_sL1/manifest.json | 8 + .../C13/sky130/sW2_sL1/qualification.json | 127 + .../data/cases/C13/sky130/sW2_sL1/specs.json | 23 + .../cases/C13/sky130/sW2_sL1/target.spice | 7 + .../cases/C13/sky130/sW2_sL1/target_lvs.spice | 36 + .../cases/C13/sky130/sW2_sL1/testbench.spice | 26 + .../data/cases/C13/sky130/sW2_sL2/case.json | 170 + .../cases/C13/sky130/sW2_sL2/manifest.json | 8 + .../C13/sky130/sW2_sL2/qualification.json | 127 + .../data/cases/C13/sky130/sW2_sL2/specs.json | 23 + .../cases/C13/sky130/sW2_sL2/target.spice | 7 + .../cases/C13/sky130/sW2_sL2/target_lvs.spice | 36 + .../cases/C13/sky130/sW2_sL2/testbench.spice | 26 + .../cases/C14/gf180/sW0.5_sL1.5/case.json | 152 + .../cases/C14/gf180/sW0.5_sL1.5/manifest.json | 8 + .../C14/gf180/sW0.5_sL1.5/qualification.json | 115 + .../cases/C14/gf180/sW0.5_sL1.5/specs.json | 23 + .../cases/C14/gf180/sW0.5_sL1.5/target.spice | 6 + .../C14/gf180/sW0.5_sL1.5/target_lvs.spice | 9 + .../C14/gf180/sW0.5_sL1.5/testbench.spice | 26 + .../data/cases/C14/gf180/sW0.5_sL1/case.json | 152 + .../cases/C14/gf180/sW0.5_sL1/manifest.json | 8 + .../C14/gf180/sW0.5_sL1/qualification.json | 115 + .../data/cases/C14/gf180/sW0.5_sL1/specs.json | 23 + .../cases/C14/gf180/sW0.5_sL1/target.spice | 6 + .../C14/gf180/sW0.5_sL1/target_lvs.spice | 9 + .../cases/C14/gf180/sW0.5_sL1/testbench.spice | 26 + .../data/cases/C14/gf180/sW0.5_sL2/case.json | 152 + .../cases/C14/gf180/sW0.5_sL2/manifest.json | 8 + .../C14/gf180/sW0.5_sL2/qualification.json | 115 + .../data/cases/C14/gf180/sW0.5_sL2/specs.json | 23 + .../cases/C14/gf180/sW0.5_sL2/target.spice | 6 + .../C14/gf180/sW0.5_sL2/target_lvs.spice | 9 + .../cases/C14/gf180/sW0.5_sL2/testbench.spice | 26 + .../cases/C14/gf180/sW1.5_sL1.5/case.json | 152 + .../cases/C14/gf180/sW1.5_sL1.5/manifest.json | 8 + .../C14/gf180/sW1.5_sL1.5/qualification.json | 115 + .../cases/C14/gf180/sW1.5_sL1.5/specs.json | 23 + .../cases/C14/gf180/sW1.5_sL1.5/target.spice | 6 + .../C14/gf180/sW1.5_sL1.5/target_lvs.spice | 23 + .../C14/gf180/sW1.5_sL1.5/testbench.spice | 26 + .../data/cases/C14/gf180/sW1.5_sL1/case.json | 152 + .../cases/C14/gf180/sW1.5_sL1/manifest.json | 8 + .../C14/gf180/sW1.5_sL1/qualification.json | 115 + .../data/cases/C14/gf180/sW1.5_sL1/specs.json | 23 + .../cases/C14/gf180/sW1.5_sL1/target.spice | 6 + .../C14/gf180/sW1.5_sL1/target_lvs.spice | 23 + .../cases/C14/gf180/sW1.5_sL1/testbench.spice | 26 + .../data/cases/C14/gf180/sW1.5_sL2/case.json | 152 + .../cases/C14/gf180/sW1.5_sL2/manifest.json | 8 + .../C14/gf180/sW1.5_sL2/qualification.json | 115 + .../data/cases/C14/gf180/sW1.5_sL2/specs.json | 23 + .../cases/C14/gf180/sW1.5_sL2/target.spice | 6 + .../C14/gf180/sW1.5_sL2/target_lvs.spice | 23 + .../cases/C14/gf180/sW1.5_sL2/testbench.spice | 26 + .../data/cases/C14/gf180/sW1_sL1.5/case.json | 152 + .../cases/C14/gf180/sW1_sL1.5/manifest.json | 8 + .../C14/gf180/sW1_sL1.5/qualification.json | 115 + .../data/cases/C14/gf180/sW1_sL1.5/specs.json | 23 + .../cases/C14/gf180/sW1_sL1.5/target.spice | 6 + .../C14/gf180/sW1_sL1.5/target_lvs.spice | 16 + .../cases/C14/gf180/sW1_sL1.5/testbench.spice | 26 + .../data/cases/C14/gf180/sW1_sL1/case.json | 152 + .../cases/C14/gf180/sW1_sL1/manifest.json | 8 + .../C14/gf180/sW1_sL1/qualification.json | 115 + .../data/cases/C14/gf180/sW1_sL1/specs.json | 23 + .../data/cases/C14/gf180/sW1_sL1/target.spice | 6 + .../cases/C14/gf180/sW1_sL1/target_lvs.spice | 16 + .../cases/C14/gf180/sW1_sL1/testbench.spice | 26 + .../data/cases/C14/gf180/sW1_sL2/case.json | 152 + .../cases/C14/gf180/sW1_sL2/manifest.json | 8 + .../C14/gf180/sW1_sL2/qualification.json | 115 + .../data/cases/C14/gf180/sW1_sL2/specs.json | 23 + .../data/cases/C14/gf180/sW1_sL2/target.spice | 6 + .../cases/C14/gf180/sW1_sL2/target_lvs.spice | 16 + .../cases/C14/gf180/sW1_sL2/testbench.spice | 26 + .../data/cases/C14/gf180/sW2_sL1.5/case.json | 152 + .../cases/C14/gf180/sW2_sL1.5/manifest.json | 8 + .../C14/gf180/sW2_sL1.5/qualification.json | 115 + .../data/cases/C14/gf180/sW2_sL1.5/specs.json | 23 + .../cases/C14/gf180/sW2_sL1.5/target.spice | 6 + .../C14/gf180/sW2_sL1.5/target_lvs.spice | 30 + .../cases/C14/gf180/sW2_sL1.5/testbench.spice | 26 + .../data/cases/C14/gf180/sW2_sL1/case.json | 152 + .../cases/C14/gf180/sW2_sL1/manifest.json | 8 + .../C14/gf180/sW2_sL1/qualification.json | 115 + .../data/cases/C14/gf180/sW2_sL1/specs.json | 23 + .../data/cases/C14/gf180/sW2_sL1/target.spice | 6 + .../cases/C14/gf180/sW2_sL1/target_lvs.spice | 30 + .../cases/C14/gf180/sW2_sL1/testbench.spice | 26 + .../data/cases/C14/gf180/sW2_sL2/case.json | 152 + .../cases/C14/gf180/sW2_sL2/manifest.json | 8 + .../C14/gf180/sW2_sL2/qualification.json | 115 + .../data/cases/C14/gf180/sW2_sL2/specs.json | 23 + .../data/cases/C14/gf180/sW2_sL2/target.spice | 6 + .../cases/C14/gf180/sW2_sL2/target_lvs.spice | 30 + .../cases/C14/gf180/sW2_sL2/testbench.spice | 26 + .../cases/C14/ihp130/sW0.5_sL1.5/case.json | 152 + .../C14/ihp130/sW0.5_sL1.5/manifest.json | 8 + .../C14/ihp130/sW0.5_sL1.5/qualification.json | 115 + .../cases/C14/ihp130/sW0.5_sL1.5/specs.json | 23 + .../cases/C14/ihp130/sW0.5_sL1.5/target.spice | 6 + .../C14/ihp130/sW0.5_sL1.5/target_lvs.spice | 9 + .../C14/ihp130/sW0.5_sL1.5/testbench.spice | 26 + .../data/cases/C14/ihp130/sW0.5_sL1/case.json | 152 + .../cases/C14/ihp130/sW0.5_sL1/manifest.json | 8 + .../C14/ihp130/sW0.5_sL1/qualification.json | 115 + .../cases/C14/ihp130/sW0.5_sL1/specs.json | 23 + .../cases/C14/ihp130/sW0.5_sL1/target.spice | 6 + .../C14/ihp130/sW0.5_sL1/target_lvs.spice | 9 + .../C14/ihp130/sW0.5_sL1/testbench.spice | 26 + .../data/cases/C14/ihp130/sW0.5_sL2/case.json | 152 + .../cases/C14/ihp130/sW0.5_sL2/manifest.json | 8 + .../C14/ihp130/sW0.5_sL2/qualification.json | 115 + .../cases/C14/ihp130/sW0.5_sL2/specs.json | 23 + .../cases/C14/ihp130/sW0.5_sL2/target.spice | 6 + .../C14/ihp130/sW0.5_sL2/target_lvs.spice | 9 + .../C14/ihp130/sW0.5_sL2/testbench.spice | 26 + .../cases/C14/ihp130/sW1.5_sL1.5/case.json | 152 + .../C14/ihp130/sW1.5_sL1.5/manifest.json | 8 + .../C14/ihp130/sW1.5_sL1.5/qualification.json | 115 + .../cases/C14/ihp130/sW1.5_sL1.5/specs.json | 23 + .../cases/C14/ihp130/sW1.5_sL1.5/target.spice | 6 + .../C14/ihp130/sW1.5_sL1.5/target_lvs.spice | 23 + .../C14/ihp130/sW1.5_sL1.5/testbench.spice | 26 + .../data/cases/C14/ihp130/sW1.5_sL1/case.json | 152 + .../cases/C14/ihp130/sW1.5_sL1/manifest.json | 8 + .../C14/ihp130/sW1.5_sL1/qualification.json | 115 + .../cases/C14/ihp130/sW1.5_sL1/specs.json | 23 + .../cases/C14/ihp130/sW1.5_sL1/target.spice | 6 + .../C14/ihp130/sW1.5_sL1/target_lvs.spice | 23 + .../C14/ihp130/sW1.5_sL1/testbench.spice | 26 + .../data/cases/C14/ihp130/sW1.5_sL2/case.json | 152 + .../cases/C14/ihp130/sW1.5_sL2/manifest.json | 8 + .../C14/ihp130/sW1.5_sL2/qualification.json | 115 + .../cases/C14/ihp130/sW1.5_sL2/specs.json | 23 + .../cases/C14/ihp130/sW1.5_sL2/target.spice | 6 + .../C14/ihp130/sW1.5_sL2/target_lvs.spice | 23 + .../C14/ihp130/sW1.5_sL2/testbench.spice | 26 + .../data/cases/C14/ihp130/sW1_sL1.5/case.json | 152 + .../cases/C14/ihp130/sW1_sL1.5/manifest.json | 8 + .../C14/ihp130/sW1_sL1.5/qualification.json | 115 + .../cases/C14/ihp130/sW1_sL1.5/specs.json | 23 + .../cases/C14/ihp130/sW1_sL1.5/target.spice | 6 + .../C14/ihp130/sW1_sL1.5/target_lvs.spice | 16 + .../C14/ihp130/sW1_sL1.5/testbench.spice | 26 + .../data/cases/C14/ihp130/sW1_sL1/case.json | 152 + .../cases/C14/ihp130/sW1_sL1/manifest.json | 8 + .../C14/ihp130/sW1_sL1/qualification.json | 115 + .../data/cases/C14/ihp130/sW1_sL1/specs.json | 23 + .../cases/C14/ihp130/sW1_sL1/target.spice | 6 + .../cases/C14/ihp130/sW1_sL1/target_lvs.spice | 16 + .../cases/C14/ihp130/sW1_sL1/testbench.spice | 26 + .../data/cases/C14/ihp130/sW1_sL2/case.json | 152 + .../cases/C14/ihp130/sW1_sL2/manifest.json | 8 + .../C14/ihp130/sW1_sL2/qualification.json | 115 + .../data/cases/C14/ihp130/sW1_sL2/specs.json | 23 + .../cases/C14/ihp130/sW1_sL2/target.spice | 6 + .../cases/C14/ihp130/sW1_sL2/target_lvs.spice | 16 + .../cases/C14/ihp130/sW1_sL2/testbench.spice | 26 + .../data/cases/C14/ihp130/sW2_sL1.5/case.json | 152 + .../cases/C14/ihp130/sW2_sL1.5/manifest.json | 8 + .../C14/ihp130/sW2_sL1.5/qualification.json | 115 + .../cases/C14/ihp130/sW2_sL1.5/specs.json | 23 + .../cases/C14/ihp130/sW2_sL1.5/target.spice | 6 + .../C14/ihp130/sW2_sL1.5/target_lvs.spice | 30 + .../C14/ihp130/sW2_sL1.5/testbench.spice | 26 + .../data/cases/C14/ihp130/sW2_sL1/case.json | 152 + .../cases/C14/ihp130/sW2_sL1/manifest.json | 8 + .../C14/ihp130/sW2_sL1/qualification.json | 115 + .../data/cases/C14/ihp130/sW2_sL1/specs.json | 23 + .../cases/C14/ihp130/sW2_sL1/target.spice | 6 + .../cases/C14/ihp130/sW2_sL1/target_lvs.spice | 30 + .../cases/C14/ihp130/sW2_sL1/testbench.spice | 26 + .../data/cases/C14/ihp130/sW2_sL2/case.json | 152 + .../cases/C14/ihp130/sW2_sL2/manifest.json | 8 + .../C14/ihp130/sW2_sL2/qualification.json | 115 + .../data/cases/C14/ihp130/sW2_sL2/specs.json | 23 + .../cases/C14/ihp130/sW2_sL2/target.spice | 6 + .../cases/C14/ihp130/sW2_sL2/target_lvs.spice | 30 + .../cases/C14/ihp130/sW2_sL2/testbench.spice | 26 + .../cases/C14/sky130/sW0.5_sL1.5/case.json | 152 + .../C14/sky130/sW0.5_sL1.5/manifest.json | 8 + .../C14/sky130/sW0.5_sL1.5/qualification.json | 115 + .../cases/C14/sky130/sW0.5_sL1.5/specs.json | 23 + .../cases/C14/sky130/sW0.5_sL1.5/target.spice | 6 + .../C14/sky130/sW0.5_sL1.5/target_lvs.spice | 9 + .../C14/sky130/sW0.5_sL1.5/testbench.spice | 26 + .../data/cases/C14/sky130/sW0.5_sL1/case.json | 152 + .../cases/C14/sky130/sW0.5_sL1/manifest.json | 8 + .../C14/sky130/sW0.5_sL1/qualification.json | 115 + .../cases/C14/sky130/sW0.5_sL1/specs.json | 23 + .../cases/C14/sky130/sW0.5_sL1/target.spice | 6 + .../C14/sky130/sW0.5_sL1/target_lvs.spice | 9 + .../C14/sky130/sW0.5_sL1/testbench.spice | 26 + .../data/cases/C14/sky130/sW0.5_sL2/case.json | 152 + .../cases/C14/sky130/sW0.5_sL2/manifest.json | 8 + .../C14/sky130/sW0.5_sL2/qualification.json | 115 + .../cases/C14/sky130/sW0.5_sL2/specs.json | 23 + .../cases/C14/sky130/sW0.5_sL2/target.spice | 6 + .../C14/sky130/sW0.5_sL2/target_lvs.spice | 9 + .../C14/sky130/sW0.5_sL2/testbench.spice | 26 + .../cases/C14/sky130/sW1.5_sL1.5/case.json | 152 + .../C14/sky130/sW1.5_sL1.5/manifest.json | 8 + .../C14/sky130/sW1.5_sL1.5/qualification.json | 115 + .../cases/C14/sky130/sW1.5_sL1.5/specs.json | 23 + .../cases/C14/sky130/sW1.5_sL1.5/target.spice | 6 + .../C14/sky130/sW1.5_sL1.5/target_lvs.spice | 23 + .../C14/sky130/sW1.5_sL1.5/testbench.spice | 26 + .../data/cases/C14/sky130/sW1.5_sL1/case.json | 152 + .../cases/C14/sky130/sW1.5_sL1/manifest.json | 8 + .../C14/sky130/sW1.5_sL1/qualification.json | 115 + .../cases/C14/sky130/sW1.5_sL1/specs.json | 23 + .../cases/C14/sky130/sW1.5_sL1/target.spice | 6 + .../C14/sky130/sW1.5_sL1/target_lvs.spice | 23 + .../C14/sky130/sW1.5_sL1/testbench.spice | 26 + .../data/cases/C14/sky130/sW1.5_sL2/case.json | 152 + .../cases/C14/sky130/sW1.5_sL2/manifest.json | 8 + .../C14/sky130/sW1.5_sL2/qualification.json | 115 + .../cases/C14/sky130/sW1.5_sL2/specs.json | 23 + .../cases/C14/sky130/sW1.5_sL2/target.spice | 6 + .../C14/sky130/sW1.5_sL2/target_lvs.spice | 23 + .../C14/sky130/sW1.5_sL2/testbench.spice | 26 + .../data/cases/C14/sky130/sW1_sL1.5/case.json | 152 + .../cases/C14/sky130/sW1_sL1.5/manifest.json | 8 + .../C14/sky130/sW1_sL1.5/qualification.json | 115 + .../cases/C14/sky130/sW1_sL1.5/specs.json | 23 + .../cases/C14/sky130/sW1_sL1.5/target.spice | 6 + .../C14/sky130/sW1_sL1.5/target_lvs.spice | 16 + .../C14/sky130/sW1_sL1.5/testbench.spice | 26 + .../data/cases/C14/sky130/sW1_sL1/case.json | 152 + .../cases/C14/sky130/sW1_sL1/manifest.json | 8 + .../C14/sky130/sW1_sL1/qualification.json | 115 + .../data/cases/C14/sky130/sW1_sL1/specs.json | 23 + .../cases/C14/sky130/sW1_sL1/target.spice | 6 + .../cases/C14/sky130/sW1_sL1/target_lvs.spice | 16 + .../cases/C14/sky130/sW1_sL1/testbench.spice | 26 + .../data/cases/C14/sky130/sW1_sL2/case.json | 152 + .../cases/C14/sky130/sW1_sL2/manifest.json | 8 + .../C14/sky130/sW1_sL2/qualification.json | 115 + .../data/cases/C14/sky130/sW1_sL2/specs.json | 23 + .../cases/C14/sky130/sW1_sL2/target.spice | 6 + .../cases/C14/sky130/sW1_sL2/target_lvs.spice | 16 + .../cases/C14/sky130/sW1_sL2/testbench.spice | 26 + .../data/cases/C14/sky130/sW2_sL1.5/case.json | 152 + .../cases/C14/sky130/sW2_sL1.5/manifest.json | 8 + .../C14/sky130/sW2_sL1.5/qualification.json | 115 + .../cases/C14/sky130/sW2_sL1.5/specs.json | 23 + .../cases/C14/sky130/sW2_sL1.5/target.spice | 6 + .../C14/sky130/sW2_sL1.5/target_lvs.spice | 30 + .../C14/sky130/sW2_sL1.5/testbench.spice | 26 + .../data/cases/C14/sky130/sW2_sL1/case.json | 152 + .../cases/C14/sky130/sW2_sL1/manifest.json | 8 + .../C14/sky130/sW2_sL1/qualification.json | 115 + .../data/cases/C14/sky130/sW2_sL1/specs.json | 23 + .../cases/C14/sky130/sW2_sL1/target.spice | 6 + .../cases/C14/sky130/sW2_sL1/target_lvs.spice | 30 + .../cases/C14/sky130/sW2_sL1/testbench.spice | 26 + .../data/cases/C14/sky130/sW2_sL2/case.json | 152 + .../cases/C14/sky130/sW2_sL2/manifest.json | 8 + .../C14/sky130/sW2_sL2/qualification.json | 115 + .../data/cases/C14/sky130/sW2_sL2/specs.json | 23 + .../cases/C14/sky130/sW2_sL2/target.spice | 6 + .../cases/C14/sky130/sW2_sL2/target_lvs.spice | 30 + .../cases/C14/sky130/sW2_sL2/testbench.spice | 26 + .../cases/C15/gf180/sW0.5_sL1.5/case.json | 77 + .../cases/C15/gf180/sW0.5_sL1.5/manifest.json | 8 + .../C15/gf180/sW0.5_sL1.5/qualification.json | 73 + .../cases/C15/gf180/sW0.5_sL1.5/specs.json | 23 + .../cases/C15/gf180/sW0.5_sL1.5/target.spice | 4 + .../C15/gf180/sW0.5_sL1.5/target_lvs.spice | 5 + .../C15/gf180/sW0.5_sL1.5/testbench.spice | 26 + .../data/cases/C15/gf180/sW0.5_sL1/case.json | 77 + .../cases/C15/gf180/sW0.5_sL1/manifest.json | 8 + .../C15/gf180/sW0.5_sL1/qualification.json | 71 + .../data/cases/C15/gf180/sW0.5_sL1/specs.json | 23 + .../cases/C15/gf180/sW0.5_sL1/target.spice | 4 + .../C15/gf180/sW0.5_sL1/target_lvs.spice | 5 + .../cases/C15/gf180/sW0.5_sL1/testbench.spice | 26 + .../data/cases/C15/gf180/sW0.5_sL2/case.json | 77 + .../cases/C15/gf180/sW0.5_sL2/manifest.json | 8 + .../C15/gf180/sW0.5_sL2/qualification.json | 73 + .../data/cases/C15/gf180/sW0.5_sL2/specs.json | 23 + .../cases/C15/gf180/sW0.5_sL2/target.spice | 4 + .../C15/gf180/sW0.5_sL2/target_lvs.spice | 5 + .../cases/C15/gf180/sW0.5_sL2/testbench.spice | 26 + .../cases/C15/gf180/sW1.5_sL1.5/case.json | 77 + .../cases/C15/gf180/sW1.5_sL1.5/manifest.json | 8 + .../C15/gf180/sW1.5_sL1.5/qualification.json | 71 + .../cases/C15/gf180/sW1.5_sL1.5/specs.json | 23 + .../cases/C15/gf180/sW1.5_sL1.5/target.spice | 4 + .../C15/gf180/sW1.5_sL1.5/target_lvs.spice | 9 + .../C15/gf180/sW1.5_sL1.5/testbench.spice | 26 + .../data/cases/C15/gf180/sW1.5_sL1/case.json | 77 + .../cases/C15/gf180/sW1.5_sL1/manifest.json | 8 + .../C15/gf180/sW1.5_sL1/qualification.json | 71 + .../data/cases/C15/gf180/sW1.5_sL1/specs.json | 23 + .../cases/C15/gf180/sW1.5_sL1/target.spice | 4 + .../C15/gf180/sW1.5_sL1/target_lvs.spice | 9 + .../cases/C15/gf180/sW1.5_sL1/testbench.spice | 26 + .../data/cases/C15/gf180/sW1.5_sL2/case.json | 77 + .../cases/C15/gf180/sW1.5_sL2/manifest.json | 8 + .../C15/gf180/sW1.5_sL2/qualification.json | 71 + .../data/cases/C15/gf180/sW1.5_sL2/specs.json | 23 + .../cases/C15/gf180/sW1.5_sL2/target.spice | 4 + .../C15/gf180/sW1.5_sL2/target_lvs.spice | 9 + .../cases/C15/gf180/sW1.5_sL2/testbench.spice | 26 + .../data/cases/C15/gf180/sW1_sL1.5/case.json | 77 + .../cases/C15/gf180/sW1_sL1.5/manifest.json | 8 + .../C15/gf180/sW1_sL1.5/qualification.json | 71 + .../data/cases/C15/gf180/sW1_sL1.5/specs.json | 23 + .../cases/C15/gf180/sW1_sL1.5/target.spice | 4 + .../C15/gf180/sW1_sL1.5/target_lvs.spice | 7 + .../cases/C15/gf180/sW1_sL1.5/testbench.spice | 26 + .../data/cases/C15/gf180/sW1_sL1/case.json | 77 + .../cases/C15/gf180/sW1_sL1/manifest.json | 8 + .../C15/gf180/sW1_sL1/qualification.json | 71 + .../data/cases/C15/gf180/sW1_sL1/specs.json | 23 + .../data/cases/C15/gf180/sW1_sL1/target.spice | 4 + .../cases/C15/gf180/sW1_sL1/target_lvs.spice | 7 + .../cases/C15/gf180/sW1_sL1/testbench.spice | 26 + .../data/cases/C15/gf180/sW1_sL2/case.json | 77 + .../cases/C15/gf180/sW1_sL2/manifest.json | 8 + .../C15/gf180/sW1_sL2/qualification.json | 71 + .../data/cases/C15/gf180/sW1_sL2/specs.json | 23 + .../data/cases/C15/gf180/sW1_sL2/target.spice | 4 + .../cases/C15/gf180/sW1_sL2/target_lvs.spice | 7 + .../cases/C15/gf180/sW1_sL2/testbench.spice | 26 + .../data/cases/C15/gf180/sW2_sL1.5/case.json | 77 + .../cases/C15/gf180/sW2_sL1.5/manifest.json | 8 + .../C15/gf180/sW2_sL1.5/qualification.json | 71 + .../data/cases/C15/gf180/sW2_sL1.5/specs.json | 23 + .../cases/C15/gf180/sW2_sL1.5/target.spice | 4 + .../C15/gf180/sW2_sL1.5/target_lvs.spice | 11 + .../cases/C15/gf180/sW2_sL1.5/testbench.spice | 26 + .../data/cases/C15/gf180/sW2_sL1/case.json | 77 + .../cases/C15/gf180/sW2_sL1/manifest.json | 8 + .../C15/gf180/sW2_sL1/qualification.json | 71 + .../data/cases/C15/gf180/sW2_sL1/specs.json | 23 + .../data/cases/C15/gf180/sW2_sL1/target.spice | 4 + .../cases/C15/gf180/sW2_sL1/target_lvs.spice | 11 + .../cases/C15/gf180/sW2_sL1/testbench.spice | 26 + .../data/cases/C15/gf180/sW2_sL2/case.json | 77 + .../cases/C15/gf180/sW2_sL2/manifest.json | 8 + .../C15/gf180/sW2_sL2/qualification.json | 71 + .../data/cases/C15/gf180/sW2_sL2/specs.json | 23 + .../data/cases/C15/gf180/sW2_sL2/target.spice | 4 + .../cases/C15/gf180/sW2_sL2/target_lvs.spice | 11 + .../cases/C15/gf180/sW2_sL2/testbench.spice | 26 + .../cases/C15/ihp130/sW0.5_sL1.5/case.json | 77 + .../C15/ihp130/sW0.5_sL1.5/manifest.json | 8 + .../C15/ihp130/sW0.5_sL1.5/qualification.json | 71 + .../cases/C15/ihp130/sW0.5_sL1.5/specs.json | 23 + .../cases/C15/ihp130/sW0.5_sL1.5/target.spice | 4 + .../C15/ihp130/sW0.5_sL1.5/target_lvs.spice | 5 + .../C15/ihp130/sW0.5_sL1.5/testbench.spice | 26 + .../data/cases/C15/ihp130/sW0.5_sL1/case.json | 77 + .../cases/C15/ihp130/sW0.5_sL1/manifest.json | 8 + .../C15/ihp130/sW0.5_sL1/qualification.json | 71 + .../cases/C15/ihp130/sW0.5_sL1/specs.json | 23 + .../cases/C15/ihp130/sW0.5_sL1/target.spice | 4 + .../C15/ihp130/sW0.5_sL1/target_lvs.spice | 5 + .../C15/ihp130/sW0.5_sL1/testbench.spice | 26 + .../data/cases/C15/ihp130/sW0.5_sL2/case.json | 77 + .../cases/C15/ihp130/sW0.5_sL2/manifest.json | 8 + .../C15/ihp130/sW0.5_sL2/qualification.json | 73 + .../cases/C15/ihp130/sW0.5_sL2/specs.json | 23 + .../cases/C15/ihp130/sW0.5_sL2/target.spice | 4 + .../C15/ihp130/sW0.5_sL2/target_lvs.spice | 5 + .../C15/ihp130/sW0.5_sL2/testbench.spice | 26 + .../cases/C15/ihp130/sW1.5_sL1.5/case.json | 77 + .../C15/ihp130/sW1.5_sL1.5/manifest.json | 8 + .../C15/ihp130/sW1.5_sL1.5/qualification.json | 71 + .../cases/C15/ihp130/sW1.5_sL1.5/specs.json | 23 + .../cases/C15/ihp130/sW1.5_sL1.5/target.spice | 4 + .../C15/ihp130/sW1.5_sL1.5/target_lvs.spice | 9 + .../C15/ihp130/sW1.5_sL1.5/testbench.spice | 26 + .../data/cases/C15/ihp130/sW1.5_sL1/case.json | 77 + .../cases/C15/ihp130/sW1.5_sL1/manifest.json | 8 + .../C15/ihp130/sW1.5_sL1/qualification.json | 71 + .../cases/C15/ihp130/sW1.5_sL1/specs.json | 23 + .../cases/C15/ihp130/sW1.5_sL1/target.spice | 4 + .../C15/ihp130/sW1.5_sL1/target_lvs.spice | 9 + .../C15/ihp130/sW1.5_sL1/testbench.spice | 26 + .../data/cases/C15/ihp130/sW1.5_sL2/case.json | 77 + .../cases/C15/ihp130/sW1.5_sL2/manifest.json | 8 + .../C15/ihp130/sW1.5_sL2/qualification.json | 71 + .../cases/C15/ihp130/sW1.5_sL2/specs.json | 23 + .../cases/C15/ihp130/sW1.5_sL2/target.spice | 4 + .../C15/ihp130/sW1.5_sL2/target_lvs.spice | 9 + .../C15/ihp130/sW1.5_sL2/testbench.spice | 26 + .../data/cases/C15/ihp130/sW1_sL1.5/case.json | 77 + .../cases/C15/ihp130/sW1_sL1.5/manifest.json | 8 + .../C15/ihp130/sW1_sL1.5/qualification.json | 71 + .../cases/C15/ihp130/sW1_sL1.5/specs.json | 23 + .../cases/C15/ihp130/sW1_sL1.5/target.spice | 4 + .../C15/ihp130/sW1_sL1.5/target_lvs.spice | 7 + .../C15/ihp130/sW1_sL1.5/testbench.spice | 26 + .../data/cases/C15/ihp130/sW1_sL1/case.json | 77 + .../cases/C15/ihp130/sW1_sL1/manifest.json | 8 + .../C15/ihp130/sW1_sL1/qualification.json | 71 + .../data/cases/C15/ihp130/sW1_sL1/specs.json | 23 + .../cases/C15/ihp130/sW1_sL1/target.spice | 4 + .../cases/C15/ihp130/sW1_sL1/target_lvs.spice | 7 + .../cases/C15/ihp130/sW1_sL1/testbench.spice | 26 + .../data/cases/C15/ihp130/sW1_sL2/case.json | 77 + .../cases/C15/ihp130/sW1_sL2/manifest.json | 8 + .../C15/ihp130/sW1_sL2/qualification.json | 71 + .../data/cases/C15/ihp130/sW1_sL2/specs.json | 23 + .../cases/C15/ihp130/sW1_sL2/target.spice | 4 + .../cases/C15/ihp130/sW1_sL2/target_lvs.spice | 7 + .../cases/C15/ihp130/sW1_sL2/testbench.spice | 26 + .../data/cases/C15/ihp130/sW2_sL1.5/case.json | 77 + .../cases/C15/ihp130/sW2_sL1.5/manifest.json | 8 + .../C15/ihp130/sW2_sL1.5/qualification.json | 71 + .../cases/C15/ihp130/sW2_sL1.5/specs.json | 23 + .../cases/C15/ihp130/sW2_sL1.5/target.spice | 4 + .../C15/ihp130/sW2_sL1.5/target_lvs.spice | 11 + .../C15/ihp130/sW2_sL1.5/testbench.spice | 26 + .../data/cases/C15/ihp130/sW2_sL1/case.json | 77 + .../cases/C15/ihp130/sW2_sL1/manifest.json | 8 + .../C15/ihp130/sW2_sL1/qualification.json | 71 + .../data/cases/C15/ihp130/sW2_sL1/specs.json | 23 + .../cases/C15/ihp130/sW2_sL1/target.spice | 4 + .../cases/C15/ihp130/sW2_sL1/target_lvs.spice | 11 + .../cases/C15/ihp130/sW2_sL1/testbench.spice | 26 + .../data/cases/C15/ihp130/sW2_sL2/case.json | 77 + .../cases/C15/ihp130/sW2_sL2/manifest.json | 8 + .../C15/ihp130/sW2_sL2/qualification.json | 71 + .../data/cases/C15/ihp130/sW2_sL2/specs.json | 23 + .../cases/C15/ihp130/sW2_sL2/target.spice | 4 + .../cases/C15/ihp130/sW2_sL2/target_lvs.spice | 11 + .../cases/C15/ihp130/sW2_sL2/testbench.spice | 26 + .../cases/C15/sky130/sW0.5_sL1.5/case.json | 77 + .../C15/sky130/sW0.5_sL1.5/manifest.json | 8 + .../C15/sky130/sW0.5_sL1.5/qualification.json | 71 + .../cases/C15/sky130/sW0.5_sL1.5/specs.json | 23 + .../cases/C15/sky130/sW0.5_sL1.5/target.spice | 4 + .../C15/sky130/sW0.5_sL1.5/target_lvs.spice | 5 + .../C15/sky130/sW0.5_sL1.5/testbench.spice | 26 + .../data/cases/C15/sky130/sW0.5_sL1/case.json | 77 + .../cases/C15/sky130/sW0.5_sL1/manifest.json | 8 + .../C15/sky130/sW0.5_sL1/qualification.json | 71 + .../cases/C15/sky130/sW0.5_sL1/specs.json | 23 + .../cases/C15/sky130/sW0.5_sL1/target.spice | 4 + .../C15/sky130/sW0.5_sL1/target_lvs.spice | 5 + .../C15/sky130/sW0.5_sL1/testbench.spice | 26 + .../data/cases/C15/sky130/sW0.5_sL2/case.json | 77 + .../cases/C15/sky130/sW0.5_sL2/manifest.json | 8 + .../C15/sky130/sW0.5_sL2/qualification.json | 71 + .../cases/C15/sky130/sW0.5_sL2/specs.json | 23 + .../cases/C15/sky130/sW0.5_sL2/target.spice | 4 + .../C15/sky130/sW0.5_sL2/target_lvs.spice | 5 + .../C15/sky130/sW0.5_sL2/testbench.spice | 26 + .../cases/C15/sky130/sW1.5_sL1.5/case.json | 77 + .../C15/sky130/sW1.5_sL1.5/manifest.json | 8 + .../C15/sky130/sW1.5_sL1.5/qualification.json | 71 + .../cases/C15/sky130/sW1.5_sL1.5/specs.json | 23 + .../cases/C15/sky130/sW1.5_sL1.5/target.spice | 4 + .../C15/sky130/sW1.5_sL1.5/target_lvs.spice | 9 + .../C15/sky130/sW1.5_sL1.5/testbench.spice | 26 + .../data/cases/C15/sky130/sW1.5_sL1/case.json | 77 + .../cases/C15/sky130/sW1.5_sL1/manifest.json | 8 + .../C15/sky130/sW1.5_sL1/qualification.json | 71 + .../cases/C15/sky130/sW1.5_sL1/specs.json | 23 + .../cases/C15/sky130/sW1.5_sL1/target.spice | 4 + .../C15/sky130/sW1.5_sL1/target_lvs.spice | 9 + .../C15/sky130/sW1.5_sL1/testbench.spice | 26 + .../data/cases/C15/sky130/sW1.5_sL2/case.json | 77 + .../cases/C15/sky130/sW1.5_sL2/manifest.json | 8 + .../C15/sky130/sW1.5_sL2/qualification.json | 71 + .../cases/C15/sky130/sW1.5_sL2/specs.json | 23 + .../cases/C15/sky130/sW1.5_sL2/target.spice | 4 + .../C15/sky130/sW1.5_sL2/target_lvs.spice | 9 + .../C15/sky130/sW1.5_sL2/testbench.spice | 26 + .../data/cases/C15/sky130/sW1_sL1.5/case.json | 77 + .../cases/C15/sky130/sW1_sL1.5/manifest.json | 8 + .../C15/sky130/sW1_sL1.5/qualification.json | 71 + .../cases/C15/sky130/sW1_sL1.5/specs.json | 23 + .../cases/C15/sky130/sW1_sL1.5/target.spice | 4 + .../C15/sky130/sW1_sL1.5/target_lvs.spice | 7 + .../C15/sky130/sW1_sL1.5/testbench.spice | 26 + .../data/cases/C15/sky130/sW1_sL1/case.json | 77 + .../cases/C15/sky130/sW1_sL1/manifest.json | 8 + .../C15/sky130/sW1_sL1/qualification.json | 71 + .../data/cases/C15/sky130/sW1_sL1/specs.json | 23 + .../cases/C15/sky130/sW1_sL1/target.spice | 4 + .../cases/C15/sky130/sW1_sL1/target_lvs.spice | 7 + .../cases/C15/sky130/sW1_sL1/testbench.spice | 26 + .../data/cases/C15/sky130/sW1_sL2/case.json | 77 + .../cases/C15/sky130/sW1_sL2/manifest.json | 8 + .../C15/sky130/sW1_sL2/qualification.json | 71 + .../data/cases/C15/sky130/sW1_sL2/specs.json | 23 + .../cases/C15/sky130/sW1_sL2/target.spice | 4 + .../cases/C15/sky130/sW1_sL2/target_lvs.spice | 7 + .../cases/C15/sky130/sW1_sL2/testbench.spice | 26 + .../data/cases/C15/sky130/sW2_sL1.5/case.json | 77 + .../cases/C15/sky130/sW2_sL1.5/manifest.json | 8 + .../C15/sky130/sW2_sL1.5/qualification.json | 71 + .../cases/C15/sky130/sW2_sL1.5/specs.json | 23 + .../cases/C15/sky130/sW2_sL1.5/target.spice | 4 + .../C15/sky130/sW2_sL1.5/target_lvs.spice | 11 + .../C15/sky130/sW2_sL1.5/testbench.spice | 26 + .../data/cases/C15/sky130/sW2_sL1/case.json | 77 + .../cases/C15/sky130/sW2_sL1/manifest.json | 8 + .../C15/sky130/sW2_sL1/qualification.json | 71 + .../data/cases/C15/sky130/sW2_sL1/specs.json | 23 + .../cases/C15/sky130/sW2_sL1/target.spice | 4 + .../cases/C15/sky130/sW2_sL1/target_lvs.spice | 11 + .../cases/C15/sky130/sW2_sL1/testbench.spice | 26 + .../data/cases/C15/sky130/sW2_sL2/case.json | 77 + .../cases/C15/sky130/sW2_sL2/manifest.json | 8 + .../C15/sky130/sW2_sL2/qualification.json | 71 + .../data/cases/C15/sky130/sW2_sL2/specs.json | 23 + .../cases/C15/sky130/sW2_sL2/target.spice | 4 + .../cases/C15/sky130/sW2_sL2/target_lvs.spice | 11 + .../cases/C15/sky130/sW2_sL2/testbench.spice | 26 + .../cases/C16/gf180/sW0.5_sL1.5/case.json | 117 + .../cases/C16/gf180/sW0.5_sL1.5/manifest.json | 8 + .../C16/gf180/sW0.5_sL1.5/qualification.json | 86 + .../cases/C16/gf180/sW0.5_sL1.5/specs.json | 23 + .../cases/C16/gf180/sW0.5_sL1.5/target.spice | 6 + .../C16/gf180/sW0.5_sL1.5/target_lvs.spice | 12 + .../C16/gf180/sW0.5_sL1.5/testbench.spice | 40 + .../data/cases/C16/gf180/sW0.5_sL1/case.json | 117 + .../cases/C16/gf180/sW0.5_sL1/manifest.json | 8 + .../C16/gf180/sW0.5_sL1/qualification.json | 84 + .../data/cases/C16/gf180/sW0.5_sL1/specs.json | 23 + .../cases/C16/gf180/sW0.5_sL1/target.spice | 6 + .../C16/gf180/sW0.5_sL1/target_lvs.spice | 12 + .../cases/C16/gf180/sW0.5_sL1/testbench.spice | 40 + .../data/cases/C16/gf180/sW0.5_sL2/case.json | 117 + .../cases/C16/gf180/sW0.5_sL2/manifest.json | 8 + .../C16/gf180/sW0.5_sL2/qualification.json | 86 + .../data/cases/C16/gf180/sW0.5_sL2/specs.json | 23 + .../cases/C16/gf180/sW0.5_sL2/target.spice | 6 + .../C16/gf180/sW0.5_sL2/target_lvs.spice | 12 + .../cases/C16/gf180/sW0.5_sL2/testbench.spice | 40 + .../cases/C16/gf180/sW1.5_sL1.5/case.json | 117 + .../cases/C16/gf180/sW1.5_sL1.5/manifest.json | 8 + .../C16/gf180/sW1.5_sL1.5/qualification.json | 84 + .../cases/C16/gf180/sW1.5_sL1.5/specs.json | 23 + .../cases/C16/gf180/sW1.5_sL1.5/target.spice | 6 + .../C16/gf180/sW1.5_sL1.5/target_lvs.spice | 28 + .../C16/gf180/sW1.5_sL1.5/testbench.spice | 40 + .../data/cases/C16/gf180/sW1.5_sL1/case.json | 117 + .../cases/C16/gf180/sW1.5_sL1/manifest.json | 8 + .../C16/gf180/sW1.5_sL1/qualification.json | 84 + .../data/cases/C16/gf180/sW1.5_sL1/specs.json | 23 + .../cases/C16/gf180/sW1.5_sL1/target.spice | 6 + .../C16/gf180/sW1.5_sL1/target_lvs.spice | 28 + .../cases/C16/gf180/sW1.5_sL1/testbench.spice | 40 + .../data/cases/C16/gf180/sW1.5_sL2/case.json | 117 + .../cases/C16/gf180/sW1.5_sL2/manifest.json | 8 + .../C16/gf180/sW1.5_sL2/qualification.json | 84 + .../data/cases/C16/gf180/sW1.5_sL2/specs.json | 23 + .../cases/C16/gf180/sW1.5_sL2/target.spice | 6 + .../C16/gf180/sW1.5_sL2/target_lvs.spice | 28 + .../cases/C16/gf180/sW1.5_sL2/testbench.spice | 40 + .../data/cases/C16/gf180/sW1_sL1.5/case.json | 117 + .../cases/C16/gf180/sW1_sL1.5/manifest.json | 8 + .../C16/gf180/sW1_sL1.5/qualification.json | 84 + .../data/cases/C16/gf180/sW1_sL1.5/specs.json | 23 + .../cases/C16/gf180/sW1_sL1.5/target.spice | 6 + .../C16/gf180/sW1_sL1.5/target_lvs.spice | 20 + .../cases/C16/gf180/sW1_sL1.5/testbench.spice | 40 + .../data/cases/C16/gf180/sW1_sL1/case.json | 117 + .../cases/C16/gf180/sW1_sL1/manifest.json | 8 + .../C16/gf180/sW1_sL1/qualification.json | 84 + .../data/cases/C16/gf180/sW1_sL1/specs.json | 23 + .../data/cases/C16/gf180/sW1_sL1/target.spice | 6 + .../cases/C16/gf180/sW1_sL1/target_lvs.spice | 20 + .../cases/C16/gf180/sW1_sL1/testbench.spice | 40 + .../data/cases/C16/gf180/sW1_sL2/case.json | 117 + .../cases/C16/gf180/sW1_sL2/manifest.json | 8 + .../C16/gf180/sW1_sL2/qualification.json | 84 + .../data/cases/C16/gf180/sW1_sL2/specs.json | 23 + .../data/cases/C16/gf180/sW1_sL2/target.spice | 6 + .../cases/C16/gf180/sW1_sL2/target_lvs.spice | 20 + .../cases/C16/gf180/sW1_sL2/testbench.spice | 40 + .../data/cases/C16/gf180/sW2_sL1.5/case.json | 117 + .../cases/C16/gf180/sW2_sL1.5/manifest.json | 8 + .../C16/gf180/sW2_sL1.5/qualification.json | 84 + .../data/cases/C16/gf180/sW2_sL1.5/specs.json | 23 + .../cases/C16/gf180/sW2_sL1.5/target.spice | 6 + .../C16/gf180/sW2_sL1.5/target_lvs.spice | 36 + .../cases/C16/gf180/sW2_sL1.5/testbench.spice | 40 + .../data/cases/C16/gf180/sW2_sL1/case.json | 117 + .../cases/C16/gf180/sW2_sL1/manifest.json | 8 + .../C16/gf180/sW2_sL1/qualification.json | 84 + .../data/cases/C16/gf180/sW2_sL1/specs.json | 23 + .../data/cases/C16/gf180/sW2_sL1/target.spice | 6 + .../cases/C16/gf180/sW2_sL1/target_lvs.spice | 36 + .../cases/C16/gf180/sW2_sL1/testbench.spice | 40 + .../data/cases/C16/gf180/sW2_sL2/case.json | 117 + .../cases/C16/gf180/sW2_sL2/manifest.json | 8 + .../C16/gf180/sW2_sL2/qualification.json | 84 + .../data/cases/C16/gf180/sW2_sL2/specs.json | 23 + .../data/cases/C16/gf180/sW2_sL2/target.spice | 6 + .../cases/C16/gf180/sW2_sL2/target_lvs.spice | 36 + .../cases/C16/gf180/sW2_sL2/testbench.spice | 40 + .../cases/C16/ihp130/sW0.5_sL1.5/case.json | 117 + .../C16/ihp130/sW0.5_sL1.5/manifest.json | 8 + .../C16/ihp130/sW0.5_sL1.5/qualification.json | 86 + .../cases/C16/ihp130/sW0.5_sL1.5/specs.json | 23 + .../cases/C16/ihp130/sW0.5_sL1.5/target.spice | 6 + .../C16/ihp130/sW0.5_sL1.5/target_lvs.spice | 12 + .../C16/ihp130/sW0.5_sL1.5/testbench.spice | 40 + .../data/cases/C16/ihp130/sW0.5_sL1/case.json | 117 + .../cases/C16/ihp130/sW0.5_sL1/manifest.json | 8 + .../C16/ihp130/sW0.5_sL1/qualification.json | 84 + .../cases/C16/ihp130/sW0.5_sL1/specs.json | 23 + .../cases/C16/ihp130/sW0.5_sL1/target.spice | 6 + .../C16/ihp130/sW0.5_sL1/target_lvs.spice | 12 + .../C16/ihp130/sW0.5_sL1/testbench.spice | 40 + .../data/cases/C16/ihp130/sW0.5_sL2/case.json | 117 + .../cases/C16/ihp130/sW0.5_sL2/manifest.json | 8 + .../C16/ihp130/sW0.5_sL2/qualification.json | 86 + .../cases/C16/ihp130/sW0.5_sL2/specs.json | 23 + .../cases/C16/ihp130/sW0.5_sL2/target.spice | 6 + .../C16/ihp130/sW0.5_sL2/target_lvs.spice | 12 + .../C16/ihp130/sW0.5_sL2/testbench.spice | 40 + .../cases/C16/ihp130/sW1.5_sL1.5/case.json | 117 + .../C16/ihp130/sW1.5_sL1.5/manifest.json | 8 + .../C16/ihp130/sW1.5_sL1.5/qualification.json | 84 + .../cases/C16/ihp130/sW1.5_sL1.5/specs.json | 23 + .../cases/C16/ihp130/sW1.5_sL1.5/target.spice | 6 + .../C16/ihp130/sW1.5_sL1.5/target_lvs.spice | 28 + .../C16/ihp130/sW1.5_sL1.5/testbench.spice | 40 + .../data/cases/C16/ihp130/sW1.5_sL1/case.json | 117 + .../cases/C16/ihp130/sW1.5_sL1/manifest.json | 8 + .../C16/ihp130/sW1.5_sL1/qualification.json | 84 + .../cases/C16/ihp130/sW1.5_sL1/specs.json | 23 + .../cases/C16/ihp130/sW1.5_sL1/target.spice | 6 + .../C16/ihp130/sW1.5_sL1/target_lvs.spice | 28 + .../C16/ihp130/sW1.5_sL1/testbench.spice | 40 + .../data/cases/C16/ihp130/sW1.5_sL2/case.json | 117 + .../cases/C16/ihp130/sW1.5_sL2/manifest.json | 8 + .../C16/ihp130/sW1.5_sL2/qualification.json | 84 + .../cases/C16/ihp130/sW1.5_sL2/specs.json | 23 + .../cases/C16/ihp130/sW1.5_sL2/target.spice | 6 + .../C16/ihp130/sW1.5_sL2/target_lvs.spice | 28 + .../C16/ihp130/sW1.5_sL2/testbench.spice | 40 + .../data/cases/C16/ihp130/sW1_sL1.5/case.json | 117 + .../cases/C16/ihp130/sW1_sL1.5/manifest.json | 8 + .../C16/ihp130/sW1_sL1.5/qualification.json | 84 + .../cases/C16/ihp130/sW1_sL1.5/specs.json | 23 + .../cases/C16/ihp130/sW1_sL1.5/target.spice | 6 + .../C16/ihp130/sW1_sL1.5/target_lvs.spice | 20 + .../C16/ihp130/sW1_sL1.5/testbench.spice | 40 + .../data/cases/C16/ihp130/sW1_sL1/case.json | 117 + .../cases/C16/ihp130/sW1_sL1/manifest.json | 8 + .../C16/ihp130/sW1_sL1/qualification.json | 84 + .../data/cases/C16/ihp130/sW1_sL1/specs.json | 23 + .../cases/C16/ihp130/sW1_sL1/target.spice | 6 + .../cases/C16/ihp130/sW1_sL1/target_lvs.spice | 20 + .../cases/C16/ihp130/sW1_sL1/testbench.spice | 40 + .../data/cases/C16/ihp130/sW1_sL2/case.json | 117 + .../cases/C16/ihp130/sW1_sL2/manifest.json | 8 + .../C16/ihp130/sW1_sL2/qualification.json | 84 + .../data/cases/C16/ihp130/sW1_sL2/specs.json | 23 + .../cases/C16/ihp130/sW1_sL2/target.spice | 6 + .../cases/C16/ihp130/sW1_sL2/target_lvs.spice | 20 + .../cases/C16/ihp130/sW1_sL2/testbench.spice | 40 + .../data/cases/C16/ihp130/sW2_sL1.5/case.json | 117 + .../cases/C16/ihp130/sW2_sL1.5/manifest.json | 8 + .../C16/ihp130/sW2_sL1.5/qualification.json | 84 + .../cases/C16/ihp130/sW2_sL1.5/specs.json | 23 + .../cases/C16/ihp130/sW2_sL1.5/target.spice | 6 + .../C16/ihp130/sW2_sL1.5/target_lvs.spice | 36 + .../C16/ihp130/sW2_sL1.5/testbench.spice | 40 + .../data/cases/C16/ihp130/sW2_sL1/case.json | 117 + .../cases/C16/ihp130/sW2_sL1/manifest.json | 8 + .../C16/ihp130/sW2_sL1/qualification.json | 84 + .../data/cases/C16/ihp130/sW2_sL1/specs.json | 23 + .../cases/C16/ihp130/sW2_sL1/target.spice | 6 + .../cases/C16/ihp130/sW2_sL1/target_lvs.spice | 36 + .../cases/C16/ihp130/sW2_sL1/testbench.spice | 40 + .../data/cases/C16/ihp130/sW2_sL2/case.json | 117 + .../cases/C16/ihp130/sW2_sL2/manifest.json | 8 + .../C16/ihp130/sW2_sL2/qualification.json | 84 + .../data/cases/C16/ihp130/sW2_sL2/specs.json | 23 + .../cases/C16/ihp130/sW2_sL2/target.spice | 6 + .../cases/C16/ihp130/sW2_sL2/target_lvs.spice | 36 + .../cases/C16/ihp130/sW2_sL2/testbench.spice | 40 + .../cases/C16/sky130/sW0.5_sL1.5/case.json | 117 + .../C16/sky130/sW0.5_sL1.5/manifest.json | 8 + .../C16/sky130/sW0.5_sL1.5/qualification.json | 84 + .../cases/C16/sky130/sW0.5_sL1.5/specs.json | 23 + .../cases/C16/sky130/sW0.5_sL1.5/target.spice | 6 + .../C16/sky130/sW0.5_sL1.5/target_lvs.spice | 12 + .../C16/sky130/sW0.5_sL1.5/testbench.spice | 40 + .../data/cases/C16/sky130/sW0.5_sL1/case.json | 117 + .../cases/C16/sky130/sW0.5_sL1/manifest.json | 8 + .../C16/sky130/sW0.5_sL1/qualification.json | 84 + .../cases/C16/sky130/sW0.5_sL1/specs.json | 23 + .../cases/C16/sky130/sW0.5_sL1/target.spice | 6 + .../C16/sky130/sW0.5_sL1/target_lvs.spice | 12 + .../C16/sky130/sW0.5_sL1/testbench.spice | 40 + .../data/cases/C16/sky130/sW0.5_sL2/case.json | 117 + .../cases/C16/sky130/sW0.5_sL2/manifest.json | 8 + .../C16/sky130/sW0.5_sL2/qualification.json | 84 + .../cases/C16/sky130/sW0.5_sL2/specs.json | 23 + .../cases/C16/sky130/sW0.5_sL2/target.spice | 6 + .../C16/sky130/sW0.5_sL2/target_lvs.spice | 12 + .../C16/sky130/sW0.5_sL2/testbench.spice | 40 + .../cases/C16/sky130/sW1.5_sL1.5/case.json | 117 + .../C16/sky130/sW1.5_sL1.5/manifest.json | 8 + .../C16/sky130/sW1.5_sL1.5/qualification.json | 84 + .../cases/C16/sky130/sW1.5_sL1.5/specs.json | 23 + .../cases/C16/sky130/sW1.5_sL1.5/target.spice | 6 + .../C16/sky130/sW1.5_sL1.5/target_lvs.spice | 28 + .../C16/sky130/sW1.5_sL1.5/testbench.spice | 40 + .../data/cases/C16/sky130/sW1.5_sL1/case.json | 117 + .../cases/C16/sky130/sW1.5_sL1/manifest.json | 8 + .../C16/sky130/sW1.5_sL1/qualification.json | 84 + .../cases/C16/sky130/sW1.5_sL1/specs.json | 23 + .../cases/C16/sky130/sW1.5_sL1/target.spice | 6 + .../C16/sky130/sW1.5_sL1/target_lvs.spice | 28 + .../C16/sky130/sW1.5_sL1/testbench.spice | 40 + .../data/cases/C16/sky130/sW1.5_sL2/case.json | 117 + .../cases/C16/sky130/sW1.5_sL2/manifest.json | 8 + .../C16/sky130/sW1.5_sL2/qualification.json | 84 + .../cases/C16/sky130/sW1.5_sL2/specs.json | 23 + .../cases/C16/sky130/sW1.5_sL2/target.spice | 6 + .../C16/sky130/sW1.5_sL2/target_lvs.spice | 28 + .../C16/sky130/sW1.5_sL2/testbench.spice | 40 + .../data/cases/C16/sky130/sW1_sL1.5/case.json | 117 + .../cases/C16/sky130/sW1_sL1.5/manifest.json | 8 + .../C16/sky130/sW1_sL1.5/qualification.json | 84 + .../cases/C16/sky130/sW1_sL1.5/specs.json | 23 + .../cases/C16/sky130/sW1_sL1.5/target.spice | 6 + .../C16/sky130/sW1_sL1.5/target_lvs.spice | 20 + .../C16/sky130/sW1_sL1.5/testbench.spice | 40 + .../data/cases/C16/sky130/sW1_sL1/case.json | 117 + .../cases/C16/sky130/sW1_sL1/manifest.json | 8 + .../C16/sky130/sW1_sL1/qualification.json | 84 + .../data/cases/C16/sky130/sW1_sL1/specs.json | 23 + .../cases/C16/sky130/sW1_sL1/target.spice | 6 + .../cases/C16/sky130/sW1_sL1/target_lvs.spice | 20 + .../cases/C16/sky130/sW1_sL1/testbench.spice | 40 + .../data/cases/C16/sky130/sW1_sL2/case.json | 117 + .../cases/C16/sky130/sW1_sL2/manifest.json | 8 + .../C16/sky130/sW1_sL2/qualification.json | 84 + .../data/cases/C16/sky130/sW1_sL2/specs.json | 23 + .../cases/C16/sky130/sW1_sL2/target.spice | 6 + .../cases/C16/sky130/sW1_sL2/target_lvs.spice | 20 + .../cases/C16/sky130/sW1_sL2/testbench.spice | 40 + .../data/cases/C16/sky130/sW2_sL1.5/case.json | 117 + .../cases/C16/sky130/sW2_sL1.5/manifest.json | 8 + .../C16/sky130/sW2_sL1.5/qualification.json | 84 + .../cases/C16/sky130/sW2_sL1.5/specs.json | 23 + .../cases/C16/sky130/sW2_sL1.5/target.spice | 6 + .../C16/sky130/sW2_sL1.5/target_lvs.spice | 36 + .../C16/sky130/sW2_sL1.5/testbench.spice | 40 + .../data/cases/C16/sky130/sW2_sL1/case.json | 117 + .../cases/C16/sky130/sW2_sL1/manifest.json | 8 + .../C16/sky130/sW2_sL1/qualification.json | 84 + .../data/cases/C16/sky130/sW2_sL1/specs.json | 23 + .../cases/C16/sky130/sW2_sL1/target.spice | 6 + .../cases/C16/sky130/sW2_sL1/target_lvs.spice | 36 + .../cases/C16/sky130/sW2_sL1/testbench.spice | 40 + .../data/cases/C16/sky130/sW2_sL2/case.json | 117 + .../cases/C16/sky130/sW2_sL2/manifest.json | 8 + .../C16/sky130/sW2_sL2/qualification.json | 84 + .../data/cases/C16/sky130/sW2_sL2/specs.json | 23 + .../cases/C16/sky130/sW2_sL2/target.spice | 6 + .../cases/C16/sky130/sW2_sL2/target_lvs.spice | 36 + .../cases/C16/sky130/sW2_sL2/testbench.spice | 40 + .../cases/C17/gf180/sW0.5_sL1.5/case.json | 150 + .../cases/C17/gf180/sW0.5_sL1.5/manifest.json | 8 + .../C17/gf180/sW0.5_sL1.5/qualification.json | 98 + .../cases/C17/gf180/sW0.5_sL1.5/specs.json | 23 + .../cases/C17/gf180/sW0.5_sL1.5/target.spice | 9 + .../C17/gf180/sW0.5_sL1.5/target_lvs.spice | 18 + .../C17/gf180/sW0.5_sL1.5/testbench.spice | 39 + .../data/cases/C17/gf180/sW0.5_sL1/case.json | 150 + .../cases/C17/gf180/sW0.5_sL1/manifest.json | 8 + .../C17/gf180/sW0.5_sL1/qualification.json | 96 + .../data/cases/C17/gf180/sW0.5_sL1/specs.json | 23 + .../cases/C17/gf180/sW0.5_sL1/target.spice | 9 + .../C17/gf180/sW0.5_sL1/target_lvs.spice | 18 + .../cases/C17/gf180/sW0.5_sL1/testbench.spice | 39 + .../data/cases/C17/gf180/sW0.5_sL2/case.json | 150 + .../cases/C17/gf180/sW0.5_sL2/manifest.json | 8 + .../C17/gf180/sW0.5_sL2/qualification.json | 98 + .../data/cases/C17/gf180/sW0.5_sL2/specs.json | 23 + .../cases/C17/gf180/sW0.5_sL2/target.spice | 9 + .../C17/gf180/sW0.5_sL2/target_lvs.spice | 18 + .../cases/C17/gf180/sW0.5_sL2/testbench.spice | 39 + .../cases/C17/gf180/sW1.5_sL1.5/case.json | 150 + .../cases/C17/gf180/sW1.5_sL1.5/manifest.json | 8 + .../C17/gf180/sW1.5_sL1.5/qualification.json | 96 + .../cases/C17/gf180/sW1.5_sL1.5/specs.json | 23 + .../cases/C17/gf180/sW1.5_sL1.5/target.spice | 9 + .../C17/gf180/sW1.5_sL1.5/target_lvs.spice | 42 + .../C17/gf180/sW1.5_sL1.5/testbench.spice | 39 + .../data/cases/C17/gf180/sW1.5_sL1/case.json | 150 + .../cases/C17/gf180/sW1.5_sL1/manifest.json | 8 + .../C17/gf180/sW1.5_sL1/qualification.json | 96 + .../data/cases/C17/gf180/sW1.5_sL1/specs.json | 23 + .../cases/C17/gf180/sW1.5_sL1/target.spice | 9 + .../C17/gf180/sW1.5_sL1/target_lvs.spice | 42 + .../cases/C17/gf180/sW1.5_sL1/testbench.spice | 39 + .../data/cases/C17/gf180/sW1.5_sL2/case.json | 150 + .../cases/C17/gf180/sW1.5_sL2/manifest.json | 8 + .../C17/gf180/sW1.5_sL2/qualification.json | 96 + .../data/cases/C17/gf180/sW1.5_sL2/specs.json | 23 + .../cases/C17/gf180/sW1.5_sL2/target.spice | 9 + .../C17/gf180/sW1.5_sL2/target_lvs.spice | 42 + .../cases/C17/gf180/sW1.5_sL2/testbench.spice | 39 + .../data/cases/C17/gf180/sW1_sL1.5/case.json | 150 + .../cases/C17/gf180/sW1_sL1.5/manifest.json | 8 + .../C17/gf180/sW1_sL1.5/qualification.json | 96 + .../data/cases/C17/gf180/sW1_sL1.5/specs.json | 23 + .../cases/C17/gf180/sW1_sL1.5/target.spice | 9 + .../C17/gf180/sW1_sL1.5/target_lvs.spice | 30 + .../cases/C17/gf180/sW1_sL1.5/testbench.spice | 39 + .../data/cases/C17/gf180/sW1_sL1/case.json | 150 + .../cases/C17/gf180/sW1_sL1/manifest.json | 8 + .../C17/gf180/sW1_sL1/qualification.json | 96 + .../data/cases/C17/gf180/sW1_sL1/specs.json | 23 + .../data/cases/C17/gf180/sW1_sL1/target.spice | 9 + .../cases/C17/gf180/sW1_sL1/target_lvs.spice | 30 + .../cases/C17/gf180/sW1_sL1/testbench.spice | 39 + .../data/cases/C17/gf180/sW1_sL2/case.json | 150 + .../cases/C17/gf180/sW1_sL2/manifest.json | 8 + .../C17/gf180/sW1_sL2/qualification.json | 98 + .../data/cases/C17/gf180/sW1_sL2/specs.json | 23 + .../data/cases/C17/gf180/sW1_sL2/target.spice | 9 + .../cases/C17/gf180/sW1_sL2/target_lvs.spice | 30 + .../cases/C17/gf180/sW1_sL2/testbench.spice | 39 + .../data/cases/C17/gf180/sW2_sL1.5/case.json | 150 + .../cases/C17/gf180/sW2_sL1.5/manifest.json | 8 + .../C17/gf180/sW2_sL1.5/qualification.json | 96 + .../data/cases/C17/gf180/sW2_sL1.5/specs.json | 23 + .../cases/C17/gf180/sW2_sL1.5/target.spice | 9 + .../C17/gf180/sW2_sL1.5/target_lvs.spice | 54 + .../cases/C17/gf180/sW2_sL1.5/testbench.spice | 39 + .../data/cases/C17/gf180/sW2_sL1/case.json | 150 + .../cases/C17/gf180/sW2_sL1/manifest.json | 8 + .../C17/gf180/sW2_sL1/qualification.json | 96 + .../data/cases/C17/gf180/sW2_sL1/specs.json | 23 + .../data/cases/C17/gf180/sW2_sL1/target.spice | 9 + .../cases/C17/gf180/sW2_sL1/target_lvs.spice | 54 + .../cases/C17/gf180/sW2_sL1/testbench.spice | 39 + .../data/cases/C17/gf180/sW2_sL2/case.json | 150 + .../cases/C17/gf180/sW2_sL2/manifest.json | 8 + .../C17/gf180/sW2_sL2/qualification.json | 96 + .../data/cases/C17/gf180/sW2_sL2/specs.json | 23 + .../data/cases/C17/gf180/sW2_sL2/target.spice | 9 + .../cases/C17/gf180/sW2_sL2/target_lvs.spice | 54 + .../cases/C17/gf180/sW2_sL2/testbench.spice | 39 + .../cases/C17/ihp130/sW0.5_sL1.5/case.json | 150 + .../C17/ihp130/sW0.5_sL1.5/manifest.json | 8 + .../C17/ihp130/sW0.5_sL1.5/qualification.json | 98 + .../cases/C17/ihp130/sW0.5_sL1.5/specs.json | 23 + .../cases/C17/ihp130/sW0.5_sL1.5/target.spice | 9 + .../C17/ihp130/sW0.5_sL1.5/target_lvs.spice | 18 + .../C17/ihp130/sW0.5_sL1.5/testbench.spice | 39 + .../data/cases/C17/ihp130/sW0.5_sL1/case.json | 150 + .../cases/C17/ihp130/sW0.5_sL1/manifest.json | 8 + .../C17/ihp130/sW0.5_sL1/qualification.json | 96 + .../cases/C17/ihp130/sW0.5_sL1/specs.json | 23 + .../cases/C17/ihp130/sW0.5_sL1/target.spice | 9 + .../C17/ihp130/sW0.5_sL1/target_lvs.spice | 18 + .../C17/ihp130/sW0.5_sL1/testbench.spice | 39 + .../data/cases/C17/ihp130/sW0.5_sL2/case.json | 150 + .../cases/C17/ihp130/sW0.5_sL2/manifest.json | 8 + .../C17/ihp130/sW0.5_sL2/qualification.json | 98 + .../cases/C17/ihp130/sW0.5_sL2/specs.json | 23 + .../cases/C17/ihp130/sW0.5_sL2/target.spice | 9 + .../C17/ihp130/sW0.5_sL2/target_lvs.spice | 18 + .../C17/ihp130/sW0.5_sL2/testbench.spice | 39 + .../cases/C17/ihp130/sW1.5_sL1.5/case.json | 150 + .../C17/ihp130/sW1.5_sL1.5/manifest.json | 8 + .../C17/ihp130/sW1.5_sL1.5/qualification.json | 96 + .../cases/C17/ihp130/sW1.5_sL1.5/specs.json | 23 + .../cases/C17/ihp130/sW1.5_sL1.5/target.spice | 9 + .../C17/ihp130/sW1.5_sL1.5/target_lvs.spice | 42 + .../C17/ihp130/sW1.5_sL1.5/testbench.spice | 39 + .../data/cases/C17/ihp130/sW1.5_sL1/case.json | 150 + .../cases/C17/ihp130/sW1.5_sL1/manifest.json | 8 + .../C17/ihp130/sW1.5_sL1/qualification.json | 96 + .../cases/C17/ihp130/sW1.5_sL1/specs.json | 23 + .../cases/C17/ihp130/sW1.5_sL1/target.spice | 9 + .../C17/ihp130/sW1.5_sL1/target_lvs.spice | 42 + .../C17/ihp130/sW1.5_sL1/testbench.spice | 39 + .../data/cases/C17/ihp130/sW1.5_sL2/case.json | 150 + .../cases/C17/ihp130/sW1.5_sL2/manifest.json | 8 + .../C17/ihp130/sW1.5_sL2/qualification.json | 96 + .../cases/C17/ihp130/sW1.5_sL2/specs.json | 23 + .../cases/C17/ihp130/sW1.5_sL2/target.spice | 9 + .../C17/ihp130/sW1.5_sL2/target_lvs.spice | 42 + .../C17/ihp130/sW1.5_sL2/testbench.spice | 39 + .../data/cases/C17/ihp130/sW1_sL1.5/case.json | 150 + .../cases/C17/ihp130/sW1_sL1.5/manifest.json | 8 + .../C17/ihp130/sW1_sL1.5/qualification.json | 96 + .../cases/C17/ihp130/sW1_sL1.5/specs.json | 23 + .../cases/C17/ihp130/sW1_sL1.5/target.spice | 9 + .../C17/ihp130/sW1_sL1.5/target_lvs.spice | 30 + .../C17/ihp130/sW1_sL1.5/testbench.spice | 39 + .../data/cases/C17/ihp130/sW1_sL1/case.json | 150 + .../cases/C17/ihp130/sW1_sL1/manifest.json | 8 + .../C17/ihp130/sW1_sL1/qualification.json | 96 + .../data/cases/C17/ihp130/sW1_sL1/specs.json | 23 + .../cases/C17/ihp130/sW1_sL1/target.spice | 9 + .../cases/C17/ihp130/sW1_sL1/target_lvs.spice | 30 + .../cases/C17/ihp130/sW1_sL1/testbench.spice | 39 + .../data/cases/C17/ihp130/sW1_sL2/case.json | 150 + .../cases/C17/ihp130/sW1_sL2/manifest.json | 8 + .../C17/ihp130/sW1_sL2/qualification.json | 96 + .../data/cases/C17/ihp130/sW1_sL2/specs.json | 23 + .../cases/C17/ihp130/sW1_sL2/target.spice | 9 + .../cases/C17/ihp130/sW1_sL2/target_lvs.spice | 30 + .../cases/C17/ihp130/sW1_sL2/testbench.spice | 39 + .../data/cases/C17/ihp130/sW2_sL1.5/case.json | 150 + .../cases/C17/ihp130/sW2_sL1.5/manifest.json | 8 + .../C17/ihp130/sW2_sL1.5/qualification.json | 96 + .../cases/C17/ihp130/sW2_sL1.5/specs.json | 23 + .../cases/C17/ihp130/sW2_sL1.5/target.spice | 9 + .../C17/ihp130/sW2_sL1.5/target_lvs.spice | 54 + .../C17/ihp130/sW2_sL1.5/testbench.spice | 39 + .../data/cases/C17/ihp130/sW2_sL1/case.json | 150 + .../cases/C17/ihp130/sW2_sL1/manifest.json | 8 + .../C17/ihp130/sW2_sL1/qualification.json | 96 + .../data/cases/C17/ihp130/sW2_sL1/specs.json | 23 + .../cases/C17/ihp130/sW2_sL1/target.spice | 9 + .../cases/C17/ihp130/sW2_sL1/target_lvs.spice | 54 + .../cases/C17/ihp130/sW2_sL1/testbench.spice | 39 + .../data/cases/C17/ihp130/sW2_sL2/case.json | 150 + .../cases/C17/ihp130/sW2_sL2/manifest.json | 8 + .../C17/ihp130/sW2_sL2/qualification.json | 96 + .../data/cases/C17/ihp130/sW2_sL2/specs.json | 23 + .../cases/C17/ihp130/sW2_sL2/target.spice | 9 + .../cases/C17/ihp130/sW2_sL2/target_lvs.spice | 54 + .../cases/C17/ihp130/sW2_sL2/testbench.spice | 39 + .../cases/C17/sky130/sW0.5_sL1.5/case.json | 150 + .../C17/sky130/sW0.5_sL1.5/manifest.json | 8 + .../C17/sky130/sW0.5_sL1.5/qualification.json | 98 + .../cases/C17/sky130/sW0.5_sL1.5/specs.json | 23 + .../cases/C17/sky130/sW0.5_sL1.5/target.spice | 9 + .../C17/sky130/sW0.5_sL1.5/target_lvs.spice | 18 + .../C17/sky130/sW0.5_sL1.5/testbench.spice | 39 + .../data/cases/C17/sky130/sW0.5_sL1/case.json | 150 + .../cases/C17/sky130/sW0.5_sL1/manifest.json | 8 + .../C17/sky130/sW0.5_sL1/qualification.json | 96 + .../cases/C17/sky130/sW0.5_sL1/specs.json | 23 + .../cases/C17/sky130/sW0.5_sL1/target.spice | 9 + .../C17/sky130/sW0.5_sL1/target_lvs.spice | 18 + .../C17/sky130/sW0.5_sL1/testbench.spice | 39 + .../data/cases/C17/sky130/sW0.5_sL2/case.json | 150 + .../cases/C17/sky130/sW0.5_sL2/manifest.json | 8 + .../C17/sky130/sW0.5_sL2/qualification.json | 98 + .../cases/C17/sky130/sW0.5_sL2/specs.json | 23 + .../cases/C17/sky130/sW0.5_sL2/target.spice | 9 + .../C17/sky130/sW0.5_sL2/target_lvs.spice | 18 + .../C17/sky130/sW0.5_sL2/testbench.spice | 39 + .../cases/C17/sky130/sW1.5_sL1.5/case.json | 150 + .../C17/sky130/sW1.5_sL1.5/manifest.json | 8 + .../C17/sky130/sW1.5_sL1.5/qualification.json | 96 + .../cases/C17/sky130/sW1.5_sL1.5/specs.json | 23 + .../cases/C17/sky130/sW1.5_sL1.5/target.spice | 9 + .../C17/sky130/sW1.5_sL1.5/target_lvs.spice | 42 + .../C17/sky130/sW1.5_sL1.5/testbench.spice | 39 + .../data/cases/C17/sky130/sW1.5_sL1/case.json | 150 + .../cases/C17/sky130/sW1.5_sL1/manifest.json | 8 + .../C17/sky130/sW1.5_sL1/qualification.json | 96 + .../cases/C17/sky130/sW1.5_sL1/specs.json | 23 + .../cases/C17/sky130/sW1.5_sL1/target.spice | 9 + .../C17/sky130/sW1.5_sL1/target_lvs.spice | 42 + .../C17/sky130/sW1.5_sL1/testbench.spice | 39 + .../data/cases/C17/sky130/sW1.5_sL2/case.json | 150 + .../cases/C17/sky130/sW1.5_sL2/manifest.json | 8 + .../C17/sky130/sW1.5_sL2/qualification.json | 96 + .../cases/C17/sky130/sW1.5_sL2/specs.json | 23 + .../cases/C17/sky130/sW1.5_sL2/target.spice | 9 + .../C17/sky130/sW1.5_sL2/target_lvs.spice | 42 + .../C17/sky130/sW1.5_sL2/testbench.spice | 39 + .../data/cases/C17/sky130/sW1_sL1.5/case.json | 150 + .../cases/C17/sky130/sW1_sL1.5/manifest.json | 8 + .../C17/sky130/sW1_sL1.5/qualification.json | 96 + .../cases/C17/sky130/sW1_sL1.5/specs.json | 23 + .../cases/C17/sky130/sW1_sL1.5/target.spice | 9 + .../C17/sky130/sW1_sL1.5/target_lvs.spice | 30 + .../C17/sky130/sW1_sL1.5/testbench.spice | 39 + .../data/cases/C17/sky130/sW1_sL1/case.json | 150 + .../cases/C17/sky130/sW1_sL1/manifest.json | 8 + .../C17/sky130/sW1_sL1/qualification.json | 96 + .../data/cases/C17/sky130/sW1_sL1/specs.json | 23 + .../cases/C17/sky130/sW1_sL1/target.spice | 9 + .../cases/C17/sky130/sW1_sL1/target_lvs.spice | 30 + .../cases/C17/sky130/sW1_sL1/testbench.spice | 39 + .../data/cases/C17/sky130/sW1_sL2/case.json | 150 + .../cases/C17/sky130/sW1_sL2/manifest.json | 8 + .../C17/sky130/sW1_sL2/qualification.json | 96 + .../data/cases/C17/sky130/sW1_sL2/specs.json | 23 + .../cases/C17/sky130/sW1_sL2/target.spice | 9 + .../cases/C17/sky130/sW1_sL2/target_lvs.spice | 30 + .../cases/C17/sky130/sW1_sL2/testbench.spice | 39 + .../data/cases/C17/sky130/sW2_sL1.5/case.json | 150 + .../cases/C17/sky130/sW2_sL1.5/manifest.json | 8 + .../C17/sky130/sW2_sL1.5/qualification.json | 96 + .../cases/C17/sky130/sW2_sL1.5/specs.json | 23 + .../cases/C17/sky130/sW2_sL1.5/target.spice | 9 + .../C17/sky130/sW2_sL1.5/target_lvs.spice | 54 + .../C17/sky130/sW2_sL1.5/testbench.spice | 39 + .../data/cases/C17/sky130/sW2_sL1/case.json | 150 + .../cases/C17/sky130/sW2_sL1/manifest.json | 8 + .../C17/sky130/sW2_sL1/qualification.json | 96 + .../data/cases/C17/sky130/sW2_sL1/specs.json | 23 + .../cases/C17/sky130/sW2_sL1/target.spice | 9 + .../cases/C17/sky130/sW2_sL1/target_lvs.spice | 54 + .../cases/C17/sky130/sW2_sL1/testbench.spice | 39 + .../data/cases/C17/sky130/sW2_sL2/case.json | 150 + .../cases/C17/sky130/sW2_sL2/manifest.json | 8 + .../C17/sky130/sW2_sL2/qualification.json | 96 + .../data/cases/C17/sky130/sW2_sL2/specs.json | 23 + .../cases/C17/sky130/sW2_sL2/target.spice | 9 + .../cases/C17/sky130/sW2_sL2/target_lvs.spice | 54 + .../cases/C17/sky130/sW2_sL2/testbench.spice | 39 + .../cases/C18/gf180/sW0.5_sL1.5/case.json | 185 + .../cases/C18/gf180/sW0.5_sL1.5/manifest.json | 8 + .../C18/gf180/sW0.5_sL1.5/qualification.json | 153 + .../cases/C18/gf180/sW0.5_sL1.5/specs.json | 37 + .../cases/C18/gf180/sW0.5_sL1.5/target.spice | 8 + .../C18/gf180/sW0.5_sL1.5/target_lvs.spice | 80 + .../C18/gf180/sW0.5_sL1.5/testbench.spice | 58 + .../data/cases/C18/gf180/sW0.5_sL1/case.json | 185 + .../cases/C18/gf180/sW0.5_sL1/manifest.json | 8 + .../C18/gf180/sW0.5_sL1/qualification.json | 153 + .../data/cases/C18/gf180/sW0.5_sL1/specs.json | 37 + .../cases/C18/gf180/sW0.5_sL1/target.spice | 8 + .../C18/gf180/sW0.5_sL1/target_lvs.spice | 80 + .../cases/C18/gf180/sW0.5_sL1/testbench.spice | 58 + .../data/cases/C18/gf180/sW0.5_sL2/case.json | 185 + .../cases/C18/gf180/sW0.5_sL2/manifest.json | 8 + .../C18/gf180/sW0.5_sL2/qualification.json | 154 + .../data/cases/C18/gf180/sW0.5_sL2/specs.json | 37 + .../cases/C18/gf180/sW0.5_sL2/target.spice | 8 + .../C18/gf180/sW0.5_sL2/target_lvs.spice | 80 + .../cases/C18/gf180/sW0.5_sL2/testbench.spice | 58 + .../cases/C18/gf180/sW1.5_sL1.5/case.json | 185 + .../cases/C18/gf180/sW1.5_sL1.5/manifest.json | 8 + .../C18/gf180/sW1.5_sL1.5/qualification.json | 153 + .../cases/C18/gf180/sW1.5_sL1.5/specs.json | 37 + .../cases/C18/gf180/sW1.5_sL1.5/target.spice | 8 + .../C18/gf180/sW1.5_sL1.5/target_lvs.spice | 236 + .../C18/gf180/sW1.5_sL1.5/testbench.spice | 58 + .../data/cases/C18/gf180/sW1.5_sL1/case.json | 185 + .../cases/C18/gf180/sW1.5_sL1/manifest.json | 8 + .../C18/gf180/sW1.5_sL1/qualification.json | 153 + .../data/cases/C18/gf180/sW1.5_sL1/specs.json | 37 + .../cases/C18/gf180/sW1.5_sL1/target.spice | 8 + .../C18/gf180/sW1.5_sL1/target_lvs.spice | 236 + .../cases/C18/gf180/sW1.5_sL1/testbench.spice | 58 + .../data/cases/C18/gf180/sW1.5_sL2/case.json | 185 + .../cases/C18/gf180/sW1.5_sL2/manifest.json | 8 + .../C18/gf180/sW1.5_sL2/qualification.json | 153 + .../data/cases/C18/gf180/sW1.5_sL2/specs.json | 37 + .../cases/C18/gf180/sW1.5_sL2/target.spice | 8 + .../C18/gf180/sW1.5_sL2/target_lvs.spice | 236 + .../cases/C18/gf180/sW1.5_sL2/testbench.spice | 58 + .../data/cases/C18/gf180/sW1_sL1.5/case.json | 185 + .../cases/C18/gf180/sW1_sL1.5/manifest.json | 8 + .../C18/gf180/sW1_sL1.5/qualification.json | 153 + .../data/cases/C18/gf180/sW1_sL1.5/specs.json | 37 + .../cases/C18/gf180/sW1_sL1.5/target.spice | 8 + .../C18/gf180/sW1_sL1.5/target_lvs.spice | 158 + .../cases/C18/gf180/sW1_sL1.5/testbench.spice | 58 + .../data/cases/C18/gf180/sW1_sL1/case.json | 185 + .../cases/C18/gf180/sW1_sL1/manifest.json | 8 + .../C18/gf180/sW1_sL1/qualification.json | 153 + .../data/cases/C18/gf180/sW1_sL1/specs.json | 37 + .../data/cases/C18/gf180/sW1_sL1/target.spice | 8 + .../cases/C18/gf180/sW1_sL1/target_lvs.spice | 158 + .../cases/C18/gf180/sW1_sL1/testbench.spice | 58 + .../data/cases/C18/gf180/sW1_sL2/case.json | 185 + .../cases/C18/gf180/sW1_sL2/manifest.json | 8 + .../C18/gf180/sW1_sL2/qualification.json | 153 + .../data/cases/C18/gf180/sW1_sL2/specs.json | 37 + .../data/cases/C18/gf180/sW1_sL2/target.spice | 8 + .../cases/C18/gf180/sW1_sL2/target_lvs.spice | 158 + .../cases/C18/gf180/sW1_sL2/testbench.spice | 58 + .../data/cases/C18/gf180/sW2_sL1.5/case.json | 185 + .../cases/C18/gf180/sW2_sL1.5/manifest.json | 8 + .../C18/gf180/sW2_sL1.5/qualification.json | 153 + .../data/cases/C18/gf180/sW2_sL1.5/specs.json | 37 + .../cases/C18/gf180/sW2_sL1.5/target.spice | 8 + .../C18/gf180/sW2_sL1.5/target_lvs.spice | 314 + .../cases/C18/gf180/sW2_sL1.5/testbench.spice | 58 + .../data/cases/C18/gf180/sW2_sL1/case.json | 185 + .../cases/C18/gf180/sW2_sL1/manifest.json | 8 + .../C18/gf180/sW2_sL1/qualification.json | 153 + .../data/cases/C18/gf180/sW2_sL1/specs.json | 37 + .../data/cases/C18/gf180/sW2_sL1/target.spice | 8 + .../cases/C18/gf180/sW2_sL1/target_lvs.spice | 314 + .../cases/C18/gf180/sW2_sL1/testbench.spice | 58 + .../data/cases/C18/gf180/sW2_sL2/case.json | 185 + .../cases/C18/gf180/sW2_sL2/manifest.json | 8 + .../C18/gf180/sW2_sL2/qualification.json | 153 + .../data/cases/C18/gf180/sW2_sL2/specs.json | 37 + .../data/cases/C18/gf180/sW2_sL2/target.spice | 8 + .../cases/C18/gf180/sW2_sL2/target_lvs.spice | 314 + .../cases/C18/gf180/sW2_sL2/testbench.spice | 58 + .../cases/C18/ihp130/sW0.5_sL1.5/case.json | 185 + .../C18/ihp130/sW0.5_sL1.5/manifest.json | 8 + .../C18/ihp130/sW0.5_sL1.5/qualification.json | 153 + .../cases/C18/ihp130/sW0.5_sL1.5/specs.json | 37 + .../cases/C18/ihp130/sW0.5_sL1.5/target.spice | 8 + .../C18/ihp130/sW0.5_sL1.5/target_lvs.spice | 80 + .../C18/ihp130/sW0.5_sL1.5/testbench.spice | 58 + .../data/cases/C18/ihp130/sW0.5_sL1/case.json | 185 + .../cases/C18/ihp130/sW0.5_sL1/manifest.json | 8 + .../C18/ihp130/sW0.5_sL1/qualification.json | 153 + .../cases/C18/ihp130/sW0.5_sL1/specs.json | 37 + .../cases/C18/ihp130/sW0.5_sL1/target.spice | 8 + .../C18/ihp130/sW0.5_sL1/target_lvs.spice | 80 + .../C18/ihp130/sW0.5_sL1/testbench.spice | 58 + .../data/cases/C18/ihp130/sW0.5_sL2/case.json | 185 + .../cases/C18/ihp130/sW0.5_sL2/manifest.json | 8 + .../C18/ihp130/sW0.5_sL2/qualification.json | 153 + .../cases/C18/ihp130/sW0.5_sL2/specs.json | 37 + .../cases/C18/ihp130/sW0.5_sL2/target.spice | 8 + .../C18/ihp130/sW0.5_sL2/target_lvs.spice | 80 + .../C18/ihp130/sW0.5_sL2/testbench.spice | 58 + .../cases/C18/ihp130/sW1.5_sL1.5/case.json | 185 + .../C18/ihp130/sW1.5_sL1.5/manifest.json | 8 + .../C18/ihp130/sW1.5_sL1.5/qualification.json | 153 + .../cases/C18/ihp130/sW1.5_sL1.5/specs.json | 37 + .../cases/C18/ihp130/sW1.5_sL1.5/target.spice | 8 + .../C18/ihp130/sW1.5_sL1.5/target_lvs.spice | 236 + .../C18/ihp130/sW1.5_sL1.5/testbench.spice | 58 + .../data/cases/C18/ihp130/sW1.5_sL1/case.json | 185 + .../cases/C18/ihp130/sW1.5_sL1/manifest.json | 8 + .../C18/ihp130/sW1.5_sL1/qualification.json | 153 + .../cases/C18/ihp130/sW1.5_sL1/specs.json | 37 + .../cases/C18/ihp130/sW1.5_sL1/target.spice | 8 + .../C18/ihp130/sW1.5_sL1/target_lvs.spice | 236 + .../C18/ihp130/sW1.5_sL1/testbench.spice | 58 + .../data/cases/C18/ihp130/sW1.5_sL2/case.json | 185 + .../cases/C18/ihp130/sW1.5_sL2/manifest.json | 8 + .../C18/ihp130/sW1.5_sL2/qualification.json | 153 + .../cases/C18/ihp130/sW1.5_sL2/specs.json | 37 + .../cases/C18/ihp130/sW1.5_sL2/target.spice | 8 + .../C18/ihp130/sW1.5_sL2/target_lvs.spice | 236 + .../C18/ihp130/sW1.5_sL2/testbench.spice | 58 + .../data/cases/C18/ihp130/sW1_sL1.5/case.json | 185 + .../cases/C18/ihp130/sW1_sL1.5/manifest.json | 8 + .../C18/ihp130/sW1_sL1.5/qualification.json | 153 + .../cases/C18/ihp130/sW1_sL1.5/specs.json | 37 + .../cases/C18/ihp130/sW1_sL1.5/target.spice | 8 + .../C18/ihp130/sW1_sL1.5/target_lvs.spice | 158 + .../C18/ihp130/sW1_sL1.5/testbench.spice | 58 + .../data/cases/C18/ihp130/sW1_sL1/case.json | 185 + .../cases/C18/ihp130/sW1_sL1/manifest.json | 8 + .../C18/ihp130/sW1_sL1/qualification.json | 153 + .../data/cases/C18/ihp130/sW1_sL1/specs.json | 37 + .../cases/C18/ihp130/sW1_sL1/target.spice | 8 + .../cases/C18/ihp130/sW1_sL1/target_lvs.spice | 158 + .../cases/C18/ihp130/sW1_sL1/testbench.spice | 58 + .../data/cases/C18/ihp130/sW1_sL2/case.json | 185 + .../cases/C18/ihp130/sW1_sL2/manifest.json | 8 + .../C18/ihp130/sW1_sL2/qualification.json | 153 + .../data/cases/C18/ihp130/sW1_sL2/specs.json | 37 + .../cases/C18/ihp130/sW1_sL2/target.spice | 8 + .../cases/C18/ihp130/sW1_sL2/target_lvs.spice | 158 + .../cases/C18/ihp130/sW1_sL2/testbench.spice | 58 + .../data/cases/C18/ihp130/sW2_sL1.5/case.json | 185 + .../cases/C18/ihp130/sW2_sL1.5/manifest.json | 8 + .../C18/ihp130/sW2_sL1.5/qualification.json | 153 + .../cases/C18/ihp130/sW2_sL1.5/specs.json | 37 + .../cases/C18/ihp130/sW2_sL1.5/target.spice | 8 + .../C18/ihp130/sW2_sL1.5/target_lvs.spice | 314 + .../C18/ihp130/sW2_sL1.5/testbench.spice | 58 + .../data/cases/C18/ihp130/sW2_sL1/case.json | 185 + .../cases/C18/ihp130/sW2_sL1/manifest.json | 8 + .../C18/ihp130/sW2_sL1/qualification.json | 153 + .../data/cases/C18/ihp130/sW2_sL1/specs.json | 37 + .../cases/C18/ihp130/sW2_sL1/target.spice | 8 + .../cases/C18/ihp130/sW2_sL1/target_lvs.spice | 314 + .../cases/C18/ihp130/sW2_sL1/testbench.spice | 58 + .../data/cases/C18/ihp130/sW2_sL2/case.json | 185 + .../cases/C18/ihp130/sW2_sL2/manifest.json | 8 + .../C18/ihp130/sW2_sL2/qualification.json | 153 + .../data/cases/C18/ihp130/sW2_sL2/specs.json | 37 + .../cases/C18/ihp130/sW2_sL2/target.spice | 8 + .../cases/C18/ihp130/sW2_sL2/target_lvs.spice | 314 + .../cases/C18/ihp130/sW2_sL2/testbench.spice | 58 + .../cases/C18/sky130/sW0.5_sL1.5/case.json | 185 + .../C18/sky130/sW0.5_sL1.5/manifest.json | 8 + .../C18/sky130/sW0.5_sL1.5/qualification.json | 154 + .../cases/C18/sky130/sW0.5_sL1.5/specs.json | 37 + .../cases/C18/sky130/sW0.5_sL1.5/target.spice | 8 + .../C18/sky130/sW0.5_sL1.5/target_lvs.spice | 80 + .../C18/sky130/sW0.5_sL1.5/testbench.spice | 58 + .../data/cases/C18/sky130/sW0.5_sL1/case.json | 185 + .../cases/C18/sky130/sW0.5_sL1/manifest.json | 8 + .../C18/sky130/sW0.5_sL1/qualification.json | 154 + .../cases/C18/sky130/sW0.5_sL1/specs.json | 37 + .../cases/C18/sky130/sW0.5_sL1/target.spice | 8 + .../C18/sky130/sW0.5_sL1/target_lvs.spice | 80 + .../C18/sky130/sW0.5_sL1/testbench.spice | 58 + .../data/cases/C18/sky130/sW0.5_sL2/case.json | 185 + .../cases/C18/sky130/sW0.5_sL2/manifest.json | 8 + .../C18/sky130/sW0.5_sL2/qualification.json | 154 + .../cases/C18/sky130/sW0.5_sL2/specs.json | 37 + .../cases/C18/sky130/sW0.5_sL2/target.spice | 8 + .../C18/sky130/sW0.5_sL2/target_lvs.spice | 80 + .../C18/sky130/sW0.5_sL2/testbench.spice | 58 + .../cases/C18/sky130/sW1.5_sL1.5/case.json | 185 + .../C18/sky130/sW1.5_sL1.5/manifest.json | 8 + .../C18/sky130/sW1.5_sL1.5/qualification.json | 154 + .../cases/C18/sky130/sW1.5_sL1.5/specs.json | 37 + .../cases/C18/sky130/sW1.5_sL1.5/target.spice | 8 + .../C18/sky130/sW1.5_sL1.5/target_lvs.spice | 236 + .../C18/sky130/sW1.5_sL1.5/testbench.spice | 58 + .../data/cases/C18/sky130/sW1.5_sL1/case.json | 185 + .../cases/C18/sky130/sW1.5_sL1/manifest.json | 8 + .../C18/sky130/sW1.5_sL1/qualification.json | 154 + .../cases/C18/sky130/sW1.5_sL1/specs.json | 37 + .../cases/C18/sky130/sW1.5_sL1/target.spice | 8 + .../C18/sky130/sW1.5_sL1/target_lvs.spice | 236 + .../C18/sky130/sW1.5_sL1/testbench.spice | 58 + .../data/cases/C18/sky130/sW1.5_sL2/case.json | 185 + .../cases/C18/sky130/sW1.5_sL2/manifest.json | 8 + .../C18/sky130/sW1.5_sL2/qualification.json | 154 + .../cases/C18/sky130/sW1.5_sL2/specs.json | 37 + .../cases/C18/sky130/sW1.5_sL2/target.spice | 8 + .../C18/sky130/sW1.5_sL2/target_lvs.spice | 236 + .../C18/sky130/sW1.5_sL2/testbench.spice | 58 + .../data/cases/C18/sky130/sW1_sL1.5/case.json | 185 + .../cases/C18/sky130/sW1_sL1.5/manifest.json | 8 + .../C18/sky130/sW1_sL1.5/qualification.json | 154 + .../cases/C18/sky130/sW1_sL1.5/specs.json | 37 + .../cases/C18/sky130/sW1_sL1.5/target.spice | 8 + .../C18/sky130/sW1_sL1.5/target_lvs.spice | 158 + .../C18/sky130/sW1_sL1.5/testbench.spice | 58 + .../data/cases/C18/sky130/sW1_sL1/case.json | 185 + .../cases/C18/sky130/sW1_sL1/manifest.json | 8 + .../C18/sky130/sW1_sL1/qualification.json | 154 + .../data/cases/C18/sky130/sW1_sL1/specs.json | 37 + .../cases/C18/sky130/sW1_sL1/target.spice | 8 + .../cases/C18/sky130/sW1_sL1/target_lvs.spice | 158 + .../cases/C18/sky130/sW1_sL1/testbench.spice | 58 + .../data/cases/C18/sky130/sW1_sL2/case.json | 185 + .../cases/C18/sky130/sW1_sL2/manifest.json | 8 + .../C18/sky130/sW1_sL2/qualification.json | 154 + .../data/cases/C18/sky130/sW1_sL2/specs.json | 37 + .../cases/C18/sky130/sW1_sL2/target.spice | 8 + .../cases/C18/sky130/sW1_sL2/target_lvs.spice | 158 + .../cases/C18/sky130/sW1_sL2/testbench.spice | 58 + .../data/cases/C18/sky130/sW2_sL1.5/case.json | 185 + .../cases/C18/sky130/sW2_sL1.5/manifest.json | 8 + .../C18/sky130/sW2_sL1.5/qualification.json | 154 + .../cases/C18/sky130/sW2_sL1.5/specs.json | 37 + .../cases/C18/sky130/sW2_sL1.5/target.spice | 8 + .../C18/sky130/sW2_sL1.5/target_lvs.spice | 314 + .../C18/sky130/sW2_sL1.5/testbench.spice | 58 + .../data/cases/C18/sky130/sW2_sL1/case.json | 185 + .../cases/C18/sky130/sW2_sL1/manifest.json | 8 + .../C18/sky130/sW2_sL1/qualification.json | 154 + .../data/cases/C18/sky130/sW2_sL1/specs.json | 37 + .../cases/C18/sky130/sW2_sL1/target.spice | 8 + .../cases/C18/sky130/sW2_sL1/target_lvs.spice | 314 + .../cases/C18/sky130/sW2_sL1/testbench.spice | 58 + .../data/cases/C18/sky130/sW2_sL2/case.json | 185 + .../cases/C18/sky130/sW2_sL2/manifest.json | 8 + .../C18/sky130/sW2_sL2/qualification.json | 154 + .../data/cases/C18/sky130/sW2_sL2/specs.json | 37 + .../cases/C18/sky130/sW2_sL2/target.spice | 8 + .../cases/C18/sky130/sW2_sL2/target_lvs.spice | 314 + .../cases/C18/sky130/sW2_sL2/testbench.spice | 58 + .../data/frozen/fixed_order.json | 36 + .../data/nominal/C01/gf180.json | 34 + .../data/nominal/C01/ihp130.json | 34 + .../data/nominal/C01/sky130.json | 34 + .../data/nominal/C02/gf180.json | 44 + .../data/nominal/C02/ihp130.json | 44 + .../data/nominal/C02/sky130.json | 44 + .../data/nominal/C03/gf180.json | 39 + .../data/nominal/C03/ihp130.json | 39 + .../data/nominal/C03/sky130.json | 39 + .../data/nominal/C04/gf180.json | 32 + .../data/nominal/C04/ihp130.json | 32 + .../data/nominal/C04/sky130.json | 32 + .../data/nominal/C05/gf180.json | 34 + .../data/nominal/C05/ihp130.json | 34 + .../data/nominal/C05/sky130.json | 34 + .../data/nominal/C06/gf180.json | 52 + .../data/nominal/C06/ihp130.json | 52 + .../data/nominal/C06/sky130.json | 52 + .../data/nominal/C07/gf180.json | 48 + .../data/nominal/C07/ihp130.json | 48 + .../data/nominal/C07/sky130.json | 48 + .../data/nominal/C08/gf180.json | 49 + .../data/nominal/C08/ihp130.json | 49 + .../data/nominal/C08/sky130.json | 49 + .../data/nominal/C09/gf180.json | 76 + .../data/nominal/C09/ihp130.json | 76 + .../data/nominal/C09/sky130.json | 76 + .../data/nominal/C10/gf180.json | 93 + .../data/nominal/C10/ihp130.json | 93 + .../data/nominal/C10/sky130.json | 93 + .../data/nominal/C11/gf180.json | 77 + .../data/nominal/C11/ihp130.json | 77 + .../data/nominal/C11/sky130.json | 77 + .../data/nominal/C12/gf180.json | 27 + .../data/nominal/C12/ihp130.json | 27 + .../data/nominal/C12/sky130.json | 27 + .../data/nominal/C13/gf180.json | 53 + .../data/nominal/C13/ihp130.json | 53 + .../data/nominal/C13/sky130.json | 53 + .../data/nominal/C14/gf180.json | 48 + .../data/nominal/C14/ihp130.json | 48 + .../data/nominal/C14/sky130.json | 48 + .../data/nominal/C15/gf180.json | 28 + .../data/nominal/C15/ihp130.json | 28 + .../data/nominal/C15/sky130.json | 28 + .../data/nominal/C16/gf180.json | 45 + .../data/nominal/C16/ihp130.json | 45 + .../data/nominal/C16/sky130.json | 45 + .../data/nominal/C17/gf180.json | 62 + .../data/nominal/C17/ihp130.json | 62 + .../data/nominal/C17/sky130.json | 62 + .../data/nominal/C18/gf180.json | 58 + .../data/nominal/C18/ihp130.json | 58 + .../data/nominal/C18/sky130.json | 58 + .../data/res_calibration.json | 50 + .../results/analysis/agent_session_audit.json | 2297 + .../analysis/arrangement_bandwidth_C16.json | 1104 + .../results/analysis/benchmark_table.json | 854 + .../results/analysis/cost_decomposition.json | 50756 +++++++++++ .../results/analysis/cost_validation_dev.json | 6004 ++ .../cost_validation_dev_no_channel.json | 5467 ++ .../analysis/cost_validation_heldout.json | 27224 ++++++ .../results/analysis/geometry_check.json | 481 + .../analysis/geometry_check_diagnosis.json | 1550 + .../results/analysis/llm_interface.json | 873 + .../results/analysis/llm_summary.json | 12269 +++ .../analysis/pex_sensitivity_C10_gf180.json | 101 + .../results/analysis/pvt.json | 8074 ++ .../analysis/resim_after_testbench_fix.json | 18 + .../analysis/review_connectivity_check.json | 90 + .../results/analysis/review_coverage.json | 27 + .../analysis/review_gate_pad_check.json | 130 + .../results/analysis/running_example.json | 439 + .../results/analysis/scope_audit.json | 540 + .../results/analysis/selection_summary.json | 16968 ++++ .../analysis/testbench_equivalence.json | 6 + .../results/analysis/timing_controlled.json | 4124 + .../textbook_sharing/results/case_build.json | 72142 ++++++++++++++++ .../results/count_ledger.json | 3193 + .../textbook_sharing/results/count_ledger.md | 18 + .../attempts_gf180_sky130.json | 4369 + .../redesign_search/attempts_ihp130.json | 2164 + .../results/run_records.tar.xz | Bin 0 -> 5746140 bytes 4557 files changed, 473340 insertions(+) create mode 100644 benchmarks/textbook_sharing/data/cases/C01/gf180/sW0.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/gf180/sW0.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/gf180/sW0.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/gf180/sW0.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/gf180/sW0.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/gf180/sW0.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/gf180/sW0.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/gf180/sW0.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/gf180/sW0.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/gf180/sW0.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/gf180/sW0.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/gf180/sW0.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/gf180/sW0.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/gf180/sW0.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/gf180/sW0.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/gf180/sW0.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/gf180/sW0.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/gf180/sW0.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/gf180/sW0.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/gf180/sW0.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/gf180/sW0.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/gf180/sW1.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/gf180/sW1.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/gf180/sW1.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/gf180/sW1.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/gf180/sW1.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/gf180/sW1.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/gf180/sW1.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/gf180/sW1.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/gf180/sW1.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/gf180/sW1.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/gf180/sW1.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/gf180/sW1.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/gf180/sW1.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/gf180/sW1.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/gf180/sW1.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/gf180/sW1.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/gf180/sW1.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/gf180/sW1.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/gf180/sW1.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/gf180/sW1.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/gf180/sW1.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/gf180/sW1_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/gf180/sW1_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/gf180/sW1_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/gf180/sW1_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/gf180/sW1_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/gf180/sW1_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/gf180/sW1_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/gf180/sW1_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/gf180/sW1_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/gf180/sW1_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/gf180/sW1_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/gf180/sW1_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/gf180/sW1_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/gf180/sW1_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/gf180/sW1_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/gf180/sW1_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/gf180/sW1_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/gf180/sW1_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/gf180/sW1_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/gf180/sW1_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/gf180/sW1_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/gf180/sW2_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/gf180/sW2_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/gf180/sW2_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/gf180/sW2_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/gf180/sW2_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/gf180/sW2_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/gf180/sW2_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/gf180/sW2_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/gf180/sW2_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/gf180/sW2_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/gf180/sW2_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/gf180/sW2_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/gf180/sW2_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/gf180/sW2_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/gf180/sW2_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/gf180/sW2_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/gf180/sW2_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/gf180/sW2_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/gf180/sW2_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/gf180/sW2_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/gf180/sW2_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/ihp130/sW0.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/ihp130/sW0.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/ihp130/sW0.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/ihp130/sW0.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/ihp130/sW0.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/ihp130/sW0.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/ihp130/sW0.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/ihp130/sW0.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/ihp130/sW0.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/ihp130/sW0.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/ihp130/sW0.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/ihp130/sW0.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/ihp130/sW0.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/ihp130/sW0.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/ihp130/sW0.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/ihp130/sW0.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/ihp130/sW0.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/ihp130/sW0.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/ihp130/sW0.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/ihp130/sW0.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/ihp130/sW0.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/ihp130/sW2_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/ihp130/sW2_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/ihp130/sW2_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/ihp130/sW2_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/ihp130/sW2_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/ihp130/sW2_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/ihp130/sW2_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/ihp130/sW2_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/ihp130/sW2_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/ihp130/sW2_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/ihp130/sW2_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/ihp130/sW2_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/ihp130/sW2_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/ihp130/sW2_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/ihp130/sW2_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/ihp130/sW2_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/ihp130/sW2_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/ihp130/sW2_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/ihp130/sW2_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/ihp130/sW2_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/ihp130/sW2_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/sky130/sW0.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/sky130/sW0.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/sky130/sW0.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/sky130/sW0.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/sky130/sW0.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/sky130/sW0.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/sky130/sW0.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/sky130/sW0.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/sky130/sW0.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/sky130/sW0.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/sky130/sW0.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/sky130/sW0.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/sky130/sW0.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/sky130/sW0.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/sky130/sW0.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/sky130/sW0.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/sky130/sW0.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/sky130/sW0.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/sky130/sW0.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/sky130/sW0.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/sky130/sW0.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/sky130/sW1.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/sky130/sW1.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/sky130/sW1.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/sky130/sW1.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/sky130/sW1.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/sky130/sW1.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/sky130/sW1.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/sky130/sW1.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/sky130/sW1.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/sky130/sW1.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/sky130/sW1.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/sky130/sW1.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/sky130/sW1.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/sky130/sW1.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/sky130/sW1.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/sky130/sW1.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/sky130/sW1.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/sky130/sW1.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/sky130/sW1.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/sky130/sW1.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/sky130/sW1.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/sky130/sW1_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/sky130/sW1_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/sky130/sW1_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/sky130/sW1_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/sky130/sW1_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/sky130/sW1_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/sky130/sW1_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/sky130/sW1_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/sky130/sW1_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/sky130/sW1_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/sky130/sW1_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/sky130/sW1_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/sky130/sW1_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/sky130/sW1_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/sky130/sW1_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/sky130/sW1_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/sky130/sW1_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/sky130/sW1_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/sky130/sW1_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/sky130/sW1_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/sky130/sW1_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/sky130/sW2_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/sky130/sW2_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/sky130/sW2_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/sky130/sW2_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/sky130/sW2_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/sky130/sW2_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/sky130/sW2_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/sky130/sW2_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/sky130/sW2_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/sky130/sW2_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/sky130/sW2_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/sky130/sW2_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/sky130/sW2_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/sky130/sW2_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/sky130/sW2_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/sky130/sW2_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/sky130/sW2_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/sky130/sW2_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C01/sky130/sW2_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/sky130/sW2_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C01/sky130/sW2_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/gf180/sW0.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/gf180/sW0.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/gf180/sW0.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/gf180/sW0.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/gf180/sW0.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/gf180/sW0.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/gf180/sW0.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/gf180/sW0.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/gf180/sW0.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/gf180/sW0.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/gf180/sW0.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/gf180/sW0.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/gf180/sW0.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/gf180/sW0.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/gf180/sW0.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/gf180/sW0.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/gf180/sW0.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/gf180/sW0.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/gf180/sW0.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/gf180/sW0.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/gf180/sW0.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/gf180/sW1.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/gf180/sW1.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/gf180/sW1.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/gf180/sW1.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/gf180/sW1.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/gf180/sW1.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/gf180/sW1.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/gf180/sW1.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/gf180/sW1.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/gf180/sW1.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/gf180/sW1.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/gf180/sW1.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/gf180/sW1.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/gf180/sW1.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/gf180/sW1.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/gf180/sW1.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/gf180/sW1.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/gf180/sW1.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/gf180/sW1.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/gf180/sW1.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/gf180/sW1.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/gf180/sW1_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/gf180/sW1_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/gf180/sW1_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/gf180/sW1_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/gf180/sW1_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/gf180/sW1_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/gf180/sW1_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/gf180/sW1_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/gf180/sW1_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/gf180/sW1_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/gf180/sW1_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/gf180/sW1_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/gf180/sW1_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/gf180/sW1_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/gf180/sW1_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/gf180/sW1_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/gf180/sW1_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/gf180/sW1_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/gf180/sW1_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/gf180/sW1_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/gf180/sW1_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/gf180/sW2_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/gf180/sW2_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/gf180/sW2_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/gf180/sW2_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/gf180/sW2_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/gf180/sW2_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/gf180/sW2_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/gf180/sW2_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/gf180/sW2_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/gf180/sW2_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/gf180/sW2_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/gf180/sW2_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/gf180/sW2_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/gf180/sW2_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/gf180/sW2_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/gf180/sW2_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/gf180/sW2_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/gf180/sW2_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/gf180/sW2_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/gf180/sW2_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/gf180/sW2_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/ihp130/sW0.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/ihp130/sW0.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/ihp130/sW0.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/ihp130/sW0.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/ihp130/sW0.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/ihp130/sW0.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/ihp130/sW0.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/ihp130/sW0.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/ihp130/sW0.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/ihp130/sW0.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/ihp130/sW0.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/ihp130/sW0.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/ihp130/sW0.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/ihp130/sW0.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/ihp130/sW0.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/ihp130/sW0.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/ihp130/sW0.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/ihp130/sW0.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/ihp130/sW0.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/ihp130/sW0.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/ihp130/sW0.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/ihp130/sW2_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/ihp130/sW2_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/ihp130/sW2_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/ihp130/sW2_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/ihp130/sW2_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/ihp130/sW2_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/ihp130/sW2_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/ihp130/sW2_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/ihp130/sW2_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/ihp130/sW2_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/ihp130/sW2_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/ihp130/sW2_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/ihp130/sW2_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/ihp130/sW2_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/ihp130/sW2_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/ihp130/sW2_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/ihp130/sW2_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/ihp130/sW2_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/ihp130/sW2_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/ihp130/sW2_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/ihp130/sW2_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/sky130/sW0.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/sky130/sW0.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/sky130/sW0.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/sky130/sW0.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/sky130/sW0.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/sky130/sW0.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/sky130/sW0.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/sky130/sW0.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/sky130/sW0.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/sky130/sW0.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/sky130/sW0.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/sky130/sW0.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/sky130/sW0.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/sky130/sW0.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/sky130/sW0.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/sky130/sW0.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/sky130/sW0.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/sky130/sW0.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/sky130/sW0.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/sky130/sW0.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/sky130/sW0.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/sky130/sW1.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/sky130/sW1.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/sky130/sW1.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/sky130/sW1.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/sky130/sW1.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/sky130/sW1.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/sky130/sW1.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/sky130/sW1.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/sky130/sW1.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/sky130/sW1.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/sky130/sW1.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/sky130/sW1.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/sky130/sW1.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/sky130/sW1.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/sky130/sW1.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/sky130/sW1.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/sky130/sW1.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/sky130/sW1.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/sky130/sW1.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/sky130/sW1.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/sky130/sW1.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/sky130/sW1_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/sky130/sW1_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/sky130/sW1_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/sky130/sW1_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/sky130/sW1_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/sky130/sW1_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/sky130/sW1_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/sky130/sW1_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/sky130/sW1_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/sky130/sW1_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/sky130/sW1_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/sky130/sW1_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/sky130/sW1_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/sky130/sW1_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/sky130/sW1_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/sky130/sW1_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/sky130/sW1_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/sky130/sW1_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/sky130/sW1_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/sky130/sW1_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/sky130/sW1_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/sky130/sW2_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/sky130/sW2_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/sky130/sW2_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/sky130/sW2_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/sky130/sW2_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/sky130/sW2_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/sky130/sW2_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/sky130/sW2_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/sky130/sW2_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/sky130/sW2_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/sky130/sW2_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/sky130/sW2_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/sky130/sW2_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/sky130/sW2_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/sky130/sW2_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/sky130/sW2_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/sky130/sW2_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/sky130/sW2_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C02/sky130/sW2_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/sky130/sW2_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C02/sky130/sW2_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/gf180/sW0.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/gf180/sW0.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/gf180/sW0.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/gf180/sW0.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/gf180/sW0.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/gf180/sW0.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/gf180/sW0.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/gf180/sW0.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/gf180/sW0.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/gf180/sW0.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/gf180/sW0.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/gf180/sW0.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/gf180/sW0.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/gf180/sW0.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/gf180/sW0.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/gf180/sW0.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/gf180/sW0.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/gf180/sW0.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/gf180/sW0.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/gf180/sW0.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/gf180/sW0.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/gf180/sW1.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/gf180/sW1.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/gf180/sW1.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/gf180/sW1.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/gf180/sW1.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/gf180/sW1.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/gf180/sW1.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/gf180/sW1.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/gf180/sW1.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/gf180/sW1.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/gf180/sW1.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/gf180/sW1.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/gf180/sW1.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/gf180/sW1.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/gf180/sW1.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/gf180/sW1.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/gf180/sW1.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/gf180/sW1.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/gf180/sW1.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/gf180/sW1.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/gf180/sW1.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/gf180/sW1_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/gf180/sW1_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/gf180/sW1_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/gf180/sW1_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/gf180/sW1_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/gf180/sW1_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/gf180/sW1_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/gf180/sW1_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/gf180/sW1_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/gf180/sW1_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/gf180/sW1_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/gf180/sW1_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/gf180/sW1_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/gf180/sW1_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/gf180/sW1_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/gf180/sW1_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/gf180/sW1_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/gf180/sW1_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/gf180/sW1_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/gf180/sW1_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/gf180/sW1_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/gf180/sW2_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/gf180/sW2_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/gf180/sW2_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/gf180/sW2_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/gf180/sW2_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/gf180/sW2_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/gf180/sW2_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/gf180/sW2_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/gf180/sW2_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/gf180/sW2_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/gf180/sW2_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/gf180/sW2_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/gf180/sW2_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/gf180/sW2_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/gf180/sW2_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/gf180/sW2_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/gf180/sW2_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/gf180/sW2_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/gf180/sW2_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/gf180/sW2_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/gf180/sW2_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/ihp130/sW0.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/ihp130/sW0.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/ihp130/sW0.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/ihp130/sW0.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/ihp130/sW0.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/ihp130/sW0.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/ihp130/sW0.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/ihp130/sW0.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/ihp130/sW0.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/ihp130/sW0.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/ihp130/sW0.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/ihp130/sW0.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/ihp130/sW0.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/ihp130/sW0.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/ihp130/sW0.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/ihp130/sW0.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/ihp130/sW0.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/ihp130/sW0.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/ihp130/sW0.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/ihp130/sW0.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/ihp130/sW0.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/ihp130/sW2_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/ihp130/sW2_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/ihp130/sW2_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/ihp130/sW2_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/ihp130/sW2_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/ihp130/sW2_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/ihp130/sW2_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/ihp130/sW2_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/ihp130/sW2_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/ihp130/sW2_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/ihp130/sW2_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/ihp130/sW2_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/ihp130/sW2_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/ihp130/sW2_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/ihp130/sW2_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/ihp130/sW2_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/ihp130/sW2_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/ihp130/sW2_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/ihp130/sW2_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/ihp130/sW2_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/ihp130/sW2_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/sky130/sW0.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/sky130/sW0.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/sky130/sW0.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/sky130/sW0.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/sky130/sW0.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/sky130/sW0.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/sky130/sW0.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/sky130/sW0.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/sky130/sW0.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/sky130/sW0.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/sky130/sW0.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/sky130/sW0.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/sky130/sW0.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/sky130/sW0.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/sky130/sW0.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/sky130/sW0.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/sky130/sW0.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/sky130/sW0.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/sky130/sW0.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/sky130/sW0.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/sky130/sW0.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/sky130/sW1.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/sky130/sW1.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/sky130/sW1.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/sky130/sW1.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/sky130/sW1.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/sky130/sW1.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/sky130/sW1.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/sky130/sW1.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/sky130/sW1.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/sky130/sW1.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/sky130/sW1.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/sky130/sW1.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/sky130/sW1.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/sky130/sW1.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/sky130/sW1.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/sky130/sW1.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/sky130/sW1.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/sky130/sW1.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/sky130/sW1.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/sky130/sW1.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/sky130/sW1.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/sky130/sW1_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/sky130/sW1_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/sky130/sW1_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/sky130/sW1_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/sky130/sW1_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/sky130/sW1_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/sky130/sW1_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/sky130/sW1_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/sky130/sW1_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/sky130/sW1_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/sky130/sW1_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/sky130/sW1_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/sky130/sW1_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/sky130/sW1_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/sky130/sW1_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/sky130/sW1_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/sky130/sW1_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/sky130/sW1_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/sky130/sW1_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/sky130/sW1_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/sky130/sW1_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/sky130/sW2_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/sky130/sW2_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/sky130/sW2_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/sky130/sW2_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/sky130/sW2_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/sky130/sW2_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/sky130/sW2_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/sky130/sW2_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/sky130/sW2_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/sky130/sW2_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/sky130/sW2_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/sky130/sW2_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/sky130/sW2_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/sky130/sW2_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/sky130/sW2_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/sky130/sW2_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/sky130/sW2_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/sky130/sW2_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C03/sky130/sW2_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/sky130/sW2_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C03/sky130/sW2_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/gf180/sW0.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/gf180/sW0.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/gf180/sW0.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/gf180/sW0.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/gf180/sW0.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/gf180/sW0.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/gf180/sW0.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/gf180/sW0.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/gf180/sW0.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/gf180/sW0.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/gf180/sW0.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/gf180/sW0.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/gf180/sW0.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/gf180/sW0.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/gf180/sW0.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/gf180/sW0.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/gf180/sW0.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/gf180/sW0.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/gf180/sW0.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/gf180/sW0.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/gf180/sW0.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/gf180/sW1.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/gf180/sW1.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/gf180/sW1.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/gf180/sW1.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/gf180/sW1.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/gf180/sW1.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/gf180/sW1.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/gf180/sW1.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/gf180/sW1.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/gf180/sW1.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/gf180/sW1.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/gf180/sW1.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/gf180/sW1.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/gf180/sW1.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/gf180/sW1.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/gf180/sW1.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/gf180/sW1.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/gf180/sW1.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/gf180/sW1.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/gf180/sW1.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/gf180/sW1.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/gf180/sW1_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/gf180/sW1_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/gf180/sW1_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/gf180/sW1_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/gf180/sW1_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/gf180/sW1_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/gf180/sW1_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/gf180/sW1_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/gf180/sW1_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/gf180/sW1_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/gf180/sW1_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/gf180/sW1_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/gf180/sW1_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/gf180/sW1_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/gf180/sW1_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/gf180/sW1_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/gf180/sW1_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/gf180/sW1_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/gf180/sW1_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/gf180/sW1_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/gf180/sW1_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/gf180/sW2_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/gf180/sW2_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/gf180/sW2_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/gf180/sW2_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/gf180/sW2_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/gf180/sW2_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/gf180/sW2_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/gf180/sW2_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/gf180/sW2_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/gf180/sW2_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/gf180/sW2_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/gf180/sW2_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/gf180/sW2_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/gf180/sW2_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/gf180/sW2_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/gf180/sW2_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/gf180/sW2_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/gf180/sW2_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/gf180/sW2_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/gf180/sW2_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/gf180/sW2_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/ihp130/sW0.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/ihp130/sW0.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/ihp130/sW0.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/ihp130/sW0.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/ihp130/sW0.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/ihp130/sW0.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/ihp130/sW0.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/ihp130/sW0.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/ihp130/sW0.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/ihp130/sW0.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/ihp130/sW0.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/ihp130/sW0.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/ihp130/sW0.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/ihp130/sW0.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/ihp130/sW0.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/ihp130/sW0.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/ihp130/sW0.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/ihp130/sW0.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/ihp130/sW0.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/ihp130/sW0.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/ihp130/sW0.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/ihp130/sW2_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/ihp130/sW2_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/ihp130/sW2_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/ihp130/sW2_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/ihp130/sW2_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/ihp130/sW2_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/ihp130/sW2_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/ihp130/sW2_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/ihp130/sW2_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/ihp130/sW2_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/ihp130/sW2_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/ihp130/sW2_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/ihp130/sW2_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/ihp130/sW2_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/ihp130/sW2_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/ihp130/sW2_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/ihp130/sW2_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/ihp130/sW2_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/ihp130/sW2_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/ihp130/sW2_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/ihp130/sW2_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/sky130/sW0.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/sky130/sW0.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/sky130/sW0.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/sky130/sW0.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/sky130/sW0.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/sky130/sW0.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/sky130/sW0.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/sky130/sW0.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/sky130/sW0.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/sky130/sW0.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/sky130/sW0.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/sky130/sW0.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/sky130/sW0.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/sky130/sW0.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/sky130/sW0.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/sky130/sW0.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/sky130/sW0.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/sky130/sW0.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/sky130/sW0.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/sky130/sW0.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/sky130/sW0.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/sky130/sW1.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/sky130/sW1.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/sky130/sW1.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/sky130/sW1.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/sky130/sW1.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/sky130/sW1.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/sky130/sW1.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/sky130/sW1.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/sky130/sW1.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/sky130/sW1.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/sky130/sW1.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/sky130/sW1.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/sky130/sW1.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/sky130/sW1.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/sky130/sW1.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/sky130/sW1.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/sky130/sW1.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/sky130/sW1.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/sky130/sW1.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/sky130/sW1.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/sky130/sW1.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/sky130/sW1_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/sky130/sW1_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/sky130/sW1_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/sky130/sW1_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/sky130/sW1_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/sky130/sW1_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/sky130/sW1_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/sky130/sW1_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/sky130/sW1_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/sky130/sW1_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/sky130/sW1_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/sky130/sW1_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/sky130/sW1_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/sky130/sW1_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/sky130/sW1_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/sky130/sW1_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/sky130/sW1_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/sky130/sW1_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/sky130/sW1_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/sky130/sW1_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/sky130/sW1_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/sky130/sW2_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/sky130/sW2_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/sky130/sW2_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/sky130/sW2_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/sky130/sW2_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/sky130/sW2_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/sky130/sW2_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/sky130/sW2_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/sky130/sW2_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/sky130/sW2_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/sky130/sW2_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/sky130/sW2_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/sky130/sW2_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/sky130/sW2_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/sky130/sW2_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/sky130/sW2_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/sky130/sW2_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/sky130/sW2_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C04/sky130/sW2_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/sky130/sW2_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C04/sky130/sW2_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/gf180/sW0.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/gf180/sW0.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/gf180/sW0.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/gf180/sW0.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/gf180/sW0.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/gf180/sW0.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/gf180/sW0.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/gf180/sW0.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/gf180/sW0.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/gf180/sW0.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/gf180/sW0.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/gf180/sW0.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/gf180/sW0.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/gf180/sW0.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/gf180/sW0.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/gf180/sW0.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/gf180/sW0.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/gf180/sW0.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/gf180/sW0.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/gf180/sW0.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/gf180/sW0.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/gf180/sW1.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/gf180/sW1.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/gf180/sW1.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/gf180/sW1.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/gf180/sW1.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/gf180/sW1.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/gf180/sW1.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/gf180/sW1.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/gf180/sW1.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/gf180/sW1.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/gf180/sW1.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/gf180/sW1.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/gf180/sW1.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/gf180/sW1.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/gf180/sW1.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/gf180/sW1.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/gf180/sW1.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/gf180/sW1.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/gf180/sW1.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/gf180/sW1.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/gf180/sW1.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/gf180/sW1_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/gf180/sW1_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/gf180/sW1_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/gf180/sW1_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/gf180/sW1_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/gf180/sW1_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/gf180/sW1_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/gf180/sW1_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/gf180/sW1_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/gf180/sW1_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/gf180/sW1_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/gf180/sW1_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/gf180/sW1_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/gf180/sW1_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/gf180/sW1_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/gf180/sW1_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/gf180/sW1_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/gf180/sW1_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/gf180/sW1_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/gf180/sW1_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/gf180/sW1_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/gf180/sW2_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/gf180/sW2_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/gf180/sW2_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/gf180/sW2_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/gf180/sW2_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/gf180/sW2_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/gf180/sW2_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/gf180/sW2_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/gf180/sW2_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/gf180/sW2_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/gf180/sW2_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/gf180/sW2_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/gf180/sW2_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/gf180/sW2_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/gf180/sW2_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/gf180/sW2_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/gf180/sW2_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/gf180/sW2_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/gf180/sW2_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/gf180/sW2_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/gf180/sW2_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/ihp130/sW0.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/ihp130/sW0.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/ihp130/sW0.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/ihp130/sW0.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/ihp130/sW0.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/ihp130/sW0.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/ihp130/sW0.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/ihp130/sW0.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/ihp130/sW0.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/ihp130/sW0.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/ihp130/sW0.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/ihp130/sW0.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/ihp130/sW0.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/ihp130/sW0.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/ihp130/sW0.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/ihp130/sW0.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/ihp130/sW0.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/ihp130/sW0.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/ihp130/sW0.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/ihp130/sW0.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/ihp130/sW0.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/ihp130/sW2_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/ihp130/sW2_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/ihp130/sW2_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/ihp130/sW2_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/ihp130/sW2_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/ihp130/sW2_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/ihp130/sW2_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/ihp130/sW2_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/ihp130/sW2_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/ihp130/sW2_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/ihp130/sW2_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/ihp130/sW2_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/ihp130/sW2_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/ihp130/sW2_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/ihp130/sW2_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/ihp130/sW2_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/ihp130/sW2_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/ihp130/sW2_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/ihp130/sW2_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/ihp130/sW2_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/ihp130/sW2_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/sky130/sW0.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/sky130/sW0.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/sky130/sW0.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/sky130/sW0.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/sky130/sW0.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/sky130/sW0.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/sky130/sW0.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/sky130/sW0.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/sky130/sW0.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/sky130/sW0.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/sky130/sW0.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/sky130/sW0.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/sky130/sW0.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/sky130/sW0.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/sky130/sW0.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/sky130/sW0.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/sky130/sW0.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/sky130/sW0.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/sky130/sW0.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/sky130/sW0.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/sky130/sW0.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/sky130/sW1.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/sky130/sW1.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/sky130/sW1.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/sky130/sW1.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/sky130/sW1.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/sky130/sW1.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/sky130/sW1.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/sky130/sW1.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/sky130/sW1.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/sky130/sW1.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/sky130/sW1.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/sky130/sW1.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/sky130/sW1.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/sky130/sW1.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/sky130/sW1.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/sky130/sW1.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/sky130/sW1.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/sky130/sW1.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/sky130/sW1.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/sky130/sW1.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/sky130/sW1.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/sky130/sW1_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/sky130/sW1_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/sky130/sW1_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/sky130/sW1_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/sky130/sW1_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/sky130/sW1_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/sky130/sW1_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/sky130/sW1_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/sky130/sW1_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/sky130/sW1_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/sky130/sW1_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/sky130/sW1_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/sky130/sW1_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/sky130/sW1_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/sky130/sW1_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/sky130/sW1_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/sky130/sW1_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/sky130/sW1_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/sky130/sW1_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/sky130/sW1_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/sky130/sW1_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/sky130/sW2_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/sky130/sW2_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/sky130/sW2_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/sky130/sW2_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/sky130/sW2_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/sky130/sW2_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/sky130/sW2_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/sky130/sW2_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/sky130/sW2_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/sky130/sW2_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/sky130/sW2_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/sky130/sW2_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/sky130/sW2_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/sky130/sW2_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/sky130/sW2_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/sky130/sW2_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/sky130/sW2_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/sky130/sW2_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C05/sky130/sW2_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/sky130/sW2_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C05/sky130/sW2_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/gf180/sW0.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/gf180/sW0.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/gf180/sW0.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/gf180/sW0.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/gf180/sW0.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/gf180/sW0.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/gf180/sW0.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/gf180/sW0.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/gf180/sW0.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/gf180/sW0.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/gf180/sW0.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/gf180/sW0.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/gf180/sW0.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/gf180/sW0.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/gf180/sW0.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/gf180/sW0.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/gf180/sW0.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/gf180/sW0.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/gf180/sW0.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/gf180/sW0.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/gf180/sW0.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/gf180/sW1.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/gf180/sW1.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/gf180/sW1.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/gf180/sW1.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/gf180/sW1.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/gf180/sW1.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/gf180/sW1.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/gf180/sW1.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/gf180/sW1.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/gf180/sW1.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/gf180/sW1.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/gf180/sW1.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/gf180/sW1.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/gf180/sW1.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/gf180/sW1.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/gf180/sW1.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/gf180/sW1.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/gf180/sW1.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/gf180/sW1.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/gf180/sW1.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/gf180/sW1.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/gf180/sW1_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/gf180/sW1_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/gf180/sW1_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/gf180/sW1_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/gf180/sW1_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/gf180/sW1_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/gf180/sW1_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/gf180/sW1_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/gf180/sW1_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/gf180/sW1_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/gf180/sW1_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/gf180/sW1_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/gf180/sW1_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/gf180/sW1_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/gf180/sW1_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/gf180/sW1_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/gf180/sW1_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/gf180/sW1_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/gf180/sW1_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/gf180/sW1_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/gf180/sW1_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/gf180/sW2_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/gf180/sW2_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/gf180/sW2_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/gf180/sW2_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/gf180/sW2_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/gf180/sW2_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/gf180/sW2_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/gf180/sW2_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/gf180/sW2_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/gf180/sW2_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/gf180/sW2_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/gf180/sW2_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/gf180/sW2_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/gf180/sW2_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/gf180/sW2_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/gf180/sW2_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/gf180/sW2_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/gf180/sW2_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/gf180/sW2_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/gf180/sW2_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/gf180/sW2_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/ihp130/sW0.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/ihp130/sW0.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/ihp130/sW0.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/ihp130/sW0.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/ihp130/sW0.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/ihp130/sW0.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/ihp130/sW0.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/ihp130/sW0.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/ihp130/sW0.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/ihp130/sW0.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/ihp130/sW0.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/ihp130/sW0.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/ihp130/sW0.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/ihp130/sW0.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/ihp130/sW0.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/ihp130/sW0.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/ihp130/sW0.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/ihp130/sW0.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/ihp130/sW0.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/ihp130/sW0.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/ihp130/sW0.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/ihp130/sW2_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/ihp130/sW2_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/ihp130/sW2_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/ihp130/sW2_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/ihp130/sW2_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/ihp130/sW2_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/ihp130/sW2_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/ihp130/sW2_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/ihp130/sW2_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/ihp130/sW2_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/ihp130/sW2_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/ihp130/sW2_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/ihp130/sW2_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/ihp130/sW2_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/ihp130/sW2_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/ihp130/sW2_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/ihp130/sW2_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/ihp130/sW2_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/ihp130/sW2_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/ihp130/sW2_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/ihp130/sW2_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/sky130/sW0.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/sky130/sW0.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/sky130/sW0.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/sky130/sW0.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/sky130/sW0.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/sky130/sW0.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/sky130/sW0.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/sky130/sW0.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/sky130/sW0.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/sky130/sW0.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/sky130/sW0.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/sky130/sW0.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/sky130/sW0.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/sky130/sW0.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/sky130/sW0.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/sky130/sW0.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/sky130/sW0.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/sky130/sW0.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/sky130/sW0.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/sky130/sW0.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/sky130/sW0.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/sky130/sW1.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/sky130/sW1.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/sky130/sW1.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/sky130/sW1.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/sky130/sW1.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/sky130/sW1.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/sky130/sW1.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/sky130/sW1.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/sky130/sW1.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/sky130/sW1.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/sky130/sW1.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/sky130/sW1.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/sky130/sW1.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/sky130/sW1.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/sky130/sW1.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/sky130/sW1.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/sky130/sW1.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/sky130/sW1.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/sky130/sW1.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/sky130/sW1.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/sky130/sW1.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/sky130/sW1_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/sky130/sW1_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/sky130/sW1_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/sky130/sW1_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/sky130/sW1_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/sky130/sW1_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/sky130/sW1_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/sky130/sW1_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/sky130/sW1_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/sky130/sW1_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/sky130/sW1_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/sky130/sW1_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/sky130/sW1_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/sky130/sW1_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/sky130/sW1_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/sky130/sW1_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/sky130/sW1_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/sky130/sW1_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/sky130/sW1_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/sky130/sW1_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/sky130/sW1_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/sky130/sW2_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/sky130/sW2_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/sky130/sW2_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/sky130/sW2_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/sky130/sW2_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/sky130/sW2_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/sky130/sW2_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/sky130/sW2_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/sky130/sW2_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/sky130/sW2_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/sky130/sW2_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/sky130/sW2_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/sky130/sW2_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/sky130/sW2_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/sky130/sW2_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/sky130/sW2_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/sky130/sW2_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/sky130/sW2_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C06/sky130/sW2_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/sky130/sW2_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C06/sky130/sW2_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/gf180/sW0.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/gf180/sW0.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/gf180/sW0.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/gf180/sW0.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/gf180/sW0.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/gf180/sW0.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/gf180/sW0.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/gf180/sW0.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/gf180/sW0.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/gf180/sW0.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/gf180/sW0.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/gf180/sW0.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/gf180/sW0.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/gf180/sW0.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/gf180/sW0.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/gf180/sW0.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/gf180/sW0.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/gf180/sW0.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/gf180/sW0.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/gf180/sW0.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/gf180/sW0.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/gf180/sW1.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/gf180/sW1.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/gf180/sW1.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/gf180/sW1.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/gf180/sW1.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/gf180/sW1.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/gf180/sW1.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/gf180/sW1.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/gf180/sW1.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/gf180/sW1.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/gf180/sW1.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/gf180/sW1.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/gf180/sW1.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/gf180/sW1.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/gf180/sW1.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/gf180/sW1.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/gf180/sW1.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/gf180/sW1.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/gf180/sW1.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/gf180/sW1.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/gf180/sW1.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/gf180/sW1_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/gf180/sW1_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/gf180/sW1_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/gf180/sW1_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/gf180/sW1_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/gf180/sW1_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/gf180/sW1_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/gf180/sW1_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/gf180/sW1_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/gf180/sW1_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/gf180/sW1_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/gf180/sW1_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/gf180/sW1_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/gf180/sW1_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/gf180/sW1_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/gf180/sW1_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/gf180/sW1_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/gf180/sW1_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/gf180/sW1_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/gf180/sW1_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/gf180/sW1_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/gf180/sW2_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/gf180/sW2_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/gf180/sW2_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/gf180/sW2_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/gf180/sW2_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/gf180/sW2_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/gf180/sW2_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/gf180/sW2_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/gf180/sW2_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/gf180/sW2_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/gf180/sW2_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/gf180/sW2_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/gf180/sW2_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/gf180/sW2_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/gf180/sW2_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/gf180/sW2_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/gf180/sW2_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/gf180/sW2_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/gf180/sW2_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/gf180/sW2_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/gf180/sW2_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/ihp130/sW0.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/ihp130/sW0.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/ihp130/sW0.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/ihp130/sW0.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/ihp130/sW0.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/ihp130/sW0.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/ihp130/sW0.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/ihp130/sW0.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/ihp130/sW0.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/ihp130/sW0.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/ihp130/sW0.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/ihp130/sW0.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/ihp130/sW0.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/ihp130/sW0.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/ihp130/sW0.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/ihp130/sW0.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/ihp130/sW0.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/ihp130/sW0.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/ihp130/sW0.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/ihp130/sW0.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/ihp130/sW0.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/ihp130/sW2_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/ihp130/sW2_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/ihp130/sW2_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/ihp130/sW2_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/ihp130/sW2_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/ihp130/sW2_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/ihp130/sW2_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/ihp130/sW2_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/ihp130/sW2_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/ihp130/sW2_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/ihp130/sW2_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/ihp130/sW2_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/ihp130/sW2_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/ihp130/sW2_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/ihp130/sW2_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/ihp130/sW2_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/ihp130/sW2_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/ihp130/sW2_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/ihp130/sW2_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/ihp130/sW2_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/ihp130/sW2_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/sky130/sW0.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/sky130/sW0.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/sky130/sW0.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/sky130/sW0.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/sky130/sW0.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/sky130/sW0.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/sky130/sW0.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/sky130/sW0.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/sky130/sW0.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/sky130/sW0.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/sky130/sW0.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/sky130/sW0.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/sky130/sW0.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/sky130/sW0.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/sky130/sW0.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/sky130/sW0.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/sky130/sW0.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/sky130/sW0.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/sky130/sW0.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/sky130/sW0.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/sky130/sW0.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/sky130/sW1.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/sky130/sW1.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/sky130/sW1.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/sky130/sW1.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/sky130/sW1.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/sky130/sW1.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/sky130/sW1.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/sky130/sW1.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/sky130/sW1.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/sky130/sW1.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/sky130/sW1.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/sky130/sW1.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/sky130/sW1.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/sky130/sW1.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/sky130/sW1.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/sky130/sW1.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/sky130/sW1.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/sky130/sW1.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/sky130/sW1.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/sky130/sW1.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/sky130/sW1.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/sky130/sW1_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/sky130/sW1_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/sky130/sW1_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/sky130/sW1_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/sky130/sW1_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/sky130/sW1_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/sky130/sW1_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/sky130/sW1_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/sky130/sW1_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/sky130/sW1_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/sky130/sW1_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/sky130/sW1_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/sky130/sW1_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/sky130/sW1_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/sky130/sW1_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/sky130/sW1_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/sky130/sW1_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/sky130/sW1_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/sky130/sW1_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/sky130/sW1_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/sky130/sW1_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/sky130/sW2_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/sky130/sW2_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/sky130/sW2_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/sky130/sW2_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/sky130/sW2_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/sky130/sW2_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/sky130/sW2_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/sky130/sW2_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/sky130/sW2_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/sky130/sW2_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/sky130/sW2_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/sky130/sW2_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/sky130/sW2_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/sky130/sW2_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/sky130/sW2_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/sky130/sW2_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/sky130/sW2_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/sky130/sW2_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C07/sky130/sW2_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/sky130/sW2_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C07/sky130/sW2_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/gf180/sW0.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/gf180/sW0.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/gf180/sW0.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/gf180/sW0.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/gf180/sW0.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/gf180/sW0.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/gf180/sW0.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/gf180/sW0.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/gf180/sW0.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/gf180/sW0.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/gf180/sW0.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/gf180/sW0.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/gf180/sW0.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/gf180/sW0.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/gf180/sW0.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/gf180/sW0.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/gf180/sW0.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/gf180/sW0.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/gf180/sW0.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/gf180/sW0.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/gf180/sW0.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/gf180/sW1.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/gf180/sW1.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/gf180/sW1.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/gf180/sW1.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/gf180/sW1.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/gf180/sW1.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/gf180/sW1.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/gf180/sW1.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/gf180/sW1.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/gf180/sW1.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/gf180/sW1.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/gf180/sW1.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/gf180/sW1.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/gf180/sW1.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/gf180/sW1.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/gf180/sW1.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/gf180/sW1.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/gf180/sW1.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/gf180/sW1.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/gf180/sW1.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/gf180/sW1.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/gf180/sW1_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/gf180/sW1_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/gf180/sW1_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/gf180/sW1_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/gf180/sW1_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/gf180/sW1_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/gf180/sW1_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/gf180/sW1_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/gf180/sW1_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/gf180/sW1_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/gf180/sW1_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/gf180/sW1_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/gf180/sW1_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/gf180/sW1_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/gf180/sW1_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/gf180/sW1_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/gf180/sW1_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/gf180/sW1_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/gf180/sW1_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/gf180/sW1_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/gf180/sW1_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/gf180/sW2_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/gf180/sW2_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/gf180/sW2_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/gf180/sW2_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/gf180/sW2_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/gf180/sW2_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/gf180/sW2_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/gf180/sW2_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/gf180/sW2_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/gf180/sW2_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/gf180/sW2_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/gf180/sW2_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/gf180/sW2_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/gf180/sW2_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/gf180/sW2_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/gf180/sW2_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/gf180/sW2_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/gf180/sW2_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/gf180/sW2_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/gf180/sW2_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/gf180/sW2_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/ihp130/sW0.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/ihp130/sW0.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/ihp130/sW0.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/ihp130/sW0.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/ihp130/sW0.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/ihp130/sW0.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/ihp130/sW0.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/ihp130/sW0.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/ihp130/sW0.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/ihp130/sW0.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/ihp130/sW0.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/ihp130/sW0.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/ihp130/sW0.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/ihp130/sW0.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/ihp130/sW0.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/ihp130/sW0.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/ihp130/sW0.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/ihp130/sW0.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/ihp130/sW0.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/ihp130/sW0.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/ihp130/sW0.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/ihp130/sW2_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/ihp130/sW2_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/ihp130/sW2_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/ihp130/sW2_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/ihp130/sW2_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/ihp130/sW2_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/ihp130/sW2_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/ihp130/sW2_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/ihp130/sW2_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/ihp130/sW2_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/ihp130/sW2_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/ihp130/sW2_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/ihp130/sW2_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/ihp130/sW2_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/ihp130/sW2_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/ihp130/sW2_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/ihp130/sW2_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/ihp130/sW2_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/ihp130/sW2_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/ihp130/sW2_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/ihp130/sW2_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/sky130/sW0.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/sky130/sW0.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/sky130/sW0.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/sky130/sW0.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/sky130/sW0.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/sky130/sW0.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/sky130/sW0.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/sky130/sW0.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/sky130/sW0.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/sky130/sW0.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/sky130/sW0.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/sky130/sW0.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/sky130/sW0.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/sky130/sW0.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/sky130/sW0.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/sky130/sW0.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/sky130/sW0.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/sky130/sW0.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/sky130/sW0.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/sky130/sW0.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/sky130/sW0.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/sky130/sW1.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/sky130/sW1.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/sky130/sW1.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/sky130/sW1.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/sky130/sW1.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/sky130/sW1.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/sky130/sW1.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/sky130/sW1.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/sky130/sW1.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/sky130/sW1.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/sky130/sW1.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/sky130/sW1.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/sky130/sW1.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/sky130/sW1.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/sky130/sW1.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/sky130/sW1.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/sky130/sW1.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/sky130/sW1.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/sky130/sW1.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/sky130/sW1.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/sky130/sW1.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/sky130/sW1_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/sky130/sW1_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/sky130/sW1_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/sky130/sW1_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/sky130/sW1_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/sky130/sW1_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/sky130/sW1_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/sky130/sW1_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/sky130/sW1_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/sky130/sW1_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/sky130/sW1_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/sky130/sW1_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/sky130/sW1_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/sky130/sW1_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/sky130/sW1_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/sky130/sW1_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/sky130/sW1_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/sky130/sW1_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/sky130/sW1_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/sky130/sW1_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/sky130/sW1_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/sky130/sW2_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/sky130/sW2_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/sky130/sW2_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/sky130/sW2_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/sky130/sW2_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/sky130/sW2_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/sky130/sW2_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/sky130/sW2_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/sky130/sW2_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/sky130/sW2_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/sky130/sW2_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/sky130/sW2_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/sky130/sW2_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/sky130/sW2_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/sky130/sW2_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/sky130/sW2_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/sky130/sW2_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/sky130/sW2_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C08/sky130/sW2_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/sky130/sW2_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C08/sky130/sW2_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/gf180/sW0.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/gf180/sW0.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/gf180/sW0.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/gf180/sW0.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/gf180/sW0.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/gf180/sW0.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/gf180/sW0.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/gf180/sW0.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/gf180/sW0.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/gf180/sW0.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/gf180/sW0.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/gf180/sW0.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/gf180/sW0.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/gf180/sW0.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/gf180/sW0.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/gf180/sW0.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/gf180/sW0.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/gf180/sW0.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/gf180/sW0.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/gf180/sW0.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/gf180/sW0.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/gf180/sW1.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/gf180/sW1.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/gf180/sW1.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/gf180/sW1.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/gf180/sW1.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/gf180/sW1.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/gf180/sW1.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/gf180/sW1.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/gf180/sW1.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/gf180/sW1.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/gf180/sW1.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/gf180/sW1.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/gf180/sW1.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/gf180/sW1.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/gf180/sW1.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/gf180/sW1.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/gf180/sW1.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/gf180/sW1.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/gf180/sW1.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/gf180/sW1.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/gf180/sW1.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/gf180/sW1_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/gf180/sW1_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/gf180/sW1_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/gf180/sW1_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/gf180/sW1_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/gf180/sW1_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/gf180/sW1_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/gf180/sW1_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/gf180/sW1_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/gf180/sW1_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/gf180/sW1_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/gf180/sW1_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/gf180/sW1_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/gf180/sW1_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/gf180/sW1_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/gf180/sW1_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/gf180/sW1_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/gf180/sW1_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/gf180/sW1_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/gf180/sW1_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/gf180/sW1_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/gf180/sW2_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/gf180/sW2_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/gf180/sW2_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/gf180/sW2_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/gf180/sW2_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/gf180/sW2_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/gf180/sW2_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/gf180/sW2_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/gf180/sW2_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/gf180/sW2_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/gf180/sW2_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/gf180/sW2_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/gf180/sW2_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/gf180/sW2_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/gf180/sW2_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/gf180/sW2_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/gf180/sW2_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/gf180/sW2_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/gf180/sW2_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/gf180/sW2_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/gf180/sW2_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/ihp130/sW0.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/ihp130/sW0.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/ihp130/sW0.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/ihp130/sW0.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/ihp130/sW0.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/ihp130/sW0.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/ihp130/sW0.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/ihp130/sW0.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/ihp130/sW0.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/ihp130/sW0.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/ihp130/sW0.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/ihp130/sW0.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/ihp130/sW0.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/ihp130/sW0.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/ihp130/sW0.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/ihp130/sW0.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/ihp130/sW0.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/ihp130/sW0.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/ihp130/sW0.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/ihp130/sW0.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/ihp130/sW0.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/ihp130/sW2_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/ihp130/sW2_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/ihp130/sW2_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/ihp130/sW2_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/ihp130/sW2_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/ihp130/sW2_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/ihp130/sW2_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/ihp130/sW2_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/ihp130/sW2_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/ihp130/sW2_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/ihp130/sW2_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/ihp130/sW2_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/ihp130/sW2_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/ihp130/sW2_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/ihp130/sW2_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/ihp130/sW2_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/ihp130/sW2_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/ihp130/sW2_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/ihp130/sW2_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/ihp130/sW2_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/ihp130/sW2_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/sky130/sW0.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/sky130/sW0.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/sky130/sW0.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/sky130/sW0.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/sky130/sW0.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/sky130/sW0.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/sky130/sW0.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/sky130/sW0.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/sky130/sW0.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/sky130/sW0.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/sky130/sW0.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/sky130/sW0.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/sky130/sW0.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/sky130/sW0.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/sky130/sW0.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/sky130/sW0.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/sky130/sW0.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/sky130/sW0.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/sky130/sW0.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/sky130/sW0.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/sky130/sW0.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/sky130/sW1.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/sky130/sW1.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/sky130/sW1.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/sky130/sW1.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/sky130/sW1.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/sky130/sW1.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/sky130/sW1.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/sky130/sW1.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/sky130/sW1.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/sky130/sW1.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/sky130/sW1.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/sky130/sW1.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/sky130/sW1.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/sky130/sW1.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/sky130/sW1.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/sky130/sW1.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/sky130/sW1.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/sky130/sW1.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/sky130/sW1.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/sky130/sW1.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/sky130/sW1.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/sky130/sW1_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/sky130/sW1_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/sky130/sW1_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/sky130/sW1_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/sky130/sW1_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/sky130/sW1_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/sky130/sW1_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/sky130/sW1_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/sky130/sW1_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/sky130/sW1_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/sky130/sW1_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/sky130/sW1_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/sky130/sW1_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/sky130/sW1_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/sky130/sW1_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/sky130/sW1_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/sky130/sW1_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/sky130/sW1_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/sky130/sW1_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/sky130/sW1_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/sky130/sW1_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/sky130/sW2_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/sky130/sW2_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/sky130/sW2_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/sky130/sW2_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/sky130/sW2_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/sky130/sW2_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/sky130/sW2_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/sky130/sW2_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/sky130/sW2_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/sky130/sW2_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/sky130/sW2_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/sky130/sW2_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/sky130/sW2_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/sky130/sW2_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/sky130/sW2_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/sky130/sW2_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/sky130/sW2_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/sky130/sW2_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C09/sky130/sW2_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/sky130/sW2_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C09/sky130/sW2_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/gf180/sW0.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/gf180/sW0.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/gf180/sW0.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/gf180/sW0.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/gf180/sW0.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/gf180/sW0.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/gf180/sW0.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/gf180/sW0.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/gf180/sW0.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/gf180/sW0.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/gf180/sW0.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/gf180/sW0.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/gf180/sW0.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/gf180/sW0.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/gf180/sW0.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/gf180/sW0.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/gf180/sW0.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/gf180/sW0.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/gf180/sW0.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/gf180/sW0.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/gf180/sW0.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/gf180/sW1.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/gf180/sW1.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/gf180/sW1.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/gf180/sW1.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/gf180/sW1.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/gf180/sW1.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/gf180/sW1.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/gf180/sW1.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/gf180/sW1.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/gf180/sW1.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/gf180/sW1.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/gf180/sW1.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/gf180/sW1.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/gf180/sW1.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/gf180/sW1.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/gf180/sW1.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/gf180/sW1.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/gf180/sW1.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/gf180/sW1.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/gf180/sW1.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/gf180/sW1.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/gf180/sW1_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/gf180/sW1_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/gf180/sW1_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/gf180/sW1_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/gf180/sW1_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/gf180/sW1_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/gf180/sW1_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/gf180/sW1_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/gf180/sW1_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/gf180/sW1_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/gf180/sW1_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/gf180/sW1_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/gf180/sW1_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/gf180/sW1_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/gf180/sW1_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/gf180/sW1_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/gf180/sW1_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/gf180/sW1_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/gf180/sW1_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/gf180/sW1_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/gf180/sW1_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/gf180/sW2_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/gf180/sW2_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/gf180/sW2_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/gf180/sW2_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/gf180/sW2_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/gf180/sW2_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/gf180/sW2_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/gf180/sW2_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/gf180/sW2_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/gf180/sW2_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/gf180/sW2_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/gf180/sW2_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/gf180/sW2_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/gf180/sW2_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/gf180/sW2_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/gf180/sW2_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/gf180/sW2_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/gf180/sW2_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/gf180/sW2_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/gf180/sW2_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/gf180/sW2_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/ihp130/sW0.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/ihp130/sW0.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/ihp130/sW0.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/ihp130/sW0.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/ihp130/sW0.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/ihp130/sW0.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/ihp130/sW0.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/ihp130/sW0.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/ihp130/sW0.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/ihp130/sW0.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/ihp130/sW0.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/ihp130/sW0.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/ihp130/sW0.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/ihp130/sW0.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/ihp130/sW0.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/ihp130/sW0.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/ihp130/sW0.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/ihp130/sW0.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/ihp130/sW0.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/ihp130/sW0.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/ihp130/sW0.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/ihp130/sW2_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/ihp130/sW2_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/ihp130/sW2_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/ihp130/sW2_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/ihp130/sW2_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/ihp130/sW2_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/ihp130/sW2_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/ihp130/sW2_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/ihp130/sW2_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/ihp130/sW2_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/ihp130/sW2_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/ihp130/sW2_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/ihp130/sW2_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/ihp130/sW2_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/ihp130/sW2_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/ihp130/sW2_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/ihp130/sW2_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/ihp130/sW2_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/ihp130/sW2_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/ihp130/sW2_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/ihp130/sW2_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/sky130/sW0.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/sky130/sW0.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/sky130/sW0.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/sky130/sW0.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/sky130/sW0.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/sky130/sW0.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/sky130/sW0.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/sky130/sW0.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/sky130/sW0.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/sky130/sW0.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/sky130/sW0.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/sky130/sW0.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/sky130/sW0.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/sky130/sW0.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/sky130/sW0.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/sky130/sW0.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/sky130/sW0.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/sky130/sW0.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/sky130/sW0.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/sky130/sW0.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/sky130/sW0.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/sky130/sW1.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/sky130/sW1.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/sky130/sW1.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/sky130/sW1.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/sky130/sW1.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/sky130/sW1.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/sky130/sW1.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/sky130/sW1.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/sky130/sW1.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/sky130/sW1.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/sky130/sW1.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/sky130/sW1.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/sky130/sW1.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/sky130/sW1.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/sky130/sW1.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/sky130/sW1.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/sky130/sW1.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/sky130/sW1.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/sky130/sW1.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/sky130/sW1.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/sky130/sW1.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/sky130/sW1_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/sky130/sW1_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/sky130/sW1_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/sky130/sW1_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/sky130/sW1_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/sky130/sW1_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/sky130/sW1_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/sky130/sW1_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/sky130/sW1_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/sky130/sW1_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/sky130/sW1_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/sky130/sW1_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/sky130/sW1_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/sky130/sW1_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/sky130/sW1_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/sky130/sW1_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/sky130/sW1_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/sky130/sW1_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/sky130/sW1_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/sky130/sW1_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/sky130/sW1_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/sky130/sW2_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/sky130/sW2_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/sky130/sW2_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/sky130/sW2_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/sky130/sW2_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/sky130/sW2_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/sky130/sW2_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/sky130/sW2_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/sky130/sW2_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/sky130/sW2_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/sky130/sW2_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/sky130/sW2_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/sky130/sW2_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/sky130/sW2_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/sky130/sW2_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/sky130/sW2_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/sky130/sW2_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/sky130/sW2_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C10/sky130/sW2_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/sky130/sW2_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C10/sky130/sW2_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/gf180/sW0.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/gf180/sW0.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/gf180/sW0.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/gf180/sW0.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/gf180/sW0.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/gf180/sW0.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/gf180/sW0.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/gf180/sW0.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/gf180/sW0.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/gf180/sW0.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/gf180/sW0.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/gf180/sW0.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/gf180/sW0.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/gf180/sW0.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/gf180/sW0.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/gf180/sW0.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/gf180/sW0.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/gf180/sW0.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/gf180/sW0.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/gf180/sW0.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/gf180/sW0.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/gf180/sW1.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/gf180/sW1.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/gf180/sW1.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/gf180/sW1.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/gf180/sW1.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/gf180/sW1.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/gf180/sW1.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/gf180/sW1.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/gf180/sW1.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/gf180/sW1.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/gf180/sW1.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/gf180/sW1.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/gf180/sW1.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/gf180/sW1.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/gf180/sW1.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/gf180/sW1.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/gf180/sW1.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/gf180/sW1.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/gf180/sW1.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/gf180/sW1.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/gf180/sW1.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/gf180/sW1_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/gf180/sW1_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/gf180/sW1_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/gf180/sW1_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/gf180/sW1_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/gf180/sW1_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/gf180/sW1_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/gf180/sW1_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/gf180/sW1_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/gf180/sW1_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/gf180/sW1_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/gf180/sW1_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/gf180/sW1_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/gf180/sW1_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/gf180/sW1_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/gf180/sW1_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/gf180/sW1_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/gf180/sW1_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/gf180/sW1_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/gf180/sW1_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/gf180/sW1_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/gf180/sW2_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/gf180/sW2_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/gf180/sW2_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/gf180/sW2_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/gf180/sW2_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/gf180/sW2_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/gf180/sW2_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/gf180/sW2_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/gf180/sW2_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/gf180/sW2_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/gf180/sW2_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/gf180/sW2_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/gf180/sW2_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/gf180/sW2_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/gf180/sW2_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/gf180/sW2_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/gf180/sW2_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/gf180/sW2_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/gf180/sW2_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/gf180/sW2_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/gf180/sW2_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/ihp130/sW0.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/ihp130/sW0.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/ihp130/sW0.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/ihp130/sW0.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/ihp130/sW0.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/ihp130/sW0.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/ihp130/sW0.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/ihp130/sW0.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/ihp130/sW0.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/ihp130/sW0.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/ihp130/sW0.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/ihp130/sW0.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/ihp130/sW0.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/ihp130/sW0.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/ihp130/sW0.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/ihp130/sW0.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/ihp130/sW0.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/ihp130/sW0.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/ihp130/sW0.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/ihp130/sW0.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/ihp130/sW0.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/ihp130/sW2_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/ihp130/sW2_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/ihp130/sW2_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/ihp130/sW2_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/ihp130/sW2_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/ihp130/sW2_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/ihp130/sW2_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/ihp130/sW2_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/ihp130/sW2_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/ihp130/sW2_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/ihp130/sW2_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/ihp130/sW2_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/ihp130/sW2_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/ihp130/sW2_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/ihp130/sW2_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/ihp130/sW2_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/ihp130/sW2_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/ihp130/sW2_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/ihp130/sW2_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/ihp130/sW2_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/ihp130/sW2_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/sky130/sW0.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/sky130/sW0.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/sky130/sW0.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/sky130/sW0.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/sky130/sW0.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/sky130/sW0.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/sky130/sW0.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/sky130/sW0.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/sky130/sW0.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/sky130/sW0.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/sky130/sW0.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/sky130/sW0.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/sky130/sW0.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/sky130/sW0.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/sky130/sW0.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/sky130/sW0.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/sky130/sW0.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/sky130/sW0.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/sky130/sW0.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/sky130/sW0.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/sky130/sW0.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/sky130/sW1.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/sky130/sW1.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/sky130/sW1.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/sky130/sW1.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/sky130/sW1.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/sky130/sW1.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/sky130/sW1.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/sky130/sW1.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/sky130/sW1.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/sky130/sW1.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/sky130/sW1.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/sky130/sW1.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/sky130/sW1.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/sky130/sW1.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/sky130/sW1.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/sky130/sW1.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/sky130/sW1.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/sky130/sW1.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/sky130/sW1.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/sky130/sW1.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/sky130/sW1.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/sky130/sW1_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/sky130/sW1_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/sky130/sW1_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/sky130/sW1_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/sky130/sW1_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/sky130/sW1_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/sky130/sW1_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/sky130/sW1_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/sky130/sW1_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/sky130/sW1_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/sky130/sW1_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/sky130/sW1_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/sky130/sW1_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/sky130/sW1_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/sky130/sW1_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/sky130/sW1_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/sky130/sW1_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/sky130/sW1_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/sky130/sW1_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/sky130/sW1_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/sky130/sW1_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/sky130/sW2_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/sky130/sW2_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/sky130/sW2_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/sky130/sW2_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/sky130/sW2_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/sky130/sW2_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/sky130/sW2_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/sky130/sW2_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/sky130/sW2_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/sky130/sW2_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/sky130/sW2_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/sky130/sW2_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/sky130/sW2_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/sky130/sW2_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/sky130/sW2_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/sky130/sW2_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/sky130/sW2_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/sky130/sW2_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C11/sky130/sW2_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/sky130/sW2_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C11/sky130/sW2_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/gf180/sW0.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/gf180/sW0.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/gf180/sW0.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/gf180/sW0.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/gf180/sW0.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/gf180/sW0.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/gf180/sW0.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/gf180/sW0.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/gf180/sW0.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/gf180/sW0.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/gf180/sW0.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/gf180/sW0.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/gf180/sW0.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/gf180/sW0.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/gf180/sW0.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/gf180/sW0.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/gf180/sW0.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/gf180/sW0.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/gf180/sW0.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/gf180/sW0.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/gf180/sW0.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/gf180/sW1.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/gf180/sW1.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/gf180/sW1.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/gf180/sW1.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/gf180/sW1.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/gf180/sW1.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/gf180/sW1.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/gf180/sW1.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/gf180/sW1.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/gf180/sW1.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/gf180/sW1.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/gf180/sW1.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/gf180/sW1.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/gf180/sW1.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/gf180/sW1.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/gf180/sW1.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/gf180/sW1.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/gf180/sW1.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/gf180/sW1.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/gf180/sW1.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/gf180/sW1.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/gf180/sW1_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/gf180/sW1_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/gf180/sW1_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/gf180/sW1_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/gf180/sW1_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/gf180/sW1_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/gf180/sW1_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/gf180/sW1_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/gf180/sW1_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/gf180/sW1_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/gf180/sW1_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/gf180/sW1_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/gf180/sW1_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/gf180/sW1_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/gf180/sW1_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/gf180/sW1_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/gf180/sW1_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/gf180/sW1_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/gf180/sW1_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/gf180/sW1_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/gf180/sW1_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/gf180/sW2_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/gf180/sW2_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/gf180/sW2_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/gf180/sW2_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/gf180/sW2_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/gf180/sW2_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/gf180/sW2_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/gf180/sW2_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/gf180/sW2_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/gf180/sW2_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/gf180/sW2_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/gf180/sW2_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/gf180/sW2_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/gf180/sW2_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/gf180/sW2_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/gf180/sW2_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/gf180/sW2_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/gf180/sW2_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/gf180/sW2_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/gf180/sW2_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/gf180/sW2_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/ihp130/sW0.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/ihp130/sW0.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/ihp130/sW0.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/ihp130/sW0.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/ihp130/sW0.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/ihp130/sW0.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/ihp130/sW0.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/ihp130/sW0.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/ihp130/sW0.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/ihp130/sW0.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/ihp130/sW0.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/ihp130/sW0.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/ihp130/sW0.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/ihp130/sW0.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/ihp130/sW0.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/ihp130/sW0.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/ihp130/sW0.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/ihp130/sW0.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/ihp130/sW0.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/ihp130/sW0.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/ihp130/sW0.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/ihp130/sW2_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/ihp130/sW2_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/ihp130/sW2_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/ihp130/sW2_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/ihp130/sW2_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/ihp130/sW2_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/ihp130/sW2_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/ihp130/sW2_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/ihp130/sW2_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/ihp130/sW2_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/ihp130/sW2_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/ihp130/sW2_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/ihp130/sW2_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/ihp130/sW2_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/ihp130/sW2_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/ihp130/sW2_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/ihp130/sW2_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/ihp130/sW2_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/ihp130/sW2_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/ihp130/sW2_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/ihp130/sW2_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/sky130/sW0.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/sky130/sW0.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/sky130/sW0.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/sky130/sW0.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/sky130/sW0.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/sky130/sW0.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/sky130/sW0.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/sky130/sW0.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/sky130/sW0.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/sky130/sW0.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/sky130/sW0.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/sky130/sW0.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/sky130/sW0.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/sky130/sW0.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/sky130/sW0.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/sky130/sW0.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/sky130/sW0.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/sky130/sW0.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/sky130/sW0.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/sky130/sW0.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/sky130/sW0.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/sky130/sW1.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/sky130/sW1.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/sky130/sW1.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/sky130/sW1.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/sky130/sW1.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/sky130/sW1.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/sky130/sW1.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/sky130/sW1.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/sky130/sW1.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/sky130/sW1.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/sky130/sW1.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/sky130/sW1.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/sky130/sW1.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/sky130/sW1.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/sky130/sW1.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/sky130/sW1.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/sky130/sW1.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/sky130/sW1.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/sky130/sW1.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/sky130/sW1.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/sky130/sW1.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/sky130/sW1_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/sky130/sW1_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/sky130/sW1_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/sky130/sW1_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/sky130/sW1_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/sky130/sW1_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/sky130/sW1_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/sky130/sW1_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/sky130/sW1_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/sky130/sW1_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/sky130/sW1_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/sky130/sW1_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/sky130/sW1_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/sky130/sW1_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/sky130/sW1_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/sky130/sW1_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/sky130/sW1_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/sky130/sW1_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/sky130/sW1_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/sky130/sW1_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/sky130/sW1_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/sky130/sW2_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/sky130/sW2_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/sky130/sW2_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/sky130/sW2_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/sky130/sW2_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/sky130/sW2_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/sky130/sW2_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/sky130/sW2_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/sky130/sW2_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/sky130/sW2_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/sky130/sW2_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/sky130/sW2_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/sky130/sW2_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/sky130/sW2_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/sky130/sW2_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/sky130/sW2_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/sky130/sW2_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/sky130/sW2_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C12/sky130/sW2_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/sky130/sW2_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C12/sky130/sW2_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C13/gf180/sW1.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/gf180/sW1.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/gf180/sW1.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/gf180/sW1.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/gf180/sW1.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C13/gf180/sW1.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C13/gf180/sW1.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C13/gf180/sW1.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/gf180/sW1.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/gf180/sW1.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/gf180/sW1.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/gf180/sW1.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C13/gf180/sW1.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C13/gf180/sW1.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C13/gf180/sW1.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/gf180/sW1.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/gf180/sW1.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/gf180/sW1.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/gf180/sW1.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C13/gf180/sW1.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C13/gf180/sW1.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C13/gf180/sW1_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/gf180/sW1_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/gf180/sW1_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/gf180/sW1_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/gf180/sW1_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C13/gf180/sW1_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C13/gf180/sW1_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C13/gf180/sW1_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/gf180/sW1_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/gf180/sW1_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/gf180/sW1_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/gf180/sW1_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C13/gf180/sW1_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C13/gf180/sW1_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C13/gf180/sW1_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/gf180/sW1_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/gf180/sW1_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/gf180/sW1_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/gf180/sW1_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C13/gf180/sW1_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C13/gf180/sW1_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C13/gf180/sW2_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/gf180/sW2_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/gf180/sW2_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/gf180/sW2_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/gf180/sW2_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C13/gf180/sW2_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C13/gf180/sW2_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C13/gf180/sW2_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/gf180/sW2_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/gf180/sW2_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/gf180/sW2_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/gf180/sW2_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C13/gf180/sW2_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C13/gf180/sW2_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C13/gf180/sW2_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/gf180/sW2_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/gf180/sW2_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/gf180/sW2_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/gf180/sW2_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C13/gf180/sW2_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C13/gf180/sW2_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C13/ihp130/sW2_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/ihp130/sW2_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/ihp130/sW2_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/ihp130/sW2_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/ihp130/sW2_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C13/ihp130/sW2_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C13/ihp130/sW2_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C13/ihp130/sW2_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/ihp130/sW2_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/ihp130/sW2_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/ihp130/sW2_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/ihp130/sW2_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C13/ihp130/sW2_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C13/ihp130/sW2_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C13/ihp130/sW2_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/ihp130/sW2_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/ihp130/sW2_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/ihp130/sW2_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/ihp130/sW2_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C13/ihp130/sW2_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C13/ihp130/sW2_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C13/sky130/sW1.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/sky130/sW1.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/sky130/sW1.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/sky130/sW1.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/sky130/sW1.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C13/sky130/sW1.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C13/sky130/sW1.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C13/sky130/sW1.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/sky130/sW1.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/sky130/sW1.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/sky130/sW1.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/sky130/sW1.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C13/sky130/sW1.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C13/sky130/sW1.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C13/sky130/sW1.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/sky130/sW1.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/sky130/sW1.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/sky130/sW1.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/sky130/sW1.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C13/sky130/sW1.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C13/sky130/sW1.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C13/sky130/sW1_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/sky130/sW1_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/sky130/sW1_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/sky130/sW1_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/sky130/sW1_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C13/sky130/sW1_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C13/sky130/sW1_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C13/sky130/sW1_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/sky130/sW1_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/sky130/sW1_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/sky130/sW1_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/sky130/sW1_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C13/sky130/sW1_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C13/sky130/sW1_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C13/sky130/sW1_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/sky130/sW1_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/sky130/sW1_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/sky130/sW1_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/sky130/sW1_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C13/sky130/sW1_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C13/sky130/sW1_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C13/sky130/sW2_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/sky130/sW2_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/sky130/sW2_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/sky130/sW2_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/sky130/sW2_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C13/sky130/sW2_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C13/sky130/sW2_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C13/sky130/sW2_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/sky130/sW2_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/sky130/sW2_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/sky130/sW2_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/sky130/sW2_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C13/sky130/sW2_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C13/sky130/sW2_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C13/sky130/sW2_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/sky130/sW2_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/sky130/sW2_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/sky130/sW2_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C13/sky130/sW2_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C13/sky130/sW2_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C13/sky130/sW2_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/gf180/sW0.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/gf180/sW0.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/gf180/sW0.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/gf180/sW0.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/gf180/sW0.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/gf180/sW0.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/gf180/sW0.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/gf180/sW0.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/gf180/sW0.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/gf180/sW0.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/gf180/sW0.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/gf180/sW0.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/gf180/sW0.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/gf180/sW0.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/gf180/sW0.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/gf180/sW0.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/gf180/sW0.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/gf180/sW0.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/gf180/sW0.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/gf180/sW0.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/gf180/sW0.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/gf180/sW1.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/gf180/sW1.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/gf180/sW1.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/gf180/sW1.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/gf180/sW1.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/gf180/sW1.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/gf180/sW1.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/gf180/sW1.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/gf180/sW1.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/gf180/sW1.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/gf180/sW1.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/gf180/sW1.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/gf180/sW1.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/gf180/sW1.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/gf180/sW1.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/gf180/sW1.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/gf180/sW1.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/gf180/sW1.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/gf180/sW1.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/gf180/sW1.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/gf180/sW1.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/gf180/sW1_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/gf180/sW1_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/gf180/sW1_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/gf180/sW1_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/gf180/sW1_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/gf180/sW1_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/gf180/sW1_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/gf180/sW1_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/gf180/sW1_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/gf180/sW1_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/gf180/sW1_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/gf180/sW1_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/gf180/sW1_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/gf180/sW1_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/gf180/sW1_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/gf180/sW1_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/gf180/sW1_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/gf180/sW1_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/gf180/sW1_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/gf180/sW1_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/gf180/sW1_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/gf180/sW2_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/gf180/sW2_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/gf180/sW2_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/gf180/sW2_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/gf180/sW2_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/gf180/sW2_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/gf180/sW2_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/gf180/sW2_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/gf180/sW2_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/gf180/sW2_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/gf180/sW2_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/gf180/sW2_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/gf180/sW2_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/gf180/sW2_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/gf180/sW2_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/gf180/sW2_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/gf180/sW2_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/gf180/sW2_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/gf180/sW2_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/gf180/sW2_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/gf180/sW2_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/ihp130/sW0.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/ihp130/sW0.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/ihp130/sW0.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/ihp130/sW0.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/ihp130/sW0.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/ihp130/sW0.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/ihp130/sW0.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/ihp130/sW0.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/ihp130/sW0.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/ihp130/sW0.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/ihp130/sW0.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/ihp130/sW0.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/ihp130/sW0.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/ihp130/sW0.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/ihp130/sW0.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/ihp130/sW0.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/ihp130/sW0.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/ihp130/sW0.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/ihp130/sW0.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/ihp130/sW0.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/ihp130/sW0.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/ihp130/sW2_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/ihp130/sW2_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/ihp130/sW2_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/ihp130/sW2_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/ihp130/sW2_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/ihp130/sW2_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/ihp130/sW2_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/ihp130/sW2_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/ihp130/sW2_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/ihp130/sW2_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/ihp130/sW2_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/ihp130/sW2_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/ihp130/sW2_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/ihp130/sW2_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/ihp130/sW2_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/ihp130/sW2_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/ihp130/sW2_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/ihp130/sW2_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/ihp130/sW2_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/ihp130/sW2_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/ihp130/sW2_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/sky130/sW0.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/sky130/sW0.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/sky130/sW0.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/sky130/sW0.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/sky130/sW0.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/sky130/sW0.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/sky130/sW0.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/sky130/sW0.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/sky130/sW0.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/sky130/sW0.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/sky130/sW0.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/sky130/sW0.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/sky130/sW0.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/sky130/sW0.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/sky130/sW0.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/sky130/sW0.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/sky130/sW0.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/sky130/sW0.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/sky130/sW0.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/sky130/sW0.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/sky130/sW0.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/sky130/sW1.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/sky130/sW1.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/sky130/sW1.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/sky130/sW1.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/sky130/sW1.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/sky130/sW1.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/sky130/sW1.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/sky130/sW1.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/sky130/sW1.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/sky130/sW1.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/sky130/sW1.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/sky130/sW1.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/sky130/sW1.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/sky130/sW1.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/sky130/sW1.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/sky130/sW1.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/sky130/sW1.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/sky130/sW1.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/sky130/sW1.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/sky130/sW1.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/sky130/sW1.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/sky130/sW1_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/sky130/sW1_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/sky130/sW1_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/sky130/sW1_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/sky130/sW1_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/sky130/sW1_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/sky130/sW1_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/sky130/sW1_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/sky130/sW1_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/sky130/sW1_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/sky130/sW1_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/sky130/sW1_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/sky130/sW1_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/sky130/sW1_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/sky130/sW1_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/sky130/sW1_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/sky130/sW1_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/sky130/sW1_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/sky130/sW1_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/sky130/sW1_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/sky130/sW1_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/sky130/sW2_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/sky130/sW2_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/sky130/sW2_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/sky130/sW2_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/sky130/sW2_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/sky130/sW2_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/sky130/sW2_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/sky130/sW2_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/sky130/sW2_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/sky130/sW2_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/sky130/sW2_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/sky130/sW2_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/sky130/sW2_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/sky130/sW2_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/sky130/sW2_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/sky130/sW2_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/sky130/sW2_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/sky130/sW2_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C14/sky130/sW2_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/sky130/sW2_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C14/sky130/sW2_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/gf180/sW0.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/gf180/sW0.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/gf180/sW0.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/gf180/sW0.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/gf180/sW0.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/gf180/sW0.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/gf180/sW0.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/gf180/sW0.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/gf180/sW0.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/gf180/sW0.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/gf180/sW0.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/gf180/sW0.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/gf180/sW0.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/gf180/sW0.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/gf180/sW0.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/gf180/sW0.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/gf180/sW0.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/gf180/sW0.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/gf180/sW0.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/gf180/sW0.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/gf180/sW0.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/gf180/sW1.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/gf180/sW1.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/gf180/sW1.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/gf180/sW1.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/gf180/sW1.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/gf180/sW1.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/gf180/sW1.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/gf180/sW1.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/gf180/sW1.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/gf180/sW1.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/gf180/sW1.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/gf180/sW1.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/gf180/sW1.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/gf180/sW1.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/gf180/sW1.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/gf180/sW1.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/gf180/sW1.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/gf180/sW1.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/gf180/sW1.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/gf180/sW1.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/gf180/sW1.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/gf180/sW1_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/gf180/sW1_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/gf180/sW1_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/gf180/sW1_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/gf180/sW1_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/gf180/sW1_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/gf180/sW1_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/gf180/sW1_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/gf180/sW1_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/gf180/sW1_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/gf180/sW1_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/gf180/sW1_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/gf180/sW1_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/gf180/sW1_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/gf180/sW1_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/gf180/sW1_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/gf180/sW1_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/gf180/sW1_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/gf180/sW1_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/gf180/sW1_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/gf180/sW1_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/gf180/sW2_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/gf180/sW2_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/gf180/sW2_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/gf180/sW2_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/gf180/sW2_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/gf180/sW2_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/gf180/sW2_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/gf180/sW2_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/gf180/sW2_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/gf180/sW2_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/gf180/sW2_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/gf180/sW2_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/gf180/sW2_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/gf180/sW2_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/gf180/sW2_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/gf180/sW2_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/gf180/sW2_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/gf180/sW2_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/gf180/sW2_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/gf180/sW2_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/gf180/sW2_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/ihp130/sW0.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/ihp130/sW0.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/ihp130/sW0.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/ihp130/sW0.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/ihp130/sW0.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/ihp130/sW0.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/ihp130/sW0.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/ihp130/sW0.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/ihp130/sW0.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/ihp130/sW0.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/ihp130/sW0.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/ihp130/sW0.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/ihp130/sW0.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/ihp130/sW0.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/ihp130/sW0.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/ihp130/sW0.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/ihp130/sW0.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/ihp130/sW0.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/ihp130/sW0.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/ihp130/sW0.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/ihp130/sW0.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/ihp130/sW2_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/ihp130/sW2_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/ihp130/sW2_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/ihp130/sW2_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/ihp130/sW2_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/ihp130/sW2_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/ihp130/sW2_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/ihp130/sW2_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/ihp130/sW2_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/ihp130/sW2_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/ihp130/sW2_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/ihp130/sW2_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/ihp130/sW2_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/ihp130/sW2_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/ihp130/sW2_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/ihp130/sW2_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/ihp130/sW2_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/ihp130/sW2_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/ihp130/sW2_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/ihp130/sW2_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/ihp130/sW2_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/sky130/sW0.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/sky130/sW0.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/sky130/sW0.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/sky130/sW0.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/sky130/sW0.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/sky130/sW0.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/sky130/sW0.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/sky130/sW0.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/sky130/sW0.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/sky130/sW0.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/sky130/sW0.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/sky130/sW0.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/sky130/sW0.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/sky130/sW0.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/sky130/sW0.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/sky130/sW0.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/sky130/sW0.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/sky130/sW0.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/sky130/sW0.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/sky130/sW0.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/sky130/sW0.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/sky130/sW1.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/sky130/sW1.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/sky130/sW1.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/sky130/sW1.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/sky130/sW1.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/sky130/sW1.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/sky130/sW1.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/sky130/sW1.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/sky130/sW1.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/sky130/sW1.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/sky130/sW1.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/sky130/sW1.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/sky130/sW1.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/sky130/sW1.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/sky130/sW1.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/sky130/sW1.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/sky130/sW1.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/sky130/sW1.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/sky130/sW1.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/sky130/sW1.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/sky130/sW1.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/sky130/sW1_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/sky130/sW1_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/sky130/sW1_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/sky130/sW1_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/sky130/sW1_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/sky130/sW1_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/sky130/sW1_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/sky130/sW1_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/sky130/sW1_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/sky130/sW1_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/sky130/sW1_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/sky130/sW1_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/sky130/sW1_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/sky130/sW1_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/sky130/sW1_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/sky130/sW1_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/sky130/sW1_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/sky130/sW1_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/sky130/sW1_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/sky130/sW1_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/sky130/sW1_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/sky130/sW2_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/sky130/sW2_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/sky130/sW2_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/sky130/sW2_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/sky130/sW2_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/sky130/sW2_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/sky130/sW2_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/sky130/sW2_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/sky130/sW2_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/sky130/sW2_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/sky130/sW2_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/sky130/sW2_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/sky130/sW2_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/sky130/sW2_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/sky130/sW2_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/sky130/sW2_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/sky130/sW2_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/sky130/sW2_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C15/sky130/sW2_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/sky130/sW2_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C15/sky130/sW2_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/gf180/sW0.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/gf180/sW0.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/gf180/sW0.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/gf180/sW0.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/gf180/sW0.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/gf180/sW0.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/gf180/sW0.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/gf180/sW0.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/gf180/sW0.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/gf180/sW0.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/gf180/sW0.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/gf180/sW0.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/gf180/sW0.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/gf180/sW0.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/gf180/sW0.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/gf180/sW0.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/gf180/sW0.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/gf180/sW0.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/gf180/sW0.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/gf180/sW0.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/gf180/sW0.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/gf180/sW1.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/gf180/sW1.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/gf180/sW1.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/gf180/sW1.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/gf180/sW1.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/gf180/sW1.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/gf180/sW1.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/gf180/sW1.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/gf180/sW1.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/gf180/sW1.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/gf180/sW1.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/gf180/sW1.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/gf180/sW1.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/gf180/sW1.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/gf180/sW1.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/gf180/sW1.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/gf180/sW1.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/gf180/sW1.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/gf180/sW1.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/gf180/sW1.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/gf180/sW1.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/gf180/sW1_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/gf180/sW1_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/gf180/sW1_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/gf180/sW1_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/gf180/sW1_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/gf180/sW1_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/gf180/sW1_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/gf180/sW1_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/gf180/sW1_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/gf180/sW1_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/gf180/sW1_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/gf180/sW1_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/gf180/sW1_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/gf180/sW1_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/gf180/sW1_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/gf180/sW1_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/gf180/sW1_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/gf180/sW1_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/gf180/sW1_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/gf180/sW1_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/gf180/sW1_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/gf180/sW2_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/gf180/sW2_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/gf180/sW2_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/gf180/sW2_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/gf180/sW2_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/gf180/sW2_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/gf180/sW2_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/gf180/sW2_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/gf180/sW2_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/gf180/sW2_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/gf180/sW2_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/gf180/sW2_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/gf180/sW2_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/gf180/sW2_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/gf180/sW2_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/gf180/sW2_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/gf180/sW2_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/gf180/sW2_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/gf180/sW2_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/gf180/sW2_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/gf180/sW2_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/ihp130/sW0.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/ihp130/sW0.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/ihp130/sW0.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/ihp130/sW0.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/ihp130/sW0.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/ihp130/sW0.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/ihp130/sW0.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/ihp130/sW0.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/ihp130/sW0.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/ihp130/sW0.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/ihp130/sW0.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/ihp130/sW0.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/ihp130/sW0.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/ihp130/sW0.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/ihp130/sW0.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/ihp130/sW0.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/ihp130/sW0.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/ihp130/sW0.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/ihp130/sW0.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/ihp130/sW0.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/ihp130/sW0.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/ihp130/sW2_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/ihp130/sW2_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/ihp130/sW2_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/ihp130/sW2_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/ihp130/sW2_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/ihp130/sW2_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/ihp130/sW2_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/ihp130/sW2_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/ihp130/sW2_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/ihp130/sW2_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/ihp130/sW2_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/ihp130/sW2_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/ihp130/sW2_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/ihp130/sW2_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/ihp130/sW2_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/ihp130/sW2_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/ihp130/sW2_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/ihp130/sW2_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/ihp130/sW2_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/ihp130/sW2_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/ihp130/sW2_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/sky130/sW0.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/sky130/sW0.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/sky130/sW0.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/sky130/sW0.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/sky130/sW0.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/sky130/sW0.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/sky130/sW0.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/sky130/sW0.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/sky130/sW0.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/sky130/sW0.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/sky130/sW0.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/sky130/sW0.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/sky130/sW0.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/sky130/sW0.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/sky130/sW0.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/sky130/sW0.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/sky130/sW0.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/sky130/sW0.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/sky130/sW0.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/sky130/sW0.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/sky130/sW0.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/sky130/sW1.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/sky130/sW1.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/sky130/sW1.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/sky130/sW1.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/sky130/sW1.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/sky130/sW1.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/sky130/sW1.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/sky130/sW1.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/sky130/sW1.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/sky130/sW1.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/sky130/sW1.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/sky130/sW1.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/sky130/sW1.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/sky130/sW1.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/sky130/sW1.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/sky130/sW1.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/sky130/sW1.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/sky130/sW1.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/sky130/sW1.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/sky130/sW1.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/sky130/sW1.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/sky130/sW1_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/sky130/sW1_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/sky130/sW1_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/sky130/sW1_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/sky130/sW1_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/sky130/sW1_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/sky130/sW1_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/sky130/sW1_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/sky130/sW1_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/sky130/sW1_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/sky130/sW1_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/sky130/sW1_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/sky130/sW1_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/sky130/sW1_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/sky130/sW1_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/sky130/sW1_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/sky130/sW1_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/sky130/sW1_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/sky130/sW1_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/sky130/sW1_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/sky130/sW1_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/sky130/sW2_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/sky130/sW2_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/sky130/sW2_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/sky130/sW2_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/sky130/sW2_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/sky130/sW2_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/sky130/sW2_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/sky130/sW2_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/sky130/sW2_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/sky130/sW2_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/sky130/sW2_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/sky130/sW2_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/sky130/sW2_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/sky130/sW2_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/sky130/sW2_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/sky130/sW2_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/sky130/sW2_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/sky130/sW2_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C16/sky130/sW2_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/sky130/sW2_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C16/sky130/sW2_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/gf180/sW0.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/gf180/sW0.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/gf180/sW0.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/gf180/sW0.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/gf180/sW0.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/gf180/sW0.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/gf180/sW0.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/gf180/sW0.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/gf180/sW0.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/gf180/sW0.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/gf180/sW0.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/gf180/sW0.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/gf180/sW0.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/gf180/sW0.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/gf180/sW0.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/gf180/sW0.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/gf180/sW0.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/gf180/sW0.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/gf180/sW0.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/gf180/sW0.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/gf180/sW0.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/gf180/sW1.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/gf180/sW1.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/gf180/sW1.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/gf180/sW1.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/gf180/sW1.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/gf180/sW1.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/gf180/sW1.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/gf180/sW1.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/gf180/sW1.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/gf180/sW1.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/gf180/sW1.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/gf180/sW1.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/gf180/sW1.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/gf180/sW1.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/gf180/sW1.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/gf180/sW1.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/gf180/sW1.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/gf180/sW1.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/gf180/sW1.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/gf180/sW1.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/gf180/sW1.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/gf180/sW1_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/gf180/sW1_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/gf180/sW1_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/gf180/sW1_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/gf180/sW1_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/gf180/sW1_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/gf180/sW1_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/gf180/sW1_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/gf180/sW1_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/gf180/sW1_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/gf180/sW1_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/gf180/sW1_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/gf180/sW1_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/gf180/sW1_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/gf180/sW1_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/gf180/sW1_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/gf180/sW1_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/gf180/sW1_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/gf180/sW1_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/gf180/sW1_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/gf180/sW1_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/gf180/sW2_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/gf180/sW2_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/gf180/sW2_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/gf180/sW2_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/gf180/sW2_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/gf180/sW2_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/gf180/sW2_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/gf180/sW2_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/gf180/sW2_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/gf180/sW2_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/gf180/sW2_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/gf180/sW2_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/gf180/sW2_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/gf180/sW2_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/gf180/sW2_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/gf180/sW2_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/gf180/sW2_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/gf180/sW2_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/gf180/sW2_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/gf180/sW2_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/gf180/sW2_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/ihp130/sW0.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/ihp130/sW0.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/ihp130/sW0.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/ihp130/sW0.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/ihp130/sW0.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/ihp130/sW0.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/ihp130/sW0.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/ihp130/sW0.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/ihp130/sW0.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/ihp130/sW0.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/ihp130/sW0.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/ihp130/sW0.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/ihp130/sW0.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/ihp130/sW0.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/ihp130/sW0.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/ihp130/sW0.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/ihp130/sW0.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/ihp130/sW0.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/ihp130/sW0.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/ihp130/sW0.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/ihp130/sW0.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/ihp130/sW2_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/ihp130/sW2_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/ihp130/sW2_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/ihp130/sW2_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/ihp130/sW2_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/ihp130/sW2_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/ihp130/sW2_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/ihp130/sW2_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/ihp130/sW2_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/ihp130/sW2_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/ihp130/sW2_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/ihp130/sW2_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/ihp130/sW2_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/ihp130/sW2_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/ihp130/sW2_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/ihp130/sW2_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/ihp130/sW2_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/ihp130/sW2_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/ihp130/sW2_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/ihp130/sW2_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/ihp130/sW2_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/sky130/sW0.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/sky130/sW0.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/sky130/sW0.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/sky130/sW0.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/sky130/sW0.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/sky130/sW0.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/sky130/sW0.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/sky130/sW0.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/sky130/sW0.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/sky130/sW0.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/sky130/sW0.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/sky130/sW0.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/sky130/sW0.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/sky130/sW0.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/sky130/sW0.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/sky130/sW0.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/sky130/sW0.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/sky130/sW0.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/sky130/sW0.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/sky130/sW0.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/sky130/sW0.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/sky130/sW1.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/sky130/sW1.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/sky130/sW1.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/sky130/sW1.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/sky130/sW1.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/sky130/sW1.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/sky130/sW1.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/sky130/sW1.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/sky130/sW1.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/sky130/sW1.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/sky130/sW1.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/sky130/sW1.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/sky130/sW1.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/sky130/sW1.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/sky130/sW1.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/sky130/sW1.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/sky130/sW1.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/sky130/sW1.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/sky130/sW1.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/sky130/sW1.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/sky130/sW1.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/sky130/sW1_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/sky130/sW1_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/sky130/sW1_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/sky130/sW1_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/sky130/sW1_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/sky130/sW1_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/sky130/sW1_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/sky130/sW1_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/sky130/sW1_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/sky130/sW1_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/sky130/sW1_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/sky130/sW1_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/sky130/sW1_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/sky130/sW1_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/sky130/sW1_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/sky130/sW1_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/sky130/sW1_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/sky130/sW1_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/sky130/sW1_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/sky130/sW1_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/sky130/sW1_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/sky130/sW2_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/sky130/sW2_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/sky130/sW2_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/sky130/sW2_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/sky130/sW2_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/sky130/sW2_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/sky130/sW2_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/sky130/sW2_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/sky130/sW2_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/sky130/sW2_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/sky130/sW2_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/sky130/sW2_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/sky130/sW2_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/sky130/sW2_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/sky130/sW2_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/sky130/sW2_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/sky130/sW2_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/sky130/sW2_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C17/sky130/sW2_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/sky130/sW2_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C17/sky130/sW2_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/gf180/sW0.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/gf180/sW0.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/gf180/sW0.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/gf180/sW0.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/gf180/sW0.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/gf180/sW0.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/gf180/sW0.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/gf180/sW0.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/gf180/sW0.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/gf180/sW0.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/gf180/sW0.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/gf180/sW0.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/gf180/sW0.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/gf180/sW0.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/gf180/sW0.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/gf180/sW0.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/gf180/sW0.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/gf180/sW0.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/gf180/sW0.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/gf180/sW0.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/gf180/sW0.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/gf180/sW1.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/gf180/sW1.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/gf180/sW1.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/gf180/sW1.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/gf180/sW1.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/gf180/sW1.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/gf180/sW1.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/gf180/sW1.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/gf180/sW1.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/gf180/sW1.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/gf180/sW1.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/gf180/sW1.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/gf180/sW1.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/gf180/sW1.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/gf180/sW1.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/gf180/sW1.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/gf180/sW1.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/gf180/sW1.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/gf180/sW1.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/gf180/sW1.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/gf180/sW1.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/gf180/sW1_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/gf180/sW1_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/gf180/sW1_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/gf180/sW1_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/gf180/sW1_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/gf180/sW1_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/gf180/sW1_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/gf180/sW1_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/gf180/sW1_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/gf180/sW1_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/gf180/sW1_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/gf180/sW1_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/gf180/sW1_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/gf180/sW1_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/gf180/sW1_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/gf180/sW1_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/gf180/sW1_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/gf180/sW1_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/gf180/sW1_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/gf180/sW1_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/gf180/sW1_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/gf180/sW2_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/gf180/sW2_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/gf180/sW2_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/gf180/sW2_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/gf180/sW2_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/gf180/sW2_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/gf180/sW2_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/gf180/sW2_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/gf180/sW2_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/gf180/sW2_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/gf180/sW2_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/gf180/sW2_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/gf180/sW2_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/gf180/sW2_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/gf180/sW2_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/gf180/sW2_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/gf180/sW2_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/gf180/sW2_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/gf180/sW2_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/gf180/sW2_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/gf180/sW2_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/ihp130/sW0.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/ihp130/sW0.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/ihp130/sW0.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/ihp130/sW0.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/ihp130/sW0.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/ihp130/sW0.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/ihp130/sW0.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/ihp130/sW0.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/ihp130/sW0.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/ihp130/sW0.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/ihp130/sW0.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/ihp130/sW0.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/ihp130/sW0.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/ihp130/sW0.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/ihp130/sW0.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/ihp130/sW0.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/ihp130/sW0.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/ihp130/sW0.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/ihp130/sW0.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/ihp130/sW0.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/ihp130/sW0.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/ihp130/sW2_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/ihp130/sW2_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/ihp130/sW2_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/ihp130/sW2_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/ihp130/sW2_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/ihp130/sW2_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/ihp130/sW2_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/ihp130/sW2_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/ihp130/sW2_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/ihp130/sW2_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/ihp130/sW2_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/ihp130/sW2_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/ihp130/sW2_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/ihp130/sW2_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/ihp130/sW2_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/ihp130/sW2_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/ihp130/sW2_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/ihp130/sW2_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/ihp130/sW2_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/ihp130/sW2_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/ihp130/sW2_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/sky130/sW0.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/sky130/sW0.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/sky130/sW0.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/sky130/sW0.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/sky130/sW0.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/sky130/sW0.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/sky130/sW0.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/sky130/sW0.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/sky130/sW0.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/sky130/sW0.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/sky130/sW0.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/sky130/sW0.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/sky130/sW0.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/sky130/sW0.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/sky130/sW0.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/sky130/sW0.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/sky130/sW0.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/sky130/sW0.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/sky130/sW0.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/sky130/sW0.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/sky130/sW0.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/sky130/sW1.5_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/sky130/sW1.5_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/sky130/sW1.5_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/sky130/sW1.5_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/sky130/sW1.5_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/sky130/sW1.5_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/sky130/sW1.5_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/sky130/sW1.5_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/sky130/sW1.5_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/sky130/sW1.5_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/sky130/sW1.5_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/sky130/sW1.5_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/sky130/sW1.5_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/sky130/sW1.5_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/sky130/sW1.5_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/sky130/sW1.5_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/sky130/sW1.5_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/sky130/sW1.5_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/sky130/sW1.5_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/sky130/sW1.5_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/sky130/sW1.5_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/sky130/sW1_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/sky130/sW1_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/sky130/sW1_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/sky130/sW1_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/sky130/sW1_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/sky130/sW1_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/sky130/sW1_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/sky130/sW1_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/sky130/sW1_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/sky130/sW1_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/sky130/sW1_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/sky130/sW1_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/sky130/sW1_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/sky130/sW1_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/sky130/sW1_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/sky130/sW1_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/sky130/sW1_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/sky130/sW1_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/sky130/sW1_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/sky130/sW1_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/sky130/sW1_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/sky130/sW2_sL1.5/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/sky130/sW2_sL1.5/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/sky130/sW2_sL1.5/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/sky130/sW2_sL1.5/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/sky130/sW2_sL1.5/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/sky130/sW2_sL1.5/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/sky130/sW2_sL1.5/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/sky130/sW2_sL1/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/sky130/sW2_sL1/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/sky130/sW2_sL1/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/sky130/sW2_sL1/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/sky130/sW2_sL1/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/sky130/sW2_sL1/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/sky130/sW2_sL1/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/sky130/sW2_sL2/case.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/sky130/sW2_sL2/manifest.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/sky130/sW2_sL2/qualification.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/sky130/sW2_sL2/specs.json create mode 100644 benchmarks/textbook_sharing/data/cases/C18/sky130/sW2_sL2/target.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/sky130/sW2_sL2/target_lvs.spice create mode 100644 benchmarks/textbook_sharing/data/cases/C18/sky130/sW2_sL2/testbench.spice create mode 100644 benchmarks/textbook_sharing/data/frozen/fixed_order.json create mode 100644 benchmarks/textbook_sharing/data/nominal/C01/gf180.json create mode 100644 benchmarks/textbook_sharing/data/nominal/C01/ihp130.json create mode 100644 benchmarks/textbook_sharing/data/nominal/C01/sky130.json create mode 100644 benchmarks/textbook_sharing/data/nominal/C02/gf180.json create mode 100644 benchmarks/textbook_sharing/data/nominal/C02/ihp130.json create mode 100644 benchmarks/textbook_sharing/data/nominal/C02/sky130.json create mode 100644 benchmarks/textbook_sharing/data/nominal/C03/gf180.json create mode 100644 benchmarks/textbook_sharing/data/nominal/C03/ihp130.json create mode 100644 benchmarks/textbook_sharing/data/nominal/C03/sky130.json create mode 100644 benchmarks/textbook_sharing/data/nominal/C04/gf180.json create mode 100644 benchmarks/textbook_sharing/data/nominal/C04/ihp130.json create mode 100644 benchmarks/textbook_sharing/data/nominal/C04/sky130.json create mode 100644 benchmarks/textbook_sharing/data/nominal/C05/gf180.json create mode 100644 benchmarks/textbook_sharing/data/nominal/C05/ihp130.json create mode 100644 benchmarks/textbook_sharing/data/nominal/C05/sky130.json create mode 100644 benchmarks/textbook_sharing/data/nominal/C06/gf180.json create mode 100644 benchmarks/textbook_sharing/data/nominal/C06/ihp130.json create mode 100644 benchmarks/textbook_sharing/data/nominal/C06/sky130.json create mode 100644 benchmarks/textbook_sharing/data/nominal/C07/gf180.json create mode 100644 benchmarks/textbook_sharing/data/nominal/C07/ihp130.json create mode 100644 benchmarks/textbook_sharing/data/nominal/C07/sky130.json create mode 100644 benchmarks/textbook_sharing/data/nominal/C08/gf180.json create mode 100644 benchmarks/textbook_sharing/data/nominal/C08/ihp130.json create mode 100644 benchmarks/textbook_sharing/data/nominal/C08/sky130.json create mode 100644 benchmarks/textbook_sharing/data/nominal/C09/gf180.json create mode 100644 benchmarks/textbook_sharing/data/nominal/C09/ihp130.json create mode 100644 benchmarks/textbook_sharing/data/nominal/C09/sky130.json create mode 100644 benchmarks/textbook_sharing/data/nominal/C10/gf180.json create mode 100644 benchmarks/textbook_sharing/data/nominal/C10/ihp130.json create mode 100644 benchmarks/textbook_sharing/data/nominal/C10/sky130.json create mode 100644 benchmarks/textbook_sharing/data/nominal/C11/gf180.json create mode 100644 benchmarks/textbook_sharing/data/nominal/C11/ihp130.json create mode 100644 benchmarks/textbook_sharing/data/nominal/C11/sky130.json create mode 100644 benchmarks/textbook_sharing/data/nominal/C12/gf180.json create mode 100644 benchmarks/textbook_sharing/data/nominal/C12/ihp130.json create mode 100644 benchmarks/textbook_sharing/data/nominal/C12/sky130.json create mode 100644 benchmarks/textbook_sharing/data/nominal/C13/gf180.json create mode 100644 benchmarks/textbook_sharing/data/nominal/C13/ihp130.json create mode 100644 benchmarks/textbook_sharing/data/nominal/C13/sky130.json create mode 100644 benchmarks/textbook_sharing/data/nominal/C14/gf180.json create mode 100644 benchmarks/textbook_sharing/data/nominal/C14/ihp130.json create mode 100644 benchmarks/textbook_sharing/data/nominal/C14/sky130.json create mode 100644 benchmarks/textbook_sharing/data/nominal/C15/gf180.json create mode 100644 benchmarks/textbook_sharing/data/nominal/C15/ihp130.json create mode 100644 benchmarks/textbook_sharing/data/nominal/C15/sky130.json create mode 100644 benchmarks/textbook_sharing/data/nominal/C16/gf180.json create mode 100644 benchmarks/textbook_sharing/data/nominal/C16/ihp130.json create mode 100644 benchmarks/textbook_sharing/data/nominal/C16/sky130.json create mode 100644 benchmarks/textbook_sharing/data/nominal/C17/gf180.json create mode 100644 benchmarks/textbook_sharing/data/nominal/C17/ihp130.json create mode 100644 benchmarks/textbook_sharing/data/nominal/C17/sky130.json create mode 100644 benchmarks/textbook_sharing/data/nominal/C18/gf180.json create mode 100644 benchmarks/textbook_sharing/data/nominal/C18/ihp130.json create mode 100644 benchmarks/textbook_sharing/data/nominal/C18/sky130.json create mode 100644 benchmarks/textbook_sharing/data/res_calibration.json create mode 100644 benchmarks/textbook_sharing/results/analysis/agent_session_audit.json create mode 100644 benchmarks/textbook_sharing/results/analysis/arrangement_bandwidth_C16.json create mode 100644 benchmarks/textbook_sharing/results/analysis/benchmark_table.json create mode 100644 benchmarks/textbook_sharing/results/analysis/cost_decomposition.json create mode 100644 benchmarks/textbook_sharing/results/analysis/cost_validation_dev.json create mode 100644 benchmarks/textbook_sharing/results/analysis/cost_validation_dev_no_channel.json create mode 100644 benchmarks/textbook_sharing/results/analysis/cost_validation_heldout.json create mode 100644 benchmarks/textbook_sharing/results/analysis/geometry_check.json create mode 100644 benchmarks/textbook_sharing/results/analysis/geometry_check_diagnosis.json create mode 100644 benchmarks/textbook_sharing/results/analysis/llm_interface.json create mode 100644 benchmarks/textbook_sharing/results/analysis/llm_summary.json create mode 100644 benchmarks/textbook_sharing/results/analysis/pex_sensitivity_C10_gf180.json create mode 100644 benchmarks/textbook_sharing/results/analysis/pvt.json create mode 100644 benchmarks/textbook_sharing/results/analysis/resim_after_testbench_fix.json create mode 100644 benchmarks/textbook_sharing/results/analysis/review_connectivity_check.json create mode 100644 benchmarks/textbook_sharing/results/analysis/review_coverage.json create mode 100644 benchmarks/textbook_sharing/results/analysis/review_gate_pad_check.json create mode 100644 benchmarks/textbook_sharing/results/analysis/running_example.json create mode 100644 benchmarks/textbook_sharing/results/analysis/scope_audit.json create mode 100644 benchmarks/textbook_sharing/results/analysis/selection_summary.json create mode 100644 benchmarks/textbook_sharing/results/analysis/testbench_equivalence.json create mode 100644 benchmarks/textbook_sharing/results/analysis/timing_controlled.json create mode 100644 benchmarks/textbook_sharing/results/case_build.json create mode 100644 benchmarks/textbook_sharing/results/count_ledger.json create mode 100644 benchmarks/textbook_sharing/results/count_ledger.md create mode 100644 benchmarks/textbook_sharing/results/redesign_search/attempts_gf180_sky130.json create mode 100644 benchmarks/textbook_sharing/results/redesign_search/attempts_ihp130.json create mode 100644 benchmarks/textbook_sharing/results/run_records.tar.xz diff --git a/benchmarks/textbook_sharing/data/cases/C01/gf180/sW0.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW0.5_sL1.5/case.json new file mode 100644 index 00000000..2490b99e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW0.5_sL1.5/case.json @@ -0,0 +1,105 @@ +{ + "case_id": "C01_gf180_sW0.5_sL1.5", + "circuit_id": "C01", + "pdk": "gf180", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "dut_name": "C01_gf180_sW0.5_sL1.5", + "ports": [ + "VSS", + "IB1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 1.0, + "l": 1.68, + "nf": 2 + }, + "M2": { + "w": 1.0, + "l": 1.68, + "nf": 2 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 1.65, + "tol": 0.05, + "vout_test": 1.93 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.68, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.68, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "cfe3a427088c0740", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/gf180/sW0.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW0.5_sL1.5/manifest.json new file mode 100644 index 00000000..16f11989 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW0.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "ca9c4fddfa306cb60670a9a24041583900e13eaca5467a42cab7a55f1a1a6925", + "qualification.json": "34422eaabff3460db6d1bace0b49d7e389909bbb1830254812538d3c66be091e", + "specs.json": "c4a2077917f97919d70e4e6da008c501619470409f9f972d71e9ec600ea15f26", + "target.spice": "3f34e5b41174fc0059e8c00e9ef5d8e5ca162d4b6e59f466481f86a5db74820d", + "target_lvs.spice": "fa401686fb09fff6014a003e47b2fd12bd1d16964835e859a935450ea04702bd", + "testbench.spice": "8f778754d339cbfeb668e4cf73a341b1d243af533dfc0761e17bce7a3dc4b427" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/gf180/sW0.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW0.5_sL1.5/qualification.json new file mode 100644 index 00000000..7026360f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW0.5_sL1.5/qualification.json @@ -0,0 +1,91 @@ +{ + "case_id": "C01_gf180_sW0.5_sL1.5", + "circuit_id": "C01", + "pdk": "gf180", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.68, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.68, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "cfe3a427088c0740", + "mirror_pass1": { + "vmin": 0.5582265, + "status": "passed", + "vout_test": 1.93 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.6582 + }, + "_frozen_from": { + "schematic": { + "err": 0.004839, + "vmin": 0.5582265 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 1.1549999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.2, + "schematic_measures": { + "iout_t": 2.009678e-05, + "err": 0.004839, + "vmin": 0.5582265, + "dev_at_vdd": 0.02584804, + "gout_t": 1.752604e-07, + "rout_t": 5705798.0, + "vout_test": 1.93, + "rout_nom": 5705798.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/gf180/sW0.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW0.5_sL1.5/specs.json new file mode 100644 index 00000000..5769a31a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW0.5_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.6582 + }, + "_frozen_from": { + "schematic": { + "err": 0.004839, + "vmin": 0.5582265 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 1.1549999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/gf180/sW0.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW0.5_sL1.5/target.spice new file mode 100644 index 00000000..827f8a07 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW0.5_sL1.5/target.spice @@ -0,0 +1,4 @@ +.subckt C01_gf180_sW0.5_sL1.5 VSS IB1 IOUT1 +MM1 IB1 IB1 VSS VSS nfet_03v3 w=1u l=1.68u nf=2 m=1 +MM2 IOUT1 IB1 VSS VSS nfet_03v3 w=1u l=1.68u nf=2 m=1 +.ends C01_gf180_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C01/gf180/sW0.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW0.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..120ae284 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW0.5_sL1.5/target_lvs.spice @@ -0,0 +1,6 @@ +.subckt C01_gf180_sW0.5_sL1.5 VSS IB1 IOUT1 +MM1_f0 IB1 IB1 VSS VSS nfet_03v3 w=0.5u l=1.68u +MM1_f1 IB1 IB1 VSS VSS nfet_03v3 w=0.5u l=1.68u +MM2_f0 IOUT1 IB1 VSS VSS nfet_03v3 w=0.5u l=1.68u +MM2_f1 IOUT1 IB1 VSS VSS nfet_03v3 w=0.5u l=1.68u +.ends C01_gf180_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C01/gf180/sW0.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW0.5_sL1.5/testbench.spice new file mode 100644 index 00000000..d0f81c44 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW0.5_sL1.5/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IB1 IOUT1 C01_gf180_sW0.5_sL1.5 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIB1 VDDB IB1 2e-05 +.nodeset v(IB1)=0.99 + +VOUT IOUT1 0 3.3 +.control +dc VOUT 3.3 0 -0.00825 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=1.93 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.05 cross=last +meas dc dev_at_vdd find dev at=3.2835 +let gout = deriv(iout) +meas dc gout_t find gout at=1.93 +let rout_v = 1/gout +meas dc rout_t find rout_v at=1.93 +echo vout_test = 1.93 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C01/gf180/sW0.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW0.5_sL1/case.json new file mode 100644 index 00000000..b1193e7c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW0.5_sL1/case.json @@ -0,0 +1,105 @@ +{ + "case_id": "C01_gf180_sW0.5_sL1", + "circuit_id": "C01", + "pdk": "gf180", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "dut_name": "C01_gf180_sW0.5_sL1", + "ports": [ + "VSS", + "IB1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 1.0, + "l": 1.12, + "nf": 2 + }, + "M2": { + "w": 1.0, + "l": 1.12, + "nf": 2 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 1.65, + "tol": 0.05, + "vout_test": 1.9 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.12, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.12, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "8d80e8fb05c7090c", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/gf180/sW0.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW0.5_sL1/manifest.json new file mode 100644 index 00000000..a0d6abfb --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW0.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "67dafb37568a7862f09a7ad26d87e40a2516804495f788af2b9b259ee8341afd", + "qualification.json": "8adcbd1ed347b33079c7d04ddf36c2614b82436b90cb28aea0bb75bcfa9f10c9", + "specs.json": "561b1f9a0ab4bd32e8c05da12fd5b0862b02c812d594280b4f619fae06c5a158", + "target.spice": "1d19a211161120b2311b8d9fd94f0ecac5175c0961b78087bf6a64453b2c0254", + "target_lvs.spice": "5bd60902d5006fda603be8ce1826135fbb78c9922707ad9c437f9d4f884129d3", + "testbench.spice": "9e2c032c78f0bb67583ed07e3f4905cd9a85450a6c4d1d362a0e3d7ef0707c29" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/gf180/sW0.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW0.5_sL1/qualification.json new file mode 100644 index 00000000..a74e7505 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW0.5_sL1/qualification.json @@ -0,0 +1,91 @@ +{ + "case_id": "C01_gf180_sW0.5_sL1", + "circuit_id": "C01", + "pdk": "gf180", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.12, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.12, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "8d80e8fb05c7090c", + "mirror_pass1": { + "vmin": 0.4939107, + "status": "passed", + "vout_test": 1.9 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.5939 + }, + "_frozen_from": { + "schematic": { + "err": 0.0096, + "vmin": 0.4939107 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 1.1549999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.2, + "schematic_measures": { + "iout_t": 2.0192e-05, + "err": 0.0096, + "vmin": 0.4939107, + "dev_at_vdd": 0.03076857, + "gout_t": 2.682199e-07, + "rout_t": 3728291.0, + "vout_test": 1.9, + "rout_nom": 3728291.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/gf180/sW0.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW0.5_sL1/specs.json new file mode 100644 index 00000000..9732fca7 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW0.5_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.5939 + }, + "_frozen_from": { + "schematic": { + "err": 0.0096, + "vmin": 0.4939107 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 1.1549999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/gf180/sW0.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW0.5_sL1/target.spice new file mode 100644 index 00000000..df4d7496 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW0.5_sL1/target.spice @@ -0,0 +1,4 @@ +.subckt C01_gf180_sW0.5_sL1 VSS IB1 IOUT1 +MM1 IB1 IB1 VSS VSS nfet_03v3 w=1u l=1.12u nf=2 m=1 +MM2 IOUT1 IB1 VSS VSS nfet_03v3 w=1u l=1.12u nf=2 m=1 +.ends C01_gf180_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C01/gf180/sW0.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW0.5_sL1/target_lvs.spice new file mode 100644 index 00000000..0d0847a0 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW0.5_sL1/target_lvs.spice @@ -0,0 +1,6 @@ +.subckt C01_gf180_sW0.5_sL1 VSS IB1 IOUT1 +MM1_f0 IB1 IB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM1_f1 IB1 IB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM2_f0 IOUT1 IB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM2_f1 IOUT1 IB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +.ends C01_gf180_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C01/gf180/sW0.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW0.5_sL1/testbench.spice new file mode 100644 index 00000000..c6b1189e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW0.5_sL1/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IB1 IOUT1 C01_gf180_sW0.5_sL1 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIB1 VDDB IB1 2e-05 +.nodeset v(IB1)=0.99 + +VOUT IOUT1 0 3.3 +.control +dc VOUT 3.3 0 -0.00825 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=1.9 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.05 cross=last +meas dc dev_at_vdd find dev at=3.2835 +let gout = deriv(iout) +meas dc gout_t find gout at=1.9 +let rout_v = 1/gout +meas dc rout_t find rout_v at=1.9 +echo vout_test = 1.9 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C01/gf180/sW0.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW0.5_sL2/case.json new file mode 100644 index 00000000..238da186 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW0.5_sL2/case.json @@ -0,0 +1,105 @@ +{ + "case_id": "C01_gf180_sW0.5_sL2", + "circuit_id": "C01", + "pdk": "gf180", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "dut_name": "C01_gf180_sW0.5_sL2", + "ports": [ + "VSS", + "IB1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 1.0, + "l": 2.24, + "nf": 2 + }, + "M2": { + "w": 1.0, + "l": 2.24, + "nf": 2 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 1.65, + "tol": 0.05, + "vout_test": 1.96 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 2.24, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 2.24, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "473392a1b0f6b0ba", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/gf180/sW0.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW0.5_sL2/manifest.json new file mode 100644 index 00000000..787e7370 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW0.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "3fe7e2942468c7c33f3668116b930df5451ebee5369f682062ba7e282a813772", + "qualification.json": "8cd586d17f0ffa9173e5b480601c658b7a4000a610c4ed261804d7286615c9ba", + "specs.json": "e4e2871577d020383eaff5a39a183470c7a9a83739611c2d240f613e79ce8cfd", + "target.spice": "f4187d59e8c4e864eeb3333a694c4efadcb957cc42e34b2f3aa1c034d6551e0e", + "target_lvs.spice": "a9cd5a3409e692f9f0cb892d0430e4c124db267ae34cea83d5c5c99fd9710cad", + "testbench.spice": "6078b4dfee31331ad7537333d4b5c1af4261296a1f7cd3c41f7136a62822550c" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/gf180/sW0.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW0.5_sL2/qualification.json new file mode 100644 index 00000000..4c3cde85 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW0.5_sL2/qualification.json @@ -0,0 +1,91 @@ +{ + "case_id": "C01_gf180_sW0.5_sL2", + "circuit_id": "C01", + "pdk": "gf180", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 2.24, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 2.24, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "473392a1b0f6b0ba", + "mirror_pass1": { + "vmin": 0.6231022, + "status": "passed", + "vout_test": 1.96 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.7231 + }, + "_frozen_from": { + "schematic": { + "err": 0.002796, + "vmin": 0.6231022 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 1.1549999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.2, + "schematic_measures": { + "iout_t": 2.005592e-05, + "err": 0.002796, + "vmin": 0.6231022, + "dev_at_vdd": 0.01716841, + "gout_t": 1.317882e-07, + "rout_t": 7587959.0, + "vout_test": 1.96, + "rout_nom": 7587959.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/gf180/sW0.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW0.5_sL2/specs.json new file mode 100644 index 00000000..b457b299 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW0.5_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.7231 + }, + "_frozen_from": { + "schematic": { + "err": 0.002796, + "vmin": 0.6231022 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 1.1549999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/gf180/sW0.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW0.5_sL2/target.spice new file mode 100644 index 00000000..a7624ec7 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW0.5_sL2/target.spice @@ -0,0 +1,4 @@ +.subckt C01_gf180_sW0.5_sL2 VSS IB1 IOUT1 +MM1 IB1 IB1 VSS VSS nfet_03v3 w=1u l=2.24u nf=2 m=1 +MM2 IOUT1 IB1 VSS VSS nfet_03v3 w=1u l=2.24u nf=2 m=1 +.ends C01_gf180_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C01/gf180/sW0.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW0.5_sL2/target_lvs.spice new file mode 100644 index 00000000..00b17a38 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW0.5_sL2/target_lvs.spice @@ -0,0 +1,6 @@ +.subckt C01_gf180_sW0.5_sL2 VSS IB1 IOUT1 +MM1_f0 IB1 IB1 VSS VSS nfet_03v3 w=0.5u l=2.24u +MM1_f1 IB1 IB1 VSS VSS nfet_03v3 w=0.5u l=2.24u +MM2_f0 IOUT1 IB1 VSS VSS nfet_03v3 w=0.5u l=2.24u +MM2_f1 IOUT1 IB1 VSS VSS nfet_03v3 w=0.5u l=2.24u +.ends C01_gf180_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C01/gf180/sW0.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW0.5_sL2/testbench.spice new file mode 100644 index 00000000..96629dc0 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW0.5_sL2/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IB1 IOUT1 C01_gf180_sW0.5_sL2 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIB1 VDDB IB1 2e-05 +.nodeset v(IB1)=0.99 + +VOUT IOUT1 0 3.3 +.control +dc VOUT 3.3 0 -0.00825 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=1.96 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.05 cross=last +meas dc dev_at_vdd find dev at=3.2835 +let gout = deriv(iout) +meas dc gout_t find gout at=1.96 +let rout_v = 1/gout +meas dc rout_t find rout_v at=1.96 +echo vout_test = 1.96 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1.5_sL1.5/case.json new file mode 100644 index 00000000..197c3d4a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1.5_sL1.5/case.json @@ -0,0 +1,105 @@ +{ + "case_id": "C01_gf180_sW1.5_sL1.5", + "circuit_id": "C01", + "pdk": "gf180", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "dut_name": "C01_gf180_sW1.5_sL1.5", + "ports": [ + "VSS", + "IB1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 3.0, + "l": 1.68, + "nf": 6 + }, + "M2": { + "w": 3.0, + "l": 1.68, + "nf": 6 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 1.65, + "tol": 0.05, + "vout_test": 1.82 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.68, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.68, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "04e58f2ea147e188", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1.5_sL1.5/manifest.json new file mode 100644 index 00000000..2320c6e7 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "d089167533349443944631e553e5ac34fb638493962dc8b805fb71bb50cbc9c1", + "qualification.json": "8438491b32784ce19ec7cf898cd7878138949d3586c50c5ca8e907c008d03b0e", + "specs.json": "c05fc642e500c276890b5fa075a89c093512263501bdd98a1615bc2632ee8405", + "target.spice": "f22aa74e0ed962aa4e63337d5b2c0701332c940d0e1e131976d2fb26a338e61b", + "target_lvs.spice": "30cf349f17ca3d23edac2c7e8668f51ac6fc2cd18dc606f54ebdf8f54e84f682", + "testbench.spice": "184f8763cd3b46a2edc9f7ba2b077bbd521f6eb3a5cc56dfe65e4446e13bbd2d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1.5_sL1.5/qualification.json new file mode 100644 index 00000000..542312bf --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1.5_sL1.5/qualification.json @@ -0,0 +1,91 @@ +{ + "case_id": "C01_gf180_sW1.5_sL1.5", + "circuit_id": "C01", + "pdk": "gf180", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.68, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.68, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "04e58f2ea147e188", + "mirror_pass1": { + "vmin": 0.3330656, + "status": "passed", + "vout_test": 1.82 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.4331 + }, + "_frozen_from": { + "schematic": { + "err": 0.00945, + "vmin": 0.3330656 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 1.1549999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.2, + "schematic_measures": { + "iout_t": 2.0189e-05, + "err": 0.00945, + "vmin": 0.3330656, + "dev_at_vdd": 0.05038195, + "gout_t": 2.277447e-07, + "rout_t": 4390884.0, + "vout_test": 1.82, + "rout_nom": 4390884.0, + "ok_at_vdd": 0.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1.5_sL1.5/specs.json new file mode 100644 index 00000000..4983d89a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1.5_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.4331 + }, + "_frozen_from": { + "schematic": { + "err": 0.00945, + "vmin": 0.3330656 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 1.1549999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1.5_sL1.5/target.spice new file mode 100644 index 00000000..20d1cc5e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1.5_sL1.5/target.spice @@ -0,0 +1,4 @@ +.subckt C01_gf180_sW1.5_sL1.5 VSS IB1 IOUT1 +MM1 IB1 IB1 VSS VSS nfet_03v3 w=3u l=1.68u nf=6 m=1 +MM2 IOUT1 IB1 VSS VSS nfet_03v3 w=3u l=1.68u nf=6 m=1 +.ends C01_gf180_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..dab3c40f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1.5_sL1.5/target_lvs.spice @@ -0,0 +1,14 @@ +.subckt C01_gf180_sW1.5_sL1.5 VSS IB1 IOUT1 +MM1_f0 IB1 IB1 VSS VSS nfet_03v3 w=0.5u l=1.68u +MM1_f1 IB1 IB1 VSS VSS nfet_03v3 w=0.5u l=1.68u +MM1_f2 IB1 IB1 VSS VSS nfet_03v3 w=0.5u l=1.68u +MM1_f3 IB1 IB1 VSS VSS nfet_03v3 w=0.5u l=1.68u +MM1_f4 IB1 IB1 VSS VSS nfet_03v3 w=0.5u l=1.68u +MM1_f5 IB1 IB1 VSS VSS nfet_03v3 w=0.5u l=1.68u +MM2_f0 IOUT1 IB1 VSS VSS nfet_03v3 w=0.5u l=1.68u +MM2_f1 IOUT1 IB1 VSS VSS nfet_03v3 w=0.5u l=1.68u +MM2_f2 IOUT1 IB1 VSS VSS nfet_03v3 w=0.5u l=1.68u +MM2_f3 IOUT1 IB1 VSS VSS nfet_03v3 w=0.5u l=1.68u +MM2_f4 IOUT1 IB1 VSS VSS nfet_03v3 w=0.5u l=1.68u +MM2_f5 IOUT1 IB1 VSS VSS nfet_03v3 w=0.5u l=1.68u +.ends C01_gf180_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1.5_sL1.5/testbench.spice new file mode 100644 index 00000000..1fb0ca62 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1.5_sL1.5/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IB1 IOUT1 C01_gf180_sW1.5_sL1.5 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIB1 VDDB IB1 2e-05 +.nodeset v(IB1)=0.99 + +VOUT IOUT1 0 3.3 +.control +dc VOUT 3.3 0 -0.00825 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=1.82 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.05 cross=last +meas dc dev_at_vdd find dev at=3.2835 +let gout = deriv(iout) +meas dc gout_t find gout at=1.82 +let rout_v = 1/gout +meas dc rout_t find rout_v at=1.82 +echo vout_test = 1.82 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1.5_sL1/case.json new file mode 100644 index 00000000..3a189f68 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1.5_sL1/case.json @@ -0,0 +1,105 @@ +{ + "case_id": "C01_gf180_sW1.5_sL1", + "circuit_id": "C01", + "pdk": "gf180", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "dut_name": "C01_gf180_sW1.5_sL1", + "ports": [ + "VSS", + "IB1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 3.0, + "l": 1.12, + "nf": 6 + }, + "M2": { + "w": 3.0, + "l": 1.12, + "nf": 6 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 1.65, + "tol": 0.05, + "vout_test": 1.8 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.12, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.12, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "a21601cfb88c77f2", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1.5_sL1/manifest.json new file mode 100644 index 00000000..f3ca3462 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "b5458d9392dd5a0f026a8298f5aff84b9be5afa768e76ded02ee6e140b499d17", + "qualification.json": "33eeda6c52e450880a8a1d06e3eb24abd2e4c285b3273929beff37b4055c2d12", + "specs.json": "e5e3ee5e72ef18e2ac3ee0d8a6b551bdbabec4495af804f37d6a1898d6d6a73f", + "target.spice": "b53a6cb48482437a16f9f25618d7d15201c2efdae4ff3ce4c8714c83d65517ea", + "target_lvs.spice": "adb90c0ab9a90ba832eb4f72a663e31d77e31f6792d7a3abc2ecdb7567760463", + "testbench.spice": "69173f0fce811a2054078ebb46c8a6bb7f40478c992b3cc14519f65d6eb00373" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1.5_sL1/qualification.json new file mode 100644 index 00000000..bbc15f51 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1.5_sL1/qualification.json @@ -0,0 +1,91 @@ +{ + "case_id": "C01_gf180_sW1.5_sL1", + "circuit_id": "C01", + "pdk": "gf180", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.12, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.12, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "a21601cfb88c77f2", + "mirror_pass1": { + "vmin": 0.3068542, + "status": "passed", + "vout_test": 1.8 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.4069 + }, + "_frozen_from": { + "schematic": { + "err": 0.0164475, + "vmin": 0.3068542 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 1.1549999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.2, + "schematic_measures": { + "iout_t": 2.032895e-05, + "err": 0.0164475, + "vmin": 0.3068542, + "dev_at_vdd": 0.0506685, + "gout_t": 3.573105e-07, + "rout_t": 2798687.0, + "vout_test": 1.8, + "rout_nom": 2798687.0, + "ok_at_vdd": 0.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1.5_sL1/specs.json new file mode 100644 index 00000000..14b3c9bd --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1.5_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.4069 + }, + "_frozen_from": { + "schematic": { + "err": 0.0164475, + "vmin": 0.3068542 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 1.1549999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1.5_sL1/target.spice new file mode 100644 index 00000000..d1cee4a3 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1.5_sL1/target.spice @@ -0,0 +1,4 @@ +.subckt C01_gf180_sW1.5_sL1 VSS IB1 IOUT1 +MM1 IB1 IB1 VSS VSS nfet_03v3 w=3u l=1.12u nf=6 m=1 +MM2 IOUT1 IB1 VSS VSS nfet_03v3 w=3u l=1.12u nf=6 m=1 +.ends C01_gf180_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1.5_sL1/target_lvs.spice new file mode 100644 index 00000000..5f46287a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1.5_sL1/target_lvs.spice @@ -0,0 +1,14 @@ +.subckt C01_gf180_sW1.5_sL1 VSS IB1 IOUT1 +MM1_f0 IB1 IB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM1_f1 IB1 IB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM1_f2 IB1 IB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM1_f3 IB1 IB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM1_f4 IB1 IB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM1_f5 IB1 IB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM2_f0 IOUT1 IB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM2_f1 IOUT1 IB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM2_f2 IOUT1 IB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM2_f3 IOUT1 IB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM2_f4 IOUT1 IB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM2_f5 IOUT1 IB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +.ends C01_gf180_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1.5_sL1/testbench.spice new file mode 100644 index 00000000..c75f16b3 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1.5_sL1/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IB1 IOUT1 C01_gf180_sW1.5_sL1 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIB1 VDDB IB1 2e-05 +.nodeset v(IB1)=0.99 + +VOUT IOUT1 0 3.3 +.control +dc VOUT 3.3 0 -0.00825 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=1.8 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.05 cross=last +meas dc dev_at_vdd find dev at=3.2835 +let gout = deriv(iout) +meas dc gout_t find gout at=1.8 +let rout_v = 1/gout +meas dc rout_t find rout_v at=1.8 +echo vout_test = 1.8 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1.5_sL2/case.json new file mode 100644 index 00000000..8d46f582 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1.5_sL2/case.json @@ -0,0 +1,105 @@ +{ + "case_id": "C01_gf180_sW1.5_sL2", + "circuit_id": "C01", + "pdk": "gf180", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "dut_name": "C01_gf180_sW1.5_sL2", + "ports": [ + "VSS", + "IB1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 3.0, + "l": 2.24, + "nf": 6 + }, + "M2": { + "w": 3.0, + "l": 2.24, + "nf": 6 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 1.65, + "tol": 0.05, + "vout_test": 1.83 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 2.24, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 2.24, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "5b62d65d2e8506af", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1.5_sL2/manifest.json new file mode 100644 index 00000000..75d3579e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "8ba214d11284f987bafe33b6980fd91e07a815dccefd17892c0205b4b3822d58", + "qualification.json": "5a5650add6e694cd5134cdb89614d52c197d1b798492ace70176057b78e2ecb3", + "specs.json": "cdfd0f292f44ea3d9f780fb70a7321c2870812fadc60bde2fdd9fd677db33122", + "target.spice": "266ea111ce8ce3f91a2bd31b87c245dbf4df0bce55feca4e9a4f93b887ef905e", + "target_lvs.spice": "8a8082df6ae2ef7326228a4dfab54ebbcf05f52ab39eb10546fb9b1fed417c73", + "testbench.spice": "bf8212004cddadc1fb66f85d81a84fada6c8467baf7bf0a2b2f58818f6ee449e" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1.5_sL2/qualification.json new file mode 100644 index 00000000..73d93ab0 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1.5_sL2/qualification.json @@ -0,0 +1,91 @@ +{ + "case_id": "C01_gf180_sW1.5_sL2", + "circuit_id": "C01", + "pdk": "gf180", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 2.24, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 2.24, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "5b62d65d2e8506af", + "mirror_pass1": { + "vmin": 0.3645314, + "status": "passed", + "vout_test": 1.83 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.4645 + }, + "_frozen_from": { + "schematic": { + "err": 0.0062665, + "vmin": 0.3645314 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 1.1549999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.2, + "schematic_measures": { + "iout_t": 2.012533e-05, + "err": 0.0062665, + "vmin": 0.3645314, + "dev_at_vdd": 0.03793406, + "gout_t": 1.673393e-07, + "rout_t": 5975886.0, + "vout_test": 1.83, + "rout_nom": 5975886.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1.5_sL2/specs.json new file mode 100644 index 00000000..a7f87b5a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1.5_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.4645 + }, + "_frozen_from": { + "schematic": { + "err": 0.0062665, + "vmin": 0.3645314 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 1.1549999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1.5_sL2/target.spice new file mode 100644 index 00000000..a272a782 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1.5_sL2/target.spice @@ -0,0 +1,4 @@ +.subckt C01_gf180_sW1.5_sL2 VSS IB1 IOUT1 +MM1 IB1 IB1 VSS VSS nfet_03v3 w=3u l=2.24u nf=6 m=1 +MM2 IOUT1 IB1 VSS VSS nfet_03v3 w=3u l=2.24u nf=6 m=1 +.ends C01_gf180_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1.5_sL2/target_lvs.spice new file mode 100644 index 00000000..73e564cb --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1.5_sL2/target_lvs.spice @@ -0,0 +1,14 @@ +.subckt C01_gf180_sW1.5_sL2 VSS IB1 IOUT1 +MM1_f0 IB1 IB1 VSS VSS nfet_03v3 w=0.5u l=2.24u +MM1_f1 IB1 IB1 VSS VSS nfet_03v3 w=0.5u l=2.24u +MM1_f2 IB1 IB1 VSS VSS nfet_03v3 w=0.5u l=2.24u +MM1_f3 IB1 IB1 VSS VSS nfet_03v3 w=0.5u l=2.24u +MM1_f4 IB1 IB1 VSS VSS nfet_03v3 w=0.5u l=2.24u +MM1_f5 IB1 IB1 VSS VSS nfet_03v3 w=0.5u l=2.24u +MM2_f0 IOUT1 IB1 VSS VSS nfet_03v3 w=0.5u l=2.24u +MM2_f1 IOUT1 IB1 VSS VSS nfet_03v3 w=0.5u l=2.24u +MM2_f2 IOUT1 IB1 VSS VSS nfet_03v3 w=0.5u l=2.24u +MM2_f3 IOUT1 IB1 VSS VSS nfet_03v3 w=0.5u l=2.24u +MM2_f4 IOUT1 IB1 VSS VSS nfet_03v3 w=0.5u l=2.24u +MM2_f5 IOUT1 IB1 VSS VSS nfet_03v3 w=0.5u l=2.24u +.ends C01_gf180_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1.5_sL2/testbench.spice new file mode 100644 index 00000000..fdc6a66f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1.5_sL2/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IB1 IOUT1 C01_gf180_sW1.5_sL2 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIB1 VDDB IB1 2e-05 +.nodeset v(IB1)=0.99 + +VOUT IOUT1 0 3.3 +.control +dc VOUT 3.3 0 -0.00825 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=1.83 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.05 cross=last +meas dc dev_at_vdd find dev at=3.2835 +let gout = deriv(iout) +meas dc gout_t find gout at=1.83 +let rout_v = 1/gout +meas dc rout_t find rout_v at=1.83 +echo vout_test = 1.83 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1_sL1.5/case.json new file mode 100644 index 00000000..54ac2547 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1_sL1.5/case.json @@ -0,0 +1,105 @@ +{ + "case_id": "C01_gf180_sW1_sL1.5", + "circuit_id": "C01", + "pdk": "gf180", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "dut_name": "C01_gf180_sW1_sL1.5", + "ports": [ + "VSS", + "IB1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 1.68, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 1.68, + "nf": 4 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 1.65, + "tol": 0.05, + "vout_test": 1.85 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.68, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.68, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "fa75150823673e58", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1_sL1.5/manifest.json new file mode 100644 index 00000000..abd3c977 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "4939599ab376f583953e8e0ab18da4a5ebbb9b5a804652a897a3d6e47827f600", + "qualification.json": "e6be6b4f302b7901b26d7ee6e0017723c92bd55766069422f41b0b1f3362bd10", + "specs.json": "4027ea7aafb642bf30da70a11f43b5cf27549c028b5abaf2062a6abce9310cb3", + "target.spice": "8ec94ea4b6b326f7ae302f77fc1ef85506b6d64e9f4046bdea73b7a61238fe1b", + "target_lvs.spice": "57ed47c19161f985c7ce11911ea5fb5b95dbddf53774deb6c349f74b05bf2391", + "testbench.spice": "8940f1d1f891011baa8c09b5c2382ba151520b68849496dd588d570c51840f30" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1_sL1.5/qualification.json new file mode 100644 index 00000000..2d7665f4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1_sL1.5/qualification.json @@ -0,0 +1,91 @@ +{ + "case_id": "C01_gf180_sW1_sL1.5", + "circuit_id": "C01", + "pdk": "gf180", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.68, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.68, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "fa75150823673e58", + "mirror_pass1": { + "vmin": 0.4007682, + "status": "passed", + "vout_test": 1.85 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.5008 + }, + "_frozen_from": { + "schematic": { + "err": 0.0076215, + "vmin": 0.4007682 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 1.1549999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.2, + "schematic_measures": { + "iout_t": 2.015243e-05, + "err": 0.0076215, + "vmin": 0.4007682, + "dev_at_vdd": 0.04081703, + "gout_t": 2.042242e-07, + "rout_t": 4896584.0, + "vout_test": 1.85, + "rout_nom": 4896584.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1_sL1.5/specs.json new file mode 100644 index 00000000..791bf1e3 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.5008 + }, + "_frozen_from": { + "schematic": { + "err": 0.0076215, + "vmin": 0.4007682 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 1.1549999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1_sL1.5/target.spice new file mode 100644 index 00000000..711535a5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1_sL1.5/target.spice @@ -0,0 +1,4 @@ +.subckt C01_gf180_sW1_sL1.5 VSS IB1 IOUT1 +MM1 IB1 IB1 VSS VSS nfet_03v3 w=2u l=1.68u nf=4 m=1 +MM2 IOUT1 IB1 VSS VSS nfet_03v3 w=2u l=1.68u nf=4 m=1 +.ends C01_gf180_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1_sL1.5/target_lvs.spice new file mode 100644 index 00000000..f565ac26 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1_sL1.5/target_lvs.spice @@ -0,0 +1,10 @@ +.subckt C01_gf180_sW1_sL1.5 VSS IB1 IOUT1 +MM1_f0 IB1 IB1 VSS VSS nfet_03v3 w=0.5u l=1.68u +MM1_f1 IB1 IB1 VSS VSS nfet_03v3 w=0.5u l=1.68u +MM1_f2 IB1 IB1 VSS VSS nfet_03v3 w=0.5u l=1.68u +MM1_f3 IB1 IB1 VSS VSS nfet_03v3 w=0.5u l=1.68u +MM2_f0 IOUT1 IB1 VSS VSS nfet_03v3 w=0.5u l=1.68u +MM2_f1 IOUT1 IB1 VSS VSS nfet_03v3 w=0.5u l=1.68u +MM2_f2 IOUT1 IB1 VSS VSS nfet_03v3 w=0.5u l=1.68u +MM2_f3 IOUT1 IB1 VSS VSS nfet_03v3 w=0.5u l=1.68u +.ends C01_gf180_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1_sL1.5/testbench.spice new file mode 100644 index 00000000..b3077c86 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1_sL1.5/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IB1 IOUT1 C01_gf180_sW1_sL1.5 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIB1 VDDB IB1 2e-05 +.nodeset v(IB1)=0.99 + +VOUT IOUT1 0 3.3 +.control +dc VOUT 3.3 0 -0.00825 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=1.85 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.05 cross=last +meas dc dev_at_vdd find dev at=3.2835 +let gout = deriv(iout) +meas dc gout_t find gout at=1.85 +let rout_v = 1/gout +meas dc rout_t find rout_v at=1.85 +echo vout_test = 1.85 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1_sL1/case.json new file mode 100644 index 00000000..caa3355a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1_sL1/case.json @@ -0,0 +1,105 @@ +{ + "case_id": "C01_gf180_sW1_sL1", + "circuit_id": "C01", + "pdk": "gf180", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "dut_name": "C01_gf180_sW1_sL1", + "ports": [ + "VSS", + "IB1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 1.12, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 1.12, + "nf": 4 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 1.65, + "tol": 0.05, + "vout_test": 1.83 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "b8f486775160b817", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1_sL1/manifest.json new file mode 100644 index 00000000..4004ac3b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "995cbcd44abc376dcb2a8dc52e870451817eccf93dd9fe0ff1abd59e135d5b84", + "qualification.json": "1b0ff16006cd39a372ef9667f6c1c3e1c5749f9f50a5e78ef711f2f5b151483e", + "specs.json": "a8d2f87b0fe9a8cc9b9a90e476070f5468bc596d1bc2151a6c048c4892e05747", + "target.spice": "c188c4e720704c8acc8bc84396fc5bd729406692e40f63cff781eaab86d48b81", + "target_lvs.spice": "081c546f10b3e6482fa8479116f76a8355daad0d1c5e6f54e3a70ea7c58830b8", + "testbench.spice": "f12eec61418f1e904f626d533967d578420ef25fae7514f6a17fc5314e7a27d0" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1_sL1/qualification.json new file mode 100644 index 00000000..5cebaecf --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1_sL1/qualification.json @@ -0,0 +1,91 @@ +{ + "case_id": "C01_gf180_sW1_sL1", + "circuit_id": "C01", + "pdk": "gf180", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "b8f486775160b817", + "mirror_pass1": { + "vmin": 0.3632665, + "status": "passed", + "vout_test": 1.83 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.4633 + }, + "_frozen_from": { + "schematic": { + "err": 0.0137495, + "vmin": 0.3632665 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 1.1549999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.2, + "schematic_measures": { + "iout_t": 2.027499e-05, + "err": 0.0137495, + "vmin": 0.3632665, + "dev_at_vdd": 0.04274814, + "gout_t": 3.184771e-07, + "rout_t": 3139945.0, + "vout_test": 1.83, + "rout_nom": 3139945.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1_sL1/specs.json new file mode 100644 index 00000000..a5641074 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.4633 + }, + "_frozen_from": { + "schematic": { + "err": 0.0137495, + "vmin": 0.3632665 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 1.1549999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1_sL1/target.spice new file mode 100644 index 00000000..4d606802 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1_sL1/target.spice @@ -0,0 +1,4 @@ +.subckt C01_gf180_sW1_sL1 VSS IB1 IOUT1 +MM1 IB1 IB1 VSS VSS nfet_03v3 w=2u l=1.12u nf=4 m=1 +MM2 IOUT1 IB1 VSS VSS nfet_03v3 w=2u l=1.12u nf=4 m=1 +.ends C01_gf180_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1_sL1/target_lvs.spice new file mode 100644 index 00000000..109b6899 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1_sL1/target_lvs.spice @@ -0,0 +1,10 @@ +.subckt C01_gf180_sW1_sL1 VSS IB1 IOUT1 +MM1_f0 IB1 IB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM1_f1 IB1 IB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM1_f2 IB1 IB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM1_f3 IB1 IB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM2_f0 IOUT1 IB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM2_f1 IOUT1 IB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM2_f2 IOUT1 IB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM2_f3 IOUT1 IB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +.ends C01_gf180_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1_sL1/testbench.spice new file mode 100644 index 00000000..02d2d8a7 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1_sL1/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IB1 IOUT1 C01_gf180_sW1_sL1 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIB1 VDDB IB1 2e-05 +.nodeset v(IB1)=0.99 + +VOUT IOUT1 0 3.3 +.control +dc VOUT 3.3 0 -0.00825 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=1.83 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.05 cross=last +meas dc dev_at_vdd find dev at=3.2835 +let gout = deriv(iout) +meas dc gout_t find gout at=1.83 +let rout_v = 1/gout +meas dc rout_t find rout_v at=1.83 +echo vout_test = 1.83 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1_sL2/case.json new file mode 100644 index 00000000..3b7e8cbc --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1_sL2/case.json @@ -0,0 +1,105 @@ +{ + "case_id": "C01_gf180_sW1_sL2", + "circuit_id": "C01", + "pdk": "gf180", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "dut_name": "C01_gf180_sW1_sL2", + "ports": [ + "VSS", + "IB1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 2.24, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 2.24, + "nf": 4 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 1.65, + "tol": 0.05, + "vout_test": 1.87 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 2.24, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 2.24, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "fcd39913c768f6cc", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1_sL2/manifest.json new file mode 100644 index 00000000..948d6152 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "9789babc3b549b5f4981a53266731404e47e94e63d4bc56ba3f7e3fded835331", + "qualification.json": "0d89e803fb4e35894b73f9ba71d617e9510869a2fb98d030032a245f8a99b2a4", + "specs.json": "c17f6220bebe8ab7a00802917f572e511e64e2c38b222a2ba8c748cebcb1e146", + "target.spice": "5fd0af505b75620dda4616507bd33bcafb4928f1f82cb542b36098cd08b2a7ec", + "target_lvs.spice": "b72b1acc27bda14ba3a0b2ce017c40ae9d86ff80e87be598f0ec2e97364549a3", + "testbench.spice": "4ccac8a37bf0be4d9aa4f0fa2c4a869059c0f329ddd2b1558adb41c4adad6664" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1_sL2/qualification.json new file mode 100644 index 00000000..86996f72 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1_sL2/qualification.json @@ -0,0 +1,91 @@ +{ + "case_id": "C01_gf180_sW1_sL2", + "circuit_id": "C01", + "pdk": "gf180", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 2.24, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 2.24, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "fcd39913c768f6cc", + "mirror_pass1": { + "vmin": 0.441899, + "status": "passed", + "vout_test": 1.87 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.5419 + }, + "_frozen_from": { + "schematic": { + "err": 0.004934, + "vmin": 0.441899 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 1.1549999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.2, + "schematic_measures": { + "iout_t": 2.009868e-05, + "err": 0.004934, + "vmin": 0.441899, + "dev_at_vdd": 0.02965071, + "gout_t": 1.507288e-07, + "rout_t": 6634442.0, + "vout_test": 1.87, + "rout_nom": 6634442.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1_sL2/specs.json new file mode 100644 index 00000000..dc7e9e4f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.5419 + }, + "_frozen_from": { + "schematic": { + "err": 0.004934, + "vmin": 0.441899 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 1.1549999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1_sL2/target.spice new file mode 100644 index 00000000..5d010de4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1_sL2/target.spice @@ -0,0 +1,4 @@ +.subckt C01_gf180_sW1_sL2 VSS IB1 IOUT1 +MM1 IB1 IB1 VSS VSS nfet_03v3 w=2u l=2.24u nf=4 m=1 +MM2 IOUT1 IB1 VSS VSS nfet_03v3 w=2u l=2.24u nf=4 m=1 +.ends C01_gf180_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1_sL2/target_lvs.spice new file mode 100644 index 00000000..02c387d3 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1_sL2/target_lvs.spice @@ -0,0 +1,10 @@ +.subckt C01_gf180_sW1_sL2 VSS IB1 IOUT1 +MM1_f0 IB1 IB1 VSS VSS nfet_03v3 w=0.5u l=2.24u +MM1_f1 IB1 IB1 VSS VSS nfet_03v3 w=0.5u l=2.24u +MM1_f2 IB1 IB1 VSS VSS nfet_03v3 w=0.5u l=2.24u +MM1_f3 IB1 IB1 VSS VSS nfet_03v3 w=0.5u l=2.24u +MM2_f0 IOUT1 IB1 VSS VSS nfet_03v3 w=0.5u l=2.24u +MM2_f1 IOUT1 IB1 VSS VSS nfet_03v3 w=0.5u l=2.24u +MM2_f2 IOUT1 IB1 VSS VSS nfet_03v3 w=0.5u l=2.24u +MM2_f3 IOUT1 IB1 VSS VSS nfet_03v3 w=0.5u l=2.24u +.ends C01_gf180_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1_sL2/testbench.spice new file mode 100644 index 00000000..9e102db7 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW1_sL2/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IB1 IOUT1 C01_gf180_sW1_sL2 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIB1 VDDB IB1 2e-05 +.nodeset v(IB1)=0.99 + +VOUT IOUT1 0 3.3 +.control +dc VOUT 3.3 0 -0.00825 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=1.87 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.05 cross=last +meas dc dev_at_vdd find dev at=3.2835 +let gout = deriv(iout) +meas dc gout_t find gout at=1.87 +let rout_v = 1/gout +meas dc rout_t find rout_v at=1.87 +echo vout_test = 1.87 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C01/gf180/sW2_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW2_sL1.5/case.json new file mode 100644 index 00000000..69ad6c6a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW2_sL1.5/case.json @@ -0,0 +1,105 @@ +{ + "case_id": "C01_gf180_sW2_sL1.5", + "circuit_id": "C01", + "pdk": "gf180", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "dut_name": "C01_gf180_sW2_sL1.5", + "ports": [ + "VSS", + "IB1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 1.68, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 1.68, + "nf": 8 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 1.65, + "tol": 0.05, + "vout_test": 1.8 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.68, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.68, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "c73195cf17258e63", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/gf180/sW2_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW2_sL1.5/manifest.json new file mode 100644 index 00000000..8181cf6b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW2_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "54524aa67d54a14484686a3bb6b4d46dfbc7d757caedc9aae3c71e1375bf8b5f", + "qualification.json": "9a9af6bf8eb79381f476c9d391062cbfa55b6524da44c2f6e145fd2c140b27dd", + "specs.json": "87ef20709b439912af862ddbacbaaa7371aa13647c55ff6de02805dbeb8ddfb3", + "target.spice": "98d6f1a4148546a68464e2acc6dd2a6d5f3c4435f3d7cae82dc03029be67cec8", + "target_lvs.spice": "b053f3d99af9f11610cc8da714a59a2611d58a290d38839c91bcecbe2d5eeeba", + "testbench.spice": "4720eaec5c21292ed3645d284cf04ef1d1aecf4ab0db358e2dd5d20088f3f4f8" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/gf180/sW2_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW2_sL1.5/qualification.json new file mode 100644 index 00000000..18156f9f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW2_sL1.5/qualification.json @@ -0,0 +1,91 @@ +{ + "case_id": "C01_gf180_sW2_sL1.5", + "circuit_id": "C01", + "pdk": "gf180", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.68, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.68, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "c73195cf17258e63", + "mirror_pass1": { + "vmin": 0.2933166, + "status": "passed", + "vout_test": 1.8 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.3933 + }, + "_frozen_from": { + "schematic": { + "err": 0.010827, + "vmin": 0.2933166 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 1.1549999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.2, + "schematic_measures": { + "iout_t": 2.021654e-05, + "err": 0.010827, + "vmin": 0.2933166, + "dev_at_vdd": 0.05741479, + "gout_t": 2.478971e-07, + "rout_t": 4033933.0, + "vout_test": 1.8, + "rout_nom": 4033933.0, + "ok_at_vdd": 0.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/gf180/sW2_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW2_sL1.5/specs.json new file mode 100644 index 00000000..cd8c1e78 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW2_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.3933 + }, + "_frozen_from": { + "schematic": { + "err": 0.010827, + "vmin": 0.2933166 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 1.1549999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/gf180/sW2_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW2_sL1.5/target.spice new file mode 100644 index 00000000..20d862e7 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW2_sL1.5/target.spice @@ -0,0 +1,4 @@ +.subckt C01_gf180_sW2_sL1.5 VSS IB1 IOUT1 +MM1 IB1 IB1 VSS VSS nfet_03v3 w=4u l=1.68u nf=8 m=1 +MM2 IOUT1 IB1 VSS VSS nfet_03v3 w=4u l=1.68u nf=8 m=1 +.ends C01_gf180_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C01/gf180/sW2_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW2_sL1.5/target_lvs.spice new file mode 100644 index 00000000..2cf5f386 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW2_sL1.5/target_lvs.spice @@ -0,0 +1,18 @@ +.subckt C01_gf180_sW2_sL1.5 VSS IB1 IOUT1 +MM1_f0 IB1 IB1 VSS VSS nfet_03v3 w=0.5u l=1.68u +MM1_f1 IB1 IB1 VSS VSS nfet_03v3 w=0.5u l=1.68u +MM1_f2 IB1 IB1 VSS VSS nfet_03v3 w=0.5u l=1.68u +MM1_f3 IB1 IB1 VSS VSS nfet_03v3 w=0.5u l=1.68u +MM1_f4 IB1 IB1 VSS VSS nfet_03v3 w=0.5u l=1.68u +MM1_f5 IB1 IB1 VSS VSS nfet_03v3 w=0.5u l=1.68u +MM1_f6 IB1 IB1 VSS VSS nfet_03v3 w=0.5u l=1.68u +MM1_f7 IB1 IB1 VSS VSS nfet_03v3 w=0.5u l=1.68u +MM2_f0 IOUT1 IB1 VSS VSS nfet_03v3 w=0.5u l=1.68u +MM2_f1 IOUT1 IB1 VSS VSS nfet_03v3 w=0.5u l=1.68u +MM2_f2 IOUT1 IB1 VSS VSS nfet_03v3 w=0.5u l=1.68u +MM2_f3 IOUT1 IB1 VSS VSS nfet_03v3 w=0.5u l=1.68u +MM2_f4 IOUT1 IB1 VSS VSS nfet_03v3 w=0.5u l=1.68u +MM2_f5 IOUT1 IB1 VSS VSS nfet_03v3 w=0.5u l=1.68u +MM2_f6 IOUT1 IB1 VSS VSS nfet_03v3 w=0.5u l=1.68u +MM2_f7 IOUT1 IB1 VSS VSS nfet_03v3 w=0.5u l=1.68u +.ends C01_gf180_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C01/gf180/sW2_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW2_sL1.5/testbench.spice new file mode 100644 index 00000000..1147ac26 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW2_sL1.5/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IB1 IOUT1 C01_gf180_sW2_sL1.5 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIB1 VDDB IB1 2e-05 +.nodeset v(IB1)=0.99 + +VOUT IOUT1 0 3.3 +.control +dc VOUT 3.3 0 -0.00825 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=1.8 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.05 cross=last +meas dc dev_at_vdd find dev at=3.2835 +let gout = deriv(iout) +meas dc gout_t find gout at=1.8 +let rout_v = 1/gout +meas dc rout_t find rout_v at=1.8 +echo vout_test = 1.8 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C01/gf180/sW2_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW2_sL1/case.json new file mode 100644 index 00000000..20158124 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW2_sL1/case.json @@ -0,0 +1,105 @@ +{ + "case_id": "C01_gf180_sW2_sL1", + "circuit_id": "C01", + "pdk": "gf180", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "dut_name": "C01_gf180_sW2_sL1", + "ports": [ + "VSS", + "IB1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 1.12, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 1.12, + "nf": 8 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 1.65, + "tol": 0.05, + "vout_test": 1.79 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "6397d295385c22c7", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/gf180/sW2_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW2_sL1/manifest.json new file mode 100644 index 00000000..412b1c6d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW2_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "56a390150b952e164a75b34ac1b9993dc4c0ea42833946876bcbc226b5073aa5", + "qualification.json": "9eafbe0dad36d8f8d395ddd59758c1e1110a85312ca85ca7d44567b2fa3df8f3", + "specs.json": "8c00e836512f8f3547319023ded836a98713d5f681b7253277ed3359dd18bae6", + "target.spice": "6e5a431da0fc24bb93e4bed3db62cf27fae6787c6a54dc2f948407a41b48fd09", + "target_lvs.spice": "5028558ccb779490eaef6de70cf5f5c5a3b90733572de36a063482c38aa1a7af", + "testbench.spice": "d4e22cfa5a933a6c844d17f018ab39c097f0d73382cbed4c3828bb54ad6d3d5b" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/gf180/sW2_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW2_sL1/qualification.json new file mode 100644 index 00000000..281f85e0 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW2_sL1/qualification.json @@ -0,0 +1,91 @@ +{ + "case_id": "C01_gf180_sW2_sL1", + "circuit_id": "C01", + "pdk": "gf180", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "6397d295385c22c7", + "mirror_pass1": { + "vmin": 0.273695, + "status": "passed", + "vout_test": 1.79 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.3737 + }, + "_frozen_from": { + "schematic": { + "err": 0.0186885, + "vmin": 0.273695 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 1.1549999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.2, + "schematic_measures": { + "iout_t": 2.037377e-05, + "err": 0.0186885, + "vmin": 0.273695, + "dev_at_vdd": 0.05676728, + "gout_t": 3.890374e-07, + "rout_t": 2570447.0, + "vout_test": 1.79, + "rout_nom": 2570447.0, + "ok_at_vdd": 0.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/gf180/sW2_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW2_sL1/specs.json new file mode 100644 index 00000000..b90d22f4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW2_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.3737 + }, + "_frozen_from": { + "schematic": { + "err": 0.0186885, + "vmin": 0.273695 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 1.1549999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/gf180/sW2_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW2_sL1/target.spice new file mode 100644 index 00000000..0195feca --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW2_sL1/target.spice @@ -0,0 +1,4 @@ +.subckt C01_gf180_sW2_sL1 VSS IB1 IOUT1 +MM1 IB1 IB1 VSS VSS nfet_03v3 w=4u l=1.12u nf=8 m=1 +MM2 IOUT1 IB1 VSS VSS nfet_03v3 w=4u l=1.12u nf=8 m=1 +.ends C01_gf180_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C01/gf180/sW2_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW2_sL1/target_lvs.spice new file mode 100644 index 00000000..25866b8b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW2_sL1/target_lvs.spice @@ -0,0 +1,18 @@ +.subckt C01_gf180_sW2_sL1 VSS IB1 IOUT1 +MM1_f0 IB1 IB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM1_f1 IB1 IB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM1_f2 IB1 IB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM1_f3 IB1 IB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM1_f4 IB1 IB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM1_f5 IB1 IB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM1_f6 IB1 IB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM1_f7 IB1 IB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM2_f0 IOUT1 IB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM2_f1 IOUT1 IB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM2_f2 IOUT1 IB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM2_f3 IOUT1 IB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM2_f4 IOUT1 IB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM2_f5 IOUT1 IB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM2_f6 IOUT1 IB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM2_f7 IOUT1 IB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +.ends C01_gf180_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C01/gf180/sW2_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW2_sL1/testbench.spice new file mode 100644 index 00000000..be2d9263 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW2_sL1/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IB1 IOUT1 C01_gf180_sW2_sL1 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIB1 VDDB IB1 2e-05 +.nodeset v(IB1)=0.99 + +VOUT IOUT1 0 3.3 +.control +dc VOUT 3.3 0 -0.00825 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=1.79 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.05 cross=last +meas dc dev_at_vdd find dev at=3.2835 +let gout = deriv(iout) +meas dc gout_t find gout at=1.79 +let rout_v = 1/gout +meas dc rout_t find rout_v at=1.79 +echo vout_test = 1.79 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C01/gf180/sW2_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW2_sL2/case.json new file mode 100644 index 00000000..1ba79d7f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW2_sL2/case.json @@ -0,0 +1,105 @@ +{ + "case_id": "C01_gf180_sW2_sL2", + "circuit_id": "C01", + "pdk": "gf180", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "dut_name": "C01_gf180_sW2_sL2", + "ports": [ + "VSS", + "IB1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 2.24, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 2.24, + "nf": 8 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 1.65, + "tol": 0.05, + "vout_test": 1.81 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 2.24, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 2.24, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "dce0b41fe2b0cb39", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/gf180/sW2_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW2_sL2/manifest.json new file mode 100644 index 00000000..a2d69ff6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW2_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "002a797c4695abf3b903380d3934f1d18723cbd98b7226f823b95afcf7e09204", + "qualification.json": "3640f15a9912c28b06bb65a48d33670d78cd79bb70db4c129b05ee2db4d37688", + "specs.json": "b01ec0f4eb374e1f91b100f8dc362b6564501cbabe4492a81f853e758a550307", + "target.spice": "449077d5b31bbe926ec4d23da9fc325573b61d93a5da7b5a22f3b37331eb38d1", + "target_lvs.spice": "226bb1419746b8ca630f50bc8eaa0262df0670cd55422c07c57d0f8ad9dea148", + "testbench.spice": "99858586c33570338c9123c297dadd4b75645b15679b6fffcf674714cc276a42" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/gf180/sW2_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW2_sL2/qualification.json new file mode 100644 index 00000000..b542c336 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW2_sL2/qualification.json @@ -0,0 +1,91 @@ +{ + "case_id": "C01_gf180_sW2_sL2", + "circuit_id": "C01", + "pdk": "gf180", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 2.24, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 2.24, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "dce0b41fe2b0cb39", + "mirror_pass1": { + "vmin": 0.3192599, + "status": "passed", + "vout_test": 1.81 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.4193 + }, + "_frozen_from": { + "schematic": { + "err": 0.0073185, + "vmin": 0.3192599 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 1.1549999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.2, + "schematic_measures": { + "iout_t": 2.014637e-05, + "err": 0.0073185, + "vmin": 0.3192599, + "dev_at_vdd": 0.04407303, + "gout_t": 1.815763e-07, + "rout_t": 5507330.0, + "vout_test": 1.81, + "rout_nom": 5507330.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/gf180/sW2_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW2_sL2/specs.json new file mode 100644 index 00000000..78e57820 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW2_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.4193 + }, + "_frozen_from": { + "schematic": { + "err": 0.0073185, + "vmin": 0.3192599 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 1.1549999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/gf180/sW2_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW2_sL2/target.spice new file mode 100644 index 00000000..408e2046 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW2_sL2/target.spice @@ -0,0 +1,4 @@ +.subckt C01_gf180_sW2_sL2 VSS IB1 IOUT1 +MM1 IB1 IB1 VSS VSS nfet_03v3 w=4u l=2.24u nf=8 m=1 +MM2 IOUT1 IB1 VSS VSS nfet_03v3 w=4u l=2.24u nf=8 m=1 +.ends C01_gf180_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C01/gf180/sW2_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW2_sL2/target_lvs.spice new file mode 100644 index 00000000..eb857bb2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW2_sL2/target_lvs.spice @@ -0,0 +1,18 @@ +.subckt C01_gf180_sW2_sL2 VSS IB1 IOUT1 +MM1_f0 IB1 IB1 VSS VSS nfet_03v3 w=0.5u l=2.24u +MM1_f1 IB1 IB1 VSS VSS nfet_03v3 w=0.5u l=2.24u +MM1_f2 IB1 IB1 VSS VSS nfet_03v3 w=0.5u l=2.24u +MM1_f3 IB1 IB1 VSS VSS nfet_03v3 w=0.5u l=2.24u +MM1_f4 IB1 IB1 VSS VSS nfet_03v3 w=0.5u l=2.24u +MM1_f5 IB1 IB1 VSS VSS nfet_03v3 w=0.5u l=2.24u +MM1_f6 IB1 IB1 VSS VSS nfet_03v3 w=0.5u l=2.24u +MM1_f7 IB1 IB1 VSS VSS nfet_03v3 w=0.5u l=2.24u +MM2_f0 IOUT1 IB1 VSS VSS nfet_03v3 w=0.5u l=2.24u +MM2_f1 IOUT1 IB1 VSS VSS nfet_03v3 w=0.5u l=2.24u +MM2_f2 IOUT1 IB1 VSS VSS nfet_03v3 w=0.5u l=2.24u +MM2_f3 IOUT1 IB1 VSS VSS nfet_03v3 w=0.5u l=2.24u +MM2_f4 IOUT1 IB1 VSS VSS nfet_03v3 w=0.5u l=2.24u +MM2_f5 IOUT1 IB1 VSS VSS nfet_03v3 w=0.5u l=2.24u +MM2_f6 IOUT1 IB1 VSS VSS nfet_03v3 w=0.5u l=2.24u +MM2_f7 IOUT1 IB1 VSS VSS nfet_03v3 w=0.5u l=2.24u +.ends C01_gf180_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C01/gf180/sW2_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW2_sL2/testbench.spice new file mode 100644 index 00000000..a99e3c4f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/gf180/sW2_sL2/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IB1 IOUT1 C01_gf180_sW2_sL2 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIB1 VDDB IB1 2e-05 +.nodeset v(IB1)=0.99 + +VOUT IOUT1 0 3.3 +.control +dc VOUT 3.3 0 -0.00825 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=1.81 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.05 cross=last +meas dc dev_at_vdd find dev at=3.2835 +let gout = deriv(iout) +meas dc gout_t find gout at=1.81 +let rout_v = 1/gout +meas dc rout_t find rout_v at=1.81 +echo vout_test = 1.81 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW0.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW0.5_sL1.5/case.json new file mode 100644 index 00000000..4621dcb1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW0.5_sL1.5/case.json @@ -0,0 +1,105 @@ +{ + "case_id": "C01_ihp130_sW0.5_sL1.5", + "circuit_id": "C01", + "pdk": "ihp130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "dut_name": "C01_ihp130_sW0.5_sL1.5", + "ports": [ + "VSS", + "IB1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 1.0, + "l": 1.56, + "nf": 2 + }, + "M2": { + "w": 1.0, + "l": 1.56, + "nf": 2 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 0.6, + "tol": 0.05, + "vout_test": 0.8 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.56, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.56, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "04391e35aef9ecf6", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW0.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW0.5_sL1.5/manifest.json new file mode 100644 index 00000000..b6bfbf2c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW0.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "a1e43dadb6ef3a992c956e9a32fc6ce166ccb1b6e1f839272e77265c0e423521", + "qualification.json": "6c7e61a3035e37651a20f22ea3d07cdc3380ce4c16e86844f3b8a7ba6b9531bd", + "specs.json": "60d93a2f979a84a6f93f66e48d3b37197f52f6d5606be14abae57c6cc32e94f9", + "target.spice": "bdd6202aec8b89a105aec3c8982c330337be77e9679a66e1573d60427efff3fb", + "target_lvs.spice": "d1880fc1151fdd6f5017d2d5b0ba58aa7802b4595f1586dcd125b66311ca9ee5", + "testbench.spice": "67c3b19cb2a361aded02664979155b72abe1b26ad706f5445cc15057939d5dc9" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW0.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW0.5_sL1.5/qualification.json new file mode 100644 index 00000000..9984fe34 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW0.5_sL1.5/qualification.json @@ -0,0 +1,91 @@ +{ + "case_id": "C01_ihp130_sW0.5_sL1.5", + "circuit_id": "C01", + "pdk": "ihp130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.56, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.56, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "04391e35aef9ecf6", + "mirror_pass1": { + "vmin": 0.3936066, + "status": "passed", + "vout_test": 0.8 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.42 + }, + "_frozen_from": { + "schematic": { + "err": 0.015862, + "vmin": 0.3936066 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.42 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.2, + "schematic_measures": { + "iout_t": 2.031724e-05, + "err": 0.015862, + "vmin": 0.3936066, + "dev_at_vdd": 0.05496639, + "gout_t": 2.345381e-06, + "rout_t": 426370.8, + "vout_test": 0.8, + "rout_nom": 426370.8, + "ok_at_vdd": 0.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW0.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW0.5_sL1.5/specs.json new file mode 100644 index 00000000..8eeb132a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW0.5_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.42 + }, + "_frozen_from": { + "schematic": { + "err": 0.015862, + "vmin": 0.3936066 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.42 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW0.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW0.5_sL1.5/target.spice new file mode 100644 index 00000000..bdc6ffeb --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW0.5_sL1.5/target.spice @@ -0,0 +1,4 @@ +.subckt C01_ihp130_sW0.5_sL1.5 VSS IB1 IOUT1 +XM1 IB1 IB1 VSS VSS sg13_lv_nmos w=1u l=1.56u ng=2 m=1 +XM2 IOUT1 IB1 VSS VSS sg13_lv_nmos w=1u l=1.56u ng=2 m=1 +.ends C01_ihp130_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW0.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW0.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..775ee623 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW0.5_sL1.5/target_lvs.spice @@ -0,0 +1,6 @@ +.subckt C01_ihp130_sW0.5_sL1.5 VSS IB1 IOUT1 +XM1_f0 IB1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=1.56u +XM1_f1 IB1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=1.56u +XM2_f0 IOUT1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=1.56u +XM2_f1 IOUT1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=1.56u +.ends C01_ihp130_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW0.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW0.5_sL1.5/testbench.spice new file mode 100644 index 00000000..576f97bb --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW0.5_sL1.5/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IB1 IOUT1 C01_ihp130_sW0.5_sL1.5 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIB1 VDDB IB1 2e-05 +.nodeset v(IB1)=0.36 + +VOUT IOUT1 0 1.2 +.control +dc VOUT 1.2 0 -0.003 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=0.8 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.05 cross=last +meas dc dev_at_vdd find dev at=1.194 +let gout = deriv(iout) +meas dc gout_t find gout at=0.8 +let rout_v = 1/gout +meas dc rout_t find rout_v at=0.8 +echo vout_test = 0.8 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW0.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW0.5_sL1/case.json new file mode 100644 index 00000000..e30aeb82 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW0.5_sL1/case.json @@ -0,0 +1,105 @@ +{ + "case_id": "C01_ihp130_sW0.5_sL1", + "circuit_id": "C01", + "pdk": "ihp130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "dut_name": "C01_ihp130_sW0.5_sL1", + "ports": [ + "VSS", + "IB1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 1.0, + "l": 1.04, + "nf": 2 + }, + "M2": { + "w": 1.0, + "l": 1.04, + "nf": 2 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 0.6, + "tol": 0.05, + "vout_test": 0.79 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.04, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.04, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "9a13ef4413250202", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW0.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW0.5_sL1/manifest.json new file mode 100644 index 00000000..924b30fb --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW0.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "45faf47dec2bdf3d87627e420f2e439614165bb1d2dc9f99ca5370816490d9a8", + "qualification.json": "93f08a80ed4206541eb4727c4ebcd2040ed2a927ed729c517809867e2dac0c66", + "specs.json": "bf1005cd55bd4822f27d71b6ae5d23ff281a47ebd837ed6c7297e50014ea609c", + "target.spice": "6a3d100593fec6fa7ec44eb61de68ccda212297add31132bf1d35140397d824b", + "target_lvs.spice": "8003b69e1abd3a7f25f460a56c7bbc39dc6ecc7bafb1495d6fa49e823c630357", + "testbench.spice": "c9c903ba745808f711ca8d35134adc84f1b823c3d3e601b4c3eb1ca38f09ddfa" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW0.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW0.5_sL1/qualification.json new file mode 100644 index 00000000..4605d077 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW0.5_sL1/qualification.json @@ -0,0 +1,91 @@ +{ + "case_id": "C01_ihp130_sW0.5_sL1", + "circuit_id": "C01", + "pdk": "ihp130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.04, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.04, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "9a13ef4413250202", + "mirror_pass1": { + "vmin": 0.3824582, + "status": "passed", + "vout_test": 0.79 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.42 + }, + "_frozen_from": { + "schematic": { + "err": 0.0299515, + "vmin": 0.3824582 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.42 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.2, + "schematic_measures": { + "iout_t": 2.059903e-05, + "err": 0.0299515, + "vmin": 0.3824582, + "dev_at_vdd": 0.08277446, + "gout_t": 3.054209e-06, + "rout_t": 327417.5, + "vout_test": 0.79, + "rout_nom": 327417.5, + "ok_at_vdd": 0.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW0.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW0.5_sL1/specs.json new file mode 100644 index 00000000..e58be204 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW0.5_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.42 + }, + "_frozen_from": { + "schematic": { + "err": 0.0299515, + "vmin": 0.3824582 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.42 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW0.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW0.5_sL1/target.spice new file mode 100644 index 00000000..119e01e2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW0.5_sL1/target.spice @@ -0,0 +1,4 @@ +.subckt C01_ihp130_sW0.5_sL1 VSS IB1 IOUT1 +XM1 IB1 IB1 VSS VSS sg13_lv_nmos w=1u l=1.04u ng=2 m=1 +XM2 IOUT1 IB1 VSS VSS sg13_lv_nmos w=1u l=1.04u ng=2 m=1 +.ends C01_ihp130_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW0.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW0.5_sL1/target_lvs.spice new file mode 100644 index 00000000..4f1d3945 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW0.5_sL1/target_lvs.spice @@ -0,0 +1,6 @@ +.subckt C01_ihp130_sW0.5_sL1 VSS IB1 IOUT1 +XM1_f0 IB1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM1_f1 IB1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM2_f0 IOUT1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM2_f1 IOUT1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +.ends C01_ihp130_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW0.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW0.5_sL1/testbench.spice new file mode 100644 index 00000000..df513521 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW0.5_sL1/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IB1 IOUT1 C01_ihp130_sW0.5_sL1 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIB1 VDDB IB1 2e-05 +.nodeset v(IB1)=0.36 + +VOUT IOUT1 0 1.2 +.control +dc VOUT 1.2 0 -0.003 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=0.79 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.05 cross=last +meas dc dev_at_vdd find dev at=1.194 +let gout = deriv(iout) +meas dc gout_t find gout at=0.79 +let rout_v = 1/gout +meas dc rout_t find rout_v at=0.79 +echo vout_test = 0.79 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW0.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW0.5_sL2/case.json new file mode 100644 index 00000000..d0dfd75b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW0.5_sL2/case.json @@ -0,0 +1,105 @@ +{ + "case_id": "C01_ihp130_sW0.5_sL2", + "circuit_id": "C01", + "pdk": "ihp130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "dut_name": "C01_ihp130_sW0.5_sL2", + "ports": [ + "VSS", + "IB1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 1.0, + "l": 2.08, + "nf": 2 + }, + "M2": { + "w": 1.0, + "l": 2.08, + "nf": 2 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 0.6, + "tol": 0.05, + "vout_test": 0.81 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 2.08, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 2.08, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "eeb5b806a712205f", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW0.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW0.5_sL2/manifest.json new file mode 100644 index 00000000..40b99b68 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW0.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "f064026f69b84f8c88ea8fe52e8db6ca4c8b928d43aad235716291961c6f5ed4", + "qualification.json": "e1eeef6c2a57bbf8572fe7dd8ae4c467839a638c8ccb1ef4dbf621aa761da60e", + "specs.json": "7d8ef31810a27cd6ab34bf5c4d1a328ab1840515a98fc84b480fb525d7ab4d05", + "target.spice": "226668ed1d377d2e29f294b4e71a30724439210c2992e621356a5bd50b53333b", + "target_lvs.spice": "5f9b602c3f3207cf51588f77c2ed55816416a9a051dbc810e81ddc04b60063f9", + "testbench.spice": "fa87c11ff218928c2378ec546bba18b6692aad043ecb6caffeed53cc73daa5d9" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW0.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW0.5_sL2/qualification.json new file mode 100644 index 00000000..6cc8fa7d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW0.5_sL2/qualification.json @@ -0,0 +1,91 @@ +{ + "case_id": "C01_ihp130_sW0.5_sL2", + "circuit_id": "C01", + "pdk": "ihp130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 2.08, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 2.08, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "eeb5b806a712205f", + "mirror_pass1": { + "vmin": 0.4148405, + "status": "passed", + "vout_test": 0.81 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.42 + }, + "_frozen_from": { + "schematic": { + "err": 0.008108, + "vmin": 0.4148405 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.42 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.2, + "schematic_measures": { + "iout_t": 2.016216e-05, + "err": 0.008108, + "vmin": 0.4148405, + "dev_at_vdd": 0.03965959, + "gout_t": 1.958164e-06, + "rout_t": 510682.6, + "vout_test": 0.81, + "rout_nom": 510682.6, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW0.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW0.5_sL2/specs.json new file mode 100644 index 00000000..da7306b8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW0.5_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.42 + }, + "_frozen_from": { + "schematic": { + "err": 0.008108, + "vmin": 0.4148405 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.42 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW0.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW0.5_sL2/target.spice new file mode 100644 index 00000000..814b4841 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW0.5_sL2/target.spice @@ -0,0 +1,4 @@ +.subckt C01_ihp130_sW0.5_sL2 VSS IB1 IOUT1 +XM1 IB1 IB1 VSS VSS sg13_lv_nmos w=1u l=2.08u ng=2 m=1 +XM2 IOUT1 IB1 VSS VSS sg13_lv_nmos w=1u l=2.08u ng=2 m=1 +.ends C01_ihp130_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW0.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW0.5_sL2/target_lvs.spice new file mode 100644 index 00000000..4837f875 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW0.5_sL2/target_lvs.spice @@ -0,0 +1,6 @@ +.subckt C01_ihp130_sW0.5_sL2 VSS IB1 IOUT1 +XM1_f0 IB1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM1_f1 IB1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM2_f0 IOUT1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM2_f1 IOUT1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=2.08u +.ends C01_ihp130_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW0.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW0.5_sL2/testbench.spice new file mode 100644 index 00000000..27eb2e40 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW0.5_sL2/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IB1 IOUT1 C01_ihp130_sW0.5_sL2 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIB1 VDDB IB1 2e-05 +.nodeset v(IB1)=0.36 + +VOUT IOUT1 0 1.2 +.control +dc VOUT 1.2 0 -0.003 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=0.81 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.05 cross=last +meas dc dev_at_vdd find dev at=1.194 +let gout = deriv(iout) +meas dc gout_t find gout at=0.81 +let rout_v = 1/gout +meas dc rout_t find rout_v at=0.81 +echo vout_test = 0.81 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1.5_sL1.5/case.json new file mode 100644 index 00000000..7cab4a41 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1.5_sL1.5/case.json @@ -0,0 +1,105 @@ +{ + "case_id": "C01_ihp130_sW1.5_sL1.5", + "circuit_id": "C01", + "pdk": "ihp130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "dut_name": "C01_ihp130_sW1.5_sL1.5", + "ports": [ + "VSS", + "IB1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 3.0, + "l": 1.56, + "nf": 6 + }, + "M2": { + "w": 3.0, + "l": 1.56, + "nf": 6 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 0.6, + "tol": 0.05, + "vout_test": 0.75 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.56, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.56, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "ae219fd8159ea3d6", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1.5_sL1.5/manifest.json new file mode 100644 index 00000000..75bb1225 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "01da2f13dff37855ca27e37bf3ba44dc19e1b725635ab22418118f1f7df8281b", + "qualification.json": "c14f02ada77a43f9d9ddac7a369d7decc7f04d3a5854d529e3619fc4f01897f1", + "specs.json": "9c53d5327fa5f6f012c87348e8df88fdc8fcf6787f125fbd9d710e9a9e89a8f2", + "target.spice": "e9d6816c44d02c244c5bfdc59bdbe47b1f44f480d485e8b29978fab6304ebc48", + "target_lvs.spice": "05ad610d1c6593da809499c10467b349e8b10ea0fdff2394da00ae2a4ab57c86", + "testbench.spice": "b5bb12042eb517b36cf255bf2a566530cbf927585e409497ce0e22ca23fe565a" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1.5_sL1.5/qualification.json new file mode 100644 index 00000000..24bdd1c1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1.5_sL1.5/qualification.json @@ -0,0 +1,93 @@ +{ + "case_id": "C01_ihp130_sW1.5_sL1.5", + "circuit_id": "C01", + "pdk": "ihp130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.56, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.56, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "ae219fd8159ea3d6", + "mirror_pass1": { + "vmin": 0.2958726, + "status": "passed", + "vout_test": 0.75 + }, + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "|err|=0.05134 above floor 0.05" + ], + "spec": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.3959 + }, + "_frozen_from": { + "schematic": { + "err": 0.0513445, + "vmin": 0.2958726 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.42 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.4, + "schematic_measures": { + "iout_t": 2.102689e-05, + "err": 0.0513445, + "vmin": 0.2958726, + "dev_at_vdd": 0.1172686, + "gout_t": 3.47955e-06, + "rout_t": 287393.4, + "vout_test": 0.75, + "rout_nom": 287393.4, + "ok_at_vdd": 0.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1.5_sL1.5/specs.json new file mode 100644 index 00000000..a7c9f0b3 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1.5_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.3959 + }, + "_frozen_from": { + "schematic": { + "err": 0.0513445, + "vmin": 0.2958726 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.42 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1.5_sL1.5/target.spice new file mode 100644 index 00000000..d7b5f7ad --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1.5_sL1.5/target.spice @@ -0,0 +1,4 @@ +.subckt C01_ihp130_sW1.5_sL1.5 VSS IB1 IOUT1 +XM1 IB1 IB1 VSS VSS sg13_lv_nmos w=3u l=1.56u ng=6 m=1 +XM2 IOUT1 IB1 VSS VSS sg13_lv_nmos w=3u l=1.56u ng=6 m=1 +.ends C01_ihp130_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..09b8cd56 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1.5_sL1.5/target_lvs.spice @@ -0,0 +1,14 @@ +.subckt C01_ihp130_sW1.5_sL1.5 VSS IB1 IOUT1 +XM1_f0 IB1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=1.56u +XM1_f1 IB1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=1.56u +XM1_f2 IB1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=1.56u +XM1_f3 IB1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=1.56u +XM1_f4 IB1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=1.56u +XM1_f5 IB1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=1.56u +XM2_f0 IOUT1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=1.56u +XM2_f1 IOUT1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=1.56u +XM2_f2 IOUT1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=1.56u +XM2_f3 IOUT1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=1.56u +XM2_f4 IOUT1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=1.56u +XM2_f5 IOUT1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=1.56u +.ends C01_ihp130_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1.5_sL1.5/testbench.spice new file mode 100644 index 00000000..2535ef32 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1.5_sL1.5/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IB1 IOUT1 C01_ihp130_sW1.5_sL1.5 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIB1 VDDB IB1 2e-05 +.nodeset v(IB1)=0.36 + +VOUT IOUT1 0 1.2 +.control +dc VOUT 1.2 0 -0.003 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=0.75 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.05 cross=last +meas dc dev_at_vdd find dev at=1.194 +let gout = deriv(iout) +meas dc gout_t find gout at=0.75 +let rout_v = 1/gout +meas dc rout_t find rout_v at=0.75 +echo vout_test = 0.75 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1.5_sL1/case.json new file mode 100644 index 00000000..fd9b1353 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1.5_sL1/case.json @@ -0,0 +1,105 @@ +{ + "case_id": "C01_ihp130_sW1.5_sL1", + "circuit_id": "C01", + "pdk": "ihp130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "dut_name": "C01_ihp130_sW1.5_sL1", + "ports": [ + "VSS", + "IB1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 3.0, + "l": 1.04, + "nf": 6 + }, + "M2": { + "w": 3.0, + "l": 1.04, + "nf": 6 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 0.6, + "tol": 0.05, + "vout_test": 0.75 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.04, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.04, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "d5d7a3931da3560e", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1.5_sL1/manifest.json new file mode 100644 index 00000000..c1b2ba0c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "055680988e147ee9b27b3d48a2675682319af7421ec41d9ffa71f4727fe565ad", + "qualification.json": "846c03dbef2db15b8dec8aedd374e5b3159ae38c72855c563415202b74392b60", + "specs.json": "88cb4832e3eb0c2db5cb7d06e5fad27af54876a74d541e48bed9f80106db1af3", + "target.spice": "a8240571a7433b9df70647a8df90fd050793238eb0201c1257296d789ac19254", + "target_lvs.spice": "4abd1036e0cf436a533ffdbeae6289d739395e9ba75dac0fdb5e0d346f6b0f08", + "testbench.spice": "a741c1b112b6eaa2d948703f22eb79839fb82d0738bf9346701394412481ad31" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1.5_sL1/qualification.json new file mode 100644 index 00000000..5b839d36 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1.5_sL1/qualification.json @@ -0,0 +1,93 @@ +{ + "case_id": "C01_ihp130_sW1.5_sL1", + "circuit_id": "C01", + "pdk": "ihp130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.04, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.04, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "d5d7a3931da3560e", + "mirror_pass1": { + "vmin": 0.3035163, + "status": "passed", + "vout_test": 0.75 + }, + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "|err|=0.07675 above floor 0.05" + ], + "spec": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.4035 + }, + "_frozen_from": { + "schematic": { + "err": 0.0767505, + "vmin": 0.3035163 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.42 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.4, + "schematic_measures": { + "iout_t": 2.153501e-05, + "err": 0.0767505, + "vmin": 0.3035163, + "dev_at_vdd": 0.1651087, + "gout_t": 4.602516e-06, + "rout_t": 217272.4, + "vout_test": 0.75, + "rout_nom": 217272.4, + "ok_at_vdd": 0.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1.5_sL1/specs.json new file mode 100644 index 00000000..62276d74 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1.5_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.4035 + }, + "_frozen_from": { + "schematic": { + "err": 0.0767505, + "vmin": 0.3035163 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.42 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1.5_sL1/target.spice new file mode 100644 index 00000000..de4f8540 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1.5_sL1/target.spice @@ -0,0 +1,4 @@ +.subckt C01_ihp130_sW1.5_sL1 VSS IB1 IOUT1 +XM1 IB1 IB1 VSS VSS sg13_lv_nmos w=3u l=1.04u ng=6 m=1 +XM2 IOUT1 IB1 VSS VSS sg13_lv_nmos w=3u l=1.04u ng=6 m=1 +.ends C01_ihp130_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1.5_sL1/target_lvs.spice new file mode 100644 index 00000000..f5d1c6e5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1.5_sL1/target_lvs.spice @@ -0,0 +1,14 @@ +.subckt C01_ihp130_sW1.5_sL1 VSS IB1 IOUT1 +XM1_f0 IB1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM1_f1 IB1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM1_f2 IB1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM1_f3 IB1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM1_f4 IB1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM1_f5 IB1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM2_f0 IOUT1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM2_f1 IOUT1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM2_f2 IOUT1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM2_f3 IOUT1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM2_f4 IOUT1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM2_f5 IOUT1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +.ends C01_ihp130_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1.5_sL1/testbench.spice new file mode 100644 index 00000000..2ed0e289 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1.5_sL1/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IB1 IOUT1 C01_ihp130_sW1.5_sL1 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIB1 VDDB IB1 2e-05 +.nodeset v(IB1)=0.36 + +VOUT IOUT1 0 1.2 +.control +dc VOUT 1.2 0 -0.003 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=0.75 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.05 cross=last +meas dc dev_at_vdd find dev at=1.194 +let gout = deriv(iout) +meas dc gout_t find gout at=0.75 +let rout_v = 1/gout +meas dc rout_t find rout_v at=0.75 +echo vout_test = 0.75 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1.5_sL2/case.json new file mode 100644 index 00000000..18923543 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1.5_sL2/case.json @@ -0,0 +1,105 @@ +{ + "case_id": "C01_ihp130_sW1.5_sL2", + "circuit_id": "C01", + "pdk": "ihp130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "dut_name": "C01_ihp130_sW1.5_sL2", + "ports": [ + "VSS", + "IB1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 3.0, + "l": 2.08, + "nf": 6 + }, + "M2": { + "w": 3.0, + "l": 2.08, + "nf": 6 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 0.6, + "tol": 0.05, + "vout_test": 0.75 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 2.08, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 2.08, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "0acba9963926f8dc", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1.5_sL2/manifest.json new file mode 100644 index 00000000..858b1030 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "ce4f7e6e53461a59e5a2637a2d615b38bdf369b12424ca93b104651138291eee", + "qualification.json": "c02447680e1d570aa2fd17b983c639d01d2fbf2e31865266b2e5cada221fcf5d", + "specs.json": "3c49c6525856aa87b11450249611aa71876dc651c05ac45853f4a48958f57622", + "target.spice": "cd7f052a5d0140ac42f3919ae7840228d0bbb9f0ddfb86340d58582fce0dec99", + "target_lvs.spice": "3fc63e6979340a1a69c02adcf49f4e20c5e1763c6b839d002efe8adb5ac0f40c", + "testbench.spice": "c05ee3948685236662908b56f425ecddbab0b8e9ee2e632fdd53706f715d07bc" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1.5_sL2/qualification.json new file mode 100644 index 00000000..b388e6f5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1.5_sL2/qualification.json @@ -0,0 +1,91 @@ +{ + "case_id": "C01_ihp130_sW1.5_sL2", + "circuit_id": "C01", + "pdk": "ihp130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 2.08, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 2.08, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "0acba9963926f8dc", + "mirror_pass1": { + "vmin": 0.2946816, + "status": "passed", + "vout_test": 0.75 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.3947 + }, + "_frozen_from": { + "schematic": { + "err": 0.0369945, + "vmin": 0.2946816 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.42 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.4, + "schematic_measures": { + "iout_t": 2.073989e-05, + "err": 0.0369945, + "vmin": 0.2946816, + "dev_at_vdd": 0.0906925, + "gout_t": 2.862879e-06, + "rout_t": 349298.7, + "vout_test": 0.75, + "rout_nom": 349298.7, + "ok_at_vdd": 0.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1.5_sL2/specs.json new file mode 100644 index 00000000..bc581a45 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1.5_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.3947 + }, + "_frozen_from": { + "schematic": { + "err": 0.0369945, + "vmin": 0.2946816 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.42 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1.5_sL2/target.spice new file mode 100644 index 00000000..8a303a18 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1.5_sL2/target.spice @@ -0,0 +1,4 @@ +.subckt C01_ihp130_sW1.5_sL2 VSS IB1 IOUT1 +XM1 IB1 IB1 VSS VSS sg13_lv_nmos w=3u l=2.08u ng=6 m=1 +XM2 IOUT1 IB1 VSS VSS sg13_lv_nmos w=3u l=2.08u ng=6 m=1 +.ends C01_ihp130_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1.5_sL2/target_lvs.spice new file mode 100644 index 00000000..f9b3b203 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1.5_sL2/target_lvs.spice @@ -0,0 +1,14 @@ +.subckt C01_ihp130_sW1.5_sL2 VSS IB1 IOUT1 +XM1_f0 IB1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM1_f1 IB1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM1_f2 IB1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM1_f3 IB1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM1_f4 IB1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM1_f5 IB1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM2_f0 IOUT1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM2_f1 IOUT1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM2_f2 IOUT1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM2_f3 IOUT1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM2_f4 IOUT1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM2_f5 IOUT1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=2.08u +.ends C01_ihp130_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1.5_sL2/testbench.spice new file mode 100644 index 00000000..5fbf61c8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1.5_sL2/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IB1 IOUT1 C01_ihp130_sW1.5_sL2 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIB1 VDDB IB1 2e-05 +.nodeset v(IB1)=0.36 + +VOUT IOUT1 0 1.2 +.control +dc VOUT 1.2 0 -0.003 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=0.75 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.05 cross=last +meas dc dev_at_vdd find dev at=1.194 +let gout = deriv(iout) +meas dc gout_t find gout at=0.75 +let rout_v = 1/gout +meas dc rout_t find rout_v at=0.75 +echo vout_test = 0.75 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1_sL1.5/case.json new file mode 100644 index 00000000..cf02e0a6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1_sL1.5/case.json @@ -0,0 +1,105 @@ +{ + "case_id": "C01_ihp130_sW1_sL1.5", + "circuit_id": "C01", + "pdk": "ihp130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "dut_name": "C01_ihp130_sW1_sL1.5", + "ports": [ + "VSS", + "IB1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 1.56, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 1.56, + "nf": 4 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 0.6, + "tol": 0.05, + "vout_test": 0.76 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "5858574cc97f6612", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1_sL1.5/manifest.json new file mode 100644 index 00000000..38331610 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "eba7e9fe30a7acde5a2270b37496339d92cf93d582219211ebf6304464f07f79", + "qualification.json": "2c78f671176b4eef87822a6bcfc1b8dec8ce96d0d7a95ed7e7adcc0d26a25ea4", + "specs.json": "f3217c1d1c6f99b3585374ddc7c29395b454dc610d14d29c3f65a20551d1b66e", + "target.spice": "a5d2728c778967a4da747c5ab8eb155b7105154542fbb6ad24e38823f6274bfd", + "target_lvs.spice": "64286f2df3c8b58acea151d0641c298d3b10532634164ea35910eeb4af8889e5", + "testbench.spice": "07172f9c6ba390660e948abd79394350e363b4587ef01cb66c20ca71a35688c2" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1_sL1.5/qualification.json new file mode 100644 index 00000000..aa9c728d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1_sL1.5/qualification.json @@ -0,0 +1,91 @@ +{ + "case_id": "C01_ihp130_sW1_sL1.5", + "circuit_id": "C01", + "pdk": "ihp130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "5858574cc97f6612", + "mirror_pass1": { + "vmin": 0.3235503, + "status": "passed", + "vout_test": 0.76 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.42 + }, + "_frozen_from": { + "schematic": { + "err": 0.0356015, + "vmin": 0.3235503 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.42 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.3, + "schematic_measures": { + "iout_t": 2.071203e-05, + "err": 0.0356015, + "vmin": 0.3235503, + "dev_at_vdd": 0.09082531, + "gout_t": 2.99952e-06, + "rout_t": 333387.2, + "vout_test": 0.76, + "rout_nom": 333387.2, + "ok_at_vdd": 0.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1_sL1.5/specs.json new file mode 100644 index 00000000..a78e44dc --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.42 + }, + "_frozen_from": { + "schematic": { + "err": 0.0356015, + "vmin": 0.3235503 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.42 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1_sL1.5/target.spice new file mode 100644 index 00000000..ae77c3da --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1_sL1.5/target.spice @@ -0,0 +1,4 @@ +.subckt C01_ihp130_sW1_sL1.5 VSS IB1 IOUT1 +XM1 IB1 IB1 VSS VSS sg13_lv_nmos w=2u l=1.56u ng=4 m=1 +XM2 IOUT1 IB1 VSS VSS sg13_lv_nmos w=2u l=1.56u ng=4 m=1 +.ends C01_ihp130_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1_sL1.5/target_lvs.spice new file mode 100644 index 00000000..d35427d8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1_sL1.5/target_lvs.spice @@ -0,0 +1,10 @@ +.subckt C01_ihp130_sW1_sL1.5 VSS IB1 IOUT1 +XM1_f0 IB1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=1.56u +XM1_f1 IB1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=1.56u +XM1_f2 IB1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=1.56u +XM1_f3 IB1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=1.56u +XM2_f0 IOUT1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=1.56u +XM2_f1 IOUT1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=1.56u +XM2_f2 IOUT1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=1.56u +XM2_f3 IOUT1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=1.56u +.ends C01_ihp130_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1_sL1.5/testbench.spice new file mode 100644 index 00000000..f1609c8f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1_sL1.5/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IB1 IOUT1 C01_ihp130_sW1_sL1.5 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIB1 VDDB IB1 2e-05 +.nodeset v(IB1)=0.36 + +VOUT IOUT1 0 1.2 +.control +dc VOUT 1.2 0 -0.003 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=0.76 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.05 cross=last +meas dc dev_at_vdd find dev at=1.194 +let gout = deriv(iout) +meas dc gout_t find gout at=0.76 +let rout_v = 1/gout +meas dc rout_t find rout_v at=0.76 +echo vout_test = 0.76 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1_sL1/case.json new file mode 100644 index 00000000..84ef1dba --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1_sL1/case.json @@ -0,0 +1,105 @@ +{ + "case_id": "C01_ihp130_sW1_sL1", + "circuit_id": "C01", + "pdk": "ihp130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "dut_name": "C01_ihp130_sW1_sL1", + "ports": [ + "VSS", + "IB1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 1.04, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 1.04, + "nf": 4 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 0.6, + "tol": 0.05, + "vout_test": 0.76 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.04, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.04, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "9a1b25496b543424", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1_sL1/manifest.json new file mode 100644 index 00000000..5c56f690 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "5fa7daa0fa6e25618273b2eb0661d61fdd423800db87babbc8de40ff2df296b3", + "qualification.json": "0af61c1c9dd0957c7391177c9b850102d81ef76250343c31d1929016bd242c23", + "specs.json": "93fab3fdf043cfc9668803685769465d452380646751e79fa1749c02b1a49eac", + "target.spice": "e0e46b9e4b5a76dd84f5a2cbf01f19ad402cc9090a824f428b0c4c544b9d0e1e", + "target_lvs.spice": "bacfb8a65214dbff65d103e51c0e277a7e1b3903b2c43e2873b791189a970bf8", + "testbench.spice": "b90aeb050eded4cf850a24267d703f918f0a1a3de0fd45c5889b56361c4080ec" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1_sL1/qualification.json new file mode 100644 index 00000000..87c6d895 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1_sL1/qualification.json @@ -0,0 +1,93 @@ +{ + "case_id": "C01_ihp130_sW1_sL1", + "circuit_id": "C01", + "pdk": "ihp130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.04, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.04, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "9a1b25496b543424", + "mirror_pass1": { + "vmin": 0.3270033, + "status": "passed", + "vout_test": 0.76 + }, + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "|err|=0.05651 above floor 0.05" + ], + "spec": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.42 + }, + "_frozen_from": { + "schematic": { + "err": 0.056512, + "vmin": 0.3270033 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.42 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.3, + "schematic_measures": { + "iout_t": 2.113024e-05, + "err": 0.056512, + "vmin": 0.3270033, + "dev_at_vdd": 0.1301068, + "gout_t": 3.940946e-06, + "rout_t": 253746.5, + "vout_test": 0.76, + "rout_nom": 253746.5, + "ok_at_vdd": 0.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1_sL1/specs.json new file mode 100644 index 00000000..da0c41c0 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.42 + }, + "_frozen_from": { + "schematic": { + "err": 0.056512, + "vmin": 0.3270033 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.42 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1_sL1/target.spice new file mode 100644 index 00000000..949f3a55 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1_sL1/target.spice @@ -0,0 +1,4 @@ +.subckt C01_ihp130_sW1_sL1 VSS IB1 IOUT1 +XM1 IB1 IB1 VSS VSS sg13_lv_nmos w=2u l=1.04u ng=4 m=1 +XM2 IOUT1 IB1 VSS VSS sg13_lv_nmos w=2u l=1.04u ng=4 m=1 +.ends C01_ihp130_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1_sL1/target_lvs.spice new file mode 100644 index 00000000..3c7af76c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1_sL1/target_lvs.spice @@ -0,0 +1,10 @@ +.subckt C01_ihp130_sW1_sL1 VSS IB1 IOUT1 +XM1_f0 IB1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM1_f1 IB1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM1_f2 IB1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM1_f3 IB1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM2_f0 IOUT1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM2_f1 IOUT1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM2_f2 IOUT1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM2_f3 IOUT1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +.ends C01_ihp130_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1_sL1/testbench.spice new file mode 100644 index 00000000..abaf8051 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1_sL1/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IB1 IOUT1 C01_ihp130_sW1_sL1 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIB1 VDDB IB1 2e-05 +.nodeset v(IB1)=0.36 + +VOUT IOUT1 0 1.2 +.control +dc VOUT 1.2 0 -0.003 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=0.76 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.05 cross=last +meas dc dev_at_vdd find dev at=1.194 +let gout = deriv(iout) +meas dc gout_t find gout at=0.76 +let rout_v = 1/gout +meas dc rout_t find rout_v at=0.76 +echo vout_test = 0.76 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1_sL2/case.json new file mode 100644 index 00000000..b02989e7 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1_sL2/case.json @@ -0,0 +1,105 @@ +{ + "case_id": "C01_ihp130_sW1_sL2", + "circuit_id": "C01", + "pdk": "ihp130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "dut_name": "C01_ihp130_sW1_sL2", + "ports": [ + "VSS", + "IB1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 2.08, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 2.08, + "nf": 4 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 0.6, + "tol": 0.05, + "vout_test": 0.76 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 2.08, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 2.08, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "f53b5292532a26d3", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1_sL2/manifest.json new file mode 100644 index 00000000..64bba0ad --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "446df06bb8e71003457ce3a8bfc066f51af8b58d286a08d3f5c4991110e82403", + "qualification.json": "54a00fe3820f04f3be47e4cc2b4d4db719f03eb48dff7490906a2a67d6cd59d6", + "specs.json": "80ed1ca72ac1fe44229d708e14a916fe6019f1bb2c9a6311b7e7c573d45cc54f", + "target.spice": "d5887ae976ae827f9c7cfe4a8fe121d5e408b9a65bcc233cee169e08abe1ec79", + "target_lvs.spice": "411caadbfda6df0f85d4507a4bfb7ce5291bfde004793f6e9a2c2ee258ac7c23", + "testbench.spice": "523a47cf6dfd2815239a97db4a11edbd8fd5514df461705442b0bee4b64dea18" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1_sL2/qualification.json new file mode 100644 index 00000000..4b98f279 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1_sL2/qualification.json @@ -0,0 +1,91 @@ +{ + "case_id": "C01_ihp130_sW1_sL2", + "circuit_id": "C01", + "pdk": "ihp130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 2.08, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 2.08, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "f53b5292532a26d3", + "mirror_pass1": { + "vmin": 0.3285227, + "status": "passed", + "vout_test": 0.76 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.42 + }, + "_frozen_from": { + "schematic": { + "err": 0.023855, + "vmin": 0.3285227 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.42 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.3, + "schematic_measures": { + "iout_t": 2.04771e-05, + "err": 0.023855, + "vmin": 0.3285227, + "dev_at_vdd": 0.06910039, + "gout_t": 2.48508e-06, + "rout_t": 402402.2, + "vout_test": 0.76, + "rout_nom": 402402.2, + "ok_at_vdd": 0.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1_sL2/specs.json new file mode 100644 index 00000000..3d58021f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.42 + }, + "_frozen_from": { + "schematic": { + "err": 0.023855, + "vmin": 0.3285227 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.42 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1_sL2/target.spice new file mode 100644 index 00000000..a31894ea --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1_sL2/target.spice @@ -0,0 +1,4 @@ +.subckt C01_ihp130_sW1_sL2 VSS IB1 IOUT1 +XM1 IB1 IB1 VSS VSS sg13_lv_nmos w=2u l=2.08u ng=4 m=1 +XM2 IOUT1 IB1 VSS VSS sg13_lv_nmos w=2u l=2.08u ng=4 m=1 +.ends C01_ihp130_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1_sL2/target_lvs.spice new file mode 100644 index 00000000..c9268e0e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1_sL2/target_lvs.spice @@ -0,0 +1,10 @@ +.subckt C01_ihp130_sW1_sL2 VSS IB1 IOUT1 +XM1_f0 IB1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM1_f1 IB1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM1_f2 IB1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM1_f3 IB1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM2_f0 IOUT1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM2_f1 IOUT1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM2_f2 IOUT1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM2_f3 IOUT1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=2.08u +.ends C01_ihp130_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1_sL2/testbench.spice new file mode 100644 index 00000000..d7409ada --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW1_sL2/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IB1 IOUT1 C01_ihp130_sW1_sL2 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIB1 VDDB IB1 2e-05 +.nodeset v(IB1)=0.36 + +VOUT IOUT1 0 1.2 +.control +dc VOUT 1.2 0 -0.003 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=0.76 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.05 cross=last +meas dc dev_at_vdd find dev at=1.194 +let gout = deriv(iout) +meas dc gout_t find gout at=0.76 +let rout_v = 1/gout +meas dc rout_t find rout_v at=0.76 +echo vout_test = 0.76 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW2_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW2_sL1.5/case.json new file mode 100644 index 00000000..ca68cab4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW2_sL1.5/case.json @@ -0,0 +1,105 @@ +{ + "case_id": "C01_ihp130_sW2_sL1.5", + "circuit_id": "C01", + "pdk": "ihp130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "dut_name": "C01_ihp130_sW2_sL1.5", + "ports": [ + "VSS", + "IB1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 1.56, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 1.56, + "nf": 8 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 0.6, + "tol": 0.05, + "vout_test": 0.74 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "ee72d3c9a1719555", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW2_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW2_sL1.5/manifest.json new file mode 100644 index 00000000..fe2cb9cb --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW2_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "eb8f6345d913587ae0e6d75f22095a2553278422d874a1b0dbc42810d91a9007", + "qualification.json": "66522bfd1b829e14c5099f74609e5632a455394d093bed46362dcec8c91b9328", + "specs.json": "5afb09e6004cd657d4b295d68ca56fce4ac5cc447cde4cd32317f06a999e1725", + "target.spice": "ea39f920d30fb10d5b8b19527ddecd564b480c2976565b34cc3b57b107dbdc13", + "target_lvs.spice": "6b1694deff88d1284f73d0cb150244554dfcf4846b6a2048732ac9bc7330ae70", + "testbench.spice": "5217fdf967fbf0768e8cd4cf029e8c56c159339063761461210884a008edef3d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW2_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW2_sL1.5/qualification.json new file mode 100644 index 00000000..0a06d6ea --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW2_sL1.5/qualification.json @@ -0,0 +1,93 @@ +{ + "case_id": "C01_ihp130_sW2_sL1.5", + "circuit_id": "C01", + "pdk": "ihp130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "ee72d3c9a1719555", + "mirror_pass1": { + "vmin": 0.2801363, + "status": "passed", + "vout_test": 0.74 + }, + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "|err|=0.06344 above floor 0.05" + ], + "spec": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.3801 + }, + "_frozen_from": { + "schematic": { + "err": 0.0634415, + "vmin": 0.2801363 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.42 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.5, + "schematic_measures": { + "iout_t": 2.126883e-05, + "err": 0.0634415, + "vmin": 0.2801363, + "dev_at_vdd": 0.139056, + "gout_t": 3.894337e-06, + "rout_t": 256783.5, + "vout_test": 0.74, + "rout_nom": 256783.5, + "ok_at_vdd": 0.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW2_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW2_sL1.5/specs.json new file mode 100644 index 00000000..bdcedd58 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW2_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.3801 + }, + "_frozen_from": { + "schematic": { + "err": 0.0634415, + "vmin": 0.2801363 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.42 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW2_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW2_sL1.5/target.spice new file mode 100644 index 00000000..74489446 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW2_sL1.5/target.spice @@ -0,0 +1,4 @@ +.subckt C01_ihp130_sW2_sL1.5 VSS IB1 IOUT1 +XM1 IB1 IB1 VSS VSS sg13_lv_nmos w=4u l=1.56u ng=8 m=1 +XM2 IOUT1 IB1 VSS VSS sg13_lv_nmos w=4u l=1.56u ng=8 m=1 +.ends C01_ihp130_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW2_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW2_sL1.5/target_lvs.spice new file mode 100644 index 00000000..1c3dcb1e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW2_sL1.5/target_lvs.spice @@ -0,0 +1,18 @@ +.subckt C01_ihp130_sW2_sL1.5 VSS IB1 IOUT1 +XM1_f0 IB1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=1.56u +XM1_f1 IB1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=1.56u +XM1_f2 IB1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=1.56u +XM1_f3 IB1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=1.56u +XM1_f4 IB1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=1.56u +XM1_f5 IB1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=1.56u +XM1_f6 IB1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=1.56u +XM1_f7 IB1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=1.56u +XM2_f0 IOUT1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=1.56u +XM2_f1 IOUT1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=1.56u +XM2_f2 IOUT1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=1.56u +XM2_f3 IOUT1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=1.56u +XM2_f4 IOUT1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=1.56u +XM2_f5 IOUT1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=1.56u +XM2_f6 IOUT1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=1.56u +XM2_f7 IOUT1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=1.56u +.ends C01_ihp130_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW2_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW2_sL1.5/testbench.spice new file mode 100644 index 00000000..4407aac1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW2_sL1.5/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IB1 IOUT1 C01_ihp130_sW2_sL1.5 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIB1 VDDB IB1 2e-05 +.nodeset v(IB1)=0.36 + +VOUT IOUT1 0 1.2 +.control +dc VOUT 1.2 0 -0.003 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=0.74 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.05 cross=last +meas dc dev_at_vdd find dev at=1.194 +let gout = deriv(iout) +meas dc gout_t find gout at=0.74 +let rout_v = 1/gout +meas dc rout_t find rout_v at=0.74 +echo vout_test = 0.74 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW2_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW2_sL1/case.json new file mode 100644 index 00000000..04b2b887 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW2_sL1/case.json @@ -0,0 +1,105 @@ +{ + "case_id": "C01_ihp130_sW2_sL1", + "circuit_id": "C01", + "pdk": "ihp130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "dut_name": "C01_ihp130_sW2_sL1", + "ports": [ + "VSS", + "IB1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 1.04, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 1.04, + "nf": 8 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 0.6, + "tol": 0.05, + "vout_test": 0.74 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.04, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.04, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "7afc7b8864ddcc1e", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW2_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW2_sL1/manifest.json new file mode 100644 index 00000000..0501d726 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW2_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "bd0ad5cdb5554761e38917fda36ba12ea39ff5f6778ae8be7e6cffd10ee758c9", + "qualification.json": "35b92aff3d861467aed5629e179ee484e6aad263d72a58647a25db521e167519", + "specs.json": "521609d94f37933751b3850e44d94092ae26a98864a38782949120dbe4ad69fb", + "target.spice": "e3d652b73da4a66c532c2740f6982d357e9d8f6772c089e077312e8839709936", + "target_lvs.spice": "faecd7235e39c1b0ed7dac640175293268e56467597dff8a9995e97b54661081", + "testbench.spice": "19f1fec8a295278483bf69418add01df11bbb3e5817e266892ba0a6e088c85df" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW2_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW2_sL1/qualification.json new file mode 100644 index 00000000..7cfb7f6b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW2_sL1/qualification.json @@ -0,0 +1,93 @@ +{ + "case_id": "C01_ihp130_sW2_sL1", + "circuit_id": "C01", + "pdk": "ihp130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.04, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.04, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "7afc7b8864ddcc1e", + "mirror_pass1": { + "vmin": 0.2894176, + "status": "passed", + "vout_test": 0.74 + }, + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "|err|=0.09228 above floor 0.05" + ], + "spec": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.3894 + }, + "_frozen_from": { + "schematic": { + "err": 0.092279, + "vmin": 0.2894176 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.42 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.5, + "schematic_measures": { + "iout_t": 2.184558e-05, + "err": 0.092279, + "vmin": 0.2894176, + "dev_at_vdd": 0.1938621, + "gout_t": 5.165312e-06, + "rout_t": 193599.4, + "vout_test": 0.74, + "rout_nom": 193599.4, + "ok_at_vdd": 0.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW2_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW2_sL1/specs.json new file mode 100644 index 00000000..59eec3cf --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW2_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.3894 + }, + "_frozen_from": { + "schematic": { + "err": 0.092279, + "vmin": 0.2894176 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.42 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW2_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW2_sL1/target.spice new file mode 100644 index 00000000..6aad1241 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW2_sL1/target.spice @@ -0,0 +1,4 @@ +.subckt C01_ihp130_sW2_sL1 VSS IB1 IOUT1 +XM1 IB1 IB1 VSS VSS sg13_lv_nmos w=4u l=1.04u ng=8 m=1 +XM2 IOUT1 IB1 VSS VSS sg13_lv_nmos w=4u l=1.04u ng=8 m=1 +.ends C01_ihp130_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW2_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW2_sL1/target_lvs.spice new file mode 100644 index 00000000..19e41fbf --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW2_sL1/target_lvs.spice @@ -0,0 +1,18 @@ +.subckt C01_ihp130_sW2_sL1 VSS IB1 IOUT1 +XM1_f0 IB1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM1_f1 IB1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM1_f2 IB1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM1_f3 IB1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM1_f4 IB1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM1_f5 IB1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM1_f6 IB1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM1_f7 IB1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM2_f0 IOUT1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM2_f1 IOUT1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM2_f2 IOUT1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM2_f3 IOUT1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM2_f4 IOUT1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM2_f5 IOUT1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM2_f6 IOUT1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM2_f7 IOUT1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +.ends C01_ihp130_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW2_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW2_sL1/testbench.spice new file mode 100644 index 00000000..a7417416 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW2_sL1/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IB1 IOUT1 C01_ihp130_sW2_sL1 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIB1 VDDB IB1 2e-05 +.nodeset v(IB1)=0.36 + +VOUT IOUT1 0 1.2 +.control +dc VOUT 1.2 0 -0.003 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=0.74 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.05 cross=last +meas dc dev_at_vdd find dev at=1.194 +let gout = deriv(iout) +meas dc gout_t find gout at=0.74 +let rout_v = 1/gout +meas dc rout_t find rout_v at=0.74 +echo vout_test = 0.74 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW2_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW2_sL2/case.json new file mode 100644 index 00000000..03509253 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW2_sL2/case.json @@ -0,0 +1,105 @@ +{ + "case_id": "C01_ihp130_sW2_sL2", + "circuit_id": "C01", + "pdk": "ihp130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "dut_name": "C01_ihp130_sW2_sL2", + "ports": [ + "VSS", + "IB1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 2.08, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 2.08, + "nf": 8 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 0.6, + "tol": 0.05, + "vout_test": 0.74 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 2.08, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 2.08, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "46171163d4eb7b45", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW2_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW2_sL2/manifest.json new file mode 100644 index 00000000..b5a0ed21 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW2_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "1e2376c06b083703ed0312dd8faabd8126618e709e32bd2c774631f9c712911c", + "qualification.json": "a2c199f548e4e234576927d914e611ac9fb9da0078203b19c431972cec51117b", + "specs.json": "c1b8876ace80dcf6114c5c9852a6c8267b4c8320868fd2346527a57627edace8", + "target.spice": "6b9027bc7ca4183df3bb3debaba33b8b8729028fc65bb744928ca352214cb86f", + "target_lvs.spice": "4bb83a37db0480608356da1d2a8f511cbda51268dba73bfd54d9f86b03a82439", + "testbench.spice": "2360883aa3efe513425e87e6838b2d5245de2b13814d2c097db560982f870c91" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW2_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW2_sL2/qualification.json new file mode 100644 index 00000000..b80dd2db --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW2_sL2/qualification.json @@ -0,0 +1,91 @@ +{ + "case_id": "C01_ihp130_sW2_sL2", + "circuit_id": "C01", + "pdk": "ihp130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 2.08, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 2.08, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "46171163d4eb7b45", + "mirror_pass1": { + "vmin": 0.2760895, + "status": "passed", + "vout_test": 0.74 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.3761 + }, + "_frozen_from": { + "schematic": { + "err": 0.0470665, + "vmin": 0.2760895 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.42 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.5, + "schematic_measures": { + "iout_t": 2.094133e-05, + "err": 0.0470665, + "vmin": 0.2760895, + "dev_at_vdd": 0.1084847, + "gout_t": 3.19377e-06, + "rout_t": 313110.1, + "vout_test": 0.74, + "rout_nom": 313110.1, + "ok_at_vdd": 0.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW2_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW2_sL2/specs.json new file mode 100644 index 00000000..87ec98e9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW2_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.3761 + }, + "_frozen_from": { + "schematic": { + "err": 0.0470665, + "vmin": 0.2760895 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.42 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW2_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW2_sL2/target.spice new file mode 100644 index 00000000..be4de19c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW2_sL2/target.spice @@ -0,0 +1,4 @@ +.subckt C01_ihp130_sW2_sL2 VSS IB1 IOUT1 +XM1 IB1 IB1 VSS VSS sg13_lv_nmos w=4u l=2.08u ng=8 m=1 +XM2 IOUT1 IB1 VSS VSS sg13_lv_nmos w=4u l=2.08u ng=8 m=1 +.ends C01_ihp130_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW2_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW2_sL2/target_lvs.spice new file mode 100644 index 00000000..2e543e48 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW2_sL2/target_lvs.spice @@ -0,0 +1,18 @@ +.subckt C01_ihp130_sW2_sL2 VSS IB1 IOUT1 +XM1_f0 IB1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM1_f1 IB1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM1_f2 IB1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM1_f3 IB1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM1_f4 IB1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM1_f5 IB1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM1_f6 IB1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM1_f7 IB1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM2_f0 IOUT1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM2_f1 IOUT1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM2_f2 IOUT1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM2_f3 IOUT1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM2_f4 IOUT1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM2_f5 IOUT1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM2_f6 IOUT1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM2_f7 IOUT1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=2.08u +.ends C01_ihp130_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW2_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW2_sL2/testbench.spice new file mode 100644 index 00000000..beeb7ddc --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/ihp130/sW2_sL2/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IB1 IOUT1 C01_ihp130_sW2_sL2 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIB1 VDDB IB1 2e-05 +.nodeset v(IB1)=0.36 + +VOUT IOUT1 0 1.2 +.control +dc VOUT 1.2 0 -0.003 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=0.74 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.05 cross=last +meas dc dev_at_vdd find dev at=1.194 +let gout = deriv(iout) +meas dc gout_t find gout at=0.74 +let rout_v = 1/gout +meas dc rout_t find rout_v at=0.74 +echo vout_test = 0.74 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C01/sky130/sW0.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW0.5_sL1.5/case.json new file mode 100644 index 00000000..b6b6d6e3 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW0.5_sL1.5/case.json @@ -0,0 +1,105 @@ +{ + "case_id": "C01_sky130_sW0.5_sL1.5", + "circuit_id": "C01", + "pdk": "sky130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "dut_name": "C01_sky130_sW0.5_sL1.5", + "ports": [ + "VSS", + "IB1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 1.0, + "l": 0.9, + "nf": 2 + }, + "M2": { + "w": 1.0, + "l": 0.9, + "nf": 2 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 0.9, + "tol": 0.05, + "vout_test": 1.16 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.9, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.9, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "9d5b53afb44a129f", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/sky130/sW0.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW0.5_sL1.5/manifest.json new file mode 100644 index 00000000..222b6330 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW0.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "c750a08e6b26da4d25946adbaffb050ba4fdb836c8b55835fd7581ec8da23f93", + "qualification.json": "9c11bae8fb6ec4bbc00bac5562121ea0e640574c684db8e6694102241398fc76", + "specs.json": "f4ad6ce9ccf246facc31b48bcd564f59cd6935206f065e42ee67ccf2347746c9", + "target.spice": "e050a3248317b8de49f252188379cdb89c4a53fe60370a0a9f5aefaa71003f30", + "target_lvs.spice": "7a63b36ba404120a304d2315a6c982f9c98338568261057af2ec90f6bbe6e4ed", + "testbench.spice": "d9fd126af0ff3ca7261f329e7caeaeb7bb47846d7f98d95a81d9c98880eadda6" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/sky130/sW0.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW0.5_sL1.5/qualification.json new file mode 100644 index 00000000..2b26b6a7 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW0.5_sL1.5/qualification.json @@ -0,0 +1,91 @@ +{ + "case_id": "C01_sky130_sW0.5_sL1.5", + "circuit_id": "C01", + "pdk": "sky130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.9, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.9, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "9d5b53afb44a129f", + "mirror_pass1": { + "vmin": 0.52631, + "status": "passed", + "vout_test": 1.16 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.6263 + }, + "_frozen_from": { + "schematic": { + "err": 0.010299, + "vmin": 0.52631 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.63 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 18.7, + "schematic_measures": { + "iout_t": 2.020598e-05, + "err": 0.010299, + "vmin": 0.52631, + "dev_at_vdd": 0.04216954, + "gout_t": 1.215248e-06, + "rout_t": 822879.3, + "vout_test": 1.16, + "rout_nom": 822879.3, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/sky130/sW0.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW0.5_sL1.5/specs.json new file mode 100644 index 00000000..f05ae7c6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW0.5_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.6263 + }, + "_frozen_from": { + "schematic": { + "err": 0.010299, + "vmin": 0.52631 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.63 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/sky130/sW0.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW0.5_sL1.5/target.spice new file mode 100644 index 00000000..d1e27656 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW0.5_sL1.5/target.spice @@ -0,0 +1,4 @@ +.subckt C01_sky130_sW0.5_sL1.5 VSS IB1 IOUT1 +XM1 IB1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=1 l=0.9 nf=2 +XM2 IOUT1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=1 l=0.9 nf=2 +.ends C01_sky130_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C01/sky130/sW0.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW0.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..04f7e6e7 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW0.5_sL1.5/target_lvs.spice @@ -0,0 +1,6 @@ +.subckt C01_sky130_sW0.5_sL1.5 VSS IB1 IOUT1 +XM1_f0 IB1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM1_f1 IB1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM2_f0 IOUT1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM2_f1 IOUT1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +.ends C01_sky130_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C01/sky130/sW0.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW0.5_sL1.5/testbench.spice new file mode 100644 index 00000000..4107e0bd --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW0.5_sL1.5/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IB1 IOUT1 C01_sky130_sW0.5_sL1.5 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIB1 VDDB IB1 2e-05 +.nodeset v(IB1)=0.54 + +VOUT IOUT1 0 1.8 +.control +dc VOUT 1.8 0 -0.0045 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=1.16 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.05 cross=last +meas dc dev_at_vdd find dev at=1.791 +let gout = deriv(iout) +meas dc gout_t find gout at=1.16 +let rout_v = 1/gout +meas dc rout_t find rout_v at=1.16 +echo vout_test = 1.16 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C01/sky130/sW0.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW0.5_sL1/case.json new file mode 100644 index 00000000..902e928c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW0.5_sL1/case.json @@ -0,0 +1,105 @@ +{ + "case_id": "C01_sky130_sW0.5_sL1", + "circuit_id": "C01", + "pdk": "sky130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "dut_name": "C01_sky130_sW0.5_sL1", + "ports": [ + "VSS", + "IB1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 1.0, + "l": 0.6, + "nf": 2 + }, + "M2": { + "w": 1.0, + "l": 0.6, + "nf": 2 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 0.9, + "tol": 0.05, + "vout_test": 1.14 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.6, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.6, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "eb7052d274d608b9", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/sky130/sW0.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW0.5_sL1/manifest.json new file mode 100644 index 00000000..214a7d1e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW0.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "d6e81fccbe8373020cb03b6758a2d036e9a512fd7eff03c3f1636f40faa6e996", + "qualification.json": "9229490ae1947a7fc9926dc1ca2ee9dcf92a75916980fb4b407488d4b3c8e764", + "specs.json": "80ce41e125860f783158f22ca69f90c21dc1194d5351f82b87c62ed1dabb26f5", + "target.spice": "aa92dcbf56bc759aa7a4fab67ab8b08d3d1aad9e7df10d8c389bb6f95a6902ad", + "target_lvs.spice": "186152882116d80ec6ecd72263e46b9919eb7549bb0c4e0cee6d1cd0d10c00e6", + "testbench.spice": "7eee14b6b563eb6de4f17b6dd202408f7e012ed1e11387101c357f9d5c959a94" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/sky130/sW0.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW0.5_sL1/qualification.json new file mode 100644 index 00000000..d1b43810 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW0.5_sL1/qualification.json @@ -0,0 +1,91 @@ +{ + "case_id": "C01_sky130_sW0.5_sL1", + "circuit_id": "C01", + "pdk": "sky130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.6, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.6, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "eb7052d274d608b9", + "mirror_pass1": { + "vmin": 0.4881766, + "status": "passed", + "vout_test": 1.14 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.5882 + }, + "_frozen_from": { + "schematic": { + "err": 0.0134955, + "vmin": 0.4881766 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.63 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 14.9, + "schematic_measures": { + "iout_t": 2.026991e-05, + "err": 0.0134955, + "vmin": 0.4881766, + "dev_at_vdd": 0.04744706, + "gout_t": 1.254398e-06, + "rout_t": 797197.0, + "vout_test": 1.14, + "rout_nom": 797197.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/sky130/sW0.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW0.5_sL1/specs.json new file mode 100644 index 00000000..c5df7242 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW0.5_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.5882 + }, + "_frozen_from": { + "schematic": { + "err": 0.0134955, + "vmin": 0.4881766 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.63 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/sky130/sW0.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW0.5_sL1/target.spice new file mode 100644 index 00000000..fd7aa73c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW0.5_sL1/target.spice @@ -0,0 +1,4 @@ +.subckt C01_sky130_sW0.5_sL1 VSS IB1 IOUT1 +XM1 IB1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=1 l=0.6 nf=2 +XM2 IOUT1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=1 l=0.6 nf=2 +.ends C01_sky130_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C01/sky130/sW0.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW0.5_sL1/target_lvs.spice new file mode 100644 index 00000000..f7630844 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW0.5_sL1/target_lvs.spice @@ -0,0 +1,6 @@ +.subckt C01_sky130_sW0.5_sL1 VSS IB1 IOUT1 +XM1_f0 IB1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f1 IB1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f0 IOUT1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f1 IOUT1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +.ends C01_sky130_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C01/sky130/sW0.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW0.5_sL1/testbench.spice new file mode 100644 index 00000000..9033e0bc --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW0.5_sL1/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IB1 IOUT1 C01_sky130_sW0.5_sL1 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIB1 VDDB IB1 2e-05 +.nodeset v(IB1)=0.54 + +VOUT IOUT1 0 1.8 +.control +dc VOUT 1.8 0 -0.0045 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=1.14 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.05 cross=last +meas dc dev_at_vdd find dev at=1.791 +let gout = deriv(iout) +meas dc gout_t find gout at=1.14 +let rout_v = 1/gout +meas dc rout_t find rout_v at=1.14 +echo vout_test = 1.14 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C01/sky130/sW0.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW0.5_sL2/case.json new file mode 100644 index 00000000..45f5bda8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW0.5_sL2/case.json @@ -0,0 +1,105 @@ +{ + "case_id": "C01_sky130_sW0.5_sL2", + "circuit_id": "C01", + "pdk": "sky130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "dut_name": "C01_sky130_sW0.5_sL2", + "ports": [ + "VSS", + "IB1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 1.0, + "l": 1.2, + "nf": 2 + }, + "M2": { + "w": 1.0, + "l": 1.2, + "nf": 2 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 0.9, + "tol": 0.05, + "vout_test": 1.17 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.2, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.2, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "a567139dc78d630e", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/sky130/sW0.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW0.5_sL2/manifest.json new file mode 100644 index 00000000..672c1e48 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW0.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "c1f959c033e1dec4af1262605c6a8b6ef09d0becb8b570d0d37190e72d35b26b", + "qualification.json": "18bc561c39e7a545922aa435e7823e74ff673f8c20cab5ed5dce535e1fafe41a", + "specs.json": "c6a47d62d8d596ef90a9c6d62b2b36a70b38ab5061245b10841e93975674164f", + "target.spice": "439497f4e05b6ce75731206ecd634315bfe66f1eb987da6e2355b091e3b4e7ab", + "target_lvs.spice": "b2987148ae8efc43b8e5653af3d8ececf2202673c4643d09cc2cf3a8887f32a2", + "testbench.spice": "7c8e91bffc7fa2df862b666ed3f48c47fa041ebc75252ea0837b2cee87593f4b" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/sky130/sW0.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW0.5_sL2/qualification.json new file mode 100644 index 00000000..99566f5f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW0.5_sL2/qualification.json @@ -0,0 +1,91 @@ +{ + "case_id": "C01_sky130_sW0.5_sL2", + "circuit_id": "C01", + "pdk": "sky130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.2, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.2, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "a567139dc78d630e", + "mirror_pass1": { + "vmin": 0.5386201, + "status": "passed", + "vout_test": 1.17 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.63 + }, + "_frozen_from": { + "schematic": { + "err": 0.0066305, + "vmin": 0.5386201 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.63 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 19.3, + "schematic_measures": { + "iout_t": 2.013261e-05, + "err": 0.0066305, + "vmin": 0.5386201, + "dev_at_vdd": 0.03586485, + "gout_t": 1.115739e-06, + "rout_t": 896266.8, + "vout_test": 1.17, + "rout_nom": 896266.8, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/sky130/sW0.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW0.5_sL2/specs.json new file mode 100644 index 00000000..c21af70b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW0.5_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.63 + }, + "_frozen_from": { + "schematic": { + "err": 0.0066305, + "vmin": 0.5386201 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.63 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/sky130/sW0.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW0.5_sL2/target.spice new file mode 100644 index 00000000..0891f81b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW0.5_sL2/target.spice @@ -0,0 +1,4 @@ +.subckt C01_sky130_sW0.5_sL2 VSS IB1 IOUT1 +XM1 IB1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=1 l=1.2 nf=2 +XM2 IOUT1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=1 l=1.2 nf=2 +.ends C01_sky130_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C01/sky130/sW0.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW0.5_sL2/target_lvs.spice new file mode 100644 index 00000000..db8128cd --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW0.5_sL2/target_lvs.spice @@ -0,0 +1,6 @@ +.subckt C01_sky130_sW0.5_sL2 VSS IB1 IOUT1 +XM1_f0 IB1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM1_f1 IB1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM2_f0 IOUT1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM2_f1 IOUT1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +.ends C01_sky130_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C01/sky130/sW0.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW0.5_sL2/testbench.spice new file mode 100644 index 00000000..7a59f5ed --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW0.5_sL2/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IB1 IOUT1 C01_sky130_sW0.5_sL2 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIB1 VDDB IB1 2e-05 +.nodeset v(IB1)=0.54 + +VOUT IOUT1 0 1.8 +.control +dc VOUT 1.8 0 -0.0045 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=1.17 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.05 cross=last +meas dc dev_at_vdd find dev at=1.791 +let gout = deriv(iout) +meas dc gout_t find gout at=1.17 +let rout_v = 1/gout +meas dc rout_t find rout_v at=1.17 +echo vout_test = 1.17 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1.5_sL1.5/case.json new file mode 100644 index 00000000..cb61cf31 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1.5_sL1.5/case.json @@ -0,0 +1,105 @@ +{ + "case_id": "C01_sky130_sW1.5_sL1.5", + "circuit_id": "C01", + "pdk": "sky130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "dut_name": "C01_sky130_sW1.5_sL1.5", + "ports": [ + "VSS", + "IB1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 3.0, + "l": 0.9, + "nf": 6 + }, + "M2": { + "w": 3.0, + "l": 0.9, + "nf": 6 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 0.9, + "tol": 0.05, + "vout_test": 1.1 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.9, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.9, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "4f5be3a7c4ef7ccf", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1.5_sL1.5/manifest.json new file mode 100644 index 00000000..278c7977 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "a713357a544459f12e6213b8368816a368c991c70bc4572e4348baf01355e218", + "qualification.json": "6c4250731a87129d1f1f03f599bd08e9f331b2928d6810037a8b051c397fc722", + "specs.json": "5eb518a6d0f5fbbc61177dde330eb87fa224e9c40ec07223ba0313b2afc622e9", + "target.spice": "57e9f57745a12eb2a283da4f50a13f5d39f580940c7cf33714d984b30066b63a", + "target_lvs.spice": "ce635fc3e530244a7055985cbd6404f87dd206878eedcd227117dbc48e5291a6", + "testbench.spice": "cad709544b43dfa2af6a6256d38b58e3f5c3f793632a40ab08eefcf56c81c850" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1.5_sL1.5/qualification.json new file mode 100644 index 00000000..de454e19 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1.5_sL1.5/qualification.json @@ -0,0 +1,91 @@ +{ + "case_id": "C01_sky130_sW1.5_sL1.5", + "circuit_id": "C01", + "pdk": "sky130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.9, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.9, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "4f5be3a7c4ef7ccf", + "mirror_pass1": { + "vmin": 0.4069824, + "status": "passed", + "vout_test": 1.1 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.507 + }, + "_frozen_from": { + "schematic": { + "err": 0.0218265, + "vmin": 0.4069824 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.63 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 12.3, + "schematic_measures": { + "iout_t": 2.043653e-05, + "err": 0.0218265, + "vmin": 0.4069824, + "dev_at_vdd": 0.06462978, + "gout_t": 1.422084e-06, + "rout_t": 703194.4, + "vout_test": 1.1, + "rout_nom": 703194.4, + "ok_at_vdd": 0.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1.5_sL1.5/specs.json new file mode 100644 index 00000000..2c3e42e5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1.5_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.507 + }, + "_frozen_from": { + "schematic": { + "err": 0.0218265, + "vmin": 0.4069824 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.63 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1.5_sL1.5/target.spice new file mode 100644 index 00000000..e14398af --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1.5_sL1.5/target.spice @@ -0,0 +1,4 @@ +.subckt C01_sky130_sW1.5_sL1.5 VSS IB1 IOUT1 +XM1 IB1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=3 l=0.9 nf=6 +XM2 IOUT1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=3 l=0.9 nf=6 +.ends C01_sky130_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..87f7ddb3 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1.5_sL1.5/target_lvs.spice @@ -0,0 +1,14 @@ +.subckt C01_sky130_sW1.5_sL1.5 VSS IB1 IOUT1 +XM1_f0 IB1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM1_f1 IB1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM1_f2 IB1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM1_f3 IB1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM1_f4 IB1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM1_f5 IB1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM2_f0 IOUT1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM2_f1 IOUT1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM2_f2 IOUT1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM2_f3 IOUT1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM2_f4 IOUT1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM2_f5 IOUT1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +.ends C01_sky130_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1.5_sL1.5/testbench.spice new file mode 100644 index 00000000..4587210b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1.5_sL1.5/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IB1 IOUT1 C01_sky130_sW1.5_sL1.5 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIB1 VDDB IB1 2e-05 +.nodeset v(IB1)=0.54 + +VOUT IOUT1 0 1.8 +.control +dc VOUT 1.8 0 -0.0045 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=1.1 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.05 cross=last +meas dc dev_at_vdd find dev at=1.791 +let gout = deriv(iout) +meas dc gout_t find gout at=1.1 +let rout_v = 1/gout +meas dc rout_t find rout_v at=1.1 +echo vout_test = 1.1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1.5_sL1/case.json new file mode 100644 index 00000000..3c6886bc --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1.5_sL1/case.json @@ -0,0 +1,105 @@ +{ + "case_id": "C01_sky130_sW1.5_sL1", + "circuit_id": "C01", + "pdk": "sky130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "dut_name": "C01_sky130_sW1.5_sL1", + "ports": [ + "VSS", + "IB1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 3.0, + "l": 0.6, + "nf": 6 + }, + "M2": { + "w": 3.0, + "l": 0.6, + "nf": 6 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 0.9, + "tol": 0.05, + "vout_test": 1.1 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.6, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.6, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "5cb64fa52ad1fd83", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1.5_sL1/manifest.json new file mode 100644 index 00000000..e7b89231 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "0b779d8e5c45ac573f776ae70cabc48435db6ca464e84d923e93c451b889638a", + "qualification.json": "92dfe66f38c09382e91bf8abb9002a758c2afc7c2e09e3ce9af9842b7af7c79e", + "specs.json": "0941d7bcdaa91c64a4bd92f61c019f26063c4dee7548055035bdddba8bf6898b", + "target.spice": "b6ff30d479553af6649248fa71042277ca46f6d92f264a2c0a3c86022d2ff5df", + "target_lvs.spice": "9c02c455d3f6c5786c983bb4491145f53aae07c5712a23f6d9596a9642b4c295", + "testbench.spice": "19a06865a70b683945d11e6963bf3565dc06c0db3913bfb0d73734eca210a677" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1.5_sL1/qualification.json new file mode 100644 index 00000000..edab1e5c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1.5_sL1/qualification.json @@ -0,0 +1,91 @@ +{ + "case_id": "C01_sky130_sW1.5_sL1", + "circuit_id": "C01", + "pdk": "sky130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.6, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.6, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "5cb64fa52ad1fd83", + "mirror_pass1": { + "vmin": 0.3938734, + "status": "passed", + "vout_test": 1.1 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.4939 + }, + "_frozen_from": { + "schematic": { + "err": 0.024797, + "vmin": 0.3938734 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.63 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 12.3, + "schematic_measures": { + "iout_t": 2.049594e-05, + "err": 0.024797, + "vmin": 0.3938734, + "dev_at_vdd": 0.06899832, + "gout_t": 1.464635e-06, + "rout_t": 682765.3, + "vout_test": 1.1, + "rout_nom": 682765.3, + "ok_at_vdd": 0.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1.5_sL1/specs.json new file mode 100644 index 00000000..cfce5c8d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1.5_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.4939 + }, + "_frozen_from": { + "schematic": { + "err": 0.024797, + "vmin": 0.3938734 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.63 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1.5_sL1/target.spice new file mode 100644 index 00000000..8aa82e13 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1.5_sL1/target.spice @@ -0,0 +1,4 @@ +.subckt C01_sky130_sW1.5_sL1 VSS IB1 IOUT1 +XM1 IB1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=3 l=0.6 nf=6 +XM2 IOUT1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=3 l=0.6 nf=6 +.ends C01_sky130_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1.5_sL1/target_lvs.spice new file mode 100644 index 00000000..97a09187 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1.5_sL1/target_lvs.spice @@ -0,0 +1,14 @@ +.subckt C01_sky130_sW1.5_sL1 VSS IB1 IOUT1 +XM1_f0 IB1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f1 IB1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f2 IB1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f3 IB1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f4 IB1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f5 IB1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f0 IOUT1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f1 IOUT1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f2 IOUT1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f3 IOUT1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f4 IOUT1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f5 IOUT1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +.ends C01_sky130_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1.5_sL1/testbench.spice new file mode 100644 index 00000000..a5e4153a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1.5_sL1/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IB1 IOUT1 C01_sky130_sW1.5_sL1 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIB1 VDDB IB1 2e-05 +.nodeset v(IB1)=0.54 + +VOUT IOUT1 0 1.8 +.control +dc VOUT 1.8 0 -0.0045 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=1.1 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.05 cross=last +meas dc dev_at_vdd find dev at=1.791 +let gout = deriv(iout) +meas dc gout_t find gout at=1.1 +let rout_v = 1/gout +meas dc rout_t find rout_v at=1.1 +echo vout_test = 1.1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1.5_sL2/case.json new file mode 100644 index 00000000..d5d0be89 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1.5_sL2/case.json @@ -0,0 +1,105 @@ +{ + "case_id": "C01_sky130_sW1.5_sL2", + "circuit_id": "C01", + "pdk": "sky130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "dut_name": "C01_sky130_sW1.5_sL2", + "ports": [ + "VSS", + "IB1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 3.0, + "l": 1.2, + "nf": 6 + }, + "M2": { + "w": 3.0, + "l": 1.2, + "nf": 6 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 0.9, + "tol": 0.05, + "vout_test": 1.1 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.2, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.2, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "b31d3b8581a9d2fc", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1.5_sL2/manifest.json new file mode 100644 index 00000000..8d6792bd --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "f5087d08be2d65e665cea306c8c100d467d31266f57e18c901de578a664c9875", + "qualification.json": "6a11dd9a7d8f90c412eb03012cedeea4441d3250f073e84fbbc664c6f6cdb380", + "specs.json": "29697c3135a7da8ead0ae300e045544dc877ee23ac23af88e94e53e310124a92", + "target.spice": "4440bd303a52a9615b5078d10a96d75f1829270ed8ade82e5bc3b13aec2f7143", + "target_lvs.spice": "d3b5a771caa8a5fdfa8ee973fa064a7f71e96fc361fb51120bf744896afd81f4", + "testbench.spice": "e330ce367b806a3b499bdd948fec2e2337734fc02c2bcd18c3ab8659db9403b1" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1.5_sL2/qualification.json new file mode 100644 index 00000000..8251efa6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1.5_sL2/qualification.json @@ -0,0 +1,91 @@ +{ + "case_id": "C01_sky130_sW1.5_sL2", + "circuit_id": "C01", + "pdk": "sky130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.2, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.2, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "b31d3b8581a9d2fc", + "mirror_pass1": { + "vmin": 0.4017564, + "status": "passed", + "vout_test": 1.1 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.5018 + }, + "_frozen_from": { + "schematic": { + "err": 0.0186775, + "vmin": 0.4017564 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.63 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 12.2, + "schematic_measures": { + "iout_t": 2.037355e-05, + "err": 0.0186775, + "vmin": 0.4017564, + "dev_at_vdd": 0.06052456, + "gout_t": 1.359599e-06, + "rout_t": 735511.9, + "vout_test": 1.1, + "rout_nom": 735511.9, + "ok_at_vdd": 0.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1.5_sL2/specs.json new file mode 100644 index 00000000..99210758 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1.5_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.5018 + }, + "_frozen_from": { + "schematic": { + "err": 0.0186775, + "vmin": 0.4017564 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.63 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1.5_sL2/target.spice new file mode 100644 index 00000000..655e9835 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1.5_sL2/target.spice @@ -0,0 +1,4 @@ +.subckt C01_sky130_sW1.5_sL2 VSS IB1 IOUT1 +XM1 IB1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=3 l=1.2 nf=6 +XM2 IOUT1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=3 l=1.2 nf=6 +.ends C01_sky130_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1.5_sL2/target_lvs.spice new file mode 100644 index 00000000..ff245170 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1.5_sL2/target_lvs.spice @@ -0,0 +1,14 @@ +.subckt C01_sky130_sW1.5_sL2 VSS IB1 IOUT1 +XM1_f0 IB1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM1_f1 IB1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM1_f2 IB1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM1_f3 IB1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM1_f4 IB1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM1_f5 IB1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM2_f0 IOUT1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM2_f1 IOUT1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM2_f2 IOUT1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM2_f3 IOUT1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM2_f4 IOUT1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM2_f5 IOUT1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +.ends C01_sky130_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1.5_sL2/testbench.spice new file mode 100644 index 00000000..9f98e696 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1.5_sL2/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IB1 IOUT1 C01_sky130_sW1.5_sL2 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIB1 VDDB IB1 2e-05 +.nodeset v(IB1)=0.54 + +VOUT IOUT1 0 1.8 +.control +dc VOUT 1.8 0 -0.0045 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=1.1 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.05 cross=last +meas dc dev_at_vdd find dev at=1.791 +let gout = deriv(iout) +meas dc gout_t find gout at=1.1 +let rout_v = 1/gout +meas dc rout_t find rout_v at=1.1 +echo vout_test = 1.1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1_sL1.5/case.json new file mode 100644 index 00000000..bacd88e0 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1_sL1.5/case.json @@ -0,0 +1,105 @@ +{ + "case_id": "C01_sky130_sW1_sL1.5", + "circuit_id": "C01", + "pdk": "sky130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "dut_name": "C01_sky130_sW1_sL1.5", + "ports": [ + "VSS", + "IB1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.9, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 0.9, + "nf": 4 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 0.9, + "tol": 0.05, + "vout_test": 1.12 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.9, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.9, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "baeb93405e70889e", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1_sL1.5/manifest.json new file mode 100644 index 00000000..b979c11d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "a69e0501d869084dc386d327d5adeab79dbeb138ed10d1f9089fb424dd29ceee", + "qualification.json": "8fc4fd2f3b7327be6f66501fad02f556bc3072a755f13c0ff7275642d0d42314", + "specs.json": "8ee63f73b83691e2bfd3212e6fd0c3dea054c98931ae5b6fb2e523b5074cdba7", + "target.spice": "31a415e6a809109b5902fba02805894ebfd16b574b397d7aee888d0d2f8a3fe2", + "target_lvs.spice": "30b046606b7e24107bed049a1b47e09b67f8d2812c3eb4f2d84c83c523f86509", + "testbench.spice": "b4ad453adf2528426f959dea3bb3ef690170b5de5dc3301737556bc665c0590b" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1_sL1.5/qualification.json new file mode 100644 index 00000000..5c978385 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1_sL1.5/qualification.json @@ -0,0 +1,91 @@ +{ + "case_id": "C01_sky130_sW1_sL1.5", + "circuit_id": "C01", + "pdk": "sky130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.9, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.9, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "baeb93405e70889e", + "mirror_pass1": { + "vmin": 0.4415389, + "status": "passed", + "vout_test": 1.12 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.5415 + }, + "_frozen_from": { + "schematic": { + "err": 0.0177605, + "vmin": 0.4415389 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.63 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 18.5, + "schematic_measures": { + "iout_t": 2.035521e-05, + "err": 0.0177605, + "vmin": 0.4415389, + "dev_at_vdd": 0.05590602, + "gout_t": 1.32694e-06, + "rout_t": 753614.1, + "vout_test": 1.12, + "rout_nom": 753614.1, + "ok_at_vdd": 0.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1_sL1.5/specs.json new file mode 100644 index 00000000..d6bd10ea --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.5415 + }, + "_frozen_from": { + "schematic": { + "err": 0.0177605, + "vmin": 0.4415389 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.63 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1_sL1.5/target.spice new file mode 100644 index 00000000..442055f6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1_sL1.5/target.spice @@ -0,0 +1,4 @@ +.subckt C01_sky130_sW1_sL1.5 VSS IB1 IOUT1 +XM1 IB1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=2 l=0.9 nf=4 +XM2 IOUT1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=2 l=0.9 nf=4 +.ends C01_sky130_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1_sL1.5/target_lvs.spice new file mode 100644 index 00000000..7722264f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1_sL1.5/target_lvs.spice @@ -0,0 +1,10 @@ +.subckt C01_sky130_sW1_sL1.5 VSS IB1 IOUT1 +XM1_f0 IB1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM1_f1 IB1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM1_f2 IB1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM1_f3 IB1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM2_f0 IOUT1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM2_f1 IOUT1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM2_f2 IOUT1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM2_f3 IOUT1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +.ends C01_sky130_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1_sL1.5/testbench.spice new file mode 100644 index 00000000..2c9c9d49 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1_sL1.5/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IB1 IOUT1 C01_sky130_sW1_sL1.5 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIB1 VDDB IB1 2e-05 +.nodeset v(IB1)=0.54 + +VOUT IOUT1 0 1.8 +.control +dc VOUT 1.8 0 -0.0045 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=1.12 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.05 cross=last +meas dc dev_at_vdd find dev at=1.791 +let gout = deriv(iout) +meas dc gout_t find gout at=1.12 +let rout_v = 1/gout +meas dc rout_t find rout_v at=1.12 +echo vout_test = 1.12 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1_sL1/case.json new file mode 100644 index 00000000..6526027c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1_sL1/case.json @@ -0,0 +1,105 @@ +{ + "case_id": "C01_sky130_sW1_sL1", + "circuit_id": "C01", + "pdk": "sky130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "dut_name": "C01_sky130_sW1_sL1", + "ports": [ + "VSS", + "IB1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.6, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 0.6, + "nf": 4 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 0.9, + "tol": 0.05, + "vout_test": 1.11 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "f45f6e49e69623cf", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1_sL1/manifest.json new file mode 100644 index 00000000..727b3601 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "5f057b72ea0c16812db971971b651ac69dc8948f90a1786c08dc9a00635de333", + "qualification.json": "67102f53884546de6a8bf3e6941f5f92f515d452af82093fcaf7a26347f08813", + "specs.json": "635862edb7b71b0d383a9396840d3e9371ff7d060a974db5beb860abcb561ba0", + "target.spice": "53afb656a70d6939eaf5ada213d6aebab517f3da66e4ee954b049629ff69c951", + "target_lvs.spice": "5223a57f4c987d0b778200b35c8b8b546d531ce83175c95cc7d648d797a49902", + "testbench.spice": "688287b7ec21097ebef10a78ea77cc13ffdc02dd2bcb06b0c35a1fb8c6d73390" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1_sL1/qualification.json new file mode 100644 index 00000000..ba3ace32 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1_sL1/qualification.json @@ -0,0 +1,91 @@ +{ + "case_id": "C01_sky130_sW1_sL1", + "circuit_id": "C01", + "pdk": "sky130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "f45f6e49e69623cf", + "mirror_pass1": { + "vmin": 0.4211187, + "status": "passed", + "vout_test": 1.11 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.5211 + }, + "_frozen_from": { + "schematic": { + "err": 0.02052, + "vmin": 0.4211187 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.63 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 20.6, + "schematic_measures": { + "iout_t": 2.04104e-05, + "err": 0.02052, + "vmin": 0.4211187, + "dev_at_vdd": 0.06062094, + "gout_t": 1.37352e-06, + "rout_t": 728057.7, + "vout_test": 1.11, + "rout_nom": 728057.7, + "ok_at_vdd": 0.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1_sL1/specs.json new file mode 100644 index 00000000..8a6b1255 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.5211 + }, + "_frozen_from": { + "schematic": { + "err": 0.02052, + "vmin": 0.4211187 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.63 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1_sL1/target.spice new file mode 100644 index 00000000..3fef5edb --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1_sL1/target.spice @@ -0,0 +1,4 @@ +.subckt C01_sky130_sW1_sL1 VSS IB1 IOUT1 +XM1 IB1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=2 l=0.6 nf=4 +XM2 IOUT1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=2 l=0.6 nf=4 +.ends C01_sky130_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1_sL1/target_lvs.spice new file mode 100644 index 00000000..13d301f3 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1_sL1/target_lvs.spice @@ -0,0 +1,10 @@ +.subckt C01_sky130_sW1_sL1 VSS IB1 IOUT1 +XM1_f0 IB1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f1 IB1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f2 IB1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f3 IB1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f0 IOUT1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f1 IOUT1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f2 IOUT1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f3 IOUT1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +.ends C01_sky130_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1_sL1/testbench.spice new file mode 100644 index 00000000..4774371d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1_sL1/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IB1 IOUT1 C01_sky130_sW1_sL1 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIB1 VDDB IB1 2e-05 +.nodeset v(IB1)=0.54 + +VOUT IOUT1 0 1.8 +.control +dc VOUT 1.8 0 -0.0045 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=1.11 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.05 cross=last +meas dc dev_at_vdd find dev at=1.791 +let gout = deriv(iout) +meas dc gout_t find gout at=1.11 +let rout_v = 1/gout +meas dc rout_t find rout_v at=1.11 +echo vout_test = 1.11 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1_sL2/case.json new file mode 100644 index 00000000..cfcba15b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1_sL2/case.json @@ -0,0 +1,105 @@ +{ + "case_id": "C01_sky130_sW1_sL2", + "circuit_id": "C01", + "pdk": "sky130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "dut_name": "C01_sky130_sW1_sL2", + "ports": [ + "VSS", + "IB1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 1.2, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 1.2, + "nf": 4 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 0.9, + "tol": 0.05, + "vout_test": 1.12 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.2, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.2, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "374164a2e191e2cf", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1_sL2/manifest.json new file mode 100644 index 00000000..e55ce861 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "2316959a61c6bb5cb11521f42c05c199bb4394ca5225716571615b86c0fef86c", + "qualification.json": "99d0c6bfbe51ce085444ae8d2d70f074cddfd4e12a3968d0d4ecd2bc968af067", + "specs.json": "f379905ec999c0c5e3f71a261cf52e015b131b8c2e856f88dd5768531bce6b80", + "target.spice": "ea24eab278ed3ff61bea789331f191ee7f02284dcb2008b9955300efe72173ce", + "target_lvs.spice": "5458016c1d11a6e95442f40a36594bd8caff53912a2fa16a3eac18171492ccc4", + "testbench.spice": "567c108a500e8258d936a1636d81fe1e06270901d9406df77665033db19e9963" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1_sL2/qualification.json new file mode 100644 index 00000000..2f2aea9c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1_sL2/qualification.json @@ -0,0 +1,91 @@ +{ + "case_id": "C01_sky130_sW1_sL2", + "circuit_id": "C01", + "pdk": "sky130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.2, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.2, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "374164a2e191e2cf", + "mirror_pass1": { + "vmin": 0.4409208, + "status": "passed", + "vout_test": 1.12 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.5409 + }, + "_frozen_from": { + "schematic": { + "err": 0.0141635, + "vmin": 0.4409208 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.63 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 16.4, + "schematic_measures": { + "iout_t": 2.028327e-05, + "err": 0.0141635, + "vmin": 0.4409208, + "dev_at_vdd": 0.05078378, + "gout_t": 1.249339e-06, + "rout_t": 800423.6, + "vout_test": 1.12, + "rout_nom": 800423.6, + "ok_at_vdd": 0.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1_sL2/specs.json new file mode 100644 index 00000000..a0c32730 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.5409 + }, + "_frozen_from": { + "schematic": { + "err": 0.0141635, + "vmin": 0.4409208 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.63 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1_sL2/target.spice new file mode 100644 index 00000000..d0f169a2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1_sL2/target.spice @@ -0,0 +1,4 @@ +.subckt C01_sky130_sW1_sL2 VSS IB1 IOUT1 +XM1 IB1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=2 l=1.2 nf=4 +XM2 IOUT1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=2 l=1.2 nf=4 +.ends C01_sky130_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1_sL2/target_lvs.spice new file mode 100644 index 00000000..61adeca0 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1_sL2/target_lvs.spice @@ -0,0 +1,10 @@ +.subckt C01_sky130_sW1_sL2 VSS IB1 IOUT1 +XM1_f0 IB1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM1_f1 IB1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM1_f2 IB1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM1_f3 IB1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM2_f0 IOUT1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM2_f1 IOUT1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM2_f2 IOUT1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM2_f3 IOUT1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +.ends C01_sky130_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1_sL2/testbench.spice new file mode 100644 index 00000000..f984e747 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW1_sL2/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IB1 IOUT1 C01_sky130_sW1_sL2 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIB1 VDDB IB1 2e-05 +.nodeset v(IB1)=0.54 + +VOUT IOUT1 0 1.8 +.control +dc VOUT 1.8 0 -0.0045 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=1.12 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.05 cross=last +meas dc dev_at_vdd find dev at=1.791 +let gout = deriv(iout) +meas dc gout_t find gout at=1.12 +let rout_v = 1/gout +meas dc rout_t find rout_v at=1.12 +echo vout_test = 1.12 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C01/sky130/sW2_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW2_sL1.5/case.json new file mode 100644 index 00000000..db81e1c2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW2_sL1.5/case.json @@ -0,0 +1,105 @@ +{ + "case_id": "C01_sky130_sW2_sL1.5", + "circuit_id": "C01", + "pdk": "sky130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "dut_name": "C01_sky130_sW2_sL1.5", + "ports": [ + "VSS", + "IB1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.9, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 0.9, + "nf": 8 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 0.9, + "tol": 0.05, + "vout_test": 1.09 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.9, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.9, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "0a52817d47e34b34", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/sky130/sW2_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW2_sL1.5/manifest.json new file mode 100644 index 00000000..9fc3b019 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW2_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "80ec81970d48807501d754bfa3eae06974f553fa8b9fbcd05d805f15b7663a34", + "qualification.json": "9412b1a329f46ea2736370c7d1645e596ec08ba3f557b045942183988367d530", + "specs.json": "023df6bca8042d849080ccd43a02a4cc214cfd0a7c6f72f523fb1d1c0b60eb6e", + "target.spice": "254e83374f0db00d4f20e756e62dfab8d00ad324474272004aefcf39df1125c5", + "target_lvs.spice": "08086c99108c29c7610b63cea411e7836551644e8a14436f801e48284d6c1b6d", + "testbench.spice": "8d966c48dfb69edd8296a269002de6e6ac7fc1dbdbe346c4fccf05027a3ec7fc" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/sky130/sW2_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW2_sL1.5/qualification.json new file mode 100644 index 00000000..09033b4d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW2_sL1.5/qualification.json @@ -0,0 +1,91 @@ +{ + "case_id": "C01_sky130_sW2_sL1.5", + "circuit_id": "C01", + "pdk": "sky130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.9, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.9, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "0a52817d47e34b34", + "mirror_pass1": { + "vmin": 0.3879408, + "status": "passed", + "vout_test": 1.09 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.4879 + }, + "_frozen_from": { + "schematic": { + "err": 0.024923, + "vmin": 0.3879408 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.63 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 12.0, + "schematic_measures": { + "iout_t": 2.049846e-05, + "err": 0.024923, + "vmin": 0.3879408, + "dev_at_vdd": 0.07130613, + "gout_t": 1.500827e-06, + "rout_t": 666300.1, + "vout_test": 1.09, + "rout_nom": 666300.1, + "ok_at_vdd": 0.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/sky130/sW2_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW2_sL1.5/specs.json new file mode 100644 index 00000000..8d897214 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW2_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.4879 + }, + "_frozen_from": { + "schematic": { + "err": 0.024923, + "vmin": 0.3879408 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.63 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/sky130/sW2_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW2_sL1.5/target.spice new file mode 100644 index 00000000..de76b88e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW2_sL1.5/target.spice @@ -0,0 +1,4 @@ +.subckt C01_sky130_sW2_sL1.5 VSS IB1 IOUT1 +XM1 IB1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=4 l=0.9 nf=8 +XM2 IOUT1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=4 l=0.9 nf=8 +.ends C01_sky130_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C01/sky130/sW2_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW2_sL1.5/target_lvs.spice new file mode 100644 index 00000000..7f9560f4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW2_sL1.5/target_lvs.spice @@ -0,0 +1,18 @@ +.subckt C01_sky130_sW2_sL1.5 VSS IB1 IOUT1 +XM1_f0 IB1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM1_f1 IB1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM1_f2 IB1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM1_f3 IB1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM1_f4 IB1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM1_f5 IB1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM1_f6 IB1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM1_f7 IB1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM2_f0 IOUT1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM2_f1 IOUT1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM2_f2 IOUT1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM2_f3 IOUT1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM2_f4 IOUT1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM2_f5 IOUT1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM2_f6 IOUT1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM2_f7 IOUT1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +.ends C01_sky130_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C01/sky130/sW2_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW2_sL1.5/testbench.spice new file mode 100644 index 00000000..fd04b4c5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW2_sL1.5/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IB1 IOUT1 C01_sky130_sW2_sL1.5 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIB1 VDDB IB1 2e-05 +.nodeset v(IB1)=0.54 + +VOUT IOUT1 0 1.8 +.control +dc VOUT 1.8 0 -0.0045 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=1.09 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.05 cross=last +meas dc dev_at_vdd find dev at=1.791 +let gout = deriv(iout) +meas dc gout_t find gout at=1.09 +let rout_v = 1/gout +meas dc rout_t find rout_v at=1.09 +echo vout_test = 1.09 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C01/sky130/sW2_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW2_sL1/case.json new file mode 100644 index 00000000..e465d901 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW2_sL1/case.json @@ -0,0 +1,105 @@ +{ + "case_id": "C01_sky130_sW2_sL1", + "circuit_id": "C01", + "pdk": "sky130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "dut_name": "C01_sky130_sW2_sL1", + "ports": [ + "VSS", + "IB1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.6, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 0.6, + "nf": 8 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 0.9, + "tol": 0.05, + "vout_test": 1.09 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "a75813d6ca5b8c0c", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/sky130/sW2_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW2_sL1/manifest.json new file mode 100644 index 00000000..a3362a6f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW2_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "d6c393b768a73237eb4a9d99980dec8ec896d2f623fa45ea297f201fec12d4c8", + "qualification.json": "25f237f174ab5d37d2d685f13eb6e9024139057d900abfd0cc5c76abcfcffa33", + "specs.json": "1741b92c65504ec101cf72f8f5616282f872036bdd14046d5eb39d0c004e9d83", + "target.spice": "b181f22d083c946a2e65b280b01d740c9da177fb46e4faffc35cbbbc0ed24de7", + "target_lvs.spice": "e8b29b2a0b9f026db87e5ab27ccdd825d75110cb014942754b5072d7ffe64f54", + "testbench.spice": "566a016edb3b208ebb58fa204dbfa3553e2708b79a59d9e85f2a1040f4b86005" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/sky130/sW2_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW2_sL1/qualification.json new file mode 100644 index 00000000..7950ee63 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW2_sL1/qualification.json @@ -0,0 +1,91 @@ +{ + "case_id": "C01_sky130_sW2_sL1", + "circuit_id": "C01", + "pdk": "sky130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "a75813d6ca5b8c0c", + "mirror_pass1": { + "vmin": 0.3786519, + "status": "passed", + "vout_test": 1.09 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.4787 + }, + "_frozen_from": { + "schematic": { + "err": 0.0275665, + "vmin": 0.3786519 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.63 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 11.9, + "schematic_measures": { + "iout_t": 2.055133e-05, + "err": 0.0275665, + "vmin": 0.3786519, + "dev_at_vdd": 0.07530348, + "gout_t": 1.542371e-06, + "rout_t": 648352.9, + "vout_test": 1.09, + "rout_nom": 648352.9, + "ok_at_vdd": 0.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/sky130/sW2_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW2_sL1/specs.json new file mode 100644 index 00000000..d24a9b2f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW2_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.4787 + }, + "_frozen_from": { + "schematic": { + "err": 0.0275665, + "vmin": 0.3786519 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.63 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/sky130/sW2_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW2_sL1/target.spice new file mode 100644 index 00000000..7f27b369 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW2_sL1/target.spice @@ -0,0 +1,4 @@ +.subckt C01_sky130_sW2_sL1 VSS IB1 IOUT1 +XM1 IB1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=4 l=0.6 nf=8 +XM2 IOUT1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=4 l=0.6 nf=8 +.ends C01_sky130_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C01/sky130/sW2_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW2_sL1/target_lvs.spice new file mode 100644 index 00000000..15ae5a84 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW2_sL1/target_lvs.spice @@ -0,0 +1,18 @@ +.subckt C01_sky130_sW2_sL1 VSS IB1 IOUT1 +XM1_f0 IB1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f1 IB1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f2 IB1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f3 IB1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f4 IB1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f5 IB1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f6 IB1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f7 IB1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f0 IOUT1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f1 IOUT1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f2 IOUT1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f3 IOUT1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f4 IOUT1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f5 IOUT1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f6 IOUT1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f7 IOUT1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +.ends C01_sky130_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C01/sky130/sW2_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW2_sL1/testbench.spice new file mode 100644 index 00000000..ce0af4af --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW2_sL1/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IB1 IOUT1 C01_sky130_sW2_sL1 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIB1 VDDB IB1 2e-05 +.nodeset v(IB1)=0.54 + +VOUT IOUT1 0 1.8 +.control +dc VOUT 1.8 0 -0.0045 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=1.09 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.05 cross=last +meas dc dev_at_vdd find dev at=1.791 +let gout = deriv(iout) +meas dc gout_t find gout at=1.09 +let rout_v = 1/gout +meas dc rout_t find rout_v at=1.09 +echo vout_test = 1.09 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C01/sky130/sW2_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW2_sL2/case.json new file mode 100644 index 00000000..20acc9b1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW2_sL2/case.json @@ -0,0 +1,105 @@ +{ + "case_id": "C01_sky130_sW2_sL2", + "circuit_id": "C01", + "pdk": "sky130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "dut_name": "C01_sky130_sW2_sL2", + "ports": [ + "VSS", + "IB1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 1.2, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 1.2, + "nf": 8 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 0.9, + "tol": 0.05, + "vout_test": 1.09 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.2, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.2, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "efdd6b96556445bd", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/sky130/sW2_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW2_sL2/manifest.json new file mode 100644 index 00000000..fb7430e9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW2_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "e2f1fb52d8d5f724bd332303200731026f82302773c9a2d41c86416fd1c471c5", + "qualification.json": "9a60d82c4a3185ecec7b816f746853105c0d0eae6820066a129b14dce29bab57", + "specs.json": "84c58f4469cc20004f7e9794363a672e6f7789e55a432eddb419962b139ed7a5", + "target.spice": "8b04b01a6a1d814014aca36d6f53b9a6fc29491c1c912ff27501e0b4431b346f", + "target_lvs.spice": "c7ca37294f76a78ce13a267678ba0973f074211361b535923cc550b6f2c189e7", + "testbench.spice": "951a51dfdb6b7fb1412931ea70ce3abdce10c51f480bc47ed18cece205df1e72" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/sky130/sW2_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW2_sL2/qualification.json new file mode 100644 index 00000000..80ede8a2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW2_sL2/qualification.json @@ -0,0 +1,91 @@ +{ + "case_id": "C01_sky130_sW2_sL2", + "circuit_id": "C01", + "pdk": "sky130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.2, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.2, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "efdd6b96556445bd", + "mirror_pass1": { + "vmin": 0.3807052, + "status": "passed", + "vout_test": 1.09 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.4807 + }, + "_frozen_from": { + "schematic": { + "err": 0.0221195, + "vmin": 0.3807052 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.63 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 12.0, + "schematic_measures": { + "iout_t": 2.044239e-05, + "err": 0.0221195, + "vmin": 0.3807052, + "dev_at_vdd": 0.06807787, + "gout_t": 1.45266e-06, + "rout_t": 688392.6, + "vout_test": 1.09, + "rout_nom": 688392.6, + "ok_at_vdd": 0.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/sky130/sW2_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW2_sL2/specs.json new file mode 100644 index 00000000..b2bdcaad --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW2_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.4807 + }, + "_frozen_from": { + "schematic": { + "err": 0.0221195, + "vmin": 0.3807052 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.63 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C01/sky130/sW2_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW2_sL2/target.spice new file mode 100644 index 00000000..c9a96e17 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW2_sL2/target.spice @@ -0,0 +1,4 @@ +.subckt C01_sky130_sW2_sL2 VSS IB1 IOUT1 +XM1 IB1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=4 l=1.2 nf=8 +XM2 IOUT1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=4 l=1.2 nf=8 +.ends C01_sky130_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C01/sky130/sW2_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW2_sL2/target_lvs.spice new file mode 100644 index 00000000..bd45295b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW2_sL2/target_lvs.spice @@ -0,0 +1,18 @@ +.subckt C01_sky130_sW2_sL2 VSS IB1 IOUT1 +XM1_f0 IB1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM1_f1 IB1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM1_f2 IB1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM1_f3 IB1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM1_f4 IB1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM1_f5 IB1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM1_f6 IB1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM1_f7 IB1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM2_f0 IOUT1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM2_f1 IOUT1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM2_f2 IOUT1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM2_f3 IOUT1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM2_f4 IOUT1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM2_f5 IOUT1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM2_f6 IOUT1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM2_f7 IOUT1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +.ends C01_sky130_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C01/sky130/sW2_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW2_sL2/testbench.spice new file mode 100644 index 00000000..5531bb5e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C01/sky130/sW2_sL2/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IB1 IOUT1 C01_sky130_sW2_sL2 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIB1 VDDB IB1 2e-05 +.nodeset v(IB1)=0.54 + +VOUT IOUT1 0 1.8 +.control +dc VOUT 1.8 0 -0.0045 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=1.09 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.05 cross=last +meas dc dev_at_vdd find dev at=1.791 +let gout = deriv(iout) +meas dc gout_t find gout at=1.09 +let rout_v = 1/gout +meas dc rout_t find rout_v at=1.09 +echo vout_test = 1.09 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C02/gf180/sW0.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW0.5_sL1.5/case.json new file mode 100644 index 00000000..b678ee7d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW0.5_sL1.5/case.json @@ -0,0 +1,141 @@ +{ + "case_id": "C02_gf180_sW0.5_sL1.5", + "circuit_id": "C02", + "pdk": "gf180", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "dut_name": "C02_gf180_sW0.5_sL1.5", + "ports": [ + "VSS", + "IIN1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 1.0, + "l": 0.84, + "nf": 2 + }, + "M2": { + "w": 1.0, + "l": 0.84, + "nf": 2 + }, + "M3": { + "w": 1.0, + "l": 0.84, + "nf": 2 + }, + "M4": { + "w": 1.0, + "l": 0.84, + "nf": 2 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 2.145, + "tol": 0.03, + "vout_test": 2.0 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.84, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.84, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.84, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.84, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "fc301ba6bb21b3a4", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/gf180/sW0.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW0.5_sL1.5/manifest.json new file mode 100644 index 00000000..8e7e418f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW0.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "ce7dd9efcc783000f1ae8d32fe9269b49d6fc0ea146897ce0da738e707dfbb8e", + "qualification.json": "2ccbc1384aa3d3e55ed25ee29c161faddbd54e1932124ba4c478ae28a2e90163", + "specs.json": "5c5e00d7423ab1fdfc8e8746049b85df484e7392af898c6285b2b02d980e6be1", + "target.spice": "47cf4259f5358165051b12df54cfb6c9bb7ef8e6b44a10cc38b56b697ca5f5b1", + "target_lvs.spice": "004f93cf3eb9647ba95758e2047caf114b5a81cdbcac9f61d2e600cc0f6fa1c4", + "testbench.spice": "a573ad45a0e83f2e552582ac970d9231e5c3fd659ef1d01cb3c9006853e38dbb" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/gf180/sW0.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW0.5_sL1.5/qualification.json new file mode 100644 index 00000000..57bd14dd --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW0.5_sL1.5/qualification.json @@ -0,0 +1,115 @@ +{ + "case_id": "C02_gf180_sW0.5_sL1.5", + "circuit_id": "C02", + "pdk": "gf180", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.84, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.84, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.84, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.84, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "fc301ba6bb21b3a4", + "mirror_pass1": { + "vmin": 0.6954534, + "status": "passed", + "vout_test": 2.0 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.7955 + }, + "_frozen_from": { + "schematic": { + "err": -0.0001375, + "vmin": 0.6954534 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.9799999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.2, + "schematic_measures": { + "iout_t": 1.999725e-05, + "err": -0.0001375, + "vmin": 0.6954534, + "dev_at_vdd": 7.452212e-05, + "gout_t": 6.509062e-09, + "rout_t": 153651300.0, + "vout_test": 2.0, + "rout_nom": 153651300.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/gf180/sW0.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW0.5_sL1.5/specs.json new file mode 100644 index 00000000..743323c9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW0.5_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.7955 + }, + "_frozen_from": { + "schematic": { + "err": -0.0001375, + "vmin": 0.6954534 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.9799999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/gf180/sW0.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW0.5_sL1.5/target.spice new file mode 100644 index 00000000..e50f8eda --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW0.5_sL1.5/target.spice @@ -0,0 +1,6 @@ +.subckt C02_gf180_sW0.5_sL1.5 VSS IIN1 IOUT1 +MM1 IIN1 IIN1 net6 VSS nfet_03v3 w=1u l=0.84u nf=2 m=1 +MM2 net6 net6 VSS VSS nfet_03v3 w=1u l=0.84u nf=2 m=1 +MM3 IOUT1 IIN1 net12 VSS nfet_03v3 w=1u l=0.84u nf=2 m=1 +MM4 net12 net6 VSS VSS nfet_03v3 w=1u l=0.84u nf=2 m=1 +.ends C02_gf180_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C02/gf180/sW0.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW0.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..a807c8f6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW0.5_sL1.5/target_lvs.spice @@ -0,0 +1,10 @@ +.subckt C02_gf180_sW0.5_sL1.5 VSS IIN1 IOUT1 +MM1_f0 IIN1 IIN1 net6 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f1 IIN1 IIN1 net6 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f0 net6 net6 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM2_f1 net6 net6 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f0 IOUT1 IIN1 net12 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f1 IOUT1 IIN1 net12 VSS nfet_03v3 w=0.5u l=0.84u +MM4_f0 net12 net6 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM4_f1 net12 net6 VSS VSS nfet_03v3 w=0.5u l=0.84u +.ends C02_gf180_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C02/gf180/sW0.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW0.5_sL1.5/testbench.spice new file mode 100644 index 00000000..24e552dc --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW0.5_sL1.5/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IIN1 IOUT1 C02_gf180_sW0.5_sL1.5 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIIN1 VDDB IIN1 2e-05 +.nodeset v(IIN1)=0.99 + +VOUT IOUT1 0 3.3 +.control +dc VOUT 3.3 0 -0.00825 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=2 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.03 cross=last +meas dc dev_at_vdd find dev at=3.2835 +let gout = deriv(iout) +meas dc gout_t find gout at=2 +let rout_v = 1/gout +meas dc rout_t find rout_v at=2 +echo vout_test = 2 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C02/gf180/sW0.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW0.5_sL1/case.json new file mode 100644 index 00000000..c9b39728 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW0.5_sL1/case.json @@ -0,0 +1,141 @@ +{ + "case_id": "C02_gf180_sW0.5_sL1", + "circuit_id": "C02", + "pdk": "gf180", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "dut_name": "C02_gf180_sW0.5_sL1", + "ports": [ + "VSS", + "IIN1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 1.0, + "l": 0.56, + "nf": 2 + }, + "M2": { + "w": 1.0, + "l": 0.56, + "nf": 2 + }, + "M3": { + "w": 1.0, + "l": 0.56, + "nf": 2 + }, + "M4": { + "w": 1.0, + "l": 0.56, + "nf": 2 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 2.145, + "tol": 0.03, + "vout_test": 2.02 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.56, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.56, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.56, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.56, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "77590a9359bb5a82", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/gf180/sW0.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW0.5_sL1/manifest.json new file mode 100644 index 00000000..11203545 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW0.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "deefa32b84dc62a55b46d0e31498c246f51444f2ab9e2ff68208fcdc77ff6be1", + "qualification.json": "b742e4e8d547aba3f7d59db2cc4d31a4115a14960231afa38d8b4e141cefc3dd", + "specs.json": "d27039ad27cf8eb25d585d694cf5807b444eeafe3d78cd75e21a73fc4b5f7c34", + "target.spice": "603b32216e493bc0d1c0e8332be8d495965e83c09e4b6eefcf95a02463ea2b27", + "target_lvs.spice": "feb6db9f449e692c4aa4184daf18042ae2aa814ac9852fe50a1db7fc824d1507", + "testbench.spice": "2d011449872e11a5f4a00975ab7de1118bc36be8632f19c2d7036e1fe536a2ef" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/gf180/sW0.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW0.5_sL1/qualification.json new file mode 100644 index 00000000..0dafd995 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW0.5_sL1/qualification.json @@ -0,0 +1,115 @@ +{ + "case_id": "C02_gf180_sW0.5_sL1", + "circuit_id": "C02", + "pdk": "gf180", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.56, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.56, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.56, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.56, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "77590a9359bb5a82", + "mirror_pass1": { + "vmin": 0.7435945, + "status": "passed", + "vout_test": 2.02 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.8436 + }, + "_frozen_from": { + "schematic": { + "err": -0.000192, + "vmin": 0.7435945 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.9799999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.2, + "schematic_measures": { + "iout_t": 1.999616e-05, + "err": -0.000192, + "vmin": 0.7435945, + "dev_at_vdd": 0.0003154771, + "gout_t": 1.068846e-08, + "rout_t": 93560570.0, + "vout_test": 2.02, + "rout_nom": 93560570.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/gf180/sW0.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW0.5_sL1/specs.json new file mode 100644 index 00000000..c1673505 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW0.5_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.8436 + }, + "_frozen_from": { + "schematic": { + "err": -0.000192, + "vmin": 0.7435945 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.9799999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/gf180/sW0.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW0.5_sL1/target.spice new file mode 100644 index 00000000..484fd260 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW0.5_sL1/target.spice @@ -0,0 +1,6 @@ +.subckt C02_gf180_sW0.5_sL1 VSS IIN1 IOUT1 +MM1 IIN1 IIN1 net6 VSS nfet_03v3 w=1u l=0.56u nf=2 m=1 +MM2 net6 net6 VSS VSS nfet_03v3 w=1u l=0.56u nf=2 m=1 +MM3 IOUT1 IIN1 net12 VSS nfet_03v3 w=1u l=0.56u nf=2 m=1 +MM4 net12 net6 VSS VSS nfet_03v3 w=1u l=0.56u nf=2 m=1 +.ends C02_gf180_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C02/gf180/sW0.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW0.5_sL1/target_lvs.spice new file mode 100644 index 00000000..282dfe1c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW0.5_sL1/target_lvs.spice @@ -0,0 +1,10 @@ +.subckt C02_gf180_sW0.5_sL1 VSS IIN1 IOUT1 +MM1_f0 IIN1 IIN1 net6 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f1 IIN1 IIN1 net6 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f0 net6 net6 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM2_f1 net6 net6 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f0 IOUT1 IIN1 net12 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f1 IOUT1 IIN1 net12 VSS nfet_03v3 w=0.5u l=0.56u +MM4_f0 net12 net6 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM4_f1 net12 net6 VSS VSS nfet_03v3 w=0.5u l=0.56u +.ends C02_gf180_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C02/gf180/sW0.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW0.5_sL1/testbench.spice new file mode 100644 index 00000000..45304d1f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW0.5_sL1/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IIN1 IOUT1 C02_gf180_sW0.5_sL1 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIIN1 VDDB IIN1 2e-05 +.nodeset v(IIN1)=0.99 + +VOUT IOUT1 0 3.3 +.control +dc VOUT 3.3 0 -0.00825 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=2.02 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.03 cross=last +meas dc dev_at_vdd find dev at=3.2835 +let gout = deriv(iout) +meas dc gout_t find gout at=2.02 +let rout_v = 1/gout +meas dc rout_t find rout_v at=2.02 +echo vout_test = 2.02 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C02/gf180/sW0.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW0.5_sL2/case.json new file mode 100644 index 00000000..dde14178 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW0.5_sL2/case.json @@ -0,0 +1,141 @@ +{ + "case_id": "C02_gf180_sW0.5_sL2", + "circuit_id": "C02", + "pdk": "gf180", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "dut_name": "C02_gf180_sW0.5_sL2", + "ports": [ + "VSS", + "IIN1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 1.0, + "l": 1.12, + "nf": 2 + }, + "M2": { + "w": 1.0, + "l": 1.12, + "nf": 2 + }, + "M3": { + "w": 1.0, + "l": 1.12, + "nf": 2 + }, + "M4": { + "w": 1.0, + "l": 1.12, + "nf": 2 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 2.145, + "tol": 0.03, + "vout_test": 2.01 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.12, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.12, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.12, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.12, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "4af620ff0d57022c", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/gf180/sW0.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW0.5_sL2/manifest.json new file mode 100644 index 00000000..c8823da1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW0.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "620c8402e759df5a55f99c8778eaa6367c947b0ca65f8f857d8e66c3e186d5aa", + "qualification.json": "0b752c01e8a84d6ec7963fd2bafaf0f2b47dab655df70796919a3d5d741bbc1a", + "specs.json": "ecbac8b20362406317e9d37008b04e0fd1a9dbc5a5958cb190cb02ce10d077ba", + "target.spice": "78cd6ed5b830ec7e49e806cd4b17c338d48675aa1be09c90017e026a18476d42", + "target_lvs.spice": "0b234a76bc3a35defb94eb5b59776f178f7066c5c07ab0c0ce05c1748bcd9e97", + "testbench.spice": "b5fe5d9c17ca996ca43a46f433d27fa56ee17baf00529e60d43af23922be83d7" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/gf180/sW0.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW0.5_sL2/qualification.json new file mode 100644 index 00000000..51581e32 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW0.5_sL2/qualification.json @@ -0,0 +1,115 @@ +{ + "case_id": "C02_gf180_sW0.5_sL2", + "circuit_id": "C02", + "pdk": "gf180", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.12, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.12, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.12, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.12, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "4af620ff0d57022c", + "mirror_pass1": { + "vmin": 0.7109873, + "status": "passed", + "vout_test": 2.01 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.811 + }, + "_frozen_from": { + "schematic": { + "err": -0.000122, + "vmin": 0.7109873 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.9799999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "iout_t": 1.999756e-05, + "err": -0.000122, + "vmin": 0.7109873, + "dev_at_vdd": 2.446146e-05, + "gout_t": 6.874304e-09, + "rout_t": 145538500.0, + "vout_test": 2.01, + "rout_nom": 145538500.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/gf180/sW0.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW0.5_sL2/specs.json new file mode 100644 index 00000000..8e6f5921 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW0.5_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.811 + }, + "_frozen_from": { + "schematic": { + "err": -0.000122, + "vmin": 0.7109873 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.9799999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/gf180/sW0.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW0.5_sL2/target.spice new file mode 100644 index 00000000..fc7befff --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW0.5_sL2/target.spice @@ -0,0 +1,6 @@ +.subckt C02_gf180_sW0.5_sL2 VSS IIN1 IOUT1 +MM1 IIN1 IIN1 net6 VSS nfet_03v3 w=1u l=1.12u nf=2 m=1 +MM2 net6 net6 VSS VSS nfet_03v3 w=1u l=1.12u nf=2 m=1 +MM3 IOUT1 IIN1 net12 VSS nfet_03v3 w=1u l=1.12u nf=2 m=1 +MM4 net12 net6 VSS VSS nfet_03v3 w=1u l=1.12u nf=2 m=1 +.ends C02_gf180_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C02/gf180/sW0.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW0.5_sL2/target_lvs.spice new file mode 100644 index 00000000..1456ecc6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW0.5_sL2/target_lvs.spice @@ -0,0 +1,10 @@ +.subckt C02_gf180_sW0.5_sL2 VSS IIN1 IOUT1 +MM1_f0 IIN1 IIN1 net6 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f1 IIN1 IIN1 net6 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f0 net6 net6 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM2_f1 net6 net6 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f0 IOUT1 IIN1 net12 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f1 IOUT1 IIN1 net12 VSS nfet_03v3 w=0.5u l=1.12u +MM4_f0 net12 net6 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM4_f1 net12 net6 VSS VSS nfet_03v3 w=0.5u l=1.12u +.ends C02_gf180_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C02/gf180/sW0.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW0.5_sL2/testbench.spice new file mode 100644 index 00000000..78f0ff99 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW0.5_sL2/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IIN1 IOUT1 C02_gf180_sW0.5_sL2 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIIN1 VDDB IIN1 2e-05 +.nodeset v(IIN1)=0.99 + +VOUT IOUT1 0 3.3 +.control +dc VOUT 3.3 0 -0.00825 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=2.01 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.03 cross=last +meas dc dev_at_vdd find dev at=3.2835 +let gout = deriv(iout) +meas dc gout_t find gout at=2.01 +let rout_v = 1/gout +meas dc rout_t find rout_v at=2.01 +echo vout_test = 2.01 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1.5_sL1.5/case.json new file mode 100644 index 00000000..74dc98b6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1.5_sL1.5/case.json @@ -0,0 +1,141 @@ +{ + "case_id": "C02_gf180_sW1.5_sL1.5", + "circuit_id": "C02", + "pdk": "gf180", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "dut_name": "C02_gf180_sW1.5_sL1.5", + "ports": [ + "VSS", + "IIN1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 3.0, + "l": 0.84, + "nf": 6 + }, + "M2": { + "w": 3.0, + "l": 0.84, + "nf": 6 + }, + "M3": { + "w": 3.0, + "l": 0.84, + "nf": 6 + }, + "M4": { + "w": 3.0, + "l": 0.84, + "nf": 6 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 2.145, + "tol": 0.03, + "vout_test": 1.88 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.84, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.84, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.84, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.84, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "39e6f9cd7c9ad576", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1.5_sL1.5/manifest.json new file mode 100644 index 00000000..c844794b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "8141288feea00aa3d722de718d0809dda86501041250528b1a7f57759069261e", + "qualification.json": "af22ec12893a69ee7833faf791db976a13075e6a377f5d3a558b773da5df5cba", + "specs.json": "d4469f8126a2fadec518d8ade14ea614102128bb2c9e94c2c54e29040db2a589", + "target.spice": "5d87c3de11f28de5cb5fed45cc0a8396a6f9b9a22fa95debd17e776229a76b97", + "target_lvs.spice": "f91db22ff26353b86258c6355f631c48ceb0f149208fc97f163433ea41ca1be6", + "testbench.spice": "bcc66e610ac608a2f18950f1d559babcf1b1c5647981c1eca68487494295270f" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1.5_sL1.5/qualification.json new file mode 100644 index 00000000..af41e730 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1.5_sL1.5/qualification.json @@ -0,0 +1,115 @@ +{ + "case_id": "C02_gf180_sW1.5_sL1.5", + "circuit_id": "C02", + "pdk": "gf180", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.84, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.84, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.84, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.84, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "39e6f9cd7c9ad576", + "mirror_pass1": { + "vmin": 0.4599782, + "status": "passed", + "vout_test": 1.88 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.56 + }, + "_frozen_from": { + "schematic": { + "err": -4.25e-05, + "vmin": 0.4599782 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.9799999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.2, + "schematic_measures": { + "iout_t": 1.999915e-05, + "err": -4.25e-05, + "vmin": 0.4599782, + "dev_at_vdd": 0.0004312884, + "gout_t": 3.111474e-09, + "rout_t": 321393600.0, + "vout_test": 1.88, + "rout_nom": 321393600.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1.5_sL1.5/specs.json new file mode 100644 index 00000000..0374231a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1.5_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.56 + }, + "_frozen_from": { + "schematic": { + "err": -4.25e-05, + "vmin": 0.4599782 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.9799999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1.5_sL1.5/target.spice new file mode 100644 index 00000000..f14d18ca --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1.5_sL1.5/target.spice @@ -0,0 +1,6 @@ +.subckt C02_gf180_sW1.5_sL1.5 VSS IIN1 IOUT1 +MM1 IIN1 IIN1 net6 VSS nfet_03v3 w=3u l=0.84u nf=6 m=1 +MM2 net6 net6 VSS VSS nfet_03v3 w=3u l=0.84u nf=6 m=1 +MM3 IOUT1 IIN1 net12 VSS nfet_03v3 w=3u l=0.84u nf=6 m=1 +MM4 net12 net6 VSS VSS nfet_03v3 w=3u l=0.84u nf=6 m=1 +.ends C02_gf180_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..dd8503af --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1.5_sL1.5/target_lvs.spice @@ -0,0 +1,26 @@ +.subckt C02_gf180_sW1.5_sL1.5 VSS IIN1 IOUT1 +MM1_f0 IIN1 IIN1 net6 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f1 IIN1 IIN1 net6 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f2 IIN1 IIN1 net6 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f3 IIN1 IIN1 net6 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f4 IIN1 IIN1 net6 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f5 IIN1 IIN1 net6 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f0 net6 net6 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM2_f1 net6 net6 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM2_f2 net6 net6 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM2_f3 net6 net6 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM2_f4 net6 net6 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM2_f5 net6 net6 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f0 IOUT1 IIN1 net12 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f1 IOUT1 IIN1 net12 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f2 IOUT1 IIN1 net12 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f3 IOUT1 IIN1 net12 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f4 IOUT1 IIN1 net12 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f5 IOUT1 IIN1 net12 VSS nfet_03v3 w=0.5u l=0.84u +MM4_f0 net12 net6 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM4_f1 net12 net6 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM4_f2 net12 net6 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM4_f3 net12 net6 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM4_f4 net12 net6 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM4_f5 net12 net6 VSS VSS nfet_03v3 w=0.5u l=0.84u +.ends C02_gf180_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1.5_sL1.5/testbench.spice new file mode 100644 index 00000000..8d167fda --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1.5_sL1.5/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IIN1 IOUT1 C02_gf180_sW1.5_sL1.5 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIIN1 VDDB IIN1 2e-05 +.nodeset v(IIN1)=0.99 + +VOUT IOUT1 0 3.3 +.control +dc VOUT 3.3 0 -0.00825 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=1.88 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.03 cross=last +meas dc dev_at_vdd find dev at=3.2835 +let gout = deriv(iout) +meas dc gout_t find gout at=1.88 +let rout_v = 1/gout +meas dc rout_t find rout_v at=1.88 +echo vout_test = 1.88 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1.5_sL1/case.json new file mode 100644 index 00000000..b8a44bd7 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1.5_sL1/case.json @@ -0,0 +1,141 @@ +{ + "case_id": "C02_gf180_sW1.5_sL1", + "circuit_id": "C02", + "pdk": "gf180", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "dut_name": "C02_gf180_sW1.5_sL1", + "ports": [ + "VSS", + "IIN1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 3.0, + "l": 0.56, + "nf": 6 + }, + "M2": { + "w": 3.0, + "l": 0.56, + "nf": 6 + }, + "M3": { + "w": 3.0, + "l": 0.56, + "nf": 6 + }, + "M4": { + "w": 3.0, + "l": 0.56, + "nf": 6 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 2.145, + "tol": 0.03, + "vout_test": 1.93 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.56, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.56, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.56, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.56, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "e77f24768a6419d7", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1.5_sL1/manifest.json new file mode 100644 index 00000000..05c6568f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "b02d15dbab0dc44b630a8a43b32e41fa4fea1a68f5aa77515fa957817d8e6b77", + "qualification.json": "4f64913b273da4bf30a159ea2c34eb4ff0cd47f2b7e570b83da50d4e7007996a", + "specs.json": "ae59ee0f3e39acdefc4a98e1372cb01db014d2e82f9929a6a7f8f0fc6f76382d", + "target.spice": "f95b57b62fd46cf8e889cb29fe0b9b4ed72fc9861ede05d9dc042e83221a6043", + "target_lvs.spice": "8f097b28ed6eb9fbb143121d979641ee6a9f8416a00b144990676f720849ee04", + "testbench.spice": "3cdcb4a6ea664d6db2bcc4df8998457c048c65f8adeb253712cb6a2d49a06a60" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1.5_sL1/qualification.json new file mode 100644 index 00000000..ba72d86d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1.5_sL1/qualification.json @@ -0,0 +1,115 @@ +{ + "case_id": "C02_gf180_sW1.5_sL1", + "circuit_id": "C02", + "pdk": "gf180", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.56, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.56, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.56, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.56, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "e77f24768a6419d7", + "mirror_pass1": { + "vmin": 0.5577191, + "status": "passed", + "vout_test": 1.93 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.6577 + }, + "_frozen_from": { + "schematic": { + "err": -3.75e-05, + "vmin": 0.5577191 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.9799999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.2, + "schematic_measures": { + "iout_t": 1.999925e-05, + "err": -3.75e-05, + "vmin": 0.5577191, + "dev_at_vdd": 0.001026859, + "gout_t": 7.294065e-09, + "rout_t": 137098000.0, + "vout_test": 1.93, + "rout_nom": 137098000.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1.5_sL1/specs.json new file mode 100644 index 00000000..ccd7b6c9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1.5_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.6577 + }, + "_frozen_from": { + "schematic": { + "err": -3.75e-05, + "vmin": 0.5577191 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.9799999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1.5_sL1/target.spice new file mode 100644 index 00000000..7d83b37b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1.5_sL1/target.spice @@ -0,0 +1,6 @@ +.subckt C02_gf180_sW1.5_sL1 VSS IIN1 IOUT1 +MM1 IIN1 IIN1 net6 VSS nfet_03v3 w=3u l=0.56u nf=6 m=1 +MM2 net6 net6 VSS VSS nfet_03v3 w=3u l=0.56u nf=6 m=1 +MM3 IOUT1 IIN1 net12 VSS nfet_03v3 w=3u l=0.56u nf=6 m=1 +MM4 net12 net6 VSS VSS nfet_03v3 w=3u l=0.56u nf=6 m=1 +.ends C02_gf180_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1.5_sL1/target_lvs.spice new file mode 100644 index 00000000..97ce1acc --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1.5_sL1/target_lvs.spice @@ -0,0 +1,26 @@ +.subckt C02_gf180_sW1.5_sL1 VSS IIN1 IOUT1 +MM1_f0 IIN1 IIN1 net6 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f1 IIN1 IIN1 net6 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f2 IIN1 IIN1 net6 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f3 IIN1 IIN1 net6 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f4 IIN1 IIN1 net6 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f5 IIN1 IIN1 net6 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f0 net6 net6 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM2_f1 net6 net6 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM2_f2 net6 net6 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM2_f3 net6 net6 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM2_f4 net6 net6 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM2_f5 net6 net6 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f0 IOUT1 IIN1 net12 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f1 IOUT1 IIN1 net12 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f2 IOUT1 IIN1 net12 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f3 IOUT1 IIN1 net12 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f4 IOUT1 IIN1 net12 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f5 IOUT1 IIN1 net12 VSS nfet_03v3 w=0.5u l=0.56u +MM4_f0 net12 net6 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM4_f1 net12 net6 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM4_f2 net12 net6 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM4_f3 net12 net6 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM4_f4 net12 net6 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM4_f5 net12 net6 VSS VSS nfet_03v3 w=0.5u l=0.56u +.ends C02_gf180_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1.5_sL1/testbench.spice new file mode 100644 index 00000000..3dfb5673 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1.5_sL1/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IIN1 IOUT1 C02_gf180_sW1.5_sL1 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIIN1 VDDB IIN1 2e-05 +.nodeset v(IIN1)=0.99 + +VOUT IOUT1 0 3.3 +.control +dc VOUT 3.3 0 -0.00825 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=1.93 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.03 cross=last +meas dc dev_at_vdd find dev at=3.2835 +let gout = deriv(iout) +meas dc gout_t find gout at=1.93 +let rout_v = 1/gout +meas dc rout_t find rout_v at=1.93 +echo vout_test = 1.93 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1.5_sL2/case.json new file mode 100644 index 00000000..d5a7b628 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1.5_sL2/case.json @@ -0,0 +1,141 @@ +{ + "case_id": "C02_gf180_sW1.5_sL2", + "circuit_id": "C02", + "pdk": "gf180", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "dut_name": "C02_gf180_sW1.5_sL2", + "ports": [ + "VSS", + "IIN1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 3.0, + "l": 1.12, + "nf": 6 + }, + "M2": { + "w": 3.0, + "l": 1.12, + "nf": 6 + }, + "M3": { + "w": 3.0, + "l": 1.12, + "nf": 6 + }, + "M4": { + "w": 3.0, + "l": 1.12, + "nf": 6 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 2.145, + "tol": 0.03, + "vout_test": 1.87 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.12, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.12, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.12, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.12, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "108b7665c0c5f997", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1.5_sL2/manifest.json new file mode 100644 index 00000000..19929d42 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "22325b44f855e2aa65694accdc32ad5c3e7e00b869ff0a758e800ac83c740695", + "qualification.json": "b7506e137a5b6050d1d8e993286a3f6d91c39c98fcd29985f9770f28b7128a84", + "specs.json": "9bee644a2e56855115c59f7650d1f0a5a2f7a704fe9243db50c2b8fbd4e9ed95", + "target.spice": "9a4d0b0563e12d7ba1321ca7d7404f71e7429f77b1f3354764cd1155c4e78dbf", + "target_lvs.spice": "42701dd2b92c7db5859035c97126808aea40483550b3f582282b72f49e9a2972", + "testbench.spice": "cb7f05a821ebc5aae7d64b658d19c0a240c4845ed320f094f7e107514f16f46b" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1.5_sL2/qualification.json new file mode 100644 index 00000000..e03126d2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1.5_sL2/qualification.json @@ -0,0 +1,115 @@ +{ + "case_id": "C02_gf180_sW1.5_sL2", + "circuit_id": "C02", + "pdk": "gf180", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.12, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.12, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.12, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.12, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "108b7665c0c5f997", + "mirror_pass1": { + "vmin": 0.431989, + "status": "passed", + "vout_test": 1.87 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.532 + }, + "_frozen_from": { + "schematic": { + "err": -3.7e-05, + "vmin": 0.431989 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.9799999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.2, + "schematic_measures": { + "iout_t": 1.999926e-05, + "err": -3.7e-05, + "vmin": 0.431989, + "dev_at_vdd": 0.000208023, + "gout_t": 2.06274e-09, + "rout_t": 484803600.0, + "vout_test": 1.87, + "rout_nom": 484803600.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1.5_sL2/specs.json new file mode 100644 index 00000000..449fdb6a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1.5_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.532 + }, + "_frozen_from": { + "schematic": { + "err": -3.7e-05, + "vmin": 0.431989 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.9799999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1.5_sL2/target.spice new file mode 100644 index 00000000..09439f02 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1.5_sL2/target.spice @@ -0,0 +1,6 @@ +.subckt C02_gf180_sW1.5_sL2 VSS IIN1 IOUT1 +MM1 IIN1 IIN1 net6 VSS nfet_03v3 w=3u l=1.12u nf=6 m=1 +MM2 net6 net6 VSS VSS nfet_03v3 w=3u l=1.12u nf=6 m=1 +MM3 IOUT1 IIN1 net12 VSS nfet_03v3 w=3u l=1.12u nf=6 m=1 +MM4 net12 net6 VSS VSS nfet_03v3 w=3u l=1.12u nf=6 m=1 +.ends C02_gf180_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1.5_sL2/target_lvs.spice new file mode 100644 index 00000000..3ddcdf22 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1.5_sL2/target_lvs.spice @@ -0,0 +1,26 @@ +.subckt C02_gf180_sW1.5_sL2 VSS IIN1 IOUT1 +MM1_f0 IIN1 IIN1 net6 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f1 IIN1 IIN1 net6 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f2 IIN1 IIN1 net6 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f3 IIN1 IIN1 net6 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f4 IIN1 IIN1 net6 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f5 IIN1 IIN1 net6 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f0 net6 net6 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM2_f1 net6 net6 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM2_f2 net6 net6 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM2_f3 net6 net6 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM2_f4 net6 net6 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM2_f5 net6 net6 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f0 IOUT1 IIN1 net12 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f1 IOUT1 IIN1 net12 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f2 IOUT1 IIN1 net12 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f3 IOUT1 IIN1 net12 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f4 IOUT1 IIN1 net12 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f5 IOUT1 IIN1 net12 VSS nfet_03v3 w=0.5u l=1.12u +MM4_f0 net12 net6 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM4_f1 net12 net6 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM4_f2 net12 net6 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM4_f3 net12 net6 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM4_f4 net12 net6 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM4_f5 net12 net6 VSS VSS nfet_03v3 w=0.5u l=1.12u +.ends C02_gf180_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1.5_sL2/testbench.spice new file mode 100644 index 00000000..4e4670ba --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1.5_sL2/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IIN1 IOUT1 C02_gf180_sW1.5_sL2 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIIN1 VDDB IIN1 2e-05 +.nodeset v(IIN1)=0.99 + +VOUT IOUT1 0 3.3 +.control +dc VOUT 3.3 0 -0.00825 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=1.87 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.03 cross=last +meas dc dev_at_vdd find dev at=3.2835 +let gout = deriv(iout) +meas dc gout_t find gout at=1.87 +let rout_v = 1/gout +meas dc rout_t find rout_v at=1.87 +echo vout_test = 1.87 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1_sL1.5/case.json new file mode 100644 index 00000000..c1624ef0 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1_sL1.5/case.json @@ -0,0 +1,141 @@ +{ + "case_id": "C02_gf180_sW1_sL1.5", + "circuit_id": "C02", + "pdk": "gf180", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "dut_name": "C02_gf180_sW1_sL1.5", + "ports": [ + "VSS", + "IIN1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.84, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 0.84, + "nf": 4 + }, + "M3": { + "w": 2.0, + "l": 0.84, + "nf": 4 + }, + "M4": { + "w": 2.0, + "l": 0.84, + "nf": 4 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 2.145, + "tol": 0.03, + "vout_test": 1.91 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "2899078a84470112", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1_sL1.5/manifest.json new file mode 100644 index 00000000..10ba63e2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "a956e021cc798507428eb83457278586baf804e5898a7a65a6b1835274f2c648", + "qualification.json": "ed1e34d23d499d7ad75d58c2ede900f1bbc0673d48f0e175ee4d13ed8862cfc9", + "specs.json": "6b015f9feca5214b55e0b526e56e28bc912378fa4f6beef13cce247a9facf2f0", + "target.spice": "8a0235ecd2f13cde06e10c1b5f30a4358c8e2a6eabd800a2f6e0651f6a7c6722", + "target_lvs.spice": "5ae4ab9d96d75a519d9eec0a997fb46d8e797d9e6d1dac5d4212ff6e3fde0aee", + "testbench.spice": "dbc2ee73a94d2c942d01b7a2d66d6b1ab82068c8e5b2bbd96407c7a4b7f06fc6" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1_sL1.5/qualification.json new file mode 100644 index 00000000..661ed06a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1_sL1.5/qualification.json @@ -0,0 +1,115 @@ +{ + "case_id": "C02_gf180_sW1_sL1.5", + "circuit_id": "C02", + "pdk": "gf180", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "2899078a84470112", + "mirror_pass1": { + "vmin": 0.5269029, + "status": "passed", + "vout_test": 1.91 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.6269 + }, + "_frozen_from": { + "schematic": { + "err": -6.55e-05, + "vmin": 0.5269029 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.9799999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "iout_t": 1.999869e-05, + "err": -6.55e-05, + "vmin": 0.5269029, + "dev_at_vdd": 0.0002402067, + "gout_t": 3.689619e-09, + "rout_t": 271039400.0, + "vout_test": 1.91, + "rout_nom": 271039400.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1_sL1.5/specs.json new file mode 100644 index 00000000..8924e9ba --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.6269 + }, + "_frozen_from": { + "schematic": { + "err": -6.55e-05, + "vmin": 0.5269029 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.9799999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1_sL1.5/target.spice new file mode 100644 index 00000000..13c0d28c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1_sL1.5/target.spice @@ -0,0 +1,6 @@ +.subckt C02_gf180_sW1_sL1.5 VSS IIN1 IOUT1 +MM1 IIN1 IIN1 net6 VSS nfet_03v3 w=2u l=0.84u nf=4 m=1 +MM2 net6 net6 VSS VSS nfet_03v3 w=2u l=0.84u nf=4 m=1 +MM3 IOUT1 IIN1 net12 VSS nfet_03v3 w=2u l=0.84u nf=4 m=1 +MM4 net12 net6 VSS VSS nfet_03v3 w=2u l=0.84u nf=4 m=1 +.ends C02_gf180_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1_sL1.5/target_lvs.spice new file mode 100644 index 00000000..98e03865 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1_sL1.5/target_lvs.spice @@ -0,0 +1,18 @@ +.subckt C02_gf180_sW1_sL1.5 VSS IIN1 IOUT1 +MM1_f0 IIN1 IIN1 net6 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f1 IIN1 IIN1 net6 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f2 IIN1 IIN1 net6 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f3 IIN1 IIN1 net6 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f0 net6 net6 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM2_f1 net6 net6 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM2_f2 net6 net6 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM2_f3 net6 net6 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f0 IOUT1 IIN1 net12 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f1 IOUT1 IIN1 net12 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f2 IOUT1 IIN1 net12 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f3 IOUT1 IIN1 net12 VSS nfet_03v3 w=0.5u l=0.84u +MM4_f0 net12 net6 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM4_f1 net12 net6 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM4_f2 net12 net6 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM4_f3 net12 net6 VSS VSS nfet_03v3 w=0.5u l=0.84u +.ends C02_gf180_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1_sL1.5/testbench.spice new file mode 100644 index 00000000..70c33601 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1_sL1.5/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IIN1 IOUT1 C02_gf180_sW1_sL1.5 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIIN1 VDDB IIN1 2e-05 +.nodeset v(IIN1)=0.99 + +VOUT IOUT1 0 3.3 +.control +dc VOUT 3.3 0 -0.00825 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=1.91 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.03 cross=last +meas dc dev_at_vdd find dev at=3.2835 +let gout = deriv(iout) +meas dc gout_t find gout at=1.91 +let rout_v = 1/gout +meas dc rout_t find rout_v at=1.91 +echo vout_test = 1.91 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1_sL1/case.json new file mode 100644 index 00000000..0893696c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1_sL1/case.json @@ -0,0 +1,141 @@ +{ + "case_id": "C02_gf180_sW1_sL1", + "circuit_id": "C02", + "pdk": "gf180", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "dut_name": "C02_gf180_sW1_sL1", + "ports": [ + "VSS", + "IIN1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.56, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 0.56, + "nf": 4 + }, + "M3": { + "w": 2.0, + "l": 0.56, + "nf": 4 + }, + "M4": { + "w": 2.0, + "l": 0.56, + "nf": 4 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 2.145, + "tol": 0.03, + "vout_test": 1.95 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "696ceb44a6fa6494", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1_sL1/manifest.json new file mode 100644 index 00000000..28608069 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "b0e60fd97759acb3fbecb1c2e867d631b511de93913ec047b170ce0d19bc9b01", + "qualification.json": "c4ce220a66f07f36be52d151534e86b887a6040c110d019450cf2157d94c2f50", + "specs.json": "32c66be98a3c3d3a76db8326f7c93c38c8b04a0e8016595b31e102e60e4f1602", + "target.spice": "8706c8b891770ddf3baa387fdd97ee78913415339ea6758652bf5287054ac9d6", + "target_lvs.spice": "42c3db0e5c1f72a4c5138d569ed64617e02ba4455286691fc93c5ef78538fa92", + "testbench.spice": "bc66e7b9aa47e845bea5766a7bd036b6f976afd0e3d426a6ae781b0a8ef9d962" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1_sL1/qualification.json new file mode 100644 index 00000000..d8ccb5a4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1_sL1/qualification.json @@ -0,0 +1,115 @@ +{ + "case_id": "C02_gf180_sW1_sL1", + "circuit_id": "C02", + "pdk": "gf180", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "696ceb44a6fa6494", + "mirror_pass1": { + "vmin": 0.6092603, + "status": "passed", + "vout_test": 1.95 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.7093 + }, + "_frozen_from": { + "schematic": { + "err": -8.05e-05, + "vmin": 0.6092603 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.9799999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.2, + "schematic_measures": { + "iout_t": 1.999839e-05, + "err": -8.05e-05, + "vmin": 0.6092603, + "dev_at_vdd": 0.0006958431, + "gout_t": 7.968778e-09, + "rout_t": 125491300.0, + "vout_test": 1.95, + "rout_nom": 125491300.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1_sL1/specs.json new file mode 100644 index 00000000..33d18851 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.7093 + }, + "_frozen_from": { + "schematic": { + "err": -8.05e-05, + "vmin": 0.6092603 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.9799999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1_sL1/target.spice new file mode 100644 index 00000000..c9e4d5e3 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1_sL1/target.spice @@ -0,0 +1,6 @@ +.subckt C02_gf180_sW1_sL1 VSS IIN1 IOUT1 +MM1 IIN1 IIN1 net6 VSS nfet_03v3 w=2u l=0.56u nf=4 m=1 +MM2 net6 net6 VSS VSS nfet_03v3 w=2u l=0.56u nf=4 m=1 +MM3 IOUT1 IIN1 net12 VSS nfet_03v3 w=2u l=0.56u nf=4 m=1 +MM4 net12 net6 VSS VSS nfet_03v3 w=2u l=0.56u nf=4 m=1 +.ends C02_gf180_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1_sL1/target_lvs.spice new file mode 100644 index 00000000..e80e0969 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1_sL1/target_lvs.spice @@ -0,0 +1,18 @@ +.subckt C02_gf180_sW1_sL1 VSS IIN1 IOUT1 +MM1_f0 IIN1 IIN1 net6 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f1 IIN1 IIN1 net6 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f2 IIN1 IIN1 net6 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f3 IIN1 IIN1 net6 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f0 net6 net6 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM2_f1 net6 net6 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM2_f2 net6 net6 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM2_f3 net6 net6 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f0 IOUT1 IIN1 net12 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f1 IOUT1 IIN1 net12 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f2 IOUT1 IIN1 net12 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f3 IOUT1 IIN1 net12 VSS nfet_03v3 w=0.5u l=0.56u +MM4_f0 net12 net6 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM4_f1 net12 net6 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM4_f2 net12 net6 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM4_f3 net12 net6 VSS VSS nfet_03v3 w=0.5u l=0.56u +.ends C02_gf180_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1_sL1/testbench.spice new file mode 100644 index 00000000..8541919b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1_sL1/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IIN1 IOUT1 C02_gf180_sW1_sL1 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIIN1 VDDB IIN1 2e-05 +.nodeset v(IIN1)=0.99 + +VOUT IOUT1 0 3.3 +.control +dc VOUT 3.3 0 -0.00825 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=1.95 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.03 cross=last +meas dc dev_at_vdd find dev at=3.2835 +let gout = deriv(iout) +meas dc gout_t find gout at=1.95 +let rout_v = 1/gout +meas dc rout_t find rout_v at=1.95 +echo vout_test = 1.95 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1_sL2/case.json new file mode 100644 index 00000000..102e7330 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1_sL2/case.json @@ -0,0 +1,141 @@ +{ + "case_id": "C02_gf180_sW1_sL2", + "circuit_id": "C02", + "pdk": "gf180", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "dut_name": "C02_gf180_sW1_sL2", + "ports": [ + "VSS", + "IIN1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 1.12, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 1.12, + "nf": 4 + }, + "M3": { + "w": 2.0, + "l": 1.12, + "nf": 4 + }, + "M4": { + "w": 2.0, + "l": 1.12, + "nf": 4 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 2.145, + "tol": 0.03, + "vout_test": 1.91 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "219af85053dd9873", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1_sL2/manifest.json new file mode 100644 index 00000000..ee364e03 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "1eff6b8a4450f4835f7b8235a963fed69024db5d761afd807a9349b74ae567df", + "qualification.json": "628d468f00d857d6e8eef36e7c1e0055dd988ddf6515446bbc3085d6f6b50aca", + "specs.json": "cd6c8924cc6d1deb5261065d6fd82ce66a54a239f3e576066eb3edbfebc7aefd", + "target.spice": "1e74e2ab533ee185cf556046a389ee798702557a65850f0bf3e53aa9c4a7b6c3", + "target_lvs.spice": "9bf8e4c10bd37a609db9705a580611cf0cbb634f2825d925535d752624b55d2f", + "testbench.spice": "bef5019b2ceaf52e7841f762c017bcc9c4427981c39103d0626fe005293f2c3f" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1_sL2/qualification.json new file mode 100644 index 00000000..ea50233d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1_sL2/qualification.json @@ -0,0 +1,115 @@ +{ + "case_id": "C02_gf180_sW1_sL2", + "circuit_id": "C02", + "pdk": "gf180", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "219af85053dd9873", + "mirror_pass1": { + "vmin": 0.5125606, + "status": "passed", + "vout_test": 1.91 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.6126 + }, + "_frozen_from": { + "schematic": { + "err": -5.45e-05, + "vmin": 0.5125606 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.9799999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "iout_t": 1.999891e-05, + "err": -5.45e-05, + "vmin": 0.5125606, + "dev_at_vdd": 0.0001010362, + "gout_t": 2.588956e-09, + "rout_t": 386278100.0, + "vout_test": 1.91, + "rout_nom": 386278100.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1_sL2/specs.json new file mode 100644 index 00000000..4a9071c2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.6126 + }, + "_frozen_from": { + "schematic": { + "err": -5.45e-05, + "vmin": 0.5125606 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.9799999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1_sL2/target.spice new file mode 100644 index 00000000..77a185f3 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1_sL2/target.spice @@ -0,0 +1,6 @@ +.subckt C02_gf180_sW1_sL2 VSS IIN1 IOUT1 +MM1 IIN1 IIN1 net6 VSS nfet_03v3 w=2u l=1.12u nf=4 m=1 +MM2 net6 net6 VSS VSS nfet_03v3 w=2u l=1.12u nf=4 m=1 +MM3 IOUT1 IIN1 net12 VSS nfet_03v3 w=2u l=1.12u nf=4 m=1 +MM4 net12 net6 VSS VSS nfet_03v3 w=2u l=1.12u nf=4 m=1 +.ends C02_gf180_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1_sL2/target_lvs.spice new file mode 100644 index 00000000..c509d3d8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1_sL2/target_lvs.spice @@ -0,0 +1,18 @@ +.subckt C02_gf180_sW1_sL2 VSS IIN1 IOUT1 +MM1_f0 IIN1 IIN1 net6 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f1 IIN1 IIN1 net6 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f2 IIN1 IIN1 net6 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f3 IIN1 IIN1 net6 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f0 net6 net6 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM2_f1 net6 net6 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM2_f2 net6 net6 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM2_f3 net6 net6 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f0 IOUT1 IIN1 net12 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f1 IOUT1 IIN1 net12 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f2 IOUT1 IIN1 net12 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f3 IOUT1 IIN1 net12 VSS nfet_03v3 w=0.5u l=1.12u +MM4_f0 net12 net6 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM4_f1 net12 net6 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM4_f2 net12 net6 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM4_f3 net12 net6 VSS VSS nfet_03v3 w=0.5u l=1.12u +.ends C02_gf180_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1_sL2/testbench.spice new file mode 100644 index 00000000..ad5c4bf6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW1_sL2/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IIN1 IOUT1 C02_gf180_sW1_sL2 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIIN1 VDDB IIN1 2e-05 +.nodeset v(IIN1)=0.99 + +VOUT IOUT1 0 3.3 +.control +dc VOUT 3.3 0 -0.00825 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=1.91 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.03 cross=last +meas dc dev_at_vdd find dev at=3.2835 +let gout = deriv(iout) +meas dc gout_t find gout at=1.91 +let rout_v = 1/gout +meas dc rout_t find rout_v at=1.91 +echo vout_test = 1.91 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C02/gf180/sW2_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW2_sL1.5/case.json new file mode 100644 index 00000000..875c88fc --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW2_sL1.5/case.json @@ -0,0 +1,141 @@ +{ + "case_id": "C02_gf180_sW2_sL1.5", + "circuit_id": "C02", + "pdk": "gf180", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "dut_name": "C02_gf180_sW2_sL1.5", + "ports": [ + "VSS", + "IIN1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.84, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 0.84, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 0.84, + "nf": 8 + }, + "M4": { + "w": 4.0, + "l": 0.84, + "nf": 8 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 2.145, + "tol": 0.03, + "vout_test": 1.86 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "d88167d0f21f7579", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/gf180/sW2_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW2_sL1.5/manifest.json new file mode 100644 index 00000000..feac74de --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW2_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "60d5c914c446d074dc0ede6580454c6811a8ba883ce59b7f0784ad6951c08c6b", + "qualification.json": "fbe6136bfccbacc9ab96611aded1f6bca2f9a44018942b795aed011404fbab1d", + "specs.json": "a73fed3da68d1b0a9e453c967e641b40879630e4e6af8f54805a3dffcfa08e1b", + "target.spice": "a35e5bddad6edbb4bb4e0656cc240103e9297cb4c059de071a162646c7067b04", + "target_lvs.spice": "610d610ed68fbe8132a6cc373782f2de6cc4ae9fb5f0461ec111062d442a376d", + "testbench.spice": "4397b481c741ed9240f9e265dfcc91bffa752a5bd2ca2282d6f73d2b8397cddf" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/gf180/sW2_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW2_sL1.5/qualification.json new file mode 100644 index 00000000..352d3f7b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW2_sL1.5/qualification.json @@ -0,0 +1,115 @@ +{ + "case_id": "C02_gf180_sW2_sL1.5", + "circuit_id": "C02", + "pdk": "gf180", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "d88167d0f21f7579", + "mirror_pass1": { + "vmin": 0.4234542, + "status": "passed", + "vout_test": 1.86 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.5235 + }, + "_frozen_from": { + "schematic": { + "err": -3.05e-05, + "vmin": 0.4234542 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.9799999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.3, + "schematic_measures": { + "iout_t": 1.999939e-05, + "err": -3.05e-05, + "vmin": 0.4234542, + "dev_at_vdd": 0.0006111761, + "gout_t": 2.895754e-09, + "rout_t": 345337400.0, + "vout_test": 1.86, + "rout_nom": 345337400.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/gf180/sW2_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW2_sL1.5/specs.json new file mode 100644 index 00000000..a6ae0a11 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW2_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.5235 + }, + "_frozen_from": { + "schematic": { + "err": -3.05e-05, + "vmin": 0.4234542 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.9799999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/gf180/sW2_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW2_sL1.5/target.spice new file mode 100644 index 00000000..2534f53e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW2_sL1.5/target.spice @@ -0,0 +1,6 @@ +.subckt C02_gf180_sW2_sL1.5 VSS IIN1 IOUT1 +MM1 IIN1 IIN1 net6 VSS nfet_03v3 w=4u l=0.84u nf=8 m=1 +MM2 net6 net6 VSS VSS nfet_03v3 w=4u l=0.84u nf=8 m=1 +MM3 IOUT1 IIN1 net12 VSS nfet_03v3 w=4u l=0.84u nf=8 m=1 +MM4 net12 net6 VSS VSS nfet_03v3 w=4u l=0.84u nf=8 m=1 +.ends C02_gf180_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C02/gf180/sW2_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW2_sL1.5/target_lvs.spice new file mode 100644 index 00000000..1bc803cd --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW2_sL1.5/target_lvs.spice @@ -0,0 +1,34 @@ +.subckt C02_gf180_sW2_sL1.5 VSS IIN1 IOUT1 +MM1_f0 IIN1 IIN1 net6 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f1 IIN1 IIN1 net6 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f2 IIN1 IIN1 net6 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f3 IIN1 IIN1 net6 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f4 IIN1 IIN1 net6 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f5 IIN1 IIN1 net6 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f6 IIN1 IIN1 net6 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f7 IIN1 IIN1 net6 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f0 net6 net6 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM2_f1 net6 net6 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM2_f2 net6 net6 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM2_f3 net6 net6 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM2_f4 net6 net6 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM2_f5 net6 net6 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM2_f6 net6 net6 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM2_f7 net6 net6 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f0 IOUT1 IIN1 net12 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f1 IOUT1 IIN1 net12 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f2 IOUT1 IIN1 net12 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f3 IOUT1 IIN1 net12 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f4 IOUT1 IIN1 net12 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f5 IOUT1 IIN1 net12 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f6 IOUT1 IIN1 net12 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f7 IOUT1 IIN1 net12 VSS nfet_03v3 w=0.5u l=0.84u +MM4_f0 net12 net6 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM4_f1 net12 net6 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM4_f2 net12 net6 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM4_f3 net12 net6 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM4_f4 net12 net6 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM4_f5 net12 net6 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM4_f6 net12 net6 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM4_f7 net12 net6 VSS VSS nfet_03v3 w=0.5u l=0.84u +.ends C02_gf180_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C02/gf180/sW2_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW2_sL1.5/testbench.spice new file mode 100644 index 00000000..266b7748 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW2_sL1.5/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IIN1 IOUT1 C02_gf180_sW2_sL1.5 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIIN1 VDDB IIN1 2e-05 +.nodeset v(IIN1)=0.99 + +VOUT IOUT1 0 3.3 +.control +dc VOUT 3.3 0 -0.00825 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=1.86 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.03 cross=last +meas dc dev_at_vdd find dev at=3.2835 +let gout = deriv(iout) +meas dc gout_t find gout at=1.86 +let rout_v = 1/gout +meas dc rout_t find rout_v at=1.86 +echo vout_test = 1.86 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C02/gf180/sW2_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW2_sL1/case.json new file mode 100644 index 00000000..fec19e3f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW2_sL1/case.json @@ -0,0 +1,141 @@ +{ + "case_id": "C02_gf180_sW2_sL1", + "circuit_id": "C02", + "pdk": "gf180", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "dut_name": "C02_gf180_sW2_sL1", + "ports": [ + "VSS", + "IIN1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "M4": { + "w": 4.0, + "l": 0.56, + "nf": 8 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 2.145, + "tol": 0.03, + "vout_test": 1.92 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "a3e77f280dda9152", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/gf180/sW2_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW2_sL1/manifest.json new file mode 100644 index 00000000..69f149e2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW2_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "5c84e7bba821928d463b66aa61ffb20e9097362a8912c08048a30257198a74ee", + "qualification.json": "dbd25b0dfd13785bfeb36abd4edc8008e8241599ff5d66decb428e2d612e15b1", + "specs.json": "2fff34ef582f57eb3577af7d8a99b0da96bbf9869fb62d293cdf94d411bd083d", + "target.spice": "ac2258cc45dc96b375ac546f1eae439dda61875c5fbf51d2c5bee0b9b6cff2c8", + "target_lvs.spice": "dd60ecc74041ec9fd59ddc810c0c72f453baa755820db25ca3691ead3ad099bc", + "testbench.spice": "80543bfad3278b964d9b7eb2bb378546dd48b5785edddfb21a6cbb7992be5288" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/gf180/sW2_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW2_sL1/qualification.json new file mode 100644 index 00000000..70d7a813 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW2_sL1/qualification.json @@ -0,0 +1,115 @@ +{ + "case_id": "C02_gf180_sW2_sL1", + "circuit_id": "C02", + "pdk": "gf180", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "a3e77f280dda9152", + "mirror_pass1": { + "vmin": 0.5301283, + "status": "passed", + "vout_test": 1.92 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.6301 + }, + "_frozen_from": { + "schematic": { + "err": -1.3e-05, + "vmin": 0.5301283 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.9799999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.2, + "schematic_measures": { + "iout_t": 1.999974e-05, + "err": -1.3e-05, + "vmin": 0.5301283, + "dev_at_vdd": 0.001301787, + "gout_t": 7.061242e-09, + "rout_t": 141618800.0, + "vout_test": 1.92, + "rout_nom": 141618800.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/gf180/sW2_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW2_sL1/specs.json new file mode 100644 index 00000000..6ddcafeb --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW2_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.6301 + }, + "_frozen_from": { + "schematic": { + "err": -1.3e-05, + "vmin": 0.5301283 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.9799999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/gf180/sW2_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW2_sL1/target.spice new file mode 100644 index 00000000..48ea40e4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW2_sL1/target.spice @@ -0,0 +1,6 @@ +.subckt C02_gf180_sW2_sL1 VSS IIN1 IOUT1 +MM1 IIN1 IIN1 net6 VSS nfet_03v3 w=4u l=0.56u nf=8 m=1 +MM2 net6 net6 VSS VSS nfet_03v3 w=4u l=0.56u nf=8 m=1 +MM3 IOUT1 IIN1 net12 VSS nfet_03v3 w=4u l=0.56u nf=8 m=1 +MM4 net12 net6 VSS VSS nfet_03v3 w=4u l=0.56u nf=8 m=1 +.ends C02_gf180_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C02/gf180/sW2_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW2_sL1/target_lvs.spice new file mode 100644 index 00000000..30c447cf --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW2_sL1/target_lvs.spice @@ -0,0 +1,34 @@ +.subckt C02_gf180_sW2_sL1 VSS IIN1 IOUT1 +MM1_f0 IIN1 IIN1 net6 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f1 IIN1 IIN1 net6 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f2 IIN1 IIN1 net6 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f3 IIN1 IIN1 net6 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f4 IIN1 IIN1 net6 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f5 IIN1 IIN1 net6 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f6 IIN1 IIN1 net6 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f7 IIN1 IIN1 net6 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f0 net6 net6 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM2_f1 net6 net6 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM2_f2 net6 net6 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM2_f3 net6 net6 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM2_f4 net6 net6 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM2_f5 net6 net6 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM2_f6 net6 net6 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM2_f7 net6 net6 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f0 IOUT1 IIN1 net12 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f1 IOUT1 IIN1 net12 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f2 IOUT1 IIN1 net12 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f3 IOUT1 IIN1 net12 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f4 IOUT1 IIN1 net12 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f5 IOUT1 IIN1 net12 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f6 IOUT1 IIN1 net12 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f7 IOUT1 IIN1 net12 VSS nfet_03v3 w=0.5u l=0.56u +MM4_f0 net12 net6 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM4_f1 net12 net6 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM4_f2 net12 net6 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM4_f3 net12 net6 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM4_f4 net12 net6 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM4_f5 net12 net6 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM4_f6 net12 net6 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM4_f7 net12 net6 VSS VSS nfet_03v3 w=0.5u l=0.56u +.ends C02_gf180_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C02/gf180/sW2_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW2_sL1/testbench.spice new file mode 100644 index 00000000..d2b75ef2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW2_sL1/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IIN1 IOUT1 C02_gf180_sW2_sL1 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIIN1 VDDB IIN1 2e-05 +.nodeset v(IIN1)=0.99 + +VOUT IOUT1 0 3.3 +.control +dc VOUT 3.3 0 -0.00825 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=1.92 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.03 cross=last +meas dc dev_at_vdd find dev at=3.2835 +let gout = deriv(iout) +meas dc gout_t find gout at=1.92 +let rout_v = 1/gout +meas dc rout_t find rout_v at=1.92 +echo vout_test = 1.92 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C02/gf180/sW2_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW2_sL2/case.json new file mode 100644 index 00000000..4865d2fe --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW2_sL2/case.json @@ -0,0 +1,141 @@ +{ + "case_id": "C02_gf180_sW2_sL2", + "circuit_id": "C02", + "pdk": "gf180", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "dut_name": "C02_gf180_sW2_sL2", + "ports": [ + "VSS", + "IIN1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 1.12, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 1.12, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 1.12, + "nf": 8 + }, + "M4": { + "w": 4.0, + "l": 1.12, + "nf": 8 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 2.145, + "tol": 0.03, + "vout_test": 1.84 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "11f3545f762ddd46", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/gf180/sW2_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW2_sL2/manifest.json new file mode 100644 index 00000000..5b09b4c9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW2_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "a11708109302bcb2e9ed325cf6b4dc7281afde4aeed85e015a26cf586c7bbf20", + "qualification.json": "76ca672927abb8620bdaac2df4f5c91e6b9089b69ea323d33baf1f01f9a3eee9", + "specs.json": "ef424ee2fae3ed0e3521ee040c39081493af17b6e91bee8272742e05c2e53769", + "target.spice": "764a205b3f3c532b3ea3a1ff2087bb09fa4033da2818cab0fa2b69905fb0fb32", + "target_lvs.spice": "5534e75a22098e4cfe7981b973e88ff418e28a6c75b5ef3780f606c2b3c2c9ee", + "testbench.spice": "43fca9feedf47fc54b207d3d1f6dba783a792e138c924b564f7ad9b6f534f2d3" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/gf180/sW2_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW2_sL2/qualification.json new file mode 100644 index 00000000..9e3bfd08 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW2_sL2/qualification.json @@ -0,0 +1,115 @@ +{ + "case_id": "C02_gf180_sW2_sL2", + "circuit_id": "C02", + "pdk": "gf180", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "11f3545f762ddd46", + "mirror_pass1": { + "vmin": 0.3868082, + "status": "passed", + "vout_test": 1.84 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.4868 + }, + "_frozen_from": { + "schematic": { + "err": -2.95e-05, + "vmin": 0.3868082 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.9799999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.2, + "schematic_measures": { + "iout_t": 1.999941e-05, + "err": -2.95e-05, + "vmin": 0.3868082, + "dev_at_vdd": 0.0003213657, + "gout_t": 1.88651e-09, + "rout_t": 530080400.0, + "vout_test": 1.84, + "rout_nom": 530080400.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/gf180/sW2_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW2_sL2/specs.json new file mode 100644 index 00000000..d2967193 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW2_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.4868 + }, + "_frozen_from": { + "schematic": { + "err": -2.95e-05, + "vmin": 0.3868082 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.9799999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/gf180/sW2_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW2_sL2/target.spice new file mode 100644 index 00000000..89fa0c05 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW2_sL2/target.spice @@ -0,0 +1,6 @@ +.subckt C02_gf180_sW2_sL2 VSS IIN1 IOUT1 +MM1 IIN1 IIN1 net6 VSS nfet_03v3 w=4u l=1.12u nf=8 m=1 +MM2 net6 net6 VSS VSS nfet_03v3 w=4u l=1.12u nf=8 m=1 +MM3 IOUT1 IIN1 net12 VSS nfet_03v3 w=4u l=1.12u nf=8 m=1 +MM4 net12 net6 VSS VSS nfet_03v3 w=4u l=1.12u nf=8 m=1 +.ends C02_gf180_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C02/gf180/sW2_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW2_sL2/target_lvs.spice new file mode 100644 index 00000000..3cdac6dc --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW2_sL2/target_lvs.spice @@ -0,0 +1,34 @@ +.subckt C02_gf180_sW2_sL2 VSS IIN1 IOUT1 +MM1_f0 IIN1 IIN1 net6 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f1 IIN1 IIN1 net6 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f2 IIN1 IIN1 net6 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f3 IIN1 IIN1 net6 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f4 IIN1 IIN1 net6 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f5 IIN1 IIN1 net6 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f6 IIN1 IIN1 net6 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f7 IIN1 IIN1 net6 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f0 net6 net6 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM2_f1 net6 net6 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM2_f2 net6 net6 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM2_f3 net6 net6 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM2_f4 net6 net6 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM2_f5 net6 net6 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM2_f6 net6 net6 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM2_f7 net6 net6 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f0 IOUT1 IIN1 net12 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f1 IOUT1 IIN1 net12 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f2 IOUT1 IIN1 net12 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f3 IOUT1 IIN1 net12 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f4 IOUT1 IIN1 net12 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f5 IOUT1 IIN1 net12 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f6 IOUT1 IIN1 net12 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f7 IOUT1 IIN1 net12 VSS nfet_03v3 w=0.5u l=1.12u +MM4_f0 net12 net6 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM4_f1 net12 net6 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM4_f2 net12 net6 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM4_f3 net12 net6 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM4_f4 net12 net6 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM4_f5 net12 net6 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM4_f6 net12 net6 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM4_f7 net12 net6 VSS VSS nfet_03v3 w=0.5u l=1.12u +.ends C02_gf180_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C02/gf180/sW2_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW2_sL2/testbench.spice new file mode 100644 index 00000000..da9908e8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/gf180/sW2_sL2/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IIN1 IOUT1 C02_gf180_sW2_sL2 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIIN1 VDDB IIN1 2e-05 +.nodeset v(IIN1)=0.99 + +VOUT IOUT1 0 3.3 +.control +dc VOUT 3.3 0 -0.00825 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=1.84 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.03 cross=last +meas dc dev_at_vdd find dev at=3.2835 +let gout = deriv(iout) +meas dc gout_t find gout at=1.84 +let rout_v = 1/gout +meas dc rout_t find rout_v at=1.84 +echo vout_test = 1.84 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW0.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW0.5_sL1.5/case.json new file mode 100644 index 00000000..e5d439a8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW0.5_sL1.5/case.json @@ -0,0 +1,141 @@ +{ + "case_id": "C02_ihp130_sW0.5_sL1.5", + "circuit_id": "C02", + "pdk": "ihp130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "dut_name": "C02_ihp130_sW0.5_sL1.5", + "ports": [ + "VSS", + "IIN1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 1.0, + "l": 0.78, + "nf": 2 + }, + "M2": { + "w": 1.0, + "l": 0.78, + "nf": 2 + }, + "M3": { + "w": 1.0, + "l": 0.78, + "nf": 2 + }, + "M4": { + "w": 1.0, + "l": 0.78, + "nf": 2 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 0.78, + "tol": 0.03, + "vout_test": 0.88 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.78, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.78, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.78, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.78, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "a2fee2b3a2cb4273", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW0.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW0.5_sL1.5/manifest.json new file mode 100644 index 00000000..35f3099e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW0.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "8e98e4fa186222e200eb413e8399cc69c95e091d26f82d17471fa1b968c43927", + "qualification.json": "4dbc90397ee2c7e3e3ce75bf41b106856adb4e1788fd450d258b490b46a95b23", + "specs.json": "53f4bbf267012e659865da7112113a672a33a5c37ce8d3e3ea577a4dcf911472", + "target.spice": "4f51799deca56d3892250327a72c68016dc85b3b8385492ae1bc929beb3530c8", + "target_lvs.spice": "967f13361071001b62ff823ef3bd4b35b8d98f32488522f1a0a018f508cb9ea4", + "testbench.spice": "61b0ac7d3a684564ac9cd1a748a1087265094c6e8344266b75f550887b86c264" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW0.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW0.5_sL1.5/qualification.json new file mode 100644 index 00000000..2f85de31 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW0.5_sL1.5/qualification.json @@ -0,0 +1,115 @@ +{ + "case_id": "C02_ihp130_sW0.5_sL1.5", + "circuit_id": "C02", + "pdk": "ihp130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.78, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.78, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.78, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.78, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "a2fee2b3a2cb4273", + "mirror_pass1": { + "vmin": 0.5686756, + "status": "passed", + "vout_test": 0.88 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.6687 + }, + "_frozen_from": { + "schematic": { + "err": -0.0031305, + "vmin": 0.5686756 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.72 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.3, + "schematic_measures": { + "iout_t": 1.993739e-05, + "err": -0.0031305, + "vmin": 0.5686756, + "dev_at_vdd": 0.0001911442, + "gout_t": 3.092906e-07, + "rout_t": 3233593.0, + "vout_test": 0.88, + "rout_nom": 3233593.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW0.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW0.5_sL1.5/specs.json new file mode 100644 index 00000000..bda7c696 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW0.5_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.6687 + }, + "_frozen_from": { + "schematic": { + "err": -0.0031305, + "vmin": 0.5686756 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.72 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW0.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW0.5_sL1.5/target.spice new file mode 100644 index 00000000..c9c7b508 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW0.5_sL1.5/target.spice @@ -0,0 +1,6 @@ +.subckt C02_ihp130_sW0.5_sL1.5 VSS IIN1 IOUT1 +XM1 IIN1 IIN1 net6 VSS sg13_lv_nmos w=1u l=0.78u ng=2 m=1 +XM2 net6 net6 VSS VSS sg13_lv_nmos w=1u l=0.78u ng=2 m=1 +XM3 IOUT1 IIN1 net12 VSS sg13_lv_nmos w=1u l=0.78u ng=2 m=1 +XM4 net12 net6 VSS VSS sg13_lv_nmos w=1u l=0.78u ng=2 m=1 +.ends C02_ihp130_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW0.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW0.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..cbd5661b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW0.5_sL1.5/target_lvs.spice @@ -0,0 +1,10 @@ +.subckt C02_ihp130_sW0.5_sL1.5 VSS IIN1 IOUT1 +XM1_f0 IIN1 IIN1 net6 VSS sg13_lv_nmos w=0.5u l=0.78u +XM1_f1 IIN1 IIN1 net6 VSS sg13_lv_nmos w=0.5u l=0.78u +XM2_f0 net6 net6 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM2_f1 net6 net6 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f0 IOUT1 IIN1 net12 VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f1 IOUT1 IIN1 net12 VSS sg13_lv_nmos w=0.5u l=0.78u +XM4_f0 net12 net6 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM4_f1 net12 net6 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +.ends C02_ihp130_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW0.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW0.5_sL1.5/testbench.spice new file mode 100644 index 00000000..10171c5c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW0.5_sL1.5/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IIN1 IOUT1 C02_ihp130_sW0.5_sL1.5 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIIN1 VDDB IIN1 2e-05 +.nodeset v(IIN1)=0.36 + +VOUT IOUT1 0 1.2 +.control +dc VOUT 1.2 0 -0.003 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=0.88 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.03 cross=last +meas dc dev_at_vdd find dev at=1.194 +let gout = deriv(iout) +meas dc gout_t find gout at=0.88 +let rout_v = 1/gout +meas dc rout_t find rout_v at=0.88 +echo vout_test = 0.88 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW0.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW0.5_sL1/case.json new file mode 100644 index 00000000..2075bc71 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW0.5_sL1/case.json @@ -0,0 +1,141 @@ +{ + "case_id": "C02_ihp130_sW0.5_sL1", + "circuit_id": "C02", + "pdk": "ihp130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "dut_name": "C02_ihp130_sW0.5_sL1", + "ports": [ + "VSS", + "IIN1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 1.0, + "l": 0.52, + "nf": 2 + }, + "M2": { + "w": 1.0, + "l": 0.52, + "nf": 2 + }, + "M3": { + "w": 1.0, + "l": 0.52, + "nf": 2 + }, + "M4": { + "w": 1.0, + "l": 0.52, + "nf": 2 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 0.78, + "tol": 0.03, + "vout_test": 0.88 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.52, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.52, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.52, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.52, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "2291a191007f09a4", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW0.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW0.5_sL1/manifest.json new file mode 100644 index 00000000..21c40007 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW0.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "324c3baa4b5db2014c3e88ff4c5ccd2beb6cf324038949bf16f87e62144bda0e", + "qualification.json": "2905ba4ee7abf66833d0fc2e24e4e3cca5979f2d8f059decf7722b4f428b24ab", + "specs.json": "ae75f48fdf8906925944db3f772ec9db567313c6c8e7298d802e105832c61231", + "target.spice": "87b89e8822313c6c06357bdd9500db03b794b34beb04b75b1bf14072ff0a313b", + "target_lvs.spice": "b20955fbbbc76c47e0a87c80304fdd23934cc7cc8f1048bb7bede5287c623f85", + "testbench.spice": "997ff20c28e1bacf7db3c9525042d5acb99d540ac67064342511e0e5bb991de2" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW0.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW0.5_sL1/qualification.json new file mode 100644 index 00000000..41d705bf --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW0.5_sL1/qualification.json @@ -0,0 +1,115 @@ +{ + "case_id": "C02_ihp130_sW0.5_sL1", + "circuit_id": "C02", + "pdk": "ihp130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.52, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.52, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.52, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.52, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "2291a191007f09a4", + "mirror_pass1": { + "vmin": 0.5520631, + "status": "passed", + "vout_test": 0.88 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.6521 + }, + "_frozen_from": { + "schematic": { + "err": -0.0033385, + "vmin": 0.5520631 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.72 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.3, + "schematic_measures": { + "iout_t": 1.993323e-05, + "err": -0.0033385, + "vmin": 0.5520631, + "dev_at_vdd": 0.0003863601, + "gout_t": 3.137602e-07, + "rout_t": 3187212.0, + "vout_test": 0.88, + "rout_nom": 3187212.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW0.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW0.5_sL1/specs.json new file mode 100644 index 00000000..5b337bf7 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW0.5_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.6521 + }, + "_frozen_from": { + "schematic": { + "err": -0.0033385, + "vmin": 0.5520631 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.72 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW0.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW0.5_sL1/target.spice new file mode 100644 index 00000000..863d6518 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW0.5_sL1/target.spice @@ -0,0 +1,6 @@ +.subckt C02_ihp130_sW0.5_sL1 VSS IIN1 IOUT1 +XM1 IIN1 IIN1 net6 VSS sg13_lv_nmos w=1u l=0.52u ng=2 m=1 +XM2 net6 net6 VSS VSS sg13_lv_nmos w=1u l=0.52u ng=2 m=1 +XM3 IOUT1 IIN1 net12 VSS sg13_lv_nmos w=1u l=0.52u ng=2 m=1 +XM4 net12 net6 VSS VSS sg13_lv_nmos w=1u l=0.52u ng=2 m=1 +.ends C02_ihp130_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW0.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW0.5_sL1/target_lvs.spice new file mode 100644 index 00000000..2320372e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW0.5_sL1/target_lvs.spice @@ -0,0 +1,10 @@ +.subckt C02_ihp130_sW0.5_sL1 VSS IIN1 IOUT1 +XM1_f0 IIN1 IIN1 net6 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f1 IIN1 IIN1 net6 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f0 net6 net6 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f1 net6 net6 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f0 IOUT1 IIN1 net12 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f1 IOUT1 IIN1 net12 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f0 net12 net6 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f1 net12 net6 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +.ends C02_ihp130_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW0.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW0.5_sL1/testbench.spice new file mode 100644 index 00000000..2966972d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW0.5_sL1/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IIN1 IOUT1 C02_ihp130_sW0.5_sL1 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIIN1 VDDB IIN1 2e-05 +.nodeset v(IIN1)=0.36 + +VOUT IOUT1 0 1.2 +.control +dc VOUT 1.2 0 -0.003 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=0.88 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.03 cross=last +meas dc dev_at_vdd find dev at=1.194 +let gout = deriv(iout) +meas dc gout_t find gout at=0.88 +let rout_v = 1/gout +meas dc rout_t find rout_v at=0.88 +echo vout_test = 0.88 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW0.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW0.5_sL2/case.json new file mode 100644 index 00000000..5bdc1f85 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW0.5_sL2/case.json @@ -0,0 +1,141 @@ +{ + "case_id": "C02_ihp130_sW0.5_sL2", + "circuit_id": "C02", + "pdk": "ihp130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "dut_name": "C02_ihp130_sW0.5_sL2", + "ports": [ + "VSS", + "IIN1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 1.0, + "l": 1.04, + "nf": 2 + }, + "M2": { + "w": 1.0, + "l": 1.04, + "nf": 2 + }, + "M3": { + "w": 1.0, + "l": 1.04, + "nf": 2 + }, + "M4": { + "w": 1.0, + "l": 1.04, + "nf": 2 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 0.78, + "tol": 0.03, + "vout_test": 0.89 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.04, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.04, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.04, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.04, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "d396a29721c76006", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW0.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW0.5_sL2/manifest.json new file mode 100644 index 00000000..3705b8a7 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW0.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "f284bd359c0482eb542fdec0567760a5c8c88bf354ee6e7f04f842e69b702d71", + "qualification.json": "c54df039a553a46d38c5e0a7bddcca8044645d03460ba421136efbbfc9deb221", + "specs.json": "a38ee94e95ce7969d9ab15b8504eb530f2c87ef601e6fc274ee57f3b88ec4077", + "target.spice": "f9b6852fcbd01362c5a7b9647f53175eb60f94bddda1ba82ed592d8ffcf5527b", + "target_lvs.spice": "99074cce5ae86fd0b1947477bfc14ffd3552bea5564679692724c0ba3b679983", + "testbench.spice": "9acd91d812778592f89c1d3d4fbbe889b11a41414e2d5c6c21e1eaaedc28ff72" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW0.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW0.5_sL2/qualification.json new file mode 100644 index 00000000..e759974d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW0.5_sL2/qualification.json @@ -0,0 +1,115 @@ +{ + "case_id": "C02_ihp130_sW0.5_sL2", + "circuit_id": "C02", + "pdk": "ihp130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.04, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.04, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.04, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.04, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "d396a29721c76006", + "mirror_pass1": { + "vmin": 0.5894041, + "status": "passed", + "vout_test": 0.89 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.6894 + }, + "_frozen_from": { + "schematic": { + "err": -0.0033235, + "vmin": 0.5894041 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.72 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.3, + "schematic_measures": { + "iout_t": 1.993353e-05, + "err": -0.0033235, + "vmin": 0.5894041, + "dev_at_vdd": 0.0005298698, + "gout_t": 4.422629e-07, + "rout_t": 2261795.0, + "vout_test": 0.89, + "rout_nom": 2261795.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW0.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW0.5_sL2/specs.json new file mode 100644 index 00000000..1d386cf4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW0.5_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.6894 + }, + "_frozen_from": { + "schematic": { + "err": -0.0033235, + "vmin": 0.5894041 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.72 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW0.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW0.5_sL2/target.spice new file mode 100644 index 00000000..87b40a71 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW0.5_sL2/target.spice @@ -0,0 +1,6 @@ +.subckt C02_ihp130_sW0.5_sL2 VSS IIN1 IOUT1 +XM1 IIN1 IIN1 net6 VSS sg13_lv_nmos w=1u l=1.04u ng=2 m=1 +XM2 net6 net6 VSS VSS sg13_lv_nmos w=1u l=1.04u ng=2 m=1 +XM3 IOUT1 IIN1 net12 VSS sg13_lv_nmos w=1u l=1.04u ng=2 m=1 +XM4 net12 net6 VSS VSS sg13_lv_nmos w=1u l=1.04u ng=2 m=1 +.ends C02_ihp130_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW0.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW0.5_sL2/target_lvs.spice new file mode 100644 index 00000000..ec8bf2d4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW0.5_sL2/target_lvs.spice @@ -0,0 +1,10 @@ +.subckt C02_ihp130_sW0.5_sL2 VSS IIN1 IOUT1 +XM1_f0 IIN1 IIN1 net6 VSS sg13_lv_nmos w=0.5u l=1.04u +XM1_f1 IIN1 IIN1 net6 VSS sg13_lv_nmos w=0.5u l=1.04u +XM2_f0 net6 net6 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM2_f1 net6 net6 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM3_f0 IOUT1 IIN1 net12 VSS sg13_lv_nmos w=0.5u l=1.04u +XM3_f1 IOUT1 IIN1 net12 VSS sg13_lv_nmos w=0.5u l=1.04u +XM4_f0 net12 net6 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM4_f1 net12 net6 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +.ends C02_ihp130_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW0.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW0.5_sL2/testbench.spice new file mode 100644 index 00000000..87c63bb3 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW0.5_sL2/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IIN1 IOUT1 C02_ihp130_sW0.5_sL2 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIIN1 VDDB IIN1 2e-05 +.nodeset v(IIN1)=0.36 + +VOUT IOUT1 0 1.2 +.control +dc VOUT 1.2 0 -0.003 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=0.89 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.03 cross=last +meas dc dev_at_vdd find dev at=1.194 +let gout = deriv(iout) +meas dc gout_t find gout at=0.89 +let rout_v = 1/gout +meas dc rout_t find rout_v at=0.89 +echo vout_test = 0.89 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1.5_sL1.5/case.json new file mode 100644 index 00000000..00ecda3f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1.5_sL1.5/case.json @@ -0,0 +1,141 @@ +{ + "case_id": "C02_ihp130_sW1.5_sL1.5", + "circuit_id": "C02", + "pdk": "ihp130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "dut_name": "C02_ihp130_sW1.5_sL1.5", + "ports": [ + "VSS", + "IIN1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 3.0, + "l": 0.78, + "nf": 6 + }, + "M2": { + "w": 3.0, + "l": 0.78, + "nf": 6 + }, + "M3": { + "w": 3.0, + "l": 0.78, + "nf": 6 + }, + "M4": { + "w": 3.0, + "l": 0.78, + "nf": 6 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 0.78, + "tol": 0.03, + "vout_test": 0.81 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.78, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.78, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.78, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.78, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "3bf56c781ae2513b", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1.5_sL1.5/manifest.json new file mode 100644 index 00000000..eb389e03 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "b64abd8e7d5f200cff2bc54c3b2451be6b8fa5b0248c207811e1f644fdaa0268", + "qualification.json": "7221ee6df3c94f8b287180428d37408176f6d4d0429d4dbc86bbdad0c03463fe", + "specs.json": "13a9bd37b83fad96ed434b448ae01aaa8c427f45626970abfd9af67e1b9a5e57", + "target.spice": "7cedb8d249f32668efb98b2c5fcbae21ed8efe915f720f51ee35932a71f7db8a", + "target_lvs.spice": "71f74c5b61824624177e84c55ee2969c6d16714cd570e90574231a9d16f7ab0e", + "testbench.spice": "3e61060d277cfc7c13a33bfaee9051c06f160817a1e450088b40855e6b82477b" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1.5_sL1.5/qualification.json new file mode 100644 index 00000000..0de75acf --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1.5_sL1.5/qualification.json @@ -0,0 +1,115 @@ +{ + "case_id": "C02_ihp130_sW1.5_sL1.5", + "circuit_id": "C02", + "pdk": "ihp130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.78, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.78, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.78, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.78, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "3bf56c781ae2513b", + "mirror_pass1": { + "vmin": 0.4297788, + "status": "passed", + "vout_test": 0.81 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.5298 + }, + "_frozen_from": { + "schematic": { + "err": -0.0014615, + "vmin": 0.4297788 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.72 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.7, + "schematic_measures": { + "iout_t": 1.997077e-05, + "err": -0.0014615, + "vmin": 0.4297788, + "dev_at_vdd": 0.002586955, + "gout_t": 2.597865e-07, + "rout_t": 3849315.0, + "vout_test": 0.81, + "rout_nom": 3849315.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1.5_sL1.5/specs.json new file mode 100644 index 00000000..ccd9d314 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1.5_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.5298 + }, + "_frozen_from": { + "schematic": { + "err": -0.0014615, + "vmin": 0.4297788 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.72 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1.5_sL1.5/target.spice new file mode 100644 index 00000000..065e81bc --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1.5_sL1.5/target.spice @@ -0,0 +1,6 @@ +.subckt C02_ihp130_sW1.5_sL1.5 VSS IIN1 IOUT1 +XM1 IIN1 IIN1 net6 VSS sg13_lv_nmos w=3u l=0.78u ng=6 m=1 +XM2 net6 net6 VSS VSS sg13_lv_nmos w=3u l=0.78u ng=6 m=1 +XM3 IOUT1 IIN1 net12 VSS sg13_lv_nmos w=3u l=0.78u ng=6 m=1 +XM4 net12 net6 VSS VSS sg13_lv_nmos w=3u l=0.78u ng=6 m=1 +.ends C02_ihp130_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..7ac61e39 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1.5_sL1.5/target_lvs.spice @@ -0,0 +1,26 @@ +.subckt C02_ihp130_sW1.5_sL1.5 VSS IIN1 IOUT1 +XM1_f0 IIN1 IIN1 net6 VSS sg13_lv_nmos w=0.5u l=0.78u +XM1_f1 IIN1 IIN1 net6 VSS sg13_lv_nmos w=0.5u l=0.78u +XM1_f2 IIN1 IIN1 net6 VSS sg13_lv_nmos w=0.5u l=0.78u +XM1_f3 IIN1 IIN1 net6 VSS sg13_lv_nmos w=0.5u l=0.78u +XM1_f4 IIN1 IIN1 net6 VSS sg13_lv_nmos w=0.5u l=0.78u +XM1_f5 IIN1 IIN1 net6 VSS sg13_lv_nmos w=0.5u l=0.78u +XM2_f0 net6 net6 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM2_f1 net6 net6 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM2_f2 net6 net6 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM2_f3 net6 net6 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM2_f4 net6 net6 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM2_f5 net6 net6 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f0 IOUT1 IIN1 net12 VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f1 IOUT1 IIN1 net12 VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f2 IOUT1 IIN1 net12 VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f3 IOUT1 IIN1 net12 VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f4 IOUT1 IIN1 net12 VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f5 IOUT1 IIN1 net12 VSS sg13_lv_nmos w=0.5u l=0.78u +XM4_f0 net12 net6 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM4_f1 net12 net6 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM4_f2 net12 net6 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM4_f3 net12 net6 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM4_f4 net12 net6 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM4_f5 net12 net6 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +.ends C02_ihp130_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1.5_sL1.5/testbench.spice new file mode 100644 index 00000000..46c8da37 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1.5_sL1.5/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IIN1 IOUT1 C02_ihp130_sW1.5_sL1.5 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIIN1 VDDB IIN1 2e-05 +.nodeset v(IIN1)=0.36 + +VOUT IOUT1 0 1.2 +.control +dc VOUT 1.2 0 -0.003 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=0.81 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.03 cross=last +meas dc dev_at_vdd find dev at=1.194 +let gout = deriv(iout) +meas dc gout_t find gout at=0.81 +let rout_v = 1/gout +meas dc rout_t find rout_v at=0.81 +echo vout_test = 0.81 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1.5_sL1/case.json new file mode 100644 index 00000000..33917201 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1.5_sL1/case.json @@ -0,0 +1,141 @@ +{ + "case_id": "C02_ihp130_sW1.5_sL1", + "circuit_id": "C02", + "pdk": "ihp130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "dut_name": "C02_ihp130_sW1.5_sL1", + "ports": [ + "VSS", + "IIN1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 3.0, + "l": 0.52, + "nf": 6 + }, + "M2": { + "w": 3.0, + "l": 0.52, + "nf": 6 + }, + "M3": { + "w": 3.0, + "l": 0.52, + "nf": 6 + }, + "M4": { + "w": 3.0, + "l": 0.52, + "nf": 6 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 0.78, + "tol": 0.03, + "vout_test": 0.82 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.52, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.52, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.52, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.52, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "57b50b03a56e4590", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1.5_sL1/manifest.json new file mode 100644 index 00000000..996c79f9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "7f884dea676a1d5b17a3eb999854642f8e05668c951641e595ec6bdc80d92e56", + "qualification.json": "a19e4843d27071e7292d98699a96b017f20e109ff0feb4715bc89f8e135aa448", + "specs.json": "fb7e8441fd7f16de49185004c8c0d7d2f5053d0c2f595e1db8977e963754fa03", + "target.spice": "2015a1aa16d443b57ecda49e514364edf03cfb1cca13712e5b45236867af809f", + "target_lvs.spice": "a251eb2ccab41b583a703c353a8467786c3749d1e8b01912ce0e85faf2965c97", + "testbench.spice": "dbcbba3b7a130c0e7cef6fdaa87d7828cd90602839e36d55944a7f7590b8eb9f" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1.5_sL1/qualification.json new file mode 100644 index 00000000..88631c27 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1.5_sL1/qualification.json @@ -0,0 +1,115 @@ +{ + "case_id": "C02_ihp130_sW1.5_sL1", + "circuit_id": "C02", + "pdk": "ihp130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.52, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.52, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.52, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.52, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "57b50b03a56e4590", + "mirror_pass1": { + "vmin": 0.4307584, + "status": "passed", + "vout_test": 0.82 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.5308 + }, + "_frozen_from": { + "schematic": { + "err": -0.001464, + "vmin": 0.4307584 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.72 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.7, + "schematic_measures": { + "iout_t": 1.997072e-05, + "err": -0.001464, + "vmin": 0.4307584, + "dev_at_vdd": 0.004151491, + "gout_t": 3.612603e-07, + "rout_t": 2768095.0, + "vout_test": 0.82, + "rout_nom": 2768095.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1.5_sL1/specs.json new file mode 100644 index 00000000..856c94b8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1.5_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.5308 + }, + "_frozen_from": { + "schematic": { + "err": -0.001464, + "vmin": 0.4307584 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.72 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1.5_sL1/target.spice new file mode 100644 index 00000000..ef183e80 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1.5_sL1/target.spice @@ -0,0 +1,6 @@ +.subckt C02_ihp130_sW1.5_sL1 VSS IIN1 IOUT1 +XM1 IIN1 IIN1 net6 VSS sg13_lv_nmos w=3u l=0.52u ng=6 m=1 +XM2 net6 net6 VSS VSS sg13_lv_nmos w=3u l=0.52u ng=6 m=1 +XM3 IOUT1 IIN1 net12 VSS sg13_lv_nmos w=3u l=0.52u ng=6 m=1 +XM4 net12 net6 VSS VSS sg13_lv_nmos w=3u l=0.52u ng=6 m=1 +.ends C02_ihp130_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1.5_sL1/target_lvs.spice new file mode 100644 index 00000000..7ab01e28 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1.5_sL1/target_lvs.spice @@ -0,0 +1,26 @@ +.subckt C02_ihp130_sW1.5_sL1 VSS IIN1 IOUT1 +XM1_f0 IIN1 IIN1 net6 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f1 IIN1 IIN1 net6 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f2 IIN1 IIN1 net6 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f3 IIN1 IIN1 net6 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f4 IIN1 IIN1 net6 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f5 IIN1 IIN1 net6 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f0 net6 net6 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f1 net6 net6 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f2 net6 net6 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f3 net6 net6 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f4 net6 net6 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f5 net6 net6 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f0 IOUT1 IIN1 net12 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f1 IOUT1 IIN1 net12 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f2 IOUT1 IIN1 net12 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f3 IOUT1 IIN1 net12 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f4 IOUT1 IIN1 net12 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f5 IOUT1 IIN1 net12 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f0 net12 net6 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f1 net12 net6 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f2 net12 net6 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f3 net12 net6 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f4 net12 net6 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f5 net12 net6 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +.ends C02_ihp130_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1.5_sL1/testbench.spice new file mode 100644 index 00000000..270ac2f9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1.5_sL1/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IIN1 IOUT1 C02_ihp130_sW1.5_sL1 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIIN1 VDDB IIN1 2e-05 +.nodeset v(IIN1)=0.36 + +VOUT IOUT1 0 1.2 +.control +dc VOUT 1.2 0 -0.003 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=0.82 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.03 cross=last +meas dc dev_at_vdd find dev at=1.194 +let gout = deriv(iout) +meas dc gout_t find gout at=0.82 +let rout_v = 1/gout +meas dc rout_t find rout_v at=0.82 +echo vout_test = 0.82 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1.5_sL2/case.json new file mode 100644 index 00000000..828a8fa2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1.5_sL2/case.json @@ -0,0 +1,141 @@ +{ + "case_id": "C02_ihp130_sW1.5_sL2", + "circuit_id": "C02", + "pdk": "ihp130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "dut_name": "C02_ihp130_sW1.5_sL2", + "ports": [ + "VSS", + "IIN1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 3.0, + "l": 1.04, + "nf": 6 + }, + "M2": { + "w": 3.0, + "l": 1.04, + "nf": 6 + }, + "M3": { + "w": 3.0, + "l": 1.04, + "nf": 6 + }, + "M4": { + "w": 3.0, + "l": 1.04, + "nf": 6 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 0.78, + "tol": 0.03, + "vout_test": 0.82 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.04, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.04, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.04, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.04, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "3bb1211635a6db28", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1.5_sL2/manifest.json new file mode 100644 index 00000000..12709175 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "bdf3258c8be78966526f0df114cabf361381a1a7bbe56f25b88133681e3199ce", + "qualification.json": "750c58ffc3da309e85a6a1e3424b5be2823e5a0d8b92d926f2b2c5ae83f9cba4", + "specs.json": "9aeb6c2f7ecb57cb4e22a0de07da98b7b5651e6022d0b3de7aaf537c51b66ce7", + "target.spice": "6691464a55a65e9ee9534d5bb42a68ecb69bde244fe2efb2b334b2cab184fcc1", + "target_lvs.spice": "1b95d18061217c1e0b6e907539c45da8a29d237786fe087510cef095eb9034e6", + "testbench.spice": "b707ca3a482c073a42f6d1d25d5ae6dafcc8f77b81f92b00612ac09f315166b5" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1.5_sL2/qualification.json new file mode 100644 index 00000000..f0aa8c92 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1.5_sL2/qualification.json @@ -0,0 +1,115 @@ +{ + "case_id": "C02_ihp130_sW1.5_sL2", + "circuit_id": "C02", + "pdk": "ihp130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.04, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.04, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.04, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.04, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "3bb1211635a6db28", + "mirror_pass1": { + "vmin": 0.4348501, + "status": "passed", + "vout_test": 0.82 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.5349 + }, + "_frozen_from": { + "schematic": { + "err": -0.0013475, + "vmin": 0.4348501 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.72 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.7, + "schematic_measures": { + "iout_t": 1.997305e-05, + "err": -0.0013475, + "vmin": 0.4348501, + "dev_at_vdd": 0.00170769, + "gout_t": 2.036465e-07, + "rout_t": 4910495.0, + "vout_test": 0.82, + "rout_nom": 4910495.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1.5_sL2/specs.json new file mode 100644 index 00000000..eda9f962 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1.5_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.5349 + }, + "_frozen_from": { + "schematic": { + "err": -0.0013475, + "vmin": 0.4348501 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.72 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1.5_sL2/target.spice new file mode 100644 index 00000000..8ac32b78 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1.5_sL2/target.spice @@ -0,0 +1,6 @@ +.subckt C02_ihp130_sW1.5_sL2 VSS IIN1 IOUT1 +XM1 IIN1 IIN1 net6 VSS sg13_lv_nmos w=3u l=1.04u ng=6 m=1 +XM2 net6 net6 VSS VSS sg13_lv_nmos w=3u l=1.04u ng=6 m=1 +XM3 IOUT1 IIN1 net12 VSS sg13_lv_nmos w=3u l=1.04u ng=6 m=1 +XM4 net12 net6 VSS VSS sg13_lv_nmos w=3u l=1.04u ng=6 m=1 +.ends C02_ihp130_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1.5_sL2/target_lvs.spice new file mode 100644 index 00000000..33a75d0a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1.5_sL2/target_lvs.spice @@ -0,0 +1,26 @@ +.subckt C02_ihp130_sW1.5_sL2 VSS IIN1 IOUT1 +XM1_f0 IIN1 IIN1 net6 VSS sg13_lv_nmos w=0.5u l=1.04u +XM1_f1 IIN1 IIN1 net6 VSS sg13_lv_nmos w=0.5u l=1.04u +XM1_f2 IIN1 IIN1 net6 VSS sg13_lv_nmos w=0.5u l=1.04u +XM1_f3 IIN1 IIN1 net6 VSS sg13_lv_nmos w=0.5u l=1.04u +XM1_f4 IIN1 IIN1 net6 VSS sg13_lv_nmos w=0.5u l=1.04u +XM1_f5 IIN1 IIN1 net6 VSS sg13_lv_nmos w=0.5u l=1.04u +XM2_f0 net6 net6 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM2_f1 net6 net6 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM2_f2 net6 net6 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM2_f3 net6 net6 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM2_f4 net6 net6 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM2_f5 net6 net6 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM3_f0 IOUT1 IIN1 net12 VSS sg13_lv_nmos w=0.5u l=1.04u +XM3_f1 IOUT1 IIN1 net12 VSS sg13_lv_nmos w=0.5u l=1.04u +XM3_f2 IOUT1 IIN1 net12 VSS sg13_lv_nmos w=0.5u l=1.04u +XM3_f3 IOUT1 IIN1 net12 VSS sg13_lv_nmos w=0.5u l=1.04u +XM3_f4 IOUT1 IIN1 net12 VSS sg13_lv_nmos w=0.5u l=1.04u +XM3_f5 IOUT1 IIN1 net12 VSS sg13_lv_nmos w=0.5u l=1.04u +XM4_f0 net12 net6 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM4_f1 net12 net6 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM4_f2 net12 net6 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM4_f3 net12 net6 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM4_f4 net12 net6 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM4_f5 net12 net6 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +.ends C02_ihp130_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1.5_sL2/testbench.spice new file mode 100644 index 00000000..457d01a2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1.5_sL2/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IIN1 IOUT1 C02_ihp130_sW1.5_sL2 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIIN1 VDDB IIN1 2e-05 +.nodeset v(IIN1)=0.36 + +VOUT IOUT1 0 1.2 +.control +dc VOUT 1.2 0 -0.003 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=0.82 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.03 cross=last +meas dc dev_at_vdd find dev at=1.194 +let gout = deriv(iout) +meas dc gout_t find gout at=0.82 +let rout_v = 1/gout +meas dc rout_t find rout_v at=0.82 +echo vout_test = 0.82 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1_sL1.5/case.json new file mode 100644 index 00000000..9d860e97 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1_sL1.5/case.json @@ -0,0 +1,141 @@ +{ + "case_id": "C02_ihp130_sW1_sL1.5", + "circuit_id": "C02", + "pdk": "ihp130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "dut_name": "C02_ihp130_sW1_sL1.5", + "ports": [ + "VSS", + "IIN1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.78, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 0.78, + "nf": 4 + }, + "M3": { + "w": 2.0, + "l": 0.78, + "nf": 4 + }, + "M4": { + "w": 2.0, + "l": 0.78, + "nf": 4 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 0.78, + "tol": 0.03, + "vout_test": 0.84 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.78, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.78, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.78, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.78, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "d8de84c95a231086", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1_sL1.5/manifest.json new file mode 100644 index 00000000..47baea7c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "3d1321ded5f96083ecd9f3645669c4da60b3140432396701f7fd2248ce451d3f", + "qualification.json": "6b7be25df2168f2bbfdafe6445953c8681803dedc530d8ca91bb0d17f4eb3b13", + "specs.json": "55f4c80237c14fece48ec2fc2cbe485f20022557bcf2acb8bff9d729cad9f31c", + "target.spice": "03c3b6873e685bb90bff6a51868fc1891946222864d3f2a4fdd0243bf8995305", + "target_lvs.spice": "ac45c51cec88c62c32bb15377283985b555491fbc328cca7bed8ae13ec709031", + "testbench.spice": "c64c2d1571af10a303b9e77ae4234d149504a9e8d47334072db32b10043b1af2" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1_sL1.5/qualification.json new file mode 100644 index 00000000..f13fe532 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1_sL1.5/qualification.json @@ -0,0 +1,115 @@ +{ + "case_id": "C02_ihp130_sW1_sL1.5", + "circuit_id": "C02", + "pdk": "ihp130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.78, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.78, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.78, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.78, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "d8de84c95a231086", + "mirror_pass1": { + "vmin": 0.4723216, + "status": "passed", + "vout_test": 0.84 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.5723 + }, + "_frozen_from": { + "schematic": { + "err": -0.001908, + "vmin": 0.4723216 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.72 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.4, + "schematic_measures": { + "iout_t": 1.996184e-05, + "err": -0.001908, + "vmin": 0.4723216, + "dev_at_vdd": 0.001451824, + "gout_t": 2.377361e-07, + "rout_t": 4206345.0, + "vout_test": 0.84, + "rout_nom": 4206345.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1_sL1.5/specs.json new file mode 100644 index 00000000..8534ae50 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.5723 + }, + "_frozen_from": { + "schematic": { + "err": -0.001908, + "vmin": 0.4723216 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.72 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1_sL1.5/target.spice new file mode 100644 index 00000000..1ec0ddef --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1_sL1.5/target.spice @@ -0,0 +1,6 @@ +.subckt C02_ihp130_sW1_sL1.5 VSS IIN1 IOUT1 +XM1 IIN1 IIN1 net6 VSS sg13_lv_nmos w=2u l=0.78u ng=4 m=1 +XM2 net6 net6 VSS VSS sg13_lv_nmos w=2u l=0.78u ng=4 m=1 +XM3 IOUT1 IIN1 net12 VSS sg13_lv_nmos w=2u l=0.78u ng=4 m=1 +XM4 net12 net6 VSS VSS sg13_lv_nmos w=2u l=0.78u ng=4 m=1 +.ends C02_ihp130_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1_sL1.5/target_lvs.spice new file mode 100644 index 00000000..9e6ec451 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1_sL1.5/target_lvs.spice @@ -0,0 +1,18 @@ +.subckt C02_ihp130_sW1_sL1.5 VSS IIN1 IOUT1 +XM1_f0 IIN1 IIN1 net6 VSS sg13_lv_nmos w=0.5u l=0.78u +XM1_f1 IIN1 IIN1 net6 VSS sg13_lv_nmos w=0.5u l=0.78u +XM1_f2 IIN1 IIN1 net6 VSS sg13_lv_nmos w=0.5u l=0.78u +XM1_f3 IIN1 IIN1 net6 VSS sg13_lv_nmos w=0.5u l=0.78u +XM2_f0 net6 net6 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM2_f1 net6 net6 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM2_f2 net6 net6 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM2_f3 net6 net6 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f0 IOUT1 IIN1 net12 VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f1 IOUT1 IIN1 net12 VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f2 IOUT1 IIN1 net12 VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f3 IOUT1 IIN1 net12 VSS sg13_lv_nmos w=0.5u l=0.78u +XM4_f0 net12 net6 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM4_f1 net12 net6 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM4_f2 net12 net6 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM4_f3 net12 net6 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +.ends C02_ihp130_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1_sL1.5/testbench.spice new file mode 100644 index 00000000..af350e2d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1_sL1.5/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IIN1 IOUT1 C02_ihp130_sW1_sL1.5 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIIN1 VDDB IIN1 2e-05 +.nodeset v(IIN1)=0.36 + +VOUT IOUT1 0 1.2 +.control +dc VOUT 1.2 0 -0.003 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=0.84 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.03 cross=last +meas dc dev_at_vdd find dev at=1.194 +let gout = deriv(iout) +meas dc gout_t find gout at=0.84 +let rout_v = 1/gout +meas dc rout_t find rout_v at=0.84 +echo vout_test = 0.84 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1_sL1/case.json new file mode 100644 index 00000000..fd5cda06 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1_sL1/case.json @@ -0,0 +1,141 @@ +{ + "case_id": "C02_ihp130_sW1_sL1", + "circuit_id": "C02", + "pdk": "ihp130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "dut_name": "C02_ihp130_sW1_sL1", + "ports": [ + "VSS", + "IIN1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.52, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 0.52, + "nf": 4 + }, + "M3": { + "w": 2.0, + "l": 0.52, + "nf": 4 + }, + "M4": { + "w": 2.0, + "l": 0.52, + "nf": 4 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 0.78, + "tol": 0.03, + "vout_test": 0.83 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "66e86865cef02a99", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1_sL1/manifest.json new file mode 100644 index 00000000..6885d107 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "0eb66d7e0fd255b7b056cfd45dbdd66945ff673b7935cc59bcdb48f539be9a93", + "qualification.json": "37d68492f33c16d87c213475f68f4969f2a458ac2b401040e3bf9f0219198a11", + "specs.json": "91aa56d2fd3263e86c6b929be0298cc289b6711c691e49c9baf3bb829cc5ed6e", + "target.spice": "8ad6ef174d9455134545421574946258aba9bf2237d862fc6cbaee8e12367f73", + "target_lvs.spice": "f4ce8c0ccfbcc7a2c06c5c0355933e94d5119e0e26db44d6e9b7f29e23f6d1f3", + "testbench.spice": "e4eb8c34636ff5b92c2ebdd8f4dcb600f0bb949de39106311beff0677b1c8ba5" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1_sL1/qualification.json new file mode 100644 index 00000000..f5514b54 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1_sL1/qualification.json @@ -0,0 +1,115 @@ +{ + "case_id": "C02_ihp130_sW1_sL1", + "circuit_id": "C02", + "pdk": "ihp130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "66e86865cef02a99", + "mirror_pass1": { + "vmin": 0.4684034, + "status": "passed", + "vout_test": 0.83 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.5684 + }, + "_frozen_from": { + "schematic": { + "err": -0.002309, + "vmin": 0.4684034 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.72 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.4, + "schematic_measures": { + "iout_t": 1.995382e-05, + "err": -0.002309, + "vmin": 0.4684034, + "dev_at_vdd": 0.002584595, + "gout_t": 3.298376e-07, + "rout_t": 3031809.0, + "vout_test": 0.83, + "rout_nom": 3031809.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1_sL1/specs.json new file mode 100644 index 00000000..dee4f3c6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.5684 + }, + "_frozen_from": { + "schematic": { + "err": -0.002309, + "vmin": 0.4684034 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.72 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1_sL1/target.spice new file mode 100644 index 00000000..3d745488 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1_sL1/target.spice @@ -0,0 +1,6 @@ +.subckt C02_ihp130_sW1_sL1 VSS IIN1 IOUT1 +XM1 IIN1 IIN1 net6 VSS sg13_lv_nmos w=2u l=0.52u ng=4 m=1 +XM2 net6 net6 VSS VSS sg13_lv_nmos w=2u l=0.52u ng=4 m=1 +XM3 IOUT1 IIN1 net12 VSS sg13_lv_nmos w=2u l=0.52u ng=4 m=1 +XM4 net12 net6 VSS VSS sg13_lv_nmos w=2u l=0.52u ng=4 m=1 +.ends C02_ihp130_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1_sL1/target_lvs.spice new file mode 100644 index 00000000..295c6588 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1_sL1/target_lvs.spice @@ -0,0 +1,18 @@ +.subckt C02_ihp130_sW1_sL1 VSS IIN1 IOUT1 +XM1_f0 IIN1 IIN1 net6 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f1 IIN1 IIN1 net6 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f2 IIN1 IIN1 net6 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f3 IIN1 IIN1 net6 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f0 net6 net6 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f1 net6 net6 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f2 net6 net6 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f3 net6 net6 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f0 IOUT1 IIN1 net12 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f1 IOUT1 IIN1 net12 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f2 IOUT1 IIN1 net12 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f3 IOUT1 IIN1 net12 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f0 net12 net6 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f1 net12 net6 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f2 net12 net6 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f3 net12 net6 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +.ends C02_ihp130_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1_sL1/testbench.spice new file mode 100644 index 00000000..7973f368 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1_sL1/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IIN1 IOUT1 C02_ihp130_sW1_sL1 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIIN1 VDDB IIN1 2e-05 +.nodeset v(IIN1)=0.36 + +VOUT IOUT1 0 1.2 +.control +dc VOUT 1.2 0 -0.003 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=0.83 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.03 cross=last +meas dc dev_at_vdd find dev at=1.194 +let gout = deriv(iout) +meas dc gout_t find gout at=0.83 +let rout_v = 1/gout +meas dc rout_t find rout_v at=0.83 +echo vout_test = 0.83 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1_sL2/case.json new file mode 100644 index 00000000..222289f7 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1_sL2/case.json @@ -0,0 +1,141 @@ +{ + "case_id": "C02_ihp130_sW1_sL2", + "circuit_id": "C02", + "pdk": "ihp130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "dut_name": "C02_ihp130_sW1_sL2", + "ports": [ + "VSS", + "IIN1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 1.04, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 1.04, + "nf": 4 + }, + "M3": { + "w": 2.0, + "l": 1.04, + "nf": 4 + }, + "M4": { + "w": 2.0, + "l": 1.04, + "nf": 4 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 0.78, + "tol": 0.03, + "vout_test": 0.84 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.04, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.04, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.04, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.04, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "3f0beef46459e717", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1_sL2/manifest.json new file mode 100644 index 00000000..d8e587f4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "3b0a69e3f771d714063798eeffb9794da0e1fd8ab41f926d0668be8e54971065", + "qualification.json": "630b0edc114ffc81e467aa2d0d9e3bc82237758e7ee2a6d17c3454e8c3d0ff51", + "specs.json": "08d91a5ce2431e65710b197db8a2cea79a2953ebf5f510f9d783155b5642e0cd", + "target.spice": "3a6ae0beefa82dfce9aa1fd5141fa84946e0b651364e663368b1476aafc4719e", + "target_lvs.spice": "e5e5769393ae2c0e9aadb0cec2c78d9875beae2135b13d3b5650a02262fe9e99", + "testbench.spice": "7ff5c11f34f38c78e42550ede504c133b6a883735bbe6a1ccd562c70225c8fba" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1_sL2/qualification.json new file mode 100644 index 00000000..4c7a0bc6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1_sL2/qualification.json @@ -0,0 +1,115 @@ +{ + "case_id": "C02_ihp130_sW1_sL2", + "circuit_id": "C02", + "pdk": "ihp130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.04, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.04, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.04, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.04, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "3f0beef46459e717", + "mirror_pass1": { + "vmin": 0.4816118, + "status": "passed", + "vout_test": 0.84 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.5816 + }, + "_frozen_from": { + "schematic": { + "err": -0.001863, + "vmin": 0.4816118 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.72 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.5, + "schematic_measures": { + "iout_t": 1.996274e-05, + "err": -0.001863, + "vmin": 0.4816118, + "dev_at_vdd": 0.0008137832, + "gout_t": 1.988411e-07, + "rout_t": 5029141.0, + "vout_test": 0.84, + "rout_nom": 5029141.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1_sL2/specs.json new file mode 100644 index 00000000..cbdab5e0 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.5816 + }, + "_frozen_from": { + "schematic": { + "err": -0.001863, + "vmin": 0.4816118 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.72 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1_sL2/target.spice new file mode 100644 index 00000000..2527e366 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1_sL2/target.spice @@ -0,0 +1,6 @@ +.subckt C02_ihp130_sW1_sL2 VSS IIN1 IOUT1 +XM1 IIN1 IIN1 net6 VSS sg13_lv_nmos w=2u l=1.04u ng=4 m=1 +XM2 net6 net6 VSS VSS sg13_lv_nmos w=2u l=1.04u ng=4 m=1 +XM3 IOUT1 IIN1 net12 VSS sg13_lv_nmos w=2u l=1.04u ng=4 m=1 +XM4 net12 net6 VSS VSS sg13_lv_nmos w=2u l=1.04u ng=4 m=1 +.ends C02_ihp130_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1_sL2/target_lvs.spice new file mode 100644 index 00000000..f1f8bd47 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1_sL2/target_lvs.spice @@ -0,0 +1,18 @@ +.subckt C02_ihp130_sW1_sL2 VSS IIN1 IOUT1 +XM1_f0 IIN1 IIN1 net6 VSS sg13_lv_nmos w=0.5u l=1.04u +XM1_f1 IIN1 IIN1 net6 VSS sg13_lv_nmos w=0.5u l=1.04u +XM1_f2 IIN1 IIN1 net6 VSS sg13_lv_nmos w=0.5u l=1.04u +XM1_f3 IIN1 IIN1 net6 VSS sg13_lv_nmos w=0.5u l=1.04u +XM2_f0 net6 net6 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM2_f1 net6 net6 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM2_f2 net6 net6 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM2_f3 net6 net6 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM3_f0 IOUT1 IIN1 net12 VSS sg13_lv_nmos w=0.5u l=1.04u +XM3_f1 IOUT1 IIN1 net12 VSS sg13_lv_nmos w=0.5u l=1.04u +XM3_f2 IOUT1 IIN1 net12 VSS sg13_lv_nmos w=0.5u l=1.04u +XM3_f3 IOUT1 IIN1 net12 VSS sg13_lv_nmos w=0.5u l=1.04u +XM4_f0 net12 net6 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM4_f1 net12 net6 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM4_f2 net12 net6 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM4_f3 net12 net6 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +.ends C02_ihp130_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1_sL2/testbench.spice new file mode 100644 index 00000000..2ce646c6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW1_sL2/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IIN1 IOUT1 C02_ihp130_sW1_sL2 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIIN1 VDDB IIN1 2e-05 +.nodeset v(IIN1)=0.36 + +VOUT IOUT1 0 1.2 +.control +dc VOUT 1.2 0 -0.003 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=0.84 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.03 cross=last +meas dc dev_at_vdd find dev at=1.194 +let gout = deriv(iout) +meas dc gout_t find gout at=0.84 +let rout_v = 1/gout +meas dc rout_t find rout_v at=0.84 +echo vout_test = 0.84 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW2_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW2_sL1.5/case.json new file mode 100644 index 00000000..1271506b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW2_sL1.5/case.json @@ -0,0 +1,141 @@ +{ + "case_id": "C02_ihp130_sW2_sL1.5", + "circuit_id": "C02", + "pdk": "ihp130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "dut_name": "C02_ihp130_sW2_sL1.5", + "ports": [ + "VSS", + "IIN1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.78, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 0.78, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 0.78, + "nf": 8 + }, + "M4": { + "w": 4.0, + "l": 0.78, + "nf": 8 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 0.78, + "tol": 0.03, + "vout_test": 0.8 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.78, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.78, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.78, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.78, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "369851ccc7abddea", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW2_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW2_sL1.5/manifest.json new file mode 100644 index 00000000..6f71c8ec --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW2_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "428d7eeed77a819bd7adc24c60850a4dd48df00f3ffb2cf4471ad4754817e570", + "qualification.json": "0a99472eaf194246caf5775d23ed2d53c959700edd0810c6335a86263cc8bf38", + "specs.json": "4381bfd7f8c1c6cbf8360acde2577d189893989508ff35c8deeee11fd2605468", + "target.spice": "2678b1cc490051f5967ca0889462d37c9819471579c5e6e85844f89a48ce9372", + "target_lvs.spice": "6f256351ccfe39c741efff0f70af87282dcaac624502fd67274ff95de18074f5", + "testbench.spice": "de796d04dc326a00eecab022c0c58929446a1eae2e44ccad8c245b2b2fe75294" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW2_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW2_sL1.5/qualification.json new file mode 100644 index 00000000..1d49d708 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW2_sL1.5/qualification.json @@ -0,0 +1,115 @@ +{ + "case_id": "C02_ihp130_sW2_sL1.5", + "circuit_id": "C02", + "pdk": "ihp130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.78, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.78, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.78, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.78, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "369851ccc7abddea", + "mirror_pass1": { + "vmin": 0.4040129, + "status": "passed", + "vout_test": 0.8 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.504 + }, + "_frozen_from": { + "schematic": { + "err": -0.0010005, + "vmin": 0.4040129 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.72 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.9, + "schematic_measures": { + "iout_t": 1.997999e-05, + "err": -0.0010005, + "vmin": 0.4040129, + "dev_at_vdd": 0.003509739, + "gout_t": 2.791383e-07, + "rout_t": 3582464.0, + "vout_test": 0.8, + "rout_nom": 3582464.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW2_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW2_sL1.5/specs.json new file mode 100644 index 00000000..1e7c0f57 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW2_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.504 + }, + "_frozen_from": { + "schematic": { + "err": -0.0010005, + "vmin": 0.4040129 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.72 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW2_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW2_sL1.5/target.spice new file mode 100644 index 00000000..069cd7a7 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW2_sL1.5/target.spice @@ -0,0 +1,6 @@ +.subckt C02_ihp130_sW2_sL1.5 VSS IIN1 IOUT1 +XM1 IIN1 IIN1 net6 VSS sg13_lv_nmos w=4u l=0.78u ng=8 m=1 +XM2 net6 net6 VSS VSS sg13_lv_nmos w=4u l=0.78u ng=8 m=1 +XM3 IOUT1 IIN1 net12 VSS sg13_lv_nmos w=4u l=0.78u ng=8 m=1 +XM4 net12 net6 VSS VSS sg13_lv_nmos w=4u l=0.78u ng=8 m=1 +.ends C02_ihp130_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW2_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW2_sL1.5/target_lvs.spice new file mode 100644 index 00000000..1c1ef939 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW2_sL1.5/target_lvs.spice @@ -0,0 +1,34 @@ +.subckt C02_ihp130_sW2_sL1.5 VSS IIN1 IOUT1 +XM1_f0 IIN1 IIN1 net6 VSS sg13_lv_nmos w=0.5u l=0.78u +XM1_f1 IIN1 IIN1 net6 VSS sg13_lv_nmos w=0.5u l=0.78u +XM1_f2 IIN1 IIN1 net6 VSS sg13_lv_nmos w=0.5u l=0.78u +XM1_f3 IIN1 IIN1 net6 VSS sg13_lv_nmos w=0.5u l=0.78u +XM1_f4 IIN1 IIN1 net6 VSS sg13_lv_nmos w=0.5u l=0.78u +XM1_f5 IIN1 IIN1 net6 VSS sg13_lv_nmos w=0.5u l=0.78u +XM1_f6 IIN1 IIN1 net6 VSS sg13_lv_nmos w=0.5u l=0.78u +XM1_f7 IIN1 IIN1 net6 VSS sg13_lv_nmos w=0.5u l=0.78u +XM2_f0 net6 net6 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM2_f1 net6 net6 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM2_f2 net6 net6 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM2_f3 net6 net6 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM2_f4 net6 net6 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM2_f5 net6 net6 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM2_f6 net6 net6 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM2_f7 net6 net6 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f0 IOUT1 IIN1 net12 VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f1 IOUT1 IIN1 net12 VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f2 IOUT1 IIN1 net12 VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f3 IOUT1 IIN1 net12 VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f4 IOUT1 IIN1 net12 VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f5 IOUT1 IIN1 net12 VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f6 IOUT1 IIN1 net12 VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f7 IOUT1 IIN1 net12 VSS sg13_lv_nmos w=0.5u l=0.78u +XM4_f0 net12 net6 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM4_f1 net12 net6 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM4_f2 net12 net6 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM4_f3 net12 net6 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM4_f4 net12 net6 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM4_f5 net12 net6 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM4_f6 net12 net6 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM4_f7 net12 net6 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +.ends C02_ihp130_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW2_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW2_sL1.5/testbench.spice new file mode 100644 index 00000000..07824ba5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW2_sL1.5/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IIN1 IOUT1 C02_ihp130_sW2_sL1.5 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIIN1 VDDB IIN1 2e-05 +.nodeset v(IIN1)=0.36 + +VOUT IOUT1 0 1.2 +.control +dc VOUT 1.2 0 -0.003 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=0.8 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.03 cross=last +meas dc dev_at_vdd find dev at=1.194 +let gout = deriv(iout) +meas dc gout_t find gout at=0.8 +let rout_v = 1/gout +meas dc rout_t find rout_v at=0.8 +echo vout_test = 0.8 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW2_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW2_sL1/case.json new file mode 100644 index 00000000..2e974304 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW2_sL1/case.json @@ -0,0 +1,141 @@ +{ + "case_id": "C02_ihp130_sW2_sL1", + "circuit_id": "C02", + "pdk": "ihp130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "dut_name": "C02_ihp130_sW2_sL1", + "ports": [ + "VSS", + "IIN1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.52, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 0.52, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 0.52, + "nf": 8 + }, + "M4": { + "w": 4.0, + "l": 0.52, + "nf": 8 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 0.78, + "tol": 0.03, + "vout_test": 0.8 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "7cd9e3ddd394d92e", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW2_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW2_sL1/manifest.json new file mode 100644 index 00000000..dba61354 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW2_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "d25e7091fc14e3c722a931016cb985b9df99c43e1eb24de6c184f7f4a1f820ba", + "qualification.json": "c68c81b795598b5bb8ca268879848e365ffdddd0de969dc712f6f89372375cfc", + "specs.json": "e4d744ed982ab2437cc3ddabc585a7aa76869f56e1729cc23f65f784b61bbcb3", + "target.spice": "918b5b51ebe9454d0532f0b096f1788bec8b4a01686598c1ddea15581b3038d0", + "target_lvs.spice": "9c044ed6375261c7d8170f1142d59f6e1c14fcbd93d52f58d72d368fb26c81b2", + "testbench.spice": "ee370f24daa9e0c77b7c06f0e5ca953b3bd8de341d612b647a1ed00649b819de" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW2_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW2_sL1/qualification.json new file mode 100644 index 00000000..475ddc0a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW2_sL1/qualification.json @@ -0,0 +1,115 @@ +{ + "case_id": "C02_ihp130_sW2_sL1", + "circuit_id": "C02", + "pdk": "ihp130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "7cd9e3ddd394d92e", + "mirror_pass1": { + "vmin": 0.4077134, + "status": "passed", + "vout_test": 0.8 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.5077 + }, + "_frozen_from": { + "schematic": { + "err": -0.001074, + "vmin": 0.4077134 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.72 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.8, + "schematic_measures": { + "iout_t": 1.997852e-05, + "err": -0.001074, + "vmin": 0.4077134, + "dev_at_vdd": 0.005426679, + "gout_t": 3.974781e-07, + "rout_t": 2515868.0, + "vout_test": 0.8, + "rout_nom": 2515868.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW2_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW2_sL1/specs.json new file mode 100644 index 00000000..df1a90a7 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW2_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.5077 + }, + "_frozen_from": { + "schematic": { + "err": -0.001074, + "vmin": 0.4077134 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.72 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW2_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW2_sL1/target.spice new file mode 100644 index 00000000..d003a407 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW2_sL1/target.spice @@ -0,0 +1,6 @@ +.subckt C02_ihp130_sW2_sL1 VSS IIN1 IOUT1 +XM1 IIN1 IIN1 net6 VSS sg13_lv_nmos w=4u l=0.52u ng=8 m=1 +XM2 net6 net6 VSS VSS sg13_lv_nmos w=4u l=0.52u ng=8 m=1 +XM3 IOUT1 IIN1 net12 VSS sg13_lv_nmos w=4u l=0.52u ng=8 m=1 +XM4 net12 net6 VSS VSS sg13_lv_nmos w=4u l=0.52u ng=8 m=1 +.ends C02_ihp130_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW2_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW2_sL1/target_lvs.spice new file mode 100644 index 00000000..da82317f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW2_sL1/target_lvs.spice @@ -0,0 +1,34 @@ +.subckt C02_ihp130_sW2_sL1 VSS IIN1 IOUT1 +XM1_f0 IIN1 IIN1 net6 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f1 IIN1 IIN1 net6 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f2 IIN1 IIN1 net6 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f3 IIN1 IIN1 net6 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f4 IIN1 IIN1 net6 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f5 IIN1 IIN1 net6 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f6 IIN1 IIN1 net6 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f7 IIN1 IIN1 net6 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f0 net6 net6 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f1 net6 net6 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f2 net6 net6 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f3 net6 net6 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f4 net6 net6 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f5 net6 net6 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f6 net6 net6 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f7 net6 net6 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f0 IOUT1 IIN1 net12 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f1 IOUT1 IIN1 net12 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f2 IOUT1 IIN1 net12 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f3 IOUT1 IIN1 net12 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f4 IOUT1 IIN1 net12 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f5 IOUT1 IIN1 net12 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f6 IOUT1 IIN1 net12 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f7 IOUT1 IIN1 net12 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f0 net12 net6 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f1 net12 net6 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f2 net12 net6 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f3 net12 net6 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f4 net12 net6 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f5 net12 net6 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f6 net12 net6 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f7 net12 net6 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +.ends C02_ihp130_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW2_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW2_sL1/testbench.spice new file mode 100644 index 00000000..5bb6f89a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW2_sL1/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IIN1 IOUT1 C02_ihp130_sW2_sL1 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIIN1 VDDB IIN1 2e-05 +.nodeset v(IIN1)=0.36 + +VOUT IOUT1 0 1.2 +.control +dc VOUT 1.2 0 -0.003 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=0.8 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.03 cross=last +meas dc dev_at_vdd find dev at=1.194 +let gout = deriv(iout) +meas dc gout_t find gout at=0.8 +let rout_v = 1/gout +meas dc rout_t find rout_v at=0.8 +echo vout_test = 0.8 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW2_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW2_sL2/case.json new file mode 100644 index 00000000..a8e8df42 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW2_sL2/case.json @@ -0,0 +1,141 @@ +{ + "case_id": "C02_ihp130_sW2_sL2", + "circuit_id": "C02", + "pdk": "ihp130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "dut_name": "C02_ihp130_sW2_sL2", + "ports": [ + "VSS", + "IIN1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 1.04, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 1.04, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 1.04, + "nf": 8 + }, + "M4": { + "w": 4.0, + "l": 1.04, + "nf": 8 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 0.78, + "tol": 0.03, + "vout_test": 0.8 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.04, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.04, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.04, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.04, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "057857a71ac3d1dc", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW2_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW2_sL2/manifest.json new file mode 100644 index 00000000..9ef3f861 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW2_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "9b5f9617fb57a6d75848bd6604e2bdebec24ec250475a712d5238f1d94de77f9", + "qualification.json": "13dc91f79b4a382339a07b9cbcad0a8c33b9980bac1aaa9a840016dcfea3fae0", + "specs.json": "13ac64b2185e1c186ee962d1b69047c9f0edefbd7abac5aa8a3374ef87a73072", + "target.spice": "59ab986761ceb0f3848404bbaab5960e536fda5fa332031d6cf750fcbad3433d", + "target_lvs.spice": "92f1d21aecc10c337890983cebbb5452e3cc0c0c7a83db348d5fa55c947050e0", + "testbench.spice": "ae2cbce05a83712dc7f43ef310a4ec9713a2543534bd6912c4d69c0ee95cebe0" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW2_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW2_sL2/qualification.json new file mode 100644 index 00000000..7b1aa08f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW2_sL2/qualification.json @@ -0,0 +1,115 @@ +{ + "case_id": "C02_ihp130_sW2_sL2", + "circuit_id": "C02", + "pdk": "ihp130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.04, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.04, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.04, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.04, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "057857a71ac3d1dc", + "mirror_pass1": { + "vmin": 0.4068016, + "status": "passed", + "vout_test": 0.8 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.5068 + }, + "_frozen_from": { + "schematic": { + "err": -0.001059, + "vmin": 0.4068016 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.72 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.9, + "schematic_measures": { + "iout_t": 1.997882e-05, + "err": -0.001059, + "vmin": 0.4068016, + "dev_at_vdd": 0.002429683, + "gout_t": 2.189419e-07, + "rout_t": 4567438.0, + "vout_test": 0.8, + "rout_nom": 4567438.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW2_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW2_sL2/specs.json new file mode 100644 index 00000000..99d4d0b0 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW2_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.5068 + }, + "_frozen_from": { + "schematic": { + "err": -0.001059, + "vmin": 0.4068016 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.72 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW2_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW2_sL2/target.spice new file mode 100644 index 00000000..99f69594 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW2_sL2/target.spice @@ -0,0 +1,6 @@ +.subckt C02_ihp130_sW2_sL2 VSS IIN1 IOUT1 +XM1 IIN1 IIN1 net6 VSS sg13_lv_nmos w=4u l=1.04u ng=8 m=1 +XM2 net6 net6 VSS VSS sg13_lv_nmos w=4u l=1.04u ng=8 m=1 +XM3 IOUT1 IIN1 net12 VSS sg13_lv_nmos w=4u l=1.04u ng=8 m=1 +XM4 net12 net6 VSS VSS sg13_lv_nmos w=4u l=1.04u ng=8 m=1 +.ends C02_ihp130_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW2_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW2_sL2/target_lvs.spice new file mode 100644 index 00000000..cd0b3d0a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW2_sL2/target_lvs.spice @@ -0,0 +1,34 @@ +.subckt C02_ihp130_sW2_sL2 VSS IIN1 IOUT1 +XM1_f0 IIN1 IIN1 net6 VSS sg13_lv_nmos w=0.5u l=1.04u +XM1_f1 IIN1 IIN1 net6 VSS sg13_lv_nmos w=0.5u l=1.04u +XM1_f2 IIN1 IIN1 net6 VSS sg13_lv_nmos w=0.5u l=1.04u +XM1_f3 IIN1 IIN1 net6 VSS sg13_lv_nmos w=0.5u l=1.04u +XM1_f4 IIN1 IIN1 net6 VSS sg13_lv_nmos w=0.5u l=1.04u +XM1_f5 IIN1 IIN1 net6 VSS sg13_lv_nmos w=0.5u l=1.04u +XM1_f6 IIN1 IIN1 net6 VSS sg13_lv_nmos w=0.5u l=1.04u +XM1_f7 IIN1 IIN1 net6 VSS sg13_lv_nmos w=0.5u l=1.04u +XM2_f0 net6 net6 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM2_f1 net6 net6 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM2_f2 net6 net6 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM2_f3 net6 net6 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM2_f4 net6 net6 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM2_f5 net6 net6 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM2_f6 net6 net6 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM2_f7 net6 net6 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM3_f0 IOUT1 IIN1 net12 VSS sg13_lv_nmos w=0.5u l=1.04u +XM3_f1 IOUT1 IIN1 net12 VSS sg13_lv_nmos w=0.5u l=1.04u +XM3_f2 IOUT1 IIN1 net12 VSS sg13_lv_nmos w=0.5u l=1.04u +XM3_f3 IOUT1 IIN1 net12 VSS sg13_lv_nmos w=0.5u l=1.04u +XM3_f4 IOUT1 IIN1 net12 VSS sg13_lv_nmos w=0.5u l=1.04u +XM3_f5 IOUT1 IIN1 net12 VSS sg13_lv_nmos w=0.5u l=1.04u +XM3_f6 IOUT1 IIN1 net12 VSS sg13_lv_nmos w=0.5u l=1.04u +XM3_f7 IOUT1 IIN1 net12 VSS sg13_lv_nmos w=0.5u l=1.04u +XM4_f0 net12 net6 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM4_f1 net12 net6 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM4_f2 net12 net6 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM4_f3 net12 net6 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM4_f4 net12 net6 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM4_f5 net12 net6 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM4_f6 net12 net6 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM4_f7 net12 net6 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +.ends C02_ihp130_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW2_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW2_sL2/testbench.spice new file mode 100644 index 00000000..d3bff9b2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/ihp130/sW2_sL2/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IIN1 IOUT1 C02_ihp130_sW2_sL2 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIIN1 VDDB IIN1 2e-05 +.nodeset v(IIN1)=0.36 + +VOUT IOUT1 0 1.2 +.control +dc VOUT 1.2 0 -0.003 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=0.8 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.03 cross=last +meas dc dev_at_vdd find dev at=1.194 +let gout = deriv(iout) +meas dc gout_t find gout at=0.8 +let rout_v = 1/gout +meas dc rout_t find rout_v at=0.8 +echo vout_test = 0.8 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C02/sky130/sW0.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW0.5_sL1.5/case.json new file mode 100644 index 00000000..8a3a4a03 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW0.5_sL1.5/case.json @@ -0,0 +1,141 @@ +{ + "case_id": "C02_sky130_sW0.5_sL1.5", + "circuit_id": "C02", + "pdk": "sky130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "dut_name": "C02_sky130_sW0.5_sL1.5", + "ports": [ + "VSS", + "IIN1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 1.0, + "l": 0.45, + "nf": 2 + }, + "M2": { + "w": 1.0, + "l": 0.45, + "nf": 2 + }, + "M3": { + "w": 1.0, + "l": 0.45, + "nf": 2 + }, + "M4": { + "w": 1.0, + "l": 0.45, + "nf": 2 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 1.1700000000000002, + "tol": 0.03, + "vout_test": 1.26 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.45, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.45, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.45, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.45, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "9962a96c328aa24e", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/sky130/sW0.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW0.5_sL1.5/manifest.json new file mode 100644 index 00000000..d5030c96 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW0.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "36f4c00406dd08ffd37339069c2daaace164c53f5ac3d5e68639be97a4b999a1", + "qualification.json": "6524b1b31e683921a804364d0787f4e6eab6f08d071f3f22ae0d3b80c7064efd", + "specs.json": "dbecc10ffea598bbb75b7daf30da1e78b1cc27f62bd79ee07664916c30b2a5d9", + "target.spice": "51f5d87793de277e8bfbe62253ebc32e6e93d284e0119b7d708311fcade1755e", + "target_lvs.spice": "4f782ac296c3db53f8c07d05e4ce6966f1b2080ae645ebfc952fe370e94429b7", + "testbench.spice": "4aeda3df1a6513510206a46679857549b8be338c87e9628fa74aa9846d7d5bb5" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/sky130/sW0.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW0.5_sL1.5/qualification.json new file mode 100644 index 00000000..83a170cd --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW0.5_sL1.5/qualification.json @@ -0,0 +1,115 @@ +{ + "case_id": "C02_sky130_sW0.5_sL1.5", + "circuit_id": "C02", + "pdk": "sky130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.45, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.45, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.45, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.45, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "9962a96c328aa24e", + "mirror_pass1": { + "vmin": 0.7174334, + "status": "passed", + "vout_test": 1.26 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.8174 + }, + "_frozen_from": { + "schematic": { + "err": -0.0013765, + "vmin": 0.7174334 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.08 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 16.5, + "schematic_measures": { + "iout_t": 1.997247e-05, + "err": -0.0013765, + "vmin": 0.7174334, + "dev_at_vdd": 0.0002110897, + "gout_t": 9.573341e-08, + "rout_t": 10445670.0, + "vout_test": 1.26, + "rout_nom": 10445670.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/sky130/sW0.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW0.5_sL1.5/specs.json new file mode 100644 index 00000000..78b7653c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW0.5_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.8174 + }, + "_frozen_from": { + "schematic": { + "err": -0.0013765, + "vmin": 0.7174334 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.08 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/sky130/sW0.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW0.5_sL1.5/target.spice new file mode 100644 index 00000000..e0ffad6b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW0.5_sL1.5/target.spice @@ -0,0 +1,6 @@ +.subckt C02_sky130_sW0.5_sL1.5 VSS IIN1 IOUT1 +XM1 IIN1 IIN1 net6 VSS sky130_fd_pr__nfet_01v8 w=1 l=0.45 nf=2 +XM2 net6 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=1 l=0.45 nf=2 +XM3 IOUT1 IIN1 net12 VSS sky130_fd_pr__nfet_01v8 w=1 l=0.45 nf=2 +XM4 net12 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=1 l=0.45 nf=2 +.ends C02_sky130_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C02/sky130/sW0.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW0.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..5d169bdd --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW0.5_sL1.5/target_lvs.spice @@ -0,0 +1,10 @@ +.subckt C02_sky130_sW0.5_sL1.5 VSS IIN1 IOUT1 +XM1_f0 IIN1 IIN1 net6 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f1 IIN1 IIN1 net6 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f0 net6 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f1 net6 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f0 IOUT1 IIN1 net12 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f1 IOUT1 IIN1 net12 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f0 net12 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f1 net12 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +.ends C02_sky130_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C02/sky130/sW0.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW0.5_sL1.5/testbench.spice new file mode 100644 index 00000000..811ee9d9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW0.5_sL1.5/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IIN1 IOUT1 C02_sky130_sW0.5_sL1.5 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIIN1 VDDB IIN1 2e-05 +.nodeset v(IIN1)=0.54 + +VOUT IOUT1 0 1.8 +.control +dc VOUT 1.8 0 -0.0045 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=1.26 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.03 cross=last +meas dc dev_at_vdd find dev at=1.791 +let gout = deriv(iout) +meas dc gout_t find gout at=1.26 +let rout_v = 1/gout +meas dc rout_t find rout_v at=1.26 +echo vout_test = 1.26 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C02/sky130/sW0.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW0.5_sL1/case.json new file mode 100644 index 00000000..6761c903 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW0.5_sL1/case.json @@ -0,0 +1,141 @@ +{ + "case_id": "C02_sky130_sW0.5_sL1", + "circuit_id": "C02", + "pdk": "sky130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "dut_name": "C02_sky130_sW0.5_sL1", + "ports": [ + "VSS", + "IIN1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 1.0, + "l": 0.3, + "nf": 2 + }, + "M2": { + "w": 1.0, + "l": 0.3, + "nf": 2 + }, + "M3": { + "w": 1.0, + "l": 0.3, + "nf": 2 + }, + "M4": { + "w": 1.0, + "l": 0.3, + "nf": 2 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 1.1700000000000002, + "tol": 0.03, + "vout_test": 1.27 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.3, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.3, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.3, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.3, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "7a0796ed8bbaeaf2", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/sky130/sW0.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW0.5_sL1/manifest.json new file mode 100644 index 00000000..435d4dea --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW0.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "4b9ea8efa619fdaf11e1b9243f82722bd1394927b8b83262c305a02ca762d41d", + "qualification.json": "6146e8fe67ac231e566a20a3e04078dfa16856100a7d6541048b859181fa4169", + "specs.json": "8fa16df0de33f9961f0e09f5c5f3277b49583802d451584cf0a084f76d2c85ed", + "target.spice": "1b0560c4e03a28793fc0b4f3bb5142079d033fa808fbc0520070ec7630b819d9", + "target_lvs.spice": "669305943eec2f64ae75161fd73238112c5908dc2a80e0c9e64f4e97b1d2d550", + "testbench.spice": "5d766c041fd9f8afd6d3b1589a79743edcddecfb2de6052f6087c6a887d6ff36" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/sky130/sW0.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW0.5_sL1/qualification.json new file mode 100644 index 00000000..28ab44ed --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW0.5_sL1/qualification.json @@ -0,0 +1,115 @@ +{ + "case_id": "C02_sky130_sW0.5_sL1", + "circuit_id": "C02", + "pdk": "sky130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.3, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.3, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.3, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.3, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "7a0796ed8bbaeaf2", + "mirror_pass1": { + "vmin": 0.742627, + "status": "passed", + "vout_test": 1.27 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.8426 + }, + "_frozen_from": { + "schematic": { + "err": -0.0017955, + "vmin": 0.742627 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.08 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 15.1, + "schematic_measures": { + "iout_t": 1.996409e-05, + "err": -0.0017955, + "vmin": 0.742627, + "dev_at_vdd": 0.0002320793, + "gout_t": 9.266985e-08, + "rout_t": 10791410.0, + "vout_test": 1.27, + "rout_nom": 10791410.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/sky130/sW0.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW0.5_sL1/specs.json new file mode 100644 index 00000000..dfa96e20 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW0.5_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.8426 + }, + "_frozen_from": { + "schematic": { + "err": -0.0017955, + "vmin": 0.742627 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.08 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/sky130/sW0.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW0.5_sL1/target.spice new file mode 100644 index 00000000..2e3a3a68 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW0.5_sL1/target.spice @@ -0,0 +1,6 @@ +.subckt C02_sky130_sW0.5_sL1 VSS IIN1 IOUT1 +XM1 IIN1 IIN1 net6 VSS sky130_fd_pr__nfet_01v8 w=1 l=0.3 nf=2 +XM2 net6 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=1 l=0.3 nf=2 +XM3 IOUT1 IIN1 net12 VSS sky130_fd_pr__nfet_01v8 w=1 l=0.3 nf=2 +XM4 net12 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=1 l=0.3 nf=2 +.ends C02_sky130_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C02/sky130/sW0.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW0.5_sL1/target_lvs.spice new file mode 100644 index 00000000..18df78b1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW0.5_sL1/target_lvs.spice @@ -0,0 +1,10 @@ +.subckt C02_sky130_sW0.5_sL1 VSS IIN1 IOUT1 +XM1_f0 IIN1 IIN1 net6 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f1 IIN1 IIN1 net6 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f0 net6 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f1 net6 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f0 IOUT1 IIN1 net12 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f1 IOUT1 IIN1 net12 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f0 net12 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f1 net12 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +.ends C02_sky130_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C02/sky130/sW0.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW0.5_sL1/testbench.spice new file mode 100644 index 00000000..5442eb9a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW0.5_sL1/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IIN1 IOUT1 C02_sky130_sW0.5_sL1 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIIN1 VDDB IIN1 2e-05 +.nodeset v(IIN1)=0.54 + +VOUT IOUT1 0 1.8 +.control +dc VOUT 1.8 0 -0.0045 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=1.27 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.03 cross=last +meas dc dev_at_vdd find dev at=1.791 +let gout = deriv(iout) +meas dc gout_t find gout at=1.27 +let rout_v = 1/gout +meas dc rout_t find rout_v at=1.27 +echo vout_test = 1.27 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C02/sky130/sW0.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW0.5_sL2/case.json new file mode 100644 index 00000000..c308306f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW0.5_sL2/case.json @@ -0,0 +1,141 @@ +{ + "case_id": "C02_sky130_sW0.5_sL2", + "circuit_id": "C02", + "pdk": "sky130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "dut_name": "C02_sky130_sW0.5_sL2", + "ports": [ + "VSS", + "IIN1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 1.0, + "l": 0.6, + "nf": 2 + }, + "M2": { + "w": 1.0, + "l": 0.6, + "nf": 2 + }, + "M3": { + "w": 1.0, + "l": 0.6, + "nf": 2 + }, + "M4": { + "w": 1.0, + "l": 0.6, + "nf": 2 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 1.1700000000000002, + "tol": 0.03, + "vout_test": 1.26 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.6, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.6, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.6, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.6, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "e99087ba8803a050", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/sky130/sW0.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW0.5_sL2/manifest.json new file mode 100644 index 00000000..2d3bfc52 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW0.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "1e226630435d3342784568a7db7f0017c64ffd767ab55f7a20324b731c695f62", + "qualification.json": "0ad556e8952c1892cc7b578fab83db891d1f4fe024eed9251624403fd5b20514", + "specs.json": "06df24f046d3a93071ac4fc93274a8d7c42759a1f74fe1b512cd536a58a03ae4", + "target.spice": "75cefb44a8157e18a2a29179fffbf347fdcad56646f4f033d4f8b1f6039ee6f0", + "target_lvs.spice": "5d31417e28af28146e54dcd187f94b8691c8e67d7a232a3fadd6f4854bbc6ef7", + "testbench.spice": "704a2f89b0840b0cb64fb3b3221a24150170efc4af8288e46aa0c72362b4589d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/sky130/sW0.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW0.5_sL2/qualification.json new file mode 100644 index 00000000..d5190e9e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW0.5_sL2/qualification.json @@ -0,0 +1,115 @@ +{ + "case_id": "C02_sky130_sW0.5_sL2", + "circuit_id": "C02", + "pdk": "sky130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.6, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.6, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.6, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.6, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "e99087ba8803a050", + "mirror_pass1": { + "vmin": 0.710947, + "status": "passed", + "vout_test": 1.26 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.8109 + }, + "_frozen_from": { + "schematic": { + "err": -0.0014165, + "vmin": 0.710947 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.08 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 12.3, + "schematic_measures": { + "iout_t": 1.997167e-05, + "err": -0.0014165, + "vmin": 0.710947, + "dev_at_vdd": 0.0002164835, + "gout_t": 1.435474e-07, + "rout_t": 6966341.0, + "vout_test": 1.26, + "rout_nom": 6966341.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/sky130/sW0.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW0.5_sL2/specs.json new file mode 100644 index 00000000..a52c5d72 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW0.5_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.8109 + }, + "_frozen_from": { + "schematic": { + "err": -0.0014165, + "vmin": 0.710947 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.08 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/sky130/sW0.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW0.5_sL2/target.spice new file mode 100644 index 00000000..ea7e2d66 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW0.5_sL2/target.spice @@ -0,0 +1,6 @@ +.subckt C02_sky130_sW0.5_sL2 VSS IIN1 IOUT1 +XM1 IIN1 IIN1 net6 VSS sky130_fd_pr__nfet_01v8 w=1 l=0.6 nf=2 +XM2 net6 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=1 l=0.6 nf=2 +XM3 IOUT1 IIN1 net12 VSS sky130_fd_pr__nfet_01v8 w=1 l=0.6 nf=2 +XM4 net12 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=1 l=0.6 nf=2 +.ends C02_sky130_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C02/sky130/sW0.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW0.5_sL2/target_lvs.spice new file mode 100644 index 00000000..6374de5d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW0.5_sL2/target_lvs.spice @@ -0,0 +1,10 @@ +.subckt C02_sky130_sW0.5_sL2 VSS IIN1 IOUT1 +XM1_f0 IIN1 IIN1 net6 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f1 IIN1 IIN1 net6 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f0 net6 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f1 net6 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f0 IOUT1 IIN1 net12 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f1 IOUT1 IIN1 net12 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f0 net12 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f1 net12 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +.ends C02_sky130_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C02/sky130/sW0.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW0.5_sL2/testbench.spice new file mode 100644 index 00000000..79fc7227 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW0.5_sL2/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IIN1 IOUT1 C02_sky130_sW0.5_sL2 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIIN1 VDDB IIN1 2e-05 +.nodeset v(IIN1)=0.54 + +VOUT IOUT1 0 1.8 +.control +dc VOUT 1.8 0 -0.0045 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=1.26 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.03 cross=last +meas dc dev_at_vdd find dev at=1.791 +let gout = deriv(iout) +meas dc gout_t find gout at=1.26 +let rout_v = 1/gout +meas dc rout_t find rout_v at=1.26 +echo vout_test = 1.26 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1.5_sL1.5/case.json new file mode 100644 index 00000000..ef985dd2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1.5_sL1.5/case.json @@ -0,0 +1,141 @@ +{ + "case_id": "C02_sky130_sW1.5_sL1.5", + "circuit_id": "C02", + "pdk": "sky130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "dut_name": "C02_sky130_sW1.5_sL1.5", + "ports": [ + "VSS", + "IIN1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 3.0, + "l": 0.45, + "nf": 6 + }, + "M2": { + "w": 3.0, + "l": 0.45, + "nf": 6 + }, + "M3": { + "w": 3.0, + "l": 0.45, + "nf": 6 + }, + "M4": { + "w": 3.0, + "l": 0.45, + "nf": 6 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 1.1700000000000002, + "tol": 0.03, + "vout_test": 1.2 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.45, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.45, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.45, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.45, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "2458f178b486d709", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1.5_sL1.5/manifest.json new file mode 100644 index 00000000..9fc418f1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "174904d83edd04560155a5032e051b4f2a6a50689c76bfe7352cd30fb8d18226", + "qualification.json": "56fe581e8cd3fef782c24b4e1404f6ed7cc14a5449505545b3ad7bfe3033d808", + "specs.json": "aa9cc300c3629e03a4b5e7442f5c38b81108d04e9ec99d40e309787eba135200", + "target.spice": "91a0601cbbce4eecba4701560544d7e1f4630070d8dfcb5c8c08ff6953fd3870", + "target_lvs.spice": "2e90aa55a709166f4c8a4f6f95f2b671b68b94f0605626f21f7a7c154a2143cf", + "testbench.spice": "c35ed6a3958ae455ceaae56e8986a951709882a65486b4e5289bf4810b0e9873" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1.5_sL1.5/qualification.json new file mode 100644 index 00000000..0840a984 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1.5_sL1.5/qualification.json @@ -0,0 +1,115 @@ +{ + "case_id": "C02_sky130_sW1.5_sL1.5", + "circuit_id": "C02", + "pdk": "sky130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.45, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.45, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.45, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.45, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "2458f178b486d709", + "mirror_pass1": { + "vmin": 0.6033771, + "status": "passed", + "vout_test": 1.2 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.7034 + }, + "_frozen_from": { + "schematic": { + "err": -0.0007555, + "vmin": 0.6033771 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.08 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 13.1, + "schematic_measures": { + "iout_t": 1.998489e-05, + "err": -0.0007555, + "vmin": 0.6033771, + "dev_at_vdd": 0.0001205313, + "gout_t": 4.32638e-08, + "rout_t": 23114650.0, + "vout_test": 1.2, + "rout_nom": 23114650.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1.5_sL1.5/specs.json new file mode 100644 index 00000000..cfde33ca --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1.5_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.7034 + }, + "_frozen_from": { + "schematic": { + "err": -0.0007555, + "vmin": 0.6033771 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.08 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1.5_sL1.5/target.spice new file mode 100644 index 00000000..16ff958d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1.5_sL1.5/target.spice @@ -0,0 +1,6 @@ +.subckt C02_sky130_sW1.5_sL1.5 VSS IIN1 IOUT1 +XM1 IIN1 IIN1 net6 VSS sky130_fd_pr__nfet_01v8 w=3 l=0.45 nf=6 +XM2 net6 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=3 l=0.45 nf=6 +XM3 IOUT1 IIN1 net12 VSS sky130_fd_pr__nfet_01v8 w=3 l=0.45 nf=6 +XM4 net12 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=3 l=0.45 nf=6 +.ends C02_sky130_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..ad2f6e92 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1.5_sL1.5/target_lvs.spice @@ -0,0 +1,26 @@ +.subckt C02_sky130_sW1.5_sL1.5 VSS IIN1 IOUT1 +XM1_f0 IIN1 IIN1 net6 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f1 IIN1 IIN1 net6 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f2 IIN1 IIN1 net6 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f3 IIN1 IIN1 net6 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f4 IIN1 IIN1 net6 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f5 IIN1 IIN1 net6 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f0 net6 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f1 net6 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f2 net6 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f3 net6 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f4 net6 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f5 net6 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f0 IOUT1 IIN1 net12 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f1 IOUT1 IIN1 net12 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f2 IOUT1 IIN1 net12 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f3 IOUT1 IIN1 net12 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f4 IOUT1 IIN1 net12 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f5 IOUT1 IIN1 net12 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f0 net12 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f1 net12 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f2 net12 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f3 net12 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f4 net12 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f5 net12 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +.ends C02_sky130_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1.5_sL1.5/testbench.spice new file mode 100644 index 00000000..9e05251c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1.5_sL1.5/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IIN1 IOUT1 C02_sky130_sW1.5_sL1.5 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIIN1 VDDB IIN1 2e-05 +.nodeset v(IIN1)=0.54 + +VOUT IOUT1 0 1.8 +.control +dc VOUT 1.8 0 -0.0045 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=1.2 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.03 cross=last +meas dc dev_at_vdd find dev at=1.791 +let gout = deriv(iout) +meas dc gout_t find gout at=1.2 +let rout_v = 1/gout +meas dc rout_t find rout_v at=1.2 +echo vout_test = 1.2 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1.5_sL1/case.json new file mode 100644 index 00000000..0000af37 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1.5_sL1/case.json @@ -0,0 +1,141 @@ +{ + "case_id": "C02_sky130_sW1.5_sL1", + "circuit_id": "C02", + "pdk": "sky130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "dut_name": "C02_sky130_sW1.5_sL1", + "ports": [ + "VSS", + "IIN1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 3.0, + "l": 0.3, + "nf": 6 + }, + "M2": { + "w": 3.0, + "l": 0.3, + "nf": 6 + }, + "M3": { + "w": 3.0, + "l": 0.3, + "nf": 6 + }, + "M4": { + "w": 3.0, + "l": 0.3, + "nf": 6 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 1.1700000000000002, + "tol": 0.03, + "vout_test": 1.23 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.3, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.3, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.3, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.3, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "9003b1a735973f41", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1.5_sL1/manifest.json new file mode 100644 index 00000000..533f2334 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "602b9c9304897727103b049fa7a690f9bdace94416e8de636c58c5e07434b9af", + "qualification.json": "f09c5547671bf92dd2023c693ab01b4d9c9aa10b9dbc23bb904a5d719e06eb1b", + "specs.json": "189e5a0334a2a688ac8346ce0cd5eb9df74291afdd23afb69e050522e7391b48", + "target.spice": "a42418e21b1a19a6c0fe2badba52e3b9bcb09858a89c966cb2de17930f2f3497", + "target_lvs.spice": "48483386ea412f9d2a899a2f6b6113c5a8bdc9976f9a050ed82aa86ed0254b8a", + "testbench.spice": "c3532f18ef27c1f6ce3d56ff6c41a40b49c98ed17cd28a750533b0525b06386d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1.5_sL1/qualification.json new file mode 100644 index 00000000..cc449676 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1.5_sL1/qualification.json @@ -0,0 +1,115 @@ +{ + "case_id": "C02_sky130_sW1.5_sL1", + "circuit_id": "C02", + "pdk": "sky130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.3, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.3, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.3, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.3, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "9003b1a735973f41", + "mirror_pass1": { + "vmin": 0.6541737, + "status": "passed", + "vout_test": 1.23 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.7542 + }, + "_frozen_from": { + "schematic": { + "err": -0.0013375, + "vmin": 0.6541737 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.08 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 15.9, + "schematic_measures": { + "iout_t": 1.997325e-05, + "err": -0.0013375, + "vmin": 0.6541737, + "dev_at_vdd": 0.000315141, + "gout_t": 7.266066e-08, + "rout_t": 13762720.0, + "vout_test": 1.23, + "rout_nom": 13762720.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1.5_sL1/specs.json new file mode 100644 index 00000000..d13c9af8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1.5_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.7542 + }, + "_frozen_from": { + "schematic": { + "err": -0.0013375, + "vmin": 0.6541737 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.08 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1.5_sL1/target.spice new file mode 100644 index 00000000..6009357d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1.5_sL1/target.spice @@ -0,0 +1,6 @@ +.subckt C02_sky130_sW1.5_sL1 VSS IIN1 IOUT1 +XM1 IIN1 IIN1 net6 VSS sky130_fd_pr__nfet_01v8 w=3 l=0.3 nf=6 +XM2 net6 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=3 l=0.3 nf=6 +XM3 IOUT1 IIN1 net12 VSS sky130_fd_pr__nfet_01v8 w=3 l=0.3 nf=6 +XM4 net12 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=3 l=0.3 nf=6 +.ends C02_sky130_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1.5_sL1/target_lvs.spice new file mode 100644 index 00000000..9be272f3 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1.5_sL1/target_lvs.spice @@ -0,0 +1,26 @@ +.subckt C02_sky130_sW1.5_sL1 VSS IIN1 IOUT1 +XM1_f0 IIN1 IIN1 net6 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f1 IIN1 IIN1 net6 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f2 IIN1 IIN1 net6 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f3 IIN1 IIN1 net6 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f4 IIN1 IIN1 net6 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f5 IIN1 IIN1 net6 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f0 net6 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f1 net6 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f2 net6 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f3 net6 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f4 net6 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f5 net6 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f0 IOUT1 IIN1 net12 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f1 IOUT1 IIN1 net12 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f2 IOUT1 IIN1 net12 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f3 IOUT1 IIN1 net12 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f4 IOUT1 IIN1 net12 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f5 IOUT1 IIN1 net12 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f0 net12 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f1 net12 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f2 net12 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f3 net12 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f4 net12 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f5 net12 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +.ends C02_sky130_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1.5_sL1/testbench.spice new file mode 100644 index 00000000..ad4f3343 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1.5_sL1/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IIN1 IOUT1 C02_sky130_sW1.5_sL1 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIIN1 VDDB IIN1 2e-05 +.nodeset v(IIN1)=0.54 + +VOUT IOUT1 0 1.8 +.control +dc VOUT 1.8 0 -0.0045 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=1.23 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.03 cross=last +meas dc dev_at_vdd find dev at=1.791 +let gout = deriv(iout) +meas dc gout_t find gout at=1.23 +let rout_v = 1/gout +meas dc rout_t find rout_v at=1.23 +echo vout_test = 1.23 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1.5_sL2/case.json new file mode 100644 index 00000000..04ef1069 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1.5_sL2/case.json @@ -0,0 +1,141 @@ +{ + "case_id": "C02_sky130_sW1.5_sL2", + "circuit_id": "C02", + "pdk": "sky130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "dut_name": "C02_sky130_sW1.5_sL2", + "ports": [ + "VSS", + "IIN1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 3.0, + "l": 0.6, + "nf": 6 + }, + "M2": { + "w": 3.0, + "l": 0.6, + "nf": 6 + }, + "M3": { + "w": 3.0, + "l": 0.6, + "nf": 6 + }, + "M4": { + "w": 3.0, + "l": 0.6, + "nf": 6 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 1.1700000000000002, + "tol": 0.03, + "vout_test": 1.18 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.6, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.6, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.6, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.6, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "6cb15f7df9a0927a", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1.5_sL2/manifest.json new file mode 100644 index 00000000..cee5a39d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "2bd480b654448a7cbe4de5bbeb6117c853ef1345313f07256f5fbdb81156d7fd", + "qualification.json": "7f468826492c079ef271e610b0feb657f222aa780ed1d3e7f3347e39579de3fa", + "specs.json": "7eae0b324c29a7f7ec7a21f217df9044cb9c21d5106444e0dc4d0b32bfea3751", + "target.spice": "321106be5267ef531930f051778e5d236c487209407afb4be37b5aa748f267f9", + "target_lvs.spice": "39f4b734c49bc50e02977593f8a8803951db6e047c3619d6d2cccac9f2678d85", + "testbench.spice": "c884ecd78f7d7fd00a8d73eb58f6524ee8e73db7aa6c53b1843281647f199d13" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1.5_sL2/qualification.json new file mode 100644 index 00000000..59d9e396 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1.5_sL2/qualification.json @@ -0,0 +1,115 @@ +{ + "case_id": "C02_sky130_sW1.5_sL2", + "circuit_id": "C02", + "pdk": "sky130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.6, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.6, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.6, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.6, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "6cb15f7df9a0927a", + "mirror_pass1": { + "vmin": 0.5589609, + "status": "passed", + "vout_test": 1.18 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.659 + }, + "_frozen_from": { + "schematic": { + "err": -0.000534, + "vmin": 0.5589609 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.08 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 12.5, + "schematic_measures": { + "iout_t": 1.998932e-05, + "err": -0.000534, + "vmin": 0.5589609, + "dev_at_vdd": 4.010322e-05, + "gout_t": 3.407456e-08, + "rout_t": 29348980.0, + "vout_test": 1.18, + "rout_nom": 29348980.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1.5_sL2/specs.json new file mode 100644 index 00000000..5cc06174 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1.5_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.659 + }, + "_frozen_from": { + "schematic": { + "err": -0.000534, + "vmin": 0.5589609 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.08 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1.5_sL2/target.spice new file mode 100644 index 00000000..845cf3cd --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1.5_sL2/target.spice @@ -0,0 +1,6 @@ +.subckt C02_sky130_sW1.5_sL2 VSS IIN1 IOUT1 +XM1 IIN1 IIN1 net6 VSS sky130_fd_pr__nfet_01v8 w=3 l=0.6 nf=6 +XM2 net6 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=3 l=0.6 nf=6 +XM3 IOUT1 IIN1 net12 VSS sky130_fd_pr__nfet_01v8 w=3 l=0.6 nf=6 +XM4 net12 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=3 l=0.6 nf=6 +.ends C02_sky130_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1.5_sL2/target_lvs.spice new file mode 100644 index 00000000..0a8d26c9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1.5_sL2/target_lvs.spice @@ -0,0 +1,26 @@ +.subckt C02_sky130_sW1.5_sL2 VSS IIN1 IOUT1 +XM1_f0 IIN1 IIN1 net6 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f1 IIN1 IIN1 net6 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f2 IIN1 IIN1 net6 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f3 IIN1 IIN1 net6 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f4 IIN1 IIN1 net6 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f5 IIN1 IIN1 net6 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f0 net6 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f1 net6 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f2 net6 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f3 net6 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f4 net6 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f5 net6 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f0 IOUT1 IIN1 net12 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f1 IOUT1 IIN1 net12 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f2 IOUT1 IIN1 net12 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f3 IOUT1 IIN1 net12 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f4 IOUT1 IIN1 net12 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f5 IOUT1 IIN1 net12 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f0 net12 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f1 net12 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f2 net12 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f3 net12 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f4 net12 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f5 net12 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +.ends C02_sky130_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1.5_sL2/testbench.spice new file mode 100644 index 00000000..6b16753b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1.5_sL2/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IIN1 IOUT1 C02_sky130_sW1.5_sL2 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIIN1 VDDB IIN1 2e-05 +.nodeset v(IIN1)=0.54 + +VOUT IOUT1 0 1.8 +.control +dc VOUT 1.8 0 -0.0045 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=1.18 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.03 cross=last +meas dc dev_at_vdd find dev at=1.791 +let gout = deriv(iout) +meas dc gout_t find gout at=1.18 +let rout_v = 1/gout +meas dc rout_t find rout_v at=1.18 +echo vout_test = 1.18 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1_sL1.5/case.json new file mode 100644 index 00000000..268d7e32 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1_sL1.5/case.json @@ -0,0 +1,141 @@ +{ + "case_id": "C02_sky130_sW1_sL1.5", + "circuit_id": "C02", + "pdk": "sky130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "dut_name": "C02_sky130_sW1_sL1.5", + "ports": [ + "VSS", + "IIN1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.45, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 0.45, + "nf": 4 + }, + "M3": { + "w": 2.0, + "l": 0.45, + "nf": 4 + }, + "M4": { + "w": 2.0, + "l": 0.45, + "nf": 4 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 1.1700000000000002, + "tol": 0.03, + "vout_test": 1.22 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "1d181a682fb86f1c", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1_sL1.5/manifest.json new file mode 100644 index 00000000..51de3649 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "68c730a685093cf9d8fb9b2d7dfa7c2498eeb7c7ad0c4b2d071e23fc23f32337", + "qualification.json": "06db73a2d3efa798079a6e24afbdf0447644ebe68ea0547eb72e50172ff5da04", + "specs.json": "84cce310ce66dc34b093b78bed64d4632b119fddaf1194d8ac4f4e4b1962210b", + "target.spice": "6440fa1889cca7ca3ad3926006d5dfab8502ae68c643bdcb6d046f2b488d6eb4", + "target_lvs.spice": "2ef3c6949382ba36ea0ae2f5b427eedd7505a8c7fd27fdcc2cf306f08510e0b4", + "testbench.spice": "133cd3be25dcb66f9f53369ec96791556050eb43cd64009480a07311499ec720" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1_sL1.5/qualification.json new file mode 100644 index 00000000..62bd269a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1_sL1.5/qualification.json @@ -0,0 +1,115 @@ +{ + "case_id": "C02_sky130_sW1_sL1.5", + "circuit_id": "C02", + "pdk": "sky130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "1d181a682fb86f1c", + "mirror_pass1": { + "vmin": 0.636125, + "status": "passed", + "vout_test": 1.22 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.7361 + }, + "_frozen_from": { + "schematic": { + "err": -0.00089, + "vmin": 0.636125 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.08 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 18.9, + "schematic_measures": { + "iout_t": 1.99822e-05, + "err": -0.00089, + "vmin": 0.636125, + "dev_at_vdd": 1.956831e-05, + "gout_t": 5.11016e-08, + "rout_t": 19569280.0, + "vout_test": 1.22, + "rout_nom": 19569280.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1_sL1.5/specs.json new file mode 100644 index 00000000..364e7041 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.7361 + }, + "_frozen_from": { + "schematic": { + "err": -0.00089, + "vmin": 0.636125 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.08 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1_sL1.5/target.spice new file mode 100644 index 00000000..41b95591 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1_sL1.5/target.spice @@ -0,0 +1,6 @@ +.subckt C02_sky130_sW1_sL1.5 VSS IIN1 IOUT1 +XM1 IIN1 IIN1 net6 VSS sky130_fd_pr__nfet_01v8 w=2 l=0.45 nf=4 +XM2 net6 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=2 l=0.45 nf=4 +XM3 IOUT1 IIN1 net12 VSS sky130_fd_pr__nfet_01v8 w=2 l=0.45 nf=4 +XM4 net12 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=2 l=0.45 nf=4 +.ends C02_sky130_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1_sL1.5/target_lvs.spice new file mode 100644 index 00000000..d0f3a772 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1_sL1.5/target_lvs.spice @@ -0,0 +1,18 @@ +.subckt C02_sky130_sW1_sL1.5 VSS IIN1 IOUT1 +XM1_f0 IIN1 IIN1 net6 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f1 IIN1 IIN1 net6 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f2 IIN1 IIN1 net6 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f3 IIN1 IIN1 net6 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f0 net6 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f1 net6 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f2 net6 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f3 net6 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f0 IOUT1 IIN1 net12 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f1 IOUT1 IIN1 net12 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f2 IOUT1 IIN1 net12 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f3 IOUT1 IIN1 net12 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f0 net12 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f1 net12 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f2 net12 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f3 net12 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +.ends C02_sky130_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1_sL1.5/testbench.spice new file mode 100644 index 00000000..ba0cbe71 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1_sL1.5/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IIN1 IOUT1 C02_sky130_sW1_sL1.5 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIIN1 VDDB IIN1 2e-05 +.nodeset v(IIN1)=0.54 + +VOUT IOUT1 0 1.8 +.control +dc VOUT 1.8 0 -0.0045 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=1.22 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.03 cross=last +meas dc dev_at_vdd find dev at=1.791 +let gout = deriv(iout) +meas dc gout_t find gout at=1.22 +let rout_v = 1/gout +meas dc rout_t find rout_v at=1.22 +echo vout_test = 1.22 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1_sL1/case.json new file mode 100644 index 00000000..e47e8390 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1_sL1/case.json @@ -0,0 +1,141 @@ +{ + "case_id": "C02_sky130_sW1_sL1", + "circuit_id": "C02", + "pdk": "sky130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "dut_name": "C02_sky130_sW1_sL1", + "ports": [ + "VSS", + "IIN1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.3, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 0.3, + "nf": 4 + }, + "M3": { + "w": 2.0, + "l": 0.3, + "nf": 4 + }, + "M4": { + "w": 2.0, + "l": 0.3, + "nf": 4 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 1.1700000000000002, + "tol": 0.03, + "vout_test": 1.24 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "8d0db555bdfc9e9d", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1_sL1/manifest.json new file mode 100644 index 00000000..92c63f45 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "21eca61a843f6da027375e94b73ebc62aece0cc4f3c8d4a6e9acd90c5d77263a", + "qualification.json": "7daa0dbb27f7d8a45ff0f0185383ce22b2b701921e883bcc524b20ead9ee96e3", + "specs.json": "7c79c2fa01f66a2947fcd96308007d586148c6cb62d1925cc4f325cf2f780362", + "target.spice": "9a57bd4a0d4149fc8d671091f0da1d5bfbca204042a56d0fdd2a986f73a737d6", + "target_lvs.spice": "3c0b70eb42aa0dec785aaf0723b102810edd68e67155dec6c56f5fa2d7597f7e", + "testbench.spice": "d4e6b4f54ed01d366d6ff5293ab27bd87b566f8c38d1ce1234cb81bd2cea76c4" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1_sL1/qualification.json new file mode 100644 index 00000000..98f6780a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1_sL1/qualification.json @@ -0,0 +1,115 @@ +{ + "case_id": "C02_sky130_sW1_sL1", + "circuit_id": "C02", + "pdk": "sky130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "8d0db555bdfc9e9d", + "mirror_pass1": { + "vmin": 0.6808938, + "status": "passed", + "vout_test": 1.24 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.7809 + }, + "_frozen_from": { + "schematic": { + "err": -0.0014555, + "vmin": 0.6808938 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.08 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 12.5, + "schematic_measures": { + "iout_t": 1.997089e-05, + "err": -0.0014555, + "vmin": 0.6808938, + "dev_at_vdd": 0.0001185779, + "gout_t": 7.478576e-08, + "rout_t": 13371760.0, + "vout_test": 1.24, + "rout_nom": 13371760.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1_sL1/specs.json new file mode 100644 index 00000000..18b0a05c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.7809 + }, + "_frozen_from": { + "schematic": { + "err": -0.0014555, + "vmin": 0.6808938 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.08 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1_sL1/target.spice new file mode 100644 index 00000000..5d0b8489 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1_sL1/target.spice @@ -0,0 +1,6 @@ +.subckt C02_sky130_sW1_sL1 VSS IIN1 IOUT1 +XM1 IIN1 IIN1 net6 VSS sky130_fd_pr__nfet_01v8 w=2 l=0.3 nf=4 +XM2 net6 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=2 l=0.3 nf=4 +XM3 IOUT1 IIN1 net12 VSS sky130_fd_pr__nfet_01v8 w=2 l=0.3 nf=4 +XM4 net12 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=2 l=0.3 nf=4 +.ends C02_sky130_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1_sL1/target_lvs.spice new file mode 100644 index 00000000..8607760e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1_sL1/target_lvs.spice @@ -0,0 +1,18 @@ +.subckt C02_sky130_sW1_sL1 VSS IIN1 IOUT1 +XM1_f0 IIN1 IIN1 net6 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f1 IIN1 IIN1 net6 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f2 IIN1 IIN1 net6 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f3 IIN1 IIN1 net6 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f0 net6 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f1 net6 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f2 net6 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f3 net6 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f0 IOUT1 IIN1 net12 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f1 IOUT1 IIN1 net12 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f2 IOUT1 IIN1 net12 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f3 IOUT1 IIN1 net12 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f0 net12 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f1 net12 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f2 net12 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f3 net12 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +.ends C02_sky130_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1_sL1/testbench.spice new file mode 100644 index 00000000..26ec02b1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1_sL1/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IIN1 IOUT1 C02_sky130_sW1_sL1 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIIN1 VDDB IIN1 2e-05 +.nodeset v(IIN1)=0.54 + +VOUT IOUT1 0 1.8 +.control +dc VOUT 1.8 0 -0.0045 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=1.24 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.03 cross=last +meas dc dev_at_vdd find dev at=1.791 +let gout = deriv(iout) +meas dc gout_t find gout at=1.24 +let rout_v = 1/gout +meas dc rout_t find rout_v at=1.24 +echo vout_test = 1.24 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1_sL2/case.json new file mode 100644 index 00000000..4a079a0d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1_sL2/case.json @@ -0,0 +1,141 @@ +{ + "case_id": "C02_sky130_sW1_sL2", + "circuit_id": "C02", + "pdk": "sky130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "dut_name": "C02_sky130_sW1_sL2", + "ports": [ + "VSS", + "IIN1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.6, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 0.6, + "nf": 4 + }, + "M3": { + "w": 2.0, + "l": 0.6, + "nf": 4 + }, + "M4": { + "w": 2.0, + "l": 0.6, + "nf": 4 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 1.1700000000000002, + "tol": 0.03, + "vout_test": 1.2 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "54c7f706cf7bf208", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1_sL2/manifest.json new file mode 100644 index 00000000..a159ae9a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "60e6c11eddee9215701c25b1f1bb1a362b5554832f139612a609c9fa457b583a", + "qualification.json": "1bc204b636f3d275b5582932b1ef2421fe7ec93ddd96eeaec81c31e0b0dcb5ff", + "specs.json": "492d309685cc51639e1646cfb99fbe4161cdb2fa76656bec407208d812b93905", + "target.spice": "f5b2fbbb440c60a55e2b52c56e9418d5bb2304d024a993c7273c45e6ab2ec00a", + "target_lvs.spice": "f7992c96126837f75af04a78a5eaae18f955de0ee602393078dc6791f631ba52", + "testbench.spice": "5ac7817d26db2da93b8ad28dd95e315e25c1124bb1ea95e81794cafa0c75212b" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1_sL2/qualification.json new file mode 100644 index 00000000..84e506cf --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1_sL2/qualification.json @@ -0,0 +1,115 @@ +{ + "case_id": "C02_sky130_sW1_sL2", + "circuit_id": "C02", + "pdk": "sky130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "54c7f706cf7bf208", + "mirror_pass1": { + "vmin": 0.6025103, + "status": "passed", + "vout_test": 1.2 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.7025 + }, + "_frozen_from": { + "schematic": { + "err": -0.000714, + "vmin": 0.6025103 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.08 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 15.1, + "schematic_measures": { + "iout_t": 1.998572e-05, + "err": -0.000714, + "vmin": 0.6025103, + "dev_at_vdd": 2.352138e-05, + "gout_t": 4.94023e-08, + "rout_t": 20244820.0, + "vout_test": 1.2, + "rout_nom": 20244820.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1_sL2/specs.json new file mode 100644 index 00000000..8e96201d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.7025 + }, + "_frozen_from": { + "schematic": { + "err": -0.000714, + "vmin": 0.6025103 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.08 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1_sL2/target.spice new file mode 100644 index 00000000..1cee17d4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1_sL2/target.spice @@ -0,0 +1,6 @@ +.subckt C02_sky130_sW1_sL2 VSS IIN1 IOUT1 +XM1 IIN1 IIN1 net6 VSS sky130_fd_pr__nfet_01v8 w=2 l=0.6 nf=4 +XM2 net6 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=2 l=0.6 nf=4 +XM3 IOUT1 IIN1 net12 VSS sky130_fd_pr__nfet_01v8 w=2 l=0.6 nf=4 +XM4 net12 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=2 l=0.6 nf=4 +.ends C02_sky130_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1_sL2/target_lvs.spice new file mode 100644 index 00000000..1d22c4e9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1_sL2/target_lvs.spice @@ -0,0 +1,18 @@ +.subckt C02_sky130_sW1_sL2 VSS IIN1 IOUT1 +XM1_f0 IIN1 IIN1 net6 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f1 IIN1 IIN1 net6 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f2 IIN1 IIN1 net6 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f3 IIN1 IIN1 net6 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f0 net6 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f1 net6 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f2 net6 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f3 net6 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f0 IOUT1 IIN1 net12 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f1 IOUT1 IIN1 net12 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f2 IOUT1 IIN1 net12 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f3 IOUT1 IIN1 net12 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f0 net12 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f1 net12 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f2 net12 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f3 net12 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +.ends C02_sky130_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1_sL2/testbench.spice new file mode 100644 index 00000000..c6f59c90 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW1_sL2/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IIN1 IOUT1 C02_sky130_sW1_sL2 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIIN1 VDDB IIN1 2e-05 +.nodeset v(IIN1)=0.54 + +VOUT IOUT1 0 1.8 +.control +dc VOUT 1.8 0 -0.0045 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=1.2 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.03 cross=last +meas dc dev_at_vdd find dev at=1.791 +let gout = deriv(iout) +meas dc gout_t find gout at=1.2 +let rout_v = 1/gout +meas dc rout_t find rout_v at=1.2 +echo vout_test = 1.2 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C02/sky130/sW2_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW2_sL1.5/case.json new file mode 100644 index 00000000..0cff3e48 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW2_sL1.5/case.json @@ -0,0 +1,141 @@ +{ + "case_id": "C02_sky130_sW2_sL1.5", + "circuit_id": "C02", + "pdk": "sky130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "dut_name": "C02_sky130_sW2_sL1.5", + "ports": [ + "VSS", + "IIN1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.45, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 0.45, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 0.45, + "nf": 8 + }, + "M4": { + "w": 4.0, + "l": 0.45, + "nf": 8 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 1.1700000000000002, + "tol": 0.03, + "vout_test": 1.19 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "e4a9c21c3c9a18df", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/sky130/sW2_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW2_sL1.5/manifest.json new file mode 100644 index 00000000..14594729 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW2_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "aff1ffa3091e03978ddd6818b4d842656d393df93402561dc3684a6046bbc4d9", + "qualification.json": "5ae600dd032423cb136a985b75db7acd9c791b2541a43edf1c5f56ae336a3917", + "specs.json": "c43aa261a783a32609ba7a801c6446bb5b90eba8d62ea3de72dcc116b7b52653", + "target.spice": "2a187d5ac360d691ed4b4aaf9ed4123ed96616010f5b28cd8eb018eb9aed2b84", + "target_lvs.spice": "a6e2efa5a7fc42a9d4bc49b9478b641ecaa99a1603f42be6dcf51880a5df4183", + "testbench.spice": "9914822cf717a6930a8e9d3015d92347cba04bd95fc3e04d2d8edfb8fb37ba70" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/sky130/sW2_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW2_sL1.5/qualification.json new file mode 100644 index 00000000..9a0de106 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW2_sL1.5/qualification.json @@ -0,0 +1,115 @@ +{ + "case_id": "C02_sky130_sW2_sL1.5", + "circuit_id": "C02", + "pdk": "sky130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "e4a9c21c3c9a18df", + "mirror_pass1": { + "vmin": 0.5843798, + "status": "passed", + "vout_test": 1.19 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.6844 + }, + "_frozen_from": { + "schematic": { + "err": -0.000684, + "vmin": 0.5843798 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.08 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 12.1, + "schematic_measures": { + "iout_t": 1.998632e-05, + "err": -0.000684, + "vmin": 0.5843798, + "dev_at_vdd": 0.0001858258, + "gout_t": 4.004975e-08, + "rout_t": 24969460.0, + "vout_test": 1.19, + "rout_nom": 24969460.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/sky130/sW2_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW2_sL1.5/specs.json new file mode 100644 index 00000000..a168896a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW2_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.6844 + }, + "_frozen_from": { + "schematic": { + "err": -0.000684, + "vmin": 0.5843798 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.08 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/sky130/sW2_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW2_sL1.5/target.spice new file mode 100644 index 00000000..2d928f9d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW2_sL1.5/target.spice @@ -0,0 +1,6 @@ +.subckt C02_sky130_sW2_sL1.5 VSS IIN1 IOUT1 +XM1 IIN1 IIN1 net6 VSS sky130_fd_pr__nfet_01v8 w=4 l=0.45 nf=8 +XM2 net6 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=4 l=0.45 nf=8 +XM3 IOUT1 IIN1 net12 VSS sky130_fd_pr__nfet_01v8 w=4 l=0.45 nf=8 +XM4 net12 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=4 l=0.45 nf=8 +.ends C02_sky130_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C02/sky130/sW2_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW2_sL1.5/target_lvs.spice new file mode 100644 index 00000000..6d5fa402 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW2_sL1.5/target_lvs.spice @@ -0,0 +1,34 @@ +.subckt C02_sky130_sW2_sL1.5 VSS IIN1 IOUT1 +XM1_f0 IIN1 IIN1 net6 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f1 IIN1 IIN1 net6 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f2 IIN1 IIN1 net6 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f3 IIN1 IIN1 net6 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f4 IIN1 IIN1 net6 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f5 IIN1 IIN1 net6 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f6 IIN1 IIN1 net6 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f7 IIN1 IIN1 net6 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f0 net6 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f1 net6 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f2 net6 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f3 net6 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f4 net6 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f5 net6 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f6 net6 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f7 net6 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f0 IOUT1 IIN1 net12 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f1 IOUT1 IIN1 net12 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f2 IOUT1 IIN1 net12 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f3 IOUT1 IIN1 net12 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f4 IOUT1 IIN1 net12 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f5 IOUT1 IIN1 net12 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f6 IOUT1 IIN1 net12 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f7 IOUT1 IIN1 net12 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f0 net12 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f1 net12 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f2 net12 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f3 net12 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f4 net12 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f5 net12 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f6 net12 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f7 net12 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +.ends C02_sky130_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C02/sky130/sW2_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW2_sL1.5/testbench.spice new file mode 100644 index 00000000..7780e0c7 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW2_sL1.5/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IIN1 IOUT1 C02_sky130_sW2_sL1.5 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIIN1 VDDB IIN1 2e-05 +.nodeset v(IIN1)=0.54 + +VOUT IOUT1 0 1.8 +.control +dc VOUT 1.8 0 -0.0045 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=1.19 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.03 cross=last +meas dc dev_at_vdd find dev at=1.791 +let gout = deriv(iout) +meas dc gout_t find gout at=1.19 +let rout_v = 1/gout +meas dc rout_t find rout_v at=1.19 +echo vout_test = 1.19 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C02/sky130/sW2_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW2_sL1/case.json new file mode 100644 index 00000000..e7ea172c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW2_sL1/case.json @@ -0,0 +1,141 @@ +{ + "case_id": "C02_sky130_sW2_sL1", + "circuit_id": "C02", + "pdk": "sky130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "dut_name": "C02_sky130_sW2_sL1", + "ports": [ + "VSS", + "IIN1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.3, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 0.3, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 0.3, + "nf": 8 + }, + "M4": { + "w": 4.0, + "l": 0.3, + "nf": 8 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 1.1700000000000002, + "tol": 0.03, + "vout_test": 1.22 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "ac888ea0c21e788b", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/sky130/sW2_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW2_sL1/manifest.json new file mode 100644 index 00000000..2fb7f031 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW2_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "354d185028e17389a57781d908002d0ee0b46ccea46ee75b47a1663903a36e74", + "qualification.json": "d557ace24a20824323c3448d32e34cb8adc13945f2799ac52c2d536f3e9b78ff", + "specs.json": "203918f6b1b7a0c5f0dfd93a1da01bebb6453469f2c43e70317ecb83b63bf113", + "target.spice": "ed35a579f5839233df96631dcefb10a415a7391dd37b0cb753e0a68f72d090c9", + "target_lvs.spice": "6740efc0f64728d5910f9919e74b05f5da2a1c0c1baa36a0816b8319dc071c79", + "testbench.spice": "9240da12c2e8d61a981395d185d70bf5e0a0a385c0bc429d84ac364a6682ab7f" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/sky130/sW2_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW2_sL1/qualification.json new file mode 100644 index 00000000..565f1058 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW2_sL1/qualification.json @@ -0,0 +1,115 @@ +{ + "case_id": "C02_sky130_sW2_sL1", + "circuit_id": "C02", + "pdk": "sky130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "ac888ea0c21e788b", + "mirror_pass1": { + "vmin": 0.6378416, + "status": "passed", + "vout_test": 1.22 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.7378 + }, + "_frozen_from": { + "schematic": { + "err": -0.001289, + "vmin": 0.6378416 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.08 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 12.3, + "schematic_measures": { + "iout_t": 1.997422e-05, + "err": -0.001289, + "vmin": 0.6378416, + "dev_at_vdd": 0.0004603069, + "gout_t": 7.354139e-08, + "rout_t": 13597820.0, + "vout_test": 1.22, + "rout_nom": 13597820.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/sky130/sW2_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW2_sL1/specs.json new file mode 100644 index 00000000..ce158580 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW2_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.7378 + }, + "_frozen_from": { + "schematic": { + "err": -0.001289, + "vmin": 0.6378416 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.08 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/sky130/sW2_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW2_sL1/target.spice new file mode 100644 index 00000000..6a2b3417 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW2_sL1/target.spice @@ -0,0 +1,6 @@ +.subckt C02_sky130_sW2_sL1 VSS IIN1 IOUT1 +XM1 IIN1 IIN1 net6 VSS sky130_fd_pr__nfet_01v8 w=4 l=0.3 nf=8 +XM2 net6 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=4 l=0.3 nf=8 +XM3 IOUT1 IIN1 net12 VSS sky130_fd_pr__nfet_01v8 w=4 l=0.3 nf=8 +XM4 net12 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=4 l=0.3 nf=8 +.ends C02_sky130_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C02/sky130/sW2_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW2_sL1/target_lvs.spice new file mode 100644 index 00000000..f5963e6b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW2_sL1/target_lvs.spice @@ -0,0 +1,34 @@ +.subckt C02_sky130_sW2_sL1 VSS IIN1 IOUT1 +XM1_f0 IIN1 IIN1 net6 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f1 IIN1 IIN1 net6 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f2 IIN1 IIN1 net6 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f3 IIN1 IIN1 net6 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f4 IIN1 IIN1 net6 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f5 IIN1 IIN1 net6 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f6 IIN1 IIN1 net6 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f7 IIN1 IIN1 net6 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f0 net6 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f1 net6 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f2 net6 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f3 net6 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f4 net6 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f5 net6 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f6 net6 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f7 net6 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f0 IOUT1 IIN1 net12 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f1 IOUT1 IIN1 net12 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f2 IOUT1 IIN1 net12 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f3 IOUT1 IIN1 net12 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f4 IOUT1 IIN1 net12 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f5 IOUT1 IIN1 net12 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f6 IOUT1 IIN1 net12 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f7 IOUT1 IIN1 net12 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f0 net12 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f1 net12 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f2 net12 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f3 net12 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f4 net12 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f5 net12 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f6 net12 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f7 net12 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +.ends C02_sky130_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C02/sky130/sW2_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW2_sL1/testbench.spice new file mode 100644 index 00000000..419aca46 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW2_sL1/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IIN1 IOUT1 C02_sky130_sW2_sL1 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIIN1 VDDB IIN1 2e-05 +.nodeset v(IIN1)=0.54 + +VOUT IOUT1 0 1.8 +.control +dc VOUT 1.8 0 -0.0045 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=1.22 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.03 cross=last +meas dc dev_at_vdd find dev at=1.791 +let gout = deriv(iout) +meas dc gout_t find gout at=1.22 +let rout_v = 1/gout +meas dc rout_t find rout_v at=1.22 +echo vout_test = 1.22 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C02/sky130/sW2_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW2_sL2/case.json new file mode 100644 index 00000000..865abe18 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW2_sL2/case.json @@ -0,0 +1,141 @@ +{ + "case_id": "C02_sky130_sW2_sL2", + "circuit_id": "C02", + "pdk": "sky130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "dut_name": "C02_sky130_sW2_sL2", + "ports": [ + "VSS", + "IIN1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.6, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 0.6, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 0.6, + "nf": 8 + }, + "M4": { + "w": 4.0, + "l": 0.6, + "nf": 8 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 1.1700000000000002, + "tol": 0.03, + "vout_test": 1.17 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "bf6148deeedeb4f6", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/sky130/sW2_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW2_sL2/manifest.json new file mode 100644 index 00000000..0f8d2e6f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW2_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "1ae1d5e5f3de15149f6c0cd7cf93733c7fd278e2e8437833d1f92860971d2b8c", + "qualification.json": "bec34a1b9dab40fedd011c0aef56b6447f59e6ce3049e33b720317aad249f0b5", + "specs.json": "4711bbab225250fa97884110092619a1432e699237440100f578349676e2db3a", + "target.spice": "332fc7bb0214bc2c145ebca8786cc6b6bf9466c930f0be042575b1b562e9c673", + "target_lvs.spice": "dc563427dab0fc868f6d1ff6234721285cc2f095f29845487770ee1132d9e506", + "testbench.spice": "99e3b320e7691267cb8a69c852fdb0e7dc260b3b6ee5790bb18cb0523cf74c8a" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/sky130/sW2_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW2_sL2/qualification.json new file mode 100644 index 00000000..e26855b6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW2_sL2/qualification.json @@ -0,0 +1,115 @@ +{ + "case_id": "C02_sky130_sW2_sL2", + "circuit_id": "C02", + "pdk": "sky130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "bf6148deeedeb4f6", + "mirror_pass1": { + "vmin": 0.5344892, + "status": "passed", + "vout_test": 1.17 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.6345 + }, + "_frozen_from": { + "schematic": { + "err": -0.0004495, + "vmin": 0.5344892 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.08 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 12.2, + "schematic_measures": { + "iout_t": 1.999101e-05, + "err": -0.0004495, + "vmin": 0.5344892, + "dev_at_vdd": 7.496273e-05, + "gout_t": 2.82494e-08, + "rout_t": 35398980.0, + "vout_test": 1.17, + "rout_nom": 35398980.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/sky130/sW2_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW2_sL2/specs.json new file mode 100644 index 00000000..37daa1af --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW2_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.6345 + }, + "_frozen_from": { + "schematic": { + "err": -0.0004495, + "vmin": 0.5344892 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.08 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C02/sky130/sW2_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW2_sL2/target.spice new file mode 100644 index 00000000..76e49b7e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW2_sL2/target.spice @@ -0,0 +1,6 @@ +.subckt C02_sky130_sW2_sL2 VSS IIN1 IOUT1 +XM1 IIN1 IIN1 net6 VSS sky130_fd_pr__nfet_01v8 w=4 l=0.6 nf=8 +XM2 net6 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=4 l=0.6 nf=8 +XM3 IOUT1 IIN1 net12 VSS sky130_fd_pr__nfet_01v8 w=4 l=0.6 nf=8 +XM4 net12 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=4 l=0.6 nf=8 +.ends C02_sky130_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C02/sky130/sW2_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW2_sL2/target_lvs.spice new file mode 100644 index 00000000..d2b6a075 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW2_sL2/target_lvs.spice @@ -0,0 +1,34 @@ +.subckt C02_sky130_sW2_sL2 VSS IIN1 IOUT1 +XM1_f0 IIN1 IIN1 net6 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f1 IIN1 IIN1 net6 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f2 IIN1 IIN1 net6 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f3 IIN1 IIN1 net6 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f4 IIN1 IIN1 net6 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f5 IIN1 IIN1 net6 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f6 IIN1 IIN1 net6 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f7 IIN1 IIN1 net6 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f0 net6 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f1 net6 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f2 net6 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f3 net6 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f4 net6 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f5 net6 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f6 net6 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f7 net6 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f0 IOUT1 IIN1 net12 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f1 IOUT1 IIN1 net12 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f2 IOUT1 IIN1 net12 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f3 IOUT1 IIN1 net12 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f4 IOUT1 IIN1 net12 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f5 IOUT1 IIN1 net12 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f6 IOUT1 IIN1 net12 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f7 IOUT1 IIN1 net12 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f0 net12 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f1 net12 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f2 net12 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f3 net12 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f4 net12 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f5 net12 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f6 net12 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f7 net12 net6 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +.ends C02_sky130_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C02/sky130/sW2_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW2_sL2/testbench.spice new file mode 100644 index 00000000..f0456405 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C02/sky130/sW2_sL2/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IIN1 IOUT1 C02_sky130_sW2_sL2 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIIN1 VDDB IIN1 2e-05 +.nodeset v(IIN1)=0.54 + +VOUT IOUT1 0 1.8 +.control +dc VOUT 1.8 0 -0.0045 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=1.17 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.03 cross=last +meas dc dev_at_vdd find dev at=1.791 +let gout = deriv(iout) +meas dc gout_t find gout at=1.17 +let rout_v = 1/gout +meas dc rout_t find rout_v at=1.17 +echo vout_test = 1.17 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C03/gf180/sW0.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW0.5_sL1.5/case.json new file mode 100644 index 00000000..f3f6e917 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW0.5_sL1.5/case.json @@ -0,0 +1,123 @@ +{ + "case_id": "C03_gf180_sW0.5_sL1.5", + "circuit_id": "C03", + "pdk": "gf180", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "dut_name": "C03_gf180_sW0.5_sL1.5", + "ports": [ + "VSS", + "IIN1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 3.36, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 3.36, + "nf": 4 + }, + "M3": { + "w": 2.0, + "l": 3.36, + "nf": 4 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 2.145, + "tol": 0.1, + "vout_test": 2.44 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 3.36, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 3.36, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 3.36, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "359bc611df7023da", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/gf180/sW0.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW0.5_sL1.5/manifest.json new file mode 100644 index 00000000..399785e1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW0.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "4ab42df9a818ecaad0389b3632d6790e9a4ba976d1fd8cbc948ab8cdfdf33b1f", + "qualification.json": "1276de1b767c3e5287ed63c925bb4b7b132ce67575d1181d80bb7f4939e05413", + "specs.json": "92c2075c29bc69970b866aaf5f2d083ceb787ea6257d106186dae5a7f7e98497", + "target.spice": "41672492b430818f1421206490f4d24f2eba0903ae98fcafa2d108ed8004efea", + "target_lvs.spice": "b0c596def096760f4142ee455c83155fbb707e400fcead79b0d4ff5a8eef395c", + "testbench.spice": "ea5309404c708a86c93d430bcbd340681b30fd3a6191de724810ed8af4ad8236" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/gf180/sW0.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW0.5_sL1.5/qualification.json new file mode 100644 index 00000000..6f434fc5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW0.5_sL1.5/qualification.json @@ -0,0 +1,103 @@ +{ + "case_id": "C03_gf180_sW0.5_sL1.5", + "circuit_id": "C03", + "pdk": "gf180", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 3.36, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 3.36, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 3.36, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "359bc611df7023da", + "mirror_pass1": { + "vmin": 1.583426, + "status": "passed", + "vout_test": 2.44 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 1.683 + }, + "_frozen_from": { + "schematic": { + "err": -0.0168415, + "vmin": 1.583426 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 2.145 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.2, + "schematic_measures": { + "iout_t": 1.966317e-05, + "err": -0.0168415, + "vmin": 1.583426, + "dev_at_vdd": 0.01676485, + "gout_t": 3.215138e-09, + "rout_t": 311059700.0, + "vout_test": 2.44, + "rout_nom": 311059700.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/gf180/sW0.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW0.5_sL1.5/specs.json new file mode 100644 index 00000000..abc87996 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW0.5_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 1.683 + }, + "_frozen_from": { + "schematic": { + "err": -0.0168415, + "vmin": 1.583426 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 2.145 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/gf180/sW0.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW0.5_sL1.5/target.spice new file mode 100644 index 00000000..4942d8bf --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW0.5_sL1.5/target.spice @@ -0,0 +1,5 @@ +.subckt C03_gf180_sW0.5_sL1.5 VSS IIN1 IOUT1 +MM1 IIN1 Y VSS VSS nfet_03v3 w=2u l=3.36u nf=4 m=1 +MM2 Y Y VSS VSS nfet_03v3 w=2u l=3.36u nf=4 m=1 +MM3 IOUT1 IIN1 Y VSS nfet_03v3 w=2u l=3.36u nf=4 m=1 +.ends C03_gf180_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C03/gf180/sW0.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW0.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..bc642dba --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW0.5_sL1.5/target_lvs.spice @@ -0,0 +1,14 @@ +.subckt C03_gf180_sW0.5_sL1.5 VSS IIN1 IOUT1 +MM1_f0 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=3.36u +MM1_f1 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=3.36u +MM1_f2 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=3.36u +MM1_f3 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=3.36u +MM2_f0 Y Y VSS VSS nfet_03v3 w=0.5u l=3.36u +MM2_f1 Y Y VSS VSS nfet_03v3 w=0.5u l=3.36u +MM2_f2 Y Y VSS VSS nfet_03v3 w=0.5u l=3.36u +MM2_f3 Y Y VSS VSS nfet_03v3 w=0.5u l=3.36u +MM3_f0 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=3.36u +MM3_f1 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=3.36u +MM3_f2 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=3.36u +MM3_f3 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=3.36u +.ends C03_gf180_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C03/gf180/sW0.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW0.5_sL1.5/testbench.spice new file mode 100644 index 00000000..b9bca968 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW0.5_sL1.5/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IIN1 IOUT1 C03_gf180_sW0.5_sL1.5 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIIN1 VDDB IIN1 2e-05 +.nodeset v(IIN1)=0.99 + +VOUT IOUT1 0 3.3 +.control +dc VOUT 3.3 0 -0.00825 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=2.44 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.1 cross=last +meas dc dev_at_vdd find dev at=3.2835 +let gout = deriv(iout) +meas dc gout_t find gout at=2.44 +let rout_v = 1/gout +meas dc rout_t find rout_v at=2.44 +echo vout_test = 2.44 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C03/gf180/sW0.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW0.5_sL1/case.json new file mode 100644 index 00000000..9265e9e9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW0.5_sL1/case.json @@ -0,0 +1,123 @@ +{ + "case_id": "C03_gf180_sW0.5_sL1", + "circuit_id": "C03", + "pdk": "gf180", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "dut_name": "C03_gf180_sW0.5_sL1", + "ports": [ + "VSS", + "IIN1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 2.24, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 2.24, + "nf": 4 + }, + "M3": { + "w": 2.0, + "l": 2.24, + "nf": 4 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 2.145, + "tol": 0.1, + "vout_test": 2.34 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 2.24, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 2.24, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 2.24, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "04496cb3cbee2fda", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/gf180/sW0.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW0.5_sL1/manifest.json new file mode 100644 index 00000000..8d005573 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW0.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "757cd40f1bcae290d4ed87073f425db9b4a9b7bf45c6762fb0442f1454470811", + "qualification.json": "9ef24280ca2d09437660cd8b3d4129b889496744e97f1856472a2a889783abd6", + "specs.json": "113e203050eec6e1d2de8a943067221fcff4d1e967777a861627ca1be2611a42", + "target.spice": "9594254898ac52b68e5c714d5922b05b5640dcaba6008a82ff0e570f4a241e24", + "target_lvs.spice": "9a62bd92635c77b66a994bf042cb1b87c328361555c019f38118a2ffce0244df", + "testbench.spice": "aa82a2892981a9188db77a4884da7344fd46f75401a05d57e537958b1c24105a" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/gf180/sW0.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW0.5_sL1/qualification.json new file mode 100644 index 00000000..d88b104e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW0.5_sL1/qualification.json @@ -0,0 +1,103 @@ +{ + "case_id": "C03_gf180_sW0.5_sL1", + "circuit_id": "C03", + "pdk": "gf180", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 2.24, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 2.24, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 2.24, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "04496cb3cbee2fda", + "mirror_pass1": { + "vmin": 1.377771, + "status": "passed", + "vout_test": 2.34 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 1.478 + }, + "_frozen_from": { + "schematic": { + "err": -0.016521, + "vmin": 1.377771 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 2.145 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "iout_t": 1.966958e-05, + "err": -0.016521, + "vmin": 1.377771, + "dev_at_vdd": 0.01645253, + "gout_t": 2.02782e-09, + "rout_t": 493158800.0, + "vout_test": 2.34, + "rout_nom": 493158800.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/gf180/sW0.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW0.5_sL1/specs.json new file mode 100644 index 00000000..7a3a8665 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW0.5_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 1.478 + }, + "_frozen_from": { + "schematic": { + "err": -0.016521, + "vmin": 1.377771 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 2.145 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/gf180/sW0.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW0.5_sL1/target.spice new file mode 100644 index 00000000..f40ed246 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW0.5_sL1/target.spice @@ -0,0 +1,5 @@ +.subckt C03_gf180_sW0.5_sL1 VSS IIN1 IOUT1 +MM1 IIN1 Y VSS VSS nfet_03v3 w=2u l=2.24u nf=4 m=1 +MM2 Y Y VSS VSS nfet_03v3 w=2u l=2.24u nf=4 m=1 +MM3 IOUT1 IIN1 Y VSS nfet_03v3 w=2u l=2.24u nf=4 m=1 +.ends C03_gf180_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C03/gf180/sW0.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW0.5_sL1/target_lvs.spice new file mode 100644 index 00000000..eacabb97 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW0.5_sL1/target_lvs.spice @@ -0,0 +1,14 @@ +.subckt C03_gf180_sW0.5_sL1 VSS IIN1 IOUT1 +MM1_f0 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=2.24u +MM1_f1 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=2.24u +MM1_f2 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=2.24u +MM1_f3 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=2.24u +MM2_f0 Y Y VSS VSS nfet_03v3 w=0.5u l=2.24u +MM2_f1 Y Y VSS VSS nfet_03v3 w=0.5u l=2.24u +MM2_f2 Y Y VSS VSS nfet_03v3 w=0.5u l=2.24u +MM2_f3 Y Y VSS VSS nfet_03v3 w=0.5u l=2.24u +MM3_f0 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=2.24u +MM3_f1 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=2.24u +MM3_f2 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=2.24u +MM3_f3 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=2.24u +.ends C03_gf180_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C03/gf180/sW0.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW0.5_sL1/testbench.spice new file mode 100644 index 00000000..d33d16df --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW0.5_sL1/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IIN1 IOUT1 C03_gf180_sW0.5_sL1 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIIN1 VDDB IIN1 2e-05 +.nodeset v(IIN1)=0.99 + +VOUT IOUT1 0 3.3 +.control +dc VOUT 3.3 0 -0.00825 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=2.34 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.1 cross=last +meas dc dev_at_vdd find dev at=3.2835 +let gout = deriv(iout) +meas dc gout_t find gout at=2.34 +let rout_v = 1/gout +meas dc rout_t find rout_v at=2.34 +echo vout_test = 2.34 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C03/gf180/sW0.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW0.5_sL2/case.json new file mode 100644 index 00000000..a677e4a2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW0.5_sL2/case.json @@ -0,0 +1,123 @@ +{ + "case_id": "C03_gf180_sW0.5_sL2", + "circuit_id": "C03", + "pdk": "gf180", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "dut_name": "C03_gf180_sW0.5_sL2", + "ports": [ + "VSS", + "IIN1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 4.48, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 4.48, + "nf": 4 + }, + "M3": { + "w": 2.0, + "l": 4.48, + "nf": 4 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 2.145, + "tol": 0.1, + "vout_test": 2.53 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 4.48, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 4.48, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 4.48, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "b921441dd9cb5765", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/gf180/sW0.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW0.5_sL2/manifest.json new file mode 100644 index 00000000..41eb1be9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW0.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "71b76c868bf67da08cadf4a53e5ae9828689b9a86a8ca532e4a4d680558c6254", + "qualification.json": "8f67548074d054e2ac85944aa54a9b4469c6ac97e999a28870b2e3952d2fc831", + "specs.json": "04ea46964e76df33f6e39136a7b315761d04aa8e7390a479c7f8fb2b4f268403", + "target.spice": "cef8c2b88b61a284bbe3aeb9ecaccdfe8eaa2e876b73b99ddce0cc360039c7d6", + "target_lvs.spice": "9d8174f959c35878a2ee4707f12bcb6c36c8d3e3129607bf3bc6207d1301609d", + "testbench.spice": "92a0369d17b81d5886af67cdb62458ae1339273e793395b3101f78310447e74b" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/gf180/sW0.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW0.5_sL2/qualification.json new file mode 100644 index 00000000..117b35fc --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW0.5_sL2/qualification.json @@ -0,0 +1,103 @@ +{ + "case_id": "C03_gf180_sW0.5_sL2", + "circuit_id": "C03", + "pdk": "gf180", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 4.48, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 4.48, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 4.48, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "b921441dd9cb5765", + "mirror_pass1": { + "vmin": 1.765737, + "status": "passed", + "vout_test": 2.53 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 1.866 + }, + "_frozen_from": { + "schematic": { + "err": -0.0192845, + "vmin": 1.765737 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 2.145 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.2, + "schematic_measures": { + "iout_t": 1.961431e-05, + "err": -0.0192845, + "vmin": 1.765737, + "dev_at_vdd": 0.01918324, + "gout_t": 6.618019e-09, + "rout_t": 151192900.0, + "vout_test": 2.53, + "rout_nom": 151192900.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/gf180/sW0.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW0.5_sL2/specs.json new file mode 100644 index 00000000..d40ab3f2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW0.5_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 1.866 + }, + "_frozen_from": { + "schematic": { + "err": -0.0192845, + "vmin": 1.765737 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 2.145 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/gf180/sW0.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW0.5_sL2/target.spice new file mode 100644 index 00000000..a8c4cf75 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW0.5_sL2/target.spice @@ -0,0 +1,5 @@ +.subckt C03_gf180_sW0.5_sL2 VSS IIN1 IOUT1 +MM1 IIN1 Y VSS VSS nfet_03v3 w=2u l=4.48u nf=4 m=1 +MM2 Y Y VSS VSS nfet_03v3 w=2u l=4.48u nf=4 m=1 +MM3 IOUT1 IIN1 Y VSS nfet_03v3 w=2u l=4.48u nf=4 m=1 +.ends C03_gf180_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C03/gf180/sW0.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW0.5_sL2/target_lvs.spice new file mode 100644 index 00000000..2bfa31d4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW0.5_sL2/target_lvs.spice @@ -0,0 +1,14 @@ +.subckt C03_gf180_sW0.5_sL2 VSS IIN1 IOUT1 +MM1_f0 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=4.48u +MM1_f1 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=4.48u +MM1_f2 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=4.48u +MM1_f3 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=4.48u +MM2_f0 Y Y VSS VSS nfet_03v3 w=0.5u l=4.48u +MM2_f1 Y Y VSS VSS nfet_03v3 w=0.5u l=4.48u +MM2_f2 Y Y VSS VSS nfet_03v3 w=0.5u l=4.48u +MM2_f3 Y Y VSS VSS nfet_03v3 w=0.5u l=4.48u +MM3_f0 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=4.48u +MM3_f1 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=4.48u +MM3_f2 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=4.48u +MM3_f3 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=4.48u +.ends C03_gf180_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C03/gf180/sW0.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW0.5_sL2/testbench.spice new file mode 100644 index 00000000..e7c6d09e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW0.5_sL2/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IIN1 IOUT1 C03_gf180_sW0.5_sL2 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIIN1 VDDB IIN1 2e-05 +.nodeset v(IIN1)=0.99 + +VOUT IOUT1 0 3.3 +.control +dc VOUT 3.3 0 -0.00825 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=2.53 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.1 cross=last +meas dc dev_at_vdd find dev at=3.2835 +let gout = deriv(iout) +meas dc gout_t find gout at=2.53 +let rout_v = 1/gout +meas dc rout_t find rout_v at=2.53 +echo vout_test = 2.53 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1.5_sL1.5/case.json new file mode 100644 index 00000000..cf401a5d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1.5_sL1.5/case.json @@ -0,0 +1,123 @@ +{ + "case_id": "C03_gf180_sW1.5_sL1.5", + "circuit_id": "C03", + "pdk": "gf180", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "dut_name": "C03_gf180_sW1.5_sL1.5", + "ports": [ + "VSS", + "IIN1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 6.0, + "l": 3.36, + "nf": 12 + }, + "M2": { + "w": 6.0, + "l": 3.36, + "nf": 12 + }, + "M3": { + "w": 6.0, + "l": 3.36, + "nf": 12 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 2.145, + "tol": 0.1, + "vout_test": 2.21 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 3.36, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 3.36, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 3.36, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "3a06adf7af4eb057", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1.5_sL1.5/manifest.json new file mode 100644 index 00000000..b34d24df --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "e9c95d353d67018112f40d723b5169c1a5cffbc472927a2bd1cec044d2829c51", + "qualification.json": "20f0530b5bc28d4e0bec190d6df35081f5fb155c5e57175d90251db80ef8d300", + "specs.json": "4b51f2a936e53a52faeddbe7c541ab58a86535ffbe65ab48b5fddddb11aa304c", + "target.spice": "94dd5e0210dfec87cc28d2dfcb596aa900aecdc6c32493e655c7b52aed634a02", + "target_lvs.spice": "78044508310566cc655b2a4f3ab2511cc0e844af782b2c6e0672d555a9585974", + "testbench.spice": "cc89ca0d94f64b40c5f12af61b83fb55c06c89921043748334c5a59356d93d7f" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1.5_sL1.5/qualification.json new file mode 100644 index 00000000..f9d30505 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1.5_sL1.5/qualification.json @@ -0,0 +1,103 @@ +{ + "case_id": "C03_gf180_sW1.5_sL1.5", + "circuit_id": "C03", + "pdk": "gf180", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 3.36, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 3.36, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 3.36, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "3a06adf7af4eb057", + "mirror_pass1": { + "vmin": 1.12544, + "status": "passed", + "vout_test": 2.21 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 1.225 + }, + "_frozen_from": { + "schematic": { + "err": -0.010751, + "vmin": 1.12544 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 2.145 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.3, + "schematic_measures": { + "iout_t": 1.978498e-05, + "err": -0.010751, + "vmin": 1.12544, + "dev_at_vdd": 0.01065515, + "gout_t": 3.989691e-10, + "rout_t": 2506469000.0, + "vout_test": 2.21, + "rout_nom": 2506469000.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1.5_sL1.5/specs.json new file mode 100644 index 00000000..80b06e15 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1.5_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 1.225 + }, + "_frozen_from": { + "schematic": { + "err": -0.010751, + "vmin": 1.12544 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 2.145 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1.5_sL1.5/target.spice new file mode 100644 index 00000000..0cfaa7a0 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1.5_sL1.5/target.spice @@ -0,0 +1,5 @@ +.subckt C03_gf180_sW1.5_sL1.5 VSS IIN1 IOUT1 +MM1 IIN1 Y VSS VSS nfet_03v3 w=6u l=3.36u nf=12 m=1 +MM2 Y Y VSS VSS nfet_03v3 w=6u l=3.36u nf=12 m=1 +MM3 IOUT1 IIN1 Y VSS nfet_03v3 w=6u l=3.36u nf=12 m=1 +.ends C03_gf180_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..883480db --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1.5_sL1.5/target_lvs.spice @@ -0,0 +1,38 @@ +.subckt C03_gf180_sW1.5_sL1.5 VSS IIN1 IOUT1 +MM1_f0 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=3.36u +MM1_f1 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=3.36u +MM1_f2 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=3.36u +MM1_f3 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=3.36u +MM1_f4 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=3.36u +MM1_f5 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=3.36u +MM1_f6 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=3.36u +MM1_f7 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=3.36u +MM1_f8 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=3.36u +MM1_f9 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=3.36u +MM1_f10 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=3.36u +MM1_f11 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=3.36u +MM2_f0 Y Y VSS VSS nfet_03v3 w=0.5u l=3.36u +MM2_f1 Y Y VSS VSS nfet_03v3 w=0.5u l=3.36u +MM2_f2 Y Y VSS VSS nfet_03v3 w=0.5u l=3.36u +MM2_f3 Y Y VSS VSS nfet_03v3 w=0.5u l=3.36u +MM2_f4 Y Y VSS VSS nfet_03v3 w=0.5u l=3.36u +MM2_f5 Y Y VSS VSS nfet_03v3 w=0.5u l=3.36u +MM2_f6 Y Y VSS VSS nfet_03v3 w=0.5u l=3.36u +MM2_f7 Y Y VSS VSS nfet_03v3 w=0.5u l=3.36u +MM2_f8 Y Y VSS VSS nfet_03v3 w=0.5u l=3.36u +MM2_f9 Y Y VSS VSS nfet_03v3 w=0.5u l=3.36u +MM2_f10 Y Y VSS VSS nfet_03v3 w=0.5u l=3.36u +MM2_f11 Y Y VSS VSS nfet_03v3 w=0.5u l=3.36u +MM3_f0 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=3.36u +MM3_f1 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=3.36u +MM3_f2 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=3.36u +MM3_f3 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=3.36u +MM3_f4 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=3.36u +MM3_f5 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=3.36u +MM3_f6 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=3.36u +MM3_f7 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=3.36u +MM3_f8 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=3.36u +MM3_f9 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=3.36u +MM3_f10 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=3.36u +MM3_f11 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=3.36u +.ends C03_gf180_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1.5_sL1.5/testbench.spice new file mode 100644 index 00000000..ea13c594 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1.5_sL1.5/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IIN1 IOUT1 C03_gf180_sW1.5_sL1.5 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIIN1 VDDB IIN1 2e-05 +.nodeset v(IIN1)=0.99 + +VOUT IOUT1 0 3.3 +.control +dc VOUT 3.3 0 -0.00825 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=2.21 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.1 cross=last +meas dc dev_at_vdd find dev at=3.2835 +let gout = deriv(iout) +meas dc gout_t find gout at=2.21 +let rout_v = 1/gout +meas dc rout_t find rout_v at=2.21 +echo vout_test = 2.21 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1.5_sL1/case.json new file mode 100644 index 00000000..b61b94c0 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1.5_sL1/case.json @@ -0,0 +1,123 @@ +{ + "case_id": "C03_gf180_sW1.5_sL1", + "circuit_id": "C03", + "pdk": "gf180", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "dut_name": "C03_gf180_sW1.5_sL1", + "ports": [ + "VSS", + "IIN1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 6.0, + "l": 2.24, + "nf": 12 + }, + "M2": { + "w": 6.0, + "l": 2.24, + "nf": 12 + }, + "M3": { + "w": 6.0, + "l": 2.24, + "nf": 12 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 2.145, + "tol": 0.1, + "vout_test": 2.16 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 2.24, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 2.24, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 2.24, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "9b3c48dde945aae0", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1.5_sL1/manifest.json new file mode 100644 index 00000000..a6c9760f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "9e2f79a1595d5d8b99542a5079d20b1a56ba1ce756afe7789e0de11ff2140e45", + "qualification.json": "685d4e592bcf464d751c332a3ab7e3d4cada046ba9734e249f6bd4746662b11c", + "specs.json": "4fe999c67f3411b0ab11c64926941a356ecc1a1762fed8f087031e7f28fa568d", + "target.spice": "fd0f377f23c60385824e5187ca40fa2c20e30ba42b9a19ad92f285f75d0c1712", + "target_lvs.spice": "70deea4cffdeb1b8ea7168ff35744d7b2918b868e1deed072952ef9bd57ee890", + "testbench.spice": "9747a09dea190401ca2606bbaf1f4f91651387e0aab0b3b0e8a67d73c7fa64ab" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1.5_sL1/qualification.json new file mode 100644 index 00000000..6dd5cc3b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1.5_sL1/qualification.json @@ -0,0 +1,103 @@ +{ + "case_id": "C03_gf180_sW1.5_sL1", + "circuit_id": "C03", + "pdk": "gf180", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 2.24, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 2.24, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 2.24, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "9b3c48dde945aae0", + "mirror_pass1": { + "vmin": 1.024915, + "status": "passed", + "vout_test": 2.16 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 1.125 + }, + "_frozen_from": { + "schematic": { + "err": -0.0146025, + "vmin": 1.024915 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 2.145 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.3, + "schematic_measures": { + "iout_t": 1.970795e-05, + "err": -0.0146025, + "vmin": 1.024915, + "dev_at_vdd": 0.01422239, + "gout_t": 5.411942e-10, + "rout_t": 1847772000.0, + "vout_test": 2.16, + "rout_nom": 1847772000.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1.5_sL1/specs.json new file mode 100644 index 00000000..005ae269 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1.5_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 1.125 + }, + "_frozen_from": { + "schematic": { + "err": -0.0146025, + "vmin": 1.024915 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 2.145 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1.5_sL1/target.spice new file mode 100644 index 00000000..188aa8de --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1.5_sL1/target.spice @@ -0,0 +1,5 @@ +.subckt C03_gf180_sW1.5_sL1 VSS IIN1 IOUT1 +MM1 IIN1 Y VSS VSS nfet_03v3 w=6u l=2.24u nf=12 m=1 +MM2 Y Y VSS VSS nfet_03v3 w=6u l=2.24u nf=12 m=1 +MM3 IOUT1 IIN1 Y VSS nfet_03v3 w=6u l=2.24u nf=12 m=1 +.ends C03_gf180_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1.5_sL1/target_lvs.spice new file mode 100644 index 00000000..237fcf3d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1.5_sL1/target_lvs.spice @@ -0,0 +1,38 @@ +.subckt C03_gf180_sW1.5_sL1 VSS IIN1 IOUT1 +MM1_f0 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=2.24u +MM1_f1 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=2.24u +MM1_f2 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=2.24u +MM1_f3 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=2.24u +MM1_f4 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=2.24u +MM1_f5 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=2.24u +MM1_f6 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=2.24u +MM1_f7 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=2.24u +MM1_f8 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=2.24u +MM1_f9 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=2.24u +MM1_f10 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=2.24u +MM1_f11 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=2.24u +MM2_f0 Y Y VSS VSS nfet_03v3 w=0.5u l=2.24u +MM2_f1 Y Y VSS VSS nfet_03v3 w=0.5u l=2.24u +MM2_f2 Y Y VSS VSS nfet_03v3 w=0.5u l=2.24u +MM2_f3 Y Y VSS VSS nfet_03v3 w=0.5u l=2.24u +MM2_f4 Y Y VSS VSS nfet_03v3 w=0.5u l=2.24u +MM2_f5 Y Y VSS VSS nfet_03v3 w=0.5u l=2.24u +MM2_f6 Y Y VSS VSS nfet_03v3 w=0.5u l=2.24u +MM2_f7 Y Y VSS VSS nfet_03v3 w=0.5u l=2.24u +MM2_f8 Y Y VSS VSS nfet_03v3 w=0.5u l=2.24u +MM2_f9 Y Y VSS VSS nfet_03v3 w=0.5u l=2.24u +MM2_f10 Y Y VSS VSS nfet_03v3 w=0.5u l=2.24u +MM2_f11 Y Y VSS VSS nfet_03v3 w=0.5u l=2.24u +MM3_f0 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=2.24u +MM3_f1 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=2.24u +MM3_f2 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=2.24u +MM3_f3 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=2.24u +MM3_f4 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=2.24u +MM3_f5 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=2.24u +MM3_f6 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=2.24u +MM3_f7 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=2.24u +MM3_f8 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=2.24u +MM3_f9 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=2.24u +MM3_f10 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=2.24u +MM3_f11 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=2.24u +.ends C03_gf180_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1.5_sL1/testbench.spice new file mode 100644 index 00000000..e48b08c6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1.5_sL1/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IIN1 IOUT1 C03_gf180_sW1.5_sL1 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIIN1 VDDB IIN1 2e-05 +.nodeset v(IIN1)=0.99 + +VOUT IOUT1 0 3.3 +.control +dc VOUT 3.3 0 -0.00825 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=2.16 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.1 cross=last +meas dc dev_at_vdd find dev at=3.2835 +let gout = deriv(iout) +meas dc gout_t find gout at=2.16 +let rout_v = 1/gout +meas dc rout_t find rout_v at=2.16 +echo vout_test = 2.16 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1.5_sL2/case.json new file mode 100644 index 00000000..c9b8c263 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1.5_sL2/case.json @@ -0,0 +1,123 @@ +{ + "case_id": "C03_gf180_sW1.5_sL2", + "circuit_id": "C03", + "pdk": "gf180", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "dut_name": "C03_gf180_sW1.5_sL2", + "ports": [ + "VSS", + "IIN1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 6.0, + "l": 4.48, + "nf": 12 + }, + "M2": { + "w": 6.0, + "l": 4.48, + "nf": 12 + }, + "M3": { + "w": 6.0, + "l": 4.48, + "nf": 12 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 2.145, + "tol": 0.1, + "vout_test": 2.26 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 4.48, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 4.48, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 4.48, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "99ab7f4263734970", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1.5_sL2/manifest.json new file mode 100644 index 00000000..ccf7c702 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "eced635e5d7d00dfd2291a8ff88abc0222c17ffcf15a967f36b50917cb804b1e", + "qualification.json": "eae74c12d673ecf49cf1add9b218e08ea384358efb973101d2ee1fe4562fc39f", + "specs.json": "77d1c465d69907c357636eff8dcf77e5b200114aacd7d5ac0f81ca9a69af78c5", + "target.spice": "c366a19772af2ed5657e6b9df41e468c648f7fa42ff52bc687ced93f48716882", + "target_lvs.spice": "ee2ba13e74ee6b5ab463b204cd69bd982297004845aa816f037d12b14e3fae57", + "testbench.spice": "daf853458131eefb2472481694dfc707dd636e3ff43a1111c63b4fad02fb2c4b" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1.5_sL2/qualification.json new file mode 100644 index 00000000..50a7110c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1.5_sL2/qualification.json @@ -0,0 +1,103 @@ +{ + "case_id": "C03_gf180_sW1.5_sL2", + "circuit_id": "C03", + "pdk": "gf180", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 4.48, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 4.48, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 4.48, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "99ab7f4263734970", + "mirror_pass1": { + "vmin": 1.212092, + "status": "passed", + "vout_test": 2.26 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 1.312 + }, + "_frozen_from": { + "schematic": { + "err": -0.009085, + "vmin": 1.212092 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 2.145 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.2, + "schematic_measures": { + "iout_t": 1.98183e-05, + "err": -0.009085, + "vmin": 1.212092, + "dev_at_vdd": 0.009051847, + "gout_t": 3.619841e-10, + "rout_t": 2762560000.0, + "vout_test": 2.26, + "rout_nom": 2762560000.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1.5_sL2/specs.json new file mode 100644 index 00000000..cf67837f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1.5_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 1.312 + }, + "_frozen_from": { + "schematic": { + "err": -0.009085, + "vmin": 1.212092 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 2.145 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1.5_sL2/target.spice new file mode 100644 index 00000000..8f389d14 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1.5_sL2/target.spice @@ -0,0 +1,5 @@ +.subckt C03_gf180_sW1.5_sL2 VSS IIN1 IOUT1 +MM1 IIN1 Y VSS VSS nfet_03v3 w=6u l=4.48u nf=12 m=1 +MM2 Y Y VSS VSS nfet_03v3 w=6u l=4.48u nf=12 m=1 +MM3 IOUT1 IIN1 Y VSS nfet_03v3 w=6u l=4.48u nf=12 m=1 +.ends C03_gf180_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1.5_sL2/target_lvs.spice new file mode 100644 index 00000000..7ba4e683 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1.5_sL2/target_lvs.spice @@ -0,0 +1,38 @@ +.subckt C03_gf180_sW1.5_sL2 VSS IIN1 IOUT1 +MM1_f0 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=4.48u +MM1_f1 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=4.48u +MM1_f2 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=4.48u +MM1_f3 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=4.48u +MM1_f4 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=4.48u +MM1_f5 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=4.48u +MM1_f6 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=4.48u +MM1_f7 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=4.48u +MM1_f8 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=4.48u +MM1_f9 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=4.48u +MM1_f10 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=4.48u +MM1_f11 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=4.48u +MM2_f0 Y Y VSS VSS nfet_03v3 w=0.5u l=4.48u +MM2_f1 Y Y VSS VSS nfet_03v3 w=0.5u l=4.48u +MM2_f2 Y Y VSS VSS nfet_03v3 w=0.5u l=4.48u +MM2_f3 Y Y VSS VSS nfet_03v3 w=0.5u l=4.48u +MM2_f4 Y Y VSS VSS nfet_03v3 w=0.5u l=4.48u +MM2_f5 Y Y VSS VSS nfet_03v3 w=0.5u l=4.48u +MM2_f6 Y Y VSS VSS nfet_03v3 w=0.5u l=4.48u +MM2_f7 Y Y VSS VSS nfet_03v3 w=0.5u l=4.48u +MM2_f8 Y Y VSS VSS nfet_03v3 w=0.5u l=4.48u +MM2_f9 Y Y VSS VSS nfet_03v3 w=0.5u l=4.48u +MM2_f10 Y Y VSS VSS nfet_03v3 w=0.5u l=4.48u +MM2_f11 Y Y VSS VSS nfet_03v3 w=0.5u l=4.48u +MM3_f0 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=4.48u +MM3_f1 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=4.48u +MM3_f2 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=4.48u +MM3_f3 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=4.48u +MM3_f4 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=4.48u +MM3_f5 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=4.48u +MM3_f6 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=4.48u +MM3_f7 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=4.48u +MM3_f8 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=4.48u +MM3_f9 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=4.48u +MM3_f10 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=4.48u +MM3_f11 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=4.48u +.ends C03_gf180_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1.5_sL2/testbench.spice new file mode 100644 index 00000000..e2190f6f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1.5_sL2/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IIN1 IOUT1 C03_gf180_sW1.5_sL2 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIIN1 VDDB IIN1 2e-05 +.nodeset v(IIN1)=0.99 + +VOUT IOUT1 0 3.3 +.control +dc VOUT 3.3 0 -0.00825 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=2.26 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.1 cross=last +meas dc dev_at_vdd find dev at=3.2835 +let gout = deriv(iout) +meas dc gout_t find gout at=2.26 +let rout_v = 1/gout +meas dc rout_t find rout_v at=2.26 +echo vout_test = 2.26 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1_sL1.5/case.json new file mode 100644 index 00000000..288be3b8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1_sL1.5/case.json @@ -0,0 +1,123 @@ +{ + "case_id": "C03_gf180_sW1_sL1.5", + "circuit_id": "C03", + "pdk": "gf180", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "dut_name": "C03_gf180_sW1_sL1.5", + "ports": [ + "VSS", + "IIN1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 3.36, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 3.36, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 3.36, + "nf": 8 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 2.145, + "tol": 0.1, + "vout_test": 2.28 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 3.36, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 3.36, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 3.36, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "0d3aea99f2a4424c", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1_sL1.5/manifest.json new file mode 100644 index 00000000..27a37f46 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "98773f275b5163df978688c9bf1fe9d4754df832ee0e8d15dd879fcfbd00a775", + "qualification.json": "5c768727f264545e9442f0e8693823af77ab41ef5b308353e1f5edadf5f60e7a", + "specs.json": "77b9bb0a2c375c26f8321d067566ff650ccd9c6cfbb4a582e64c8054c263a565", + "target.spice": "ba052eb336f474bd8a32ab43897104b6e2a88389d6f5a15a5d8fc5202f16164b", + "target_lvs.spice": "bd23112a99a74b20faeeb4f2f6b068c900748d2d98afb155bf5a2518ab0b0548", + "testbench.spice": "4ff79c991e59ad6c91f311f1ea6903ca34cf026d79cf72d31c4e2819f7a7decb" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1_sL1.5/qualification.json new file mode 100644 index 00000000..48289cec --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1_sL1.5/qualification.json @@ -0,0 +1,103 @@ +{ + "case_id": "C03_gf180_sW1_sL1.5", + "circuit_id": "C03", + "pdk": "gf180", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 3.36, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 3.36, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 3.36, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "0d3aea99f2a4424c", + "mirror_pass1": { + "vmin": 1.255746, + "status": "passed", + "vout_test": 2.28 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 1.356 + }, + "_frozen_from": { + "schematic": { + "err": -0.0112105, + "vmin": 1.255746 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 2.145 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.2, + "schematic_measures": { + "iout_t": 1.977579e-05, + "err": -0.0112105, + "vmin": 1.255746, + "dev_at_vdd": 0.01117144, + "gout_t": 6.478086e-10, + "rout_t": 1543692000.0, + "vout_test": 2.28, + "rout_nom": 1543692000.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1_sL1.5/specs.json new file mode 100644 index 00000000..172c22bd --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 1.356 + }, + "_frozen_from": { + "schematic": { + "err": -0.0112105, + "vmin": 1.255746 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 2.145 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1_sL1.5/target.spice new file mode 100644 index 00000000..effe3e07 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1_sL1.5/target.spice @@ -0,0 +1,5 @@ +.subckt C03_gf180_sW1_sL1.5 VSS IIN1 IOUT1 +MM1 IIN1 Y VSS VSS nfet_03v3 w=4u l=3.36u nf=8 m=1 +MM2 Y Y VSS VSS nfet_03v3 w=4u l=3.36u nf=8 m=1 +MM3 IOUT1 IIN1 Y VSS nfet_03v3 w=4u l=3.36u nf=8 m=1 +.ends C03_gf180_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1_sL1.5/target_lvs.spice new file mode 100644 index 00000000..a67d9803 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1_sL1.5/target_lvs.spice @@ -0,0 +1,26 @@ +.subckt C03_gf180_sW1_sL1.5 VSS IIN1 IOUT1 +MM1_f0 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=3.36u +MM1_f1 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=3.36u +MM1_f2 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=3.36u +MM1_f3 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=3.36u +MM1_f4 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=3.36u +MM1_f5 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=3.36u +MM1_f6 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=3.36u +MM1_f7 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=3.36u +MM2_f0 Y Y VSS VSS nfet_03v3 w=0.5u l=3.36u +MM2_f1 Y Y VSS VSS nfet_03v3 w=0.5u l=3.36u +MM2_f2 Y Y VSS VSS nfet_03v3 w=0.5u l=3.36u +MM2_f3 Y Y VSS VSS nfet_03v3 w=0.5u l=3.36u +MM2_f4 Y Y VSS VSS nfet_03v3 w=0.5u l=3.36u +MM2_f5 Y Y VSS VSS nfet_03v3 w=0.5u l=3.36u +MM2_f6 Y Y VSS VSS nfet_03v3 w=0.5u l=3.36u +MM2_f7 Y Y VSS VSS nfet_03v3 w=0.5u l=3.36u +MM3_f0 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=3.36u +MM3_f1 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=3.36u +MM3_f2 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=3.36u +MM3_f3 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=3.36u +MM3_f4 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=3.36u +MM3_f5 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=3.36u +MM3_f6 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=3.36u +MM3_f7 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=3.36u +.ends C03_gf180_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1_sL1.5/testbench.spice new file mode 100644 index 00000000..555254a5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1_sL1.5/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IIN1 IOUT1 C03_gf180_sW1_sL1.5 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIIN1 VDDB IIN1 2e-05 +.nodeset v(IIN1)=0.99 + +VOUT IOUT1 0 3.3 +.control +dc VOUT 3.3 0 -0.00825 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=2.28 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.1 cross=last +meas dc dev_at_vdd find dev at=3.2835 +let gout = deriv(iout) +meas dc gout_t find gout at=2.28 +let rout_v = 1/gout +meas dc rout_t find rout_v at=2.28 +echo vout_test = 2.28 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1_sL1/case.json new file mode 100644 index 00000000..a4c06001 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1_sL1/case.json @@ -0,0 +1,123 @@ +{ + "case_id": "C03_gf180_sW1_sL1", + "circuit_id": "C03", + "pdk": "gf180", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "dut_name": "C03_gf180_sW1_sL1", + "ports": [ + "VSS", + "IIN1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 2.24, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 2.24, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 2.24, + "nf": 8 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 2.145, + "tol": 0.1, + "vout_test": 2.21 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 2.24, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 2.24, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 2.24, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "9db71b9a393b0e44", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1_sL1/manifest.json new file mode 100644 index 00000000..4b6c2169 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "281bc9aaeb5197489a5dcb4058650eb65262f2e4ab926fba6d628060bd4e3248", + "qualification.json": "354c130692f99e83c49907d3ca889b6adf9378cd0e6670316a7d22da01822e48", + "specs.json": "3f2d2098f0ab75c830055397f3311e9338dde104502f05c4e5629bcc76252fc1", + "target.spice": "bede3eeceeff0025b0bb80e07cd5e057a9d404ea52eb8f510f611e51b60a8075", + "target_lvs.spice": "2e063b813e4c0e16e9a6b4dce9ea08a5747d839fbad554206638fccb4182a54d", + "testbench.spice": "0173f3c29bd1e04d9656d06cd6a0769941b2ad7c801faa4742662666a4db4227" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1_sL1/qualification.json new file mode 100644 index 00000000..a9ebe3be --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1_sL1/qualification.json @@ -0,0 +1,103 @@ +{ + "case_id": "C03_gf180_sW1_sL1", + "circuit_id": "C03", + "pdk": "gf180", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 2.24, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 2.24, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 2.24, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "9db71b9a393b0e44", + "mirror_pass1": { + "vmin": 1.126864, + "status": "passed", + "vout_test": 2.21 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 1.227 + }, + "_frozen_from": { + "schematic": { + "err": -0.014305, + "vmin": 1.126864 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 2.145 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.2, + "schematic_measures": { + "iout_t": 1.97139e-05, + "err": -0.014305, + "vmin": 1.126864, + "dev_at_vdd": 0.01415489, + "gout_t": 7.09511e-10, + "rout_t": 1409428000.0, + "vout_test": 2.21, + "rout_nom": 1409428000.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1_sL1/specs.json new file mode 100644 index 00000000..0a71cd91 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 1.227 + }, + "_frozen_from": { + "schematic": { + "err": -0.014305, + "vmin": 1.126864 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 2.145 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1_sL1/target.spice new file mode 100644 index 00000000..1b9bae6a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1_sL1/target.spice @@ -0,0 +1,5 @@ +.subckt C03_gf180_sW1_sL1 VSS IIN1 IOUT1 +MM1 IIN1 Y VSS VSS nfet_03v3 w=4u l=2.24u nf=8 m=1 +MM2 Y Y VSS VSS nfet_03v3 w=4u l=2.24u nf=8 m=1 +MM3 IOUT1 IIN1 Y VSS nfet_03v3 w=4u l=2.24u nf=8 m=1 +.ends C03_gf180_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1_sL1/target_lvs.spice new file mode 100644 index 00000000..16bf122e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1_sL1/target_lvs.spice @@ -0,0 +1,26 @@ +.subckt C03_gf180_sW1_sL1 VSS IIN1 IOUT1 +MM1_f0 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=2.24u +MM1_f1 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=2.24u +MM1_f2 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=2.24u +MM1_f3 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=2.24u +MM1_f4 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=2.24u +MM1_f5 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=2.24u +MM1_f6 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=2.24u +MM1_f7 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=2.24u +MM2_f0 Y Y VSS VSS nfet_03v3 w=0.5u l=2.24u +MM2_f1 Y Y VSS VSS nfet_03v3 w=0.5u l=2.24u +MM2_f2 Y Y VSS VSS nfet_03v3 w=0.5u l=2.24u +MM2_f3 Y Y VSS VSS nfet_03v3 w=0.5u l=2.24u +MM2_f4 Y Y VSS VSS nfet_03v3 w=0.5u l=2.24u +MM2_f5 Y Y VSS VSS nfet_03v3 w=0.5u l=2.24u +MM2_f6 Y Y VSS VSS nfet_03v3 w=0.5u l=2.24u +MM2_f7 Y Y VSS VSS nfet_03v3 w=0.5u l=2.24u +MM3_f0 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=2.24u +MM3_f1 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=2.24u +MM3_f2 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=2.24u +MM3_f3 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=2.24u +MM3_f4 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=2.24u +MM3_f5 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=2.24u +MM3_f6 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=2.24u +MM3_f7 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=2.24u +.ends C03_gf180_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1_sL1/testbench.spice new file mode 100644 index 00000000..c69036c0 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1_sL1/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IIN1 IOUT1 C03_gf180_sW1_sL1 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIIN1 VDDB IIN1 2e-05 +.nodeset v(IIN1)=0.99 + +VOUT IOUT1 0 3.3 +.control +dc VOUT 3.3 0 -0.00825 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=2.21 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.1 cross=last +meas dc dev_at_vdd find dev at=3.2835 +let gout = deriv(iout) +meas dc gout_t find gout at=2.21 +let rout_v = 1/gout +meas dc rout_t find rout_v at=2.21 +echo vout_test = 2.21 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1_sL2/case.json new file mode 100644 index 00000000..1b71cda6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1_sL2/case.json @@ -0,0 +1,123 @@ +{ + "case_id": "C03_gf180_sW1_sL2", + "circuit_id": "C03", + "pdk": "gf180", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "dut_name": "C03_gf180_sW1_sL2", + "ports": [ + "VSS", + "IIN1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 4.48, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 4.48, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 4.48, + "nf": 8 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 2.145, + "tol": 0.1, + "vout_test": 2.33 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 4.48, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 4.48, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 4.48, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "1324023f18bc0d99", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1_sL2/manifest.json new file mode 100644 index 00000000..a2148d91 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "9815e86521c8b4fa615cd8bc7e13f511e30d788e5ae740ed3a5466451ce33f42", + "qualification.json": "16628817c12ed0c7b5a6ddc3da8d35448a3233ae6f89aa7ebcc483555491d809", + "specs.json": "a68239786f7c4fb6f2cc42704f1af4c9a592525f31bcc8040a0e1525f3ede09a", + "target.spice": "654478fda28e68b24c3dac0cf98a4187a12ad9ee03fdec541276aeb7512342fe", + "target_lvs.spice": "3aa5838a17bfe7ceb58d5177dfaca4812fd22c6c7665b72276727511aee8844a", + "testbench.spice": "f2ce441dd4f8264e6e78ed0c8af018f66cf6d88e1b909f95de8869b420e7e92e" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1_sL2/qualification.json new file mode 100644 index 00000000..439c79b0 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1_sL2/qualification.json @@ -0,0 +1,103 @@ +{ + "case_id": "C03_gf180_sW1_sL2", + "circuit_id": "C03", + "pdk": "gf180", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 4.48, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 4.48, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 4.48, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "1324023f18bc0d99", + "mirror_pass1": { + "vmin": 1.367713, + "status": "passed", + "vout_test": 2.33 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 1.468 + }, + "_frozen_from": { + "schematic": { + "err": -0.010186, + "vmin": 1.367713 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 2.145 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.2, + "schematic_measures": { + "iout_t": 1.979628e-05, + "err": -0.010186, + "vmin": 1.367713, + "dev_at_vdd": 0.01016059, + "gout_t": 7.13289e-10, + "rout_t": 1402004000.0, + "vout_test": 2.33, + "rout_nom": 1402004000.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1_sL2/specs.json new file mode 100644 index 00000000..9d7adda3 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 1.468 + }, + "_frozen_from": { + "schematic": { + "err": -0.010186, + "vmin": 1.367713 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 2.145 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1_sL2/target.spice new file mode 100644 index 00000000..f24ded54 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1_sL2/target.spice @@ -0,0 +1,5 @@ +.subckt C03_gf180_sW1_sL2 VSS IIN1 IOUT1 +MM1 IIN1 Y VSS VSS nfet_03v3 w=4u l=4.48u nf=8 m=1 +MM2 Y Y VSS VSS nfet_03v3 w=4u l=4.48u nf=8 m=1 +MM3 IOUT1 IIN1 Y VSS nfet_03v3 w=4u l=4.48u nf=8 m=1 +.ends C03_gf180_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1_sL2/target_lvs.spice new file mode 100644 index 00000000..3da06c47 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1_sL2/target_lvs.spice @@ -0,0 +1,26 @@ +.subckt C03_gf180_sW1_sL2 VSS IIN1 IOUT1 +MM1_f0 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=4.48u +MM1_f1 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=4.48u +MM1_f2 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=4.48u +MM1_f3 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=4.48u +MM1_f4 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=4.48u +MM1_f5 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=4.48u +MM1_f6 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=4.48u +MM1_f7 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=4.48u +MM2_f0 Y Y VSS VSS nfet_03v3 w=0.5u l=4.48u +MM2_f1 Y Y VSS VSS nfet_03v3 w=0.5u l=4.48u +MM2_f2 Y Y VSS VSS nfet_03v3 w=0.5u l=4.48u +MM2_f3 Y Y VSS VSS nfet_03v3 w=0.5u l=4.48u +MM2_f4 Y Y VSS VSS nfet_03v3 w=0.5u l=4.48u +MM2_f5 Y Y VSS VSS nfet_03v3 w=0.5u l=4.48u +MM2_f6 Y Y VSS VSS nfet_03v3 w=0.5u l=4.48u +MM2_f7 Y Y VSS VSS nfet_03v3 w=0.5u l=4.48u +MM3_f0 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=4.48u +MM3_f1 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=4.48u +MM3_f2 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=4.48u +MM3_f3 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=4.48u +MM3_f4 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=4.48u +MM3_f5 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=4.48u +MM3_f6 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=4.48u +MM3_f7 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=4.48u +.ends C03_gf180_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1_sL2/testbench.spice new file mode 100644 index 00000000..20321507 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW1_sL2/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IIN1 IOUT1 C03_gf180_sW1_sL2 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIIN1 VDDB IIN1 2e-05 +.nodeset v(IIN1)=0.99 + +VOUT IOUT1 0 3.3 +.control +dc VOUT 3.3 0 -0.00825 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=2.33 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.1 cross=last +meas dc dev_at_vdd find dev at=3.2835 +let gout = deriv(iout) +meas dc gout_t find gout at=2.33 +let rout_v = 1/gout +meas dc rout_t find rout_v at=2.33 +echo vout_test = 2.33 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C03/gf180/sW2_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW2_sL1.5/case.json new file mode 100644 index 00000000..7e766ad6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW2_sL1.5/case.json @@ -0,0 +1,123 @@ +{ + "case_id": "C03_gf180_sW2_sL1.5", + "circuit_id": "C03", + "pdk": "gf180", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "dut_name": "C03_gf180_sW2_sL1.5", + "ports": [ + "VSS", + "IIN1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 8.0, + "l": 3.36, + "nf": 16 + }, + "M2": { + "w": 8.0, + "l": 3.36, + "nf": 16 + }, + "M3": { + "w": 8.0, + "l": 3.36, + "nf": 16 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 2.145, + "tol": 0.1, + "vout_test": 2.18 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 3.36, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 3.36, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 3.36, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "4d187a84ed2fa3f7", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/gf180/sW2_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW2_sL1.5/manifest.json new file mode 100644 index 00000000..19166626 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW2_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "ac151b91b3dc13e0fc9287c8002bed5cfa23832481bd887cab6790193591c60e", + "qualification.json": "f65127b0a4908a876ad6dc294d447225f770bb6e0c15de5cd9aa78d5b925ce0c", + "specs.json": "0ffee015b2b531f016c6ec9d74f6bd68542d60d132283825d0515890402f180d", + "target.spice": "0e1505d5d735ebd4090583ba24748f6170e3470728dca4750b00e706b5494eb1", + "target_lvs.spice": "dc410188a51adfe9aa72a582d424ac2c83f8cde6e76c6b8cd0870fe3774f3fc5", + "testbench.spice": "e024db72fcc6e29db07b9304348e85425bf898905ab49f575e102b83e2a070e3" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/gf180/sW2_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW2_sL1.5/qualification.json new file mode 100644 index 00000000..21cee2ea --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW2_sL1.5/qualification.json @@ -0,0 +1,103 @@ +{ + "case_id": "C03_gf180_sW2_sL1.5", + "circuit_id": "C03", + "pdk": "gf180", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 3.36, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 3.36, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 3.36, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "4d187a84ed2fa3f7", + "mirror_pass1": { + "vmin": 1.051141, + "status": "passed", + "vout_test": 2.18 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 1.151 + }, + "_frozen_from": { + "schematic": { + "err": -0.0108945, + "vmin": 1.051141 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 2.145 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.3, + "schematic_measures": { + "iout_t": 1.978211e-05, + "err": -0.0108945, + "vmin": 1.051141, + "dev_at_vdd": 0.01069933, + "gout_t": 3.293691e-10, + "rout_t": 3036119000.0, + "vout_test": 2.18, + "rout_nom": 3036119000.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/gf180/sW2_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW2_sL1.5/specs.json new file mode 100644 index 00000000..42ad31c6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW2_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 1.151 + }, + "_frozen_from": { + "schematic": { + "err": -0.0108945, + "vmin": 1.051141 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 2.145 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/gf180/sW2_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW2_sL1.5/target.spice new file mode 100644 index 00000000..e704a9a0 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW2_sL1.5/target.spice @@ -0,0 +1,5 @@ +.subckt C03_gf180_sW2_sL1.5 VSS IIN1 IOUT1 +MM1 IIN1 Y VSS VSS nfet_03v3 w=8u l=3.36u nf=16 m=1 +MM2 Y Y VSS VSS nfet_03v3 w=8u l=3.36u nf=16 m=1 +MM3 IOUT1 IIN1 Y VSS nfet_03v3 w=8u l=3.36u nf=16 m=1 +.ends C03_gf180_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C03/gf180/sW2_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW2_sL1.5/target_lvs.spice new file mode 100644 index 00000000..db97f5eb --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW2_sL1.5/target_lvs.spice @@ -0,0 +1,50 @@ +.subckt C03_gf180_sW2_sL1.5 VSS IIN1 IOUT1 +MM1_f0 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=3.36u +MM1_f1 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=3.36u +MM1_f2 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=3.36u +MM1_f3 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=3.36u +MM1_f4 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=3.36u +MM1_f5 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=3.36u +MM1_f6 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=3.36u +MM1_f7 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=3.36u +MM1_f8 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=3.36u +MM1_f9 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=3.36u +MM1_f10 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=3.36u +MM1_f11 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=3.36u +MM1_f12 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=3.36u +MM1_f13 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=3.36u +MM1_f14 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=3.36u +MM1_f15 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=3.36u +MM2_f0 Y Y VSS VSS nfet_03v3 w=0.5u l=3.36u +MM2_f1 Y Y VSS VSS nfet_03v3 w=0.5u l=3.36u +MM2_f2 Y Y VSS VSS nfet_03v3 w=0.5u l=3.36u +MM2_f3 Y Y VSS VSS nfet_03v3 w=0.5u l=3.36u +MM2_f4 Y Y VSS VSS nfet_03v3 w=0.5u l=3.36u +MM2_f5 Y Y VSS VSS nfet_03v3 w=0.5u l=3.36u +MM2_f6 Y Y VSS VSS nfet_03v3 w=0.5u l=3.36u +MM2_f7 Y Y VSS VSS nfet_03v3 w=0.5u l=3.36u +MM2_f8 Y Y VSS VSS nfet_03v3 w=0.5u l=3.36u +MM2_f9 Y Y VSS VSS nfet_03v3 w=0.5u l=3.36u +MM2_f10 Y Y VSS VSS nfet_03v3 w=0.5u l=3.36u +MM2_f11 Y Y VSS VSS nfet_03v3 w=0.5u l=3.36u +MM2_f12 Y Y VSS VSS nfet_03v3 w=0.5u l=3.36u +MM2_f13 Y Y VSS VSS nfet_03v3 w=0.5u l=3.36u +MM2_f14 Y Y VSS VSS nfet_03v3 w=0.5u l=3.36u +MM2_f15 Y Y VSS VSS nfet_03v3 w=0.5u l=3.36u +MM3_f0 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=3.36u +MM3_f1 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=3.36u +MM3_f2 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=3.36u +MM3_f3 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=3.36u +MM3_f4 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=3.36u +MM3_f5 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=3.36u +MM3_f6 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=3.36u +MM3_f7 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=3.36u +MM3_f8 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=3.36u +MM3_f9 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=3.36u +MM3_f10 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=3.36u +MM3_f11 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=3.36u +MM3_f12 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=3.36u +MM3_f13 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=3.36u +MM3_f14 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=3.36u +MM3_f15 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=3.36u +.ends C03_gf180_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C03/gf180/sW2_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW2_sL1.5/testbench.spice new file mode 100644 index 00000000..ace86baf --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW2_sL1.5/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IIN1 IOUT1 C03_gf180_sW2_sL1.5 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIIN1 VDDB IIN1 2e-05 +.nodeset v(IIN1)=0.99 + +VOUT IOUT1 0 3.3 +.control +dc VOUT 3.3 0 -0.00825 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=2.18 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.1 cross=last +meas dc dev_at_vdd find dev at=3.2835 +let gout = deriv(iout) +meas dc gout_t find gout at=2.18 +let rout_v = 1/gout +meas dc rout_t find rout_v at=2.18 +echo vout_test = 2.18 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C03/gf180/sW2_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW2_sL1/case.json new file mode 100644 index 00000000..b21ef1e2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW2_sL1/case.json @@ -0,0 +1,123 @@ +{ + "case_id": "C03_gf180_sW2_sL1", + "circuit_id": "C03", + "pdk": "gf180", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "dut_name": "C03_gf180_sW2_sL1", + "ports": [ + "VSS", + "IIN1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 8.0, + "l": 2.24, + "nf": 16 + }, + "M2": { + "w": 8.0, + "l": 2.24, + "nf": 16 + }, + "M3": { + "w": 8.0, + "l": 2.24, + "nf": 16 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 2.145, + "tol": 0.1, + "vout_test": 2.13 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 2.24, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 2.24, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 2.24, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "499d6f72f1a867a1", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/gf180/sW2_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW2_sL1/manifest.json new file mode 100644 index 00000000..2dfaa6df --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW2_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "5bb9b362deb9ec77cef132c4e52a11b8efa854e0b3bf09befb2326cf93521ddc", + "qualification.json": "d661d0a201cb16b1cd90b92d3780b18ee4853f05f2822410950a51f55fda7397", + "specs.json": "e293fe8e94e37731b53a4c90697b5d7baaacccd12212b809ab814fd49e43b403", + "target.spice": "69c9d76787065544ad2af1c6a3d88a6c6223f53067c6bc16bb1c4aa60c9ace4b", + "target_lvs.spice": "1ada9bb1873408f8bd5157819899b237af3c0168caabbc4b9ac9dbcbad31cebe", + "testbench.spice": "ad7dfaf34575462b54ede21f0c8078b1bbae71eadd24a3f0662b46c1fd8fa537" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/gf180/sW2_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW2_sL1/qualification.json new file mode 100644 index 00000000..98f910e7 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW2_sL1/qualification.json @@ -0,0 +1,103 @@ +{ + "case_id": "C03_gf180_sW2_sL1", + "circuit_id": "C03", + "pdk": "gf180", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 2.24, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 2.24, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 2.24, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "499d6f72f1a867a1", + "mirror_pass1": { + "vmin": 0.9661599, + "status": "passed", + "vout_test": 2.13 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 1.066 + }, + "_frozen_from": { + "schematic": { + "err": -0.0151325, + "vmin": 0.9661599 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 2.145 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.3, + "schematic_measures": { + "iout_t": 1.969735e-05, + "err": -0.0151325, + "vmin": 0.9661599, + "dev_at_vdd": 0.01448253, + "gout_t": 4.98348e-10, + "rout_t": 2006634000.0, + "vout_test": 2.13, + "rout_nom": 2006634000.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/gf180/sW2_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW2_sL1/specs.json new file mode 100644 index 00000000..f6e81850 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW2_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 1.066 + }, + "_frozen_from": { + "schematic": { + "err": -0.0151325, + "vmin": 0.9661599 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 2.145 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/gf180/sW2_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW2_sL1/target.spice new file mode 100644 index 00000000..1d3811a0 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW2_sL1/target.spice @@ -0,0 +1,5 @@ +.subckt C03_gf180_sW2_sL1 VSS IIN1 IOUT1 +MM1 IIN1 Y VSS VSS nfet_03v3 w=8u l=2.24u nf=16 m=1 +MM2 Y Y VSS VSS nfet_03v3 w=8u l=2.24u nf=16 m=1 +MM3 IOUT1 IIN1 Y VSS nfet_03v3 w=8u l=2.24u nf=16 m=1 +.ends C03_gf180_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C03/gf180/sW2_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW2_sL1/target_lvs.spice new file mode 100644 index 00000000..621dda4b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW2_sL1/target_lvs.spice @@ -0,0 +1,50 @@ +.subckt C03_gf180_sW2_sL1 VSS IIN1 IOUT1 +MM1_f0 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=2.24u +MM1_f1 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=2.24u +MM1_f2 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=2.24u +MM1_f3 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=2.24u +MM1_f4 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=2.24u +MM1_f5 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=2.24u +MM1_f6 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=2.24u +MM1_f7 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=2.24u +MM1_f8 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=2.24u +MM1_f9 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=2.24u +MM1_f10 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=2.24u +MM1_f11 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=2.24u +MM1_f12 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=2.24u +MM1_f13 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=2.24u +MM1_f14 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=2.24u +MM1_f15 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=2.24u +MM2_f0 Y Y VSS VSS nfet_03v3 w=0.5u l=2.24u +MM2_f1 Y Y VSS VSS nfet_03v3 w=0.5u l=2.24u +MM2_f2 Y Y VSS VSS nfet_03v3 w=0.5u l=2.24u +MM2_f3 Y Y VSS VSS nfet_03v3 w=0.5u l=2.24u +MM2_f4 Y Y VSS VSS nfet_03v3 w=0.5u l=2.24u +MM2_f5 Y Y VSS VSS nfet_03v3 w=0.5u l=2.24u +MM2_f6 Y Y VSS VSS nfet_03v3 w=0.5u l=2.24u +MM2_f7 Y Y VSS VSS nfet_03v3 w=0.5u l=2.24u +MM2_f8 Y Y VSS VSS nfet_03v3 w=0.5u l=2.24u +MM2_f9 Y Y VSS VSS nfet_03v3 w=0.5u l=2.24u +MM2_f10 Y Y VSS VSS nfet_03v3 w=0.5u l=2.24u +MM2_f11 Y Y VSS VSS nfet_03v3 w=0.5u l=2.24u +MM2_f12 Y Y VSS VSS nfet_03v3 w=0.5u l=2.24u +MM2_f13 Y Y VSS VSS nfet_03v3 w=0.5u l=2.24u +MM2_f14 Y Y VSS VSS nfet_03v3 w=0.5u l=2.24u +MM2_f15 Y Y VSS VSS nfet_03v3 w=0.5u l=2.24u +MM3_f0 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=2.24u +MM3_f1 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=2.24u +MM3_f2 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=2.24u +MM3_f3 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=2.24u +MM3_f4 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=2.24u +MM3_f5 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=2.24u +MM3_f6 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=2.24u +MM3_f7 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=2.24u +MM3_f8 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=2.24u +MM3_f9 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=2.24u +MM3_f10 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=2.24u +MM3_f11 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=2.24u +MM3_f12 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=2.24u +MM3_f13 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=2.24u +MM3_f14 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=2.24u +MM3_f15 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=2.24u +.ends C03_gf180_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C03/gf180/sW2_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW2_sL1/testbench.spice new file mode 100644 index 00000000..c53c0d62 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW2_sL1/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IIN1 IOUT1 C03_gf180_sW2_sL1 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIIN1 VDDB IIN1 2e-05 +.nodeset v(IIN1)=0.99 + +VOUT IOUT1 0 3.3 +.control +dc VOUT 3.3 0 -0.00825 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=2.13 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.1 cross=last +meas dc dev_at_vdd find dev at=3.2835 +let gout = deriv(iout) +meas dc gout_t find gout at=2.13 +let rout_v = 1/gout +meas dc rout_t find rout_v at=2.13 +echo vout_test = 2.13 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C03/gf180/sW2_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW2_sL2/case.json new file mode 100644 index 00000000..447a5f02 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW2_sL2/case.json @@ -0,0 +1,123 @@ +{ + "case_id": "C03_gf180_sW2_sL2", + "circuit_id": "C03", + "pdk": "gf180", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "dut_name": "C03_gf180_sW2_sL2", + "ports": [ + "VSS", + "IIN1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 8.0, + "l": 4.48, + "nf": 16 + }, + "M2": { + "w": 8.0, + "l": 4.48, + "nf": 16 + }, + "M3": { + "w": 8.0, + "l": 4.48, + "nf": 16 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 2.145, + "tol": 0.1, + "vout_test": 2.21 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 4.48, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 4.48, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 4.48, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "92107ce4fee179c1", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/gf180/sW2_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW2_sL2/manifest.json new file mode 100644 index 00000000..30a7805f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW2_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "4e585a6f1e2220e65c5ef65a783131b70238553d45ff0dd98777656fd6f5355c", + "qualification.json": "502c73b4ecf6a3cfdee559f061647487d207676aa2a0080d7e524c8215b42794", + "specs.json": "f128259e600b89cccbc10fce236998718f50c10449fafe73913b52d9d2f0ddb6", + "target.spice": "6207edb5386f4d522a3aac4e57c2e709dd0a814bacfd09ea2fa0eef2b4901fde", + "target_lvs.spice": "874fcf03f5677da632918b5a422c783b7b815e21d91635959eef0db33f8fcdfa", + "testbench.spice": "a07ea7ec8b88243c83d803389506e6914a07fd0a61425b709423cee7c81b370c" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/gf180/sW2_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW2_sL2/qualification.json new file mode 100644 index 00000000..c3a273a2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW2_sL2/qualification.json @@ -0,0 +1,103 @@ +{ + "case_id": "C03_gf180_sW2_sL2", + "circuit_id": "C03", + "pdk": "gf180", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 4.48, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 4.48, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 4.48, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "92107ce4fee179c1", + "mirror_pass1": { + "vmin": 1.124088, + "status": "passed", + "vout_test": 2.21 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 1.224 + }, + "_frozen_from": { + "schematic": { + "err": -0.008961, + "vmin": 1.124088 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 2.145 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.3, + "schematic_measures": { + "iout_t": 1.982078e-05, + "err": -0.008961, + "vmin": 1.124088, + "dev_at_vdd": 0.008892388, + "gout_t": 2.741858e-10, + "rout_t": 3647172000.0, + "vout_test": 2.21, + "rout_nom": 3647172000.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/gf180/sW2_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW2_sL2/specs.json new file mode 100644 index 00000000..4872d77b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW2_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 1.224 + }, + "_frozen_from": { + "schematic": { + "err": -0.008961, + "vmin": 1.124088 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 2.145 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/gf180/sW2_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW2_sL2/target.spice new file mode 100644 index 00000000..ac1404e9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW2_sL2/target.spice @@ -0,0 +1,5 @@ +.subckt C03_gf180_sW2_sL2 VSS IIN1 IOUT1 +MM1 IIN1 Y VSS VSS nfet_03v3 w=8u l=4.48u nf=16 m=1 +MM2 Y Y VSS VSS nfet_03v3 w=8u l=4.48u nf=16 m=1 +MM3 IOUT1 IIN1 Y VSS nfet_03v3 w=8u l=4.48u nf=16 m=1 +.ends C03_gf180_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C03/gf180/sW2_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW2_sL2/target_lvs.spice new file mode 100644 index 00000000..9e104402 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW2_sL2/target_lvs.spice @@ -0,0 +1,50 @@ +.subckt C03_gf180_sW2_sL2 VSS IIN1 IOUT1 +MM1_f0 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=4.48u +MM1_f1 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=4.48u +MM1_f2 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=4.48u +MM1_f3 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=4.48u +MM1_f4 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=4.48u +MM1_f5 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=4.48u +MM1_f6 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=4.48u +MM1_f7 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=4.48u +MM1_f8 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=4.48u +MM1_f9 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=4.48u +MM1_f10 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=4.48u +MM1_f11 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=4.48u +MM1_f12 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=4.48u +MM1_f13 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=4.48u +MM1_f14 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=4.48u +MM1_f15 IIN1 Y VSS VSS nfet_03v3 w=0.5u l=4.48u +MM2_f0 Y Y VSS VSS nfet_03v3 w=0.5u l=4.48u +MM2_f1 Y Y VSS VSS nfet_03v3 w=0.5u l=4.48u +MM2_f2 Y Y VSS VSS nfet_03v3 w=0.5u l=4.48u +MM2_f3 Y Y VSS VSS nfet_03v3 w=0.5u l=4.48u +MM2_f4 Y Y VSS VSS nfet_03v3 w=0.5u l=4.48u +MM2_f5 Y Y VSS VSS nfet_03v3 w=0.5u l=4.48u +MM2_f6 Y Y VSS VSS nfet_03v3 w=0.5u l=4.48u +MM2_f7 Y Y VSS VSS nfet_03v3 w=0.5u l=4.48u +MM2_f8 Y Y VSS VSS nfet_03v3 w=0.5u l=4.48u +MM2_f9 Y Y VSS VSS nfet_03v3 w=0.5u l=4.48u +MM2_f10 Y Y VSS VSS nfet_03v3 w=0.5u l=4.48u +MM2_f11 Y Y VSS VSS nfet_03v3 w=0.5u l=4.48u +MM2_f12 Y Y VSS VSS nfet_03v3 w=0.5u l=4.48u +MM2_f13 Y Y VSS VSS nfet_03v3 w=0.5u l=4.48u +MM2_f14 Y Y VSS VSS nfet_03v3 w=0.5u l=4.48u +MM2_f15 Y Y VSS VSS nfet_03v3 w=0.5u l=4.48u +MM3_f0 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=4.48u +MM3_f1 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=4.48u +MM3_f2 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=4.48u +MM3_f3 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=4.48u +MM3_f4 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=4.48u +MM3_f5 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=4.48u +MM3_f6 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=4.48u +MM3_f7 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=4.48u +MM3_f8 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=4.48u +MM3_f9 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=4.48u +MM3_f10 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=4.48u +MM3_f11 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=4.48u +MM3_f12 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=4.48u +MM3_f13 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=4.48u +MM3_f14 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=4.48u +MM3_f15 IOUT1 IIN1 Y VSS nfet_03v3 w=0.5u l=4.48u +.ends C03_gf180_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C03/gf180/sW2_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW2_sL2/testbench.spice new file mode 100644 index 00000000..5e7a0563 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/gf180/sW2_sL2/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IIN1 IOUT1 C03_gf180_sW2_sL2 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIIN1 VDDB IIN1 2e-05 +.nodeset v(IIN1)=0.99 + +VOUT IOUT1 0 3.3 +.control +dc VOUT 3.3 0 -0.00825 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=2.21 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.1 cross=last +meas dc dev_at_vdd find dev at=3.2835 +let gout = deriv(iout) +meas dc gout_t find gout at=2.21 +let rout_v = 1/gout +meas dc rout_t find rout_v at=2.21 +echo vout_test = 2.21 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW0.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW0.5_sL1.5/case.json new file mode 100644 index 00000000..37d276ff --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW0.5_sL1.5/case.json @@ -0,0 +1,123 @@ +{ + "case_id": "C03_ihp130_sW0.5_sL1.5", + "circuit_id": "C03", + "pdk": "ihp130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "dut_name": "C03_ihp130_sW0.5_sL1.5", + "ports": [ + "VSS", + "IIN1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 3.12, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 3.12, + "nf": 4 + }, + "M3": { + "w": 2.0, + "l": 3.12, + "nf": 4 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 0.78, + "tol": 0.1, + "vout_test": 0.95 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 3.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 3.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 3.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "53cef8e23a479779", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW0.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW0.5_sL1.5/manifest.json new file mode 100644 index 00000000..a03b371d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW0.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "45b56065e068071ef453ecf6b449bd775e2cf9d6a2bb062bab2d334eed0f47f8", + "qualification.json": "475385a8e271f9681c7508a8be7b1a00b7048351cdfeb34687cd876dc645b709", + "specs.json": "085e9cea03ca71df01bccc6ff6921773b4939f3031709f421b4b9dc7c116d2dd", + "target.spice": "ba8cc2efae500f3a1bcc6dc3a8570568674c633140ecb28e4e363dc59d5ad021", + "target_lvs.spice": "9189dab3e13d99dbab9c7b60657fcb56fdb55faeb561edfeeb875c35be964e0b", + "testbench.spice": "dbedae43747ccdb9f76dc53f7a5d891ea3ab617fd2db098d2f95a29940c4b787" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW0.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW0.5_sL1.5/qualification.json new file mode 100644 index 00000000..8e2db060 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW0.5_sL1.5/qualification.json @@ -0,0 +1,103 @@ +{ + "case_id": "C03_ihp130_sW0.5_sL1.5", + "circuit_id": "C03", + "pdk": "ihp130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 3.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 3.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 3.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "53cef8e23a479779", + "mirror_pass1": { + "vmin": 0.7060432, + "status": "passed", + "vout_test": 0.95 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 0.78 + }, + "_frozen_from": { + "schematic": { + "err": -0.056157, + "vmin": 0.7060432 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 0.78 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.4, + "schematic_measures": { + "iout_t": 1.887686e-05, + "err": -0.056157, + "vmin": 0.7060432, + "dev_at_vdd": 0.05519875, + "gout_t": 2.84866e-07, + "rout_t": 3512583.0, + "vout_test": 0.95, + "rout_nom": 3512583.0, + "ok_at_vdd": 0.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW0.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW0.5_sL1.5/specs.json new file mode 100644 index 00000000..c9aebb60 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW0.5_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 0.78 + }, + "_frozen_from": { + "schematic": { + "err": -0.056157, + "vmin": 0.7060432 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 0.78 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW0.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW0.5_sL1.5/target.spice new file mode 100644 index 00000000..7037b721 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW0.5_sL1.5/target.spice @@ -0,0 +1,5 @@ +.subckt C03_ihp130_sW0.5_sL1.5 VSS IIN1 IOUT1 +XM1 IIN1 Y VSS VSS sg13_lv_nmos w=2u l=3.12u ng=4 m=1 +XM2 Y Y VSS VSS sg13_lv_nmos w=2u l=3.12u ng=4 m=1 +XM3 IOUT1 IIN1 Y VSS sg13_lv_nmos w=2u l=3.12u ng=4 m=1 +.ends C03_ihp130_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW0.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW0.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..47cf6bdc --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW0.5_sL1.5/target_lvs.spice @@ -0,0 +1,14 @@ +.subckt C03_ihp130_sW0.5_sL1.5 VSS IIN1 IOUT1 +XM1_f0 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=3.12u +XM1_f1 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=3.12u +XM1_f2 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=3.12u +XM1_f3 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=3.12u +XM2_f0 Y Y VSS VSS sg13_lv_nmos w=0.5u l=3.12u +XM2_f1 Y Y VSS VSS sg13_lv_nmos w=0.5u l=3.12u +XM2_f2 Y Y VSS VSS sg13_lv_nmos w=0.5u l=3.12u +XM2_f3 Y Y VSS VSS sg13_lv_nmos w=0.5u l=3.12u +XM3_f0 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=3.12u +XM3_f1 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=3.12u +XM3_f2 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=3.12u +XM3_f3 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=3.12u +.ends C03_ihp130_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW0.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW0.5_sL1.5/testbench.spice new file mode 100644 index 00000000..7a63f03d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW0.5_sL1.5/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IIN1 IOUT1 C03_ihp130_sW0.5_sL1.5 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIIN1 VDDB IIN1 2e-05 +.nodeset v(IIN1)=0.36 + +VOUT IOUT1 0 1.2 +.control +dc VOUT 1.2 0 -0.003 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=0.95 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.1 cross=last +meas dc dev_at_vdd find dev at=1.194 +let gout = deriv(iout) +meas dc gout_t find gout at=0.95 +let rout_v = 1/gout +meas dc rout_t find rout_v at=0.95 +echo vout_test = 0.95 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW0.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW0.5_sL1/case.json new file mode 100644 index 00000000..302f41a6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW0.5_sL1/case.json @@ -0,0 +1,123 @@ +{ + "case_id": "C03_ihp130_sW0.5_sL1", + "circuit_id": "C03", + "pdk": "ihp130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "dut_name": "C03_ihp130_sW0.5_sL1", + "ports": [ + "VSS", + "IIN1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 2.08, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 2.08, + "nf": 4 + }, + "M3": { + "w": 2.0, + "l": 2.08, + "nf": 4 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 0.78, + "tol": 0.1, + "vout_test": 0.92 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 2.08, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 2.08, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 2.08, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "c96ce9ef9e8b9b6c", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW0.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW0.5_sL1/manifest.json new file mode 100644 index 00000000..693d6fb7 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW0.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "c82525110db34f63fd43dd7567680a325fbb99a1f3bd02d808dc2a8439d5be25", + "qualification.json": "d7a9d2137cc40c04b430a7b5d48036694dc777966be4ffb1cf7afadc9c36639e", + "specs.json": "ca3ee94beb7f6aa4366d29f3944c54a47b433ab1312c0727851318b4883d9b14", + "target.spice": "e899615437dd95b7d6055f7ce9ba45ff26423561e7e65065116df3f024f3dae3", + "target_lvs.spice": "26992a42b2f6cd1425cfdb13cd0cabbbc8ae30b1f3b887b255edca9be90492e6", + "testbench.spice": "8c6f92e2b16775bb1ac837c1d297240720003e460f3412367d3e7f675b9c0f98" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW0.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW0.5_sL1/qualification.json new file mode 100644 index 00000000..6af7b0cf --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW0.5_sL1/qualification.json @@ -0,0 +1,103 @@ +{ + "case_id": "C03_ihp130_sW0.5_sL1", + "circuit_id": "C03", + "pdk": "ihp130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 2.08, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 2.08, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 2.08, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "c96ce9ef9e8b9b6c", + "mirror_pass1": { + "vmin": 0.6393236, + "status": "passed", + "vout_test": 0.92 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 0.7393 + }, + "_frozen_from": { + "schematic": { + "err": -0.0699635, + "vmin": 0.6393236 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 0.78 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.4, + "schematic_measures": { + "iout_t": 1.860073e-05, + "err": -0.0699635, + "vmin": 0.6393236, + "dev_at_vdd": 0.06921668, + "gout_t": 8.710236e-08, + "rout_t": 11482700.0, + "vout_test": 0.92, + "rout_nom": 11482700.0, + "ok_at_vdd": 0.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW0.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW0.5_sL1/specs.json new file mode 100644 index 00000000..2cd7d440 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW0.5_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 0.7393 + }, + "_frozen_from": { + "schematic": { + "err": -0.0699635, + "vmin": 0.6393236 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 0.78 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW0.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW0.5_sL1/target.spice new file mode 100644 index 00000000..ac46630d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW0.5_sL1/target.spice @@ -0,0 +1,5 @@ +.subckt C03_ihp130_sW0.5_sL1 VSS IIN1 IOUT1 +XM1 IIN1 Y VSS VSS sg13_lv_nmos w=2u l=2.08u ng=4 m=1 +XM2 Y Y VSS VSS sg13_lv_nmos w=2u l=2.08u ng=4 m=1 +XM3 IOUT1 IIN1 Y VSS sg13_lv_nmos w=2u l=2.08u ng=4 m=1 +.ends C03_ihp130_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW0.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW0.5_sL1/target_lvs.spice new file mode 100644 index 00000000..3d000a90 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW0.5_sL1/target_lvs.spice @@ -0,0 +1,14 @@ +.subckt C03_ihp130_sW0.5_sL1 VSS IIN1 IOUT1 +XM1_f0 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM1_f1 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM1_f2 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM1_f3 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM2_f0 Y Y VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM2_f1 Y Y VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM2_f2 Y Y VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM2_f3 Y Y VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM3_f0 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=2.08u +XM3_f1 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=2.08u +XM3_f2 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=2.08u +XM3_f3 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=2.08u +.ends C03_ihp130_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW0.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW0.5_sL1/testbench.spice new file mode 100644 index 00000000..d80b27e2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW0.5_sL1/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IIN1 IOUT1 C03_ihp130_sW0.5_sL1 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIIN1 VDDB IIN1 2e-05 +.nodeset v(IIN1)=0.36 + +VOUT IOUT1 0 1.2 +.control +dc VOUT 1.2 0 -0.003 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=0.92 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.1 cross=last +meas dc dev_at_vdd find dev at=1.194 +let gout = deriv(iout) +meas dc gout_t find gout at=0.92 +let rout_v = 1/gout +meas dc rout_t find rout_v at=0.92 +echo vout_test = 0.92 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW0.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW0.5_sL2/case.json new file mode 100644 index 00000000..89dbb0a2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW0.5_sL2/case.json @@ -0,0 +1,123 @@ +{ + "case_id": "C03_ihp130_sW0.5_sL2", + "circuit_id": "C03", + "pdk": "ihp130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "dut_name": "C03_ihp130_sW0.5_sL2", + "ports": [ + "VSS", + "IIN1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 4.16, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 4.16, + "nf": 4 + }, + "M3": { + "w": 2.0, + "l": 4.16, + "nf": 4 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 0.78, + "tol": 0.1, + "vout_test": 0.99 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 4.16, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 4.16, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 4.16, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "6a279ddec0850926", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW0.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW0.5_sL2/manifest.json new file mode 100644 index 00000000..4cb002bf --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW0.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "65535eef925b233ab0b2112e7bb0be8e5dda5084fd35990e1c1a7deafe281cb6", + "qualification.json": "65d6ec9db0b68182cefa7a002714d2d2f4c7d7901808a0c6ff5fa8e7a1b536d3", + "specs.json": "9aa016c82018c23d9467d6fad1414bec6081f037aa7e93d26b55bae29174482a", + "target.spice": "5f5b276caa818f65989cf04569e0d14aae39e4ad2cc64b63e3702d3c32a62f55", + "target_lvs.spice": "29507535616f4a84fba186c1987eecf87c20d016c9113f21a5eac654976f10bf", + "testbench.spice": "f4564b2b74afa9be78ae7b92ad261b6ab246d0ce8618baabe81f1036af2e90bb" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW0.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW0.5_sL2/qualification.json new file mode 100644 index 00000000..2b168adf --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW0.5_sL2/qualification.json @@ -0,0 +1,105 @@ +{ + "case_id": "C03_ihp130_sW0.5_sL2", + "circuit_id": "C03", + "pdk": "ihp130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 4.16, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 4.16, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 4.16, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "6a279ddec0850926", + "mirror_pass1": { + "vmin": 0.780093, + "status": "passed", + "vout_test": 0.99 + }, + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "vmin=0.7801 above floor 0.78" + ], + "spec": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 0.78 + }, + "_frozen_from": { + "schematic": { + "err": -0.0488655, + "vmin": 0.780093 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 0.78 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.4, + "schematic_measures": { + "iout_t": 1.902269e-05, + "err": -0.0488655, + "vmin": 0.780093, + "dev_at_vdd": 0.04699181, + "gout_t": 5.681386e-07, + "rout_t": 1760134.0, + "vout_test": 0.99, + "rout_nom": 1760134.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW0.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW0.5_sL2/specs.json new file mode 100644 index 00000000..87195459 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW0.5_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 0.78 + }, + "_frozen_from": { + "schematic": { + "err": -0.0488655, + "vmin": 0.780093 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 0.78 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW0.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW0.5_sL2/target.spice new file mode 100644 index 00000000..bd0480f8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW0.5_sL2/target.spice @@ -0,0 +1,5 @@ +.subckt C03_ihp130_sW0.5_sL2 VSS IIN1 IOUT1 +XM1 IIN1 Y VSS VSS sg13_lv_nmos w=2u l=4.16u ng=4 m=1 +XM2 Y Y VSS VSS sg13_lv_nmos w=2u l=4.16u ng=4 m=1 +XM3 IOUT1 IIN1 Y VSS sg13_lv_nmos w=2u l=4.16u ng=4 m=1 +.ends C03_ihp130_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW0.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW0.5_sL2/target_lvs.spice new file mode 100644 index 00000000..521a37ea --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW0.5_sL2/target_lvs.spice @@ -0,0 +1,14 @@ +.subckt C03_ihp130_sW0.5_sL2 VSS IIN1 IOUT1 +XM1_f0 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=4.16u +XM1_f1 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=4.16u +XM1_f2 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=4.16u +XM1_f3 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=4.16u +XM2_f0 Y Y VSS VSS sg13_lv_nmos w=0.5u l=4.16u +XM2_f1 Y Y VSS VSS sg13_lv_nmos w=0.5u l=4.16u +XM2_f2 Y Y VSS VSS sg13_lv_nmos w=0.5u l=4.16u +XM2_f3 Y Y VSS VSS sg13_lv_nmos w=0.5u l=4.16u +XM3_f0 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=4.16u +XM3_f1 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=4.16u +XM3_f2 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=4.16u +XM3_f3 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=4.16u +.ends C03_ihp130_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW0.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW0.5_sL2/testbench.spice new file mode 100644 index 00000000..a26f6148 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW0.5_sL2/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IIN1 IOUT1 C03_ihp130_sW0.5_sL2 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIIN1 VDDB IIN1 2e-05 +.nodeset v(IIN1)=0.36 + +VOUT IOUT1 0 1.2 +.control +dc VOUT 1.2 0 -0.003 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=0.99 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.1 cross=last +meas dc dev_at_vdd find dev at=1.194 +let gout = deriv(iout) +meas dc gout_t find gout at=0.99 +let rout_v = 1/gout +meas dc rout_t find rout_v at=0.99 +echo vout_test = 0.99 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1.5_sL1.5/case.json new file mode 100644 index 00000000..7a298953 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1.5_sL1.5/case.json @@ -0,0 +1,123 @@ +{ + "case_id": "C03_ihp130_sW1.5_sL1.5", + "circuit_id": "C03", + "pdk": "ihp130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "dut_name": "C03_ihp130_sW1.5_sL1.5", + "ports": [ + "VSS", + "IIN1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 6.0, + "l": 3.12, + "nf": 12 + }, + "M2": { + "w": 6.0, + "l": 3.12, + "nf": 12 + }, + "M3": { + "w": 6.0, + "l": 3.12, + "nf": 12 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 0.78, + "tol": 0.1, + "vout_test": 0.85 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 3.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 3.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 3.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "f1d23c8922edb903", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1.5_sL1.5/manifest.json new file mode 100644 index 00000000..a045f774 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "7afaeb3d6fb4af2ffadadaff08ed7a1643c55d36ddbd910a62f99a6120f3b9ee", + "qualification.json": "41f46d5333b37c0b27d7e682df78facc4ec108bab601025636caf4f22ed35997", + "specs.json": "dcf9314a553111bb87163084d05fbcc7bb537609558ed6e5afe2cfad6d665c92", + "target.spice": "6d87fb7f248eb61741ba06a50ab2c34cc24b81e8bb9507f9aec8e4787109b2df", + "target_lvs.spice": "a15bc8427f55c73b409fed87b37a28049bc3f387aab33ea1b50c37a123daee3e", + "testbench.spice": "66ff53d8c962d3c08ac9552fa966cf19e316d3f376174e388b6bfc5f4dee1d04" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1.5_sL1.5/qualification.json new file mode 100644 index 00000000..0d441a0d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1.5_sL1.5/qualification.json @@ -0,0 +1,103 @@ +{ + "case_id": "C03_ihp130_sW1.5_sL1.5", + "circuit_id": "C03", + "pdk": "ihp130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 3.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 3.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 3.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "f1d23c8922edb903", + "mirror_pass1": { + "vmin": 0.5064997, + "status": "passed", + "vout_test": 0.85 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 0.6065 + }, + "_frozen_from": { + "schematic": { + "err": -0.0718915, + "vmin": 0.5064997 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 0.78 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 1.0, + "schematic_measures": { + "iout_t": 1.856217e-05, + "err": -0.0718915, + "vmin": 0.5064997, + "dev_at_vdd": 0.07107148, + "gout_t": 5.92658e-08, + "rout_t": 16873230.0, + "vout_test": 0.85, + "rout_nom": 16873230.0, + "ok_at_vdd": 0.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1.5_sL1.5/specs.json new file mode 100644 index 00000000..ef79b2e2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1.5_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 0.6065 + }, + "_frozen_from": { + "schematic": { + "err": -0.0718915, + "vmin": 0.5064997 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 0.78 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1.5_sL1.5/target.spice new file mode 100644 index 00000000..f82f8513 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1.5_sL1.5/target.spice @@ -0,0 +1,5 @@ +.subckt C03_ihp130_sW1.5_sL1.5 VSS IIN1 IOUT1 +XM1 IIN1 Y VSS VSS sg13_lv_nmos w=6u l=3.12u ng=12 m=1 +XM2 Y Y VSS VSS sg13_lv_nmos w=6u l=3.12u ng=12 m=1 +XM3 IOUT1 IIN1 Y VSS sg13_lv_nmos w=6u l=3.12u ng=12 m=1 +.ends C03_ihp130_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..b8d1bf98 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1.5_sL1.5/target_lvs.spice @@ -0,0 +1,38 @@ +.subckt C03_ihp130_sW1.5_sL1.5 VSS IIN1 IOUT1 +XM1_f0 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=3.12u +XM1_f1 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=3.12u +XM1_f2 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=3.12u +XM1_f3 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=3.12u +XM1_f4 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=3.12u +XM1_f5 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=3.12u +XM1_f6 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=3.12u +XM1_f7 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=3.12u +XM1_f8 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=3.12u +XM1_f9 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=3.12u +XM1_f10 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=3.12u +XM1_f11 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=3.12u +XM2_f0 Y Y VSS VSS sg13_lv_nmos w=0.5u l=3.12u +XM2_f1 Y Y VSS VSS sg13_lv_nmos w=0.5u l=3.12u +XM2_f2 Y Y VSS VSS sg13_lv_nmos w=0.5u l=3.12u +XM2_f3 Y Y VSS VSS sg13_lv_nmos w=0.5u l=3.12u +XM2_f4 Y Y VSS VSS sg13_lv_nmos w=0.5u l=3.12u +XM2_f5 Y Y VSS VSS sg13_lv_nmos w=0.5u l=3.12u +XM2_f6 Y Y VSS VSS sg13_lv_nmos w=0.5u l=3.12u +XM2_f7 Y Y VSS VSS sg13_lv_nmos w=0.5u l=3.12u +XM2_f8 Y Y VSS VSS sg13_lv_nmos w=0.5u l=3.12u +XM2_f9 Y Y VSS VSS sg13_lv_nmos w=0.5u l=3.12u +XM2_f10 Y Y VSS VSS sg13_lv_nmos w=0.5u l=3.12u +XM2_f11 Y Y VSS VSS sg13_lv_nmos w=0.5u l=3.12u +XM3_f0 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=3.12u +XM3_f1 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=3.12u +XM3_f2 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=3.12u +XM3_f3 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=3.12u +XM3_f4 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=3.12u +XM3_f5 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=3.12u +XM3_f6 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=3.12u +XM3_f7 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=3.12u +XM3_f8 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=3.12u +XM3_f9 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=3.12u +XM3_f10 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=3.12u +XM3_f11 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=3.12u +.ends C03_ihp130_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1.5_sL1.5/testbench.spice new file mode 100644 index 00000000..56746935 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1.5_sL1.5/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IIN1 IOUT1 C03_ihp130_sW1.5_sL1.5 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIIN1 VDDB IIN1 2e-05 +.nodeset v(IIN1)=0.36 + +VOUT IOUT1 0 1.2 +.control +dc VOUT 1.2 0 -0.003 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=0.85 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.1 cross=last +meas dc dev_at_vdd find dev at=1.194 +let gout = deriv(iout) +meas dc gout_t find gout at=0.85 +let rout_v = 1/gout +meas dc rout_t find rout_v at=0.85 +echo vout_test = 0.85 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1.5_sL1/case.json new file mode 100644 index 00000000..cf639053 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1.5_sL1/case.json @@ -0,0 +1,123 @@ +{ + "case_id": "C03_ihp130_sW1.5_sL1", + "circuit_id": "C03", + "pdk": "ihp130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "dut_name": "C03_ihp130_sW1.5_sL1", + "ports": [ + "VSS", + "IIN1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 6.0, + "l": 2.08, + "nf": 12 + }, + "M2": { + "w": 6.0, + "l": 2.08, + "nf": 12 + }, + "M3": { + "w": 6.0, + "l": 2.08, + "nf": 12 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 0.78, + "tol": 0.1, + "vout_test": 0.85 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 2.08, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 2.08, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 2.08, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "a25067b2aa8dc024", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1.5_sL1/manifest.json new file mode 100644 index 00000000..b0a927b2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "c07fb5ca99d0166de6e85a20e633b1a40da5e58fc913bde4396e064c343c1799", + "qualification.json": "060bede830165f66805abce83b2cdba0e34fd9d62ffdd8172ac5ba0bd679ce60", + "specs.json": "5ff8d5cb9724e436897cac780d2dc04ea4894842ef5328d24a31fb337dd21c85", + "target.spice": "e2960666b19da0b500c9956586238ef03c518d28bf24552e9542779994b7da91", + "target_lvs.spice": "6ed0284cd618719c7bd1305b354cac0533da0156d86b1d6315ba804a06eade07", + "testbench.spice": "d84d907071c6ec237c9bfaee44b4003649c2049cdcb906a704de5ce583a1c6b6" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1.5_sL1/qualification.json new file mode 100644 index 00000000..54b6d7cf --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1.5_sL1/qualification.json @@ -0,0 +1,103 @@ +{ + "case_id": "C03_ihp130_sW1.5_sL1", + "circuit_id": "C03", + "pdk": "ihp130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 2.08, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 2.08, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 2.08, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "a25067b2aa8dc024", + "mirror_pass1": { + "vmin": 0.5052037, + "status": "passed", + "vout_test": 0.85 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 0.6052 + }, + "_frozen_from": { + "schematic": { + "err": -0.0898685, + "vmin": 0.5052037 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 0.78 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 1.0, + "schematic_measures": { + "iout_t": 1.820263e-05, + "err": -0.0898685, + "vmin": 0.5052037, + "dev_at_vdd": 0.08867583, + "gout_t": 8.355636e-08, + "rout_t": 11968010.0, + "vout_test": 0.85, + "rout_nom": 11968010.0, + "ok_at_vdd": 0.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1.5_sL1/specs.json new file mode 100644 index 00000000..1d694d01 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1.5_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 0.6052 + }, + "_frozen_from": { + "schematic": { + "err": -0.0898685, + "vmin": 0.5052037 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 0.78 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1.5_sL1/target.spice new file mode 100644 index 00000000..459d6ca4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1.5_sL1/target.spice @@ -0,0 +1,5 @@ +.subckt C03_ihp130_sW1.5_sL1 VSS IIN1 IOUT1 +XM1 IIN1 Y VSS VSS sg13_lv_nmos w=6u l=2.08u ng=12 m=1 +XM2 Y Y VSS VSS sg13_lv_nmos w=6u l=2.08u ng=12 m=1 +XM3 IOUT1 IIN1 Y VSS sg13_lv_nmos w=6u l=2.08u ng=12 m=1 +.ends C03_ihp130_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1.5_sL1/target_lvs.spice new file mode 100644 index 00000000..62b1b1a4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1.5_sL1/target_lvs.spice @@ -0,0 +1,38 @@ +.subckt C03_ihp130_sW1.5_sL1 VSS IIN1 IOUT1 +XM1_f0 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM1_f1 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM1_f2 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM1_f3 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM1_f4 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM1_f5 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM1_f6 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM1_f7 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM1_f8 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM1_f9 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM1_f10 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM1_f11 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM2_f0 Y Y VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM2_f1 Y Y VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM2_f2 Y Y VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM2_f3 Y Y VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM2_f4 Y Y VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM2_f5 Y Y VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM2_f6 Y Y VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM2_f7 Y Y VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM2_f8 Y Y VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM2_f9 Y Y VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM2_f10 Y Y VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM2_f11 Y Y VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM3_f0 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=2.08u +XM3_f1 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=2.08u +XM3_f2 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=2.08u +XM3_f3 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=2.08u +XM3_f4 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=2.08u +XM3_f5 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=2.08u +XM3_f6 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=2.08u +XM3_f7 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=2.08u +XM3_f8 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=2.08u +XM3_f9 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=2.08u +XM3_f10 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=2.08u +XM3_f11 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=2.08u +.ends C03_ihp130_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1.5_sL1/testbench.spice new file mode 100644 index 00000000..398d1799 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1.5_sL1/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IIN1 IOUT1 C03_ihp130_sW1.5_sL1 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIIN1 VDDB IIN1 2e-05 +.nodeset v(IIN1)=0.36 + +VOUT IOUT1 0 1.2 +.control +dc VOUT 1.2 0 -0.003 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=0.85 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.1 cross=last +meas dc dev_at_vdd find dev at=1.194 +let gout = deriv(iout) +meas dc gout_t find gout at=0.85 +let rout_v = 1/gout +meas dc rout_t find rout_v at=0.85 +echo vout_test = 0.85 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1.5_sL2/case.json new file mode 100644 index 00000000..e32447f1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1.5_sL2/case.json @@ -0,0 +1,123 @@ +{ + "case_id": "C03_ihp130_sW1.5_sL2", + "circuit_id": "C03", + "pdk": "ihp130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "dut_name": "C03_ihp130_sW1.5_sL2", + "ports": [ + "VSS", + "IIN1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 6.0, + "l": 4.16, + "nf": 12 + }, + "M2": { + "w": 6.0, + "l": 4.16, + "nf": 12 + }, + "M3": { + "w": 6.0, + "l": 4.16, + "nf": 12 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 0.78, + "tol": 0.1, + "vout_test": 0.87 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 4.16, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 4.16, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 4.16, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "e624a962708bc8f8", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1.5_sL2/manifest.json new file mode 100644 index 00000000..af6b0dd4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "c27ad63da6860a4714479aacf3baa3f00f5a4581e4ea02bcdb75f57e528b51e6", + "qualification.json": "084d4f02ee733ab0888edb286eec502f9db9074da070ba0c6b6046b4f61f2c7d", + "specs.json": "629b36f865b9e7869430896a980b4a6da0b78b3c516bdf6d5037e89a22778c01", + "target.spice": "f38d72a2d497027486c6ef78801e87bfde9c76724c48a60546db5d6e8f7f96a1", + "target_lvs.spice": "d67d8160ee67f01f22d9c89b26d7a4a279b4e1fe5f6ed824478aff96cc47055d", + "testbench.spice": "56f169763c01b3fb36800967bbb46c9c4adf2dfdcce36a415e2954cc387a7dd7" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1.5_sL2/qualification.json new file mode 100644 index 00000000..b27f1158 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1.5_sL2/qualification.json @@ -0,0 +1,103 @@ +{ + "case_id": "C03_ihp130_sW1.5_sL2", + "circuit_id": "C03", + "pdk": "ihp130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 4.16, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 4.16, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 4.16, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "e624a962708bc8f8", + "mirror_pass1": { + "vmin": 0.5321486, + "status": "passed", + "vout_test": 0.87 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 0.6321 + }, + "_frozen_from": { + "schematic": { + "err": -0.0612935, + "vmin": 0.5321486 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 0.78 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 1.0, + "schematic_measures": { + "iout_t": 1.877413e-05, + "err": -0.0612935, + "vmin": 0.5321486, + "dev_at_vdd": 0.06069959, + "gout_t": 4.672538e-08, + "rout_t": 21401650.0, + "vout_test": 0.87, + "rout_nom": 21401650.0, + "ok_at_vdd": 0.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1.5_sL2/specs.json new file mode 100644 index 00000000..d021e138 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1.5_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 0.6321 + }, + "_frozen_from": { + "schematic": { + "err": -0.0612935, + "vmin": 0.5321486 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 0.78 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1.5_sL2/target.spice new file mode 100644 index 00000000..4ca000ac --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1.5_sL2/target.spice @@ -0,0 +1,5 @@ +.subckt C03_ihp130_sW1.5_sL2 VSS IIN1 IOUT1 +XM1 IIN1 Y VSS VSS sg13_lv_nmos w=6u l=4.16u ng=12 m=1 +XM2 Y Y VSS VSS sg13_lv_nmos w=6u l=4.16u ng=12 m=1 +XM3 IOUT1 IIN1 Y VSS sg13_lv_nmos w=6u l=4.16u ng=12 m=1 +.ends C03_ihp130_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1.5_sL2/target_lvs.spice new file mode 100644 index 00000000..0947dd9a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1.5_sL2/target_lvs.spice @@ -0,0 +1,38 @@ +.subckt C03_ihp130_sW1.5_sL2 VSS IIN1 IOUT1 +XM1_f0 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=4.16u +XM1_f1 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=4.16u +XM1_f2 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=4.16u +XM1_f3 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=4.16u +XM1_f4 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=4.16u +XM1_f5 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=4.16u +XM1_f6 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=4.16u +XM1_f7 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=4.16u +XM1_f8 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=4.16u +XM1_f9 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=4.16u +XM1_f10 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=4.16u +XM1_f11 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=4.16u +XM2_f0 Y Y VSS VSS sg13_lv_nmos w=0.5u l=4.16u +XM2_f1 Y Y VSS VSS sg13_lv_nmos w=0.5u l=4.16u +XM2_f2 Y Y VSS VSS sg13_lv_nmos w=0.5u l=4.16u +XM2_f3 Y Y VSS VSS sg13_lv_nmos w=0.5u l=4.16u +XM2_f4 Y Y VSS VSS sg13_lv_nmos w=0.5u l=4.16u +XM2_f5 Y Y VSS VSS sg13_lv_nmos w=0.5u l=4.16u +XM2_f6 Y Y VSS VSS sg13_lv_nmos w=0.5u l=4.16u +XM2_f7 Y Y VSS VSS sg13_lv_nmos w=0.5u l=4.16u +XM2_f8 Y Y VSS VSS sg13_lv_nmos w=0.5u l=4.16u +XM2_f9 Y Y VSS VSS sg13_lv_nmos w=0.5u l=4.16u +XM2_f10 Y Y VSS VSS sg13_lv_nmos w=0.5u l=4.16u +XM2_f11 Y Y VSS VSS sg13_lv_nmos w=0.5u l=4.16u +XM3_f0 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=4.16u +XM3_f1 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=4.16u +XM3_f2 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=4.16u +XM3_f3 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=4.16u +XM3_f4 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=4.16u +XM3_f5 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=4.16u +XM3_f6 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=4.16u +XM3_f7 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=4.16u +XM3_f8 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=4.16u +XM3_f9 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=4.16u +XM3_f10 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=4.16u +XM3_f11 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=4.16u +.ends C03_ihp130_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1.5_sL2/testbench.spice new file mode 100644 index 00000000..dae3fd4a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1.5_sL2/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IIN1 IOUT1 C03_ihp130_sW1.5_sL2 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIIN1 VDDB IIN1 2e-05 +.nodeset v(IIN1)=0.36 + +VOUT IOUT1 0 1.2 +.control +dc VOUT 1.2 0 -0.003 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=0.87 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.1 cross=last +meas dc dev_at_vdd find dev at=1.194 +let gout = deriv(iout) +meas dc gout_t find gout at=0.87 +let rout_v = 1/gout +meas dc rout_t find rout_v at=0.87 +echo vout_test = 0.87 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1_sL1.5/case.json new file mode 100644 index 00000000..bcf9d556 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1_sL1.5/case.json @@ -0,0 +1,123 @@ +{ + "case_id": "C03_ihp130_sW1_sL1.5", + "circuit_id": "C03", + "pdk": "ihp130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "dut_name": "C03_ihp130_sW1_sL1.5", + "ports": [ + "VSS", + "IIN1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 3.12, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 3.12, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 3.12, + "nf": 8 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 0.78, + "tol": 0.1, + "vout_test": 0.88 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 3.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 3.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 3.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "5b9e18c661300475", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1_sL1.5/manifest.json new file mode 100644 index 00000000..49454ae4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "af91ecc7fee452fb0da8a9d90df96bfbcfed078ef047b2fcd761a45690655e75", + "qualification.json": "4d7b13e843b296b385122588a67e61ca8a7affd65d0e039c05738047f5c4f1b3", + "specs.json": "34e24040b794c7b6f765ea45619faed8a244174a376e8a86e913f8be2fd7e810", + "target.spice": "4edfd4c61cb90f08c3bfbd68a37972689508065919bddab88a9c0d24b4b21246", + "target_lvs.spice": "1446632ac36e6b621bdbc6fc87c8066530742cd8dde57bde30f4b63e202a8d66", + "testbench.spice": "df50a19176b9a57d96545f4884b64b0ae04f02347e0d52a24a97d577b8293adb" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1_sL1.5/qualification.json new file mode 100644 index 00000000..c4dd38e7 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1_sL1.5/qualification.json @@ -0,0 +1,103 @@ +{ + "case_id": "C03_ihp130_sW1_sL1.5", + "circuit_id": "C03", + "pdk": "ihp130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 3.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 3.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 3.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "5b9e18c661300475", + "mirror_pass1": { + "vmin": 0.5642074, + "status": "passed", + "vout_test": 0.88 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 0.6642 + }, + "_frozen_from": { + "schematic": { + "err": -0.065394, + "vmin": 0.5642074 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 0.78 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.7, + "schematic_measures": { + "iout_t": 1.869212e-05, + "err": -0.065394, + "vmin": 0.5642074, + "dev_at_vdd": 0.06472306, + "gout_t": 5.646776e-08, + "rout_t": 17709660.0, + "vout_test": 0.88, + "rout_nom": 17709660.0, + "ok_at_vdd": 0.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1_sL1.5/specs.json new file mode 100644 index 00000000..489ec750 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 0.6642 + }, + "_frozen_from": { + "schematic": { + "err": -0.065394, + "vmin": 0.5642074 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 0.78 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1_sL1.5/target.spice new file mode 100644 index 00000000..411fd4b8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1_sL1.5/target.spice @@ -0,0 +1,5 @@ +.subckt C03_ihp130_sW1_sL1.5 VSS IIN1 IOUT1 +XM1 IIN1 Y VSS VSS sg13_lv_nmos w=4u l=3.12u ng=8 m=1 +XM2 Y Y VSS VSS sg13_lv_nmos w=4u l=3.12u ng=8 m=1 +XM3 IOUT1 IIN1 Y VSS sg13_lv_nmos w=4u l=3.12u ng=8 m=1 +.ends C03_ihp130_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1_sL1.5/target_lvs.spice new file mode 100644 index 00000000..ba6877d7 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1_sL1.5/target_lvs.spice @@ -0,0 +1,26 @@ +.subckt C03_ihp130_sW1_sL1.5 VSS IIN1 IOUT1 +XM1_f0 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=3.12u +XM1_f1 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=3.12u +XM1_f2 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=3.12u +XM1_f3 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=3.12u +XM1_f4 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=3.12u +XM1_f5 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=3.12u +XM1_f6 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=3.12u +XM1_f7 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=3.12u +XM2_f0 Y Y VSS VSS sg13_lv_nmos w=0.5u l=3.12u +XM2_f1 Y Y VSS VSS sg13_lv_nmos w=0.5u l=3.12u +XM2_f2 Y Y VSS VSS sg13_lv_nmos w=0.5u l=3.12u +XM2_f3 Y Y VSS VSS sg13_lv_nmos w=0.5u l=3.12u +XM2_f4 Y Y VSS VSS sg13_lv_nmos w=0.5u l=3.12u +XM2_f5 Y Y VSS VSS sg13_lv_nmos w=0.5u l=3.12u +XM2_f6 Y Y VSS VSS sg13_lv_nmos w=0.5u l=3.12u +XM2_f7 Y Y VSS VSS sg13_lv_nmos w=0.5u l=3.12u +XM3_f0 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=3.12u +XM3_f1 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=3.12u +XM3_f2 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=3.12u +XM3_f3 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=3.12u +XM3_f4 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=3.12u +XM3_f5 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=3.12u +XM3_f6 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=3.12u +XM3_f7 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=3.12u +.ends C03_ihp130_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1_sL1.5/testbench.spice new file mode 100644 index 00000000..35e90b9f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1_sL1.5/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IIN1 IOUT1 C03_ihp130_sW1_sL1.5 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIIN1 VDDB IIN1 2e-05 +.nodeset v(IIN1)=0.36 + +VOUT IOUT1 0 1.2 +.control +dc VOUT 1.2 0 -0.003 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=0.88 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.1 cross=last +meas dc dev_at_vdd find dev at=1.194 +let gout = deriv(iout) +meas dc gout_t find gout at=0.88 +let rout_v = 1/gout +meas dc rout_t find rout_v at=0.88 +echo vout_test = 0.88 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1_sL1/case.json new file mode 100644 index 00000000..a64f5c00 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1_sL1/case.json @@ -0,0 +1,123 @@ +{ + "case_id": "C03_ihp130_sW1_sL1", + "circuit_id": "C03", + "pdk": "ihp130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "dut_name": "C03_ihp130_sW1_sL1", + "ports": [ + "VSS", + "IIN1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 2.08, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 2.08, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 2.08, + "nf": 8 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 0.78, + "tol": 0.1, + "vout_test": 0.87 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 2.08, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 2.08, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 2.08, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "b5e3471e68d0d905", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1_sL1/manifest.json new file mode 100644 index 00000000..be1cc75e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "08e793653888d5a7c8d6fea9ff19e213cac7476b0f9799487e2a3a0f01c240f8", + "qualification.json": "37c6d03ab934ee70a8c66acc266be0f238fd7a0237a883cde1ac6d011aee775d", + "specs.json": "248bbb15b26a9bcbd45e264760aac66290179f4e79691520d2f3ad5302785fc1", + "target.spice": "715194768ee3dcba04667053a18682f5f7de6bac650e1d3d444490c1bf0223f0", + "target_lvs.spice": "78a4e1f6228a89468a8d7e9a382348ce7cf30b67ebc19d09bce4d4d5eb93df9f", + "testbench.spice": "1aadff21d236b1afb1c28126bca7603694de46ab9bf73e2d6337ac880eddbc55" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1_sL1/qualification.json new file mode 100644 index 00000000..5c01178f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1_sL1/qualification.json @@ -0,0 +1,103 @@ +{ + "case_id": "C03_ihp130_sW1_sL1", + "circuit_id": "C03", + "pdk": "ihp130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 2.08, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 2.08, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 2.08, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "b5e3471e68d0d905", + "mirror_pass1": { + "vmin": 0.5380896, + "status": "passed", + "vout_test": 0.87 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 0.6381 + }, + "_frozen_from": { + "schematic": { + "err": -0.081922, + "vmin": 0.5380896 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 0.78 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.7, + "schematic_measures": { + "iout_t": 1.836156e-05, + "err": -0.081922, + "vmin": 0.5380896, + "dev_at_vdd": 0.08094295, + "gout_t": 7.393831e-08, + "rout_t": 13524790.0, + "vout_test": 0.87, + "rout_nom": 13524790.0, + "ok_at_vdd": 0.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1_sL1/specs.json new file mode 100644 index 00000000..63c7eecd --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 0.6381 + }, + "_frozen_from": { + "schematic": { + "err": -0.081922, + "vmin": 0.5380896 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 0.78 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1_sL1/target.spice new file mode 100644 index 00000000..c35610f4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1_sL1/target.spice @@ -0,0 +1,5 @@ +.subckt C03_ihp130_sW1_sL1 VSS IIN1 IOUT1 +XM1 IIN1 Y VSS VSS sg13_lv_nmos w=4u l=2.08u ng=8 m=1 +XM2 Y Y VSS VSS sg13_lv_nmos w=4u l=2.08u ng=8 m=1 +XM3 IOUT1 IIN1 Y VSS sg13_lv_nmos w=4u l=2.08u ng=8 m=1 +.ends C03_ihp130_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1_sL1/target_lvs.spice new file mode 100644 index 00000000..fd57bfbf --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1_sL1/target_lvs.spice @@ -0,0 +1,26 @@ +.subckt C03_ihp130_sW1_sL1 VSS IIN1 IOUT1 +XM1_f0 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM1_f1 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM1_f2 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM1_f3 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM1_f4 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM1_f5 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM1_f6 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM1_f7 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM2_f0 Y Y VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM2_f1 Y Y VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM2_f2 Y Y VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM2_f3 Y Y VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM2_f4 Y Y VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM2_f5 Y Y VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM2_f6 Y Y VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM2_f7 Y Y VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM3_f0 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=2.08u +XM3_f1 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=2.08u +XM3_f2 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=2.08u +XM3_f3 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=2.08u +XM3_f4 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=2.08u +XM3_f5 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=2.08u +XM3_f6 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=2.08u +XM3_f7 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=2.08u +.ends C03_ihp130_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1_sL1/testbench.spice new file mode 100644 index 00000000..81a6e2b9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1_sL1/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IIN1 IOUT1 C03_ihp130_sW1_sL1 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIIN1 VDDB IIN1 2e-05 +.nodeset v(IIN1)=0.36 + +VOUT IOUT1 0 1.2 +.control +dc VOUT 1.2 0 -0.003 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=0.87 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.1 cross=last +meas dc dev_at_vdd find dev at=1.194 +let gout = deriv(iout) +meas dc gout_t find gout at=0.87 +let rout_v = 1/gout +meas dc rout_t find rout_v at=0.87 +echo vout_test = 0.87 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1_sL2/case.json new file mode 100644 index 00000000..20cf77a5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1_sL2/case.json @@ -0,0 +1,123 @@ +{ + "case_id": "C03_ihp130_sW1_sL2", + "circuit_id": "C03", + "pdk": "ihp130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "dut_name": "C03_ihp130_sW1_sL2", + "ports": [ + "VSS", + "IIN1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 4.16, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 4.16, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 4.16, + "nf": 8 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 0.78, + "tol": 0.1, + "vout_test": 0.9 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 4.16, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 4.16, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 4.16, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "b6debe16c4743f34", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1_sL2/manifest.json new file mode 100644 index 00000000..7396bc72 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "5555bd88f30983875402606fad060348a8b7422ee51aa84fe2bd710c06b9922b", + "qualification.json": "a2c433afcfdb5f396d1cd9ca24b870a6d07499c4d30644d517a650bc1a3b3477", + "specs.json": "52dd750cd8b0a492cd4b54a2c5a0a42932654900a03ce06a878c01fc4dab5c20", + "target.spice": "08155e55a716cfcee9f893744c17b7c2f34fc2429b13364f0d88a196ea3be004", + "target_lvs.spice": "70427913c089e698da490979aba45696dec2f792dd8e9a96d78ba0ce5a52ae2a", + "testbench.spice": "7cc42c4cf1fd8ec7cb0604cbab432d21a960064470946d1b3fe098fb5f48338a" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1_sL2/qualification.json new file mode 100644 index 00000000..78353c74 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1_sL2/qualification.json @@ -0,0 +1,103 @@ +{ + "case_id": "C03_ihp130_sW1_sL2", + "circuit_id": "C03", + "pdk": "ihp130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 4.16, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 4.16, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 4.16, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "b6debe16c4743f34", + "mirror_pass1": { + "vmin": 0.6032443, + "status": "passed", + "vout_test": 0.9 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 0.7032 + }, + "_frozen_from": { + "schematic": { + "err": -0.0557205, + "vmin": 0.6032443 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 0.78 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.7, + "schematic_measures": { + "iout_t": 1.888559e-05, + "err": -0.0557205, + "vmin": 0.6032443, + "dev_at_vdd": 0.05519737, + "gout_t": 6.220546e-08, + "rout_t": 16075760.0, + "vout_test": 0.9, + "rout_nom": 16075760.0, + "ok_at_vdd": 0.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1_sL2/specs.json new file mode 100644 index 00000000..58690fcd --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 0.7032 + }, + "_frozen_from": { + "schematic": { + "err": -0.0557205, + "vmin": 0.6032443 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 0.78 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1_sL2/target.spice new file mode 100644 index 00000000..4ba3bc5f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1_sL2/target.spice @@ -0,0 +1,5 @@ +.subckt C03_ihp130_sW1_sL2 VSS IIN1 IOUT1 +XM1 IIN1 Y VSS VSS sg13_lv_nmos w=4u l=4.16u ng=8 m=1 +XM2 Y Y VSS VSS sg13_lv_nmos w=4u l=4.16u ng=8 m=1 +XM3 IOUT1 IIN1 Y VSS sg13_lv_nmos w=4u l=4.16u ng=8 m=1 +.ends C03_ihp130_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1_sL2/target_lvs.spice new file mode 100644 index 00000000..3e013374 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1_sL2/target_lvs.spice @@ -0,0 +1,26 @@ +.subckt C03_ihp130_sW1_sL2 VSS IIN1 IOUT1 +XM1_f0 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=4.16u +XM1_f1 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=4.16u +XM1_f2 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=4.16u +XM1_f3 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=4.16u +XM1_f4 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=4.16u +XM1_f5 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=4.16u +XM1_f6 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=4.16u +XM1_f7 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=4.16u +XM2_f0 Y Y VSS VSS sg13_lv_nmos w=0.5u l=4.16u +XM2_f1 Y Y VSS VSS sg13_lv_nmos w=0.5u l=4.16u +XM2_f2 Y Y VSS VSS sg13_lv_nmos w=0.5u l=4.16u +XM2_f3 Y Y VSS VSS sg13_lv_nmos w=0.5u l=4.16u +XM2_f4 Y Y VSS VSS sg13_lv_nmos w=0.5u l=4.16u +XM2_f5 Y Y VSS VSS sg13_lv_nmos w=0.5u l=4.16u +XM2_f6 Y Y VSS VSS sg13_lv_nmos w=0.5u l=4.16u +XM2_f7 Y Y VSS VSS sg13_lv_nmos w=0.5u l=4.16u +XM3_f0 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=4.16u +XM3_f1 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=4.16u +XM3_f2 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=4.16u +XM3_f3 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=4.16u +XM3_f4 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=4.16u +XM3_f5 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=4.16u +XM3_f6 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=4.16u +XM3_f7 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=4.16u +.ends C03_ihp130_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1_sL2/testbench.spice new file mode 100644 index 00000000..65c3ebe0 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW1_sL2/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IIN1 IOUT1 C03_ihp130_sW1_sL2 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIIN1 VDDB IIN1 2e-05 +.nodeset v(IIN1)=0.36 + +VOUT IOUT1 0 1.2 +.control +dc VOUT 1.2 0 -0.003 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=0.9 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.1 cross=last +meas dc dev_at_vdd find dev at=1.194 +let gout = deriv(iout) +meas dc gout_t find gout at=0.9 +let rout_v = 1/gout +meas dc rout_t find rout_v at=0.9 +echo vout_test = 0.9 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW2_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW2_sL1.5/case.json new file mode 100644 index 00000000..a42958e1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW2_sL1.5/case.json @@ -0,0 +1,123 @@ +{ + "case_id": "C03_ihp130_sW2_sL1.5", + "circuit_id": "C03", + "pdk": "ihp130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "dut_name": "C03_ihp130_sW2_sL1.5", + "ports": [ + "VSS", + "IIN1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 8.0, + "l": 3.12, + "nf": 16 + }, + "M2": { + "w": 8.0, + "l": 3.12, + "nf": 16 + }, + "M3": { + "w": 8.0, + "l": 3.12, + "nf": 16 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 0.78, + "tol": 0.1, + "vout_test": 0.84 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 3.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 3.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 3.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "05c2eb893fe84728", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW2_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW2_sL1.5/manifest.json new file mode 100644 index 00000000..ca231d37 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW2_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "0b9317f30134e9a70d4f015ea53e6b738623ed0d26e81ab00bf751faff15a1ca", + "qualification.json": "38e81f1c2c9f24477dbff5b4f33ec0e1b162d1e141aa56e089f432995a109c45", + "specs.json": "17afb5b4d622c8511cbe2f0c272bf3d672022a8d3ce979c8580097ed427b63c5", + "target.spice": "bb625d3b84d7f5374e8ff8c47d7ce153640aa716b4003de4c9352d10fd7487d0", + "target_lvs.spice": "a5548953ec4825e7b9bab92d47ba4f2fe850bb5349ea3184ea17ccf15983f3d5", + "testbench.spice": "acb614af754d921865732840811fa383b36f4435b07c71478978cfdff736179c" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW2_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW2_sL1.5/qualification.json new file mode 100644 index 00000000..54129156 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW2_sL1.5/qualification.json @@ -0,0 +1,103 @@ +{ + "case_id": "C03_ihp130_sW2_sL1.5", + "circuit_id": "C03", + "pdk": "ihp130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 3.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 3.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 3.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "05c2eb893fe84728", + "mirror_pass1": { + "vmin": 0.4735241, + "status": "passed", + "vout_test": 0.84 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 0.5735 + }, + "_frozen_from": { + "schematic": { + "err": -0.076829, + "vmin": 0.4735241 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 0.78 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 1.3, + "schematic_measures": { + "iout_t": 1.846342e-05, + "err": -0.076829, + "vmin": 0.4735241, + "dev_at_vdd": 0.0759008, + "gout_t": 6.412233e-08, + "rout_t": 15595190.0, + "vout_test": 0.84, + "rout_nom": 15595190.0, + "ok_at_vdd": 0.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW2_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW2_sL1.5/specs.json new file mode 100644 index 00000000..7b787199 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW2_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 0.5735 + }, + "_frozen_from": { + "schematic": { + "err": -0.076829, + "vmin": 0.4735241 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 0.78 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW2_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW2_sL1.5/target.spice new file mode 100644 index 00000000..f5a80edf --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW2_sL1.5/target.spice @@ -0,0 +1,5 @@ +.subckt C03_ihp130_sW2_sL1.5 VSS IIN1 IOUT1 +XM1 IIN1 Y VSS VSS sg13_lv_nmos w=8u l=3.12u ng=16 m=1 +XM2 Y Y VSS VSS sg13_lv_nmos w=8u l=3.12u ng=16 m=1 +XM3 IOUT1 IIN1 Y VSS sg13_lv_nmos w=8u l=3.12u ng=16 m=1 +.ends C03_ihp130_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW2_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW2_sL1.5/target_lvs.spice new file mode 100644 index 00000000..ca5fca88 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW2_sL1.5/target_lvs.spice @@ -0,0 +1,50 @@ +.subckt C03_ihp130_sW2_sL1.5 VSS IIN1 IOUT1 +XM1_f0 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=3.12u +XM1_f1 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=3.12u +XM1_f2 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=3.12u +XM1_f3 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=3.12u +XM1_f4 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=3.12u +XM1_f5 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=3.12u +XM1_f6 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=3.12u +XM1_f7 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=3.12u +XM1_f8 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=3.12u +XM1_f9 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=3.12u +XM1_f10 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=3.12u +XM1_f11 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=3.12u +XM1_f12 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=3.12u +XM1_f13 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=3.12u +XM1_f14 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=3.12u +XM1_f15 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=3.12u +XM2_f0 Y Y VSS VSS sg13_lv_nmos w=0.5u l=3.12u +XM2_f1 Y Y VSS VSS sg13_lv_nmos w=0.5u l=3.12u +XM2_f2 Y Y VSS VSS sg13_lv_nmos w=0.5u l=3.12u +XM2_f3 Y Y VSS VSS sg13_lv_nmos w=0.5u l=3.12u +XM2_f4 Y Y VSS VSS sg13_lv_nmos w=0.5u l=3.12u +XM2_f5 Y Y VSS VSS sg13_lv_nmos w=0.5u l=3.12u +XM2_f6 Y Y VSS VSS sg13_lv_nmos w=0.5u l=3.12u +XM2_f7 Y Y VSS VSS sg13_lv_nmos w=0.5u l=3.12u +XM2_f8 Y Y VSS VSS sg13_lv_nmos w=0.5u l=3.12u +XM2_f9 Y Y VSS VSS sg13_lv_nmos w=0.5u l=3.12u +XM2_f10 Y Y VSS VSS sg13_lv_nmos w=0.5u l=3.12u +XM2_f11 Y Y VSS VSS sg13_lv_nmos w=0.5u l=3.12u +XM2_f12 Y Y VSS VSS sg13_lv_nmos w=0.5u l=3.12u +XM2_f13 Y Y VSS VSS sg13_lv_nmos w=0.5u l=3.12u +XM2_f14 Y Y VSS VSS sg13_lv_nmos w=0.5u l=3.12u +XM2_f15 Y Y VSS VSS sg13_lv_nmos w=0.5u l=3.12u +XM3_f0 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=3.12u +XM3_f1 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=3.12u +XM3_f2 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=3.12u +XM3_f3 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=3.12u +XM3_f4 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=3.12u +XM3_f5 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=3.12u +XM3_f6 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=3.12u +XM3_f7 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=3.12u +XM3_f8 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=3.12u +XM3_f9 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=3.12u +XM3_f10 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=3.12u +XM3_f11 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=3.12u +XM3_f12 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=3.12u +XM3_f13 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=3.12u +XM3_f14 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=3.12u +XM3_f15 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=3.12u +.ends C03_ihp130_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW2_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW2_sL1.5/testbench.spice new file mode 100644 index 00000000..39d0af5c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW2_sL1.5/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IIN1 IOUT1 C03_ihp130_sW2_sL1.5 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIIN1 VDDB IIN1 2e-05 +.nodeset v(IIN1)=0.36 + +VOUT IOUT1 0 1.2 +.control +dc VOUT 1.2 0 -0.003 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=0.84 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.1 cross=last +meas dc dev_at_vdd find dev at=1.194 +let gout = deriv(iout) +meas dc gout_t find gout at=0.84 +let rout_v = 1/gout +meas dc rout_t find rout_v at=0.84 +echo vout_test = 0.84 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW2_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW2_sL1/case.json new file mode 100644 index 00000000..27a5d8bf --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW2_sL1/case.json @@ -0,0 +1,123 @@ +{ + "case_id": "C03_ihp130_sW2_sL1", + "circuit_id": "C03", + "pdk": "ihp130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "dut_name": "C03_ihp130_sW2_sL1", + "ports": [ + "VSS", + "IIN1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 8.0, + "l": 2.08, + "nf": 16 + }, + "M2": { + "w": 8.0, + "l": 2.08, + "nf": 16 + }, + "M3": { + "w": 8.0, + "l": 2.08, + "nf": 16 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 0.78, + "tol": 0.1, + "vout_test": 0.85 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 2.08, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 2.08, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 2.08, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "2d4e356bd97263f8", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW2_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW2_sL1/manifest.json new file mode 100644 index 00000000..dcf66b89 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW2_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "4d06a0d5dca3a3f1dfe69b1b7f247dc1da9cda1e448baae3fda08e474234cb86", + "qualification.json": "d50a5287c9db52161f06142aa60e0930d00fd12150ca203d1c27991e726ece04", + "specs.json": "d02e202bd88282eb6a2b5751728138fa246ebc31f379c0f932751d26a4d8dc5f", + "target.spice": "d980910653e2a9fd5b7bd11ddd7dd06c99fbff159d09eff65e0eab96871d648f", + "target_lvs.spice": "c3e34d435c013d50b13bcd5407e19a9f7ad25ed351038709b8edd8a7762bdf4a", + "testbench.spice": "0eb9215cf85ee68d8146837e406aae25fb3f12288f75dc8372ae86c3d7c2b86f" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW2_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW2_sL1/qualification.json new file mode 100644 index 00000000..bb0de4b0 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW2_sL1/qualification.json @@ -0,0 +1,103 @@ +{ + "case_id": "C03_ihp130_sW2_sL1", + "circuit_id": "C03", + "pdk": "ihp130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 2.08, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 2.08, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 2.08, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "2d4e356bd97263f8", + "mirror_pass1": { + "vmin": 0.5092047, + "status": "passed", + "vout_test": 0.85 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 0.6092 + }, + "_frozen_from": { + "schematic": { + "err": -0.0958015, + "vmin": 0.5092047 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 0.78 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 1.3, + "schematic_measures": { + "iout_t": 1.808397e-05, + "err": -0.0958015, + "vmin": 0.5092047, + "dev_at_vdd": 0.09448254, + "gout_t": 9.114522e-08, + "rout_t": 10971530.0, + "vout_test": 0.85, + "rout_nom": 10971530.0, + "ok_at_vdd": 0.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW2_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW2_sL1/specs.json new file mode 100644 index 00000000..e0bd4a25 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW2_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 0.6092 + }, + "_frozen_from": { + "schematic": { + "err": -0.0958015, + "vmin": 0.5092047 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 0.78 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW2_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW2_sL1/target.spice new file mode 100644 index 00000000..ddf12e86 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW2_sL1/target.spice @@ -0,0 +1,5 @@ +.subckt C03_ihp130_sW2_sL1 VSS IIN1 IOUT1 +XM1 IIN1 Y VSS VSS sg13_lv_nmos w=8u l=2.08u ng=16 m=1 +XM2 Y Y VSS VSS sg13_lv_nmos w=8u l=2.08u ng=16 m=1 +XM3 IOUT1 IIN1 Y VSS sg13_lv_nmos w=8u l=2.08u ng=16 m=1 +.ends C03_ihp130_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW2_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW2_sL1/target_lvs.spice new file mode 100644 index 00000000..f14ad866 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW2_sL1/target_lvs.spice @@ -0,0 +1,50 @@ +.subckt C03_ihp130_sW2_sL1 VSS IIN1 IOUT1 +XM1_f0 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM1_f1 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM1_f2 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM1_f3 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM1_f4 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM1_f5 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM1_f6 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM1_f7 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM1_f8 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM1_f9 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM1_f10 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM1_f11 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM1_f12 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM1_f13 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM1_f14 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM1_f15 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM2_f0 Y Y VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM2_f1 Y Y VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM2_f2 Y Y VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM2_f3 Y Y VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM2_f4 Y Y VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM2_f5 Y Y VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM2_f6 Y Y VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM2_f7 Y Y VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM2_f8 Y Y VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM2_f9 Y Y VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM2_f10 Y Y VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM2_f11 Y Y VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM2_f12 Y Y VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM2_f13 Y Y VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM2_f14 Y Y VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM2_f15 Y Y VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM3_f0 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=2.08u +XM3_f1 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=2.08u +XM3_f2 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=2.08u +XM3_f3 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=2.08u +XM3_f4 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=2.08u +XM3_f5 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=2.08u +XM3_f6 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=2.08u +XM3_f7 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=2.08u +XM3_f8 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=2.08u +XM3_f9 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=2.08u +XM3_f10 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=2.08u +XM3_f11 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=2.08u +XM3_f12 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=2.08u +XM3_f13 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=2.08u +XM3_f14 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=2.08u +XM3_f15 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=2.08u +.ends C03_ihp130_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW2_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW2_sL1/testbench.spice new file mode 100644 index 00000000..74a83708 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW2_sL1/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IIN1 IOUT1 C03_ihp130_sW2_sL1 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIIN1 VDDB IIN1 2e-05 +.nodeset v(IIN1)=0.36 + +VOUT IOUT1 0 1.2 +.control +dc VOUT 1.2 0 -0.003 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=0.85 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.1 cross=last +meas dc dev_at_vdd find dev at=1.194 +let gout = deriv(iout) +meas dc gout_t find gout at=0.85 +let rout_v = 1/gout +meas dc rout_t find rout_v at=0.85 +echo vout_test = 0.85 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW2_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW2_sL2/case.json new file mode 100644 index 00000000..1a5d71e0 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW2_sL2/case.json @@ -0,0 +1,123 @@ +{ + "case_id": "C03_ihp130_sW2_sL2", + "circuit_id": "C03", + "pdk": "ihp130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "dut_name": "C03_ihp130_sW2_sL2", + "ports": [ + "VSS", + "IIN1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 8.0, + "l": 4.16, + "nf": 16 + }, + "M2": { + "w": 8.0, + "l": 4.16, + "nf": 16 + }, + "M3": { + "w": 8.0, + "l": 4.16, + "nf": 16 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 0.78, + "tol": 0.1, + "vout_test": 0.85 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 4.16, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 4.16, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 4.16, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "74f359119e81f700", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW2_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW2_sL2/manifest.json new file mode 100644 index 00000000..3ff1b6b6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW2_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "4d239bf8265214c4ad25bff888ec81a840e4d12fcd3e133ea1bdbc6de745fe18", + "qualification.json": "446a7032423e206b616d1250fd1b2914f5e16e584b645d9fe1e69ae70030cda7", + "specs.json": "a866458bf3878eeb60e4e3c3a2cfb29f3b9cd37319d21e66748c468ba989efc5", + "target.spice": "75c94a02b9ce2c5898f908d6c0243d36cc165b9026a78e04e72bcb1f1d6279db", + "target_lvs.spice": "14f69b9e8330e66be5c5aeec0cbf64b69cf69ea7a4a93075820d67ad9996ab8f", + "testbench.spice": "73c060e6403063d4ad2b76bdf670afda895bb5b3008e7f62b789c64df23b40ac" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW2_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW2_sL2/qualification.json new file mode 100644 index 00000000..78cc16c5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW2_sL2/qualification.json @@ -0,0 +1,103 @@ +{ + "case_id": "C03_ihp130_sW2_sL2", + "circuit_id": "C03", + "pdk": "ihp130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 4.16, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 4.16, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 4.16, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "74f359119e81f700", + "mirror_pass1": { + "vmin": 0.4913955, + "status": "passed", + "vout_test": 0.85 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 0.5914 + }, + "_frozen_from": { + "schematic": { + "err": -0.0655975, + "vmin": 0.4913955 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 0.78 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 1.5, + "schematic_measures": { + "iout_t": 1.868805e-05, + "err": -0.0655975, + "vmin": 0.4913955, + "dev_at_vdd": 0.06490927, + "gout_t": 4.967715e-08, + "rout_t": 20130090.0, + "vout_test": 0.85, + "rout_nom": 20130090.0, + "ok_at_vdd": 0.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW2_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW2_sL2/specs.json new file mode 100644 index 00000000..fdad4c57 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW2_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 0.5914 + }, + "_frozen_from": { + "schematic": { + "err": -0.0655975, + "vmin": 0.4913955 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 0.78 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW2_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW2_sL2/target.spice new file mode 100644 index 00000000..1b4328ec --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW2_sL2/target.spice @@ -0,0 +1,5 @@ +.subckt C03_ihp130_sW2_sL2 VSS IIN1 IOUT1 +XM1 IIN1 Y VSS VSS sg13_lv_nmos w=8u l=4.16u ng=16 m=1 +XM2 Y Y VSS VSS sg13_lv_nmos w=8u l=4.16u ng=16 m=1 +XM3 IOUT1 IIN1 Y VSS sg13_lv_nmos w=8u l=4.16u ng=16 m=1 +.ends C03_ihp130_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW2_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW2_sL2/target_lvs.spice new file mode 100644 index 00000000..416a3389 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW2_sL2/target_lvs.spice @@ -0,0 +1,50 @@ +.subckt C03_ihp130_sW2_sL2 VSS IIN1 IOUT1 +XM1_f0 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=4.16u +XM1_f1 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=4.16u +XM1_f2 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=4.16u +XM1_f3 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=4.16u +XM1_f4 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=4.16u +XM1_f5 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=4.16u +XM1_f6 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=4.16u +XM1_f7 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=4.16u +XM1_f8 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=4.16u +XM1_f9 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=4.16u +XM1_f10 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=4.16u +XM1_f11 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=4.16u +XM1_f12 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=4.16u +XM1_f13 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=4.16u +XM1_f14 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=4.16u +XM1_f15 IIN1 Y VSS VSS sg13_lv_nmos w=0.5u l=4.16u +XM2_f0 Y Y VSS VSS sg13_lv_nmos w=0.5u l=4.16u +XM2_f1 Y Y VSS VSS sg13_lv_nmos w=0.5u l=4.16u +XM2_f2 Y Y VSS VSS sg13_lv_nmos w=0.5u l=4.16u +XM2_f3 Y Y VSS VSS sg13_lv_nmos w=0.5u l=4.16u +XM2_f4 Y Y VSS VSS sg13_lv_nmos w=0.5u l=4.16u +XM2_f5 Y Y VSS VSS sg13_lv_nmos w=0.5u l=4.16u +XM2_f6 Y Y VSS VSS sg13_lv_nmos w=0.5u l=4.16u +XM2_f7 Y Y VSS VSS sg13_lv_nmos w=0.5u l=4.16u +XM2_f8 Y Y VSS VSS sg13_lv_nmos w=0.5u l=4.16u +XM2_f9 Y Y VSS VSS sg13_lv_nmos w=0.5u l=4.16u +XM2_f10 Y Y VSS VSS sg13_lv_nmos w=0.5u l=4.16u +XM2_f11 Y Y VSS VSS sg13_lv_nmos w=0.5u l=4.16u +XM2_f12 Y Y VSS VSS sg13_lv_nmos w=0.5u l=4.16u +XM2_f13 Y Y VSS VSS sg13_lv_nmos w=0.5u l=4.16u +XM2_f14 Y Y VSS VSS sg13_lv_nmos w=0.5u l=4.16u +XM2_f15 Y Y VSS VSS sg13_lv_nmos w=0.5u l=4.16u +XM3_f0 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=4.16u +XM3_f1 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=4.16u +XM3_f2 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=4.16u +XM3_f3 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=4.16u +XM3_f4 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=4.16u +XM3_f5 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=4.16u +XM3_f6 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=4.16u +XM3_f7 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=4.16u +XM3_f8 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=4.16u +XM3_f9 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=4.16u +XM3_f10 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=4.16u +XM3_f11 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=4.16u +XM3_f12 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=4.16u +XM3_f13 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=4.16u +XM3_f14 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=4.16u +XM3_f15 IOUT1 IIN1 Y VSS sg13_lv_nmos w=0.5u l=4.16u +.ends C03_ihp130_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW2_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW2_sL2/testbench.spice new file mode 100644 index 00000000..61b4cf6e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/ihp130/sW2_sL2/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IIN1 IOUT1 C03_ihp130_sW2_sL2 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIIN1 VDDB IIN1 2e-05 +.nodeset v(IIN1)=0.36 + +VOUT IOUT1 0 1.2 +.control +dc VOUT 1.2 0 -0.003 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=0.85 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.1 cross=last +meas dc dev_at_vdd find dev at=1.194 +let gout = deriv(iout) +meas dc gout_t find gout at=0.85 +let rout_v = 1/gout +meas dc rout_t find rout_v at=0.85 +echo vout_test = 0.85 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C03/sky130/sW0.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW0.5_sL1.5/case.json new file mode 100644 index 00000000..31f9a391 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW0.5_sL1.5/case.json @@ -0,0 +1,123 @@ +{ + "case_id": "C03_sky130_sW0.5_sL1.5", + "circuit_id": "C03", + "pdk": "sky130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "dut_name": "C03_sky130_sW0.5_sL1.5", + "ports": [ + "VSS", + "IIN1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 1.8, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 1.8, + "nf": 4 + }, + "M3": { + "w": 2.0, + "l": 1.8, + "nf": 4 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 1.1700000000000002, + "tol": 0.1, + "vout_test": 1.41 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.8, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.8, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.8, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "a82dc8d176e418ba", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/sky130/sW0.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW0.5_sL1.5/manifest.json new file mode 100644 index 00000000..3d1c2075 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW0.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "a944a6146519be779e994543a365de55aa2fdb18dffd6c0361b886469e7b2547", + "qualification.json": "163ec642026ccd4c99f6cbe9a451e2daedad54372adf1680c4b3be5b231467bb", + "specs.json": "b0577aef81a780311cbf517272412703b364bb496ea1dd25365cb3281cda704e", + "target.spice": "d29e524cb509e68348db9a5631c3740f29ecc6dff084f32b63e32ea857ebacc1", + "target_lvs.spice": "de54920167c550749b7a538b75d0e8d3049550ec40492bf0ea7f02e6296eba8d", + "testbench.spice": "ffa140d442dc3e8408c8cdb9d3cb3f3ea73446f3656c42feb7c03fbb090dea51" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/sky130/sW0.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW0.5_sL1.5/qualification.json new file mode 100644 index 00000000..041fae8d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW0.5_sL1.5/qualification.json @@ -0,0 +1,103 @@ +{ + "case_id": "C03_sky130_sW0.5_sL1.5", + "circuit_id": "C03", + "pdk": "sky130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.8, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.8, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.8, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "a82dc8d176e418ba", + "mirror_pass1": { + "vmin": 1.018252, + "status": "passed", + "vout_test": 1.41 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 1.118 + }, + "_frozen_from": { + "schematic": { + "err": -0.053443, + "vmin": 1.018252 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 1.1700000000000002 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 20.8, + "schematic_measures": { + "iout_t": 1.893114e-05, + "err": -0.053443, + "vmin": 1.018252, + "dev_at_vdd": 0.05303414, + "gout_t": 4.862011e-08, + "rout_t": 20575750.0, + "vout_test": 1.41, + "rout_nom": 20575750.0, + "ok_at_vdd": 0.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/sky130/sW0.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW0.5_sL1.5/specs.json new file mode 100644 index 00000000..693c8e33 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW0.5_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 1.118 + }, + "_frozen_from": { + "schematic": { + "err": -0.053443, + "vmin": 1.018252 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 1.1700000000000002 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/sky130/sW0.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW0.5_sL1.5/target.spice new file mode 100644 index 00000000..cf09182f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW0.5_sL1.5/target.spice @@ -0,0 +1,5 @@ +.subckt C03_sky130_sW0.5_sL1.5 VSS IIN1 IOUT1 +XM1 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=2 l=1.8 nf=4 +XM2 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=2 l=1.8 nf=4 +XM3 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=2 l=1.8 nf=4 +.ends C03_sky130_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C03/sky130/sW0.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW0.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..25d228a9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW0.5_sL1.5/target_lvs.spice @@ -0,0 +1,14 @@ +.subckt C03_sky130_sW0.5_sL1.5 VSS IIN1 IOUT1 +XM1_f0 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM1_f1 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM1_f2 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM1_f3 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM2_f0 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM2_f1 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM2_f2 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM2_f3 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM3_f0 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM3_f1 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM3_f2 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM3_f3 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +.ends C03_sky130_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C03/sky130/sW0.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW0.5_sL1.5/testbench.spice new file mode 100644 index 00000000..cbb13103 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW0.5_sL1.5/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IIN1 IOUT1 C03_sky130_sW0.5_sL1.5 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIIN1 VDDB IIN1 2e-05 +.nodeset v(IIN1)=0.54 + +VOUT IOUT1 0 1.8 +.control +dc VOUT 1.8 0 -0.0045 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=1.41 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.1 cross=last +meas dc dev_at_vdd find dev at=1.791 +let gout = deriv(iout) +meas dc gout_t find gout at=1.41 +let rout_v = 1/gout +meas dc rout_t find rout_v at=1.41 +echo vout_test = 1.41 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C03/sky130/sW0.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW0.5_sL1/case.json new file mode 100644 index 00000000..c97f246e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW0.5_sL1/case.json @@ -0,0 +1,123 @@ +{ + "case_id": "C03_sky130_sW0.5_sL1", + "circuit_id": "C03", + "pdk": "sky130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "dut_name": "C03_sky130_sW0.5_sL1", + "ports": [ + "VSS", + "IIN1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 1.2, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 1.2, + "nf": 4 + }, + "M3": { + "w": 2.0, + "l": 1.2, + "nf": 4 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 1.1700000000000002, + "tol": 0.1, + "vout_test": 1.37 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.2, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.2, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.2, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "284a079fce6f5248", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/sky130/sW0.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW0.5_sL1/manifest.json new file mode 100644 index 00000000..2b0050e5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW0.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "7f242addf363ea5d0b0f0ed8b574584ec56ed81c00387c1ce6be62a92815de4d", + "qualification.json": "6386d8169056ab93995e3a679c39043b70bb82500a84202bf44a28222942e23c", + "specs.json": "46c814c62837b2ec6854453e05a3f70177214f7e033fdb8865d8070a5837488c", + "target.spice": "e1fc5c6866029fdb3360dfcdf1619987f52d06b092f5324647ee52d7c364cbf7", + "target_lvs.spice": "07764facb1fbc9510ed4a1dddf1e1973e3fecbe585dcdb9398259c684f2979ed", + "testbench.spice": "ec45df741ad092f2c901ac1e439fc272eaf804e3166438e253d3533584af4bee" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/sky130/sW0.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW0.5_sL1/qualification.json new file mode 100644 index 00000000..361b7d53 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW0.5_sL1/qualification.json @@ -0,0 +1,103 @@ +{ + "case_id": "C03_sky130_sW0.5_sL1", + "circuit_id": "C03", + "pdk": "sky130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.2, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.2, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.2, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "284a079fce6f5248", + "mirror_pass1": { + "vmin": 0.944352, + "status": "passed", + "vout_test": 1.37 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 1.044 + }, + "_frozen_from": { + "schematic": { + "err": -0.0576435, + "vmin": 0.944352 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 1.1700000000000002 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 19.2, + "schematic_measures": { + "iout_t": 1.884713e-05, + "err": -0.0576435, + "vmin": 0.944352, + "dev_at_vdd": 0.05727683, + "gout_t": 2.995324e-08, + "rout_t": 33389350.0, + "vout_test": 1.37, + "rout_nom": 33389350.0, + "ok_at_vdd": 0.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/sky130/sW0.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW0.5_sL1/specs.json new file mode 100644 index 00000000..17c35670 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW0.5_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 1.044 + }, + "_frozen_from": { + "schematic": { + "err": -0.0576435, + "vmin": 0.944352 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 1.1700000000000002 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/sky130/sW0.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW0.5_sL1/target.spice new file mode 100644 index 00000000..51dbac8b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW0.5_sL1/target.spice @@ -0,0 +1,5 @@ +.subckt C03_sky130_sW0.5_sL1 VSS IIN1 IOUT1 +XM1 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=2 l=1.2 nf=4 +XM2 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=2 l=1.2 nf=4 +XM3 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=2 l=1.2 nf=4 +.ends C03_sky130_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C03/sky130/sW0.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW0.5_sL1/target_lvs.spice new file mode 100644 index 00000000..42f0adc7 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW0.5_sL1/target_lvs.spice @@ -0,0 +1,14 @@ +.subckt C03_sky130_sW0.5_sL1 VSS IIN1 IOUT1 +XM1_f0 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM1_f1 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM1_f2 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM1_f3 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM2_f0 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM2_f1 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM2_f2 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM2_f3 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM3_f0 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM3_f1 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM3_f2 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM3_f3 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +.ends C03_sky130_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C03/sky130/sW0.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW0.5_sL1/testbench.spice new file mode 100644 index 00000000..992087af --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW0.5_sL1/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IIN1 IOUT1 C03_sky130_sW0.5_sL1 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIIN1 VDDB IIN1 2e-05 +.nodeset v(IIN1)=0.54 + +VOUT IOUT1 0 1.8 +.control +dc VOUT 1.8 0 -0.0045 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=1.37 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.1 cross=last +meas dc dev_at_vdd find dev at=1.791 +let gout = deriv(iout) +meas dc gout_t find gout at=1.37 +let rout_v = 1/gout +meas dc rout_t find rout_v at=1.37 +echo vout_test = 1.37 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C03/sky130/sW0.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW0.5_sL2/case.json new file mode 100644 index 00000000..84d705d0 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW0.5_sL2/case.json @@ -0,0 +1,123 @@ +{ + "case_id": "C03_sky130_sW0.5_sL2", + "circuit_id": "C03", + "pdk": "sky130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "dut_name": "C03_sky130_sW0.5_sL2", + "ports": [ + "VSS", + "IIN1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 2.4, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 2.4, + "nf": 4 + }, + "M3": { + "w": 2.0, + "l": 2.4, + "nf": 4 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 1.1700000000000002, + "tol": 0.1, + "vout_test": 1.45 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 2.4, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 2.4, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 2.4, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "5f86b0c35341a71a", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/sky130/sW0.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW0.5_sL2/manifest.json new file mode 100644 index 00000000..1296f1f5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW0.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "a5050966cc653eb82b5a81a50e4e3c1252f34410056d4ecd63822d09cfbb68eb", + "qualification.json": "866d1e49e1e3d7b2f02031cbbadc51bd2cd2ae3f23095d87e8b04fc6291967c7", + "specs.json": "cb07d13726fc8e9e842c2fb52af2457624067beb7121fabc70d4afda18f0a9ae", + "target.spice": "5c950d96ff9e7a4563dd7647aba9a06a174b7dc9c35878efe2d45b21d5ce99a0", + "target_lvs.spice": "fb4945008aee77920d8f66fa1dd857d1cf9cf44dd3cd3c66df3899c19e06c309", + "testbench.spice": "466380a2bf498ac4d735868d276f79281d87d24cd90a13c64626c79b4cdae539" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/sky130/sW0.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW0.5_sL2/qualification.json new file mode 100644 index 00000000..cc242b45 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW0.5_sL2/qualification.json @@ -0,0 +1,103 @@ +{ + "case_id": "C03_sky130_sW0.5_sL2", + "circuit_id": "C03", + "pdk": "sky130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 2.4, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 2.4, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 2.4, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "5f86b0c35341a71a", + "mirror_pass1": { + "vmin": 1.092726, + "status": "passed", + "vout_test": 1.45 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 1.17 + }, + "_frozen_from": { + "schematic": { + "err": -0.0451645, + "vmin": 1.092726 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 1.1700000000000002 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 19.5, + "schematic_measures": { + "iout_t": 1.909671e-05, + "err": -0.0451645, + "vmin": 1.092726, + "dev_at_vdd": 0.04462777, + "gout_t": 1.082491e-07, + "rout_t": 9243799.0, + "vout_test": 1.45, + "rout_nom": 9243799.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/sky130/sW0.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW0.5_sL2/specs.json new file mode 100644 index 00000000..9008e944 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW0.5_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 1.17 + }, + "_frozen_from": { + "schematic": { + "err": -0.0451645, + "vmin": 1.092726 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 1.1700000000000002 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/sky130/sW0.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW0.5_sL2/target.spice new file mode 100644 index 00000000..fcdc7d87 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW0.5_sL2/target.spice @@ -0,0 +1,5 @@ +.subckt C03_sky130_sW0.5_sL2 VSS IIN1 IOUT1 +XM1 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=2 l=2.4 nf=4 +XM2 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=2 l=2.4 nf=4 +XM3 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=2 l=2.4 nf=4 +.ends C03_sky130_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C03/sky130/sW0.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW0.5_sL2/target_lvs.spice new file mode 100644 index 00000000..98adf80f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW0.5_sL2/target_lvs.spice @@ -0,0 +1,14 @@ +.subckt C03_sky130_sW0.5_sL2 VSS IIN1 IOUT1 +XM1_f0 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM1_f1 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM1_f2 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM1_f3 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM2_f0 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM2_f1 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM2_f2 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM2_f3 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM3_f0 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM3_f1 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM3_f2 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM3_f3 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +.ends C03_sky130_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C03/sky130/sW0.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW0.5_sL2/testbench.spice new file mode 100644 index 00000000..42a2f2da --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW0.5_sL2/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IIN1 IOUT1 C03_sky130_sW0.5_sL2 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIIN1 VDDB IIN1 2e-05 +.nodeset v(IIN1)=0.54 + +VOUT IOUT1 0 1.8 +.control +dc VOUT 1.8 0 -0.0045 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=1.45 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.1 cross=last +meas dc dev_at_vdd find dev at=1.791 +let gout = deriv(iout) +meas dc gout_t find gout at=1.45 +let rout_v = 1/gout +meas dc rout_t find rout_v at=1.45 +echo vout_test = 1.45 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1.5_sL1.5/case.json new file mode 100644 index 00000000..fdc0a3fa --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1.5_sL1.5/case.json @@ -0,0 +1,123 @@ +{ + "case_id": "C03_sky130_sW1.5_sL1.5", + "circuit_id": "C03", + "pdk": "sky130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "dut_name": "C03_sky130_sW1.5_sL1.5", + "ports": [ + "VSS", + "IIN1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 6.0, + "l": 1.8, + "nf": 12 + }, + "M2": { + "w": 6.0, + "l": 1.8, + "nf": 12 + }, + "M3": { + "w": 6.0, + "l": 1.8, + "nf": 12 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 1.1700000000000002, + "tol": 0.1, + "vout_test": 1.31 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.8, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.8, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.8, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "ad62c7bd943afc81", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1.5_sL1.5/manifest.json new file mode 100644 index 00000000..162296ef --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "823096b9542926720bfd7ffb033571fc77c48dd0c95ee46ab28f47580e97709f", + "qualification.json": "df8fd1847b48113b7bc916cbff55ab1764620046b48ba950e69ff506114d2ed2", + "specs.json": "4453d0567a4999c3acf0d0893d89fc9889b4eaff4451d3741b3734fc4764115f", + "target.spice": "3d17a5413c401a66f7a17ea2c45cfd6a7c5e2053410a177b3d5937a5b35b19aa", + "target_lvs.spice": "2a3f9e15e812a133c74569709c1e892a89aa81bcd5d22607f2386ab1db2e858b", + "testbench.spice": "00e26b190ce71ba7c2f9fcae0f41b03599e80be500faf9e16a8819dc8ed79b86" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1.5_sL1.5/qualification.json new file mode 100644 index 00000000..9550a8f9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1.5_sL1.5/qualification.json @@ -0,0 +1,103 @@ +{ + "case_id": "C03_sky130_sW1.5_sL1.5", + "circuit_id": "C03", + "pdk": "sky130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.8, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.8, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.8, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "ad62c7bd943afc81", + "mirror_pass1": { + "vmin": 0.8145786, + "status": "passed", + "vout_test": 1.31 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 0.9146 + }, + "_frozen_from": { + "schematic": { + "err": -0.064108, + "vmin": 0.8145786 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 1.1700000000000002 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 12.4, + "schematic_measures": { + "iout_t": 1.871784e-05, + "err": -0.064108, + "vmin": 0.8145786, + "dev_at_vdd": 0.06380109, + "gout_t": 1.627051e-08, + "rout_t": 61461280.0, + "vout_test": 1.31, + "rout_nom": 61461280.0, + "ok_at_vdd": 0.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1.5_sL1.5/specs.json new file mode 100644 index 00000000..9093ef5d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1.5_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 0.9146 + }, + "_frozen_from": { + "schematic": { + "err": -0.064108, + "vmin": 0.8145786 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 1.1700000000000002 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1.5_sL1.5/target.spice new file mode 100644 index 00000000..0f6c9d46 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1.5_sL1.5/target.spice @@ -0,0 +1,5 @@ +.subckt C03_sky130_sW1.5_sL1.5 VSS IIN1 IOUT1 +XM1 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=6 l=1.8 nf=12 +XM2 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=6 l=1.8 nf=12 +XM3 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=6 l=1.8 nf=12 +.ends C03_sky130_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..1a03e5f1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1.5_sL1.5/target_lvs.spice @@ -0,0 +1,38 @@ +.subckt C03_sky130_sW1.5_sL1.5 VSS IIN1 IOUT1 +XM1_f0 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM1_f1 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM1_f2 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM1_f3 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM1_f4 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM1_f5 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM1_f6 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM1_f7 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM1_f8 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM1_f9 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM1_f10 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM1_f11 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM2_f0 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM2_f1 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM2_f2 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM2_f3 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM2_f4 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM2_f5 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM2_f6 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM2_f7 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM2_f8 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM2_f9 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM2_f10 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM2_f11 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM3_f0 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM3_f1 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM3_f2 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM3_f3 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM3_f4 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM3_f5 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM3_f6 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM3_f7 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM3_f8 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM3_f9 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM3_f10 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM3_f11 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +.ends C03_sky130_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1.5_sL1.5/testbench.spice new file mode 100644 index 00000000..1caece8a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1.5_sL1.5/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IIN1 IOUT1 C03_sky130_sW1.5_sL1.5 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIIN1 VDDB IIN1 2e-05 +.nodeset v(IIN1)=0.54 + +VOUT IOUT1 0 1.8 +.control +dc VOUT 1.8 0 -0.0045 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=1.31 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.1 cross=last +meas dc dev_at_vdd find dev at=1.791 +let gout = deriv(iout) +meas dc gout_t find gout at=1.31 +let rout_v = 1/gout +meas dc rout_t find rout_v at=1.31 +echo vout_test = 1.31 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1.5_sL1/case.json new file mode 100644 index 00000000..e3929e79 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1.5_sL1/case.json @@ -0,0 +1,123 @@ +{ + "case_id": "C03_sky130_sW1.5_sL1", + "circuit_id": "C03", + "pdk": "sky130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "dut_name": "C03_sky130_sW1.5_sL1", + "ports": [ + "VSS", + "IIN1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 6.0, + "l": 1.2, + "nf": 12 + }, + "M2": { + "w": 6.0, + "l": 1.2, + "nf": 12 + }, + "M3": { + "w": 6.0, + "l": 1.2, + "nf": 12 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 1.1700000000000002, + "tol": 0.1, + "vout_test": 1.29 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.2, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.2, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.2, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "74eae343c490b5c3", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1.5_sL1/manifest.json new file mode 100644 index 00000000..e70c5330 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "474b1a326978ede8974278e81e49dffdcc1b2f11e494a6f932e1eab8c967be5a", + "qualification.json": "496520aba936277ac97be316f652e45dd7a6d320e58d981541e060723ee70440", + "specs.json": "bf3d5d5b1b45b8c2af0386b56c99d080caedde11dd44911fc46bc0f63e3e4651", + "target.spice": "8ff58e7501f69c36fcf8060946fd13a063255608168be63a22e31b814370d9ba", + "target_lvs.spice": "053043ab48d79c4848a7a9b53e1232dffbc0988c00e272002e78f076a53c130e", + "testbench.spice": "41adbdf8be72a4ed6df9c8ab5e636f32ef106391523ebebeaa69f9e5eedbbd5b" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1.5_sL1/qualification.json new file mode 100644 index 00000000..8e3b4ae3 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1.5_sL1/qualification.json @@ -0,0 +1,103 @@ +{ + "case_id": "C03_sky130_sW1.5_sL1", + "circuit_id": "C03", + "pdk": "sky130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.2, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.2, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.2, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "74eae343c490b5c3", + "mirror_pass1": { + "vmin": 0.7792565, + "status": "passed", + "vout_test": 1.29 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 0.8793 + }, + "_frozen_from": { + "schematic": { + "err": -0.067462, + "vmin": 0.7792565 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 1.1700000000000002 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 12.7, + "schematic_measures": { + "iout_t": 1.865076e-05, + "err": -0.067462, + "vmin": 0.7792565, + "dev_at_vdd": 0.06715289, + "gout_t": 1.602318e-08, + "rout_t": 62410420.0, + "vout_test": 1.29, + "rout_nom": 62410420.0, + "ok_at_vdd": 0.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1.5_sL1/specs.json new file mode 100644 index 00000000..3759be09 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1.5_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 0.8793 + }, + "_frozen_from": { + "schematic": { + "err": -0.067462, + "vmin": 0.7792565 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 1.1700000000000002 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1.5_sL1/target.spice new file mode 100644 index 00000000..7442dca2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1.5_sL1/target.spice @@ -0,0 +1,5 @@ +.subckt C03_sky130_sW1.5_sL1 VSS IIN1 IOUT1 +XM1 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=6 l=1.2 nf=12 +XM2 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=6 l=1.2 nf=12 +XM3 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=6 l=1.2 nf=12 +.ends C03_sky130_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1.5_sL1/target_lvs.spice new file mode 100644 index 00000000..55da9fab --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1.5_sL1/target_lvs.spice @@ -0,0 +1,38 @@ +.subckt C03_sky130_sW1.5_sL1 VSS IIN1 IOUT1 +XM1_f0 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM1_f1 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM1_f2 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM1_f3 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM1_f4 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM1_f5 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM1_f6 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM1_f7 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM1_f8 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM1_f9 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM1_f10 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM1_f11 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM2_f0 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM2_f1 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM2_f2 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM2_f3 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM2_f4 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM2_f5 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM2_f6 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM2_f7 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM2_f8 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM2_f9 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM2_f10 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM2_f11 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM3_f0 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM3_f1 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM3_f2 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM3_f3 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM3_f4 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM3_f5 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM3_f6 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM3_f7 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM3_f8 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM3_f9 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM3_f10 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM3_f11 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +.ends C03_sky130_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1.5_sL1/testbench.spice new file mode 100644 index 00000000..bab48982 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1.5_sL1/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IIN1 IOUT1 C03_sky130_sW1.5_sL1 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIIN1 VDDB IIN1 2e-05 +.nodeset v(IIN1)=0.54 + +VOUT IOUT1 0 1.8 +.control +dc VOUT 1.8 0 -0.0045 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=1.29 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.1 cross=last +meas dc dev_at_vdd find dev at=1.791 +let gout = deriv(iout) +meas dc gout_t find gout at=1.29 +let rout_v = 1/gout +meas dc rout_t find rout_v at=1.29 +echo vout_test = 1.29 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1.5_sL2/case.json new file mode 100644 index 00000000..7e4caa55 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1.5_sL2/case.json @@ -0,0 +1,123 @@ +{ + "case_id": "C03_sky130_sW1.5_sL2", + "circuit_id": "C03", + "pdk": "sky130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "dut_name": "C03_sky130_sW1.5_sL2", + "ports": [ + "VSS", + "IIN1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 6.0, + "l": 2.4, + "nf": 12 + }, + "M2": { + "w": 6.0, + "l": 2.4, + "nf": 12 + }, + "M3": { + "w": 6.0, + "l": 2.4, + "nf": 12 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 1.1700000000000002, + "tol": 0.1, + "vout_test": 1.32 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 2.4, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 2.4, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 2.4, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "2cd6f97b3bbc6b7d", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1.5_sL2/manifest.json new file mode 100644 index 00000000..fae6dd41 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "3e9bad0a0472f439e9091a86480909a34c2195efd87391d4e0b6041ba420e82e", + "qualification.json": "71a15d48874c55a6b791a5c2dba4596e0bf45461fef3d7615b6923ffb2b086a6", + "specs.json": "e83d3499093b5a02e70a8f3fac5b75967a8ad74b98c3b872b23db30f6d22c529", + "target.spice": "949c3683373ed1005d94791e37ed9808e0f386f98f990d456f2b5330a6a603a7", + "target_lvs.spice": "6e4e011501ab4796992541631feffe8de6a0c0eebad0500240aa682ac6837b39", + "testbench.spice": "cb1bd4848480cee64255d79604dcb1422314b2c8d4a9ab3cdec22c537b813af8" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1.5_sL2/qualification.json new file mode 100644 index 00000000..c93dddcc --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1.5_sL2/qualification.json @@ -0,0 +1,103 @@ +{ + "case_id": "C03_sky130_sW1.5_sL2", + "circuit_id": "C03", + "pdk": "sky130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 2.4, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 2.4, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 2.4, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "2cd6f97b3bbc6b7d", + "mirror_pass1": { + "vmin": 0.8451094, + "status": "passed", + "vout_test": 1.32 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 0.9451 + }, + "_frozen_from": { + "schematic": { + "err": -0.053092, + "vmin": 0.8451094 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 1.1700000000000002 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 12.4, + "schematic_measures": { + "iout_t": 1.893816e-05, + "err": -0.053092, + "vmin": 0.8451094, + "dev_at_vdd": 0.05285044, + "gout_t": 1.405508e-08, + "rout_t": 71151010.0, + "vout_test": 1.32, + "rout_nom": 71151010.0, + "ok_at_vdd": 0.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1.5_sL2/specs.json new file mode 100644 index 00000000..c1e8b86c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1.5_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 0.9451 + }, + "_frozen_from": { + "schematic": { + "err": -0.053092, + "vmin": 0.8451094 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 1.1700000000000002 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1.5_sL2/target.spice new file mode 100644 index 00000000..24ec471f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1.5_sL2/target.spice @@ -0,0 +1,5 @@ +.subckt C03_sky130_sW1.5_sL2 VSS IIN1 IOUT1 +XM1 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=6 l=2.4 nf=12 +XM2 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=6 l=2.4 nf=12 +XM3 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=6 l=2.4 nf=12 +.ends C03_sky130_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1.5_sL2/target_lvs.spice new file mode 100644 index 00000000..a5500b4a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1.5_sL2/target_lvs.spice @@ -0,0 +1,38 @@ +.subckt C03_sky130_sW1.5_sL2 VSS IIN1 IOUT1 +XM1_f0 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM1_f1 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM1_f2 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM1_f3 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM1_f4 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM1_f5 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM1_f6 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM1_f7 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM1_f8 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM1_f9 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM1_f10 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM1_f11 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM2_f0 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM2_f1 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM2_f2 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM2_f3 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM2_f4 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM2_f5 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM2_f6 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM2_f7 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM2_f8 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM2_f9 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM2_f10 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM2_f11 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM3_f0 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM3_f1 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM3_f2 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM3_f3 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM3_f4 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM3_f5 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM3_f6 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM3_f7 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM3_f8 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM3_f9 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM3_f10 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM3_f11 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +.ends C03_sky130_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1.5_sL2/testbench.spice new file mode 100644 index 00000000..25516f0a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1.5_sL2/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IIN1 IOUT1 C03_sky130_sW1.5_sL2 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIIN1 VDDB IIN1 2e-05 +.nodeset v(IIN1)=0.54 + +VOUT IOUT1 0 1.8 +.control +dc VOUT 1.8 0 -0.0045 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=1.32 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.1 cross=last +meas dc dev_at_vdd find dev at=1.791 +let gout = deriv(iout) +meas dc gout_t find gout at=1.32 +let rout_v = 1/gout +meas dc rout_t find rout_v at=1.32 +echo vout_test = 1.32 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1_sL1.5/case.json new file mode 100644 index 00000000..c5aa961a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1_sL1.5/case.json @@ -0,0 +1,123 @@ +{ + "case_id": "C03_sky130_sW1_sL1.5", + "circuit_id": "C03", + "pdk": "sky130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "dut_name": "C03_sky130_sW1_sL1.5", + "ports": [ + "VSS", + "IIN1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 1.8, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 1.8, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 1.8, + "nf": 8 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 1.1700000000000002, + "tol": 0.1, + "vout_test": 1.34 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.8, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.8, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.8, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "291f97cbcd18eec2", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1_sL1.5/manifest.json new file mode 100644 index 00000000..88b298f0 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "aca4a0d9a5882a5517ccd5ec302aa3d906a0911a83c818859db98d2e28ce04cf", + "qualification.json": "fa32411ed6a626dd5d5d3ad7848c8949fe87e636ed338e7fc2a0ed44b5b94dc8", + "specs.json": "471778d16df10609c7bee98b226b10b92b807ef0d6907b3eeda1e9712e5cd336", + "target.spice": "b52d91a84ec0623343d0437f77b45cea2dfa3c5cba844d902454c8a13b52507e", + "target_lvs.spice": "bc5bc907b962f4becffffd85aae1ef2e8d5528a081b6022e10d26d2a41fc93e0", + "testbench.spice": "f8f70de03aaddb59b88c7709e66c9406ef42f5fa0241882f9402fa2793f0c9b0" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1_sL1.5/qualification.json new file mode 100644 index 00000000..aa49dd06 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1_sL1.5/qualification.json @@ -0,0 +1,103 @@ +{ + "case_id": "C03_sky130_sW1_sL1.5", + "circuit_id": "C03", + "pdk": "sky130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.8, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.8, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.8, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "291f97cbcd18eec2", + "mirror_pass1": { + "vmin": 0.8733776, + "status": "passed", + "vout_test": 1.34 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 0.9734 + }, + "_frozen_from": { + "schematic": { + "err": -0.059348, + "vmin": 0.8733776 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 1.1700000000000002 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 15.5, + "schematic_measures": { + "iout_t": 1.881304e-05, + "err": -0.059348, + "vmin": 0.8733776, + "dev_at_vdd": 0.05904376, + "gout_t": 1.907403e-08, + "rout_t": 52428960.0, + "vout_test": 1.34, + "rout_nom": 52428960.0, + "ok_at_vdd": 0.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1_sL1.5/specs.json new file mode 100644 index 00000000..93a94a31 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 0.9734 + }, + "_frozen_from": { + "schematic": { + "err": -0.059348, + "vmin": 0.8733776 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 1.1700000000000002 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1_sL1.5/target.spice new file mode 100644 index 00000000..d2ee29ae --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1_sL1.5/target.spice @@ -0,0 +1,5 @@ +.subckt C03_sky130_sW1_sL1.5 VSS IIN1 IOUT1 +XM1 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=4 l=1.8 nf=8 +XM2 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=4 l=1.8 nf=8 +XM3 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=4 l=1.8 nf=8 +.ends C03_sky130_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1_sL1.5/target_lvs.spice new file mode 100644 index 00000000..7d38b0a4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1_sL1.5/target_lvs.spice @@ -0,0 +1,26 @@ +.subckt C03_sky130_sW1_sL1.5 VSS IIN1 IOUT1 +XM1_f0 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM1_f1 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM1_f2 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM1_f3 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM1_f4 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM1_f5 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM1_f6 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM1_f7 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM2_f0 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM2_f1 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM2_f2 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM2_f3 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM2_f4 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM2_f5 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM2_f6 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM2_f7 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM3_f0 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM3_f1 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM3_f2 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM3_f3 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM3_f4 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM3_f5 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM3_f6 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM3_f7 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +.ends C03_sky130_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1_sL1.5/testbench.spice new file mode 100644 index 00000000..6aa3923c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1_sL1.5/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IIN1 IOUT1 C03_sky130_sW1_sL1.5 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIIN1 VDDB IIN1 2e-05 +.nodeset v(IIN1)=0.54 + +VOUT IOUT1 0 1.8 +.control +dc VOUT 1.8 0 -0.0045 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=1.34 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.1 cross=last +meas dc dev_at_vdd find dev at=1.791 +let gout = deriv(iout) +meas dc gout_t find gout at=1.34 +let rout_v = 1/gout +meas dc rout_t find rout_v at=1.34 +echo vout_test = 1.34 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1_sL1/case.json new file mode 100644 index 00000000..c6b564b5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1_sL1/case.json @@ -0,0 +1,123 @@ +{ + "case_id": "C03_sky130_sW1_sL1", + "circuit_id": "C03", + "pdk": "sky130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "dut_name": "C03_sky130_sW1_sL1", + "ports": [ + "VSS", + "IIN1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 1.2, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 1.2, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 1.2, + "nf": 8 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 1.1700000000000002, + "tol": 0.1, + "vout_test": 1.31 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.2, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.2, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.2, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "23d4d2bffd33d197", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1_sL1/manifest.json new file mode 100644 index 00000000..34feb5de --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "9213a53ba1610ec6284fa88cdef2ba7e17ce6c3a29c804cf070fa9dd9cf6fb1c", + "qualification.json": "b2d346e17dd9d5bd86123f91b25db7c82c59e5da83c4df7cca1a3ce8faca0edd", + "specs.json": "84c0e7fdeedc5b1d38fa921208f96bb4c1c9c7ddeafed7ee1adf916279ce6e22", + "target.spice": "eef487322e1bf8a9bc0e514f12830c5e3456112641911548c141f543665cff83", + "target_lvs.spice": "d513bd218554f8e0a954fc9ca8b4e90c7624759878dc522d978c2294c7333a0f", + "testbench.spice": "d81bfc4f70e68e399859cab248a157238deb87deed5671d51f61466f0f55f32d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1_sL1/qualification.json new file mode 100644 index 00000000..9b5b973c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1_sL1/qualification.json @@ -0,0 +1,103 @@ +{ + "case_id": "C03_sky130_sW1_sL1", + "circuit_id": "C03", + "pdk": "sky130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.2, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.2, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.2, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "23d4d2bffd33d197", + "mirror_pass1": { + "vmin": 0.8278448, + "status": "passed", + "vout_test": 1.31 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 0.9278 + }, + "_frozen_from": { + "schematic": { + "err": -0.0631645, + "vmin": 0.8278448 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 1.1700000000000002 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 14.1, + "schematic_measures": { + "iout_t": 1.873671e-05, + "err": -0.0631645, + "vmin": 0.8278448, + "dev_at_vdd": 0.06285188, + "gout_t": 1.813997e-08, + "rout_t": 55127510.0, + "vout_test": 1.31, + "rout_nom": 55127510.0, + "ok_at_vdd": 0.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1_sL1/specs.json new file mode 100644 index 00000000..434c5105 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 0.9278 + }, + "_frozen_from": { + "schematic": { + "err": -0.0631645, + "vmin": 0.8278448 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 1.1700000000000002 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1_sL1/target.spice new file mode 100644 index 00000000..b434cd1e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1_sL1/target.spice @@ -0,0 +1,5 @@ +.subckt C03_sky130_sW1_sL1 VSS IIN1 IOUT1 +XM1 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=4 l=1.2 nf=8 +XM2 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=4 l=1.2 nf=8 +XM3 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=4 l=1.2 nf=8 +.ends C03_sky130_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1_sL1/target_lvs.spice new file mode 100644 index 00000000..f8a06d93 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1_sL1/target_lvs.spice @@ -0,0 +1,26 @@ +.subckt C03_sky130_sW1_sL1 VSS IIN1 IOUT1 +XM1_f0 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM1_f1 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM1_f2 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM1_f3 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM1_f4 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM1_f5 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM1_f6 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM1_f7 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM2_f0 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM2_f1 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM2_f2 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM2_f3 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM2_f4 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM2_f5 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM2_f6 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM2_f7 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM3_f0 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM3_f1 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM3_f2 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM3_f3 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM3_f4 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM3_f5 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM3_f6 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM3_f7 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +.ends C03_sky130_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1_sL1/testbench.spice new file mode 100644 index 00000000..1373b0b2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1_sL1/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IIN1 IOUT1 C03_sky130_sW1_sL1 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIIN1 VDDB IIN1 2e-05 +.nodeset v(IIN1)=0.54 + +VOUT IOUT1 0 1.8 +.control +dc VOUT 1.8 0 -0.0045 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=1.31 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.1 cross=last +meas dc dev_at_vdd find dev at=1.791 +let gout = deriv(iout) +meas dc gout_t find gout at=1.31 +let rout_v = 1/gout +meas dc rout_t find rout_v at=1.31 +echo vout_test = 1.31 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1_sL2/case.json new file mode 100644 index 00000000..c965598d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1_sL2/case.json @@ -0,0 +1,123 @@ +{ + "case_id": "C03_sky130_sW1_sL2", + "circuit_id": "C03", + "pdk": "sky130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "dut_name": "C03_sky130_sW1_sL2", + "ports": [ + "VSS", + "IIN1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 2.4, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 2.4, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 2.4, + "nf": 8 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 1.1700000000000002, + "tol": 0.1, + "vout_test": 1.36 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 2.4, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 2.4, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 2.4, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "0aefeceb302adf47", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1_sL2/manifest.json new file mode 100644 index 00000000..03904f46 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "48f83bd43a570319e1cbe33e673248881f4c62efc349bb9122415f525d1bd503", + "qualification.json": "e063a6742d4a5e8ce719f2932dc8ddbdc0c926acb9944df61be65e992f62005c", + "specs.json": "758aa9054c289d48f9e4d2afb6d9aa883788fb665ece319a939206001a9cc211", + "target.spice": "724d51b6d03577a3cec453e81d7282a134783884cf0f13f067d8f63fc64e8619", + "target_lvs.spice": "ac40916475dc91a18d2d3bdf1aed2fa313776274d344733427c8197c9d9cf020", + "testbench.spice": "b73c3e7a8858b3a3a50625dba97cdfc5d1b34376f307145348ba6882bee1ca21" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1_sL2/qualification.json new file mode 100644 index 00000000..9d201041 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1_sL2/qualification.json @@ -0,0 +1,103 @@ +{ + "case_id": "C03_sky130_sW1_sL2", + "circuit_id": "C03", + "pdk": "sky130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 2.4, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 2.4, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 2.4, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "0aefeceb302adf47", + "mirror_pass1": { + "vmin": 0.9165947, + "status": "passed", + "vout_test": 1.36 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 1.017 + }, + "_frozen_from": { + "schematic": { + "err": -0.0493415, + "vmin": 0.9165947 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 1.1700000000000002 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 20.7, + "schematic_measures": { + "iout_t": 1.901317e-05, + "err": -0.0493415, + "vmin": 0.9165947, + "dev_at_vdd": 0.04909291, + "gout_t": 1.889715e-08, + "rout_t": 52922570.0, + "vout_test": 1.36, + "rout_nom": 52922570.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1_sL2/specs.json new file mode 100644 index 00000000..7a384f31 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 1.017 + }, + "_frozen_from": { + "schematic": { + "err": -0.0493415, + "vmin": 0.9165947 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 1.1700000000000002 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1_sL2/target.spice new file mode 100644 index 00000000..bd679f52 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1_sL2/target.spice @@ -0,0 +1,5 @@ +.subckt C03_sky130_sW1_sL2 VSS IIN1 IOUT1 +XM1 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=4 l=2.4 nf=8 +XM2 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=4 l=2.4 nf=8 +XM3 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=4 l=2.4 nf=8 +.ends C03_sky130_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1_sL2/target_lvs.spice new file mode 100644 index 00000000..dd780941 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1_sL2/target_lvs.spice @@ -0,0 +1,26 @@ +.subckt C03_sky130_sW1_sL2 VSS IIN1 IOUT1 +XM1_f0 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM1_f1 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM1_f2 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM1_f3 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM1_f4 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM1_f5 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM1_f6 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM1_f7 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM2_f0 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM2_f1 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM2_f2 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM2_f3 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM2_f4 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM2_f5 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM2_f6 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM2_f7 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM3_f0 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM3_f1 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM3_f2 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM3_f3 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM3_f4 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM3_f5 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM3_f6 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM3_f7 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +.ends C03_sky130_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1_sL2/testbench.spice new file mode 100644 index 00000000..717ba468 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW1_sL2/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IIN1 IOUT1 C03_sky130_sW1_sL2 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIIN1 VDDB IIN1 2e-05 +.nodeset v(IIN1)=0.54 + +VOUT IOUT1 0 1.8 +.control +dc VOUT 1.8 0 -0.0045 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=1.36 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.1 cross=last +meas dc dev_at_vdd find dev at=1.791 +let gout = deriv(iout) +meas dc gout_t find gout at=1.36 +let rout_v = 1/gout +meas dc rout_t find rout_v at=1.36 +echo vout_test = 1.36 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C03/sky130/sW2_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW2_sL1.5/case.json new file mode 100644 index 00000000..3cf14a2a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW2_sL1.5/case.json @@ -0,0 +1,123 @@ +{ + "case_id": "C03_sky130_sW2_sL1.5", + "circuit_id": "C03", + "pdk": "sky130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "dut_name": "C03_sky130_sW2_sL1.5", + "ports": [ + "VSS", + "IIN1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 8.0, + "l": 1.8, + "nf": 16 + }, + "M2": { + "w": 8.0, + "l": 1.8, + "nf": 16 + }, + "M3": { + "w": 8.0, + "l": 1.8, + "nf": 16 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 1.1700000000000002, + "tol": 0.1, + "vout_test": 1.29 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.8, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.8, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.8, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "5344a87aa48d26c8", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/sky130/sW2_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW2_sL1.5/manifest.json new file mode 100644 index 00000000..54f6e8ae --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW2_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "adda95e5634eed7ad262117949d131ced633f1925ed1aa8349a8c2e3513f70ee", + "qualification.json": "f819015101cc69b6c4733b381a6c509ab4ff8a80298978f6823988e1a61ec843", + "specs.json": "7bd8732627086d8451172ed2d2953e3dea79e2c800be5021612935a5fb5786da", + "target.spice": "9c5ef38dbc3138672b1b09d58fc43ad44b2ae8fd9011b40cfed96c7bfa98de26", + "target_lvs.spice": "2ef5b67bb9ff293366f1682f18ffa44261c4fdf439dea8448a568f6dca33ce51", + "testbench.spice": "c2655d99b6d41dc72cec9f64e323fd0c02fdb6db481d476402ad8d2a11d495ec" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/sky130/sW2_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW2_sL1.5/qualification.json new file mode 100644 index 00000000..3e6c2932 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW2_sL1.5/qualification.json @@ -0,0 +1,103 @@ +{ + "case_id": "C03_sky130_sW2_sL1.5", + "circuit_id": "C03", + "pdk": "sky130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.8, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.8, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.8, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "5344a87aa48d26c8", + "mirror_pass1": { + "vmin": 0.7809883, + "status": "passed", + "vout_test": 1.29 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 0.881 + }, + "_frozen_from": { + "schematic": { + "err": -0.068048, + "vmin": 0.7809883 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 1.1700000000000002 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 12.3, + "schematic_measures": { + "iout_t": 1.863904e-05, + "err": -0.068048, + "vmin": 0.7809883, + "dev_at_vdd": 0.06772667, + "gout_t": 1.563482e-08, + "rout_t": 63960370.0, + "vout_test": 1.29, + "rout_nom": 63960370.0, + "ok_at_vdd": 0.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/sky130/sW2_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW2_sL1.5/specs.json new file mode 100644 index 00000000..9d39dcef --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW2_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 0.881 + }, + "_frozen_from": { + "schematic": { + "err": -0.068048, + "vmin": 0.7809883 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 1.1700000000000002 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/sky130/sW2_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW2_sL1.5/target.spice new file mode 100644 index 00000000..e995030f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW2_sL1.5/target.spice @@ -0,0 +1,5 @@ +.subckt C03_sky130_sW2_sL1.5 VSS IIN1 IOUT1 +XM1 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=8 l=1.8 nf=16 +XM2 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=8 l=1.8 nf=16 +XM3 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=8 l=1.8 nf=16 +.ends C03_sky130_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C03/sky130/sW2_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW2_sL1.5/target_lvs.spice new file mode 100644 index 00000000..6a38f712 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW2_sL1.5/target_lvs.spice @@ -0,0 +1,50 @@ +.subckt C03_sky130_sW2_sL1.5 VSS IIN1 IOUT1 +XM1_f0 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM1_f1 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM1_f2 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM1_f3 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM1_f4 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM1_f5 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM1_f6 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM1_f7 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM1_f8 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM1_f9 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM1_f10 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM1_f11 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM1_f12 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM1_f13 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM1_f14 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM1_f15 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM2_f0 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM2_f1 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM2_f2 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM2_f3 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM2_f4 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM2_f5 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM2_f6 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM2_f7 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM2_f8 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM2_f9 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM2_f10 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM2_f11 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM2_f12 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM2_f13 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM2_f14 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM2_f15 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM3_f0 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM3_f1 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM3_f2 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM3_f3 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM3_f4 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM3_f5 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM3_f6 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM3_f7 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM3_f8 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM3_f9 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM3_f10 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM3_f11 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM3_f12 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM3_f13 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM3_f14 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +XM3_f15 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.8 +.ends C03_sky130_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C03/sky130/sW2_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW2_sL1.5/testbench.spice new file mode 100644 index 00000000..c32ad188 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW2_sL1.5/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IIN1 IOUT1 C03_sky130_sW2_sL1.5 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIIN1 VDDB IIN1 2e-05 +.nodeset v(IIN1)=0.54 + +VOUT IOUT1 0 1.8 +.control +dc VOUT 1.8 0 -0.0045 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=1.29 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.1 cross=last +meas dc dev_at_vdd find dev at=1.791 +let gout = deriv(iout) +meas dc gout_t find gout at=1.29 +let rout_v = 1/gout +meas dc rout_t find rout_v at=1.29 +echo vout_test = 1.29 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C03/sky130/sW2_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW2_sL1/case.json new file mode 100644 index 00000000..fd968fcf --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW2_sL1/case.json @@ -0,0 +1,123 @@ +{ + "case_id": "C03_sky130_sW2_sL1", + "circuit_id": "C03", + "pdk": "sky130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "dut_name": "C03_sky130_sW2_sL1", + "ports": [ + "VSS", + "IIN1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 8.0, + "l": 1.2, + "nf": 16 + }, + "M2": { + "w": 8.0, + "l": 1.2, + "nf": 16 + }, + "M3": { + "w": 8.0, + "l": 1.2, + "nf": 16 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 1.1700000000000002, + "tol": 0.1, + "vout_test": 1.28 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.2, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.2, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.2, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "56ac4688540b57a4", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/sky130/sW2_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW2_sL1/manifest.json new file mode 100644 index 00000000..9dfb22b2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW2_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "7a1f572790730da8b7cb4da405fd6b44d542cbd2e2ce8495ac3d545eec007960", + "qualification.json": "3e5a21d08c4f153b9c83cb785cd03a9881998835dd86b917e54e64a00824e799", + "specs.json": "ee26a4d6990c252f57e64583946abd091cf42b0f41d3beabd9888e02a7c4c8f5", + "target.spice": "08c4904e45af4939f66363c635b214a5337f366df68eeab40de540ef1a765cc6", + "target_lvs.spice": "70e2ae84405465cd583dcba8dafe2cbdf4a7adfeaa234d2824350e6226bd199f", + "testbench.spice": "23014c4ee7b225995bebd6e183a3a872fb759923b966ebf0edb3c2cdff761f04" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/sky130/sW2_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW2_sL1/qualification.json new file mode 100644 index 00000000..9ec05ce9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW2_sL1/qualification.json @@ -0,0 +1,103 @@ +{ + "case_id": "C03_sky130_sW2_sL1", + "circuit_id": "C03", + "pdk": "sky130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.2, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.2, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.2, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "56ac4688540b57a4", + "mirror_pass1": { + "vmin": 0.7507061, + "status": "passed", + "vout_test": 1.28 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 0.8507 + }, + "_frozen_from": { + "schematic": { + "err": -0.070958, + "vmin": 0.7507061 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 1.1700000000000002 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 12.2, + "schematic_measures": { + "iout_t": 1.858084e-05, + "err": -0.070958, + "vmin": 0.7507061, + "dev_at_vdd": 0.07064225, + "gout_t": 1.540003e-08, + "rout_t": 64935570.0, + "vout_test": 1.28, + "rout_nom": 64935570.0, + "ok_at_vdd": 0.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/sky130/sW2_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW2_sL1/specs.json new file mode 100644 index 00000000..e83b9351 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW2_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 0.8507 + }, + "_frozen_from": { + "schematic": { + "err": -0.070958, + "vmin": 0.7507061 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 1.1700000000000002 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/sky130/sW2_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW2_sL1/target.spice new file mode 100644 index 00000000..b787f21b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW2_sL1/target.spice @@ -0,0 +1,5 @@ +.subckt C03_sky130_sW2_sL1 VSS IIN1 IOUT1 +XM1 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=8 l=1.2 nf=16 +XM2 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=8 l=1.2 nf=16 +XM3 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=8 l=1.2 nf=16 +.ends C03_sky130_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C03/sky130/sW2_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW2_sL1/target_lvs.spice new file mode 100644 index 00000000..27589674 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW2_sL1/target_lvs.spice @@ -0,0 +1,50 @@ +.subckt C03_sky130_sW2_sL1 VSS IIN1 IOUT1 +XM1_f0 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM1_f1 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM1_f2 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM1_f3 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM1_f4 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM1_f5 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM1_f6 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM1_f7 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM1_f8 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM1_f9 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM1_f10 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM1_f11 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM1_f12 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM1_f13 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM1_f14 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM1_f15 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM2_f0 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM2_f1 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM2_f2 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM2_f3 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM2_f4 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM2_f5 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM2_f6 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM2_f7 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM2_f8 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM2_f9 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM2_f10 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM2_f11 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM2_f12 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM2_f13 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM2_f14 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM2_f15 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM3_f0 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM3_f1 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM3_f2 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM3_f3 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM3_f4 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM3_f5 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM3_f6 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM3_f7 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM3_f8 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM3_f9 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM3_f10 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM3_f11 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM3_f12 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM3_f13 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM3_f14 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM3_f15 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +.ends C03_sky130_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C03/sky130/sW2_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW2_sL1/testbench.spice new file mode 100644 index 00000000..d8079947 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW2_sL1/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IIN1 IOUT1 C03_sky130_sW2_sL1 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIIN1 VDDB IIN1 2e-05 +.nodeset v(IIN1)=0.54 + +VOUT IOUT1 0 1.8 +.control +dc VOUT 1.8 0 -0.0045 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=1.28 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.1 cross=last +meas dc dev_at_vdd find dev at=1.791 +let gout = deriv(iout) +meas dc gout_t find gout at=1.28 +let rout_v = 1/gout +meas dc rout_t find rout_v at=1.28 +echo vout_test = 1.28 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C03/sky130/sW2_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW2_sL2/case.json new file mode 100644 index 00000000..83acd1a5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW2_sL2/case.json @@ -0,0 +1,123 @@ +{ + "case_id": "C03_sky130_sW2_sL2", + "circuit_id": "C03", + "pdk": "sky130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "dut_name": "C03_sky130_sW2_sL2", + "ports": [ + "VSS", + "IIN1", + "IOUT1" + ], + "sizing": { + "M1": { + "w": 8.0, + "l": 2.4, + "nf": 16 + }, + "M2": { + "w": 8.0, + "l": 2.4, + "nf": 16 + }, + "M3": { + "w": 8.0, + "l": 2.4, + "nf": 16 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 1.1700000000000002, + "tol": 0.1, + "vout_test": 1.3 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 2.4, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 2.4, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 2.4, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "75af9ca34d6fb9fd", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/sky130/sW2_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW2_sL2/manifest.json new file mode 100644 index 00000000..00f8bd4c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW2_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "92c23b477ba9467fee95f072932ea311d3ddb0a1eaadfc5b5997a016ac511fcb", + "qualification.json": "d10ddf2a8100fd10e5c52c9c485cfb958cee699e18b3474fc01c5fc34b4ae722", + "specs.json": "c96a58e103c35cbcc1b1cf442a04d9ad131d8c61a10a075acdfb315b542bc5db", + "target.spice": "658e1904a70054822e6493ec0ddeea3da25b236cc7c8b54e0f7145a1bd0cf127", + "target_lvs.spice": "ca56b60d76b7b00939723d61a6f33de1b1e8cb64adc5b371aa8a981b0cadb159", + "testbench.spice": "49a811a956635b92be803472e3105ac8ddd79f8e6d2522a4c030a98c41b36443" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/sky130/sW2_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW2_sL2/qualification.json new file mode 100644 index 00000000..e570c3f1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW2_sL2/qualification.json @@ -0,0 +1,103 @@ +{ + "case_id": "C03_sky130_sW2_sL2", + "circuit_id": "C03", + "pdk": "sky130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 2.4, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 2.4, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 2.4, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "75af9ca34d6fb9fd", + "mirror_pass1": { + "vmin": 0.8043552, + "status": "passed", + "vout_test": 1.3 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 0.9044 + }, + "_frozen_from": { + "schematic": { + "err": -0.0562665, + "vmin": 0.8043552 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 1.1700000000000002 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 12.4, + "schematic_measures": { + "iout_t": 1.887467e-05, + "err": -0.0562665, + "vmin": 0.8043552, + "dev_at_vdd": 0.05602016, + "gout_t": 1.274017e-08, + "rout_t": 78492470.0, + "vout_test": 1.3, + "rout_nom": 78492470.0, + "ok_at_vdd": 0.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/sky130/sW2_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW2_sL2/specs.json new file mode 100644 index 00000000..9244447f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW2_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 0.9044 + }, + "_frozen_from": { + "schematic": { + "err": -0.0562665, + "vmin": 0.8043552 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 1.1700000000000002 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C03/sky130/sW2_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW2_sL2/target.spice new file mode 100644 index 00000000..3196cd66 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW2_sL2/target.spice @@ -0,0 +1,5 @@ +.subckt C03_sky130_sW2_sL2 VSS IIN1 IOUT1 +XM1 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=8 l=2.4 nf=16 +XM2 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=8 l=2.4 nf=16 +XM3 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=8 l=2.4 nf=16 +.ends C03_sky130_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C03/sky130/sW2_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW2_sL2/target_lvs.spice new file mode 100644 index 00000000..8a05baa5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW2_sL2/target_lvs.spice @@ -0,0 +1,50 @@ +.subckt C03_sky130_sW2_sL2 VSS IIN1 IOUT1 +XM1_f0 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM1_f1 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM1_f2 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM1_f3 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM1_f4 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM1_f5 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM1_f6 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM1_f7 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM1_f8 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM1_f9 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM1_f10 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM1_f11 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM1_f12 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM1_f13 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM1_f14 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM1_f15 IIN1 Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM2_f0 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM2_f1 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM2_f2 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM2_f3 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM2_f4 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM2_f5 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM2_f6 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM2_f7 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM2_f8 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM2_f9 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM2_f10 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM2_f11 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM2_f12 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM2_f13 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM2_f14 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM2_f15 Y Y VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM3_f0 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM3_f1 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM3_f2 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM3_f3 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM3_f4 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM3_f5 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM3_f6 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM3_f7 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM3_f8 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM3_f9 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM3_f10 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM3_f11 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM3_f12 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM3_f13 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM3_f14 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +XM3_f15 IOUT1 IIN1 Y VSS sky130_fd_pr__nfet_01v8 w=0.5 l=2.4 +.ends C03_sky130_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C03/sky130/sW2_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW2_sL2/testbench.spice new file mode 100644 index 00000000..84f0676d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C03/sky130/sW2_sL2/testbench.spice @@ -0,0 +1,25 @@ +X1 VSS IIN1 IOUT1 C03_sky130_sW2_sL2 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIIN1 VDDB IIN1 2e-05 +.nodeset v(IIN1)=0.54 + +VOUT IOUT1 0 1.8 +.control +dc VOUT 1.8 0 -0.0045 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=1.3 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.1 cross=last +meas dc dev_at_vdd find dev at=1.791 +let gout = deriv(iout) +meas dc gout_t find gout at=1.3 +let rout_v = 1/gout +meas dc rout_t find rout_v at=1.3 +echo vout_test = 1.3 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C04/gf180/sW0.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW0.5_sL1.5/case.json new file mode 100644 index 00000000..60cdc4d6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW0.5_sL1.5/case.json @@ -0,0 +1,101 @@ +{ + "case_id": "C04_gf180_sW0.5_sL1.5", + "circuit_id": "C04", + "pdk": "gf180", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "dut_name": "C04_gf180_sW0.5_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.84, + "nf": 4 + }, + "M2": { + "w": 1.0, + "l": 0.84, + "nf": 2 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M1", + "current": 2e-05 + } + }, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.84, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "226afc0f6f4023b3", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/gf180/sW0.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW0.5_sL1.5/manifest.json new file mode 100644 index 00000000..cb08b9d7 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW0.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "b6bb0189ef7fce2257a2a0c3e2518cb72c9ef62b70c36f6001b404791487b288", + "qualification.json": "97e5113017ccc59c26fcebac015c19f2bfef78a065513930a37e95b582d316de", + "specs.json": "35c254eec5e1e19b802736a5dd8e026050f3e765ba9dabff0188d4b76bccded9", + "target.spice": "c003ae643dda5a5973d3ffb8d7aa8d4a198dfe8180194ddb477689a804e46ed6", + "target_lvs.spice": "84ffdc85b5dd55592ee77ce1273ffa220f4b3549f44be8d626a8ed2bdda0873a", + "testbench.spice": "4ebc4f267d4968e922686de278a7e2d940ea483f18df2137dab9260286180e91" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/gf180/sW0.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW0.5_sL1.5/qualification.json new file mode 100644 index 00000000..bbfadbb3 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW0.5_sL1.5/qualification.json @@ -0,0 +1,83 @@ +{ + "case_id": "C04_gf180_sW0.5_sL1.5", + "circuit_id": "C04", + "pdk": "gf180", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "single", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.84, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "226afc0f6f4023b3", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 34.71 + }, + "f3db": { + "min": 1000000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 37.71032, + "f3db": 1338737.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vout0": 1.20415, + "vin0": 1.20415, + "idd": 2.048337e-05, + "gain_lf": 37.71032, + "f3db": 1338737.0, + "ugf": 103237300.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/gf180/sW0.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW0.5_sL1.5/specs.json new file mode 100644 index 00000000..06fbb187 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW0.5_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 34.71 + }, + "f3db": { + "min": 1000000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 37.71032, + "f3db": 1338737.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/gf180/sW0.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW0.5_sL1.5/target.spice new file mode 100644 index 00000000..6097f8de --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW0.5_sL1.5/target.spice @@ -0,0 +1,4 @@ +.subckt C04_gf180_sW0.5_sL1.5 VDD VSS VIN1 VOUT1 VB1 +MM1 VOUT1 VB1 VDD VDD pfet_03v3 w=2u l=0.84u nf=4 m=1 +MM2 VOUT1 VIN1 VSS VSS nfet_03v3 w=1u l=0.84u nf=2 m=1 +.ends C04_gf180_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C04/gf180/sW0.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW0.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..d648a12b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW0.5_sL1.5/target_lvs.spice @@ -0,0 +1,8 @@ +.subckt C04_gf180_sW0.5_sL1.5 VDD VSS VIN1 VOUT1 VB1 +MM1_f0 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM1_f1 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM1_f2 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM1_f3 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f0 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM2_f1 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +.ends C04_gf180_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C04/gf180/sW0.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW0.5_sL1.5/testbench.spice new file mode 100644 index 00000000..33ed71b9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW0.5_sL1.5/testbench.spice @@ -0,0 +1,27 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C04_gf180_sW0.5_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +MB_VB1 VB1 VB1 VDDB VDDB pfet_03v3 w=2u l=0.84u +IB_VB1 VB1 VSS 2e-05 +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C04/gf180/sW0.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW0.5_sL1/case.json new file mode 100644 index 00000000..ef8c936b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW0.5_sL1/case.json @@ -0,0 +1,101 @@ +{ + "case_id": "C04_gf180_sW0.5_sL1", + "circuit_id": "C04", + "pdk": "gf180", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "dut_name": "C04_gf180_sW0.5_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.56, + "nf": 4 + }, + "M2": { + "w": 1.0, + "l": 0.56, + "nf": 2 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M1", + "current": 2e-05 + } + }, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.56, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "9720970bb1f7ebca", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/gf180/sW0.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW0.5_sL1/manifest.json new file mode 100644 index 00000000..0347430d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW0.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "9fc315b88bc5e63816313fb50faf253f66fefa10441cace9a2ba68ff7e0dabc7", + "qualification.json": "d8a23f78cdaae0801eb421d8bec4539d8c45802d39902c8354d499cbdd8e4845", + "specs.json": "650850212dc284f80095066a5406b38592fa32c2eadd6841110db734bf111b08", + "target.spice": "3c2f27651f66e8fcc57e09f535686d63f763262d94870b770da8b1ca6e058757", + "target_lvs.spice": "32dc9b280dbc8d196d97b6d09c72e91a39815d94c11e157d09208a4ea2732c9f", + "testbench.spice": "43fae1edc565dbe1f0d574cb297d2541c89746345c37d242a1438c9f182dee57" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/gf180/sW0.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW0.5_sL1/qualification.json new file mode 100644 index 00000000..bc584d9b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW0.5_sL1/qualification.json @@ -0,0 +1,83 @@ +{ + "case_id": "C04_gf180_sW0.5_sL1", + "circuit_id": "C04", + "pdk": "gf180", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "single", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.56, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "9720970bb1f7ebca", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 31.98 + }, + "f3db": { + "min": 1364000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 34.97751, + "f3db": 2273552.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vout0": 1.096757, + "vin0": 1.096757, + "idd": 2.077341e-05, + "gain_lf": 34.97751, + "f3db": 2273552.0, + "ugf": 127908600.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/gf180/sW0.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW0.5_sL1/specs.json new file mode 100644 index 00000000..4779bd0f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW0.5_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 31.98 + }, + "f3db": { + "min": 1364000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 34.97751, + "f3db": 2273552.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/gf180/sW0.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW0.5_sL1/target.spice new file mode 100644 index 00000000..d722d118 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW0.5_sL1/target.spice @@ -0,0 +1,4 @@ +.subckt C04_gf180_sW0.5_sL1 VDD VSS VIN1 VOUT1 VB1 +MM1 VOUT1 VB1 VDD VDD pfet_03v3 w=2u l=0.56u nf=4 m=1 +MM2 VOUT1 VIN1 VSS VSS nfet_03v3 w=1u l=0.56u nf=2 m=1 +.ends C04_gf180_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C04/gf180/sW0.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW0.5_sL1/target_lvs.spice new file mode 100644 index 00000000..d168b183 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW0.5_sL1/target_lvs.spice @@ -0,0 +1,8 @@ +.subckt C04_gf180_sW0.5_sL1 VDD VSS VIN1 VOUT1 VB1 +MM1_f0 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM1_f1 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM1_f2 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM1_f3 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f0 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM2_f1 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +.ends C04_gf180_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C04/gf180/sW0.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW0.5_sL1/testbench.spice new file mode 100644 index 00000000..077947e6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW0.5_sL1/testbench.spice @@ -0,0 +1,27 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C04_gf180_sW0.5_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +MB_VB1 VB1 VB1 VDDB VDDB pfet_03v3 w=2u l=0.56u +IB_VB1 VB1 VSS 2e-05 +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C04/gf180/sW0.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW0.5_sL2/case.json new file mode 100644 index 00000000..c15829c5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW0.5_sL2/case.json @@ -0,0 +1,101 @@ +{ + "case_id": "C04_gf180_sW0.5_sL2", + "circuit_id": "C04", + "pdk": "gf180", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "dut_name": "C04_gf180_sW0.5_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 1.12, + "nf": 4 + }, + "M2": { + "w": 1.0, + "l": 1.12, + "nf": 2 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M1", + "current": 2e-05 + } + }, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.12, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "ff8468bd000fb2c3", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/gf180/sW0.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW0.5_sL2/manifest.json new file mode 100644 index 00000000..d350af3d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW0.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "69d6ef3f3fd192a1f28a2c8260f3eddc86f6df28d70b3f6a8eba8c8d68511140", + "qualification.json": "03995045952d321afa891d95812ac75e0c8cbac39e1ba534d4bf7eb35e4ea188", + "specs.json": "7c7b5fb9c5e70b6a63635da0e7bd2b12cf8188b59ebda56fe1fc43d2505131d6", + "target.spice": "0efd7e973444d4aa40f365037fadc0df27a9a0c738c93a99b07fc54da9f3f48f", + "target_lvs.spice": "4c61c3efc8d7d2bb8a8dfe011dc8cd2179974b5892601e51797980811a921df2", + "testbench.spice": "ff899e033c56bc7f91ae8a529773c4eea414b51a325819da7dd7e4d37325acf0" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/gf180/sW0.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW0.5_sL2/qualification.json new file mode 100644 index 00000000..bace69c9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW0.5_sL2/qualification.json @@ -0,0 +1,85 @@ +{ + "case_id": "C04_gf180_sW0.5_sL2", + "circuit_id": "C04", + "pdk": "gf180", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "single", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.12, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "ff8468bd000fb2c3", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "f3db=9.953e+05 below floor 1e+06" + ], + "spec": { + "gain_lf": { + "min": 36.06 + }, + "f3db": { + "min": 1000000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 39.06276, + "f3db": 995268.4 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vout0": 1.295546, + "vin0": 1.295546, + "idd": 2.048308e-05, + "gain_lf": 39.06276, + "f3db": 995268.4, + "ugf": 89599820.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/gf180/sW0.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW0.5_sL2/specs.json new file mode 100644 index 00000000..18ec7bd5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW0.5_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 36.06 + }, + "f3db": { + "min": 1000000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 39.06276, + "f3db": 995268.4 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/gf180/sW0.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW0.5_sL2/target.spice new file mode 100644 index 00000000..5b33b3ce --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW0.5_sL2/target.spice @@ -0,0 +1,4 @@ +.subckt C04_gf180_sW0.5_sL2 VDD VSS VIN1 VOUT1 VB1 +MM1 VOUT1 VB1 VDD VDD pfet_03v3 w=2u l=1.12u nf=4 m=1 +MM2 VOUT1 VIN1 VSS VSS nfet_03v3 w=1u l=1.12u nf=2 m=1 +.ends C04_gf180_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C04/gf180/sW0.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW0.5_sL2/target_lvs.spice new file mode 100644 index 00000000..e240aa9a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW0.5_sL2/target_lvs.spice @@ -0,0 +1,8 @@ +.subckt C04_gf180_sW0.5_sL2 VDD VSS VIN1 VOUT1 VB1 +MM1_f0 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM1_f1 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM1_f2 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM1_f3 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f0 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM2_f1 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +.ends C04_gf180_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C04/gf180/sW0.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW0.5_sL2/testbench.spice new file mode 100644 index 00000000..41c265b2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW0.5_sL2/testbench.spice @@ -0,0 +1,27 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C04_gf180_sW0.5_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +MB_VB1 VB1 VB1 VDDB VDDB pfet_03v3 w=2u l=1.12u +IB_VB1 VB1 VSS 2e-05 +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1.5_sL1.5/case.json new file mode 100644 index 00000000..9867c6a2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1.5_sL1.5/case.json @@ -0,0 +1,101 @@ +{ + "case_id": "C04_gf180_sW1.5_sL1.5", + "circuit_id": "C04", + "pdk": "gf180", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "dut_name": "C04_gf180_sW1.5_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 6.0, + "l": 0.84, + "nf": 12 + }, + "M2": { + "w": 3.0, + "l": 0.84, + "nf": 6 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M1", + "current": 2e-05 + } + }, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.84, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "b7e1596f18559e41", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1.5_sL1.5/manifest.json new file mode 100644 index 00000000..7c894106 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "822584fbbbdcaf780648306957e2a39a2a35d821ee8f7b36d5c541069d3afdc4", + "qualification.json": "88ea542aae5d6ca5901da5c7af2fdf1f413a4d9322110530e5dfc1c23b287fe0", + "specs.json": "6ee3d39cb34f4c80d95b7f4de9c1188ae6ae0a44f8b531c3f6e7f1cce39dd7c0", + "target.spice": "70ab9004fbd85c7afda061fcb423e8a57270a71d7c047b1b47043ba05d82654e", + "target_lvs.spice": "3d08b88ebfb0916cd949cae12b83ff788ce15337c2e32d48e744fa542b00deb9", + "testbench.spice": "031a86af30974ae64afbe0e6c3dcf5a0d95c8c6b57a90932daa72224dacd270c" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1.5_sL1.5/qualification.json new file mode 100644 index 00000000..4ea46edf --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1.5_sL1.5/qualification.json @@ -0,0 +1,83 @@ +{ + "case_id": "C04_gf180_sW1.5_sL1.5", + "circuit_id": "C04", + "pdk": "gf180", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "single", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.84, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "b7e1596f18559e41", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 38.7 + }, + "f3db": { + "min": 1000000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 41.70021, + "f3db": 1455363.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vout0": 0.9561736, + "vin0": 0.9561736, + "idd": 2.058442e-05, + "gain_lf": 41.70021, + "f3db": 1455363.0, + "ugf": 177737900.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1.5_sL1.5/specs.json new file mode 100644 index 00000000..16a1c84f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1.5_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 38.7 + }, + "f3db": { + "min": 1000000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 41.70021, + "f3db": 1455363.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1.5_sL1.5/target.spice new file mode 100644 index 00000000..1ca3f677 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1.5_sL1.5/target.spice @@ -0,0 +1,4 @@ +.subckt C04_gf180_sW1.5_sL1.5 VDD VSS VIN1 VOUT1 VB1 +MM1 VOUT1 VB1 VDD VDD pfet_03v3 w=6u l=0.84u nf=12 m=1 +MM2 VOUT1 VIN1 VSS VSS nfet_03v3 w=3u l=0.84u nf=6 m=1 +.ends C04_gf180_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..621ec4eb --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1.5_sL1.5/target_lvs.spice @@ -0,0 +1,20 @@ +.subckt C04_gf180_sW1.5_sL1.5 VDD VSS VIN1 VOUT1 VB1 +MM1_f0 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM1_f1 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM1_f2 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM1_f3 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM1_f4 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM1_f5 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM1_f6 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM1_f7 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM1_f8 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM1_f9 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM1_f10 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM1_f11 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f0 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM2_f1 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM2_f2 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM2_f3 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM2_f4 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM2_f5 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +.ends C04_gf180_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1.5_sL1.5/testbench.spice new file mode 100644 index 00000000..f59c1f19 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1.5_sL1.5/testbench.spice @@ -0,0 +1,27 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C04_gf180_sW1.5_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +MB_VB1 VB1 VB1 VDDB VDDB pfet_03v3 w=6u l=0.84u +IB_VB1 VB1 VSS 2e-05 +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1.5_sL1/case.json new file mode 100644 index 00000000..11fa7789 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1.5_sL1/case.json @@ -0,0 +1,101 @@ +{ + "case_id": "C04_gf180_sW1.5_sL1", + "circuit_id": "C04", + "pdk": "gf180", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "dut_name": "C04_gf180_sW1.5_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 6.0, + "l": 0.56, + "nf": 12 + }, + "M2": { + "w": 3.0, + "l": 0.56, + "nf": 6 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M1", + "current": 2e-05 + } + }, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.56, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "834dbe4cf1c65d82", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1.5_sL1/manifest.json new file mode 100644 index 00000000..62cec3a6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "0ea0a7e1301bf52128c46d433862df079ad641c586a569144cc9b4c11bf2a696", + "qualification.json": "4400040a6704ea8386f02c7116e49a3d4772c0a48d330e060ac8f342663baf06", + "specs.json": "e6adf8d89ffdfbdd87099d9049a70ae5a7b41b578d99b9492ba907a130c56639", + "target.spice": "3578eb6663cdd4b7d2f7f17d59d7fee91afe98e7b7f2f89de7b3168d3684ba83", + "target_lvs.spice": "493e24de87ff3d6a9f245dfb72b2fbd0585e9bed02304a9534058efed05d9b19", + "testbench.spice": "34d260e8538b8ffaecf9eea7eb51d05e5367627e2b662f6e24ebaef769d06eb3" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1.5_sL1/qualification.json new file mode 100644 index 00000000..a82a3809 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1.5_sL1/qualification.json @@ -0,0 +1,83 @@ +{ + "case_id": "C04_gf180_sW1.5_sL1", + "circuit_id": "C04", + "pdk": "gf180", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "single", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.56, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "834dbe4cf1c65d82", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 35.44 + }, + "f3db": { + "min": 1608000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 38.43946, + "f3db": 2679591.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vout0": 0.9008991, + "vin0": 0.9008991, + "idd": 2.180169e-05, + "gain_lf": 38.43946, + "f3db": 2679591.0, + "ugf": 224676300.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1.5_sL1/specs.json new file mode 100644 index 00000000..0a1eb475 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1.5_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 35.44 + }, + "f3db": { + "min": 1608000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 38.43946, + "f3db": 2679591.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1.5_sL1/target.spice new file mode 100644 index 00000000..f3b7e6eb --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1.5_sL1/target.spice @@ -0,0 +1,4 @@ +.subckt C04_gf180_sW1.5_sL1 VDD VSS VIN1 VOUT1 VB1 +MM1 VOUT1 VB1 VDD VDD pfet_03v3 w=6u l=0.56u nf=12 m=1 +MM2 VOUT1 VIN1 VSS VSS nfet_03v3 w=3u l=0.56u nf=6 m=1 +.ends C04_gf180_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1.5_sL1/target_lvs.spice new file mode 100644 index 00000000..03fa60c6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1.5_sL1/target_lvs.spice @@ -0,0 +1,20 @@ +.subckt C04_gf180_sW1.5_sL1 VDD VSS VIN1 VOUT1 VB1 +MM1_f0 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM1_f1 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM1_f2 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM1_f3 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM1_f4 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM1_f5 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM1_f6 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM1_f7 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM1_f8 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM1_f9 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM1_f10 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM1_f11 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f0 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM2_f1 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM2_f2 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM2_f3 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM2_f4 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM2_f5 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +.ends C04_gf180_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1.5_sL1/testbench.spice new file mode 100644 index 00000000..91f1fdf6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1.5_sL1/testbench.spice @@ -0,0 +1,27 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C04_gf180_sW1.5_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +MB_VB1 VB1 VB1 VDDB VDDB pfet_03v3 w=6u l=0.56u +IB_VB1 VB1 VSS 2e-05 +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1.5_sL2/case.json new file mode 100644 index 00000000..827ba949 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1.5_sL2/case.json @@ -0,0 +1,101 @@ +{ + "case_id": "C04_gf180_sW1.5_sL2", + "circuit_id": "C04", + "pdk": "gf180", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "dut_name": "C04_gf180_sW1.5_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 6.0, + "l": 1.12, + "nf": 12 + }, + "M2": { + "w": 3.0, + "l": 1.12, + "nf": 6 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M1", + "current": 2e-05 + } + }, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.12, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "ac9c00f6ba32d8e6", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1.5_sL2/manifest.json new file mode 100644 index 00000000..79b4aef8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "632f791ffab925b5c53292b984318fa87e6ce06558eb9a92d6c9912fd275181c", + "qualification.json": "202035633c183183a45df4500f7d4ed96e3ab9e2dde1fa94ec6ce9ecaab887e6", + "specs.json": "badeeb223f02f3b0237dfba8c01e635492c545b59bd8d2d7fb88e3abe777729e", + "target.spice": "f85fa043cbf4bdbbed8cfd16ed4b3f24159998cc1a09b7a7f10ccfb6fb8fce45", + "target_lvs.spice": "22bee181e7033db34899098092219f0da9477d3e28114a6fccf34da68ef58c32", + "testbench.spice": "40c9f533f3026ad1f17edff2437cda5cbd79580985dfdde79a0f06639f7dae23" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1.5_sL2/qualification.json new file mode 100644 index 00000000..4b27a116 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1.5_sL2/qualification.json @@ -0,0 +1,83 @@ +{ + "case_id": "C04_gf180_sW1.5_sL2", + "circuit_id": "C04", + "pdk": "gf180", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "single", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.12, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "ac9c00f6ba32d8e6", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 40.26 + }, + "f3db": { + "min": 1000000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 43.26178, + "f3db": 1043772.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vout0": 1.00573, + "vin0": 1.00573, + "idd": 2.025167e-05, + "gain_lf": 43.26178, + "f3db": 1043772.0, + "ugf": 152947800.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1.5_sL2/specs.json new file mode 100644 index 00000000..8b0819ed --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1.5_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 40.26 + }, + "f3db": { + "min": 1000000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 43.26178, + "f3db": 1043772.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1.5_sL2/target.spice new file mode 100644 index 00000000..714aa692 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1.5_sL2/target.spice @@ -0,0 +1,4 @@ +.subckt C04_gf180_sW1.5_sL2 VDD VSS VIN1 VOUT1 VB1 +MM1 VOUT1 VB1 VDD VDD pfet_03v3 w=6u l=1.12u nf=12 m=1 +MM2 VOUT1 VIN1 VSS VSS nfet_03v3 w=3u l=1.12u nf=6 m=1 +.ends C04_gf180_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1.5_sL2/target_lvs.spice new file mode 100644 index 00000000..9c6cefda --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1.5_sL2/target_lvs.spice @@ -0,0 +1,20 @@ +.subckt C04_gf180_sW1.5_sL2 VDD VSS VIN1 VOUT1 VB1 +MM1_f0 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM1_f1 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM1_f2 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM1_f3 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM1_f4 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM1_f5 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM1_f6 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM1_f7 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM1_f8 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM1_f9 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM1_f10 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM1_f11 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f0 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM2_f1 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM2_f2 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM2_f3 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM2_f4 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM2_f5 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +.ends C04_gf180_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1.5_sL2/testbench.spice new file mode 100644 index 00000000..dd7a4b0f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1.5_sL2/testbench.spice @@ -0,0 +1,27 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C04_gf180_sW1.5_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +MB_VB1 VB1 VB1 VDDB VDDB pfet_03v3 w=6u l=1.12u +IB_VB1 VB1 VSS 2e-05 +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1_sL1.5/case.json new file mode 100644 index 00000000..9dd82c67 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1_sL1.5/case.json @@ -0,0 +1,101 @@ +{ + "case_id": "C04_gf180_sW1_sL1.5", + "circuit_id": "C04", + "pdk": "gf180", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "dut_name": "C04_gf180_sW1_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.84, + "nf": 8 + }, + "M2": { + "w": 2.0, + "l": 0.84, + "nf": 4 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M1", + "current": 2e-05 + } + }, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "eb31a3b03ab1e1f1", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1_sL1.5/manifest.json new file mode 100644 index 00000000..bd54b10f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "15694cc5f4984f0b4aaf11450cf8f9413a2bb718fb22ce9f31ba8aa38913edca", + "qualification.json": "325b1dd51e16fc9f64fa19220745d8a6ee4bf20647ec870476523dd62d424c53", + "specs.json": "650889df7ccc9fb35b9e81cc9522211997680e027c4b2d9b5dcd2d6b1a8596b9", + "target.spice": "dd0eb4ece9d66aff85a908187065fd00971cac0a9bc35fd13a52ef652d09742d", + "target_lvs.spice": "381f0c4316c0230ca4fa72a070b6bbc63df3062eb65be2bf33b3e468e84c3764", + "testbench.spice": "be0e82c15b253eadb06a28bbad7dfbafabd949a12bd75f572c616581c0fa6e75" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1_sL1.5/qualification.json new file mode 100644 index 00000000..2104be37 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1_sL1.5/qualification.json @@ -0,0 +1,83 @@ +{ + "case_id": "C04_gf180_sW1_sL1.5", + "circuit_id": "C04", + "pdk": "gf180", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "single", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "eb31a3b03ab1e1f1", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 37.42 + }, + "f3db": { + "min": 1000000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 40.4152, + "f3db": 1400763.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vout0": 1.029848, + "vin0": 1.029848, + "idd": 2.043086e-05, + "gain_lf": 40.4152, + "f3db": 1400763.0, + "ugf": 147613000.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1_sL1.5/specs.json new file mode 100644 index 00000000..23366a24 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 37.42 + }, + "f3db": { + "min": 1000000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 40.4152, + "f3db": 1400763.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1_sL1.5/target.spice new file mode 100644 index 00000000..7df0b9d8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1_sL1.5/target.spice @@ -0,0 +1,4 @@ +.subckt C04_gf180_sW1_sL1.5 VDD VSS VIN1 VOUT1 VB1 +MM1 VOUT1 VB1 VDD VDD pfet_03v3 w=4u l=0.84u nf=8 m=1 +MM2 VOUT1 VIN1 VSS VSS nfet_03v3 w=2u l=0.84u nf=4 m=1 +.ends C04_gf180_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1_sL1.5/target_lvs.spice new file mode 100644 index 00000000..70cfd945 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1_sL1.5/target_lvs.spice @@ -0,0 +1,14 @@ +.subckt C04_gf180_sW1_sL1.5 VDD VSS VIN1 VOUT1 VB1 +MM1_f0 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM1_f1 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM1_f2 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM1_f3 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM1_f4 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM1_f5 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM1_f6 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM1_f7 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f0 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM2_f1 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM2_f2 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM2_f3 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +.ends C04_gf180_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1_sL1.5/testbench.spice new file mode 100644 index 00000000..7c826e71 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1_sL1.5/testbench.spice @@ -0,0 +1,27 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C04_gf180_sW1_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +MB_VB1 VB1 VB1 VDDB VDDB pfet_03v3 w=4u l=0.84u +IB_VB1 VB1 VSS 2e-05 +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1_sL1/case.json new file mode 100644 index 00000000..906fcdfe --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1_sL1/case.json @@ -0,0 +1,101 @@ +{ + "case_id": "C04_gf180_sW1_sL1", + "circuit_id": "C04", + "pdk": "gf180", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "dut_name": "C04_gf180_sW1_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "M2": { + "w": 2.0, + "l": 0.56, + "nf": 4 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M1", + "current": 2e-05 + } + }, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "1de1531581fde416", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1_sL1/manifest.json new file mode 100644 index 00000000..f4960239 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "00d57837ec42eb1713e33966dc0c2123cd66fe3c52dbdd80546c882337908cc0", + "qualification.json": "6ef8c5d26bb130c950e308a60de7410c7998b8a347390804f1e21c3e026ef103", + "specs.json": "efc983190c5700984bc13878ffb06b884d1967913bc6f39537d66ed1a4e34e26", + "target.spice": "d0e00e27cdb04a8957c9f63b6ed06f9f3fbbd01d4caf23a2b2e43c77d0e75add", + "target_lvs.spice": "b9b4dab203c5e269329e20f130d346e65bc39ffdfb0480156adcc147029d2624", + "testbench.spice": "4e5edda3bca58dd256f29cd404531dac80da34b3e0ff2d45e8aebeabf1f23bcc" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1_sL1/qualification.json new file mode 100644 index 00000000..22258b31 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1_sL1/qualification.json @@ -0,0 +1,83 @@ +{ + "case_id": "C04_gf180_sW1_sL1", + "circuit_id": "C04", + "pdk": "gf180", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "single", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "1de1531581fde416", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 34.34 + }, + "f3db": { + "min": 1506000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 37.34011, + "f3db": 2510374.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vout0": 0.9591849, + "vin0": 0.9591849, + "idd": 2.124699e-05, + "gain_lf": 37.34011, + "f3db": 2510374.0, + "ugf": 185593900.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1_sL1/specs.json new file mode 100644 index 00000000..e79a21d8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 34.34 + }, + "f3db": { + "min": 1506000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 37.34011, + "f3db": 2510374.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1_sL1/target.spice new file mode 100644 index 00000000..89ab54ca --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1_sL1/target.spice @@ -0,0 +1,4 @@ +.subckt C04_gf180_sW1_sL1 VDD VSS VIN1 VOUT1 VB1 +MM1 VOUT1 VB1 VDD VDD pfet_03v3 w=4u l=0.56u nf=8 m=1 +MM2 VOUT1 VIN1 VSS VSS nfet_03v3 w=2u l=0.56u nf=4 m=1 +.ends C04_gf180_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1_sL1/target_lvs.spice new file mode 100644 index 00000000..95e68b30 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1_sL1/target_lvs.spice @@ -0,0 +1,14 @@ +.subckt C04_gf180_sW1_sL1 VDD VSS VIN1 VOUT1 VB1 +MM1_f0 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM1_f1 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM1_f2 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM1_f3 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM1_f4 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM1_f5 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM1_f6 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM1_f7 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f0 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM2_f1 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM2_f2 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM2_f3 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +.ends C04_gf180_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1_sL1/testbench.spice new file mode 100644 index 00000000..f860c35b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1_sL1/testbench.spice @@ -0,0 +1,27 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C04_gf180_sW1_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +MB_VB1 VB1 VB1 VDDB VDDB pfet_03v3 w=4u l=0.56u +IB_VB1 VB1 VSS 2e-05 +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1_sL2/case.json new file mode 100644 index 00000000..d9d1f8ce --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1_sL2/case.json @@ -0,0 +1,101 @@ +{ + "case_id": "C04_gf180_sW1_sL2", + "circuit_id": "C04", + "pdk": "gf180", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "dut_name": "C04_gf180_sW1_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 1.12, + "nf": 8 + }, + "M2": { + "w": 2.0, + "l": 1.12, + "nf": 4 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M1", + "current": 2e-05 + } + }, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "7728496ffc2a1c2e", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1_sL2/manifest.json new file mode 100644 index 00000000..74118f15 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "164f7b810eca96db5cf1d3308584e707698b9801600cefcf5984ae3fe3a35fba", + "qualification.json": "19a6a6365b3a71cf6870bed97328a0b53f6f2b09cd208528eae97ed39e867a93", + "specs.json": "74024ec591bf68cf1280d8121a7b9be06e6eaec36a72d33a8f79feb9704a6168", + "target.spice": "c38eb11af0c21515829b354f2396d2ec22ef8979e5c1bfefce03c4a31472a4dc", + "target_lvs.spice": "9d9fd3d638e3fe74e00627505f11766d97eb501de7798b7cb860b9afd94b4a88", + "testbench.spice": "d79b1fe8a8f0459bb81cbda78872b4d20c6c41daa4f86b5a9b9d557c12fda238" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1_sL2/qualification.json new file mode 100644 index 00000000..b1cf0757 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1_sL2/qualification.json @@ -0,0 +1,83 @@ +{ + "case_id": "C04_gf180_sW1_sL2", + "circuit_id": "C04", + "pdk": "gf180", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "single", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "7728496ffc2a1c2e", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 38.93 + }, + "f3db": { + "min": 1000000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 41.92742, + "f3db": 1013506.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vout0": 1.091967, + "vin0": 1.091967, + "idd": 2.02447e-05, + "gain_lf": 41.92742, + "f3db": 1013506.0, + "ugf": 127029000.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1_sL2/specs.json new file mode 100644 index 00000000..32337c84 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 38.93 + }, + "f3db": { + "min": 1000000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 41.92742, + "f3db": 1013506.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1_sL2/target.spice new file mode 100644 index 00000000..2642160d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1_sL2/target.spice @@ -0,0 +1,4 @@ +.subckt C04_gf180_sW1_sL2 VDD VSS VIN1 VOUT1 VB1 +MM1 VOUT1 VB1 VDD VDD pfet_03v3 w=4u l=1.12u nf=8 m=1 +MM2 VOUT1 VIN1 VSS VSS nfet_03v3 w=2u l=1.12u nf=4 m=1 +.ends C04_gf180_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1_sL2/target_lvs.spice new file mode 100644 index 00000000..1d2ad791 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1_sL2/target_lvs.spice @@ -0,0 +1,14 @@ +.subckt C04_gf180_sW1_sL2 VDD VSS VIN1 VOUT1 VB1 +MM1_f0 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM1_f1 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM1_f2 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM1_f3 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM1_f4 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM1_f5 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM1_f6 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM1_f7 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f0 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM2_f1 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM2_f2 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM2_f3 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +.ends C04_gf180_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1_sL2/testbench.spice new file mode 100644 index 00000000..ac30ca9c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW1_sL2/testbench.spice @@ -0,0 +1,27 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C04_gf180_sW1_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +MB_VB1 VB1 VB1 VDDB VDDB pfet_03v3 w=4u l=1.12u +IB_VB1 VB1 VSS 2e-05 +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C04/gf180/sW2_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW2_sL1.5/case.json new file mode 100644 index 00000000..0da4a15e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW2_sL1.5/case.json @@ -0,0 +1,101 @@ +{ + "case_id": "C04_gf180_sW2_sL1.5", + "circuit_id": "C04", + "pdk": "gf180", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "dut_name": "C04_gf180_sW2_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 8.0, + "l": 0.84, + "nf": 16 + }, + "M2": { + "w": 4.0, + "l": 0.84, + "nf": 8 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M1", + "current": 2e-05 + } + }, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "2abf8061df3bc753", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/gf180/sW2_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW2_sL1.5/manifest.json new file mode 100644 index 00000000..0d2aa0bb --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW2_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "6dc4a2231ef215b8e7dca378540b52315e1ee9aa2d4ec59d399d4d285c8aa522", + "qualification.json": "85fa7db85ade1401d415e7c6a3723304d115c33e8f8247ca44873436f7978fda", + "specs.json": "04648158465b1aead8ba35a59ad55c2f8532fec167d169b422772d5f741c5465", + "target.spice": "d81ad3b3f9f63eb80aa112205b9a012c56aa9832d5509ac752bab0c5688713e7", + "target_lvs.spice": "8d0e677a471e893ab566b3f84d6ffd907a61d47941e011c8bccb1ba1de3ff6ed", + "testbench.spice": "e24b68c679c963571272e10f605b6ce8b1f9e2d78a5cdd1baf2086810252239f" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/gf180/sW2_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW2_sL1.5/qualification.json new file mode 100644 index 00000000..d4a74575 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW2_sL1.5/qualification.json @@ -0,0 +1,83 @@ +{ + "case_id": "C04_gf180_sW2_sL1.5", + "circuit_id": "C04", + "pdk": "gf180", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "single", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "2abf8061df3bc753", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 39.49 + }, + "f3db": { + "min": 1000000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 42.49499, + "f3db": 1495316.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vout0": 0.9128714, + "vin0": 0.9128714, + "idd": 2.077108e-05, + "gain_lf": 42.49499, + "f3db": 1495316.0, + "ugf": 200476500.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/gf180/sW2_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW2_sL1.5/specs.json new file mode 100644 index 00000000..55f97b38 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW2_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 39.49 + }, + "f3db": { + "min": 1000000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 42.49499, + "f3db": 1495316.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/gf180/sW2_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW2_sL1.5/target.spice new file mode 100644 index 00000000..9a54f48d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW2_sL1.5/target.spice @@ -0,0 +1,4 @@ +.subckt C04_gf180_sW2_sL1.5 VDD VSS VIN1 VOUT1 VB1 +MM1 VOUT1 VB1 VDD VDD pfet_03v3 w=8u l=0.84u nf=16 m=1 +MM2 VOUT1 VIN1 VSS VSS nfet_03v3 w=4u l=0.84u nf=8 m=1 +.ends C04_gf180_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C04/gf180/sW2_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW2_sL1.5/target_lvs.spice new file mode 100644 index 00000000..87c79a1f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW2_sL1.5/target_lvs.spice @@ -0,0 +1,26 @@ +.subckt C04_gf180_sW2_sL1.5 VDD VSS VIN1 VOUT1 VB1 +MM1_f0 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM1_f1 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM1_f2 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM1_f3 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM1_f4 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM1_f5 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM1_f6 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM1_f7 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM1_f8 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM1_f9 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM1_f10 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM1_f11 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM1_f12 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM1_f13 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM1_f14 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM1_f15 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f0 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM2_f1 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM2_f2 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM2_f3 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM2_f4 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM2_f5 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM2_f6 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM2_f7 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +.ends C04_gf180_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C04/gf180/sW2_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW2_sL1.5/testbench.spice new file mode 100644 index 00000000..d6cb9dec --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW2_sL1.5/testbench.spice @@ -0,0 +1,27 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C04_gf180_sW2_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +MB_VB1 VB1 VB1 VDDB VDDB pfet_03v3 w=8u l=0.84u +IB_VB1 VB1 VSS 2e-05 +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C04/gf180/sW2_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW2_sL1/case.json new file mode 100644 index 00000000..f4fbd7ad --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW2_sL1/case.json @@ -0,0 +1,101 @@ +{ + "case_id": "C04_gf180_sW2_sL1", + "circuit_id": "C04", + "pdk": "gf180", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "dut_name": "C04_gf180_sW2_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 8.0, + "l": 0.56, + "nf": 16 + }, + "M2": { + "w": 4.0, + "l": 0.56, + "nf": 8 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M1", + "current": 2e-05 + } + }, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "f26ae743bd8c1153", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/gf180/sW2_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW2_sL1/manifest.json new file mode 100644 index 00000000..04a649c1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW2_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "734458b622a1fe0b2de6f8391ad23dfee413a4efbc16058f589c499e5d7182e2", + "qualification.json": "748281a2ca59cdae217c46454ca89c6acf8797d589407bded4a11c0459527a91", + "specs.json": "d205ff35b0ed5b47cf81ea1c7e4dae4cf406ae8f41fea6dd55e7f437e5a5bd1c", + "target.spice": "86dc881c55cb20b04208866ea10ef2ef6521474087a9b9b123b3bc73f375fb4c", + "target_lvs.spice": "d5d7769aeb16406fc9ff4f0ec9ab23ce180a509e3707cbeb60f420a70358e709", + "testbench.spice": "ce349e24e2ae56ebf84b6774ff82c0c60056e11165b11a8bbf21f64600c504e1" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/gf180/sW2_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW2_sL1/qualification.json new file mode 100644 index 00000000..7cfc1a4d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW2_sL1/qualification.json @@ -0,0 +1,83 @@ +{ + "case_id": "C04_gf180_sW2_sL1", + "circuit_id": "C04", + "pdk": "gf180", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "single", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "f26ae743bd8c1153", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 36.1 + }, + "f3db": { + "min": 1682000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 39.1024, + "f3db": 2803340.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vout0": 0.8664028, + "vin0": 0.8664028, + "idd": 2.23145e-05, + "gain_lf": 39.1024, + "f3db": 2803340.0, + "ugf": 254032700.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/gf180/sW2_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW2_sL1/specs.json new file mode 100644 index 00000000..1f14fa73 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW2_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 36.1 + }, + "f3db": { + "min": 1682000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 39.1024, + "f3db": 2803340.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/gf180/sW2_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW2_sL1/target.spice new file mode 100644 index 00000000..409f073e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW2_sL1/target.spice @@ -0,0 +1,4 @@ +.subckt C04_gf180_sW2_sL1 VDD VSS VIN1 VOUT1 VB1 +MM1 VOUT1 VB1 VDD VDD pfet_03v3 w=8u l=0.56u nf=16 m=1 +MM2 VOUT1 VIN1 VSS VSS nfet_03v3 w=4u l=0.56u nf=8 m=1 +.ends C04_gf180_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C04/gf180/sW2_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW2_sL1/target_lvs.spice new file mode 100644 index 00000000..7dbc6840 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW2_sL1/target_lvs.spice @@ -0,0 +1,26 @@ +.subckt C04_gf180_sW2_sL1 VDD VSS VIN1 VOUT1 VB1 +MM1_f0 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM1_f1 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM1_f2 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM1_f3 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM1_f4 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM1_f5 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM1_f6 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM1_f7 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM1_f8 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM1_f9 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM1_f10 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM1_f11 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM1_f12 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM1_f13 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM1_f14 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM1_f15 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f0 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM2_f1 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM2_f2 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM2_f3 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM2_f4 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM2_f5 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM2_f6 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM2_f7 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +.ends C04_gf180_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C04/gf180/sW2_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW2_sL1/testbench.spice new file mode 100644 index 00000000..987fdeab --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW2_sL1/testbench.spice @@ -0,0 +1,27 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C04_gf180_sW2_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +MB_VB1 VB1 VB1 VDDB VDDB pfet_03v3 w=8u l=0.56u +IB_VB1 VB1 VSS 2e-05 +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C04/gf180/sW2_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW2_sL2/case.json new file mode 100644 index 00000000..4ce9772d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW2_sL2/case.json @@ -0,0 +1,101 @@ +{ + "case_id": "C04_gf180_sW2_sL2", + "circuit_id": "C04", + "pdk": "gf180", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "dut_name": "C04_gf180_sW2_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 8.0, + "l": 1.12, + "nf": 16 + }, + "M2": { + "w": 4.0, + "l": 1.12, + "nf": 8 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M1", + "current": 2e-05 + } + }, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "d9962e9042c54950", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/gf180/sW2_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW2_sL2/manifest.json new file mode 100644 index 00000000..3e3047d2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW2_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "455b0d9003607a99c55e8849580a30c86cc2088987aa59c3495136e8d7963bcf", + "qualification.json": "25da878756aca8592303ce61643c51f07a639550134ef752c053ac74a51c173b", + "specs.json": "8cdeac9d10c8185af3ccb30ab82f76e1b9b15836b1428a8d87f7437773d71585", + "target.spice": "701d9ad62728c9ecd560399a84392d33a3502dd3533e83f8e8f15ec7fc945ba4", + "target_lvs.spice": "745c85f5dc4a3ca1dbc1b3be2281ae157f473b75fcd62d6683a9434ae6cfb9f7", + "testbench.spice": "01fb5ffca377326f9aba2f5065b66e44bc93e48ff019113b677b44cd9450439b" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/gf180/sW2_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW2_sL2/qualification.json new file mode 100644 index 00000000..2a82d9f4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW2_sL2/qualification.json @@ -0,0 +1,83 @@ +{ + "case_id": "C04_gf180_sW2_sL2", + "circuit_id": "C04", + "pdk": "gf180", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "single", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "d9962e9042c54950", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 41.09 + }, + "f3db": { + "min": 1000000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 44.09058, + "f3db": 1067028.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vout0": 0.9551104, + "vin0": 0.9551104, + "idd": 2.031433e-05, + "gain_lf": 44.09058, + "f3db": 1067028.0, + "ugf": 172375100.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/gf180/sW2_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW2_sL2/specs.json new file mode 100644 index 00000000..fd62f70f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW2_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 41.09 + }, + "f3db": { + "min": 1000000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 44.09058, + "f3db": 1067028.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/gf180/sW2_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW2_sL2/target.spice new file mode 100644 index 00000000..46a11af8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW2_sL2/target.spice @@ -0,0 +1,4 @@ +.subckt C04_gf180_sW2_sL2 VDD VSS VIN1 VOUT1 VB1 +MM1 VOUT1 VB1 VDD VDD pfet_03v3 w=8u l=1.12u nf=16 m=1 +MM2 VOUT1 VIN1 VSS VSS nfet_03v3 w=4u l=1.12u nf=8 m=1 +.ends C04_gf180_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C04/gf180/sW2_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW2_sL2/target_lvs.spice new file mode 100644 index 00000000..4bb7f437 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW2_sL2/target_lvs.spice @@ -0,0 +1,26 @@ +.subckt C04_gf180_sW2_sL2 VDD VSS VIN1 VOUT1 VB1 +MM1_f0 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM1_f1 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM1_f2 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM1_f3 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM1_f4 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM1_f5 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM1_f6 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM1_f7 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM1_f8 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM1_f9 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM1_f10 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM1_f11 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM1_f12 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM1_f13 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM1_f14 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM1_f15 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f0 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM2_f1 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM2_f2 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM2_f3 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM2_f4 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM2_f5 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM2_f6 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM2_f7 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +.ends C04_gf180_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C04/gf180/sW2_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW2_sL2/testbench.spice new file mode 100644 index 00000000..03daf2d8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/gf180/sW2_sL2/testbench.spice @@ -0,0 +1,27 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C04_gf180_sW2_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +MB_VB1 VB1 VB1 VDDB VDDB pfet_03v3 w=8u l=1.12u +IB_VB1 VB1 VSS 2e-05 +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW0.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW0.5_sL1.5/case.json new file mode 100644 index 00000000..aa496ade --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW0.5_sL1.5/case.json @@ -0,0 +1,101 @@ +{ + "case_id": "C04_ihp130_sW0.5_sL1.5", + "circuit_id": "C04", + "pdk": "ihp130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "dut_name": "C04_ihp130_sW0.5_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.39, + "nf": 4 + }, + "M2": { + "w": 1.0, + "l": 0.39, + "nf": 2 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M1", + "current": 2e-05 + } + }, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.39, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "8b813574283ad134", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW0.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW0.5_sL1.5/manifest.json new file mode 100644 index 00000000..bbba9107 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW0.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "0e24ce57b438c0ea4eacba04e3dd542faee73ac33d0f3769236963062273e048", + "qualification.json": "47479cb2812b93d95e0a9676de7c5db1998108f3b747fec73526d880f36932f8", + "specs.json": "633b05e130be8e1f7847145e73382be58e950d3e36304bc022c2661002172bad", + "target.spice": "59e1385dc494b703118ba449d696ace79a5b6e5cec15d0914a228ef8ca07f898", + "target_lvs.spice": "f623d1698fd050c330037d12017f873d5b94e504d445f5a3c75522b229bec8cb", + "testbench.spice": "783ad4d1da9f7c8f4856acc0580530fb97bdd9df8884942a250a90458bc93e31" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW0.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW0.5_sL1.5/qualification.json new file mode 100644 index 00000000..8b537db8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW0.5_sL1.5/qualification.json @@ -0,0 +1,83 @@ +{ + "case_id": "C04_ihp130_sW0.5_sL1.5", + "circuit_id": "C04", + "pdk": "ihp130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "single", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.39, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "8b813574283ad134", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 21.77 + }, + "f3db": { + "min": 8830000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 24.76924, + "f3db": 14717410.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vout0": 0.5453245, + "vin0": 0.5453245, + "idd": 2.18489e-05, + "gain_lf": 24.76924, + "f3db": 14717410.0, + "ugf": 255338500.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW0.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW0.5_sL1.5/specs.json new file mode 100644 index 00000000..9a1ca265 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW0.5_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 21.77 + }, + "f3db": { + "min": 8830000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 24.76924, + "f3db": 14717410.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW0.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW0.5_sL1.5/target.spice new file mode 100644 index 00000000..e55dff6c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW0.5_sL1.5/target.spice @@ -0,0 +1,4 @@ +.subckt C04_ihp130_sW0.5_sL1.5 VDD VSS VIN1 VOUT1 VB1 +XM1 VOUT1 VB1 VDD VDD sg13_lv_pmos w=2u l=0.39u ng=4 m=1 +XM2 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=1u l=0.39u ng=2 m=1 +.ends C04_ihp130_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW0.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW0.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..eb5a81cb --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW0.5_sL1.5/target_lvs.spice @@ -0,0 +1,8 @@ +.subckt C04_ihp130_sW0.5_sL1.5 VDD VSS VIN1 VOUT1 VB1 +XM1_f0 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM1_f1 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM1_f2 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM1_f3 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f0 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f1 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +.ends C04_ihp130_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW0.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW0.5_sL1.5/testbench.spice new file mode 100644 index 00000000..a5ccbcd7 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW0.5_sL1.5/testbench.spice @@ -0,0 +1,27 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C04_ihp130_sW0.5_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +XB_VB1 VB1 VB1 VDDB VDDB sg13_lv_pmos w=2u l=0.39u +IB_VB1 VB1 VSS 2e-05 +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW0.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW0.5_sL1/case.json new file mode 100644 index 00000000..590a9028 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW0.5_sL1/case.json @@ -0,0 +1,101 @@ +{ + "case_id": "C04_ihp130_sW0.5_sL1", + "circuit_id": "C04", + "pdk": "ihp130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "dut_name": "C04_ihp130_sW0.5_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.26, + "nf": 4 + }, + "M2": { + "w": 1.0, + "l": 0.26, + "nf": 2 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M1", + "current": 2e-05 + } + }, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.26, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.26, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "0945adf3afbcf5e8", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW0.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW0.5_sL1/manifest.json new file mode 100644 index 00000000..7f57bfb2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW0.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "e5d855addfb29cf78f0b78709764d71ffac74147899b9cb91bbfcfcb0a20b580", + "qualification.json": "03332b78139a6e281d7a54e60dace329368556545a5526efec11a5078f951f6b", + "specs.json": "fc62973abaa8e7c3e64b3ad1e47d67e0e7f59e6494fe350c5780a09e9ff9de69", + "target.spice": "777e7a7bfeccd884d7166e1613c732759778cf740c0d6a57eb3a8aac12c3feaa", + "target_lvs.spice": "e283a548cb0c8a593bd8f872fc6fa635e8c3ab38ae507faa4c6488d3b84fba39", + "testbench.spice": "84880cb93fa2153cc204568de8b21537f73e059588abb4c02bdf0baf05e5b99a" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW0.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW0.5_sL1/qualification.json new file mode 100644 index 00000000..4391f5c8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW0.5_sL1/qualification.json @@ -0,0 +1,83 @@ +{ + "case_id": "C04_ihp130_sW0.5_sL1", + "circuit_id": "C04", + "pdk": "ihp130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "single", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.26, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.26, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "0945adf3afbcf5e8", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 20.51 + }, + "f3db": { + "min": 11260000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 23.50605, + "f3db": 18772100.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vout0": 0.5445191, + "vin0": 0.5445191, + "idd": 2.10582e-05, + "gain_lf": 23.50605, + "f3db": 18772100.0, + "ugf": 281196600.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW0.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW0.5_sL1/specs.json new file mode 100644 index 00000000..106a1466 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW0.5_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 20.51 + }, + "f3db": { + "min": 11260000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 23.50605, + "f3db": 18772100.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW0.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW0.5_sL1/target.spice new file mode 100644 index 00000000..f14e027d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW0.5_sL1/target.spice @@ -0,0 +1,4 @@ +.subckt C04_ihp130_sW0.5_sL1 VDD VSS VIN1 VOUT1 VB1 +XM1 VOUT1 VB1 VDD VDD sg13_lv_pmos w=2u l=0.26u ng=4 m=1 +XM2 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=1u l=0.26u ng=2 m=1 +.ends C04_ihp130_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW0.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW0.5_sL1/target_lvs.spice new file mode 100644 index 00000000..542ca7be --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW0.5_sL1/target_lvs.spice @@ -0,0 +1,8 @@ +.subckt C04_ihp130_sW0.5_sL1 VDD VSS VIN1 VOUT1 VB1 +XM1_f0 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM1_f1 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM1_f2 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM1_f3 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f0 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f1 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +.ends C04_ihp130_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW0.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW0.5_sL1/testbench.spice new file mode 100644 index 00000000..f898e548 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW0.5_sL1/testbench.spice @@ -0,0 +1,27 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C04_ihp130_sW0.5_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +XB_VB1 VB1 VB1 VDDB VDDB sg13_lv_pmos w=2u l=0.26u +IB_VB1 VB1 VSS 2e-05 +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW0.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW0.5_sL2/case.json new file mode 100644 index 00000000..36e50ca0 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW0.5_sL2/case.json @@ -0,0 +1,101 @@ +{ + "case_id": "C04_ihp130_sW0.5_sL2", + "circuit_id": "C04", + "pdk": "ihp130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "dut_name": "C04_ihp130_sW0.5_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.52, + "nf": 4 + }, + "M2": { + "w": 1.0, + "l": 0.52, + "nf": 2 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M1", + "current": 2e-05 + } + }, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.52, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "4ae5b357404368b3", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW0.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW0.5_sL2/manifest.json new file mode 100644 index 00000000..c9158e46 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW0.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "24717989e41b2da3db6a63f3b1966ba1665ab5e7b363607d90dfc46b7d18f9a2", + "qualification.json": "e9286eaf9a63600ab0513f1fb57ac796bf7dfdb2bb5f98bde0a7d8c37d0dc3e7", + "specs.json": "6739fae2d7b6839a48e8feaa3e1f432f8c572f8454c3ca9767893896fa99cbea", + "target.spice": "663711523dc8a1c3f2cdd256a1133ced9dd095d04587829dcd064c6d11b54278", + "target_lvs.spice": "e0bac1b22fb6a968a89904ef059208ab294b01e6ceba855568cc8fb5e7054952", + "testbench.spice": "650cc57b450e90bb38df35e4bec2b024fb98b44dfcfe540114699a0452b054c2" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW0.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW0.5_sL2/qualification.json new file mode 100644 index 00000000..131b9bf1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW0.5_sL2/qualification.json @@ -0,0 +1,83 @@ +{ + "case_id": "C04_ihp130_sW0.5_sL2", + "circuit_id": "C04", + "pdk": "ihp130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "single", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.52, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "4ae5b357404368b3", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 22.43 + }, + "f3db": { + "min": 7444000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 25.43384, + "f3db": 12406650.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.2, + "schematic_measures": { + "vout0": 0.5593728, + "vin0": 0.5593728, + "idd": 2.216823e-05, + "gain_lf": 25.43384, + "f3db": 12406650.0, + "ugf": 232659000.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW0.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW0.5_sL2/specs.json new file mode 100644 index 00000000..e168e4bf --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW0.5_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 22.43 + }, + "f3db": { + "min": 7444000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 25.43384, + "f3db": 12406650.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW0.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW0.5_sL2/target.spice new file mode 100644 index 00000000..a6f6c9cc --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW0.5_sL2/target.spice @@ -0,0 +1,4 @@ +.subckt C04_ihp130_sW0.5_sL2 VDD VSS VIN1 VOUT1 VB1 +XM1 VOUT1 VB1 VDD VDD sg13_lv_pmos w=2u l=0.52u ng=4 m=1 +XM2 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=1u l=0.52u ng=2 m=1 +.ends C04_ihp130_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW0.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW0.5_sL2/target_lvs.spice new file mode 100644 index 00000000..11736ec4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW0.5_sL2/target_lvs.spice @@ -0,0 +1,8 @@ +.subckt C04_ihp130_sW0.5_sL2 VDD VSS VIN1 VOUT1 VB1 +XM1_f0 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f1 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f2 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f3 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f0 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f1 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +.ends C04_ihp130_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW0.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW0.5_sL2/testbench.spice new file mode 100644 index 00000000..f19de330 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW0.5_sL2/testbench.spice @@ -0,0 +1,27 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C04_ihp130_sW0.5_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +XB_VB1 VB1 VB1 VDDB VDDB sg13_lv_pmos w=2u l=0.52u +IB_VB1 VB1 VSS 2e-05 +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1.5_sL1.5/case.json new file mode 100644 index 00000000..41eb24b9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1.5_sL1.5/case.json @@ -0,0 +1,101 @@ +{ + "case_id": "C04_ihp130_sW1.5_sL1.5", + "circuit_id": "C04", + "pdk": "ihp130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "dut_name": "C04_ihp130_sW1.5_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 6.0, + "l": 0.39, + "nf": 12 + }, + "M2": { + "w": 3.0, + "l": 0.39, + "nf": 6 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M1", + "current": 2e-05 + } + }, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.39, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.39, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "787e72fcac157b6f", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1.5_sL1.5/manifest.json new file mode 100644 index 00000000..224f1965 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "843bf8a05ebe0d8f71d5b3d37cf3122e79b4088fbb33b02376c2e26cfea5ca58", + "qualification.json": "5afd80a1fce280a663179faf375b68b4e2f6eab71b71e4936cee069059d79f34", + "specs.json": "5fc4f0a7f8b13ea756d2e4bf967433e715ed2b1bf1a771d5ae3f9c5870a78fb8", + "target.spice": "5235fc49c9dc9e85823904c7320f91644b0d70942a46aeadaae49eabb77c335d", + "target_lvs.spice": "ed4dd78b2682b77488c65db1a2ca5ad7d2d1809e4e8018a1d2dfd24edb16f27e", + "testbench.spice": "11a7411ee8d8bd931eb3c9fd84cc9ef78f83597ab7482f3ce2be83dae8dc981b" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1.5_sL1.5/qualification.json new file mode 100644 index 00000000..b11fa4af --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1.5_sL1.5/qualification.json @@ -0,0 +1,83 @@ +{ + "case_id": "C04_ihp130_sW1.5_sL1.5", + "circuit_id": "C04", + "pdk": "ihp130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "single", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.39, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.39, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "787e72fcac157b6f", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 22.43 + }, + "f3db": { + "min": 12350000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 25.43194, + "f3db": 20582690.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.2, + "schematic_measures": { + "vout0": 0.4396949, + "vin0": 0.4396949, + "idd": 2.337619e-05, + "gain_lf": 25.43194, + "f3db": 20582690.0, + "ugf": 387849100.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1.5_sL1.5/specs.json new file mode 100644 index 00000000..92f4021e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1.5_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 22.43 + }, + "f3db": { + "min": 12350000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 25.43194, + "f3db": 20582690.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1.5_sL1.5/target.spice new file mode 100644 index 00000000..d4b3309d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1.5_sL1.5/target.spice @@ -0,0 +1,4 @@ +.subckt C04_ihp130_sW1.5_sL1.5 VDD VSS VIN1 VOUT1 VB1 +XM1 VOUT1 VB1 VDD VDD sg13_lv_pmos w=6u l=0.39u ng=12 m=1 +XM2 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=3u l=0.39u ng=6 m=1 +.ends C04_ihp130_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..f4bb6457 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1.5_sL1.5/target_lvs.spice @@ -0,0 +1,20 @@ +.subckt C04_ihp130_sW1.5_sL1.5 VDD VSS VIN1 VOUT1 VB1 +XM1_f0 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM1_f1 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM1_f2 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM1_f3 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM1_f4 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM1_f5 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM1_f6 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM1_f7 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM1_f8 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM1_f9 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM1_f10 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM1_f11 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f0 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f1 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f2 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f3 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f4 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f5 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +.ends C04_ihp130_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1.5_sL1.5/testbench.spice new file mode 100644 index 00000000..6acfbde2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1.5_sL1.5/testbench.spice @@ -0,0 +1,27 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C04_ihp130_sW1.5_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +XB_VB1 VB1 VB1 VDDB VDDB sg13_lv_pmos w=6u l=0.39u +IB_VB1 VB1 VSS 2e-05 +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1.5_sL1/case.json new file mode 100644 index 00000000..fc283fe3 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1.5_sL1/case.json @@ -0,0 +1,101 @@ +{ + "case_id": "C04_ihp130_sW1.5_sL1", + "circuit_id": "C04", + "pdk": "ihp130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "dut_name": "C04_ihp130_sW1.5_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 6.0, + "l": 0.26, + "nf": 12 + }, + "M2": { + "w": 3.0, + "l": 0.26, + "nf": 6 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M1", + "current": 2e-05 + } + }, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.26, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.26, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "49cbe5fbb3ed1378", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1.5_sL1/manifest.json new file mode 100644 index 00000000..49ba00aa --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "836c341c758d2668e7c65fa302513add5941240d3a2799fd2341231985df3a1a", + "qualification.json": "52231cf9866fcf744d88b64e123db2b87a4efdd264384722cbdf753bff869434", + "specs.json": "d86323b637b82d233647f08d3b777a09a7f99e2727ec2063a9787c3bce63aee3", + "target.spice": "2f43ff1c6601f128c1595cbc7bde2bd24e09e5ae33a1f99a597454f5cd03707d", + "target_lvs.spice": "3c33cd0eddd597e348d2ad26aa2bbedf411782ea6bce67fcb5797eaa3dd66bb9", + "testbench.spice": "a7cfdf6d4f329a81ba54d588284747cd1e7882af5d2174eb0bb68bad01c12385" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1.5_sL1/qualification.json new file mode 100644 index 00000000..3eb8052f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1.5_sL1/qualification.json @@ -0,0 +1,83 @@ +{ + "case_id": "C04_ihp130_sW1.5_sL1", + "circuit_id": "C04", + "pdk": "ihp130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "single", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.26, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.26, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "49cbe5fbb3ed1378", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 20.97 + }, + "f3db": { + "min": 15580000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 23.97213, + "f3db": 25973440.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.2, + "schematic_measures": { + "vout0": 0.4506865, + "vin0": 0.4506865, + "idd": 2.233765e-05, + "gain_lf": 23.97213, + "f3db": 25973440.0, + "ugf": 412146200.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1.5_sL1/specs.json new file mode 100644 index 00000000..730cff62 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1.5_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 20.97 + }, + "f3db": { + "min": 15580000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 23.97213, + "f3db": 25973440.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1.5_sL1/target.spice new file mode 100644 index 00000000..28d16adf --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1.5_sL1/target.spice @@ -0,0 +1,4 @@ +.subckt C04_ihp130_sW1.5_sL1 VDD VSS VIN1 VOUT1 VB1 +XM1 VOUT1 VB1 VDD VDD sg13_lv_pmos w=6u l=0.26u ng=12 m=1 +XM2 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=3u l=0.26u ng=6 m=1 +.ends C04_ihp130_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1.5_sL1/target_lvs.spice new file mode 100644 index 00000000..c59c53f8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1.5_sL1/target_lvs.spice @@ -0,0 +1,20 @@ +.subckt C04_ihp130_sW1.5_sL1 VDD VSS VIN1 VOUT1 VB1 +XM1_f0 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM1_f1 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM1_f2 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM1_f3 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM1_f4 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM1_f5 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM1_f6 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM1_f7 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM1_f8 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM1_f9 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM1_f10 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM1_f11 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f0 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f1 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f2 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f3 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f4 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f5 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +.ends C04_ihp130_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1.5_sL1/testbench.spice new file mode 100644 index 00000000..5399a000 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1.5_sL1/testbench.spice @@ -0,0 +1,27 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C04_ihp130_sW1.5_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +XB_VB1 VB1 VB1 VDDB VDDB sg13_lv_pmos w=6u l=0.26u +IB_VB1 VB1 VSS 2e-05 +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1.5_sL2/case.json new file mode 100644 index 00000000..bdef69d8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1.5_sL2/case.json @@ -0,0 +1,101 @@ +{ + "case_id": "C04_ihp130_sW1.5_sL2", + "circuit_id": "C04", + "pdk": "ihp130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "dut_name": "C04_ihp130_sW1.5_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 6.0, + "l": 0.52, + "nf": 12 + }, + "M2": { + "w": 3.0, + "l": 0.52, + "nf": 6 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M1", + "current": 2e-05 + } + }, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.52, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.52, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "37f0005d77350767", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1.5_sL2/manifest.json new file mode 100644 index 00000000..bea79d3f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "4212c6419d1dc99f983218102377b925c6ad1ba1d91b0e9dd55959816ca0d72f", + "qualification.json": "2a2af6124224b57b478f2400a8f768cacb4e3a2d60618112955cb359af589fcd", + "specs.json": "e7ba95462f7840b5fd9ac86b59a2f62ff5444d423a2074409647e33a4411074a", + "target.spice": "05e5ee68ed2589d0a99b3ebd3043e6340d57439af95994f81c23642020108af2", + "target_lvs.spice": "af9452b3c8c23d093a38b746e1dc9225c1e75f790576fd2d4d08439fe2611d63", + "testbench.spice": "94574104ca7431acdf497a957432d15b8f039e527603f1e6d533dfeaab480868" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1.5_sL2/qualification.json new file mode 100644 index 00000000..306cfbe4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1.5_sL2/qualification.json @@ -0,0 +1,83 @@ +{ + "case_id": "C04_ihp130_sW1.5_sL2", + "circuit_id": "C04", + "pdk": "ihp130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "single", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.52, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.52, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "37f0005d77350767", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 23.3 + }, + "f3db": { + "min": 10380000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 26.29534, + "f3db": 17307010.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.2, + "schematic_measures": { + "vout0": 0.4427213, + "vin0": 0.4427213, + "idd": 2.382704e-05, + "gain_lf": 26.29534, + "f3db": 17307010.0, + "ugf": 361730700.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1.5_sL2/specs.json new file mode 100644 index 00000000..896e3ea3 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1.5_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 23.3 + }, + "f3db": { + "min": 10380000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 26.29534, + "f3db": 17307010.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1.5_sL2/target.spice new file mode 100644 index 00000000..9fa038b6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1.5_sL2/target.spice @@ -0,0 +1,4 @@ +.subckt C04_ihp130_sW1.5_sL2 VDD VSS VIN1 VOUT1 VB1 +XM1 VOUT1 VB1 VDD VDD sg13_lv_pmos w=6u l=0.52u ng=12 m=1 +XM2 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=3u l=0.52u ng=6 m=1 +.ends C04_ihp130_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1.5_sL2/target_lvs.spice new file mode 100644 index 00000000..69cedac2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1.5_sL2/target_lvs.spice @@ -0,0 +1,20 @@ +.subckt C04_ihp130_sW1.5_sL2 VDD VSS VIN1 VOUT1 VB1 +XM1_f0 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f1 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f2 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f3 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f4 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f5 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f6 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f7 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f8 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f9 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f10 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f11 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f0 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f1 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f2 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f3 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f4 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f5 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +.ends C04_ihp130_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1.5_sL2/testbench.spice new file mode 100644 index 00000000..4285b92f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1.5_sL2/testbench.spice @@ -0,0 +1,27 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C04_ihp130_sW1.5_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +XB_VB1 VB1 VB1 VDDB VDDB sg13_lv_pmos w=6u l=0.52u +IB_VB1 VB1 VSS 2e-05 +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1_sL1.5/case.json new file mode 100644 index 00000000..bf11b9c0 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1_sL1.5/case.json @@ -0,0 +1,101 @@ +{ + "case_id": "C04_ihp130_sW1_sL1.5", + "circuit_id": "C04", + "pdk": "ihp130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "dut_name": "C04_ihp130_sW1_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.39, + "nf": 8 + }, + "M2": { + "w": 2.0, + "l": 0.39, + "nf": 4 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M1", + "current": 2e-05 + } + }, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "67bdfb9a5ac76ac4", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1_sL1.5/manifest.json new file mode 100644 index 00000000..5ef6b660 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "4e69257286f5a18ce1d176fa4558768e88571165966111556e5301dd2ecbe0e1", + "qualification.json": "096e3651e1d6f114820132c135310214aa2cbb3f2db500f7eef7a99c9af60800", + "specs.json": "795be68df7038d5d1bf244bda15babf672395e6af099995ad36f43ef69d7cd37", + "target.spice": "339a336d33056752abe2abf0e06f465d67381b7c7dd94ba823e5e16327923a86", + "target_lvs.spice": "cdf270a72a1938032aa513abc84d924a9bb51ccb32f8f2f150c2e3f27d8ca357", + "testbench.spice": "63c64c856fdc02f320b61e0cbfea3696d64232e185096b40ac36aa049a68a6d7" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1_sL1.5/qualification.json new file mode 100644 index 00000000..8833f70e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1_sL1.5/qualification.json @@ -0,0 +1,83 @@ +{ + "case_id": "C04_ihp130_sW1_sL1.5", + "circuit_id": "C04", + "pdk": "ihp130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "single", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "67bdfb9a5ac76ac4", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 22.3 + }, + "f3db": { + "min": 10950000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 25.30474, + "f3db": 18257830.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.2, + "schematic_measures": { + "vout0": 0.4740232, + "vin0": 0.4740232, + "idd": 2.286579e-05, + "gain_lf": 25.30474, + "f3db": 18257830.0, + "ugf": 337900800.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1_sL1.5/specs.json new file mode 100644 index 00000000..8781594a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 22.3 + }, + "f3db": { + "min": 10950000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 25.30474, + "f3db": 18257830.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1_sL1.5/target.spice new file mode 100644 index 00000000..baaed0e5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1_sL1.5/target.spice @@ -0,0 +1,4 @@ +.subckt C04_ihp130_sW1_sL1.5 VDD VSS VIN1 VOUT1 VB1 +XM1 VOUT1 VB1 VDD VDD sg13_lv_pmos w=4u l=0.39u ng=8 m=1 +XM2 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=2u l=0.39u ng=4 m=1 +.ends C04_ihp130_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1_sL1.5/target_lvs.spice new file mode 100644 index 00000000..34d643fb --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1_sL1.5/target_lvs.spice @@ -0,0 +1,14 @@ +.subckt C04_ihp130_sW1_sL1.5 VDD VSS VIN1 VOUT1 VB1 +XM1_f0 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM1_f1 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM1_f2 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM1_f3 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM1_f4 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM1_f5 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM1_f6 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM1_f7 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f0 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f1 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f2 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f3 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +.ends C04_ihp130_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1_sL1.5/testbench.spice new file mode 100644 index 00000000..afec09b5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1_sL1.5/testbench.spice @@ -0,0 +1,27 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C04_ihp130_sW1_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +XB_VB1 VB1 VB1 VDDB VDDB sg13_lv_pmos w=4u l=0.39u +IB_VB1 VB1 VSS 2e-05 +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1_sL1/case.json new file mode 100644 index 00000000..9d5f335a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1_sL1/case.json @@ -0,0 +1,101 @@ +{ + "case_id": "C04_ihp130_sW1_sL1", + "circuit_id": "C04", + "pdk": "ihp130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "dut_name": "C04_ihp130_sW1_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.26, + "nf": 8 + }, + "M2": { + "w": 2.0, + "l": 0.26, + "nf": 4 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M1", + "current": 2e-05 + } + }, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.26, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "4c5bd60ff54f2cd1", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1_sL1/manifest.json new file mode 100644 index 00000000..3c9577d2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "0a45a4d1fa0715ed4a9c7a039d9190bb5ad1927f18821f8e555d8bd17d84f1f3", + "qualification.json": "b0a01034cb27ba65aa781ffbf64fd2e6b9cf22f8b80cbccdb75969fe1a1086e8", + "specs.json": "fe27a3ec948fc4497ea9887bef0cdc863c43b64cf75bf8846871dde95ddfcd57", + "target.spice": "8334b37c00ae19ab2682ec6bad239d1da068193035e869afeae8fd5e7d47eb6d", + "target_lvs.spice": "1d431dddc923b4d97bf9cb42864dcafbe351471d503339ac3ff4fe8fd9b8d15e", + "testbench.spice": "b9801005ba7c3517c69a4d61b295191b682a9f89add4bf2578ec2ec788041f43" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1_sL1/qualification.json new file mode 100644 index 00000000..33ae5bd5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1_sL1/qualification.json @@ -0,0 +1,83 @@ +{ + "case_id": "C04_ihp130_sW1_sL1", + "circuit_id": "C04", + "pdk": "ihp130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "single", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.26, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "4c5bd60ff54f2cd1", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 20.89 + }, + "f3db": { + "min": 13910000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 23.89137, + "f3db": 23180350.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.2, + "schematic_measures": { + "vout0": 0.4813387, + "vin0": 0.4813387, + "idd": 2.189247e-05, + "gain_lf": 23.89137, + "f3db": 23180350.0, + "ugf": 363696500.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1_sL1/specs.json new file mode 100644 index 00000000..bc68c32b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 20.89 + }, + "f3db": { + "min": 13910000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 23.89137, + "f3db": 23180350.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1_sL1/target.spice new file mode 100644 index 00000000..09ee90f4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1_sL1/target.spice @@ -0,0 +1,4 @@ +.subckt C04_ihp130_sW1_sL1 VDD VSS VIN1 VOUT1 VB1 +XM1 VOUT1 VB1 VDD VDD sg13_lv_pmos w=4u l=0.26u ng=8 m=1 +XM2 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=2u l=0.26u ng=4 m=1 +.ends C04_ihp130_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1_sL1/target_lvs.spice new file mode 100644 index 00000000..1285a363 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1_sL1/target_lvs.spice @@ -0,0 +1,14 @@ +.subckt C04_ihp130_sW1_sL1 VDD VSS VIN1 VOUT1 VB1 +XM1_f0 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM1_f1 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM1_f2 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM1_f3 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM1_f4 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM1_f5 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM1_f6 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM1_f7 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f0 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f1 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f2 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f3 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +.ends C04_ihp130_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1_sL1/testbench.spice new file mode 100644 index 00000000..aeaeffd3 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1_sL1/testbench.spice @@ -0,0 +1,27 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C04_ihp130_sW1_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +XB_VB1 VB1 VB1 VDDB VDDB sg13_lv_pmos w=4u l=0.26u +IB_VB1 VB1 VSS 2e-05 +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1_sL2/case.json new file mode 100644 index 00000000..7feada2f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1_sL2/case.json @@ -0,0 +1,101 @@ +{ + "case_id": "C04_ihp130_sW1_sL2", + "circuit_id": "C04", + "pdk": "ihp130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "dut_name": "C04_ihp130_sW1_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.52, + "nf": 8 + }, + "M2": { + "w": 2.0, + "l": 0.52, + "nf": 4 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M1", + "current": 2e-05 + } + }, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "20581ff512e96703", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1_sL2/manifest.json new file mode 100644 index 00000000..7a88b72d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "995464e5b27d3762a1312d408334f1cf342e80883e77496774bb4792eb478a8b", + "qualification.json": "7cc14bff31965f4289e466ceeb9318b3602a75c253d204715bb5bba76b141d78", + "specs.json": "b8f44a172be5ff4b557e457cea69b4b38e6c5eca806d16fd5d8a3a87f445c733", + "target.spice": "d1f9188f29d5e60a919cc6e267e1098ddaf4ea08c8a029b499ce022348bb3063", + "target_lvs.spice": "51487e7f08e0c12a538b324f41ffa201b2b13214d8d9da08ce1e4a872322a30e", + "testbench.spice": "3e16903fffe7edeb64a84ebb5f70721261ddcfef9891a094237b1fc13b9a5a09" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1_sL2/qualification.json new file mode 100644 index 00000000..d0a9e584 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1_sL2/qualification.json @@ -0,0 +1,83 @@ +{ + "case_id": "C04_ihp130_sW1_sL2", + "circuit_id": "C04", + "pdk": "ihp130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "single", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "20581ff512e96703", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 23.13 + }, + "f3db": { + "min": 9182000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 26.13388, + "f3db": 15303070.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.2, + "schematic_measures": { + "vout0": 0.4804788, + "vin0": 0.4804788, + "idd": 2.327906e-05, + "gain_lf": 26.13388, + "f3db": 15303070.0, + "ugf": 311941800.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1_sL2/specs.json new file mode 100644 index 00000000..8ef96438 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 23.13 + }, + "f3db": { + "min": 9182000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 26.13388, + "f3db": 15303070.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1_sL2/target.spice new file mode 100644 index 00000000..b0e7584f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1_sL2/target.spice @@ -0,0 +1,4 @@ +.subckt C04_ihp130_sW1_sL2 VDD VSS VIN1 VOUT1 VB1 +XM1 VOUT1 VB1 VDD VDD sg13_lv_pmos w=4u l=0.52u ng=8 m=1 +XM2 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=2u l=0.52u ng=4 m=1 +.ends C04_ihp130_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1_sL2/target_lvs.spice new file mode 100644 index 00000000..510a5733 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1_sL2/target_lvs.spice @@ -0,0 +1,14 @@ +.subckt C04_ihp130_sW1_sL2 VDD VSS VIN1 VOUT1 VB1 +XM1_f0 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f1 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f2 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f3 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f4 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f5 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f6 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f7 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f0 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f1 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f2 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f3 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +.ends C04_ihp130_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1_sL2/testbench.spice new file mode 100644 index 00000000..f3a9dfe5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW1_sL2/testbench.spice @@ -0,0 +1,27 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C04_ihp130_sW1_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +XB_VB1 VB1 VB1 VDDB VDDB sg13_lv_pmos w=4u l=0.52u +IB_VB1 VB1 VSS 2e-05 +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW2_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW2_sL1.5/case.json new file mode 100644 index 00000000..a8064cd8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW2_sL1.5/case.json @@ -0,0 +1,101 @@ +{ + "case_id": "C04_ihp130_sW2_sL1.5", + "circuit_id": "C04", + "pdk": "ihp130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "dut_name": "C04_ihp130_sW2_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 8.0, + "l": 0.39, + "nf": 16 + }, + "M2": { + "w": 4.0, + "l": 0.39, + "nf": 8 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M1", + "current": 2e-05 + } + }, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "22f808f4000767ba", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW2_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW2_sL1.5/manifest.json new file mode 100644 index 00000000..2fe7a621 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW2_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "399bac93e65d639e6c9bbf8b7192ea44d0e64343bb92fb7a66771aaaac233838", + "qualification.json": "6b6e662d262f8739e0294c906e8aa1e8e042037b783248518a97c478b152c62e", + "specs.json": "2ac49affd0c6fc7d636fbfa4b69653a78635cc9872b66304caa57de5355dacd9", + "target.spice": "c78a2f5a454cfc0d21a81e49abb6833f03a5c5bbdd6354abdce2f525f566175d", + "target_lvs.spice": "cede4a39fb18784c57d76e8ccb0fd6af164312cc75b32be8fc0082cb90c371dc", + "testbench.spice": "3f163e39a2e21eced65ac1d2863ddcbda98d8c1ae13542c12bc8d5ca49ebd1eb" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW2_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW2_sL1.5/qualification.json new file mode 100644 index 00000000..d012f78b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW2_sL1.5/qualification.json @@ -0,0 +1,83 @@ +{ + "case_id": "C04_ihp130_sW2_sL1.5", + "circuit_id": "C04", + "pdk": "ihp130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "single", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "22f808f4000767ba", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 22.48 + }, + "f3db": { + "min": 13320000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 25.47899, + "f3db": 22192700.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.3, + "schematic_measures": { + "vout0": 0.4180287, + "vin0": 0.4180287, + "idd": 2.370763e-05, + "gain_lf": 25.47899, + "f3db": 22192700.0, + "ugf": 422939400.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW2_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW2_sL1.5/specs.json new file mode 100644 index 00000000..08faa0a1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW2_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 22.48 + }, + "f3db": { + "min": 13320000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 25.47899, + "f3db": 22192700.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW2_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW2_sL1.5/target.spice new file mode 100644 index 00000000..cefa71ad --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW2_sL1.5/target.spice @@ -0,0 +1,4 @@ +.subckt C04_ihp130_sW2_sL1.5 VDD VSS VIN1 VOUT1 VB1 +XM1 VOUT1 VB1 VDD VDD sg13_lv_pmos w=8u l=0.39u ng=16 m=1 +XM2 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=4u l=0.39u ng=8 m=1 +.ends C04_ihp130_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW2_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW2_sL1.5/target_lvs.spice new file mode 100644 index 00000000..3bc56a72 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW2_sL1.5/target_lvs.spice @@ -0,0 +1,26 @@ +.subckt C04_ihp130_sW2_sL1.5 VDD VSS VIN1 VOUT1 VB1 +XM1_f0 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM1_f1 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM1_f2 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM1_f3 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM1_f4 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM1_f5 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM1_f6 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM1_f7 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM1_f8 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM1_f9 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM1_f10 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM1_f11 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM1_f12 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM1_f13 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM1_f14 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM1_f15 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f0 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f1 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f2 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f3 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f4 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f5 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f6 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f7 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +.ends C04_ihp130_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW2_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW2_sL1.5/testbench.spice new file mode 100644 index 00000000..1d3264f9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW2_sL1.5/testbench.spice @@ -0,0 +1,27 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C04_ihp130_sW2_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +XB_VB1 VB1 VB1 VDDB VDDB sg13_lv_pmos w=8u l=0.39u +IB_VB1 VB1 VSS 2e-05 +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW2_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW2_sL1/case.json new file mode 100644 index 00000000..0d298ff2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW2_sL1/case.json @@ -0,0 +1,101 @@ +{ + "case_id": "C04_ihp130_sW2_sL1", + "circuit_id": "C04", + "pdk": "ihp130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "dut_name": "C04_ihp130_sW2_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 8.0, + "l": 0.26, + "nf": 16 + }, + "M2": { + "w": 4.0, + "l": 0.26, + "nf": 8 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M1", + "current": 2e-05 + } + }, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.26, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "eaf68bc3d5cb10f1", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW2_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW2_sL1/manifest.json new file mode 100644 index 00000000..9dcf6db8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW2_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "318ead8d0f1bc88a6af46691777f9113c59d680660149785303e05ae3b9ac99c", + "qualification.json": "a00a2c0c07e44ef36e2de330443c4a56f5c99182f07513a818f2677355f88251", + "specs.json": "7e81f770c42c370a3bd8b565c233f112c826f20e67d2608d08ac904ac992e905", + "target.spice": "91a08a12b232710ceea2b73219d64bcf427d18c4fac366a1ce55fb7600c96f02", + "target_lvs.spice": "ba65b5b9e7a6ea0442ad94256cb2dfd62cc9b81b12f01cdaadb6d34638de6206", + "testbench.spice": "7acf77496bee05d6f8b6e160439d56b2e1f1c825d6ff2310758ce29d25021fd7" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW2_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW2_sL1/qualification.json new file mode 100644 index 00000000..730d92ed --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW2_sL1/qualification.json @@ -0,0 +1,83 @@ +{ + "case_id": "C04_ihp130_sW2_sL1", + "circuit_id": "C04", + "pdk": "ihp130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "single", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.26, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "eaf68bc3d5cb10f1", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 21.0 + }, + "f3db": { + "min": 16720000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 23.99546, + "f3db": 27870130.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.2, + "schematic_measures": { + "vout0": 0.4312207, + "vin0": 0.4312207, + "idd": 2.263739e-05, + "gain_lf": 23.99546, + "f3db": 27870130.0, + "ugf": 444095400.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW2_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW2_sL1/specs.json new file mode 100644 index 00000000..4fc56331 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW2_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 21.0 + }, + "f3db": { + "min": 16720000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 23.99546, + "f3db": 27870130.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW2_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW2_sL1/target.spice new file mode 100644 index 00000000..0048bd94 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW2_sL1/target.spice @@ -0,0 +1,4 @@ +.subckt C04_ihp130_sW2_sL1 VDD VSS VIN1 VOUT1 VB1 +XM1 VOUT1 VB1 VDD VDD sg13_lv_pmos w=8u l=0.26u ng=16 m=1 +XM2 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=4u l=0.26u ng=8 m=1 +.ends C04_ihp130_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW2_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW2_sL1/target_lvs.spice new file mode 100644 index 00000000..7528be29 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW2_sL1/target_lvs.spice @@ -0,0 +1,26 @@ +.subckt C04_ihp130_sW2_sL1 VDD VSS VIN1 VOUT1 VB1 +XM1_f0 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM1_f1 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM1_f2 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM1_f3 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM1_f4 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM1_f5 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM1_f6 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM1_f7 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM1_f8 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM1_f9 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM1_f10 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM1_f11 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM1_f12 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM1_f13 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM1_f14 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM1_f15 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f0 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f1 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f2 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f3 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f4 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f5 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f6 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f7 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +.ends C04_ihp130_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW2_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW2_sL1/testbench.spice new file mode 100644 index 00000000..2abd2070 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW2_sL1/testbench.spice @@ -0,0 +1,27 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C04_ihp130_sW2_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +XB_VB1 VB1 VB1 VDDB VDDB sg13_lv_pmos w=8u l=0.26u +IB_VB1 VB1 VSS 2e-05 +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW2_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW2_sL2/case.json new file mode 100644 index 00000000..6f9a04c2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW2_sL2/case.json @@ -0,0 +1,101 @@ +{ + "case_id": "C04_ihp130_sW2_sL2", + "circuit_id": "C04", + "pdk": "ihp130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "dut_name": "C04_ihp130_sW2_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 8.0, + "l": 0.52, + "nf": 16 + }, + "M2": { + "w": 4.0, + "l": 0.52, + "nf": 8 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M1", + "current": 2e-05 + } + }, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "a48b30eaf5be6695", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW2_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW2_sL2/manifest.json new file mode 100644 index 00000000..2a7e915e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW2_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "5cddbe7f3a9295a43067127d37e0313195f335c34b00b738b56573d49bcf5f0e", + "qualification.json": "4fd1fd085ff6de8fd03966abf5cf52f12b3c58b5637ec34f2ea1567cf8e9c536", + "specs.json": "028f44b16153869705210d0ba6f90395a82ae2b7246781d82d54f412ef86ed26", + "target.spice": "ba7c015c469d981f5f8bc7ef5f2e5c7255cd577ec84238f5253187822feef9aa", + "target_lvs.spice": "d023efe96fceb9c46ba3fb25ad00d69c5159f64dc8dfac2d2769b21d2530b9cd", + "testbench.spice": "f8851402759f79aff44a8402635a5317c3304afa535512ba8f2eb07c85d67175" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW2_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW2_sL2/qualification.json new file mode 100644 index 00000000..c73667e8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW2_sL2/qualification.json @@ -0,0 +1,83 @@ +{ + "case_id": "C04_ihp130_sW2_sL2", + "circuit_id": "C04", + "pdk": "ihp130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "single", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "a48b30eaf5be6695", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 23.36 + }, + "f3db": { + "min": 11230000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 26.35756, + "f3db": 18722290.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.3, + "schematic_measures": { + "vout0": 0.4190026, + "vin0": 0.4190026, + "idd": 2.418103e-05, + "gain_lf": 26.35756, + "f3db": 18722290.0, + "ugf": 397053400.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW2_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW2_sL2/specs.json new file mode 100644 index 00000000..9b4a5c6a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW2_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 23.36 + }, + "f3db": { + "min": 11230000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 26.35756, + "f3db": 18722290.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW2_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW2_sL2/target.spice new file mode 100644 index 00000000..abb83843 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW2_sL2/target.spice @@ -0,0 +1,4 @@ +.subckt C04_ihp130_sW2_sL2 VDD VSS VIN1 VOUT1 VB1 +XM1 VOUT1 VB1 VDD VDD sg13_lv_pmos w=8u l=0.52u ng=16 m=1 +XM2 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=4u l=0.52u ng=8 m=1 +.ends C04_ihp130_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW2_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW2_sL2/target_lvs.spice new file mode 100644 index 00000000..a17e3a7e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW2_sL2/target_lvs.spice @@ -0,0 +1,26 @@ +.subckt C04_ihp130_sW2_sL2 VDD VSS VIN1 VOUT1 VB1 +XM1_f0 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f1 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f2 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f3 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f4 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f5 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f6 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f7 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f8 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f9 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f10 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f11 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f12 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f13 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f14 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f15 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f0 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f1 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f2 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f3 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f4 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f5 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f6 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f7 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +.ends C04_ihp130_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW2_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW2_sL2/testbench.spice new file mode 100644 index 00000000..63b83ddc --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/ihp130/sW2_sL2/testbench.spice @@ -0,0 +1,27 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C04_ihp130_sW2_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +XB_VB1 VB1 VB1 VDDB VDDB sg13_lv_pmos w=8u l=0.52u +IB_VB1 VB1 VSS 2e-05 +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C04/sky130/sW0.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW0.5_sL1.5/case.json new file mode 100644 index 00000000..5151f980 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW0.5_sL1.5/case.json @@ -0,0 +1,101 @@ +{ + "case_id": "C04_sky130_sW0.5_sL1.5", + "circuit_id": "C04", + "pdk": "sky130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "dut_name": "C04_sky130_sW0.5_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.45, + "nf": 4 + }, + "M2": { + "w": 1.0, + "l": 0.45, + "nf": 2 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M1", + "current": 2e-05 + } + }, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.45, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "db9070de99473313", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/sky130/sW0.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW0.5_sL1.5/manifest.json new file mode 100644 index 00000000..e1e472cd --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW0.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "170309abeae2c54ecdc4003edc89636a2596df65ed49fea4649cd8d5469cc290", + "qualification.json": "f293f8b3c867b76ad71a4991b065bca0962e98d4cbb6e8f4cdb5ca0ca770e72e", + "specs.json": "fbf751181bc7ab06e0fd65b0f8521d2deec147c561ccefdccd11eb71d8cd93ee", + "target.spice": "f8c9b4b0425a05dceeea808057f540110babea48b5922804797f82724125abb3", + "target_lvs.spice": "3a1257a934d266a92e0838943901a3105dedd60f70b6f4337125c8f7ba87686b", + "testbench.spice": "78dbaa003f68032d2aa1923f41bf1336189cf1484b8e357d0c0e5c98f09b8014" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/sky130/sW0.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW0.5_sL1.5/qualification.json new file mode 100644 index 00000000..c60f7e7c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW0.5_sL1.5/qualification.json @@ -0,0 +1,83 @@ +{ + "case_id": "C04_sky130_sW0.5_sL1.5", + "circuit_id": "C04", + "pdk": "sky130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "single", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.45, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "db9070de99473313", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 26.29 + }, + "f3db": { + "min": 4832000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 29.28869, + "f3db": 8053563.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 7.2, + "schematic_measures": { + "vout0": 0.9562723, + "vin0": 0.9562723, + "idd": 2.728845e-05, + "gain_lf": 29.28869, + "f3db": 8053563.0, + "ugf": 235469500.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/sky130/sW0.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW0.5_sL1.5/specs.json new file mode 100644 index 00000000..27b520fe --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW0.5_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 26.29 + }, + "f3db": { + "min": 4832000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 29.28869, + "f3db": 8053563.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/sky130/sW0.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW0.5_sL1.5/target.spice new file mode 100644 index 00000000..322b832a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW0.5_sL1.5/target.spice @@ -0,0 +1,4 @@ +.subckt C04_sky130_sW0.5_sL1.5 VDD VSS VIN1 VOUT1 VB1 +XM1 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=2 l=0.45 nf=4 +XM2 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=1 l=0.45 nf=2 +.ends C04_sky130_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C04/sky130/sW0.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW0.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..88772398 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW0.5_sL1.5/target_lvs.spice @@ -0,0 +1,8 @@ +.subckt C04_sky130_sW0.5_sL1.5 VDD VSS VIN1 VOUT1 VB1 +XM1_f0 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM1_f1 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM1_f2 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM1_f3 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f0 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f1 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +.ends C04_sky130_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C04/sky130/sW0.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW0.5_sL1.5/testbench.spice new file mode 100644 index 00000000..07676389 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW0.5_sL1.5/testbench.spice @@ -0,0 +1,27 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C04_sky130_sW0.5_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +XB_VB1 VB1 VB1 VDDB VDDB sky130_fd_pr__pfet_01v8 w=2 l=0.45 +IB_VB1 VB1 VSS 2e-05 +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C04/sky130/sW0.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW0.5_sL1/case.json new file mode 100644 index 00000000..ae1eaaf2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW0.5_sL1/case.json @@ -0,0 +1,101 @@ +{ + "case_id": "C04_sky130_sW0.5_sL1", + "circuit_id": "C04", + "pdk": "sky130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "dut_name": "C04_sky130_sW0.5_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.3, + "nf": 4 + }, + "M2": { + "w": 1.0, + "l": 0.3, + "nf": 2 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M1", + "current": 2e-05 + } + }, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.3, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "acfabf7c9971dc41", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/sky130/sW0.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW0.5_sL1/manifest.json new file mode 100644 index 00000000..ab0e8348 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW0.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "d5a0e249276bbf7226be822bd80b65dbd94fb677cf01dc98c43ebaac2bf54805", + "qualification.json": "f2d87bb66ab6ba92f8d2aa767b360595cb2b8635ab1475763a21061675f503ef", + "specs.json": "e63b81d38f7d53bf36d70f1f9eeeb96a89dcf0b4e4ca05ea9fda45bb6a79c9d6", + "target.spice": "33e494b60026a375b05a9bd4164ca6ce7b484071e20e57f7939dfea36fc3a3a4", + "target_lvs.spice": "c04b07d0fe2d7c61faed24c4f95abcc9d7f4f41c50cb94f865c0242c141457ae", + "testbench.spice": "cd9b25cf234182d95b7f34cd47d401a265a3a7eb02909cd9ac195197929fcd94" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/sky130/sW0.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW0.5_sL1/qualification.json new file mode 100644 index 00000000..9f0a08ca --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW0.5_sL1/qualification.json @@ -0,0 +1,83 @@ +{ + "case_id": "C04_sky130_sW0.5_sL1", + "circuit_id": "C04", + "pdk": "sky130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "single", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.3, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "acfabf7c9971dc41", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 24.83 + }, + "f3db": { + "min": 7233000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 27.83126, + "f3db": 12054280.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 11.0, + "schematic_measures": { + "vout0": 0.9178438, + "vin0": 0.9178438, + "idd": 2.828317e-05, + "gain_lf": 27.83126, + "f3db": 12054280.0, + "ugf": 297935000.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/sky130/sW0.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW0.5_sL1/specs.json new file mode 100644 index 00000000..5280c273 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW0.5_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 24.83 + }, + "f3db": { + "min": 7233000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 27.83126, + "f3db": 12054280.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/sky130/sW0.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW0.5_sL1/target.spice new file mode 100644 index 00000000..b1374394 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW0.5_sL1/target.spice @@ -0,0 +1,4 @@ +.subckt C04_sky130_sW0.5_sL1 VDD VSS VIN1 VOUT1 VB1 +XM1 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=2 l=0.3 nf=4 +XM2 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=1 l=0.3 nf=2 +.ends C04_sky130_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C04/sky130/sW0.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW0.5_sL1/target_lvs.spice new file mode 100644 index 00000000..258701c0 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW0.5_sL1/target_lvs.spice @@ -0,0 +1,8 @@ +.subckt C04_sky130_sW0.5_sL1 VDD VSS VIN1 VOUT1 VB1 +XM1_f0 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM1_f1 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM1_f2 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM1_f3 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f0 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f1 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +.ends C04_sky130_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C04/sky130/sW0.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW0.5_sL1/testbench.spice new file mode 100644 index 00000000..8755560b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW0.5_sL1/testbench.spice @@ -0,0 +1,27 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C04_sky130_sW0.5_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +XB_VB1 VB1 VB1 VDDB VDDB sky130_fd_pr__pfet_01v8 w=2 l=0.3 +IB_VB1 VB1 VSS 2e-05 +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C04/sky130/sW0.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW0.5_sL2/case.json new file mode 100644 index 00000000..eabf0d50 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW0.5_sL2/case.json @@ -0,0 +1,101 @@ +{ + "case_id": "C04_sky130_sW0.5_sL2", + "circuit_id": "C04", + "pdk": "sky130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "dut_name": "C04_sky130_sW0.5_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.6, + "nf": 4 + }, + "M2": { + "w": 1.0, + "l": 0.6, + "nf": 2 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M1", + "current": 2e-05 + } + }, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.6, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "9c00386f50a410f9", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/sky130/sW0.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW0.5_sL2/manifest.json new file mode 100644 index 00000000..e5313f12 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW0.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "1b9e797279a5ea0ab2d20e3ced1ad3a2ed485765c41f43450056f145e490b490", + "qualification.json": "06560f699fa60dec1c9f1c510d12cb070657acec30050f1a7f19ad68a6e777d3", + "specs.json": "164fa9a2ddc2ad5549dd85e5f3c619566419e7953acfac8fd68d4d8aa95209f7", + "target.spice": "a33700ba7d55bc6225c86a425942a12fda0e5d89c252b6e1a0e452ae71183d23", + "target_lvs.spice": "68b052edabe0f38bdd2859097f46f8df2c6a59c557e24b834049298aa985d600", + "testbench.spice": "0461a691c39bfb70bbf328ed98953f7b04791e122dbeca9c204644acdb18485d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/sky130/sW0.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW0.5_sL2/qualification.json new file mode 100644 index 00000000..0a7082ef --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW0.5_sL2/qualification.json @@ -0,0 +1,83 @@ +{ + "case_id": "C04_sky130_sW0.5_sL2", + "circuit_id": "C04", + "pdk": "sky130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "single", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.6, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "9c00386f50a410f9", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 26.53 + }, + "f3db": { + "min": 3995000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 29.53157, + "f3db": 6657604.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 9.2, + "schematic_measures": { + "vout0": 1.001204, + "vin0": 1.001204, + "idd": 2.708523e-05, + "gain_lf": 29.53157, + "f3db": 6657604.0, + "ugf": 199892300.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/sky130/sW0.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW0.5_sL2/specs.json new file mode 100644 index 00000000..94dc3d54 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW0.5_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 26.53 + }, + "f3db": { + "min": 3995000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 29.53157, + "f3db": 6657604.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/sky130/sW0.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW0.5_sL2/target.spice new file mode 100644 index 00000000..5538bf6a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW0.5_sL2/target.spice @@ -0,0 +1,4 @@ +.subckt C04_sky130_sW0.5_sL2 VDD VSS VIN1 VOUT1 VB1 +XM1 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=2 l=0.6 nf=4 +XM2 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=1 l=0.6 nf=2 +.ends C04_sky130_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C04/sky130/sW0.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW0.5_sL2/target_lvs.spice new file mode 100644 index 00000000..98931e2f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW0.5_sL2/target_lvs.spice @@ -0,0 +1,8 @@ +.subckt C04_sky130_sW0.5_sL2 VDD VSS VIN1 VOUT1 VB1 +XM1_f0 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f1 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f2 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f3 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f0 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f1 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +.ends C04_sky130_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C04/sky130/sW0.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW0.5_sL2/testbench.spice new file mode 100644 index 00000000..a07ea586 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW0.5_sL2/testbench.spice @@ -0,0 +1,27 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C04_sky130_sW0.5_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +XB_VB1 VB1 VB1 VDDB VDDB sky130_fd_pr__pfet_01v8 w=2 l=0.6 +IB_VB1 VB1 VSS 2e-05 +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1.5_sL1.5/case.json new file mode 100644 index 00000000..62bb2b74 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1.5_sL1.5/case.json @@ -0,0 +1,101 @@ +{ + "case_id": "C04_sky130_sW1.5_sL1.5", + "circuit_id": "C04", + "pdk": "sky130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "dut_name": "C04_sky130_sW1.5_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 6.0, + "l": 0.45, + "nf": 12 + }, + "M2": { + "w": 3.0, + "l": 0.45, + "nf": 6 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M1", + "current": 2e-05 + } + }, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.45, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.45, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "7e3a8751fae6c89a", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1.5_sL1.5/manifest.json new file mode 100644 index 00000000..70d1b37c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "29ced85f1a34c53e73f39e1ca8b3801d771b754e680fbbe0973ca8a2e2766a5d", + "qualification.json": "643734eeb536fd88e2fc4979ec1a45432cf45c22a0530f9c2ff8cb7e0324acf4", + "specs.json": "472da5f42c96983fa8f1c885fb0c530c4257c5a0f0dc297a7b5cc17c93ce25c8", + "target.spice": "e0aa0cfe26144c2dd62a9e55c008416db9654b16ed449a5f103598ee003c9ca4", + "target_lvs.spice": "99a16d79865fd8d8f1378f8f211340993a51f73b019e3c0061e62d44d2156926", + "testbench.spice": "6c17b9b0536b4c6668def59de52f957c4f4ade329aa0790a3c4e16411cf7eb4d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1.5_sL1.5/qualification.json new file mode 100644 index 00000000..02990272 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1.5_sL1.5/qualification.json @@ -0,0 +1,83 @@ +{ + "case_id": "C04_sky130_sW1.5_sL1.5", + "circuit_id": "C04", + "pdk": "sky130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "single", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.45, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.45, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "7e3a8751fae6c89a", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 29.27 + }, + "f3db": { + "min": 7205000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 32.26552, + "f3db": 12008180.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 10.1, + "schematic_measures": { + "vout0": 0.8482126, + "vin0": 0.8482126, + "idd": 3.951739e-05, + "gain_lf": 32.26552, + "f3db": 12008180.0, + "ugf": 495057200.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1.5_sL1.5/specs.json new file mode 100644 index 00000000..51e43165 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1.5_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 29.27 + }, + "f3db": { + "min": 7205000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 32.26552, + "f3db": 12008180.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1.5_sL1.5/target.spice new file mode 100644 index 00000000..35946e48 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1.5_sL1.5/target.spice @@ -0,0 +1,4 @@ +.subckt C04_sky130_sW1.5_sL1.5 VDD VSS VIN1 VOUT1 VB1 +XM1 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=6 l=0.45 nf=12 +XM2 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=3 l=0.45 nf=6 +.ends C04_sky130_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..712d7a50 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1.5_sL1.5/target_lvs.spice @@ -0,0 +1,20 @@ +.subckt C04_sky130_sW1.5_sL1.5 VDD VSS VIN1 VOUT1 VB1 +XM1_f0 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM1_f1 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM1_f2 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM1_f3 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM1_f4 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM1_f5 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM1_f6 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM1_f7 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM1_f8 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM1_f9 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM1_f10 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM1_f11 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f0 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f1 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f2 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f3 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f4 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f5 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +.ends C04_sky130_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1.5_sL1.5/testbench.spice new file mode 100644 index 00000000..a8d722a6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1.5_sL1.5/testbench.spice @@ -0,0 +1,27 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C04_sky130_sW1.5_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +XB_VB1 VB1 VB1 VDDB VDDB sky130_fd_pr__pfet_01v8 w=6 l=0.45 +IB_VB1 VB1 VSS 2e-05 +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1.5_sL1/case.json new file mode 100644 index 00000000..c3dda655 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1.5_sL1/case.json @@ -0,0 +1,101 @@ +{ + "case_id": "C04_sky130_sW1.5_sL1", + "circuit_id": "C04", + "pdk": "sky130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "dut_name": "C04_sky130_sW1.5_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 6.0, + "l": 0.3, + "nf": 12 + }, + "M2": { + "w": 3.0, + "l": 0.3, + "nf": 6 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M1", + "current": 2e-05 + } + }, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.3, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.3, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "44601873b4d9e32b", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1.5_sL1/manifest.json new file mode 100644 index 00000000..b4054c07 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "81299e55c71484d23620626dd5813b1447845f112fc24b83ef6a5bfcde378197", + "qualification.json": "75430220a7d3ea192f31eeebe48324f7ce408c702e75b0492318309202261afe", + "specs.json": "438fafd163b82fb90aa263d0249f7d344a22ef2224014b09cad8af42f209d4b6", + "target.spice": "b30135e4db0e01d4730de8e3c3ca9c80d480591f3e7d86e00cd9daab5be6d7d4", + "target_lvs.spice": "76c526e271573b1d275dea076de133aafacca947da80a9734c74fd4fd133500f", + "testbench.spice": "af3a336afede9e946286b79cc496965eecd1c925e1aa1f8edbb1edcfdd28b9cf" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1.5_sL1/qualification.json new file mode 100644 index 00000000..8f0c762d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1.5_sL1/qualification.json @@ -0,0 +1,83 @@ +{ + "case_id": "C04_sky130_sW1.5_sL1", + "circuit_id": "C04", + "pdk": "sky130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "single", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.3, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.3, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "44601873b4d9e32b", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 26.71 + }, + "f3db": { + "min": 12390000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 29.70515, + "f3db": 20647140.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 10.9, + "schematic_measures": { + "vout0": 0.8363995, + "vin0": 0.8363995, + "idd": 4.41524e-05, + "gain_lf": 29.70515, + "f3db": 20647140.0, + "ugf": 633062300.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1.5_sL1/specs.json new file mode 100644 index 00000000..7dc654df --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1.5_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 26.71 + }, + "f3db": { + "min": 12390000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 29.70515, + "f3db": 20647140.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1.5_sL1/target.spice new file mode 100644 index 00000000..e9fe4552 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1.5_sL1/target.spice @@ -0,0 +1,4 @@ +.subckt C04_sky130_sW1.5_sL1 VDD VSS VIN1 VOUT1 VB1 +XM1 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=6 l=0.3 nf=12 +XM2 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=3 l=0.3 nf=6 +.ends C04_sky130_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1.5_sL1/target_lvs.spice new file mode 100644 index 00000000..c91d56fb --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1.5_sL1/target_lvs.spice @@ -0,0 +1,20 @@ +.subckt C04_sky130_sW1.5_sL1 VDD VSS VIN1 VOUT1 VB1 +XM1_f0 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM1_f1 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM1_f2 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM1_f3 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM1_f4 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM1_f5 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM1_f6 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM1_f7 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM1_f8 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM1_f9 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM1_f10 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM1_f11 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f0 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f1 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f2 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f3 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f4 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f5 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +.ends C04_sky130_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1.5_sL1/testbench.spice new file mode 100644 index 00000000..effe19eb --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1.5_sL1/testbench.spice @@ -0,0 +1,27 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C04_sky130_sW1.5_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +XB_VB1 VB1 VB1 VDDB VDDB sky130_fd_pr__pfet_01v8 w=6 l=0.3 +IB_VB1 VB1 VSS 2e-05 +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1.5_sL2/case.json new file mode 100644 index 00000000..ede0725a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1.5_sL2/case.json @@ -0,0 +1,101 @@ +{ + "case_id": "C04_sky130_sW1.5_sL2", + "circuit_id": "C04", + "pdk": "sky130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "dut_name": "C04_sky130_sW1.5_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 6.0, + "l": 0.6, + "nf": 12 + }, + "M2": { + "w": 3.0, + "l": 0.6, + "nf": 6 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M1", + "current": 2e-05 + } + }, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.6, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.6, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "51bc1411ed2fbe23", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1.5_sL2/manifest.json new file mode 100644 index 00000000..7f2ce8a2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "16f62b5aaca59f9824eca0a8f4963d3b60f02753b2521d94d1bb12d04b2bdf6f", + "qualification.json": "53d37f2ed68f40879017b7619efca0b9e26fa36c36eb2e181141483b91048ee3", + "specs.json": "2aae472b87906845706c1ca3704a1f6da259257bd0f8e35139ee474bbcb0f2eb", + "target.spice": "ca94f5c178b0127d1c392e4a7ba3c1d6518d90c757518630d900d9d8db78a68f", + "target_lvs.spice": "b0cf0bc0db53eaf4a88656b5b8d592f0b7530ba29a9b94b36097fa826d5a4d02", + "testbench.spice": "1f204dc4a186e46efc28a976950b85ef85a8f6642da50b6c2efaf5106a657dd9" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1.5_sL2/qualification.json new file mode 100644 index 00000000..4d8faea6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1.5_sL2/qualification.json @@ -0,0 +1,83 @@ +{ + "case_id": "C04_sky130_sW1.5_sL2", + "circuit_id": "C04", + "pdk": "sky130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "single", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.6, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.6, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "51bc1411ed2fbe23", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 30.84 + }, + "f3db": { + "min": 5083000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 33.84283, + "f3db": 8471881.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 10.3, + "schematic_measures": { + "vout0": 0.8702655, + "vin0": 0.8702655, + "idd": 3.779692e-05, + "gain_lf": 33.84283, + "f3db": 8471881.0, + "ugf": 419619300.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1.5_sL2/specs.json new file mode 100644 index 00000000..1da22be0 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1.5_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 30.84 + }, + "f3db": { + "min": 5083000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 33.84283, + "f3db": 8471881.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1.5_sL2/target.spice new file mode 100644 index 00000000..aa8d8d50 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1.5_sL2/target.spice @@ -0,0 +1,4 @@ +.subckt C04_sky130_sW1.5_sL2 VDD VSS VIN1 VOUT1 VB1 +XM1 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=6 l=0.6 nf=12 +XM2 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=3 l=0.6 nf=6 +.ends C04_sky130_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1.5_sL2/target_lvs.spice new file mode 100644 index 00000000..28f3d306 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1.5_sL2/target_lvs.spice @@ -0,0 +1,20 @@ +.subckt C04_sky130_sW1.5_sL2 VDD VSS VIN1 VOUT1 VB1 +XM1_f0 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f1 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f2 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f3 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f4 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f5 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f6 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f7 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f8 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f9 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f10 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f11 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f0 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f1 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f2 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f3 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f4 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f5 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +.ends C04_sky130_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1.5_sL2/testbench.spice new file mode 100644 index 00000000..5a72ee0f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1.5_sL2/testbench.spice @@ -0,0 +1,27 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C04_sky130_sW1.5_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +XB_VB1 VB1 VB1 VDDB VDDB sky130_fd_pr__pfet_01v8 w=6 l=0.6 +IB_VB1 VB1 VSS 2e-05 +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1_sL1.5/case.json new file mode 100644 index 00000000..42f88268 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1_sL1.5/case.json @@ -0,0 +1,101 @@ +{ + "case_id": "C04_sky130_sW1_sL1.5", + "circuit_id": "C04", + "pdk": "sky130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "dut_name": "C04_sky130_sW1_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.45, + "nf": 8 + }, + "M2": { + "w": 2.0, + "l": 0.45, + "nf": 4 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M1", + "current": 2e-05 + } + }, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "98c26f7ec9445349", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1_sL1.5/manifest.json new file mode 100644 index 00000000..562348b3 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "ee704cc1504286a2fd7ed7d66af2c6fcc276ab75fcab06b6ce04a1d35c207d1b", + "qualification.json": "99c7885b3abc7b2243585c8d61288a615425f0a5499ab7b04860fb0c8a2054d1", + "specs.json": "490380798e5c06f8647999074216ced2411944847d408bc913fcf8419f7ff4b6", + "target.spice": "fdfac76986baa95984d3e8b821f97c701ef1148e1762e74b23d4b69667525be8", + "target_lvs.spice": "858a843a59a5bc781062396b7898b2d6a89cef486216df391d0d997ec6501a8d", + "testbench.spice": "f02c521aa9427166b6a34d224879cfa4b94fe5bcb325eb4582866b66e34cc61e" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1_sL1.5/qualification.json new file mode 100644 index 00000000..5c9d8ad3 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1_sL1.5/qualification.json @@ -0,0 +1,83 @@ +{ + "case_id": "C04_sky130_sW1_sL1.5", + "circuit_id": "C04", + "pdk": "sky130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "single", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "98c26f7ec9445349", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 28.39 + }, + "f3db": { + "min": 6074000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 31.38694, + "f3db": 10124020.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 8.3, + "schematic_measures": { + "vout0": 0.8813821, + "vin0": 0.8813821, + "idd": 3.399709e-05, + "gain_lf": 31.38694, + "f3db": 10124020.0, + "ugf": 377153400.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1_sL1.5/specs.json new file mode 100644 index 00000000..49251101 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 28.39 + }, + "f3db": { + "min": 6074000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 31.38694, + "f3db": 10124020.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1_sL1.5/target.spice new file mode 100644 index 00000000..2206c965 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1_sL1.5/target.spice @@ -0,0 +1,4 @@ +.subckt C04_sky130_sW1_sL1.5 VDD VSS VIN1 VOUT1 VB1 +XM1 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=4 l=0.45 nf=8 +XM2 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=2 l=0.45 nf=4 +.ends C04_sky130_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1_sL1.5/target_lvs.spice new file mode 100644 index 00000000..c915b57b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1_sL1.5/target_lvs.spice @@ -0,0 +1,14 @@ +.subckt C04_sky130_sW1_sL1.5 VDD VSS VIN1 VOUT1 VB1 +XM1_f0 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM1_f1 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM1_f2 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM1_f3 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM1_f4 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM1_f5 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM1_f6 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM1_f7 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f0 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f1 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f2 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f3 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +.ends C04_sky130_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1_sL1.5/testbench.spice new file mode 100644 index 00000000..7490fde1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1_sL1.5/testbench.spice @@ -0,0 +1,27 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C04_sky130_sW1_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +XB_VB1 VB1 VB1 VDDB VDDB sky130_fd_pr__pfet_01v8 w=4 l=0.45 +IB_VB1 VB1 VSS 2e-05 +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1_sL1/case.json new file mode 100644 index 00000000..aab34e88 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1_sL1/case.json @@ -0,0 +1,101 @@ +{ + "case_id": "C04_sky130_sW1_sL1", + "circuit_id": "C04", + "pdk": "sky130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "dut_name": "C04_sky130_sW1_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.3, + "nf": 8 + }, + "M2": { + "w": 2.0, + "l": 0.3, + "nf": 4 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M1", + "current": 2e-05 + } + }, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "1cf81ad6c2ef8819", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1_sL1/manifest.json new file mode 100644 index 00000000..310fdce5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "9391e584f1be709074b42d8246638dc9dafac412107d01738f250fbce69b7107", + "qualification.json": "d96bbcf0f82dd8f49e76780efac01acebd24682e34cd8cd7090b6b6aec3ab83d", + "specs.json": "ebb27ac2dee4371b00e86f1d2dbe397798da58510d07410df6f1c7a3cc161456", + "target.spice": "26b75fb3fe3437197d8a8a675dbee5a93bda9937d6ba6e876146bb58713d63cb", + "target_lvs.spice": "0388562c979029dabda7ecb4f4c17c00e11bc0171e76d526f965cb74e693d405", + "testbench.spice": "686542d39f3fd288deefd880b18f2c12064617a8504b48ad1c82c77e64c2d988" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1_sL1/qualification.json new file mode 100644 index 00000000..4f4e4f36 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1_sL1/qualification.json @@ -0,0 +1,83 @@ +{ + "case_id": "C04_sky130_sW1_sL1", + "circuit_id": "C04", + "pdk": "sky130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "single", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "1cf81ad6c2ef8819", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 26.15 + }, + "f3db": { + "min": 10050000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 29.1507, + "f3db": 16754670.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 8.1, + "schematic_measures": { + "vout0": 0.8624328, + "vin0": 0.8624328, + "idd": 3.714779e-05, + "gain_lf": 29.1507, + "f3db": 16754670.0, + "ugf": 482189600.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1_sL1/specs.json new file mode 100644 index 00000000..a0c36902 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 26.15 + }, + "f3db": { + "min": 10050000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 29.1507, + "f3db": 16754670.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1_sL1/target.spice new file mode 100644 index 00000000..4594fdd7 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1_sL1/target.spice @@ -0,0 +1,4 @@ +.subckt C04_sky130_sW1_sL1 VDD VSS VIN1 VOUT1 VB1 +XM1 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=4 l=0.3 nf=8 +XM2 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=2 l=0.3 nf=4 +.ends C04_sky130_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1_sL1/target_lvs.spice new file mode 100644 index 00000000..c6b79c15 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1_sL1/target_lvs.spice @@ -0,0 +1,14 @@ +.subckt C04_sky130_sW1_sL1 VDD VSS VIN1 VOUT1 VB1 +XM1_f0 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM1_f1 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM1_f2 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM1_f3 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM1_f4 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM1_f5 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM1_f6 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM1_f7 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f0 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f1 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f2 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f3 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +.ends C04_sky130_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1_sL1/testbench.spice new file mode 100644 index 00000000..0f550137 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1_sL1/testbench.spice @@ -0,0 +1,27 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C04_sky130_sW1_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +XB_VB1 VB1 VB1 VDDB VDDB sky130_fd_pr__pfet_01v8 w=4 l=0.3 +IB_VB1 VB1 VSS 2e-05 +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1_sL2/case.json new file mode 100644 index 00000000..28a49a70 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1_sL2/case.json @@ -0,0 +1,101 @@ +{ + "case_id": "C04_sky130_sW1_sL2", + "circuit_id": "C04", + "pdk": "sky130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "dut_name": "C04_sky130_sW1_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.6, + "nf": 8 + }, + "M2": { + "w": 2.0, + "l": 0.6, + "nf": 4 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M1", + "current": 2e-05 + } + }, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "dd0f8ae02d0c0fa7", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1_sL2/manifest.json new file mode 100644 index 00000000..e0c59b42 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "d10d395a9d85395a1738988f17d99007a595b0af81bbeb6ef7b06f8a49381582", + "qualification.json": "7b72d224a5cc5c0c45b9cc133fa78e17b54ae80ec3f8351f70500111c40c2fef", + "specs.json": "36132c0fc11b494ebc001066b6585c661f8b0068d102dd711074c6a8d20d67ee", + "target.spice": "56fba1ae370f4de51d19338980495a10a0f52403ecc6c21ddf92ad608e678e53", + "target_lvs.spice": "6f317d8db80f00f71447a794071fd42e3bbb8acc469ff48807fa0babe2999542", + "testbench.spice": "24158d70baaa1ebe3a24110e50f81f5c0896785d60885f258dfcd00fdaad8972" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1_sL2/qualification.json new file mode 100644 index 00000000..ad30cb80 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1_sL2/qualification.json @@ -0,0 +1,83 @@ +{ + "case_id": "C04_sky130_sW1_sL2", + "circuit_id": "C04", + "pdk": "sky130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "single", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "dd0f8ae02d0c0fa7", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 29.6 + }, + "f3db": { + "min": 4465000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 32.59777, + "f3db": 7441151.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 7.0, + "schematic_measures": { + "vout0": 0.9094343, + "vin0": 0.9094343, + "idd": 3.282374e-05, + "gain_lf": 32.59777, + "f3db": 7441151.0, + "ugf": 318398700.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1_sL2/specs.json new file mode 100644 index 00000000..cd25c667 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 29.6 + }, + "f3db": { + "min": 4465000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 32.59777, + "f3db": 7441151.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1_sL2/target.spice new file mode 100644 index 00000000..994cc528 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1_sL2/target.spice @@ -0,0 +1,4 @@ +.subckt C04_sky130_sW1_sL2 VDD VSS VIN1 VOUT1 VB1 +XM1 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=4 l=0.6 nf=8 +XM2 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=2 l=0.6 nf=4 +.ends C04_sky130_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1_sL2/target_lvs.spice new file mode 100644 index 00000000..b8cefa7d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1_sL2/target_lvs.spice @@ -0,0 +1,14 @@ +.subckt C04_sky130_sW1_sL2 VDD VSS VIN1 VOUT1 VB1 +XM1_f0 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f1 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f2 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f3 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f4 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f5 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f6 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f7 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f0 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f1 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f2 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f3 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +.ends C04_sky130_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1_sL2/testbench.spice new file mode 100644 index 00000000..1cc55e74 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW1_sL2/testbench.spice @@ -0,0 +1,27 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C04_sky130_sW1_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +XB_VB1 VB1 VB1 VDDB VDDB sky130_fd_pr__pfet_01v8 w=4 l=0.6 +IB_VB1 VB1 VSS 2e-05 +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C04/sky130/sW2_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW2_sL1.5/case.json new file mode 100644 index 00000000..577ddd84 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW2_sL1.5/case.json @@ -0,0 +1,101 @@ +{ + "case_id": "C04_sky130_sW2_sL1.5", + "circuit_id": "C04", + "pdk": "sky130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "dut_name": "C04_sky130_sW2_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 8.0, + "l": 0.45, + "nf": 16 + }, + "M2": { + "w": 4.0, + "l": 0.45, + "nf": 8 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M1", + "current": 2e-05 + } + }, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "4e00250019e951d1", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/sky130/sW2_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW2_sL1.5/manifest.json new file mode 100644 index 00000000..e3663e6f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW2_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "d7cfdd8a7ae4e4e59942511765938a18b06a8a2f2ef637b28a3b21e4f114b585", + "qualification.json": "8f0c21d434aab78e2676c6804b817e75c26bb89c84c6c8cb002c633ebd7a81c6", + "specs.json": "1bfeba63b845fcd0c92d01e2b29fba9a6bbadfc3a6b64cbd3a01c1c548affb7d", + "target.spice": "90ec58c7489677c61c811e529a057a15223b11871df6e61536ea9a5fd198958a", + "target_lvs.spice": "1296f2f890fdd343c291c228ea2c6b62515c2f5d96e98e4f78bb4a5523db4fd4", + "testbench.spice": "da8e27835f6db7a067f39205322d8061f619a670bec1a28a0d9b7610419a995c" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/sky130/sW2_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW2_sL1.5/qualification.json new file mode 100644 index 00000000..ce495283 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW2_sL1.5/qualification.json @@ -0,0 +1,83 @@ +{ + "case_id": "C04_sky130_sW2_sL1.5", + "circuit_id": "C04", + "pdk": "sky130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "single", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "4e00250019e951d1", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 29.79 + }, + "f3db": { + "min": 8176000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 32.79353, + "f3db": 13626050.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 8.7, + "schematic_measures": { + "vout0": 0.8275789, + "vin0": 0.8275789, + "idd": 4.41498e-05, + "gain_lf": 32.79353, + "f3db": 13626050.0, + "ugf": 598776900.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/sky130/sW2_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW2_sL1.5/specs.json new file mode 100644 index 00000000..a6c93905 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW2_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 29.79 + }, + "f3db": { + "min": 8176000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 32.79353, + "f3db": 13626050.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/sky130/sW2_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW2_sL1.5/target.spice new file mode 100644 index 00000000..4db34d62 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW2_sL1.5/target.spice @@ -0,0 +1,4 @@ +.subckt C04_sky130_sW2_sL1.5 VDD VSS VIN1 VOUT1 VB1 +XM1 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=8 l=0.45 nf=16 +XM2 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=4 l=0.45 nf=8 +.ends C04_sky130_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C04/sky130/sW2_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW2_sL1.5/target_lvs.spice new file mode 100644 index 00000000..ca4b5327 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW2_sL1.5/target_lvs.spice @@ -0,0 +1,26 @@ +.subckt C04_sky130_sW2_sL1.5 VDD VSS VIN1 VOUT1 VB1 +XM1_f0 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM1_f1 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM1_f2 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM1_f3 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM1_f4 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM1_f5 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM1_f6 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM1_f7 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM1_f8 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM1_f9 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM1_f10 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM1_f11 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM1_f12 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM1_f13 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM1_f14 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM1_f15 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f0 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f1 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f2 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f3 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f4 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f5 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f6 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f7 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +.ends C04_sky130_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C04/sky130/sW2_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW2_sL1.5/testbench.spice new file mode 100644 index 00000000..aa0f5f04 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW2_sL1.5/testbench.spice @@ -0,0 +1,27 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C04_sky130_sW2_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +XB_VB1 VB1 VB1 VDDB VDDB sky130_fd_pr__pfet_01v8 w=8 l=0.45 +IB_VB1 VB1 VSS 2e-05 +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C04/sky130/sW2_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW2_sL1/case.json new file mode 100644 index 00000000..f08947f8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW2_sL1/case.json @@ -0,0 +1,101 @@ +{ + "case_id": "C04_sky130_sW2_sL1", + "circuit_id": "C04", + "pdk": "sky130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "dut_name": "C04_sky130_sW2_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 8.0, + "l": 0.3, + "nf": 16 + }, + "M2": { + "w": 4.0, + "l": 0.3, + "nf": 8 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M1", + "current": 2e-05 + } + }, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "7f8e4b176acbfb40", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/sky130/sW2_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW2_sL1/manifest.json new file mode 100644 index 00000000..115941f1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW2_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "957fe6ec2ff19d540b5214d0ea0ea4e0cb9deca561f23fc29f052d86b86a27a5", + "qualification.json": "c4d037be4d6bf112b2818d192b4bb04908a69051c87aa07ed7c92a1cef07a74b", + "specs.json": "f73fbd234229302cf93392903aea7676c095953af3e1ed88850dc09b49004e4b", + "target.spice": "5bab3be9d88a08d53e9b10ec624eff074c22c7cbbe2be272f1fd770295bb1628", + "target_lvs.spice": "c0c1e0652c8101fffcefb933e585cbeb8d133a5952ce7652047da6542edaeeb4", + "testbench.spice": "b65b911a6c8226178948c505a8841a1a16a032f150f94b2bfd56ac0ae94284c9" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/sky130/sW2_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW2_sL1/qualification.json new file mode 100644 index 00000000..00869184 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW2_sL1/qualification.json @@ -0,0 +1,83 @@ +{ + "case_id": "C04_sky130_sW2_sL1", + "circuit_id": "C04", + "pdk": "sky130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "single", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "7f8e4b176acbfb40", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 27.03 + }, + "f3db": { + "min": 14350000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 30.03456, + "f3db": 23917820.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 8.1, + "schematic_measures": { + "vout0": 0.8195053, + "vin0": 0.8195053, + "idd": 4.989e-05, + "gain_lf": 30.03456, + "f3db": 23917820.0, + "ugf": 763914300.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/sky130/sW2_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW2_sL1/specs.json new file mode 100644 index 00000000..c9c9564e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW2_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 27.03 + }, + "f3db": { + "min": 14350000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 30.03456, + "f3db": 23917820.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/sky130/sW2_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW2_sL1/target.spice new file mode 100644 index 00000000..a8f5df8d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW2_sL1/target.spice @@ -0,0 +1,4 @@ +.subckt C04_sky130_sW2_sL1 VDD VSS VIN1 VOUT1 VB1 +XM1 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=8 l=0.3 nf=16 +XM2 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=4 l=0.3 nf=8 +.ends C04_sky130_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C04/sky130/sW2_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW2_sL1/target_lvs.spice new file mode 100644 index 00000000..cfba297e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW2_sL1/target_lvs.spice @@ -0,0 +1,26 @@ +.subckt C04_sky130_sW2_sL1 VDD VSS VIN1 VOUT1 VB1 +XM1_f0 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM1_f1 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM1_f2 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM1_f3 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM1_f4 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM1_f5 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM1_f6 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM1_f7 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM1_f8 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM1_f9 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM1_f10 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM1_f11 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM1_f12 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM1_f13 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM1_f14 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM1_f15 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f0 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f1 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f2 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f3 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f4 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f5 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f6 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f7 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +.ends C04_sky130_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C04/sky130/sW2_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW2_sL1/testbench.spice new file mode 100644 index 00000000..21a20505 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW2_sL1/testbench.spice @@ -0,0 +1,27 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C04_sky130_sW2_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +XB_VB1 VB1 VB1 VDDB VDDB sky130_fd_pr__pfet_01v8 w=8 l=0.3 +IB_VB1 VB1 VSS 2e-05 +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C04/sky130/sW2_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW2_sL2/case.json new file mode 100644 index 00000000..cd45b190 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW2_sL2/case.json @@ -0,0 +1,101 @@ +{ + "case_id": "C04_sky130_sW2_sL2", + "circuit_id": "C04", + "pdk": "sky130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "dut_name": "C04_sky130_sW2_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 8.0, + "l": 0.6, + "nf": 16 + }, + "M2": { + "w": 4.0, + "l": 0.6, + "nf": 8 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M1", + "current": 2e-05 + } + }, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "1a815ffbe3043411", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/sky130/sW2_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW2_sL2/manifest.json new file mode 100644 index 00000000..b2e8264d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW2_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "67b389b9218d92f3b42b5cb993f55ce8f1c2d368331bee845850d47158ddebf9", + "qualification.json": "7401a1396fb3ee1441dd8a651db016462cf5647c837fc5a4be19a04f5311c00d", + "specs.json": "b1a02498be02468a784df4f6733f22e5e1c92c9d2be7d3b79600946edc564f73", + "target.spice": "e48394e1b9876aeb663c4cb113ef00b14587a6a4d18285c5f21d0349c57cad90", + "target_lvs.spice": "5571e2a77d19b0b909daec8bc7f277c3da121fc0cf8a3757ab31ee12e6bc2891", + "testbench.spice": "384ea34731c55528fb832951e074c802c705bc370952f06e75f741ab37af55c4" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/sky130/sW2_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW2_sL2/qualification.json new file mode 100644 index 00000000..6608fe59 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW2_sL2/qualification.json @@ -0,0 +1,83 @@ +{ + "case_id": "C04_sky130_sW2_sL2", + "circuit_id": "C04", + "pdk": "sky130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "single", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "1a815ffbe3043411", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 31.59 + }, + "f3db": { + "min": 5641000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 34.59165, + "f3db": 9401574.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 10.4, + "schematic_measures": { + "vout0": 0.8465248, + "vin0": 0.8465248, + "idd": 4.208694e-05, + "gain_lf": 34.59165, + "f3db": 9401574.0, + "ugf": 508469700.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/sky130/sW2_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW2_sL2/specs.json new file mode 100644 index 00000000..a4719731 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW2_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 31.59 + }, + "f3db": { + "min": 5641000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 34.59165, + "f3db": 9401574.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C04/sky130/sW2_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW2_sL2/target.spice new file mode 100644 index 00000000..ba250d89 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW2_sL2/target.spice @@ -0,0 +1,4 @@ +.subckt C04_sky130_sW2_sL2 VDD VSS VIN1 VOUT1 VB1 +XM1 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=8 l=0.6 nf=16 +XM2 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=4 l=0.6 nf=8 +.ends C04_sky130_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C04/sky130/sW2_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW2_sL2/target_lvs.spice new file mode 100644 index 00000000..612e042f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW2_sL2/target_lvs.spice @@ -0,0 +1,26 @@ +.subckt C04_sky130_sW2_sL2 VDD VSS VIN1 VOUT1 VB1 +XM1_f0 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f1 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f2 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f3 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f4 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f5 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f6 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f7 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f8 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f9 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f10 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f11 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f12 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f13 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f14 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f15 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f0 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f1 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f2 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f3 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f4 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f5 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f6 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f7 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +.ends C04_sky130_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C04/sky130/sW2_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW2_sL2/testbench.spice new file mode 100644 index 00000000..be3b8791 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C04/sky130/sW2_sL2/testbench.spice @@ -0,0 +1,27 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C04_sky130_sW2_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +XB_VB1 VB1 VB1 VDDB VDDB sky130_fd_pr__pfet_01v8 w=8 l=0.6 +IB_VB1 VB1 VSS 2e-05 +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C05/gf180/sW0.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW0.5_sL1.5/case.json new file mode 100644 index 00000000..867a7df3 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW0.5_sL1.5/case.json @@ -0,0 +1,103 @@ +{ + "case_id": "C05_gf180_sW0.5_sL1.5", + "circuit_id": "C05", + "pdk": "gf180", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "dut_name": "C05_gf180_sW0.5_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 1.0, + "l": 0.84, + "nf": 2 + }, + "M2": { + "w": 2.0, + "l": 0.84, + "nf": 4 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M1", + "current": 2e-05 + } + }, + "load": { + "vin_nom": 2.145, + "RL": 20000.0, + "CL": 1e-12 + }, + "category": "follower", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.84, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "de0f3d880667d197", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "ideal input source" + }, + { + "kind": "testbench_element", + "what": "load resistor and capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/gf180/sW0.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW0.5_sL1.5/manifest.json new file mode 100644 index 00000000..52633933 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW0.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "5e38a88b5290a337766c8abf7bac94470832d951c80ce6dcd11c12f40a0f11df", + "qualification.json": "ba129872b7832d1432e9b39d7d1c3eb4026757892920e91b3377da94ab1a74b8", + "specs.json": "9fe5ddd87d07ceb69ff437069ee9b6890749b9b21bfb6363e82ea7ff27dee4ff", + "target.spice": "bec6fae418f8ace6fc1544872997f762e00acfa53826f9d326842d247b92d649", + "target_lvs.spice": "11d329f91a6add3bc7c886280641e15645f9941bd32195b02a1b9755bfc580b7", + "testbench.spice": "a9308cb68e0cacf83190bc4606738234f3351ed2a23d81cccb8b021fd8cfa8c6" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/gf180/sW0.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW0.5_sL1.5/qualification.json new file mode 100644 index 00000000..1ae5b662 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW0.5_sL1.5/qualification.json @@ -0,0 +1,85 @@ +{ + "case_id": "C05_gf180_sW0.5_sL1.5", + "circuit_id": "C05", + "pdk": "gf180", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "follower", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.84, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "de0f3d880667d197", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 23260000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.6176683, + "f3db": 38759890.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vout0": 0.6577102, + "idd": 5.325655e-05, + "gain_at_nom": 0.6176683, + "vout_at_nom": 0.6577104, + "vin_lo": 1.500472, + "vin_hi": 1.500472, + "gain_lf": -4.184004, + "f3db": 38759890.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/gf180/sW0.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW0.5_sL1.5/specs.json new file mode 100644 index 00000000..9b68c91c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW0.5_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 23260000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.6176683, + "f3db": 38759890.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/gf180/sW0.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW0.5_sL1.5/target.spice new file mode 100644 index 00000000..7dbfbad7 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW0.5_sL1.5/target.spice @@ -0,0 +1,4 @@ +.subckt C05_gf180_sW0.5_sL1.5 VDD VSS VIN1 VOUT1 VB1 +MM1 VOUT1 VB1 VSS VSS nfet_03v3 w=1u l=0.84u nf=2 m=1 +MM2 VDD VIN1 VOUT1 VSS nfet_03v3 w=2u l=0.84u nf=4 m=1 +.ends C05_gf180_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C05/gf180/sW0.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW0.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..1ae13566 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW0.5_sL1.5/target_lvs.spice @@ -0,0 +1,8 @@ +.subckt C05_gf180_sW0.5_sL1.5 VDD VSS VIN1 VOUT1 VB1 +MM1_f0 VOUT1 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM1_f1 VOUT1 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM2_f0 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f1 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f2 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f3 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +.ends C05_gf180_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C05/gf180/sW0.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW0.5_sL1.5/testbench.spice new file mode 100644 index 00000000..7386035b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW0.5_sL1.5/testbench.spice @@ -0,0 +1,30 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C05_gf180_sW0.5_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +MB_VB1 VB1 VB1 VSS VSS nfet_03v3 w=1u l=0.84u +IB_VB1 VDDB VB1 2e-05 +VIN1 VIN1 0 dc 2.145 ac 1 +RL VOUT1 0 20000 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +print vout0 idd +dc VIN1 0 3.3 0.00825 +let gain_dc = deriv(v(VOUT1)) +meas dc gain_at_nom find gain_dc at=2.145 +meas dc vout_at_nom find v(VOUT1) at=2.145 +let okg = gain_dc - 0.5 +meas dc vin_lo find v(VIN1) when okg=0 cross=1 +meas dc vin_hi find v(VIN1) when okg=0 cross=last +ac dec 20 1k 10G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=1k +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C05/gf180/sW0.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW0.5_sL1/case.json new file mode 100644 index 00000000..b3528ab1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW0.5_sL1/case.json @@ -0,0 +1,103 @@ +{ + "case_id": "C05_gf180_sW0.5_sL1", + "circuit_id": "C05", + "pdk": "gf180", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "dut_name": "C05_gf180_sW0.5_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 1.0, + "l": 0.56, + "nf": 2 + }, + "M2": { + "w": 2.0, + "l": 0.56, + "nf": 4 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M1", + "current": 2e-05 + } + }, + "load": { + "vin_nom": 2.145, + "RL": 20000.0, + "CL": 1e-12 + }, + "category": "follower", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.56, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "010cd44721340082", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "ideal input source" + }, + { + "kind": "testbench_element", + "what": "load resistor and capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/gf180/sW0.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW0.5_sL1/manifest.json new file mode 100644 index 00000000..07d82edb --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW0.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "cd83814810c442c51be36e4eb61add70091e943ef3a8bd4f98d055d9af52a318", + "qualification.json": "c6c2d2dff280a0fc77326ae4a12baf8521aba6a39b83bb27fc9c5292d07fee3d", + "specs.json": "2b1811b963008fc1a29b525561ae9d4660acf5cdd909b77ab31faee4966e36f0", + "target.spice": "7d8a947a1040b39ae13d111858bd8462cb876fc915fc5a23766663630d887c02", + "target_lvs.spice": "3c537681371254dc71803bfd767644cd28a4e7208cf0de372a27cc1ddc1e3db2", + "testbench.spice": "66b4aafa3d1caa5d200733a266f6d64876b30b22f12b327c804fff9fad07fd41" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/gf180/sW0.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW0.5_sL1/qualification.json new file mode 100644 index 00000000..439cb76c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW0.5_sL1/qualification.json @@ -0,0 +1,85 @@ +{ + "case_id": "C05_gf180_sW0.5_sL1", + "circuit_id": "C05", + "pdk": "gf180", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "follower", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.56, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "010cd44721340082", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_at_nom": { + "min": 0.6052 + }, + "f3db": { + "min": 28090000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.6551654, + "f3db": 46820220.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vout0": 0.7461246, + "idd": 5.820329e-05, + "gain_at_nom": 0.6551654, + "vout_at_nom": 0.7461246, + "vin_lo": 1.266606, + "vin_hi": 1.266606, + "gain_lf": -3.67227, + "f3db": 46820220.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/gf180/sW0.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW0.5_sL1/specs.json new file mode 100644 index 00000000..13637f36 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW0.5_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_at_nom": { + "min": 0.6052 + }, + "f3db": { + "min": 28090000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.6551654, + "f3db": 46820220.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/gf180/sW0.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW0.5_sL1/target.spice new file mode 100644 index 00000000..c4d311ab --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW0.5_sL1/target.spice @@ -0,0 +1,4 @@ +.subckt C05_gf180_sW0.5_sL1 VDD VSS VIN1 VOUT1 VB1 +MM1 VOUT1 VB1 VSS VSS nfet_03v3 w=1u l=0.56u nf=2 m=1 +MM2 VDD VIN1 VOUT1 VSS nfet_03v3 w=2u l=0.56u nf=4 m=1 +.ends C05_gf180_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C05/gf180/sW0.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW0.5_sL1/target_lvs.spice new file mode 100644 index 00000000..961505a4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW0.5_sL1/target_lvs.spice @@ -0,0 +1,8 @@ +.subckt C05_gf180_sW0.5_sL1 VDD VSS VIN1 VOUT1 VB1 +MM1_f0 VOUT1 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM1_f1 VOUT1 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM2_f0 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f1 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f2 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f3 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +.ends C05_gf180_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C05/gf180/sW0.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW0.5_sL1/testbench.spice new file mode 100644 index 00000000..4fcf691e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW0.5_sL1/testbench.spice @@ -0,0 +1,30 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C05_gf180_sW0.5_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +MB_VB1 VB1 VB1 VSS VSS nfet_03v3 w=1u l=0.56u +IB_VB1 VDDB VB1 2e-05 +VIN1 VIN1 0 dc 2.145 ac 1 +RL VOUT1 0 20000 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +print vout0 idd +dc VIN1 0 3.3 0.00825 +let gain_dc = deriv(v(VOUT1)) +meas dc gain_at_nom find gain_dc at=2.145 +meas dc vout_at_nom find v(VOUT1) at=2.145 +let okg = gain_dc - 0.5 +meas dc vin_lo find v(VIN1) when okg=0 cross=1 +meas dc vin_hi find v(VIN1) when okg=0 cross=last +ac dec 20 1k 10G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=1k +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C05/gf180/sW0.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW0.5_sL2/case.json new file mode 100644 index 00000000..b0cc7567 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW0.5_sL2/case.json @@ -0,0 +1,103 @@ +{ + "case_id": "C05_gf180_sW0.5_sL2", + "circuit_id": "C05", + "pdk": "gf180", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "dut_name": "C05_gf180_sW0.5_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 1.0, + "l": 1.12, + "nf": 2 + }, + "M2": { + "w": 2.0, + "l": 1.12, + "nf": 4 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M1", + "current": 2e-05 + } + }, + "load": { + "vin_nom": 2.145, + "RL": 20000.0, + "CL": 1e-12 + }, + "category": "follower", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.12, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "bb0d0563348d42f5", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "ideal input source" + }, + { + "kind": "testbench_element", + "what": "load resistor and capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/gf180/sW0.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW0.5_sL2/manifest.json new file mode 100644 index 00000000..bb32c007 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW0.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "93677a416c1d22cb98fc93cd5bb7acb70275344f42904d3ad6de7be0da7f69f6", + "qualification.json": "70574da4f4a5f32cd5fa927dad44b919e9eb59f0c3fde64bbb7df9f92fe93582", + "specs.json": "525a393956874e21a1139bb17d4074638171483f9aff0b668ac529dad07225d8", + "target.spice": "98638dc6a7522393d4b50e945156107b81e6cee85d85ef2c05bfd62578578858", + "target_lvs.spice": "9564b2216243ed2d910eecf08675c889d0d0368bd06cbdd2743b962ecf275ed7", + "testbench.spice": "1c9188632e41e6513848a976ce4954858815b4b9215914696d2919b0c9d0894d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/gf180/sW0.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW0.5_sL2/qualification.json new file mode 100644 index 00000000..175610b0 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW0.5_sL2/qualification.json @@ -0,0 +1,87 @@ +{ + "case_id": "C05_gf180_sW0.5_sL2", + "circuit_id": "C05", + "pdk": "gf180", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "follower", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.12, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "bb0d0563348d42f5", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "gain_at_nom=0.5874 below floor 0.6" + ], + "spec": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 20580000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.5874089, + "f3db": 34292100.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vout0": 0.5940654, + "idd": 4.976311e-05, + "gain_at_nom": 0.5874089, + "vout_at_nom": 0.5940654, + "vin_lo": 1.703668, + "vin_hi": 1.703668, + "gain_lf": -4.620147, + "f3db": 34292100.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/gf180/sW0.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW0.5_sL2/specs.json new file mode 100644 index 00000000..9323313f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW0.5_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 20580000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.5874089, + "f3db": 34292100.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/gf180/sW0.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW0.5_sL2/target.spice new file mode 100644 index 00000000..ed28e9a4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW0.5_sL2/target.spice @@ -0,0 +1,4 @@ +.subckt C05_gf180_sW0.5_sL2 VDD VSS VIN1 VOUT1 VB1 +MM1 VOUT1 VB1 VSS VSS nfet_03v3 w=1u l=1.12u nf=2 m=1 +MM2 VDD VIN1 VOUT1 VSS nfet_03v3 w=2u l=1.12u nf=4 m=1 +.ends C05_gf180_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C05/gf180/sW0.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW0.5_sL2/target_lvs.spice new file mode 100644 index 00000000..96afecaf --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW0.5_sL2/target_lvs.spice @@ -0,0 +1,8 @@ +.subckt C05_gf180_sW0.5_sL2 VDD VSS VIN1 VOUT1 VB1 +MM1_f0 VOUT1 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM1_f1 VOUT1 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM2_f0 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f1 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f2 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f3 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +.ends C05_gf180_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C05/gf180/sW0.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW0.5_sL2/testbench.spice new file mode 100644 index 00000000..0e3a0dd6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW0.5_sL2/testbench.spice @@ -0,0 +1,30 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C05_gf180_sW0.5_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +MB_VB1 VB1 VB1 VSS VSS nfet_03v3 w=1u l=1.12u +IB_VB1 VDDB VB1 2e-05 +VIN1 VIN1 0 dc 2.145 ac 1 +RL VOUT1 0 20000 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +print vout0 idd +dc VIN1 0 3.3 0.00825 +let gain_dc = deriv(v(VOUT1)) +meas dc gain_at_nom find gain_dc at=2.145 +meas dc vout_at_nom find v(VOUT1) at=2.145 +let okg = gain_dc - 0.5 +meas dc vin_lo find v(VIN1) when okg=0 cross=1 +meas dc vin_hi find v(VIN1) when okg=0 cross=last +ac dec 20 1k 10G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=1k +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1.5_sL1.5/case.json new file mode 100644 index 00000000..6437d96b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1.5_sL1.5/case.json @@ -0,0 +1,103 @@ +{ + "case_id": "C05_gf180_sW1.5_sL1.5", + "circuit_id": "C05", + "pdk": "gf180", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "dut_name": "C05_gf180_sW1.5_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 3.0, + "l": 0.84, + "nf": 6 + }, + "M2": { + "w": 6.0, + "l": 0.84, + "nf": 12 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M1", + "current": 2e-05 + } + }, + "load": { + "vin_nom": 2.145, + "RL": 20000.0, + "CL": 1e-12 + }, + "category": "follower", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.84, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "0aadb8d8802ec67b", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "ideal input source" + }, + { + "kind": "testbench_element", + "what": "load resistor and capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1.5_sL1.5/manifest.json new file mode 100644 index 00000000..038ef45f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "9c63867c84647a6d11f05f1ad4b10580e31fe3ca26793b2b3d4867c0caacb4e2", + "qualification.json": "a2e63e4f44afd71608906d3ca9a700074985d859ef03e45b2ab63392108942ca", + "specs.json": "57865ddd7c420686e86084231ea24afd0c4760bab1eca047f68aaf42eba78f4c", + "target.spice": "20e2f056494b361f3fa200e7f0aeacae180e4b25217ca3baa942195b95117b6e", + "target_lvs.spice": "97c19a834e0122126122b61a5066380ee32762be01bb673d32bb0cf79f93d256", + "testbench.spice": "51678865c9a0cac7a4a7c2879add8f7baf9ae21f3fd316e17fb0ca42ce8658d4" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1.5_sL1.5/qualification.json new file mode 100644 index 00000000..897dd8b4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1.5_sL1.5/qualification.json @@ -0,0 +1,85 @@ +{ + "case_id": "C05_gf180_sW1.5_sL1.5", + "circuit_id": "C05", + "pdk": "gf180", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "follower", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.84, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "0aadb8d8802ec67b", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_at_nom": { + "min": 0.6498 + }, + "f3db": { + "min": 41210000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.6997546, + "f3db": 68675720.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vout0": 0.8545068, + "idd": 6.312905e-05, + "gain_at_nom": 0.6997546, + "vout_at_nom": 0.8545068, + "vin_lo": 1.046353, + "vin_hi": 1.046353, + "gain_lf": -3.10038, + "f3db": 68675720.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1.5_sL1.5/specs.json new file mode 100644 index 00000000..82628a88 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1.5_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_at_nom": { + "min": 0.6498 + }, + "f3db": { + "min": 41210000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.6997546, + "f3db": 68675720.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1.5_sL1.5/target.spice new file mode 100644 index 00000000..8bfe15fe --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1.5_sL1.5/target.spice @@ -0,0 +1,4 @@ +.subckt C05_gf180_sW1.5_sL1.5 VDD VSS VIN1 VOUT1 VB1 +MM1 VOUT1 VB1 VSS VSS nfet_03v3 w=3u l=0.84u nf=6 m=1 +MM2 VDD VIN1 VOUT1 VSS nfet_03v3 w=6u l=0.84u nf=12 m=1 +.ends C05_gf180_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..f7a8c8e6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1.5_sL1.5/target_lvs.spice @@ -0,0 +1,20 @@ +.subckt C05_gf180_sW1.5_sL1.5 VDD VSS VIN1 VOUT1 VB1 +MM1_f0 VOUT1 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM1_f1 VOUT1 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM1_f2 VOUT1 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM1_f3 VOUT1 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM1_f4 VOUT1 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM1_f5 VOUT1 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM2_f0 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f1 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f2 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f3 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f4 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f5 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f6 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f7 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f8 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f9 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f10 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f11 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +.ends C05_gf180_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1.5_sL1.5/testbench.spice new file mode 100644 index 00000000..4b576df7 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1.5_sL1.5/testbench.spice @@ -0,0 +1,30 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C05_gf180_sW1.5_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +MB_VB1 VB1 VB1 VSS VSS nfet_03v3 w=3u l=0.84u +IB_VB1 VDDB VB1 2e-05 +VIN1 VIN1 0 dc 2.145 ac 1 +RL VOUT1 0 20000 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +print vout0 idd +dc VIN1 0 3.3 0.00825 +let gain_dc = deriv(v(VOUT1)) +meas dc gain_at_nom find gain_dc at=2.145 +meas dc vout_at_nom find v(VOUT1) at=2.145 +let okg = gain_dc - 0.5 +meas dc vin_lo find v(VIN1) when okg=0 cross=1 +meas dc vin_hi find v(VIN1) when okg=0 cross=last +ac dec 20 1k 10G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=1k +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1.5_sL1/case.json new file mode 100644 index 00000000..19422dd8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1.5_sL1/case.json @@ -0,0 +1,103 @@ +{ + "case_id": "C05_gf180_sW1.5_sL1", + "circuit_id": "C05", + "pdk": "gf180", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "dut_name": "C05_gf180_sW1.5_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 3.0, + "l": 0.56, + "nf": 6 + }, + "M2": { + "w": 6.0, + "l": 0.56, + "nf": 12 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M1", + "current": 2e-05 + } + }, + "load": { + "vin_nom": 2.145, + "RL": 20000.0, + "CL": 1e-12 + }, + "category": "follower", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.56, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "4e7e8f3c2e1d6706", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "ideal input source" + }, + { + "kind": "testbench_element", + "what": "load resistor and capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1.5_sL1/manifest.json new file mode 100644 index 00000000..77b89dd1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "898996a32d8060f76cab70321b1d447068d17b717b154ff49e90d164c7648be7", + "qualification.json": "b4a97a374ea8d6e674c2100f470e2cea4e7968710ea32f5f6c885aaa6d341df9", + "specs.json": "66f5456d890598e74c96608191add85353272cb3490e58370a5863749aa8bdf4", + "target.spice": "f4119477961240a3d00fe677810a8edc0fca47588cb20928557a64245b464eed", + "target_lvs.spice": "f40072af8ca0efd2dfbb33c00b1284e0c56f8dcd72317d587878abaf821d6ab7", + "testbench.spice": "8e3cc43f1947b4ec731d5eb437f1afecb8e281dde3a1f7277cea6cc00be4edb0" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1.5_sL1/qualification.json new file mode 100644 index 00000000..cc9adbec --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1.5_sL1/qualification.json @@ -0,0 +1,85 @@ +{ + "case_id": "C05_gf180_sW1.5_sL1", + "circuit_id": "C05", + "pdk": "gf180", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "follower", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.56, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "4e7e8f3c2e1d6706", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_at_nom": { + "min": 0.6763 + }, + "f3db": { + "min": 51110000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.7263237, + "f3db": 85187880.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vout0": 0.9170634, + "idd": 6.834132e-05, + "gain_at_nom": 0.7263237, + "vout_at_nom": 0.9170635, + "vin_lo": 0.9501328, + "vin_hi": 0.9501328, + "gain_lf": -2.776847, + "f3db": 85187880.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1.5_sL1/specs.json new file mode 100644 index 00000000..3091f1fa --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1.5_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_at_nom": { + "min": 0.6763 + }, + "f3db": { + "min": 51110000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.7263237, + "f3db": 85187880.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1.5_sL1/target.spice new file mode 100644 index 00000000..cd5cff9d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1.5_sL1/target.spice @@ -0,0 +1,4 @@ +.subckt C05_gf180_sW1.5_sL1 VDD VSS VIN1 VOUT1 VB1 +MM1 VOUT1 VB1 VSS VSS nfet_03v3 w=3u l=0.56u nf=6 m=1 +MM2 VDD VIN1 VOUT1 VSS nfet_03v3 w=6u l=0.56u nf=12 m=1 +.ends C05_gf180_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1.5_sL1/target_lvs.spice new file mode 100644 index 00000000..ff99496e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1.5_sL1/target_lvs.spice @@ -0,0 +1,20 @@ +.subckt C05_gf180_sW1.5_sL1 VDD VSS VIN1 VOUT1 VB1 +MM1_f0 VOUT1 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM1_f1 VOUT1 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM1_f2 VOUT1 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM1_f3 VOUT1 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM1_f4 VOUT1 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM1_f5 VOUT1 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM2_f0 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f1 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f2 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f3 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f4 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f5 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f6 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f7 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f8 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f9 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f10 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f11 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +.ends C05_gf180_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1.5_sL1/testbench.spice new file mode 100644 index 00000000..a0dc17ee --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1.5_sL1/testbench.spice @@ -0,0 +1,30 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C05_gf180_sW1.5_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +MB_VB1 VB1 VB1 VSS VSS nfet_03v3 w=3u l=0.56u +IB_VB1 VDDB VB1 2e-05 +VIN1 VIN1 0 dc 2.145 ac 1 +RL VOUT1 0 20000 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +print vout0 idd +dc VIN1 0 3.3 0.00825 +let gain_dc = deriv(v(VOUT1)) +meas dc gain_at_nom find gain_dc at=2.145 +meas dc vout_at_nom find v(VOUT1) at=2.145 +let okg = gain_dc - 0.5 +meas dc vin_lo find v(VIN1) when okg=0 cross=1 +meas dc vin_hi find v(VIN1) when okg=0 cross=last +ac dec 20 1k 10G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=1k +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1.5_sL2/case.json new file mode 100644 index 00000000..d7e189e3 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1.5_sL2/case.json @@ -0,0 +1,103 @@ +{ + "case_id": "C05_gf180_sW1.5_sL2", + "circuit_id": "C05", + "pdk": "gf180", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "dut_name": "C05_gf180_sW1.5_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 3.0, + "l": 1.12, + "nf": 6 + }, + "M2": { + "w": 6.0, + "l": 1.12, + "nf": 12 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M1", + "current": 2e-05 + } + }, + "load": { + "vin_nom": 2.145, + "RL": 20000.0, + "CL": 1e-12 + }, + "category": "follower", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.12, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "c690c8a6767bd4cb", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "ideal input source" + }, + { + "kind": "testbench_element", + "what": "load resistor and capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1.5_sL2/manifest.json new file mode 100644 index 00000000..7b1dabdf --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "e9de476fcb03d564f5d7ad5cb57de7572afba6ff493850983e0cdde88272d9a7", + "qualification.json": "420d1d97cc32f80c6ba3168186d968df0df6bcd7f5ad25f766fe0061e752527d", + "specs.json": "355ea30e779516b1d8f277b116c19beb599a3b0fee66be08749277d5a21af239", + "target.spice": "fee552860487c599cfefd443cc183a247b3a5eeb0235e5143c22c7c48b8504b1", + "target_lvs.spice": "8a173df4e209d67dd31e7b10c6293600592e02aed23927155373839e64ecfc90", + "testbench.spice": "8d868ba4b9892e134a8eb9b156e8cd4d5cab24a67c360e8a0783456161b95c31" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1.5_sL2/qualification.json new file mode 100644 index 00000000..dc1fa067 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1.5_sL2/qualification.json @@ -0,0 +1,85 @@ +{ + "case_id": "C05_gf180_sW1.5_sL2", + "circuit_id": "C05", + "pdk": "gf180", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "follower", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.12, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "c690c8a6767bd4cb", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_at_nom": { + "min": 0.6309 + }, + "f3db": { + "min": 35530000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.6809448, + "f3db": 59222770.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vout0": 0.8087849, + "idd": 5.99297e-05, + "gain_at_nom": 0.6809448, + "vout_at_nom": 0.8087849, + "vin_lo": 1.12946, + "vin_hi": 1.12946, + "gain_lf": -3.336947, + "f3db": 59222770.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1.5_sL2/specs.json new file mode 100644 index 00000000..08b8e837 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1.5_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_at_nom": { + "min": 0.6309 + }, + "f3db": { + "min": 35530000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.6809448, + "f3db": 59222770.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1.5_sL2/target.spice new file mode 100644 index 00000000..2fde154f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1.5_sL2/target.spice @@ -0,0 +1,4 @@ +.subckt C05_gf180_sW1.5_sL2 VDD VSS VIN1 VOUT1 VB1 +MM1 VOUT1 VB1 VSS VSS nfet_03v3 w=3u l=1.12u nf=6 m=1 +MM2 VDD VIN1 VOUT1 VSS nfet_03v3 w=6u l=1.12u nf=12 m=1 +.ends C05_gf180_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1.5_sL2/target_lvs.spice new file mode 100644 index 00000000..4994f30c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1.5_sL2/target_lvs.spice @@ -0,0 +1,20 @@ +.subckt C05_gf180_sW1.5_sL2 VDD VSS VIN1 VOUT1 VB1 +MM1_f0 VOUT1 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM1_f1 VOUT1 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM1_f2 VOUT1 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM1_f3 VOUT1 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM1_f4 VOUT1 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM1_f5 VOUT1 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM2_f0 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f1 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f2 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f3 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f4 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f5 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f6 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f7 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f8 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f9 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f10 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f11 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +.ends C05_gf180_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1.5_sL2/testbench.spice new file mode 100644 index 00000000..c2a1728e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1.5_sL2/testbench.spice @@ -0,0 +1,30 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C05_gf180_sW1.5_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +MB_VB1 VB1 VB1 VSS VSS nfet_03v3 w=3u l=1.12u +IB_VB1 VDDB VB1 2e-05 +VIN1 VIN1 0 dc 2.145 ac 1 +RL VOUT1 0 20000 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +print vout0 idd +dc VIN1 0 3.3 0.00825 +let gain_dc = deriv(v(VOUT1)) +meas dc gain_at_nom find gain_dc at=2.145 +meas dc vout_at_nom find v(VOUT1) at=2.145 +let okg = gain_dc - 0.5 +meas dc vin_lo find v(VIN1) when okg=0 cross=1 +meas dc vin_hi find v(VIN1) when okg=0 cross=last +ac dec 20 1k 10G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=1k +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1_sL1.5/case.json new file mode 100644 index 00000000..2e69ad51 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1_sL1.5/case.json @@ -0,0 +1,103 @@ +{ + "case_id": "C05_gf180_sW1_sL1.5", + "circuit_id": "C05", + "pdk": "gf180", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "dut_name": "C05_gf180_sW1_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.84, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.84, + "nf": 8 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M1", + "current": 2e-05 + } + }, + "load": { + "vin_nom": 2.145, + "RL": 20000.0, + "CL": 1e-12 + }, + "category": "follower", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "1f80275162187fc2", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "ideal input source" + }, + { + "kind": "testbench_element", + "what": "load resistor and capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1_sL1.5/manifest.json new file mode 100644 index 00000000..e4c5d2c1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "22054d9387f0c77c8355612566552ed049bc5213334c21da645181d9e5708b2b", + "qualification.json": "28053a067e678fd9a4cad69827feb6ab850e6571beb88fffee0b7315cd4291d2", + "specs.json": "d26aa5b641d5f652527bf1ababa6a1dfc5b694b5ff880fd11d9e35a3891ddfd7", + "target.spice": "892d1c10b2e48f152ba85bdac38d71d021257c38575bafd85622f570622b3b04", + "target_lvs.spice": "8ae3916959a5b601b3f4a3839d946509d34b35f19cf30e6daf36740992a5bd01", + "testbench.spice": "35e9c9d50dc46cdf2659de9b2f38be55a6a8cf907b2d9deabf74193fa057d42e" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1_sL1.5/qualification.json new file mode 100644 index 00000000..e7d0d45b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1_sL1.5/qualification.json @@ -0,0 +1,85 @@ +{ + "case_id": "C05_gf180_sW1_sL1.5", + "circuit_id": "C05", + "pdk": "gf180", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "follower", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "1f80275162187fc2", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_at_nom": { + "min": 0.6255 + }, + "f3db": { + "min": 33420000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.6754529, + "f3db": 55698050.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vout0": 0.791703, + "idd": 5.987414e-05, + "gain_at_nom": 0.6754529, + "vout_at_nom": 0.791703, + "vin_lo": 1.165817, + "vin_hi": 1.165817, + "gain_lf": -3.407319, + "f3db": 55698050.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1_sL1.5/specs.json new file mode 100644 index 00000000..49832466 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_at_nom": { + "min": 0.6255 + }, + "f3db": { + "min": 33420000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.6754529, + "f3db": 55698050.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1_sL1.5/target.spice new file mode 100644 index 00000000..5e3b4536 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1_sL1.5/target.spice @@ -0,0 +1,4 @@ +.subckt C05_gf180_sW1_sL1.5 VDD VSS VIN1 VOUT1 VB1 +MM1 VOUT1 VB1 VSS VSS nfet_03v3 w=2u l=0.84u nf=4 m=1 +MM2 VDD VIN1 VOUT1 VSS nfet_03v3 w=4u l=0.84u nf=8 m=1 +.ends C05_gf180_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1_sL1.5/target_lvs.spice new file mode 100644 index 00000000..86f5f2ab --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1_sL1.5/target_lvs.spice @@ -0,0 +1,14 @@ +.subckt C05_gf180_sW1_sL1.5 VDD VSS VIN1 VOUT1 VB1 +MM1_f0 VOUT1 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM1_f1 VOUT1 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM1_f2 VOUT1 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM1_f3 VOUT1 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM2_f0 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f1 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f2 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f3 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f4 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f5 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f6 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f7 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +.ends C05_gf180_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1_sL1.5/testbench.spice new file mode 100644 index 00000000..854b742b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1_sL1.5/testbench.spice @@ -0,0 +1,30 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C05_gf180_sW1_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +MB_VB1 VB1 VB1 VSS VSS nfet_03v3 w=2u l=0.84u +IB_VB1 VDDB VB1 2e-05 +VIN1 VIN1 0 dc 2.145 ac 1 +RL VOUT1 0 20000 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +print vout0 idd +dc VIN1 0 3.3 0.00825 +let gain_dc = deriv(v(VOUT1)) +meas dc gain_at_nom find gain_dc at=2.145 +meas dc vout_at_nom find v(VOUT1) at=2.145 +let okg = gain_dc - 0.5 +meas dc vin_lo find v(VIN1) when okg=0 cross=1 +meas dc vin_hi find v(VIN1) when okg=0 cross=last +ac dec 20 1k 10G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=1k +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1_sL1/case.json new file mode 100644 index 00000000..2eec9828 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1_sL1/case.json @@ -0,0 +1,103 @@ +{ + "case_id": "C05_gf180_sW1_sL1", + "circuit_id": "C05", + "pdk": "gf180", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "dut_name": "C05_gf180_sW1_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.56, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.56, + "nf": 8 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M1", + "current": 2e-05 + } + }, + "load": { + "vin_nom": 2.145, + "RL": 20000.0, + "CL": 1e-12 + }, + "category": "follower", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "0e05434cd8b5f2d9", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "ideal input source" + }, + { + "kind": "testbench_element", + "what": "load resistor and capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1_sL1/manifest.json new file mode 100644 index 00000000..abc0fdf0 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "053a7c237e09a800ca5eb6d54b7353add6b6760b2dc81d7fe08fb69b8c4fb465", + "qualification.json": "0075d81575769965d6e485bc2fb2383f7e000baf3e6dc439ef21873000fa1dbc", + "specs.json": "b18cf04789615281ee1056de75d1dc51ab37eefcbd856622ed879d41ef9035b5", + "target.spice": "0740b09e4cec571704d59341a247ff233256f8c8988ba71a72a043ec29a308d6", + "target_lvs.spice": "da8662ffc7f64ce96aba42d4da6d908a4461c60c8666f0c03f5e55f49da7a586", + "testbench.spice": "f4da465ddd95fae68c21029be49b4873dacdf4a76d85a380a5d6b5830eef4713" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1_sL1/qualification.json new file mode 100644 index 00000000..f64cfeaf --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1_sL1/qualification.json @@ -0,0 +1,85 @@ +{ + "case_id": "C05_gf180_sW1_sL1", + "circuit_id": "C05", + "pdk": "gf180", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "follower", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "0e05434cd8b5f2d9", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_at_nom": { + "min": 0.6554 + }, + "f3db": { + "min": 41180000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.7054489, + "f3db": 68638120.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vout0": 0.8631292, + "idd": 6.490372e-05, + "gain_at_nom": 0.7054489, + "vout_at_nom": 0.8631292, + "vin_lo": 1.03423, + "vin_hi": 1.03423, + "gain_lf": -3.030078, + "f3db": 68638120.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1_sL1/specs.json new file mode 100644 index 00000000..d1886c31 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_at_nom": { + "min": 0.6554 + }, + "f3db": { + "min": 41180000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.7054489, + "f3db": 68638120.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1_sL1/target.spice new file mode 100644 index 00000000..fb76144c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1_sL1/target.spice @@ -0,0 +1,4 @@ +.subckt C05_gf180_sW1_sL1 VDD VSS VIN1 VOUT1 VB1 +MM1 VOUT1 VB1 VSS VSS nfet_03v3 w=2u l=0.56u nf=4 m=1 +MM2 VDD VIN1 VOUT1 VSS nfet_03v3 w=4u l=0.56u nf=8 m=1 +.ends C05_gf180_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1_sL1/target_lvs.spice new file mode 100644 index 00000000..451d3a37 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1_sL1/target_lvs.spice @@ -0,0 +1,14 @@ +.subckt C05_gf180_sW1_sL1 VDD VSS VIN1 VOUT1 VB1 +MM1_f0 VOUT1 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM1_f1 VOUT1 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM1_f2 VOUT1 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM1_f3 VOUT1 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM2_f0 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f1 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f2 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f3 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f4 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f5 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f6 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f7 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +.ends C05_gf180_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1_sL1/testbench.spice new file mode 100644 index 00000000..b28bc2ad --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1_sL1/testbench.spice @@ -0,0 +1,30 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C05_gf180_sW1_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +MB_VB1 VB1 VB1 VSS VSS nfet_03v3 w=2u l=0.56u +IB_VB1 VDDB VB1 2e-05 +VIN1 VIN1 0 dc 2.145 ac 1 +RL VOUT1 0 20000 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +print vout0 idd +dc VIN1 0 3.3 0.00825 +let gain_dc = deriv(v(VOUT1)) +meas dc gain_at_nom find gain_dc at=2.145 +meas dc vout_at_nom find v(VOUT1) at=2.145 +let okg = gain_dc - 0.5 +meas dc vin_lo find v(VIN1) when okg=0 cross=1 +meas dc vin_hi find v(VIN1) when okg=0 cross=last +ac dec 20 1k 10G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=1k +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1_sL2/case.json new file mode 100644 index 00000000..f2817b9c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1_sL2/case.json @@ -0,0 +1,103 @@ +{ + "case_id": "C05_gf180_sW1_sL2", + "circuit_id": "C05", + "pdk": "gf180", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "dut_name": "C05_gf180_sW1_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 1.12, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 1.12, + "nf": 8 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M1", + "current": 2e-05 + } + }, + "load": { + "vin_nom": 2.145, + "RL": 20000.0, + "CL": 1e-12 + }, + "category": "follower", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "94adb534ca849a23", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "ideal input source" + }, + { + "kind": "testbench_element", + "what": "load resistor and capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1_sL2/manifest.json new file mode 100644 index 00000000..0f501218 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "f061509676d9ca1d927a98a912e3ecc8c4149506a490fc882989e6e010cd6c67", + "qualification.json": "0a1a97704e456eb0413e21bb0e41e200f2ae5a22ef15815f29cabade4fd7f3cb", + "specs.json": "6ca16e9b41ab3a71d786acf8c251c1617310dfc9fe2edc2fbb85ac7d80f05d05", + "target.spice": "f9a965bd480c116f5d37adde5a784f70fe7576041d9700325d9229254bfd40b7", + "target_lvs.spice": "f3dc9bef03e50dad131594e4571d8af4293098d7f56af0048aa3774390496043", + "testbench.spice": "12c127a84e7e436cccf0a0fc7b88a8cfc582f8c68e596d8ab4424033214aec4e" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1_sL2/qualification.json new file mode 100644 index 00000000..8d45ff13 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1_sL2/qualification.json @@ -0,0 +1,85 @@ +{ + "case_id": "C05_gf180_sW1_sL2", + "circuit_id": "C05", + "pdk": "gf180", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "follower", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "94adb534ca849a23", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_at_nom": { + "min": 0.6039 + }, + "f3db": { + "min": 28990000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.6538903, + "f3db": 48312250.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vout0": 0.7393739, + "idd": 5.662267e-05, + "gain_at_nom": 0.6538903, + "vout_at_nom": 0.7393739, + "vin_lo": 1.280164, + "vin_hi": 1.280164, + "gain_lf": -3.689009, + "f3db": 48312250.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1_sL2/specs.json new file mode 100644 index 00000000..d7cab65a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_at_nom": { + "min": 0.6039 + }, + "f3db": { + "min": 28990000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.6538903, + "f3db": 48312250.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1_sL2/target.spice new file mode 100644 index 00000000..0bcb3197 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1_sL2/target.spice @@ -0,0 +1,4 @@ +.subckt C05_gf180_sW1_sL2 VDD VSS VIN1 VOUT1 VB1 +MM1 VOUT1 VB1 VSS VSS nfet_03v3 w=2u l=1.12u nf=4 m=1 +MM2 VDD VIN1 VOUT1 VSS nfet_03v3 w=4u l=1.12u nf=8 m=1 +.ends C05_gf180_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1_sL2/target_lvs.spice new file mode 100644 index 00000000..4783c8e4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1_sL2/target_lvs.spice @@ -0,0 +1,14 @@ +.subckt C05_gf180_sW1_sL2 VDD VSS VIN1 VOUT1 VB1 +MM1_f0 VOUT1 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM1_f1 VOUT1 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM1_f2 VOUT1 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM1_f3 VOUT1 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM2_f0 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f1 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f2 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f3 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f4 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f5 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f6 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f7 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +.ends C05_gf180_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1_sL2/testbench.spice new file mode 100644 index 00000000..bdcdcbdf --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW1_sL2/testbench.spice @@ -0,0 +1,30 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C05_gf180_sW1_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +MB_VB1 VB1 VB1 VSS VSS nfet_03v3 w=2u l=1.12u +IB_VB1 VDDB VB1 2e-05 +VIN1 VIN1 0 dc 2.145 ac 1 +RL VOUT1 0 20000 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +print vout0 idd +dc VIN1 0 3.3 0.00825 +let gain_dc = deriv(v(VOUT1)) +meas dc gain_at_nom find gain_dc at=2.145 +meas dc vout_at_nom find v(VOUT1) at=2.145 +let okg = gain_dc - 0.5 +meas dc vin_lo find v(VIN1) when okg=0 cross=1 +meas dc vin_hi find v(VIN1) when okg=0 cross=last +ac dec 20 1k 10G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=1k +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C05/gf180/sW2_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW2_sL1.5/case.json new file mode 100644 index 00000000..23a52aa9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW2_sL1.5/case.json @@ -0,0 +1,103 @@ +{ + "case_id": "C05_gf180_sW2_sL1.5", + "circuit_id": "C05", + "pdk": "gf180", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "dut_name": "C05_gf180_sW2_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.84, + "nf": 8 + }, + "M2": { + "w": 8.0, + "l": 0.84, + "nf": 16 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M1", + "current": 2e-05 + } + }, + "load": { + "vin_nom": 2.145, + "RL": 20000.0, + "CL": 1e-12 + }, + "category": "follower", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "dc565ccae0092713", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "ideal input source" + }, + { + "kind": "testbench_element", + "what": "load resistor and capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/gf180/sW2_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW2_sL1.5/manifest.json new file mode 100644 index 00000000..ee3fe2f1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW2_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "34ccc6c7e2ee42790689f7113271abd18cdac3d13b8ada7ae189e77cbdbaacfa", + "qualification.json": "92bf5f2325717d42bee2c4bb454aa844a0e0dd9063f0362e82fc26a904dc55d8", + "specs.json": "4288171fe89f42826b0be12d64fb4e9ab04f312ed6557b78926762792941e1e1", + "target.spice": "3411f6872eb4028103a835be5ee03b0c4679d9620689616155b0e278cbea98bf", + "target_lvs.spice": "74c16b46d8f205199047f0e2dcebb242e74b6aa272c252bd2ec84bc0c9961d81", + "testbench.spice": "25622edbb412f206519a937ae13bc0831595c9d8d1ca5f275dca8adadcca5824" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/gf180/sW2_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW2_sL1.5/qualification.json new file mode 100644 index 00000000..cb6bb03d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW2_sL1.5/qualification.json @@ -0,0 +1,85 @@ +{ + "case_id": "C05_gf180_sW2_sL1.5", + "circuit_id": "C05", + "pdk": "gf180", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "follower", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "dc565ccae0092713", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_at_nom": { + "min": 0.6638 + }, + "f3db": { + "min": 47630000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.7138419, + "f3db": 79377220.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vout0": 0.8927972, + "idd": 6.530943e-05, + "gain_at_nom": 0.7138419, + "vout_at_nom": 0.8927972, + "vin_lo": 0.9824942, + "vin_hi": 0.9824942, + "gain_lf": -2.927308, + "f3db": 79377220.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/gf180/sW2_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW2_sL1.5/specs.json new file mode 100644 index 00000000..87da5f90 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW2_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_at_nom": { + "min": 0.6638 + }, + "f3db": { + "min": 47630000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.7138419, + "f3db": 79377220.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/gf180/sW2_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW2_sL1.5/target.spice new file mode 100644 index 00000000..9f5edb15 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW2_sL1.5/target.spice @@ -0,0 +1,4 @@ +.subckt C05_gf180_sW2_sL1.5 VDD VSS VIN1 VOUT1 VB1 +MM1 VOUT1 VB1 VSS VSS nfet_03v3 w=4u l=0.84u nf=8 m=1 +MM2 VDD VIN1 VOUT1 VSS nfet_03v3 w=8u l=0.84u nf=16 m=1 +.ends C05_gf180_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C05/gf180/sW2_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW2_sL1.5/target_lvs.spice new file mode 100644 index 00000000..f65155e1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW2_sL1.5/target_lvs.spice @@ -0,0 +1,26 @@ +.subckt C05_gf180_sW2_sL1.5 VDD VSS VIN1 VOUT1 VB1 +MM1_f0 VOUT1 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM1_f1 VOUT1 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM1_f2 VOUT1 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM1_f3 VOUT1 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM1_f4 VOUT1 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM1_f5 VOUT1 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM1_f6 VOUT1 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM1_f7 VOUT1 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM2_f0 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f1 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f2 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f3 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f4 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f5 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f6 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f7 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f8 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f9 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f10 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f11 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f12 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f13 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f14 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f15 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +.ends C05_gf180_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C05/gf180/sW2_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW2_sL1.5/testbench.spice new file mode 100644 index 00000000..e004f810 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW2_sL1.5/testbench.spice @@ -0,0 +1,30 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C05_gf180_sW2_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +MB_VB1 VB1 VB1 VSS VSS nfet_03v3 w=4u l=0.84u +IB_VB1 VDDB VB1 2e-05 +VIN1 VIN1 0 dc 2.145 ac 1 +RL VOUT1 0 20000 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +print vout0 idd +dc VIN1 0 3.3 0.00825 +let gain_dc = deriv(v(VOUT1)) +meas dc gain_at_nom find gain_dc at=2.145 +meas dc vout_at_nom find v(VOUT1) at=2.145 +let okg = gain_dc - 0.5 +meas dc vin_lo find v(VIN1) when okg=0 cross=1 +meas dc vin_hi find v(VIN1) when okg=0 cross=last +ac dec 20 1k 10G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=1k +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C05/gf180/sW2_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW2_sL1/case.json new file mode 100644 index 00000000..49549e98 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW2_sL1/case.json @@ -0,0 +1,103 @@ +{ + "case_id": "C05_gf180_sW2_sL1", + "circuit_id": "C05", + "pdk": "gf180", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "dut_name": "C05_gf180_sW2_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "M2": { + "w": 8.0, + "l": 0.56, + "nf": 16 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M1", + "current": 2e-05 + } + }, + "load": { + "vin_nom": 2.145, + "RL": 20000.0, + "CL": 1e-12 + }, + "category": "follower", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "e0addbaefaea9a09", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "ideal input source" + }, + { + "kind": "testbench_element", + "what": "load resistor and capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/gf180/sW2_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW2_sL1/manifest.json new file mode 100644 index 00000000..957f40e9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW2_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "a91f8ad86b602d62b8ae5dd28992d5855c991840591ecea073b6ebac8b11e63f", + "qualification.json": "e1e9bd0bbafddf70d13cf91b71e7e570b266f6e30f8e3f399c15a5c877025cd1", + "specs.json": "b509c91b65e8a80849cbff2db7ad519c6e2aee96d77d37cd657c04fb5d5eb890", + "target.spice": "12f8b55ef87810f1cc6b6acee555dcaf59d6b2b45f0ed1de06c8fd013bb2f590", + "target_lvs.spice": "9aa7c7ae0312901fe4d431e14f126e822af2b7cc2f171e6d195a4f11fcedb402", + "testbench.spice": "94f38522fe5d60abc0a1d9ff27c8361bb7268f27e301117219125586be6ee64a" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/gf180/sW2_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW2_sL1/qualification.json new file mode 100644 index 00000000..773de4eb --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW2_sL1/qualification.json @@ -0,0 +1,85 @@ +{ + "case_id": "C05_gf180_sW2_sL1", + "circuit_id": "C05", + "pdk": "gf180", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "follower", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "e0addbaefaea9a09", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_at_nom": { + "min": 0.6882 + }, + "f3db": { + "min": 59210000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.7382363, + "f3db": 98678480.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vout0": 0.9498892, + "idd": 7.067995e-05, + "gain_at_nom": 0.7382363, + "vout_at_nom": 0.9498892, + "vin_lo": 0.904072, + "vin_hi": 0.904072, + "gain_lf": -2.635587, + "f3db": 98678480.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/gf180/sW2_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW2_sL1/specs.json new file mode 100644 index 00000000..c1e3ceb9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW2_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_at_nom": { + "min": 0.6882 + }, + "f3db": { + "min": 59210000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.7382363, + "f3db": 98678480.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/gf180/sW2_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW2_sL1/target.spice new file mode 100644 index 00000000..601ce06c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW2_sL1/target.spice @@ -0,0 +1,4 @@ +.subckt C05_gf180_sW2_sL1 VDD VSS VIN1 VOUT1 VB1 +MM1 VOUT1 VB1 VSS VSS nfet_03v3 w=4u l=0.56u nf=8 m=1 +MM2 VDD VIN1 VOUT1 VSS nfet_03v3 w=8u l=0.56u nf=16 m=1 +.ends C05_gf180_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C05/gf180/sW2_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW2_sL1/target_lvs.spice new file mode 100644 index 00000000..11a51740 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW2_sL1/target_lvs.spice @@ -0,0 +1,26 @@ +.subckt C05_gf180_sW2_sL1 VDD VSS VIN1 VOUT1 VB1 +MM1_f0 VOUT1 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM1_f1 VOUT1 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM1_f2 VOUT1 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM1_f3 VOUT1 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM1_f4 VOUT1 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM1_f5 VOUT1 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM1_f6 VOUT1 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM1_f7 VOUT1 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM2_f0 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f1 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f2 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f3 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f4 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f5 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f6 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f7 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f8 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f9 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f10 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f11 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f12 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f13 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f14 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f15 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +.ends C05_gf180_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C05/gf180/sW2_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW2_sL1/testbench.spice new file mode 100644 index 00000000..a08f58b2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW2_sL1/testbench.spice @@ -0,0 +1,30 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C05_gf180_sW2_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +MB_VB1 VB1 VB1 VSS VSS nfet_03v3 w=4u l=0.56u +IB_VB1 VDDB VB1 2e-05 +VIN1 VIN1 0 dc 2.145 ac 1 +RL VOUT1 0 20000 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +print vout0 idd +dc VIN1 0 3.3 0.00825 +let gain_dc = deriv(v(VOUT1)) +meas dc gain_at_nom find gain_dc at=2.145 +meas dc vout_at_nom find v(VOUT1) at=2.145 +let okg = gain_dc - 0.5 +meas dc vin_lo find v(VIN1) when okg=0 cross=1 +meas dc vin_hi find v(VIN1) when okg=0 cross=last +ac dec 20 1k 10G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=1k +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C05/gf180/sW2_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW2_sL2/case.json new file mode 100644 index 00000000..2f6bdf1d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW2_sL2/case.json @@ -0,0 +1,103 @@ +{ + "case_id": "C05_gf180_sW2_sL2", + "circuit_id": "C05", + "pdk": "gf180", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "dut_name": "C05_gf180_sW2_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 1.12, + "nf": 8 + }, + "M2": { + "w": 8.0, + "l": 1.12, + "nf": 16 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M1", + "current": 2e-05 + } + }, + "load": { + "vin_nom": 2.145, + "RL": 20000.0, + "CL": 1e-12 + }, + "category": "follower", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "4035e4161c10cfbb", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "ideal input source" + }, + { + "kind": "testbench_element", + "what": "load resistor and capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/gf180/sW2_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW2_sL2/manifest.json new file mode 100644 index 00000000..d3f006e2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW2_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "d8297176cba895e93a4adf4b46e599dd6b74427617bbd771fc0d19b429d2baa8", + "qualification.json": "8972997f3813e695290c85313b6b025dbf93fc9dccbe254f46a12c2cba966805", + "specs.json": "4545e99048c9f72166df362c2081037e4437b6aeb96b1d78093a7ed97b79f787", + "target.spice": "57e6aeb78d0492859439ff642e6061794589962c2dcbdfa8069c10afd3bd811a", + "target_lvs.spice": "0ca3eca01dd2cddb81f728b5c7f471dd80599d95dd4384a97c75c2e28dfb8e1c", + "testbench.spice": "e15b788153c32bc2c937b523439f922e70d5be3fd14d3467a6794bb768b8c051" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/gf180/sW2_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW2_sL2/qualification.json new file mode 100644 index 00000000..fab4a54e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW2_sL2/qualification.json @@ -0,0 +1,85 @@ +{ + "case_id": "C05_gf180_sW2_sL2", + "circuit_id": "C05", + "pdk": "gf180", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "follower", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "4035e4161c10cfbb", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_at_nom": { + "min": 0.6468 + }, + "f3db": { + "min": 40950000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.6967894, + "f3db": 68257440.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vout0": 0.8513223, + "idd": 6.212506e-05, + "gain_at_nom": 0.6967894, + "vout_at_nom": 0.8513223, + "vin_lo": 1.049555, + "vin_hi": 1.049555, + "gain_lf": -3.137212, + "f3db": 68257440.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/gf180/sW2_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW2_sL2/specs.json new file mode 100644 index 00000000..689fd00d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW2_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_at_nom": { + "min": 0.6468 + }, + "f3db": { + "min": 40950000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.6967894, + "f3db": 68257440.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/gf180/sW2_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW2_sL2/target.spice new file mode 100644 index 00000000..2848c0f6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW2_sL2/target.spice @@ -0,0 +1,4 @@ +.subckt C05_gf180_sW2_sL2 VDD VSS VIN1 VOUT1 VB1 +MM1 VOUT1 VB1 VSS VSS nfet_03v3 w=4u l=1.12u nf=8 m=1 +MM2 VDD VIN1 VOUT1 VSS nfet_03v3 w=8u l=1.12u nf=16 m=1 +.ends C05_gf180_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C05/gf180/sW2_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW2_sL2/target_lvs.spice new file mode 100644 index 00000000..50a3b48a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW2_sL2/target_lvs.spice @@ -0,0 +1,26 @@ +.subckt C05_gf180_sW2_sL2 VDD VSS VIN1 VOUT1 VB1 +MM1_f0 VOUT1 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM1_f1 VOUT1 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM1_f2 VOUT1 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM1_f3 VOUT1 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM1_f4 VOUT1 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM1_f5 VOUT1 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM1_f6 VOUT1 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM1_f7 VOUT1 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM2_f0 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f1 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f2 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f3 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f4 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f5 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f6 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f7 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f8 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f9 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f10 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f11 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f12 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f13 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f14 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f15 VDD VIN1 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +.ends C05_gf180_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C05/gf180/sW2_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW2_sL2/testbench.spice new file mode 100644 index 00000000..f5887004 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/gf180/sW2_sL2/testbench.spice @@ -0,0 +1,30 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C05_gf180_sW2_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +MB_VB1 VB1 VB1 VSS VSS nfet_03v3 w=4u l=1.12u +IB_VB1 VDDB VB1 2e-05 +VIN1 VIN1 0 dc 2.145 ac 1 +RL VOUT1 0 20000 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +print vout0 idd +dc VIN1 0 3.3 0.00825 +let gain_dc = deriv(v(VOUT1)) +meas dc gain_at_nom find gain_dc at=2.145 +meas dc vout_at_nom find v(VOUT1) at=2.145 +let okg = gain_dc - 0.5 +meas dc vin_lo find v(VIN1) when okg=0 cross=1 +meas dc vin_hi find v(VIN1) when okg=0 cross=last +ac dec 20 1k 10G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=1k +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW0.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW0.5_sL1.5/case.json new file mode 100644 index 00000000..917d0092 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW0.5_sL1.5/case.json @@ -0,0 +1,103 @@ +{ + "case_id": "C05_ihp130_sW0.5_sL1.5", + "circuit_id": "C05", + "pdk": "ihp130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "dut_name": "C05_ihp130_sW0.5_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 1.0, + "l": 0.39, + "nf": 2 + }, + "M2": { + "w": 2.0, + "l": 0.39, + "nf": 4 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M1", + "current": 2e-05 + } + }, + "load": { + "vin_nom": 0.78, + "RL": 20000.0, + "CL": 1e-12 + }, + "category": "follower", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.39, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "cfb9562ee86242de", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "ideal input source" + }, + { + "kind": "testbench_element", + "what": "load resistor and capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW0.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW0.5_sL1.5/manifest.json new file mode 100644 index 00000000..7b6d1bde --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW0.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "807cde4fc5be2d33a6c3889c3f92372d64e83365da57e8ade03f7557ce22bf81", + "qualification.json": "58e66d90079a5dfe4a29e2a11dc93ce26d5472e742c0033dbae75035899d7591", + "specs.json": "e9602a32e3e8fb20d368dc04f990e3175c540f4fdfab9eb5b736959a5c562244", + "target.spice": "66930b554f680bb34debea3208201f7ff7e81b8840f65832a52a19856ed8c487", + "target_lvs.spice": "ea3d49d09c49cd736cfd647339b55767d5c6f915b7796d21f9e0e8d248cfda52", + "testbench.spice": "f65540a919226f8d4db3bf5ef141116e21cd6a2c84d7b231174ed6440c9ca0b8" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW0.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW0.5_sL1.5/qualification.json new file mode 100644 index 00000000..4ba8a265 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW0.5_sL1.5/qualification.json @@ -0,0 +1,85 @@ +{ + "case_id": "C05_ihp130_sW0.5_sL1.5", + "circuit_id": "C05", + "pdk": "ihp130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "follower", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.39, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "cfb9562ee86242de", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_at_nom": { + "min": 0.6754 + }, + "f3db": { + "min": 35230000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.7254285, + "f3db": 58723160.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.2, + "schematic_measures": { + "vout0": 0.2602329, + "idd": 3.020821e-05, + "gain_at_nom": 0.7254285, + "vout_at_nom": 0.260232, + "vin_lo": 0.4965802, + "vin_hi": 0.4965802, + "gain_lf": -2.788168, + "f3db": 58723160.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW0.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW0.5_sL1.5/specs.json new file mode 100644 index 00000000..bbc4755e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW0.5_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_at_nom": { + "min": 0.6754 + }, + "f3db": { + "min": 35230000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.7254285, + "f3db": 58723160.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW0.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW0.5_sL1.5/target.spice new file mode 100644 index 00000000..21ac0abd --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW0.5_sL1.5/target.spice @@ -0,0 +1,4 @@ +.subckt C05_ihp130_sW0.5_sL1.5 VDD VSS VIN1 VOUT1 VB1 +XM1 VOUT1 VB1 VSS VSS sg13_lv_nmos w=1u l=0.39u ng=2 m=1 +XM2 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=2u l=0.39u ng=4 m=1 +.ends C05_ihp130_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW0.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW0.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..02dd027f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW0.5_sL1.5/target_lvs.spice @@ -0,0 +1,8 @@ +.subckt C05_ihp130_sW0.5_sL1.5 VDD VSS VIN1 VOUT1 VB1 +XM1_f0 VOUT1 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f1 VOUT1 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f0 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f1 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f2 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f3 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +.ends C05_ihp130_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW0.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW0.5_sL1.5/testbench.spice new file mode 100644 index 00000000..fd2f73f0 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW0.5_sL1.5/testbench.spice @@ -0,0 +1,30 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C05_ihp130_sW0.5_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +XB_VB1 VB1 VB1 VSS VSS sg13_lv_nmos w=1u l=0.39u +IB_VB1 VDDB VB1 2e-05 +VIN1 VIN1 0 dc 0.78 ac 1 +RL VOUT1 0 20000 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +print vout0 idd +dc VIN1 0 1.2 0.003 +let gain_dc = deriv(v(VOUT1)) +meas dc gain_at_nom find gain_dc at=0.78 +meas dc vout_at_nom find v(VOUT1) at=0.78 +let okg = gain_dc - 0.5 +meas dc vin_lo find v(VIN1) when okg=0 cross=1 +meas dc vin_hi find v(VIN1) when okg=0 cross=last +ac dec 20 1k 10G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=1k +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW0.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW0.5_sL1/case.json new file mode 100644 index 00000000..603fb0b2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW0.5_sL1/case.json @@ -0,0 +1,103 @@ +{ + "case_id": "C05_ihp130_sW0.5_sL1", + "circuit_id": "C05", + "pdk": "ihp130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "dut_name": "C05_ihp130_sW0.5_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 1.0, + "l": 0.26, + "nf": 2 + }, + "M2": { + "w": 2.0, + "l": 0.26, + "nf": 4 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M1", + "current": 2e-05 + } + }, + "load": { + "vin_nom": 0.78, + "RL": 20000.0, + "CL": 1e-12 + }, + "category": "follower", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.26, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.26, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "abfe36960c3ba7cd", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "ideal input source" + }, + { + "kind": "testbench_element", + "what": "load resistor and capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW0.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW0.5_sL1/manifest.json new file mode 100644 index 00000000..bb068144 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW0.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "0d45cdf3982ee0f8c5d10a7952b40c8401da75a7a10027bf828d82d9cc9d9aad", + "qualification.json": "63a2587bb5e1156fcd911435c349f60922b556100d532443286c9b0e0a99922b", + "specs.json": "e33e20c32c7bf7c3a24d475bbde007954859fed4af398d7015829c160991a797", + "target.spice": "7fdcba34b87c954451957987f6bdee26d9da06974c4e565953bd1c3396313ffc", + "target_lvs.spice": "cb97598d9608949bf8a263c5e792875083ac296731ebfd53b4c8f0e1d6b23e23", + "testbench.spice": "97804d5527a6cc0d0cbf2355b3aadd40f3a90dca2bfe136a2f0d1735e2a1452f" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW0.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW0.5_sL1/qualification.json new file mode 100644 index 00000000..6093153c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW0.5_sL1/qualification.json @@ -0,0 +1,85 @@ +{ + "case_id": "C05_ihp130_sW0.5_sL1", + "circuit_id": "C05", + "pdk": "ihp130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "follower", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.26, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.26, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "abfe36960c3ba7cd", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_at_nom": { + "min": 0.6798 + }, + "f3db": { + "min": 38110000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.729817, + "f3db": 63517890.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.2, + "schematic_measures": { + "vout0": 0.2576804, + "idd": 2.917118e-05, + "gain_at_nom": 0.729817, + "vout_at_nom": 0.2576796, + "vin_lo": 0.4872625, + "vin_hi": 0.4872625, + "gain_lf": -2.735766, + "f3db": 63517890.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW0.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW0.5_sL1/specs.json new file mode 100644 index 00000000..e1422e6c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW0.5_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_at_nom": { + "min": 0.6798 + }, + "f3db": { + "min": 38110000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.729817, + "f3db": 63517890.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW0.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW0.5_sL1/target.spice new file mode 100644 index 00000000..2bca871e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW0.5_sL1/target.spice @@ -0,0 +1,4 @@ +.subckt C05_ihp130_sW0.5_sL1 VDD VSS VIN1 VOUT1 VB1 +XM1 VOUT1 VB1 VSS VSS sg13_lv_nmos w=1u l=0.26u ng=2 m=1 +XM2 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=2u l=0.26u ng=4 m=1 +.ends C05_ihp130_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW0.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW0.5_sL1/target_lvs.spice new file mode 100644 index 00000000..cdc0dc36 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW0.5_sL1/target_lvs.spice @@ -0,0 +1,8 @@ +.subckt C05_ihp130_sW0.5_sL1 VDD VSS VIN1 VOUT1 VB1 +XM1_f0 VOUT1 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f1 VOUT1 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f0 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f1 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f2 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f3 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +.ends C05_ihp130_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW0.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW0.5_sL1/testbench.spice new file mode 100644 index 00000000..4c489f72 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW0.5_sL1/testbench.spice @@ -0,0 +1,30 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C05_ihp130_sW0.5_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +XB_VB1 VB1 VB1 VSS VSS sg13_lv_nmos w=1u l=0.26u +IB_VB1 VDDB VB1 2e-05 +VIN1 VIN1 0 dc 0.78 ac 1 +RL VOUT1 0 20000 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +print vout0 idd +dc VIN1 0 1.2 0.003 +let gain_dc = deriv(v(VOUT1)) +meas dc gain_at_nom find gain_dc at=0.78 +meas dc vout_at_nom find v(VOUT1) at=0.78 +let okg = gain_dc - 0.5 +meas dc vin_lo find v(VIN1) when okg=0 cross=1 +meas dc vin_hi find v(VIN1) when okg=0 cross=last +ac dec 20 1k 10G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=1k +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW0.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW0.5_sL2/case.json new file mode 100644 index 00000000..8396abc9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW0.5_sL2/case.json @@ -0,0 +1,103 @@ +{ + "case_id": "C05_ihp130_sW0.5_sL2", + "circuit_id": "C05", + "pdk": "ihp130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "dut_name": "C05_ihp130_sW0.5_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 1.0, + "l": 0.52, + "nf": 2 + }, + "M2": { + "w": 2.0, + "l": 0.52, + "nf": 4 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M1", + "current": 2e-05 + } + }, + "load": { + "vin_nom": 0.78, + "RL": 20000.0, + "CL": 1e-12 + }, + "category": "follower", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.52, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "2ef8027b87d2499f", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "ideal input source" + }, + { + "kind": "testbench_element", + "what": "load resistor and capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW0.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW0.5_sL2/manifest.json new file mode 100644 index 00000000..54768c8d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW0.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "ce35c14e9c7064ff778f0707972c1d41f4624585047a1c40e9f18b2a0fc29e56", + "qualification.json": "5172946a7415c9bc01ce5362e15af0d7096942da29f4412c6fd6f73b45b92d5a", + "specs.json": "67dd1a6e46aa6eb0e39073be5c5ee4154f225dceec48bcfe9daf61d154796795", + "target.spice": "c93921478cce921954208a4dcd1c833486e4d4d26d0a7abf37ba0067b4354303", + "target_lvs.spice": "c039c73db0239d96bb578c310e7620c442b6211c83b48ccf55882903209c5568", + "testbench.spice": "c4beda567ec6f4f55623666c655ca1a438220ae956971dea747d65be4365db90" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW0.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW0.5_sL2/qualification.json new file mode 100644 index 00000000..f9b2cfd8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW0.5_sL2/qualification.json @@ -0,0 +1,85 @@ +{ + "case_id": "C05_ihp130_sW0.5_sL2", + "circuit_id": "C05", + "pdk": "ihp130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "follower", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.52, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "2ef8027b87d2499f", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_at_nom": { + "min": 0.6639 + }, + "f3db": { + "min": 32500000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.7139067, + "f3db": 54158500.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.2, + "schematic_measures": { + "vout0": 0.2527973, + "idd": 3.011537e-05, + "gain_at_nom": 0.7139067, + "vout_at_nom": 0.2527961, + "vin_lo": 0.5171557, + "vin_hi": 0.5171557, + "gain_lf": -2.927275, + "f3db": 54158500.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW0.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW0.5_sL2/specs.json new file mode 100644 index 00000000..267c84ab --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW0.5_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_at_nom": { + "min": 0.6639 + }, + "f3db": { + "min": 32500000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.7139067, + "f3db": 54158500.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW0.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW0.5_sL2/target.spice new file mode 100644 index 00000000..065df1c9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW0.5_sL2/target.spice @@ -0,0 +1,4 @@ +.subckt C05_ihp130_sW0.5_sL2 VDD VSS VIN1 VOUT1 VB1 +XM1 VOUT1 VB1 VSS VSS sg13_lv_nmos w=1u l=0.52u ng=2 m=1 +XM2 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=2u l=0.52u ng=4 m=1 +.ends C05_ihp130_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW0.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW0.5_sL2/target_lvs.spice new file mode 100644 index 00000000..f730f0cf --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW0.5_sL2/target_lvs.spice @@ -0,0 +1,8 @@ +.subckt C05_ihp130_sW0.5_sL2 VDD VSS VIN1 VOUT1 VB1 +XM1_f0 VOUT1 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f1 VOUT1 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f0 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f1 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f2 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f3 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +.ends C05_ihp130_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW0.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW0.5_sL2/testbench.spice new file mode 100644 index 00000000..fb9f6c93 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW0.5_sL2/testbench.spice @@ -0,0 +1,30 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C05_ihp130_sW0.5_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +XB_VB1 VB1 VB1 VSS VSS sg13_lv_nmos w=1u l=0.52u +IB_VB1 VDDB VB1 2e-05 +VIN1 VIN1 0 dc 0.78 ac 1 +RL VOUT1 0 20000 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +print vout0 idd +dc VIN1 0 1.2 0.003 +let gain_dc = deriv(v(VOUT1)) +meas dc gain_at_nom find gain_dc at=0.78 +meas dc vout_at_nom find v(VOUT1) at=0.78 +let okg = gain_dc - 0.5 +meas dc vin_lo find v(VIN1) when okg=0 cross=1 +meas dc vin_hi find v(VIN1) when okg=0 cross=last +ac dec 20 1k 10G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=1k +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1.5_sL1.5/case.json new file mode 100644 index 00000000..484fb7f6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1.5_sL1.5/case.json @@ -0,0 +1,103 @@ +{ + "case_id": "C05_ihp130_sW1.5_sL1.5", + "circuit_id": "C05", + "pdk": "ihp130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "dut_name": "C05_ihp130_sW1.5_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 3.0, + "l": 0.39, + "nf": 6 + }, + "M2": { + "w": 6.0, + "l": 0.39, + "nf": 12 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M1", + "current": 2e-05 + } + }, + "load": { + "vin_nom": 0.78, + "RL": 20000.0, + "CL": 1e-12 + }, + "category": "follower", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.39, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.39, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "7df5eef1df75bb86", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "ideal input source" + }, + { + "kind": "testbench_element", + "what": "load resistor and capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1.5_sL1.5/manifest.json new file mode 100644 index 00000000..0ae61dba --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "2cd5bbb7253fc84524845cd966dc172bfefed5e8918b7fa48d50559c8f68d063", + "qualification.json": "e9e95345119d299902b0f6ec416db573e53e7613bcb2b3baba3c877d21e30f0e", + "specs.json": "14416a346c21a8644e477f7878b869bd620543f8568af94e27146818c8f8e4fb", + "target.spice": "6ae0c048676ac98ad71a9ac7751751590f01cb8669b22417f41d36acd766b526", + "target_lvs.spice": "1a6cbfe6d20aa7ccf364369f9f398e25cd9719395c77414830ffd0e1956d6adc", + "testbench.spice": "9f323c69c9873f5fad5966281b9903f7037d31521e8dcaf12f763f90968cb496" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1.5_sL1.5/qualification.json new file mode 100644 index 00000000..34a442d7 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1.5_sL1.5/qualification.json @@ -0,0 +1,85 @@ +{ + "case_id": "C05_ihp130_sW1.5_sL1.5", + "circuit_id": "C05", + "pdk": "ihp130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "follower", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.39, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.39, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "7df5eef1df75bb86", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_at_nom": { + "min": 0.7277 + }, + "f3db": { + "min": 51610000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.7776932, + "f3db": 86023690.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.4, + "schematic_measures": { + "vout0": 0.3420958, + "idd": 3.298738e-05, + "gain_at_nom": 0.7776932, + "vout_at_nom": 0.3420954, + "vin_lo": 0.3681853, + "vin_hi": 0.3681853, + "gain_lf": -2.183841, + "f3db": 86023690.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1.5_sL1.5/specs.json new file mode 100644 index 00000000..1e051a35 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1.5_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_at_nom": { + "min": 0.7277 + }, + "f3db": { + "min": 51610000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.7776932, + "f3db": 86023690.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1.5_sL1.5/target.spice new file mode 100644 index 00000000..e5620148 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1.5_sL1.5/target.spice @@ -0,0 +1,4 @@ +.subckt C05_ihp130_sW1.5_sL1.5 VDD VSS VIN1 VOUT1 VB1 +XM1 VOUT1 VB1 VSS VSS sg13_lv_nmos w=3u l=0.39u ng=6 m=1 +XM2 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=6u l=0.39u ng=12 m=1 +.ends C05_ihp130_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..e28d50df --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1.5_sL1.5/target_lvs.spice @@ -0,0 +1,20 @@ +.subckt C05_ihp130_sW1.5_sL1.5 VDD VSS VIN1 VOUT1 VB1 +XM1_f0 VOUT1 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f1 VOUT1 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f2 VOUT1 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f3 VOUT1 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f4 VOUT1 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f5 VOUT1 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f0 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f1 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f2 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f3 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f4 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f5 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f6 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f7 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f8 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f9 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f10 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f11 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +.ends C05_ihp130_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1.5_sL1.5/testbench.spice new file mode 100644 index 00000000..38d0cd6c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1.5_sL1.5/testbench.spice @@ -0,0 +1,30 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C05_ihp130_sW1.5_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +XB_VB1 VB1 VB1 VSS VSS sg13_lv_nmos w=3u l=0.39u +IB_VB1 VDDB VB1 2e-05 +VIN1 VIN1 0 dc 0.78 ac 1 +RL VOUT1 0 20000 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +print vout0 idd +dc VIN1 0 1.2 0.003 +let gain_dc = deriv(v(VOUT1)) +meas dc gain_at_nom find gain_dc at=0.78 +meas dc vout_at_nom find v(VOUT1) at=0.78 +let okg = gain_dc - 0.5 +meas dc vin_lo find v(VIN1) when okg=0 cross=1 +meas dc vin_hi find v(VIN1) when okg=0 cross=last +ac dec 20 1k 10G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=1k +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1.5_sL1/case.json new file mode 100644 index 00000000..110eab87 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1.5_sL1/case.json @@ -0,0 +1,103 @@ +{ + "case_id": "C05_ihp130_sW1.5_sL1", + "circuit_id": "C05", + "pdk": "ihp130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "dut_name": "C05_ihp130_sW1.5_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 3.0, + "l": 0.26, + "nf": 6 + }, + "M2": { + "w": 6.0, + "l": 0.26, + "nf": 12 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M1", + "current": 2e-05 + } + }, + "load": { + "vin_nom": 0.78, + "RL": 20000.0, + "CL": 1e-12 + }, + "category": "follower", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.26, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.26, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "0648556f7a684bd9", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "ideal input source" + }, + { + "kind": "testbench_element", + "what": "load resistor and capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1.5_sL1/manifest.json new file mode 100644 index 00000000..89469ff6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "6d09e39fc142e4a333b8b7f87ce0672d79b3218e3333769d76461cec10e2b0c1", + "qualification.json": "bf328f00b32c99125fa57ca3632278812968e16a40587ef0b7624dce6ff12a95", + "specs.json": "aa5252bde45c60b9fd04f7675043cb9b9864657efb64cf6d600d066c67fbd23e", + "target.spice": "dff48ac8bb7d0a7570fa756d379a48e7f123e06c73e9445e8336c313c18d6b11", + "target_lvs.spice": "0561cb31ea9e10060f59ff6ce40b10338222bdcd8b6eadcc8b7a29da1f3398df", + "testbench.spice": "99b19d911259ebf59b4b865aaee3c12c774835191917d353454f11790fdbd729" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1.5_sL1/qualification.json new file mode 100644 index 00000000..2cd75c03 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1.5_sL1/qualification.json @@ -0,0 +1,85 @@ +{ + "case_id": "C05_ihp130_sW1.5_sL1", + "circuit_id": "C05", + "pdk": "ihp130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "follower", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.26, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.26, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "0648556f7a684bd9", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_at_nom": { + "min": 0.7264 + }, + "f3db": { + "min": 54030000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.7763982, + "f3db": 90048590.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.4, + "schematic_measures": { + "vout0": 0.3326983, + "idd": 3.107174e-05, + "gain_at_nom": 0.7763982, + "vout_at_nom": 0.332698, + "vin_lo": 0.3736716, + "vin_hi": 0.3736716, + "gain_lf": -2.198318, + "f3db": 90048590.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1.5_sL1/specs.json new file mode 100644 index 00000000..d1d720cb --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1.5_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_at_nom": { + "min": 0.7264 + }, + "f3db": { + "min": 54030000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.7763982, + "f3db": 90048590.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1.5_sL1/target.spice new file mode 100644 index 00000000..b0297c4d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1.5_sL1/target.spice @@ -0,0 +1,4 @@ +.subckt C05_ihp130_sW1.5_sL1 VDD VSS VIN1 VOUT1 VB1 +XM1 VOUT1 VB1 VSS VSS sg13_lv_nmos w=3u l=0.26u ng=6 m=1 +XM2 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=6u l=0.26u ng=12 m=1 +.ends C05_ihp130_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1.5_sL1/target_lvs.spice new file mode 100644 index 00000000..7f733cab --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1.5_sL1/target_lvs.spice @@ -0,0 +1,20 @@ +.subckt C05_ihp130_sW1.5_sL1 VDD VSS VIN1 VOUT1 VB1 +XM1_f0 VOUT1 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f1 VOUT1 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f2 VOUT1 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f3 VOUT1 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f4 VOUT1 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f5 VOUT1 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f0 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f1 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f2 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f3 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f4 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f5 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f6 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f7 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f8 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f9 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f10 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f11 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +.ends C05_ihp130_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1.5_sL1/testbench.spice new file mode 100644 index 00000000..997e36ad --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1.5_sL1/testbench.spice @@ -0,0 +1,30 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C05_ihp130_sW1.5_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +XB_VB1 VB1 VB1 VSS VSS sg13_lv_nmos w=3u l=0.26u +IB_VB1 VDDB VB1 2e-05 +VIN1 VIN1 0 dc 0.78 ac 1 +RL VOUT1 0 20000 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +print vout0 idd +dc VIN1 0 1.2 0.003 +let gain_dc = deriv(v(VOUT1)) +meas dc gain_at_nom find gain_dc at=0.78 +meas dc vout_at_nom find v(VOUT1) at=0.78 +let okg = gain_dc - 0.5 +meas dc vin_lo find v(VIN1) when okg=0 cross=1 +meas dc vin_hi find v(VIN1) when okg=0 cross=last +ac dec 20 1k 10G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=1k +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1.5_sL2/case.json new file mode 100644 index 00000000..cac6467b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1.5_sL2/case.json @@ -0,0 +1,103 @@ +{ + "case_id": "C05_ihp130_sW1.5_sL2", + "circuit_id": "C05", + "pdk": "ihp130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "dut_name": "C05_ihp130_sW1.5_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 3.0, + "l": 0.52, + "nf": 6 + }, + "M2": { + "w": 6.0, + "l": 0.52, + "nf": 12 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M1", + "current": 2e-05 + } + }, + "load": { + "vin_nom": 0.78, + "RL": 20000.0, + "CL": 1e-12 + }, + "category": "follower", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.52, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.52, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "006eee7ac8dae220", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "ideal input source" + }, + { + "kind": "testbench_element", + "what": "load resistor and capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1.5_sL2/manifest.json new file mode 100644 index 00000000..1f7a5a70 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "43e7ee7b17f89047ad7c85ee7e8d3d7fe4d1c2f32d673a84665de6ea561baebe", + "qualification.json": "2d53ade55d557a31a5a6ed7a906f6b46c2a606819d312612e0c7b53fe7caf901", + "specs.json": "c5c133e61e4142fc9fe6bd726b3a7ff7d13cb982edd9cc3caac865e4b3e9a4f6", + "target.spice": "c95b350fed78756428f392f22419ac03bb95586cd5463df40aee807f93b93965", + "target_lvs.spice": "7f4df300dc59f9aba9d64c356629b20ae4b5384b6b3619374237c6a22c4291af", + "testbench.spice": "4cb5f9aaf46f1f0524e9c8e0238851ff627b693526237934eb98ff5d2890ef1f" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1.5_sL2/qualification.json new file mode 100644 index 00000000..839c4cdd --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1.5_sL2/qualification.json @@ -0,0 +1,85 @@ +{ + "case_id": "C05_ihp130_sW1.5_sL2", + "circuit_id": "C05", + "pdk": "ihp130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "follower", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.52, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.52, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "006eee7ac8dae220", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_at_nom": { + "min": 0.7253 + }, + "f3db": { + "min": 48330000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.7752678, + "f3db": 80548170.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.4, + "schematic_measures": { + "vout0": 0.3405532, + "idd": 3.35421e-05, + "gain_at_nom": 0.7752678, + "vout_at_nom": 0.3405528, + "vin_lo": 0.3744812, + "vin_hi": 0.3744812, + "gain_lf": -2.210972, + "f3db": 80548170.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1.5_sL2/specs.json new file mode 100644 index 00000000..ecbde2a8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1.5_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_at_nom": { + "min": 0.7253 + }, + "f3db": { + "min": 48330000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.7752678, + "f3db": 80548170.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1.5_sL2/target.spice new file mode 100644 index 00000000..6d61078f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1.5_sL2/target.spice @@ -0,0 +1,4 @@ +.subckt C05_ihp130_sW1.5_sL2 VDD VSS VIN1 VOUT1 VB1 +XM1 VOUT1 VB1 VSS VSS sg13_lv_nmos w=3u l=0.52u ng=6 m=1 +XM2 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=6u l=0.52u ng=12 m=1 +.ends C05_ihp130_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1.5_sL2/target_lvs.spice new file mode 100644 index 00000000..b0333674 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1.5_sL2/target_lvs.spice @@ -0,0 +1,20 @@ +.subckt C05_ihp130_sW1.5_sL2 VDD VSS VIN1 VOUT1 VB1 +XM1_f0 VOUT1 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f1 VOUT1 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f2 VOUT1 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f3 VOUT1 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f4 VOUT1 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f5 VOUT1 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f0 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f1 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f2 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f3 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f4 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f5 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f6 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f7 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f8 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f9 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f10 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f11 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +.ends C05_ihp130_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1.5_sL2/testbench.spice new file mode 100644 index 00000000..2da9dbde --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1.5_sL2/testbench.spice @@ -0,0 +1,30 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C05_ihp130_sW1.5_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +XB_VB1 VB1 VB1 VSS VSS sg13_lv_nmos w=3u l=0.52u +IB_VB1 VDDB VB1 2e-05 +VIN1 VIN1 0 dc 0.78 ac 1 +RL VOUT1 0 20000 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +print vout0 idd +dc VIN1 0 1.2 0.003 +let gain_dc = deriv(v(VOUT1)) +meas dc gain_at_nom find gain_dc at=0.78 +meas dc vout_at_nom find v(VOUT1) at=0.78 +let okg = gain_dc - 0.5 +meas dc vin_lo find v(VIN1) when okg=0 cross=1 +meas dc vin_hi find v(VIN1) when okg=0 cross=last +ac dec 20 1k 10G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=1k +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1_sL1.5/case.json new file mode 100644 index 00000000..617351fb --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1_sL1.5/case.json @@ -0,0 +1,103 @@ +{ + "case_id": "C05_ihp130_sW1_sL1.5", + "circuit_id": "C05", + "pdk": "ihp130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "dut_name": "C05_ihp130_sW1_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.39, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.39, + "nf": 8 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M1", + "current": 2e-05 + } + }, + "load": { + "vin_nom": 0.78, + "RL": 20000.0, + "CL": 1e-12 + }, + "category": "follower", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "82bd959f65e7bb80", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "ideal input source" + }, + { + "kind": "testbench_element", + "what": "load resistor and capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1_sL1.5/manifest.json new file mode 100644 index 00000000..e37b311a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "d759c40b7a0a9657a0f39dbf7f1de44540e6453585cd3567f57f6213482010b3", + "qualification.json": "b7ee39e4303322822026da1c96e601bf380c94f7e228e5f58d5626ec2fa58f23", + "specs.json": "31c4e3bccb41c40a1e43345cd4358cd5b7f875ece747f04de7d64c4b3d41c834", + "target.spice": "2b81ae2c922e10c3a265446a72d84f68fb31eff62e6d1f80b19a2822da561d15", + "target_lvs.spice": "2b20727244dde369d5ef64c66b2ebd6c1c3a40212554b8124c9cd1f3124704bc", + "testbench.spice": "cb7edddfe2ee16ca598758122994e169cfcf364732459128e0be622bf8248062" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1_sL1.5/qualification.json new file mode 100644 index 00000000..879da7db --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1_sL1.5/qualification.json @@ -0,0 +1,85 @@ +{ + "case_id": "C05_ihp130_sW1_sL1.5", + "circuit_id": "C05", + "pdk": "ihp130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "follower", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "82bd959f65e7bb80", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_at_nom": { + "min": 0.7132 + }, + "f3db": { + "min": 45290000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.7632474, + "f3db": 75490140.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.2, + "schematic_measures": { + "vout0": 0.3140574, + "idd": 3.246175e-05, + "gain_at_nom": 0.7632474, + "vout_at_nom": 0.3140569, + "vin_lo": 0.4092456, + "vin_hi": 0.4092456, + "gain_lf": -2.346705, + "f3db": 75490140.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1_sL1.5/specs.json new file mode 100644 index 00000000..f1d51ce4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_at_nom": { + "min": 0.7132 + }, + "f3db": { + "min": 45290000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.7632474, + "f3db": 75490140.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1_sL1.5/target.spice new file mode 100644 index 00000000..2308a68d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1_sL1.5/target.spice @@ -0,0 +1,4 @@ +.subckt C05_ihp130_sW1_sL1.5 VDD VSS VIN1 VOUT1 VB1 +XM1 VOUT1 VB1 VSS VSS sg13_lv_nmos w=2u l=0.39u ng=4 m=1 +XM2 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=4u l=0.39u ng=8 m=1 +.ends C05_ihp130_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1_sL1.5/target_lvs.spice new file mode 100644 index 00000000..98835cc8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1_sL1.5/target_lvs.spice @@ -0,0 +1,14 @@ +.subckt C05_ihp130_sW1_sL1.5 VDD VSS VIN1 VOUT1 VB1 +XM1_f0 VOUT1 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f1 VOUT1 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f2 VOUT1 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f3 VOUT1 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f0 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f1 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f2 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f3 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f4 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f5 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f6 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f7 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +.ends C05_ihp130_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1_sL1.5/testbench.spice new file mode 100644 index 00000000..1803a172 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1_sL1.5/testbench.spice @@ -0,0 +1,30 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C05_ihp130_sW1_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +XB_VB1 VB1 VB1 VSS VSS sg13_lv_nmos w=2u l=0.39u +IB_VB1 VDDB VB1 2e-05 +VIN1 VIN1 0 dc 0.78 ac 1 +RL VOUT1 0 20000 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +print vout0 idd +dc VIN1 0 1.2 0.003 +let gain_dc = deriv(v(VOUT1)) +meas dc gain_at_nom find gain_dc at=0.78 +meas dc vout_at_nom find v(VOUT1) at=0.78 +let okg = gain_dc - 0.5 +meas dc vin_lo find v(VIN1) when okg=0 cross=1 +meas dc vin_hi find v(VIN1) when okg=0 cross=last +ac dec 20 1k 10G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=1k +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1_sL1/case.json new file mode 100644 index 00000000..bfa5497a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1_sL1/case.json @@ -0,0 +1,103 @@ +{ + "case_id": "C05_ihp130_sW1_sL1", + "circuit_id": "C05", + "pdk": "ihp130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "dut_name": "C05_ihp130_sW1_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.26, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.26, + "nf": 8 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M1", + "current": 2e-05 + } + }, + "load": { + "vin_nom": 0.78, + "RL": 20000.0, + "CL": 1e-12 + }, + "category": "follower", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.26, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "2aebf270f7880bf1", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "ideal input source" + }, + { + "kind": "testbench_element", + "what": "load resistor and capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1_sL1/manifest.json new file mode 100644 index 00000000..f916fce6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "e4fe17b9fa7f32181d773523ade6d9046470c85671f50ab5ef31faca62b15221", + "qualification.json": "5a3509517d19a6d052be0b9e011f5ab354b05ac7cb21d268a43e60a67e51921c", + "specs.json": "3820206f827dec1ee3a167ad2a31ddd67da79f4b55b7177692d54b0a44144173", + "target.spice": "8701ccfa39c94f2c4f320d02d074e5bf9ce049535a2ec5a9220c3639ce6ffa30", + "target_lvs.spice": "4ecc09416aaaa35d698871241007312141718c962a12c0a3cda42393a6b075d2", + "testbench.spice": "fd760855f64b9c9174bb7fd9d5f324755fca218ec84c383e2a149e2f1f292bf8" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1_sL1/qualification.json new file mode 100644 index 00000000..c6c18bd8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1_sL1/qualification.json @@ -0,0 +1,85 @@ +{ + "case_id": "C05_ihp130_sW1_sL1", + "circuit_id": "C05", + "pdk": "ihp130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "follower", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.26, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "2aebf270f7880bf1", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_at_nom": { + "min": 0.7131 + }, + "f3db": { + "min": 47940000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.7631106, + "f3db": 79894260.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.3, + "schematic_measures": { + "vout0": 0.3069455, + "idd": 3.08296e-05, + "gain_at_nom": 0.7631106, + "vout_at_nom": 0.306945, + "vin_lo": 0.4096913, + "vin_hi": 0.4096913, + "gain_lf": -2.348263, + "f3db": 79894260.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1_sL1/specs.json new file mode 100644 index 00000000..a7b2f072 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_at_nom": { + "min": 0.7131 + }, + "f3db": { + "min": 47940000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.7631106, + "f3db": 79894260.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1_sL1/target.spice new file mode 100644 index 00000000..f231d6b0 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1_sL1/target.spice @@ -0,0 +1,4 @@ +.subckt C05_ihp130_sW1_sL1 VDD VSS VIN1 VOUT1 VB1 +XM1 VOUT1 VB1 VSS VSS sg13_lv_nmos w=2u l=0.26u ng=4 m=1 +XM2 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=4u l=0.26u ng=8 m=1 +.ends C05_ihp130_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1_sL1/target_lvs.spice new file mode 100644 index 00000000..6b04b2b4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1_sL1/target_lvs.spice @@ -0,0 +1,14 @@ +.subckt C05_ihp130_sW1_sL1 VDD VSS VIN1 VOUT1 VB1 +XM1_f0 VOUT1 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f1 VOUT1 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f2 VOUT1 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f3 VOUT1 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f0 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f1 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f2 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f3 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f4 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f5 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f6 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f7 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +.ends C05_ihp130_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1_sL1/testbench.spice new file mode 100644 index 00000000..9c78a258 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1_sL1/testbench.spice @@ -0,0 +1,30 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C05_ihp130_sW1_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +XB_VB1 VB1 VB1 VSS VSS sg13_lv_nmos w=2u l=0.26u +IB_VB1 VDDB VB1 2e-05 +VIN1 VIN1 0 dc 0.78 ac 1 +RL VOUT1 0 20000 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +print vout0 idd +dc VIN1 0 1.2 0.003 +let gain_dc = deriv(v(VOUT1)) +meas dc gain_at_nom find gain_dc at=0.78 +meas dc vout_at_nom find v(VOUT1) at=0.78 +let okg = gain_dc - 0.5 +meas dc vin_lo find v(VIN1) when okg=0 cross=1 +meas dc vin_hi find v(VIN1) when okg=0 cross=last +ac dec 20 1k 10G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=1k +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1_sL2/case.json new file mode 100644 index 00000000..dcdab293 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1_sL2/case.json @@ -0,0 +1,103 @@ +{ + "case_id": "C05_ihp130_sW1_sL2", + "circuit_id": "C05", + "pdk": "ihp130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "dut_name": "C05_ihp130_sW1_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.52, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.52, + "nf": 8 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M1", + "current": 2e-05 + } + }, + "load": { + "vin_nom": 0.78, + "RL": 20000.0, + "CL": 1e-12 + }, + "category": "follower", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "b7284ee6da15bd44", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "ideal input source" + }, + { + "kind": "testbench_element", + "what": "load resistor and capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1_sL2/manifest.json new file mode 100644 index 00000000..38622046 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "ebb21afdfdf6f648d65283afb6afe9c12582e0a54ccc5f4e17f32a4f6f4e2bc6", + "qualification.json": "b72ea3f3d412c3e25cc60f78c37bfc13db4b9b0ea489ea8b8c1a7dc2a03bc92d", + "specs.json": "c5fd39865b880dbc5736abaad547e8fa6a168b6dc7280e6b4ae70b1644998792", + "target.spice": "18bf76ecb7249f865eeca5b4c4295cfc32157217ee8db4179a3503ea2d4f70d7", + "target_lvs.spice": "325662be14049742effaea2556fddaa8804e3941e4421cb491031cb046e29a20", + "testbench.spice": "5f5aaa5b4e95d66b5b533dce8b62038a3f91cfa227e924891a937697a4632e83" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1_sL2/qualification.json new file mode 100644 index 00000000..8f8e5a7c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1_sL2/qualification.json @@ -0,0 +1,85 @@ +{ + "case_id": "C05_ihp130_sW1_sL2", + "circuit_id": "C05", + "pdk": "ihp130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "follower", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "b7284ee6da15bd44", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_at_nom": { + "min": 0.7091 + }, + "f3db": { + "min": 42110000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.7591457, + "f3db": 70185470.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.2, + "schematic_measures": { + "vout0": 0.3104767, + "idd": 3.280455e-05, + "gain_at_nom": 0.7591457, + "vout_at_nom": 0.3104762, + "vin_lo": 0.4197914, + "vin_hi": 0.4197914, + "gain_lf": -2.393509, + "f3db": 70185470.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1_sL2/specs.json new file mode 100644 index 00000000..ee4b0197 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_at_nom": { + "min": 0.7091 + }, + "f3db": { + "min": 42110000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.7591457, + "f3db": 70185470.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1_sL2/target.spice new file mode 100644 index 00000000..32b52934 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1_sL2/target.spice @@ -0,0 +1,4 @@ +.subckt C05_ihp130_sW1_sL2 VDD VSS VIN1 VOUT1 VB1 +XM1 VOUT1 VB1 VSS VSS sg13_lv_nmos w=2u l=0.52u ng=4 m=1 +XM2 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=4u l=0.52u ng=8 m=1 +.ends C05_ihp130_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1_sL2/target_lvs.spice new file mode 100644 index 00000000..48575b99 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1_sL2/target_lvs.spice @@ -0,0 +1,14 @@ +.subckt C05_ihp130_sW1_sL2 VDD VSS VIN1 VOUT1 VB1 +XM1_f0 VOUT1 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f1 VOUT1 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f2 VOUT1 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f3 VOUT1 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f0 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f1 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f2 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f3 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f4 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f5 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f6 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f7 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +.ends C05_ihp130_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1_sL2/testbench.spice new file mode 100644 index 00000000..460871d2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW1_sL2/testbench.spice @@ -0,0 +1,30 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C05_ihp130_sW1_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +XB_VB1 VB1 VB1 VSS VSS sg13_lv_nmos w=2u l=0.52u +IB_VB1 VDDB VB1 2e-05 +VIN1 VIN1 0 dc 0.78 ac 1 +RL VOUT1 0 20000 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +print vout0 idd +dc VIN1 0 1.2 0.003 +let gain_dc = deriv(v(VOUT1)) +meas dc gain_at_nom find gain_dc at=0.78 +meas dc vout_at_nom find v(VOUT1) at=0.78 +let okg = gain_dc - 0.5 +meas dc vin_lo find v(VIN1) when okg=0 cross=1 +meas dc vin_hi find v(VIN1) when okg=0 cross=last +ac dec 20 1k 10G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=1k +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW2_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW2_sL1.5/case.json new file mode 100644 index 00000000..4d65b1ef --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW2_sL1.5/case.json @@ -0,0 +1,103 @@ +{ + "case_id": "C05_ihp130_sW2_sL1.5", + "circuit_id": "C05", + "pdk": "ihp130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "dut_name": "C05_ihp130_sW2_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.39, + "nf": 8 + }, + "M2": { + "w": 8.0, + "l": 0.39, + "nf": 16 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M1", + "current": 2e-05 + } + }, + "load": { + "vin_nom": 0.78, + "RL": 20000.0, + "CL": 1e-12 + }, + "category": "follower", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "730a68d562366227", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "ideal input source" + }, + { + "kind": "testbench_element", + "what": "load resistor and capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW2_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW2_sL1.5/manifest.json new file mode 100644 index 00000000..10eae50b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW2_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "b2dcdd949fa17e95089102290ef9b57ed906158f24a91d7e9936b9fd5b690dee", + "qualification.json": "ca54bb68a380d82b43b18d32c12121d70fda606501c174892bb8b0de7608b3d3", + "specs.json": "d5491c3bf8dc8af084be6eb6b51ed8ced5b027d4a201cbd266c9f60b9b513132", + "target.spice": "f3ab817ea20917a230f8da77ebea40950b30befb0e8607d84b30c6d1cece1189", + "target_lvs.spice": "f09eb99f8e1dd455f7de24e6b29244b13190bf147abd77d1e0fb0719c1f310ec", + "testbench.spice": "1eed1139a6aebe3ce7b0aea8432eef36684bb8e052e1c59af36ae1b16d93a80f" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW2_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW2_sL1.5/qualification.json new file mode 100644 index 00000000..b5b0719f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW2_sL1.5/qualification.json @@ -0,0 +1,85 @@ +{ + "case_id": "C05_ihp130_sW2_sL1.5", + "circuit_id": "C05", + "pdk": "ihp130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "follower", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "730a68d562366227", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_at_nom": { + "min": 0.7362 + }, + "f3db": { + "min": 56070000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.7861768, + "f3db": 93451050.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.5, + "schematic_measures": { + "vout0": 0.3605514, + "idd": 3.296641e-05, + "gain_at_nom": 0.7861768, + "vout_at_nom": 0.3605511, + "vin_lo": 0.3427679, + "vin_hi": 0.3427679, + "gain_lf": -2.089602, + "f3db": 93451050.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW2_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW2_sL1.5/specs.json new file mode 100644 index 00000000..e642fb64 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW2_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_at_nom": { + "min": 0.7362 + }, + "f3db": { + "min": 56070000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.7861768, + "f3db": 93451050.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW2_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW2_sL1.5/target.spice new file mode 100644 index 00000000..5995564e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW2_sL1.5/target.spice @@ -0,0 +1,4 @@ +.subckt C05_ihp130_sW2_sL1.5 VDD VSS VIN1 VOUT1 VB1 +XM1 VOUT1 VB1 VSS VSS sg13_lv_nmos w=4u l=0.39u ng=8 m=1 +XM2 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=8u l=0.39u ng=16 m=1 +.ends C05_ihp130_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW2_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW2_sL1.5/target_lvs.spice new file mode 100644 index 00000000..5337d7a8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW2_sL1.5/target_lvs.spice @@ -0,0 +1,26 @@ +.subckt C05_ihp130_sW2_sL1.5 VDD VSS VIN1 VOUT1 VB1 +XM1_f0 VOUT1 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f1 VOUT1 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f2 VOUT1 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f3 VOUT1 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f4 VOUT1 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f5 VOUT1 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f6 VOUT1 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f7 VOUT1 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f0 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f1 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f2 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f3 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f4 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f5 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f6 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f7 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f8 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f9 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f10 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f11 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f12 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f13 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f14 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f15 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +.ends C05_ihp130_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW2_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW2_sL1.5/testbench.spice new file mode 100644 index 00000000..a5bea7a8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW2_sL1.5/testbench.spice @@ -0,0 +1,30 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C05_ihp130_sW2_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +XB_VB1 VB1 VB1 VSS VSS sg13_lv_nmos w=4u l=0.39u +IB_VB1 VDDB VB1 2e-05 +VIN1 VIN1 0 dc 0.78 ac 1 +RL VOUT1 0 20000 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +print vout0 idd +dc VIN1 0 1.2 0.003 +let gain_dc = deriv(v(VOUT1)) +meas dc gain_at_nom find gain_dc at=0.78 +meas dc vout_at_nom find v(VOUT1) at=0.78 +let okg = gain_dc - 0.5 +meas dc vin_lo find v(VIN1) when okg=0 cross=1 +meas dc vin_hi find v(VIN1) when okg=0 cross=last +ac dec 20 1k 10G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=1k +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW2_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW2_sL1/case.json new file mode 100644 index 00000000..819a3828 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW2_sL1/case.json @@ -0,0 +1,103 @@ +{ + "case_id": "C05_ihp130_sW2_sL1", + "circuit_id": "C05", + "pdk": "ihp130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "dut_name": "C05_ihp130_sW2_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.26, + "nf": 8 + }, + "M2": { + "w": 8.0, + "l": 0.26, + "nf": 16 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M1", + "current": 2e-05 + } + }, + "load": { + "vin_nom": 0.78, + "RL": 20000.0, + "CL": 1e-12 + }, + "category": "follower", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.26, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "8ef63d5b6f4fc7df", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "ideal input source" + }, + { + "kind": "testbench_element", + "what": "load resistor and capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW2_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW2_sL1/manifest.json new file mode 100644 index 00000000..c6e6c2b8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW2_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "85c74ce99211cf648641d835acd841d0a2b20e662c5a2a48447ec14877f3265e", + "qualification.json": "1df0603c2d37678dc31022cc704a7d153d03026d54cb6141f1d7d479c7351217", + "specs.json": "bb7c7f00c876967251f81b898775d116712d14a45fbdf2159807819eb7bb3b3b", + "target.spice": "35bca2717dc6235ba57bdacc64e98ad02f8bd6b2a80146b6f6ee4f3baf0a6656", + "target_lvs.spice": "7ad0de7a16cce2b4597c1bab22d2a185b6c76c95eb986a3a6cb6f433a42245b6", + "testbench.spice": "ee8099e98f0bd3dc67329e3ca12eb75d88900ed75db73a544135c2566d3d3975" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW2_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW2_sL1/qualification.json new file mode 100644 index 00000000..0095a3e0 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW2_sL1/qualification.json @@ -0,0 +1,85 @@ +{ + "case_id": "C05_ihp130_sW2_sL1", + "circuit_id": "C05", + "pdk": "ihp130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "follower", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.26, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "8ef63d5b6f4fc7df", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_at_nom": { + "min": 0.7345 + }, + "f3db": { + "min": 58370000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.7845447, + "f3db": 97280540.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.5, + "schematic_measures": { + "vout0": 0.3496368, + "idd": 3.090327e-05, + "gain_at_nom": 0.7845447, + "vout_at_nom": 0.3496365, + "vin_lo": 0.3515873, + "vin_hi": 0.3515873, + "gain_lf": -2.107654, + "f3db": 97280540.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW2_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW2_sL1/specs.json new file mode 100644 index 00000000..31cd7f15 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW2_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_at_nom": { + "min": 0.7345 + }, + "f3db": { + "min": 58370000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.7845447, + "f3db": 97280540.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW2_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW2_sL1/target.spice new file mode 100644 index 00000000..2dcd8960 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW2_sL1/target.spice @@ -0,0 +1,4 @@ +.subckt C05_ihp130_sW2_sL1 VDD VSS VIN1 VOUT1 VB1 +XM1 VOUT1 VB1 VSS VSS sg13_lv_nmos w=4u l=0.26u ng=8 m=1 +XM2 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=8u l=0.26u ng=16 m=1 +.ends C05_ihp130_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW2_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW2_sL1/target_lvs.spice new file mode 100644 index 00000000..900818d7 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW2_sL1/target_lvs.spice @@ -0,0 +1,26 @@ +.subckt C05_ihp130_sW2_sL1 VDD VSS VIN1 VOUT1 VB1 +XM1_f0 VOUT1 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f1 VOUT1 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f2 VOUT1 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f3 VOUT1 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f4 VOUT1 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f5 VOUT1 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f6 VOUT1 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f7 VOUT1 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f0 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f1 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f2 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f3 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f4 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f5 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f6 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f7 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f8 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f9 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f10 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f11 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f12 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f13 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f14 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f15 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +.ends C05_ihp130_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW2_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW2_sL1/testbench.spice new file mode 100644 index 00000000..5d225490 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW2_sL1/testbench.spice @@ -0,0 +1,30 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C05_ihp130_sW2_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +XB_VB1 VB1 VB1 VSS VSS sg13_lv_nmos w=4u l=0.26u +IB_VB1 VDDB VB1 2e-05 +VIN1 VIN1 0 dc 0.78 ac 1 +RL VOUT1 0 20000 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +print vout0 idd +dc VIN1 0 1.2 0.003 +let gain_dc = deriv(v(VOUT1)) +meas dc gain_at_nom find gain_dc at=0.78 +meas dc vout_at_nom find v(VOUT1) at=0.78 +let okg = gain_dc - 0.5 +meas dc vin_lo find v(VIN1) when okg=0 cross=1 +meas dc vin_hi find v(VIN1) when okg=0 cross=last +ac dec 20 1k 10G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=1k +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW2_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW2_sL2/case.json new file mode 100644 index 00000000..91934a92 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW2_sL2/case.json @@ -0,0 +1,103 @@ +{ + "case_id": "C05_ihp130_sW2_sL2", + "circuit_id": "C05", + "pdk": "ihp130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "dut_name": "C05_ihp130_sW2_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.52, + "nf": 8 + }, + "M2": { + "w": 8.0, + "l": 0.52, + "nf": 16 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M1", + "current": 2e-05 + } + }, + "load": { + "vin_nom": 0.78, + "RL": 20000.0, + "CL": 1e-12 + }, + "category": "follower", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "288b182ad6ac88a2", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "ideal input source" + }, + { + "kind": "testbench_element", + "what": "load resistor and capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW2_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW2_sL2/manifest.json new file mode 100644 index 00000000..000249ef --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW2_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "51a5fca72eef8c5289d74f4ff8fab6ceb66b5b8c5c6f4397ebe60667e9b7b9c4", + "qualification.json": "0053bd68a36c76cd2c3b9eac51ae8fbb7e438835930fa82ad94e00b002fc9797", + "specs.json": "0a6abcbda28bfc634b854757c55c100df63db1e6c20c54b052357b5425f54596", + "target.spice": "2e6aefaf0912fc2ba685f5bb80a4b838274277f40f4517af688ab3b49085f72e", + "target_lvs.spice": "b96afee50acc2fd5fe7a9ad9be1dc6a73bcdff047a4f09ef4b4ecdf605a80564", + "testbench.spice": "6a8cf327df91931c444bc64f8df7a10fe635a3d479b869ce08fa388c29021095" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW2_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW2_sL2/qualification.json new file mode 100644 index 00000000..9a641ed7 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW2_sL2/qualification.json @@ -0,0 +1,85 @@ +{ + "case_id": "C05_ihp130_sW2_sL2", + "circuit_id": "C05", + "pdk": "ihp130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "follower", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "288b182ad6ac88a2", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_at_nom": { + "min": 0.7346 + }, + "f3db": { + "min": 52740000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.7845507, + "f3db": 87893260.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.4, + "schematic_measures": { + "vout0": 0.3603281, + "idd": 3.365257e-05, + "gain_at_nom": 0.7845507, + "vout_at_nom": 0.3603277, + "vin_lo": 0.346292, + "vin_hi": 0.346292, + "gain_lf": -2.107586, + "f3db": 87893260.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW2_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW2_sL2/specs.json new file mode 100644 index 00000000..1f79d748 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW2_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_at_nom": { + "min": 0.7346 + }, + "f3db": { + "min": 52740000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.7845507, + "f3db": 87893260.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW2_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW2_sL2/target.spice new file mode 100644 index 00000000..00709aeb --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW2_sL2/target.spice @@ -0,0 +1,4 @@ +.subckt C05_ihp130_sW2_sL2 VDD VSS VIN1 VOUT1 VB1 +XM1 VOUT1 VB1 VSS VSS sg13_lv_nmos w=4u l=0.52u ng=8 m=1 +XM2 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=8u l=0.52u ng=16 m=1 +.ends C05_ihp130_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW2_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW2_sL2/target_lvs.spice new file mode 100644 index 00000000..65108a32 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW2_sL2/target_lvs.spice @@ -0,0 +1,26 @@ +.subckt C05_ihp130_sW2_sL2 VDD VSS VIN1 VOUT1 VB1 +XM1_f0 VOUT1 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f1 VOUT1 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f2 VOUT1 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f3 VOUT1 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f4 VOUT1 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f5 VOUT1 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f6 VOUT1 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f7 VOUT1 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f0 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f1 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f2 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f3 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f4 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f5 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f6 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f7 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f8 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f9 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f10 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f11 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f12 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f13 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f14 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f15 VDD VIN1 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +.ends C05_ihp130_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW2_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW2_sL2/testbench.spice new file mode 100644 index 00000000..d89e1431 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/ihp130/sW2_sL2/testbench.spice @@ -0,0 +1,30 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C05_ihp130_sW2_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +XB_VB1 VB1 VB1 VSS VSS sg13_lv_nmos w=4u l=0.52u +IB_VB1 VDDB VB1 2e-05 +VIN1 VIN1 0 dc 0.78 ac 1 +RL VOUT1 0 20000 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +print vout0 idd +dc VIN1 0 1.2 0.003 +let gain_dc = deriv(v(VOUT1)) +meas dc gain_at_nom find gain_dc at=0.78 +meas dc vout_at_nom find v(VOUT1) at=0.78 +let okg = gain_dc - 0.5 +meas dc vin_lo find v(VIN1) when okg=0 cross=1 +meas dc vin_hi find v(VIN1) when okg=0 cross=last +ac dec 20 1k 10G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=1k +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C05/sky130/sW0.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW0.5_sL1.5/case.json new file mode 100644 index 00000000..b84a9b4c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW0.5_sL1.5/case.json @@ -0,0 +1,103 @@ +{ + "case_id": "C05_sky130_sW0.5_sL1.5", + "circuit_id": "C05", + "pdk": "sky130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "dut_name": "C05_sky130_sW0.5_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 1.0, + "l": 0.45, + "nf": 2 + }, + "M2": { + "w": 2.0, + "l": 0.45, + "nf": 4 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M1", + "current": 2e-05 + } + }, + "load": { + "vin_nom": 1.1700000000000002, + "RL": 20000.0, + "CL": 1e-12 + }, + "category": "follower", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.45, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "635cda71f9594d72", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "ideal input source" + }, + { + "kind": "testbench_element", + "what": "load resistor and capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/sky130/sW0.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW0.5_sL1.5/manifest.json new file mode 100644 index 00000000..07c0566c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW0.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "e5d5a09646707b114d86b8a00ff4eec33af91d3856346eb5ef070957e6718446", + "qualification.json": "72e7d97f5654451b3192ebc781852fe17c08f76790d6a170f7c44fd09133c557", + "specs.json": "b615bb8cc3bf2a1c04f7a12a3e2c65add0631cb0f40ca836ba70d365c524c399", + "target.spice": "b033eacf742cad66b3272915de418209302bab0fa6d11161d71eb374e4eef6ce", + "target_lvs.spice": "4bba21ec0376a4909d1f623ebfd5e1aa501bf2365d83d943de4882a746ed6ea6", + "testbench.spice": "3f5933c0d882cc667a4819acbd70c07cf8f4d81e10a0c5673454204de8771dcd" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/sky130/sW0.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW0.5_sL1.5/qualification.json new file mode 100644 index 00000000..8dd243cf --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW0.5_sL1.5/qualification.json @@ -0,0 +1,85 @@ +{ + "case_id": "C05_sky130_sW0.5_sL1.5", + "circuit_id": "C05", + "pdk": "sky130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "follower", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.45, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "635cda71f9594d72", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_at_nom": { + "min": 0.6286 + }, + "f3db": { + "min": 33020000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.6786287, + "f3db": 55028800.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 8.6, + "schematic_measures": { + "vout0": 0.2590432, + "idd": 3.09043e-05, + "gain_at_nom": 0.6786287, + "vout_at_nom": 0.2590432, + "vin_lo": 0.9045592, + "vin_hi": 0.9045592, + "gain_lf": -3.367227, + "f3db": 55028800.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/sky130/sW0.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW0.5_sL1.5/specs.json new file mode 100644 index 00000000..4917442d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW0.5_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_at_nom": { + "min": 0.6286 + }, + "f3db": { + "min": 33020000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.6786287, + "f3db": 55028800.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/sky130/sW0.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW0.5_sL1.5/target.spice new file mode 100644 index 00000000..fdbb92c1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW0.5_sL1.5/target.spice @@ -0,0 +1,4 @@ +.subckt C05_sky130_sW0.5_sL1.5 VDD VSS VIN1 VOUT1 VB1 +XM1 VOUT1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=1 l=0.45 nf=2 +XM2 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=2 l=0.45 nf=4 +.ends C05_sky130_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C05/sky130/sW0.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW0.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..4681ef02 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW0.5_sL1.5/target_lvs.spice @@ -0,0 +1,8 @@ +.subckt C05_sky130_sW0.5_sL1.5 VDD VSS VIN1 VOUT1 VB1 +XM1_f0 VOUT1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f1 VOUT1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f0 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f1 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f2 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f3 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +.ends C05_sky130_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C05/sky130/sW0.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW0.5_sL1.5/testbench.spice new file mode 100644 index 00000000..99df5c97 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW0.5_sL1.5/testbench.spice @@ -0,0 +1,30 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C05_sky130_sW0.5_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +XB_VB1 VB1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=1 l=0.45 +IB_VB1 VDDB VB1 2e-05 +VIN1 VIN1 0 dc 1.17 ac 1 +RL VOUT1 0 20000 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +print vout0 idd +dc VIN1 0 1.8 0.0045 +let gain_dc = deriv(v(VOUT1)) +meas dc gain_at_nom find gain_dc at=1.17 +meas dc vout_at_nom find v(VOUT1) at=1.17 +let okg = gain_dc - 0.5 +meas dc vin_lo find v(VIN1) when okg=0 cross=1 +meas dc vin_hi find v(VIN1) when okg=0 cross=last +ac dec 20 1k 10G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=1k +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C05/sky130/sW0.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW0.5_sL1/case.json new file mode 100644 index 00000000..2e9b2735 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW0.5_sL1/case.json @@ -0,0 +1,103 @@ +{ + "case_id": "C05_sky130_sW0.5_sL1", + "circuit_id": "C05", + "pdk": "sky130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "dut_name": "C05_sky130_sW0.5_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 1.0, + "l": 0.3, + "nf": 2 + }, + "M2": { + "w": 2.0, + "l": 0.3, + "nf": 4 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M1", + "current": 2e-05 + } + }, + "load": { + "vin_nom": 1.1700000000000002, + "RL": 20000.0, + "CL": 1e-12 + }, + "category": "follower", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.3, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "9e3ff600c55a2835", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "ideal input source" + }, + { + "kind": "testbench_element", + "what": "load resistor and capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/sky130/sW0.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW0.5_sL1/manifest.json new file mode 100644 index 00000000..3f4e5f0e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW0.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "a163cd3d39959c737030a5058b25f1f739e38799093ceea64ada7cacfc06175d", + "qualification.json": "8f9b0e6dc6f85a237e1572ef1f4b20a0f988737e285e6abcdda1edaf6773ef59", + "specs.json": "1d7d056aaf013e37a2ebfdaf967572383a769aa6ca516effc6ebf7ae26f15d97", + "target.spice": "4b4ba159776a8457bbb43d811a12b445ffd4262960d40af0810a34ba0ee4752a", + "target_lvs.spice": "2924e4e8fb98d700ad8c14b0b60b100dd991ee89df472863fb61e81dbf21e023", + "testbench.spice": "d386a88a2bf7010ddcbaaa09efccebe2be241998de3e337ba5123c5dca9a26b1" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/sky130/sW0.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW0.5_sL1/qualification.json new file mode 100644 index 00000000..95ad6c2f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW0.5_sL1/qualification.json @@ -0,0 +1,85 @@ +{ + "case_id": "C05_sky130_sW0.5_sL1", + "circuit_id": "C05", + "pdk": "sky130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "follower", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.3, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "9e3ff600c55a2835", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_at_nom": { + "min": 0.6587 + }, + "f3db": { + "min": 39900000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.7086538, + "f3db": 66496440.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 8.1, + "schematic_measures": { + "vout0": 0.2746515, + "idd": 3.261578e-05, + "gain_at_nom": 0.7086538, + "vout_at_nom": 0.2746515, + "vin_lo": 0.8699711, + "vin_hi": 0.8699711, + "gain_lf": -2.991257, + "f3db": 66496440.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/sky130/sW0.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW0.5_sL1/specs.json new file mode 100644 index 00000000..52b423b5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW0.5_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_at_nom": { + "min": 0.6587 + }, + "f3db": { + "min": 39900000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.7086538, + "f3db": 66496440.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/sky130/sW0.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW0.5_sL1/target.spice new file mode 100644 index 00000000..86da45a3 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW0.5_sL1/target.spice @@ -0,0 +1,4 @@ +.subckt C05_sky130_sW0.5_sL1 VDD VSS VIN1 VOUT1 VB1 +XM1 VOUT1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=1 l=0.3 nf=2 +XM2 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=2 l=0.3 nf=4 +.ends C05_sky130_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C05/sky130/sW0.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW0.5_sL1/target_lvs.spice new file mode 100644 index 00000000..9cf232bf --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW0.5_sL1/target_lvs.spice @@ -0,0 +1,8 @@ +.subckt C05_sky130_sW0.5_sL1 VDD VSS VIN1 VOUT1 VB1 +XM1_f0 VOUT1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f1 VOUT1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f0 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f1 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f2 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f3 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +.ends C05_sky130_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C05/sky130/sW0.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW0.5_sL1/testbench.spice new file mode 100644 index 00000000..38be26ab --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW0.5_sL1/testbench.spice @@ -0,0 +1,30 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C05_sky130_sW0.5_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +XB_VB1 VB1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=1 l=0.3 +IB_VB1 VDDB VB1 2e-05 +VIN1 VIN1 0 dc 1.17 ac 1 +RL VOUT1 0 20000 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +print vout0 idd +dc VIN1 0 1.8 0.0045 +let gain_dc = deriv(v(VOUT1)) +meas dc gain_at_nom find gain_dc at=1.17 +meas dc vout_at_nom find v(VOUT1) at=1.17 +let okg = gain_dc - 0.5 +meas dc vin_lo find v(VIN1) when okg=0 cross=1 +meas dc vin_hi find v(VIN1) when okg=0 cross=last +ac dec 20 1k 10G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=1k +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C05/sky130/sW0.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW0.5_sL2/case.json new file mode 100644 index 00000000..92a424a6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW0.5_sL2/case.json @@ -0,0 +1,103 @@ +{ + "case_id": "C05_sky130_sW0.5_sL2", + "circuit_id": "C05", + "pdk": "sky130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "dut_name": "C05_sky130_sW0.5_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 1.0, + "l": 0.6, + "nf": 2 + }, + "M2": { + "w": 2.0, + "l": 0.6, + "nf": 4 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M1", + "current": 2e-05 + } + }, + "load": { + "vin_nom": 1.1700000000000002, + "RL": 20000.0, + "CL": 1e-12 + }, + "category": "follower", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.6, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "69d1e61e4c1779ff", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "ideal input source" + }, + { + "kind": "testbench_element", + "what": "load resistor and capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/sky130/sW0.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW0.5_sL2/manifest.json new file mode 100644 index 00000000..50905b4a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW0.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "e573308dee34e08fe55b87a58f1f5575cb613ca0f8009558e578c038c39b632b", + "qualification.json": "79c39e096a0b882f4e920f790edc19aa2efd6e7e1bf1ff1f25f2dcebf4682cf1", + "specs.json": "a448cfa96836be77bf6876de90af397857cb07eb900b7e55ad48fbbbd7e053a3", + "target.spice": "c83ca53a9e5ab4b7a28da8becb76e1bd05a281775661aee8ad4317f232085b23", + "target_lvs.spice": "12fda14fe1401202c88980ad3af5883ae3b1ae65e7b6c1fdb942d6c53bb754d3", + "testbench.spice": "cfeea9a0f87575d7cbf20f017247762d3e86714cd5a335b12ede10dd7dac1495" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/sky130/sW0.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW0.5_sL2/qualification.json new file mode 100644 index 00000000..50711dd9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW0.5_sL2/qualification.json @@ -0,0 +1,85 @@ +{ + "case_id": "C05_sky130_sW0.5_sL2", + "circuit_id": "C05", + "pdk": "sky130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "follower", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.6, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "69d1e61e4c1779ff", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 29170000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.6365827, + "f3db": 48621940.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 10.5, + "schematic_measures": { + "vout0": 0.2407817, + "idd": 2.863318e-05, + "gain_at_nom": 0.6365827, + "vout_at_nom": 0.2407817, + "vin_lo": 0.951101, + "vin_hi": 0.951101, + "gain_lf": -3.922816, + "f3db": 48621940.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/sky130/sW0.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW0.5_sL2/specs.json new file mode 100644 index 00000000..4580a150 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW0.5_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 29170000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.6365827, + "f3db": 48621940.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/sky130/sW0.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW0.5_sL2/target.spice new file mode 100644 index 00000000..49676225 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW0.5_sL2/target.spice @@ -0,0 +1,4 @@ +.subckt C05_sky130_sW0.5_sL2 VDD VSS VIN1 VOUT1 VB1 +XM1 VOUT1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=1 l=0.6 nf=2 +XM2 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=2 l=0.6 nf=4 +.ends C05_sky130_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C05/sky130/sW0.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW0.5_sL2/target_lvs.spice new file mode 100644 index 00000000..97d1e361 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW0.5_sL2/target_lvs.spice @@ -0,0 +1,8 @@ +.subckt C05_sky130_sW0.5_sL2 VDD VSS VIN1 VOUT1 VB1 +XM1_f0 VOUT1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f1 VOUT1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f0 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f1 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f2 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f3 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +.ends C05_sky130_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C05/sky130/sW0.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW0.5_sL2/testbench.spice new file mode 100644 index 00000000..b19e01bf --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW0.5_sL2/testbench.spice @@ -0,0 +1,30 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C05_sky130_sW0.5_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +XB_VB1 VB1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=1 l=0.6 +IB_VB1 VDDB VB1 2e-05 +VIN1 VIN1 0 dc 1.17 ac 1 +RL VOUT1 0 20000 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +print vout0 idd +dc VIN1 0 1.8 0.0045 +let gain_dc = deriv(v(VOUT1)) +meas dc gain_at_nom find gain_dc at=1.17 +meas dc vout_at_nom find v(VOUT1) at=1.17 +let okg = gain_dc - 0.5 +meas dc vin_lo find v(VIN1) when okg=0 cross=1 +meas dc vin_hi find v(VIN1) when okg=0 cross=last +ac dec 20 1k 10G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=1k +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1.5_sL1.5/case.json new file mode 100644 index 00000000..c0b32a31 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1.5_sL1.5/case.json @@ -0,0 +1,103 @@ +{ + "case_id": "C05_sky130_sW1.5_sL1.5", + "circuit_id": "C05", + "pdk": "sky130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "dut_name": "C05_sky130_sW1.5_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 3.0, + "l": 0.45, + "nf": 6 + }, + "M2": { + "w": 6.0, + "l": 0.45, + "nf": 12 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M1", + "current": 2e-05 + } + }, + "load": { + "vin_nom": 1.1700000000000002, + "RL": 20000.0, + "CL": 1e-12 + }, + "category": "follower", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.45, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.45, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "eab5696aa66e742d", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "ideal input source" + }, + { + "kind": "testbench_element", + "what": "load resistor and capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1.5_sL1.5/manifest.json new file mode 100644 index 00000000..9834bb69 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "b51af491b4581861c896064386bd7310ec84a97758d63a251e5ac6c8039fb4b7", + "qualification.json": "df0f4bfb5c21a491aa1394556c3db14f931028f71fb629f5096fe66fb337d334", + "specs.json": "3f1c8898899418e86d03c47abca09804d92de9b5e99a02c3f7c2c77e3864c75a", + "target.spice": "03dd06e6fa76aa72feed17d743c7cece5df53bf6da1c01bb2fbb531ed1606bd0", + "target_lvs.spice": "5aa539301363d1d0351c4a494536a21d6f2776fb04f907be86205ef8b624fdc7", + "testbench.spice": "594f09bfb0421be57beeae29e5fe36567b2418e426312120fcfa5a832b7d38a9" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1.5_sL1.5/qualification.json new file mode 100644 index 00000000..c9986583 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1.5_sL1.5/qualification.json @@ -0,0 +1,85 @@ +{ + "case_id": "C05_sky130_sW1.5_sL1.5", + "circuit_id": "C05", + "pdk": "sky130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "follower", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.45, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.45, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "eab5696aa66e742d", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_at_nom": { + "min": 0.7088 + }, + "f3db": { + "min": 52110000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.7587754, + "f3db": 86842120.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 9.3, + "schematic_measures": { + "vout0": 0.3437213, + "idd": 3.540741e-05, + "gain_at_nom": 0.7587754, + "vout_at_nom": 0.3437213, + "vin_lo": 0.76352, + "vin_hi": 0.76352, + "gain_lf": -2.397726, + "f3db": 86842120.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1.5_sL1.5/specs.json new file mode 100644 index 00000000..0c196647 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1.5_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_at_nom": { + "min": 0.7088 + }, + "f3db": { + "min": 52110000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.7587754, + "f3db": 86842120.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1.5_sL1.5/target.spice new file mode 100644 index 00000000..8e6e6529 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1.5_sL1.5/target.spice @@ -0,0 +1,4 @@ +.subckt C05_sky130_sW1.5_sL1.5 VDD VSS VIN1 VOUT1 VB1 +XM1 VOUT1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=3 l=0.45 nf=6 +XM2 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=6 l=0.45 nf=12 +.ends C05_sky130_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..18a4b764 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1.5_sL1.5/target_lvs.spice @@ -0,0 +1,20 @@ +.subckt C05_sky130_sW1.5_sL1.5 VDD VSS VIN1 VOUT1 VB1 +XM1_f0 VOUT1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f1 VOUT1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f2 VOUT1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f3 VOUT1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f4 VOUT1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f5 VOUT1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f0 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f1 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f2 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f3 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f4 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f5 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f6 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f7 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f8 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f9 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f10 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f11 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +.ends C05_sky130_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1.5_sL1.5/testbench.spice new file mode 100644 index 00000000..2432b92e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1.5_sL1.5/testbench.spice @@ -0,0 +1,30 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C05_sky130_sW1.5_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +XB_VB1 VB1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=3 l=0.45 +IB_VB1 VDDB VB1 2e-05 +VIN1 VIN1 0 dc 1.17 ac 1 +RL VOUT1 0 20000 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +print vout0 idd +dc VIN1 0 1.8 0.0045 +let gain_dc = deriv(v(VOUT1)) +meas dc gain_at_nom find gain_dc at=1.17 +meas dc vout_at_nom find v(VOUT1) at=1.17 +let okg = gain_dc - 0.5 +meas dc vin_lo find v(VIN1) when okg=0 cross=1 +meas dc vin_hi find v(VIN1) when okg=0 cross=last +ac dec 20 1k 10G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=1k +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1.5_sL1/case.json new file mode 100644 index 00000000..3e076b04 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1.5_sL1/case.json @@ -0,0 +1,103 @@ +{ + "case_id": "C05_sky130_sW1.5_sL1", + "circuit_id": "C05", + "pdk": "sky130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "dut_name": "C05_sky130_sW1.5_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 3.0, + "l": 0.3, + "nf": 6 + }, + "M2": { + "w": 6.0, + "l": 0.3, + "nf": 12 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M1", + "current": 2e-05 + } + }, + "load": { + "vin_nom": 1.1700000000000002, + "RL": 20000.0, + "CL": 1e-12 + }, + "category": "follower", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.3, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.3, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "df0df0653fb4c194", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "ideal input source" + }, + { + "kind": "testbench_element", + "what": "load resistor and capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1.5_sL1/manifest.json new file mode 100644 index 00000000..6166ca04 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "5c5ee6e9c300dfe9ed307b3fde01c36bb4c0e67c181281ecbbc13320fae6cffb", + "qualification.json": "0238d39dcafb98c75bfac8ebfc2b87ece09a9f10e6f7c93c586a75f836cddf3f", + "specs.json": "6739aaef6ec754b66b2bdd4eee68e3665341c36cbc146ad5e1d95cb7c07780f0", + "target.spice": "443d419dc6c4214172a5fc1b244ea5121eaf467c8ec148771a36a7ed864c9d0e", + "target_lvs.spice": "578f90f62b1d66549ed8f9288115bf8a46d6f86e46491d262f4a18b2ed4141f0", + "testbench.spice": "43e7eb04e1a6d0fb34c36fa8c73fc870dd32bbfda9013c7035e8e82c8cef9b0c" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1.5_sL1/qualification.json new file mode 100644 index 00000000..28330882 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1.5_sL1/qualification.json @@ -0,0 +1,85 @@ +{ + "case_id": "C05_sky130_sW1.5_sL1", + "circuit_id": "C05", + "pdk": "sky130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "follower", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.3, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.3, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "df0df0653fb4c194", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_at_nom": { + "min": 0.7092 + }, + "f3db": { + "min": 60030000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.7592457, + "f3db": 100054200.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 7.5, + "schematic_measures": { + "vout0": 0.3494129, + "idd": 3.574033e-05, + "gain_at_nom": 0.7592457, + "vout_at_nom": 0.3494129, + "vin_lo": 0.7522897, + "vin_hi": 0.7522897, + "gain_lf": -2.392343, + "f3db": 100054200.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1.5_sL1/specs.json new file mode 100644 index 00000000..c872b4ff --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1.5_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_at_nom": { + "min": 0.7092 + }, + "f3db": { + "min": 60030000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.7592457, + "f3db": 100054200.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1.5_sL1/target.spice new file mode 100644 index 00000000..1d75ac21 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1.5_sL1/target.spice @@ -0,0 +1,4 @@ +.subckt C05_sky130_sW1.5_sL1 VDD VSS VIN1 VOUT1 VB1 +XM1 VOUT1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=3 l=0.3 nf=6 +XM2 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=6 l=0.3 nf=12 +.ends C05_sky130_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1.5_sL1/target_lvs.spice new file mode 100644 index 00000000..e31cb4a3 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1.5_sL1/target_lvs.spice @@ -0,0 +1,20 @@ +.subckt C05_sky130_sW1.5_sL1 VDD VSS VIN1 VOUT1 VB1 +XM1_f0 VOUT1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f1 VOUT1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f2 VOUT1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f3 VOUT1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f4 VOUT1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f5 VOUT1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f0 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f1 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f2 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f3 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f4 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f5 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f6 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f7 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f8 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f9 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f10 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f11 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +.ends C05_sky130_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1.5_sL1/testbench.spice new file mode 100644 index 00000000..14d223b2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1.5_sL1/testbench.spice @@ -0,0 +1,30 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C05_sky130_sW1.5_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +XB_VB1 VB1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=3 l=0.3 +IB_VB1 VDDB VB1 2e-05 +VIN1 VIN1 0 dc 1.17 ac 1 +RL VOUT1 0 20000 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +print vout0 idd +dc VIN1 0 1.8 0.0045 +let gain_dc = deriv(v(VOUT1)) +meas dc gain_at_nom find gain_dc at=1.17 +meas dc vout_at_nom find v(VOUT1) at=1.17 +let okg = gain_dc - 0.5 +meas dc vin_lo find v(VIN1) when okg=0 cross=1 +meas dc vin_hi find v(VIN1) when okg=0 cross=last +ac dec 20 1k 10G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=1k +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1.5_sL2/case.json new file mode 100644 index 00000000..f3d36f91 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1.5_sL2/case.json @@ -0,0 +1,103 @@ +{ + "case_id": "C05_sky130_sW1.5_sL2", + "circuit_id": "C05", + "pdk": "sky130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "dut_name": "C05_sky130_sW1.5_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 3.0, + "l": 0.6, + "nf": 6 + }, + "M2": { + "w": 6.0, + "l": 0.6, + "nf": 12 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M1", + "current": 2e-05 + } + }, + "load": { + "vin_nom": 1.1700000000000002, + "RL": 20000.0, + "CL": 1e-12 + }, + "category": "follower", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.6, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.6, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "e277d7c7f7380fda", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "ideal input source" + }, + { + "kind": "testbench_element", + "what": "load resistor and capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1.5_sL2/manifest.json new file mode 100644 index 00000000..e2094a4b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "0d5f917939549159e8f8714c83b058ea499f9a1656c9272f46ca3359a4680646", + "qualification.json": "2ce9c15b570dad0dc47b5ec1df9441a124b702709875fdce69ce3b605c5d9a09", + "specs.json": "bc918af377ad12ea3c85a325abd12cf30aea3f72db83b5c327967bd02270f576", + "target.spice": "7b60a39764b63bd0129928d85e516d2a7a1555f773568c28df2b5ecbca0184b8", + "target_lvs.spice": "78ed2086dabd63b249bad4870c4f96f647a56ac2fe24ae0e7b5c2855ca313dbd", + "testbench.spice": "b4c6c8d8c1877a597145b43c34f61af6af66deecbcdcb730871ddbe02bc7b25b" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1.5_sL2/qualification.json new file mode 100644 index 00000000..3715c0fd --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1.5_sL2/qualification.json @@ -0,0 +1,85 @@ +{ + "case_id": "C05_sky130_sW1.5_sL2", + "circuit_id": "C05", + "pdk": "sky130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "follower", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.6, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.6, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "e277d7c7f7380fda", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_at_nom": { + "min": 0.6994 + }, + "f3db": { + "min": 45420000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.7494204, + "f3db": 75701030.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 9.9, + "schematic_measures": { + "vout0": 0.3326244, + "idd": 3.356999e-05, + "gain_at_nom": 0.7494204, + "vout_at_nom": 0.3326244, + "vin_lo": 0.7794716, + "vin_hi": 0.7794716, + "gain_lf": -2.505476, + "f3db": 75701030.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1.5_sL2/specs.json new file mode 100644 index 00000000..cb5a647a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1.5_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_at_nom": { + "min": 0.6994 + }, + "f3db": { + "min": 45420000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.7494204, + "f3db": 75701030.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1.5_sL2/target.spice new file mode 100644 index 00000000..f383d66e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1.5_sL2/target.spice @@ -0,0 +1,4 @@ +.subckt C05_sky130_sW1.5_sL2 VDD VSS VIN1 VOUT1 VB1 +XM1 VOUT1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=3 l=0.6 nf=6 +XM2 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=6 l=0.6 nf=12 +.ends C05_sky130_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1.5_sL2/target_lvs.spice new file mode 100644 index 00000000..d969f008 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1.5_sL2/target_lvs.spice @@ -0,0 +1,20 @@ +.subckt C05_sky130_sW1.5_sL2 VDD VSS VIN1 VOUT1 VB1 +XM1_f0 VOUT1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f1 VOUT1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f2 VOUT1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f3 VOUT1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f4 VOUT1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f5 VOUT1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f0 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f1 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f2 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f3 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f4 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f5 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f6 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f7 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f8 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f9 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f10 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f11 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +.ends C05_sky130_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1.5_sL2/testbench.spice new file mode 100644 index 00000000..79226c29 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1.5_sL2/testbench.spice @@ -0,0 +1,30 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C05_sky130_sW1.5_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +XB_VB1 VB1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=3 l=0.6 +IB_VB1 VDDB VB1 2e-05 +VIN1 VIN1 0 dc 1.17 ac 1 +RL VOUT1 0 20000 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +print vout0 idd +dc VIN1 0 1.8 0.0045 +let gain_dc = deriv(v(VOUT1)) +meas dc gain_at_nom find gain_dc at=1.17 +meas dc vout_at_nom find v(VOUT1) at=1.17 +let okg = gain_dc - 0.5 +meas dc vin_lo find v(VIN1) when okg=0 cross=1 +meas dc vin_hi find v(VIN1) when okg=0 cross=last +ac dec 20 1k 10G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=1k +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1_sL1.5/case.json new file mode 100644 index 00000000..f35cb865 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1_sL1.5/case.json @@ -0,0 +1,103 @@ +{ + "case_id": "C05_sky130_sW1_sL1.5", + "circuit_id": "C05", + "pdk": "sky130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "dut_name": "C05_sky130_sW1_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.45, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.45, + "nf": 8 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M1", + "current": 2e-05 + } + }, + "load": { + "vin_nom": 1.1700000000000002, + "RL": 20000.0, + "CL": 1e-12 + }, + "category": "follower", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "c635b50631355e72", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "ideal input source" + }, + { + "kind": "testbench_element", + "what": "load resistor and capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1_sL1.5/manifest.json new file mode 100644 index 00000000..18263958 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "19dfb1fb0180320ecf0f1b4c722c2962df02dc6af1e98f8d2f118612a4686538", + "qualification.json": "e56f1e846f45449bb82c4e9e659d826800c29d8b42d479eb08b8399fb8620245", + "specs.json": "f98bb6c197a70e92453f1ead0b39bb3ca74986850702932d5fda3ad749245ae6", + "target.spice": "5fb959c43557dce733fb63e189d4b118a9433bb931a23346540a1f83b3e2cfaf", + "target_lvs.spice": "474e140944737f999fb2c7c6da3d9e54eb748141c13bebf50242e7e84650e64b", + "testbench.spice": "289a16863a49b097399921900d570fac21270d586cde91b72f5d2befd6bdccc4" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1_sL1.5/qualification.json new file mode 100644 index 00000000..dc6d5bcf --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1_sL1.5/qualification.json @@ -0,0 +1,85 @@ +{ + "case_id": "C05_sky130_sW1_sL1.5", + "circuit_id": "C05", + "pdk": "sky130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "follower", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "c635b50631355e72", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_at_nom": { + "min": 0.6903 + }, + "f3db": { + "min": 44140000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.7403227, + "f3db": 73573610.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 8.6, + "schematic_measures": { + "vout0": 0.3161718, + "idd": 3.386103e-05, + "gain_at_nom": 0.7403227, + "vout_at_nom": 0.3161718, + "vin_lo": 0.8034114, + "vin_hi": 0.8034114, + "gain_lf": -2.611558, + "f3db": 73573610.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1_sL1.5/specs.json new file mode 100644 index 00000000..06cb45b1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_at_nom": { + "min": 0.6903 + }, + "f3db": { + "min": 44140000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.7403227, + "f3db": 73573610.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1_sL1.5/target.spice new file mode 100644 index 00000000..24d2461e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1_sL1.5/target.spice @@ -0,0 +1,4 @@ +.subckt C05_sky130_sW1_sL1.5 VDD VSS VIN1 VOUT1 VB1 +XM1 VOUT1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=2 l=0.45 nf=4 +XM2 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=4 l=0.45 nf=8 +.ends C05_sky130_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1_sL1.5/target_lvs.spice new file mode 100644 index 00000000..4f0a4413 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1_sL1.5/target_lvs.spice @@ -0,0 +1,14 @@ +.subckt C05_sky130_sW1_sL1.5 VDD VSS VIN1 VOUT1 VB1 +XM1_f0 VOUT1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f1 VOUT1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f2 VOUT1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f3 VOUT1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f0 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f1 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f2 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f3 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f4 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f5 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f6 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f7 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +.ends C05_sky130_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1_sL1.5/testbench.spice new file mode 100644 index 00000000..f69ade23 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1_sL1.5/testbench.spice @@ -0,0 +1,30 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C05_sky130_sW1_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +XB_VB1 VB1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=2 l=0.45 +IB_VB1 VDDB VB1 2e-05 +VIN1 VIN1 0 dc 1.17 ac 1 +RL VOUT1 0 20000 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +print vout0 idd +dc VIN1 0 1.8 0.0045 +let gain_dc = deriv(v(VOUT1)) +meas dc gain_at_nom find gain_dc at=1.17 +meas dc vout_at_nom find v(VOUT1) at=1.17 +let okg = gain_dc - 0.5 +meas dc vin_lo find v(VIN1) when okg=0 cross=1 +meas dc vin_hi find v(VIN1) when okg=0 cross=last +ac dec 20 1k 10G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=1k +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1_sL1/case.json new file mode 100644 index 00000000..b63cc829 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1_sL1/case.json @@ -0,0 +1,103 @@ +{ + "case_id": "C05_sky130_sW1_sL1", + "circuit_id": "C05", + "pdk": "sky130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "dut_name": "C05_sky130_sW1_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.3, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.3, + "nf": 8 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M1", + "current": 2e-05 + } + }, + "load": { + "vin_nom": 1.1700000000000002, + "RL": 20000.0, + "CL": 1e-12 + }, + "category": "follower", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "fd1865c2ef80024a", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "ideal input source" + }, + { + "kind": "testbench_element", + "what": "load resistor and capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1_sL1/manifest.json new file mode 100644 index 00000000..57813260 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "af4eac4e4dd84a8a39999a7b0404da39fb4f4bd4017a73fbde66191762318422", + "qualification.json": "462243fbed4bafff9164713328c4a610636179961ea2dc727694628c0d355c23", + "specs.json": "d9a19538debe79e2b3fae4110ff27bf166cd087ae9eb59fc372451b514a0f62c", + "target.spice": "b3717322b6b2832ae76626f96df76bbc07c4ba105e990b847bfe6ec8f3dc6f23", + "target_lvs.spice": "8c551041485630d4cf908659aabbc86eb0f3bf3fe5c3652e31f19fcc51d0472a", + "testbench.spice": "d5c6e4863ff3b1582562ffe6c28782ec282403df765224c375429982717fa3a1" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1_sL1/qualification.json new file mode 100644 index 00000000..f0b90ceb --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1_sL1/qualification.json @@ -0,0 +1,85 @@ +{ + "case_id": "C05_sky130_sW1_sL1", + "circuit_id": "C05", + "pdk": "sky130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "follower", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "fd1865c2ef80024a", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_at_nom": { + "min": 0.6961 + }, + "f3db": { + "min": 51990000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.7460907, + "f3db": 86655320.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 9.3, + "schematic_measures": { + "vout0": 0.3255993, + "idd": 3.429753e-05, + "gain_at_nom": 0.7460907, + "vout_at_nom": 0.3255994, + "vin_lo": 0.7868045, + "vin_hi": 0.7868045, + "gain_lf": -2.544153, + "f3db": 86655320.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1_sL1/specs.json new file mode 100644 index 00000000..15fce666 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_at_nom": { + "min": 0.6961 + }, + "f3db": { + "min": 51990000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.7460907, + "f3db": 86655320.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1_sL1/target.spice new file mode 100644 index 00000000..58d2d53c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1_sL1/target.spice @@ -0,0 +1,4 @@ +.subckt C05_sky130_sW1_sL1 VDD VSS VIN1 VOUT1 VB1 +XM1 VOUT1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=2 l=0.3 nf=4 +XM2 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=4 l=0.3 nf=8 +.ends C05_sky130_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1_sL1/target_lvs.spice new file mode 100644 index 00000000..198450ac --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1_sL1/target_lvs.spice @@ -0,0 +1,14 @@ +.subckt C05_sky130_sW1_sL1 VDD VSS VIN1 VOUT1 VB1 +XM1_f0 VOUT1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f1 VOUT1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f2 VOUT1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f3 VOUT1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f0 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f1 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f2 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f3 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f4 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f5 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f6 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f7 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +.ends C05_sky130_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1_sL1/testbench.spice new file mode 100644 index 00000000..2dd03af7 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1_sL1/testbench.spice @@ -0,0 +1,30 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C05_sky130_sW1_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +XB_VB1 VB1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=2 l=0.3 +IB_VB1 VDDB VB1 2e-05 +VIN1 VIN1 0 dc 1.17 ac 1 +RL VOUT1 0 20000 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +print vout0 idd +dc VIN1 0 1.8 0.0045 +let gain_dc = deriv(v(VOUT1)) +meas dc gain_at_nom find gain_dc at=1.17 +meas dc vout_at_nom find v(VOUT1) at=1.17 +let okg = gain_dc - 0.5 +meas dc vin_lo find v(VIN1) when okg=0 cross=1 +meas dc vin_hi find v(VIN1) when okg=0 cross=last +ac dec 20 1k 10G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=1k +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1_sL2/case.json new file mode 100644 index 00000000..5c6fa6dd --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1_sL2/case.json @@ -0,0 +1,103 @@ +{ + "case_id": "C05_sky130_sW1_sL2", + "circuit_id": "C05", + "pdk": "sky130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "dut_name": "C05_sky130_sW1_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.6, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.6, + "nf": 8 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M1", + "current": 2e-05 + } + }, + "load": { + "vin_nom": 1.1700000000000002, + "RL": 20000.0, + "CL": 1e-12 + }, + "category": "follower", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "9db1cbe6ad1c381f", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "ideal input source" + }, + { + "kind": "testbench_element", + "what": "load resistor and capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1_sL2/manifest.json new file mode 100644 index 00000000..68e10934 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "f7ba00d2f9ad7760ad5101ca56542f789de01bf45ca960b1be65e2a7fe4ca585", + "qualification.json": "630716a5e15bcfa981d394bcbff52b76f97f2b4e4581d53fd1f48ef7ab24ba60", + "specs.json": "11136d47c164f9cf5c2c424ece2033d6656495ff2d73bbb68ff1b1aa516cb144", + "target.spice": "e375a9b54e5a0b256cdf1480629e3926ceb7626645b9927188f31aa101440d9b", + "target_lvs.spice": "0ee6011e7c216f61cc7042f6bdb6a9d97541bdeabf6c4713db986d285dc0d2ea", + "testbench.spice": "da84754cb3d13ef2f8dfd56c4fbdb70297347ac97078e05c1c138f508592b5ed" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1_sL2/qualification.json new file mode 100644 index 00000000..ce9f64f2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1_sL2/qualification.json @@ -0,0 +1,85 @@ +{ + "case_id": "C05_sky130_sW1_sL2", + "circuit_id": "C05", + "pdk": "sky130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "follower", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "9db1cbe6ad1c381f", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_at_nom": { + "min": 0.6762 + }, + "f3db": { + "min": 38230000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.7261568, + "f3db": 63718630.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 10.6, + "schematic_measures": { + "vout0": 0.3024541, + "idd": 3.198847e-05, + "gain_at_nom": 0.7261568, + "vout_at_nom": 0.3024541, + "vin_lo": 0.825593, + "vin_hi": 0.825593, + "gain_lf": -2.779357, + "f3db": 63718630.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1_sL2/specs.json new file mode 100644 index 00000000..be69e0ac --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_at_nom": { + "min": 0.6762 + }, + "f3db": { + "min": 38230000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.7261568, + "f3db": 63718630.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1_sL2/target.spice new file mode 100644 index 00000000..f701ce57 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1_sL2/target.spice @@ -0,0 +1,4 @@ +.subckt C05_sky130_sW1_sL2 VDD VSS VIN1 VOUT1 VB1 +XM1 VOUT1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=2 l=0.6 nf=4 +XM2 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=4 l=0.6 nf=8 +.ends C05_sky130_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1_sL2/target_lvs.spice new file mode 100644 index 00000000..312025a5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1_sL2/target_lvs.spice @@ -0,0 +1,14 @@ +.subckt C05_sky130_sW1_sL2 VDD VSS VIN1 VOUT1 VB1 +XM1_f0 VOUT1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f1 VOUT1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f2 VOUT1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f3 VOUT1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f0 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f1 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f2 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f3 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f4 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f5 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f6 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f7 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +.ends C05_sky130_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1_sL2/testbench.spice new file mode 100644 index 00000000..3541d2cb --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW1_sL2/testbench.spice @@ -0,0 +1,30 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C05_sky130_sW1_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +XB_VB1 VB1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=2 l=0.6 +IB_VB1 VDDB VB1 2e-05 +VIN1 VIN1 0 dc 1.17 ac 1 +RL VOUT1 0 20000 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +print vout0 idd +dc VIN1 0 1.8 0.0045 +let gain_dc = deriv(v(VOUT1)) +meas dc gain_at_nom find gain_dc at=1.17 +meas dc vout_at_nom find v(VOUT1) at=1.17 +let okg = gain_dc - 0.5 +meas dc vin_lo find v(VIN1) when okg=0 cross=1 +meas dc vin_hi find v(VIN1) when okg=0 cross=last +ac dec 20 1k 10G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=1k +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C05/sky130/sW2_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW2_sL1.5/case.json new file mode 100644 index 00000000..56c37bb1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW2_sL1.5/case.json @@ -0,0 +1,103 @@ +{ + "case_id": "C05_sky130_sW2_sL1.5", + "circuit_id": "C05", + "pdk": "sky130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "dut_name": "C05_sky130_sW2_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.45, + "nf": 8 + }, + "M2": { + "w": 8.0, + "l": 0.45, + "nf": 16 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M1", + "current": 2e-05 + } + }, + "load": { + "vin_nom": 1.1700000000000002, + "RL": 20000.0, + "CL": 1e-12 + }, + "category": "follower", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "7a061e1c7eb1a934", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "ideal input source" + }, + { + "kind": "testbench_element", + "what": "load resistor and capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/sky130/sW2_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW2_sL1.5/manifest.json new file mode 100644 index 00000000..ccb1a248 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW2_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "58b125dcd34d461ba58b330e48abb3f48521ffe84c4167798f759c0b267b7f3e", + "qualification.json": "f7c70bf09552490737566020a597d0bd1f05a7cac97fdbdc0952b8f22b0a4ccc", + "specs.json": "0fb674568a386c9d1034d2770ec606ff4761e74d58c23d2d2734f6776c20dfc8", + "target.spice": "0cd921fc02d087ec48499db17af2104ce0ca6725f5dc911ceb28a3b6e1e5a0d8", + "target_lvs.spice": "f2f6d1e64349656f2c6f4dab0a97e38591ead75ee2734ea3bc139f5750544c1e", + "testbench.spice": "b6a6b2d4397ef28f37c3fae1015ecdb3817f31d3e2e4b6a96b9c86dbe876444f" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/sky130/sW2_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW2_sL1.5/qualification.json new file mode 100644 index 00000000..2ba294ee --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW2_sL1.5/qualification.json @@ -0,0 +1,85 @@ +{ + "case_id": "C05_sky130_sW2_sL1.5", + "circuit_id": "C05", + "pdk": "sky130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "follower", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "7a061e1c7eb1a934", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_at_nom": { + "min": 0.7178 + }, + "f3db": { + "min": 57000000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.767843, + "f3db": 95002890.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 10.8, + "schematic_measures": { + "vout0": 0.3630991, + "idd": 3.539556e-05, + "gain_at_nom": 0.767843, + "vout_at_nom": 0.3630992, + "vin_lo": 0.7361643, + "vin_hi": 0.7361643, + "gain_lf": -2.294543, + "f3db": 95002890.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/sky130/sW2_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW2_sL1.5/specs.json new file mode 100644 index 00000000..1624fb48 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW2_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_at_nom": { + "min": 0.7178 + }, + "f3db": { + "min": 57000000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.767843, + "f3db": 95002890.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/sky130/sW2_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW2_sL1.5/target.spice new file mode 100644 index 00000000..83640569 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW2_sL1.5/target.spice @@ -0,0 +1,4 @@ +.subckt C05_sky130_sW2_sL1.5 VDD VSS VIN1 VOUT1 VB1 +XM1 VOUT1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=4 l=0.45 nf=8 +XM2 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=8 l=0.45 nf=16 +.ends C05_sky130_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C05/sky130/sW2_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW2_sL1.5/target_lvs.spice new file mode 100644 index 00000000..6afc2014 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW2_sL1.5/target_lvs.spice @@ -0,0 +1,26 @@ +.subckt C05_sky130_sW2_sL1.5 VDD VSS VIN1 VOUT1 VB1 +XM1_f0 VOUT1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f1 VOUT1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f2 VOUT1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f3 VOUT1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f4 VOUT1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f5 VOUT1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f6 VOUT1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f7 VOUT1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f0 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f1 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f2 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f3 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f4 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f5 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f6 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f7 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f8 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f9 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f10 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f11 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f12 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f13 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f14 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f15 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +.ends C05_sky130_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C05/sky130/sW2_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW2_sL1.5/testbench.spice new file mode 100644 index 00000000..d03d90f7 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW2_sL1.5/testbench.spice @@ -0,0 +1,30 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C05_sky130_sW2_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +XB_VB1 VB1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=4 l=0.45 +IB_VB1 VDDB VB1 2e-05 +VIN1 VIN1 0 dc 1.17 ac 1 +RL VOUT1 0 20000 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +print vout0 idd +dc VIN1 0 1.8 0.0045 +let gain_dc = deriv(v(VOUT1)) +meas dc gain_at_nom find gain_dc at=1.17 +meas dc vout_at_nom find v(VOUT1) at=1.17 +let okg = gain_dc - 0.5 +meas dc vin_lo find v(VIN1) when okg=0 cross=1 +meas dc vin_hi find v(VIN1) when okg=0 cross=last +ac dec 20 1k 10G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=1k +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C05/sky130/sW2_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW2_sL1/case.json new file mode 100644 index 00000000..15442579 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW2_sL1/case.json @@ -0,0 +1,103 @@ +{ + "case_id": "C05_sky130_sW2_sL1", + "circuit_id": "C05", + "pdk": "sky130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "dut_name": "C05_sky130_sW2_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.3, + "nf": 8 + }, + "M2": { + "w": 8.0, + "l": 0.3, + "nf": 16 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M1", + "current": 2e-05 + } + }, + "load": { + "vin_nom": 1.1700000000000002, + "RL": 20000.0, + "CL": 1e-12 + }, + "category": "follower", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "e675b4595c16f64f", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "ideal input source" + }, + { + "kind": "testbench_element", + "what": "load resistor and capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/sky130/sW2_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW2_sL1/manifest.json new file mode 100644 index 00000000..b6c147de --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW2_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "2413b1ea6f085b41b5c6f90d1d43d0073a2d170d6ea2cd16cd2d7d66d62210f6", + "qualification.json": "4d6fda57d0aee0b10595e45eab2c1586d4e8ed2ba20b0f67547b66c1533befa0", + "specs.json": "0eb4410528914e8ba8f674685eb8c91d924107a2e4a7503ce57842be7daa1e35", + "target.spice": "520fdbf3c115766e6a6b833c890056cedfb4077de9ab98cd79039aaa38cb35b3", + "target_lvs.spice": "b144113649ac6eae0e0b14fe6b8034d4030c4db36c35ff8514d9b65d07a36055", + "testbench.spice": "4063c61b09d3b42935919c83df0bec00be7f379ca93c3dbfa0793e993b31ede3" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/sky130/sW2_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW2_sL1/qualification.json new file mode 100644 index 00000000..25514505 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW2_sL1/qualification.json @@ -0,0 +1,85 @@ +{ + "case_id": "C05_sky130_sW2_sL1", + "circuit_id": "C05", + "pdk": "sky130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "follower", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "e675b4595c16f64f", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_at_nom": { + "min": 0.7154 + }, + "f3db": { + "min": 64130000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.7654134, + "f3db": 106882800.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 10.2, + "schematic_measures": { + "vout0": 0.366875, + "idd": 3.544366e-05, + "gain_at_nom": 0.7654134, + "vout_at_nom": 0.366875, + "vin_lo": 0.7264476, + "vin_hi": 0.7264476, + "gain_lf": -2.322071, + "f3db": 106882800.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/sky130/sW2_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW2_sL1/specs.json new file mode 100644 index 00000000..71f05c32 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW2_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_at_nom": { + "min": 0.7154 + }, + "f3db": { + "min": 64130000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.7654134, + "f3db": 106882800.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/sky130/sW2_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW2_sL1/target.spice new file mode 100644 index 00000000..efadb953 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW2_sL1/target.spice @@ -0,0 +1,4 @@ +.subckt C05_sky130_sW2_sL1 VDD VSS VIN1 VOUT1 VB1 +XM1 VOUT1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=4 l=0.3 nf=8 +XM2 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=8 l=0.3 nf=16 +.ends C05_sky130_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C05/sky130/sW2_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW2_sL1/target_lvs.spice new file mode 100644 index 00000000..6356888d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW2_sL1/target_lvs.spice @@ -0,0 +1,26 @@ +.subckt C05_sky130_sW2_sL1 VDD VSS VIN1 VOUT1 VB1 +XM1_f0 VOUT1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f1 VOUT1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f2 VOUT1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f3 VOUT1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f4 VOUT1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f5 VOUT1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f6 VOUT1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f7 VOUT1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f0 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f1 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f2 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f3 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f4 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f5 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f6 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f7 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f8 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f9 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f10 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f11 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f12 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f13 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f14 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f15 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +.ends C05_sky130_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C05/sky130/sW2_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW2_sL1/testbench.spice new file mode 100644 index 00000000..072352b5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW2_sL1/testbench.spice @@ -0,0 +1,30 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C05_sky130_sW2_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +XB_VB1 VB1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=4 l=0.3 +IB_VB1 VDDB VB1 2e-05 +VIN1 VIN1 0 dc 1.17 ac 1 +RL VOUT1 0 20000 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +print vout0 idd +dc VIN1 0 1.8 0.0045 +let gain_dc = deriv(v(VOUT1)) +meas dc gain_at_nom find gain_dc at=1.17 +meas dc vout_at_nom find v(VOUT1) at=1.17 +let okg = gain_dc - 0.5 +meas dc vin_lo find v(VIN1) when okg=0 cross=1 +meas dc vin_hi find v(VIN1) when okg=0 cross=last +ac dec 20 1k 10G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=1k +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C05/sky130/sW2_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW2_sL2/case.json new file mode 100644 index 00000000..2b1f351e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW2_sL2/case.json @@ -0,0 +1,103 @@ +{ + "case_id": "C05_sky130_sW2_sL2", + "circuit_id": "C05", + "pdk": "sky130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "dut_name": "C05_sky130_sW2_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.6, + "nf": 8 + }, + "M2": { + "w": 8.0, + "l": 0.6, + "nf": 16 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M1", + "current": 2e-05 + } + }, + "load": { + "vin_nom": 1.1700000000000002, + "RL": 20000.0, + "CL": 1e-12 + }, + "category": "follower", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "dfdf19015b0f0b0f", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "ideal input source" + }, + { + "kind": "testbench_element", + "what": "load resistor and capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/sky130/sW2_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW2_sL2/manifest.json new file mode 100644 index 00000000..468bd741 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW2_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "21911a75aa7cb6acb527358745c653e464cc3e5a911c9e0a539a667e3510830b", + "qualification.json": "16d40dcff636babe66e6ab4a08fdc8886c36c6076cea1d33a10ed9f08a8d9172", + "specs.json": "b07a8bec265ae27963b53a3e442fab4b01e5f9ce6468e9f07d75ce889b052fcf", + "target.spice": "9cccd30fd878f75cc4928c00f7cafba8e205e12ee18572524867064fa8d7bd89", + "target_lvs.spice": "0abe60c4d8e3de8f2c3e7fed3847ba45f730c8eb08a8ca4611f237ae3cb829cf", + "testbench.spice": "49ce63edd2b28d541084b98fb2ac3061772fe63b7de17bd66015a636e0dc42c6" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/sky130/sW2_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW2_sL2/qualification.json new file mode 100644 index 00000000..b77b4078 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW2_sL2/qualification.json @@ -0,0 +1,85 @@ +{ + "case_id": "C05_sky130_sW2_sL2", + "circuit_id": "C05", + "pdk": "sky130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "follower", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "dfdf19015b0f0b0f", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_at_nom": { + "min": 0.7114 + }, + "f3db": { + "min": 50670000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.7613855, + "f3db": 84455480.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 6.3, + "schematic_measures": { + "vout0": 0.3522278, + "idd": 3.434093e-05, + "gain_at_nom": 0.7613855, + "vout_at_nom": 0.352228, + "vin_lo": 0.7517677, + "vin_hi": 0.7517677, + "gain_lf": -2.367897, + "f3db": 84455480.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/sky130/sW2_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW2_sL2/specs.json new file mode 100644 index 00000000..db0441ed --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW2_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_at_nom": { + "min": 0.7114 + }, + "f3db": { + "min": 50670000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.7613855, + "f3db": 84455480.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C05/sky130/sW2_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW2_sL2/target.spice new file mode 100644 index 00000000..a397e572 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW2_sL2/target.spice @@ -0,0 +1,4 @@ +.subckt C05_sky130_sW2_sL2 VDD VSS VIN1 VOUT1 VB1 +XM1 VOUT1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=4 l=0.6 nf=8 +XM2 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=8 l=0.6 nf=16 +.ends C05_sky130_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C05/sky130/sW2_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW2_sL2/target_lvs.spice new file mode 100644 index 00000000..9d8f5d21 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW2_sL2/target_lvs.spice @@ -0,0 +1,26 @@ +.subckt C05_sky130_sW2_sL2 VDD VSS VIN1 VOUT1 VB1 +XM1_f0 VOUT1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f1 VOUT1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f2 VOUT1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f3 VOUT1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f4 VOUT1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f5 VOUT1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f6 VOUT1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f7 VOUT1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f0 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f1 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f2 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f3 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f4 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f5 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f6 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f7 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f8 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f9 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f10 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f11 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f12 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f13 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f14 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f15 VDD VIN1 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +.ends C05_sky130_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C05/sky130/sW2_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW2_sL2/testbench.spice new file mode 100644 index 00000000..70e3bc2e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C05/sky130/sW2_sL2/testbench.spice @@ -0,0 +1,30 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C05_sky130_sW2_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +XB_VB1 VB1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=4 l=0.6 +IB_VB1 VDDB VB1 2e-05 +VIN1 VIN1 0 dc 1.17 ac 1 +RL VOUT1 0 20000 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +print vout0 idd +dc VIN1 0 1.8 0.0045 +let gain_dc = deriv(v(VOUT1)) +meas dc gain_at_nom find gain_dc at=1.17 +meas dc vout_at_nom find v(VOUT1) at=1.17 +let okg = gain_dc - 0.5 +meas dc vin_lo find v(VIN1) when okg=0 cross=1 +meas dc vin_hi find v(VIN1) when okg=0 cross=last +ac dec 20 1k 10G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=1k +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C06/gf180/sW0.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW0.5_sL1.5/case.json new file mode 100644 index 00000000..bb810bf8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW0.5_sL1.5/case.json @@ -0,0 +1,163 @@ +{ + "case_id": "C06_gf180_sW0.5_sL1.5", + "circuit_id": "C06", + "pdk": "gf180", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "dut_name": "C06_gf180_sW0.5_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1", + "VB2", + "VB3" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.84, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 0.84, + "nf": 4 + }, + "M3": { + "w": 1.0, + "l": 0.84, + "nf": 2 + }, + "M4": { + "w": 1.0, + "l": 0.84, + "nf": 2 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M4", + "current": 2e-05, + "kind": "cascode" + }, + "VB2": { + "replica": "M1", + "current": 2e-05, + "kind": "cascode" + }, + "VB3": { + "replica": "M2", + "current": 2e-05 + } + }, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.84, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.84, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "4de731f518e1d118", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M4", + "current_A": 2e-05, + "variant": "cascode" + }, + { + "kind": "replica_bias", + "port": "VB2", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "cascode" + }, + { + "kind": "replica_bias", + "port": "VB3", + "replica_of": "M2", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/gf180/sW0.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW0.5_sL1.5/manifest.json new file mode 100644 index 00000000..add76e13 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW0.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "0e18e832c50f87415d74328cf585734c30c2fd8652fc5373697be2eabc5fa9c1", + "qualification.json": "5d0f74d43630d6828c9c736d1d1cb0a59880daffbd4e6e4a9d70e2990aa3ef15", + "specs.json": "137e2b71bbc7a2053f218baeecaed8420dd6eac49c1e8e01c46333548175b34f", + "target.spice": "48285446e4b62054f076929a839f1c75770faabf655d3365fbe1945f3351bcd4", + "target_lvs.spice": "02c40d76fe723bd9d2bcbf9cf8fc44c858adb58830b1a1cf3ebbdfd232f3cfa7", + "testbench.spice": "4d822b30e51b5e1601403da89de8d7180d58efa605e41a14e551ca63ac4d1a9e" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/gf180/sW0.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW0.5_sL1.5/qualification.json new file mode 100644 index 00000000..df956eb5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW0.5_sL1.5/qualification.json @@ -0,0 +1,107 @@ +{ + "case_id": "C06_gf180_sW0.5_sL1.5", + "circuit_id": "C06", + "pdk": "gf180", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "single", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.84, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.84, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "4de731f518e1d118", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 53.43 + }, + "f3db": { + "min": 100000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 56.43498, + "f3db": 135535.3 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vout0": 1.201718, + "vin0": 1.201718, + "idd": 1.947492e-05, + "gain_lf": 56.43498, + "f3db": 135535.3, + "ugf": 90143860.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/gf180/sW0.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW0.5_sL1.5/specs.json new file mode 100644 index 00000000..7e03ff34 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW0.5_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 53.43 + }, + "f3db": { + "min": 100000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 56.43498, + "f3db": 135535.3 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/gf180/sW0.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW0.5_sL1.5/target.spice new file mode 100644 index 00000000..9f817d17 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW0.5_sL1.5/target.spice @@ -0,0 +1,6 @@ +.subckt C06_gf180_sW0.5_sL1.5 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 +MM1 VOUT1 VB2 net10 VDD pfet_03v3 w=2u l=0.84u nf=4 m=1 +MM2 net10 VB3 VDD VDD pfet_03v3 w=2u l=0.84u nf=4 m=1 +MM3 net9 VIN1 VSS VSS nfet_03v3 w=1u l=0.84u nf=2 m=1 +MM4 VOUT1 VB1 net9 VSS nfet_03v3 w=1u l=0.84u nf=2 m=1 +.ends C06_gf180_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C06/gf180/sW0.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW0.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..598c1ae6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW0.5_sL1.5/target_lvs.spice @@ -0,0 +1,14 @@ +.subckt C06_gf180_sW0.5_sL1.5 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 +MM1_f0 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=0.84u +MM1_f1 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=0.84u +MM1_f2 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=0.84u +MM1_f3 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=0.84u +MM2_f0 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f1 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f2 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f3 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM3_f0 net9 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f1 net9 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM4_f0 VOUT1 VB1 net9 VSS nfet_03v3 w=0.5u l=0.84u +MM4_f1 VOUT1 VB1 net9 VSS nfet_03v3 w=0.5u l=0.84u +.ends C06_gf180_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C06/gf180/sW0.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW0.5_sL1.5/testbench.spice new file mode 100644 index 00000000..b6130e30 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW0.5_sL1.5/testbench.spice @@ -0,0 +1,31 @@ +X1 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 C06_gf180_sW0.5_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +MB_VB1 VB1 VB1 VSS VSS nfet_03v3 w=1u l=0.84u +IB_VB1 VDDB VB1 8e-05 +MB_VB2 VB2 VB2 VDDB VDDB pfet_03v3 w=2u l=0.84u +IB_VB2 VB2 VSS 8e-05 +MB_VB3 VB3 VB3 VDDB VDDB pfet_03v3 w=2u l=0.84u +IB_VB3 VB3 VSS 2e-05 +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C06/gf180/sW0.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW0.5_sL1/case.json new file mode 100644 index 00000000..7846fc80 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW0.5_sL1/case.json @@ -0,0 +1,163 @@ +{ + "case_id": "C06_gf180_sW0.5_sL1", + "circuit_id": "C06", + "pdk": "gf180", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "dut_name": "C06_gf180_sW0.5_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1", + "VB2", + "VB3" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.56, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 0.56, + "nf": 4 + }, + "M3": { + "w": 1.0, + "l": 0.56, + "nf": 2 + }, + "M4": { + "w": 1.0, + "l": 0.56, + "nf": 2 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M4", + "current": 2e-05, + "kind": "cascode" + }, + "VB2": { + "replica": "M1", + "current": 2e-05, + "kind": "cascode" + }, + "VB3": { + "replica": "M2", + "current": 2e-05 + } + }, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.56, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.56, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "ce7474b5e041d6c0", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M4", + "current_A": 2e-05, + "variant": "cascode" + }, + { + "kind": "replica_bias", + "port": "VB2", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "cascode" + }, + { + "kind": "replica_bias", + "port": "VB3", + "replica_of": "M2", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/gf180/sW0.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW0.5_sL1/manifest.json new file mode 100644 index 00000000..9862ba33 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW0.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "db3ff36145b72f0e6c91232ce65ec61a2d97dcdeb9470a4dbc3a643bf4b50d3e", + "qualification.json": "03af1284aa78cc76b9724169fd180920365f1904f18a99168d45eaca82bab6c9", + "specs.json": "d305a45c521ea89aa436b8b80314abb6b788ac9415bcffd3cbe62fc3c79f4b8e", + "target.spice": "6938d48d1a5bc4d0a27492e4f11251fcfb469312457e438ff85da909058dc142", + "target_lvs.spice": "56203cf278ff638dae9ec27136c7c101bb137d85f7badac9c3bd689ffb5efd90", + "testbench.spice": "3970673e344ef1683c81a8aff4315eec1adc4456c6a8ea1411180055143c4fdb" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/gf180/sW0.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW0.5_sL1/qualification.json new file mode 100644 index 00000000..aaee4768 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW0.5_sL1/qualification.json @@ -0,0 +1,107 @@ +{ + "case_id": "C06_gf180_sW0.5_sL1", + "circuit_id": "C06", + "pdk": "gf180", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "single", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.56, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.56, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "ce7474b5e041d6c0", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 50.11 + }, + "f3db": { + "min": 140300.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 53.10618, + "f3db": 233789.4 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vout0": 1.092331, + "vin0": 1.092331, + "idd": 1.90246e-05, + "gain_lf": 53.10618, + "f3db": 233789.4, + "ugf": 106116900.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/gf180/sW0.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW0.5_sL1/specs.json new file mode 100644 index 00000000..1948412e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW0.5_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 50.11 + }, + "f3db": { + "min": 140300.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 53.10618, + "f3db": 233789.4 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/gf180/sW0.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW0.5_sL1/target.spice new file mode 100644 index 00000000..3cc4f10f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW0.5_sL1/target.spice @@ -0,0 +1,6 @@ +.subckt C06_gf180_sW0.5_sL1 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 +MM1 VOUT1 VB2 net10 VDD pfet_03v3 w=2u l=0.56u nf=4 m=1 +MM2 net10 VB3 VDD VDD pfet_03v3 w=2u l=0.56u nf=4 m=1 +MM3 net9 VIN1 VSS VSS nfet_03v3 w=1u l=0.56u nf=2 m=1 +MM4 VOUT1 VB1 net9 VSS nfet_03v3 w=1u l=0.56u nf=2 m=1 +.ends C06_gf180_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C06/gf180/sW0.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW0.5_sL1/target_lvs.spice new file mode 100644 index 00000000..3c717231 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW0.5_sL1/target_lvs.spice @@ -0,0 +1,14 @@ +.subckt C06_gf180_sW0.5_sL1 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 +MM1_f0 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=0.56u +MM1_f1 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=0.56u +MM1_f2 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=0.56u +MM1_f3 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=0.56u +MM2_f0 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f1 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f2 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f3 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM3_f0 net9 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f1 net9 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM4_f0 VOUT1 VB1 net9 VSS nfet_03v3 w=0.5u l=0.56u +MM4_f1 VOUT1 VB1 net9 VSS nfet_03v3 w=0.5u l=0.56u +.ends C06_gf180_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C06/gf180/sW0.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW0.5_sL1/testbench.spice new file mode 100644 index 00000000..7dfcddc1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW0.5_sL1/testbench.spice @@ -0,0 +1,31 @@ +X1 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 C06_gf180_sW0.5_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +MB_VB1 VB1 VB1 VSS VSS nfet_03v3 w=1u l=0.56u +IB_VB1 VDDB VB1 8e-05 +MB_VB2 VB2 VB2 VDDB VDDB pfet_03v3 w=2u l=0.56u +IB_VB2 VB2 VSS 8e-05 +MB_VB3 VB3 VB3 VDDB VDDB pfet_03v3 w=2u l=0.56u +IB_VB3 VB3 VSS 2e-05 +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C06/gf180/sW0.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW0.5_sL2/case.json new file mode 100644 index 00000000..f9a3dd92 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW0.5_sL2/case.json @@ -0,0 +1,163 @@ +{ + "case_id": "C06_gf180_sW0.5_sL2", + "circuit_id": "C06", + "pdk": "gf180", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "dut_name": "C06_gf180_sW0.5_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1", + "VB2", + "VB3" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 1.12, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 1.12, + "nf": 4 + }, + "M3": { + "w": 1.0, + "l": 1.12, + "nf": 2 + }, + "M4": { + "w": 1.0, + "l": 1.12, + "nf": 2 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M4", + "current": 2e-05, + "kind": "cascode" + }, + "VB2": { + "replica": "M1", + "current": 2e-05, + "kind": "cascode" + }, + "VB3": { + "replica": "M2", + "current": 2e-05 + } + }, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.12, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.12, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "3e91ef5ed8d080a5", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M4", + "current_A": 2e-05, + "variant": "cascode" + }, + { + "kind": "replica_bias", + "port": "VB2", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "cascode" + }, + { + "kind": "replica_bias", + "port": "VB3", + "replica_of": "M2", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/gf180/sW0.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW0.5_sL2/manifest.json new file mode 100644 index 00000000..0cf0b226 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW0.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "4ad6afaaf00f0d0943878e2acedb774cc72193a157d6efb7de4679908f27b382", + "qualification.json": "ec448432b622922865f7eed0ceed5749e1ff97c24666b49b902f0f14e077c250", + "specs.json": "fbf0d7a7e445bd44dbc682d465571094c83dd428fe303ff626c2ca5941770c2b", + "target.spice": "48c2fc1e67da74e8949c95e5305005e6faaf7ad76543e8d41db98bfb29cf9f22", + "target_lvs.spice": "b607ee6134484f09467860e2911b3b06ba7a0e1799a59e60e98eb34dbc31817e", + "testbench.spice": "2ffd8133920f64815889db4df8ced579af3936f970d65148fcc37e9a8a6bcac7" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/gf180/sW0.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW0.5_sL2/qualification.json new file mode 100644 index 00000000..7778c9f5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW0.5_sL2/qualification.json @@ -0,0 +1,107 @@ +{ + "case_id": "C06_gf180_sW0.5_sL2", + "circuit_id": "C06", + "pdk": "gf180", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "single", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.12, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.12, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "3e91ef5ed8d080a5", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 54.27 + }, + "f3db": { + "min": 100000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 57.26683, + "f3db": 109227.1 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vout0": 1.294706, + "vin0": 1.294706, + "idd": 1.979704e-05, + "gain_lf": 57.26683, + "f3db": 109227.1, + "ugf": 79918480.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/gf180/sW0.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW0.5_sL2/specs.json new file mode 100644 index 00000000..47eff1d2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW0.5_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 54.27 + }, + "f3db": { + "min": 100000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 57.26683, + "f3db": 109227.1 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/gf180/sW0.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW0.5_sL2/target.spice new file mode 100644 index 00000000..43cb0527 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW0.5_sL2/target.spice @@ -0,0 +1,6 @@ +.subckt C06_gf180_sW0.5_sL2 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 +MM1 VOUT1 VB2 net10 VDD pfet_03v3 w=2u l=1.12u nf=4 m=1 +MM2 net10 VB3 VDD VDD pfet_03v3 w=2u l=1.12u nf=4 m=1 +MM3 net9 VIN1 VSS VSS nfet_03v3 w=1u l=1.12u nf=2 m=1 +MM4 VOUT1 VB1 net9 VSS nfet_03v3 w=1u l=1.12u nf=2 m=1 +.ends C06_gf180_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C06/gf180/sW0.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW0.5_sL2/target_lvs.spice new file mode 100644 index 00000000..8ff02229 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW0.5_sL2/target_lvs.spice @@ -0,0 +1,14 @@ +.subckt C06_gf180_sW0.5_sL2 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 +MM1_f0 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=1.12u +MM1_f1 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=1.12u +MM1_f2 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=1.12u +MM1_f3 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=1.12u +MM2_f0 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f1 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f2 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f3 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM3_f0 net9 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f1 net9 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM4_f0 VOUT1 VB1 net9 VSS nfet_03v3 w=0.5u l=1.12u +MM4_f1 VOUT1 VB1 net9 VSS nfet_03v3 w=0.5u l=1.12u +.ends C06_gf180_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C06/gf180/sW0.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW0.5_sL2/testbench.spice new file mode 100644 index 00000000..c45e488b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW0.5_sL2/testbench.spice @@ -0,0 +1,31 @@ +X1 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 C06_gf180_sW0.5_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +MB_VB1 VB1 VB1 VSS VSS nfet_03v3 w=1u l=1.12u +IB_VB1 VDDB VB1 8e-05 +MB_VB2 VB2 VB2 VDDB VDDB pfet_03v3 w=2u l=1.12u +IB_VB2 VB2 VSS 8e-05 +MB_VB3 VB3 VB3 VDDB VDDB pfet_03v3 w=2u l=1.12u +IB_VB3 VB3 VSS 2e-05 +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1.5_sL1.5/case.json new file mode 100644 index 00000000..bd70d88d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1.5_sL1.5/case.json @@ -0,0 +1,163 @@ +{ + "case_id": "C06_gf180_sW1.5_sL1.5", + "circuit_id": "C06", + "pdk": "gf180", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "dut_name": "C06_gf180_sW1.5_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1", + "VB2", + "VB3" + ], + "sizing": { + "M1": { + "w": 6.0, + "l": 0.84, + "nf": 12 + }, + "M2": { + "w": 6.0, + "l": 0.84, + "nf": 12 + }, + "M3": { + "w": 3.0, + "l": 0.84, + "nf": 6 + }, + "M4": { + "w": 3.0, + "l": 0.84, + "nf": 6 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M4", + "current": 2e-05, + "kind": "cascode" + }, + "VB2": { + "replica": "M1", + "current": 2e-05, + "kind": "cascode" + }, + "VB3": { + "replica": "M2", + "current": 2e-05 + } + }, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.84, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.84, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "edb15c0901c45b69", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M4", + "current_A": 2e-05, + "variant": "cascode" + }, + { + "kind": "replica_bias", + "port": "VB2", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "cascode" + }, + { + "kind": "replica_bias", + "port": "VB3", + "replica_of": "M2", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1.5_sL1.5/manifest.json new file mode 100644 index 00000000..51591ac4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "e6b90ba3e9865f8e6e81e76a2cb68351ce76fcc8edbefe108207d4b4ec92eb61", + "qualification.json": "302535d092e1aa4169840c686ae6a36d6e8999b6b0c95ec83f1a2775c52c4113", + "specs.json": "ac078fe913261349a06c471420a44276f2e8f20385ab4d620f7a88f679a97c09", + "target.spice": "c10a9eeea71fdfad7c327333ab2f5ded31dad35c5f40621bd82d0171b140341f", + "target_lvs.spice": "d4773bb9e57bb84050926672b507110952badc3efb3e923a3d02c4882d4bbf93", + "testbench.spice": "a7ec13a3d6183cb7b85fdc1b20ad1f1632ec7fbecd15253291cab79a5068b8ba" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1.5_sL1.5/qualification.json new file mode 100644 index 00000000..4c34dfd6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1.5_sL1.5/qualification.json @@ -0,0 +1,107 @@ +{ + "case_id": "C06_gf180_sW1.5_sL1.5", + "circuit_id": "C06", + "pdk": "gf180", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "single", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.84, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.84, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "edb15c0901c45b69", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 53.84 + }, + "f3db": { + "min": 111100.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 56.83854, + "f3db": 185121.9 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vout0": 0.9575607, + "vin0": 0.9575607, + "idd": 1.891868e-05, + "gain_lf": 56.83854, + "f3db": 185121.9, + "ugf": 128931800.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1.5_sL1.5/specs.json new file mode 100644 index 00000000..a8e77945 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1.5_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 53.84 + }, + "f3db": { + "min": 111100.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 56.83854, + "f3db": 185121.9 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1.5_sL1.5/target.spice new file mode 100644 index 00000000..da9c76b4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1.5_sL1.5/target.spice @@ -0,0 +1,6 @@ +.subckt C06_gf180_sW1.5_sL1.5 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 +MM1 VOUT1 VB2 net10 VDD pfet_03v3 w=6u l=0.84u nf=12 m=1 +MM2 net10 VB3 VDD VDD pfet_03v3 w=6u l=0.84u nf=12 m=1 +MM3 net9 VIN1 VSS VSS nfet_03v3 w=3u l=0.84u nf=6 m=1 +MM4 VOUT1 VB1 net9 VSS nfet_03v3 w=3u l=0.84u nf=6 m=1 +.ends C06_gf180_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..21550b5d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1.5_sL1.5/target_lvs.spice @@ -0,0 +1,38 @@ +.subckt C06_gf180_sW1.5_sL1.5 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 +MM1_f0 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=0.84u +MM1_f1 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=0.84u +MM1_f2 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=0.84u +MM1_f3 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=0.84u +MM1_f4 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=0.84u +MM1_f5 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=0.84u +MM1_f6 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=0.84u +MM1_f7 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=0.84u +MM1_f8 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=0.84u +MM1_f9 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=0.84u +MM1_f10 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=0.84u +MM1_f11 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=0.84u +MM2_f0 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f1 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f2 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f3 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f4 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f5 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f6 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f7 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f8 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f9 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f10 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f11 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM3_f0 net9 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f1 net9 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f2 net9 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f3 net9 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f4 net9 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f5 net9 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM4_f0 VOUT1 VB1 net9 VSS nfet_03v3 w=0.5u l=0.84u +MM4_f1 VOUT1 VB1 net9 VSS nfet_03v3 w=0.5u l=0.84u +MM4_f2 VOUT1 VB1 net9 VSS nfet_03v3 w=0.5u l=0.84u +MM4_f3 VOUT1 VB1 net9 VSS nfet_03v3 w=0.5u l=0.84u +MM4_f4 VOUT1 VB1 net9 VSS nfet_03v3 w=0.5u l=0.84u +MM4_f5 VOUT1 VB1 net9 VSS nfet_03v3 w=0.5u l=0.84u +.ends C06_gf180_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1.5_sL1.5/testbench.spice new file mode 100644 index 00000000..d979aae2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1.5_sL1.5/testbench.spice @@ -0,0 +1,31 @@ +X1 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 C06_gf180_sW1.5_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +MB_VB1 VB1 VB1 VSS VSS nfet_03v3 w=3u l=0.84u +IB_VB1 VDDB VB1 8e-05 +MB_VB2 VB2 VB2 VDDB VDDB pfet_03v3 w=6u l=0.84u +IB_VB2 VB2 VSS 8e-05 +MB_VB3 VB3 VB3 VDDB VDDB pfet_03v3 w=6u l=0.84u +IB_VB3 VB3 VSS 2e-05 +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1.5_sL1/case.json new file mode 100644 index 00000000..c82b7518 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1.5_sL1/case.json @@ -0,0 +1,163 @@ +{ + "case_id": "C06_gf180_sW1.5_sL1", + "circuit_id": "C06", + "pdk": "gf180", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "dut_name": "C06_gf180_sW1.5_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1", + "VB2", + "VB3" + ], + "sizing": { + "M1": { + "w": 6.0, + "l": 0.56, + "nf": 12 + }, + "M2": { + "w": 6.0, + "l": 0.56, + "nf": 12 + }, + "M3": { + "w": 3.0, + "l": 0.56, + "nf": 6 + }, + "M4": { + "w": 3.0, + "l": 0.56, + "nf": 6 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M4", + "current": 2e-05, + "kind": "cascode" + }, + "VB2": { + "replica": "M1", + "current": 2e-05, + "kind": "cascode" + }, + "VB3": { + "replica": "M2", + "current": 2e-05 + } + }, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.56, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.56, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "dd2d433e7113c6a1", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M4", + "current_A": 2e-05, + "variant": "cascode" + }, + { + "kind": "replica_bias", + "port": "VB2", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "cascode" + }, + { + "kind": "replica_bias", + "port": "VB3", + "replica_of": "M2", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1.5_sL1/manifest.json new file mode 100644 index 00000000..8362b94c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "21eb834ef56bcf0f0ebbd9d75e69aa557954a3ab05585d0328ec631d3a83fd60", + "qualification.json": "0d8fd5a2d13a3b71137273b67bf2cbecbc5a90480273f3e7434e5d4733bc4f1b", + "specs.json": "6930cc22a64a0532b1ccb8ee28077bac66807ace9e17587a1d2eceb0cf780254", + "target.spice": "4a0d38d88cdb444ac11fa63ce755f298e4302eb59bb4d32d8126a3717135d1b7", + "target_lvs.spice": "4a21b8a859e81c1af36f12e494059be4496e628ed1a5382ccd910b79c8c526a7", + "testbench.spice": "dbe71d325847d8d276ff8f5767515a65b876c3862275247ad76b04de29e6b58d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1.5_sL1/qualification.json new file mode 100644 index 00000000..7c550c38 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1.5_sL1/qualification.json @@ -0,0 +1,107 @@ +{ + "case_id": "C06_gf180_sW1.5_sL1", + "circuit_id": "C06", + "pdk": "gf180", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "single", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.56, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.56, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "dd2d433e7113c6a1", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 49.87 + }, + "f3db": { + "min": 208700.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 52.86996, + "f3db": 347908.6 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vout0": 0.9005459, + "vin0": 0.9005459, + "idd": 1.894019e-05, + "gain_lf": 52.86996, + "f3db": 347908.6, + "ugf": 153526800.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1.5_sL1/specs.json new file mode 100644 index 00000000..1f74df23 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1.5_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 49.87 + }, + "f3db": { + "min": 208700.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 52.86996, + "f3db": 347908.6 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1.5_sL1/target.spice new file mode 100644 index 00000000..50c28f6b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1.5_sL1/target.spice @@ -0,0 +1,6 @@ +.subckt C06_gf180_sW1.5_sL1 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 +MM1 VOUT1 VB2 net10 VDD pfet_03v3 w=6u l=0.56u nf=12 m=1 +MM2 net10 VB3 VDD VDD pfet_03v3 w=6u l=0.56u nf=12 m=1 +MM3 net9 VIN1 VSS VSS nfet_03v3 w=3u l=0.56u nf=6 m=1 +MM4 VOUT1 VB1 net9 VSS nfet_03v3 w=3u l=0.56u nf=6 m=1 +.ends C06_gf180_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1.5_sL1/target_lvs.spice new file mode 100644 index 00000000..ef550c71 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1.5_sL1/target_lvs.spice @@ -0,0 +1,38 @@ +.subckt C06_gf180_sW1.5_sL1 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 +MM1_f0 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=0.56u +MM1_f1 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=0.56u +MM1_f2 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=0.56u +MM1_f3 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=0.56u +MM1_f4 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=0.56u +MM1_f5 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=0.56u +MM1_f6 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=0.56u +MM1_f7 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=0.56u +MM1_f8 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=0.56u +MM1_f9 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=0.56u +MM1_f10 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=0.56u +MM1_f11 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=0.56u +MM2_f0 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f1 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f2 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f3 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f4 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f5 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f6 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f7 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f8 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f9 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f10 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f11 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM3_f0 net9 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f1 net9 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f2 net9 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f3 net9 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f4 net9 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f5 net9 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM4_f0 VOUT1 VB1 net9 VSS nfet_03v3 w=0.5u l=0.56u +MM4_f1 VOUT1 VB1 net9 VSS nfet_03v3 w=0.5u l=0.56u +MM4_f2 VOUT1 VB1 net9 VSS nfet_03v3 w=0.5u l=0.56u +MM4_f3 VOUT1 VB1 net9 VSS nfet_03v3 w=0.5u l=0.56u +MM4_f4 VOUT1 VB1 net9 VSS nfet_03v3 w=0.5u l=0.56u +MM4_f5 VOUT1 VB1 net9 VSS nfet_03v3 w=0.5u l=0.56u +.ends C06_gf180_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1.5_sL1/testbench.spice new file mode 100644 index 00000000..4c87937c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1.5_sL1/testbench.spice @@ -0,0 +1,31 @@ +X1 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 C06_gf180_sW1.5_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +MB_VB1 VB1 VB1 VSS VSS nfet_03v3 w=3u l=0.56u +IB_VB1 VDDB VB1 8e-05 +MB_VB2 VB2 VB2 VDDB VDDB pfet_03v3 w=6u l=0.56u +IB_VB2 VB2 VSS 8e-05 +MB_VB3 VB3 VB3 VDDB VDDB pfet_03v3 w=6u l=0.56u +IB_VB3 VB3 VSS 2e-05 +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1.5_sL2/case.json new file mode 100644 index 00000000..214cf547 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1.5_sL2/case.json @@ -0,0 +1,163 @@ +{ + "case_id": "C06_gf180_sW1.5_sL2", + "circuit_id": "C06", + "pdk": "gf180", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "dut_name": "C06_gf180_sW1.5_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1", + "VB2", + "VB3" + ], + "sizing": { + "M1": { + "w": 6.0, + "l": 1.12, + "nf": 12 + }, + "M2": { + "w": 6.0, + "l": 1.12, + "nf": 12 + }, + "M3": { + "w": 3.0, + "l": 1.12, + "nf": 6 + }, + "M4": { + "w": 3.0, + "l": 1.12, + "nf": 6 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M4", + "current": 2e-05, + "kind": "cascode" + }, + "VB2": { + "replica": "M1", + "current": 2e-05, + "kind": "cascode" + }, + "VB3": { + "replica": "M2", + "current": 2e-05 + } + }, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.12, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.12, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "bf7895c3dd71f8b0", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M4", + "current_A": 2e-05, + "variant": "cascode" + }, + { + "kind": "replica_bias", + "port": "VB2", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "cascode" + }, + { + "kind": "replica_bias", + "port": "VB3", + "replica_of": "M2", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1.5_sL2/manifest.json new file mode 100644 index 00000000..20eb728f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "3cdcd6a99b75ce050c9c59a032279144483f23c5f73728614e23c36dfc27470a", + "qualification.json": "bdf86793b3e73349d292f964b5c79230a535ed39889d669e8a596fb989ef1777", + "specs.json": "99f83ce9a69bae846c462e9daf7d5e3e6f1121124d5e644ed87bf17743752daa", + "target.spice": "02691026bb9064299c8fbb25547beecddab5f7489fe825db711d506e738b6490", + "target_lvs.spice": "4c4823b2aefcf33a3b888e192bd3798f218c11c1533195f9378f5a501f18a4fb", + "testbench.spice": "3c64fe961a15d4b8ea5d9d7172bd47deab568182d3ed8de8a79ef3ba2d5cbf2f" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1.5_sL2/qualification.json new file mode 100644 index 00000000..da6f21b6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1.5_sL2/qualification.json @@ -0,0 +1,107 @@ +{ + "case_id": "C06_gf180_sW1.5_sL2", + "circuit_id": "C06", + "pdk": "gf180", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "single", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.12, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.12, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "bf7895c3dd71f8b0", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 55.59 + }, + "f3db": { + "min": 100000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 58.5935, + "f3db": 132664.1 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vout0": 1.008382, + "vin0": 1.008382, + "idd": 1.907116e-05, + "gain_lf": 58.5935, + "f3db": 132664.1, + "ugf": 112980300.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1.5_sL2/specs.json new file mode 100644 index 00000000..2cab9509 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1.5_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 55.59 + }, + "f3db": { + "min": 100000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 58.5935, + "f3db": 132664.1 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1.5_sL2/target.spice new file mode 100644 index 00000000..a43996a5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1.5_sL2/target.spice @@ -0,0 +1,6 @@ +.subckt C06_gf180_sW1.5_sL2 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 +MM1 VOUT1 VB2 net10 VDD pfet_03v3 w=6u l=1.12u nf=12 m=1 +MM2 net10 VB3 VDD VDD pfet_03v3 w=6u l=1.12u nf=12 m=1 +MM3 net9 VIN1 VSS VSS nfet_03v3 w=3u l=1.12u nf=6 m=1 +MM4 VOUT1 VB1 net9 VSS nfet_03v3 w=3u l=1.12u nf=6 m=1 +.ends C06_gf180_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1.5_sL2/target_lvs.spice new file mode 100644 index 00000000..b31fc761 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1.5_sL2/target_lvs.spice @@ -0,0 +1,38 @@ +.subckt C06_gf180_sW1.5_sL2 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 +MM1_f0 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=1.12u +MM1_f1 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=1.12u +MM1_f2 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=1.12u +MM1_f3 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=1.12u +MM1_f4 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=1.12u +MM1_f5 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=1.12u +MM1_f6 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=1.12u +MM1_f7 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=1.12u +MM1_f8 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=1.12u +MM1_f9 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=1.12u +MM1_f10 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=1.12u +MM1_f11 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=1.12u +MM2_f0 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f1 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f2 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f3 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f4 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f5 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f6 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f7 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f8 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f9 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f10 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f11 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM3_f0 net9 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f1 net9 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f2 net9 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f3 net9 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f4 net9 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f5 net9 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM4_f0 VOUT1 VB1 net9 VSS nfet_03v3 w=0.5u l=1.12u +MM4_f1 VOUT1 VB1 net9 VSS nfet_03v3 w=0.5u l=1.12u +MM4_f2 VOUT1 VB1 net9 VSS nfet_03v3 w=0.5u l=1.12u +MM4_f3 VOUT1 VB1 net9 VSS nfet_03v3 w=0.5u l=1.12u +MM4_f4 VOUT1 VB1 net9 VSS nfet_03v3 w=0.5u l=1.12u +MM4_f5 VOUT1 VB1 net9 VSS nfet_03v3 w=0.5u l=1.12u +.ends C06_gf180_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1.5_sL2/testbench.spice new file mode 100644 index 00000000..93e5706e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1.5_sL2/testbench.spice @@ -0,0 +1,31 @@ +X1 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 C06_gf180_sW1.5_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +MB_VB1 VB1 VB1 VSS VSS nfet_03v3 w=3u l=1.12u +IB_VB1 VDDB VB1 8e-05 +MB_VB2 VB2 VB2 VDDB VDDB pfet_03v3 w=6u l=1.12u +IB_VB2 VB2 VSS 8e-05 +MB_VB3 VB3 VB3 VDDB VDDB pfet_03v3 w=6u l=1.12u +IB_VB3 VB3 VSS 2e-05 +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1_sL1.5/case.json new file mode 100644 index 00000000..b585b863 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1_sL1.5/case.json @@ -0,0 +1,163 @@ +{ + "case_id": "C06_gf180_sW1_sL1.5", + "circuit_id": "C06", + "pdk": "gf180", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "dut_name": "C06_gf180_sW1_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1", + "VB2", + "VB3" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.84, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 0.84, + "nf": 8 + }, + "M3": { + "w": 2.0, + "l": 0.84, + "nf": 4 + }, + "M4": { + "w": 2.0, + "l": 0.84, + "nf": 4 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M4", + "current": 2e-05, + "kind": "cascode" + }, + "VB2": { + "replica": "M1", + "current": 2e-05, + "kind": "cascode" + }, + "VB3": { + "replica": "M2", + "current": 2e-05 + } + }, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "b79e403cdffeb3b6", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M4", + "current_A": 2e-05, + "variant": "cascode" + }, + { + "kind": "replica_bias", + "port": "VB2", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "cascode" + }, + { + "kind": "replica_bias", + "port": "VB3", + "replica_of": "M2", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1_sL1.5/manifest.json new file mode 100644 index 00000000..e0d91e7f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "94534a4676bfa3cc9b930c9a3a405346834f7a6dc2f7f9a6ab4f907c986100c9", + "qualification.json": "286eb71fc829d4f3145e8fbba23b53851fd5299d1d475010d4e857a67d0c98a9", + "specs.json": "3845a7e3847fe338c135770cf2a57997a45add20c42bc70842f0100eb3ae6348", + "target.spice": "cfa24d80196ca58cda55248b51f3d8087b6d3f4e97460250fae90ec2421c1143", + "target_lvs.spice": "86b9eb1ae406cabe973089b80e53b5812c2cbf6b202e261a42d21cd40740b09f", + "testbench.spice": "2e2780984fac2d5e979e09d18e29c250acdb8d7cb9afaf45a93b4e74679e59e8" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1_sL1.5/qualification.json new file mode 100644 index 00000000..8aad3ad0 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1_sL1.5/qualification.json @@ -0,0 +1,107 @@ +{ + "case_id": "C06_gf180_sW1_sL1.5", + "circuit_id": "C06", + "pdk": "gf180", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "single", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "b79e403cdffeb3b6", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 54.27 + }, + "f3db": { + "min": 100000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 57.27059, + "f3db": 157449.1 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vout0": 1.029786, + "vin0": 1.029786, + "idd": 1.903041e-05, + "gain_lf": 57.27059, + "f3db": 157449.1, + "ugf": 115321000.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1_sL1.5/specs.json new file mode 100644 index 00000000..37800df4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 54.27 + }, + "f3db": { + "min": 100000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 57.27059, + "f3db": 157449.1 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1_sL1.5/target.spice new file mode 100644 index 00000000..7134dcfd --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1_sL1.5/target.spice @@ -0,0 +1,6 @@ +.subckt C06_gf180_sW1_sL1.5 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 +MM1 VOUT1 VB2 net10 VDD pfet_03v3 w=4u l=0.84u nf=8 m=1 +MM2 net10 VB3 VDD VDD pfet_03v3 w=4u l=0.84u nf=8 m=1 +MM3 net9 VIN1 VSS VSS nfet_03v3 w=2u l=0.84u nf=4 m=1 +MM4 VOUT1 VB1 net9 VSS nfet_03v3 w=2u l=0.84u nf=4 m=1 +.ends C06_gf180_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1_sL1.5/target_lvs.spice new file mode 100644 index 00000000..18233c30 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1_sL1.5/target_lvs.spice @@ -0,0 +1,26 @@ +.subckt C06_gf180_sW1_sL1.5 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 +MM1_f0 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=0.84u +MM1_f1 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=0.84u +MM1_f2 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=0.84u +MM1_f3 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=0.84u +MM1_f4 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=0.84u +MM1_f5 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=0.84u +MM1_f6 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=0.84u +MM1_f7 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=0.84u +MM2_f0 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f1 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f2 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f3 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f4 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f5 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f6 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f7 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM3_f0 net9 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f1 net9 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f2 net9 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f3 net9 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM4_f0 VOUT1 VB1 net9 VSS nfet_03v3 w=0.5u l=0.84u +MM4_f1 VOUT1 VB1 net9 VSS nfet_03v3 w=0.5u l=0.84u +MM4_f2 VOUT1 VB1 net9 VSS nfet_03v3 w=0.5u l=0.84u +MM4_f3 VOUT1 VB1 net9 VSS nfet_03v3 w=0.5u l=0.84u +.ends C06_gf180_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1_sL1.5/testbench.spice new file mode 100644 index 00000000..6d67f4b0 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1_sL1.5/testbench.spice @@ -0,0 +1,31 @@ +X1 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 C06_gf180_sW1_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +MB_VB1 VB1 VB1 VSS VSS nfet_03v3 w=2u l=0.84u +IB_VB1 VDDB VB1 8e-05 +MB_VB2 VB2 VB2 VDDB VDDB pfet_03v3 w=4u l=0.84u +IB_VB2 VB2 VSS 8e-05 +MB_VB3 VB3 VB3 VDDB VDDB pfet_03v3 w=4u l=0.84u +IB_VB3 VB3 VSS 2e-05 +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1_sL1/case.json new file mode 100644 index 00000000..b1f3a07f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1_sL1/case.json @@ -0,0 +1,163 @@ +{ + "case_id": "C06_gf180_sW1_sL1", + "circuit_id": "C06", + "pdk": "gf180", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "dut_name": "C06_gf180_sW1_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1", + "VB2", + "VB3" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "M3": { + "w": 2.0, + "l": 0.56, + "nf": 4 + }, + "M4": { + "w": 2.0, + "l": 0.56, + "nf": 4 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M4", + "current": 2e-05, + "kind": "cascode" + }, + "VB2": { + "replica": "M1", + "current": 2e-05, + "kind": "cascode" + }, + "VB3": { + "replica": "M2", + "current": 2e-05 + } + }, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "7b3650aef46077cb", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M4", + "current_A": 2e-05, + "variant": "cascode" + }, + { + "kind": "replica_bias", + "port": "VB2", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "cascode" + }, + { + "kind": "replica_bias", + "port": "VB3", + "replica_of": "M2", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1_sL1/manifest.json new file mode 100644 index 00000000..9107f253 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "7215a8e53640666096f8bcfba33d1b342999d5cf361bd080fdee2c81d108bf20", + "qualification.json": "71658198c8c8e995fff3f39cc8d636e5bb7f5753bd94382407ccb4c28a77d665", + "specs.json": "c6d676b5fe797786f6f7a3654a6eaa5869c65b9d88ee01abb7289348cd5d9eaf", + "target.spice": "3402dd5a92a70a8d8571dec8cddd4c054aeca88b4f2ca9552b4e55d3b3f01288", + "target_lvs.spice": "2ca579cbf5723ab691f1c34ffb9dfa461d69cdd8ba7d416ac88dac66994e5132", + "testbench.spice": "e468358c1b24cda5297f6d22df6c2c14d918315d13f66e89f4b6e9626e7b2cf7" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1_sL1/qualification.json new file mode 100644 index 00000000..f3f6671e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1_sL1/qualification.json @@ -0,0 +1,107 @@ +{ + "case_id": "C06_gf180_sW1_sL1", + "circuit_id": "C06", + "pdk": "gf180", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "single", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "7b3650aef46077cb", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 50.27 + }, + "f3db": { + "min": 176900.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 53.27176, + "f3db": 294878.4 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vout0": 0.957582, + "vin0": 0.957582, + "idd": 1.884774e-05, + "gain_lf": 53.27176, + "f3db": 294878.4, + "ugf": 136348000.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1_sL1/specs.json new file mode 100644 index 00000000..7794c482 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 50.27 + }, + "f3db": { + "min": 176900.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 53.27176, + "f3db": 294878.4 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1_sL1/target.spice new file mode 100644 index 00000000..3c6fbe81 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1_sL1/target.spice @@ -0,0 +1,6 @@ +.subckt C06_gf180_sW1_sL1 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 +MM1 VOUT1 VB2 net10 VDD pfet_03v3 w=4u l=0.56u nf=8 m=1 +MM2 net10 VB3 VDD VDD pfet_03v3 w=4u l=0.56u nf=8 m=1 +MM3 net9 VIN1 VSS VSS nfet_03v3 w=2u l=0.56u nf=4 m=1 +MM4 VOUT1 VB1 net9 VSS nfet_03v3 w=2u l=0.56u nf=4 m=1 +.ends C06_gf180_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1_sL1/target_lvs.spice new file mode 100644 index 00000000..4ed893c5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1_sL1/target_lvs.spice @@ -0,0 +1,26 @@ +.subckt C06_gf180_sW1_sL1 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 +MM1_f0 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=0.56u +MM1_f1 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=0.56u +MM1_f2 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=0.56u +MM1_f3 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=0.56u +MM1_f4 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=0.56u +MM1_f5 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=0.56u +MM1_f6 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=0.56u +MM1_f7 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=0.56u +MM2_f0 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f1 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f2 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f3 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f4 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f5 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f6 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f7 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM3_f0 net9 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f1 net9 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f2 net9 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f3 net9 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM4_f0 VOUT1 VB1 net9 VSS nfet_03v3 w=0.5u l=0.56u +MM4_f1 VOUT1 VB1 net9 VSS nfet_03v3 w=0.5u l=0.56u +MM4_f2 VOUT1 VB1 net9 VSS nfet_03v3 w=0.5u l=0.56u +MM4_f3 VOUT1 VB1 net9 VSS nfet_03v3 w=0.5u l=0.56u +.ends C06_gf180_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1_sL1/testbench.spice new file mode 100644 index 00000000..f3fa76e6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1_sL1/testbench.spice @@ -0,0 +1,31 @@ +X1 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 C06_gf180_sW1_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +MB_VB1 VB1 VB1 VSS VSS nfet_03v3 w=2u l=0.56u +IB_VB1 VDDB VB1 8e-05 +MB_VB2 VB2 VB2 VDDB VDDB pfet_03v3 w=4u l=0.56u +IB_VB2 VB2 VSS 8e-05 +MB_VB3 VB3 VB3 VDDB VDDB pfet_03v3 w=4u l=0.56u +IB_VB3 VB3 VSS 2e-05 +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1_sL2/case.json new file mode 100644 index 00000000..03b9e95d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1_sL2/case.json @@ -0,0 +1,163 @@ +{ + "case_id": "C06_gf180_sW1_sL2", + "circuit_id": "C06", + "pdk": "gf180", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "dut_name": "C06_gf180_sW1_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1", + "VB2", + "VB3" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 1.12, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 1.12, + "nf": 8 + }, + "M3": { + "w": 2.0, + "l": 1.12, + "nf": 4 + }, + "M4": { + "w": 2.0, + "l": 1.12, + "nf": 4 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M4", + "current": 2e-05, + "kind": "cascode" + }, + "VB2": { + "replica": "M1", + "current": 2e-05, + "kind": "cascode" + }, + "VB3": { + "replica": "M2", + "current": 2e-05 + } + }, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "ac0492233c8a0173", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M4", + "current_A": 2e-05, + "variant": "cascode" + }, + { + "kind": "replica_bias", + "port": "VB2", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "cascode" + }, + { + "kind": "replica_bias", + "port": "VB3", + "replica_of": "M2", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1_sL2/manifest.json new file mode 100644 index 00000000..dc73f964 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "cb09492ed7b0ab418d9b0fbcc2a022aa3cb4590630ae9b1d490742130d3689c7", + "qualification.json": "68a0d35b756d3a07181bc2660fc60d1b1e12cb4e4c66528408169347dba5aafc", + "specs.json": "31d78c7ca3121ea52246c55c5feea226bd4e7a2caab6a15919a3219390fb2470", + "target.spice": "2cfe748dcc8552a5f28807d9dd6266092be599930d118b2413628186108b42c4", + "target_lvs.spice": "fd3babfc791c880084450324c47f334b56ccaf0b932bfc72fccd6e2b4a5d7141", + "testbench.spice": "64058f24753018c107bc283e5db6e10f24bc9c3b540f215904e07da0b51fba0e" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1_sL2/qualification.json new file mode 100644 index 00000000..a2cd3344 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1_sL2/qualification.json @@ -0,0 +1,107 @@ +{ + "case_id": "C06_gf180_sW1_sL2", + "circuit_id": "C06", + "pdk": "gf180", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "single", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "ac0492233c8a0173", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 56.04 + }, + "f3db": { + "min": 100000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 59.03807, + "f3db": 113210.2 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vout0": 1.093088, + "vin0": 1.093088, + "idd": 1.925956e-05, + "gain_lf": 59.03807, + "f3db": 113210.2, + "ugf": 101564500.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1_sL2/specs.json new file mode 100644 index 00000000..5a50a81e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 56.04 + }, + "f3db": { + "min": 100000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 59.03807, + "f3db": 113210.2 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1_sL2/target.spice new file mode 100644 index 00000000..e7fb44b7 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1_sL2/target.spice @@ -0,0 +1,6 @@ +.subckt C06_gf180_sW1_sL2 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 +MM1 VOUT1 VB2 net10 VDD pfet_03v3 w=4u l=1.12u nf=8 m=1 +MM2 net10 VB3 VDD VDD pfet_03v3 w=4u l=1.12u nf=8 m=1 +MM3 net9 VIN1 VSS VSS nfet_03v3 w=2u l=1.12u nf=4 m=1 +MM4 VOUT1 VB1 net9 VSS nfet_03v3 w=2u l=1.12u nf=4 m=1 +.ends C06_gf180_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1_sL2/target_lvs.spice new file mode 100644 index 00000000..5f58138a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1_sL2/target_lvs.spice @@ -0,0 +1,26 @@ +.subckt C06_gf180_sW1_sL2 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 +MM1_f0 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=1.12u +MM1_f1 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=1.12u +MM1_f2 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=1.12u +MM1_f3 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=1.12u +MM1_f4 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=1.12u +MM1_f5 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=1.12u +MM1_f6 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=1.12u +MM1_f7 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=1.12u +MM2_f0 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f1 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f2 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f3 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f4 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f5 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f6 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f7 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM3_f0 net9 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f1 net9 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f2 net9 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f3 net9 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM4_f0 VOUT1 VB1 net9 VSS nfet_03v3 w=0.5u l=1.12u +MM4_f1 VOUT1 VB1 net9 VSS nfet_03v3 w=0.5u l=1.12u +MM4_f2 VOUT1 VB1 net9 VSS nfet_03v3 w=0.5u l=1.12u +MM4_f3 VOUT1 VB1 net9 VSS nfet_03v3 w=0.5u l=1.12u +.ends C06_gf180_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1_sL2/testbench.spice new file mode 100644 index 00000000..b2deb4ba --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW1_sL2/testbench.spice @@ -0,0 +1,31 @@ +X1 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 C06_gf180_sW1_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +MB_VB1 VB1 VB1 VSS VSS nfet_03v3 w=2u l=1.12u +IB_VB1 VDDB VB1 8e-05 +MB_VB2 VB2 VB2 VDDB VDDB pfet_03v3 w=4u l=1.12u +IB_VB2 VB2 VSS 8e-05 +MB_VB3 VB3 VB3 VDDB VDDB pfet_03v3 w=4u l=1.12u +IB_VB3 VB3 VSS 2e-05 +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C06/gf180/sW2_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW2_sL1.5/case.json new file mode 100644 index 00000000..497279ab --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW2_sL1.5/case.json @@ -0,0 +1,163 @@ +{ + "case_id": "C06_gf180_sW2_sL1.5", + "circuit_id": "C06", + "pdk": "gf180", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "dut_name": "C06_gf180_sW2_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1", + "VB2", + "VB3" + ], + "sizing": { + "M1": { + "w": 8.0, + "l": 0.84, + "nf": 16 + }, + "M2": { + "w": 8.0, + "l": 0.84, + "nf": 16 + }, + "M3": { + "w": 4.0, + "l": 0.84, + "nf": 8 + }, + "M4": { + "w": 4.0, + "l": 0.84, + "nf": 8 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M4", + "current": 2e-05, + "kind": "cascode" + }, + "VB2": { + "replica": "M1", + "current": 2e-05, + "kind": "cascode" + }, + "VB3": { + "replica": "M2", + "current": 2e-05 + } + }, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "516eec9f3eae926c", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M4", + "current_A": 2e-05, + "variant": "cascode" + }, + { + "kind": "replica_bias", + "port": "VB2", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "cascode" + }, + { + "kind": "replica_bias", + "port": "VB3", + "replica_of": "M2", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/gf180/sW2_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW2_sL1.5/manifest.json new file mode 100644 index 00000000..c59c3376 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW2_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "f26071853d567c84a36a16da4c396db6584630628f124e87e3f293dddd9b7786", + "qualification.json": "e8615f6a4e21772fab87b898d24bc806966c4bd2aaa73289c64173d308d7062e", + "specs.json": "11603f309209b5ad7f9a0bf4f54834f74000d6f2e10fdf70fe132a01be8e46e8", + "target.spice": "9d6e243162f2535fc773ed0e083622886533eeeb42d34d63c0a43efcf1e3d971", + "target_lvs.spice": "904cb27a06be25e2686ca1298ae82238fa3cf4331c3818b82c77dc30ab1d667e", + "testbench.spice": "2786403e3beb289f70123aa83af2b2a0888941301b921c8de1f9cf9b9ea42604" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/gf180/sW2_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW2_sL1.5/qualification.json new file mode 100644 index 00000000..9f9c0049 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW2_sL1.5/qualification.json @@ -0,0 +1,107 @@ +{ + "case_id": "C06_gf180_sW2_sL1.5", + "circuit_id": "C06", + "pdk": "gf180", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "single", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "516eec9f3eae926c", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 53.71 + }, + "f3db": { + "min": 121600.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 56.70929, + "f3db": 202665.1 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vout0": 0.9148134, + "vin0": 0.9148134, + "idd": 1.889219e-05, + "gain_lf": 56.70929, + "f3db": 202665.1, + "ugf": 138947700.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/gf180/sW2_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW2_sL1.5/specs.json new file mode 100644 index 00000000..3aca3120 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW2_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 53.71 + }, + "f3db": { + "min": 121600.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 56.70929, + "f3db": 202665.1 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/gf180/sW2_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW2_sL1.5/target.spice new file mode 100644 index 00000000..37c59114 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW2_sL1.5/target.spice @@ -0,0 +1,6 @@ +.subckt C06_gf180_sW2_sL1.5 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 +MM1 VOUT1 VB2 net10 VDD pfet_03v3 w=8u l=0.84u nf=16 m=1 +MM2 net10 VB3 VDD VDD pfet_03v3 w=8u l=0.84u nf=16 m=1 +MM3 net9 VIN1 VSS VSS nfet_03v3 w=4u l=0.84u nf=8 m=1 +MM4 VOUT1 VB1 net9 VSS nfet_03v3 w=4u l=0.84u nf=8 m=1 +.ends C06_gf180_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C06/gf180/sW2_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW2_sL1.5/target_lvs.spice new file mode 100644 index 00000000..7c140342 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW2_sL1.5/target_lvs.spice @@ -0,0 +1,50 @@ +.subckt C06_gf180_sW2_sL1.5 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 +MM1_f0 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=0.84u +MM1_f1 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=0.84u +MM1_f2 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=0.84u +MM1_f3 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=0.84u +MM1_f4 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=0.84u +MM1_f5 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=0.84u +MM1_f6 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=0.84u +MM1_f7 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=0.84u +MM1_f8 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=0.84u +MM1_f9 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=0.84u +MM1_f10 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=0.84u +MM1_f11 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=0.84u +MM1_f12 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=0.84u +MM1_f13 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=0.84u +MM1_f14 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=0.84u +MM1_f15 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=0.84u +MM2_f0 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f1 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f2 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f3 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f4 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f5 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f6 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f7 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f8 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f9 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f10 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f11 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f12 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f13 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f14 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f15 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM3_f0 net9 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f1 net9 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f2 net9 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f3 net9 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f4 net9 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f5 net9 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f6 net9 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f7 net9 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM4_f0 VOUT1 VB1 net9 VSS nfet_03v3 w=0.5u l=0.84u +MM4_f1 VOUT1 VB1 net9 VSS nfet_03v3 w=0.5u l=0.84u +MM4_f2 VOUT1 VB1 net9 VSS nfet_03v3 w=0.5u l=0.84u +MM4_f3 VOUT1 VB1 net9 VSS nfet_03v3 w=0.5u l=0.84u +MM4_f4 VOUT1 VB1 net9 VSS nfet_03v3 w=0.5u l=0.84u +MM4_f5 VOUT1 VB1 net9 VSS nfet_03v3 w=0.5u l=0.84u +MM4_f6 VOUT1 VB1 net9 VSS nfet_03v3 w=0.5u l=0.84u +MM4_f7 VOUT1 VB1 net9 VSS nfet_03v3 w=0.5u l=0.84u +.ends C06_gf180_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C06/gf180/sW2_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW2_sL1.5/testbench.spice new file mode 100644 index 00000000..64808c27 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW2_sL1.5/testbench.spice @@ -0,0 +1,31 @@ +X1 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 C06_gf180_sW2_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +MB_VB1 VB1 VB1 VSS VSS nfet_03v3 w=4u l=0.84u +IB_VB1 VDDB VB1 8e-05 +MB_VB2 VB2 VB2 VDDB VDDB pfet_03v3 w=8u l=0.84u +IB_VB2 VB2 VSS 8e-05 +MB_VB3 VB3 VB3 VDDB VDDB pfet_03v3 w=8u l=0.84u +IB_VB3 VB3 VSS 2e-05 +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C06/gf180/sW2_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW2_sL1/case.json new file mode 100644 index 00000000..e1facba8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW2_sL1/case.json @@ -0,0 +1,163 @@ +{ + "case_id": "C06_gf180_sW2_sL1", + "circuit_id": "C06", + "pdk": "gf180", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "dut_name": "C06_gf180_sW2_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1", + "VB2", + "VB3" + ], + "sizing": { + "M1": { + "w": 8.0, + "l": 0.56, + "nf": 16 + }, + "M2": { + "w": 8.0, + "l": 0.56, + "nf": 16 + }, + "M3": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "M4": { + "w": 4.0, + "l": 0.56, + "nf": 8 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M4", + "current": 2e-05, + "kind": "cascode" + }, + "VB2": { + "replica": "M1", + "current": 2e-05, + "kind": "cascode" + }, + "VB3": { + "replica": "M2", + "current": 2e-05 + } + }, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "5222460009e30c42", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M4", + "current_A": 2e-05, + "variant": "cascode" + }, + { + "kind": "replica_bias", + "port": "VB2", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "cascode" + }, + { + "kind": "replica_bias", + "port": "VB3", + "replica_of": "M2", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/gf180/sW2_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW2_sL1/manifest.json new file mode 100644 index 00000000..831c0c51 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW2_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "4b0c1a90e0a283680f9659c50baee8b7e4b69c29a47bd3bf9a8a4a281817f5c8", + "qualification.json": "dbd9eca252651ea44534c9ee0af8ce8811431b7ce64b1878f29bb231024d75d7", + "specs.json": "7ebcbd7377a02e16e8d57e4771f0de5a514cd2a15a3b3a6fa97745a1f23e4ff1", + "target.spice": "9f0839b8e2af8d36ab33962e036a8d65049c3522763bde1e46a1a403ac12efc4", + "target_lvs.spice": "d6cbec169b328560251ce20794fb4abfe3d826b8ecb3fe1d24b898c092920f5a", + "testbench.spice": "97558694258bca8afac244c9fedb880379a07dcc62f460da77fb2162493572cf" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/gf180/sW2_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW2_sL1/qualification.json new file mode 100644 index 00000000..32e89fec --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW2_sL1/qualification.json @@ -0,0 +1,107 @@ +{ + "case_id": "C06_gf180_sW2_sL1", + "circuit_id": "C06", + "pdk": "gf180", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "single", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "5222460009e30c42", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 49.73 + }, + "f3db": { + "min": 229800.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 52.72692, + "f3db": 383023.0 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vout0": 0.8664278, + "vin0": 0.8664278, + "idd": 1.907915e-05, + "gain_lf": 52.72692, + "f3db": 383023.0, + "ugf": 166221300.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/gf180/sW2_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW2_sL1/specs.json new file mode 100644 index 00000000..ffff6599 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW2_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 49.73 + }, + "f3db": { + "min": 229800.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 52.72692, + "f3db": 383023.0 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/gf180/sW2_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW2_sL1/target.spice new file mode 100644 index 00000000..bddd1a4f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW2_sL1/target.spice @@ -0,0 +1,6 @@ +.subckt C06_gf180_sW2_sL1 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 +MM1 VOUT1 VB2 net10 VDD pfet_03v3 w=8u l=0.56u nf=16 m=1 +MM2 net10 VB3 VDD VDD pfet_03v3 w=8u l=0.56u nf=16 m=1 +MM3 net9 VIN1 VSS VSS nfet_03v3 w=4u l=0.56u nf=8 m=1 +MM4 VOUT1 VB1 net9 VSS nfet_03v3 w=4u l=0.56u nf=8 m=1 +.ends C06_gf180_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C06/gf180/sW2_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW2_sL1/target_lvs.spice new file mode 100644 index 00000000..0728f7cf --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW2_sL1/target_lvs.spice @@ -0,0 +1,50 @@ +.subckt C06_gf180_sW2_sL1 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 +MM1_f0 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=0.56u +MM1_f1 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=0.56u +MM1_f2 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=0.56u +MM1_f3 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=0.56u +MM1_f4 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=0.56u +MM1_f5 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=0.56u +MM1_f6 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=0.56u +MM1_f7 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=0.56u +MM1_f8 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=0.56u +MM1_f9 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=0.56u +MM1_f10 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=0.56u +MM1_f11 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=0.56u +MM1_f12 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=0.56u +MM1_f13 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=0.56u +MM1_f14 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=0.56u +MM1_f15 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=0.56u +MM2_f0 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f1 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f2 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f3 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f4 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f5 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f6 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f7 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f8 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f9 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f10 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f11 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f12 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f13 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f14 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f15 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM3_f0 net9 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f1 net9 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f2 net9 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f3 net9 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f4 net9 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f5 net9 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f6 net9 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f7 net9 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM4_f0 VOUT1 VB1 net9 VSS nfet_03v3 w=0.5u l=0.56u +MM4_f1 VOUT1 VB1 net9 VSS nfet_03v3 w=0.5u l=0.56u +MM4_f2 VOUT1 VB1 net9 VSS nfet_03v3 w=0.5u l=0.56u +MM4_f3 VOUT1 VB1 net9 VSS nfet_03v3 w=0.5u l=0.56u +MM4_f4 VOUT1 VB1 net9 VSS nfet_03v3 w=0.5u l=0.56u +MM4_f5 VOUT1 VB1 net9 VSS nfet_03v3 w=0.5u l=0.56u +MM4_f6 VOUT1 VB1 net9 VSS nfet_03v3 w=0.5u l=0.56u +MM4_f7 VOUT1 VB1 net9 VSS nfet_03v3 w=0.5u l=0.56u +.ends C06_gf180_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C06/gf180/sW2_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW2_sL1/testbench.spice new file mode 100644 index 00000000..72ab6171 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW2_sL1/testbench.spice @@ -0,0 +1,31 @@ +X1 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 C06_gf180_sW2_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +MB_VB1 VB1 VB1 VSS VSS nfet_03v3 w=4u l=0.56u +IB_VB1 VDDB VB1 8e-05 +MB_VB2 VB2 VB2 VDDB VDDB pfet_03v3 w=8u l=0.56u +IB_VB2 VB2 VSS 8e-05 +MB_VB3 VB3 VB3 VDDB VDDB pfet_03v3 w=8u l=0.56u +IB_VB3 VB3 VSS 2e-05 +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C06/gf180/sW2_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW2_sL2/case.json new file mode 100644 index 00000000..aff74851 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW2_sL2/case.json @@ -0,0 +1,163 @@ +{ + "case_id": "C06_gf180_sW2_sL2", + "circuit_id": "C06", + "pdk": "gf180", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "dut_name": "C06_gf180_sW2_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1", + "VB2", + "VB3" + ], + "sizing": { + "M1": { + "w": 8.0, + "l": 1.12, + "nf": 16 + }, + "M2": { + "w": 8.0, + "l": 1.12, + "nf": 16 + }, + "M3": { + "w": 4.0, + "l": 1.12, + "nf": 8 + }, + "M4": { + "w": 4.0, + "l": 1.12, + "nf": 8 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M4", + "current": 2e-05, + "kind": "cascode" + }, + "VB2": { + "replica": "M1", + "current": 2e-05, + "kind": "cascode" + }, + "VB3": { + "replica": "M2", + "current": 2e-05 + } + }, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "20ae0bd437c33c25", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M4", + "current_A": 2e-05, + "variant": "cascode" + }, + { + "kind": "replica_bias", + "port": "VB2", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "cascode" + }, + { + "kind": "replica_bias", + "port": "VB3", + "replica_of": "M2", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/gf180/sW2_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW2_sL2/manifest.json new file mode 100644 index 00000000..382f52af --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW2_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "1836b570ad186b198e4656455823c7a445066e50c45f1b28218a2fd9ce099d9e", + "qualification.json": "c2319217d84cf99170802962792ec696a7de26e092936e466b19ca6d4f34a69f", + "specs.json": "6ae3fac035319b57789f9cdd73b8eb9121aa71478d5dde926d76f17b847f632e", + "target.spice": "0832cfb010876bf3fd258963da1b115c7e188f74deb1986326e8473b264255b9", + "target_lvs.spice": "2f213afe09166cbb88ee8c26d2600f531ee58ed67d669af4e7ad374455918aaa", + "testbench.spice": "98ae69f9054868a75b33a499833e916bfdeb777842ca54261260edd7c1b07b86" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/gf180/sW2_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW2_sL2/qualification.json new file mode 100644 index 00000000..40f07166 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW2_sL2/qualification.json @@ -0,0 +1,107 @@ +{ + "case_id": "C06_gf180_sW2_sL2", + "circuit_id": "C06", + "pdk": "gf180", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "single", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "20ae0bd437c33c25", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 55.46 + }, + "f3db": { + "min": 100000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 58.46082, + "f3db": 145002.3 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vout0": 0.9583967, + "vin0": 0.9583967, + "idd": 1.897854e-05, + "gain_lf": 58.46082, + "f3db": 145002.3, + "ugf": 121660600.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/gf180/sW2_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW2_sL2/specs.json new file mode 100644 index 00000000..89daf636 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW2_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 55.46 + }, + "f3db": { + "min": 100000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 58.46082, + "f3db": 145002.3 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/gf180/sW2_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW2_sL2/target.spice new file mode 100644 index 00000000..a6a014a1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW2_sL2/target.spice @@ -0,0 +1,6 @@ +.subckt C06_gf180_sW2_sL2 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 +MM1 VOUT1 VB2 net10 VDD pfet_03v3 w=8u l=1.12u nf=16 m=1 +MM2 net10 VB3 VDD VDD pfet_03v3 w=8u l=1.12u nf=16 m=1 +MM3 net9 VIN1 VSS VSS nfet_03v3 w=4u l=1.12u nf=8 m=1 +MM4 VOUT1 VB1 net9 VSS nfet_03v3 w=4u l=1.12u nf=8 m=1 +.ends C06_gf180_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C06/gf180/sW2_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW2_sL2/target_lvs.spice new file mode 100644 index 00000000..835a5fe5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW2_sL2/target_lvs.spice @@ -0,0 +1,50 @@ +.subckt C06_gf180_sW2_sL2 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 +MM1_f0 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=1.12u +MM1_f1 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=1.12u +MM1_f2 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=1.12u +MM1_f3 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=1.12u +MM1_f4 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=1.12u +MM1_f5 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=1.12u +MM1_f6 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=1.12u +MM1_f7 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=1.12u +MM1_f8 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=1.12u +MM1_f9 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=1.12u +MM1_f10 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=1.12u +MM1_f11 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=1.12u +MM1_f12 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=1.12u +MM1_f13 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=1.12u +MM1_f14 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=1.12u +MM1_f15 VOUT1 VB2 net10 VDD pfet_03v3 w=0.5u l=1.12u +MM2_f0 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f1 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f2 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f3 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f4 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f5 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f6 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f7 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f8 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f9 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f10 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f11 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f12 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f13 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f14 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f15 net10 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM3_f0 net9 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f1 net9 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f2 net9 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f3 net9 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f4 net9 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f5 net9 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f6 net9 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f7 net9 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM4_f0 VOUT1 VB1 net9 VSS nfet_03v3 w=0.5u l=1.12u +MM4_f1 VOUT1 VB1 net9 VSS nfet_03v3 w=0.5u l=1.12u +MM4_f2 VOUT1 VB1 net9 VSS nfet_03v3 w=0.5u l=1.12u +MM4_f3 VOUT1 VB1 net9 VSS nfet_03v3 w=0.5u l=1.12u +MM4_f4 VOUT1 VB1 net9 VSS nfet_03v3 w=0.5u l=1.12u +MM4_f5 VOUT1 VB1 net9 VSS nfet_03v3 w=0.5u l=1.12u +MM4_f6 VOUT1 VB1 net9 VSS nfet_03v3 w=0.5u l=1.12u +MM4_f7 VOUT1 VB1 net9 VSS nfet_03v3 w=0.5u l=1.12u +.ends C06_gf180_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C06/gf180/sW2_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW2_sL2/testbench.spice new file mode 100644 index 00000000..d564a7ce --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/gf180/sW2_sL2/testbench.spice @@ -0,0 +1,31 @@ +X1 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 C06_gf180_sW2_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +MB_VB1 VB1 VB1 VSS VSS nfet_03v3 w=4u l=1.12u +IB_VB1 VDDB VB1 8e-05 +MB_VB2 VB2 VB2 VDDB VDDB pfet_03v3 w=8u l=1.12u +IB_VB2 VB2 VSS 8e-05 +MB_VB3 VB3 VB3 VDDB VDDB pfet_03v3 w=8u l=1.12u +IB_VB3 VB3 VSS 2e-05 +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW0.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW0.5_sL1.5/case.json new file mode 100644 index 00000000..7b1cb7dd --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW0.5_sL1.5/case.json @@ -0,0 +1,163 @@ +{ + "case_id": "C06_ihp130_sW0.5_sL1.5", + "circuit_id": "C06", + "pdk": "ihp130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "dut_name": "C06_ihp130_sW0.5_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1", + "VB2", + "VB3" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.39, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 0.39, + "nf": 4 + }, + "M3": { + "w": 1.0, + "l": 0.39, + "nf": 2 + }, + "M4": { + "w": 1.0, + "l": 0.39, + "nf": 2 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M4", + "current": 2e-05, + "kind": "cascode" + }, + "VB2": { + "replica": "M1", + "current": 2e-05, + "kind": "cascode" + }, + "VB3": { + "replica": "M2", + "current": 2e-05 + } + }, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.39, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.39, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "6c5a38204228862f", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M4", + "current_A": 2e-05, + "variant": "cascode" + }, + { + "kind": "replica_bias", + "port": "VB2", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "cascode" + }, + { + "kind": "replica_bias", + "port": "VB3", + "replica_of": "M2", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW0.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW0.5_sL1.5/manifest.json new file mode 100644 index 00000000..ad71ed56 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW0.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "b2071538a0303de0aa3a60e3c487d1938c07bf34b0f39e1e913f6617c9838ca5", + "qualification.json": "e021b2173268fcacec695e0e1d8ef3da4b88622ac2093394a53be80ac0334eb1", + "specs.json": "5337f581ed5824322082029d16bc8f4b4c78422047a1040c59ec12d7e276bfe8", + "target.spice": "77a64176a3000bd487e751050b09fadf53282d1a9f375875c1554adeac88f155", + "target_lvs.spice": "c87f7726ae340aad2030227f510a25bd4a007dee2eaa62ba52f65a13da047cf8", + "testbench.spice": "f47b8a4d59b9081433c05065ff0fa13fe20aab894b7f4918e09e7d7600cad6e1" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW0.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW0.5_sL1.5/qualification.json new file mode 100644 index 00000000..a55f8699 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW0.5_sL1.5/qualification.json @@ -0,0 +1,107 @@ +{ + "case_id": "C06_ihp130_sW0.5_sL1.5", + "circuit_id": "C06", + "pdk": "ihp130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "single", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.39, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.39, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "6c5a38204228862f", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 33.63 + }, + "f3db": { + "min": 1644000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 36.63339, + "f3db": 2739355.0 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.2, + "schematic_measures": { + "vout0": 0.5601549, + "vin0": 0.5601549, + "idd": 2.008242e-05, + "gain_lf": 36.63339, + "f3db": 2739355.0, + "ugf": 186625000.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW0.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW0.5_sL1.5/specs.json new file mode 100644 index 00000000..356fd9af --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW0.5_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 33.63 + }, + "f3db": { + "min": 1644000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 36.63339, + "f3db": 2739355.0 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW0.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW0.5_sL1.5/target.spice new file mode 100644 index 00000000..1dfa71b8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW0.5_sL1.5/target.spice @@ -0,0 +1,6 @@ +.subckt C06_ihp130_sW0.5_sL1.5 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 +XM1 VOUT1 VB2 net10 VDD sg13_lv_pmos w=2u l=0.39u ng=4 m=1 +XM2 net10 VB3 VDD VDD sg13_lv_pmos w=2u l=0.39u ng=4 m=1 +XM3 net9 VIN1 VSS VSS sg13_lv_nmos w=1u l=0.39u ng=2 m=1 +XM4 VOUT1 VB1 net9 VSS sg13_lv_nmos w=1u l=0.39u ng=2 m=1 +.ends C06_ihp130_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW0.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW0.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..9a24f1b6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW0.5_sL1.5/target_lvs.spice @@ -0,0 +1,14 @@ +.subckt C06_ihp130_sW0.5_sL1.5 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 +XM1_f0 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.39u +XM1_f1 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.39u +XM1_f2 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.39u +XM1_f3 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f0 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f1 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f2 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f3 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM3_f0 net9 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f1 net9 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f0 VOUT1 VB1 net9 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f1 VOUT1 VB1 net9 VSS sg13_lv_nmos w=0.5u l=0.39u +.ends C06_ihp130_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW0.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW0.5_sL1.5/testbench.spice new file mode 100644 index 00000000..cee8e6f3 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW0.5_sL1.5/testbench.spice @@ -0,0 +1,31 @@ +X1 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 C06_ihp130_sW0.5_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +XB_VB1 VB1 VB1 VSS VSS sg13_lv_nmos w=1u l=0.39u +IB_VB1 VDDB VB1 8e-05 +XB_VB2 VB2 VB2 VDDB VDDB sg13_lv_pmos w=2u l=0.39u +IB_VB2 VB2 VSS 8e-05 +XB_VB3 VB3 VB3 VDDB VDDB sg13_lv_pmos w=2u l=0.39u +IB_VB3 VB3 VSS 2e-05 +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW0.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW0.5_sL1/case.json new file mode 100644 index 00000000..f7de899f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW0.5_sL1/case.json @@ -0,0 +1,163 @@ +{ + "case_id": "C06_ihp130_sW0.5_sL1", + "circuit_id": "C06", + "pdk": "ihp130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "dut_name": "C06_ihp130_sW0.5_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1", + "VB2", + "VB3" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.26, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 0.26, + "nf": 4 + }, + "M3": { + "w": 1.0, + "l": 0.26, + "nf": 2 + }, + "M4": { + "w": 1.0, + "l": 0.26, + "nf": 2 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M4", + "current": 2e-05, + "kind": "cascode" + }, + "VB2": { + "replica": "M1", + "current": 2e-05, + "kind": "cascode" + }, + "VB3": { + "replica": "M2", + "current": 2e-05 + } + }, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.26, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.26, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.26, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.26, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "cea5e9b1e5ca88d2", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M4", + "current_A": 2e-05, + "variant": "cascode" + }, + { + "kind": "replica_bias", + "port": "VB2", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "cascode" + }, + { + "kind": "replica_bias", + "port": "VB3", + "replica_of": "M2", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW0.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW0.5_sL1/manifest.json new file mode 100644 index 00000000..7e66ba35 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW0.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "ff26ad2e271f876f0108ff512e0a97545b1e3eb434b062b9b25c470d35217442", + "qualification.json": "a9ac2cdd438f157337caa3888498917b0049d6f29e79560499e1852a1734bccc", + "specs.json": "23786727ae938a7c5ccb3ec3724a08092f9b93d05f6a3c9283881dc40a7d455d", + "target.spice": "f79c1e2b54d56c4ecb60ba90df3b2d761949e5f5b2525ca955b6196da5ad28be", + "target_lvs.spice": "0462af90dc3556e4f714fb5a1e7b8e384fb6f4b2d56e8495e25144ffa5f2904e", + "testbench.spice": "65878864fd15aa3d0089b169759790d5bb745ba2d0f39793c1d1392fa80e1e43" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW0.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW0.5_sL1/qualification.json new file mode 100644 index 00000000..cb5b518f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW0.5_sL1/qualification.json @@ -0,0 +1,107 @@ +{ + "case_id": "C06_ihp130_sW0.5_sL1", + "circuit_id": "C06", + "pdk": "ihp130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "single", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.26, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.26, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.26, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.26, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "cea5e9b1e5ca88d2", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 33.29 + }, + "f3db": { + "min": 1818000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 36.28555, + "f3db": 3030727.0 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.2, + "schematic_measures": { + "vout0": 0.5597058, + "vin0": 0.5597058, + "idd": 1.845556e-05, + "gain_lf": 36.28555, + "f3db": 3030727.0, + "ugf": 198128000.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW0.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW0.5_sL1/specs.json new file mode 100644 index 00000000..4597f54e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW0.5_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 33.29 + }, + "f3db": { + "min": 1818000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 36.28555, + "f3db": 3030727.0 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW0.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW0.5_sL1/target.spice new file mode 100644 index 00000000..f2aefeee --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW0.5_sL1/target.spice @@ -0,0 +1,6 @@ +.subckt C06_ihp130_sW0.5_sL1 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 +XM1 VOUT1 VB2 net10 VDD sg13_lv_pmos w=2u l=0.26u ng=4 m=1 +XM2 net10 VB3 VDD VDD sg13_lv_pmos w=2u l=0.26u ng=4 m=1 +XM3 net9 VIN1 VSS VSS sg13_lv_nmos w=1u l=0.26u ng=2 m=1 +XM4 VOUT1 VB1 net9 VSS sg13_lv_nmos w=1u l=0.26u ng=2 m=1 +.ends C06_ihp130_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW0.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW0.5_sL1/target_lvs.spice new file mode 100644 index 00000000..f7b2c228 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW0.5_sL1/target_lvs.spice @@ -0,0 +1,14 @@ +.subckt C06_ihp130_sW0.5_sL1 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 +XM1_f0 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.26u +XM1_f1 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.26u +XM1_f2 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.26u +XM1_f3 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f0 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f1 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f2 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f3 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM3_f0 net9 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f1 net9 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f0 VOUT1 VB1 net9 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f1 VOUT1 VB1 net9 VSS sg13_lv_nmos w=0.5u l=0.26u +.ends C06_ihp130_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW0.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW0.5_sL1/testbench.spice new file mode 100644 index 00000000..5f4150d6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW0.5_sL1/testbench.spice @@ -0,0 +1,31 @@ +X1 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 C06_ihp130_sW0.5_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +XB_VB1 VB1 VB1 VSS VSS sg13_lv_nmos w=1u l=0.26u +IB_VB1 VDDB VB1 8e-05 +XB_VB2 VB2 VB2 VDDB VDDB sg13_lv_pmos w=2u l=0.26u +IB_VB2 VB2 VSS 8e-05 +XB_VB3 VB3 VB3 VDDB VDDB sg13_lv_pmos w=2u l=0.26u +IB_VB3 VB3 VSS 2e-05 +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW0.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW0.5_sL2/case.json new file mode 100644 index 00000000..2a41fb7c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW0.5_sL2/case.json @@ -0,0 +1,163 @@ +{ + "case_id": "C06_ihp130_sW0.5_sL2", + "circuit_id": "C06", + "pdk": "ihp130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "dut_name": "C06_ihp130_sW0.5_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1", + "VB2", + "VB3" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.52, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 0.52, + "nf": 4 + }, + "M3": { + "w": 1.0, + "l": 0.52, + "nf": 2 + }, + "M4": { + "w": 1.0, + "l": 0.52, + "nf": 2 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M4", + "current": 2e-05, + "kind": "cascode" + }, + "VB2": { + "replica": "M1", + "current": 2e-05, + "kind": "cascode" + }, + "VB3": { + "replica": "M2", + "current": 2e-05 + } + }, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.52, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.52, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "8552463d5d873ae3", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M4", + "current_A": 2e-05, + "variant": "cascode" + }, + { + "kind": "replica_bias", + "port": "VB2", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "cascode" + }, + { + "kind": "replica_bias", + "port": "VB3", + "replica_of": "M2", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW0.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW0.5_sL2/manifest.json new file mode 100644 index 00000000..122283b4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW0.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "0a685f602533e08d422de906e33e3993ace3dd8ece535144102e66cedd25d598", + "qualification.json": "1e7cfe907b80b932a5c2a4a85fa3a80aed81ed97cbf0f43118da23149f0cab3b", + "specs.json": "8320e18910a5334710f30df4913a8d75f44848189d94bf05f4fb111a996272f7", + "target.spice": "046b748f1148c0513cc85ce00f6b041f36cb17259923ef79fb4c3451a1dde60f", + "target_lvs.spice": "d3be2dbbcd23681f856bb246877088bc1c379796657c3c650b4fa51672094f11", + "testbench.spice": "6e649bfb8a64db977d838f90140d42ae7371dca49d6f1fd45a16fe60ee5bd38d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW0.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW0.5_sL2/qualification.json new file mode 100644 index 00000000..78ec1035 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW0.5_sL2/qualification.json @@ -0,0 +1,107 @@ +{ + "case_id": "C06_ihp130_sW0.5_sL2", + "circuit_id": "C06", + "pdk": "ihp130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "single", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.52, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.52, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "8552463d5d873ae3", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 31.7 + }, + "f3db": { + "min": 1882000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 34.69502, + "f3db": 3137098.0 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.2, + "schematic_measures": { + "vout0": 0.5741607, + "vin0": 0.5741607, + "idd": 2.084907e-05, + "gain_lf": 34.69502, + "f3db": 3137098.0, + "ugf": 170957000.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW0.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW0.5_sL2/specs.json new file mode 100644 index 00000000..05f19042 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW0.5_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 31.7 + }, + "f3db": { + "min": 1882000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 34.69502, + "f3db": 3137098.0 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW0.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW0.5_sL2/target.spice new file mode 100644 index 00000000..0391ab55 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW0.5_sL2/target.spice @@ -0,0 +1,6 @@ +.subckt C06_ihp130_sW0.5_sL2 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 +XM1 VOUT1 VB2 net10 VDD sg13_lv_pmos w=2u l=0.52u ng=4 m=1 +XM2 net10 VB3 VDD VDD sg13_lv_pmos w=2u l=0.52u ng=4 m=1 +XM3 net9 VIN1 VSS VSS sg13_lv_nmos w=1u l=0.52u ng=2 m=1 +XM4 VOUT1 VB1 net9 VSS sg13_lv_nmos w=1u l=0.52u ng=2 m=1 +.ends C06_ihp130_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW0.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW0.5_sL2/target_lvs.spice new file mode 100644 index 00000000..4db9f2e6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW0.5_sL2/target_lvs.spice @@ -0,0 +1,14 @@ +.subckt C06_ihp130_sW0.5_sL2 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 +XM1_f0 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f1 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f2 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f3 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f0 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f1 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f2 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f3 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM3_f0 net9 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f1 net9 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f0 VOUT1 VB1 net9 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f1 VOUT1 VB1 net9 VSS sg13_lv_nmos w=0.5u l=0.52u +.ends C06_ihp130_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW0.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW0.5_sL2/testbench.spice new file mode 100644 index 00000000..d74fd0c5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW0.5_sL2/testbench.spice @@ -0,0 +1,31 @@ +X1 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 C06_ihp130_sW0.5_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +XB_VB1 VB1 VB1 VSS VSS sg13_lv_nmos w=1u l=0.52u +IB_VB1 VDDB VB1 8e-05 +XB_VB2 VB2 VB2 VDDB VDDB sg13_lv_pmos w=2u l=0.52u +IB_VB2 VB2 VSS 8e-05 +XB_VB3 VB3 VB3 VDDB VDDB sg13_lv_pmos w=2u l=0.52u +IB_VB3 VB3 VSS 2e-05 +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1.5_sL1.5/case.json new file mode 100644 index 00000000..05697bd7 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1.5_sL1.5/case.json @@ -0,0 +1,163 @@ +{ + "case_id": "C06_ihp130_sW1.5_sL1.5", + "circuit_id": "C06", + "pdk": "ihp130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "dut_name": "C06_ihp130_sW1.5_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1", + "VB2", + "VB3" + ], + "sizing": { + "M1": { + "w": 6.0, + "l": 0.39, + "nf": 12 + }, + "M2": { + "w": 6.0, + "l": 0.39, + "nf": 12 + }, + "M3": { + "w": 3.0, + "l": 0.39, + "nf": 6 + }, + "M4": { + "w": 3.0, + "l": 0.39, + "nf": 6 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M4", + "current": 2e-05, + "kind": "cascode" + }, + "VB2": { + "replica": "M1", + "current": 2e-05, + "kind": "cascode" + }, + "VB3": { + "replica": "M2", + "current": 2e-05 + } + }, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.39, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.39, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.39, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.39, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "6400ffa0df8ec521", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M4", + "current_A": 2e-05, + "variant": "cascode" + }, + { + "kind": "replica_bias", + "port": "VB2", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "cascode" + }, + { + "kind": "replica_bias", + "port": "VB3", + "replica_of": "M2", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1.5_sL1.5/manifest.json new file mode 100644 index 00000000..622486cc --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "acaaa265dc299461ac0d342798e76d9e9d99b3fd2126fcd647b12e88572a081d", + "qualification.json": "2791f9b312f8418a607c009110645df789eaaf1d9e39217c72f052f3bfba29af", + "specs.json": "58f7648d00d5a6e0a1df7f86999c4ef2d6f92ebb3f3e2ae96a60f8214e6add02", + "target.spice": "a0cb6b0d8ceb10cee6d1e3aa524968880b8ed86a48cee59f779d542bbc46a46c", + "target_lvs.spice": "94eb2b4db567ac418090c4d864c43de40533e9bd71f7f7588b422d4c9becf618", + "testbench.spice": "ef953bb1ed69b19d04704218fa3ab60a81642c9e223930df802f7087200edea2" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1.5_sL1.5/qualification.json new file mode 100644 index 00000000..ddc836a2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1.5_sL1.5/qualification.json @@ -0,0 +1,107 @@ +{ + "case_id": "C06_ihp130_sW1.5_sL1.5", + "circuit_id": "C06", + "pdk": "ihp130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "single", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.39, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.39, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.39, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.39, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "6400ffa0df8ec521", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 32.05 + }, + "f3db": { + "min": 2523000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 35.05241, + "f3db": 4204701.0 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.4, + "schematic_measures": { + "vout0": 0.4553442, + "vin0": 0.4553442, + "idd": 2.026799e-05, + "gain_lf": 35.05241, + "f3db": 4204701.0, + "ugf": 238673600.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1.5_sL1.5/specs.json new file mode 100644 index 00000000..cb35f4d9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1.5_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 32.05 + }, + "f3db": { + "min": 2523000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 35.05241, + "f3db": 4204701.0 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1.5_sL1.5/target.spice new file mode 100644 index 00000000..7a8a218f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1.5_sL1.5/target.spice @@ -0,0 +1,6 @@ +.subckt C06_ihp130_sW1.5_sL1.5 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 +XM1 VOUT1 VB2 net10 VDD sg13_lv_pmos w=6u l=0.39u ng=12 m=1 +XM2 net10 VB3 VDD VDD sg13_lv_pmos w=6u l=0.39u ng=12 m=1 +XM3 net9 VIN1 VSS VSS sg13_lv_nmos w=3u l=0.39u ng=6 m=1 +XM4 VOUT1 VB1 net9 VSS sg13_lv_nmos w=3u l=0.39u ng=6 m=1 +.ends C06_ihp130_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..187788ac --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1.5_sL1.5/target_lvs.spice @@ -0,0 +1,38 @@ +.subckt C06_ihp130_sW1.5_sL1.5 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 +XM1_f0 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.39u +XM1_f1 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.39u +XM1_f2 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.39u +XM1_f3 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.39u +XM1_f4 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.39u +XM1_f5 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.39u +XM1_f6 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.39u +XM1_f7 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.39u +XM1_f8 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.39u +XM1_f9 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.39u +XM1_f10 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.39u +XM1_f11 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f0 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f1 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f2 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f3 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f4 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f5 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f6 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f7 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f8 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f9 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f10 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f11 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM3_f0 net9 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f1 net9 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f2 net9 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f3 net9 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f4 net9 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f5 net9 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f0 VOUT1 VB1 net9 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f1 VOUT1 VB1 net9 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f2 VOUT1 VB1 net9 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f3 VOUT1 VB1 net9 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f4 VOUT1 VB1 net9 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f5 VOUT1 VB1 net9 VSS sg13_lv_nmos w=0.5u l=0.39u +.ends C06_ihp130_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1.5_sL1.5/testbench.spice new file mode 100644 index 00000000..9df16384 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1.5_sL1.5/testbench.spice @@ -0,0 +1,31 @@ +X1 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 C06_ihp130_sW1.5_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +XB_VB1 VB1 VB1 VSS VSS sg13_lv_nmos w=3u l=0.39u +IB_VB1 VDDB VB1 8e-05 +XB_VB2 VB2 VB2 VDDB VDDB sg13_lv_pmos w=6u l=0.39u +IB_VB2 VB2 VSS 8e-05 +XB_VB3 VB3 VB3 VDDB VDDB sg13_lv_pmos w=6u l=0.39u +IB_VB3 VB3 VSS 2e-05 +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1.5_sL1/case.json new file mode 100644 index 00000000..38a0b090 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1.5_sL1/case.json @@ -0,0 +1,163 @@ +{ + "case_id": "C06_ihp130_sW1.5_sL1", + "circuit_id": "C06", + "pdk": "ihp130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "dut_name": "C06_ihp130_sW1.5_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1", + "VB2", + "VB3" + ], + "sizing": { + "M1": { + "w": 6.0, + "l": 0.26, + "nf": 12 + }, + "M2": { + "w": 6.0, + "l": 0.26, + "nf": 12 + }, + "M3": { + "w": 3.0, + "l": 0.26, + "nf": 6 + }, + "M4": { + "w": 3.0, + "l": 0.26, + "nf": 6 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M4", + "current": 2e-05, + "kind": "cascode" + }, + "VB2": { + "replica": "M1", + "current": 2e-05, + "kind": "cascode" + }, + "VB3": { + "replica": "M2", + "current": 2e-05 + } + }, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.26, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.26, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.26, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.26, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "5169a8d045964c4b", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M4", + "current_A": 2e-05, + "variant": "cascode" + }, + { + "kind": "replica_bias", + "port": "VB2", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "cascode" + }, + { + "kind": "replica_bias", + "port": "VB3", + "replica_of": "M2", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1.5_sL1/manifest.json new file mode 100644 index 00000000..66437ae4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "963b1e445f6d11534b13b35046698056fdc203998d8d1af8329acca106416922", + "qualification.json": "daa9222b39dd7abb9d26f2efb7e11d56e5e3748d27cbdf7e76579c262c532544", + "specs.json": "7585d76408b2065e924f7f0d88c2879414c0d7a3d24edc8dc7d9a4282c06ecff", + "target.spice": "e2d02032865f16a79789ebd4e7fee694d22237b86d15b924844b012ca9e4b9a7", + "target_lvs.spice": "5d37f72f89851c356f41f3dd6dfc5223a135828a62093847d50ee0cefb1eb14d", + "testbench.spice": "fa6b2020476ec9c49e7af0144526307c6f49ab2fed6c3acdec49865feda9f964" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1.5_sL1/qualification.json new file mode 100644 index 00000000..b498ac81 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1.5_sL1/qualification.json @@ -0,0 +1,107 @@ +{ + "case_id": "C06_ihp130_sW1.5_sL1", + "circuit_id": "C06", + "pdk": "ihp130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "single", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.26, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.26, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.26, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.26, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "5169a8d045964c4b", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 31.57 + }, + "f3db": { + "min": 2800000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 34.56628, + "f3db": 4667127.0 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.4, + "schematic_measures": { + "vout0": 0.4661412, + "vin0": 0.4661412, + "idd": 1.813558e-05, + "gain_lf": 34.56628, + "f3db": 4667127.0, + "ugf": 250163500.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1.5_sL1/specs.json new file mode 100644 index 00000000..873d5977 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1.5_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 31.57 + }, + "f3db": { + "min": 2800000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 34.56628, + "f3db": 4667127.0 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1.5_sL1/target.spice new file mode 100644 index 00000000..884f3d38 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1.5_sL1/target.spice @@ -0,0 +1,6 @@ +.subckt C06_ihp130_sW1.5_sL1 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 +XM1 VOUT1 VB2 net10 VDD sg13_lv_pmos w=6u l=0.26u ng=12 m=1 +XM2 net10 VB3 VDD VDD sg13_lv_pmos w=6u l=0.26u ng=12 m=1 +XM3 net9 VIN1 VSS VSS sg13_lv_nmos w=3u l=0.26u ng=6 m=1 +XM4 VOUT1 VB1 net9 VSS sg13_lv_nmos w=3u l=0.26u ng=6 m=1 +.ends C06_ihp130_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1.5_sL1/target_lvs.spice new file mode 100644 index 00000000..25ff70c1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1.5_sL1/target_lvs.spice @@ -0,0 +1,38 @@ +.subckt C06_ihp130_sW1.5_sL1 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 +XM1_f0 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.26u +XM1_f1 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.26u +XM1_f2 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.26u +XM1_f3 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.26u +XM1_f4 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.26u +XM1_f5 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.26u +XM1_f6 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.26u +XM1_f7 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.26u +XM1_f8 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.26u +XM1_f9 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.26u +XM1_f10 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.26u +XM1_f11 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f0 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f1 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f2 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f3 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f4 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f5 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f6 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f7 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f8 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f9 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f10 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f11 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM3_f0 net9 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f1 net9 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f2 net9 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f3 net9 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f4 net9 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f5 net9 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f0 VOUT1 VB1 net9 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f1 VOUT1 VB1 net9 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f2 VOUT1 VB1 net9 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f3 VOUT1 VB1 net9 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f4 VOUT1 VB1 net9 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f5 VOUT1 VB1 net9 VSS sg13_lv_nmos w=0.5u l=0.26u +.ends C06_ihp130_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1.5_sL1/testbench.spice new file mode 100644 index 00000000..b1058bdf --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1.5_sL1/testbench.spice @@ -0,0 +1,31 @@ +X1 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 C06_ihp130_sW1.5_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +XB_VB1 VB1 VB1 VSS VSS sg13_lv_nmos w=3u l=0.26u +IB_VB1 VDDB VB1 8e-05 +XB_VB2 VB2 VB2 VDDB VDDB sg13_lv_pmos w=6u l=0.26u +IB_VB2 VB2 VSS 8e-05 +XB_VB3 VB3 VB3 VDDB VDDB sg13_lv_pmos w=6u l=0.26u +IB_VB3 VB3 VSS 2e-05 +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1.5_sL2/case.json new file mode 100644 index 00000000..f89d9220 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1.5_sL2/case.json @@ -0,0 +1,163 @@ +{ + "case_id": "C06_ihp130_sW1.5_sL2", + "circuit_id": "C06", + "pdk": "ihp130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "dut_name": "C06_ihp130_sW1.5_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1", + "VB2", + "VB3" + ], + "sizing": { + "M1": { + "w": 6.0, + "l": 0.52, + "nf": 12 + }, + "M2": { + "w": 6.0, + "l": 0.52, + "nf": 12 + }, + "M3": { + "w": 3.0, + "l": 0.52, + "nf": 6 + }, + "M4": { + "w": 3.0, + "l": 0.52, + "nf": 6 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M4", + "current": 2e-05, + "kind": "cascode" + }, + "VB2": { + "replica": "M1", + "current": 2e-05, + "kind": "cascode" + }, + "VB3": { + "replica": "M2", + "current": 2e-05 + } + }, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.52, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.52, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.52, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.52, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "c104af8159c860d1", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M4", + "current_A": 2e-05, + "variant": "cascode" + }, + { + "kind": "replica_bias", + "port": "VB2", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "cascode" + }, + { + "kind": "replica_bias", + "port": "VB3", + "replica_of": "M2", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1.5_sL2/manifest.json new file mode 100644 index 00000000..ca66a36b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "ab4054a27d893c05606511cacc9d293ccf848428679de4d6c36e11bdd3c69055", + "qualification.json": "72c905c148893981756c0af779b8da98855a0e3b40f81cf8c2f0c2782969e9bc", + "specs.json": "7aeac01ced941f4fcc08f3a0f73eb3efa967e91172ea8b5d9a0b9c077e51e4c1", + "target.spice": "282719a6aa4302d9e4c0f9af0042b15d19ff7f76e3defa505f0ffc37ea4e8cc4", + "target_lvs.spice": "870499c67477d20c62e71fce04a3377aa7baffb85da831a8d767f3b91ba7691d", + "testbench.spice": "0e65ad75809416a9c3538c33c16a9b2557b382c89cf67fbc099b9eb964df6f43" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1.5_sL2/qualification.json new file mode 100644 index 00000000..2efbac93 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1.5_sL2/qualification.json @@ -0,0 +1,107 @@ +{ + "case_id": "C06_ihp130_sW1.5_sL2", + "circuit_id": "C06", + "pdk": "ihp130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "single", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.52, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.52, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.52, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.52, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "c104af8159c860d1", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 32.33 + }, + "f3db": { + "min": 2275000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 35.32998, + "f3db": 3792025.0 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.4, + "schematic_measures": { + "vout0": 0.4588734, + "vin0": 0.4588734, + "idd": 2.134392e-05, + "gain_lf": 35.32998, + "f3db": 3792025.0, + "ugf": 221981100.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1.5_sL2/specs.json new file mode 100644 index 00000000..002015ef --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1.5_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 32.33 + }, + "f3db": { + "min": 2275000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 35.32998, + "f3db": 3792025.0 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1.5_sL2/target.spice new file mode 100644 index 00000000..9f62d6d7 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1.5_sL2/target.spice @@ -0,0 +1,6 @@ +.subckt C06_ihp130_sW1.5_sL2 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 +XM1 VOUT1 VB2 net10 VDD sg13_lv_pmos w=6u l=0.52u ng=12 m=1 +XM2 net10 VB3 VDD VDD sg13_lv_pmos w=6u l=0.52u ng=12 m=1 +XM3 net9 VIN1 VSS VSS sg13_lv_nmos w=3u l=0.52u ng=6 m=1 +XM4 VOUT1 VB1 net9 VSS sg13_lv_nmos w=3u l=0.52u ng=6 m=1 +.ends C06_ihp130_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1.5_sL2/target_lvs.spice new file mode 100644 index 00000000..6d4d6cf9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1.5_sL2/target_lvs.spice @@ -0,0 +1,38 @@ +.subckt C06_ihp130_sW1.5_sL2 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 +XM1_f0 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f1 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f2 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f3 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f4 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f5 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f6 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f7 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f8 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f9 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f10 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f11 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f0 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f1 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f2 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f3 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f4 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f5 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f6 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f7 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f8 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f9 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f10 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f11 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM3_f0 net9 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f1 net9 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f2 net9 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f3 net9 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f4 net9 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f5 net9 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f0 VOUT1 VB1 net9 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f1 VOUT1 VB1 net9 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f2 VOUT1 VB1 net9 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f3 VOUT1 VB1 net9 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f4 VOUT1 VB1 net9 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f5 VOUT1 VB1 net9 VSS sg13_lv_nmos w=0.5u l=0.52u +.ends C06_ihp130_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1.5_sL2/testbench.spice new file mode 100644 index 00000000..91b74754 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1.5_sL2/testbench.spice @@ -0,0 +1,31 @@ +X1 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 C06_ihp130_sW1.5_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +XB_VB1 VB1 VB1 VSS VSS sg13_lv_nmos w=3u l=0.52u +IB_VB1 VDDB VB1 8e-05 +XB_VB2 VB2 VB2 VDDB VDDB sg13_lv_pmos w=6u l=0.52u +IB_VB2 VB2 VSS 8e-05 +XB_VB3 VB3 VB3 VDDB VDDB sg13_lv_pmos w=6u l=0.52u +IB_VB3 VB3 VSS 2e-05 +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1_sL1.5/case.json new file mode 100644 index 00000000..2c357fcf --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1_sL1.5/case.json @@ -0,0 +1,163 @@ +{ + "case_id": "C06_ihp130_sW1_sL1.5", + "circuit_id": "C06", + "pdk": "ihp130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "dut_name": "C06_ihp130_sW1_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1", + "VB2", + "VB3" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.39, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 0.39, + "nf": 8 + }, + "M3": { + "w": 2.0, + "l": 0.39, + "nf": 4 + }, + "M4": { + "w": 2.0, + "l": 0.39, + "nf": 4 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M4", + "current": 2e-05, + "kind": "cascode" + }, + "VB2": { + "replica": "M1", + "current": 2e-05, + "kind": "cascode" + }, + "VB3": { + "replica": "M2", + "current": 2e-05 + } + }, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "6c18fac722792f53", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M4", + "current_A": 2e-05, + "variant": "cascode" + }, + { + "kind": "replica_bias", + "port": "VB2", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "cascode" + }, + { + "kind": "replica_bias", + "port": "VB3", + "replica_of": "M2", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1_sL1.5/manifest.json new file mode 100644 index 00000000..46dda6e4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "75eadddf3ce34ae3e80057f314c51d06dd072399dac77b1cd7fb2d638ccaafbc", + "qualification.json": "d84a36d8ca8a526f3118e0cc045c8e21b55c3fd1c7d68cbe0fe3707e431b8421", + "specs.json": "69bb6b7d7a48bae62cad95d70e37b595c4ed6b92a78033dde6220f2faf763a8e", + "target.spice": "1b53354d956e5c6c016b4ba121bb0472ec060b02d492ea99f2431d1643dd8537", + "target_lvs.spice": "d31d645b57196c4cfd4b60d967f6190a7dbda953514b4b8ffd6cace130c0bca8", + "testbench.spice": "791451aa3c71ddd6a5a8c2bac010a4577e5f98573f81a5c835c3c00440c8aac3" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1_sL1.5/qualification.json new file mode 100644 index 00000000..f3537200 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1_sL1.5/qualification.json @@ -0,0 +1,107 @@ +{ + "case_id": "C06_ihp130_sW1_sL1.5", + "circuit_id": "C06", + "pdk": "ihp130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "single", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "6c18fac722792f53", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 33.48 + }, + "f3db": { + "min": 2011000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 36.47854, + "f3db": 3351195.0 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.3, + "schematic_measures": { + "vout0": 0.4888074, + "vin0": 0.4888074, + "idd": 2.026449e-05, + "gain_lf": 36.47854, + "f3db": 3351195.0, + "ugf": 223861900.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1_sL1.5/specs.json new file mode 100644 index 00000000..5714b9f2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 33.48 + }, + "f3db": { + "min": 2011000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 36.47854, + "f3db": 3351195.0 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1_sL1.5/target.spice new file mode 100644 index 00000000..c5323061 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1_sL1.5/target.spice @@ -0,0 +1,6 @@ +.subckt C06_ihp130_sW1_sL1.5 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 +XM1 VOUT1 VB2 net10 VDD sg13_lv_pmos w=4u l=0.39u ng=8 m=1 +XM2 net10 VB3 VDD VDD sg13_lv_pmos w=4u l=0.39u ng=8 m=1 +XM3 net9 VIN1 VSS VSS sg13_lv_nmos w=2u l=0.39u ng=4 m=1 +XM4 VOUT1 VB1 net9 VSS sg13_lv_nmos w=2u l=0.39u ng=4 m=1 +.ends C06_ihp130_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1_sL1.5/target_lvs.spice new file mode 100644 index 00000000..1db81615 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1_sL1.5/target_lvs.spice @@ -0,0 +1,26 @@ +.subckt C06_ihp130_sW1_sL1.5 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 +XM1_f0 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.39u +XM1_f1 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.39u +XM1_f2 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.39u +XM1_f3 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.39u +XM1_f4 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.39u +XM1_f5 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.39u +XM1_f6 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.39u +XM1_f7 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f0 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f1 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f2 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f3 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f4 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f5 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f6 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f7 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM3_f0 net9 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f1 net9 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f2 net9 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f3 net9 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f0 VOUT1 VB1 net9 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f1 VOUT1 VB1 net9 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f2 VOUT1 VB1 net9 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f3 VOUT1 VB1 net9 VSS sg13_lv_nmos w=0.5u l=0.39u +.ends C06_ihp130_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1_sL1.5/testbench.spice new file mode 100644 index 00000000..381a5038 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1_sL1.5/testbench.spice @@ -0,0 +1,31 @@ +X1 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 C06_ihp130_sW1_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +XB_VB1 VB1 VB1 VSS VSS sg13_lv_nmos w=2u l=0.39u +IB_VB1 VDDB VB1 8e-05 +XB_VB2 VB2 VB2 VDDB VDDB sg13_lv_pmos w=4u l=0.39u +IB_VB2 VB2 VSS 8e-05 +XB_VB3 VB3 VB3 VDDB VDDB sg13_lv_pmos w=4u l=0.39u +IB_VB3 VB3 VSS 2e-05 +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1_sL1/case.json new file mode 100644 index 00000000..a6b8a4a2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1_sL1/case.json @@ -0,0 +1,163 @@ +{ + "case_id": "C06_ihp130_sW1_sL1", + "circuit_id": "C06", + "pdk": "ihp130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "dut_name": "C06_ihp130_sW1_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1", + "VB2", + "VB3" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.26, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 0.26, + "nf": 8 + }, + "M3": { + "w": 2.0, + "l": 0.26, + "nf": 4 + }, + "M4": { + "w": 2.0, + "l": 0.26, + "nf": 4 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M4", + "current": 2e-05, + "kind": "cascode" + }, + "VB2": { + "replica": "M1", + "current": 2e-05, + "kind": "cascode" + }, + "VB3": { + "replica": "M2", + "current": 2e-05 + } + }, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.26, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.26, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "597c1e5723987d1c", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M4", + "current_A": 2e-05, + "variant": "cascode" + }, + { + "kind": "replica_bias", + "port": "VB2", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "cascode" + }, + { + "kind": "replica_bias", + "port": "VB3", + "replica_of": "M2", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1_sL1/manifest.json new file mode 100644 index 00000000..bab819ea --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "a548147296de05a9f06df38625d63f111ed1f4d9ae3414a3d10b0a836bffa0b3", + "qualification.json": "f9006b22e79db2be1cdadaed248d4cdcee86c925f4d17d3a8aeda9c5bd805871", + "specs.json": "9de34e79f8258f3cf515848b25aa3c7e45a72b86eca7a7a73bc343027ebccaf8", + "target.spice": "47ddd66e9fb040a9df902197efa54d59db71b7319d1faf30d204ccf4a1942c33", + "target_lvs.spice": "752b800fd83dfa8d0fe01ad42c1464a27bd5e322e6c00fb8e51ec5a607d44c56", + "testbench.spice": "d18e5284eb09d89824a5b7365a4b08ea2a8b0dc571ad40ceeecff33b1077fe5d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1_sL1/qualification.json new file mode 100644 index 00000000..9d387f31 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1_sL1/qualification.json @@ -0,0 +1,107 @@ +{ + "case_id": "C06_ihp130_sW1_sL1", + "circuit_id": "C06", + "pdk": "ihp130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "single", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.26, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.26, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "597c1e5723987d1c", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 32.78 + }, + "f3db": { + "min": 2291000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 35.78481, + "f3db": 3819148.0 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.3, + "schematic_measures": { + "vout0": 0.4960872, + "vin0": 0.4960872, + "idd": 1.828126e-05, + "gain_lf": 35.78481, + "f3db": 3819148.0, + "ugf": 235936300.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1_sL1/specs.json new file mode 100644 index 00000000..cfac11a4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 32.78 + }, + "f3db": { + "min": 2291000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 35.78481, + "f3db": 3819148.0 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1_sL1/target.spice new file mode 100644 index 00000000..4e333842 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1_sL1/target.spice @@ -0,0 +1,6 @@ +.subckt C06_ihp130_sW1_sL1 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 +XM1 VOUT1 VB2 net10 VDD sg13_lv_pmos w=4u l=0.26u ng=8 m=1 +XM2 net10 VB3 VDD VDD sg13_lv_pmos w=4u l=0.26u ng=8 m=1 +XM3 net9 VIN1 VSS VSS sg13_lv_nmos w=2u l=0.26u ng=4 m=1 +XM4 VOUT1 VB1 net9 VSS sg13_lv_nmos w=2u l=0.26u ng=4 m=1 +.ends C06_ihp130_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1_sL1/target_lvs.spice new file mode 100644 index 00000000..5e07edfe --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1_sL1/target_lvs.spice @@ -0,0 +1,26 @@ +.subckt C06_ihp130_sW1_sL1 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 +XM1_f0 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.26u +XM1_f1 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.26u +XM1_f2 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.26u +XM1_f3 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.26u +XM1_f4 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.26u +XM1_f5 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.26u +XM1_f6 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.26u +XM1_f7 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f0 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f1 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f2 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f3 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f4 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f5 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f6 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f7 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM3_f0 net9 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f1 net9 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f2 net9 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f3 net9 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f0 VOUT1 VB1 net9 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f1 VOUT1 VB1 net9 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f2 VOUT1 VB1 net9 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f3 VOUT1 VB1 net9 VSS sg13_lv_nmos w=0.5u l=0.26u +.ends C06_ihp130_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1_sL1/testbench.spice new file mode 100644 index 00000000..de05aafb --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1_sL1/testbench.spice @@ -0,0 +1,31 @@ +X1 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 C06_ihp130_sW1_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +XB_VB1 VB1 VB1 VSS VSS sg13_lv_nmos w=2u l=0.26u +IB_VB1 VDDB VB1 8e-05 +XB_VB2 VB2 VB2 VDDB VDDB sg13_lv_pmos w=4u l=0.26u +IB_VB2 VB2 VSS 8e-05 +XB_VB3 VB3 VB3 VDDB VDDB sg13_lv_pmos w=4u l=0.26u +IB_VB3 VB3 VSS 2e-05 +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1_sL2/case.json new file mode 100644 index 00000000..d0754d31 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1_sL2/case.json @@ -0,0 +1,163 @@ +{ + "case_id": "C06_ihp130_sW1_sL2", + "circuit_id": "C06", + "pdk": "ihp130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "dut_name": "C06_ihp130_sW1_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1", + "VB2", + "VB3" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.52, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 0.52, + "nf": 8 + }, + "M3": { + "w": 2.0, + "l": 0.52, + "nf": 4 + }, + "M4": { + "w": 2.0, + "l": 0.52, + "nf": 4 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M4", + "current": 2e-05, + "kind": "cascode" + }, + "VB2": { + "replica": "M1", + "current": 2e-05, + "kind": "cascode" + }, + "VB3": { + "replica": "M2", + "current": 2e-05 + } + }, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "ba95db124d335dc8", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M4", + "current_A": 2e-05, + "variant": "cascode" + }, + { + "kind": "replica_bias", + "port": "VB2", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "cascode" + }, + { + "kind": "replica_bias", + "port": "VB3", + "replica_of": "M2", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1_sL2/manifest.json new file mode 100644 index 00000000..c0d8b149 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "2f69b69e74c1dd0624b6010c1053ce8daff63a30825ebec482d79cdc0367ca03", + "qualification.json": "9f98de32e458b2c987d42ec6b87d47fe2b3f2bde1df9a1aa804980179f12d07e", + "specs.json": "342a318d866618fd07b90e8e2758b8255fd0429e1dd22a78f8c142ea91b84408", + "target.spice": "55ca8248d942cc856a7977851da93d6c86ccaa34280fd02a703174604a06b145", + "target_lvs.spice": "ec2b179c7e83b1dff9fcfb8e007a9f43829ae79101e4598b4d2416171c4faf06", + "testbench.spice": "75bbc3ff8fff2946d5668c16d8986779dffa2169cb5150269fa0ec1ef92789e2" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1_sL2/qualification.json new file mode 100644 index 00000000..058e46d9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1_sL2/qualification.json @@ -0,0 +1,107 @@ +{ + "case_id": "C06_ihp130_sW1_sL2", + "circuit_id": "C06", + "pdk": "ihp130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "single", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "ba95db124d335dc8", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 33.75 + }, + "f3db": { + "min": 1810000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 36.74976, + "f3db": 3016877.0 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.2, + "schematic_measures": { + "vout0": 0.495658, + "vin0": 0.495658, + "idd": 2.125107e-05, + "gain_lf": 36.74976, + "f3db": 3016877.0, + "ugf": 208240200.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1_sL2/specs.json new file mode 100644 index 00000000..80b4887a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 33.75 + }, + "f3db": { + "min": 1810000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 36.74976, + "f3db": 3016877.0 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1_sL2/target.spice new file mode 100644 index 00000000..7c5b6239 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1_sL2/target.spice @@ -0,0 +1,6 @@ +.subckt C06_ihp130_sW1_sL2 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 +XM1 VOUT1 VB2 net10 VDD sg13_lv_pmos w=4u l=0.52u ng=8 m=1 +XM2 net10 VB3 VDD VDD sg13_lv_pmos w=4u l=0.52u ng=8 m=1 +XM3 net9 VIN1 VSS VSS sg13_lv_nmos w=2u l=0.52u ng=4 m=1 +XM4 VOUT1 VB1 net9 VSS sg13_lv_nmos w=2u l=0.52u ng=4 m=1 +.ends C06_ihp130_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1_sL2/target_lvs.spice new file mode 100644 index 00000000..0f9dadbf --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1_sL2/target_lvs.spice @@ -0,0 +1,26 @@ +.subckt C06_ihp130_sW1_sL2 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 +XM1_f0 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f1 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f2 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f3 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f4 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f5 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f6 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f7 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f0 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f1 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f2 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f3 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f4 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f5 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f6 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f7 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM3_f0 net9 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f1 net9 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f2 net9 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f3 net9 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f0 VOUT1 VB1 net9 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f1 VOUT1 VB1 net9 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f2 VOUT1 VB1 net9 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f3 VOUT1 VB1 net9 VSS sg13_lv_nmos w=0.5u l=0.52u +.ends C06_ihp130_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1_sL2/testbench.spice new file mode 100644 index 00000000..e28927c1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW1_sL2/testbench.spice @@ -0,0 +1,31 @@ +X1 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 C06_ihp130_sW1_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +XB_VB1 VB1 VB1 VSS VSS sg13_lv_nmos w=2u l=0.52u +IB_VB1 VDDB VB1 8e-05 +XB_VB2 VB2 VB2 VDDB VDDB sg13_lv_pmos w=4u l=0.52u +IB_VB2 VB2 VSS 8e-05 +XB_VB3 VB3 VB3 VDDB VDDB sg13_lv_pmos w=4u l=0.52u +IB_VB3 VB3 VSS 2e-05 +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW2_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW2_sL1.5/case.json new file mode 100644 index 00000000..400a1cc5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW2_sL1.5/case.json @@ -0,0 +1,163 @@ +{ + "case_id": "C06_ihp130_sW2_sL1.5", + "circuit_id": "C06", + "pdk": "ihp130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "dut_name": "C06_ihp130_sW2_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1", + "VB2", + "VB3" + ], + "sizing": { + "M1": { + "w": 8.0, + "l": 0.39, + "nf": 16 + }, + "M2": { + "w": 8.0, + "l": 0.39, + "nf": 16 + }, + "M3": { + "w": 4.0, + "l": 0.39, + "nf": 8 + }, + "M4": { + "w": 4.0, + "l": 0.39, + "nf": 8 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M4", + "current": 2e-05, + "kind": "cascode" + }, + "VB2": { + "replica": "M1", + "current": 2e-05, + "kind": "cascode" + }, + "VB3": { + "replica": "M2", + "current": 2e-05 + } + }, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "851f47a091e47c6b", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M4", + "current_A": 2e-05, + "variant": "cascode" + }, + { + "kind": "replica_bias", + "port": "VB2", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "cascode" + }, + { + "kind": "replica_bias", + "port": "VB3", + "replica_of": "M2", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW2_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW2_sL1.5/manifest.json new file mode 100644 index 00000000..0a161074 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW2_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "97b008999b13754fc174f6f5e594b7a1041af76ede66012c72ea5cbe9b7c82f8", + "qualification.json": "8e29c5228a940e47d50dde21abd8c782755bb754824901fecfdeb7f17d713db2", + "specs.json": "2d430ded0b4b1b5bdbdf5292cde4ef66ed70c650935e31d03d0063f73358ea2c", + "target.spice": "39c81dc835b571fac0cd531cda484b6caa05e3d7c9d1e07d5c5fa498eeeccc05", + "target_lvs.spice": "dad6dd52c02cce42cb4fd02c4f3e75ea2f64e97a149e60b94bade05f9b1ddf17", + "testbench.spice": "3a3cf6a9eab611b429b317c55999f53c5f50ca2e64ac0502475d0c1292e14855" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW2_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW2_sL1.5/qualification.json new file mode 100644 index 00000000..d247be01 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW2_sL1.5/qualification.json @@ -0,0 +1,107 @@ +{ + "case_id": "C06_ihp130_sW2_sL1.5", + "circuit_id": "C06", + "pdk": "ihp130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "single", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "851f47a091e47c6b", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 30.63 + }, + "f3db": { + "min": 3017000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 33.62703, + "f3db": 5027927.0 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.4, + "schematic_measures": { + "vout0": 0.4350349, + "vin0": 0.4350349, + "idd": 2.024208e-05, + "gain_lf": 33.62703, + "f3db": 5027927.0, + "ugf": 242105800.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW2_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW2_sL1.5/specs.json new file mode 100644 index 00000000..41bd99d1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW2_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 30.63 + }, + "f3db": { + "min": 3017000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 33.62703, + "f3db": 5027927.0 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW2_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW2_sL1.5/target.spice new file mode 100644 index 00000000..72bbc2be --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW2_sL1.5/target.spice @@ -0,0 +1,6 @@ +.subckt C06_ihp130_sW2_sL1.5 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 +XM1 VOUT1 VB2 net10 VDD sg13_lv_pmos w=8u l=0.39u ng=16 m=1 +XM2 net10 VB3 VDD VDD sg13_lv_pmos w=8u l=0.39u ng=16 m=1 +XM3 net9 VIN1 VSS VSS sg13_lv_nmos w=4u l=0.39u ng=8 m=1 +XM4 VOUT1 VB1 net9 VSS sg13_lv_nmos w=4u l=0.39u ng=8 m=1 +.ends C06_ihp130_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW2_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW2_sL1.5/target_lvs.spice new file mode 100644 index 00000000..d005c8e1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW2_sL1.5/target_lvs.spice @@ -0,0 +1,50 @@ +.subckt C06_ihp130_sW2_sL1.5 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 +XM1_f0 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.39u +XM1_f1 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.39u +XM1_f2 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.39u +XM1_f3 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.39u +XM1_f4 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.39u +XM1_f5 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.39u +XM1_f6 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.39u +XM1_f7 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.39u +XM1_f8 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.39u +XM1_f9 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.39u +XM1_f10 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.39u +XM1_f11 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.39u +XM1_f12 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.39u +XM1_f13 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.39u +XM1_f14 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.39u +XM1_f15 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f0 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f1 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f2 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f3 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f4 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f5 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f6 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f7 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f8 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f9 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f10 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f11 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f12 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f13 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f14 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f15 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM3_f0 net9 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f1 net9 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f2 net9 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f3 net9 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f4 net9 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f5 net9 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f6 net9 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f7 net9 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f0 VOUT1 VB1 net9 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f1 VOUT1 VB1 net9 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f2 VOUT1 VB1 net9 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f3 VOUT1 VB1 net9 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f4 VOUT1 VB1 net9 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f5 VOUT1 VB1 net9 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f6 VOUT1 VB1 net9 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f7 VOUT1 VB1 net9 VSS sg13_lv_nmos w=0.5u l=0.39u +.ends C06_ihp130_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW2_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW2_sL1.5/testbench.spice new file mode 100644 index 00000000..31c0b7c8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW2_sL1.5/testbench.spice @@ -0,0 +1,31 @@ +X1 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 C06_ihp130_sW2_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +XB_VB1 VB1 VB1 VSS VSS sg13_lv_nmos w=4u l=0.39u +IB_VB1 VDDB VB1 8e-05 +XB_VB2 VB2 VB2 VDDB VDDB sg13_lv_pmos w=8u l=0.39u +IB_VB2 VB2 VSS 8e-05 +XB_VB3 VB3 VB3 VDDB VDDB sg13_lv_pmos w=8u l=0.39u +IB_VB3 VB3 VSS 2e-05 +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW2_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW2_sL1/case.json new file mode 100644 index 00000000..82ad6e24 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW2_sL1/case.json @@ -0,0 +1,163 @@ +{ + "case_id": "C06_ihp130_sW2_sL1", + "circuit_id": "C06", + "pdk": "ihp130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "dut_name": "C06_ihp130_sW2_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1", + "VB2", + "VB3" + ], + "sizing": { + "M1": { + "w": 8.0, + "l": 0.26, + "nf": 16 + }, + "M2": { + "w": 8.0, + "l": 0.26, + "nf": 16 + }, + "M3": { + "w": 4.0, + "l": 0.26, + "nf": 8 + }, + "M4": { + "w": 4.0, + "l": 0.26, + "nf": 8 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M4", + "current": 2e-05, + "kind": "cascode" + }, + "VB2": { + "replica": "M1", + "current": 2e-05, + "kind": "cascode" + }, + "VB3": { + "replica": "M2", + "current": 2e-05 + } + }, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.26, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.26, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "deff2cc2b4a17a28", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M4", + "current_A": 2e-05, + "variant": "cascode" + }, + { + "kind": "replica_bias", + "port": "VB2", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "cascode" + }, + { + "kind": "replica_bias", + "port": "VB3", + "replica_of": "M2", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW2_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW2_sL1/manifest.json new file mode 100644 index 00000000..c215a41a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW2_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "28cd6b46400c6ee9b95a50cbe0cc7d27c61fe8bb2810646b895373e27d9c0e06", + "qualification.json": "2fdfbec37e3d7ccf24b5ada2ab8b14ba1bb01190a13f60b38576610844b47480", + "specs.json": "322b5f2c1cb0a1c976c875a4a9233740b1e5b2b266b5c0a075625a601bb452b6", + "target.spice": "054f67a9b6fe8fb712bc5498ce4859dcec15fc21d4af50b5b187e5005cdfba50", + "target_lvs.spice": "6fab02b30cece71395cc8c24f603db1a801d17c8788fc5f1aa0c6f3e48d63cfc", + "testbench.spice": "a6722fa155644859a7f23252130d42fe66ba4a8c9a0dbefbb035dbcb502c8165" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW2_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW2_sL1/qualification.json new file mode 100644 index 00000000..f2bdaa9e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW2_sL1/qualification.json @@ -0,0 +1,107 @@ +{ + "case_id": "C06_ihp130_sW2_sL1", + "circuit_id": "C06", + "pdk": "ihp130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "single", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.26, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.26, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "deff2cc2b4a17a28", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 30.28 + }, + "f3db": { + "min": 3295000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 33.27684, + "f3db": 5491747.0 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.4, + "schematic_measures": { + "vout0": 0.4478767, + "vin0": 0.4478767, + "idd": 1.802846e-05, + "gain_lf": 33.27684, + "f3db": 5491747.0, + "ugf": 253779400.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW2_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW2_sL1/specs.json new file mode 100644 index 00000000..26d56237 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW2_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 30.28 + }, + "f3db": { + "min": 3295000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 33.27684, + "f3db": 5491747.0 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW2_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW2_sL1/target.spice new file mode 100644 index 00000000..7de75a20 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW2_sL1/target.spice @@ -0,0 +1,6 @@ +.subckt C06_ihp130_sW2_sL1 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 +XM1 VOUT1 VB2 net10 VDD sg13_lv_pmos w=8u l=0.26u ng=16 m=1 +XM2 net10 VB3 VDD VDD sg13_lv_pmos w=8u l=0.26u ng=16 m=1 +XM3 net9 VIN1 VSS VSS sg13_lv_nmos w=4u l=0.26u ng=8 m=1 +XM4 VOUT1 VB1 net9 VSS sg13_lv_nmos w=4u l=0.26u ng=8 m=1 +.ends C06_ihp130_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW2_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW2_sL1/target_lvs.spice new file mode 100644 index 00000000..a7ada69f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW2_sL1/target_lvs.spice @@ -0,0 +1,50 @@ +.subckt C06_ihp130_sW2_sL1 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 +XM1_f0 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.26u +XM1_f1 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.26u +XM1_f2 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.26u +XM1_f3 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.26u +XM1_f4 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.26u +XM1_f5 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.26u +XM1_f6 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.26u +XM1_f7 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.26u +XM1_f8 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.26u +XM1_f9 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.26u +XM1_f10 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.26u +XM1_f11 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.26u +XM1_f12 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.26u +XM1_f13 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.26u +XM1_f14 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.26u +XM1_f15 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f0 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f1 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f2 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f3 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f4 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f5 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f6 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f7 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f8 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f9 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f10 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f11 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f12 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f13 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f14 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f15 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM3_f0 net9 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f1 net9 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f2 net9 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f3 net9 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f4 net9 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f5 net9 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f6 net9 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f7 net9 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f0 VOUT1 VB1 net9 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f1 VOUT1 VB1 net9 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f2 VOUT1 VB1 net9 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f3 VOUT1 VB1 net9 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f4 VOUT1 VB1 net9 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f5 VOUT1 VB1 net9 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f6 VOUT1 VB1 net9 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f7 VOUT1 VB1 net9 VSS sg13_lv_nmos w=0.5u l=0.26u +.ends C06_ihp130_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW2_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW2_sL1/testbench.spice new file mode 100644 index 00000000..83973013 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW2_sL1/testbench.spice @@ -0,0 +1,31 @@ +X1 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 C06_ihp130_sW2_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +XB_VB1 VB1 VB1 VSS VSS sg13_lv_nmos w=4u l=0.26u +IB_VB1 VDDB VB1 8e-05 +XB_VB2 VB2 VB2 VDDB VDDB sg13_lv_pmos w=8u l=0.26u +IB_VB2 VB2 VSS 8e-05 +XB_VB3 VB3 VB3 VDDB VDDB sg13_lv_pmos w=8u l=0.26u +IB_VB3 VB3 VSS 2e-05 +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW2_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW2_sL2/case.json new file mode 100644 index 00000000..df50c135 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW2_sL2/case.json @@ -0,0 +1,163 @@ +{ + "case_id": "C06_ihp130_sW2_sL2", + "circuit_id": "C06", + "pdk": "ihp130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "dut_name": "C06_ihp130_sW2_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1", + "VB2", + "VB3" + ], + "sizing": { + "M1": { + "w": 8.0, + "l": 0.52, + "nf": 16 + }, + "M2": { + "w": 8.0, + "l": 0.52, + "nf": 16 + }, + "M3": { + "w": 4.0, + "l": 0.52, + "nf": 8 + }, + "M4": { + "w": 4.0, + "l": 0.52, + "nf": 8 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M4", + "current": 2e-05, + "kind": "cascode" + }, + "VB2": { + "replica": "M1", + "current": 2e-05, + "kind": "cascode" + }, + "VB3": { + "replica": "M2", + "current": 2e-05 + } + }, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "11a2dd171388db52", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M4", + "current_A": 2e-05, + "variant": "cascode" + }, + { + "kind": "replica_bias", + "port": "VB2", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "cascode" + }, + { + "kind": "replica_bias", + "port": "VB3", + "replica_of": "M2", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW2_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW2_sL2/manifest.json new file mode 100644 index 00000000..88e35d3e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW2_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "688505db4cee3fcb36f0936dfc37948ad02796c5724ab7227fd7d16df69bb93a", + "qualification.json": "feb0e587d11af05a9ad4bf832b5b1636e51a5f96bbed9038a8c9eb31372ff762", + "specs.json": "c3dc1fb4a9f0c05520509356b9d489486004d381e5c688960ef328bc4e9fa38d", + "target.spice": "b098892d368f10b05a3b2dbeaca07b0c845ba64069720a8e4b2a30d6b19b5d44", + "target_lvs.spice": "c06e256bab48788973e71c0ee57bb8e73edc74514a0b4735e931b9049c283f05", + "testbench.spice": "820111de5a10f23c6f6ba295f343af747300293d86cd60be72cceb50d72c7453" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW2_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW2_sL2/qualification.json new file mode 100644 index 00000000..319a00b8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW2_sL2/qualification.json @@ -0,0 +1,107 @@ +{ + "case_id": "C06_ihp130_sW2_sL2", + "circuit_id": "C06", + "pdk": "ihp130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "single", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "11a2dd171388db52", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 30.92 + }, + "f3db": { + "min": 2723000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 33.91987, + "f3db": 4538329.0 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.4, + "schematic_measures": { + "vout0": 0.436597, + "vin0": 0.436597, + "idd": 2.137046e-05, + "gain_lf": 33.91987, + "f3db": 4538329.0, + "ugf": 225810500.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW2_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW2_sL2/specs.json new file mode 100644 index 00000000..dab8dc5c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW2_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 30.92 + }, + "f3db": { + "min": 2723000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 33.91987, + "f3db": 4538329.0 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW2_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW2_sL2/target.spice new file mode 100644 index 00000000..0170c57b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW2_sL2/target.spice @@ -0,0 +1,6 @@ +.subckt C06_ihp130_sW2_sL2 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 +XM1 VOUT1 VB2 net10 VDD sg13_lv_pmos w=8u l=0.52u ng=16 m=1 +XM2 net10 VB3 VDD VDD sg13_lv_pmos w=8u l=0.52u ng=16 m=1 +XM3 net9 VIN1 VSS VSS sg13_lv_nmos w=4u l=0.52u ng=8 m=1 +XM4 VOUT1 VB1 net9 VSS sg13_lv_nmos w=4u l=0.52u ng=8 m=1 +.ends C06_ihp130_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW2_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW2_sL2/target_lvs.spice new file mode 100644 index 00000000..25b80a01 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW2_sL2/target_lvs.spice @@ -0,0 +1,50 @@ +.subckt C06_ihp130_sW2_sL2 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 +XM1_f0 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f1 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f2 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f3 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f4 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f5 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f6 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f7 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f8 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f9 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f10 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f11 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f12 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f13 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f14 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f15 VOUT1 VB2 net10 VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f0 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f1 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f2 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f3 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f4 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f5 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f6 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f7 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f8 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f9 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f10 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f11 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f12 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f13 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f14 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f15 net10 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM3_f0 net9 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f1 net9 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f2 net9 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f3 net9 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f4 net9 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f5 net9 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f6 net9 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f7 net9 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f0 VOUT1 VB1 net9 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f1 VOUT1 VB1 net9 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f2 VOUT1 VB1 net9 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f3 VOUT1 VB1 net9 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f4 VOUT1 VB1 net9 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f5 VOUT1 VB1 net9 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f6 VOUT1 VB1 net9 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f7 VOUT1 VB1 net9 VSS sg13_lv_nmos w=0.5u l=0.52u +.ends C06_ihp130_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW2_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW2_sL2/testbench.spice new file mode 100644 index 00000000..b6a7e315 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/ihp130/sW2_sL2/testbench.spice @@ -0,0 +1,31 @@ +X1 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 C06_ihp130_sW2_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +XB_VB1 VB1 VB1 VSS VSS sg13_lv_nmos w=4u l=0.52u +IB_VB1 VDDB VB1 8e-05 +XB_VB2 VB2 VB2 VDDB VDDB sg13_lv_pmos w=8u l=0.52u +IB_VB2 VB2 VSS 8e-05 +XB_VB3 VB3 VB3 VDDB VDDB sg13_lv_pmos w=8u l=0.52u +IB_VB3 VB3 VSS 2e-05 +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C06/sky130/sW0.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW0.5_sL1.5/case.json new file mode 100644 index 00000000..c06c4263 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW0.5_sL1.5/case.json @@ -0,0 +1,163 @@ +{ + "case_id": "C06_sky130_sW0.5_sL1.5", + "circuit_id": "C06", + "pdk": "sky130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "dut_name": "C06_sky130_sW0.5_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1", + "VB2", + "VB3" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.45, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 0.45, + "nf": 4 + }, + "M3": { + "w": 1.0, + "l": 0.45, + "nf": 2 + }, + "M4": { + "w": 1.0, + "l": 0.45, + "nf": 2 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M4", + "current": 2e-05, + "kind": "cascode" + }, + "VB2": { + "replica": "M1", + "current": 2e-05, + "kind": "cascode" + }, + "VB3": { + "replica": "M2", + "current": 2e-05 + } + }, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.45, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.45, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "f6de7845e8f9caf2", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M4", + "current_A": 2e-05, + "variant": "cascode" + }, + { + "kind": "replica_bias", + "port": "VB2", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "cascode" + }, + { + "kind": "replica_bias", + "port": "VB3", + "replica_of": "M2", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/sky130/sW0.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW0.5_sL1.5/manifest.json new file mode 100644 index 00000000..2796d5f9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW0.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "e528b04027980bd50d7a6a5a35c4ea7ade3ff3ce1db09f9b0a36153b2eccbdbf", + "qualification.json": "3d83fef2c620177058ffb0906a341429b562708ce5fa87afecc6a131c9a60bc5", + "specs.json": "58e20c1b5ca26039405cfa6058611274dfaee7b0fd39c35d6f0b503083aea1a3", + "target.spice": "2eabdd5b1723ec74744141e5d0b166c921065e10eeb5b7f048cd9ed3291b7e93", + "target_lvs.spice": "dd5d1d5d214561afb524bba92f810cd7bc720b92ff5058aad5eb9f6d22eb3fbb", + "testbench.spice": "04511cad0eeade8e1330467286b14adce1a8609d08c5a826e3599c48c5ae7bab" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/sky130/sW0.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW0.5_sL1.5/qualification.json new file mode 100644 index 00000000..a602c916 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW0.5_sL1.5/qualification.json @@ -0,0 +1,107 @@ +{ + "case_id": "C06_sky130_sW0.5_sL1.5", + "circuit_id": "C06", + "pdk": "sky130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "single", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.45, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.45, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "f6de7845e8f9caf2", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 33.49 + }, + "f3db": { + "min": 1245000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 36.48902, + "f3db": 2074689.0 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 8.8, + "schematic_measures": { + "vout0": 0.9721896, + "vin0": 0.9721896, + "idd": 2.417715e-05, + "gain_lf": 36.48902, + "f3db": 2074689.0, + "ugf": 138911500.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/sky130/sW0.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW0.5_sL1.5/specs.json new file mode 100644 index 00000000..b4aa98da --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW0.5_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 33.49 + }, + "f3db": { + "min": 1245000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 36.48902, + "f3db": 2074689.0 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/sky130/sW0.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW0.5_sL1.5/target.spice new file mode 100644 index 00000000..fd85678a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW0.5_sL1.5/target.spice @@ -0,0 +1,6 @@ +.subckt C06_sky130_sW0.5_sL1.5 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 +XM1 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=2 l=0.45 nf=4 +XM2 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=2 l=0.45 nf=4 +XM3 net9 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=1 l=0.45 nf=2 +XM4 VOUT1 VB1 net9 VSS sky130_fd_pr__nfet_01v8 w=1 l=0.45 nf=2 +.ends C06_sky130_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C06/sky130/sW0.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW0.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..d7755990 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW0.5_sL1.5/target_lvs.spice @@ -0,0 +1,14 @@ +.subckt C06_sky130_sW0.5_sL1.5 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 +XM1_f0 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM1_f1 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM1_f2 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM1_f3 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f0 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f1 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f2 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f3 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM3_f0 net9 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f1 net9 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f0 VOUT1 VB1 net9 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f1 VOUT1 VB1 net9 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +.ends C06_sky130_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C06/sky130/sW0.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW0.5_sL1.5/testbench.spice new file mode 100644 index 00000000..eaf1e839 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW0.5_sL1.5/testbench.spice @@ -0,0 +1,31 @@ +X1 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 C06_sky130_sW0.5_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +XB_VB1 VB1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=1 l=0.45 +IB_VB1 VDDB VB1 8e-05 +XB_VB2 VB2 VB2 VDDB VDDB sky130_fd_pr__pfet_01v8 w=2 l=0.45 +IB_VB2 VB2 VSS 8e-05 +XB_VB3 VB3 VB3 VDDB VDDB sky130_fd_pr__pfet_01v8 w=2 l=0.45 +IB_VB3 VB3 VSS 2e-05 +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C06/sky130/sW0.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW0.5_sL1/case.json new file mode 100644 index 00000000..546cb4ff --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW0.5_sL1/case.json @@ -0,0 +1,163 @@ +{ + "case_id": "C06_sky130_sW0.5_sL1", + "circuit_id": "C06", + "pdk": "sky130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "dut_name": "C06_sky130_sW0.5_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1", + "VB2", + "VB3" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.3, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 0.3, + "nf": 4 + }, + "M3": { + "w": 1.0, + "l": 0.3, + "nf": 2 + }, + "M4": { + "w": 1.0, + "l": 0.3, + "nf": 2 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M4", + "current": 2e-05, + "kind": "cascode" + }, + "VB2": { + "replica": "M1", + "current": 2e-05, + "kind": "cascode" + }, + "VB3": { + "replica": "M2", + "current": 2e-05 + } + }, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.3, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.3, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "1f55d153da27b7e6", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M4", + "current_A": 2e-05, + "variant": "cascode" + }, + { + "kind": "replica_bias", + "port": "VB2", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "cascode" + }, + { + "kind": "replica_bias", + "port": "VB3", + "replica_of": "M2", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/sky130/sW0.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW0.5_sL1/manifest.json new file mode 100644 index 00000000..17341702 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW0.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "0e7b82013b07ad976e5636036eed71235f4485f36f242dda3212a868fcee23f7", + "qualification.json": "2230f8a90e396665373e9fb0a4a40b0982abfe97248e7035b2006f9d8fc77116", + "specs.json": "1d5115fbcadd2400fa68c380f353e619f2386182f78bb96528aa071bf2cd4787", + "target.spice": "fa434b93b9295704f35d523aa6cd305d45fe35defe85f61814cfacd40cb85888", + "target_lvs.spice": "24c9a38a60960d6122b16eb3cbb7e32e3a8da68abc58b374fc62975e42477e13", + "testbench.spice": "31f6a6d65aa667133717d60d846575e3ec9fcf79f988c9e38db9e3427b13855c" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/sky130/sW0.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW0.5_sL1/qualification.json new file mode 100644 index 00000000..5640a2eb --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW0.5_sL1/qualification.json @@ -0,0 +1,107 @@ +{ + "case_id": "C06_sky130_sW0.5_sL1", + "circuit_id": "C06", + "pdk": "sky130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "single", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.3, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.3, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "1f55d153da27b7e6", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 35.32 + }, + "f3db": { + "min": 1320000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 38.32105, + "f3db": 2199673.0 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 11.0, + "schematic_measures": { + "vout0": 0.9259073, + "vin0": 0.9259073, + "idd": 2.36117e-05, + "gain_lf": 38.32105, + "f3db": 2199673.0, + "ugf": 181913400.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/sky130/sW0.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW0.5_sL1/specs.json new file mode 100644 index 00000000..2d8dd67c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW0.5_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 35.32 + }, + "f3db": { + "min": 1320000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 38.32105, + "f3db": 2199673.0 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/sky130/sW0.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW0.5_sL1/target.spice new file mode 100644 index 00000000..072f4c24 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW0.5_sL1/target.spice @@ -0,0 +1,6 @@ +.subckt C06_sky130_sW0.5_sL1 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 +XM1 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=2 l=0.3 nf=4 +XM2 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=2 l=0.3 nf=4 +XM3 net9 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=1 l=0.3 nf=2 +XM4 VOUT1 VB1 net9 VSS sky130_fd_pr__nfet_01v8 w=1 l=0.3 nf=2 +.ends C06_sky130_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C06/sky130/sW0.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW0.5_sL1/target_lvs.spice new file mode 100644 index 00000000..2e8b347f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW0.5_sL1/target_lvs.spice @@ -0,0 +1,14 @@ +.subckt C06_sky130_sW0.5_sL1 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 +XM1_f0 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM1_f1 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM1_f2 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM1_f3 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f0 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f1 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f2 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f3 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM3_f0 net9 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f1 net9 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f0 VOUT1 VB1 net9 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f1 VOUT1 VB1 net9 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +.ends C06_sky130_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C06/sky130/sW0.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW0.5_sL1/testbench.spice new file mode 100644 index 00000000..d955fc55 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW0.5_sL1/testbench.spice @@ -0,0 +1,31 @@ +X1 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 C06_sky130_sW0.5_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +XB_VB1 VB1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=1 l=0.3 +IB_VB1 VDDB VB1 8e-05 +XB_VB2 VB2 VB2 VDDB VDDB sky130_fd_pr__pfet_01v8 w=2 l=0.3 +IB_VB2 VB2 VSS 8e-05 +XB_VB3 VB3 VB3 VDDB VDDB sky130_fd_pr__pfet_01v8 w=2 l=0.3 +IB_VB3 VB3 VSS 2e-05 +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C06/sky130/sW0.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW0.5_sL2/case.json new file mode 100644 index 00000000..a8dcd821 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW0.5_sL2/case.json @@ -0,0 +1,163 @@ +{ + "case_id": "C06_sky130_sW0.5_sL2", + "circuit_id": "C06", + "pdk": "sky130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "dut_name": "C06_sky130_sW0.5_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1", + "VB2", + "VB3" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.6, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 0.6, + "nf": 4 + }, + "M3": { + "w": 1.0, + "l": 0.6, + "nf": 2 + }, + "M4": { + "w": 1.0, + "l": 0.6, + "nf": 2 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M4", + "current": 2e-05, + "kind": "cascode" + }, + "VB2": { + "replica": "M1", + "current": 2e-05, + "kind": "cascode" + }, + "VB3": { + "replica": "M2", + "current": 2e-05 + } + }, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.6, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.6, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "74cb5b113c474ab2", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M4", + "current_A": 2e-05, + "variant": "cascode" + }, + { + "kind": "replica_bias", + "port": "VB2", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "cascode" + }, + { + "kind": "replica_bias", + "port": "VB3", + "replica_of": "M2", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/sky130/sW0.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW0.5_sL2/manifest.json new file mode 100644 index 00000000..a21ef56b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW0.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "3b1f20bf25f74963deecfe0c92aba9b57c6d3b4063efde57e9cf5b98baa72d4d", + "qualification.json": "88ac13c7cd39dc0016566f6e6d84f92ed076a4f6036bea9638ecf9e4f823b8fc", + "specs.json": "7d5d889f2f3e5c87c9a46a94c632ea38a1f5ac90b4518162b84e07efaba34604", + "target.spice": "017461cc0569707513f983db64750abe3d025a53686c295ad1242afb10d02465", + "target_lvs.spice": "4ae8d422bba402d340c44c40785f6536cfc170d65c711f7e1a869404991645f3", + "testbench.spice": "0a335073f3b664a833930bbdd85364b0f93669ce782691cc11fb473eb51280b4" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/sky130/sW0.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW0.5_sL2/qualification.json new file mode 100644 index 00000000..b64d41d7 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW0.5_sL2/qualification.json @@ -0,0 +1,109 @@ +{ + "case_id": "C06_sky130_sW0.5_sL2", + "circuit_id": "C06", + "pdk": "sky130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "single", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.6, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.6, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "74cb5b113c474ab2", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "gain_lf=27.82 below floor 30" + ], + "spec": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 2776000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 27.82435, + "f3db": 4627096.0 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 10.2, + "schematic_measures": { + "vout0": 1.021696, + "vin0": 1.021696, + "idd": 2.453699e-05, + "gain_lf": 27.82435, + "f3db": 4627096.0, + "ugf": 114174000.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/sky130/sW0.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW0.5_sL2/specs.json new file mode 100644 index 00000000..bf20ba53 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW0.5_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 2776000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 27.82435, + "f3db": 4627096.0 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/sky130/sW0.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW0.5_sL2/target.spice new file mode 100644 index 00000000..dd519a5c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW0.5_sL2/target.spice @@ -0,0 +1,6 @@ +.subckt C06_sky130_sW0.5_sL2 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 +XM1 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=2 l=0.6 nf=4 +XM2 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=2 l=0.6 nf=4 +XM3 net9 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=1 l=0.6 nf=2 +XM4 VOUT1 VB1 net9 VSS sky130_fd_pr__nfet_01v8 w=1 l=0.6 nf=2 +.ends C06_sky130_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C06/sky130/sW0.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW0.5_sL2/target_lvs.spice new file mode 100644 index 00000000..406453ff --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW0.5_sL2/target_lvs.spice @@ -0,0 +1,14 @@ +.subckt C06_sky130_sW0.5_sL2 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 +XM1_f0 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f1 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f2 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f3 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f0 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f1 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f2 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f3 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM3_f0 net9 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f1 net9 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f0 VOUT1 VB1 net9 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f1 VOUT1 VB1 net9 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +.ends C06_sky130_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C06/sky130/sW0.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW0.5_sL2/testbench.spice new file mode 100644 index 00000000..446c425c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW0.5_sL2/testbench.spice @@ -0,0 +1,31 @@ +X1 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 C06_sky130_sW0.5_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +XB_VB1 VB1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=1 l=0.6 +IB_VB1 VDDB VB1 8e-05 +XB_VB2 VB2 VB2 VDDB VDDB sky130_fd_pr__pfet_01v8 w=2 l=0.6 +IB_VB2 VB2 VSS 8e-05 +XB_VB3 VB3 VB3 VDDB VDDB sky130_fd_pr__pfet_01v8 w=2 l=0.6 +IB_VB3 VB3 VSS 2e-05 +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1.5_sL1.5/case.json new file mode 100644 index 00000000..b0b88643 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1.5_sL1.5/case.json @@ -0,0 +1,163 @@ +{ + "case_id": "C06_sky130_sW1.5_sL1.5", + "circuit_id": "C06", + "pdk": "sky130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "dut_name": "C06_sky130_sW1.5_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1", + "VB2", + "VB3" + ], + "sizing": { + "M1": { + "w": 6.0, + "l": 0.45, + "nf": 12 + }, + "M2": { + "w": 6.0, + "l": 0.45, + "nf": 12 + }, + "M3": { + "w": 3.0, + "l": 0.45, + "nf": 6 + }, + "M4": { + "w": 3.0, + "l": 0.45, + "nf": 6 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M4", + "current": 2e-05, + "kind": "cascode" + }, + "VB2": { + "replica": "M1", + "current": 2e-05, + "kind": "cascode" + }, + "VB3": { + "replica": "M2", + "current": 2e-05 + } + }, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.45, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.45, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.45, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.45, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "32456d73fa1c5aac", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M4", + "current_A": 2e-05, + "variant": "cascode" + }, + { + "kind": "replica_bias", + "port": "VB2", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "cascode" + }, + { + "kind": "replica_bias", + "port": "VB3", + "replica_of": "M2", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1.5_sL1.5/manifest.json new file mode 100644 index 00000000..2eb88fc2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "0c7f384e24de3bf845b68c5eb77b0408f7d16ed05e664efae26d9d4ff78c5f48", + "qualification.json": "560b7cff24c4bfef518dfb77a62a443a857cf357369e2e60a4f9ba2f8070a20b", + "specs.json": "d0783c1848e136ab4cc51edcc2ee4de3d93400b5df949ac0cc5f4e4a2016dcd2", + "target.spice": "6ec8d9b811312ca71dc1ef695346181a9fa2f3b8efec1d8d8e68125ba50c4b61", + "target_lvs.spice": "32e4575cf7b1900a4b8aa7dc7b0663d63a45f6a3d6c18b06907d2f0bb85e2424", + "testbench.spice": "d96d9ff5cc557761cc2d52512fdfb4db1754ab6041797e7a90e02ee1caab6550" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1.5_sL1.5/qualification.json new file mode 100644 index 00000000..c0d13be3 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1.5_sL1.5/qualification.json @@ -0,0 +1,107 @@ +{ + "case_id": "C06_sky130_sW1.5_sL1.5", + "circuit_id": "C06", + "pdk": "sky130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "single", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.45, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.45, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.45, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.45, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "32456d73fa1c5aac", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 2100000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 31.62205, + "f3db": 3499481.0 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 9.7, + "schematic_measures": { + "vout0": 0.9040551, + "vin0": 0.9040551, + "idd": 3.155117e-05, + "gain_lf": 31.62205, + "f3db": 3499481.0, + "ugf": 133912400.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1.5_sL1.5/specs.json new file mode 100644 index 00000000..d149ad9b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1.5_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 2100000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 31.62205, + "f3db": 3499481.0 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1.5_sL1.5/target.spice new file mode 100644 index 00000000..83499e23 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1.5_sL1.5/target.spice @@ -0,0 +1,6 @@ +.subckt C06_sky130_sW1.5_sL1.5 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 +XM1 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=6 l=0.45 nf=12 +XM2 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=6 l=0.45 nf=12 +XM3 net9 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=3 l=0.45 nf=6 +XM4 VOUT1 VB1 net9 VSS sky130_fd_pr__nfet_01v8 w=3 l=0.45 nf=6 +.ends C06_sky130_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..d50b5a6f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1.5_sL1.5/target_lvs.spice @@ -0,0 +1,38 @@ +.subckt C06_sky130_sW1.5_sL1.5 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 +XM1_f0 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM1_f1 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM1_f2 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM1_f3 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM1_f4 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM1_f5 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM1_f6 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM1_f7 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM1_f8 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM1_f9 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM1_f10 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM1_f11 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f0 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f1 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f2 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f3 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f4 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f5 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f6 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f7 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f8 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f9 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f10 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f11 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM3_f0 net9 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f1 net9 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f2 net9 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f3 net9 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f4 net9 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f5 net9 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f0 VOUT1 VB1 net9 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f1 VOUT1 VB1 net9 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f2 VOUT1 VB1 net9 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f3 VOUT1 VB1 net9 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f4 VOUT1 VB1 net9 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f5 VOUT1 VB1 net9 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +.ends C06_sky130_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1.5_sL1.5/testbench.spice new file mode 100644 index 00000000..52220aca --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1.5_sL1.5/testbench.spice @@ -0,0 +1,31 @@ +X1 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 C06_sky130_sW1.5_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +XB_VB1 VB1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=3 l=0.45 +IB_VB1 VDDB VB1 8e-05 +XB_VB2 VB2 VB2 VDDB VDDB sky130_fd_pr__pfet_01v8 w=6 l=0.45 +IB_VB2 VB2 VSS 8e-05 +XB_VB3 VB3 VB3 VDDB VDDB sky130_fd_pr__pfet_01v8 w=6 l=0.45 +IB_VB3 VB3 VSS 2e-05 +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1.5_sL1/case.json new file mode 100644 index 00000000..98e1a9ea --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1.5_sL1/case.json @@ -0,0 +1,163 @@ +{ + "case_id": "C06_sky130_sW1.5_sL1", + "circuit_id": "C06", + "pdk": "sky130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "dut_name": "C06_sky130_sW1.5_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1", + "VB2", + "VB3" + ], + "sizing": { + "M1": { + "w": 6.0, + "l": 0.3, + "nf": 12 + }, + "M2": { + "w": 6.0, + "l": 0.3, + "nf": 12 + }, + "M3": { + "w": 3.0, + "l": 0.3, + "nf": 6 + }, + "M4": { + "w": 3.0, + "l": 0.3, + "nf": 6 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M4", + "current": 2e-05, + "kind": "cascode" + }, + "VB2": { + "replica": "M1", + "current": 2e-05, + "kind": "cascode" + }, + "VB3": { + "replica": "M2", + "current": 2e-05 + } + }, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.3, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.3, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.3, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.3, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "e99a2b2be0d3f9e5", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M4", + "current_A": 2e-05, + "variant": "cascode" + }, + { + "kind": "replica_bias", + "port": "VB2", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "cascode" + }, + { + "kind": "replica_bias", + "port": "VB3", + "replica_of": "M2", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1.5_sL1/manifest.json new file mode 100644 index 00000000..10010762 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "fbeb76e802f6b83d96414863166686ec05349484e255760250475d3dff73dabd", + "qualification.json": "3f650fffa1c8c52cd578c8ad5de17d55f0b1bd9f315f5675f5a4c92f825fe339", + "specs.json": "598baf26f33a74b475a46b125f57b33dbd0b5c48d66326fce241da16c15543c5", + "target.spice": "5a2d05e1b21a3d0a56f08452262da2686ffe6eaf8e56d68cf04b4a6acc701209", + "target_lvs.spice": "a71136b08eb734c548f8d9c18b3664ac7214cff1f44f7c0aff67935bebc728aa", + "testbench.spice": "a4f9c0c8da49683f4506772487d3b1b2c34f8d29d29d42722e0624a469e8a8a1" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1.5_sL1/qualification.json new file mode 100644 index 00000000..8cf8e389 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1.5_sL1/qualification.json @@ -0,0 +1,109 @@ +{ + "case_id": "C06_sky130_sW1.5_sL1", + "circuit_id": "C06", + "pdk": "sky130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "single", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.3, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.3, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.3, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.3, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "e99a2b2be0d3f9e5", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "gain_lf=28.66 below floor 30" + ], + "spec": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 3461000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 28.65828, + "f3db": 5767797.0 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 7.8, + "schematic_measures": { + "vout0": 0.8882844, + "vin0": 0.8882844, + "idd": 3.270373e-05, + "gain_lf": 28.65828, + "f3db": 5767797.0, + "ugf": 156660600.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1.5_sL1/specs.json new file mode 100644 index 00000000..3a4ccdfc --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1.5_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 3461000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 28.65828, + "f3db": 5767797.0 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1.5_sL1/target.spice new file mode 100644 index 00000000..2b495e30 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1.5_sL1/target.spice @@ -0,0 +1,6 @@ +.subckt C06_sky130_sW1.5_sL1 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 +XM1 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=6 l=0.3 nf=12 +XM2 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=6 l=0.3 nf=12 +XM3 net9 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=3 l=0.3 nf=6 +XM4 VOUT1 VB1 net9 VSS sky130_fd_pr__nfet_01v8 w=3 l=0.3 nf=6 +.ends C06_sky130_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1.5_sL1/target_lvs.spice new file mode 100644 index 00000000..e50f3d4f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1.5_sL1/target_lvs.spice @@ -0,0 +1,38 @@ +.subckt C06_sky130_sW1.5_sL1 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 +XM1_f0 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM1_f1 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM1_f2 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM1_f3 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM1_f4 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM1_f5 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM1_f6 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM1_f7 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM1_f8 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM1_f9 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM1_f10 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM1_f11 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f0 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f1 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f2 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f3 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f4 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f5 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f6 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f7 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f8 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f9 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f10 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f11 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM3_f0 net9 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f1 net9 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f2 net9 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f3 net9 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f4 net9 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f5 net9 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f0 VOUT1 VB1 net9 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f1 VOUT1 VB1 net9 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f2 VOUT1 VB1 net9 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f3 VOUT1 VB1 net9 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f4 VOUT1 VB1 net9 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f5 VOUT1 VB1 net9 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +.ends C06_sky130_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1.5_sL1/testbench.spice new file mode 100644 index 00000000..c4567996 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1.5_sL1/testbench.spice @@ -0,0 +1,31 @@ +X1 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 C06_sky130_sW1.5_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +XB_VB1 VB1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=3 l=0.3 +IB_VB1 VDDB VB1 8e-05 +XB_VB2 VB2 VB2 VDDB VDDB sky130_fd_pr__pfet_01v8 w=6 l=0.3 +IB_VB2 VB2 VSS 8e-05 +XB_VB3 VB3 VB3 VDDB VDDB sky130_fd_pr__pfet_01v8 w=6 l=0.3 +IB_VB3 VB3 VSS 2e-05 +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1.5_sL2/case.json new file mode 100644 index 00000000..4e6e3723 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1.5_sL2/case.json @@ -0,0 +1,163 @@ +{ + "case_id": "C06_sky130_sW1.5_sL2", + "circuit_id": "C06", + "pdk": "sky130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "dut_name": "C06_sky130_sW1.5_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1", + "VB2", + "VB3" + ], + "sizing": { + "M1": { + "w": 6.0, + "l": 0.6, + "nf": 12 + }, + "M2": { + "w": 6.0, + "l": 0.6, + "nf": 12 + }, + "M3": { + "w": 3.0, + "l": 0.6, + "nf": 6 + }, + "M4": { + "w": 3.0, + "l": 0.6, + "nf": 6 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M4", + "current": 2e-05, + "kind": "cascode" + }, + "VB2": { + "replica": "M1", + "current": 2e-05, + "kind": "cascode" + }, + "VB3": { + "replica": "M2", + "current": 2e-05 + } + }, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.6, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.6, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.6, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.6, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "101e3c82adc5b1b7", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M4", + "current_A": 2e-05, + "variant": "cascode" + }, + { + "kind": "replica_bias", + "port": "VB2", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "cascode" + }, + { + "kind": "replica_bias", + "port": "VB3", + "replica_of": "M2", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1.5_sL2/manifest.json new file mode 100644 index 00000000..88dea891 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "b49614d2091cdf43eb6cf1969f6ec344f5da1dd6aeb570a4869ac6063fd373c4", + "qualification.json": "b54fe5e74ea8efb434468594213a40847f1e4e07e6a763aba59541012cb0ad83", + "specs.json": "e4b24900b6f813fc1aa0327ec8e4c04e584cf1a1972c91f112cf8a393ad67351", + "target.spice": "52e1a1aa080f45178ed8dc6792d0738273e61a3377f129cd601246462bfaffff", + "target_lvs.spice": "52ba908d5cfab7b655277620375b9feb644f2621668b0ac17701c54db2abbd79", + "testbench.spice": "adf9be64e5c980e026577c31a9b15bf8cde1b1995b2938031f12f632d2a553a5" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1.5_sL2/qualification.json new file mode 100644 index 00000000..79d69608 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1.5_sL2/qualification.json @@ -0,0 +1,107 @@ +{ + "case_id": "C06_sky130_sW1.5_sL2", + "circuit_id": "C06", + "pdk": "sky130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "single", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.6, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.6, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.6, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.6, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "101e3c82adc5b1b7", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 1617000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 31.72946, + "f3db": 2694726.0 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 6.2, + "schematic_measures": { + "vout0": 0.9448314, + "vin0": 0.9448314, + "idd": 3.132846e-05, + "gain_lf": 31.72946, + "f3db": 2694726.0, + "ugf": 104413800.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1.5_sL2/specs.json new file mode 100644 index 00000000..90a42452 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1.5_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 1617000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 31.72946, + "f3db": 2694726.0 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1.5_sL2/target.spice new file mode 100644 index 00000000..0db6a3b1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1.5_sL2/target.spice @@ -0,0 +1,6 @@ +.subckt C06_sky130_sW1.5_sL2 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 +XM1 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=6 l=0.6 nf=12 +XM2 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=6 l=0.6 nf=12 +XM3 net9 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=3 l=0.6 nf=6 +XM4 VOUT1 VB1 net9 VSS sky130_fd_pr__nfet_01v8 w=3 l=0.6 nf=6 +.ends C06_sky130_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1.5_sL2/target_lvs.spice new file mode 100644 index 00000000..d7049f2a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1.5_sL2/target_lvs.spice @@ -0,0 +1,38 @@ +.subckt C06_sky130_sW1.5_sL2 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 +XM1_f0 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f1 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f2 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f3 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f4 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f5 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f6 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f7 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f8 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f9 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f10 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f11 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f0 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f1 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f2 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f3 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f4 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f5 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f6 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f7 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f8 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f9 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f10 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f11 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM3_f0 net9 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f1 net9 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f2 net9 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f3 net9 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f4 net9 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f5 net9 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f0 VOUT1 VB1 net9 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f1 VOUT1 VB1 net9 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f2 VOUT1 VB1 net9 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f3 VOUT1 VB1 net9 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f4 VOUT1 VB1 net9 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f5 VOUT1 VB1 net9 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +.ends C06_sky130_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1.5_sL2/testbench.spice new file mode 100644 index 00000000..138a2c01 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1.5_sL2/testbench.spice @@ -0,0 +1,31 @@ +X1 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 C06_sky130_sW1.5_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +XB_VB1 VB1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=3 l=0.6 +IB_VB1 VDDB VB1 8e-05 +XB_VB2 VB2 VB2 VDDB VDDB sky130_fd_pr__pfet_01v8 w=6 l=0.6 +IB_VB2 VB2 VSS 8e-05 +XB_VB3 VB3 VB3 VDDB VDDB sky130_fd_pr__pfet_01v8 w=6 l=0.6 +IB_VB3 VB3 VSS 2e-05 +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1_sL1.5/case.json new file mode 100644 index 00000000..95bd9208 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1_sL1.5/case.json @@ -0,0 +1,163 @@ +{ + "case_id": "C06_sky130_sW1_sL1.5", + "circuit_id": "C06", + "pdk": "sky130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "dut_name": "C06_sky130_sW1_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1", + "VB2", + "VB3" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.45, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 0.45, + "nf": 8 + }, + "M3": { + "w": 2.0, + "l": 0.45, + "nf": 4 + }, + "M4": { + "w": 2.0, + "l": 0.45, + "nf": 4 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M4", + "current": 2e-05, + "kind": "cascode" + }, + "VB2": { + "replica": "M1", + "current": 2e-05, + "kind": "cascode" + }, + "VB3": { + "replica": "M2", + "current": 2e-05 + } + }, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "833cfe7aeaa9cc95", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M4", + "current_A": 2e-05, + "variant": "cascode" + }, + { + "kind": "replica_bias", + "port": "VB2", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "cascode" + }, + { + "kind": "replica_bias", + "port": "VB3", + "replica_of": "M2", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1_sL1.5/manifest.json new file mode 100644 index 00000000..c0e93a51 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "34aad71116bb3d4231ba28091a2102d433a27e6b8a5b32c4e6e30da2fec0e7ac", + "qualification.json": "0e9117744a452cc678b3c74b326a0ef6ec7d88ad383017ab58d103274ae12386", + "specs.json": "a739f806c7e24818d6bebcf8ea77379665da5d2a301e07d545731a4b6ff1cc46", + "target.spice": "f1c48077566d772001235c2958a67bc8faf89a04790c055f0853b2754786379d", + "target_lvs.spice": "69a5e63a4d8e271e53a387dbb75424fe17470d79e934b21bc4b1c3c41bb2771b", + "testbench.spice": "9c5ce06b06039b515ffacc1a8ea66aa422bc7578eb6e92815238fab2b1bb6ff5" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1_sL1.5/qualification.json new file mode 100644 index 00000000..2cdbdccd --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1_sL1.5/qualification.json @@ -0,0 +1,107 @@ +{ + "case_id": "C06_sky130_sW1_sL1.5", + "circuit_id": "C06", + "pdk": "sky130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "single", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "833cfe7aeaa9cc95", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 31.06 + }, + "f3db": { + "min": 1623000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 34.0632, + "f3db": 2704167.0 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 8.4, + "schematic_measures": { + "vout0": 0.9196085, + "vin0": 0.9196085, + "idd": 2.827558e-05, + "gain_lf": 34.0632, + "f3db": 2704167.0, + "ugf": 137010100.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1_sL1.5/specs.json new file mode 100644 index 00000000..75f3885b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 31.06 + }, + "f3db": { + "min": 1623000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 34.0632, + "f3db": 2704167.0 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1_sL1.5/target.spice new file mode 100644 index 00000000..737f3646 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1_sL1.5/target.spice @@ -0,0 +1,6 @@ +.subckt C06_sky130_sW1_sL1.5 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 +XM1 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=4 l=0.45 nf=8 +XM2 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=4 l=0.45 nf=8 +XM3 net9 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=2 l=0.45 nf=4 +XM4 VOUT1 VB1 net9 VSS sky130_fd_pr__nfet_01v8 w=2 l=0.45 nf=4 +.ends C06_sky130_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1_sL1.5/target_lvs.spice new file mode 100644 index 00000000..c72bb7c1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1_sL1.5/target_lvs.spice @@ -0,0 +1,26 @@ +.subckt C06_sky130_sW1_sL1.5 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 +XM1_f0 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM1_f1 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM1_f2 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM1_f3 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM1_f4 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM1_f5 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM1_f6 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM1_f7 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f0 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f1 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f2 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f3 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f4 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f5 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f6 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f7 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM3_f0 net9 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f1 net9 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f2 net9 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f3 net9 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f0 VOUT1 VB1 net9 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f1 VOUT1 VB1 net9 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f2 VOUT1 VB1 net9 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f3 VOUT1 VB1 net9 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +.ends C06_sky130_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1_sL1.5/testbench.spice new file mode 100644 index 00000000..a070000e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1_sL1.5/testbench.spice @@ -0,0 +1,31 @@ +X1 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 C06_sky130_sW1_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +XB_VB1 VB1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=2 l=0.45 +IB_VB1 VDDB VB1 8e-05 +XB_VB2 VB2 VB2 VDDB VDDB sky130_fd_pr__pfet_01v8 w=4 l=0.45 +IB_VB2 VB2 VSS 8e-05 +XB_VB3 VB3 VB3 VDDB VDDB sky130_fd_pr__pfet_01v8 w=4 l=0.45 +IB_VB3 VB3 VSS 2e-05 +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1_sL1/case.json new file mode 100644 index 00000000..0c0bb118 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1_sL1/case.json @@ -0,0 +1,163 @@ +{ + "case_id": "C06_sky130_sW1_sL1", + "circuit_id": "C06", + "pdk": "sky130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "dut_name": "C06_sky130_sW1_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1", + "VB2", + "VB3" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.3, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 0.3, + "nf": 8 + }, + "M3": { + "w": 2.0, + "l": 0.3, + "nf": 4 + }, + "M4": { + "w": 2.0, + "l": 0.3, + "nf": 4 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M4", + "current": 2e-05, + "kind": "cascode" + }, + "VB2": { + "replica": "M1", + "current": 2e-05, + "kind": "cascode" + }, + "VB3": { + "replica": "M2", + "current": 2e-05 + } + }, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "335d0b79d88c93fb", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M4", + "current_A": 2e-05, + "variant": "cascode" + }, + { + "kind": "replica_bias", + "port": "VB2", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "cascode" + }, + { + "kind": "replica_bias", + "port": "VB3", + "replica_of": "M2", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1_sL1/manifest.json new file mode 100644 index 00000000..95f3f092 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "ed3883b668fff644961f02f1d9e429f309958808bf27e832f51a5054c5177b6b", + "qualification.json": "2fb4dc0a25a294ccd3483e6c4150ce1920856a78034b7e8b3e249c09f8711f62", + "specs.json": "3ef57aa8234e4df7a813a6d5e7c4bd379888e6c79bdcf07f44735c9d415d84fa", + "target.spice": "910e8e808b975db88d7628b8b4b3c6248bb89ddd963d0e0d6a1d8b3d55b6a961", + "target_lvs.spice": "473be6702cb8088d0787b07aabd5ff8a98f5662e15546f9790cbaddac5618c86", + "testbench.spice": "bbbc255dca36419207661606cf72f0b6330991aead3fe8ab449d50ce56f17ad3" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1_sL1/qualification.json new file mode 100644 index 00000000..67857d82 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1_sL1/qualification.json @@ -0,0 +1,107 @@ +{ + "case_id": "C06_sky130_sW1_sL1", + "circuit_id": "C06", + "pdk": "sky130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "single", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "335d0b79d88c93fb", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 2513000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 31.85868, + "f3db": 4187927.0 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 7.9, + "schematic_measures": { + "vout0": 0.8956893, + "vin0": 0.8956893, + "idd": 2.87363e-05, + "gain_lf": 31.85868, + "f3db": 4187927.0, + "ugf": 164614000.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1_sL1/specs.json new file mode 100644 index 00000000..a70d8a86 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 2513000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 31.85868, + "f3db": 4187927.0 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1_sL1/target.spice new file mode 100644 index 00000000..58a1f566 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1_sL1/target.spice @@ -0,0 +1,6 @@ +.subckt C06_sky130_sW1_sL1 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 +XM1 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=4 l=0.3 nf=8 +XM2 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=4 l=0.3 nf=8 +XM3 net9 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=2 l=0.3 nf=4 +XM4 VOUT1 VB1 net9 VSS sky130_fd_pr__nfet_01v8 w=2 l=0.3 nf=4 +.ends C06_sky130_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1_sL1/target_lvs.spice new file mode 100644 index 00000000..27eabdaf --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1_sL1/target_lvs.spice @@ -0,0 +1,26 @@ +.subckt C06_sky130_sW1_sL1 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 +XM1_f0 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM1_f1 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM1_f2 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM1_f3 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM1_f4 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM1_f5 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM1_f6 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM1_f7 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f0 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f1 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f2 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f3 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f4 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f5 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f6 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f7 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM3_f0 net9 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f1 net9 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f2 net9 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f3 net9 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f0 VOUT1 VB1 net9 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f1 VOUT1 VB1 net9 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f2 VOUT1 VB1 net9 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f3 VOUT1 VB1 net9 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +.ends C06_sky130_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1_sL1/testbench.spice new file mode 100644 index 00000000..6918766d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1_sL1/testbench.spice @@ -0,0 +1,31 @@ +X1 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 C06_sky130_sW1_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +XB_VB1 VB1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=2 l=0.3 +IB_VB1 VDDB VB1 8e-05 +XB_VB2 VB2 VB2 VDDB VDDB sky130_fd_pr__pfet_01v8 w=4 l=0.3 +IB_VB2 VB2 VSS 8e-05 +XB_VB3 VB3 VB3 VDDB VDDB sky130_fd_pr__pfet_01v8 w=4 l=0.3 +IB_VB3 VB3 VSS 2e-05 +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1_sL2/case.json new file mode 100644 index 00000000..c68b4987 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1_sL2/case.json @@ -0,0 +1,163 @@ +{ + "case_id": "C06_sky130_sW1_sL2", + "circuit_id": "C06", + "pdk": "sky130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "dut_name": "C06_sky130_sW1_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1", + "VB2", + "VB3" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.6, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 0.6, + "nf": 8 + }, + "M3": { + "w": 2.0, + "l": 0.6, + "nf": 4 + }, + "M4": { + "w": 2.0, + "l": 0.6, + "nf": 4 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M4", + "current": 2e-05, + "kind": "cascode" + }, + "VB2": { + "replica": "M1", + "current": 2e-05, + "kind": "cascode" + }, + "VB3": { + "replica": "M2", + "current": 2e-05 + } + }, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "74eb3cfbec8c455b", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M4", + "current_A": 2e-05, + "variant": "cascode" + }, + { + "kind": "replica_bias", + "port": "VB2", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "cascode" + }, + { + "kind": "replica_bias", + "port": "VB3", + "replica_of": "M2", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1_sL2/manifest.json new file mode 100644 index 00000000..cabc4b96 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "2da6e1ab6fe72b77c43a0466078115bde97b7ce45be6131f2fc7a3c1e889026f", + "qualification.json": "8155eba1e5c41dd995440cb92fcc75e173e77a9a3ddaab03d89b000e0dea53f8", + "specs.json": "a3d80efe9ab2f9e57716ad3199acfb7f2c5d5232a9997157cb7fefd9b04b3b7c", + "target.spice": "8768f34fd3c229eb34a6b836091417832e739fb8f9da2fb823d7acd7e45da57d", + "target_lvs.spice": "7a9408de72d9488af2b4f3af24164c4dabd799f523bc5836ee6078c1e0bc5937", + "testbench.spice": "62e202e31ba126ecef5f6b9b33e21bfed6297319b42a0c58d4dde53b6f49346b" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1_sL2/qualification.json new file mode 100644 index 00000000..8287664d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1_sL2/qualification.json @@ -0,0 +1,107 @@ +{ + "case_id": "C06_sky130_sW1_sL2", + "circuit_id": "C06", + "pdk": "sky130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "single", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "74eb3cfbec8c455b", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 30.47 + }, + "f3db": { + "min": 1375000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 33.47465, + "f3db": 2292044.0 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 8.4, + "schematic_measures": { + "vout0": 0.9613413, + "vin0": 0.9613413, + "idd": 2.825032e-05, + "gain_lf": 33.47465, + "f3db": 2292044.0, + "ugf": 108532800.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1_sL2/specs.json new file mode 100644 index 00000000..b0369a21 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 30.47 + }, + "f3db": { + "min": 1375000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 33.47465, + "f3db": 2292044.0 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1_sL2/target.spice new file mode 100644 index 00000000..bb08b59e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1_sL2/target.spice @@ -0,0 +1,6 @@ +.subckt C06_sky130_sW1_sL2 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 +XM1 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=4 l=0.6 nf=8 +XM2 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=4 l=0.6 nf=8 +XM3 net9 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=2 l=0.6 nf=4 +XM4 VOUT1 VB1 net9 VSS sky130_fd_pr__nfet_01v8 w=2 l=0.6 nf=4 +.ends C06_sky130_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1_sL2/target_lvs.spice new file mode 100644 index 00000000..26868c64 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1_sL2/target_lvs.spice @@ -0,0 +1,26 @@ +.subckt C06_sky130_sW1_sL2 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 +XM1_f0 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f1 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f2 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f3 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f4 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f5 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f6 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f7 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f0 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f1 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f2 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f3 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f4 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f5 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f6 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f7 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM3_f0 net9 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f1 net9 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f2 net9 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f3 net9 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f0 VOUT1 VB1 net9 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f1 VOUT1 VB1 net9 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f2 VOUT1 VB1 net9 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f3 VOUT1 VB1 net9 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +.ends C06_sky130_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1_sL2/testbench.spice new file mode 100644 index 00000000..57458552 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW1_sL2/testbench.spice @@ -0,0 +1,31 @@ +X1 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 C06_sky130_sW1_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +XB_VB1 VB1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=2 l=0.6 +IB_VB1 VDDB VB1 8e-05 +XB_VB2 VB2 VB2 VDDB VDDB sky130_fd_pr__pfet_01v8 w=4 l=0.6 +IB_VB2 VB2 VSS 8e-05 +XB_VB3 VB3 VB3 VDDB VDDB sky130_fd_pr__pfet_01v8 w=4 l=0.6 +IB_VB3 VB3 VSS 2e-05 +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C06/sky130/sW2_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW2_sL1.5/case.json new file mode 100644 index 00000000..8e0564f4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW2_sL1.5/case.json @@ -0,0 +1,163 @@ +{ + "case_id": "C06_sky130_sW2_sL1.5", + "circuit_id": "C06", + "pdk": "sky130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "dut_name": "C06_sky130_sW2_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1", + "VB2", + "VB3" + ], + "sizing": { + "M1": { + "w": 8.0, + "l": 0.45, + "nf": 16 + }, + "M2": { + "w": 8.0, + "l": 0.45, + "nf": 16 + }, + "M3": { + "w": 4.0, + "l": 0.45, + "nf": 8 + }, + "M4": { + "w": 4.0, + "l": 0.45, + "nf": 8 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M4", + "current": 2e-05, + "kind": "cascode" + }, + "VB2": { + "replica": "M1", + "current": 2e-05, + "kind": "cascode" + }, + "VB3": { + "replica": "M2", + "current": 2e-05 + } + }, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "8a82d1153ad1fe98", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M4", + "current_A": 2e-05, + "variant": "cascode" + }, + { + "kind": "replica_bias", + "port": "VB2", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "cascode" + }, + { + "kind": "replica_bias", + "port": "VB3", + "replica_of": "M2", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/sky130/sW2_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW2_sL1.5/manifest.json new file mode 100644 index 00000000..3e854d73 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW2_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "51544f31fbdf1861e9b426a3f64bfb6f0800a23e1195d318778dd39bd18a88e1", + "qualification.json": "9c80789a5f4337116a4dfdd56a11f097f55d60d657d973d06a70ffa5b49c4e93", + "specs.json": "f3a74e1ff792c2178f3609a923b71835b2397208d8fef4399cec1ab1a1395faf", + "target.spice": "c42ed50961963679f8c271dcabbc793e09af5719e4321cf90e1829e5b6195530", + "target_lvs.spice": "4907bcf3911cd310f7d5f2ba7f97be5068942f1731500f82ae0eb2362fb48a9c", + "testbench.spice": "c2558973141d5b7209b624bfb812e1957d1cc4cd16a247da2fcdf5bc1920ca46" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/sky130/sW2_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW2_sL1.5/qualification.json new file mode 100644 index 00000000..35a67344 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW2_sL1.5/qualification.json @@ -0,0 +1,109 @@ +{ + "case_id": "C06_sky130_sW2_sL1.5", + "circuit_id": "C06", + "pdk": "sky130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "single", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "8a82d1153ad1fe98", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "gain_lf=28.59 below floor 30" + ], + "spec": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 2596000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 28.59087, + "f3db": 4326249.0 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 9.4, + "schematic_measures": { + "vout0": 0.9109606, + "vin0": 0.9109606, + "idd": 3.433001e-05, + "gain_lf": 28.59087, + "f3db": 4326249.0, + "ugf": 116742800.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/sky130/sW2_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW2_sL1.5/specs.json new file mode 100644 index 00000000..362d0822 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW2_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 2596000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 28.59087, + "f3db": 4326249.0 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/sky130/sW2_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW2_sL1.5/target.spice new file mode 100644 index 00000000..640586e9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW2_sL1.5/target.spice @@ -0,0 +1,6 @@ +.subckt C06_sky130_sW2_sL1.5 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 +XM1 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=8 l=0.45 nf=16 +XM2 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=8 l=0.45 nf=16 +XM3 net9 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=4 l=0.45 nf=8 +XM4 VOUT1 VB1 net9 VSS sky130_fd_pr__nfet_01v8 w=4 l=0.45 nf=8 +.ends C06_sky130_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C06/sky130/sW2_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW2_sL1.5/target_lvs.spice new file mode 100644 index 00000000..997d89ef --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW2_sL1.5/target_lvs.spice @@ -0,0 +1,50 @@ +.subckt C06_sky130_sW2_sL1.5 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 +XM1_f0 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM1_f1 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM1_f2 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM1_f3 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM1_f4 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM1_f5 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM1_f6 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM1_f7 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM1_f8 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM1_f9 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM1_f10 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM1_f11 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM1_f12 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM1_f13 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM1_f14 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM1_f15 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f0 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f1 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f2 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f3 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f4 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f5 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f6 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f7 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f8 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f9 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f10 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f11 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f12 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f13 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f14 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f15 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM3_f0 net9 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f1 net9 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f2 net9 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f3 net9 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f4 net9 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f5 net9 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f6 net9 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f7 net9 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f0 VOUT1 VB1 net9 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f1 VOUT1 VB1 net9 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f2 VOUT1 VB1 net9 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f3 VOUT1 VB1 net9 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f4 VOUT1 VB1 net9 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f5 VOUT1 VB1 net9 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f6 VOUT1 VB1 net9 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f7 VOUT1 VB1 net9 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +.ends C06_sky130_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C06/sky130/sW2_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW2_sL1.5/testbench.spice new file mode 100644 index 00000000..744013a6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW2_sL1.5/testbench.spice @@ -0,0 +1,31 @@ +X1 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 C06_sky130_sW2_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +XB_VB1 VB1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=4 l=0.45 +IB_VB1 VDDB VB1 8e-05 +XB_VB2 VB2 VB2 VDDB VDDB sky130_fd_pr__pfet_01v8 w=8 l=0.45 +IB_VB2 VB2 VSS 8e-05 +XB_VB3 VB3 VB3 VDDB VDDB sky130_fd_pr__pfet_01v8 w=8 l=0.45 +IB_VB3 VB3 VSS 2e-05 +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C06/sky130/sW2_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW2_sL1/case.json new file mode 100644 index 00000000..0d82d67d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW2_sL1/case.json @@ -0,0 +1,163 @@ +{ + "case_id": "C06_sky130_sW2_sL1", + "circuit_id": "C06", + "pdk": "sky130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "dut_name": "C06_sky130_sW2_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1", + "VB2", + "VB3" + ], + "sizing": { + "M1": { + "w": 8.0, + "l": 0.3, + "nf": 16 + }, + "M2": { + "w": 8.0, + "l": 0.3, + "nf": 16 + }, + "M3": { + "w": 4.0, + "l": 0.3, + "nf": 8 + }, + "M4": { + "w": 4.0, + "l": 0.3, + "nf": 8 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M4", + "current": 2e-05, + "kind": "cascode" + }, + "VB2": { + "replica": "M1", + "current": 2e-05, + "kind": "cascode" + }, + "VB3": { + "replica": "M2", + "current": 2e-05 + } + }, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "2f46255bebd9aa8c", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M4", + "current_A": 2e-05, + "variant": "cascode" + }, + { + "kind": "replica_bias", + "port": "VB2", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "cascode" + }, + { + "kind": "replica_bias", + "port": "VB3", + "replica_of": "M2", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/sky130/sW2_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW2_sL1/manifest.json new file mode 100644 index 00000000..c1cf8019 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW2_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "e5818e6818aa24ab721a1a4e6a626f21210d92ae1befb97b007caf65a685714f", + "qualification.json": "4593c7874fed4aabea1cca858db0089c97a6c966af09099f791138d333286b37", + "specs.json": "4a6bc118d13b658002ad2fb7a74875d16cba193729e818c701d73c9c6b44350c", + "target.spice": "047b2373662a90b476f006b4db4600ab3511f4ccdf634fd676b6ae40a658eb9d", + "target_lvs.spice": "2d36768e49d5ef0414a4dc6eb4c165350029fc0d2b677dfd4464efa70b6f4454", + "testbench.spice": "c7069f6c45e4743ca047dd5078bb425d19a0b2bf907f91bb7175fd7a12dfd0e3" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/sky130/sW2_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW2_sL1/qualification.json new file mode 100644 index 00000000..dea35a5d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW2_sL1/qualification.json @@ -0,0 +1,109 @@ +{ + "case_id": "C06_sky130_sW2_sL1", + "circuit_id": "C06", + "pdk": "sky130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "single", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "2f46255bebd9aa8c", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "gain_lf=24.89 below floor 30" + ], + "spec": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 4437000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 24.88672, + "f3db": 7394724.0 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 8.3, + "schematic_measures": { + "vout0": 0.901791, + "vin0": 0.901791, + "idd": 3.598761e-05, + "gain_lf": 24.88672, + "f3db": 7394724.0, + "ugf": 130087900.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/sky130/sW2_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW2_sL1/specs.json new file mode 100644 index 00000000..eb63133a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW2_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 4437000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 24.88672, + "f3db": 7394724.0 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/sky130/sW2_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW2_sL1/target.spice new file mode 100644 index 00000000..1362aa24 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW2_sL1/target.spice @@ -0,0 +1,6 @@ +.subckt C06_sky130_sW2_sL1 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 +XM1 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=8 l=0.3 nf=16 +XM2 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=8 l=0.3 nf=16 +XM3 net9 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=4 l=0.3 nf=8 +XM4 VOUT1 VB1 net9 VSS sky130_fd_pr__nfet_01v8 w=4 l=0.3 nf=8 +.ends C06_sky130_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C06/sky130/sW2_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW2_sL1/target_lvs.spice new file mode 100644 index 00000000..de849490 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW2_sL1/target_lvs.spice @@ -0,0 +1,50 @@ +.subckt C06_sky130_sW2_sL1 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 +XM1_f0 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM1_f1 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM1_f2 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM1_f3 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM1_f4 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM1_f5 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM1_f6 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM1_f7 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM1_f8 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM1_f9 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM1_f10 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM1_f11 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM1_f12 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM1_f13 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM1_f14 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM1_f15 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f0 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f1 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f2 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f3 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f4 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f5 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f6 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f7 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f8 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f9 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f10 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f11 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f12 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f13 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f14 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f15 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM3_f0 net9 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f1 net9 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f2 net9 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f3 net9 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f4 net9 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f5 net9 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f6 net9 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f7 net9 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f0 VOUT1 VB1 net9 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f1 VOUT1 VB1 net9 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f2 VOUT1 VB1 net9 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f3 VOUT1 VB1 net9 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f4 VOUT1 VB1 net9 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f5 VOUT1 VB1 net9 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f6 VOUT1 VB1 net9 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f7 VOUT1 VB1 net9 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +.ends C06_sky130_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C06/sky130/sW2_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW2_sL1/testbench.spice new file mode 100644 index 00000000..bb4a2642 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW2_sL1/testbench.spice @@ -0,0 +1,31 @@ +X1 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 C06_sky130_sW2_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +XB_VB1 VB1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=4 l=0.3 +IB_VB1 VDDB VB1 8e-05 +XB_VB2 VB2 VB2 VDDB VDDB sky130_fd_pr__pfet_01v8 w=8 l=0.3 +IB_VB2 VB2 VSS 8e-05 +XB_VB3 VB3 VB3 VDDB VDDB sky130_fd_pr__pfet_01v8 w=8 l=0.3 +IB_VB3 VB3 VSS 2e-05 +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C06/sky130/sW2_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW2_sL2/case.json new file mode 100644 index 00000000..3f644c7d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW2_sL2/case.json @@ -0,0 +1,163 @@ +{ + "case_id": "C06_sky130_sW2_sL2", + "circuit_id": "C06", + "pdk": "sky130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "dut_name": "C06_sky130_sW2_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1", + "VB2", + "VB3" + ], + "sizing": { + "M1": { + "w": 8.0, + "l": 0.6, + "nf": 16 + }, + "M2": { + "w": 8.0, + "l": 0.6, + "nf": 16 + }, + "M3": { + "w": 4.0, + "l": 0.6, + "nf": 8 + }, + "M4": { + "w": 4.0, + "l": 0.6, + "nf": 8 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M4", + "current": 2e-05, + "kind": "cascode" + }, + "VB2": { + "replica": "M1", + "current": 2e-05, + "kind": "cascode" + }, + "VB3": { + "replica": "M2", + "current": 2e-05 + } + }, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "874c1c3eb064baa2", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M4", + "current_A": 2e-05, + "variant": "cascode" + }, + { + "kind": "replica_bias", + "port": "VB2", + "replica_of": "M1", + "current_A": 2e-05, + "variant": "cascode" + }, + { + "kind": "replica_bias", + "port": "VB3", + "replica_of": "M2", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/sky130/sW2_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW2_sL2/manifest.json new file mode 100644 index 00000000..70c51224 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW2_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "bded9cc56295cfa578a4a6fe6008dd203157d479fd0cc1145a719d2fbfd631a4", + "qualification.json": "ae1126ee1a914f9c4d18101917c06f32172530a0d96173d45bed44d3b10d0b9d", + "specs.json": "a6d531aabcd86067d76d499c50a23dd94b115abb5d10a9afa97245cde4e46598", + "target.spice": "dbe26c2d175c1decbfcb44c8d7420d7dbd3f83dff8d6cd4d8485bdac57b575b1", + "target_lvs.spice": "a5cf83f8c6436dfe62a46cf74f4063d2d3637a5bf72a665fc2535c729ee9a2a6", + "testbench.spice": "eca0c0603eaa671344fe35056a65d4e687f08f56d7cd9babca48e081eae7e497" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/sky130/sW2_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW2_sL2/qualification.json new file mode 100644 index 00000000..08f828fd --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW2_sL2/qualification.json @@ -0,0 +1,109 @@ +{ + "case_id": "C06_sky130_sW2_sL2", + "circuit_id": "C06", + "pdk": "sky130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "single", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "874c1c3eb064baa2", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "gain_lf=29.84 below floor 30" + ], + "spec": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 1869000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 29.83562, + "f3db": 3115616.0 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 10.3, + "schematic_measures": { + "vout0": 0.9447336, + "vin0": 0.9447336, + "idd": 3.401447e-05, + "gain_lf": 29.83562, + "f3db": 3115616.0, + "ugf": 97059820.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/sky130/sW2_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW2_sL2/specs.json new file mode 100644 index 00000000..5aadb70d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW2_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 1869000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 29.83562, + "f3db": 3115616.0 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C06/sky130/sW2_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW2_sL2/target.spice new file mode 100644 index 00000000..77f2fde2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW2_sL2/target.spice @@ -0,0 +1,6 @@ +.subckt C06_sky130_sW2_sL2 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 +XM1 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=8 l=0.6 nf=16 +XM2 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=8 l=0.6 nf=16 +XM3 net9 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=4 l=0.6 nf=8 +XM4 VOUT1 VB1 net9 VSS sky130_fd_pr__nfet_01v8 w=4 l=0.6 nf=8 +.ends C06_sky130_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C06/sky130/sW2_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW2_sL2/target_lvs.spice new file mode 100644 index 00000000..5cb85293 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW2_sL2/target_lvs.spice @@ -0,0 +1,50 @@ +.subckt C06_sky130_sW2_sL2 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 +XM1_f0 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f1 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f2 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f3 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f4 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f5 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f6 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f7 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f8 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f9 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f10 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f11 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f12 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f13 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f14 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f15 VOUT1 VB2 net10 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f0 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f1 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f2 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f3 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f4 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f5 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f6 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f7 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f8 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f9 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f10 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f11 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f12 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f13 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f14 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f15 net10 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM3_f0 net9 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f1 net9 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f2 net9 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f3 net9 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f4 net9 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f5 net9 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f6 net9 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f7 net9 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f0 VOUT1 VB1 net9 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f1 VOUT1 VB1 net9 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f2 VOUT1 VB1 net9 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f3 VOUT1 VB1 net9 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f4 VOUT1 VB1 net9 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f5 VOUT1 VB1 net9 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f6 VOUT1 VB1 net9 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f7 VOUT1 VB1 net9 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +.ends C06_sky130_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C06/sky130/sW2_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW2_sL2/testbench.spice new file mode 100644 index 00000000..5531ca07 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C06/sky130/sW2_sL2/testbench.spice @@ -0,0 +1,31 @@ +X1 VDD VSS VIN1 VOUT1 VB1 VB2 VB3 C06_sky130_sW2_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +XB_VB1 VB1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=4 l=0.6 +IB_VB1 VDDB VB1 8e-05 +XB_VB2 VB2 VB2 VDDB VDDB sky130_fd_pr__pfet_01v8 w=8 l=0.6 +IB_VB2 VB2 VSS 8e-05 +XB_VB3 VB3 VB3 VDDB VDDB sky130_fd_pr__pfet_01v8 w=8 l=0.6 +IB_VB3 VB3 VSS 2e-05 +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C07/gf180/sW0.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW0.5_sL1.5/case.json new file mode 100644 index 00000000..ac8d6be4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW0.5_sL1.5/case.json @@ -0,0 +1,156 @@ +{ + "case_id": "C07_gf180_sW0.5_sL1.5", + "circuit_id": "C07", + "pdk": "gf180", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "dut_name": "C07_gf180_sW0.5_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1", + "IB1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.84, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 0.84, + "nf": 4 + }, + "M3": { + "w": 2.0, + "l": 0.84, + "nf": 4 + }, + "M4": { + "w": 2.0, + "l": 0.84, + "nf": 4 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 2e-05 + }, + "IB1": { + "i": 4e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 1.5, + "CL": 1e-13, + "vocm": 1.65 + }, + "category": "diff_cs", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "bf6dd03a5e67665f", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "ideal common-mode feedback on VB1" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/gf180/sW0.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW0.5_sL1.5/manifest.json new file mode 100644 index 00000000..95a371d4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW0.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "f271728fb434ac1d652d23722f93044d55b8232c3aa430ef77ba9518ec9e9135", + "qualification.json": "2162b1c62eca5951bb1526b3e08b406b3de1feebedc9aef7605f11d0a2e6ddf8", + "specs.json": "fe4ed9fdfbc7d76f94590aa160095c293b8ed0f810ba43b6a806bedde7fc0209", + "target.spice": "298fd649f50dfd578cdc2cbad57d5b874308f50ae0ecb94034e98d6a98f05eae", + "target_lvs.spice": "ad2b3426fa064106ea9fff36d91787a910c671f2e1383e7fdfb33e039378aa88", + "testbench.spice": "129a780a1cd5681716350f4e23acf88f98664c48476e372510b1338ab5d99a02" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/gf180/sW0.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW0.5_sL1.5/qualification.json new file mode 100644 index 00000000..0df6f2f5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW0.5_sL1.5/qualification.json @@ -0,0 +1,108 @@ +{ + "case_id": "C07_gf180_sW0.5_sL1.5", + "circuit_id": "C07", + "pdk": "gf180", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "diff_cs", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "bf6dd03a5e67665f", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 37.61 + }, + "f3db": { + "min": 843900.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 40.60838, + "f3db": 1406516.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vo1": 1.65033, + "vo2": 1.65033, + "idd": 4.000002e-05, + "vos_in": 3.637979e-12, + "gain_lf": 40.60838, + "f3db": 1406516.0, + "ugf": 151479100.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/gf180/sW0.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW0.5_sL1.5/specs.json new file mode 100644 index 00000000..efee174d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW0.5_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 37.61 + }, + "f3db": { + "min": 843900.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 40.60838, + "f3db": 1406516.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/gf180/sW0.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW0.5_sL1.5/target.spice new file mode 100644 index 00000000..693b4530 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW0.5_sL1.5/target.spice @@ -0,0 +1,6 @@ +.subckt C07_gf180_sW0.5_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 +MM1 VOUT1 VIN1 IB1 VSS nfet_03v3 w=2u l=0.84u nf=4 m=1 +MM2 VOUT2 VIN2 IB1 VSS nfet_03v3 w=2u l=0.84u nf=4 m=1 +MM3 VOUT1 VB1 VDD VDD pfet_03v3 w=2u l=0.84u nf=4 m=1 +MM4 VOUT2 VB1 VDD VDD pfet_03v3 w=2u l=0.84u nf=4 m=1 +.ends C07_gf180_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C07/gf180/sW0.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW0.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..83540b3b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW0.5_sL1.5/target_lvs.spice @@ -0,0 +1,18 @@ +.subckt C07_gf180_sW0.5_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 +MM1_f0 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f1 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f2 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f3 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f0 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f1 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f2 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f3 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f0 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM3_f1 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM3_f2 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM3_f3 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM4_f0 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM4_f1 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM4_f2 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM4_f3 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +.ends C07_gf180_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C07/gf180/sW0.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW0.5_sL1.5/testbench.spice new file mode 100644 index 00000000..f59704ad --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW0.5_sL1.5/testbench.spice @@ -0,0 +1,43 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 C07_gf180_sW0.5_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIB1 IB1 VSS 4e-05 +.nodeset v(IB1)=2.31 +MB_VB1n VB1n VB1n VDDB VDDB pfet_03v3 w=2u l=0.84u +IB_VB1n VB1n VSS 2e-05 +VCM VCM 0 1.5 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +* ideal CMFB (disclosed): PMOS load gate = replica bias + Gcm*(Vocm - Vocm,target) +BCMFB VB1 0 V = v(VB1n) + 20*((v(VOUT1)+v(VOUT2))/2 - 1.65) +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C07/gf180/sW0.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW0.5_sL1/case.json new file mode 100644 index 00000000..32cba934 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW0.5_sL1/case.json @@ -0,0 +1,156 @@ +{ + "case_id": "C07_gf180_sW0.5_sL1", + "circuit_id": "C07", + "pdk": "gf180", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "dut_name": "C07_gf180_sW0.5_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1", + "IB1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.56, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 0.56, + "nf": 4 + }, + "M3": { + "w": 2.0, + "l": 0.56, + "nf": 4 + }, + "M4": { + "w": 2.0, + "l": 0.56, + "nf": 4 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 2e-05 + }, + "IB1": { + "i": 4e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 1.5, + "CL": 1e-13, + "vocm": 1.65 + }, + "category": "diff_cs", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "f483279329cf82a0", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "ideal common-mode feedback on VB1" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/gf180/sW0.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW0.5_sL1/manifest.json new file mode 100644 index 00000000..f36e07fb --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW0.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "5302377bc3b1c3724fa3bccb19f41026724ce4342ad4b15e3ae9612a7d5b8279", + "qualification.json": "b4aae0e5e0bc5fa33a65331e05541176e35603e0ec95456806d5b2b8eda52dd0", + "specs.json": "e514ea64a318209d33845b3ba92bcbe5ef72d6834f3a419e5fe92002fd361266", + "target.spice": "94ea6fa9abdd93e0ec6160313ab2f0406ab74da83f92766a173ef7dc4b170599", + "target_lvs.spice": "15393299b9787a04b8117e8f4b59c7ab85690b4dc92dae76992107b24836453a", + "testbench.spice": "d8b24a38940274f2225695f044c05e91e954b05d9981d985a48fba6664d6d6b8" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/gf180/sW0.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW0.5_sL1/qualification.json new file mode 100644 index 00000000..c83ae939 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW0.5_sL1/qualification.json @@ -0,0 +1,108 @@ +{ + "case_id": "C07_gf180_sW0.5_sL1", + "circuit_id": "C07", + "pdk": "gf180", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "diff_cs", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "f483279329cf82a0", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 34.97 + }, + "f3db": { + "min": 1412000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 37.9669, + "f3db": 2352737.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vo1": 1.650378, + "vo2": 1.650378, + "idd": 4.000002e-05, + "vos_in": 0.0, + "gain_lf": 37.9669, + "f3db": 2352737.0, + "ugf": 186921500.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/gf180/sW0.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW0.5_sL1/specs.json new file mode 100644 index 00000000..2c5601bb --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW0.5_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 34.97 + }, + "f3db": { + "min": 1412000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 37.9669, + "f3db": 2352737.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/gf180/sW0.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW0.5_sL1/target.spice new file mode 100644 index 00000000..fffd4c42 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW0.5_sL1/target.spice @@ -0,0 +1,6 @@ +.subckt C07_gf180_sW0.5_sL1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 +MM1 VOUT1 VIN1 IB1 VSS nfet_03v3 w=2u l=0.56u nf=4 m=1 +MM2 VOUT2 VIN2 IB1 VSS nfet_03v3 w=2u l=0.56u nf=4 m=1 +MM3 VOUT1 VB1 VDD VDD pfet_03v3 w=2u l=0.56u nf=4 m=1 +MM4 VOUT2 VB1 VDD VDD pfet_03v3 w=2u l=0.56u nf=4 m=1 +.ends C07_gf180_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C07/gf180/sW0.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW0.5_sL1/target_lvs.spice new file mode 100644 index 00000000..dfbc3c84 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW0.5_sL1/target_lvs.spice @@ -0,0 +1,18 @@ +.subckt C07_gf180_sW0.5_sL1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 +MM1_f0 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f1 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f2 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f3 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f0 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f1 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f2 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f3 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f0 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM3_f1 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM3_f2 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM3_f3 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM4_f0 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM4_f1 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM4_f2 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM4_f3 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +.ends C07_gf180_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C07/gf180/sW0.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW0.5_sL1/testbench.spice new file mode 100644 index 00000000..159c78af --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW0.5_sL1/testbench.spice @@ -0,0 +1,43 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 C07_gf180_sW0.5_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIB1 IB1 VSS 4e-05 +.nodeset v(IB1)=2.31 +MB_VB1n VB1n VB1n VDDB VDDB pfet_03v3 w=2u l=0.56u +IB_VB1n VB1n VSS 2e-05 +VCM VCM 0 1.5 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +* ideal CMFB (disclosed): PMOS load gate = replica bias + Gcm*(Vocm - Vocm,target) +BCMFB VB1 0 V = v(VB1n) + 20*((v(VOUT1)+v(VOUT2))/2 - 1.65) +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C07/gf180/sW0.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW0.5_sL2/case.json new file mode 100644 index 00000000..eb92f5e5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW0.5_sL2/case.json @@ -0,0 +1,156 @@ +{ + "case_id": "C07_gf180_sW0.5_sL2", + "circuit_id": "C07", + "pdk": "gf180", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "dut_name": "C07_gf180_sW0.5_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1", + "IB1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 1.12, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 1.12, + "nf": 4 + }, + "M3": { + "w": 2.0, + "l": 1.12, + "nf": 4 + }, + "M4": { + "w": 2.0, + "l": 1.12, + "nf": 4 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 2e-05 + }, + "IB1": { + "i": 4e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 1.5, + "CL": 1e-13, + "vocm": 1.65 + }, + "category": "diff_cs", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "f02fecbcd6320c1b", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "ideal common-mode feedback on VB1" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/gf180/sW0.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW0.5_sL2/manifest.json new file mode 100644 index 00000000..eb0f9c81 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW0.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "a4ef1ed6de3739bd53bd18e6cc5e91f5d8234d9043c36840aaa8cec0662fef2d", + "qualification.json": "9ee1efe61a7b6ca82f7929f877144bbe48e6b36f06355530ca3f2c93cce88783", + "specs.json": "14dc6e989f02fd7d78515253421f1aa57d3d61e1e169486a1cc2692505dda7fd", + "target.spice": "dd678acdb530b1b977df7c07d62a7c9a085da65aa7d68631122c35f974559f7a", + "target_lvs.spice": "768afcc5099b7513e3559be125e2b56e49b9223154e34f5975b65722cf3d1867", + "testbench.spice": "0d73eb438796894f4baf09f4aba434e73a100b35c0b3adb332f4079a34760636" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/gf180/sW0.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW0.5_sL2/qualification.json new file mode 100644 index 00000000..efce0192 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW0.5_sL2/qualification.json @@ -0,0 +1,108 @@ +{ + "case_id": "C07_gf180_sW0.5_sL2", + "circuit_id": "C07", + "pdk": "gf180", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "diff_cs", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "f02fecbcd6320c1b", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 38.8 + }, + "f3db": { + "min": 635100.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 41.80138, + "f3db": 1058574.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vo1": 1.650445, + "vo2": 1.650445, + "idd": 4.000002e-05, + "vos_in": -1.92813e-10, + "gain_lf": 41.80138, + "f3db": 1058574.0, + "ugf": 130792200.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/gf180/sW0.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW0.5_sL2/specs.json new file mode 100644 index 00000000..5c0c2b84 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW0.5_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 38.8 + }, + "f3db": { + "min": 635100.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 41.80138, + "f3db": 1058574.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/gf180/sW0.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW0.5_sL2/target.spice new file mode 100644 index 00000000..ab54def0 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW0.5_sL2/target.spice @@ -0,0 +1,6 @@ +.subckt C07_gf180_sW0.5_sL2 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 +MM1 VOUT1 VIN1 IB1 VSS nfet_03v3 w=2u l=1.12u nf=4 m=1 +MM2 VOUT2 VIN2 IB1 VSS nfet_03v3 w=2u l=1.12u nf=4 m=1 +MM3 VOUT1 VB1 VDD VDD pfet_03v3 w=2u l=1.12u nf=4 m=1 +MM4 VOUT2 VB1 VDD VDD pfet_03v3 w=2u l=1.12u nf=4 m=1 +.ends C07_gf180_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C07/gf180/sW0.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW0.5_sL2/target_lvs.spice new file mode 100644 index 00000000..dd68fad3 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW0.5_sL2/target_lvs.spice @@ -0,0 +1,18 @@ +.subckt C07_gf180_sW0.5_sL2 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 +MM1_f0 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f1 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f2 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f3 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f0 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f1 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f2 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f3 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f0 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM3_f1 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM3_f2 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM3_f3 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM4_f0 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM4_f1 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM4_f2 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM4_f3 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +.ends C07_gf180_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C07/gf180/sW0.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW0.5_sL2/testbench.spice new file mode 100644 index 00000000..fbb440d9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW0.5_sL2/testbench.spice @@ -0,0 +1,43 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 C07_gf180_sW0.5_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIB1 IB1 VSS 4e-05 +.nodeset v(IB1)=2.31 +MB_VB1n VB1n VB1n VDDB VDDB pfet_03v3 w=2u l=1.12u +IB_VB1n VB1n VSS 2e-05 +VCM VCM 0 1.5 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +* ideal CMFB (disclosed): PMOS load gate = replica bias + Gcm*(Vocm - Vocm,target) +BCMFB VB1 0 V = v(VB1n) + 20*((v(VOUT1)+v(VOUT2))/2 - 1.65) +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1.5_sL1.5/case.json new file mode 100644 index 00000000..15c2cfd8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1.5_sL1.5/case.json @@ -0,0 +1,156 @@ +{ + "case_id": "C07_gf180_sW1.5_sL1.5", + "circuit_id": "C07", + "pdk": "gf180", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "dut_name": "C07_gf180_sW1.5_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1", + "IB1" + ], + "sizing": { + "M1": { + "w": 6.0, + "l": 0.84, + "nf": 12 + }, + "M2": { + "w": 6.0, + "l": 0.84, + "nf": 12 + }, + "M3": { + "w": 6.0, + "l": 0.84, + "nf": 12 + }, + "M4": { + "w": 6.0, + "l": 0.84, + "nf": 12 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 2e-05 + }, + "IB1": { + "i": 4e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 1.5, + "CL": 1e-13, + "vocm": 1.65 + }, + "category": "diff_cs", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "454f5cb369384cb9", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "ideal common-mode feedback on VB1" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1.5_sL1.5/manifest.json new file mode 100644 index 00000000..43e6b4ea --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "7806a558bf8f18c9dcecad85bc7e96d7d7d9f96cbcd0cd2231422cc06c6d6447", + "qualification.json": "92bc31a54ece5e2fc5ca020bfa9de779c39120727d5fd212db87232fb586e5aa", + "specs.json": "873aff9c7308a1436c43ce22c9ccb8e4acb81c692c81de853d9f36f096126068", + "target.spice": "81be087356a9d73744ae1468e78c51db796515e7364e5b7ddef302ecd5041a9c", + "target_lvs.spice": "0cf7f0490ec72eac36d62eac1ea243509d6fa8a00ddb3181a1ff471493d9f2ce", + "testbench.spice": "49f7ec19af4b147067f249a5f4d2f42272381c195447db3c91e7fe7f3e3abae5" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1.5_sL1.5/qualification.json new file mode 100644 index 00000000..c1dd3cf4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1.5_sL1.5/qualification.json @@ -0,0 +1,108 @@ +{ + "case_id": "C07_gf180_sW1.5_sL1.5", + "circuit_id": "C07", + "pdk": "gf180", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "diff_cs", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "454f5cb369384cb9", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 41.31 + }, + "f3db": { + "min": 882800.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 44.31449, + "f3db": 1471348.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vo1": 1.650203, + "vo2": 1.650203, + "idd": 4.000005e-05, + "vos_in": 0.0, + "gain_lf": 44.31449, + "f3db": 1471348.0, + "ugf": 243001000.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1.5_sL1.5/specs.json new file mode 100644 index 00000000..43ff4fb0 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1.5_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 41.31 + }, + "f3db": { + "min": 882800.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 44.31449, + "f3db": 1471348.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1.5_sL1.5/target.spice new file mode 100644 index 00000000..bc149690 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1.5_sL1.5/target.spice @@ -0,0 +1,6 @@ +.subckt C07_gf180_sW1.5_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 +MM1 VOUT1 VIN1 IB1 VSS nfet_03v3 w=6u l=0.84u nf=12 m=1 +MM2 VOUT2 VIN2 IB1 VSS nfet_03v3 w=6u l=0.84u nf=12 m=1 +MM3 VOUT1 VB1 VDD VDD pfet_03v3 w=6u l=0.84u nf=12 m=1 +MM4 VOUT2 VB1 VDD VDD pfet_03v3 w=6u l=0.84u nf=12 m=1 +.ends C07_gf180_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..23ccd9de --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1.5_sL1.5/target_lvs.spice @@ -0,0 +1,50 @@ +.subckt C07_gf180_sW1.5_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 +MM1_f0 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f1 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f2 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f3 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f4 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f5 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f6 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f7 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f8 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f9 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f10 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f11 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f0 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f1 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f2 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f3 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f4 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f5 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f6 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f7 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f8 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f9 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f10 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f11 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f0 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM3_f1 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM3_f2 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM3_f3 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM3_f4 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM3_f5 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM3_f6 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM3_f7 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM3_f8 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM3_f9 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM3_f10 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM3_f11 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM4_f0 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM4_f1 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM4_f2 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM4_f3 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM4_f4 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM4_f5 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM4_f6 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM4_f7 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM4_f8 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM4_f9 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM4_f10 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM4_f11 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +.ends C07_gf180_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1.5_sL1.5/testbench.spice new file mode 100644 index 00000000..80c4da61 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1.5_sL1.5/testbench.spice @@ -0,0 +1,43 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 C07_gf180_sW1.5_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIB1 IB1 VSS 4e-05 +.nodeset v(IB1)=2.31 +MB_VB1n VB1n VB1n VDDB VDDB pfet_03v3 w=6u l=0.84u +IB_VB1n VB1n VSS 2e-05 +VCM VCM 0 1.5 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +* ideal CMFB (disclosed): PMOS load gate = replica bias + Gcm*(Vocm - Vocm,target) +BCMFB VB1 0 V = v(VB1n) + 20*((v(VOUT1)+v(VOUT2))/2 - 1.65) +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1.5_sL1/case.json new file mode 100644 index 00000000..8c908a22 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1.5_sL1/case.json @@ -0,0 +1,156 @@ +{ + "case_id": "C07_gf180_sW1.5_sL1", + "circuit_id": "C07", + "pdk": "gf180", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "dut_name": "C07_gf180_sW1.5_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1", + "IB1" + ], + "sizing": { + "M1": { + "w": 6.0, + "l": 0.56, + "nf": 12 + }, + "M2": { + "w": 6.0, + "l": 0.56, + "nf": 12 + }, + "M3": { + "w": 6.0, + "l": 0.56, + "nf": 12 + }, + "M4": { + "w": 6.0, + "l": 0.56, + "nf": 12 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 2e-05 + }, + "IB1": { + "i": 4e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 1.5, + "CL": 1e-13, + "vocm": 1.65 + }, + "category": "diff_cs", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "ab5f62a0ef4aedf1", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "ideal common-mode feedback on VB1" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1.5_sL1/manifest.json new file mode 100644 index 00000000..acd6e356 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "b8288bf3547aa7790e73ab8e9f59f5b14d5feefef76b9cd6d1bc5601dbd726c5", + "qualification.json": "07b96b2cf959d38247b27f968041aabc55c63c9ab6e376a75a2c63b362fa2442", + "specs.json": "4fcb219f343a6a0c6599bf626c4611c1605f1cfa1da187f80402954adef6963b", + "target.spice": "499518b4d0c2c21049563d303b7fa4db273edf3677b413177c53f9ed6bba74b8", + "target_lvs.spice": "3dc03e225c39be54a53f220e608e78bbcd241fd8983991a2937192a3ccfe72f1", + "testbench.spice": "9b6cfc567881f3359c96a6dcd84d8fcff754d00c5f4d48ab7c8de3ffad3c9e26" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1.5_sL1/qualification.json new file mode 100644 index 00000000..7f37e959 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1.5_sL1/qualification.json @@ -0,0 +1,108 @@ +{ + "case_id": "C07_gf180_sW1.5_sL1", + "circuit_id": "C07", + "pdk": "gf180", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "diff_cs", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "ab5f62a0ef4aedf1", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 37.96 + }, + "f3db": { + "min": 1554000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 40.96297, + "f3db": 2590804.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vo1": 1.650604, + "vo2": 1.650604, + "idd": 4.000005e-05, + "vos_in": -3.63798e-12, + "gain_lf": 40.96297, + "f3db": 2590804.0, + "ugf": 290673800.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1.5_sL1/specs.json new file mode 100644 index 00000000..abfce7a7 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1.5_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 37.96 + }, + "f3db": { + "min": 1554000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 40.96297, + "f3db": 2590804.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1.5_sL1/target.spice new file mode 100644 index 00000000..3a80f468 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1.5_sL1/target.spice @@ -0,0 +1,6 @@ +.subckt C07_gf180_sW1.5_sL1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 +MM1 VOUT1 VIN1 IB1 VSS nfet_03v3 w=6u l=0.56u nf=12 m=1 +MM2 VOUT2 VIN2 IB1 VSS nfet_03v3 w=6u l=0.56u nf=12 m=1 +MM3 VOUT1 VB1 VDD VDD pfet_03v3 w=6u l=0.56u nf=12 m=1 +MM4 VOUT2 VB1 VDD VDD pfet_03v3 w=6u l=0.56u nf=12 m=1 +.ends C07_gf180_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1.5_sL1/target_lvs.spice new file mode 100644 index 00000000..06f436ae --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1.5_sL1/target_lvs.spice @@ -0,0 +1,50 @@ +.subckt C07_gf180_sW1.5_sL1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 +MM1_f0 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f1 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f2 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f3 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f4 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f5 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f6 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f7 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f8 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f9 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f10 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f11 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f0 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f1 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f2 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f3 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f4 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f5 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f6 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f7 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f8 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f9 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f10 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f11 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f0 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM3_f1 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM3_f2 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM3_f3 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM3_f4 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM3_f5 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM3_f6 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM3_f7 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM3_f8 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM3_f9 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM3_f10 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM3_f11 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM4_f0 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM4_f1 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM4_f2 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM4_f3 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM4_f4 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM4_f5 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM4_f6 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM4_f7 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM4_f8 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM4_f9 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM4_f10 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM4_f11 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +.ends C07_gf180_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1.5_sL1/testbench.spice new file mode 100644 index 00000000..d453ed36 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1.5_sL1/testbench.spice @@ -0,0 +1,43 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 C07_gf180_sW1.5_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIB1 IB1 VSS 4e-05 +.nodeset v(IB1)=2.31 +MB_VB1n VB1n VB1n VDDB VDDB pfet_03v3 w=6u l=0.56u +IB_VB1n VB1n VSS 2e-05 +VCM VCM 0 1.5 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +* ideal CMFB (disclosed): PMOS load gate = replica bias + Gcm*(Vocm - Vocm,target) +BCMFB VB1 0 V = v(VB1n) + 20*((v(VOUT1)+v(VOUT2))/2 - 1.65) +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1.5_sL2/case.json new file mode 100644 index 00000000..4c6670b6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1.5_sL2/case.json @@ -0,0 +1,156 @@ +{ + "case_id": "C07_gf180_sW1.5_sL2", + "circuit_id": "C07", + "pdk": "gf180", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "dut_name": "C07_gf180_sW1.5_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1", + "IB1" + ], + "sizing": { + "M1": { + "w": 6.0, + "l": 1.12, + "nf": 12 + }, + "M2": { + "w": 6.0, + "l": 1.12, + "nf": 12 + }, + "M3": { + "w": 6.0, + "l": 1.12, + "nf": 12 + }, + "M4": { + "w": 6.0, + "l": 1.12, + "nf": 12 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 2e-05 + }, + "IB1": { + "i": 4e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 1.5, + "CL": 1e-13, + "vocm": 1.65 + }, + "category": "diff_cs", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "99b4505dbd9b9ef1", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "ideal common-mode feedback on VB1" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1.5_sL2/manifest.json new file mode 100644 index 00000000..b78ab296 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "618e3945be225e2f09ca3e1ea5e83e87e112cf2ba29ca58ad2bc3abc5359efbc", + "qualification.json": "b8f7217c7e6809a8c45e68b5ea5913ae998aca4da134a86500136d76d4e8c385", + "specs.json": "069e7fa4dc1dce5282f838da2b6fd5221bd5c3a5595529cdc099a109c7159bd5", + "target.spice": "0593c2d1ae26eae1469d828c6bbfeced6db4526fd8050315bd3547e1a8125670", + "target_lvs.spice": "25d490615de5a1524a9bddb4b19c824d59e16d41509c89fdaa2f5db08692fbdc", + "testbench.spice": "5efe77fa8c5ec2b8f6d259bb26cc13c71fc2af47788931ebef0770a56a715b11" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1.5_sL2/qualification.json new file mode 100644 index 00000000..d97cad34 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1.5_sL2/qualification.json @@ -0,0 +1,108 @@ +{ + "case_id": "C07_gf180_sW1.5_sL2", + "circuit_id": "C07", + "pdk": "gf180", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "diff_cs", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "99b4505dbd9b9ef1", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 42.75 + }, + "f3db": { + "min": 654400.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 45.74969, + "f3db": 1090687.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vo1": 1.650063, + "vo2": 1.650063, + "idd": 4.000005e-05, + "vos_in": 0.0, + "gain_lf": 45.74969, + "f3db": 1090687.0, + "ugf": 212765600.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1.5_sL2/specs.json new file mode 100644 index 00000000..c07261d0 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1.5_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 42.75 + }, + "f3db": { + "min": 654400.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 45.74969, + "f3db": 1090687.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1.5_sL2/target.spice new file mode 100644 index 00000000..56cdd76b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1.5_sL2/target.spice @@ -0,0 +1,6 @@ +.subckt C07_gf180_sW1.5_sL2 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 +MM1 VOUT1 VIN1 IB1 VSS nfet_03v3 w=6u l=1.12u nf=12 m=1 +MM2 VOUT2 VIN2 IB1 VSS nfet_03v3 w=6u l=1.12u nf=12 m=1 +MM3 VOUT1 VB1 VDD VDD pfet_03v3 w=6u l=1.12u nf=12 m=1 +MM4 VOUT2 VB1 VDD VDD pfet_03v3 w=6u l=1.12u nf=12 m=1 +.ends C07_gf180_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1.5_sL2/target_lvs.spice new file mode 100644 index 00000000..0229d246 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1.5_sL2/target_lvs.spice @@ -0,0 +1,50 @@ +.subckt C07_gf180_sW1.5_sL2 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 +MM1_f0 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f1 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f2 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f3 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f4 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f5 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f6 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f7 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f8 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f9 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f10 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f11 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f0 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f1 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f2 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f3 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f4 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f5 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f6 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f7 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f8 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f9 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f10 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f11 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f0 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM3_f1 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM3_f2 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM3_f3 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM3_f4 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM3_f5 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM3_f6 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM3_f7 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM3_f8 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM3_f9 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM3_f10 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM3_f11 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM4_f0 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM4_f1 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM4_f2 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM4_f3 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM4_f4 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM4_f5 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM4_f6 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM4_f7 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM4_f8 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM4_f9 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM4_f10 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM4_f11 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +.ends C07_gf180_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1.5_sL2/testbench.spice new file mode 100644 index 00000000..09aa1c9c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1.5_sL2/testbench.spice @@ -0,0 +1,43 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 C07_gf180_sW1.5_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIB1 IB1 VSS 4e-05 +.nodeset v(IB1)=2.31 +MB_VB1n VB1n VB1n VDDB VDDB pfet_03v3 w=6u l=1.12u +IB_VB1n VB1n VSS 2e-05 +VCM VCM 0 1.5 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +* ideal CMFB (disclosed): PMOS load gate = replica bias + Gcm*(Vocm - Vocm,target) +BCMFB VB1 0 V = v(VB1n) + 20*((v(VOUT1)+v(VOUT2))/2 - 1.65) +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1_sL1.5/case.json new file mode 100644 index 00000000..ca2d1b1a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1_sL1.5/case.json @@ -0,0 +1,156 @@ +{ + "case_id": "C07_gf180_sW1_sL1.5", + "circuit_id": "C07", + "pdk": "gf180", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "dut_name": "C07_gf180_sW1_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1", + "IB1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.84, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 0.84, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 0.84, + "nf": 8 + }, + "M4": { + "w": 4.0, + "l": 0.84, + "nf": 8 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 2e-05 + }, + "IB1": { + "i": 4e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 1.5, + "CL": 1e-13, + "vocm": 1.65 + }, + "category": "diff_cs", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "d1fe42bc2b7be1a4", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "ideal common-mode feedback on VB1" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1_sL1.5/manifest.json new file mode 100644 index 00000000..f5829690 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "eb76a99c15d8f2fd6cf3494aa4bf3ac76ec6579909a7b3e82dbeed8321b2a7f9", + "qualification.json": "701ff96bf62c8ee76322c269f4a336440e8a3944510cfeb97fe123e9ccc66fbd", + "specs.json": "f2038a94aea78c6ec79953a083c153a29c39fde37ba74c0cf032f464105ec3f1", + "target.spice": "21e045544533a1fdd679d9e5c564964789588a7b4fa16655b868d958bd3bc80b", + "target_lvs.spice": "ec2aec12885423d896e583e69f5af17d53f7f5227ab374ca4f2015ef1773cb63", + "testbench.spice": "af871ef279e5185e37e0be6728e69c0030924717006cc850aa21467f8769009a" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1_sL1.5/qualification.json new file mode 100644 index 00000000..3e3d45e2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1_sL1.5/qualification.json @@ -0,0 +1,108 @@ +{ + "case_id": "C07_gf180_sW1_sL1.5", + "circuit_id": "C07", + "pdk": "gf180", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "diff_cs", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "d1fe42bc2b7be1a4", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 40.16 + }, + "f3db": { + "min": 866400.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 43.15772, + "f3db": 1444063.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vo1": 1.650159, + "vo2": 1.650159, + "idd": 4.000003e-05, + "vos_in": 0.0, + "gain_lf": 43.15772, + "f3db": 1444063.0, + "ugf": 208666900.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1_sL1.5/specs.json new file mode 100644 index 00000000..f0774f29 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 40.16 + }, + "f3db": { + "min": 866400.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 43.15772, + "f3db": 1444063.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1_sL1.5/target.spice new file mode 100644 index 00000000..392a204f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1_sL1.5/target.spice @@ -0,0 +1,6 @@ +.subckt C07_gf180_sW1_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 +MM1 VOUT1 VIN1 IB1 VSS nfet_03v3 w=4u l=0.84u nf=8 m=1 +MM2 VOUT2 VIN2 IB1 VSS nfet_03v3 w=4u l=0.84u nf=8 m=1 +MM3 VOUT1 VB1 VDD VDD pfet_03v3 w=4u l=0.84u nf=8 m=1 +MM4 VOUT2 VB1 VDD VDD pfet_03v3 w=4u l=0.84u nf=8 m=1 +.ends C07_gf180_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1_sL1.5/target_lvs.spice new file mode 100644 index 00000000..5c28afac --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1_sL1.5/target_lvs.spice @@ -0,0 +1,34 @@ +.subckt C07_gf180_sW1_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 +MM1_f0 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f1 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f2 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f3 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f4 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f5 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f6 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f7 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f0 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f1 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f2 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f3 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f4 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f5 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f6 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f7 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f0 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM3_f1 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM3_f2 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM3_f3 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM3_f4 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM3_f5 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM3_f6 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM3_f7 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM4_f0 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM4_f1 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM4_f2 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM4_f3 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM4_f4 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM4_f5 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM4_f6 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM4_f7 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +.ends C07_gf180_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1_sL1.5/testbench.spice new file mode 100644 index 00000000..5e1fe06d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1_sL1.5/testbench.spice @@ -0,0 +1,43 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 C07_gf180_sW1_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIB1 IB1 VSS 4e-05 +.nodeset v(IB1)=2.31 +MB_VB1n VB1n VB1n VDDB VDDB pfet_03v3 w=4u l=0.84u +IB_VB1n VB1n VSS 2e-05 +VCM VCM 0 1.5 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +* ideal CMFB (disclosed): PMOS load gate = replica bias + Gcm*(Vocm - Vocm,target) +BCMFB VB1 0 V = v(VB1n) + 20*((v(VOUT1)+v(VOUT2))/2 - 1.65) +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1_sL1/case.json new file mode 100644 index 00000000..350189d7 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1_sL1/case.json @@ -0,0 +1,156 @@ +{ + "case_id": "C07_gf180_sW1_sL1", + "circuit_id": "C07", + "pdk": "gf180", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "dut_name": "C07_gf180_sW1_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1", + "IB1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "M4": { + "w": 4.0, + "l": 0.56, + "nf": 8 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 2e-05 + }, + "IB1": { + "i": 4e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 1.5, + "CL": 1e-13, + "vocm": 1.65 + }, + "category": "diff_cs", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "256c1bd0e2e5d8bb", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "ideal common-mode feedback on VB1" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1_sL1/manifest.json new file mode 100644 index 00000000..7549c94a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "7d0381be9a8caf83dc48566ac0568853d87d0f80cf7f49c7248cc6b841742651", + "qualification.json": "8b69e7b252b3bb1f33c394d6485a9805168fdb696553ad5800da37f75ad87da1", + "specs.json": "1d0d7f02cfb896236b877f429eaa1c09299f7c748059601b290689e95b41db1e", + "target.spice": "40ee88e107ca1de9854a00b4e19a0fbe0a450b6825be38d6f4641ec06b1017fa", + "target_lvs.spice": "138ab5021900e3b2a7c77fbab1a829e1fc3e688a92633b61a4dc4b2c89490091", + "testbench.spice": "dc9c9ca807110775c25c956f62f65f1a2dff06a90653ff72582873b939740f2f" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1_sL1/qualification.json new file mode 100644 index 00000000..37e4f8d5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1_sL1/qualification.json @@ -0,0 +1,108 @@ +{ + "case_id": "C07_gf180_sW1_sL1", + "circuit_id": "C07", + "pdk": "gf180", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "diff_cs", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "256c1bd0e2e5d8bb", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 37.07 + }, + "f3db": { + "min": 1503000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 40.06547, + "f3db": 2504702.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vo1": 1.650476, + "vo2": 1.650476, + "idd": 4.000003e-05, + "vos_in": 0.0, + "gain_lf": 40.06547, + "f3db": 2504702.0, + "ugf": 253138300.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1_sL1/specs.json new file mode 100644 index 00000000..72014eec --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 37.07 + }, + "f3db": { + "min": 1503000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 40.06547, + "f3db": 2504702.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1_sL1/target.spice new file mode 100644 index 00000000..fe29b31c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1_sL1/target.spice @@ -0,0 +1,6 @@ +.subckt C07_gf180_sW1_sL1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 +MM1 VOUT1 VIN1 IB1 VSS nfet_03v3 w=4u l=0.56u nf=8 m=1 +MM2 VOUT2 VIN2 IB1 VSS nfet_03v3 w=4u l=0.56u nf=8 m=1 +MM3 VOUT1 VB1 VDD VDD pfet_03v3 w=4u l=0.56u nf=8 m=1 +MM4 VOUT2 VB1 VDD VDD pfet_03v3 w=4u l=0.56u nf=8 m=1 +.ends C07_gf180_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1_sL1/target_lvs.spice new file mode 100644 index 00000000..0f285056 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1_sL1/target_lvs.spice @@ -0,0 +1,34 @@ +.subckt C07_gf180_sW1_sL1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 +MM1_f0 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f1 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f2 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f3 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f4 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f5 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f6 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f7 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f0 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f1 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f2 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f3 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f4 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f5 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f6 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f7 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f0 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM3_f1 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM3_f2 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM3_f3 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM3_f4 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM3_f5 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM3_f6 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM3_f7 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM4_f0 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM4_f1 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM4_f2 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM4_f3 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM4_f4 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM4_f5 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM4_f6 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM4_f7 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +.ends C07_gf180_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1_sL1/testbench.spice new file mode 100644 index 00000000..3c9a8f6b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1_sL1/testbench.spice @@ -0,0 +1,43 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 C07_gf180_sW1_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIB1 IB1 VSS 4e-05 +.nodeset v(IB1)=2.31 +MB_VB1n VB1n VB1n VDDB VDDB pfet_03v3 w=4u l=0.56u +IB_VB1n VB1n VSS 2e-05 +VCM VCM 0 1.5 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +* ideal CMFB (disclosed): PMOS load gate = replica bias + Gcm*(Vocm - Vocm,target) +BCMFB VB1 0 V = v(VB1n) + 20*((v(VOUT1)+v(VOUT2))/2 - 1.65) +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1_sL2/case.json new file mode 100644 index 00000000..0cbc66f2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1_sL2/case.json @@ -0,0 +1,156 @@ +{ + "case_id": "C07_gf180_sW1_sL2", + "circuit_id": "C07", + "pdk": "gf180", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "dut_name": "C07_gf180_sW1_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1", + "IB1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 1.12, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 1.12, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 1.12, + "nf": 8 + }, + "M4": { + "w": 4.0, + "l": 1.12, + "nf": 8 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 2e-05 + }, + "IB1": { + "i": 4e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 1.5, + "CL": 1e-13, + "vocm": 1.65 + }, + "category": "diff_cs", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "a233a39b1f4f29dd", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "ideal common-mode feedback on VB1" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1_sL2/manifest.json new file mode 100644 index 00000000..25af1bd3 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "49830c89049cbf0d4f55083a5f5aec6400e162a68e082579aa68342664f9969e", + "qualification.json": "1b8a623028163de10bf6732abfc38baeb44e89a6e6c4b4c8d141b3c21a158cb5", + "specs.json": "2c2585b272bb72d74db69c3587a687bbf5b1c78028389f738ac9f582be84452c", + "target.spice": "7c56028fdedb07f3d9471443c65098fc27ba04a015aab9d3555573f6d843e52f", + "target_lvs.spice": "20e08bdf9c96ec7f34a62ff045e8227dbe3237652c77c5eb59716f7b2b90cab6", + "testbench.spice": "546ea4fe5ce828092f9b18e17cfbdcbe4f8282bcc7a6cb9ca7054a9aad12fefa" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1_sL2/qualification.json new file mode 100644 index 00000000..315461ab --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1_sL2/qualification.json @@ -0,0 +1,108 @@ +{ + "case_id": "C07_gf180_sW1_sL2", + "circuit_id": "C07", + "pdk": "gf180", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "diff_cs", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "a233a39b1f4f29dd", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 41.51 + }, + "f3db": { + "min": 643700.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 44.50965, + "f3db": 1072820.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vo1": 1.650086, + "vo2": 1.650086, + "idd": 4.000003e-05, + "vos_in": 0.0, + "gain_lf": 44.50965, + "f3db": 1072820.0, + "ugf": 181096200.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1_sL2/specs.json new file mode 100644 index 00000000..569edabc --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 41.51 + }, + "f3db": { + "min": 643700.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 44.50965, + "f3db": 1072820.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1_sL2/target.spice new file mode 100644 index 00000000..67e0b5c2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1_sL2/target.spice @@ -0,0 +1,6 @@ +.subckt C07_gf180_sW1_sL2 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 +MM1 VOUT1 VIN1 IB1 VSS nfet_03v3 w=4u l=1.12u nf=8 m=1 +MM2 VOUT2 VIN2 IB1 VSS nfet_03v3 w=4u l=1.12u nf=8 m=1 +MM3 VOUT1 VB1 VDD VDD pfet_03v3 w=4u l=1.12u nf=8 m=1 +MM4 VOUT2 VB1 VDD VDD pfet_03v3 w=4u l=1.12u nf=8 m=1 +.ends C07_gf180_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1_sL2/target_lvs.spice new file mode 100644 index 00000000..1b1c75d9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1_sL2/target_lvs.spice @@ -0,0 +1,34 @@ +.subckt C07_gf180_sW1_sL2 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 +MM1_f0 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f1 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f2 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f3 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f4 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f5 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f6 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f7 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f0 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f1 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f2 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f3 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f4 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f5 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f6 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f7 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f0 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM3_f1 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM3_f2 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM3_f3 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM3_f4 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM3_f5 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM3_f6 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM3_f7 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM4_f0 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM4_f1 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM4_f2 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM4_f3 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM4_f4 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM4_f5 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM4_f6 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM4_f7 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +.ends C07_gf180_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1_sL2/testbench.spice new file mode 100644 index 00000000..1f6ae2c8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW1_sL2/testbench.spice @@ -0,0 +1,43 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 C07_gf180_sW1_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIB1 IB1 VSS 4e-05 +.nodeset v(IB1)=2.31 +MB_VB1n VB1n VB1n VDDB VDDB pfet_03v3 w=4u l=1.12u +IB_VB1n VB1n VSS 2e-05 +VCM VCM 0 1.5 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +* ideal CMFB (disclosed): PMOS load gate = replica bias + Gcm*(Vocm - Vocm,target) +BCMFB VB1 0 V = v(VB1n) + 20*((v(VOUT1)+v(VOUT2))/2 - 1.65) +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C07/gf180/sW2_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW2_sL1.5/case.json new file mode 100644 index 00000000..a88cfb03 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW2_sL1.5/case.json @@ -0,0 +1,156 @@ +{ + "case_id": "C07_gf180_sW2_sL1.5", + "circuit_id": "C07", + "pdk": "gf180", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "dut_name": "C07_gf180_sW2_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1", + "IB1" + ], + "sizing": { + "M1": { + "w": 8.0, + "l": 0.84, + "nf": 16 + }, + "M2": { + "w": 8.0, + "l": 0.84, + "nf": 16 + }, + "M3": { + "w": 8.0, + "l": 0.84, + "nf": 16 + }, + "M4": { + "w": 8.0, + "l": 0.84, + "nf": 16 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 2e-05 + }, + "IB1": { + "i": 4e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 1.5, + "CL": 1e-13, + "vocm": 1.65 + }, + "category": "diff_cs", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "6a692ffd39e46bfa", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "ideal common-mode feedback on VB1" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/gf180/sW2_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW2_sL1.5/manifest.json new file mode 100644 index 00000000..9918076f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW2_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "3dde7602bccb260fa17c77c80960e8b6ecdd75a9315cda3e80eddb18c1784be8", + "qualification.json": "bbdedd3ed075ac22606b7b40e545242c5b114deda51160f3b1a936f737fa2095", + "specs.json": "3a7a953de8d8c9209032cfad530d4a2576ce6ac78c07504c3ad59ee4d27d7d8e", + "target.spice": "bfbdea0829aca32f6ed0b3ee5470eb2a374ca32c47399ab0ec318f6b796bb1fa", + "target_lvs.spice": "ae35a6ffc6e289aabad38188fbf9b453cf8e2b908db684692a6d54699a91ab6c", + "testbench.spice": "c44b0862f97aab83660831942dc4c600773ff7673048ac85b96d414c57ca3db1" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/gf180/sW2_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW2_sL1.5/qualification.json new file mode 100644 index 00000000..c9d1ce6f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW2_sL1.5/qualification.json @@ -0,0 +1,108 @@ +{ + "case_id": "C07_gf180_sW2_sL1.5", + "circuit_id": "C07", + "pdk": "gf180", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "diff_cs", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "6a692ffd39e46bfa", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 41.99 + }, + "f3db": { + "min": 891400.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 44.99227, + "f3db": 1485694.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vo1": 1.650257, + "vo2": 1.650257, + "idd": 4.000007e-05, + "vos_in": 0.0, + "gain_lf": 44.99227, + "f3db": 1485694.0, + "ugf": 265542300.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/gf180/sW2_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW2_sL1.5/specs.json new file mode 100644 index 00000000..e13b9459 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW2_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 41.99 + }, + "f3db": { + "min": 891400.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 44.99227, + "f3db": 1485694.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/gf180/sW2_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW2_sL1.5/target.spice new file mode 100644 index 00000000..24f27843 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW2_sL1.5/target.spice @@ -0,0 +1,6 @@ +.subckt C07_gf180_sW2_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 +MM1 VOUT1 VIN1 IB1 VSS nfet_03v3 w=8u l=0.84u nf=16 m=1 +MM2 VOUT2 VIN2 IB1 VSS nfet_03v3 w=8u l=0.84u nf=16 m=1 +MM3 VOUT1 VB1 VDD VDD pfet_03v3 w=8u l=0.84u nf=16 m=1 +MM4 VOUT2 VB1 VDD VDD pfet_03v3 w=8u l=0.84u nf=16 m=1 +.ends C07_gf180_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C07/gf180/sW2_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW2_sL1.5/target_lvs.spice new file mode 100644 index 00000000..c4ef5825 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW2_sL1.5/target_lvs.spice @@ -0,0 +1,66 @@ +.subckt C07_gf180_sW2_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 +MM1_f0 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f1 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f2 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f3 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f4 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f5 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f6 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f7 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f8 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f9 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f10 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f11 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f12 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f13 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f14 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f15 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f0 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f1 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f2 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f3 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f4 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f5 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f6 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f7 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f8 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f9 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f10 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f11 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f12 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f13 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f14 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f15 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f0 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM3_f1 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM3_f2 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM3_f3 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM3_f4 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM3_f5 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM3_f6 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM3_f7 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM3_f8 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM3_f9 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM3_f10 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM3_f11 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM3_f12 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM3_f13 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM3_f14 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM3_f15 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM4_f0 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM4_f1 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM4_f2 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM4_f3 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM4_f4 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM4_f5 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM4_f6 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM4_f7 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM4_f8 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM4_f9 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM4_f10 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM4_f11 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM4_f12 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM4_f13 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM4_f14 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM4_f15 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +.ends C07_gf180_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C07/gf180/sW2_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW2_sL1.5/testbench.spice new file mode 100644 index 00000000..19c7d37b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW2_sL1.5/testbench.spice @@ -0,0 +1,43 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 C07_gf180_sW2_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIB1 IB1 VSS 4e-05 +.nodeset v(IB1)=2.31 +MB_VB1n VB1n VB1n VDDB VDDB pfet_03v3 w=8u l=0.84u +IB_VB1n VB1n VSS 2e-05 +VCM VCM 0 1.5 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +* ideal CMFB (disclosed): PMOS load gate = replica bias + Gcm*(Vocm - Vocm,target) +BCMFB VB1 0 V = v(VB1n) + 20*((v(VOUT1)+v(VOUT2))/2 - 1.65) +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C07/gf180/sW2_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW2_sL1/case.json new file mode 100644 index 00000000..677aa3fe --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW2_sL1/case.json @@ -0,0 +1,156 @@ +{ + "case_id": "C07_gf180_sW2_sL1", + "circuit_id": "C07", + "pdk": "gf180", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "dut_name": "C07_gf180_sW2_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1", + "IB1" + ], + "sizing": { + "M1": { + "w": 8.0, + "l": 0.56, + "nf": 16 + }, + "M2": { + "w": 8.0, + "l": 0.56, + "nf": 16 + }, + "M3": { + "w": 8.0, + "l": 0.56, + "nf": 16 + }, + "M4": { + "w": 8.0, + "l": 0.56, + "nf": 16 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 2e-05 + }, + "IB1": { + "i": 4e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 1.5, + "CL": 1e-13, + "vocm": 1.65 + }, + "category": "diff_cs", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "8795cf736a75aba2", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "ideal common-mode feedback on VB1" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/gf180/sW2_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW2_sL1/manifest.json new file mode 100644 index 00000000..f79f8927 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW2_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "b902682bd0827c018e6aa3d635588595307e17cc1bf2bf9a98e8a7960827aae2", + "qualification.json": "c888587fdc4b0974f64c43eb4b6417b2c00582ba19e02a25b587973c806afacb", + "specs.json": "5981b10340974d816449eeb3c6b47f77a7519d6d3346bd3d5650eb486644f1cd", + "target.spice": "de025d30877a70a221d1139de8bcc517f0c84c00875bcfd6fbf8361212550ba6", + "target_lvs.spice": "52e3d23d0561784a1a92bfc8a93f4a175b9ecd294b2da264b9826747d185ee65", + "testbench.spice": "7c0efcab9f2b975b765b69d5933344a46f0c50a3bab2a40dfe8d536538c4ed0e" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/gf180/sW2_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW2_sL1/qualification.json new file mode 100644 index 00000000..20c5bed7 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW2_sL1/qualification.json @@ -0,0 +1,108 @@ +{ + "case_id": "C07_gf180_sW2_sL1", + "circuit_id": "C07", + "pdk": "gf180", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "diff_cs", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "8795cf736a75aba2", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 38.47 + }, + "f3db": { + "min": 1582000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 41.46527, + "f3db": 2637462.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.2, + "schematic_measures": { + "vo1": 1.650697, + "vo2": 1.650697, + "idd": 4.000007e-05, + "vos_in": 0.0, + "gain_lf": 41.46527, + "f3db": 2637462.0, + "ugf": 313371300.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/gf180/sW2_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW2_sL1/specs.json new file mode 100644 index 00000000..111d540e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW2_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 38.47 + }, + "f3db": { + "min": 1582000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 41.46527, + "f3db": 2637462.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/gf180/sW2_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW2_sL1/target.spice new file mode 100644 index 00000000..7bc3d4b1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW2_sL1/target.spice @@ -0,0 +1,6 @@ +.subckt C07_gf180_sW2_sL1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 +MM1 VOUT1 VIN1 IB1 VSS nfet_03v3 w=8u l=0.56u nf=16 m=1 +MM2 VOUT2 VIN2 IB1 VSS nfet_03v3 w=8u l=0.56u nf=16 m=1 +MM3 VOUT1 VB1 VDD VDD pfet_03v3 w=8u l=0.56u nf=16 m=1 +MM4 VOUT2 VB1 VDD VDD pfet_03v3 w=8u l=0.56u nf=16 m=1 +.ends C07_gf180_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C07/gf180/sW2_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW2_sL1/target_lvs.spice new file mode 100644 index 00000000..d1345fbb --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW2_sL1/target_lvs.spice @@ -0,0 +1,66 @@ +.subckt C07_gf180_sW2_sL1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 +MM1_f0 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f1 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f2 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f3 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f4 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f5 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f6 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f7 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f8 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f9 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f10 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f11 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f12 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f13 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f14 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f15 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f0 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f1 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f2 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f3 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f4 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f5 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f6 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f7 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f8 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f9 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f10 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f11 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f12 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f13 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f14 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f15 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f0 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM3_f1 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM3_f2 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM3_f3 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM3_f4 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM3_f5 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM3_f6 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM3_f7 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM3_f8 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM3_f9 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM3_f10 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM3_f11 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM3_f12 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM3_f13 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM3_f14 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM3_f15 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM4_f0 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM4_f1 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM4_f2 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM4_f3 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM4_f4 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM4_f5 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM4_f6 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM4_f7 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM4_f8 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM4_f9 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM4_f10 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM4_f11 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM4_f12 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM4_f13 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM4_f14 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM4_f15 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +.ends C07_gf180_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C07/gf180/sW2_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW2_sL1/testbench.spice new file mode 100644 index 00000000..ac382e27 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW2_sL1/testbench.spice @@ -0,0 +1,43 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 C07_gf180_sW2_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIB1 IB1 VSS 4e-05 +.nodeset v(IB1)=2.31 +MB_VB1n VB1n VB1n VDDB VDDB pfet_03v3 w=8u l=0.56u +IB_VB1n VB1n VSS 2e-05 +VCM VCM 0 1.5 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +* ideal CMFB (disclosed): PMOS load gate = replica bias + Gcm*(Vocm - Vocm,target) +BCMFB VB1 0 V = v(VB1n) + 20*((v(VOUT1)+v(VOUT2))/2 - 1.65) +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C07/gf180/sW2_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW2_sL2/case.json new file mode 100644 index 00000000..c68bd921 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW2_sL2/case.json @@ -0,0 +1,156 @@ +{ + "case_id": "C07_gf180_sW2_sL2", + "circuit_id": "C07", + "pdk": "gf180", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "dut_name": "C07_gf180_sW2_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1", + "IB1" + ], + "sizing": { + "M1": { + "w": 8.0, + "l": 1.12, + "nf": 16 + }, + "M2": { + "w": 8.0, + "l": 1.12, + "nf": 16 + }, + "M3": { + "w": 8.0, + "l": 1.12, + "nf": 16 + }, + "M4": { + "w": 8.0, + "l": 1.12, + "nf": 16 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 2e-05 + }, + "IB1": { + "i": 4e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 1.5, + "CL": 1e-13, + "vocm": 1.65 + }, + "category": "diff_cs", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "95dad40c57a3086b", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "ideal common-mode feedback on VB1" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/gf180/sW2_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW2_sL2/manifest.json new file mode 100644 index 00000000..1602394a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW2_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "382f01fb0a3608b2af1a024f0d7edec32c49ed00d6ffdee9723eb3fb850dcbd2", + "qualification.json": "d4d2706f43a7a7275e440b694a49df84d41a4c569acbea573373a28579cc72a2", + "specs.json": "93c7b324b06812b9700ba5b23efe1b5fe0f830fd26464a322286e89b95291135", + "target.spice": "05262ac95fa97fd0cd3cc70a70deb94854fba1fa8fbafba3b6307724b290bf64", + "target_lvs.spice": "3323156c51cbb03103ec441a3cc34f605dc93c4f3111cb6f931f95a045560aee", + "testbench.spice": "94943058c9f36f4d45f7dcc7f0a0f3fb59aaca982e90c8ef7f8707cfaca2398c" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/gf180/sW2_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW2_sL2/qualification.json new file mode 100644 index 00000000..bf615b04 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW2_sL2/qualification.json @@ -0,0 +1,108 @@ +{ + "case_id": "C07_gf180_sW2_sL2", + "circuit_id": "C07", + "pdk": "gf180", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "diff_cs", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "95dad40c57a3086b", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 43.49 + }, + "f3db": { + "min": 660800.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 46.48706, + "f3db": 1101379.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vo1": 1.650084, + "vo2": 1.650084, + "idd": 4.000007e-05, + "vos_in": 0.0, + "gain_lf": 46.48706, + "f3db": 1101379.0, + "ugf": 234161200.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/gf180/sW2_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW2_sL2/specs.json new file mode 100644 index 00000000..536bec6a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW2_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 43.49 + }, + "f3db": { + "min": 660800.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 46.48706, + "f3db": 1101379.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/gf180/sW2_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW2_sL2/target.spice new file mode 100644 index 00000000..e93ce2b8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW2_sL2/target.spice @@ -0,0 +1,6 @@ +.subckt C07_gf180_sW2_sL2 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 +MM1 VOUT1 VIN1 IB1 VSS nfet_03v3 w=8u l=1.12u nf=16 m=1 +MM2 VOUT2 VIN2 IB1 VSS nfet_03v3 w=8u l=1.12u nf=16 m=1 +MM3 VOUT1 VB1 VDD VDD pfet_03v3 w=8u l=1.12u nf=16 m=1 +MM4 VOUT2 VB1 VDD VDD pfet_03v3 w=8u l=1.12u nf=16 m=1 +.ends C07_gf180_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C07/gf180/sW2_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW2_sL2/target_lvs.spice new file mode 100644 index 00000000..84d9f75b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW2_sL2/target_lvs.spice @@ -0,0 +1,66 @@ +.subckt C07_gf180_sW2_sL2 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 +MM1_f0 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f1 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f2 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f3 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f4 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f5 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f6 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f7 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f8 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f9 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f10 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f11 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f12 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f13 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f14 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f15 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f0 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f1 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f2 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f3 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f4 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f5 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f6 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f7 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f8 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f9 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f10 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f11 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f12 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f13 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f14 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f15 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f0 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM3_f1 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM3_f2 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM3_f3 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM3_f4 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM3_f5 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM3_f6 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM3_f7 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM3_f8 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM3_f9 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM3_f10 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM3_f11 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM3_f12 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM3_f13 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM3_f14 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM3_f15 VOUT1 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM4_f0 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM4_f1 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM4_f2 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM4_f3 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM4_f4 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM4_f5 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM4_f6 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM4_f7 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM4_f8 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM4_f9 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM4_f10 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM4_f11 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM4_f12 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM4_f13 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM4_f14 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM4_f15 VOUT2 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +.ends C07_gf180_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C07/gf180/sW2_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW2_sL2/testbench.spice new file mode 100644 index 00000000..29e4e20c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/gf180/sW2_sL2/testbench.spice @@ -0,0 +1,43 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 C07_gf180_sW2_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIB1 IB1 VSS 4e-05 +.nodeset v(IB1)=2.31 +MB_VB1n VB1n VB1n VDDB VDDB pfet_03v3 w=8u l=1.12u +IB_VB1n VB1n VSS 2e-05 +VCM VCM 0 1.5 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +* ideal CMFB (disclosed): PMOS load gate = replica bias + Gcm*(Vocm - Vocm,target) +BCMFB VB1 0 V = v(VB1n) + 20*((v(VOUT1)+v(VOUT2))/2 - 1.65) +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW0.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW0.5_sL1.5/case.json new file mode 100644 index 00000000..f3398a9f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW0.5_sL1.5/case.json @@ -0,0 +1,156 @@ +{ + "case_id": "C07_ihp130_sW0.5_sL1.5", + "circuit_id": "C07", + "pdk": "ihp130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "dut_name": "C07_ihp130_sW0.5_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1", + "IB1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.39, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 0.39, + "nf": 4 + }, + "M3": { + "w": 2.0, + "l": 0.39, + "nf": 4 + }, + "M4": { + "w": 2.0, + "l": 0.39, + "nf": 4 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 2e-05 + }, + "IB1": { + "i": 4e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 0.6, + "CL": 1e-13, + "vocm": 0.6 + }, + "category": "diff_cs", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "de4b561c7a402af8", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "ideal common-mode feedback on VB1" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW0.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW0.5_sL1.5/manifest.json new file mode 100644 index 00000000..687073eb --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW0.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "281c9f0fe64fdc9657914676070f60129f254cc007fe47eafe867c68ef0d6eba", + "qualification.json": "7d04d1de7167a0f1933966d0eba8d2343ec0fc3c72bac4e3fb68dfad8f12dd57", + "specs.json": "5ff109c942619b36d9c379efa41284f8952f670c6037c55387b7c2afa9930cc5", + "target.spice": "6b199ed40ff8d0502da46fd520f49f8fbaeedd1ea53a1f52a23678ec55e996c2", + "target_lvs.spice": "46234b2df3bfae1e1d850f663f77e5352078a96c3f3de1399ed09fc806912074", + "testbench.spice": "24cbede3a186e8bb44ee1ad04226ad92cb7661ccfb9688beb126f4dc2a12191d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW0.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW0.5_sL1.5/qualification.json new file mode 100644 index 00000000..5ea2b2ae --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW0.5_sL1.5/qualification.json @@ -0,0 +1,108 @@ +{ + "case_id": "C07_ihp130_sW0.5_sL1.5", + "circuit_id": "C07", + "pdk": "ihp130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "diff_cs", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "de4b561c7a402af8", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 22.1 + }, + "f3db": { + "min": 10680000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 25.0983, + "f3db": 17807610.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.2, + "schematic_measures": { + "vo1": 0.6006468, + "vo2": 0.6006468, + "idd": 4e-05, + "vos_in": 0.0, + "gain_lf": 25.0983, + "f3db": 17807610.0, + "ugf": 320882000.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW0.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW0.5_sL1.5/specs.json new file mode 100644 index 00000000..9ec1f8c1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW0.5_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 22.1 + }, + "f3db": { + "min": 10680000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 25.0983, + "f3db": 17807610.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW0.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW0.5_sL1.5/target.spice new file mode 100644 index 00000000..bdc34e8e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW0.5_sL1.5/target.spice @@ -0,0 +1,6 @@ +.subckt C07_ihp130_sW0.5_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 +XM1 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=2u l=0.39u ng=4 m=1 +XM2 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=2u l=0.39u ng=4 m=1 +XM3 VOUT1 VB1 VDD VDD sg13_lv_pmos w=2u l=0.39u ng=4 m=1 +XM4 VOUT2 VB1 VDD VDD sg13_lv_pmos w=2u l=0.39u ng=4 m=1 +.ends C07_ihp130_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW0.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW0.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..605d723a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW0.5_sL1.5/target_lvs.spice @@ -0,0 +1,18 @@ +.subckt C07_ihp130_sW0.5_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 +XM1_f0 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f1 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f2 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f3 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f0 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f1 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f2 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f3 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f0 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM3_f1 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM3_f2 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM3_f3 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f0 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f1 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f2 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f3 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +.ends C07_ihp130_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW0.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW0.5_sL1.5/testbench.spice new file mode 100644 index 00000000..483db934 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW0.5_sL1.5/testbench.spice @@ -0,0 +1,43 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 C07_ihp130_sW0.5_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIB1 IB1 VSS 4e-05 +.nodeset v(IB1)=0.84 +XB_VB1n VB1n VB1n VDDB VDDB sg13_lv_pmos w=2u l=0.39u +IB_VB1n VB1n VSS 2e-05 +VCM VCM 0 0.6 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +* ideal CMFB (disclosed): PMOS load gate = replica bias + Gcm*(Vocm - Vocm,target) +BCMFB VB1 0 V = v(VB1n) + 20*((v(VOUT1)+v(VOUT2))/2 - 0.6) +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW0.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW0.5_sL1/case.json new file mode 100644 index 00000000..bd9ae272 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW0.5_sL1/case.json @@ -0,0 +1,156 @@ +{ + "case_id": "C07_ihp130_sW0.5_sL1", + "circuit_id": "C07", + "pdk": "ihp130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "dut_name": "C07_ihp130_sW0.5_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1", + "IB1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.26, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 0.26, + "nf": 4 + }, + "M3": { + "w": 2.0, + "l": 0.26, + "nf": 4 + }, + "M4": { + "w": 2.0, + "l": 0.26, + "nf": 4 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 2e-05 + }, + "IB1": { + "i": 4e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 0.6, + "CL": 1e-13, + "vocm": 0.6 + }, + "category": "diff_cs", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.26, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.26, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.26, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.26, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "14e92c78a6f0b2d0", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "ideal common-mode feedback on VB1" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW0.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW0.5_sL1/manifest.json new file mode 100644 index 00000000..fe3d1bdc --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW0.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "7f455942a82c02c3b43da4ecdbfea600f7d57ba91407e9996c6f6364922479e0", + "qualification.json": "c07632af2950ecd802aa5a082ae63a1ebbd82e678697feccf5bb5c9d6a0997c8", + "specs.json": "373e4d2a0bf262e14969a7c998068023def1296d1afced55c786dac36e0a842b", + "target.spice": "332414966f9c08f808e573b6f6aecd37b18e9a06ab890b17e22ac646be23613b", + "target_lvs.spice": "1aa664071bf6325103ce5a3cdcb24e3e93028832769124e1d8b62e24a287a682", + "testbench.spice": "f1a79105557bfc33119233fef29f45cc2eaa4de638b7ab4c06fa0e433cb0f52c" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW0.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW0.5_sL1/qualification.json new file mode 100644 index 00000000..52bd8af6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW0.5_sL1/qualification.json @@ -0,0 +1,108 @@ +{ + "case_id": "C07_ihp130_sW0.5_sL1", + "circuit_id": "C07", + "pdk": "ihp130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "diff_cs", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.26, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.26, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.26, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.26, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "14e92c78a6f0b2d0", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 20.77 + }, + "f3db": { + "min": 13730000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 23.77264, + "f3db": 22884650.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.2, + "schematic_measures": { + "vo1": 0.6002827, + "vo2": 0.6002827, + "idd": 4e-05, + "vos_in": 9.094947e-13, + "gain_lf": 23.77264, + "f3db": 22884650.0, + "ugf": 353554300.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW0.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW0.5_sL1/specs.json new file mode 100644 index 00000000..4f91091c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW0.5_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 20.77 + }, + "f3db": { + "min": 13730000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 23.77264, + "f3db": 22884650.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW0.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW0.5_sL1/target.spice new file mode 100644 index 00000000..5c511526 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW0.5_sL1/target.spice @@ -0,0 +1,6 @@ +.subckt C07_ihp130_sW0.5_sL1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 +XM1 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=2u l=0.26u ng=4 m=1 +XM2 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=2u l=0.26u ng=4 m=1 +XM3 VOUT1 VB1 VDD VDD sg13_lv_pmos w=2u l=0.26u ng=4 m=1 +XM4 VOUT2 VB1 VDD VDD sg13_lv_pmos w=2u l=0.26u ng=4 m=1 +.ends C07_ihp130_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW0.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW0.5_sL1/target_lvs.spice new file mode 100644 index 00000000..f7f7dfc5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW0.5_sL1/target_lvs.spice @@ -0,0 +1,18 @@ +.subckt C07_ihp130_sW0.5_sL1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 +XM1_f0 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f1 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f2 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f3 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f0 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f1 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f2 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f3 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f0 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM3_f1 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM3_f2 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM3_f3 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f0 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f1 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f2 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f3 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +.ends C07_ihp130_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW0.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW0.5_sL1/testbench.spice new file mode 100644 index 00000000..cd2ad056 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW0.5_sL1/testbench.spice @@ -0,0 +1,43 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 C07_ihp130_sW0.5_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIB1 IB1 VSS 4e-05 +.nodeset v(IB1)=0.84 +XB_VB1n VB1n VB1n VDDB VDDB sg13_lv_pmos w=2u l=0.26u +IB_VB1n VB1n VSS 2e-05 +VCM VCM 0 0.6 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +* ideal CMFB (disclosed): PMOS load gate = replica bias + Gcm*(Vocm - Vocm,target) +BCMFB VB1 0 V = v(VB1n) + 20*((v(VOUT1)+v(VOUT2))/2 - 0.6) +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW0.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW0.5_sL2/case.json new file mode 100644 index 00000000..d5a91641 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW0.5_sL2/case.json @@ -0,0 +1,156 @@ +{ + "case_id": "C07_ihp130_sW0.5_sL2", + "circuit_id": "C07", + "pdk": "ihp130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "dut_name": "C07_ihp130_sW0.5_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1", + "IB1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.52, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 0.52, + "nf": 4 + }, + "M3": { + "w": 2.0, + "l": 0.52, + "nf": 4 + }, + "M4": { + "w": 2.0, + "l": 0.52, + "nf": 4 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 2e-05 + }, + "IB1": { + "i": 4e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 0.6, + "CL": 1e-13, + "vocm": 0.6 + }, + "category": "diff_cs", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "5bfb2876a73e7f1a", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "ideal common-mode feedback on VB1" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW0.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW0.5_sL2/manifest.json new file mode 100644 index 00000000..2dde305f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW0.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "25de7ce038936b71a9bfa3b4ecc93be0a7bc5abc54dcf1f9c16ae8a3bdba9afa", + "qualification.json": "992e104f2c387a7d90c04290a62523929939042cbe0819151c03048ecb6c6adb", + "specs.json": "e610e9c0cdda41faf106b94f9125f0668936ce2eb48929fba56fc36a6a55a69d", + "target.spice": "8e59b92e302f70cf191235cc5beb99a342ee338fb1fa4cdeb82923ddfb44904c", + "target_lvs.spice": "8bce12ebd7e30396beb288f33aa311562ad24a2e85767c04f11cc1742e5f2d30", + "testbench.spice": "40e07349d689a37748090bb903978e726ff65c6c9e35ad75f7f0e22f67047c17" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW0.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW0.5_sL2/qualification.json new file mode 100644 index 00000000..83df15d2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW0.5_sL2/qualification.json @@ -0,0 +1,108 @@ +{ + "case_id": "C07_ihp130_sW0.5_sL2", + "circuit_id": "C07", + "pdk": "ihp130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "diff_cs", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "5bfb2876a73e7f1a", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 22.89 + }, + "f3db": { + "min": 8927000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 25.89251, + "f3db": 14878350.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.3, + "schematic_measures": { + "vo1": 0.6008857, + "vo2": 0.6008857, + "idd": 4e-05, + "vos_in": -9.09495e-13, + "gain_lf": 25.89251, + "f3db": 14878350.0, + "ugf": 294149900.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW0.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW0.5_sL2/specs.json new file mode 100644 index 00000000..925db25b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW0.5_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 22.89 + }, + "f3db": { + "min": 8927000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 25.89251, + "f3db": 14878350.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW0.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW0.5_sL2/target.spice new file mode 100644 index 00000000..afb43e4f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW0.5_sL2/target.spice @@ -0,0 +1,6 @@ +.subckt C07_ihp130_sW0.5_sL2 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 +XM1 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=2u l=0.52u ng=4 m=1 +XM2 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=2u l=0.52u ng=4 m=1 +XM3 VOUT1 VB1 VDD VDD sg13_lv_pmos w=2u l=0.52u ng=4 m=1 +XM4 VOUT2 VB1 VDD VDD sg13_lv_pmos w=2u l=0.52u ng=4 m=1 +.ends C07_ihp130_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW0.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW0.5_sL2/target_lvs.spice new file mode 100644 index 00000000..56274f25 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW0.5_sL2/target_lvs.spice @@ -0,0 +1,18 @@ +.subckt C07_ihp130_sW0.5_sL2 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 +XM1_f0 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f1 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f2 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f3 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f0 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f1 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f2 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f3 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f0 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM3_f1 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM3_f2 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM3_f3 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f0 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f1 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f2 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f3 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +.ends C07_ihp130_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW0.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW0.5_sL2/testbench.spice new file mode 100644 index 00000000..81bf3550 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW0.5_sL2/testbench.spice @@ -0,0 +1,43 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 C07_ihp130_sW0.5_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIB1 IB1 VSS 4e-05 +.nodeset v(IB1)=0.84 +XB_VB1n VB1n VB1n VDDB VDDB sg13_lv_pmos w=2u l=0.52u +IB_VB1n VB1n VSS 2e-05 +VCM VCM 0 0.6 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +* ideal CMFB (disclosed): PMOS load gate = replica bias + Gcm*(Vocm - Vocm,target) +BCMFB VB1 0 V = v(VB1n) + 20*((v(VOUT1)+v(VOUT2))/2 - 0.6) +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1.5_sL1.5/case.json new file mode 100644 index 00000000..9d23b34c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1.5_sL1.5/case.json @@ -0,0 +1,156 @@ +{ + "case_id": "C07_ihp130_sW1.5_sL1.5", + "circuit_id": "C07", + "pdk": "ihp130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "dut_name": "C07_ihp130_sW1.5_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1", + "IB1" + ], + "sizing": { + "M1": { + "w": 6.0, + "l": 0.39, + "nf": 12 + }, + "M2": { + "w": 6.0, + "l": 0.39, + "nf": 12 + }, + "M3": { + "w": 6.0, + "l": 0.39, + "nf": 12 + }, + "M4": { + "w": 6.0, + "l": 0.39, + "nf": 12 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 2e-05 + }, + "IB1": { + "i": 4e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 0.6, + "CL": 1e-13, + "vocm": 0.6 + }, + "category": "diff_cs", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.39, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.39, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.39, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.39, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "9127391f3a93e650", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "ideal common-mode feedback on VB1" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1.5_sL1.5/manifest.json new file mode 100644 index 00000000..501e34b9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "75fadc718bedaa63505fe09dfeb854c8ced3732ea329977c78b56ad05b2e812f", + "qualification.json": "70a867933131a45db0d08fd51c8df1dc445e95b5b8f30cbc157ec67f7a375afe", + "specs.json": "50dd0c7f62a4194648957329dfe9942efeadc584b1dd76512304ffddf50fdc88", + "target.spice": "dd55f552d98f61e5a1e929015a5ee9a522458f3108ecd96cd31f968d219654b0", + "target_lvs.spice": "9346e1320a7279cbe0959407b5636d4a5ca1447194cdbb7c14a21994494d908c", + "testbench.spice": "9b22b291e567da291e67b67ed57ff1f23c9ab577e12c75564aea71dd411d6561" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1.5_sL1.5/qualification.json new file mode 100644 index 00000000..5bf0e416 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1.5_sL1.5/qualification.json @@ -0,0 +1,108 @@ +{ + "case_id": "C07_ihp130_sW1.5_sL1.5", + "circuit_id": "C07", + "pdk": "ihp130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "diff_cs", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.39, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.39, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.39, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.39, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "9127391f3a93e650", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 22.11 + }, + "f3db": { + "min": 14720000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 25.10702, + "f3db": 24535880.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.8, + "schematic_measures": { + "vo1": 0.6006771, + "vo2": 0.6006771, + "idd": 4e-05, + "vos_in": 0.0, + "gain_lf": 25.10702, + "f3db": 24535880.0, + "ugf": 443202400.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1.5_sL1.5/specs.json new file mode 100644 index 00000000..b9ac78e6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1.5_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 22.11 + }, + "f3db": { + "min": 14720000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 25.10702, + "f3db": 24535880.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1.5_sL1.5/target.spice new file mode 100644 index 00000000..16243f05 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1.5_sL1.5/target.spice @@ -0,0 +1,6 @@ +.subckt C07_ihp130_sW1.5_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 +XM1 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=6u l=0.39u ng=12 m=1 +XM2 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=6u l=0.39u ng=12 m=1 +XM3 VOUT1 VB1 VDD VDD sg13_lv_pmos w=6u l=0.39u ng=12 m=1 +XM4 VOUT2 VB1 VDD VDD sg13_lv_pmos w=6u l=0.39u ng=12 m=1 +.ends C07_ihp130_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..d512a390 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1.5_sL1.5/target_lvs.spice @@ -0,0 +1,50 @@ +.subckt C07_ihp130_sW1.5_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 +XM1_f0 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f1 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f2 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f3 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f4 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f5 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f6 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f7 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f8 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f9 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f10 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f11 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f0 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f1 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f2 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f3 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f4 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f5 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f6 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f7 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f8 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f9 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f10 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f11 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f0 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM3_f1 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM3_f2 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM3_f3 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM3_f4 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM3_f5 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM3_f6 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM3_f7 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM3_f8 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM3_f9 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM3_f10 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM3_f11 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f0 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f1 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f2 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f3 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f4 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f5 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f6 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f7 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f8 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f9 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f10 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f11 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +.ends C07_ihp130_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1.5_sL1.5/testbench.spice new file mode 100644 index 00000000..0a7d6542 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1.5_sL1.5/testbench.spice @@ -0,0 +1,43 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 C07_ihp130_sW1.5_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIB1 IB1 VSS 4e-05 +.nodeset v(IB1)=0.84 +XB_VB1n VB1n VB1n VDDB VDDB sg13_lv_pmos w=6u l=0.39u +IB_VB1n VB1n VSS 2e-05 +VCM VCM 0 0.6 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +* ideal CMFB (disclosed): PMOS load gate = replica bias + Gcm*(Vocm - Vocm,target) +BCMFB VB1 0 V = v(VB1n) + 20*((v(VOUT1)+v(VOUT2))/2 - 0.6) +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1.5_sL1/case.json new file mode 100644 index 00000000..d357f7c8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1.5_sL1/case.json @@ -0,0 +1,156 @@ +{ + "case_id": "C07_ihp130_sW1.5_sL1", + "circuit_id": "C07", + "pdk": "ihp130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "dut_name": "C07_ihp130_sW1.5_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1", + "IB1" + ], + "sizing": { + "M1": { + "w": 6.0, + "l": 0.26, + "nf": 12 + }, + "M2": { + "w": 6.0, + "l": 0.26, + "nf": 12 + }, + "M3": { + "w": 6.0, + "l": 0.26, + "nf": 12 + }, + "M4": { + "w": 6.0, + "l": 0.26, + "nf": 12 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 2e-05 + }, + "IB1": { + "i": 4e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 0.6, + "CL": 1e-13, + "vocm": 0.6 + }, + "category": "diff_cs", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.26, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.26, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.26, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.26, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "c08a84dbcc35481e", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "ideal common-mode feedback on VB1" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1.5_sL1/manifest.json new file mode 100644 index 00000000..a969b3c6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "88d82003d030b8e5bc41bfcf87e738cdbeb73d8cb5b11c46b86888eba8ee3544", + "qualification.json": "748bad17d9e1bd88dc4774317048b5b41542541c579a932305907a699cd9ef56", + "specs.json": "60989b23eff9f583a1e46432d6da30954b88cbef6da5c871aae507e9903302df", + "target.spice": "8f634b412f16624587bbcb6109aa38f2781e94694fe1547a1cc5fdd806bb0c22", + "target_lvs.spice": "fd9aa4ec23c7e8735a0a79f68dccb3a452cdd1d77103722c33e76230c5b4e68a", + "testbench.spice": "c2138500f7abca2d7d577a802c54f9f1387016ee7a2771c1efe68d23f0150c09" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1.5_sL1/qualification.json new file mode 100644 index 00000000..76119852 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1.5_sL1/qualification.json @@ -0,0 +1,108 @@ +{ + "case_id": "C07_ihp130_sW1.5_sL1", + "circuit_id": "C07", + "pdk": "ihp130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "diff_cs", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.26, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.26, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.26, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.26, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "c08a84dbcc35481e", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 20.64 + }, + "f3db": { + "min": 18710000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 23.635, + "f3db": 31189430.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.6, + "schematic_measures": { + "vo1": 0.6003577, + "vo2": 0.6003577, + "idd": 4e-05, + "vos_in": 0.0, + "gain_lf": 23.635, + "f3db": 31189430.0, + "ugf": 475420900.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1.5_sL1/specs.json new file mode 100644 index 00000000..939c0969 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1.5_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 20.64 + }, + "f3db": { + "min": 18710000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 23.635, + "f3db": 31189430.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1.5_sL1/target.spice new file mode 100644 index 00000000..d2abd048 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1.5_sL1/target.spice @@ -0,0 +1,6 @@ +.subckt C07_ihp130_sW1.5_sL1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 +XM1 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=6u l=0.26u ng=12 m=1 +XM2 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=6u l=0.26u ng=12 m=1 +XM3 VOUT1 VB1 VDD VDD sg13_lv_pmos w=6u l=0.26u ng=12 m=1 +XM4 VOUT2 VB1 VDD VDD sg13_lv_pmos w=6u l=0.26u ng=12 m=1 +.ends C07_ihp130_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1.5_sL1/target_lvs.spice new file mode 100644 index 00000000..3dc4affa --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1.5_sL1/target_lvs.spice @@ -0,0 +1,50 @@ +.subckt C07_ihp130_sW1.5_sL1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 +XM1_f0 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f1 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f2 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f3 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f4 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f5 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f6 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f7 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f8 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f9 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f10 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f11 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f0 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f1 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f2 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f3 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f4 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f5 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f6 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f7 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f8 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f9 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f10 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f11 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f0 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM3_f1 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM3_f2 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM3_f3 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM3_f4 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM3_f5 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM3_f6 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM3_f7 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM3_f8 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM3_f9 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM3_f10 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM3_f11 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f0 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f1 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f2 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f3 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f4 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f5 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f6 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f7 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f8 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f9 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f10 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f11 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +.ends C07_ihp130_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1.5_sL1/testbench.spice new file mode 100644 index 00000000..d579dd4b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1.5_sL1/testbench.spice @@ -0,0 +1,43 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 C07_ihp130_sW1.5_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIB1 IB1 VSS 4e-05 +.nodeset v(IB1)=0.84 +XB_VB1n VB1n VB1n VDDB VDDB sg13_lv_pmos w=6u l=0.26u +IB_VB1n VB1n VSS 2e-05 +VCM VCM 0 0.6 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +* ideal CMFB (disclosed): PMOS load gate = replica bias + Gcm*(Vocm - Vocm,target) +BCMFB VB1 0 V = v(VB1n) + 20*((v(VOUT1)+v(VOUT2))/2 - 0.6) +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1.5_sL2/case.json new file mode 100644 index 00000000..bf24d60d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1.5_sL2/case.json @@ -0,0 +1,156 @@ +{ + "case_id": "C07_ihp130_sW1.5_sL2", + "circuit_id": "C07", + "pdk": "ihp130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "dut_name": "C07_ihp130_sW1.5_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1", + "IB1" + ], + "sizing": { + "M1": { + "w": 6.0, + "l": 0.52, + "nf": 12 + }, + "M2": { + "w": 6.0, + "l": 0.52, + "nf": 12 + }, + "M3": { + "w": 6.0, + "l": 0.52, + "nf": 12 + }, + "M4": { + "w": 6.0, + "l": 0.52, + "nf": 12 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 2e-05 + }, + "IB1": { + "i": 4e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 0.6, + "CL": 1e-13, + "vocm": 0.6 + }, + "category": "diff_cs", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.52, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.52, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.52, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.52, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "44e06a459e1d96c0", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "ideal common-mode feedback on VB1" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1.5_sL2/manifest.json new file mode 100644 index 00000000..6bcf8b89 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "fcfeb5569bfa8514a6c88ff2f263bc5e3564ae6b6c9560dca3bd52d0d2c4fd19", + "qualification.json": "6442110ebe0e16b2742f59d9c8fb6807468eaa6d32ef7842f00cba1f027356a3", + "specs.json": "b2c79f931faf85734257271250d10f306a4a044beaaf618892f53292537b3b7d", + "target.spice": "a23abe21156bff67b55669db2780373c4a5b672265f8054a333db3c2225ccb20", + "target_lvs.spice": "628029d6f52e890adc2512c593f665cbc09a85d23d4c2d26ff4fbafa84dd3078", + "testbench.spice": "e9ed97cef5b0e6d1bead72052b361c9a4f61f7d96545e12323e181aeda588be3" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1.5_sL2/qualification.json new file mode 100644 index 00000000..f0c76b07 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1.5_sL2/qualification.json @@ -0,0 +1,108 @@ +{ + "case_id": "C07_ihp130_sW1.5_sL2", + "circuit_id": "C07", + "pdk": "ihp130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "diff_cs", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.52, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.52, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.52, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.52, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "44e06a459e1d96c0", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 23.04 + }, + "f3db": { + "min": 12340000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 26.0359, + "f3db": 20569130.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.5, + "schematic_measures": { + "vo1": 0.6008833, + "vo2": 0.6008833, + "idd": 4e-05, + "vos_in": 0.0, + "gain_lf": 26.0359, + "f3db": 20569130.0, + "ugf": 414566700.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1.5_sL2/specs.json new file mode 100644 index 00000000..ec28560b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1.5_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 23.04 + }, + "f3db": { + "min": 12340000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 26.0359, + "f3db": 20569130.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1.5_sL2/target.spice new file mode 100644 index 00000000..291b93fc --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1.5_sL2/target.spice @@ -0,0 +1,6 @@ +.subckt C07_ihp130_sW1.5_sL2 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 +XM1 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=6u l=0.52u ng=12 m=1 +XM2 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=6u l=0.52u ng=12 m=1 +XM3 VOUT1 VB1 VDD VDD sg13_lv_pmos w=6u l=0.52u ng=12 m=1 +XM4 VOUT2 VB1 VDD VDD sg13_lv_pmos w=6u l=0.52u ng=12 m=1 +.ends C07_ihp130_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1.5_sL2/target_lvs.spice new file mode 100644 index 00000000..43281df0 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1.5_sL2/target_lvs.spice @@ -0,0 +1,50 @@ +.subckt C07_ihp130_sW1.5_sL2 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 +XM1_f0 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f1 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f2 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f3 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f4 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f5 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f6 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f7 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f8 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f9 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f10 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f11 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f0 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f1 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f2 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f3 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f4 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f5 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f6 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f7 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f8 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f9 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f10 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f11 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f0 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM3_f1 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM3_f2 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM3_f3 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM3_f4 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM3_f5 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM3_f6 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM3_f7 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM3_f8 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM3_f9 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM3_f10 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM3_f11 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f0 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f1 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f2 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f3 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f4 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f5 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f6 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f7 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f8 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f9 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f10 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f11 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +.ends C07_ihp130_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1.5_sL2/testbench.spice new file mode 100644 index 00000000..13fc7dca --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1.5_sL2/testbench.spice @@ -0,0 +1,43 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 C07_ihp130_sW1.5_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIB1 IB1 VSS 4e-05 +.nodeset v(IB1)=0.84 +XB_VB1n VB1n VB1n VDDB VDDB sg13_lv_pmos w=6u l=0.52u +IB_VB1n VB1n VSS 2e-05 +VCM VCM 0 0.6 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +* ideal CMFB (disclosed): PMOS load gate = replica bias + Gcm*(Vocm - Vocm,target) +BCMFB VB1 0 V = v(VB1n) + 20*((v(VOUT1)+v(VOUT2))/2 - 0.6) +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1_sL1.5/case.json new file mode 100644 index 00000000..8efbc187 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1_sL1.5/case.json @@ -0,0 +1,156 @@ +{ + "case_id": "C07_ihp130_sW1_sL1.5", + "circuit_id": "C07", + "pdk": "ihp130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "dut_name": "C07_ihp130_sW1_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1", + "IB1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.39, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 0.39, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 0.39, + "nf": 8 + }, + "M4": { + "w": 4.0, + "l": 0.39, + "nf": 8 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 2e-05 + }, + "IB1": { + "i": 4e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 0.6, + "CL": 1e-13, + "vocm": 0.6 + }, + "category": "diff_cs", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "b5cb51c678195e4c", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "ideal common-mode feedback on VB1" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1_sL1.5/manifest.json new file mode 100644 index 00000000..d79ff677 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "556e07c2917d40c0f28dc197c038b5600d403a0de410b2b4442b1d5bc74b52c2", + "qualification.json": "b577916bb20b2df072b5442195d2c57f2b89b39053286dfec44da9885097c5b6", + "specs.json": "f8500383b3cebb556adcc7c6384d72686cecd073661d1a5069de9fedf2c139b2", + "target.spice": "e4b1a3657a09ca5417598c853a30f96ead81030557b8383fc4ac02e43e3dfc45", + "target_lvs.spice": "7245fc63b775f80d1bbdddc61365f4f50967b34b374a5ef90c7f4dee1ba09c9f", + "testbench.spice": "c123692bf389aee14e77e0e61cbbea86fe78fbc7888c69b95454436f9b558be0" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1_sL1.5/qualification.json new file mode 100644 index 00000000..80691838 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1_sL1.5/qualification.json @@ -0,0 +1,108 @@ +{ + "case_id": "C07_ihp130_sW1_sL1.5", + "circuit_id": "C07", + "pdk": "ihp130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "diff_cs", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "b5cb51c678195e4c", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 22.17 + }, + "f3db": { + "min": 13190000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 25.16505, + "f3db": 21988990.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.4, + "schematic_measures": { + "vo1": 0.6006961, + "vo2": 0.6006961, + "idd": 4e-05, + "vos_in": 0.0, + "gain_lf": 25.16505, + "f3db": 21988990.0, + "ugf": 399388700.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1_sL1.5/specs.json new file mode 100644 index 00000000..01a46ad6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 22.17 + }, + "f3db": { + "min": 13190000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 25.16505, + "f3db": 21988990.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1_sL1.5/target.spice new file mode 100644 index 00000000..29b023a7 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1_sL1.5/target.spice @@ -0,0 +1,6 @@ +.subckt C07_ihp130_sW1_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 +XM1 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=4u l=0.39u ng=8 m=1 +XM2 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=4u l=0.39u ng=8 m=1 +XM3 VOUT1 VB1 VDD VDD sg13_lv_pmos w=4u l=0.39u ng=8 m=1 +XM4 VOUT2 VB1 VDD VDD sg13_lv_pmos w=4u l=0.39u ng=8 m=1 +.ends C07_ihp130_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1_sL1.5/target_lvs.spice new file mode 100644 index 00000000..c96ba9bb --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1_sL1.5/target_lvs.spice @@ -0,0 +1,34 @@ +.subckt C07_ihp130_sW1_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 +XM1_f0 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f1 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f2 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f3 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f4 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f5 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f6 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f7 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f0 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f1 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f2 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f3 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f4 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f5 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f6 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f7 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f0 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM3_f1 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM3_f2 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM3_f3 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM3_f4 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM3_f5 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM3_f6 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM3_f7 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f0 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f1 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f2 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f3 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f4 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f5 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f6 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f7 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +.ends C07_ihp130_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1_sL1.5/testbench.spice new file mode 100644 index 00000000..0d6b5991 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1_sL1.5/testbench.spice @@ -0,0 +1,43 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 C07_ihp130_sW1_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIB1 IB1 VSS 4e-05 +.nodeset v(IB1)=0.84 +XB_VB1n VB1n VB1n VDDB VDDB sg13_lv_pmos w=4u l=0.39u +IB_VB1n VB1n VSS 2e-05 +VCM VCM 0 0.6 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +* ideal CMFB (disclosed): PMOS load gate = replica bias + Gcm*(Vocm - Vocm,target) +BCMFB VB1 0 V = v(VB1n) + 20*((v(VOUT1)+v(VOUT2))/2 - 0.6) +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1_sL1/case.json new file mode 100644 index 00000000..e83eee62 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1_sL1/case.json @@ -0,0 +1,156 @@ +{ + "case_id": "C07_ihp130_sW1_sL1", + "circuit_id": "C07", + "pdk": "ihp130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "dut_name": "C07_ihp130_sW1_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1", + "IB1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.26, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 0.26, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 0.26, + "nf": 8 + }, + "M4": { + "w": 4.0, + "l": 0.26, + "nf": 8 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 2e-05 + }, + "IB1": { + "i": 4e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 0.6, + "CL": 1e-13, + "vocm": 0.6 + }, + "category": "diff_cs", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "32f278c8e9f1989e", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "ideal common-mode feedback on VB1" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1_sL1/manifest.json new file mode 100644 index 00000000..49b21612 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "743d2d4df69c20a6dc49bdbb066080368afd4874e0d4cf43f4e7b166d41a33f2", + "qualification.json": "2f83f3a0f9a2cb0f7d132c57d8355ff6aa9184896156b4caa7adc1fb981a6f8c", + "specs.json": "3113861cbe90a186198bfe14d2a232743553ba6c929721aaac7814be9b4c316c", + "target.spice": "edc56bc8f6804813e41fd2e01ccf6044bfaae669c83d671adb172bfeb4f795de", + "target_lvs.spice": "8dd77ed46d9e654b7eba375bf839ec6ac1c453bb07afe7816c3801cb9a5fb8ac", + "testbench.spice": "d3d33e10cfa3e669464072340db60df7f1fd8df3ed4313b75f7ee451ee607e28" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1_sL1/qualification.json new file mode 100644 index 00000000..c00bcb11 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1_sL1/qualification.json @@ -0,0 +1,108 @@ +{ + "case_id": "C07_ihp130_sW1_sL1", + "circuit_id": "C07", + "pdk": "ihp130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "diff_cs", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "32f278c8e9f1989e", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 20.72 + }, + "f3db": { + "min": 16890000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 23.71739, + "f3db": 28149450.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.4, + "schematic_measures": { + "vo1": 0.6003496, + "vo2": 0.6003496, + "idd": 4e-05, + "vos_in": 0.0, + "gain_lf": 23.71739, + "f3db": 28149450.0, + "ugf": 432803400.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1_sL1/specs.json new file mode 100644 index 00000000..5fc64ac6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 20.72 + }, + "f3db": { + "min": 16890000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 23.71739, + "f3db": 28149450.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1_sL1/target.spice new file mode 100644 index 00000000..2cd2d096 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1_sL1/target.spice @@ -0,0 +1,6 @@ +.subckt C07_ihp130_sW1_sL1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 +XM1 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=4u l=0.26u ng=8 m=1 +XM2 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=4u l=0.26u ng=8 m=1 +XM3 VOUT1 VB1 VDD VDD sg13_lv_pmos w=4u l=0.26u ng=8 m=1 +XM4 VOUT2 VB1 VDD VDD sg13_lv_pmos w=4u l=0.26u ng=8 m=1 +.ends C07_ihp130_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1_sL1/target_lvs.spice new file mode 100644 index 00000000..4c7e93f4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1_sL1/target_lvs.spice @@ -0,0 +1,34 @@ +.subckt C07_ihp130_sW1_sL1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 +XM1_f0 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f1 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f2 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f3 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f4 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f5 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f6 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f7 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f0 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f1 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f2 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f3 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f4 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f5 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f6 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f7 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f0 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM3_f1 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM3_f2 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM3_f3 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM3_f4 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM3_f5 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM3_f6 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM3_f7 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f0 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f1 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f2 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f3 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f4 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f5 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f6 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f7 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +.ends C07_ihp130_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1_sL1/testbench.spice new file mode 100644 index 00000000..4af49559 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1_sL1/testbench.spice @@ -0,0 +1,43 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 C07_ihp130_sW1_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIB1 IB1 VSS 4e-05 +.nodeset v(IB1)=0.84 +XB_VB1n VB1n VB1n VDDB VDDB sg13_lv_pmos w=4u l=0.26u +IB_VB1n VB1n VSS 2e-05 +VCM VCM 0 0.6 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +* ideal CMFB (disclosed): PMOS load gate = replica bias + Gcm*(Vocm - Vocm,target) +BCMFB VB1 0 V = v(VB1n) + 20*((v(VOUT1)+v(VOUT2))/2 - 0.6) +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1_sL2/case.json new file mode 100644 index 00000000..b007e96a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1_sL2/case.json @@ -0,0 +1,156 @@ +{ + "case_id": "C07_ihp130_sW1_sL2", + "circuit_id": "C07", + "pdk": "ihp130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "dut_name": "C07_ihp130_sW1_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1", + "IB1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.52, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 0.52, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 0.52, + "nf": 8 + }, + "M4": { + "w": 4.0, + "l": 0.52, + "nf": 8 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 2e-05 + }, + "IB1": { + "i": 4e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 0.6, + "CL": 1e-13, + "vocm": 0.6 + }, + "category": "diff_cs", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "499c4bcbf27c7078", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "ideal common-mode feedback on VB1" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1_sL2/manifest.json new file mode 100644 index 00000000..4c334946 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "72ef99d6864cf7a0f49cf1020b6581b6fca64081da57de6c00ff87b8ae76da4c", + "qualification.json": "ed7453cf8972e377fb19e150a04043f3bca349d1617d78ff0a9961483f88c528", + "specs.json": "0f2fab7ef88317c47f8cd8bf864bd13046bad68d11fc4ffdb6d26084c6dd365c", + "target.spice": "a1e7818f27f673b1aa4e5925993ab8c2ac8c52c313498ed41b37f755834e9d70", + "target_lvs.spice": "aa6c1ba2d5be677c3b6b0a5efb40e0c86720a19e2d0b0a3b662d3d76213f74b2", + "testbench.spice": "28920ccce7aec18efcc15a4f240f5d3d607080f716a9954e371bfe29ed8ae4ff" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1_sL2/qualification.json new file mode 100644 index 00000000..1583f47a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1_sL2/qualification.json @@ -0,0 +1,108 @@ +{ + "case_id": "C07_ihp130_sW1_sL2", + "circuit_id": "C07", + "pdk": "ihp130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "diff_cs", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "499c4bcbf27c7078", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 23.07 + }, + "f3db": { + "min": 11010000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 26.06961, + "f3db": 18356100.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.4, + "schematic_measures": { + "vo1": 0.6009213, + "vo2": 0.6009213, + "idd": 4e-05, + "vos_in": 0.0, + "gain_lf": 26.06961, + "f3db": 18356100.0, + "ugf": 370858700.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1_sL2/specs.json new file mode 100644 index 00000000..71a07fb8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 23.07 + }, + "f3db": { + "min": 11010000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 26.06961, + "f3db": 18356100.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1_sL2/target.spice new file mode 100644 index 00000000..1556d0db --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1_sL2/target.spice @@ -0,0 +1,6 @@ +.subckt C07_ihp130_sW1_sL2 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 +XM1 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=4u l=0.52u ng=8 m=1 +XM2 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=4u l=0.52u ng=8 m=1 +XM3 VOUT1 VB1 VDD VDD sg13_lv_pmos w=4u l=0.52u ng=8 m=1 +XM4 VOUT2 VB1 VDD VDD sg13_lv_pmos w=4u l=0.52u ng=8 m=1 +.ends C07_ihp130_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1_sL2/target_lvs.spice new file mode 100644 index 00000000..df01968e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1_sL2/target_lvs.spice @@ -0,0 +1,34 @@ +.subckt C07_ihp130_sW1_sL2 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 +XM1_f0 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f1 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f2 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f3 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f4 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f5 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f6 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f7 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f0 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f1 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f2 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f3 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f4 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f5 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f6 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f7 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f0 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM3_f1 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM3_f2 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM3_f3 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM3_f4 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM3_f5 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM3_f6 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM3_f7 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f0 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f1 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f2 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f3 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f4 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f5 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f6 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f7 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +.ends C07_ihp130_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1_sL2/testbench.spice new file mode 100644 index 00000000..eff86cef --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW1_sL2/testbench.spice @@ -0,0 +1,43 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 C07_ihp130_sW1_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIB1 IB1 VSS 4e-05 +.nodeset v(IB1)=0.84 +XB_VB1n VB1n VB1n VDDB VDDB sg13_lv_pmos w=4u l=0.52u +IB_VB1n VB1n VSS 2e-05 +VCM VCM 0 0.6 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +* ideal CMFB (disclosed): PMOS load gate = replica bias + Gcm*(Vocm - Vocm,target) +BCMFB VB1 0 V = v(VB1n) + 20*((v(VOUT1)+v(VOUT2))/2 - 0.6) +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW2_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW2_sL1.5/case.json new file mode 100644 index 00000000..185d6f39 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW2_sL1.5/case.json @@ -0,0 +1,156 @@ +{ + "case_id": "C07_ihp130_sW2_sL1.5", + "circuit_id": "C07", + "pdk": "ihp130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "dut_name": "C07_ihp130_sW2_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1", + "IB1" + ], + "sizing": { + "M1": { + "w": 8.0, + "l": 0.39, + "nf": 16 + }, + "M2": { + "w": 8.0, + "l": 0.39, + "nf": 16 + }, + "M3": { + "w": 8.0, + "l": 0.39, + "nf": 16 + }, + "M4": { + "w": 8.0, + "l": 0.39, + "nf": 16 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 2e-05 + }, + "IB1": { + "i": 4e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 0.6, + "CL": 1e-13, + "vocm": 0.6 + }, + "category": "diff_cs", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "c361bd3eb5b0b581", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "ideal common-mode feedback on VB1" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW2_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW2_sL1.5/manifest.json new file mode 100644 index 00000000..974d9e63 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW2_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "32739d917c5a7e3ae0f663262471017673e22ae084d6dfbeee0ab007feb64b64", + "qualification.json": "d9c75a3738658d6a2a6dc81d285635b0a1b97303549b8b39567d6726abd927fc", + "specs.json": "087f510b3dd4ceed95b46344d34d1c550de7c177697b1c467331e61e7cf573b5", + "target.spice": "6c2262004d81db3a2e12a7685f70604eca380b144aa48bcb8260deb7c41a19e8", + "target_lvs.spice": "171798b13cb9b7880a025f51dd485e1c340d75258ce2f15faa1c515707b0ebde", + "testbench.spice": "f9e458eb94971be02af547fbf9dd816edf8656328046381c14b80ab7acb4b95d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW2_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW2_sL1.5/qualification.json new file mode 100644 index 00000000..e7d01c90 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW2_sL1.5/qualification.json @@ -0,0 +1,108 @@ +{ + "case_id": "C07_ihp130_sW2_sL1.5", + "circuit_id": "C07", + "pdk": "ihp130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "diff_cs", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "c361bd3eb5b0b581", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 22.06 + }, + "f3db": { + "min": 15710000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 25.05554, + "f3db": 26179600.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.7, + "schematic_measures": { + "vo1": 0.6006539, + "vo2": 0.6006539, + "idd": 4e-05, + "vos_in": 0.0, + "gain_lf": 25.05554, + "f3db": 26179600.0, + "ugf": 471140000.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW2_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW2_sL1.5/specs.json new file mode 100644 index 00000000..f7a8f503 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW2_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 22.06 + }, + "f3db": { + "min": 15710000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 25.05554, + "f3db": 26179600.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW2_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW2_sL1.5/target.spice new file mode 100644 index 00000000..72546791 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW2_sL1.5/target.spice @@ -0,0 +1,6 @@ +.subckt C07_ihp130_sW2_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 +XM1 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=8u l=0.39u ng=16 m=1 +XM2 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=8u l=0.39u ng=16 m=1 +XM3 VOUT1 VB1 VDD VDD sg13_lv_pmos w=8u l=0.39u ng=16 m=1 +XM4 VOUT2 VB1 VDD VDD sg13_lv_pmos w=8u l=0.39u ng=16 m=1 +.ends C07_ihp130_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW2_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW2_sL1.5/target_lvs.spice new file mode 100644 index 00000000..3bef677e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW2_sL1.5/target_lvs.spice @@ -0,0 +1,66 @@ +.subckt C07_ihp130_sW2_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 +XM1_f0 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f1 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f2 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f3 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f4 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f5 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f6 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f7 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f8 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f9 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f10 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f11 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f12 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f13 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f14 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f15 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f0 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f1 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f2 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f3 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f4 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f5 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f6 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f7 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f8 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f9 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f10 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f11 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f12 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f13 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f14 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f15 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f0 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM3_f1 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM3_f2 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM3_f3 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM3_f4 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM3_f5 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM3_f6 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM3_f7 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM3_f8 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM3_f9 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM3_f10 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM3_f11 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM3_f12 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM3_f13 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM3_f14 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM3_f15 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f0 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f1 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f2 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f3 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f4 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f5 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f6 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f7 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f8 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f9 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f10 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f11 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f12 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f13 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f14 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f15 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +.ends C07_ihp130_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW2_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW2_sL1.5/testbench.spice new file mode 100644 index 00000000..a716b0ca --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW2_sL1.5/testbench.spice @@ -0,0 +1,43 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 C07_ihp130_sW2_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIB1 IB1 VSS 4e-05 +.nodeset v(IB1)=0.84 +XB_VB1n VB1n VB1n VDDB VDDB sg13_lv_pmos w=8u l=0.39u +IB_VB1n VB1n VSS 2e-05 +VCM VCM 0 0.6 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +* ideal CMFB (disclosed): PMOS load gate = replica bias + Gcm*(Vocm - Vocm,target) +BCMFB VB1 0 V = v(VB1n) + 20*((v(VOUT1)+v(VOUT2))/2 - 0.6) +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW2_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW2_sL1/case.json new file mode 100644 index 00000000..11255bd1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW2_sL1/case.json @@ -0,0 +1,156 @@ +{ + "case_id": "C07_ihp130_sW2_sL1", + "circuit_id": "C07", + "pdk": "ihp130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "dut_name": "C07_ihp130_sW2_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1", + "IB1" + ], + "sizing": { + "M1": { + "w": 8.0, + "l": 0.26, + "nf": 16 + }, + "M2": { + "w": 8.0, + "l": 0.26, + "nf": 16 + }, + "M3": { + "w": 8.0, + "l": 0.26, + "nf": 16 + }, + "M4": { + "w": 8.0, + "l": 0.26, + "nf": 16 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 2e-05 + }, + "IB1": { + "i": 4e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 0.6, + "CL": 1e-13, + "vocm": 0.6 + }, + "category": "diff_cs", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.26, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.26, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.26, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.26, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "f4be17b428abcb73", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "ideal common-mode feedback on VB1" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW2_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW2_sL1/manifest.json new file mode 100644 index 00000000..cedf5f03 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW2_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "7ea989e60170e2be7d842db9b8b05802a3224440d9e09499e39c336a6329a25b", + "qualification.json": "43cfabd433ac25d3fe8d16b791faa08afaf1b4b787400bf4ad83731aeb8cd0d1", + "specs.json": "b4e7e936ac872b9a7971d2d021b3df50404ba3fa20bda6a318b475789e9a1570", + "target.spice": "28a2b73afa12888dcd5e71f52d3837de85f80c921ed561e41fd8aae15c450ea4", + "target_lvs.spice": "b1d64638607ea061c4d1f08e3997c596e76007bbbd4409ce3be08c58995b1a77", + "testbench.spice": "d3d1b70ab333a1c391df2ff549eeef764ee7bf4dc3c8a9268249459fcb0e6218" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW2_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW2_sL1/qualification.json new file mode 100644 index 00000000..865cc519 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW2_sL1/qualification.json @@ -0,0 +1,108 @@ +{ + "case_id": "C07_ihp130_sW2_sL1", + "circuit_id": "C07", + "pdk": "ihp130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "diff_cs", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.26, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.26, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.26, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.26, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "f4be17b428abcb73", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 20.59 + }, + "f3db": { + "min": 19830000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 23.58585, + "f3db": 33050730.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.8, + "schematic_measures": { + "vo1": 0.6003564, + "vo2": 0.6003564, + "idd": 4e-05, + "vos_in": 0.0, + "gain_lf": 23.58585, + "f3db": 33050730.0, + "ugf": 500458300.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW2_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW2_sL1/specs.json new file mode 100644 index 00000000..37e31def --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW2_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 20.59 + }, + "f3db": { + "min": 19830000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 23.58585, + "f3db": 33050730.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW2_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW2_sL1/target.spice new file mode 100644 index 00000000..5ed4551e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW2_sL1/target.spice @@ -0,0 +1,6 @@ +.subckt C07_ihp130_sW2_sL1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 +XM1 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=8u l=0.26u ng=16 m=1 +XM2 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=8u l=0.26u ng=16 m=1 +XM3 VOUT1 VB1 VDD VDD sg13_lv_pmos w=8u l=0.26u ng=16 m=1 +XM4 VOUT2 VB1 VDD VDD sg13_lv_pmos w=8u l=0.26u ng=16 m=1 +.ends C07_ihp130_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW2_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW2_sL1/target_lvs.spice new file mode 100644 index 00000000..f19becbf --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW2_sL1/target_lvs.spice @@ -0,0 +1,66 @@ +.subckt C07_ihp130_sW2_sL1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 +XM1_f0 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f1 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f2 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f3 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f4 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f5 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f6 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f7 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f8 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f9 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f10 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f11 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f12 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f13 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f14 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f15 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f0 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f1 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f2 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f3 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f4 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f5 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f6 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f7 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f8 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f9 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f10 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f11 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f12 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f13 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f14 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f15 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f0 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM3_f1 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM3_f2 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM3_f3 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM3_f4 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM3_f5 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM3_f6 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM3_f7 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM3_f8 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM3_f9 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM3_f10 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM3_f11 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM3_f12 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM3_f13 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM3_f14 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM3_f15 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f0 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f1 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f2 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f3 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f4 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f5 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f6 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f7 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f8 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f9 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f10 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f11 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f12 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f13 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f14 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f15 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +.ends C07_ihp130_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW2_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW2_sL1/testbench.spice new file mode 100644 index 00000000..1d2f6f71 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW2_sL1/testbench.spice @@ -0,0 +1,43 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 C07_ihp130_sW2_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIB1 IB1 VSS 4e-05 +.nodeset v(IB1)=0.84 +XB_VB1n VB1n VB1n VDDB VDDB sg13_lv_pmos w=8u l=0.26u +IB_VB1n VB1n VSS 2e-05 +VCM VCM 0 0.6 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +* ideal CMFB (disclosed): PMOS load gate = replica bias + Gcm*(Vocm - Vocm,target) +BCMFB VB1 0 V = v(VB1n) + 20*((v(VOUT1)+v(VOUT2))/2 - 0.6) +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW2_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW2_sL2/case.json new file mode 100644 index 00000000..f32a59b6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW2_sL2/case.json @@ -0,0 +1,156 @@ +{ + "case_id": "C07_ihp130_sW2_sL2", + "circuit_id": "C07", + "pdk": "ihp130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "dut_name": "C07_ihp130_sW2_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1", + "IB1" + ], + "sizing": { + "M1": { + "w": 8.0, + "l": 0.52, + "nf": 16 + }, + "M2": { + "w": 8.0, + "l": 0.52, + "nf": 16 + }, + "M3": { + "w": 8.0, + "l": 0.52, + "nf": 16 + }, + "M4": { + "w": 8.0, + "l": 0.52, + "nf": 16 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 2e-05 + }, + "IB1": { + "i": 4e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 0.6, + "CL": 1e-13, + "vocm": 0.6 + }, + "category": "diff_cs", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "748fe8081e7c23b4", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "ideal common-mode feedback on VB1" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW2_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW2_sL2/manifest.json new file mode 100644 index 00000000..b4611707 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW2_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "c388f7a56567967c74cbde692e4d23ea7c86da317158e6814ee4d077c4e90b5e", + "qualification.json": "adfde8141226284eb3d63627c27f6c3b101e8e0f7e0e3f5b3fbc4dff87d7805c", + "specs.json": "f10af05d1888313b596e2035ed43b9158cbdc7809932ceae769501a665bddee7", + "target.spice": "be0d849d665fbc12d1768d37eec18d690d4b1e395e027993dfa4d2d1629e8f18", + "target_lvs.spice": "11ec947ec1bb4d9392005936227e7bcb0b7dc71bb1782b11610961ffb781e05a", + "testbench.spice": "7b109d9c67c1175854bee706f56d0d5306c04d356e2c3566fe614fb2b31e5616" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW2_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW2_sL2/qualification.json new file mode 100644 index 00000000..bee536ff --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW2_sL2/qualification.json @@ -0,0 +1,108 @@ +{ + "case_id": "C07_ihp130_sW2_sL2", + "circuit_id": "C07", + "pdk": "ihp130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "diff_cs", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "748fe8081e7c23b4", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 22.99 + }, + "f3db": { + "min": 13230000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 25.9892, + "f3db": 22044280.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.9, + "schematic_measures": { + "vo1": 0.6008455, + "vo2": 0.6008455, + "idd": 4.000001e-05, + "vos_in": -9.09495e-13, + "gain_lf": 25.9892, + "f3db": 22044280.0, + "ugf": 442230500.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW2_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW2_sL2/specs.json new file mode 100644 index 00000000..703ec788 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW2_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 22.99 + }, + "f3db": { + "min": 13230000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 25.9892, + "f3db": 22044280.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW2_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW2_sL2/target.spice new file mode 100644 index 00000000..f3bc25d4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW2_sL2/target.spice @@ -0,0 +1,6 @@ +.subckt C07_ihp130_sW2_sL2 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 +XM1 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=8u l=0.52u ng=16 m=1 +XM2 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=8u l=0.52u ng=16 m=1 +XM3 VOUT1 VB1 VDD VDD sg13_lv_pmos w=8u l=0.52u ng=16 m=1 +XM4 VOUT2 VB1 VDD VDD sg13_lv_pmos w=8u l=0.52u ng=16 m=1 +.ends C07_ihp130_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW2_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW2_sL2/target_lvs.spice new file mode 100644 index 00000000..bac5fe26 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW2_sL2/target_lvs.spice @@ -0,0 +1,66 @@ +.subckt C07_ihp130_sW2_sL2 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 +XM1_f0 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f1 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f2 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f3 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f4 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f5 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f6 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f7 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f8 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f9 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f10 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f11 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f12 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f13 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f14 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f15 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f0 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f1 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f2 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f3 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f4 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f5 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f6 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f7 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f8 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f9 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f10 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f11 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f12 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f13 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f14 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f15 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f0 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM3_f1 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM3_f2 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM3_f3 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM3_f4 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM3_f5 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM3_f6 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM3_f7 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM3_f8 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM3_f9 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM3_f10 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM3_f11 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM3_f12 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM3_f13 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM3_f14 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM3_f15 VOUT1 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f0 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f1 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f2 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f3 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f4 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f5 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f6 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f7 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f8 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f9 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f10 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f11 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f12 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f13 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f14 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f15 VOUT2 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +.ends C07_ihp130_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW2_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW2_sL2/testbench.spice new file mode 100644 index 00000000..4cdaecb0 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/ihp130/sW2_sL2/testbench.spice @@ -0,0 +1,43 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 C07_ihp130_sW2_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIB1 IB1 VSS 4e-05 +.nodeset v(IB1)=0.84 +XB_VB1n VB1n VB1n VDDB VDDB sg13_lv_pmos w=8u l=0.52u +IB_VB1n VB1n VSS 2e-05 +VCM VCM 0 0.6 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +* ideal CMFB (disclosed): PMOS load gate = replica bias + Gcm*(Vocm - Vocm,target) +BCMFB VB1 0 V = v(VB1n) + 20*((v(VOUT1)+v(VOUT2))/2 - 0.6) +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C07/sky130/sW0.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW0.5_sL1.5/case.json new file mode 100644 index 00000000..8dcbac6c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW0.5_sL1.5/case.json @@ -0,0 +1,156 @@ +{ + "case_id": "C07_sky130_sW0.5_sL1.5", + "circuit_id": "C07", + "pdk": "sky130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "dut_name": "C07_sky130_sW0.5_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1", + "IB1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.45, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 0.45, + "nf": 4 + }, + "M3": { + "w": 2.0, + "l": 0.45, + "nf": 4 + }, + "M4": { + "w": 2.0, + "l": 0.45, + "nf": 4 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 2e-05 + }, + "IB1": { + "i": 4e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 0.9, + "CL": 1e-13, + "vocm": 0.9 + }, + "category": "diff_cs", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "d45d402bf99a590d", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "ideal common-mode feedback on VB1" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/sky130/sW0.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW0.5_sL1.5/manifest.json new file mode 100644 index 00000000..09c450b7 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW0.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "1eea1b41e786ad5be1a74ce22d3889d7b6b03f3333dd5b3ea934116a48a9b710", + "qualification.json": "1b76cdbe5d7ec99684b3b9ff412eb413ff869c772fd22dd3f69417ba6dad1e37", + "specs.json": "5e2ed197c4757bd37a6880acb6fc5a9c97287f5fa03b2f8a22d5b1c1a6cf6978", + "target.spice": "e3b9b3aa478bda70a60bf2f36bb1354c8b791b578a271a6300fce5ac5e76289b", + "target_lvs.spice": "08fdadcbf053628fb8b9f0e2944d99aac45fca5a5064a06cab0b8b000839e052", + "testbench.spice": "02078362db13bfb8864969f8da659d682631d1cbd2b61e89350c954424581518" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/sky130/sW0.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW0.5_sL1.5/qualification.json new file mode 100644 index 00000000..aba47a96 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW0.5_sL1.5/qualification.json @@ -0,0 +1,108 @@ +{ + "case_id": "C07_sky130_sW0.5_sL1.5", + "circuit_id": "C07", + "pdk": "sky130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "diff_cs", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "d45d402bf99a590d", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 30.03 + }, + "f3db": { + "min": 3899000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 33.02688, + "f3db": 6497612.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 10.9, + "schematic_measures": { + "vo1": 0.9033138, + "vo2": 0.9033138, + "idd": 4.000001e-05, + "vos_in": 2.531669e-08, + "gain_lf": 33.02688, + "f3db": 6497612.0, + "ugf": 292225800.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/sky130/sW0.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW0.5_sL1.5/specs.json new file mode 100644 index 00000000..a63fe7cb --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW0.5_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 30.03 + }, + "f3db": { + "min": 3899000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 33.02688, + "f3db": 6497612.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/sky130/sW0.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW0.5_sL1.5/target.spice new file mode 100644 index 00000000..de582512 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW0.5_sL1.5/target.spice @@ -0,0 +1,6 @@ +.subckt C07_sky130_sW0.5_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 +XM1 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=2 l=0.45 nf=4 +XM2 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=2 l=0.45 nf=4 +XM3 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=2 l=0.45 nf=4 +XM4 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=2 l=0.45 nf=4 +.ends C07_sky130_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C07/sky130/sW0.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW0.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..3db7f0b8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW0.5_sL1.5/target_lvs.spice @@ -0,0 +1,18 @@ +.subckt C07_sky130_sW0.5_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 +XM1_f0 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f1 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f2 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f3 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f0 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f1 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f2 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f3 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f0 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM3_f1 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM3_f2 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM3_f3 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f0 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f1 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f2 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f3 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +.ends C07_sky130_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C07/sky130/sW0.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW0.5_sL1.5/testbench.spice new file mode 100644 index 00000000..6633acaa --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW0.5_sL1.5/testbench.spice @@ -0,0 +1,43 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 C07_sky130_sW0.5_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIB1 IB1 VSS 4e-05 +.nodeset v(IB1)=1.26 +XB_VB1n VB1n VB1n VDDB VDDB sky130_fd_pr__pfet_01v8 w=2 l=0.45 +IB_VB1n VB1n VSS 2e-05 +VCM VCM 0 0.9 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +* ideal CMFB (disclosed): PMOS load gate = replica bias + Gcm*(Vocm - Vocm,target) +BCMFB VB1 0 V = v(VB1n) + 20*((v(VOUT1)+v(VOUT2))/2 - 0.9) +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C07/sky130/sW0.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW0.5_sL1/case.json new file mode 100644 index 00000000..590150b7 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW0.5_sL1/case.json @@ -0,0 +1,156 @@ +{ + "case_id": "C07_sky130_sW0.5_sL1", + "circuit_id": "C07", + "pdk": "sky130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "dut_name": "C07_sky130_sW0.5_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1", + "IB1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.3, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 0.3, + "nf": 4 + }, + "M3": { + "w": 2.0, + "l": 0.3, + "nf": 4 + }, + "M4": { + "w": 2.0, + "l": 0.3, + "nf": 4 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 2e-05 + }, + "IB1": { + "i": 4e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 0.9, + "CL": 1e-13, + "vocm": 0.9 + }, + "category": "diff_cs", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "b61a93ffab3be575", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "ideal common-mode feedback on VB1" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/sky130/sW0.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW0.5_sL1/manifest.json new file mode 100644 index 00000000..35c32db1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW0.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "fea3ad75d7a5263d0f83b367f2d7b6a36ab758568502b7ea258f0a54190d00b5", + "qualification.json": "77ead2067cf95a5f8580f1f906155ec17798d83bf65770edc72e4b807106413b", + "specs.json": "81444fadd9daea916fc2999d72a9d8b71f7d4e9683c339b8c92a69e82f22f214", + "target.spice": "fb1c28571f34279dbf909c8d12ba73f8354a1849a8f30777ff3afb8f6b200721", + "target_lvs.spice": "fb6658e0caa11de25da8ac16eb8c7e27ccffe64f466ec673ba972e612fe097cb", + "testbench.spice": "0ab60f58602fe985ebe591bfb2136b66a230161c705ff13d83cb953758c169ab" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/sky130/sW0.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW0.5_sL1/qualification.json new file mode 100644 index 00000000..2fbaba66 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW0.5_sL1/qualification.json @@ -0,0 +1,108 @@ +{ + "case_id": "C07_sky130_sW0.5_sL1", + "circuit_id": "C07", + "pdk": "sky130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "diff_cs", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "b61a93ffab3be575", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 27.66 + }, + "f3db": { + "min": 6076000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 30.66212, + "f3db": 10127190.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 8.2, + "schematic_measures": { + "vo1": 0.9031917, + "vo2": 0.9031917, + "idd": 4.000001e-05, + "vos_in": -3.13685e-08, + "gain_lf": 30.66212, + "f3db": 10127190.0, + "ugf": 346694000.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/sky130/sW0.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW0.5_sL1/specs.json new file mode 100644 index 00000000..4054d512 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW0.5_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 27.66 + }, + "f3db": { + "min": 6076000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 30.66212, + "f3db": 10127190.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/sky130/sW0.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW0.5_sL1/target.spice new file mode 100644 index 00000000..398fca09 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW0.5_sL1/target.spice @@ -0,0 +1,6 @@ +.subckt C07_sky130_sW0.5_sL1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 +XM1 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=2 l=0.3 nf=4 +XM2 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=2 l=0.3 nf=4 +XM3 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=2 l=0.3 nf=4 +XM4 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=2 l=0.3 nf=4 +.ends C07_sky130_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C07/sky130/sW0.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW0.5_sL1/target_lvs.spice new file mode 100644 index 00000000..80d9372a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW0.5_sL1/target_lvs.spice @@ -0,0 +1,18 @@ +.subckt C07_sky130_sW0.5_sL1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 +XM1_f0 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f1 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f2 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f3 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f0 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f1 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f2 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f3 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f0 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM3_f1 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM3_f2 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM3_f3 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f0 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f1 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f2 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f3 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +.ends C07_sky130_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C07/sky130/sW0.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW0.5_sL1/testbench.spice new file mode 100644 index 00000000..65442d39 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW0.5_sL1/testbench.spice @@ -0,0 +1,43 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 C07_sky130_sW0.5_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIB1 IB1 VSS 4e-05 +.nodeset v(IB1)=1.26 +XB_VB1n VB1n VB1n VDDB VDDB sky130_fd_pr__pfet_01v8 w=2 l=0.3 +IB_VB1n VB1n VSS 2e-05 +VCM VCM 0 0.9 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +* ideal CMFB (disclosed): PMOS load gate = replica bias + Gcm*(Vocm - Vocm,target) +BCMFB VB1 0 V = v(VB1n) + 20*((v(VOUT1)+v(VOUT2))/2 - 0.9) +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C07/sky130/sW0.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW0.5_sL2/case.json new file mode 100644 index 00000000..8f469a0c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW0.5_sL2/case.json @@ -0,0 +1,156 @@ +{ + "case_id": "C07_sky130_sW0.5_sL2", + "circuit_id": "C07", + "pdk": "sky130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "dut_name": "C07_sky130_sW0.5_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1", + "IB1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.6, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 0.6, + "nf": 4 + }, + "M3": { + "w": 2.0, + "l": 0.6, + "nf": 4 + }, + "M4": { + "w": 2.0, + "l": 0.6, + "nf": 4 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 2e-05 + }, + "IB1": { + "i": 4e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 0.9, + "CL": 1e-13, + "vocm": 0.9 + }, + "category": "diff_cs", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "6ab9021f36419794", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "ideal common-mode feedback on VB1" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/sky130/sW0.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW0.5_sL2/manifest.json new file mode 100644 index 00000000..e6fd7655 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW0.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "1c2ee15248b486fcf231396986211ee735166cea79dbc020122d28d8fbb1b1bf", + "qualification.json": "5658e523664430e62b9d4915e734141c6b9bf2bb24b672301b5d4bf36b203798", + "specs.json": "50540d88be1fa2e54e073fca47543cdf3d82ae268dddc7ebc5aaa7430d8c3c10", + "target.spice": "41864d6bf3e17ab7ade495af6a972c0de2e6f911c7d25e839f52ec7041b57365", + "target_lvs.spice": "7db9acc467c4dac6bdd47700156f4e567b706ebb9ce5422aa949847ec94cdead", + "testbench.spice": "2025f25ef43b2987945d9fad496a41005e3f83c5ee75342b97df3fc349ca2c90" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/sky130/sW0.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW0.5_sL2/qualification.json new file mode 100644 index 00000000..857bd2bb --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW0.5_sL2/qualification.json @@ -0,0 +1,108 @@ +{ + "case_id": "C07_sky130_sW0.5_sL2", + "circuit_id": "C07", + "pdk": "sky130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "diff_cs", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "6ab9021f36419794", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 31.45 + }, + "f3db": { + "min": 2884000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 34.44544, + "f3db": 4806507.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 6.6, + "schematic_measures": { + "vo1": 0.903684, + "vo2": 0.903684, + "idd": 4.000001e-05, + "vos_in": -4.63842e-10, + "gain_lf": 34.44544, + "f3db": 4806507.0, + "ugf": 254384800.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/sky130/sW0.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW0.5_sL2/specs.json new file mode 100644 index 00000000..05f3a325 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW0.5_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 31.45 + }, + "f3db": { + "min": 2884000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 34.44544, + "f3db": 4806507.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/sky130/sW0.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW0.5_sL2/target.spice new file mode 100644 index 00000000..c6cde148 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW0.5_sL2/target.spice @@ -0,0 +1,6 @@ +.subckt C07_sky130_sW0.5_sL2 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 +XM1 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=2 l=0.6 nf=4 +XM2 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=2 l=0.6 nf=4 +XM3 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=2 l=0.6 nf=4 +XM4 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=2 l=0.6 nf=4 +.ends C07_sky130_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C07/sky130/sW0.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW0.5_sL2/target_lvs.spice new file mode 100644 index 00000000..8a8d98c9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW0.5_sL2/target_lvs.spice @@ -0,0 +1,18 @@ +.subckt C07_sky130_sW0.5_sL2 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 +XM1_f0 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f1 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f2 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f3 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f0 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f1 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f2 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f3 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f0 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM3_f1 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM3_f2 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM3_f3 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f0 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f1 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f2 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f3 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +.ends C07_sky130_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C07/sky130/sW0.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW0.5_sL2/testbench.spice new file mode 100644 index 00000000..26ba3778 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW0.5_sL2/testbench.spice @@ -0,0 +1,43 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 C07_sky130_sW0.5_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIB1 IB1 VSS 4e-05 +.nodeset v(IB1)=1.26 +XB_VB1n VB1n VB1n VDDB VDDB sky130_fd_pr__pfet_01v8 w=2 l=0.6 +IB_VB1n VB1n VSS 2e-05 +VCM VCM 0 0.9 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +* ideal CMFB (disclosed): PMOS load gate = replica bias + Gcm*(Vocm - Vocm,target) +BCMFB VB1 0 V = v(VB1n) + 20*((v(VOUT1)+v(VOUT2))/2 - 0.9) +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1.5_sL1.5/case.json new file mode 100644 index 00000000..27b40f83 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1.5_sL1.5/case.json @@ -0,0 +1,156 @@ +{ + "case_id": "C07_sky130_sW1.5_sL1.5", + "circuit_id": "C07", + "pdk": "sky130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "dut_name": "C07_sky130_sW1.5_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1", + "IB1" + ], + "sizing": { + "M1": { + "w": 6.0, + "l": 0.45, + "nf": 12 + }, + "M2": { + "w": 6.0, + "l": 0.45, + "nf": 12 + }, + "M3": { + "w": 6.0, + "l": 0.45, + "nf": 12 + }, + "M4": { + "w": 6.0, + "l": 0.45, + "nf": 12 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 2e-05 + }, + "IB1": { + "i": 4e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 0.9, + "CL": 1e-13, + "vocm": 0.9 + }, + "category": "diff_cs", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.45, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.45, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.45, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.45, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "7e0eff77b0230ae8", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "ideal common-mode feedback on VB1" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1.5_sL1.5/manifest.json new file mode 100644 index 00000000..3e138461 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "465d14c92748163a9e45f44eae8bbd389328b8cd789125d58d3d535a83fa0ba1", + "qualification.json": "e8cdfb2a8969eacc2efb4eb1c6d566deb975ab945687dda1a6811a00885a84de", + "specs.json": "cdddfb04e16b4ace6bf1efe7d10ebedb6d56be90369f5ad06237b7af416e32ed", + "target.spice": "f152f8243df98809622aa23264a9eda2b809c2f5ea2eb4e9b8858ef2af2f2ab2", + "target_lvs.spice": "0183a44a6c4ae547c843d570698dc72c0343c765b93b2218be387e88a37935c7", + "testbench.spice": "0a85831e560775644f1b5db9d7f2c0e85168c43d589dcf383a7c7534c32c26a1" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1.5_sL1.5/qualification.json new file mode 100644 index 00000000..b08d77e9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1.5_sL1.5/qualification.json @@ -0,0 +1,108 @@ +{ + "case_id": "C07_sky130_sW1.5_sL1.5", + "circuit_id": "C07", + "pdk": "sky130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "diff_cs", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.45, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.45, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.45, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.45, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "7e0eff77b0230ae8", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 32.2 + }, + "f3db": { + "min": 4552000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 35.19793, + "f3db": 7587366.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 10.8, + "schematic_measures": { + "vo1": 0.904562, + "vo2": 0.904562, + "idd": 4.000003e-05, + "vos_in": 0.0, + "gain_lf": 35.19793, + "f3db": 7587366.0, + "ugf": 438580500.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1.5_sL1.5/specs.json new file mode 100644 index 00000000..43328477 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1.5_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 32.2 + }, + "f3db": { + "min": 4552000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 35.19793, + "f3db": 7587366.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1.5_sL1.5/target.spice new file mode 100644 index 00000000..3ebe7b2f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1.5_sL1.5/target.spice @@ -0,0 +1,6 @@ +.subckt C07_sky130_sW1.5_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 +XM1 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=6 l=0.45 nf=12 +XM2 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=6 l=0.45 nf=12 +XM3 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=6 l=0.45 nf=12 +XM4 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=6 l=0.45 nf=12 +.ends C07_sky130_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..82835264 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1.5_sL1.5/target_lvs.spice @@ -0,0 +1,50 @@ +.subckt C07_sky130_sW1.5_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 +XM1_f0 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f1 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f2 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f3 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f4 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f5 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f6 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f7 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f8 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f9 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f10 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f11 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f0 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f1 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f2 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f3 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f4 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f5 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f6 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f7 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f8 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f9 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f10 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f11 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f0 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM3_f1 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM3_f2 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM3_f3 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM3_f4 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM3_f5 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM3_f6 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM3_f7 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM3_f8 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM3_f9 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM3_f10 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM3_f11 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f0 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f1 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f2 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f3 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f4 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f5 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f6 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f7 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f8 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f9 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f10 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f11 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +.ends C07_sky130_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1.5_sL1.5/testbench.spice new file mode 100644 index 00000000..fd75cb80 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1.5_sL1.5/testbench.spice @@ -0,0 +1,43 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 C07_sky130_sW1.5_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIB1 IB1 VSS 4e-05 +.nodeset v(IB1)=1.26 +XB_VB1n VB1n VB1n VDDB VDDB sky130_fd_pr__pfet_01v8 w=6 l=0.45 +IB_VB1n VB1n VSS 2e-05 +VCM VCM 0 0.9 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +* ideal CMFB (disclosed): PMOS load gate = replica bias + Gcm*(Vocm - Vocm,target) +BCMFB VB1 0 V = v(VB1n) + 20*((v(VOUT1)+v(VOUT2))/2 - 0.9) +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1.5_sL1/case.json new file mode 100644 index 00000000..c42dcfd4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1.5_sL1/case.json @@ -0,0 +1,156 @@ +{ + "case_id": "C07_sky130_sW1.5_sL1", + "circuit_id": "C07", + "pdk": "sky130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "dut_name": "C07_sky130_sW1.5_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1", + "IB1" + ], + "sizing": { + "M1": { + "w": 6.0, + "l": 0.3, + "nf": 12 + }, + "M2": { + "w": 6.0, + "l": 0.3, + "nf": 12 + }, + "M3": { + "w": 6.0, + "l": 0.3, + "nf": 12 + }, + "M4": { + "w": 6.0, + "l": 0.3, + "nf": 12 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 2e-05 + }, + "IB1": { + "i": 4e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 0.9, + "CL": 1e-13, + "vocm": 0.9 + }, + "category": "diff_cs", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.3, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.3, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.3, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.3, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "d4c987653d38d923", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "ideal common-mode feedback on VB1" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1.5_sL1/manifest.json new file mode 100644 index 00000000..1bbf9128 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "f54f6bdf8d9ef10b8a643f40d3b6431f70981abf7809823b2f6345627ee21e2c", + "qualification.json": "8828b53cb017ff11a7b2ef99283bb20bc09d75ea1869e37b7b9f44097c38116c", + "specs.json": "a35a0c6f59f9e8af2d4955813378aebdf9d2feba185df1048d31bece82620f64", + "target.spice": "24d4259ff13fe58ee0b729caf8c1580e3e230cbed5894340693332a25203f430", + "target_lvs.spice": "8f6440611cd167818a9b259ef4cd29e34527d140ebd4f9c5688344b36e6083f2", + "testbench.spice": "9d30cbc7d4cfb0341e79d7e7518d70478ceb14d9f7db3a04800cb31549ed45e2" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1.5_sL1/qualification.json new file mode 100644 index 00000000..d6d3ec8f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1.5_sL1/qualification.json @@ -0,0 +1,108 @@ +{ + "case_id": "C07_sky130_sW1.5_sL1", + "circuit_id": "C07", + "pdk": "sky130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "diff_cs", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.3, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.3, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.3, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.3, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "d4c987653d38d923", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 28.56 + }, + "f3db": { + "min": 7604000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 31.55705, + "f3db": 12673820.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 6.3, + "schematic_measures": { + "vo1": 0.9047534, + "vo2": 0.9047534, + "idd": 4.000003e-05, + "vos_in": 0.0, + "gain_lf": 31.55705, + "f3db": 12673820.0, + "ugf": 481568000.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1.5_sL1/specs.json new file mode 100644 index 00000000..9226ddbb --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1.5_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 28.56 + }, + "f3db": { + "min": 7604000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 31.55705, + "f3db": 12673820.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1.5_sL1/target.spice new file mode 100644 index 00000000..5ce47549 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1.5_sL1/target.spice @@ -0,0 +1,6 @@ +.subckt C07_sky130_sW1.5_sL1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 +XM1 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=6 l=0.3 nf=12 +XM2 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=6 l=0.3 nf=12 +XM3 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=6 l=0.3 nf=12 +XM4 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=6 l=0.3 nf=12 +.ends C07_sky130_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1.5_sL1/target_lvs.spice new file mode 100644 index 00000000..99a1a491 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1.5_sL1/target_lvs.spice @@ -0,0 +1,50 @@ +.subckt C07_sky130_sW1.5_sL1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 +XM1_f0 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f1 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f2 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f3 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f4 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f5 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f6 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f7 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f8 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f9 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f10 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f11 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f0 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f1 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f2 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f3 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f4 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f5 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f6 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f7 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f8 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f9 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f10 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f11 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f0 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM3_f1 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM3_f2 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM3_f3 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM3_f4 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM3_f5 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM3_f6 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM3_f7 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM3_f8 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM3_f9 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM3_f10 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM3_f11 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f0 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f1 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f2 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f3 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f4 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f5 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f6 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f7 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f8 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f9 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f10 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f11 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +.ends C07_sky130_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1.5_sL1/testbench.spice new file mode 100644 index 00000000..4df470a3 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1.5_sL1/testbench.spice @@ -0,0 +1,43 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 C07_sky130_sW1.5_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIB1 IB1 VSS 4e-05 +.nodeset v(IB1)=1.26 +XB_VB1n VB1n VB1n VDDB VDDB sky130_fd_pr__pfet_01v8 w=6 l=0.3 +IB_VB1n VB1n VSS 2e-05 +VCM VCM 0 0.9 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +* ideal CMFB (disclosed): PMOS load gate = replica bias + Gcm*(Vocm - Vocm,target) +BCMFB VB1 0 V = v(VB1n) + 20*((v(VOUT1)+v(VOUT2))/2 - 0.9) +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1.5_sL2/case.json new file mode 100644 index 00000000..3c15584b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1.5_sL2/case.json @@ -0,0 +1,156 @@ +{ + "case_id": "C07_sky130_sW1.5_sL2", + "circuit_id": "C07", + "pdk": "sky130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "dut_name": "C07_sky130_sW1.5_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1", + "IB1" + ], + "sizing": { + "M1": { + "w": 6.0, + "l": 0.6, + "nf": 12 + }, + "M2": { + "w": 6.0, + "l": 0.6, + "nf": 12 + }, + "M3": { + "w": 6.0, + "l": 0.6, + "nf": 12 + }, + "M4": { + "w": 6.0, + "l": 0.6, + "nf": 12 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 2e-05 + }, + "IB1": { + "i": 4e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 0.9, + "CL": 1e-13, + "vocm": 0.9 + }, + "category": "diff_cs", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.6, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.6, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.6, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.6, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "db5adcd296ee3c65", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "ideal common-mode feedback on VB1" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1.5_sL2/manifest.json new file mode 100644 index 00000000..f8e5f327 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "ce3203743758a88661052b72e23c8a99ebaf7d8e7e53093726decefd56758000", + "qualification.json": "f88cf1056b08668a1c4a908cb230eb17ac6b3414483fee5a9c3fc741d45ef569", + "specs.json": "1a2311d9baf9571c3dfab8b1384495f224fa743570fc27b9f47805f58d27b1b1", + "target.spice": "728db9fd4337ad09a9bd7cb37cd50f251bf97bc0da1e59e64a39eeb3a7f12d71", + "target_lvs.spice": "ed1779a77893a0afbe269e6839c1d9cfa94699bcf5a7ce97ebe4b6c086e9ac88", + "testbench.spice": "2a70196c8c6a13a426fc3aa9d0fa413db9ea9e58b066c054cc530e0d5029c214" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1.5_sL2/qualification.json new file mode 100644 index 00000000..ed79bcb5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1.5_sL2/qualification.json @@ -0,0 +1,108 @@ +{ + "case_id": "C07_sky130_sW1.5_sL2", + "circuit_id": "C07", + "pdk": "sky130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "diff_cs", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.6, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.6, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.6, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.6, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "db5adcd296ee3c65", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 34.81 + }, + "f3db": { + "min": 3075000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 37.80515, + "f3db": 5124564.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 9.8, + "schematic_measures": { + "vo1": 0.9047223, + "vo2": 0.9047223, + "idd": 4.000003e-05, + "vos_in": 0.0, + "gain_lf": 37.80515, + "f3db": 5124564.0, + "ugf": 400100200.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1.5_sL2/specs.json new file mode 100644 index 00000000..6f98b2cb --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1.5_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 34.81 + }, + "f3db": { + "min": 3075000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 37.80515, + "f3db": 5124564.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1.5_sL2/target.spice new file mode 100644 index 00000000..f3aeb6ad --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1.5_sL2/target.spice @@ -0,0 +1,6 @@ +.subckt C07_sky130_sW1.5_sL2 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 +XM1 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=6 l=0.6 nf=12 +XM2 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=6 l=0.6 nf=12 +XM3 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=6 l=0.6 nf=12 +XM4 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=6 l=0.6 nf=12 +.ends C07_sky130_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1.5_sL2/target_lvs.spice new file mode 100644 index 00000000..299db07e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1.5_sL2/target_lvs.spice @@ -0,0 +1,50 @@ +.subckt C07_sky130_sW1.5_sL2 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 +XM1_f0 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f1 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f2 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f3 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f4 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f5 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f6 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f7 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f8 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f9 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f10 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f11 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f0 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f1 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f2 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f3 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f4 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f5 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f6 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f7 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f8 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f9 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f10 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f11 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f0 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM3_f1 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM3_f2 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM3_f3 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM3_f4 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM3_f5 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM3_f6 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM3_f7 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM3_f8 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM3_f9 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM3_f10 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM3_f11 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f0 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f1 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f2 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f3 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f4 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f5 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f6 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f7 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f8 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f9 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f10 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f11 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +.ends C07_sky130_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1.5_sL2/testbench.spice new file mode 100644 index 00000000..f5eccc68 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1.5_sL2/testbench.spice @@ -0,0 +1,43 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 C07_sky130_sW1.5_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIB1 IB1 VSS 4e-05 +.nodeset v(IB1)=1.26 +XB_VB1n VB1n VB1n VDDB VDDB sky130_fd_pr__pfet_01v8 w=6 l=0.6 +IB_VB1n VB1n VSS 2e-05 +VCM VCM 0 0.9 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +* ideal CMFB (disclosed): PMOS load gate = replica bias + Gcm*(Vocm - Vocm,target) +BCMFB VB1 0 V = v(VB1n) + 20*((v(VOUT1)+v(VOUT2))/2 - 0.9) +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1_sL1.5/case.json new file mode 100644 index 00000000..fa4fd4e2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1_sL1.5/case.json @@ -0,0 +1,156 @@ +{ + "case_id": "C07_sky130_sW1_sL1.5", + "circuit_id": "C07", + "pdk": "sky130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "dut_name": "C07_sky130_sW1_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1", + "IB1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.45, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 0.45, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 0.45, + "nf": 8 + }, + "M4": { + "w": 4.0, + "l": 0.45, + "nf": 8 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 2e-05 + }, + "IB1": { + "i": 4e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 0.9, + "CL": 1e-13, + "vocm": 0.9 + }, + "category": "diff_cs", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "8a692dea32a17987", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "ideal common-mode feedback on VB1" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1_sL1.5/manifest.json new file mode 100644 index 00000000..c97a46e8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "aa550cd27b4dd0e787f29195b3f563b8cf98052d449bc229b06ca5eef82c5281", + "qualification.json": "9b863adc3efb3605753674d76a0026eafc326fa5ee48bc992bdb58ec0498a9d2", + "specs.json": "396a797f186bc8729db65e95177a95587d0df11c603b8cfa5c323fceeef40005", + "target.spice": "0345bebac9818da99e9a0d4d02e858a829400525b464d1d89c3d4a92da3ac3c6", + "target_lvs.spice": "6fd769b9a784371c2d5c727be9cc94cb2e9249e2d14099ad5056088f29736089", + "testbench.spice": "0fc11889c1c6b95b9e89c5ae5f90517e0dcc02e08e1d7739d1f342c3b2219d93" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1_sL1.5/qualification.json new file mode 100644 index 00000000..5edc5ff3 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1_sL1.5/qualification.json @@ -0,0 +1,108 @@ +{ + "case_id": "C07_sky130_sW1_sL1.5", + "circuit_id": "C07", + "pdk": "sky130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "diff_cs", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "8a692dea32a17987", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 31.61 + }, + "f3db": { + "min": 4294000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 34.61195, + "f3db": 7157315.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 6.2, + "schematic_measures": { + "vo1": 0.9041513, + "vo2": 0.9041513, + "idd": 4.000002e-05, + "vos_in": -1.65528e-10, + "gain_lf": 34.61195, + "f3db": 7157315.0, + "ugf": 386530100.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1_sL1.5/specs.json new file mode 100644 index 00000000..6890cd92 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 31.61 + }, + "f3db": { + "min": 4294000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 34.61195, + "f3db": 7157315.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1_sL1.5/target.spice new file mode 100644 index 00000000..a5b6ca22 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1_sL1.5/target.spice @@ -0,0 +1,6 @@ +.subckt C07_sky130_sW1_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 +XM1 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=4 l=0.45 nf=8 +XM2 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=4 l=0.45 nf=8 +XM3 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=4 l=0.45 nf=8 +XM4 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=4 l=0.45 nf=8 +.ends C07_sky130_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1_sL1.5/target_lvs.spice new file mode 100644 index 00000000..b3661606 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1_sL1.5/target_lvs.spice @@ -0,0 +1,34 @@ +.subckt C07_sky130_sW1_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 +XM1_f0 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f1 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f2 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f3 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f4 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f5 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f6 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f7 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f0 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f1 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f2 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f3 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f4 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f5 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f6 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f7 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f0 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM3_f1 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM3_f2 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM3_f3 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM3_f4 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM3_f5 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM3_f6 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM3_f7 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f0 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f1 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f2 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f3 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f4 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f5 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f6 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f7 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +.ends C07_sky130_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1_sL1.5/testbench.spice new file mode 100644 index 00000000..748e7cfb --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1_sL1.5/testbench.spice @@ -0,0 +1,43 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 C07_sky130_sW1_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIB1 IB1 VSS 4e-05 +.nodeset v(IB1)=1.26 +XB_VB1n VB1n VB1n VDDB VDDB sky130_fd_pr__pfet_01v8 w=4 l=0.45 +IB_VB1n VB1n VSS 2e-05 +VCM VCM 0 0.9 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +* ideal CMFB (disclosed): PMOS load gate = replica bias + Gcm*(Vocm - Vocm,target) +BCMFB VB1 0 V = v(VB1n) + 20*((v(VOUT1)+v(VOUT2))/2 - 0.9) +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1_sL1/case.json new file mode 100644 index 00000000..3b4ba052 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1_sL1/case.json @@ -0,0 +1,156 @@ +{ + "case_id": "C07_sky130_sW1_sL1", + "circuit_id": "C07", + "pdk": "sky130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "dut_name": "C07_sky130_sW1_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1", + "IB1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.3, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 0.3, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 0.3, + "nf": 8 + }, + "M4": { + "w": 4.0, + "l": 0.3, + "nf": 8 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 2e-05 + }, + "IB1": { + "i": 4e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 0.9, + "CL": 1e-13, + "vocm": 0.9 + }, + "category": "diff_cs", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "987ca528fb04696e", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "ideal common-mode feedback on VB1" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1_sL1/manifest.json new file mode 100644 index 00000000..813ea318 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "743f306d273dd59c1563dc03a3f5509f648ea5ac53a5233f01aa5529270dccc4", + "qualification.json": "4e6c4eda34bf86b52bf3e3629f90ca9743e355c38ae4ce6b2046c8fe15ab6578", + "specs.json": "d73f3205fde89b4e604ed60b40ba0eac7272c2484eac591370ae7ea9a27656ee", + "target.spice": "93effc14bd49f5f31b24d34544ff10b3e65cbe0fa78e2174b80d015c057a1278", + "target_lvs.spice": "838cd7715f81cfd526916902e89e2218001e531bd62cb4fec1e6506b8fe6dbb4", + "testbench.spice": "510e34e1678d8c0639e21350cbffe27b82c6b4943b6401ba0801cac43fd05a21" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1_sL1/qualification.json new file mode 100644 index 00000000..bfb9a034 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1_sL1/qualification.json @@ -0,0 +1,108 @@ +{ + "case_id": "C07_sky130_sW1_sL1", + "circuit_id": "C07", + "pdk": "sky130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "diff_cs", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "987ca528fb04696e", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 28.41 + }, + "f3db": { + "min": 7014000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 31.41335, + "f3db": 11690480.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 6.4, + "schematic_measures": { + "vo1": 0.9042868, + "vo2": 0.9042868, + "idd": 4.000002e-05, + "vos_in": -1.81899e-12, + "gain_lf": 31.41335, + "f3db": 11690480.0, + "ugf": 436524100.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1_sL1/specs.json new file mode 100644 index 00000000..e4476978 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 28.41 + }, + "f3db": { + "min": 7014000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 31.41335, + "f3db": 11690480.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1_sL1/target.spice new file mode 100644 index 00000000..70586401 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1_sL1/target.spice @@ -0,0 +1,6 @@ +.subckt C07_sky130_sW1_sL1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 +XM1 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=4 l=0.3 nf=8 +XM2 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=4 l=0.3 nf=8 +XM3 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=4 l=0.3 nf=8 +XM4 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=4 l=0.3 nf=8 +.ends C07_sky130_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1_sL1/target_lvs.spice new file mode 100644 index 00000000..65fe4ee1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1_sL1/target_lvs.spice @@ -0,0 +1,34 @@ +.subckt C07_sky130_sW1_sL1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 +XM1_f0 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f1 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f2 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f3 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f4 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f5 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f6 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f7 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f0 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f1 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f2 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f3 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f4 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f5 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f6 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f7 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f0 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM3_f1 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM3_f2 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM3_f3 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM3_f4 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM3_f5 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM3_f6 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM3_f7 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f0 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f1 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f2 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f3 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f4 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f5 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f6 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f7 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +.ends C07_sky130_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1_sL1/testbench.spice new file mode 100644 index 00000000..b31c8ed9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1_sL1/testbench.spice @@ -0,0 +1,43 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 C07_sky130_sW1_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIB1 IB1 VSS 4e-05 +.nodeset v(IB1)=1.26 +XB_VB1n VB1n VB1n VDDB VDDB sky130_fd_pr__pfet_01v8 w=4 l=0.3 +IB_VB1n VB1n VSS 2e-05 +VCM VCM 0 0.9 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +* ideal CMFB (disclosed): PMOS load gate = replica bias + Gcm*(Vocm - Vocm,target) +BCMFB VB1 0 V = v(VB1n) + 20*((v(VOUT1)+v(VOUT2))/2 - 0.9) +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1_sL2/case.json new file mode 100644 index 00000000..2b426d61 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1_sL2/case.json @@ -0,0 +1,156 @@ +{ + "case_id": "C07_sky130_sW1_sL2", + "circuit_id": "C07", + "pdk": "sky130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "dut_name": "C07_sky130_sW1_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1", + "IB1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.6, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 0.6, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 0.6, + "nf": 8 + }, + "M4": { + "w": 4.0, + "l": 0.6, + "nf": 8 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 2e-05 + }, + "IB1": { + "i": 4e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 0.9, + "CL": 1e-13, + "vocm": 0.9 + }, + "category": "diff_cs", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "fda265233217f677", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "ideal common-mode feedback on VB1" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1_sL2/manifest.json new file mode 100644 index 00000000..80524b8c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "26c24ac098ec5bd213f5aa203415f4a852822bd88539937bbac39b5b2e1077dc", + "qualification.json": "08f9e3cb76edbbb825e18c8c66c3bf9d83720605c8b1edc189ed04f432add452", + "specs.json": "cd966e7bf65722ba0e19cc2adc131c0631cca4675dc19460d1d06f649ddc1880", + "target.spice": "f313cefdc4ffd32ec816acff8fe18144aac767d5406af1bc9f76f37f832cb496", + "target_lvs.spice": "931ab481d26d18989ac19fcc9dc290a7b0026325a0a557d8c1b55bd970a94ff2", + "testbench.spice": "e092f53ae5c66972f6397b63010669c1a298dc9a85ca7031bd17cecb7860c14d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1_sL2/qualification.json new file mode 100644 index 00000000..f3b20b89 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1_sL2/qualification.json @@ -0,0 +1,108 @@ +{ + "case_id": "C07_sky130_sW1_sL2", + "circuit_id": "C07", + "pdk": "sky130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "diff_cs", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "fda265233217f677", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 33.83 + }, + "f3db": { + "min": 2981000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 36.82993, + "f3db": 4968312.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 6.2, + "schematic_measures": { + "vo1": 0.9043304, + "vo2": 0.9043304, + "idd": 4.000002e-05, + "vos_in": 4.388494e-08, + "gain_lf": 36.82993, + "f3db": 4968312.0, + "ugf": 346516500.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1_sL2/specs.json new file mode 100644 index 00000000..1b12e896 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 33.83 + }, + "f3db": { + "min": 2981000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 36.82993, + "f3db": 4968312.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1_sL2/target.spice new file mode 100644 index 00000000..8032e7b4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1_sL2/target.spice @@ -0,0 +1,6 @@ +.subckt C07_sky130_sW1_sL2 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 +XM1 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=4 l=0.6 nf=8 +XM2 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=4 l=0.6 nf=8 +XM3 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=4 l=0.6 nf=8 +XM4 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=4 l=0.6 nf=8 +.ends C07_sky130_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1_sL2/target_lvs.spice new file mode 100644 index 00000000..1d43f4dc --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1_sL2/target_lvs.spice @@ -0,0 +1,34 @@ +.subckt C07_sky130_sW1_sL2 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 +XM1_f0 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f1 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f2 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f3 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f4 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f5 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f6 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f7 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f0 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f1 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f2 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f3 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f4 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f5 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f6 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f7 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f0 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM3_f1 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM3_f2 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM3_f3 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM3_f4 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM3_f5 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM3_f6 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM3_f7 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f0 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f1 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f2 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f3 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f4 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f5 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f6 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f7 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +.ends C07_sky130_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1_sL2/testbench.spice new file mode 100644 index 00000000..50fa4ed6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW1_sL2/testbench.spice @@ -0,0 +1,43 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 C07_sky130_sW1_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIB1 IB1 VSS 4e-05 +.nodeset v(IB1)=1.26 +XB_VB1n VB1n VB1n VDDB VDDB sky130_fd_pr__pfet_01v8 w=4 l=0.6 +IB_VB1n VB1n VSS 2e-05 +VCM VCM 0 0.9 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +* ideal CMFB (disclosed): PMOS load gate = replica bias + Gcm*(Vocm - Vocm,target) +BCMFB VB1 0 V = v(VB1n) + 20*((v(VOUT1)+v(VOUT2))/2 - 0.9) +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C07/sky130/sW2_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW2_sL1.5/case.json new file mode 100644 index 00000000..4f59584a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW2_sL1.5/case.json @@ -0,0 +1,156 @@ +{ + "case_id": "C07_sky130_sW2_sL1.5", + "circuit_id": "C07", + "pdk": "sky130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "dut_name": "C07_sky130_sW2_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1", + "IB1" + ], + "sizing": { + "M1": { + "w": 8.0, + "l": 0.45, + "nf": 16 + }, + "M2": { + "w": 8.0, + "l": 0.45, + "nf": 16 + }, + "M3": { + "w": 8.0, + "l": 0.45, + "nf": 16 + }, + "M4": { + "w": 8.0, + "l": 0.45, + "nf": 16 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 2e-05 + }, + "IB1": { + "i": 4e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 0.9, + "CL": 1e-13, + "vocm": 0.9 + }, + "category": "diff_cs", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "c9a6d7f9b58b9a1d", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "ideal common-mode feedback on VB1" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/sky130/sW2_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW2_sL1.5/manifest.json new file mode 100644 index 00000000..61754abc --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW2_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "35ac9fbeedad74cfe5732f2765589180b8c742ae25e3e705289143b192c8b2f5", + "qualification.json": "dc5924183c6274f9c52477c51aa43859e0524610df937f939d98cb71b8c20cd1", + "specs.json": "b81027732cfe8afb2d4f3e82b1a840cbda5fdd5a5d0f64d5c51967d7d8c38511", + "target.spice": "ea23f4948b053d0d7fd79cbf0fd5d9ec6e5e467a630271b91a9db873d39412ee", + "target_lvs.spice": "04cc63431ca6616bedb4811280ee464881e0e14bfc5349592eb4254b2cc969b0", + "testbench.spice": "2d20b7fcae685a364175fdac4e4f0e9138c28f00fde4fdcec7e69c061767310c" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/sky130/sW2_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW2_sL1.5/qualification.json new file mode 100644 index 00000000..a74362cd --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW2_sL1.5/qualification.json @@ -0,0 +1,108 @@ +{ + "case_id": "C07_sky130_sW2_sL1.5", + "circuit_id": "C07", + "pdk": "sky130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "diff_cs", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "c9a6d7f9b58b9a1d", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 32.49 + }, + "f3db": { + "min": 4729000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 35.49124, + "f3db": 7881932.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 10.8, + "schematic_measures": { + "vo1": 0.9047924, + "vo2": 0.9047924, + "idd": 4.000003e-05, + "vos_in": -1.81899e-12, + "gain_lf": 35.49124, + "f3db": 7881932.0, + "ugf": 472136200.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/sky130/sW2_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW2_sL1.5/specs.json new file mode 100644 index 00000000..1b7b051d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW2_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 32.49 + }, + "f3db": { + "min": 4729000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 35.49124, + "f3db": 7881932.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/sky130/sW2_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW2_sL1.5/target.spice new file mode 100644 index 00000000..f5772d67 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW2_sL1.5/target.spice @@ -0,0 +1,6 @@ +.subckt C07_sky130_sW2_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 +XM1 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=8 l=0.45 nf=16 +XM2 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=8 l=0.45 nf=16 +XM3 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=8 l=0.45 nf=16 +XM4 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=8 l=0.45 nf=16 +.ends C07_sky130_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C07/sky130/sW2_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW2_sL1.5/target_lvs.spice new file mode 100644 index 00000000..1aec7bc2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW2_sL1.5/target_lvs.spice @@ -0,0 +1,66 @@ +.subckt C07_sky130_sW2_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 +XM1_f0 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f1 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f2 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f3 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f4 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f5 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f6 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f7 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f8 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f9 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f10 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f11 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f12 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f13 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f14 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f15 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f0 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f1 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f2 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f3 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f4 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f5 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f6 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f7 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f8 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f9 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f10 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f11 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f12 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f13 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f14 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f15 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f0 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM3_f1 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM3_f2 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM3_f3 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM3_f4 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM3_f5 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM3_f6 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM3_f7 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM3_f8 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM3_f9 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM3_f10 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM3_f11 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM3_f12 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM3_f13 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM3_f14 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM3_f15 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f0 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f1 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f2 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f3 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f4 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f5 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f6 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f7 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f8 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f9 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f10 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f11 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f12 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f13 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f14 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f15 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +.ends C07_sky130_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C07/sky130/sW2_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW2_sL1.5/testbench.spice new file mode 100644 index 00000000..808b9bbe --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW2_sL1.5/testbench.spice @@ -0,0 +1,43 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 C07_sky130_sW2_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIB1 IB1 VSS 4e-05 +.nodeset v(IB1)=1.26 +XB_VB1n VB1n VB1n VDDB VDDB sky130_fd_pr__pfet_01v8 w=8 l=0.45 +IB_VB1n VB1n VSS 2e-05 +VCM VCM 0 0.9 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +* ideal CMFB (disclosed): PMOS load gate = replica bias + Gcm*(Vocm - Vocm,target) +BCMFB VB1 0 V = v(VB1n) + 20*((v(VOUT1)+v(VOUT2))/2 - 0.9) +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C07/sky130/sW2_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW2_sL1/case.json new file mode 100644 index 00000000..d91a7adb --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW2_sL1/case.json @@ -0,0 +1,156 @@ +{ + "case_id": "C07_sky130_sW2_sL1", + "circuit_id": "C07", + "pdk": "sky130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "dut_name": "C07_sky130_sW2_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1", + "IB1" + ], + "sizing": { + "M1": { + "w": 8.0, + "l": 0.3, + "nf": 16 + }, + "M2": { + "w": 8.0, + "l": 0.3, + "nf": 16 + }, + "M3": { + "w": 8.0, + "l": 0.3, + "nf": 16 + }, + "M4": { + "w": 8.0, + "l": 0.3, + "nf": 16 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 2e-05 + }, + "IB1": { + "i": 4e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 0.9, + "CL": 1e-13, + "vocm": 0.9 + }, + "category": "diff_cs", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "915c086e6bf2ab8d", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "ideal common-mode feedback on VB1" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/sky130/sW2_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW2_sL1/manifest.json new file mode 100644 index 00000000..4e3f82c1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW2_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "a9436f19a10dd1f6449282271219289d165ba43fed9330a003cf09e6bd70aedf", + "qualification.json": "42eb9485528a81aa906729040bc8294e9c34bbf7558ae67981b38b6b65d612c5", + "specs.json": "994a0f6d22f24fc01cb46d438eb02faaf0467c3974da7087d87c8b4b3cabe636", + "target.spice": "5d113dc3f1283e566d9ceaa36cc80dc547f9128a3995bddad0aaa19d230fe6ac", + "target_lvs.spice": "2721854a4fcdaac403ae3aff563f0c86f905b0883806f43dd9414df974eafd24", + "testbench.spice": "af948140847df3e78a1e0e39c273c40da581d14ea5a9e34897ab27a5e9874e09" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/sky130/sW2_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW2_sL1/qualification.json new file mode 100644 index 00000000..0760c636 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW2_sL1/qualification.json @@ -0,0 +1,108 @@ +{ + "case_id": "C07_sky130_sW2_sL1", + "circuit_id": "C07", + "pdk": "sky130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "diff_cs", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "915c086e6bf2ab8d", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 28.56 + }, + "f3db": { + "min": 8015000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 31.55954, + "f3db": 13358630.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 10.9, + "schematic_measures": { + "vo1": 0.9049994, + "vo2": 0.9049994, + "idd": 4.000003e-05, + "vos_in": 2.273737e-10, + "gain_lf": 31.55954, + "f3db": 13358630.0, + "ugf": 507592900.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/sky130/sW2_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW2_sL1/specs.json new file mode 100644 index 00000000..73df462e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW2_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 28.56 + }, + "f3db": { + "min": 8015000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 31.55954, + "f3db": 13358630.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/sky130/sW2_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW2_sL1/target.spice new file mode 100644 index 00000000..882d3960 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW2_sL1/target.spice @@ -0,0 +1,6 @@ +.subckt C07_sky130_sW2_sL1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 +XM1 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=8 l=0.3 nf=16 +XM2 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=8 l=0.3 nf=16 +XM3 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=8 l=0.3 nf=16 +XM4 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=8 l=0.3 nf=16 +.ends C07_sky130_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C07/sky130/sW2_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW2_sL1/target_lvs.spice new file mode 100644 index 00000000..b6431bc8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW2_sL1/target_lvs.spice @@ -0,0 +1,66 @@ +.subckt C07_sky130_sW2_sL1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 +XM1_f0 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f1 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f2 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f3 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f4 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f5 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f6 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f7 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f8 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f9 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f10 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f11 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f12 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f13 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f14 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f15 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f0 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f1 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f2 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f3 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f4 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f5 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f6 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f7 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f8 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f9 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f10 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f11 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f12 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f13 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f14 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f15 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f0 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM3_f1 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM3_f2 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM3_f3 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM3_f4 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM3_f5 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM3_f6 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM3_f7 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM3_f8 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM3_f9 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM3_f10 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM3_f11 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM3_f12 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM3_f13 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM3_f14 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM3_f15 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f0 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f1 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f2 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f3 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f4 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f5 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f6 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f7 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f8 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f9 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f10 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f11 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f12 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f13 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f14 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f15 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +.ends C07_sky130_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C07/sky130/sW2_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW2_sL1/testbench.spice new file mode 100644 index 00000000..8c42cd21 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW2_sL1/testbench.spice @@ -0,0 +1,43 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 C07_sky130_sW2_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIB1 IB1 VSS 4e-05 +.nodeset v(IB1)=1.26 +XB_VB1n VB1n VB1n VDDB VDDB sky130_fd_pr__pfet_01v8 w=8 l=0.3 +IB_VB1n VB1n VSS 2e-05 +VCM VCM 0 0.9 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +* ideal CMFB (disclosed): PMOS load gate = replica bias + Gcm*(Vocm - Vocm,target) +BCMFB VB1 0 V = v(VB1n) + 20*((v(VOUT1)+v(VOUT2))/2 - 0.9) +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C07/sky130/sW2_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW2_sL2/case.json new file mode 100644 index 00000000..ae673610 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW2_sL2/case.json @@ -0,0 +1,156 @@ +{ + "case_id": "C07_sky130_sW2_sL2", + "circuit_id": "C07", + "pdk": "sky130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "dut_name": "C07_sky130_sW2_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1", + "IB1" + ], + "sizing": { + "M1": { + "w": 8.0, + "l": 0.6, + "nf": 16 + }, + "M2": { + "w": 8.0, + "l": 0.6, + "nf": 16 + }, + "M3": { + "w": 8.0, + "l": 0.6, + "nf": 16 + }, + "M4": { + "w": 8.0, + "l": 0.6, + "nf": 16 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 2e-05 + }, + "IB1": { + "i": 4e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 0.9, + "CL": 1e-13, + "vocm": 0.9 + }, + "category": "diff_cs", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "0d0b3898849cd39c", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "ideal common-mode feedback on VB1" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/sky130/sW2_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW2_sL2/manifest.json new file mode 100644 index 00000000..84d3594c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW2_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "0be1b75ee1c947e75303c62d9960489fdf32bdefad410e7a2cb1d6ac0b905a7c", + "qualification.json": "30043fe7b01ac6cdbc58c3784638cc6dbe829da3e92810e9bf9278ddfc7e36cd", + "specs.json": "411e8dd1fa934501db3c819324d46496c077d9cd041bdc8c596edefbf0b1af0e", + "target.spice": "0cdb1e452f0f00ec7263faecbff2f44b0f987ec458baca6b200bbb09c03620b5", + "target_lvs.spice": "6aef1d66806afed8205b2e2b4ccb510b3ef71928a92738d07a4f9d24f7c4dce2", + "testbench.spice": "26e413470f93acadc2fb326aa828634f1689b5c0468ff5f579759b8e9ec9a092" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/sky130/sW2_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW2_sL2/qualification.json new file mode 100644 index 00000000..f9bf0261 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW2_sL2/qualification.json @@ -0,0 +1,108 @@ +{ + "case_id": "C07_sky130_sW2_sL2", + "circuit_id": "C07", + "pdk": "sky130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "diff_cs", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "0d0b3898849cd39c", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 35.33 + }, + "f3db": { + "min": 3147000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 38.33312, + "f3db": 5244487.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 6.5, + "schematic_measures": { + "vo1": 0.9049579, + "vo2": 0.9049579, + "idd": 4.000003e-05, + "vos_in": -1.81899e-12, + "gain_lf": 38.33312, + "f3db": 5244487.0, + "ugf": 436283600.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/sky130/sW2_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW2_sL2/specs.json new file mode 100644 index 00000000..9cfd2488 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW2_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 35.33 + }, + "f3db": { + "min": 3147000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 38.33312, + "f3db": 5244487.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C07/sky130/sW2_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW2_sL2/target.spice new file mode 100644 index 00000000..3f223575 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW2_sL2/target.spice @@ -0,0 +1,6 @@ +.subckt C07_sky130_sW2_sL2 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 +XM1 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=8 l=0.6 nf=16 +XM2 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=8 l=0.6 nf=16 +XM3 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=8 l=0.6 nf=16 +XM4 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=8 l=0.6 nf=16 +.ends C07_sky130_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C07/sky130/sW2_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW2_sL2/target_lvs.spice new file mode 100644 index 00000000..6e136deb --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW2_sL2/target_lvs.spice @@ -0,0 +1,66 @@ +.subckt C07_sky130_sW2_sL2 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 +XM1_f0 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f1 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f2 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f3 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f4 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f5 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f6 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f7 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f8 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f9 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f10 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f11 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f12 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f13 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f14 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f15 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f0 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f1 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f2 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f3 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f4 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f5 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f6 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f7 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f8 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f9 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f10 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f11 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f12 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f13 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f14 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f15 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f0 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM3_f1 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM3_f2 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM3_f3 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM3_f4 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM3_f5 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM3_f6 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM3_f7 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM3_f8 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM3_f9 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM3_f10 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM3_f11 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM3_f12 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM3_f13 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM3_f14 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM3_f15 VOUT1 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f0 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f1 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f2 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f3 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f4 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f5 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f6 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f7 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f8 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f9 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f10 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f11 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f12 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f13 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f14 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f15 VOUT2 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +.ends C07_sky130_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C07/sky130/sW2_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW2_sL2/testbench.spice new file mode 100644 index 00000000..53a747fc --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C07/sky130/sW2_sL2/testbench.spice @@ -0,0 +1,43 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 IB1 C07_sky130_sW2_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIB1 IB1 VSS 4e-05 +.nodeset v(IB1)=1.26 +XB_VB1n VB1n VB1n VDDB VDDB sky130_fd_pr__pfet_01v8 w=8 l=0.6 +IB_VB1n VB1n VSS 2e-05 +VCM VCM 0 0.9 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +* ideal CMFB (disclosed): PMOS load gate = replica bias + Gcm*(Vocm - Vocm,target) +BCMFB VB1 0 V = v(VB1n) + 20*((v(VOUT1)+v(VOUT2))/2 - 0.9) +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C08/gf180/sW0.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW0.5_sL1.5/case.json new file mode 100644 index 00000000..aad63340 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW0.5_sL1.5/case.json @@ -0,0 +1,162 @@ +{ + "case_id": "C08_gf180_sW0.5_sL1.5", + "circuit_id": "C08", + "pdk": "gf180", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "dut_name": "C08_gf180_sW0.5_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.84, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 0.84, + "nf": 4 + }, + "M3": { + "w": 2.0, + "l": 0.84, + "nf": 4 + }, + "M4": { + "w": 1.0, + "l": 0.84, + "nf": 2 + }, + "M5": { + "w": 1.0, + "l": 0.84, + "nf": 2 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 4e-05 + } + }, + "load": { + "vcm": 1.5, + "CL": 1e-12, + "inv_input": "VIN2" + }, + "category": "ota", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.84, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.84, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "bbc98ab733caefd8", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/gf180/sW0.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW0.5_sL1.5/manifest.json new file mode 100644 index 00000000..27944ea9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW0.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "1c41e0452b6b54ee6d98e0cd89abb70d03a3f07fb9c8bd1e357cc120590b7db0", + "qualification.json": "73df47b0c375f8fa815999663a015f8d5835e0b86e5acd459150728d16a186d0", + "specs.json": "9312252209d6bb94d03f3d9689fc650df41961f8483cd0a92b184b1a2d0879ff", + "target.spice": "d0c952a312a67d1206a6aafbfbb62b58dd45598c91ca2ada8b84a3c05c64f25b", + "target_lvs.spice": "8a4cd61b0fd6d8bfecc4881960f616ad0e961029f31ad71c05c22d10a2dffbec", + "testbench.spice": "9b1a4619aef15a78a68119b318cf2e0306a1dda2c7787a778719bed05039c5a3" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/gf180/sW0.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW0.5_sL1.5/qualification.json new file mode 100644 index 00000000..4d3e7a32 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW0.5_sL1.5/qualification.json @@ -0,0 +1,122 @@ +{ + "case_id": "C08_gf180_sW0.5_sL1.5", + "circuit_id": "C08", + "pdk": "gf180", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "ota", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.84, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.84, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "bbc98ab733caefd8", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 37.47 + }, + "ugf": { + "min": 8782000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 40.47497, + "ugf": 14636300.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vout0": 1.65, + "idd": 3.567391e-05, + "vos": -0.00154057, + "gain_lf": 40.47497, + "ph_lf": 0.05533407, + "ugf": 14636300.0, + "ph_ugf": -90.43508, + "f3db": 138085.6, + "pm": 89.50958593 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/gf180/sW0.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW0.5_sL1.5/specs.json new file mode 100644 index 00000000..36ee6028 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW0.5_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 37.47 + }, + "ugf": { + "min": 8782000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 40.47497, + "ugf": 14636300.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/gf180/sW0.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW0.5_sL1.5/target.spice new file mode 100644 index 00000000..a05642a8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW0.5_sL1.5/target.spice @@ -0,0 +1,7 @@ +.subckt C08_gf180_sW0.5_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VB1 +MM1 net22 VIN1 net23 VSS nfet_03v3 w=2u l=0.84u nf=4 m=1 +MM2 VOUT1 VIN2 net23 VSS nfet_03v3 w=2u l=0.84u nf=4 m=1 +MM3 net23 VB1 VSS VSS nfet_03v3 w=2u l=0.84u nf=4 m=1 +MM4 net22 net22 VDD VDD pfet_03v3 w=1u l=0.84u nf=2 m=1 +MM5 VOUT1 net22 VDD VDD pfet_03v3 w=1u l=0.84u nf=2 m=1 +.ends C08_gf180_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C08/gf180/sW0.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW0.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..eb0ed0f5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW0.5_sL1.5/target_lvs.spice @@ -0,0 +1,18 @@ +.subckt C08_gf180_sW0.5_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VB1 +MM1_f0 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f1 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f2 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f3 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f0 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f1 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f2 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f3 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f0 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f1 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f2 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f3 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM4_f0 net22 net22 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM4_f1 net22 net22 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM5_f0 VOUT1 net22 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM5_f1 VOUT1 net22 VDD VDD pfet_03v3 w=0.5u l=0.84u +.ends C08_gf180_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C08/gf180/sW0.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW0.5_sL1.5/testbench.spice new file mode 100644 index 00000000..4bc86ea3 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW0.5_sL1.5/testbench.spice @@ -0,0 +1,36 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VB1 C08_gf180_sW0.5_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +MB_VB1 VB1 VB1 VSS VSS nfet_03v3 w=2u l=0.84u +IB_VB1 VDDB VB1 4e-05 +VCM VCM 0 1.5 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 1.65 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN2 VCM VINT 0 1 +EIN VIN1 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN2) - v(VIN1) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C08/gf180/sW0.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW0.5_sL1/case.json new file mode 100644 index 00000000..c890d583 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW0.5_sL1/case.json @@ -0,0 +1,162 @@ +{ + "case_id": "C08_gf180_sW0.5_sL1", + "circuit_id": "C08", + "pdk": "gf180", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "dut_name": "C08_gf180_sW0.5_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.56, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 0.56, + "nf": 4 + }, + "M3": { + "w": 2.0, + "l": 0.56, + "nf": 4 + }, + "M4": { + "w": 1.0, + "l": 0.56, + "nf": 2 + }, + "M5": { + "w": 1.0, + "l": 0.56, + "nf": 2 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 4e-05 + } + }, + "load": { + "vcm": 1.5, + "CL": 1e-12, + "inv_input": "VIN2" + }, + "category": "ota", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.56, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.56, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "c8f7bdc8b98415ed", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/gf180/sW0.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW0.5_sL1/manifest.json new file mode 100644 index 00000000..44ec4e32 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW0.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "6350b560781b120d0bb8f45df65a829dde7e351117f756e4a1de546220e79ec7", + "qualification.json": "9d02c5ed0195fa39f0c1f772af08380f536895faf0cac84ef26d2141300bca0f", + "specs.json": "a61d13dda592ba54ebce3dbe9be78af367bd68af88e7be896035517357d2da1f", + "target.spice": "b9ed71b8019281ea7e314d82192b45fc79b4e78157e6f914aebc2c35f1017510", + "target_lvs.spice": "c6e0da770c9cdbecdb140c2b49e22b76e50d5d80c5fd8371586711ecef9a4155", + "testbench.spice": "5d8c9956e63bba82017d188493ae1ed338ae55b629286ed163bced1d746f1cbd" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/gf180/sW0.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW0.5_sL1/qualification.json new file mode 100644 index 00000000..5445a9fd --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW0.5_sL1/qualification.json @@ -0,0 +1,122 @@ +{ + "case_id": "C08_gf180_sW0.5_sL1", + "circuit_id": "C08", + "pdk": "gf180", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "ota", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.56, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.56, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "c8f7bdc8b98415ed", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 34.73 + }, + "ugf": { + "min": 11280000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 37.72799, + "ugf": 18808120.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vout0": 1.65, + "idd": 3.891173e-05, + "vos": 0.0003982061, + "gain_lf": 37.72799, + "ph_lf": 0.04682252, + "ugf": 18808120.0, + "ph_ugf": -89.96297, + "f3db": 243375.5, + "pm": 89.99020748 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/gf180/sW0.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW0.5_sL1/specs.json new file mode 100644 index 00000000..26db4949 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW0.5_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 34.73 + }, + "ugf": { + "min": 11280000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 37.72799, + "ugf": 18808120.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/gf180/sW0.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW0.5_sL1/target.spice new file mode 100644 index 00000000..745bdde9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW0.5_sL1/target.spice @@ -0,0 +1,7 @@ +.subckt C08_gf180_sW0.5_sL1 VDD VSS VIN1 VIN2 VOUT1 VB1 +MM1 net22 VIN1 net23 VSS nfet_03v3 w=2u l=0.56u nf=4 m=1 +MM2 VOUT1 VIN2 net23 VSS nfet_03v3 w=2u l=0.56u nf=4 m=1 +MM3 net23 VB1 VSS VSS nfet_03v3 w=2u l=0.56u nf=4 m=1 +MM4 net22 net22 VDD VDD pfet_03v3 w=1u l=0.56u nf=2 m=1 +MM5 VOUT1 net22 VDD VDD pfet_03v3 w=1u l=0.56u nf=2 m=1 +.ends C08_gf180_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C08/gf180/sW0.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW0.5_sL1/target_lvs.spice new file mode 100644 index 00000000..3757a620 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW0.5_sL1/target_lvs.spice @@ -0,0 +1,18 @@ +.subckt C08_gf180_sW0.5_sL1 VDD VSS VIN1 VIN2 VOUT1 VB1 +MM1_f0 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f1 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f2 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f3 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f0 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f1 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f2 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f3 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f0 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f1 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f2 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f3 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM4_f0 net22 net22 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM4_f1 net22 net22 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM5_f0 VOUT1 net22 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM5_f1 VOUT1 net22 VDD VDD pfet_03v3 w=0.5u l=0.56u +.ends C08_gf180_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C08/gf180/sW0.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW0.5_sL1/testbench.spice new file mode 100644 index 00000000..cfa965cf --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW0.5_sL1/testbench.spice @@ -0,0 +1,36 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VB1 C08_gf180_sW0.5_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +MB_VB1 VB1 VB1 VSS VSS nfet_03v3 w=2u l=0.56u +IB_VB1 VDDB VB1 4e-05 +VCM VCM 0 1.5 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 1.65 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN2 VCM VINT 0 1 +EIN VIN1 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN2) - v(VIN1) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C08/gf180/sW0.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW0.5_sL2/case.json new file mode 100644 index 00000000..57151ed9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW0.5_sL2/case.json @@ -0,0 +1,162 @@ +{ + "case_id": "C08_gf180_sW0.5_sL2", + "circuit_id": "C08", + "pdk": "gf180", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "dut_name": "C08_gf180_sW0.5_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 1.12, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 1.12, + "nf": 4 + }, + "M3": { + "w": 2.0, + "l": 1.12, + "nf": 4 + }, + "M4": { + "w": 1.0, + "l": 1.12, + "nf": 2 + }, + "M5": { + "w": 1.0, + "l": 1.12, + "nf": 2 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 4e-05 + } + }, + "load": { + "vcm": 1.5, + "CL": 1e-12, + "inv_input": "VIN2" + }, + "category": "ota", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.12, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.12, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "56f9bd7e977fa709", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/gf180/sW0.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW0.5_sL2/manifest.json new file mode 100644 index 00000000..2eda58e4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW0.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "c58954c870124d86e515aa98b7ecf78f7cdab1eb39a5027c7c68670ad3b3f965", + "qualification.json": "67aa00a0c0fd9a094bcc42d63bc8a533349efbc2c75d491285cdf1f3abba9616", + "specs.json": "c73ad7089c33c9591822f22baefa2c5638202426c181136737877aa6c9c8c137", + "target.spice": "b41cbe50fe6748395952543f58d92ba703c08dcbf1f16da68eaad1617713f2cd", + "target_lvs.spice": "a235ba6ab6b25309571b51b101859063a15db71346d2e5b8a79ecb800771af06", + "testbench.spice": "538ec35013d77d2d9a97ef73c24b224d6145b97ccbe682c0c3939b82bd6eac33" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/gf180/sW0.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW0.5_sL2/qualification.json new file mode 100644 index 00000000..fa837b35 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW0.5_sL2/qualification.json @@ -0,0 +1,122 @@ +{ + "case_id": "C08_gf180_sW0.5_sL2", + "circuit_id": "C08", + "pdk": "gf180", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "ota", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.12, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.12, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "56f9bd7e977fa709", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 38.94 + }, + "ugf": { + "min": 7248000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 41.94394, + "ugf": 12079980.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vout0": 1.65, + "idd": 3.235917e-05, + "vos": -0.00228577, + "gain_lf": 41.94394, + "ph_lf": 0.05539647, + "ugf": 12079980.0, + "ph_ugf": -90.80232, + "f3db": 96233.96, + "pm": 89.14228353 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/gf180/sW0.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW0.5_sL2/specs.json new file mode 100644 index 00000000..baea6954 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW0.5_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 38.94 + }, + "ugf": { + "min": 7248000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 41.94394, + "ugf": 12079980.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/gf180/sW0.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW0.5_sL2/target.spice new file mode 100644 index 00000000..a66c2fff --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW0.5_sL2/target.spice @@ -0,0 +1,7 @@ +.subckt C08_gf180_sW0.5_sL2 VDD VSS VIN1 VIN2 VOUT1 VB1 +MM1 net22 VIN1 net23 VSS nfet_03v3 w=2u l=1.12u nf=4 m=1 +MM2 VOUT1 VIN2 net23 VSS nfet_03v3 w=2u l=1.12u nf=4 m=1 +MM3 net23 VB1 VSS VSS nfet_03v3 w=2u l=1.12u nf=4 m=1 +MM4 net22 net22 VDD VDD pfet_03v3 w=1u l=1.12u nf=2 m=1 +MM5 VOUT1 net22 VDD VDD pfet_03v3 w=1u l=1.12u nf=2 m=1 +.ends C08_gf180_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C08/gf180/sW0.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW0.5_sL2/target_lvs.spice new file mode 100644 index 00000000..e5d5b643 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW0.5_sL2/target_lvs.spice @@ -0,0 +1,18 @@ +.subckt C08_gf180_sW0.5_sL2 VDD VSS VIN1 VIN2 VOUT1 VB1 +MM1_f0 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f1 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f2 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f3 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f0 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f1 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f2 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f3 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f0 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f1 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f2 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f3 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM4_f0 net22 net22 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM4_f1 net22 net22 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM5_f0 VOUT1 net22 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM5_f1 VOUT1 net22 VDD VDD pfet_03v3 w=0.5u l=1.12u +.ends C08_gf180_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C08/gf180/sW0.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW0.5_sL2/testbench.spice new file mode 100644 index 00000000..52660fff --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW0.5_sL2/testbench.spice @@ -0,0 +1,36 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VB1 C08_gf180_sW0.5_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +MB_VB1 VB1 VB1 VSS VSS nfet_03v3 w=2u l=1.12u +IB_VB1 VDDB VB1 4e-05 +VCM VCM 0 1.5 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 1.65 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN2 VCM VINT 0 1 +EIN VIN1 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN2) - v(VIN1) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1.5_sL1.5/case.json new file mode 100644 index 00000000..ce03e939 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1.5_sL1.5/case.json @@ -0,0 +1,162 @@ +{ + "case_id": "C08_gf180_sW1.5_sL1.5", + "circuit_id": "C08", + "pdk": "gf180", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "dut_name": "C08_gf180_sW1.5_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 6.0, + "l": 0.84, + "nf": 12 + }, + "M2": { + "w": 6.0, + "l": 0.84, + "nf": 12 + }, + "M3": { + "w": 6.0, + "l": 0.84, + "nf": 12 + }, + "M4": { + "w": 3.0, + "l": 0.84, + "nf": 6 + }, + "M5": { + "w": 3.0, + "l": 0.84, + "nf": 6 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 4e-05 + } + }, + "load": { + "vcm": 1.5, + "CL": 1e-12, + "inv_input": "VIN2" + }, + "category": "ota", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.84, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.84, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "0e70d53c874bdca7", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1.5_sL1.5/manifest.json new file mode 100644 index 00000000..769f3f8d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "dc66270447d0c86cc1b27b02a8fd00e086cd17c0efc4e6336fd176afd102407d", + "qualification.json": "54d71599a062a18ff577166d2dc5397cc3949302277e59d9bf40e6a2bdc4c175", + "specs.json": "5e93e004850104a610c89d27a2b409d2b6ec7d9dab97307f1395805d67e69f29", + "target.spice": "5d5efea0e24660bb0d368a8914bf4c72e2ea238d761c6dd140ac334d675f591b", + "target_lvs.spice": "21853627c8863dc8b671c2a37705d35c1ccd3e7d6f67abb2e8e6665e8608ed6a", + "testbench.spice": "e8230d207821691209a5330b7cc67dfa702c6a0a1ba8432b78ec947d4750f53f" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1.5_sL1.5/qualification.json new file mode 100644 index 00000000..6a6d8629 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1.5_sL1.5/qualification.json @@ -0,0 +1,122 @@ +{ + "case_id": "C08_gf180_sW1.5_sL1.5", + "circuit_id": "C08", + "pdk": "gf180", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "ota", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.84, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.84, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "0e70d53c874bdca7", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 41.24 + }, + "ugf": { + "min": 15960000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 44.23723, + "ugf": 26604640.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vout0": 1.65, + "idd": 3.917696e-05, + "vos": 0.001677474, + "gain_lf": 44.23723, + "ph_lf": 0.1134194, + "ugf": 26604640.0, + "ph_ugf": -92.15202, + "f3db": 162947.9, + "pm": 87.73456060000001 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1.5_sL1.5/specs.json new file mode 100644 index 00000000..d5daf85a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1.5_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 41.24 + }, + "ugf": { + "min": 15960000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 44.23723, + "ugf": 26604640.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1.5_sL1.5/target.spice new file mode 100644 index 00000000..7c7d992a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1.5_sL1.5/target.spice @@ -0,0 +1,7 @@ +.subckt C08_gf180_sW1.5_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VB1 +MM1 net22 VIN1 net23 VSS nfet_03v3 w=6u l=0.84u nf=12 m=1 +MM2 VOUT1 VIN2 net23 VSS nfet_03v3 w=6u l=0.84u nf=12 m=1 +MM3 net23 VB1 VSS VSS nfet_03v3 w=6u l=0.84u nf=12 m=1 +MM4 net22 net22 VDD VDD pfet_03v3 w=3u l=0.84u nf=6 m=1 +MM5 VOUT1 net22 VDD VDD pfet_03v3 w=3u l=0.84u nf=6 m=1 +.ends C08_gf180_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..5fb0a614 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1.5_sL1.5/target_lvs.spice @@ -0,0 +1,50 @@ +.subckt C08_gf180_sW1.5_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VB1 +MM1_f0 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f1 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f2 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f3 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f4 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f5 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f6 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f7 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f8 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f9 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f10 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f11 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f0 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f1 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f2 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f3 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f4 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f5 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f6 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f7 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f8 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f9 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f10 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f11 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f0 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f1 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f2 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f3 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f4 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f5 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f6 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f7 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f8 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f9 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f10 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f11 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM4_f0 net22 net22 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM4_f1 net22 net22 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM4_f2 net22 net22 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM4_f3 net22 net22 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM4_f4 net22 net22 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM4_f5 net22 net22 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM5_f0 VOUT1 net22 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM5_f1 VOUT1 net22 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM5_f2 VOUT1 net22 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM5_f3 VOUT1 net22 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM5_f4 VOUT1 net22 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM5_f5 VOUT1 net22 VDD VDD pfet_03v3 w=0.5u l=0.84u +.ends C08_gf180_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1.5_sL1.5/testbench.spice new file mode 100644 index 00000000..8724a93e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1.5_sL1.5/testbench.spice @@ -0,0 +1,36 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VB1 C08_gf180_sW1.5_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +MB_VB1 VB1 VB1 VSS VSS nfet_03v3 w=6u l=0.84u +IB_VB1 VDDB VB1 4e-05 +VCM VCM 0 1.5 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 1.65 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN2 VCM VINT 0 1 +EIN VIN1 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN2) - v(VIN1) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1.5_sL1/case.json new file mode 100644 index 00000000..6a607ee3 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1.5_sL1/case.json @@ -0,0 +1,162 @@ +{ + "case_id": "C08_gf180_sW1.5_sL1", + "circuit_id": "C08", + "pdk": "gf180", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "dut_name": "C08_gf180_sW1.5_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 6.0, + "l": 0.56, + "nf": 12 + }, + "M2": { + "w": 6.0, + "l": 0.56, + "nf": 12 + }, + "M3": { + "w": 6.0, + "l": 0.56, + "nf": 12 + }, + "M4": { + "w": 3.0, + "l": 0.56, + "nf": 6 + }, + "M5": { + "w": 3.0, + "l": 0.56, + "nf": 6 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 4e-05 + } + }, + "load": { + "vcm": 1.5, + "CL": 1e-12, + "inv_input": "VIN2" + }, + "category": "ota", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.56, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.56, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "6a6ce56e82646caa", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1.5_sL1/manifest.json new file mode 100644 index 00000000..849a0a87 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "7180ab62070eb4f48d400686878cf839c5af107e96126526d4498b293d75edfe", + "qualification.json": "bf9b61b4f6c99e131be24fdfb6222d2a9282981865f5b46cb6166ae562845c0a", + "specs.json": "6b6b7d8bb38372a33507192e2df1bb5ef07174facefd90ec7c26ddb5173e16fd", + "target.spice": "d918b2c93024607d2d8413a04f15a9cf22efad0e9d941d6e3bf59750053584ed", + "target_lvs.spice": "3da68bc7324882c2921e6cb50ad7d938d14c0b4905e7f5307ceae26effbd3830", + "testbench.spice": "a1be7cdab5c2150e97533b2ced53fcde93e3ad5bb55a27fa87a923dbdadfb613" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1.5_sL1/qualification.json new file mode 100644 index 00000000..d4a5ff6d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1.5_sL1/qualification.json @@ -0,0 +1,122 @@ +{ + "case_id": "C08_gf180_sW1.5_sL1", + "circuit_id": "C08", + "pdk": "gf180", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "ota", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.56, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.56, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "6a6ce56e82646caa", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 37.79 + }, + "ugf": { + "min": 20290000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 40.79162, + "ugf": 33823100.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vout0": 1.65, + "idd": 4.332281e-05, + "vos": 0.003542733, + "gain_lf": 40.79162, + "ph_lf": 0.08127332, + "ugf": 33823100.0, + "ph_ugf": -91.36284, + "f3db": 307817.6, + "pm": 88.55588668 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1.5_sL1/specs.json new file mode 100644 index 00000000..c9f9fc7d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1.5_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 37.79 + }, + "ugf": { + "min": 20290000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 40.79162, + "ugf": 33823100.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1.5_sL1/target.spice new file mode 100644 index 00000000..9f46aa2d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1.5_sL1/target.spice @@ -0,0 +1,7 @@ +.subckt C08_gf180_sW1.5_sL1 VDD VSS VIN1 VIN2 VOUT1 VB1 +MM1 net22 VIN1 net23 VSS nfet_03v3 w=6u l=0.56u nf=12 m=1 +MM2 VOUT1 VIN2 net23 VSS nfet_03v3 w=6u l=0.56u nf=12 m=1 +MM3 net23 VB1 VSS VSS nfet_03v3 w=6u l=0.56u nf=12 m=1 +MM4 net22 net22 VDD VDD pfet_03v3 w=3u l=0.56u nf=6 m=1 +MM5 VOUT1 net22 VDD VDD pfet_03v3 w=3u l=0.56u nf=6 m=1 +.ends C08_gf180_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1.5_sL1/target_lvs.spice new file mode 100644 index 00000000..3b898664 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1.5_sL1/target_lvs.spice @@ -0,0 +1,50 @@ +.subckt C08_gf180_sW1.5_sL1 VDD VSS VIN1 VIN2 VOUT1 VB1 +MM1_f0 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f1 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f2 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f3 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f4 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f5 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f6 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f7 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f8 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f9 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f10 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f11 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f0 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f1 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f2 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f3 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f4 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f5 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f6 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f7 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f8 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f9 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f10 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f11 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f0 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f1 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f2 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f3 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f4 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f5 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f6 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f7 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f8 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f9 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f10 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f11 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM4_f0 net22 net22 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM4_f1 net22 net22 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM4_f2 net22 net22 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM4_f3 net22 net22 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM4_f4 net22 net22 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM4_f5 net22 net22 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM5_f0 VOUT1 net22 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM5_f1 VOUT1 net22 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM5_f2 VOUT1 net22 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM5_f3 VOUT1 net22 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM5_f4 VOUT1 net22 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM5_f5 VOUT1 net22 VDD VDD pfet_03v3 w=0.5u l=0.56u +.ends C08_gf180_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1.5_sL1/testbench.spice new file mode 100644 index 00000000..e8f15ca6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1.5_sL1/testbench.spice @@ -0,0 +1,36 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VB1 C08_gf180_sW1.5_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +MB_VB1 VB1 VB1 VSS VSS nfet_03v3 w=6u l=0.56u +IB_VB1 VDDB VB1 4e-05 +VCM VCM 0 1.5 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 1.65 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN2 VCM VINT 0 1 +EIN VIN1 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN2) - v(VIN1) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1.5_sL2/case.json new file mode 100644 index 00000000..40120cd9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1.5_sL2/case.json @@ -0,0 +1,162 @@ +{ + "case_id": "C08_gf180_sW1.5_sL2", + "circuit_id": "C08", + "pdk": "gf180", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "dut_name": "C08_gf180_sW1.5_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 6.0, + "l": 1.12, + "nf": 12 + }, + "M2": { + "w": 6.0, + "l": 1.12, + "nf": 12 + }, + "M3": { + "w": 6.0, + "l": 1.12, + "nf": 12 + }, + "M4": { + "w": 3.0, + "l": 1.12, + "nf": 6 + }, + "M5": { + "w": 3.0, + "l": 1.12, + "nf": 6 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 4e-05 + } + }, + "load": { + "vcm": 1.5, + "CL": 1e-12, + "inv_input": "VIN2" + }, + "category": "ota", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.12, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.12, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "e6658e2440989467", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1.5_sL2/manifest.json new file mode 100644 index 00000000..cfd23c45 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "0becbb516924a240e422707ae0a63477c5bb4b461561db7cae18fd2ee9dbbc4a", + "qualification.json": "7dbc038c58b74ea48a7779544150c6636657748fd1fc864a2c8df892029bf6e3", + "specs.json": "8c36a4554d92b0d54460ac4397f328474ccc5113b67f196df3b6540d7f096628", + "target.spice": "8f70632497ecd1839178af9a500d803ffc6f92afc46388e8006fe00dc0079786", + "target_lvs.spice": "8d21bab7fd6815c778457dfc5972690b7c1988990c3c3705bfb70cf7bd29429a", + "testbench.spice": "b1d24ec2132ca816e5113a47a788d8f2b2e2ff927216a1950f0a6b79b5e3c3c3" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1.5_sL2/qualification.json new file mode 100644 index 00000000..f8b4f5f3 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1.5_sL2/qualification.json @@ -0,0 +1,122 @@ +{ + "case_id": "C08_gf180_sW1.5_sL2", + "circuit_id": "C08", + "pdk": "gf180", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "ota", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.12, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.12, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "e6658e2440989467", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 42.76 + }, + "ugf": { + "min": 13570000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 45.76099, + "ugf": 22610800.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vout0": 1.65, + "idd": 3.729526e-05, + "vos": 0.000924354, + "gain_lf": 45.76099, + "ph_lf": 0.1278973, + "ugf": 22610800.0, + "ph_ugf": -92.80872, + "f3db": 116432.0, + "pm": 87.0633827 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1.5_sL2/specs.json new file mode 100644 index 00000000..6df111eb --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1.5_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 42.76 + }, + "ugf": { + "min": 13570000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 45.76099, + "ugf": 22610800.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1.5_sL2/target.spice new file mode 100644 index 00000000..ef3cc0d3 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1.5_sL2/target.spice @@ -0,0 +1,7 @@ +.subckt C08_gf180_sW1.5_sL2 VDD VSS VIN1 VIN2 VOUT1 VB1 +MM1 net22 VIN1 net23 VSS nfet_03v3 w=6u l=1.12u nf=12 m=1 +MM2 VOUT1 VIN2 net23 VSS nfet_03v3 w=6u l=1.12u nf=12 m=1 +MM3 net23 VB1 VSS VSS nfet_03v3 w=6u l=1.12u nf=12 m=1 +MM4 net22 net22 VDD VDD pfet_03v3 w=3u l=1.12u nf=6 m=1 +MM5 VOUT1 net22 VDD VDD pfet_03v3 w=3u l=1.12u nf=6 m=1 +.ends C08_gf180_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1.5_sL2/target_lvs.spice new file mode 100644 index 00000000..1088ebb1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1.5_sL2/target_lvs.spice @@ -0,0 +1,50 @@ +.subckt C08_gf180_sW1.5_sL2 VDD VSS VIN1 VIN2 VOUT1 VB1 +MM1_f0 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f1 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f2 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f3 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f4 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f5 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f6 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f7 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f8 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f9 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f10 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f11 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f0 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f1 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f2 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f3 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f4 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f5 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f6 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f7 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f8 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f9 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f10 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f11 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f0 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f1 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f2 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f3 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f4 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f5 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f6 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f7 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f8 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f9 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f10 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f11 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM4_f0 net22 net22 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM4_f1 net22 net22 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM4_f2 net22 net22 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM4_f3 net22 net22 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM4_f4 net22 net22 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM4_f5 net22 net22 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM5_f0 VOUT1 net22 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM5_f1 VOUT1 net22 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM5_f2 VOUT1 net22 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM5_f3 VOUT1 net22 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM5_f4 VOUT1 net22 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM5_f5 VOUT1 net22 VDD VDD pfet_03v3 w=0.5u l=1.12u +.ends C08_gf180_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1.5_sL2/testbench.spice new file mode 100644 index 00000000..1b4fa9c8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1.5_sL2/testbench.spice @@ -0,0 +1,36 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VB1 C08_gf180_sW1.5_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +MB_VB1 VB1 VB1 VSS VSS nfet_03v3 w=6u l=1.12u +IB_VB1 VDDB VB1 4e-05 +VCM VCM 0 1.5 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 1.65 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN2 VCM VINT 0 1 +EIN VIN1 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN2) - v(VIN1) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1_sL1.5/case.json new file mode 100644 index 00000000..52ffc9a4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1_sL1.5/case.json @@ -0,0 +1,162 @@ +{ + "case_id": "C08_gf180_sW1_sL1.5", + "circuit_id": "C08", + "pdk": "gf180", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "dut_name": "C08_gf180_sW1_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.84, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 0.84, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 0.84, + "nf": 8 + }, + "M4": { + "w": 2.0, + "l": 0.84, + "nf": 4 + }, + "M5": { + "w": 2.0, + "l": 0.84, + "nf": 4 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 4e-05 + } + }, + "load": { + "vcm": 1.5, + "CL": 1e-12, + "inv_input": "VIN2" + }, + "category": "ota", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "22aee7afdf9f5ebc", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1_sL1.5/manifest.json new file mode 100644 index 00000000..20f88cd8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "7ac6e8b49500cda1bfc3df0b1029d48c5d8d374007781ca88c78e0539e2f19f7", + "qualification.json": "1f9a2c8661d6a27513872bb7cbe553b0d1fb8304829d0806e91c557a12470600", + "specs.json": "a85ca03b99ba89e3ed64f3a8b28896eb25f78c7f4970ee38873778c3adc7e33b", + "target.spice": "06d01b3e3d43e5688e6a74d9f7b14f0ecb3cca72d762e65aaf4d98eff807fe3f", + "target_lvs.spice": "fd71151cf15e94f20ec6f95ae88b661cb0b878144095194be8df8fbd655bc69a", + "testbench.spice": "7a6338671b4b8215bcf6a93d047292dba3b6b6c6fa11e03bdafd1356587632a5" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1_sL1.5/qualification.json new file mode 100644 index 00000000..d8a7f014 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1_sL1.5/qualification.json @@ -0,0 +1,122 @@ +{ + "case_id": "C08_gf180_sW1_sL1.5", + "circuit_id": "C08", + "pdk": "gf180", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "ota", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "22aee7afdf9f5ebc", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 40.05 + }, + "ugf": { + "min": 13060000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 43.04609, + "ugf": 21769850.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vout0": 1.65, + "idd": 3.830364e-05, + "vos": 0.0009475883, + "gain_lf": 43.04609, + "ph_lf": 0.09210504, + "ugf": 21769850.0, + "ph_ugf": -91.33537, + "f3db": 152868.1, + "pm": 88.57252496 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1_sL1.5/specs.json new file mode 100644 index 00000000..e4c9f146 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 40.05 + }, + "ugf": { + "min": 13060000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 43.04609, + "ugf": 21769850.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1_sL1.5/target.spice new file mode 100644 index 00000000..cc64a9a0 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1_sL1.5/target.spice @@ -0,0 +1,7 @@ +.subckt C08_gf180_sW1_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VB1 +MM1 net22 VIN1 net23 VSS nfet_03v3 w=4u l=0.84u nf=8 m=1 +MM2 VOUT1 VIN2 net23 VSS nfet_03v3 w=4u l=0.84u nf=8 m=1 +MM3 net23 VB1 VSS VSS nfet_03v3 w=4u l=0.84u nf=8 m=1 +MM4 net22 net22 VDD VDD pfet_03v3 w=2u l=0.84u nf=4 m=1 +MM5 VOUT1 net22 VDD VDD pfet_03v3 w=2u l=0.84u nf=4 m=1 +.ends C08_gf180_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1_sL1.5/target_lvs.spice new file mode 100644 index 00000000..a0ba7eac --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1_sL1.5/target_lvs.spice @@ -0,0 +1,34 @@ +.subckt C08_gf180_sW1_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VB1 +MM1_f0 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f1 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f2 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f3 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f4 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f5 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f6 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f7 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f0 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f1 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f2 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f3 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f4 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f5 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f6 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f7 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f0 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f1 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f2 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f3 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f4 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f5 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f6 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f7 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM4_f0 net22 net22 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM4_f1 net22 net22 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM4_f2 net22 net22 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM4_f3 net22 net22 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM5_f0 VOUT1 net22 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM5_f1 VOUT1 net22 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM5_f2 VOUT1 net22 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM5_f3 VOUT1 net22 VDD VDD pfet_03v3 w=0.5u l=0.84u +.ends C08_gf180_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1_sL1.5/testbench.spice new file mode 100644 index 00000000..bdf6a5d4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1_sL1.5/testbench.spice @@ -0,0 +1,36 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VB1 C08_gf180_sW1_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +MB_VB1 VB1 VB1 VSS VSS nfet_03v3 w=4u l=0.84u +IB_VB1 VDDB VB1 4e-05 +VCM VCM 0 1.5 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 1.65 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN2 VCM VINT 0 1 +EIN VIN1 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN2) - v(VIN1) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1_sL1/case.json new file mode 100644 index 00000000..364606a3 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1_sL1/case.json @@ -0,0 +1,162 @@ +{ + "case_id": "C08_gf180_sW1_sL1", + "circuit_id": "C08", + "pdk": "gf180", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "dut_name": "C08_gf180_sW1_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "M4": { + "w": 2.0, + "l": 0.56, + "nf": 4 + }, + "M5": { + "w": 2.0, + "l": 0.56, + "nf": 4 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 4e-05 + } + }, + "load": { + "vcm": 1.5, + "CL": 1e-12, + "inv_input": "VIN2" + }, + "category": "ota", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "867f68557540e58c", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1_sL1/manifest.json new file mode 100644 index 00000000..aaa90cd8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "b0954d61d795f9eba02e0da8a93d2d1b780f9d1dad4313a22801b51bcc68fdd3", + "qualification.json": "aa763df9050aceefcafb298afe2758f4567e646722ff11ea6576d672ed2c838f", + "specs.json": "846e47e162b743baf3aee05a512da4b3beea209c0c6e7447290e06bf4f0e56db", + "target.spice": "34c17a88de53d4fede5d63b2c54324325c6976e16c76c344bdb0d5ab7a40f121", + "target_lvs.spice": "ff9937c00a5f1f37b7461e31e708c3cdba8cb4edb6ba43459f5dbb6a338d5419", + "testbench.spice": "4cd0fb28878d379d6dcb38eb7f2da372936964e3f8fdec7d1fc61dbeffe01d29" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1_sL1/qualification.json new file mode 100644 index 00000000..08ea08b2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1_sL1/qualification.json @@ -0,0 +1,122 @@ +{ + "case_id": "C08_gf180_sW1_sL1", + "circuit_id": "C08", + "pdk": "gf180", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "ota", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "867f68557540e58c", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 36.87 + }, + "ugf": { + "min": 16570000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 39.87391, + "ugf": 27619540.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vout0": 1.65, + "idd": 4.152962e-05, + "vos": 0.002837094, + "gain_lf": 39.87391, + "ph_lf": 0.06939099, + "ugf": 27619540.0, + "ph_ugf": -90.73614, + "f3db": 279430.5, + "pm": 89.19446900999999 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1_sL1/specs.json new file mode 100644 index 00000000..69852a75 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 36.87 + }, + "ugf": { + "min": 16570000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 39.87391, + "ugf": 27619540.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1_sL1/target.spice new file mode 100644 index 00000000..ab5e2e2c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1_sL1/target.spice @@ -0,0 +1,7 @@ +.subckt C08_gf180_sW1_sL1 VDD VSS VIN1 VIN2 VOUT1 VB1 +MM1 net22 VIN1 net23 VSS nfet_03v3 w=4u l=0.56u nf=8 m=1 +MM2 VOUT1 VIN2 net23 VSS nfet_03v3 w=4u l=0.56u nf=8 m=1 +MM3 net23 VB1 VSS VSS nfet_03v3 w=4u l=0.56u nf=8 m=1 +MM4 net22 net22 VDD VDD pfet_03v3 w=2u l=0.56u nf=4 m=1 +MM5 VOUT1 net22 VDD VDD pfet_03v3 w=2u l=0.56u nf=4 m=1 +.ends C08_gf180_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1_sL1/target_lvs.spice new file mode 100644 index 00000000..3c1ea1f2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1_sL1/target_lvs.spice @@ -0,0 +1,34 @@ +.subckt C08_gf180_sW1_sL1 VDD VSS VIN1 VIN2 VOUT1 VB1 +MM1_f0 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f1 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f2 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f3 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f4 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f5 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f6 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f7 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f0 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f1 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f2 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f3 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f4 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f5 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f6 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f7 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f0 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f1 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f2 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f3 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f4 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f5 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f6 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f7 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM4_f0 net22 net22 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM4_f1 net22 net22 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM4_f2 net22 net22 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM4_f3 net22 net22 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM5_f0 VOUT1 net22 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM5_f1 VOUT1 net22 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM5_f2 VOUT1 net22 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM5_f3 VOUT1 net22 VDD VDD pfet_03v3 w=0.5u l=0.56u +.ends C08_gf180_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1_sL1/testbench.spice new file mode 100644 index 00000000..e1b2a367 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1_sL1/testbench.spice @@ -0,0 +1,36 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VB1 C08_gf180_sW1_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +MB_VB1 VB1 VB1 VSS VSS nfet_03v3 w=4u l=0.56u +IB_VB1 VDDB VB1 4e-05 +VCM VCM 0 1.5 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 1.65 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN2 VCM VINT 0 1 +EIN VIN1 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN2) - v(VIN1) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1_sL2/case.json new file mode 100644 index 00000000..9aa929c8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1_sL2/case.json @@ -0,0 +1,162 @@ +{ + "case_id": "C08_gf180_sW1_sL2", + "circuit_id": "C08", + "pdk": "gf180", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "dut_name": "C08_gf180_sW1_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 1.12, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 1.12, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 1.12, + "nf": 8 + }, + "M4": { + "w": 2.0, + "l": 1.12, + "nf": 4 + }, + "M5": { + "w": 2.0, + "l": 1.12, + "nf": 4 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 4e-05 + } + }, + "load": { + "vcm": 1.5, + "CL": 1e-12, + "inv_input": "VIN2" + }, + "category": "ota", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "94f40bc58f7d1dd9", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1_sL2/manifest.json new file mode 100644 index 00000000..6fcdce74 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "b315069e631b3c37b6d134a94dbe34b0c431a1bdaadbc378ec22165771285ed4", + "qualification.json": "5092503ec17ffa542a84911669699ef7835397cfd4f179cb1bdad276c08c67f2", + "specs.json": "85ccff798feedeb5e9bfe8dab396d2a676854c4223c0d9ff274ceae327b87204", + "target.spice": "82b2aae525023bf9c88d30500781f455c87ab3471b9076e5a5326da7a277dd5e", + "target_lvs.spice": "1eb26482f04ccfd9ae7bc1db6aa54efdb457b39f9108ca540cf26efcbada51a9", + "testbench.spice": "5fe741e68471d7d628e03c6529e6e11a8c18224d6ac598bdd6cab9f650053a7c" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1_sL2/qualification.json new file mode 100644 index 00000000..09ca2d40 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1_sL2/qualification.json @@ -0,0 +1,122 @@ +{ + "case_id": "C08_gf180_sW1_sL2", + "circuit_id": "C08", + "pdk": "gf180", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "ota", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "94f40bc58f7d1dd9", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 41.46 + }, + "ugf": { + "min": 11110000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 44.45594, + "ugf": 18509170.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.2, + "schematic_measures": { + "vout0": 1.65, + "idd": 3.676275e-05, + "vos": 0.0001022394, + "gain_lf": 44.45594, + "ph_lf": 0.1006336, + "ugf": 18509170.0, + "ph_ugf": -91.81732, + "f3db": 110512.8, + "pm": 88.08204640000001 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1_sL2/specs.json new file mode 100644 index 00000000..9aff3648 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 41.46 + }, + "ugf": { + "min": 11110000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 44.45594, + "ugf": 18509170.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1_sL2/target.spice new file mode 100644 index 00000000..bd147a77 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1_sL2/target.spice @@ -0,0 +1,7 @@ +.subckt C08_gf180_sW1_sL2 VDD VSS VIN1 VIN2 VOUT1 VB1 +MM1 net22 VIN1 net23 VSS nfet_03v3 w=4u l=1.12u nf=8 m=1 +MM2 VOUT1 VIN2 net23 VSS nfet_03v3 w=4u l=1.12u nf=8 m=1 +MM3 net23 VB1 VSS VSS nfet_03v3 w=4u l=1.12u nf=8 m=1 +MM4 net22 net22 VDD VDD pfet_03v3 w=2u l=1.12u nf=4 m=1 +MM5 VOUT1 net22 VDD VDD pfet_03v3 w=2u l=1.12u nf=4 m=1 +.ends C08_gf180_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1_sL2/target_lvs.spice new file mode 100644 index 00000000..e3c51f83 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1_sL2/target_lvs.spice @@ -0,0 +1,34 @@ +.subckt C08_gf180_sW1_sL2 VDD VSS VIN1 VIN2 VOUT1 VB1 +MM1_f0 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f1 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f2 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f3 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f4 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f5 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f6 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f7 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f0 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f1 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f2 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f3 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f4 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f5 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f6 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f7 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f0 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f1 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f2 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f3 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f4 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f5 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f6 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f7 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM4_f0 net22 net22 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM4_f1 net22 net22 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM4_f2 net22 net22 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM4_f3 net22 net22 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM5_f0 VOUT1 net22 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM5_f1 VOUT1 net22 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM5_f2 VOUT1 net22 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM5_f3 VOUT1 net22 VDD VDD pfet_03v3 w=0.5u l=1.12u +.ends C08_gf180_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1_sL2/testbench.spice new file mode 100644 index 00000000..219f0a69 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW1_sL2/testbench.spice @@ -0,0 +1,36 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VB1 C08_gf180_sW1_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +MB_VB1 VB1 VB1 VSS VSS nfet_03v3 w=4u l=1.12u +IB_VB1 VDDB VB1 4e-05 +VCM VCM 0 1.5 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 1.65 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN2 VCM VINT 0 1 +EIN VIN1 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN2) - v(VIN1) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C08/gf180/sW2_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW2_sL1.5/case.json new file mode 100644 index 00000000..d81b340f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW2_sL1.5/case.json @@ -0,0 +1,162 @@ +{ + "case_id": "C08_gf180_sW2_sL1.5", + "circuit_id": "C08", + "pdk": "gf180", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "dut_name": "C08_gf180_sW2_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 8.0, + "l": 0.84, + "nf": 16 + }, + "M2": { + "w": 8.0, + "l": 0.84, + "nf": 16 + }, + "M3": { + "w": 8.0, + "l": 0.84, + "nf": 16 + }, + "M4": { + "w": 4.0, + "l": 0.84, + "nf": 8 + }, + "M5": { + "w": 4.0, + "l": 0.84, + "nf": 8 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 4e-05 + } + }, + "load": { + "vcm": 1.5, + "CL": 1e-12, + "inv_input": "VIN2" + }, + "category": "ota", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "659c2ad457b68bce", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/gf180/sW2_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW2_sL1.5/manifest.json new file mode 100644 index 00000000..765a697b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW2_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "991f174f223b4957e4cf7ee6c2190da9d96565f3792e108a66339d589563d6ee", + "qualification.json": "381ca42172722185653e2929e206400d718c7b06eb5694c4753331dfbbec906d", + "specs.json": "feac633eaaba59e93f843f3ee2ce612af3ac0185ff98f18c194b346088db5a12", + "target.spice": "133125443e0af7b318d5196a54c5c9397d53be27e2ab0bca9ad6c9d6b35f8d88", + "target_lvs.spice": "bf246be9d42b50b1c9bded7fcc1a42e743bbd592d23c9640305c9870937cff30", + "testbench.spice": "65aa0f3ef155b1bfd688ffd9eaa2d391ca00deaf91abaea12247375cb62f3839" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/gf180/sW2_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW2_sL1.5/qualification.json new file mode 100644 index 00000000..b3b5b0ea --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW2_sL1.5/qualification.json @@ -0,0 +1,122 @@ +{ + "case_id": "C08_gf180_sW2_sL1.5", + "circuit_id": "C08", + "pdk": "gf180", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "ota", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "659c2ad457b68bce", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 41.92 + }, + "ugf": { + "min": 18230000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 44.9243, + "ugf": 30378520.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vout0": 1.65, + "idd": 3.995612e-05, + "vos": 0.002011632, + "gain_lf": 44.9243, + "ph_lf": 0.127504, + "ugf": 30378520.0, + "ph_ugf": -92.8935, + "f3db": 172103.3, + "pm": 86.978996 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/gf180/sW2_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW2_sL1.5/specs.json new file mode 100644 index 00000000..68720cef --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW2_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 41.92 + }, + "ugf": { + "min": 18230000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 44.9243, + "ugf": 30378520.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/gf180/sW2_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW2_sL1.5/target.spice new file mode 100644 index 00000000..83f87c16 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW2_sL1.5/target.spice @@ -0,0 +1,7 @@ +.subckt C08_gf180_sW2_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VB1 +MM1 net22 VIN1 net23 VSS nfet_03v3 w=8u l=0.84u nf=16 m=1 +MM2 VOUT1 VIN2 net23 VSS nfet_03v3 w=8u l=0.84u nf=16 m=1 +MM3 net23 VB1 VSS VSS nfet_03v3 w=8u l=0.84u nf=16 m=1 +MM4 net22 net22 VDD VDD pfet_03v3 w=4u l=0.84u nf=8 m=1 +MM5 VOUT1 net22 VDD VDD pfet_03v3 w=4u l=0.84u nf=8 m=1 +.ends C08_gf180_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C08/gf180/sW2_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW2_sL1.5/target_lvs.spice new file mode 100644 index 00000000..385798fb --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW2_sL1.5/target_lvs.spice @@ -0,0 +1,66 @@ +.subckt C08_gf180_sW2_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VB1 +MM1_f0 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f1 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f2 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f3 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f4 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f5 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f6 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f7 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f8 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f9 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f10 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f11 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f12 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f13 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f14 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f15 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f0 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f1 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f2 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f3 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f4 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f5 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f6 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f7 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f8 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f9 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f10 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f11 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f12 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f13 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f14 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f15 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f0 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f1 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f2 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f3 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f4 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f5 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f6 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f7 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f8 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f9 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f10 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f11 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f12 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f13 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f14 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f15 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM4_f0 net22 net22 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM4_f1 net22 net22 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM4_f2 net22 net22 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM4_f3 net22 net22 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM4_f4 net22 net22 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM4_f5 net22 net22 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM4_f6 net22 net22 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM4_f7 net22 net22 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM5_f0 VOUT1 net22 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM5_f1 VOUT1 net22 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM5_f2 VOUT1 net22 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM5_f3 VOUT1 net22 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM5_f4 VOUT1 net22 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM5_f5 VOUT1 net22 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM5_f6 VOUT1 net22 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM5_f7 VOUT1 net22 VDD VDD pfet_03v3 w=0.5u l=0.84u +.ends C08_gf180_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C08/gf180/sW2_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW2_sL1.5/testbench.spice new file mode 100644 index 00000000..3afe1af3 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW2_sL1.5/testbench.spice @@ -0,0 +1,36 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VB1 C08_gf180_sW2_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +MB_VB1 VB1 VB1 VSS VSS nfet_03v3 w=8u l=0.84u +IB_VB1 VDDB VB1 4e-05 +VCM VCM 0 1.5 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 1.65 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN2 VCM VINT 0 1 +EIN VIN1 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN2) - v(VIN1) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C08/gf180/sW2_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW2_sL1/case.json new file mode 100644 index 00000000..ba302004 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW2_sL1/case.json @@ -0,0 +1,162 @@ +{ + "case_id": "C08_gf180_sW2_sL1", + "circuit_id": "C08", + "pdk": "gf180", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "dut_name": "C08_gf180_sW2_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 8.0, + "l": 0.56, + "nf": 16 + }, + "M2": { + "w": 8.0, + "l": 0.56, + "nf": 16 + }, + "M3": { + "w": 8.0, + "l": 0.56, + "nf": 16 + }, + "M4": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "M5": { + "w": 4.0, + "l": 0.56, + "nf": 8 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 4e-05 + } + }, + "load": { + "vcm": 1.5, + "CL": 1e-12, + "inv_input": "VIN2" + }, + "category": "ota", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "37e94361ce7b421a", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/gf180/sW2_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW2_sL1/manifest.json new file mode 100644 index 00000000..9824c13d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW2_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "19c2e75ad3766991a72147fca8af4b4a64b94ffcb96bb4e36fc9d8d3ab827758", + "qualification.json": "b643da0bbf0c26ca13e45dbaf4c537d7f5b3fb12b2a2db8348d7c9008d4d6d44", + "specs.json": "c76637cd5c5f56e9f80b8abfe82e17f5b673cfd9db2c0651db5f47172e81d3ea", + "target.spice": "bca49bffbd5b971366cf195b5b005c7c53dd483b25d88b9ef5ddf1c2b97dbf4f", + "target_lvs.spice": "67d5e35d65dd51d8d6dcc21efdd754f9c06efc429537ccdbd8eda8178e534c03", + "testbench.spice": "ddbaa9bbed29e6eaf8dc9ba12fd9e21bb6a2a4fb5b878b50d2abebfba291deb1" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/gf180/sW2_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW2_sL1/qualification.json new file mode 100644 index 00000000..739bfb49 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW2_sL1/qualification.json @@ -0,0 +1,122 @@ +{ + "case_id": "C08_gf180_sW2_sL1", + "circuit_id": "C08", + "pdk": "gf180", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "ota", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "37e94361ce7b421a", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 38.31 + }, + "ugf": { + "min": 23190000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 41.31396, + "ugf": 38648770.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vout0": 1.65, + "idd": 4.47758e-05, + "vos": 0.003887041, + "gain_lf": 41.31396, + "ph_lf": 0.08878371, + "ugf": 38648770.0, + "ph_ugf": -91.91884, + "f3db": 331511.2, + "pm": 87.99237629 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/gf180/sW2_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW2_sL1/specs.json new file mode 100644 index 00000000..1bb8eff5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW2_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 38.31 + }, + "ugf": { + "min": 23190000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 41.31396, + "ugf": 38648770.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/gf180/sW2_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW2_sL1/target.spice new file mode 100644 index 00000000..0a615dff --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW2_sL1/target.spice @@ -0,0 +1,7 @@ +.subckt C08_gf180_sW2_sL1 VDD VSS VIN1 VIN2 VOUT1 VB1 +MM1 net22 VIN1 net23 VSS nfet_03v3 w=8u l=0.56u nf=16 m=1 +MM2 VOUT1 VIN2 net23 VSS nfet_03v3 w=8u l=0.56u nf=16 m=1 +MM3 net23 VB1 VSS VSS nfet_03v3 w=8u l=0.56u nf=16 m=1 +MM4 net22 net22 VDD VDD pfet_03v3 w=4u l=0.56u nf=8 m=1 +MM5 VOUT1 net22 VDD VDD pfet_03v3 w=4u l=0.56u nf=8 m=1 +.ends C08_gf180_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C08/gf180/sW2_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW2_sL1/target_lvs.spice new file mode 100644 index 00000000..6b3ebecc --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW2_sL1/target_lvs.spice @@ -0,0 +1,66 @@ +.subckt C08_gf180_sW2_sL1 VDD VSS VIN1 VIN2 VOUT1 VB1 +MM1_f0 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f1 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f2 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f3 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f4 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f5 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f6 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f7 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f8 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f9 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f10 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f11 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f12 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f13 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f14 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f15 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f0 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f1 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f2 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f3 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f4 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f5 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f6 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f7 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f8 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f9 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f10 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f11 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f12 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f13 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f14 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f15 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f0 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f1 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f2 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f3 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f4 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f5 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f6 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f7 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f8 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f9 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f10 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f11 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f12 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f13 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f14 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f15 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM4_f0 net22 net22 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM4_f1 net22 net22 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM4_f2 net22 net22 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM4_f3 net22 net22 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM4_f4 net22 net22 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM4_f5 net22 net22 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM4_f6 net22 net22 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM4_f7 net22 net22 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM5_f0 VOUT1 net22 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM5_f1 VOUT1 net22 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM5_f2 VOUT1 net22 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM5_f3 VOUT1 net22 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM5_f4 VOUT1 net22 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM5_f5 VOUT1 net22 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM5_f6 VOUT1 net22 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM5_f7 VOUT1 net22 VDD VDD pfet_03v3 w=0.5u l=0.56u +.ends C08_gf180_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C08/gf180/sW2_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW2_sL1/testbench.spice new file mode 100644 index 00000000..12f461f5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW2_sL1/testbench.spice @@ -0,0 +1,36 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VB1 C08_gf180_sW2_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +MB_VB1 VB1 VB1 VSS VSS nfet_03v3 w=8u l=0.56u +IB_VB1 VDDB VB1 4e-05 +VCM VCM 0 1.5 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 1.65 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN2 VCM VINT 0 1 +EIN VIN1 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN2) - v(VIN1) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C08/gf180/sW2_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW2_sL2/case.json new file mode 100644 index 00000000..7f789bae --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW2_sL2/case.json @@ -0,0 +1,162 @@ +{ + "case_id": "C08_gf180_sW2_sL2", + "circuit_id": "C08", + "pdk": "gf180", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "dut_name": "C08_gf180_sW2_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 8.0, + "l": 1.12, + "nf": 16 + }, + "M2": { + "w": 8.0, + "l": 1.12, + "nf": 16 + }, + "M3": { + "w": 8.0, + "l": 1.12, + "nf": 16 + }, + "M4": { + "w": 4.0, + "l": 1.12, + "nf": 8 + }, + "M5": { + "w": 4.0, + "l": 1.12, + "nf": 8 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 4e-05 + } + }, + "load": { + "vcm": 1.5, + "CL": 1e-12, + "inv_input": "VIN2" + }, + "category": "ota", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "c9bb5e751c50b45c", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/gf180/sW2_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW2_sL2/manifest.json new file mode 100644 index 00000000..d4cc98fa --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW2_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "4877f3331f9ac6725e38836b6785f3440002c42ea20921e6b3dc9340bbf289a2", + "qualification.json": "1a3856e3ac05ddecbb478065ec84b01ef22ee504902d517392220c0ef1cb553c", + "specs.json": "7a2a2a6e4f485f370991632b8aaf00d46bd9174fd1b566688fc429da65cf983f", + "target.spice": "7880debb1a22be9ae1a44770c63bb5432a01de2d708e219fb1835589e5fb1dfb", + "target_lvs.spice": "dc024977c3dcc42e305db2b2f75b955fc357530187392ca9a90c4f0cda4ac555", + "testbench.spice": "e0af8e8f92e6ef895850a12fa0b5134f8f17832dca4b6b4962a87fc4a78625ee" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/gf180/sW2_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW2_sL2/qualification.json new file mode 100644 index 00000000..e2635f2a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW2_sL2/qualification.json @@ -0,0 +1,122 @@ +{ + "case_id": "C08_gf180_sW2_sL2", + "circuit_id": "C08", + "pdk": "gf180", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "ota", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "c9bb5e751c50b45c", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 43.52 + }, + "ugf": { + "min": 15510000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 46.51716, + "ugf": 25849390.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vout0": 1.65, + "idd": 3.775778e-05, + "vos": 0.001299616, + "gain_lf": 46.51716, + "ph_lf": 0.1462722, + "ugf": 25849390.0, + "ph_ugf": -93.73535, + "f3db": 122115.8, + "pm": 86.1183778 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/gf180/sW2_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW2_sL2/specs.json new file mode 100644 index 00000000..9006c529 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW2_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 43.52 + }, + "ugf": { + "min": 15510000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 46.51716, + "ugf": 25849390.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/gf180/sW2_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW2_sL2/target.spice new file mode 100644 index 00000000..01083818 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW2_sL2/target.spice @@ -0,0 +1,7 @@ +.subckt C08_gf180_sW2_sL2 VDD VSS VIN1 VIN2 VOUT1 VB1 +MM1 net22 VIN1 net23 VSS nfet_03v3 w=8u l=1.12u nf=16 m=1 +MM2 VOUT1 VIN2 net23 VSS nfet_03v3 w=8u l=1.12u nf=16 m=1 +MM3 net23 VB1 VSS VSS nfet_03v3 w=8u l=1.12u nf=16 m=1 +MM4 net22 net22 VDD VDD pfet_03v3 w=4u l=1.12u nf=8 m=1 +MM5 VOUT1 net22 VDD VDD pfet_03v3 w=4u l=1.12u nf=8 m=1 +.ends C08_gf180_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C08/gf180/sW2_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW2_sL2/target_lvs.spice new file mode 100644 index 00000000..7d1b7377 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW2_sL2/target_lvs.spice @@ -0,0 +1,66 @@ +.subckt C08_gf180_sW2_sL2 VDD VSS VIN1 VIN2 VOUT1 VB1 +MM1_f0 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f1 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f2 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f3 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f4 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f5 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f6 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f7 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f8 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f9 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f10 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f11 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f12 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f13 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f14 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f15 net22 VIN1 net23 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f0 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f1 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f2 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f3 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f4 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f5 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f6 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f7 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f8 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f9 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f10 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f11 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f12 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f13 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f14 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f15 VOUT1 VIN2 net23 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f0 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f1 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f2 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f3 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f4 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f5 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f6 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f7 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f8 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f9 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f10 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f11 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f12 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f13 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f14 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f15 net23 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM4_f0 net22 net22 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM4_f1 net22 net22 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM4_f2 net22 net22 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM4_f3 net22 net22 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM4_f4 net22 net22 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM4_f5 net22 net22 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM4_f6 net22 net22 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM4_f7 net22 net22 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM5_f0 VOUT1 net22 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM5_f1 VOUT1 net22 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM5_f2 VOUT1 net22 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM5_f3 VOUT1 net22 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM5_f4 VOUT1 net22 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM5_f5 VOUT1 net22 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM5_f6 VOUT1 net22 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM5_f7 VOUT1 net22 VDD VDD pfet_03v3 w=0.5u l=1.12u +.ends C08_gf180_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C08/gf180/sW2_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW2_sL2/testbench.spice new file mode 100644 index 00000000..adc50cc7 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/gf180/sW2_sL2/testbench.spice @@ -0,0 +1,36 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VB1 C08_gf180_sW2_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +MB_VB1 VB1 VB1 VSS VSS nfet_03v3 w=8u l=1.12u +IB_VB1 VDDB VB1 4e-05 +VCM VCM 0 1.5 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 1.65 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN2 VCM VINT 0 1 +EIN VIN1 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN2) - v(VIN1) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW0.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW0.5_sL1.5/case.json new file mode 100644 index 00000000..dabc08db --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW0.5_sL1.5/case.json @@ -0,0 +1,162 @@ +{ + "case_id": "C08_ihp130_sW0.5_sL1.5", + "circuit_id": "C08", + "pdk": "ihp130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "dut_name": "C08_ihp130_sW0.5_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.585, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 0.585, + "nf": 4 + }, + "M3": { + "w": 2.0, + "l": 0.585, + "nf": 4 + }, + "M4": { + "w": 1.0, + "l": 0.585, + "nf": 2 + }, + "M5": { + "w": 1.0, + "l": 0.585, + "nf": 2 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 4e-05 + } + }, + "load": { + "vcm": 0.6, + "CL": 1e-12, + "inv_input": "VIN2" + }, + "category": "ota", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.585, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.585, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.585, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.39, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.585, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 2.0, + "l0": 0.39, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.585, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "53f98b713459bcc6", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW0.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW0.5_sL1.5/manifest.json new file mode 100644 index 00000000..165154ed --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW0.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "c1485c1cfec98bedd2ea408dc40db75dbbe6d22fd87b61638032fddf2fa53563", + "qualification.json": "cacf209b4e0912ddebc187e16c68e113ef98098fd47a85598783a487bac63bff", + "specs.json": "4cf943c292c23df02c9c480e262670936d72272ed05bf33499f72e1b9c420ef6", + "target.spice": "2f3ac482a4685570805241e9e2bc58e4b03d9a975ea348b1c4e9fc32638bbdd6", + "target_lvs.spice": "2c1c8f095eac8c822f92c4f1cbc45bc2b7cfab56d70a80cb17921d68730138bf", + "testbench.spice": "f57c8660d20bc2c0a1d03c17718e04e317b6dc3aec59e84263e942c20a035abd" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW0.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW0.5_sL1.5/qualification.json new file mode 100644 index 00000000..fe33ffec --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW0.5_sL1.5/qualification.json @@ -0,0 +1,122 @@ +{ + "case_id": "C08_ihp130_sW0.5_sL1.5", + "circuit_id": "C08", + "pdk": "ihp130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "ota", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.585, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.585, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.585, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.39, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.585, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 2.0, + "l0": 0.39, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.585, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "53f98b713459bcc6", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 12790000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 25.84446, + "ugf": 21318990.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.6, + "schematic_measures": { + "vout0": 0.5999991, + "idd": 2.779222e-05, + "vos": -0.0091125, + "gain_lf": 25.84446, + "ph_lf": 0.01334806, + "ugf": 21318990.0, + "ph_ugf": -88.13613, + "f3db": 1085072.0, + "pm": 91.85052194000001 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW0.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW0.5_sL1.5/specs.json new file mode 100644 index 00000000..d256dcce --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW0.5_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 12790000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 25.84446, + "ugf": 21318990.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW0.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW0.5_sL1.5/target.spice new file mode 100644 index 00000000..5da22587 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW0.5_sL1.5/target.spice @@ -0,0 +1,7 @@ +.subckt C08_ihp130_sW0.5_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VB1 +XM1 net22 VIN1 net23 VSS sg13_lv_nmos w=2u l=0.585u ng=4 m=1 +XM2 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=2u l=0.585u ng=4 m=1 +XM3 net23 VB1 VSS VSS sg13_lv_nmos w=2u l=0.585u ng=4 m=1 +XM4 net22 net22 VDD VDD sg13_lv_pmos w=1u l=0.585u ng=2 m=1 +XM5 VOUT1 net22 VDD VDD sg13_lv_pmos w=1u l=0.585u ng=2 m=1 +.ends C08_ihp130_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW0.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW0.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..5fd10e4d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW0.5_sL1.5/target_lvs.spice @@ -0,0 +1,18 @@ +.subckt C08_ihp130_sW0.5_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VB1 +XM1_f0 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.585u +XM1_f1 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.585u +XM1_f2 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.585u +XM1_f3 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.585u +XM2_f0 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.585u +XM2_f1 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.585u +XM2_f2 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.585u +XM2_f3 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.585u +XM3_f0 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.585u +XM3_f1 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.585u +XM3_f2 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.585u +XM3_f3 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.585u +XM4_f0 net22 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.585u +XM4_f1 net22 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.585u +XM5_f0 VOUT1 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.585u +XM5_f1 VOUT1 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.585u +.ends C08_ihp130_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW0.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW0.5_sL1.5/testbench.spice new file mode 100644 index 00000000..3533ebcd --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW0.5_sL1.5/testbench.spice @@ -0,0 +1,36 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VB1 C08_ihp130_sW0.5_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +XB_VB1 VB1 VB1 VSS VSS sg13_lv_nmos w=2u l=0.585u +IB_VB1 VDDB VB1 4e-05 +VCM VCM 0 0.6 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 0.6 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN2 VCM VINT 0 1 +EIN VIN1 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN2) - v(VIN1) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW0.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW0.5_sL1/case.json new file mode 100644 index 00000000..a0bc042e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW0.5_sL1/case.json @@ -0,0 +1,162 @@ +{ + "case_id": "C08_ihp130_sW0.5_sL1", + "circuit_id": "C08", + "pdk": "ihp130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "dut_name": "C08_ihp130_sW0.5_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.39, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 0.39, + "nf": 4 + }, + "M3": { + "w": 2.0, + "l": 0.39, + "nf": 4 + }, + "M4": { + "w": 1.0, + "l": 0.39, + "nf": 2 + }, + "M5": { + "w": 1.0, + "l": 0.39, + "nf": 2 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 4e-05 + } + }, + "load": { + "vcm": 0.6, + "CL": 1e-12, + "inv_input": "VIN2" + }, + "category": "ota", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.39, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.39, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.39, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.39, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "749950b295caac87", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW0.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW0.5_sL1/manifest.json new file mode 100644 index 00000000..1f28c6d9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW0.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "dc0e05436b54c2adfec97a8fa3a7c1315ae0d05f1d50a14d3b771d655d34d611", + "qualification.json": "a53b33cdb297addf6f6ae13771264080a3a03b30214bb3b81dfd130cb192e45c", + "specs.json": "2dd7a3203bbca632f2fb04e94fdc86ea83ebfa514dbdddd8c82eaea7d3b939e3", + "target.spice": "ee11248e04243e82c1368e751928f93b022587d5dc8a4969e552f525f5dafa9b", + "target_lvs.spice": "1607605e9b38b4126d7446dd67412dd1fc6dd6ceb4d1aa8a744d12fec18e1899", + "testbench.spice": "075210105d4d3cd85765ede61ce4ea569d9aaa2d47d047e24f53158b7d5bcd36" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW0.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW0.5_sL1/qualification.json new file mode 100644 index 00000000..db9f1257 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW0.5_sL1/qualification.json @@ -0,0 +1,124 @@ +{ + "case_id": "C08_ihp130_sW0.5_sL1", + "circuit_id": "C08", + "pdk": "ihp130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "ota", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.39, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.39, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.39, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.39, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "749950b295caac87", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "gain_lf=24.93 below floor 25" + ], + "spec": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 14620000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 24.92868, + "ugf": 24369370.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.6, + "schematic_measures": { + "vout0": 0.5999993, + "idd": 2.790715e-05, + "vos": -0.00661216, + "gain_lf": 24.92868, + "ph_lf": 0.0123724, + "ugf": 24369370.0, + "ph_ugf": -87.4555, + "f3db": 1378959.0, + "pm": 92.5321276 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW0.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW0.5_sL1/specs.json new file mode 100644 index 00000000..b015a791 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW0.5_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 14620000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 24.92868, + "ugf": 24369370.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW0.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW0.5_sL1/target.spice new file mode 100644 index 00000000..527a3ece --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW0.5_sL1/target.spice @@ -0,0 +1,7 @@ +.subckt C08_ihp130_sW0.5_sL1 VDD VSS VIN1 VIN2 VOUT1 VB1 +XM1 net22 VIN1 net23 VSS sg13_lv_nmos w=2u l=0.39u ng=4 m=1 +XM2 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=2u l=0.39u ng=4 m=1 +XM3 net23 VB1 VSS VSS sg13_lv_nmos w=2u l=0.39u ng=4 m=1 +XM4 net22 net22 VDD VDD sg13_lv_pmos w=1u l=0.39u ng=2 m=1 +XM5 VOUT1 net22 VDD VDD sg13_lv_pmos w=1u l=0.39u ng=2 m=1 +.ends C08_ihp130_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW0.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW0.5_sL1/target_lvs.spice new file mode 100644 index 00000000..ced6125e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW0.5_sL1/target_lvs.spice @@ -0,0 +1,18 @@ +.subckt C08_ihp130_sW0.5_sL1 VDD VSS VIN1 VIN2 VOUT1 VB1 +XM1_f0 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f1 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f2 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f3 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f0 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f1 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f2 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f3 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f0 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f1 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f2 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f3 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f0 net22 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f1 net22 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f0 VOUT1 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f1 VOUT1 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +.ends C08_ihp130_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW0.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW0.5_sL1/testbench.spice new file mode 100644 index 00000000..6e2e1ea5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW0.5_sL1/testbench.spice @@ -0,0 +1,36 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VB1 C08_ihp130_sW0.5_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +XB_VB1 VB1 VB1 VSS VSS sg13_lv_nmos w=2u l=0.39u +IB_VB1 VDDB VB1 4e-05 +VCM VCM 0 0.6 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 0.6 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN2 VCM VINT 0 1 +EIN VIN1 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN2) - v(VIN1) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW0.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW0.5_sL2/case.json new file mode 100644 index 00000000..c3d3f61e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW0.5_sL2/case.json @@ -0,0 +1,162 @@ +{ + "case_id": "C08_ihp130_sW0.5_sL2", + "circuit_id": "C08", + "pdk": "ihp130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "dut_name": "C08_ihp130_sW0.5_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.78, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 0.78, + "nf": 4 + }, + "M3": { + "w": 2.0, + "l": 0.78, + "nf": 4 + }, + "M4": { + "w": 1.0, + "l": 0.78, + "nf": 2 + }, + "M5": { + "w": 1.0, + "l": 0.78, + "nf": 2 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 4e-05 + } + }, + "load": { + "vcm": 0.6, + "CL": 1e-12, + "inv_input": "VIN2" + }, + "category": "ota", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.78, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.78, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.78, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.39, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.78, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.39, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.78, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "d67ac26c94abfeba", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW0.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW0.5_sL2/manifest.json new file mode 100644 index 00000000..44118ebb --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW0.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "bab413c50d61b4946e0a3d1f87695827ea214edadf4a29f79de1b9d74d4079f2", + "qualification.json": "2f427460861ead7384e6976c91776be53742feb94a1d36738357395636704a38", + "specs.json": "704f27fae0627e41a5a2933d7d807b0d34e20b2bbee117a12a4e0734db6a0620", + "target.spice": "0d35e3803bafc75c97155a21c496a4eb0c7edf51c00051bf7fbac414fd5ac42e", + "target_lvs.spice": "51153ef4317946a9851da5792aea63639caa43bd2a20efe2fa5efc90326af4e4", + "testbench.spice": "d2e7ddc0da023ff029629e2074539bd7a3d209b3be5148ad4aa51947920740a2" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW0.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW0.5_sL2/qualification.json new file mode 100644 index 00000000..f2d05005 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW0.5_sL2/qualification.json @@ -0,0 +1,122 @@ +{ + "case_id": "C08_ihp130_sW0.5_sL2", + "circuit_id": "C08", + "pdk": "ihp130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "ota", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.78, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.78, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.78, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.39, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.78, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.39, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.78, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "d67ac26c94abfeba", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 11010000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 26.30932, + "ugf": 18351520.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.5, + "schematic_measures": { + "vout0": 0.5999989, + "idd": 2.6294e-05, + "vos": -0.0108065, + "gain_lf": 26.30932, + "ph_lf": 0.01353739, + "ugf": 18351520.0, + "ph_ugf": -88.65026, + "f3db": 885664.7, + "pm": 91.33620261 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW0.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW0.5_sL2/specs.json new file mode 100644 index 00000000..ec9d7f70 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW0.5_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 11010000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 26.30932, + "ugf": 18351520.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW0.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW0.5_sL2/target.spice new file mode 100644 index 00000000..385dac42 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW0.5_sL2/target.spice @@ -0,0 +1,7 @@ +.subckt C08_ihp130_sW0.5_sL2 VDD VSS VIN1 VIN2 VOUT1 VB1 +XM1 net22 VIN1 net23 VSS sg13_lv_nmos w=2u l=0.78u ng=4 m=1 +XM2 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=2u l=0.78u ng=4 m=1 +XM3 net23 VB1 VSS VSS sg13_lv_nmos w=2u l=0.78u ng=4 m=1 +XM4 net22 net22 VDD VDD sg13_lv_pmos w=1u l=0.78u ng=2 m=1 +XM5 VOUT1 net22 VDD VDD sg13_lv_pmos w=1u l=0.78u ng=2 m=1 +.ends C08_ihp130_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW0.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW0.5_sL2/target_lvs.spice new file mode 100644 index 00000000..c4f9dcf1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW0.5_sL2/target_lvs.spice @@ -0,0 +1,18 @@ +.subckt C08_ihp130_sW0.5_sL2 VDD VSS VIN1 VIN2 VOUT1 VB1 +XM1_f0 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.78u +XM1_f1 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.78u +XM1_f2 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.78u +XM1_f3 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.78u +XM2_f0 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.78u +XM2_f1 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.78u +XM2_f2 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.78u +XM2_f3 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f0 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f1 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f2 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f3 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM4_f0 net22 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM4_f1 net22 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM5_f0 VOUT1 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM5_f1 VOUT1 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +.ends C08_ihp130_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW0.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW0.5_sL2/testbench.spice new file mode 100644 index 00000000..34ea3342 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW0.5_sL2/testbench.spice @@ -0,0 +1,36 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VB1 C08_ihp130_sW0.5_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +XB_VB1 VB1 VB1 VSS VSS sg13_lv_nmos w=2u l=0.78u +IB_VB1 VDDB VB1 4e-05 +VCM VCM 0 0.6 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 0.6 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN2 VCM VINT 0 1 +EIN VIN1 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN2) - v(VIN1) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1.5_sL1.5/case.json new file mode 100644 index 00000000..e650e8e9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1.5_sL1.5/case.json @@ -0,0 +1,162 @@ +{ + "case_id": "C08_ihp130_sW1.5_sL1.5", + "circuit_id": "C08", + "pdk": "ihp130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "dut_name": "C08_ihp130_sW1.5_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 6.0, + "l": 0.585, + "nf": 12 + }, + "M2": { + "w": 6.0, + "l": 0.585, + "nf": 12 + }, + "M3": { + "w": 6.0, + "l": 0.585, + "nf": 12 + }, + "M4": { + "w": 3.0, + "l": 0.585, + "nf": 6 + }, + "M5": { + "w": 3.0, + "l": 0.585, + "nf": 6 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 4e-05 + } + }, + "load": { + "vcm": 0.6, + "CL": 1e-12, + "inv_input": "VIN2" + }, + "category": "ota", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.585, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.585, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.585, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.39, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.585, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 2.0, + "l0": 0.39, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.585, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "ad8cd836f536beef", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1.5_sL1.5/manifest.json new file mode 100644 index 00000000..e059ff97 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "d389bfd28a5171dca0bc73e8b3d09bbb373d35f97b8f60cf4e1ad8c2aba2d774", + "qualification.json": "9bd34028c7a3834f4de2927015596e8d70acaafcb6f24487d8cc941f946f25d9", + "specs.json": "e2f71d9e13d9590e26bf0c94e8a3d80dfe917d1e69b8d4febca2390e13b11546", + "target.spice": "51de012ab5d55f8f87126a9f214df99a1345b2765dccc6f4bdeecb297872a16b", + "target_lvs.spice": "c4641a215206531a9b3193aece5528736708a2d88cd2812409b7c36b019ab035", + "testbench.spice": "a2ecad04f7ad93d35e19a6e9d7afacefb58cf41b5d0c7bfacf62379e074eb4b3" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1.5_sL1.5/qualification.json new file mode 100644 index 00000000..281046d7 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1.5_sL1.5/qualification.json @@ -0,0 +1,122 @@ +{ + "case_id": "C08_ihp130_sW1.5_sL1.5", + "circuit_id": "C08", + "pdk": "ihp130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "ota", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.585, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.585, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.585, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.39, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.585, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 2.0, + "l0": 0.39, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.585, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "ad8cd836f536beef", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 19170000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 26.32609, + "ugf": 31952060.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 1.4, + "schematic_measures": { + "vout0": 0.6000001, + "idd": 2.668031e-05, + "vos": 0.0005374781, + "gain_lf": 26.32609, + "ph_lf": 0.01522783, + "ugf": 31952060.0, + "ph_ugf": -89.66261, + "f3db": 1541715.0, + "pm": 90.32216217 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1.5_sL1.5/specs.json new file mode 100644 index 00000000..a87e322a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1.5_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 19170000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 26.32609, + "ugf": 31952060.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1.5_sL1.5/target.spice new file mode 100644 index 00000000..617900cd --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1.5_sL1.5/target.spice @@ -0,0 +1,7 @@ +.subckt C08_ihp130_sW1.5_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VB1 +XM1 net22 VIN1 net23 VSS sg13_lv_nmos w=6u l=0.585u ng=12 m=1 +XM2 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=6u l=0.585u ng=12 m=1 +XM3 net23 VB1 VSS VSS sg13_lv_nmos w=6u l=0.585u ng=12 m=1 +XM4 net22 net22 VDD VDD sg13_lv_pmos w=3u l=0.585u ng=6 m=1 +XM5 VOUT1 net22 VDD VDD sg13_lv_pmos w=3u l=0.585u ng=6 m=1 +.ends C08_ihp130_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..1bc80369 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1.5_sL1.5/target_lvs.spice @@ -0,0 +1,50 @@ +.subckt C08_ihp130_sW1.5_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VB1 +XM1_f0 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.585u +XM1_f1 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.585u +XM1_f2 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.585u +XM1_f3 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.585u +XM1_f4 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.585u +XM1_f5 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.585u +XM1_f6 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.585u +XM1_f7 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.585u +XM1_f8 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.585u +XM1_f9 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.585u +XM1_f10 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.585u +XM1_f11 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.585u +XM2_f0 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.585u +XM2_f1 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.585u +XM2_f2 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.585u +XM2_f3 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.585u +XM2_f4 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.585u +XM2_f5 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.585u +XM2_f6 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.585u +XM2_f7 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.585u +XM2_f8 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.585u +XM2_f9 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.585u +XM2_f10 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.585u +XM2_f11 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.585u +XM3_f0 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.585u +XM3_f1 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.585u +XM3_f2 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.585u +XM3_f3 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.585u +XM3_f4 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.585u +XM3_f5 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.585u +XM3_f6 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.585u +XM3_f7 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.585u +XM3_f8 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.585u +XM3_f9 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.585u +XM3_f10 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.585u +XM3_f11 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.585u +XM4_f0 net22 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.585u +XM4_f1 net22 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.585u +XM4_f2 net22 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.585u +XM4_f3 net22 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.585u +XM4_f4 net22 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.585u +XM4_f5 net22 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.585u +XM5_f0 VOUT1 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.585u +XM5_f1 VOUT1 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.585u +XM5_f2 VOUT1 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.585u +XM5_f3 VOUT1 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.585u +XM5_f4 VOUT1 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.585u +XM5_f5 VOUT1 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.585u +.ends C08_ihp130_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1.5_sL1.5/testbench.spice new file mode 100644 index 00000000..a1021f22 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1.5_sL1.5/testbench.spice @@ -0,0 +1,36 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VB1 C08_ihp130_sW1.5_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +XB_VB1 VB1 VB1 VSS VSS sg13_lv_nmos w=6u l=0.585u +IB_VB1 VDDB VB1 4e-05 +VCM VCM 0 0.6 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 0.6 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN2 VCM VINT 0 1 +EIN VIN1 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN2) - v(VIN1) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1.5_sL1/case.json new file mode 100644 index 00000000..1b24ccfc --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1.5_sL1/case.json @@ -0,0 +1,162 @@ +{ + "case_id": "C08_ihp130_sW1.5_sL1", + "circuit_id": "C08", + "pdk": "ihp130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "dut_name": "C08_ihp130_sW1.5_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 6.0, + "l": 0.39, + "nf": 12 + }, + "M2": { + "w": 6.0, + "l": 0.39, + "nf": 12 + }, + "M3": { + "w": 6.0, + "l": 0.39, + "nf": 12 + }, + "M4": { + "w": 3.0, + "l": 0.39, + "nf": 6 + }, + "M5": { + "w": 3.0, + "l": 0.39, + "nf": 6 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 4e-05 + } + }, + "load": { + "vcm": 0.6, + "CL": 1e-12, + "inv_input": "VIN2" + }, + "category": "ota", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.39, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.39, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.39, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.39, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.39, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.39, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.39, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "9552d7593fa18ddc", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1.5_sL1/manifest.json new file mode 100644 index 00000000..b5520673 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "ebe58a4dc5df47232fa6fdc03e49abec4a00ee00345186f8118aa0d073f288d5", + "qualification.json": "002b4a0abd4bd5d091a0265a7b4d7c7f851729a295e82a3ba99b16077a3e0292", + "specs.json": "fa792f8d1b05dd2987c7c9845e923b20840e9529b8b36c4043971f3e7872e8a8", + "target.spice": "56b92271feca94386436c60f7159d8b3d6f0dbb656da2929cc734eaf2daf727c", + "target_lvs.spice": "6bae094557414495aa31d52c00d23331c50b0ef7d88db25324a78795f4cfe88e", + "testbench.spice": "f160ca97ce3515922d6679dde7888885343b4288b730a0383afa08ee7cc66bfa" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1.5_sL1/qualification.json new file mode 100644 index 00000000..7d35b76b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1.5_sL1/qualification.json @@ -0,0 +1,122 @@ +{ + "case_id": "C08_ihp130_sW1.5_sL1", + "circuit_id": "C08", + "pdk": "ihp130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "ota", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.39, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.39, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.39, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.39, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.39, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.39, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.39, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "9552d7593fa18ddc", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 19680000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 25.00595, + "ugf": 32807890.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 1.9, + "schematic_measures": { + "vout0": 0.6000003, + "idd": 2.426154e-05, + "vos": 0.002842062, + "gain_lf": 25.00595, + "ph_lf": 0.0131306, + "ugf": 32807890.0, + "ph_ugf": -88.43947, + "f3db": 1840752.0, + "pm": 91.5473994 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1.5_sL1/specs.json new file mode 100644 index 00000000..483f591d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1.5_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 19680000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 25.00595, + "ugf": 32807890.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1.5_sL1/target.spice new file mode 100644 index 00000000..1bf5f7e3 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1.5_sL1/target.spice @@ -0,0 +1,7 @@ +.subckt C08_ihp130_sW1.5_sL1 VDD VSS VIN1 VIN2 VOUT1 VB1 +XM1 net22 VIN1 net23 VSS sg13_lv_nmos w=6u l=0.39u ng=12 m=1 +XM2 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=6u l=0.39u ng=12 m=1 +XM3 net23 VB1 VSS VSS sg13_lv_nmos w=6u l=0.39u ng=12 m=1 +XM4 net22 net22 VDD VDD sg13_lv_pmos w=3u l=0.39u ng=6 m=1 +XM5 VOUT1 net22 VDD VDD sg13_lv_pmos w=3u l=0.39u ng=6 m=1 +.ends C08_ihp130_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1.5_sL1/target_lvs.spice new file mode 100644 index 00000000..04d52c9c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1.5_sL1/target_lvs.spice @@ -0,0 +1,50 @@ +.subckt C08_ihp130_sW1.5_sL1 VDD VSS VIN1 VIN2 VOUT1 VB1 +XM1_f0 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f1 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f2 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f3 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f4 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f5 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f6 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f7 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f8 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f9 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f10 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f11 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f0 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f1 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f2 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f3 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f4 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f5 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f6 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f7 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f8 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f9 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f10 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f11 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f0 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f1 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f2 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f3 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f4 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f5 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f6 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f7 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f8 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f9 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f10 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f11 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f0 net22 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f1 net22 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f2 net22 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f3 net22 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f4 net22 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f5 net22 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f0 VOUT1 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f1 VOUT1 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f2 VOUT1 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f3 VOUT1 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f4 VOUT1 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f5 VOUT1 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +.ends C08_ihp130_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1.5_sL1/testbench.spice new file mode 100644 index 00000000..e399d0d5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1.5_sL1/testbench.spice @@ -0,0 +1,36 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VB1 C08_ihp130_sW1.5_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +XB_VB1 VB1 VB1 VSS VSS sg13_lv_nmos w=6u l=0.39u +IB_VB1 VDDB VB1 4e-05 +VCM VCM 0 0.6 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 0.6 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN2 VCM VINT 0 1 +EIN VIN1 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN2) - v(VIN1) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1.5_sL2/case.json new file mode 100644 index 00000000..a76165cc --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1.5_sL2/case.json @@ -0,0 +1,162 @@ +{ + "case_id": "C08_ihp130_sW1.5_sL2", + "circuit_id": "C08", + "pdk": "ihp130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "dut_name": "C08_ihp130_sW1.5_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 6.0, + "l": 0.78, + "nf": 12 + }, + "M2": { + "w": 6.0, + "l": 0.78, + "nf": 12 + }, + "M3": { + "w": 6.0, + "l": 0.78, + "nf": 12 + }, + "M4": { + "w": 3.0, + "l": 0.78, + "nf": 6 + }, + "M5": { + "w": 3.0, + "l": 0.78, + "nf": 6 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 4e-05 + } + }, + "load": { + "vcm": 0.6, + "CL": 1e-12, + "inv_input": "VIN2" + }, + "category": "ota", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.78, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.78, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.78, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.39, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.78, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.39, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.78, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "e3670a45183a2b3e", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1.5_sL2/manifest.json new file mode 100644 index 00000000..0f3cb415 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "58c1869611f4c7de26f3a665daa30c6d1253148f9b103ef9bef8003c3f58e7ea", + "qualification.json": "4f96025e56d57474d99e8dd629036969a0424282343211e8d5301ff67f41e9a1", + "specs.json": "655c83e7268758e05b095f8d6483a9bec4098c82c492d0c00dc552fc5260a7e3", + "target.spice": "f1a4450eed99365e019f8283897ff921b4a700271d29bdf55205feb0bfaed5e9", + "target_lvs.spice": "6e2bdd8f6349f63ec7ff4ad9e09c5f53885d9305c697c46be987c1d272f021f1", + "testbench.spice": "98fe261975b73ac2594404b71ccddb6f889d809a6dfbb24dca7ee8da73634f50" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1.5_sL2/qualification.json new file mode 100644 index 00000000..e49f814d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1.5_sL2/qualification.json @@ -0,0 +1,122 @@ +{ + "case_id": "C08_ihp130_sW1.5_sL2", + "circuit_id": "C08", + "pdk": "ihp130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "ota", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.78, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.78, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.78, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.39, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.78, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.39, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.78, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "e3670a45183a2b3e", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 18270000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 27.21287, + "ugf": 30442040.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 1.5, + "schematic_measures": { + "vout0": 0.5999999, + "idd": 2.797448e-05, + "vos": -0.00109955, + "gain_lf": 27.21287, + "ph_lf": 0.01669147, + "ugf": 30442040.0, + "ph_ugf": -90.73779, + "f3db": 1326164.0, + "pm": 89.24551853 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1.5_sL2/specs.json new file mode 100644 index 00000000..de57a3d9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1.5_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 18270000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 27.21287, + "ugf": 30442040.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1.5_sL2/target.spice new file mode 100644 index 00000000..5b7a4824 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1.5_sL2/target.spice @@ -0,0 +1,7 @@ +.subckt C08_ihp130_sW1.5_sL2 VDD VSS VIN1 VIN2 VOUT1 VB1 +XM1 net22 VIN1 net23 VSS sg13_lv_nmos w=6u l=0.78u ng=12 m=1 +XM2 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=6u l=0.78u ng=12 m=1 +XM3 net23 VB1 VSS VSS sg13_lv_nmos w=6u l=0.78u ng=12 m=1 +XM4 net22 net22 VDD VDD sg13_lv_pmos w=3u l=0.78u ng=6 m=1 +XM5 VOUT1 net22 VDD VDD sg13_lv_pmos w=3u l=0.78u ng=6 m=1 +.ends C08_ihp130_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1.5_sL2/target_lvs.spice new file mode 100644 index 00000000..0c4e4b76 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1.5_sL2/target_lvs.spice @@ -0,0 +1,50 @@ +.subckt C08_ihp130_sW1.5_sL2 VDD VSS VIN1 VIN2 VOUT1 VB1 +XM1_f0 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.78u +XM1_f1 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.78u +XM1_f2 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.78u +XM1_f3 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.78u +XM1_f4 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.78u +XM1_f5 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.78u +XM1_f6 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.78u +XM1_f7 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.78u +XM1_f8 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.78u +XM1_f9 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.78u +XM1_f10 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.78u +XM1_f11 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.78u +XM2_f0 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.78u +XM2_f1 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.78u +XM2_f2 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.78u +XM2_f3 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.78u +XM2_f4 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.78u +XM2_f5 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.78u +XM2_f6 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.78u +XM2_f7 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.78u +XM2_f8 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.78u +XM2_f9 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.78u +XM2_f10 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.78u +XM2_f11 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f0 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f1 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f2 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f3 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f4 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f5 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f6 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f7 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f8 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f9 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f10 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f11 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM4_f0 net22 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM4_f1 net22 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM4_f2 net22 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM4_f3 net22 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM4_f4 net22 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM4_f5 net22 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM5_f0 VOUT1 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM5_f1 VOUT1 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM5_f2 VOUT1 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM5_f3 VOUT1 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM5_f4 VOUT1 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM5_f5 VOUT1 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +.ends C08_ihp130_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1.5_sL2/testbench.spice new file mode 100644 index 00000000..b066921f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1.5_sL2/testbench.spice @@ -0,0 +1,36 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VB1 C08_ihp130_sW1.5_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +XB_VB1 VB1 VB1 VSS VSS sg13_lv_nmos w=6u l=0.78u +IB_VB1 VDDB VB1 4e-05 +VCM VCM 0 0.6 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 0.6 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN2 VCM VINT 0 1 +EIN VIN1 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN2) - v(VIN1) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1_sL1.5/case.json new file mode 100644 index 00000000..49bf8ef5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1_sL1.5/case.json @@ -0,0 +1,162 @@ +{ + "case_id": "C08_ihp130_sW1_sL1.5", + "circuit_id": "C08", + "pdk": "ihp130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "dut_name": "C08_ihp130_sW1_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.585, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 0.585, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 0.585, + "nf": 8 + }, + "M4": { + "w": 2.0, + "l": 0.585, + "nf": 4 + }, + "M5": { + "w": 2.0, + "l": 0.585, + "nf": 4 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 4e-05 + } + }, + "load": { + "vcm": 0.6, + "CL": 1e-12, + "inv_input": "VIN2" + }, + "category": "ota", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.585, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.585, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.585, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.39, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.585, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 2.0, + "l0": 0.39, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.585, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "0a402a64f4f7ae60", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1_sL1.5/manifest.json new file mode 100644 index 00000000..ec51b01f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "ee5b8a81daeb3272e1f8cff1b2932b1a1e6dcad541e4cb4302a7948f4d04a1c6", + "qualification.json": "d40a707a7a496ad6c7105eaa5f6f0a441d0238f9056542d31d2149afd2b6c654", + "specs.json": "f460812ac0fe8e45ee406f65ece9ae212fa8427baad8fa3058e7a738630644b7", + "target.spice": "fe836dbf4e2fd139196291da1b7f7cb3ec2c18f22cecaa189a3a87c63e178547", + "target_lvs.spice": "049e80c007c8006106893e69f9cf337c6cbbedcbe50c25976016524102eba38b", + "testbench.spice": "94c798944b46f6a41d30aea75010ff35df7673f1b137c51b801de15d511c0c3c" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1_sL1.5/qualification.json new file mode 100644 index 00000000..6bc417fa --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1_sL1.5/qualification.json @@ -0,0 +1,122 @@ +{ + "case_id": "C08_ihp130_sW1_sL1.5", + "circuit_id": "C08", + "pdk": "ihp130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "ota", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.585, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.585, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.585, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.39, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.585, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 2.0, + "l0": 0.39, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.585, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "0a402a64f4f7ae60", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 17640000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 26.3514, + "ugf": 29403360.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 1.6, + "schematic_measures": { + "vout0": 0.5999997, + "idd": 2.921485e-05, + "vos": -0.0028096, + "gain_lf": 26.3514, + "ph_lf": 0.01505258, + "ugf": 29403360.0, + "ph_ugf": -89.00909, + "f3db": 1412325.0, + "pm": 90.97585742 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1_sL1.5/specs.json new file mode 100644 index 00000000..ce2c5d23 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 17640000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 26.3514, + "ugf": 29403360.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1_sL1.5/target.spice new file mode 100644 index 00000000..51781091 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1_sL1.5/target.spice @@ -0,0 +1,7 @@ +.subckt C08_ihp130_sW1_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VB1 +XM1 net22 VIN1 net23 VSS sg13_lv_nmos w=4u l=0.585u ng=8 m=1 +XM2 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=4u l=0.585u ng=8 m=1 +XM3 net23 VB1 VSS VSS sg13_lv_nmos w=4u l=0.585u ng=8 m=1 +XM4 net22 net22 VDD VDD sg13_lv_pmos w=2u l=0.585u ng=4 m=1 +XM5 VOUT1 net22 VDD VDD sg13_lv_pmos w=2u l=0.585u ng=4 m=1 +.ends C08_ihp130_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1_sL1.5/target_lvs.spice new file mode 100644 index 00000000..839ff2da --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1_sL1.5/target_lvs.spice @@ -0,0 +1,34 @@ +.subckt C08_ihp130_sW1_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VB1 +XM1_f0 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.585u +XM1_f1 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.585u +XM1_f2 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.585u +XM1_f3 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.585u +XM1_f4 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.585u +XM1_f5 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.585u +XM1_f6 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.585u +XM1_f7 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.585u +XM2_f0 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.585u +XM2_f1 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.585u +XM2_f2 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.585u +XM2_f3 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.585u +XM2_f4 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.585u +XM2_f5 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.585u +XM2_f6 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.585u +XM2_f7 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.585u +XM3_f0 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.585u +XM3_f1 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.585u +XM3_f2 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.585u +XM3_f3 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.585u +XM3_f4 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.585u +XM3_f5 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.585u +XM3_f6 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.585u +XM3_f7 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.585u +XM4_f0 net22 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.585u +XM4_f1 net22 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.585u +XM4_f2 net22 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.585u +XM4_f3 net22 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.585u +XM5_f0 VOUT1 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.585u +XM5_f1 VOUT1 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.585u +XM5_f2 VOUT1 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.585u +XM5_f3 VOUT1 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.585u +.ends C08_ihp130_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1_sL1.5/testbench.spice new file mode 100644 index 00000000..92ed743a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1_sL1.5/testbench.spice @@ -0,0 +1,36 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VB1 C08_ihp130_sW1_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +XB_VB1 VB1 VB1 VSS VSS sg13_lv_nmos w=4u l=0.585u +IB_VB1 VDDB VB1 4e-05 +VCM VCM 0 0.6 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 0.6 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN2 VCM VINT 0 1 +EIN VIN1 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN2) - v(VIN1) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1_sL1/case.json new file mode 100644 index 00000000..dc522516 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1_sL1/case.json @@ -0,0 +1,162 @@ +{ + "case_id": "C08_ihp130_sW1_sL1", + "circuit_id": "C08", + "pdk": "ihp130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "dut_name": "C08_ihp130_sW1_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.39, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 0.39, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 0.39, + "nf": 8 + }, + "M4": { + "w": 2.0, + "l": 0.39, + "nf": 4 + }, + "M5": { + "w": 2.0, + "l": 0.39, + "nf": 4 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 4e-05 + } + }, + "load": { + "vcm": 0.6, + "CL": 1e-12, + "inv_input": "VIN2" + }, + "category": "ota", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.39, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.39, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "eb3cf902919b635b", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1_sL1/manifest.json new file mode 100644 index 00000000..64a58e9b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "84423bf7247b3538c26aebd34eab4429e07e8167a2884affb2d2cc371cf45d02", + "qualification.json": "798a405d9f1876317656652e5acdc25e86bb43ce30635c2ff00f65da968389f1", + "specs.json": "d5cb41722f07a80e0663e4ec2e28ead0ca4f5c1a93771a7216fbc469fd48b4f8", + "target.spice": "aeb9a9fb2840f346894ffe6771ede0c67967e006ff7e3032952a4f108de394bd", + "target_lvs.spice": "a02f4bfd6378a376220af5d17bec819c269731bbf2c6e03d24fee1d27ec93f17", + "testbench.spice": "c7f25d3dc6839f47479c716a8e24c4c36e898c7034945df6dd3c23172030cb3f" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1_sL1/qualification.json new file mode 100644 index 00000000..3afb1306 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1_sL1/qualification.json @@ -0,0 +1,122 @@ +{ + "case_id": "C08_ihp130_sW1_sL1", + "circuit_id": "C08", + "pdk": "ihp130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "ota", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.39, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.39, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "eb3cf902919b635b", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 18630000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 25.09325, + "ugf": 31051350.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 1.1, + "schematic_measures": { + "vout0": 0.6, + "idd": 2.712371e-05, + "vos": -0.000394234, + "gain_lf": 25.09325, + "ph_lf": 0.01316656, + "ugf": 31051350.0, + "ph_ugf": -88.01592, + "f3db": 1725048.0, + "pm": 91.97091344 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1_sL1/specs.json new file mode 100644 index 00000000..0a1ba63b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 18630000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 25.09325, + "ugf": 31051350.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1_sL1/target.spice new file mode 100644 index 00000000..3a4f06b4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1_sL1/target.spice @@ -0,0 +1,7 @@ +.subckt C08_ihp130_sW1_sL1 VDD VSS VIN1 VIN2 VOUT1 VB1 +XM1 net22 VIN1 net23 VSS sg13_lv_nmos w=4u l=0.39u ng=8 m=1 +XM2 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=4u l=0.39u ng=8 m=1 +XM3 net23 VB1 VSS VSS sg13_lv_nmos w=4u l=0.39u ng=8 m=1 +XM4 net22 net22 VDD VDD sg13_lv_pmos w=2u l=0.39u ng=4 m=1 +XM5 VOUT1 net22 VDD VDD sg13_lv_pmos w=2u l=0.39u ng=4 m=1 +.ends C08_ihp130_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1_sL1/target_lvs.spice new file mode 100644 index 00000000..e7d0d102 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1_sL1/target_lvs.spice @@ -0,0 +1,34 @@ +.subckt C08_ihp130_sW1_sL1 VDD VSS VIN1 VIN2 VOUT1 VB1 +XM1_f0 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f1 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f2 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f3 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f4 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f5 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f6 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f7 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f0 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f1 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f2 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f3 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f4 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f5 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f6 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f7 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f0 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f1 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f2 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f3 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f4 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f5 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f6 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f7 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f0 net22 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f1 net22 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f2 net22 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f3 net22 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f0 VOUT1 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f1 VOUT1 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f2 VOUT1 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f3 VOUT1 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +.ends C08_ihp130_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1_sL1/testbench.spice new file mode 100644 index 00000000..5e5019d2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1_sL1/testbench.spice @@ -0,0 +1,36 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VB1 C08_ihp130_sW1_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +XB_VB1 VB1 VB1 VSS VSS sg13_lv_nmos w=4u l=0.39u +IB_VB1 VDDB VB1 4e-05 +VCM VCM 0 0.6 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 0.6 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN2 VCM VINT 0 1 +EIN VIN1 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN2) - v(VIN1) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1_sL2/case.json new file mode 100644 index 00000000..5444eb2e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1_sL2/case.json @@ -0,0 +1,162 @@ +{ + "case_id": "C08_ihp130_sW1_sL2", + "circuit_id": "C08", + "pdk": "ihp130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "dut_name": "C08_ihp130_sW1_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.78, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 0.78, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 0.78, + "nf": 8 + }, + "M4": { + "w": 2.0, + "l": 0.78, + "nf": 4 + }, + "M5": { + "w": 2.0, + "l": 0.78, + "nf": 4 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 4e-05 + } + }, + "load": { + "vcm": 0.6, + "CL": 1e-12, + "inv_input": "VIN2" + }, + "category": "ota", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.78, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.78, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.78, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.39, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.78, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.39, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.78, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "d9b17ef2697f09d9", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1_sL2/manifest.json new file mode 100644 index 00000000..25eb952e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "d535e70fe67c25c8d2bf10ef0f2dafc71813950a8dd6843359d6ea77cc8024ba", + "qualification.json": "9a5c2def2bf2307acb1e0851e05fc8e1b92dae8ae636e1befe839166cc3fa6bb", + "specs.json": "7f93174dd76215098db325f9b0a4d53202836b91918aa175268097ea769eb3a5", + "target.spice": "b1d00fe447326f034356b86cca16490e0b0487ce2dd24ab08fc6baae04ffe43c", + "target_lvs.spice": "96c43f5117c8bc2b21f74b6767961b788e2653d9777acba99bfd52a74e7dab43", + "testbench.spice": "9f6eba6a9f50012b2df6f1c736aeb9b78c44ead21df34fc5744928e08b66df21" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1_sL2/qualification.json new file mode 100644 index 00000000..92105d5c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1_sL2/qualification.json @@ -0,0 +1,122 @@ +{ + "case_id": "C08_ihp130_sW1_sL2", + "circuit_id": "C08", + "pdk": "ihp130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "ota", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.78, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.78, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.78, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.39, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.78, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.39, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.78, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "d9b17ef2697f09d9", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 16380000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 27.14772, + "ugf": 27305520.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 1.7, + "schematic_measures": { + "vout0": 0.5999995, + "idd": 3.003247e-05, + "vos": -0.00457877, + "gain_lf": 27.14772, + "ph_lf": 0.01624442, + "ugf": 27305520.0, + "ph_ugf": -89.85906, + "f3db": 1197272.0, + "pm": 90.12469558 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1_sL2/specs.json new file mode 100644 index 00000000..9504872c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 16380000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 27.14772, + "ugf": 27305520.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1_sL2/target.spice new file mode 100644 index 00000000..9c2fe45a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1_sL2/target.spice @@ -0,0 +1,7 @@ +.subckt C08_ihp130_sW1_sL2 VDD VSS VIN1 VIN2 VOUT1 VB1 +XM1 net22 VIN1 net23 VSS sg13_lv_nmos w=4u l=0.78u ng=8 m=1 +XM2 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=4u l=0.78u ng=8 m=1 +XM3 net23 VB1 VSS VSS sg13_lv_nmos w=4u l=0.78u ng=8 m=1 +XM4 net22 net22 VDD VDD sg13_lv_pmos w=2u l=0.78u ng=4 m=1 +XM5 VOUT1 net22 VDD VDD sg13_lv_pmos w=2u l=0.78u ng=4 m=1 +.ends C08_ihp130_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1_sL2/target_lvs.spice new file mode 100644 index 00000000..436d1e11 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1_sL2/target_lvs.spice @@ -0,0 +1,34 @@ +.subckt C08_ihp130_sW1_sL2 VDD VSS VIN1 VIN2 VOUT1 VB1 +XM1_f0 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.78u +XM1_f1 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.78u +XM1_f2 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.78u +XM1_f3 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.78u +XM1_f4 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.78u +XM1_f5 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.78u +XM1_f6 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.78u +XM1_f7 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.78u +XM2_f0 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.78u +XM2_f1 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.78u +XM2_f2 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.78u +XM2_f3 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.78u +XM2_f4 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.78u +XM2_f5 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.78u +XM2_f6 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.78u +XM2_f7 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f0 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f1 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f2 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f3 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f4 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f5 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f6 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f7 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM4_f0 net22 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM4_f1 net22 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM4_f2 net22 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM4_f3 net22 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM5_f0 VOUT1 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM5_f1 VOUT1 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM5_f2 VOUT1 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM5_f3 VOUT1 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +.ends C08_ihp130_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1_sL2/testbench.spice new file mode 100644 index 00000000..669b12d6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW1_sL2/testbench.spice @@ -0,0 +1,36 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VB1 C08_ihp130_sW1_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +XB_VB1 VB1 VB1 VSS VSS sg13_lv_nmos w=4u l=0.78u +IB_VB1 VDDB VB1 4e-05 +VCM VCM 0 0.6 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 0.6 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN2 VCM VINT 0 1 +EIN VIN1 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN2) - v(VIN1) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW2_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW2_sL1.5/case.json new file mode 100644 index 00000000..d6bd59cf --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW2_sL1.5/case.json @@ -0,0 +1,162 @@ +{ + "case_id": "C08_ihp130_sW2_sL1.5", + "circuit_id": "C08", + "pdk": "ihp130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "dut_name": "C08_ihp130_sW2_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 8.0, + "l": 0.585, + "nf": 16 + }, + "M2": { + "w": 8.0, + "l": 0.585, + "nf": 16 + }, + "M3": { + "w": 8.0, + "l": 0.585, + "nf": 16 + }, + "M4": { + "w": 4.0, + "l": 0.585, + "nf": 8 + }, + "M5": { + "w": 4.0, + "l": 0.585, + "nf": 8 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 4e-05 + } + }, + "load": { + "vcm": 0.6, + "CL": 1e-12, + "inv_input": "VIN2" + }, + "category": "ota", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.585, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.585, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.585, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.39, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.585, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 2.0, + "l0": 0.39, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.585, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "2550ddb5c9302ac3", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW2_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW2_sL1.5/manifest.json new file mode 100644 index 00000000..e85b8aef --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW2_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "4e8f3b65b8fea9d8b52ff1dd0723f68879410c276f6d7da3fbd47512e6976d9c", + "qualification.json": "6a1a36add8ea15d8387fe52f3f9d6bcc6900c3abedc03419e0b23ad621e6b05e", + "specs.json": "ecc2c4def070620bd70ad5d412565a55c1be0d630bad1b47871d8a37ee5d81a8", + "target.spice": "430f7fa039d45a10973a7139d0cd12e0105fad48a1c566ddbe66aeaf18749643", + "target_lvs.spice": "72cdf37922774c72dbe0f2ac559243bc1087220eacc8c62f40cc4d563846d1e7", + "testbench.spice": "4acbb2f357e7ad1c33b04afc94cfa8d943dbac5c94f8ad6dbaac69511ad3f329" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW2_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW2_sL1.5/qualification.json new file mode 100644 index 00000000..13e31abf --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW2_sL1.5/qualification.json @@ -0,0 +1,122 @@ +{ + "case_id": "C08_ihp130_sW2_sL1.5", + "circuit_id": "C08", + "pdk": "ihp130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "ota", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.585, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.585, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.585, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.39, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.585, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 2.0, + "l0": 0.39, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.585, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "2550ddb5c9302ac3", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 19640000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 26.25516, + "ugf": 32728630.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 3.2, + "schematic_measures": { + "vout0": 0.6000003, + "idd": 2.414455e-05, + "vos": 0.002635176, + "gain_lf": 26.25516, + "ph_lf": 0.0151384, + "ugf": 32728630.0, + "ph_ugf": -90.22953, + "f3db": 1592089.0, + "pm": 89.7553316 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW2_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW2_sL1.5/specs.json new file mode 100644 index 00000000..a445ec75 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW2_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 19640000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 26.25516, + "ugf": 32728630.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW2_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW2_sL1.5/target.spice new file mode 100644 index 00000000..7e520349 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW2_sL1.5/target.spice @@ -0,0 +1,7 @@ +.subckt C08_ihp130_sW2_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VB1 +XM1 net22 VIN1 net23 VSS sg13_lv_nmos w=8u l=0.585u ng=16 m=1 +XM2 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=8u l=0.585u ng=16 m=1 +XM3 net23 VB1 VSS VSS sg13_lv_nmos w=8u l=0.585u ng=16 m=1 +XM4 net22 net22 VDD VDD sg13_lv_pmos w=4u l=0.585u ng=8 m=1 +XM5 VOUT1 net22 VDD VDD sg13_lv_pmos w=4u l=0.585u ng=8 m=1 +.ends C08_ihp130_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW2_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW2_sL1.5/target_lvs.spice new file mode 100644 index 00000000..af08c28b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW2_sL1.5/target_lvs.spice @@ -0,0 +1,66 @@ +.subckt C08_ihp130_sW2_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VB1 +XM1_f0 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.585u +XM1_f1 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.585u +XM1_f2 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.585u +XM1_f3 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.585u +XM1_f4 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.585u +XM1_f5 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.585u +XM1_f6 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.585u +XM1_f7 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.585u +XM1_f8 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.585u +XM1_f9 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.585u +XM1_f10 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.585u +XM1_f11 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.585u +XM1_f12 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.585u +XM1_f13 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.585u +XM1_f14 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.585u +XM1_f15 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.585u +XM2_f0 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.585u +XM2_f1 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.585u +XM2_f2 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.585u +XM2_f3 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.585u +XM2_f4 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.585u +XM2_f5 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.585u +XM2_f6 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.585u +XM2_f7 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.585u +XM2_f8 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.585u +XM2_f9 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.585u +XM2_f10 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.585u +XM2_f11 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.585u +XM2_f12 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.585u +XM2_f13 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.585u +XM2_f14 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.585u +XM2_f15 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.585u +XM3_f0 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.585u +XM3_f1 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.585u +XM3_f2 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.585u +XM3_f3 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.585u +XM3_f4 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.585u +XM3_f5 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.585u +XM3_f6 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.585u +XM3_f7 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.585u +XM3_f8 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.585u +XM3_f9 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.585u +XM3_f10 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.585u +XM3_f11 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.585u +XM3_f12 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.585u +XM3_f13 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.585u +XM3_f14 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.585u +XM3_f15 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.585u +XM4_f0 net22 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.585u +XM4_f1 net22 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.585u +XM4_f2 net22 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.585u +XM4_f3 net22 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.585u +XM4_f4 net22 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.585u +XM4_f5 net22 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.585u +XM4_f6 net22 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.585u +XM4_f7 net22 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.585u +XM5_f0 VOUT1 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.585u +XM5_f1 VOUT1 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.585u +XM5_f2 VOUT1 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.585u +XM5_f3 VOUT1 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.585u +XM5_f4 VOUT1 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.585u +XM5_f5 VOUT1 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.585u +XM5_f6 VOUT1 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.585u +XM5_f7 VOUT1 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.585u +.ends C08_ihp130_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW2_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW2_sL1.5/testbench.spice new file mode 100644 index 00000000..d573eccb --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW2_sL1.5/testbench.spice @@ -0,0 +1,36 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VB1 C08_ihp130_sW2_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +XB_VB1 VB1 VB1 VSS VSS sg13_lv_nmos w=8u l=0.585u +IB_VB1 VDDB VB1 4e-05 +VCM VCM 0 0.6 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 0.6 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN2 VCM VINT 0 1 +EIN VIN1 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN2) - v(VIN1) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW2_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW2_sL1/case.json new file mode 100644 index 00000000..e2379eb6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW2_sL1/case.json @@ -0,0 +1,162 @@ +{ + "case_id": "C08_ihp130_sW2_sL1", + "circuit_id": "C08", + "pdk": "ihp130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "dut_name": "C08_ihp130_sW2_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 8.0, + "l": 0.39, + "nf": 16 + }, + "M2": { + "w": 8.0, + "l": 0.39, + "nf": 16 + }, + "M3": { + "w": 8.0, + "l": 0.39, + "nf": 16 + }, + "M4": { + "w": 4.0, + "l": 0.39, + "nf": 8 + }, + "M5": { + "w": 4.0, + "l": 0.39, + "nf": 8 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 4e-05 + } + }, + "load": { + "vcm": 0.6, + "CL": 1e-12, + "inv_input": "VIN2" + }, + "category": "ota", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.39, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.39, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "7b7b8a8fb958c6e0", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW2_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW2_sL1/manifest.json new file mode 100644 index 00000000..9926fd9a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW2_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "93af00aaea9278ae32649c8a215717e123b642d0e97fd305e252544b8fa3adad", + "qualification.json": "6a6442280e71d46bb68fefa28e65155e362a53dc0d58011fb7cd36b3633070e4", + "specs.json": "fa25137dc6d11a7754f1cf309bf65d8eba6c1044c28b20de9d2fdf66f7ccfefc", + "target.spice": "6bdb73676e54d1aca0da40a7e2ebfdb33d111edcaede0cf85912fd59b730371b", + "target_lvs.spice": "69492ac98d501e1a78cb31c7dced6eee2099369286ba8d8beed530a3bf05dee4", + "testbench.spice": "8002355734fb255375ce93365e91dbef439051f42d38474bf0ba922a2d48eba1" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW2_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW2_sL1/qualification.json new file mode 100644 index 00000000..a02da53d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW2_sL1/qualification.json @@ -0,0 +1,124 @@ +{ + "case_id": "C08_ihp130_sW2_sL1", + "circuit_id": "C08", + "pdk": "ihp130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "ota", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.39, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.39, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "7b7b8a8fb958c6e0", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "gain_lf=24.94 below floor 25" + ], + "spec": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 19730000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 24.94102, + "ugf": 32877000.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 1.6, + "schematic_measures": { + "vout0": 0.6000005, + "idd": 2.164491e-05, + "vos": 0.00488522, + "gain_lf": 24.94102, + "ph_lf": 0.01299105, + "ugf": 32877000.0, + "ph_ugf": -88.82285, + "f3db": 1859066.0, + "pm": 91.16415895 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW2_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW2_sL1/specs.json new file mode 100644 index 00000000..b5785ccf --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW2_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 19730000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 24.94102, + "ugf": 32877000.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW2_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW2_sL1/target.spice new file mode 100644 index 00000000..bf9756b6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW2_sL1/target.spice @@ -0,0 +1,7 @@ +.subckt C08_ihp130_sW2_sL1 VDD VSS VIN1 VIN2 VOUT1 VB1 +XM1 net22 VIN1 net23 VSS sg13_lv_nmos w=8u l=0.39u ng=16 m=1 +XM2 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=8u l=0.39u ng=16 m=1 +XM3 net23 VB1 VSS VSS sg13_lv_nmos w=8u l=0.39u ng=16 m=1 +XM4 net22 net22 VDD VDD sg13_lv_pmos w=4u l=0.39u ng=8 m=1 +XM5 VOUT1 net22 VDD VDD sg13_lv_pmos w=4u l=0.39u ng=8 m=1 +.ends C08_ihp130_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW2_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW2_sL1/target_lvs.spice new file mode 100644 index 00000000..23198972 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW2_sL1/target_lvs.spice @@ -0,0 +1,66 @@ +.subckt C08_ihp130_sW2_sL1 VDD VSS VIN1 VIN2 VOUT1 VB1 +XM1_f0 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f1 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f2 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f3 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f4 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f5 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f6 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f7 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f8 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f9 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f10 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f11 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f12 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f13 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f14 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f15 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f0 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f1 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f2 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f3 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f4 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f5 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f6 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f7 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f8 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f9 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f10 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f11 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f12 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f13 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f14 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f15 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f0 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f1 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f2 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f3 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f4 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f5 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f6 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f7 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f8 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f9 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f10 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f11 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f12 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f13 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f14 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f15 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f0 net22 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f1 net22 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f2 net22 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f3 net22 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f4 net22 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f5 net22 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f6 net22 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f7 net22 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f0 VOUT1 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f1 VOUT1 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f2 VOUT1 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f3 VOUT1 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f4 VOUT1 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f5 VOUT1 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f6 VOUT1 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f7 VOUT1 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +.ends C08_ihp130_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW2_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW2_sL1/testbench.spice new file mode 100644 index 00000000..eeb85260 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW2_sL1/testbench.spice @@ -0,0 +1,36 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VB1 C08_ihp130_sW2_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +XB_VB1 VB1 VB1 VSS VSS sg13_lv_nmos w=8u l=0.39u +IB_VB1 VDDB VB1 4e-05 +VCM VCM 0 0.6 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 0.6 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN2 VCM VINT 0 1 +EIN VIN1 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN2) - v(VIN1) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW2_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW2_sL2/case.json new file mode 100644 index 00000000..7d5ba169 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW2_sL2/case.json @@ -0,0 +1,162 @@ +{ + "case_id": "C08_ihp130_sW2_sL2", + "circuit_id": "C08", + "pdk": "ihp130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "dut_name": "C08_ihp130_sW2_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 8.0, + "l": 0.78, + "nf": 16 + }, + "M2": { + "w": 8.0, + "l": 0.78, + "nf": 16 + }, + "M3": { + "w": 8.0, + "l": 0.78, + "nf": 16 + }, + "M4": { + "w": 4.0, + "l": 0.78, + "nf": 8 + }, + "M5": { + "w": 4.0, + "l": 0.78, + "nf": 8 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 4e-05 + } + }, + "load": { + "vcm": 0.6, + "CL": 1e-12, + "inv_input": "VIN2" + }, + "category": "ota", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.78, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.78, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.78, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.39, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.78, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.39, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.78, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "3095cdc2e3040032", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW2_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW2_sL2/manifest.json new file mode 100644 index 00000000..bf6c5b09 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW2_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "b6922bc0aa4f9b2986710edd3b4bfe427528b0ec7e61552aa35990b040dcb1cb", + "qualification.json": "5228ba868649f2857c99719ae37f4a4bb740b8e541fc56b47e496e6df3073b0f", + "specs.json": "09d923fb9e57f2d8c04924d066758a00d266ab757cde7bca497d6cb59ac9aab2", + "target.spice": "9f3eba2f751bfca8fcb60b1b19507c24041237c28302cae9e0796d8fa66a98f2", + "target_lvs.spice": "1967d0ccf3fdf07b9799fa29e7f8aeec6e0f1401c4b24738426d0dac3a4f37fd", + "testbench.spice": "5b853d0b5af5e65212f88a56089bb9b0784704a4d4abbe1391a3bed411654713" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW2_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW2_sL2/qualification.json new file mode 100644 index 00000000..40d535ab --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW2_sL2/qualification.json @@ -0,0 +1,122 @@ +{ + "case_id": "C08_ihp130_sW2_sL2", + "circuit_id": "C08", + "pdk": "ihp130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "ota", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.78, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.78, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.78, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.39, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.78, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.39, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.78, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "3095cdc2e3040032", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 18950000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 27.15846, + "ugf": 31575720.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 3.5, + "schematic_measures": { + "vout0": 0.6000001, + "idd": 2.557596e-05, + "vos": 0.001060683, + "gain_lf": 27.15846, + "ph_lf": 0.01669001, + "ugf": 31575720.0, + "ph_ugf": -91.511, + "f3db": 1387941.0, + "pm": 88.47230999 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW2_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW2_sL2/specs.json new file mode 100644 index 00000000..6bbb9b94 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW2_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 18950000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 27.15846, + "ugf": 31575720.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW2_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW2_sL2/target.spice new file mode 100644 index 00000000..c4b9c89e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW2_sL2/target.spice @@ -0,0 +1,7 @@ +.subckt C08_ihp130_sW2_sL2 VDD VSS VIN1 VIN2 VOUT1 VB1 +XM1 net22 VIN1 net23 VSS sg13_lv_nmos w=8u l=0.78u ng=16 m=1 +XM2 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=8u l=0.78u ng=16 m=1 +XM3 net23 VB1 VSS VSS sg13_lv_nmos w=8u l=0.78u ng=16 m=1 +XM4 net22 net22 VDD VDD sg13_lv_pmos w=4u l=0.78u ng=8 m=1 +XM5 VOUT1 net22 VDD VDD sg13_lv_pmos w=4u l=0.78u ng=8 m=1 +.ends C08_ihp130_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW2_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW2_sL2/target_lvs.spice new file mode 100644 index 00000000..277fe382 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW2_sL2/target_lvs.spice @@ -0,0 +1,66 @@ +.subckt C08_ihp130_sW2_sL2 VDD VSS VIN1 VIN2 VOUT1 VB1 +XM1_f0 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.78u +XM1_f1 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.78u +XM1_f2 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.78u +XM1_f3 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.78u +XM1_f4 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.78u +XM1_f5 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.78u +XM1_f6 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.78u +XM1_f7 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.78u +XM1_f8 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.78u +XM1_f9 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.78u +XM1_f10 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.78u +XM1_f11 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.78u +XM1_f12 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.78u +XM1_f13 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.78u +XM1_f14 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.78u +XM1_f15 net22 VIN1 net23 VSS sg13_lv_nmos w=0.5u l=0.78u +XM2_f0 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.78u +XM2_f1 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.78u +XM2_f2 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.78u +XM2_f3 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.78u +XM2_f4 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.78u +XM2_f5 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.78u +XM2_f6 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.78u +XM2_f7 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.78u +XM2_f8 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.78u +XM2_f9 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.78u +XM2_f10 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.78u +XM2_f11 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.78u +XM2_f12 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.78u +XM2_f13 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.78u +XM2_f14 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.78u +XM2_f15 VOUT1 VIN2 net23 VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f0 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f1 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f2 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f3 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f4 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f5 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f6 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f7 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f8 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f9 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f10 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f11 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f12 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f13 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f14 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f15 net23 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM4_f0 net22 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM4_f1 net22 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM4_f2 net22 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM4_f3 net22 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM4_f4 net22 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM4_f5 net22 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM4_f6 net22 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM4_f7 net22 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM5_f0 VOUT1 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM5_f1 VOUT1 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM5_f2 VOUT1 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM5_f3 VOUT1 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM5_f4 VOUT1 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM5_f5 VOUT1 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM5_f6 VOUT1 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM5_f7 VOUT1 net22 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +.ends C08_ihp130_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW2_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW2_sL2/testbench.spice new file mode 100644 index 00000000..e9bd6283 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/ihp130/sW2_sL2/testbench.spice @@ -0,0 +1,36 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VB1 C08_ihp130_sW2_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +XB_VB1 VB1 VB1 VSS VSS sg13_lv_nmos w=8u l=0.78u +IB_VB1 VDDB VB1 4e-05 +VCM VCM 0 0.6 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 0.6 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN2 VCM VINT 0 1 +EIN VIN1 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN2) - v(VIN1) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C08/sky130/sW0.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW0.5_sL1.5/case.json new file mode 100644 index 00000000..02fb8d18 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW0.5_sL1.5/case.json @@ -0,0 +1,162 @@ +{ + "case_id": "C08_sky130_sW0.5_sL1.5", + "circuit_id": "C08", + "pdk": "sky130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "dut_name": "C08_sky130_sW0.5_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.45, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 0.45, + "nf": 4 + }, + "M3": { + "w": 2.0, + "l": 0.45, + "nf": 4 + }, + "M4": { + "w": 1.0, + "l": 0.45, + "nf": 2 + }, + "M5": { + "w": 1.0, + "l": 0.45, + "nf": 2 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 4e-05 + } + }, + "load": { + "vcm": 0.9, + "CL": 1e-12, + "inv_input": "VIN2" + }, + "category": "ota", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.45, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.45, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "13e2706a081f53ec", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/sky130/sW0.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW0.5_sL1.5/manifest.json new file mode 100644 index 00000000..eea3053d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW0.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "05bdcd8516be9859c1549ae049cff8617188104e3be2e89147eecd2260406d4a", + "qualification.json": "eccf93f405b78c7d41d9dcbed27add2a6d1fe1ddd72b52bfd431c9e4753c6081", + "specs.json": "2f34efbb26870cd25385dbe36723edc69ea2e01ac0710716b90c7f343f15ea90", + "target.spice": "a5a767c94f527ab6dea8cc6261a9102b63add31c452dae73d298b10280f1cdeb", + "target_lvs.spice": "d89d03e7a0370c767654e89b78c89d9775dcf10396cdaba8c649a63bf91fd62f", + "testbench.spice": "fe51cb935677bc71d5652c54c7bab0505df4ef9d92c44ef47c37999f97ea09d4" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/sky130/sW0.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW0.5_sL1.5/qualification.json new file mode 100644 index 00000000..7a304b47 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW0.5_sL1.5/qualification.json @@ -0,0 +1,122 @@ +{ + "case_id": "C08_sky130_sW0.5_sL1.5", + "circuit_id": "C08", + "pdk": "sky130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "ota", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.45, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.45, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "13e2706a081f53ec", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 31.21 + }, + "ugf": { + "min": 11880000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 34.21334, + "ugf": 19794020.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 9.8, + "schematic_measures": { + "vout0": 0.8999993, + "idd": 2.218699e-05, + "vos": -0.0070443, + "gain_lf": 34.21334, + "ph_lf": 0.03329973, + "ugf": 19794020.0, + "ph_ugf": -89.51321, + "f3db": 384368.7, + "pm": 90.45349027 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/sky130/sW0.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW0.5_sL1.5/specs.json new file mode 100644 index 00000000..2d4d7b41 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW0.5_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 31.21 + }, + "ugf": { + "min": 11880000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 34.21334, + "ugf": 19794020.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/sky130/sW0.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW0.5_sL1.5/target.spice new file mode 100644 index 00000000..0487f99e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW0.5_sL1.5/target.spice @@ -0,0 +1,7 @@ +.subckt C08_sky130_sW0.5_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VB1 +XM1 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=2 l=0.45 nf=4 +XM2 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=2 l=0.45 nf=4 +XM3 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=2 l=0.45 nf=4 +XM4 net22 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=1 l=0.45 nf=2 +XM5 VOUT1 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=1 l=0.45 nf=2 +.ends C08_sky130_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C08/sky130/sW0.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW0.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..fe4a6a93 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW0.5_sL1.5/target_lvs.spice @@ -0,0 +1,18 @@ +.subckt C08_sky130_sW0.5_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VB1 +XM1_f0 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f1 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f2 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f3 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f0 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f1 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f2 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f3 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f0 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f1 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f2 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f3 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f0 net22 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f1 net22 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f0 VOUT1 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f1 VOUT1 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +.ends C08_sky130_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C08/sky130/sW0.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW0.5_sL1.5/testbench.spice new file mode 100644 index 00000000..58f7db62 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW0.5_sL1.5/testbench.spice @@ -0,0 +1,36 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VB1 C08_sky130_sW0.5_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +XB_VB1 VB1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=2 l=0.45 +IB_VB1 VDDB VB1 4e-05 +VCM VCM 0 0.9 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 0.9 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN2 VCM VINT 0 1 +EIN VIN1 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN2) - v(VIN1) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C08/sky130/sW0.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW0.5_sL1/case.json new file mode 100644 index 00000000..7f9d8374 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW0.5_sL1/case.json @@ -0,0 +1,162 @@ +{ + "case_id": "C08_sky130_sW0.5_sL1", + "circuit_id": "C08", + "pdk": "sky130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "dut_name": "C08_sky130_sW0.5_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.3, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 0.3, + "nf": 4 + }, + "M3": { + "w": 2.0, + "l": 0.3, + "nf": 4 + }, + "M4": { + "w": 1.0, + "l": 0.3, + "nf": 2 + }, + "M5": { + "w": 1.0, + "l": 0.3, + "nf": 2 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 4e-05 + } + }, + "load": { + "vcm": 0.9, + "CL": 1e-12, + "inv_input": "VIN2" + }, + "category": "ota", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.3, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.3, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "41f4def2270387c7", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/sky130/sW0.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW0.5_sL1/manifest.json new file mode 100644 index 00000000..3cdc86f1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW0.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "8b1abfe3bc5d51e486859d02b5531aeb6ffe612ffc4824d4bd96870c05661926", + "qualification.json": "62826d9b06c398e3b5c486fe6e5ebb67be05d6a0edaac586cff067d769e934a0", + "specs.json": "8ac87249b8d06096cde25b3e00051167ce614ea0fdaffd8f11ab8829359cdab2", + "target.spice": "f48658646944632a24fce4e186c18dd3a1e4e800eb360e3ebea5c828906a2b15", + "target_lvs.spice": "d44319c24299c1274a2e515460fc202c07bb563da7071eeedaa76f6162f4741a", + "testbench.spice": "bb5ce9ca616c305bb73288668ce9fbd47c078cc8e911b11add2cdca7b27c6b3f" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/sky130/sW0.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW0.5_sL1/qualification.json new file mode 100644 index 00000000..1aa01525 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW0.5_sL1/qualification.json @@ -0,0 +1,122 @@ +{ + "case_id": "C08_sky130_sW0.5_sL1", + "circuit_id": "C08", + "pdk": "sky130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "ota", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.3, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.3, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "41f4def2270387c7", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 28.33 + }, + "ugf": { + "min": 14540000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 31.32883, + "ugf": 24225320.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 9.6, + "schematic_measures": { + "vout0": 0.8999993, + "idd": 2.464207e-05, + "vos": -0.00692929, + "gain_lf": 31.32883, + "ph_lf": 0.02563727, + "ugf": 24225320.0, + "ph_ugf": -88.88233, + "f3db": 655171.4, + "pm": 91.09203273 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/sky130/sW0.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW0.5_sL1/specs.json new file mode 100644 index 00000000..6da7d92b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW0.5_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 28.33 + }, + "ugf": { + "min": 14540000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 31.32883, + "ugf": 24225320.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/sky130/sW0.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW0.5_sL1/target.spice new file mode 100644 index 00000000..9bfd3d45 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW0.5_sL1/target.spice @@ -0,0 +1,7 @@ +.subckt C08_sky130_sW0.5_sL1 VDD VSS VIN1 VIN2 VOUT1 VB1 +XM1 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=2 l=0.3 nf=4 +XM2 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=2 l=0.3 nf=4 +XM3 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=2 l=0.3 nf=4 +XM4 net22 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=1 l=0.3 nf=2 +XM5 VOUT1 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=1 l=0.3 nf=2 +.ends C08_sky130_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C08/sky130/sW0.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW0.5_sL1/target_lvs.spice new file mode 100644 index 00000000..eefadc60 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW0.5_sL1/target_lvs.spice @@ -0,0 +1,18 @@ +.subckt C08_sky130_sW0.5_sL1 VDD VSS VIN1 VIN2 VOUT1 VB1 +XM1_f0 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f1 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f2 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f3 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f0 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f1 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f2 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f3 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f0 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f1 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f2 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f3 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f0 net22 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f1 net22 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f0 VOUT1 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f1 VOUT1 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +.ends C08_sky130_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C08/sky130/sW0.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW0.5_sL1/testbench.spice new file mode 100644 index 00000000..57128a0d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW0.5_sL1/testbench.spice @@ -0,0 +1,36 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VB1 C08_sky130_sW0.5_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +XB_VB1 VB1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=2 l=0.3 +IB_VB1 VDDB VB1 4e-05 +VCM VCM 0 0.9 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 0.9 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN2 VCM VINT 0 1 +EIN VIN1 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN2) - v(VIN1) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C08/sky130/sW0.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW0.5_sL2/case.json new file mode 100644 index 00000000..58dd829a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW0.5_sL2/case.json @@ -0,0 +1,162 @@ +{ + "case_id": "C08_sky130_sW0.5_sL2", + "circuit_id": "C08", + "pdk": "sky130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "dut_name": "C08_sky130_sW0.5_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.6, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 0.6, + "nf": 4 + }, + "M3": { + "w": 2.0, + "l": 0.6, + "nf": 4 + }, + "M4": { + "w": 1.0, + "l": 0.6, + "nf": 2 + }, + "M5": { + "w": 1.0, + "l": 0.6, + "nf": 2 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 4e-05 + } + }, + "load": { + "vcm": 0.9, + "CL": 1e-12, + "inv_input": "VIN2" + }, + "category": "ota", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.6, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.6, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "cf5925c6135e65c7", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/sky130/sW0.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW0.5_sL2/manifest.json new file mode 100644 index 00000000..3ee07a5c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW0.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "7ea6edf41875fea73e35bf7cd017783c7ac6da5d8da084298b11d56a40d6e20a", + "qualification.json": "c73a4aa081e3d58023009b9b1b58f3827f960e1cffcfb0a938a3bcb8a494e79f", + "specs.json": "91bd3e67d5923f33749776c4f2fa5b507f906b640e1853372d35a89dfc4b1229", + "target.spice": "79d9a1e997cd86dff062edbfe59826282de8c7179ea1ff282e70690bbd5a569f", + "target_lvs.spice": "41c5ef274be5b584a2de7a5de82d064a9874b51369543cc14ce6b46dfd085d1a", + "testbench.spice": "b6d244d49eb431fabaf0fdcd384b3b20561fc3ac59ca9d0702e557396655d3ea" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/sky130/sW0.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW0.5_sL2/qualification.json new file mode 100644 index 00000000..eecd7b96 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW0.5_sL2/qualification.json @@ -0,0 +1,122 @@ +{ + "case_id": "C08_sky130_sW0.5_sL2", + "circuit_id": "C08", + "pdk": "sky130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "ota", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.6, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.6, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "cf5925c6135e65c7", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 33.44 + }, + "ugf": { + "min": 9793000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 36.44027, + "ugf": 16321500.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 10.4, + "schematic_measures": { + "vout0": 0.8999994, + "idd": 1.938649e-05, + "vos": -0.00648764, + "gain_lf": 36.44027, + "ph_lf": 0.03919215, + "ugf": 16321500.0, + "ph_ugf": -89.95196, + "f3db": 245052.1, + "pm": 90.00884785 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/sky130/sW0.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW0.5_sL2/specs.json new file mode 100644 index 00000000..4c5a1cee --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW0.5_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 33.44 + }, + "ugf": { + "min": 9793000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 36.44027, + "ugf": 16321500.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/sky130/sW0.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW0.5_sL2/target.spice new file mode 100644 index 00000000..17ac8b1f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW0.5_sL2/target.spice @@ -0,0 +1,7 @@ +.subckt C08_sky130_sW0.5_sL2 VDD VSS VIN1 VIN2 VOUT1 VB1 +XM1 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=2 l=0.6 nf=4 +XM2 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=2 l=0.6 nf=4 +XM3 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=2 l=0.6 nf=4 +XM4 net22 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=1 l=0.6 nf=2 +XM5 VOUT1 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=1 l=0.6 nf=2 +.ends C08_sky130_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C08/sky130/sW0.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW0.5_sL2/target_lvs.spice new file mode 100644 index 00000000..edb9686c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW0.5_sL2/target_lvs.spice @@ -0,0 +1,18 @@ +.subckt C08_sky130_sW0.5_sL2 VDD VSS VIN1 VIN2 VOUT1 VB1 +XM1_f0 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f1 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f2 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f3 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f0 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f1 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f2 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f3 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f0 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f1 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f2 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f3 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f0 net22 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f1 net22 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f0 VOUT1 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f1 VOUT1 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +.ends C08_sky130_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C08/sky130/sW0.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW0.5_sL2/testbench.spice new file mode 100644 index 00000000..10aefd1d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW0.5_sL2/testbench.spice @@ -0,0 +1,36 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VB1 C08_sky130_sW0.5_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +XB_VB1 VB1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=2 l=0.6 +IB_VB1 VDDB VB1 4e-05 +VCM VCM 0 0.9 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 0.9 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN2 VCM VINT 0 1 +EIN VIN1 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN2) - v(VIN1) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1.5_sL1.5/case.json new file mode 100644 index 00000000..90dfef77 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1.5_sL1.5/case.json @@ -0,0 +1,162 @@ +{ + "case_id": "C08_sky130_sW1.5_sL1.5", + "circuit_id": "C08", + "pdk": "sky130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "dut_name": "C08_sky130_sW1.5_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 6.0, + "l": 0.45, + "nf": 12 + }, + "M2": { + "w": 6.0, + "l": 0.45, + "nf": 12 + }, + "M3": { + "w": 6.0, + "l": 0.45, + "nf": 12 + }, + "M4": { + "w": 3.0, + "l": 0.45, + "nf": 6 + }, + "M5": { + "w": 3.0, + "l": 0.45, + "nf": 6 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 4e-05 + } + }, + "load": { + "vcm": 0.9, + "CL": 1e-12, + "inv_input": "VIN2" + }, + "category": "ota", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.45, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.45, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.45, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.45, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.45, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "66326fdadc4c0d0f", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1.5_sL1.5/manifest.json new file mode 100644 index 00000000..e2bf811b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "9ef410aac332b42215396b3a5c878fd2a467da724b9c434683a544cb66a83e56", + "qualification.json": "cfbc1ea92250f820d35544df6ff56b8e90279dbb635336fd6315ef212cf26b00", + "specs.json": "ee1f8cbf231bddd94dac7c75c4349975f261e56b0ce1751f9035a91c3d637c68", + "target.spice": "4709062daa64b3d4cbafddfcb1f874d93ec4fa8a5c80f3812da7a5ecb051d68b", + "target_lvs.spice": "7b5e252aa705d8c815b6bc0a119068cd22ce398ecd87da5e51457f6a85a65a97", + "testbench.spice": "d2dc57b7815e32b86a0e6c16aa6d5833962d3d442d5e8c9cb1b07c874cb1e674" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1.5_sL1.5/qualification.json new file mode 100644 index 00000000..55574407 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1.5_sL1.5/qualification.json @@ -0,0 +1,122 @@ +{ + "case_id": "C08_sky130_sW1.5_sL1.5", + "circuit_id": "C08", + "pdk": "sky130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "ota", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.45, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.45, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.45, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.45, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.45, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "66326fdadc4c0d0f", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 32.71 + }, + "ugf": { + "min": 20920000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 35.70749, + "ugf": 34859820.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 6.5, + "schematic_measures": { + "vout0": 0.8999996, + "idd": 2.89816e-05, + "vos": -0.0035564, + "gain_lf": 35.70749, + "ph_lf": 0.04583744, + "ugf": 34859820.0, + "ph_ugf": -90.49729, + "f3db": 569871.5, + "pm": 89.45687256 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1.5_sL1.5/specs.json new file mode 100644 index 00000000..6c85c998 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1.5_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 32.71 + }, + "ugf": { + "min": 20920000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 35.70749, + "ugf": 34859820.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1.5_sL1.5/target.spice new file mode 100644 index 00000000..43ad09c4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1.5_sL1.5/target.spice @@ -0,0 +1,7 @@ +.subckt C08_sky130_sW1.5_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VB1 +XM1 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=6 l=0.45 nf=12 +XM2 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=6 l=0.45 nf=12 +XM3 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=6 l=0.45 nf=12 +XM4 net22 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=3 l=0.45 nf=6 +XM5 VOUT1 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=3 l=0.45 nf=6 +.ends C08_sky130_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..14d93b24 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1.5_sL1.5/target_lvs.spice @@ -0,0 +1,50 @@ +.subckt C08_sky130_sW1.5_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VB1 +XM1_f0 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f1 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f2 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f3 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f4 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f5 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f6 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f7 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f8 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f9 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f10 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f11 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f0 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f1 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f2 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f3 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f4 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f5 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f6 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f7 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f8 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f9 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f10 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f11 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f0 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f1 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f2 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f3 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f4 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f5 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f6 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f7 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f8 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f9 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f10 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f11 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f0 net22 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f1 net22 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f2 net22 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f3 net22 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f4 net22 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f5 net22 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f0 VOUT1 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f1 VOUT1 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f2 VOUT1 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f3 VOUT1 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f4 VOUT1 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f5 VOUT1 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +.ends C08_sky130_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1.5_sL1.5/testbench.spice new file mode 100644 index 00000000..aeecfb53 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1.5_sL1.5/testbench.spice @@ -0,0 +1,36 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VB1 C08_sky130_sW1.5_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +XB_VB1 VB1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=6 l=0.45 +IB_VB1 VDDB VB1 4e-05 +VCM VCM 0 0.9 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 0.9 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN2 VCM VINT 0 1 +EIN VIN1 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN2) - v(VIN1) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1.5_sL1/case.json new file mode 100644 index 00000000..f29f6d19 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1.5_sL1/case.json @@ -0,0 +1,162 @@ +{ + "case_id": "C08_sky130_sW1.5_sL1", + "circuit_id": "C08", + "pdk": "sky130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "dut_name": "C08_sky130_sW1.5_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 6.0, + "l": 0.3, + "nf": 12 + }, + "M2": { + "w": 6.0, + "l": 0.3, + "nf": 12 + }, + "M3": { + "w": 6.0, + "l": 0.3, + "nf": 12 + }, + "M4": { + "w": 3.0, + "l": 0.3, + "nf": 6 + }, + "M5": { + "w": 3.0, + "l": 0.3, + "nf": 6 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 4e-05 + } + }, + "load": { + "vcm": 0.9, + "CL": 1e-12, + "inv_input": "VIN2" + }, + "category": "ota", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.3, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.3, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.3, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.3, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.3, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "5265442c24e0e4a4", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1.5_sL1/manifest.json new file mode 100644 index 00000000..eeb22bfb --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "5ca0ea9e60e6549eeaf92973b0a4969effdafd48ab2090eec07c1d43ba5b4c06", + "qualification.json": "0db1650a343e00b02eee248338e41701f69ffafba44966a592c27233c91e9d33", + "specs.json": "6aeb11dd22542fc90c31fe062ba132dfc2c427af5e17a54c59ecb5144819aeab", + "target.spice": "ae45edcd52161148302f36ad41572ba693f37952da2102586fc5c56e4876c7bf", + "target_lvs.spice": "3310796c5536ea5cc8c848eb56ad61bdd91b3bdbd6f6e9ab907816412f2102fb", + "testbench.spice": "cd24cf1475dcadb9c710e59a92afa23f2be54373606237e57d3a08411a788a44" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1.5_sL1/qualification.json new file mode 100644 index 00000000..bf1307ba --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1.5_sL1/qualification.json @@ -0,0 +1,122 @@ +{ + "case_id": "C08_sky130_sW1.5_sL1", + "circuit_id": "C08", + "pdk": "sky130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "ota", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.3, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.3, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.3, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.3, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.3, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "5265442c24e0e4a4", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 28.94 + }, + "ugf": { + "min": 21880000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 31.93944, + "ugf": 36474930.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 6.9, + "schematic_measures": { + "vout0": 0.8999997, + "idd": 2.808255e-05, + "vos": -0.00293878, + "gain_lf": 31.93944, + "ph_lf": 0.02994302, + "ugf": 36474930.0, + "ph_ugf": -89.51701, + "f3db": 919810.7, + "pm": 90.45304698 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1.5_sL1/specs.json new file mode 100644 index 00000000..a25c1aed --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1.5_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 28.94 + }, + "ugf": { + "min": 21880000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 31.93944, + "ugf": 36474930.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1.5_sL1/target.spice new file mode 100644 index 00000000..d42d4679 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1.5_sL1/target.spice @@ -0,0 +1,7 @@ +.subckt C08_sky130_sW1.5_sL1 VDD VSS VIN1 VIN2 VOUT1 VB1 +XM1 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=6 l=0.3 nf=12 +XM2 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=6 l=0.3 nf=12 +XM3 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=6 l=0.3 nf=12 +XM4 net22 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=3 l=0.3 nf=6 +XM5 VOUT1 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=3 l=0.3 nf=6 +.ends C08_sky130_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1.5_sL1/target_lvs.spice new file mode 100644 index 00000000..db9e6631 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1.5_sL1/target_lvs.spice @@ -0,0 +1,50 @@ +.subckt C08_sky130_sW1.5_sL1 VDD VSS VIN1 VIN2 VOUT1 VB1 +XM1_f0 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f1 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f2 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f3 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f4 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f5 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f6 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f7 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f8 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f9 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f10 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f11 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f0 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f1 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f2 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f3 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f4 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f5 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f6 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f7 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f8 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f9 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f10 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f11 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f0 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f1 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f2 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f3 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f4 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f5 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f6 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f7 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f8 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f9 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f10 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f11 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f0 net22 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f1 net22 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f2 net22 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f3 net22 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f4 net22 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f5 net22 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f0 VOUT1 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f1 VOUT1 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f2 VOUT1 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f3 VOUT1 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f4 VOUT1 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f5 VOUT1 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +.ends C08_sky130_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1.5_sL1/testbench.spice new file mode 100644 index 00000000..8cef0d9d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1.5_sL1/testbench.spice @@ -0,0 +1,36 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VB1 C08_sky130_sW1.5_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +XB_VB1 VB1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=6 l=0.3 +IB_VB1 VDDB VB1 4e-05 +VCM VCM 0 0.9 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 0.9 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN2 VCM VINT 0 1 +EIN VIN1 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN2) - v(VIN1) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1.5_sL2/case.json new file mode 100644 index 00000000..6b09c28d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1.5_sL2/case.json @@ -0,0 +1,162 @@ +{ + "case_id": "C08_sky130_sW1.5_sL2", + "circuit_id": "C08", + "pdk": "sky130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "dut_name": "C08_sky130_sW1.5_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 6.0, + "l": 0.6, + "nf": 12 + }, + "M2": { + "w": 6.0, + "l": 0.6, + "nf": 12 + }, + "M3": { + "w": 6.0, + "l": 0.6, + "nf": 12 + }, + "M4": { + "w": 3.0, + "l": 0.6, + "nf": 6 + }, + "M5": { + "w": 3.0, + "l": 0.6, + "nf": 6 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 4e-05 + } + }, + "load": { + "vcm": 0.9, + "CL": 1e-12, + "inv_input": "VIN2" + }, + "category": "ota", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.6, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.6, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.6, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.6, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.6, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "db7473d1d15a00a8", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1.5_sL2/manifest.json new file mode 100644 index 00000000..d3a27aba --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "e2e8b9765e28da6ced165c41a3109a4ec68094da44844aa228a5499e67f25395", + "qualification.json": "57e27fc54638879874223c591b75188cec6fc579aec082a60d8b9e71ddedd610", + "specs.json": "9395dee0794e6136bfd39f88515bfcf4d6bdcb79b7db51672d7b20c21b95b0e1", + "target.spice": "74d4f5f86a5a1d8faaf6654d46322e8f343ff2e0fb348eee4f1e55b544256da8", + "target_lvs.spice": "413df2f269210d987227893367258f509130100c7563275c23204d6474456f5d", + "testbench.spice": "1e30d118e07079ef02569bb71e70c29050c5aed842879f131d6361dc43de3037" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1.5_sL2/qualification.json new file mode 100644 index 00000000..8696fd9f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1.5_sL2/qualification.json @@ -0,0 +1,122 @@ +{ + "case_id": "C08_sky130_sW1.5_sL2", + "circuit_id": "C08", + "pdk": "sky130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "ota", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.6, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.6, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.6, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.6, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.6, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "db7473d1d15a00a8", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 35.4 + }, + "ugf": { + "min": 19040000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 38.4011, + "ugf": 31734200.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 8.5, + "schematic_measures": { + "vout0": 0.8999997, + "idd": 2.833459e-05, + "vos": -0.00337589, + "gain_lf": 38.4011, + "ph_lf": 0.06131791, + "ugf": 31734200.0, + "ph_ugf": -91.23838, + "f3db": 380782.5, + "pm": 88.70030209 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1.5_sL2/specs.json new file mode 100644 index 00000000..82bbc1f6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1.5_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 35.4 + }, + "ugf": { + "min": 19040000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 38.4011, + "ugf": 31734200.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1.5_sL2/target.spice new file mode 100644 index 00000000..c36f7645 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1.5_sL2/target.spice @@ -0,0 +1,7 @@ +.subckt C08_sky130_sW1.5_sL2 VDD VSS VIN1 VIN2 VOUT1 VB1 +XM1 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=6 l=0.6 nf=12 +XM2 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=6 l=0.6 nf=12 +XM3 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=6 l=0.6 nf=12 +XM4 net22 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=3 l=0.6 nf=6 +XM5 VOUT1 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=3 l=0.6 nf=6 +.ends C08_sky130_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1.5_sL2/target_lvs.spice new file mode 100644 index 00000000..525af6c1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1.5_sL2/target_lvs.spice @@ -0,0 +1,50 @@ +.subckt C08_sky130_sW1.5_sL2 VDD VSS VIN1 VIN2 VOUT1 VB1 +XM1_f0 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f1 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f2 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f3 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f4 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f5 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f6 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f7 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f8 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f9 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f10 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f11 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f0 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f1 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f2 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f3 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f4 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f5 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f6 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f7 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f8 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f9 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f10 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f11 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f0 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f1 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f2 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f3 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f4 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f5 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f6 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f7 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f8 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f9 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f10 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f11 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f0 net22 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f1 net22 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f2 net22 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f3 net22 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f4 net22 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f5 net22 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f0 VOUT1 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f1 VOUT1 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f2 VOUT1 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f3 VOUT1 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f4 VOUT1 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f5 VOUT1 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +.ends C08_sky130_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1.5_sL2/testbench.spice new file mode 100644 index 00000000..882bdaed --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1.5_sL2/testbench.spice @@ -0,0 +1,36 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VB1 C08_sky130_sW1.5_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +XB_VB1 VB1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=6 l=0.6 +IB_VB1 VDDB VB1 4e-05 +VCM VCM 0 0.9 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 0.9 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN2 VCM VINT 0 1 +EIN VIN1 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN2) - v(VIN1) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1_sL1.5/case.json new file mode 100644 index 00000000..2f4ab1eb --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1_sL1.5/case.json @@ -0,0 +1,162 @@ +{ + "case_id": "C08_sky130_sW1_sL1.5", + "circuit_id": "C08", + "pdk": "sky130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "dut_name": "C08_sky130_sW1_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.45, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 0.45, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 0.45, + "nf": 8 + }, + "M4": { + "w": 2.0, + "l": 0.45, + "nf": 4 + }, + "M5": { + "w": 2.0, + "l": 0.45, + "nf": 4 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 4e-05 + } + }, + "load": { + "vcm": 0.9, + "CL": 1e-12, + "inv_input": "VIN2" + }, + "category": "ota", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "a0bbab3b6fbfb727", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1_sL1.5/manifest.json new file mode 100644 index 00000000..bb28b5be --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "ec2011fd3313e263356a79e3f8fbee0e5aa72437d1ead08fc91a8cb7a1c52209", + "qualification.json": "9abde2b98e8425176b918320bafe197d1061b617f6d048b6ed0d33ce304e0c02", + "specs.json": "8dcd2f716b15ad4424acb23f0fb38f91f04334c0e757a6382c4320af1c492fd2", + "target.spice": "857d719fec6f8c15e29945aebf4974c441d316e485f88fe89bb9a4f30c483cad", + "target_lvs.spice": "3cfad1a1bf0b379f872c0d9e5fc20c128d2640ba5734e635f6e668d04f2f38f7", + "testbench.spice": "de633019d814f0fbc89a7f5d72186e52a966779316cdc2202e1941ef1bf588d0" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1_sL1.5/qualification.json new file mode 100644 index 00000000..7305c37a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1_sL1.5/qualification.json @@ -0,0 +1,122 @@ +{ + "case_id": "C08_sky130_sW1_sL1.5", + "circuit_id": "C08", + "pdk": "sky130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "ota", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "a0bbab3b6fbfb727", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 32.19 + }, + "ugf": { + "min": 18120000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 35.18988, + "ugf": 30192960.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 10.4, + "schematic_measures": { + "vout0": 0.8999995, + "idd": 2.827926e-05, + "vos": -0.00480091, + "gain_lf": 35.18988, + "ph_lf": 0.04204101, + "ugf": 30192960.0, + "ph_ugf": -90.08166, + "f3db": 523419.9, + "pm": 89.87629899 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1_sL1.5/specs.json new file mode 100644 index 00000000..231bfa65 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 32.19 + }, + "ugf": { + "min": 18120000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 35.18988, + "ugf": 30192960.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1_sL1.5/target.spice new file mode 100644 index 00000000..453dbcb9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1_sL1.5/target.spice @@ -0,0 +1,7 @@ +.subckt C08_sky130_sW1_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VB1 +XM1 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=4 l=0.45 nf=8 +XM2 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=4 l=0.45 nf=8 +XM3 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=4 l=0.45 nf=8 +XM4 net22 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=2 l=0.45 nf=4 +XM5 VOUT1 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=2 l=0.45 nf=4 +.ends C08_sky130_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1_sL1.5/target_lvs.spice new file mode 100644 index 00000000..50bbfa5a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1_sL1.5/target_lvs.spice @@ -0,0 +1,34 @@ +.subckt C08_sky130_sW1_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VB1 +XM1_f0 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f1 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f2 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f3 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f4 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f5 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f6 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f7 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f0 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f1 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f2 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f3 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f4 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f5 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f6 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f7 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f0 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f1 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f2 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f3 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f4 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f5 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f6 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f7 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f0 net22 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f1 net22 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f2 net22 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f3 net22 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f0 VOUT1 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f1 VOUT1 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f2 VOUT1 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f3 VOUT1 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +.ends C08_sky130_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1_sL1.5/testbench.spice new file mode 100644 index 00000000..0cf4ff2d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1_sL1.5/testbench.spice @@ -0,0 +1,36 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VB1 C08_sky130_sW1_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +XB_VB1 VB1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=4 l=0.45 +IB_VB1 VDDB VB1 4e-05 +VCM VCM 0 0.9 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 0.9 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN2 VCM VINT 0 1 +EIN VIN1 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN2) - v(VIN1) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1_sL1/case.json new file mode 100644 index 00000000..2571e289 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1_sL1/case.json @@ -0,0 +1,162 @@ +{ + "case_id": "C08_sky130_sW1_sL1", + "circuit_id": "C08", + "pdk": "sky130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "dut_name": "C08_sky130_sW1_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.3, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 0.3, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 0.3, + "nf": 8 + }, + "M4": { + "w": 2.0, + "l": 0.3, + "nf": 4 + }, + "M5": { + "w": 2.0, + "l": 0.3, + "nf": 4 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 4e-05 + } + }, + "load": { + "vcm": 0.9, + "CL": 1e-12, + "inv_input": "VIN2" + }, + "category": "ota", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "ecaff994d341081e", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1_sL1/manifest.json new file mode 100644 index 00000000..e01727f6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "b1ab1f97ae79ae27b66ee7f381b8a6b799649e3aac407db9dfa63a391bda3d91", + "qualification.json": "39c903a30e0d669519632b4af900f63707edc5d76e684644964428b07a01c6b1", + "specs.json": "050929a0ee7492d2510188ec2a221e2506017071a62ad820c9e89d53e8e46538", + "target.spice": "1e590dc8886b1a103ca78184c79f1520b8d8134ab83a5f7ee2d1f9aa514d982c", + "target_lvs.spice": "ade244139b4efbf09a6a4ea243b2b8578e11a2cc611293a75b407f61ec8ed348", + "testbench.spice": "d682f8aef01a9853a9435704f59493494424a8e02c2ee8c0bad91094c7dc6896" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1_sL1/qualification.json new file mode 100644 index 00000000..4880bed9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1_sL1/qualification.json @@ -0,0 +1,122 @@ +{ + "case_id": "C08_sky130_sW1_sL1", + "circuit_id": "C08", + "pdk": "sky130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "ota", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "ecaff994d341081e", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 28.85 + }, + "ugf": { + "min": 20130000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 31.8508, + "ugf": 33543780.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 10.1, + "schematic_measures": { + "vout0": 0.8999996, + "idd": 2.860214e-05, + "vos": -0.00434792, + "gain_lf": 31.8508, + "ph_lf": 0.02922916, + "ugf": 33543780.0, + "ph_ugf": -89.2572, + "f3db": 854083.7, + "pm": 90.71357084 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1_sL1/specs.json new file mode 100644 index 00000000..a1a96f34 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 28.85 + }, + "ugf": { + "min": 20130000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 31.8508, + "ugf": 33543780.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1_sL1/target.spice new file mode 100644 index 00000000..dd2d9c71 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1_sL1/target.spice @@ -0,0 +1,7 @@ +.subckt C08_sky130_sW1_sL1 VDD VSS VIN1 VIN2 VOUT1 VB1 +XM1 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=4 l=0.3 nf=8 +XM2 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=4 l=0.3 nf=8 +XM3 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=4 l=0.3 nf=8 +XM4 net22 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=2 l=0.3 nf=4 +XM5 VOUT1 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=2 l=0.3 nf=4 +.ends C08_sky130_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1_sL1/target_lvs.spice new file mode 100644 index 00000000..1b218531 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1_sL1/target_lvs.spice @@ -0,0 +1,34 @@ +.subckt C08_sky130_sW1_sL1 VDD VSS VIN1 VIN2 VOUT1 VB1 +XM1_f0 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f1 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f2 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f3 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f4 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f5 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f6 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f7 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f0 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f1 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f2 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f3 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f4 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f5 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f6 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f7 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f0 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f1 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f2 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f3 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f4 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f5 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f6 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f7 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f0 net22 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f1 net22 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f2 net22 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f3 net22 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f0 VOUT1 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f1 VOUT1 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f2 VOUT1 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f3 VOUT1 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +.ends C08_sky130_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1_sL1/testbench.spice new file mode 100644 index 00000000..f7608d8c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1_sL1/testbench.spice @@ -0,0 +1,36 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VB1 C08_sky130_sW1_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +XB_VB1 VB1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=4 l=0.3 +IB_VB1 VDDB VB1 4e-05 +VCM VCM 0 0.9 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 0.9 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN2 VCM VINT 0 1 +EIN VIN1 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN2) - v(VIN1) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1_sL2/case.json new file mode 100644 index 00000000..61ed1cee --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1_sL2/case.json @@ -0,0 +1,162 @@ +{ + "case_id": "C08_sky130_sW1_sL2", + "circuit_id": "C08", + "pdk": "sky130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "dut_name": "C08_sky130_sW1_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.6, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 0.6, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 0.6, + "nf": 8 + }, + "M4": { + "w": 2.0, + "l": 0.6, + "nf": 4 + }, + "M5": { + "w": 2.0, + "l": 0.6, + "nf": 4 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 4e-05 + } + }, + "load": { + "vcm": 0.9, + "CL": 1e-12, + "inv_input": "VIN2" + }, + "category": "ota", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "c583133ebdaacaf3", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1_sL2/manifest.json new file mode 100644 index 00000000..8dc3e37a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "2d6aff5410d9b923937808b762a7ac382b9c27a52e581d20174e12ed9301275e", + "qualification.json": "95265c5213a3f90af113488a95f5e17d08385fa60b0d841ea4800187bc240cd1", + "specs.json": "dfe3dd666008af90d99e290d5a7db16ae5af2f3ee6eec5a587b6b6417567df26", + "target.spice": "4264b0bdac41360db84a7d759feb6573ac0709dceb4e93dcb6896b78ea5773bc", + "target_lvs.spice": "aa25a94c1294675729f8c7b536ad3dcff27451856918f2fe7a1719f8ab012247", + "testbench.spice": "c9b444b447cfcc3ec0684f23f04064ff8e39266cea8a168e4fe752c2cb685240" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1_sL2/qualification.json new file mode 100644 index 00000000..87d5483a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1_sL2/qualification.json @@ -0,0 +1,122 @@ +{ + "case_id": "C08_sky130_sW1_sL2", + "circuit_id": "C08", + "pdk": "sky130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "ota", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "c583133ebdaacaf3", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 34.65 + }, + "ugf": { + "min": 15750000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 37.65402, + "ugf": 26256940.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 6.5, + "schematic_measures": { + "vout0": 0.8999996, + "idd": 2.636539e-05, + "vos": -0.00448632, + "gain_lf": 37.65402, + "ph_lf": 0.05390085, + "ugf": 26256940.0, + "ph_ugf": -90.68992, + "f3db": 342782.6, + "pm": 89.25617915 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1_sL2/specs.json new file mode 100644 index 00000000..355ade28 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 34.65 + }, + "ugf": { + "min": 15750000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 37.65402, + "ugf": 26256940.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1_sL2/target.spice new file mode 100644 index 00000000..bfb89157 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1_sL2/target.spice @@ -0,0 +1,7 @@ +.subckt C08_sky130_sW1_sL2 VDD VSS VIN1 VIN2 VOUT1 VB1 +XM1 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=4 l=0.6 nf=8 +XM2 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=4 l=0.6 nf=8 +XM3 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=4 l=0.6 nf=8 +XM4 net22 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=2 l=0.6 nf=4 +XM5 VOUT1 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=2 l=0.6 nf=4 +.ends C08_sky130_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1_sL2/target_lvs.spice new file mode 100644 index 00000000..b10fa31a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1_sL2/target_lvs.spice @@ -0,0 +1,34 @@ +.subckt C08_sky130_sW1_sL2 VDD VSS VIN1 VIN2 VOUT1 VB1 +XM1_f0 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f1 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f2 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f3 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f4 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f5 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f6 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f7 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f0 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f1 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f2 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f3 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f4 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f5 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f6 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f7 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f0 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f1 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f2 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f3 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f4 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f5 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f6 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f7 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f0 net22 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f1 net22 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f2 net22 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f3 net22 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f0 VOUT1 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f1 VOUT1 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f2 VOUT1 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f3 VOUT1 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +.ends C08_sky130_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1_sL2/testbench.spice new file mode 100644 index 00000000..12423ac4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW1_sL2/testbench.spice @@ -0,0 +1,36 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VB1 C08_sky130_sW1_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +XB_VB1 VB1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=4 l=0.6 +IB_VB1 VDDB VB1 4e-05 +VCM VCM 0 0.9 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 0.9 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN2 VCM VINT 0 1 +EIN VIN1 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN2) - v(VIN1) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C08/sky130/sW2_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW2_sL1.5/case.json new file mode 100644 index 00000000..7fac764f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW2_sL1.5/case.json @@ -0,0 +1,162 @@ +{ + "case_id": "C08_sky130_sW2_sL1.5", + "circuit_id": "C08", + "pdk": "sky130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "dut_name": "C08_sky130_sW2_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 8.0, + "l": 0.45, + "nf": 16 + }, + "M2": { + "w": 8.0, + "l": 0.45, + "nf": 16 + }, + "M3": { + "w": 8.0, + "l": 0.45, + "nf": 16 + }, + "M4": { + "w": 4.0, + "l": 0.45, + "nf": 8 + }, + "M5": { + "w": 4.0, + "l": 0.45, + "nf": 8 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 4e-05 + } + }, + "load": { + "vcm": 0.9, + "CL": 1e-12, + "inv_input": "VIN2" + }, + "category": "ota", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "d84083be8ee54420", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/sky130/sW2_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW2_sL1.5/manifest.json new file mode 100644 index 00000000..71edde2e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW2_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "f0af4597e2848912d66f6758365652ab8e66948a25522971df794c915420dfc8", + "qualification.json": "8d4ee4e52f50cba6d26397c4436dfca80fdf20c21b40d31f419969d14e8711eb", + "specs.json": "1eacd50cea247fcfc75587482a012ce111c911557775e7314ff6c40a72e383ae", + "target.spice": "842401d652ec43eaccacb7d255c6d0254c627027f1c80c06584f2678fcb964db", + "target_lvs.spice": "c4bffbeb95e6be179960865e194de644c8eb52c3954f86dab1cb2f0c99700e6b", + "testbench.spice": "482677b2e5aa56a5eb0f893b07af186629090ba647aeff38a5c9d6e76a3021c8" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/sky130/sW2_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW2_sL1.5/qualification.json new file mode 100644 index 00000000..fbe35587 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW2_sL1.5/qualification.json @@ -0,0 +1,122 @@ +{ + "case_id": "C08_sky130_sW2_sL1.5", + "circuit_id": "C08", + "pdk": "sky130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "ota", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "d84083be8ee54420", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 32.98 + }, + "ugf": { + "min": 21900000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 35.98452, + "ugf": 36495360.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 7.3, + "schematic_measures": { + "vout0": 0.8999997, + "idd": 2.789256e-05, + "vos": -0.00276677, + "gain_lf": 35.98452, + "ph_lf": 0.04767376, + "ugf": 36495360.0, + "ph_ugf": -90.85866, + "f3db": 577797.6, + "pm": 89.09366624 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/sky130/sW2_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW2_sL1.5/specs.json new file mode 100644 index 00000000..888c7411 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW2_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 32.98 + }, + "ugf": { + "min": 21900000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 35.98452, + "ugf": 36495360.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/sky130/sW2_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW2_sL1.5/target.spice new file mode 100644 index 00000000..2bdf4cad --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW2_sL1.5/target.spice @@ -0,0 +1,7 @@ +.subckt C08_sky130_sW2_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VB1 +XM1 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=8 l=0.45 nf=16 +XM2 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=8 l=0.45 nf=16 +XM3 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=8 l=0.45 nf=16 +XM4 net22 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=4 l=0.45 nf=8 +XM5 VOUT1 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=4 l=0.45 nf=8 +.ends C08_sky130_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C08/sky130/sW2_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW2_sL1.5/target_lvs.spice new file mode 100644 index 00000000..f7952420 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW2_sL1.5/target_lvs.spice @@ -0,0 +1,66 @@ +.subckt C08_sky130_sW2_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VB1 +XM1_f0 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f1 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f2 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f3 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f4 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f5 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f6 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f7 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f8 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f9 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f10 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f11 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f12 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f13 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f14 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f15 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f0 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f1 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f2 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f3 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f4 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f5 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f6 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f7 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f8 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f9 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f10 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f11 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f12 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f13 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f14 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f15 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f0 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f1 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f2 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f3 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f4 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f5 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f6 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f7 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f8 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f9 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f10 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f11 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f12 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f13 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f14 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f15 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f0 net22 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f1 net22 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f2 net22 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f3 net22 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f4 net22 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f5 net22 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f6 net22 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f7 net22 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f0 VOUT1 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f1 VOUT1 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f2 VOUT1 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f3 VOUT1 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f4 VOUT1 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f5 VOUT1 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f6 VOUT1 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f7 VOUT1 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +.ends C08_sky130_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C08/sky130/sW2_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW2_sL1.5/testbench.spice new file mode 100644 index 00000000..354bfdcd --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW2_sL1.5/testbench.spice @@ -0,0 +1,36 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VB1 C08_sky130_sW2_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +XB_VB1 VB1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=8 l=0.45 +IB_VB1 VDDB VB1 4e-05 +VCM VCM 0 0.9 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 0.9 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN2 VCM VINT 0 1 +EIN VIN1 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN2) - v(VIN1) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C08/sky130/sW2_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW2_sL1/case.json new file mode 100644 index 00000000..9dfb91c6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW2_sL1/case.json @@ -0,0 +1,162 @@ +{ + "case_id": "C08_sky130_sW2_sL1", + "circuit_id": "C08", + "pdk": "sky130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "dut_name": "C08_sky130_sW2_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 8.0, + "l": 0.3, + "nf": 16 + }, + "M2": { + "w": 8.0, + "l": 0.3, + "nf": 16 + }, + "M3": { + "w": 8.0, + "l": 0.3, + "nf": 16 + }, + "M4": { + "w": 4.0, + "l": 0.3, + "nf": 8 + }, + "M5": { + "w": 4.0, + "l": 0.3, + "nf": 8 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 4e-05 + } + }, + "load": { + "vcm": 0.9, + "CL": 1e-12, + "inv_input": "VIN2" + }, + "category": "ota", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "5b4ca74c921b0f82", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/sky130/sW2_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW2_sL1/manifest.json new file mode 100644 index 00000000..ecce4ba8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW2_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "7a16aec9817b7a10846c3e205d7a034b9cdad47acb06fa9f7598aa066d6f15cf", + "qualification.json": "ba515e76e2b47073919a24033eb54e26cd9b4e91fcbf4172d831f0de9da9f2ca", + "specs.json": "2a4d43df8482ff298e44728373181d078af51c26c6c24cbe417b9004a37a5f8b", + "target.spice": "687164cabc16f9c4a484f9a23c756e9b6dd06839c567fc4f997ddb6e0fdce182", + "target_lvs.spice": "60422073e3f43499005de7fc009b6e9fe01bcc594020ec8ebcc4e5cf81d8cb7d", + "testbench.spice": "464c9d85aeb65652eda489fd18be8351b7a72e8fc80389f02de7d58b2d253c13" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/sky130/sW2_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW2_sL1/qualification.json new file mode 100644 index 00000000..dd5a0e6b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW2_sL1/qualification.json @@ -0,0 +1,122 @@ +{ + "case_id": "C08_sky130_sW2_sL1", + "circuit_id": "C08", + "pdk": "sky130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "ota", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "5b4ca74c921b0f82", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 28.88 + }, + "ugf": { + "min": 22290000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 31.88189, + "ugf": 37147170.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 10.9, + "schematic_measures": { + "vout0": 0.8999998, + "idd": 2.680646e-05, + "vos": -0.00203215, + "gain_lf": 31.88189, + "ph_lf": 0.02981593, + "ugf": 37147170.0, + "ph_ugf": -89.73583, + "f3db": 942694.5, + "pm": 90.23435407 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/sky130/sW2_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW2_sL1/specs.json new file mode 100644 index 00000000..febb1562 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW2_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 28.88 + }, + "ugf": { + "min": 22290000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 31.88189, + "ugf": 37147170.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/sky130/sW2_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW2_sL1/target.spice new file mode 100644 index 00000000..626c245e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW2_sL1/target.spice @@ -0,0 +1,7 @@ +.subckt C08_sky130_sW2_sL1 VDD VSS VIN1 VIN2 VOUT1 VB1 +XM1 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=8 l=0.3 nf=16 +XM2 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=8 l=0.3 nf=16 +XM3 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=8 l=0.3 nf=16 +XM4 net22 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=4 l=0.3 nf=8 +XM5 VOUT1 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=4 l=0.3 nf=8 +.ends C08_sky130_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C08/sky130/sW2_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW2_sL1/target_lvs.spice new file mode 100644 index 00000000..2c279b3d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW2_sL1/target_lvs.spice @@ -0,0 +1,66 @@ +.subckt C08_sky130_sW2_sL1 VDD VSS VIN1 VIN2 VOUT1 VB1 +XM1_f0 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f1 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f2 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f3 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f4 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f5 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f6 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f7 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f8 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f9 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f10 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f11 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f12 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f13 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f14 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f15 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f0 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f1 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f2 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f3 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f4 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f5 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f6 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f7 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f8 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f9 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f10 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f11 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f12 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f13 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f14 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f15 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f0 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f1 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f2 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f3 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f4 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f5 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f6 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f7 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f8 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f9 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f10 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f11 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f12 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f13 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f14 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f15 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f0 net22 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f1 net22 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f2 net22 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f3 net22 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f4 net22 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f5 net22 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f6 net22 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f7 net22 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f0 VOUT1 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f1 VOUT1 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f2 VOUT1 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f3 VOUT1 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f4 VOUT1 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f5 VOUT1 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f6 VOUT1 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f7 VOUT1 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +.ends C08_sky130_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C08/sky130/sW2_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW2_sL1/testbench.spice new file mode 100644 index 00000000..fdb7bb0b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW2_sL1/testbench.spice @@ -0,0 +1,36 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VB1 C08_sky130_sW2_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +XB_VB1 VB1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=8 l=0.3 +IB_VB1 VDDB VB1 4e-05 +VCM VCM 0 0.9 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 0.9 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN2 VCM VINT 0 1 +EIN VIN1 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN2) - v(VIN1) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C08/sky130/sW2_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW2_sL2/case.json new file mode 100644 index 00000000..ee30a307 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW2_sL2/case.json @@ -0,0 +1,162 @@ +{ + "case_id": "C08_sky130_sW2_sL2", + "circuit_id": "C08", + "pdk": "sky130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "dut_name": "C08_sky130_sW2_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 8.0, + "l": 0.6, + "nf": 16 + }, + "M2": { + "w": 8.0, + "l": 0.6, + "nf": 16 + }, + "M3": { + "w": 8.0, + "l": 0.6, + "nf": 16 + }, + "M4": { + "w": 4.0, + "l": 0.6, + "nf": 8 + }, + "M5": { + "w": 4.0, + "l": 0.6, + "nf": 8 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 4e-05 + } + }, + "load": { + "vcm": 0.9, + "CL": 1e-12, + "inv_input": "VIN2" + }, + "category": "ota", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "d310cfc1bd5d7ae9", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/sky130/sW2_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW2_sL2/manifest.json new file mode 100644 index 00000000..0bdb4dc9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW2_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "9612c296f99aa13dd0a9dc2403e335b01663cd132acda0ab93006fe31ad0d4eb", + "qualification.json": "aefe2ecacda9ad1f3cb24753796fd6112d2f9536502d3980d28cc1bdbe9962a1", + "specs.json": "5d768e75e0ba24407f181b3cf88c9a7db2b308a15dd4498702de16af2299fbd2", + "target.spice": "0d3f26f52471ec6668494000c5e0d3bd35f8cfdb8544435c9ba57733da2979dc", + "target_lvs.spice": "cf1b79204b85e861a7b8d67e137335a97db9c19860ea4f2ae1d07943409d00b3", + "testbench.spice": "951a00b8f212e284844f2057778befdae0bb7a0f4b94bf217d0d995d6b5f7809" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/sky130/sW2_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW2_sL2/qualification.json new file mode 100644 index 00000000..c6afa629 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW2_sL2/qualification.json @@ -0,0 +1,122 @@ +{ + "case_id": "C08_sky130_sW2_sL2", + "circuit_id": "C08", + "pdk": "sky130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "ota", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "d310cfc1bd5d7ae9", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 35.9 + }, + "ugf": { + "min": 20370000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 38.9039, + "ugf": 33947460.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 6.7, + "schematic_measures": { + "vout0": 0.8999997, + "idd": 2.75585e-05, + "vos": -0.0026313, + "gain_lf": 38.9039, + "ph_lf": 0.06574798, + "ugf": 33947460.0, + "ph_ugf": -91.70478, + "f3db": 384031.3, + "pm": 88.22947202 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/sky130/sW2_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW2_sL2/specs.json new file mode 100644 index 00000000..c4e9d9a8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW2_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 35.9 + }, + "ugf": { + "min": 20370000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 38.9039, + "ugf": 33947460.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C08/sky130/sW2_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW2_sL2/target.spice new file mode 100644 index 00000000..ff996a19 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW2_sL2/target.spice @@ -0,0 +1,7 @@ +.subckt C08_sky130_sW2_sL2 VDD VSS VIN1 VIN2 VOUT1 VB1 +XM1 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=8 l=0.6 nf=16 +XM2 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=8 l=0.6 nf=16 +XM3 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=8 l=0.6 nf=16 +XM4 net22 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=4 l=0.6 nf=8 +XM5 VOUT1 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=4 l=0.6 nf=8 +.ends C08_sky130_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C08/sky130/sW2_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW2_sL2/target_lvs.spice new file mode 100644 index 00000000..026b8238 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW2_sL2/target_lvs.spice @@ -0,0 +1,66 @@ +.subckt C08_sky130_sW2_sL2 VDD VSS VIN1 VIN2 VOUT1 VB1 +XM1_f0 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f1 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f2 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f3 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f4 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f5 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f6 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f7 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f8 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f9 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f10 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f11 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f12 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f13 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f14 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f15 net22 VIN1 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f0 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f1 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f2 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f3 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f4 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f5 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f6 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f7 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f8 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f9 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f10 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f11 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f12 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f13 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f14 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f15 VOUT1 VIN2 net23 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f0 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f1 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f2 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f3 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f4 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f5 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f6 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f7 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f8 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f9 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f10 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f11 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f12 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f13 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f14 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f15 net23 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f0 net22 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f1 net22 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f2 net22 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f3 net22 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f4 net22 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f5 net22 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f6 net22 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f7 net22 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f0 VOUT1 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f1 VOUT1 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f2 VOUT1 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f3 VOUT1 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f4 VOUT1 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f5 VOUT1 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f6 VOUT1 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f7 VOUT1 net22 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +.ends C08_sky130_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C08/sky130/sW2_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW2_sL2/testbench.spice new file mode 100644 index 00000000..6be16c57 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C08/sky130/sW2_sL2/testbench.spice @@ -0,0 +1,36 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VB1 C08_sky130_sW2_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +XB_VB1 VB1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=8 l=0.6 +IB_VB1 VDDB VB1 4e-05 +VCM VCM 0 0.9 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 0.9 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN2 VCM VINT 0 1 +EIN VIN1 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN2) - v(VIN1) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C09/gf180/sW0.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW0.5_sL1.5/case.json new file mode 100644 index 00000000..d9411c3a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW0.5_sL1.5/case.json @@ -0,0 +1,235 @@ +{ + "case_id": "C09_gf180_sW0.5_sL1.5", + "circuit_id": "C09", + "pdk": "gf180", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "dut_name": "C09_gf180_sW0.5_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VB1", + "IB1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.84, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 0.84, + "nf": 4 + }, + "M3": { + "w": 2.0, + "l": 0.84, + "nf": 4 + }, + "M4": { + "w": 2.0, + "l": 0.84, + "nf": 4 + }, + "M5": { + "w": 2.0, + "l": 0.84, + "nf": 4 + }, + "M6": { + "w": 2.0, + "l": 0.84, + "nf": 4 + }, + "M7": { + "w": 2.0, + "l": 0.84, + "nf": 4 + }, + "M8": { + "w": 2.0, + "l": 0.84, + "nf": 4 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 2e-05, + "kind": "cascode" + }, + "IB1": { + "i": 4e-05, + "from": "VSS" + } + }, + "load": { + "vcm": { + "expr": "v(VB1) - gs(M3) + gs(M1) - 0.1", + "currents": { + "M3": 2e-05, + "M1": 2e-05 + } + }, + "CL": 1e-12, + "inv_input": "VIN2", + "vout_target": 1.4849999999999999 + }, + "category": "ota", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "c932e6f486a55940", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 2e-05, + "variant": "cascode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/gf180/sW0.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW0.5_sL1.5/manifest.json new file mode 100644 index 00000000..d587928e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW0.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "d7e8d9d2fba1e38016d4633169b0f648139b7de8506b6c013cb9e1924a321b16", + "qualification.json": "b4fc5994accc73f029a344835e750d5544cb3e5868016f7bea6955a2cc54ba45", + "specs.json": "52be1993e1431412765d9ccb2a37c6b38951896c0f7cc2196e3327d10c2a6094", + "target.spice": "2e55f56c82fd61ab1ea10b3c528f8fd580a4b6ede390373bf1a6f53fc8eb5cd3", + "target_lvs.spice": "fa3e496ed8ecea9db2e46d2f904be2607336fc0f3f8e72d47a7beee758ff794e", + "testbench.spice": "8936747a43dfd7e9a3fbbc64b2ca76ca49d2162173b57e90d73bc0e578782cee" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/gf180/sW0.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW0.5_sL1.5/qualification.json new file mode 100644 index 00000000..2a75fa0f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW0.5_sL1.5/qualification.json @@ -0,0 +1,156 @@ +{ + "case_id": "C09_gf180_sW0.5_sL1.5", + "circuit_id": "C09", + "pdk": "gf180", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "ota", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "c932e6f486a55940", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "servo did not reach the output target: vout0=-0.238433 target=1.485 (tol 0.066 V)", + "gain_lf=-26.09 below floor 35", + "ugf: not measurable in the schematic" + ], + "spec": { + "gain_lf": { + "min": 35.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": -26.08643, + "ugf": null + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vout0": -0.238433, + "idd": 3.999998e-05, + "vos": -0.5, + "gain_lf": -26.08643, + "ph_lf": -0.00115706, + "f3db": 4465256.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/gf180/sW0.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW0.5_sL1.5/specs.json new file mode 100644 index 00000000..446a0f8b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW0.5_sL1.5/specs.json @@ -0,0 +1,20 @@ +{ + "gain_lf": { + "min": 35.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": -26.08643, + "ugf": null + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/gf180/sW0.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW0.5_sL1.5/target.spice new file mode 100644 index 00000000..1c365c68 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW0.5_sL1.5/target.spice @@ -0,0 +1,10 @@ +.subckt C09_gf180_sW0.5_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 +MM1 net018 VIN1 IB1 VSS nfet_03v3 w=2u l=0.84u nf=4 m=1 +MM2 net016 VIN2 IB1 VSS nfet_03v3 w=2u l=0.84u nf=4 m=1 +MM3 net04 VB1 net018 VSS nfet_03v3 w=2u l=0.84u nf=4 m=1 +MM4 VOUT1 VB1 net016 VSS nfet_03v3 w=2u l=0.84u nf=4 m=1 +MM5 net04 net04 net019 VDD pfet_03v3 w=2u l=0.84u nf=4 m=1 +MM6 VOUT1 net04 net017 VDD pfet_03v3 w=2u l=0.84u nf=4 m=1 +MM7 net019 net019 VDD VDD pfet_03v3 w=2u l=0.84u nf=4 m=1 +MM8 net017 net019 VDD VDD pfet_03v3 w=2u l=0.84u nf=4 m=1 +.ends C09_gf180_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C09/gf180/sW0.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW0.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..ffcc75d4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW0.5_sL1.5/target_lvs.spice @@ -0,0 +1,34 @@ +.subckt C09_gf180_sW0.5_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 +MM1_f0 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f1 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f2 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f3 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f0 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f1 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f2 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f3 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f0 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f1 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f2 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f3 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=0.84u +MM4_f0 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=0.84u +MM4_f1 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=0.84u +MM4_f2 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=0.84u +MM4_f3 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f0 net04 net04 net019 VDD pfet_03v3 w=0.5u l=0.84u +MM5_f1 net04 net04 net019 VDD pfet_03v3 w=0.5u l=0.84u +MM5_f2 net04 net04 net019 VDD pfet_03v3 w=0.5u l=0.84u +MM5_f3 net04 net04 net019 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f0 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f1 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f2 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f3 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=0.84u +MM7_f0 net019 net019 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM7_f1 net019 net019 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM7_f2 net019 net019 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM7_f3 net019 net019 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM8_f0 net017 net019 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM8_f1 net017 net019 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM8_f2 net017 net019 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM8_f3 net017 net019 VDD VDD pfet_03v3 w=0.5u l=0.84u +.ends C09_gf180_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C09/gf180/sW0.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW0.5_sL1.5/testbench.spice new file mode 100644 index 00000000..d62b91db --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW0.5_sL1.5/testbench.spice @@ -0,0 +1,42 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 C09_gf180_sW0.5_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIB1 IB1 VSS 4e-05 +.nodeset v(IB1)=2.31 +MB_VB1 VB1 VB1 VSS VSS nfet_03v3 w=2u l=0.84u +IB_VB1 VDDB VB1 8e-05 +MB_GS_M3 GS_M3 GS_M3 VSS VSS nfet_03v3 w=2u l=0.84u +IB_GS_M3 VDDB GS_M3 2e-05 +MB_GS_M1 GS_M1 GS_M1 VSS VSS nfet_03v3 w=2u l=0.84u +IB_GS_M1 VDDB GS_M1 2e-05 +B_VCM VCM 0 V = v(VB1) - v(GS_M3) + v(GS_M1) - 0.1 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 1.485 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN2 VCM VINT 0 1 +EIN VIN1 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN2) - v(VIN1) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C09/gf180/sW0.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW0.5_sL1/case.json new file mode 100644 index 00000000..0ad98063 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW0.5_sL1/case.json @@ -0,0 +1,235 @@ +{ + "case_id": "C09_gf180_sW0.5_sL1", + "circuit_id": "C09", + "pdk": "gf180", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "dut_name": "C09_gf180_sW0.5_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VB1", + "IB1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.56, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 0.56, + "nf": 4 + }, + "M3": { + "w": 2.0, + "l": 0.56, + "nf": 4 + }, + "M4": { + "w": 2.0, + "l": 0.56, + "nf": 4 + }, + "M5": { + "w": 2.0, + "l": 0.56, + "nf": 4 + }, + "M6": { + "w": 2.0, + "l": 0.56, + "nf": 4 + }, + "M7": { + "w": 2.0, + "l": 0.56, + "nf": 4 + }, + "M8": { + "w": 2.0, + "l": 0.56, + "nf": 4 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 2e-05, + "kind": "cascode" + }, + "IB1": { + "i": 4e-05, + "from": "VSS" + } + }, + "load": { + "vcm": { + "expr": "v(VB1) - gs(M3) + gs(M1) - 0.1", + "currents": { + "M3": 2e-05, + "M1": 2e-05 + } + }, + "CL": 1e-12, + "inv_input": "VIN2", + "vout_target": 1.4849999999999999 + }, + "category": "ota", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "a2c77bb7c2fdcb82", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 2e-05, + "variant": "cascode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/gf180/sW0.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW0.5_sL1/manifest.json new file mode 100644 index 00000000..43a95f2f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW0.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "3003b5f26eb2b7c8c7ee70b5391aebc8e14b547b478a4c3c7ca2d5617d75a9d0", + "qualification.json": "ce95e1490192983c912826fda6997f599f8d858b70058fb84ea420cd0ec0d371", + "specs.json": "7f8b39ac0e5a76dbfbe368975a5c6751ed5792c62e00cad74b2eabd99a1e36f5", + "target.spice": "7ebd391154d3997f7de0194b7d2b87841c379cd0afd6fb7367b2f14f6db52ea9", + "target_lvs.spice": "93fa9b6013f60a1b6c369d33f5df700a31e6f3af3eba8a219105cf48dcde6ae5", + "testbench.spice": "c7f8fe0c723fec24262247cbf329b7fac37ea8cc2ad17c6a12248144717f37bd" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/gf180/sW0.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW0.5_sL1/qualification.json new file mode 100644 index 00000000..6ae4fff2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW0.5_sL1/qualification.json @@ -0,0 +1,161 @@ +{ + "case_id": "C09_gf180_sW0.5_sL1", + "circuit_id": "C09", + "pdk": "gf180", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "ota", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "a2c77bb7c2fdcb82", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "gain_lf=33 below floor 35", + "ugf=1.153e+06 below floor 2e+06" + ], + "spec": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 33.00468, + "ugf": 1152701.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vout0": 1.484969, + "idd": 4.000001e-05, + "vos": -0.277689, + "gain_lf": 33.00468, + "ph_lf": -0.08404525, + "ugf": 1152701.0, + "ph_ugf": -88.54876, + "f3db": 25707.47, + "pm": 91.53528525 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/gf180/sW0.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW0.5_sL1/specs.json new file mode 100644 index 00000000..4858f5a1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW0.5_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 33.00468, + "ugf": 1152701.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/gf180/sW0.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW0.5_sL1/target.spice new file mode 100644 index 00000000..86152a2d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW0.5_sL1/target.spice @@ -0,0 +1,10 @@ +.subckt C09_gf180_sW0.5_sL1 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 +MM1 net018 VIN1 IB1 VSS nfet_03v3 w=2u l=0.56u nf=4 m=1 +MM2 net016 VIN2 IB1 VSS nfet_03v3 w=2u l=0.56u nf=4 m=1 +MM3 net04 VB1 net018 VSS nfet_03v3 w=2u l=0.56u nf=4 m=1 +MM4 VOUT1 VB1 net016 VSS nfet_03v3 w=2u l=0.56u nf=4 m=1 +MM5 net04 net04 net019 VDD pfet_03v3 w=2u l=0.56u nf=4 m=1 +MM6 VOUT1 net04 net017 VDD pfet_03v3 w=2u l=0.56u nf=4 m=1 +MM7 net019 net019 VDD VDD pfet_03v3 w=2u l=0.56u nf=4 m=1 +MM8 net017 net019 VDD VDD pfet_03v3 w=2u l=0.56u nf=4 m=1 +.ends C09_gf180_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C09/gf180/sW0.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW0.5_sL1/target_lvs.spice new file mode 100644 index 00000000..ef89d99b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW0.5_sL1/target_lvs.spice @@ -0,0 +1,34 @@ +.subckt C09_gf180_sW0.5_sL1 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 +MM1_f0 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f1 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f2 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f3 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f0 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f1 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f2 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f3 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f0 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f1 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f2 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f3 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=0.56u +MM4_f0 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=0.56u +MM4_f1 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=0.56u +MM4_f2 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=0.56u +MM4_f3 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f0 net04 net04 net019 VDD pfet_03v3 w=0.5u l=0.56u +MM5_f1 net04 net04 net019 VDD pfet_03v3 w=0.5u l=0.56u +MM5_f2 net04 net04 net019 VDD pfet_03v3 w=0.5u l=0.56u +MM5_f3 net04 net04 net019 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f0 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f1 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f2 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f3 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=0.56u +MM7_f0 net019 net019 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM7_f1 net019 net019 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM7_f2 net019 net019 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM7_f3 net019 net019 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM8_f0 net017 net019 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM8_f1 net017 net019 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM8_f2 net017 net019 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM8_f3 net017 net019 VDD VDD pfet_03v3 w=0.5u l=0.56u +.ends C09_gf180_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C09/gf180/sW0.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW0.5_sL1/testbench.spice new file mode 100644 index 00000000..c3eab23e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW0.5_sL1/testbench.spice @@ -0,0 +1,42 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 C09_gf180_sW0.5_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIB1 IB1 VSS 4e-05 +.nodeset v(IB1)=2.31 +MB_VB1 VB1 VB1 VSS VSS nfet_03v3 w=2u l=0.56u +IB_VB1 VDDB VB1 8e-05 +MB_GS_M3 GS_M3 GS_M3 VSS VSS nfet_03v3 w=2u l=0.56u +IB_GS_M3 VDDB GS_M3 2e-05 +MB_GS_M1 GS_M1 GS_M1 VSS VSS nfet_03v3 w=2u l=0.56u +IB_GS_M1 VDDB GS_M1 2e-05 +B_VCM VCM 0 V = v(VB1) - v(GS_M3) + v(GS_M1) - 0.1 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 1.485 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN2 VCM VINT 0 1 +EIN VIN1 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN2) - v(VIN1) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C09/gf180/sW0.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW0.5_sL2/case.json new file mode 100644 index 00000000..380a900d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW0.5_sL2/case.json @@ -0,0 +1,235 @@ +{ + "case_id": "C09_gf180_sW0.5_sL2", + "circuit_id": "C09", + "pdk": "gf180", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "dut_name": "C09_gf180_sW0.5_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VB1", + "IB1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 1.12, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 1.12, + "nf": 4 + }, + "M3": { + "w": 2.0, + "l": 1.12, + "nf": 4 + }, + "M4": { + "w": 2.0, + "l": 1.12, + "nf": 4 + }, + "M5": { + "w": 2.0, + "l": 1.12, + "nf": 4 + }, + "M6": { + "w": 2.0, + "l": 1.12, + "nf": 4 + }, + "M7": { + "w": 2.0, + "l": 1.12, + "nf": 4 + }, + "M8": { + "w": 2.0, + "l": 1.12, + "nf": 4 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 2e-05, + "kind": "cascode" + }, + "IB1": { + "i": 4e-05, + "from": "VSS" + } + }, + "load": { + "vcm": { + "expr": "v(VB1) - gs(M3) + gs(M1) - 0.1", + "currents": { + "M3": 2e-05, + "M1": 2e-05 + } + }, + "CL": 1e-12, + "inv_input": "VIN2", + "vout_target": 1.4849999999999999 + }, + "category": "ota", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "c07b8735a7aa3336", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 2e-05, + "variant": "cascode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/gf180/sW0.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW0.5_sL2/manifest.json new file mode 100644 index 00000000..e099760f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW0.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "e61cc973f6afa9f23bc9058a678ae53268552422771848d882b6be540732f68d", + "qualification.json": "071aea308f003596a32cfcc25860f59f90ad9cd7e5b67b121ec72d3f62cb7f32", + "specs.json": "12b035c1a0c9aaa0b8bdb5ca87b342c6b1fda0e9b8a333a006775f12e769b846", + "target.spice": "6b92704fc7d28b1d48657b22f7dd0f471ae86dc5e495ac6eeb5dff2a054e2152", + "target_lvs.spice": "844c5b02598f8d9b8664843ca67a43aee50b9227cca72a43396d55b82755b954", + "testbench.spice": "8ad65dff4b30cdb3755ffdf0d680ddcdbc67bb96a2aa5036ff9d63c877384421" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/gf180/sW0.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW0.5_sL2/qualification.json new file mode 100644 index 00000000..c0b81a2c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW0.5_sL2/qualification.json @@ -0,0 +1,156 @@ +{ + "case_id": "C09_gf180_sW0.5_sL2", + "circuit_id": "C09", + "pdk": "gf180", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "ota", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "c07b8735a7aa3336", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "servo did not reach the output target: vout0=-0.565526 target=1.485 (tol 0.066 V)", + "gain_lf=-37.12 below floor 35", + "ugf: not measurable in the schematic" + ], + "spec": { + "gain_lf": { + "min": 35.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": -37.11679, + "ugf": null + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vout0": -0.565526, + "idd": 3.903016e-05, + "vos": -0.5, + "gain_lf": -37.11679, + "ph_lf": -0.000426523, + "f3db": 9797591.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/gf180/sW0.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW0.5_sL2/specs.json new file mode 100644 index 00000000..d00d2f55 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW0.5_sL2/specs.json @@ -0,0 +1,20 @@ +{ + "gain_lf": { + "min": 35.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": -37.11679, + "ugf": null + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/gf180/sW0.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW0.5_sL2/target.spice new file mode 100644 index 00000000..19686ac8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW0.5_sL2/target.spice @@ -0,0 +1,10 @@ +.subckt C09_gf180_sW0.5_sL2 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 +MM1 net018 VIN1 IB1 VSS nfet_03v3 w=2u l=1.12u nf=4 m=1 +MM2 net016 VIN2 IB1 VSS nfet_03v3 w=2u l=1.12u nf=4 m=1 +MM3 net04 VB1 net018 VSS nfet_03v3 w=2u l=1.12u nf=4 m=1 +MM4 VOUT1 VB1 net016 VSS nfet_03v3 w=2u l=1.12u nf=4 m=1 +MM5 net04 net04 net019 VDD pfet_03v3 w=2u l=1.12u nf=4 m=1 +MM6 VOUT1 net04 net017 VDD pfet_03v3 w=2u l=1.12u nf=4 m=1 +MM7 net019 net019 VDD VDD pfet_03v3 w=2u l=1.12u nf=4 m=1 +MM8 net017 net019 VDD VDD pfet_03v3 w=2u l=1.12u nf=4 m=1 +.ends C09_gf180_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C09/gf180/sW0.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW0.5_sL2/target_lvs.spice new file mode 100644 index 00000000..7e2ca339 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW0.5_sL2/target_lvs.spice @@ -0,0 +1,34 @@ +.subckt C09_gf180_sW0.5_sL2 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 +MM1_f0 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f1 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f2 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f3 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f0 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f1 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f2 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f3 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f0 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f1 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f2 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f3 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=1.12u +MM4_f0 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=1.12u +MM4_f1 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=1.12u +MM4_f2 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=1.12u +MM4_f3 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f0 net04 net04 net019 VDD pfet_03v3 w=0.5u l=1.12u +MM5_f1 net04 net04 net019 VDD pfet_03v3 w=0.5u l=1.12u +MM5_f2 net04 net04 net019 VDD pfet_03v3 w=0.5u l=1.12u +MM5_f3 net04 net04 net019 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f0 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f1 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f2 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f3 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=1.12u +MM7_f0 net019 net019 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM7_f1 net019 net019 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM7_f2 net019 net019 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM7_f3 net019 net019 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM8_f0 net017 net019 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM8_f1 net017 net019 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM8_f2 net017 net019 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM8_f3 net017 net019 VDD VDD pfet_03v3 w=0.5u l=1.12u +.ends C09_gf180_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C09/gf180/sW0.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW0.5_sL2/testbench.spice new file mode 100644 index 00000000..f23665e3 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW0.5_sL2/testbench.spice @@ -0,0 +1,42 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 C09_gf180_sW0.5_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIB1 IB1 VSS 4e-05 +.nodeset v(IB1)=2.31 +MB_VB1 VB1 VB1 VSS VSS nfet_03v3 w=2u l=1.12u +IB_VB1 VDDB VB1 8e-05 +MB_GS_M3 GS_M3 GS_M3 VSS VSS nfet_03v3 w=2u l=1.12u +IB_GS_M3 VDDB GS_M3 2e-05 +MB_GS_M1 GS_M1 GS_M1 VSS VSS nfet_03v3 w=2u l=1.12u +IB_GS_M1 VDDB GS_M1 2e-05 +B_VCM VCM 0 V = v(VB1) - v(GS_M3) + v(GS_M1) - 0.1 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 1.485 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN2 VCM VINT 0 1 +EIN VIN1 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN2) - v(VIN1) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1.5_sL1.5/case.json new file mode 100644 index 00000000..3ec2d895 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1.5_sL1.5/case.json @@ -0,0 +1,235 @@ +{ + "case_id": "C09_gf180_sW1.5_sL1.5", + "circuit_id": "C09", + "pdk": "gf180", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "dut_name": "C09_gf180_sW1.5_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VB1", + "IB1" + ], + "sizing": { + "M1": { + "w": 6.0, + "l": 0.84, + "nf": 12 + }, + "M2": { + "w": 6.0, + "l": 0.84, + "nf": 12 + }, + "M3": { + "w": 6.0, + "l": 0.84, + "nf": 12 + }, + "M4": { + "w": 6.0, + "l": 0.84, + "nf": 12 + }, + "M5": { + "w": 6.0, + "l": 0.84, + "nf": 12 + }, + "M6": { + "w": 6.0, + "l": 0.84, + "nf": 12 + }, + "M7": { + "w": 6.0, + "l": 0.84, + "nf": 12 + }, + "M8": { + "w": 6.0, + "l": 0.84, + "nf": 12 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 2e-05, + "kind": "cascode" + }, + "IB1": { + "i": 4e-05, + "from": "VSS" + } + }, + "load": { + "vcm": { + "expr": "v(VB1) - gs(M3) + gs(M1) - 0.1", + "currents": { + "M3": 2e-05, + "M1": 2e-05 + } + }, + "CL": 1e-12, + "inv_input": "VIN2", + "vout_target": 1.4849999999999999 + }, + "category": "ota", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "8f56e9e4010101fa", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 2e-05, + "variant": "cascode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1.5_sL1.5/manifest.json new file mode 100644 index 00000000..cc6ec763 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "4c3546e9d0575f4369c0df7a7ed1b13279b3960f098bd95b604ce56c4f6d839f", + "qualification.json": "05386f126569f0989a4ddc3eac31f0afc228e626e7c1183426aa9baf7055d844", + "specs.json": "0f3d05a9944b579b9a0ea4968e01a0cf690808a33c50bb451ce6a80960dce3cd", + "target.spice": "8a8cfa09ad437b8f779cc0b4af492f108fb038da23e8818477f5cd6689d43acf", + "target_lvs.spice": "0b5832d122bc36c3f295a01165237c5e4b778992ab97fb6fe1ae81f5886b0be9", + "testbench.spice": "bbd4f6599cc648a10fd468c090b8bf3cd6ad413c109b7457716315a063f4be5e" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1.5_sL1.5/qualification.json new file mode 100644 index 00000000..1bd66f76 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1.5_sL1.5/qualification.json @@ -0,0 +1,158 @@ +{ + "case_id": "C09_gf180_sW1.5_sL1.5", + "circuit_id": "C09", + "pdk": "gf180", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "ota", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "8f56e9e4010101fa", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 46.27 + }, + "ugf": { + "min": 5903000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 49.27492, + "ugf": 9838559.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.3, + "schematic_measures": { + "vout0": 1.484999, + "idd": 4.000003e-05, + "vos": -0.00537861, + "gain_lf": 49.27492, + "ph_lf": 0.1095608, + "ugf": 9838559.0, + "ph_ugf": -92.82147, + "f3db": 33796.36, + "pm": 87.0689692 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1.5_sL1.5/specs.json new file mode 100644 index 00000000..4ee807cf --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1.5_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 46.27 + }, + "ugf": { + "min": 5903000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 49.27492, + "ugf": 9838559.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1.5_sL1.5/target.spice new file mode 100644 index 00000000..de4e3205 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1.5_sL1.5/target.spice @@ -0,0 +1,10 @@ +.subckt C09_gf180_sW1.5_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 +MM1 net018 VIN1 IB1 VSS nfet_03v3 w=6u l=0.84u nf=12 m=1 +MM2 net016 VIN2 IB1 VSS nfet_03v3 w=6u l=0.84u nf=12 m=1 +MM3 net04 VB1 net018 VSS nfet_03v3 w=6u l=0.84u nf=12 m=1 +MM4 VOUT1 VB1 net016 VSS nfet_03v3 w=6u l=0.84u nf=12 m=1 +MM5 net04 net04 net019 VDD pfet_03v3 w=6u l=0.84u nf=12 m=1 +MM6 VOUT1 net04 net017 VDD pfet_03v3 w=6u l=0.84u nf=12 m=1 +MM7 net019 net019 VDD VDD pfet_03v3 w=6u l=0.84u nf=12 m=1 +MM8 net017 net019 VDD VDD pfet_03v3 w=6u l=0.84u nf=12 m=1 +.ends C09_gf180_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..af9e1349 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1.5_sL1.5/target_lvs.spice @@ -0,0 +1,98 @@ +.subckt C09_gf180_sW1.5_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 +MM1_f0 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f1 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f2 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f3 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f4 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f5 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f6 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f7 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f8 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f9 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f10 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f11 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f0 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f1 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f2 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f3 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f4 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f5 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f6 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f7 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f8 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f9 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f10 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f11 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f0 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f1 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f2 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f3 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f4 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f5 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f6 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f7 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f8 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f9 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f10 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f11 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=0.84u +MM4_f0 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=0.84u +MM4_f1 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=0.84u +MM4_f2 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=0.84u +MM4_f3 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=0.84u +MM4_f4 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=0.84u +MM4_f5 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=0.84u +MM4_f6 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=0.84u +MM4_f7 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=0.84u +MM4_f8 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=0.84u +MM4_f9 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=0.84u +MM4_f10 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=0.84u +MM4_f11 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f0 net04 net04 net019 VDD pfet_03v3 w=0.5u l=0.84u +MM5_f1 net04 net04 net019 VDD pfet_03v3 w=0.5u l=0.84u +MM5_f2 net04 net04 net019 VDD pfet_03v3 w=0.5u l=0.84u +MM5_f3 net04 net04 net019 VDD pfet_03v3 w=0.5u l=0.84u +MM5_f4 net04 net04 net019 VDD pfet_03v3 w=0.5u l=0.84u +MM5_f5 net04 net04 net019 VDD pfet_03v3 w=0.5u l=0.84u +MM5_f6 net04 net04 net019 VDD pfet_03v3 w=0.5u l=0.84u +MM5_f7 net04 net04 net019 VDD pfet_03v3 w=0.5u l=0.84u +MM5_f8 net04 net04 net019 VDD pfet_03v3 w=0.5u l=0.84u +MM5_f9 net04 net04 net019 VDD pfet_03v3 w=0.5u l=0.84u +MM5_f10 net04 net04 net019 VDD pfet_03v3 w=0.5u l=0.84u +MM5_f11 net04 net04 net019 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f0 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f1 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f2 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f3 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f4 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f5 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f6 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f7 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f8 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f9 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f10 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f11 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=0.84u +MM7_f0 net019 net019 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM7_f1 net019 net019 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM7_f2 net019 net019 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM7_f3 net019 net019 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM7_f4 net019 net019 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM7_f5 net019 net019 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM7_f6 net019 net019 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM7_f7 net019 net019 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM7_f8 net019 net019 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM7_f9 net019 net019 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM7_f10 net019 net019 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM7_f11 net019 net019 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM8_f0 net017 net019 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM8_f1 net017 net019 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM8_f2 net017 net019 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM8_f3 net017 net019 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM8_f4 net017 net019 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM8_f5 net017 net019 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM8_f6 net017 net019 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM8_f7 net017 net019 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM8_f8 net017 net019 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM8_f9 net017 net019 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM8_f10 net017 net019 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM8_f11 net017 net019 VDD VDD pfet_03v3 w=0.5u l=0.84u +.ends C09_gf180_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1.5_sL1.5/testbench.spice new file mode 100644 index 00000000..97aa9e55 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1.5_sL1.5/testbench.spice @@ -0,0 +1,42 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 C09_gf180_sW1.5_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIB1 IB1 VSS 4e-05 +.nodeset v(IB1)=2.31 +MB_VB1 VB1 VB1 VSS VSS nfet_03v3 w=6u l=0.84u +IB_VB1 VDDB VB1 8e-05 +MB_GS_M3 GS_M3 GS_M3 VSS VSS nfet_03v3 w=6u l=0.84u +IB_GS_M3 VDDB GS_M3 2e-05 +MB_GS_M1 GS_M1 GS_M1 VSS VSS nfet_03v3 w=6u l=0.84u +IB_GS_M1 VDDB GS_M1 2e-05 +B_VCM VCM 0 V = v(VB1) - v(GS_M3) + v(GS_M1) - 0.1 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 1.485 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN2 VCM VINT 0 1 +EIN VIN1 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN2) - v(VIN1) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1.5_sL1/case.json new file mode 100644 index 00000000..9dc4916a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1.5_sL1/case.json @@ -0,0 +1,235 @@ +{ + "case_id": "C09_gf180_sW1.5_sL1", + "circuit_id": "C09", + "pdk": "gf180", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "dut_name": "C09_gf180_sW1.5_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VB1", + "IB1" + ], + "sizing": { + "M1": { + "w": 6.0, + "l": 0.56, + "nf": 12 + }, + "M2": { + "w": 6.0, + "l": 0.56, + "nf": 12 + }, + "M3": { + "w": 6.0, + "l": 0.56, + "nf": 12 + }, + "M4": { + "w": 6.0, + "l": 0.56, + "nf": 12 + }, + "M5": { + "w": 6.0, + "l": 0.56, + "nf": 12 + }, + "M6": { + "w": 6.0, + "l": 0.56, + "nf": 12 + }, + "M7": { + "w": 6.0, + "l": 0.56, + "nf": 12 + }, + "M8": { + "w": 6.0, + "l": 0.56, + "nf": 12 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 2e-05, + "kind": "cascode" + }, + "IB1": { + "i": 4e-05, + "from": "VSS" + } + }, + "load": { + "vcm": { + "expr": "v(VB1) - gs(M3) + gs(M1) - 0.1", + "currents": { + "M3": 2e-05, + "M1": 2e-05 + } + }, + "CL": 1e-12, + "inv_input": "VIN2", + "vout_target": 1.4849999999999999 + }, + "category": "ota", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "718a3f2f9e21dbd6", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 2e-05, + "variant": "cascode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1.5_sL1/manifest.json new file mode 100644 index 00000000..6d8b5b87 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "025c77157ec2f372116cbf2c8ae0615b73e8ee24d8292a239b6212a1df0c2919", + "qualification.json": "554620ef2396a3273601f7302932bd58b0bd57ed1666cd4abe3117ce76950adb", + "specs.json": "ed61187e66e53caaf75733f9f1e14e92eaae57b638270409df8c0a5edb8d6d2a", + "target.spice": "a1b79f7055a4d7e30fdab4313d125f76a8d1ba607c20d78c7363918c5b9c959c", + "target_lvs.spice": "561ad6b99b9bd40e25c6057756c186bb9f4c6b7bde2eaeae39668ff9fed06b0c", + "testbench.spice": "f52e160c68364db3f3210e03e6b08a8516a5777b401d77246e106f8c77686348" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1.5_sL1/qualification.json new file mode 100644 index 00000000..9cf994cb --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1.5_sL1/qualification.json @@ -0,0 +1,158 @@ +{ + "case_id": "C09_gf180_sW1.5_sL1", + "circuit_id": "C09", + "pdk": "gf180", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "ota", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "718a3f2f9e21dbd6", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 45.31 + }, + "ugf": { + "min": 8305000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 48.30557, + "ugf": 13841910.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.3, + "schematic_measures": { + "vout0": 1.485, + "idd": 4.000004e-05, + "vos": -0.00340849, + "gain_lf": 48.30557, + "ph_lf": 0.1389248, + "ugf": 13841910.0, + "ph_ugf": -92.34326, + "f3db": 53115.2, + "pm": 87.5178152 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1.5_sL1/specs.json new file mode 100644 index 00000000..4f51b71f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1.5_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 45.31 + }, + "ugf": { + "min": 8305000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 48.30557, + "ugf": 13841910.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1.5_sL1/target.spice new file mode 100644 index 00000000..c867429e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1.5_sL1/target.spice @@ -0,0 +1,10 @@ +.subckt C09_gf180_sW1.5_sL1 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 +MM1 net018 VIN1 IB1 VSS nfet_03v3 w=6u l=0.56u nf=12 m=1 +MM2 net016 VIN2 IB1 VSS nfet_03v3 w=6u l=0.56u nf=12 m=1 +MM3 net04 VB1 net018 VSS nfet_03v3 w=6u l=0.56u nf=12 m=1 +MM4 VOUT1 VB1 net016 VSS nfet_03v3 w=6u l=0.56u nf=12 m=1 +MM5 net04 net04 net019 VDD pfet_03v3 w=6u l=0.56u nf=12 m=1 +MM6 VOUT1 net04 net017 VDD pfet_03v3 w=6u l=0.56u nf=12 m=1 +MM7 net019 net019 VDD VDD pfet_03v3 w=6u l=0.56u nf=12 m=1 +MM8 net017 net019 VDD VDD pfet_03v3 w=6u l=0.56u nf=12 m=1 +.ends C09_gf180_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1.5_sL1/target_lvs.spice new file mode 100644 index 00000000..c8b8ca31 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1.5_sL1/target_lvs.spice @@ -0,0 +1,98 @@ +.subckt C09_gf180_sW1.5_sL1 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 +MM1_f0 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f1 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f2 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f3 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f4 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f5 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f6 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f7 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f8 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f9 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f10 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f11 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f0 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f1 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f2 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f3 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f4 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f5 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f6 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f7 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f8 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f9 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f10 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f11 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f0 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f1 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f2 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f3 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f4 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f5 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f6 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f7 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f8 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f9 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f10 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f11 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=0.56u +MM4_f0 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=0.56u +MM4_f1 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=0.56u +MM4_f2 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=0.56u +MM4_f3 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=0.56u +MM4_f4 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=0.56u +MM4_f5 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=0.56u +MM4_f6 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=0.56u +MM4_f7 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=0.56u +MM4_f8 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=0.56u +MM4_f9 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=0.56u +MM4_f10 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=0.56u +MM4_f11 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f0 net04 net04 net019 VDD pfet_03v3 w=0.5u l=0.56u +MM5_f1 net04 net04 net019 VDD pfet_03v3 w=0.5u l=0.56u +MM5_f2 net04 net04 net019 VDD pfet_03v3 w=0.5u l=0.56u +MM5_f3 net04 net04 net019 VDD pfet_03v3 w=0.5u l=0.56u +MM5_f4 net04 net04 net019 VDD pfet_03v3 w=0.5u l=0.56u +MM5_f5 net04 net04 net019 VDD pfet_03v3 w=0.5u l=0.56u +MM5_f6 net04 net04 net019 VDD pfet_03v3 w=0.5u l=0.56u +MM5_f7 net04 net04 net019 VDD pfet_03v3 w=0.5u l=0.56u +MM5_f8 net04 net04 net019 VDD pfet_03v3 w=0.5u l=0.56u +MM5_f9 net04 net04 net019 VDD pfet_03v3 w=0.5u l=0.56u +MM5_f10 net04 net04 net019 VDD pfet_03v3 w=0.5u l=0.56u +MM5_f11 net04 net04 net019 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f0 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f1 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f2 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f3 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f4 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f5 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f6 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f7 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f8 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f9 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f10 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f11 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=0.56u +MM7_f0 net019 net019 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM7_f1 net019 net019 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM7_f2 net019 net019 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM7_f3 net019 net019 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM7_f4 net019 net019 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM7_f5 net019 net019 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM7_f6 net019 net019 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM7_f7 net019 net019 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM7_f8 net019 net019 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM7_f9 net019 net019 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM7_f10 net019 net019 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM7_f11 net019 net019 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM8_f0 net017 net019 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM8_f1 net017 net019 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM8_f2 net017 net019 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM8_f3 net017 net019 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM8_f4 net017 net019 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM8_f5 net017 net019 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM8_f6 net017 net019 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM8_f7 net017 net019 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM8_f8 net017 net019 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM8_f9 net017 net019 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM8_f10 net017 net019 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM8_f11 net017 net019 VDD VDD pfet_03v3 w=0.5u l=0.56u +.ends C09_gf180_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1.5_sL1/testbench.spice new file mode 100644 index 00000000..464ade6e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1.5_sL1/testbench.spice @@ -0,0 +1,42 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 C09_gf180_sW1.5_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIB1 IB1 VSS 4e-05 +.nodeset v(IB1)=2.31 +MB_VB1 VB1 VB1 VSS VSS nfet_03v3 w=6u l=0.56u +IB_VB1 VDDB VB1 8e-05 +MB_GS_M3 GS_M3 GS_M3 VSS VSS nfet_03v3 w=6u l=0.56u +IB_GS_M3 VDDB GS_M3 2e-05 +MB_GS_M1 GS_M1 GS_M1 VSS VSS nfet_03v3 w=6u l=0.56u +IB_GS_M1 VDDB GS_M1 2e-05 +B_VCM VCM 0 V = v(VB1) - v(GS_M3) + v(GS_M1) - 0.1 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 1.485 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN2 VCM VINT 0 1 +EIN VIN1 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN2) - v(VIN1) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1.5_sL2/case.json new file mode 100644 index 00000000..4cb064c8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1.5_sL2/case.json @@ -0,0 +1,235 @@ +{ + "case_id": "C09_gf180_sW1.5_sL2", + "circuit_id": "C09", + "pdk": "gf180", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "dut_name": "C09_gf180_sW1.5_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VB1", + "IB1" + ], + "sizing": { + "M1": { + "w": 6.0, + "l": 1.12, + "nf": 12 + }, + "M2": { + "w": 6.0, + "l": 1.12, + "nf": 12 + }, + "M3": { + "w": 6.0, + "l": 1.12, + "nf": 12 + }, + "M4": { + "w": 6.0, + "l": 1.12, + "nf": 12 + }, + "M5": { + "w": 6.0, + "l": 1.12, + "nf": 12 + }, + "M6": { + "w": 6.0, + "l": 1.12, + "nf": 12 + }, + "M7": { + "w": 6.0, + "l": 1.12, + "nf": 12 + }, + "M8": { + "w": 6.0, + "l": 1.12, + "nf": 12 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 2e-05, + "kind": "cascode" + }, + "IB1": { + "i": 4e-05, + "from": "VSS" + } + }, + "load": { + "vcm": { + "expr": "v(VB1) - gs(M3) + gs(M1) - 0.1", + "currents": { + "M3": 2e-05, + "M1": 2e-05 + } + }, + "CL": 1e-12, + "inv_input": "VIN2", + "vout_target": 1.4849999999999999 + }, + "category": "ota", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "ac4979c19963d71c", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 2e-05, + "variant": "cascode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1.5_sL2/manifest.json new file mode 100644 index 00000000..cd9d036b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "4d9e4701afcd24a2a261f113b73163a4bd288db965e9062fc5cc9b8fbbb8d6d5", + "qualification.json": "120761fd6978224c7da9d537b999e0adb28c469d033797467835ab420eb603be", + "specs.json": "d18dd598fb9263e1f0319fb92abd6eca8f57df38cef22733463edfc3bb29afea", + "target.spice": "40fa0d68cb53fdf0982b5d7ac943842e160b4d1c7bc6c58e8b3d0237fcfa433f", + "target_lvs.spice": "2ab24ee26402f4b1f5f0d5bd9b34e8c4217594a4110d7b70cc01b730fa22f99c", + "testbench.spice": "e013c59e59c17ecd7db782cb4228d987827366b9d0898e1aa76ddf411377a81c" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1.5_sL2/qualification.json new file mode 100644 index 00000000..6f0a634e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1.5_sL2/qualification.json @@ -0,0 +1,158 @@ +{ + "case_id": "C09_gf180_sW1.5_sL2", + "circuit_id": "C09", + "pdk": "gf180", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "ota", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "ac4979c19963d71c", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 46.03 + }, + "ugf": { + "min": 2773000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 49.03029, + "ugf": 4621210.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.4, + "schematic_measures": { + "vout0": 1.484996, + "idd": 4.000003e-05, + "vos": -0.0438883, + "gain_lf": 49.03029, + "ph_lf": 0.01109919, + "ugf": 4621210.0, + "ph_ugf": -90.71342, + "f3db": 16290.77, + "pm": 89.27548081 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1.5_sL2/specs.json new file mode 100644 index 00000000..084dfefd --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1.5_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 46.03 + }, + "ugf": { + "min": 2773000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 49.03029, + "ugf": 4621210.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1.5_sL2/target.spice new file mode 100644 index 00000000..ff4cf616 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1.5_sL2/target.spice @@ -0,0 +1,10 @@ +.subckt C09_gf180_sW1.5_sL2 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 +MM1 net018 VIN1 IB1 VSS nfet_03v3 w=6u l=1.12u nf=12 m=1 +MM2 net016 VIN2 IB1 VSS nfet_03v3 w=6u l=1.12u nf=12 m=1 +MM3 net04 VB1 net018 VSS nfet_03v3 w=6u l=1.12u nf=12 m=1 +MM4 VOUT1 VB1 net016 VSS nfet_03v3 w=6u l=1.12u nf=12 m=1 +MM5 net04 net04 net019 VDD pfet_03v3 w=6u l=1.12u nf=12 m=1 +MM6 VOUT1 net04 net017 VDD pfet_03v3 w=6u l=1.12u nf=12 m=1 +MM7 net019 net019 VDD VDD pfet_03v3 w=6u l=1.12u nf=12 m=1 +MM8 net017 net019 VDD VDD pfet_03v3 w=6u l=1.12u nf=12 m=1 +.ends C09_gf180_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1.5_sL2/target_lvs.spice new file mode 100644 index 00000000..c395805b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1.5_sL2/target_lvs.spice @@ -0,0 +1,98 @@ +.subckt C09_gf180_sW1.5_sL2 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 +MM1_f0 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f1 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f2 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f3 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f4 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f5 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f6 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f7 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f8 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f9 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f10 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f11 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f0 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f1 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f2 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f3 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f4 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f5 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f6 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f7 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f8 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f9 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f10 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f11 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f0 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f1 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f2 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f3 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f4 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f5 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f6 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f7 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f8 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f9 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f10 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f11 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=1.12u +MM4_f0 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=1.12u +MM4_f1 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=1.12u +MM4_f2 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=1.12u +MM4_f3 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=1.12u +MM4_f4 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=1.12u +MM4_f5 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=1.12u +MM4_f6 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=1.12u +MM4_f7 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=1.12u +MM4_f8 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=1.12u +MM4_f9 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=1.12u +MM4_f10 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=1.12u +MM4_f11 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f0 net04 net04 net019 VDD pfet_03v3 w=0.5u l=1.12u +MM5_f1 net04 net04 net019 VDD pfet_03v3 w=0.5u l=1.12u +MM5_f2 net04 net04 net019 VDD pfet_03v3 w=0.5u l=1.12u +MM5_f3 net04 net04 net019 VDD pfet_03v3 w=0.5u l=1.12u +MM5_f4 net04 net04 net019 VDD pfet_03v3 w=0.5u l=1.12u +MM5_f5 net04 net04 net019 VDD pfet_03v3 w=0.5u l=1.12u +MM5_f6 net04 net04 net019 VDD pfet_03v3 w=0.5u l=1.12u +MM5_f7 net04 net04 net019 VDD pfet_03v3 w=0.5u l=1.12u +MM5_f8 net04 net04 net019 VDD pfet_03v3 w=0.5u l=1.12u +MM5_f9 net04 net04 net019 VDD pfet_03v3 w=0.5u l=1.12u +MM5_f10 net04 net04 net019 VDD pfet_03v3 w=0.5u l=1.12u +MM5_f11 net04 net04 net019 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f0 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f1 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f2 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f3 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f4 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f5 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f6 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f7 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f8 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f9 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f10 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f11 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=1.12u +MM7_f0 net019 net019 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM7_f1 net019 net019 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM7_f2 net019 net019 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM7_f3 net019 net019 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM7_f4 net019 net019 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM7_f5 net019 net019 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM7_f6 net019 net019 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM7_f7 net019 net019 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM7_f8 net019 net019 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM7_f9 net019 net019 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM7_f10 net019 net019 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM7_f11 net019 net019 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM8_f0 net017 net019 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM8_f1 net017 net019 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM8_f2 net017 net019 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM8_f3 net017 net019 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM8_f4 net017 net019 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM8_f5 net017 net019 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM8_f6 net017 net019 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM8_f7 net017 net019 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM8_f8 net017 net019 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM8_f9 net017 net019 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM8_f10 net017 net019 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM8_f11 net017 net019 VDD VDD pfet_03v3 w=0.5u l=1.12u +.ends C09_gf180_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1.5_sL2/testbench.spice new file mode 100644 index 00000000..e5500f44 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1.5_sL2/testbench.spice @@ -0,0 +1,42 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 C09_gf180_sW1.5_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIB1 IB1 VSS 4e-05 +.nodeset v(IB1)=2.31 +MB_VB1 VB1 VB1 VSS VSS nfet_03v3 w=6u l=1.12u +IB_VB1 VDDB VB1 8e-05 +MB_GS_M3 GS_M3 GS_M3 VSS VSS nfet_03v3 w=6u l=1.12u +IB_GS_M3 VDDB GS_M3 2e-05 +MB_GS_M1 GS_M1 GS_M1 VSS VSS nfet_03v3 w=6u l=1.12u +IB_GS_M1 VDDB GS_M1 2e-05 +B_VCM VCM 0 V = v(VB1) - v(GS_M3) + v(GS_M1) - 0.1 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 1.485 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN2 VCM VINT 0 1 +EIN VIN1 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN2) - v(VIN1) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1_sL1.5/case.json new file mode 100644 index 00000000..cd21843e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1_sL1.5/case.json @@ -0,0 +1,235 @@ +{ + "case_id": "C09_gf180_sW1_sL1.5", + "circuit_id": "C09", + "pdk": "gf180", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "dut_name": "C09_gf180_sW1_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VB1", + "IB1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.84, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 0.84, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 0.84, + "nf": 8 + }, + "M4": { + "w": 4.0, + "l": 0.84, + "nf": 8 + }, + "M5": { + "w": 4.0, + "l": 0.84, + "nf": 8 + }, + "M6": { + "w": 4.0, + "l": 0.84, + "nf": 8 + }, + "M7": { + "w": 4.0, + "l": 0.84, + "nf": 8 + }, + "M8": { + "w": 4.0, + "l": 0.84, + "nf": 8 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 2e-05, + "kind": "cascode" + }, + "IB1": { + "i": 4e-05, + "from": "VSS" + } + }, + "load": { + "vcm": { + "expr": "v(VB1) - gs(M3) + gs(M1) - 0.1", + "currents": { + "M3": 2e-05, + "M1": 2e-05 + } + }, + "CL": 1e-12, + "inv_input": "VIN2", + "vout_target": 1.4849999999999999 + }, + "category": "ota", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "38178daef83b041b", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 2e-05, + "variant": "cascode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1_sL1.5/manifest.json new file mode 100644 index 00000000..c77d9924 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "3c09821c9b79f2f9608b4eeb9bcb76dd01bffd0a299190a52563c836b00393e2", + "qualification.json": "47cc1ce2edd13b10d864602ad517b2d5a442999275d452504c8bb02fd9fd3187", + "specs.json": "87a6b3b12b34792044326f53792416d636cac5dd06c729fddfbf80f9e1ac4147", + "target.spice": "5e7c239b7a597965ad085e7405e325f27de93a6130274f43f3c3bb3ba3d818fe", + "target_lvs.spice": "a28e29dbaaaeaed2524e13c18e96dc84ce74b5b38376d90b28a2959700bca75b", + "testbench.spice": "44367dbb0067ab9a6a0982a567fe8b8938d334ea5ffd2cd652593d514c0eefad" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1_sL1.5/qualification.json new file mode 100644 index 00000000..59f50055 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1_sL1.5/qualification.json @@ -0,0 +1,158 @@ +{ + "case_id": "C09_gf180_sW1_sL1.5", + "circuit_id": "C09", + "pdk": "gf180", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "ota", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "38178daef83b041b", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 42.89 + }, + "ugf": { + "min": 2000000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 45.88616, + "ugf": 3014986.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.3, + "schematic_measures": { + "vout0": 1.48499, + "idd": 4.000002e-05, + "vos": -0.0960662, + "gain_lf": 45.88616, + "ph_lf": -0.02556657, + "ugf": 3014986.0, + "ph_ugf": -89.70507, + "f3db": 15249.72, + "pm": 90.32049656999999 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1_sL1.5/specs.json new file mode 100644 index 00000000..c39e42fd --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 42.89 + }, + "ugf": { + "min": 2000000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 45.88616, + "ugf": 3014986.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1_sL1.5/target.spice new file mode 100644 index 00000000..48a98a76 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1_sL1.5/target.spice @@ -0,0 +1,10 @@ +.subckt C09_gf180_sW1_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 +MM1 net018 VIN1 IB1 VSS nfet_03v3 w=4u l=0.84u nf=8 m=1 +MM2 net016 VIN2 IB1 VSS nfet_03v3 w=4u l=0.84u nf=8 m=1 +MM3 net04 VB1 net018 VSS nfet_03v3 w=4u l=0.84u nf=8 m=1 +MM4 VOUT1 VB1 net016 VSS nfet_03v3 w=4u l=0.84u nf=8 m=1 +MM5 net04 net04 net019 VDD pfet_03v3 w=4u l=0.84u nf=8 m=1 +MM6 VOUT1 net04 net017 VDD pfet_03v3 w=4u l=0.84u nf=8 m=1 +MM7 net019 net019 VDD VDD pfet_03v3 w=4u l=0.84u nf=8 m=1 +MM8 net017 net019 VDD VDD pfet_03v3 w=4u l=0.84u nf=8 m=1 +.ends C09_gf180_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1_sL1.5/target_lvs.spice new file mode 100644 index 00000000..45041bf1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1_sL1.5/target_lvs.spice @@ -0,0 +1,66 @@ +.subckt C09_gf180_sW1_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 +MM1_f0 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f1 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f2 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f3 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f4 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f5 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f6 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f7 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f0 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f1 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f2 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f3 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f4 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f5 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f6 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f7 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f0 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f1 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f2 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f3 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f4 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f5 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f6 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f7 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=0.84u +MM4_f0 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=0.84u +MM4_f1 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=0.84u +MM4_f2 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=0.84u +MM4_f3 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=0.84u +MM4_f4 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=0.84u +MM4_f5 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=0.84u +MM4_f6 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=0.84u +MM4_f7 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f0 net04 net04 net019 VDD pfet_03v3 w=0.5u l=0.84u +MM5_f1 net04 net04 net019 VDD pfet_03v3 w=0.5u l=0.84u +MM5_f2 net04 net04 net019 VDD pfet_03v3 w=0.5u l=0.84u +MM5_f3 net04 net04 net019 VDD pfet_03v3 w=0.5u l=0.84u +MM5_f4 net04 net04 net019 VDD pfet_03v3 w=0.5u l=0.84u +MM5_f5 net04 net04 net019 VDD pfet_03v3 w=0.5u l=0.84u +MM5_f6 net04 net04 net019 VDD pfet_03v3 w=0.5u l=0.84u +MM5_f7 net04 net04 net019 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f0 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f1 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f2 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f3 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f4 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f5 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f6 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f7 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=0.84u +MM7_f0 net019 net019 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM7_f1 net019 net019 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM7_f2 net019 net019 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM7_f3 net019 net019 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM7_f4 net019 net019 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM7_f5 net019 net019 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM7_f6 net019 net019 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM7_f7 net019 net019 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM8_f0 net017 net019 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM8_f1 net017 net019 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM8_f2 net017 net019 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM8_f3 net017 net019 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM8_f4 net017 net019 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM8_f5 net017 net019 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM8_f6 net017 net019 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM8_f7 net017 net019 VDD VDD pfet_03v3 w=0.5u l=0.84u +.ends C09_gf180_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1_sL1.5/testbench.spice new file mode 100644 index 00000000..d3bfdd08 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1_sL1.5/testbench.spice @@ -0,0 +1,42 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 C09_gf180_sW1_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIB1 IB1 VSS 4e-05 +.nodeset v(IB1)=2.31 +MB_VB1 VB1 VB1 VSS VSS nfet_03v3 w=4u l=0.84u +IB_VB1 VDDB VB1 8e-05 +MB_GS_M3 GS_M3 GS_M3 VSS VSS nfet_03v3 w=4u l=0.84u +IB_GS_M3 VDDB GS_M3 2e-05 +MB_GS_M1 GS_M1 GS_M1 VSS VSS nfet_03v3 w=4u l=0.84u +IB_GS_M1 VDDB GS_M1 2e-05 +B_VCM VCM 0 V = v(VB1) - v(GS_M3) + v(GS_M1) - 0.1 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 1.485 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN2 VCM VINT 0 1 +EIN VIN1 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN2) - v(VIN1) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1_sL1/case.json new file mode 100644 index 00000000..50b1d3c5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1_sL1/case.json @@ -0,0 +1,235 @@ +{ + "case_id": "C09_gf180_sW1_sL1", + "circuit_id": "C09", + "pdk": "gf180", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "dut_name": "C09_gf180_sW1_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VB1", + "IB1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "M4": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "M5": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "M6": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "M7": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "M8": { + "w": 4.0, + "l": 0.56, + "nf": 8 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 2e-05, + "kind": "cascode" + }, + "IB1": { + "i": 4e-05, + "from": "VSS" + } + }, + "load": { + "vcm": { + "expr": "v(VB1) - gs(M3) + gs(M1) - 0.1", + "currents": { + "M3": 2e-05, + "M1": 2e-05 + } + }, + "CL": 1e-12, + "inv_input": "VIN2", + "vout_target": 1.4849999999999999 + }, + "category": "ota", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "9d6eb97d1f873d08", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 2e-05, + "variant": "cascode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1_sL1/manifest.json new file mode 100644 index 00000000..0e2ed012 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "51ac5b16d44b961dc89010a784dfafb530ed31069a86b34aee15f0ff134bd99a", + "qualification.json": "78e7940365bdd29bc5293d0c5c8b45774f1096f4348e1b88defb03abc96b7b2d", + "specs.json": "bc82202be3c92f96fcf12f6337ac15ce523c155da19527673fec59d4a38c617f", + "target.spice": "532afb94e39252eeab1c4cc07254cf89a7235c01267d1d889f92109e2657e526", + "target_lvs.spice": "f89c820673f1ffb3d6f685683e9a4b132342a170382151b1a11296271d9075e2", + "testbench.spice": "8817ef1298d2adae1fd3ba21ef4318ab1103729d9ecfea5f2e605a83a7b9deca" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1_sL1/qualification.json new file mode 100644 index 00000000..199ea1c8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1_sL1/qualification.json @@ -0,0 +1,158 @@ +{ + "case_id": "C09_gf180_sW1_sL1", + "circuit_id": "C09", + "pdk": "gf180", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "ota", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "9d6eb97d1f873d08", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 42.52 + }, + "ugf": { + "min": 6008000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 45.52368, + "ugf": 10013880.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.3, + "schematic_measures": { + "vout0": 1.484999, + "idd": 4.000002e-05, + "vos": -0.00707075, + "gain_lf": 45.52368, + "ph_lf": 0.07554511, + "ugf": 10013880.0, + "ph_ugf": -91.24582, + "f3db": 52922.97, + "pm": 88.67863489000001 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1_sL1/specs.json new file mode 100644 index 00000000..5ddae9d9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 42.52 + }, + "ugf": { + "min": 6008000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 45.52368, + "ugf": 10013880.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1_sL1/target.spice new file mode 100644 index 00000000..921ff727 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1_sL1/target.spice @@ -0,0 +1,10 @@ +.subckt C09_gf180_sW1_sL1 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 +MM1 net018 VIN1 IB1 VSS nfet_03v3 w=4u l=0.56u nf=8 m=1 +MM2 net016 VIN2 IB1 VSS nfet_03v3 w=4u l=0.56u nf=8 m=1 +MM3 net04 VB1 net018 VSS nfet_03v3 w=4u l=0.56u nf=8 m=1 +MM4 VOUT1 VB1 net016 VSS nfet_03v3 w=4u l=0.56u nf=8 m=1 +MM5 net04 net04 net019 VDD pfet_03v3 w=4u l=0.56u nf=8 m=1 +MM6 VOUT1 net04 net017 VDD pfet_03v3 w=4u l=0.56u nf=8 m=1 +MM7 net019 net019 VDD VDD pfet_03v3 w=4u l=0.56u nf=8 m=1 +MM8 net017 net019 VDD VDD pfet_03v3 w=4u l=0.56u nf=8 m=1 +.ends C09_gf180_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1_sL1/target_lvs.spice new file mode 100644 index 00000000..72cf77e0 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1_sL1/target_lvs.spice @@ -0,0 +1,66 @@ +.subckt C09_gf180_sW1_sL1 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 +MM1_f0 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f1 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f2 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f3 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f4 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f5 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f6 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f7 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f0 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f1 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f2 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f3 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f4 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f5 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f6 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f7 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f0 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f1 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f2 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f3 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f4 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f5 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f6 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f7 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=0.56u +MM4_f0 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=0.56u +MM4_f1 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=0.56u +MM4_f2 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=0.56u +MM4_f3 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=0.56u +MM4_f4 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=0.56u +MM4_f5 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=0.56u +MM4_f6 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=0.56u +MM4_f7 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f0 net04 net04 net019 VDD pfet_03v3 w=0.5u l=0.56u +MM5_f1 net04 net04 net019 VDD pfet_03v3 w=0.5u l=0.56u +MM5_f2 net04 net04 net019 VDD pfet_03v3 w=0.5u l=0.56u +MM5_f3 net04 net04 net019 VDD pfet_03v3 w=0.5u l=0.56u +MM5_f4 net04 net04 net019 VDD pfet_03v3 w=0.5u l=0.56u +MM5_f5 net04 net04 net019 VDD pfet_03v3 w=0.5u l=0.56u +MM5_f6 net04 net04 net019 VDD pfet_03v3 w=0.5u l=0.56u +MM5_f7 net04 net04 net019 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f0 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f1 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f2 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f3 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f4 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f5 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f6 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f7 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=0.56u +MM7_f0 net019 net019 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM7_f1 net019 net019 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM7_f2 net019 net019 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM7_f3 net019 net019 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM7_f4 net019 net019 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM7_f5 net019 net019 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM7_f6 net019 net019 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM7_f7 net019 net019 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM8_f0 net017 net019 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM8_f1 net017 net019 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM8_f2 net017 net019 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM8_f3 net017 net019 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM8_f4 net017 net019 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM8_f5 net017 net019 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM8_f6 net017 net019 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM8_f7 net017 net019 VDD VDD pfet_03v3 w=0.5u l=0.56u +.ends C09_gf180_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1_sL1/testbench.spice new file mode 100644 index 00000000..301aca3c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1_sL1/testbench.spice @@ -0,0 +1,42 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 C09_gf180_sW1_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIB1 IB1 VSS 4e-05 +.nodeset v(IB1)=2.31 +MB_VB1 VB1 VB1 VSS VSS nfet_03v3 w=4u l=0.56u +IB_VB1 VDDB VB1 8e-05 +MB_GS_M3 GS_M3 GS_M3 VSS VSS nfet_03v3 w=4u l=0.56u +IB_GS_M3 VDDB GS_M3 2e-05 +MB_GS_M1 GS_M1 GS_M1 VSS VSS nfet_03v3 w=4u l=0.56u +IB_GS_M1 VDDB GS_M1 2e-05 +B_VCM VCM 0 V = v(VB1) - v(GS_M3) + v(GS_M1) - 0.1 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 1.485 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN2 VCM VINT 0 1 +EIN VIN1 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN2) - v(VIN1) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1_sL2/case.json new file mode 100644 index 00000000..1eb1a347 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1_sL2/case.json @@ -0,0 +1,235 @@ +{ + "case_id": "C09_gf180_sW1_sL2", + "circuit_id": "C09", + "pdk": "gf180", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "dut_name": "C09_gf180_sW1_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VB1", + "IB1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 1.12, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 1.12, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 1.12, + "nf": 8 + }, + "M4": { + "w": 4.0, + "l": 1.12, + "nf": 8 + }, + "M5": { + "w": 4.0, + "l": 1.12, + "nf": 8 + }, + "M6": { + "w": 4.0, + "l": 1.12, + "nf": 8 + }, + "M7": { + "w": 4.0, + "l": 1.12, + "nf": 8 + }, + "M8": { + "w": 4.0, + "l": 1.12, + "nf": 8 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 2e-05, + "kind": "cascode" + }, + "IB1": { + "i": 4e-05, + "from": "VSS" + } + }, + "load": { + "vcm": { + "expr": "v(VB1) - gs(M3) + gs(M1) - 0.1", + "currents": { + "M3": 2e-05, + "M1": 2e-05 + } + }, + "CL": 1e-12, + "inv_input": "VIN2", + "vout_target": 1.4849999999999999 + }, + "category": "ota", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "1564b7b67504e34e", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 2e-05, + "variant": "cascode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1_sL2/manifest.json new file mode 100644 index 00000000..ba54959c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "bf3538650c8b50f043513c3638c58bf4f9267d18d6db3e872d98d1797678ab53", + "qualification.json": "aa2040313ccd8025d9266cbe489bab45214eef9db9926efe5b8bd0878d52fa70", + "specs.json": "77a626c61656167e95f5902c6425c5c1a870dcdfae020e521eb9c1f6a7b83fdd", + "target.spice": "ff50a45ec8ffb725bfb8b2515b72f43b7629c48087f1373e12f33f94558e7a88", + "target_lvs.spice": "2f5301fbc9cec8dcb8f2436b4c734f9b1133a49ea1e642453062fdf6fe0f5b16", + "testbench.spice": "a4aec56a38d16ae71b9705155412cec854ba7846e5927fac054522d6b41b5f8a" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1_sL2/qualification.json new file mode 100644 index 00000000..20fcb6d6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1_sL2/qualification.json @@ -0,0 +1,160 @@ +{ + "case_id": "C09_gf180_sW1_sL2", + "circuit_id": "C09", + "pdk": "gf180", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "ota", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "1564b7b67504e34e", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "ugf=7.508e+05 below floor 2e+06" + ], + "spec": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 35.77727, + "ugf": 750824.1 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.3, + "schematic_measures": { + "vout0": 1.484953, + "idd": 4.000001e-05, + "vos": -0.367095, + "gain_lf": 35.77727, + "ph_lf": -0.2812141, + "ugf": 750824.1, + "ph_ugf": -88.33157, + "f3db": 12159.9, + "pm": 91.9496441 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1_sL2/specs.json new file mode 100644 index 00000000..41dc33d2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 35.77727, + "ugf": 750824.1 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1_sL2/target.spice new file mode 100644 index 00000000..dda8e56a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1_sL2/target.spice @@ -0,0 +1,10 @@ +.subckt C09_gf180_sW1_sL2 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 +MM1 net018 VIN1 IB1 VSS nfet_03v3 w=4u l=1.12u nf=8 m=1 +MM2 net016 VIN2 IB1 VSS nfet_03v3 w=4u l=1.12u nf=8 m=1 +MM3 net04 VB1 net018 VSS nfet_03v3 w=4u l=1.12u nf=8 m=1 +MM4 VOUT1 VB1 net016 VSS nfet_03v3 w=4u l=1.12u nf=8 m=1 +MM5 net04 net04 net019 VDD pfet_03v3 w=4u l=1.12u nf=8 m=1 +MM6 VOUT1 net04 net017 VDD pfet_03v3 w=4u l=1.12u nf=8 m=1 +MM7 net019 net019 VDD VDD pfet_03v3 w=4u l=1.12u nf=8 m=1 +MM8 net017 net019 VDD VDD pfet_03v3 w=4u l=1.12u nf=8 m=1 +.ends C09_gf180_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1_sL2/target_lvs.spice new file mode 100644 index 00000000..e16bda70 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1_sL2/target_lvs.spice @@ -0,0 +1,66 @@ +.subckt C09_gf180_sW1_sL2 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 +MM1_f0 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f1 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f2 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f3 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f4 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f5 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f6 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f7 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f0 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f1 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f2 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f3 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f4 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f5 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f6 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f7 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f0 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f1 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f2 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f3 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f4 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f5 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f6 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f7 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=1.12u +MM4_f0 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=1.12u +MM4_f1 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=1.12u +MM4_f2 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=1.12u +MM4_f3 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=1.12u +MM4_f4 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=1.12u +MM4_f5 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=1.12u +MM4_f6 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=1.12u +MM4_f7 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f0 net04 net04 net019 VDD pfet_03v3 w=0.5u l=1.12u +MM5_f1 net04 net04 net019 VDD pfet_03v3 w=0.5u l=1.12u +MM5_f2 net04 net04 net019 VDD pfet_03v3 w=0.5u l=1.12u +MM5_f3 net04 net04 net019 VDD pfet_03v3 w=0.5u l=1.12u +MM5_f4 net04 net04 net019 VDD pfet_03v3 w=0.5u l=1.12u +MM5_f5 net04 net04 net019 VDD pfet_03v3 w=0.5u l=1.12u +MM5_f6 net04 net04 net019 VDD pfet_03v3 w=0.5u l=1.12u +MM5_f7 net04 net04 net019 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f0 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f1 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f2 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f3 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f4 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f5 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f6 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f7 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=1.12u +MM7_f0 net019 net019 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM7_f1 net019 net019 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM7_f2 net019 net019 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM7_f3 net019 net019 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM7_f4 net019 net019 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM7_f5 net019 net019 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM7_f6 net019 net019 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM7_f7 net019 net019 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM8_f0 net017 net019 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM8_f1 net017 net019 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM8_f2 net017 net019 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM8_f3 net017 net019 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM8_f4 net017 net019 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM8_f5 net017 net019 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM8_f6 net017 net019 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM8_f7 net017 net019 VDD VDD pfet_03v3 w=0.5u l=1.12u +.ends C09_gf180_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1_sL2/testbench.spice new file mode 100644 index 00000000..5366c5c7 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW1_sL2/testbench.spice @@ -0,0 +1,42 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 C09_gf180_sW1_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIB1 IB1 VSS 4e-05 +.nodeset v(IB1)=2.31 +MB_VB1 VB1 VB1 VSS VSS nfet_03v3 w=4u l=1.12u +IB_VB1 VDDB VB1 8e-05 +MB_GS_M3 GS_M3 GS_M3 VSS VSS nfet_03v3 w=4u l=1.12u +IB_GS_M3 VDDB GS_M3 2e-05 +MB_GS_M1 GS_M1 GS_M1 VSS VSS nfet_03v3 w=4u l=1.12u +IB_GS_M1 VDDB GS_M1 2e-05 +B_VCM VCM 0 V = v(VB1) - v(GS_M3) + v(GS_M1) - 0.1 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 1.485 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN2 VCM VINT 0 1 +EIN VIN1 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN2) - v(VIN1) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C09/gf180/sW2_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW2_sL1.5/case.json new file mode 100644 index 00000000..43ea5e96 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW2_sL1.5/case.json @@ -0,0 +1,235 @@ +{ + "case_id": "C09_gf180_sW2_sL1.5", + "circuit_id": "C09", + "pdk": "gf180", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "dut_name": "C09_gf180_sW2_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VB1", + "IB1" + ], + "sizing": { + "M1": { + "w": 8.0, + "l": 0.84, + "nf": 16 + }, + "M2": { + "w": 8.0, + "l": 0.84, + "nf": 16 + }, + "M3": { + "w": 8.0, + "l": 0.84, + "nf": 16 + }, + "M4": { + "w": 8.0, + "l": 0.84, + "nf": 16 + }, + "M5": { + "w": 8.0, + "l": 0.84, + "nf": 16 + }, + "M6": { + "w": 8.0, + "l": 0.84, + "nf": 16 + }, + "M7": { + "w": 8.0, + "l": 0.84, + "nf": 16 + }, + "M8": { + "w": 8.0, + "l": 0.84, + "nf": 16 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 2e-05, + "kind": "cascode" + }, + "IB1": { + "i": 4e-05, + "from": "VSS" + } + }, + "load": { + "vcm": { + "expr": "v(VB1) - gs(M3) + gs(M1) - 0.1", + "currents": { + "M3": 2e-05, + "M1": 2e-05 + } + }, + "CL": 1e-12, + "inv_input": "VIN2", + "vout_target": 1.4849999999999999 + }, + "category": "ota", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "f25508dd5db37001", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 2e-05, + "variant": "cascode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/gf180/sW2_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW2_sL1.5/manifest.json new file mode 100644 index 00000000..4a722c58 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW2_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "9972465683243afa37837c073c4ba4b7154382cbf66fccef5d9d1e17d9654101", + "qualification.json": "954c40d08014eb7cc329cfdcf8f577b220d9d2c75aaedf4517d75ef2205153b0", + "specs.json": "7815d582a99eee4d1b300325a4b438bd5a4576c5630147529cce0976146c10ae", + "target.spice": "86321622aa9740fe03b284cc126e2b0e5728e2cf5413120de80ba4fc5426ebfa", + "target_lvs.spice": "72cf6b4bffc598be09794724da612b809d992f60084cebe50114a99ebcb85a7a", + "testbench.spice": "db16570e476d97674625c1e87b9cf2dfffe8e46e8b2dbc9a5c2910d931675752" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/gf180/sW2_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW2_sL1.5/qualification.json new file mode 100644 index 00000000..0fec488e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW2_sL1.5/qualification.json @@ -0,0 +1,158 @@ +{ + "case_id": "C09_gf180_sW2_sL1.5", + "circuit_id": "C09", + "pdk": "gf180", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "ota", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "f25508dd5db37001", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 48.16 + }, + "ugf": { + "min": 7397000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 51.15948, + "ugf": 12328900.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.4, + "schematic_measures": { + "vout0": 1.485, + "idd": 4.000005e-05, + "vos": -0.00304527, + "gain_lf": 51.15948, + "ph_lf": 0.173299, + "ugf": 12328900.0, + "ph_ugf": -94.13874, + "f3db": 34166.46, + "pm": 85.687961 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/gf180/sW2_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW2_sL1.5/specs.json new file mode 100644 index 00000000..955d2e26 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW2_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 48.16 + }, + "ugf": { + "min": 7397000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 51.15948, + "ugf": 12328900.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/gf180/sW2_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW2_sL1.5/target.spice new file mode 100644 index 00000000..81b41f45 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW2_sL1.5/target.spice @@ -0,0 +1,10 @@ +.subckt C09_gf180_sW2_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 +MM1 net018 VIN1 IB1 VSS nfet_03v3 w=8u l=0.84u nf=16 m=1 +MM2 net016 VIN2 IB1 VSS nfet_03v3 w=8u l=0.84u nf=16 m=1 +MM3 net04 VB1 net018 VSS nfet_03v3 w=8u l=0.84u nf=16 m=1 +MM4 VOUT1 VB1 net016 VSS nfet_03v3 w=8u l=0.84u nf=16 m=1 +MM5 net04 net04 net019 VDD pfet_03v3 w=8u l=0.84u nf=16 m=1 +MM6 VOUT1 net04 net017 VDD pfet_03v3 w=8u l=0.84u nf=16 m=1 +MM7 net019 net019 VDD VDD pfet_03v3 w=8u l=0.84u nf=16 m=1 +MM8 net017 net019 VDD VDD pfet_03v3 w=8u l=0.84u nf=16 m=1 +.ends C09_gf180_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C09/gf180/sW2_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW2_sL1.5/target_lvs.spice new file mode 100644 index 00000000..572cefcc --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW2_sL1.5/target_lvs.spice @@ -0,0 +1,130 @@ +.subckt C09_gf180_sW2_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 +MM1_f0 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f1 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f2 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f3 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f4 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f5 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f6 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f7 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f8 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f9 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f10 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f11 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f12 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f13 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f14 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f15 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f0 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f1 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f2 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f3 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f4 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f5 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f6 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f7 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f8 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f9 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f10 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f11 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f12 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f13 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f14 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f15 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f0 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f1 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f2 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f3 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f4 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f5 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f6 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f7 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f8 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f9 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f10 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f11 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f12 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f13 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f14 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f15 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=0.84u +MM4_f0 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=0.84u +MM4_f1 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=0.84u +MM4_f2 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=0.84u +MM4_f3 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=0.84u +MM4_f4 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=0.84u +MM4_f5 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=0.84u +MM4_f6 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=0.84u +MM4_f7 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=0.84u +MM4_f8 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=0.84u +MM4_f9 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=0.84u +MM4_f10 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=0.84u +MM4_f11 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=0.84u +MM4_f12 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=0.84u +MM4_f13 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=0.84u +MM4_f14 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=0.84u +MM4_f15 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f0 net04 net04 net019 VDD pfet_03v3 w=0.5u l=0.84u +MM5_f1 net04 net04 net019 VDD pfet_03v3 w=0.5u l=0.84u +MM5_f2 net04 net04 net019 VDD pfet_03v3 w=0.5u l=0.84u +MM5_f3 net04 net04 net019 VDD pfet_03v3 w=0.5u l=0.84u +MM5_f4 net04 net04 net019 VDD pfet_03v3 w=0.5u l=0.84u +MM5_f5 net04 net04 net019 VDD pfet_03v3 w=0.5u l=0.84u +MM5_f6 net04 net04 net019 VDD pfet_03v3 w=0.5u l=0.84u +MM5_f7 net04 net04 net019 VDD pfet_03v3 w=0.5u l=0.84u +MM5_f8 net04 net04 net019 VDD pfet_03v3 w=0.5u l=0.84u +MM5_f9 net04 net04 net019 VDD pfet_03v3 w=0.5u l=0.84u +MM5_f10 net04 net04 net019 VDD pfet_03v3 w=0.5u l=0.84u +MM5_f11 net04 net04 net019 VDD pfet_03v3 w=0.5u l=0.84u +MM5_f12 net04 net04 net019 VDD pfet_03v3 w=0.5u l=0.84u +MM5_f13 net04 net04 net019 VDD pfet_03v3 w=0.5u l=0.84u +MM5_f14 net04 net04 net019 VDD pfet_03v3 w=0.5u l=0.84u +MM5_f15 net04 net04 net019 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f0 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f1 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f2 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f3 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f4 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f5 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f6 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f7 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f8 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f9 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f10 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f11 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f12 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f13 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f14 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f15 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=0.84u +MM7_f0 net019 net019 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM7_f1 net019 net019 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM7_f2 net019 net019 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM7_f3 net019 net019 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM7_f4 net019 net019 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM7_f5 net019 net019 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM7_f6 net019 net019 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM7_f7 net019 net019 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM7_f8 net019 net019 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM7_f9 net019 net019 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM7_f10 net019 net019 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM7_f11 net019 net019 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM7_f12 net019 net019 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM7_f13 net019 net019 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM7_f14 net019 net019 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM7_f15 net019 net019 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM8_f0 net017 net019 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM8_f1 net017 net019 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM8_f2 net017 net019 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM8_f3 net017 net019 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM8_f4 net017 net019 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM8_f5 net017 net019 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM8_f6 net017 net019 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM8_f7 net017 net019 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM8_f8 net017 net019 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM8_f9 net017 net019 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM8_f10 net017 net019 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM8_f11 net017 net019 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM8_f12 net017 net019 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM8_f13 net017 net019 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM8_f14 net017 net019 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM8_f15 net017 net019 VDD VDD pfet_03v3 w=0.5u l=0.84u +.ends C09_gf180_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C09/gf180/sW2_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW2_sL1.5/testbench.spice new file mode 100644 index 00000000..784bffac --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW2_sL1.5/testbench.spice @@ -0,0 +1,42 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 C09_gf180_sW2_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIB1 IB1 VSS 4e-05 +.nodeset v(IB1)=2.31 +MB_VB1 VB1 VB1 VSS VSS nfet_03v3 w=8u l=0.84u +IB_VB1 VDDB VB1 8e-05 +MB_GS_M3 GS_M3 GS_M3 VSS VSS nfet_03v3 w=8u l=0.84u +IB_GS_M3 VDDB GS_M3 2e-05 +MB_GS_M1 GS_M1 GS_M1 VSS VSS nfet_03v3 w=8u l=0.84u +IB_GS_M1 VDDB GS_M1 2e-05 +B_VCM VCM 0 V = v(VB1) - v(GS_M3) + v(GS_M1) - 0.1 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 1.485 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN2 VCM VINT 0 1 +EIN VIN1 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN2) - v(VIN1) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C09/gf180/sW2_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW2_sL1/case.json new file mode 100644 index 00000000..8b26fe59 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW2_sL1/case.json @@ -0,0 +1,235 @@ +{ + "case_id": "C09_gf180_sW2_sL1", + "circuit_id": "C09", + "pdk": "gf180", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "dut_name": "C09_gf180_sW2_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VB1", + "IB1" + ], + "sizing": { + "M1": { + "w": 8.0, + "l": 0.56, + "nf": 16 + }, + "M2": { + "w": 8.0, + "l": 0.56, + "nf": 16 + }, + "M3": { + "w": 8.0, + "l": 0.56, + "nf": 16 + }, + "M4": { + "w": 8.0, + "l": 0.56, + "nf": 16 + }, + "M5": { + "w": 8.0, + "l": 0.56, + "nf": 16 + }, + "M6": { + "w": 8.0, + "l": 0.56, + "nf": 16 + }, + "M7": { + "w": 8.0, + "l": 0.56, + "nf": 16 + }, + "M8": { + "w": 8.0, + "l": 0.56, + "nf": 16 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 2e-05, + "kind": "cascode" + }, + "IB1": { + "i": 4e-05, + "from": "VSS" + } + }, + "load": { + "vcm": { + "expr": "v(VB1) - gs(M3) + gs(M1) - 0.1", + "currents": { + "M3": 2e-05, + "M1": 2e-05 + } + }, + "CL": 1e-12, + "inv_input": "VIN2", + "vout_target": 1.4849999999999999 + }, + "category": "ota", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "08da8cc09fe65eec", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 2e-05, + "variant": "cascode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/gf180/sW2_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW2_sL1/manifest.json new file mode 100644 index 00000000..2550f3b4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW2_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "deb50bfcc8dfa24bc74501460b4409ccbe590a64075149b288161684f20e7bcd", + "qualification.json": "036430b81719f8c4c2e0a74f3260b8b6ca3d76926958ab0f486df5dd847d3d6e", + "specs.json": "98e6e89ab4a4bc35390e7dafd7d754787c8c0a9e01f86c1c738ec15ee355cf3f", + "target.spice": "b1b501e242a9f8a35e45ccca4f961c1f02dbc5385b186d16e9c61984f5288484", + "target_lvs.spice": "d4e3fe71004b07964d29a66cb19ef1b0b027967ccc1db2a16e4ef3b9533603a8", + "testbench.spice": "2a23be530c3e6ebb0f8aa022450c6f8482b53628072b61ba3d4ce02e0c88c9b0" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/gf180/sW2_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW2_sL1/qualification.json new file mode 100644 index 00000000..dfb6215d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW2_sL1/qualification.json @@ -0,0 +1,158 @@ +{ + "case_id": "C09_gf180_sW2_sL1", + "circuit_id": "C09", + "pdk": "gf180", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "ota", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "08da8cc09fe65eec", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 47.26 + }, + "ugf": { + "min": 10270000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 50.26471, + "ugf": 17110230.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.5, + "schematic_measures": { + "vout0": 1.485, + "idd": 4.000005e-05, + "vos": -0.00218438, + "gain_lf": 50.26471, + "ph_lf": 0.1969983, + "ugf": 17110230.0, + "ph_ugf": -93.43458, + "f3db": 52459.47, + "pm": 86.3684217 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/gf180/sW2_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW2_sL1/specs.json new file mode 100644 index 00000000..2245f9d8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW2_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 47.26 + }, + "ugf": { + "min": 10270000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 50.26471, + "ugf": 17110230.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/gf180/sW2_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW2_sL1/target.spice new file mode 100644 index 00000000..db6f617c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW2_sL1/target.spice @@ -0,0 +1,10 @@ +.subckt C09_gf180_sW2_sL1 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 +MM1 net018 VIN1 IB1 VSS nfet_03v3 w=8u l=0.56u nf=16 m=1 +MM2 net016 VIN2 IB1 VSS nfet_03v3 w=8u l=0.56u nf=16 m=1 +MM3 net04 VB1 net018 VSS nfet_03v3 w=8u l=0.56u nf=16 m=1 +MM4 VOUT1 VB1 net016 VSS nfet_03v3 w=8u l=0.56u nf=16 m=1 +MM5 net04 net04 net019 VDD pfet_03v3 w=8u l=0.56u nf=16 m=1 +MM6 VOUT1 net04 net017 VDD pfet_03v3 w=8u l=0.56u nf=16 m=1 +MM7 net019 net019 VDD VDD pfet_03v3 w=8u l=0.56u nf=16 m=1 +MM8 net017 net019 VDD VDD pfet_03v3 w=8u l=0.56u nf=16 m=1 +.ends C09_gf180_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C09/gf180/sW2_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW2_sL1/target_lvs.spice new file mode 100644 index 00000000..d1cc4705 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW2_sL1/target_lvs.spice @@ -0,0 +1,130 @@ +.subckt C09_gf180_sW2_sL1 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 +MM1_f0 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f1 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f2 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f3 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f4 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f5 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f6 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f7 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f8 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f9 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f10 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f11 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f12 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f13 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f14 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f15 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f0 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f1 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f2 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f3 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f4 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f5 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f6 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f7 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f8 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f9 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f10 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f11 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f12 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f13 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f14 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f15 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f0 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f1 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f2 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f3 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f4 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f5 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f6 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f7 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f8 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f9 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f10 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f11 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f12 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f13 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f14 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f15 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=0.56u +MM4_f0 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=0.56u +MM4_f1 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=0.56u +MM4_f2 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=0.56u +MM4_f3 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=0.56u +MM4_f4 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=0.56u +MM4_f5 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=0.56u +MM4_f6 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=0.56u +MM4_f7 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=0.56u +MM4_f8 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=0.56u +MM4_f9 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=0.56u +MM4_f10 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=0.56u +MM4_f11 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=0.56u +MM4_f12 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=0.56u +MM4_f13 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=0.56u +MM4_f14 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=0.56u +MM4_f15 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f0 net04 net04 net019 VDD pfet_03v3 w=0.5u l=0.56u +MM5_f1 net04 net04 net019 VDD pfet_03v3 w=0.5u l=0.56u +MM5_f2 net04 net04 net019 VDD pfet_03v3 w=0.5u l=0.56u +MM5_f3 net04 net04 net019 VDD pfet_03v3 w=0.5u l=0.56u +MM5_f4 net04 net04 net019 VDD pfet_03v3 w=0.5u l=0.56u +MM5_f5 net04 net04 net019 VDD pfet_03v3 w=0.5u l=0.56u +MM5_f6 net04 net04 net019 VDD pfet_03v3 w=0.5u l=0.56u +MM5_f7 net04 net04 net019 VDD pfet_03v3 w=0.5u l=0.56u +MM5_f8 net04 net04 net019 VDD pfet_03v3 w=0.5u l=0.56u +MM5_f9 net04 net04 net019 VDD pfet_03v3 w=0.5u l=0.56u +MM5_f10 net04 net04 net019 VDD pfet_03v3 w=0.5u l=0.56u +MM5_f11 net04 net04 net019 VDD pfet_03v3 w=0.5u l=0.56u +MM5_f12 net04 net04 net019 VDD pfet_03v3 w=0.5u l=0.56u +MM5_f13 net04 net04 net019 VDD pfet_03v3 w=0.5u l=0.56u +MM5_f14 net04 net04 net019 VDD pfet_03v3 w=0.5u l=0.56u +MM5_f15 net04 net04 net019 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f0 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f1 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f2 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f3 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f4 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f5 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f6 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f7 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f8 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f9 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f10 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f11 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f12 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f13 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f14 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f15 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=0.56u +MM7_f0 net019 net019 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM7_f1 net019 net019 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM7_f2 net019 net019 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM7_f3 net019 net019 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM7_f4 net019 net019 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM7_f5 net019 net019 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM7_f6 net019 net019 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM7_f7 net019 net019 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM7_f8 net019 net019 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM7_f9 net019 net019 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM7_f10 net019 net019 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM7_f11 net019 net019 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM7_f12 net019 net019 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM7_f13 net019 net019 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM7_f14 net019 net019 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM7_f15 net019 net019 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM8_f0 net017 net019 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM8_f1 net017 net019 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM8_f2 net017 net019 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM8_f3 net017 net019 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM8_f4 net017 net019 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM8_f5 net017 net019 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM8_f6 net017 net019 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM8_f7 net017 net019 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM8_f8 net017 net019 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM8_f9 net017 net019 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM8_f10 net017 net019 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM8_f11 net017 net019 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM8_f12 net017 net019 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM8_f13 net017 net019 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM8_f14 net017 net019 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM8_f15 net017 net019 VDD VDD pfet_03v3 w=0.5u l=0.56u +.ends C09_gf180_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C09/gf180/sW2_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW2_sL1/testbench.spice new file mode 100644 index 00000000..0d484590 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW2_sL1/testbench.spice @@ -0,0 +1,42 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 C09_gf180_sW2_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIB1 IB1 VSS 4e-05 +.nodeset v(IB1)=2.31 +MB_VB1 VB1 VB1 VSS VSS nfet_03v3 w=8u l=0.56u +IB_VB1 VDDB VB1 8e-05 +MB_GS_M3 GS_M3 GS_M3 VSS VSS nfet_03v3 w=8u l=0.56u +IB_GS_M3 VDDB GS_M3 2e-05 +MB_GS_M1 GS_M1 GS_M1 VSS VSS nfet_03v3 w=8u l=0.56u +IB_GS_M1 VDDB GS_M1 2e-05 +B_VCM VCM 0 V = v(VB1) - v(GS_M3) + v(GS_M1) - 0.1 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 1.485 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN2 VCM VINT 0 1 +EIN VIN1 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN2) - v(VIN1) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C09/gf180/sW2_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW2_sL2/case.json new file mode 100644 index 00000000..122f8886 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW2_sL2/case.json @@ -0,0 +1,235 @@ +{ + "case_id": "C09_gf180_sW2_sL2", + "circuit_id": "C09", + "pdk": "gf180", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "dut_name": "C09_gf180_sW2_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VB1", + "IB1" + ], + "sizing": { + "M1": { + "w": 8.0, + "l": 1.12, + "nf": 16 + }, + "M2": { + "w": 8.0, + "l": 1.12, + "nf": 16 + }, + "M3": { + "w": 8.0, + "l": 1.12, + "nf": 16 + }, + "M4": { + "w": 8.0, + "l": 1.12, + "nf": 16 + }, + "M5": { + "w": 8.0, + "l": 1.12, + "nf": 16 + }, + "M6": { + "w": 8.0, + "l": 1.12, + "nf": 16 + }, + "M7": { + "w": 8.0, + "l": 1.12, + "nf": 16 + }, + "M8": { + "w": 8.0, + "l": 1.12, + "nf": 16 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 2e-05, + "kind": "cascode" + }, + "IB1": { + "i": 4e-05, + "from": "VSS" + } + }, + "load": { + "vcm": { + "expr": "v(VB1) - gs(M3) + gs(M1) - 0.1", + "currents": { + "M3": 2e-05, + "M1": 2e-05 + } + }, + "CL": 1e-12, + "inv_input": "VIN2", + "vout_target": 1.4849999999999999 + }, + "category": "ota", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "292c825afbb8df4d", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 2e-05, + "variant": "cascode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/gf180/sW2_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW2_sL2/manifest.json new file mode 100644 index 00000000..a39149b9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW2_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "e40e01d996e5a8e5c5d00c932ab1f1cc1b3c909dc28f67fc3417bad66ee766e6", + "qualification.json": "eceb2f5756b34bf7f83b9f12cb0c6a0ba402eecbf669b99b6684510f2ba75f66", + "specs.json": "60d18c2b567bda8fead8e84b843fe6c79fcab749a89849bc9d3094cecff764ea", + "target.spice": "121e20937ce18eb11a20ef6cb72eef1cb89588ec1b69975d5f22248c724d5fa3", + "target_lvs.spice": "059e1e6eb6a58bd6035fb24ecf991afda5096af1e73278dab3cf7345ca998936", + "testbench.spice": "b32eb0f9ba046b8f3a5c8e7452667f626eed421d5e95342d11944acd95a45407" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/gf180/sW2_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW2_sL2/qualification.json new file mode 100644 index 00000000..7fe0ac39 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW2_sL2/qualification.json @@ -0,0 +1,158 @@ +{ + "case_id": "C09_gf180_sW2_sL2", + "circuit_id": "C09", + "pdk": "gf180", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "ota", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "292c825afbb8df4d", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 48.02 + }, + "ugf": { + "min": 5830000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 51.01766, + "ugf": 9717255.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.4, + "schematic_measures": { + "vout0": 1.485, + "idd": 4.000004e-05, + "vos": -0.00449277, + "gain_lf": 51.01766, + "ph_lf": 0.1294533, + "ugf": 9717255.0, + "ph_ugf": -94.75591, + "f3db": 27409.63, + "pm": 85.1146367 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/gf180/sW2_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW2_sL2/specs.json new file mode 100644 index 00000000..ad342d70 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW2_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 48.02 + }, + "ugf": { + "min": 5830000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 51.01766, + "ugf": 9717255.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/gf180/sW2_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW2_sL2/target.spice new file mode 100644 index 00000000..e97b600c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW2_sL2/target.spice @@ -0,0 +1,10 @@ +.subckt C09_gf180_sW2_sL2 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 +MM1 net018 VIN1 IB1 VSS nfet_03v3 w=8u l=1.12u nf=16 m=1 +MM2 net016 VIN2 IB1 VSS nfet_03v3 w=8u l=1.12u nf=16 m=1 +MM3 net04 VB1 net018 VSS nfet_03v3 w=8u l=1.12u nf=16 m=1 +MM4 VOUT1 VB1 net016 VSS nfet_03v3 w=8u l=1.12u nf=16 m=1 +MM5 net04 net04 net019 VDD pfet_03v3 w=8u l=1.12u nf=16 m=1 +MM6 VOUT1 net04 net017 VDD pfet_03v3 w=8u l=1.12u nf=16 m=1 +MM7 net019 net019 VDD VDD pfet_03v3 w=8u l=1.12u nf=16 m=1 +MM8 net017 net019 VDD VDD pfet_03v3 w=8u l=1.12u nf=16 m=1 +.ends C09_gf180_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C09/gf180/sW2_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW2_sL2/target_lvs.spice new file mode 100644 index 00000000..e72fe0d6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW2_sL2/target_lvs.spice @@ -0,0 +1,130 @@ +.subckt C09_gf180_sW2_sL2 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 +MM1_f0 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f1 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f2 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f3 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f4 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f5 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f6 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f7 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f8 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f9 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f10 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f11 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f12 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f13 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f14 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f15 net018 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f0 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f1 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f2 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f3 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f4 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f5 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f6 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f7 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f8 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f9 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f10 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f11 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f12 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f13 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f14 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f15 net016 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f0 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f1 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f2 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f3 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f4 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f5 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f6 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f7 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f8 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f9 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f10 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f11 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f12 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f13 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f14 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f15 net04 VB1 net018 VSS nfet_03v3 w=0.5u l=1.12u +MM4_f0 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=1.12u +MM4_f1 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=1.12u +MM4_f2 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=1.12u +MM4_f3 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=1.12u +MM4_f4 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=1.12u +MM4_f5 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=1.12u +MM4_f6 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=1.12u +MM4_f7 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=1.12u +MM4_f8 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=1.12u +MM4_f9 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=1.12u +MM4_f10 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=1.12u +MM4_f11 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=1.12u +MM4_f12 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=1.12u +MM4_f13 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=1.12u +MM4_f14 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=1.12u +MM4_f15 VOUT1 VB1 net016 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f0 net04 net04 net019 VDD pfet_03v3 w=0.5u l=1.12u +MM5_f1 net04 net04 net019 VDD pfet_03v3 w=0.5u l=1.12u +MM5_f2 net04 net04 net019 VDD pfet_03v3 w=0.5u l=1.12u +MM5_f3 net04 net04 net019 VDD pfet_03v3 w=0.5u l=1.12u +MM5_f4 net04 net04 net019 VDD pfet_03v3 w=0.5u l=1.12u +MM5_f5 net04 net04 net019 VDD pfet_03v3 w=0.5u l=1.12u +MM5_f6 net04 net04 net019 VDD pfet_03v3 w=0.5u l=1.12u +MM5_f7 net04 net04 net019 VDD pfet_03v3 w=0.5u l=1.12u +MM5_f8 net04 net04 net019 VDD pfet_03v3 w=0.5u l=1.12u +MM5_f9 net04 net04 net019 VDD pfet_03v3 w=0.5u l=1.12u +MM5_f10 net04 net04 net019 VDD pfet_03v3 w=0.5u l=1.12u +MM5_f11 net04 net04 net019 VDD pfet_03v3 w=0.5u l=1.12u +MM5_f12 net04 net04 net019 VDD pfet_03v3 w=0.5u l=1.12u +MM5_f13 net04 net04 net019 VDD pfet_03v3 w=0.5u l=1.12u +MM5_f14 net04 net04 net019 VDD pfet_03v3 w=0.5u l=1.12u +MM5_f15 net04 net04 net019 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f0 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f1 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f2 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f3 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f4 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f5 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f6 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f7 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f8 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f9 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f10 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f11 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f12 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f13 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f14 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f15 VOUT1 net04 net017 VDD pfet_03v3 w=0.5u l=1.12u +MM7_f0 net019 net019 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM7_f1 net019 net019 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM7_f2 net019 net019 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM7_f3 net019 net019 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM7_f4 net019 net019 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM7_f5 net019 net019 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM7_f6 net019 net019 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM7_f7 net019 net019 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM7_f8 net019 net019 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM7_f9 net019 net019 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM7_f10 net019 net019 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM7_f11 net019 net019 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM7_f12 net019 net019 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM7_f13 net019 net019 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM7_f14 net019 net019 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM7_f15 net019 net019 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM8_f0 net017 net019 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM8_f1 net017 net019 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM8_f2 net017 net019 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM8_f3 net017 net019 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM8_f4 net017 net019 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM8_f5 net017 net019 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM8_f6 net017 net019 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM8_f7 net017 net019 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM8_f8 net017 net019 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM8_f9 net017 net019 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM8_f10 net017 net019 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM8_f11 net017 net019 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM8_f12 net017 net019 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM8_f13 net017 net019 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM8_f14 net017 net019 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM8_f15 net017 net019 VDD VDD pfet_03v3 w=0.5u l=1.12u +.ends C09_gf180_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C09/gf180/sW2_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW2_sL2/testbench.spice new file mode 100644 index 00000000..c5d546db --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/gf180/sW2_sL2/testbench.spice @@ -0,0 +1,42 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 C09_gf180_sW2_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIB1 IB1 VSS 4e-05 +.nodeset v(IB1)=2.31 +MB_VB1 VB1 VB1 VSS VSS nfet_03v3 w=8u l=1.12u +IB_VB1 VDDB VB1 8e-05 +MB_GS_M3 GS_M3 GS_M3 VSS VSS nfet_03v3 w=8u l=1.12u +IB_GS_M3 VDDB GS_M3 2e-05 +MB_GS_M1 GS_M1 GS_M1 VSS VSS nfet_03v3 w=8u l=1.12u +IB_GS_M1 VDDB GS_M1 2e-05 +B_VCM VCM 0 V = v(VB1) - v(GS_M3) + v(GS_M1) - 0.1 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 1.485 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN2 VCM VINT 0 1 +EIN VIN1 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN2) - v(VIN1) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW0.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW0.5_sL1.5/case.json new file mode 100644 index 00000000..a8d6224f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW0.5_sL1.5/case.json @@ -0,0 +1,235 @@ +{ + "case_id": "C09_ihp130_sW0.5_sL1.5", + "circuit_id": "C09", + "pdk": "ihp130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "dut_name": "C09_ihp130_sW0.5_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VB1", + "IB1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.39, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 0.39, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 0.39, + "nf": 8 + }, + "M4": { + "w": 4.0, + "l": 0.39, + "nf": 8 + }, + "M5": { + "w": 8.0, + "l": 0.39, + "nf": 16 + }, + "M6": { + "w": 8.0, + "l": 0.39, + "nf": 16 + }, + "M7": { + "w": 8.0, + "l": 0.39, + "nf": 16 + }, + "M8": { + "w": 8.0, + "l": 0.39, + "nf": 16 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 1e-05, + "kind": "cascode" + }, + "IB1": { + "i": 2e-05, + "from": "VSS" + } + }, + "load": { + "vcm": { + "expr": "v(VB1) - gs(M3) + gs(M1) - 0.1", + "currents": { + "M3": 1e-05, + "M1": 1e-05 + } + }, + "CL": 1e-12, + "inv_input": "VIN2", + "vout_target": 0.54 + }, + "category": "ota", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "e09ec1f3c2822a3b", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 1e-05, + "variant": "cascode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW0.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW0.5_sL1.5/manifest.json new file mode 100644 index 00000000..038b68b5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW0.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "441b5eda19432d9ed4b05bedb233c0076841a9030807220dd74ffaadb94fddd6", + "qualification.json": "372ba435c0484a0c0adca778305648f7ea9d6f0f5eb1417a532dc53b0234ec8d", + "specs.json": "fbc0619a0d98810a6ce4f4036460d1fdf2b1e84137ea2845eb59f0f7b24659da", + "target.spice": "1e3331b83341df5a2991ab6adcea2e43be4628576bd90dd0a57fcad232fa8117", + "target_lvs.spice": "9a869c4bbc3f8331687233274427ae092d51f803b3f8b56d6b7c6b920b5a6268", + "testbench.spice": "eca31db71c0b6f3166b9a921f6dfab2ed5c9c33191ee29a96f9a458f1eff5338" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW0.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW0.5_sL1.5/qualification.json new file mode 100644 index 00000000..b6be504d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW0.5_sL1.5/qualification.json @@ -0,0 +1,158 @@ +{ + "case_id": "C09_ihp130_sW0.5_sL1.5", + "circuit_id": "C09", + "pdk": "ihp130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "ota", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "e09ec1f3c2822a3b", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 41.47 + }, + "ugf": { + "min": 12430000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 44.4675, + "ugf": 20708420.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 3.6, + "schematic_measures": { + "vout0": 0.5399997, + "idd": 2e-05, + "vos": -0.00253795, + "gain_lf": 44.4675, + "ph_lf": 0.1142998, + "ugf": 20708420.0, + "ph_ugf": -93.60535, + "f3db": 123797.1, + "pm": 86.2803502 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW0.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW0.5_sL1.5/specs.json new file mode 100644 index 00000000..4cb75f2c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW0.5_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 41.47 + }, + "ugf": { + "min": 12430000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 44.4675, + "ugf": 20708420.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW0.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW0.5_sL1.5/target.spice new file mode 100644 index 00000000..a2a6c6d8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW0.5_sL1.5/target.spice @@ -0,0 +1,10 @@ +.subckt C09_ihp130_sW0.5_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 +XM1 net018 VIN1 IB1 VSS sg13_lv_nmos w=4u l=0.39u ng=8 m=1 +XM2 net016 VIN2 IB1 VSS sg13_lv_nmos w=4u l=0.39u ng=8 m=1 +XM3 net04 VB1 net018 VSS sg13_lv_nmos w=4u l=0.39u ng=8 m=1 +XM4 VOUT1 VB1 net016 VSS sg13_lv_nmos w=4u l=0.39u ng=8 m=1 +XM5 net04 net04 net019 VDD sg13_lv_pmos w=8u l=0.39u ng=16 m=1 +XM6 VOUT1 net04 net017 VDD sg13_lv_pmos w=8u l=0.39u ng=16 m=1 +XM7 net019 net019 VDD VDD sg13_lv_pmos w=8u l=0.39u ng=16 m=1 +XM8 net017 net019 VDD VDD sg13_lv_pmos w=8u l=0.39u ng=16 m=1 +.ends C09_ihp130_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW0.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW0.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..f6288271 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW0.5_sL1.5/target_lvs.spice @@ -0,0 +1,98 @@ +.subckt C09_ihp130_sW0.5_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 +XM1_f0 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f1 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f2 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f3 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f4 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f5 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f6 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f7 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f0 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f1 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f2 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f3 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f4 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f5 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f6 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f7 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f0 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f1 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f2 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f3 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f4 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f5 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f6 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f7 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f0 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f1 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f2 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f3 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f4 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f5 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f6 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f7 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f0 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f1 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f2 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f3 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f4 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f5 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f6 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f7 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f8 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f9 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f10 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f11 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f12 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f13 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f14 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f15 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f0 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f1 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f2 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f3 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f4 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f5 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f6 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f7 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f8 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f9 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f10 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f11 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f12 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f13 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f14 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f15 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f0 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f1 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f2 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f3 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f4 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f5 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f6 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f7 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f8 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f9 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f10 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f11 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f12 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f13 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f14 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f15 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f0 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f1 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f2 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f3 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f4 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f5 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f6 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f7 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f8 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f9 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f10 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f11 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f12 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f13 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f14 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f15 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +.ends C09_ihp130_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW0.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW0.5_sL1.5/testbench.spice new file mode 100644 index 00000000..721e8980 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW0.5_sL1.5/testbench.spice @@ -0,0 +1,42 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 C09_ihp130_sW0.5_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIB1 IB1 VSS 2e-05 +.nodeset v(IB1)=0.84 +XB_VB1 VB1 VB1 VSS VSS sg13_lv_nmos w=4u l=0.39u +IB_VB1 VDDB VB1 4e-05 +XB_GS_M3 GS_M3 GS_M3 VSS VSS sg13_lv_nmos w=4u l=0.39u +IB_GS_M3 VDDB GS_M3 1e-05 +XB_GS_M1 GS_M1 GS_M1 VSS VSS sg13_lv_nmos w=4u l=0.39u +IB_GS_M1 VDDB GS_M1 1e-05 +B_VCM VCM 0 V = v(VB1) - v(GS_M3) + v(GS_M1) - 0.1 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 0.54 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN2 VCM VINT 0 1 +EIN VIN1 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN2) - v(VIN1) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW0.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW0.5_sL1/case.json new file mode 100644 index 00000000..38c6eeeb --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW0.5_sL1/case.json @@ -0,0 +1,235 @@ +{ + "case_id": "C09_ihp130_sW0.5_sL1", + "circuit_id": "C09", + "pdk": "ihp130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "dut_name": "C09_ihp130_sW0.5_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VB1", + "IB1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.26, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 0.26, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 0.26, + "nf": 8 + }, + "M4": { + "w": 4.0, + "l": 0.26, + "nf": 8 + }, + "M5": { + "w": 8.0, + "l": 0.26, + "nf": 16 + }, + "M6": { + "w": 8.0, + "l": 0.26, + "nf": 16 + }, + "M7": { + "w": 8.0, + "l": 0.26, + "nf": 16 + }, + "M8": { + "w": 8.0, + "l": 0.26, + "nf": 16 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 1e-05, + "kind": "cascode" + }, + "IB1": { + "i": 2e-05, + "from": "VSS" + } + }, + "load": { + "vcm": { + "expr": "v(VB1) - gs(M3) + gs(M1) - 0.1", + "currents": { + "M3": 1e-05, + "M1": 1e-05 + } + }, + "CL": 1e-12, + "inv_input": "VIN2", + "vout_target": 0.54 + }, + "category": "ota", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.26, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.26, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.26, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.26, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "4a112fc40a3fe2cb", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 1e-05, + "variant": "cascode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW0.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW0.5_sL1/manifest.json new file mode 100644 index 00000000..ca065027 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW0.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "cbb767a9dc28ff9f2f14ba0f0cd30f0bb3f465563db6ddb18e893ac7edc3b04d", + "qualification.json": "211e5a85e3cc1b1363553d6c745e4a1fda54e2191c45d6702549ec499d8739d7", + "specs.json": "520504e1d39393c0ef9f8cc00342f19090114f0ca458e7a9d96412e872cbdbe9", + "target.spice": "efbac1c84d78e5413acbc9821e345a88227dbf8e586e57860d873dfd02c998c4", + "target_lvs.spice": "0491b0b1e4b383263c9c8449050f9aca02fcabe3d614a55813eef069789ad7d5", + "testbench.spice": "dffc910da73f91b29a52a5fc1a97fcac14ed93c2a17f6ae89abb2ec97f4887b2" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW0.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW0.5_sL1/qualification.json new file mode 100644 index 00000000..d3ab0a3a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW0.5_sL1/qualification.json @@ -0,0 +1,158 @@ +{ + "case_id": "C09_ihp130_sW0.5_sL1", + "circuit_id": "C09", + "pdk": "ihp130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "ota", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.26, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.26, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.26, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.26, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "4a112fc40a3fe2cb", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 40.68 + }, + "ugf": { + "min": 13640000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 43.67905, + "ugf": 22738910.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 3.3, + "schematic_measures": { + "vout0": 0.5399997, + "idd": 2e-05, + "vos": -0.00252386, + "gain_lf": 43.67905, + "ph_lf": 0.1062832, + "ugf": 22738910.0, + "ph_ugf": -92.50618, + "f3db": 148695.9, + "pm": 87.3875368 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW0.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW0.5_sL1/specs.json new file mode 100644 index 00000000..75198ca7 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW0.5_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 40.68 + }, + "ugf": { + "min": 13640000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 43.67905, + "ugf": 22738910.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW0.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW0.5_sL1/target.spice new file mode 100644 index 00000000..4328e238 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW0.5_sL1/target.spice @@ -0,0 +1,10 @@ +.subckt C09_ihp130_sW0.5_sL1 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 +XM1 net018 VIN1 IB1 VSS sg13_lv_nmos w=4u l=0.26u ng=8 m=1 +XM2 net016 VIN2 IB1 VSS sg13_lv_nmos w=4u l=0.26u ng=8 m=1 +XM3 net04 VB1 net018 VSS sg13_lv_nmos w=4u l=0.26u ng=8 m=1 +XM4 VOUT1 VB1 net016 VSS sg13_lv_nmos w=4u l=0.26u ng=8 m=1 +XM5 net04 net04 net019 VDD sg13_lv_pmos w=8u l=0.26u ng=16 m=1 +XM6 VOUT1 net04 net017 VDD sg13_lv_pmos w=8u l=0.26u ng=16 m=1 +XM7 net019 net019 VDD VDD sg13_lv_pmos w=8u l=0.26u ng=16 m=1 +XM8 net017 net019 VDD VDD sg13_lv_pmos w=8u l=0.26u ng=16 m=1 +.ends C09_ihp130_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW0.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW0.5_sL1/target_lvs.spice new file mode 100644 index 00000000..265604da --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW0.5_sL1/target_lvs.spice @@ -0,0 +1,98 @@ +.subckt C09_ihp130_sW0.5_sL1 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 +XM1_f0 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f1 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f2 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f3 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f4 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f5 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f6 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f7 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f0 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f1 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f2 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f3 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f4 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f5 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f6 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f7 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f0 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f1 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f2 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f3 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f4 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f5 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f6 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f7 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f0 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f1 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f2 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f3 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f4 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f5 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f6 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f7 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f0 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f1 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f2 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f3 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f4 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f5 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f6 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f7 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f8 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f9 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f10 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f11 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f12 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f13 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f14 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f15 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f0 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f1 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f2 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f3 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f4 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f5 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f6 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f7 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f8 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f9 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f10 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f11 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f12 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f13 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f14 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f15 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f0 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f1 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f2 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f3 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f4 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f5 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f6 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f7 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f8 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f9 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f10 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f11 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f12 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f13 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f14 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f15 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f0 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f1 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f2 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f3 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f4 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f5 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f6 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f7 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f8 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f9 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f10 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f11 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f12 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f13 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f14 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f15 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +.ends C09_ihp130_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW0.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW0.5_sL1/testbench.spice new file mode 100644 index 00000000..0af759a6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW0.5_sL1/testbench.spice @@ -0,0 +1,42 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 C09_ihp130_sW0.5_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIB1 IB1 VSS 2e-05 +.nodeset v(IB1)=0.84 +XB_VB1 VB1 VB1 VSS VSS sg13_lv_nmos w=4u l=0.26u +IB_VB1 VDDB VB1 4e-05 +XB_GS_M3 GS_M3 GS_M3 VSS VSS sg13_lv_nmos w=4u l=0.26u +IB_GS_M3 VDDB GS_M3 1e-05 +XB_GS_M1 GS_M1 GS_M1 VSS VSS sg13_lv_nmos w=4u l=0.26u +IB_GS_M1 VDDB GS_M1 1e-05 +B_VCM VCM 0 V = v(VB1) - v(GS_M3) + v(GS_M1) - 0.1 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 0.54 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN2 VCM VINT 0 1 +EIN VIN1 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN2) - v(VIN1) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW0.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW0.5_sL2/case.json new file mode 100644 index 00000000..aa153a10 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW0.5_sL2/case.json @@ -0,0 +1,235 @@ +{ + "case_id": "C09_ihp130_sW0.5_sL2", + "circuit_id": "C09", + "pdk": "ihp130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "dut_name": "C09_ihp130_sW0.5_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VB1", + "IB1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.52, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 0.52, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 0.52, + "nf": 8 + }, + "M4": { + "w": 4.0, + "l": 0.52, + "nf": 8 + }, + "M5": { + "w": 8.0, + "l": 0.52, + "nf": 16 + }, + "M6": { + "w": 8.0, + "l": 0.52, + "nf": 16 + }, + "M7": { + "w": 8.0, + "l": 0.52, + "nf": 16 + }, + "M8": { + "w": 8.0, + "l": 0.52, + "nf": 16 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 1e-05, + "kind": "cascode" + }, + "IB1": { + "i": 2e-05, + "from": "VSS" + } + }, + "load": { + "vcm": { + "expr": "v(VB1) - gs(M3) + gs(M1) - 0.1", + "currents": { + "M3": 1e-05, + "M1": 1e-05 + } + }, + "CL": 1e-12, + "inv_input": "VIN2", + "vout_target": 0.54 + }, + "category": "ota", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "c928b5ccafcda93a", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 1e-05, + "variant": "cascode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW0.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW0.5_sL2/manifest.json new file mode 100644 index 00000000..f74c36a0 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW0.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "0fc41c9a6a1b2fbd1b0f3db71351fba8fb59ccc9fc4005d2d0475bd51cd5acca", + "qualification.json": "09c9ba8ef4d193e98a19b46aaa934936c8eb868f0da10cf90bf1ff05ccd96c02", + "specs.json": "71f451d7c28bc0a1a65ec65810161bd1a684c74326e5ba91832ae60a11abb761", + "target.spice": "52c09c20198b8d7fcd58a4ce16baaf6e64e7da78948abd2c778eed0ae8fa41dc", + "target_lvs.spice": "ce4748cb627f71f2ecb4c8e9798b5068a953f26d93e3e53ccd44b4dc9c273e0b", + "testbench.spice": "45eb53516802ddb601ff176704d4ec456687c9db1ab8879f7c0ed96dfa3587fb" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW0.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW0.5_sL2/qualification.json new file mode 100644 index 00000000..f1bc3fd8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW0.5_sL2/qualification.json @@ -0,0 +1,158 @@ +{ + "case_id": "C09_ihp130_sW0.5_sL2", + "circuit_id": "C09", + "pdk": "ihp130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "ota", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "c928b5ccafcda93a", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 40.91 + }, + "ugf": { + "min": 10990000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 43.90615, + "ugf": 18316470.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 3.0, + "schematic_measures": { + "vout0": 0.5399997, + "idd": 1.999999e-05, + "vos": -0.0030973, + "gain_lf": 43.90615, + "ph_lf": 0.104474, + "ugf": 18316470.0, + "ph_ugf": -94.50707, + "f3db": 117070.6, + "pm": 85.388456 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW0.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW0.5_sL2/specs.json new file mode 100644 index 00000000..fd3a2771 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW0.5_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 40.91 + }, + "ugf": { + "min": 10990000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 43.90615, + "ugf": 18316470.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW0.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW0.5_sL2/target.spice new file mode 100644 index 00000000..59a9fab9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW0.5_sL2/target.spice @@ -0,0 +1,10 @@ +.subckt C09_ihp130_sW0.5_sL2 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 +XM1 net018 VIN1 IB1 VSS sg13_lv_nmos w=4u l=0.52u ng=8 m=1 +XM2 net016 VIN2 IB1 VSS sg13_lv_nmos w=4u l=0.52u ng=8 m=1 +XM3 net04 VB1 net018 VSS sg13_lv_nmos w=4u l=0.52u ng=8 m=1 +XM4 VOUT1 VB1 net016 VSS sg13_lv_nmos w=4u l=0.52u ng=8 m=1 +XM5 net04 net04 net019 VDD sg13_lv_pmos w=8u l=0.52u ng=16 m=1 +XM6 VOUT1 net04 net017 VDD sg13_lv_pmos w=8u l=0.52u ng=16 m=1 +XM7 net019 net019 VDD VDD sg13_lv_pmos w=8u l=0.52u ng=16 m=1 +XM8 net017 net019 VDD VDD sg13_lv_pmos w=8u l=0.52u ng=16 m=1 +.ends C09_ihp130_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW0.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW0.5_sL2/target_lvs.spice new file mode 100644 index 00000000..3e75466b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW0.5_sL2/target_lvs.spice @@ -0,0 +1,98 @@ +.subckt C09_ihp130_sW0.5_sL2 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 +XM1_f0 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f1 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f2 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f3 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f4 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f5 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f6 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f7 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f0 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f1 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f2 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f3 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f4 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f5 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f6 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f7 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f0 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f1 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f2 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f3 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f4 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f5 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f6 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f7 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f0 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f1 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f2 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f3 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f4 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f5 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f6 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f7 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f0 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f1 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f2 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f3 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f4 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f5 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f6 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f7 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f8 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f9 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f10 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f11 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f12 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f13 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f14 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f15 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f0 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f1 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f2 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f3 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f4 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f5 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f6 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f7 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f8 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f9 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f10 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f11 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f12 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f13 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f14 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f15 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f0 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f1 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f2 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f3 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f4 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f5 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f6 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f7 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f8 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f9 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f10 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f11 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f12 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f13 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f14 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f15 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f0 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f1 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f2 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f3 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f4 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f5 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f6 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f7 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f8 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f9 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f10 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f11 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f12 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f13 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f14 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f15 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +.ends C09_ihp130_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW0.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW0.5_sL2/testbench.spice new file mode 100644 index 00000000..22f5bbdd --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW0.5_sL2/testbench.spice @@ -0,0 +1,42 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 C09_ihp130_sW0.5_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIB1 IB1 VSS 2e-05 +.nodeset v(IB1)=0.84 +XB_VB1 VB1 VB1 VSS VSS sg13_lv_nmos w=4u l=0.52u +IB_VB1 VDDB VB1 4e-05 +XB_GS_M3 GS_M3 GS_M3 VSS VSS sg13_lv_nmos w=4u l=0.52u +IB_GS_M3 VDDB GS_M3 1e-05 +XB_GS_M1 GS_M1 GS_M1 VSS VSS sg13_lv_nmos w=4u l=0.52u +IB_GS_M1 VDDB GS_M1 1e-05 +B_VCM VCM 0 V = v(VB1) - v(GS_M3) + v(GS_M1) - 0.1 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 0.54 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN2 VCM VINT 0 1 +EIN VIN1 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN2) - v(VIN1) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1.5_sL1.5/case.json new file mode 100644 index 00000000..2fe6e65a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1.5_sL1.5/case.json @@ -0,0 +1,235 @@ +{ + "case_id": "C09_ihp130_sW1.5_sL1.5", + "circuit_id": "C09", + "pdk": "ihp130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "dut_name": "C09_ihp130_sW1.5_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VB1", + "IB1" + ], + "sizing": { + "M1": { + "w": 12.0, + "l": 0.39, + "nf": 24 + }, + "M2": { + "w": 12.0, + "l": 0.39, + "nf": 24 + }, + "M3": { + "w": 12.0, + "l": 0.39, + "nf": 24 + }, + "M4": { + "w": 12.0, + "l": 0.39, + "nf": 24 + }, + "M5": { + "w": 24.0, + "l": 0.39, + "nf": 48 + }, + "M6": { + "w": 24.0, + "l": 0.39, + "nf": 48 + }, + "M7": { + "w": 24.0, + "l": 0.39, + "nf": 48 + }, + "M8": { + "w": 24.0, + "l": 0.39, + "nf": 48 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 1e-05, + "kind": "cascode" + }, + "IB1": { + "i": 2e-05, + "from": "VSS" + } + }, + "load": { + "vcm": { + "expr": "v(VB1) - gs(M3) + gs(M1) - 0.1", + "currents": { + "M3": 1e-05, + "M1": 1e-05 + } + }, + "CL": 1e-12, + "inv_input": "VIN2", + "vout_target": 0.54 + }, + "category": "ota", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 12.0, + "l": 0.39, + "nf": 24, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 12.0, + "l": 0.39, + "nf": 24, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 12.0, + "l": 0.39, + "nf": 24, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 12.0, + "l": 0.39, + "nf": 24, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.39, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.39, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.39, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.39, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "a03b66ce86a207f2", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 1e-05, + "variant": "cascode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1.5_sL1.5/manifest.json new file mode 100644 index 00000000..ab605b30 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "765e5a19961f64cb9ddfdac41e8e28c00a5994d6d0e3db85a737768277f8fe19", + "qualification.json": "68cf116b2c2c81689e33304a3ade7266480657fc24d2eb41094d7b7343a21b18", + "specs.json": "6a7bb4095c93d846befeca79295b9cd420171df9dafa701ba5c6875bce91a04c", + "target.spice": "985b45b4391b16c5f5f780f3be8cf0d70c8c372d163ecb8f6f5ad96f19b30b34", + "target_lvs.spice": "f00580dddcd45bc638165d5271bc9ac4b1b43b660f35f794d1b47423e0107bc2", + "testbench.spice": "8310c3e3de41f36c515208d01fa00f065acd9b1257a06bfd79c5956dc26e5ccf" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1.5_sL1.5/qualification.json new file mode 100644 index 00000000..2cc69858 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1.5_sL1.5/qualification.json @@ -0,0 +1,158 @@ +{ + "case_id": "C09_ihp130_sW1.5_sL1.5", + "circuit_id": "C09", + "pdk": "ihp130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "ota", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 12.0, + "l": 0.39, + "nf": 24, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 12.0, + "l": 0.39, + "nf": 24, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 12.0, + "l": 0.39, + "nf": 24, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 12.0, + "l": 0.39, + "nf": 24, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.39, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.39, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.39, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.39, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "a03b66ce86a207f2", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 47.12 + }, + "ugf": { + "min": 17850000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 50.12015, + "ugf": 29755190.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 14.9, + "schematic_measures": { + "vout0": 0.5399999, + "idd": 2e-05, + "vos": -0.00068188, + "gain_lf": 50.12015, + "ph_lf": 0.2350669, + "ugf": 29755190.0, + "ph_ugf": -100.001, + "f3db": 94823.1, + "pm": 79.76393309999999 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1.5_sL1.5/specs.json new file mode 100644 index 00000000..37ff4598 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1.5_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 47.12 + }, + "ugf": { + "min": 17850000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 50.12015, + "ugf": 29755190.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1.5_sL1.5/target.spice new file mode 100644 index 00000000..0f5d249b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1.5_sL1.5/target.spice @@ -0,0 +1,10 @@ +.subckt C09_ihp130_sW1.5_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 +XM1 net018 VIN1 IB1 VSS sg13_lv_nmos w=12u l=0.39u ng=24 m=1 +XM2 net016 VIN2 IB1 VSS sg13_lv_nmos w=12u l=0.39u ng=24 m=1 +XM3 net04 VB1 net018 VSS sg13_lv_nmos w=12u l=0.39u ng=24 m=1 +XM4 VOUT1 VB1 net016 VSS sg13_lv_nmos w=12u l=0.39u ng=24 m=1 +XM5 net04 net04 net019 VDD sg13_lv_pmos w=24u l=0.39u ng=48 m=1 +XM6 VOUT1 net04 net017 VDD sg13_lv_pmos w=24u l=0.39u ng=48 m=1 +XM7 net019 net019 VDD VDD sg13_lv_pmos w=24u l=0.39u ng=48 m=1 +XM8 net017 net019 VDD VDD sg13_lv_pmos w=24u l=0.39u ng=48 m=1 +.ends C09_ihp130_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..491108fc --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1.5_sL1.5/target_lvs.spice @@ -0,0 +1,290 @@ +.subckt C09_ihp130_sW1.5_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 +XM1_f0 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f1 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f2 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f3 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f4 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f5 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f6 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f7 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f8 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f9 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f10 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f11 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f12 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f13 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f14 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f15 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f16 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f17 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f18 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f19 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f20 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f21 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f22 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f23 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f0 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f1 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f2 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f3 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f4 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f5 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f6 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f7 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f8 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f9 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f10 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f11 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f12 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f13 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f14 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f15 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f16 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f17 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f18 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f19 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f20 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f21 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f22 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f23 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f0 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f1 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f2 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f3 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f4 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f5 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f6 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f7 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f8 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f9 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f10 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f11 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f12 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f13 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f14 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f15 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f16 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f17 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f18 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f19 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f20 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f21 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f22 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f23 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f0 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f1 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f2 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f3 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f4 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f5 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f6 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f7 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f8 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f9 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f10 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f11 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f12 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f13 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f14 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f15 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f16 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f17 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f18 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f19 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f20 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f21 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f22 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f23 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f0 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f1 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f2 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f3 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f4 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f5 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f6 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f7 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f8 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f9 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f10 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f11 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f12 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f13 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f14 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f15 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f16 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f17 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f18 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f19 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f20 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f21 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f22 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f23 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f24 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f25 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f26 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f27 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f28 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f29 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f30 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f31 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f32 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f33 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f34 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f35 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f36 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f37 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f38 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f39 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f40 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f41 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f42 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f43 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f44 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f45 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f46 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f47 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f0 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f1 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f2 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f3 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f4 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f5 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f6 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f7 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f8 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f9 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f10 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f11 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f12 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f13 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f14 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f15 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f16 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f17 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f18 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f19 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f20 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f21 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f22 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f23 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f24 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f25 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f26 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f27 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f28 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f29 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f30 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f31 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f32 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f33 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f34 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f35 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f36 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f37 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f38 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f39 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f40 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f41 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f42 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f43 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f44 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f45 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f46 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f47 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f0 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f1 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f2 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f3 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f4 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f5 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f6 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f7 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f8 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f9 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f10 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f11 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f12 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f13 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f14 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f15 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f16 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f17 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f18 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f19 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f20 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f21 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f22 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f23 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f24 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f25 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f26 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f27 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f28 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f29 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f30 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f31 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f32 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f33 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f34 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f35 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f36 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f37 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f38 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f39 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f40 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f41 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f42 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f43 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f44 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f45 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f46 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f47 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f0 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f1 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f2 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f3 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f4 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f5 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f6 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f7 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f8 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f9 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f10 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f11 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f12 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f13 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f14 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f15 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f16 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f17 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f18 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f19 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f20 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f21 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f22 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f23 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f24 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f25 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f26 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f27 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f28 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f29 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f30 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f31 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f32 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f33 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f34 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f35 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f36 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f37 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f38 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f39 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f40 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f41 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f42 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f43 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f44 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f45 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f46 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f47 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +.ends C09_ihp130_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1.5_sL1.5/testbench.spice new file mode 100644 index 00000000..1ffc2d02 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1.5_sL1.5/testbench.spice @@ -0,0 +1,42 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 C09_ihp130_sW1.5_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIB1 IB1 VSS 2e-05 +.nodeset v(IB1)=0.84 +XB_VB1 VB1 VB1 VSS VSS sg13_lv_nmos w=12u l=0.39u +IB_VB1 VDDB VB1 4e-05 +XB_GS_M3 GS_M3 GS_M3 VSS VSS sg13_lv_nmos w=12u l=0.39u +IB_GS_M3 VDDB GS_M3 1e-05 +XB_GS_M1 GS_M1 GS_M1 VSS VSS sg13_lv_nmos w=12u l=0.39u +IB_GS_M1 VDDB GS_M1 1e-05 +B_VCM VCM 0 V = v(VB1) - v(GS_M3) + v(GS_M1) - 0.1 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 0.54 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN2 VCM VINT 0 1 +EIN VIN1 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN2) - v(VIN1) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1.5_sL1/case.json new file mode 100644 index 00000000..541e7602 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1.5_sL1/case.json @@ -0,0 +1,235 @@ +{ + "case_id": "C09_ihp130_sW1.5_sL1", + "circuit_id": "C09", + "pdk": "ihp130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "dut_name": "C09_ihp130_sW1.5_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VB1", + "IB1" + ], + "sizing": { + "M1": { + "w": 12.0, + "l": 0.26, + "nf": 24 + }, + "M2": { + "w": 12.0, + "l": 0.26, + "nf": 24 + }, + "M3": { + "w": 12.0, + "l": 0.26, + "nf": 24 + }, + "M4": { + "w": 12.0, + "l": 0.26, + "nf": 24 + }, + "M5": { + "w": 24.0, + "l": 0.26, + "nf": 48 + }, + "M6": { + "w": 24.0, + "l": 0.26, + "nf": 48 + }, + "M7": { + "w": 24.0, + "l": 0.26, + "nf": 48 + }, + "M8": { + "w": 24.0, + "l": 0.26, + "nf": 48 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 1e-05, + "kind": "cascode" + }, + "IB1": { + "i": 2e-05, + "from": "VSS" + } + }, + "load": { + "vcm": { + "expr": "v(VB1) - gs(M3) + gs(M1) - 0.1", + "currents": { + "M3": 1e-05, + "M1": 1e-05 + } + }, + "CL": 1e-12, + "inv_input": "VIN2", + "vout_target": 0.54 + }, + "category": "ota", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 12.0, + "l": 0.26, + "nf": 24, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 12.0, + "l": 0.26, + "nf": 24, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 12.0, + "l": 0.26, + "nf": 24, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 12.0, + "l": 0.26, + "nf": 24, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.26, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.26, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.26, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.26, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "1c8b504905907c72", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 1e-05, + "variant": "cascode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1.5_sL1/manifest.json new file mode 100644 index 00000000..22864c38 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "31bb56aaa670e989100db5b680b66e29b7cddf0481491e097131a97935efa4eb", + "qualification.json": "dee901e78ea22bec1f11eae77be76d199cd7fed55e6ffc0a1b738c7944abca56", + "specs.json": "8308c34e8319c11e8853c79d6b88f36b1e019947444b9cd67e8e6b213fd9a5be", + "target.spice": "5105744c6c1e3f588d5d43b65e9fe009d906c8299b1e313cd9db57aadbb42332", + "target_lvs.spice": "2cd4fad41781c79c7b4787888653112e10bb2844906c95394ac3f65afc2d193b", + "testbench.spice": "778817f9b7e6441b3e67a7834e8efdb4e5385d1ad1174ca4419881218c40887a" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1.5_sL1/qualification.json new file mode 100644 index 00000000..3f222f84 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1.5_sL1/qualification.json @@ -0,0 +1,158 @@ +{ + "case_id": "C09_ihp130_sW1.5_sL1", + "circuit_id": "C09", + "pdk": "ihp130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "ota", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 12.0, + "l": 0.26, + "nf": 24, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 12.0, + "l": 0.26, + "nf": 24, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 12.0, + "l": 0.26, + "nf": 24, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 12.0, + "l": 0.26, + "nf": 24, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.26, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.26, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.26, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.26, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "1c8b504905907c72", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 45.18 + }, + "ugf": { + "min": 18610000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 48.18118, + "ugf": 31024640.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 16.9, + "schematic_measures": { + "vout0": 0.5399999, + "idd": 2e-05, + "vos": -0.00082002, + "gain_lf": 48.18118, + "ph_lf": 0.1892039, + "ugf": 31024640.0, + "ph_ugf": -97.45121, + "f3db": 122268.6, + "pm": 82.3595861 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1.5_sL1/specs.json new file mode 100644 index 00000000..b2a03dde --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1.5_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 45.18 + }, + "ugf": { + "min": 18610000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 48.18118, + "ugf": 31024640.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1.5_sL1/target.spice new file mode 100644 index 00000000..1a3c3ed0 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1.5_sL1/target.spice @@ -0,0 +1,10 @@ +.subckt C09_ihp130_sW1.5_sL1 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 +XM1 net018 VIN1 IB1 VSS sg13_lv_nmos w=12u l=0.26u ng=24 m=1 +XM2 net016 VIN2 IB1 VSS sg13_lv_nmos w=12u l=0.26u ng=24 m=1 +XM3 net04 VB1 net018 VSS sg13_lv_nmos w=12u l=0.26u ng=24 m=1 +XM4 VOUT1 VB1 net016 VSS sg13_lv_nmos w=12u l=0.26u ng=24 m=1 +XM5 net04 net04 net019 VDD sg13_lv_pmos w=24u l=0.26u ng=48 m=1 +XM6 VOUT1 net04 net017 VDD sg13_lv_pmos w=24u l=0.26u ng=48 m=1 +XM7 net019 net019 VDD VDD sg13_lv_pmos w=24u l=0.26u ng=48 m=1 +XM8 net017 net019 VDD VDD sg13_lv_pmos w=24u l=0.26u ng=48 m=1 +.ends C09_ihp130_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1.5_sL1/target_lvs.spice new file mode 100644 index 00000000..3524f764 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1.5_sL1/target_lvs.spice @@ -0,0 +1,290 @@ +.subckt C09_ihp130_sW1.5_sL1 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 +XM1_f0 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f1 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f2 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f3 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f4 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f5 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f6 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f7 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f8 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f9 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f10 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f11 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f12 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f13 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f14 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f15 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f16 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f17 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f18 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f19 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f20 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f21 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f22 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f23 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f0 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f1 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f2 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f3 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f4 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f5 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f6 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f7 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f8 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f9 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f10 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f11 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f12 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f13 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f14 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f15 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f16 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f17 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f18 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f19 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f20 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f21 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f22 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f23 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f0 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f1 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f2 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f3 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f4 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f5 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f6 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f7 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f8 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f9 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f10 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f11 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f12 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f13 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f14 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f15 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f16 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f17 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f18 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f19 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f20 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f21 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f22 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f23 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f0 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f1 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f2 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f3 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f4 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f5 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f6 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f7 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f8 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f9 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f10 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f11 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f12 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f13 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f14 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f15 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f16 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f17 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f18 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f19 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f20 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f21 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f22 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f23 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f0 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f1 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f2 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f3 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f4 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f5 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f6 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f7 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f8 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f9 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f10 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f11 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f12 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f13 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f14 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f15 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f16 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f17 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f18 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f19 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f20 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f21 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f22 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f23 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f24 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f25 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f26 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f27 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f28 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f29 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f30 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f31 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f32 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f33 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f34 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f35 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f36 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f37 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f38 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f39 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f40 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f41 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f42 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f43 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f44 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f45 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f46 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f47 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f0 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f1 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f2 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f3 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f4 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f5 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f6 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f7 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f8 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f9 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f10 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f11 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f12 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f13 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f14 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f15 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f16 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f17 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f18 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f19 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f20 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f21 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f22 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f23 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f24 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f25 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f26 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f27 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f28 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f29 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f30 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f31 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f32 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f33 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f34 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f35 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f36 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f37 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f38 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f39 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f40 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f41 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f42 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f43 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f44 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f45 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f46 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f47 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f0 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f1 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f2 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f3 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f4 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f5 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f6 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f7 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f8 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f9 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f10 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f11 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f12 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f13 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f14 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f15 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f16 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f17 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f18 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f19 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f20 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f21 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f22 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f23 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f24 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f25 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f26 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f27 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f28 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f29 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f30 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f31 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f32 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f33 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f34 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f35 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f36 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f37 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f38 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f39 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f40 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f41 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f42 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f43 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f44 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f45 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f46 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f47 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f0 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f1 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f2 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f3 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f4 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f5 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f6 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f7 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f8 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f9 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f10 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f11 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f12 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f13 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f14 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f15 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f16 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f17 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f18 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f19 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f20 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f21 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f22 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f23 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f24 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f25 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f26 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f27 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f28 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f29 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f30 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f31 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f32 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f33 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f34 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f35 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f36 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f37 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f38 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f39 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f40 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f41 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f42 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f43 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f44 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f45 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f46 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f47 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +.ends C09_ihp130_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1.5_sL1/testbench.spice new file mode 100644 index 00000000..329b99d5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1.5_sL1/testbench.spice @@ -0,0 +1,42 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 C09_ihp130_sW1.5_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIB1 IB1 VSS 2e-05 +.nodeset v(IB1)=0.84 +XB_VB1 VB1 VB1 VSS VSS sg13_lv_nmos w=12u l=0.26u +IB_VB1 VDDB VB1 4e-05 +XB_GS_M3 GS_M3 GS_M3 VSS VSS sg13_lv_nmos w=12u l=0.26u +IB_GS_M3 VDDB GS_M3 1e-05 +XB_GS_M1 GS_M1 GS_M1 VSS VSS sg13_lv_nmos w=12u l=0.26u +IB_GS_M1 VDDB GS_M1 1e-05 +B_VCM VCM 0 V = v(VB1) - v(GS_M3) + v(GS_M1) - 0.1 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 0.54 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN2 VCM VINT 0 1 +EIN VIN1 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN2) - v(VIN1) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1.5_sL2/case.json new file mode 100644 index 00000000..692601f2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1.5_sL2/case.json @@ -0,0 +1,235 @@ +{ + "case_id": "C09_ihp130_sW1.5_sL2", + "circuit_id": "C09", + "pdk": "ihp130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "dut_name": "C09_ihp130_sW1.5_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VB1", + "IB1" + ], + "sizing": { + "M1": { + "w": 12.0, + "l": 0.52, + "nf": 24 + }, + "M2": { + "w": 12.0, + "l": 0.52, + "nf": 24 + }, + "M3": { + "w": 12.0, + "l": 0.52, + "nf": 24 + }, + "M4": { + "w": 12.0, + "l": 0.52, + "nf": 24 + }, + "M5": { + "w": 24.0, + "l": 0.52, + "nf": 48 + }, + "M6": { + "w": 24.0, + "l": 0.52, + "nf": 48 + }, + "M7": { + "w": 24.0, + "l": 0.52, + "nf": 48 + }, + "M8": { + "w": 24.0, + "l": 0.52, + "nf": 48 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 1e-05, + "kind": "cascode" + }, + "IB1": { + "i": 2e-05, + "from": "VSS" + } + }, + "load": { + "vcm": { + "expr": "v(VB1) - gs(M3) + gs(M1) - 0.1", + "currents": { + "M3": 1e-05, + "M1": 1e-05 + } + }, + "CL": 1e-12, + "inv_input": "VIN2", + "vout_target": 0.54 + }, + "category": "ota", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 12.0, + "l": 0.52, + "nf": 24, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 12.0, + "l": 0.52, + "nf": 24, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 12.0, + "l": 0.52, + "nf": 24, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 12.0, + "l": 0.52, + "nf": 24, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.52, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.52, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.52, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.52, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "b468f8cab3fa3e1e", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 1e-05, + "variant": "cascode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1.5_sL2/manifest.json new file mode 100644 index 00000000..c14f974f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "c26392c46ec7a11021446ff4c0869b9fef3d6531b9f4c0d9ce58c543769afa91", + "qualification.json": "df7b20568245f76d11ad9d7401410bd5b3eb6f3e1a95acde360836f74fb5ce36", + "specs.json": "b137b047bcd04e24bbdf8b35b77dbb63b6a4161a2209c0796f42a1ff4fa1870e", + "target.spice": "7db1b963e4624ca32dab54e02dbda1382e317f62b470084688f455ccda760421", + "target_lvs.spice": "6ffbc4d8af1d41c06dbc2851bcc56d79b6c426c67aa8b87d38ccc5446e857768", + "testbench.spice": "cbfc936c8ecfa26c5a4deda604ab3facef00661d2925d34b3bd236ded085a860" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1.5_sL2/qualification.json new file mode 100644 index 00000000..968ae0e2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1.5_sL2/qualification.json @@ -0,0 +1,158 @@ +{ + "case_id": "C09_ihp130_sW1.5_sL2", + "circuit_id": "C09", + "pdk": "ihp130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "ota", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 12.0, + "l": 0.52, + "nf": 24, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 12.0, + "l": 0.52, + "nf": 24, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 12.0, + "l": 0.52, + "nf": 24, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 12.0, + "l": 0.52, + "nf": 24, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.52, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.52, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.52, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.52, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "b468f8cab3fa3e1e", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 47.73 + }, + "ugf": { + "min": 16740000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 50.73498, + "ugf": 27896820.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 13.3, + "schematic_measures": { + "vout0": 0.5399999, + "idd": 1.999999e-05, + "vos": -0.000680615, + "gain_lf": 50.73498, + "ph_lf": 0.2498229, + "ugf": 27896820.0, + "ph_ugf": -102.4383, + "f3db": 84102.49, + "pm": 77.3118771 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1.5_sL2/specs.json new file mode 100644 index 00000000..c174dce4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1.5_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 47.73 + }, + "ugf": { + "min": 16740000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 50.73498, + "ugf": 27896820.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1.5_sL2/target.spice new file mode 100644 index 00000000..18e6d19b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1.5_sL2/target.spice @@ -0,0 +1,10 @@ +.subckt C09_ihp130_sW1.5_sL2 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 +XM1 net018 VIN1 IB1 VSS sg13_lv_nmos w=12u l=0.52u ng=24 m=1 +XM2 net016 VIN2 IB1 VSS sg13_lv_nmos w=12u l=0.52u ng=24 m=1 +XM3 net04 VB1 net018 VSS sg13_lv_nmos w=12u l=0.52u ng=24 m=1 +XM4 VOUT1 VB1 net016 VSS sg13_lv_nmos w=12u l=0.52u ng=24 m=1 +XM5 net04 net04 net019 VDD sg13_lv_pmos w=24u l=0.52u ng=48 m=1 +XM6 VOUT1 net04 net017 VDD sg13_lv_pmos w=24u l=0.52u ng=48 m=1 +XM7 net019 net019 VDD VDD sg13_lv_pmos w=24u l=0.52u ng=48 m=1 +XM8 net017 net019 VDD VDD sg13_lv_pmos w=24u l=0.52u ng=48 m=1 +.ends C09_ihp130_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1.5_sL2/target_lvs.spice new file mode 100644 index 00000000..9c65e240 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1.5_sL2/target_lvs.spice @@ -0,0 +1,290 @@ +.subckt C09_ihp130_sW1.5_sL2 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 +XM1_f0 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f1 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f2 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f3 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f4 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f5 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f6 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f7 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f8 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f9 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f10 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f11 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f12 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f13 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f14 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f15 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f16 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f17 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f18 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f19 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f20 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f21 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f22 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f23 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f0 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f1 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f2 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f3 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f4 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f5 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f6 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f7 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f8 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f9 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f10 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f11 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f12 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f13 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f14 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f15 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f16 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f17 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f18 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f19 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f20 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f21 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f22 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f23 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f0 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f1 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f2 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f3 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f4 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f5 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f6 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f7 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f8 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f9 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f10 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f11 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f12 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f13 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f14 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f15 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f16 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f17 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f18 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f19 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f20 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f21 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f22 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f23 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f0 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f1 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f2 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f3 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f4 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f5 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f6 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f7 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f8 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f9 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f10 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f11 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f12 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f13 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f14 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f15 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f16 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f17 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f18 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f19 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f20 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f21 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f22 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f23 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f0 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f1 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f2 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f3 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f4 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f5 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f6 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f7 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f8 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f9 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f10 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f11 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f12 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f13 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f14 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f15 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f16 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f17 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f18 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f19 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f20 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f21 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f22 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f23 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f24 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f25 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f26 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f27 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f28 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f29 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f30 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f31 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f32 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f33 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f34 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f35 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f36 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f37 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f38 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f39 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f40 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f41 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f42 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f43 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f44 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f45 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f46 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f47 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f0 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f1 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f2 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f3 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f4 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f5 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f6 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f7 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f8 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f9 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f10 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f11 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f12 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f13 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f14 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f15 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f16 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f17 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f18 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f19 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f20 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f21 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f22 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f23 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f24 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f25 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f26 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f27 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f28 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f29 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f30 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f31 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f32 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f33 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f34 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f35 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f36 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f37 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f38 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f39 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f40 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f41 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f42 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f43 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f44 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f45 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f46 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f47 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f0 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f1 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f2 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f3 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f4 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f5 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f6 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f7 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f8 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f9 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f10 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f11 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f12 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f13 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f14 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f15 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f16 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f17 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f18 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f19 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f20 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f21 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f22 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f23 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f24 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f25 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f26 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f27 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f28 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f29 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f30 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f31 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f32 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f33 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f34 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f35 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f36 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f37 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f38 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f39 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f40 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f41 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f42 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f43 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f44 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f45 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f46 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f47 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f0 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f1 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f2 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f3 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f4 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f5 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f6 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f7 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f8 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f9 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f10 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f11 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f12 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f13 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f14 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f15 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f16 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f17 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f18 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f19 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f20 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f21 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f22 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f23 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f24 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f25 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f26 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f27 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f28 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f29 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f30 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f31 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f32 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f33 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f34 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f35 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f36 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f37 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f38 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f39 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f40 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f41 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f42 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f43 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f44 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f45 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f46 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f47 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +.ends C09_ihp130_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1.5_sL2/testbench.spice new file mode 100644 index 00000000..9dea3996 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1.5_sL2/testbench.spice @@ -0,0 +1,42 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 C09_ihp130_sW1.5_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIB1 IB1 VSS 2e-05 +.nodeset v(IB1)=0.84 +XB_VB1 VB1 VB1 VSS VSS sg13_lv_nmos w=12u l=0.52u +IB_VB1 VDDB VB1 4e-05 +XB_GS_M3 GS_M3 GS_M3 VSS VSS sg13_lv_nmos w=12u l=0.52u +IB_GS_M3 VDDB GS_M3 1e-05 +XB_GS_M1 GS_M1 GS_M1 VSS VSS sg13_lv_nmos w=12u l=0.52u +IB_GS_M1 VDDB GS_M1 1e-05 +B_VCM VCM 0 V = v(VB1) - v(GS_M3) + v(GS_M1) - 0.1 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 0.54 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN2 VCM VINT 0 1 +EIN VIN1 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN2) - v(VIN1) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1_sL1.5/case.json new file mode 100644 index 00000000..b37e4882 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1_sL1.5/case.json @@ -0,0 +1,235 @@ +{ + "case_id": "C09_ihp130_sW1_sL1.5", + "circuit_id": "C09", + "pdk": "ihp130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "dut_name": "C09_ihp130_sW1_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VB1", + "IB1" + ], + "sizing": { + "M1": { + "w": 8.0, + "l": 0.39, + "nf": 16 + }, + "M2": { + "w": 8.0, + "l": 0.39, + "nf": 16 + }, + "M3": { + "w": 8.0, + "l": 0.39, + "nf": 16 + }, + "M4": { + "w": 8.0, + "l": 0.39, + "nf": 16 + }, + "M5": { + "w": 16.0, + "l": 0.39, + "nf": 32 + }, + "M6": { + "w": 16.0, + "l": 0.39, + "nf": 32 + }, + "M7": { + "w": 16.0, + "l": 0.39, + "nf": 32 + }, + "M8": { + "w": 16.0, + "l": 0.39, + "nf": 32 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 1e-05, + "kind": "cascode" + }, + "IB1": { + "i": 2e-05, + "from": "VSS" + } + }, + "load": { + "vcm": { + "expr": "v(VB1) - gs(M3) + gs(M1) - 0.1", + "currents": { + "M3": 1e-05, + "M1": 1e-05 + } + }, + "CL": 1e-12, + "inv_input": "VIN2", + "vout_target": 0.54 + }, + "category": "ota", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.39, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.39, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.39, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.39, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "2773afcd095b5522", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 1e-05, + "variant": "cascode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1_sL1.5/manifest.json new file mode 100644 index 00000000..0b365f89 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "b26a8969b4af9cf51c430c612bc5a41223d4d15292750cb00eec69d01421ebee", + "qualification.json": "bbecd02c77b6a19903939e276e19a612055e5454f27643ee0217d4131d9a18f5", + "specs.json": "2d33a7b229b7c3840948c5aa247c2441d018ef224100c1a980df7930c924d6a3", + "target.spice": "3a46a2557518a32d1bd4675000462a30af36ac2ab74011caa1538809c2707690", + "target_lvs.spice": "74624f451b4099c53beb94c18758a79e6eb1dced7908281878e51e6513fba917", + "testbench.spice": "f15c6a7aa0cce15bd976ca8a4e21516462bc04e89255b08d0e0fc34967001deb" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1_sL1.5/qualification.json new file mode 100644 index 00000000..454fc0af --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1_sL1.5/qualification.json @@ -0,0 +1,158 @@ +{ + "case_id": "C09_ihp130_sW1_sL1.5", + "circuit_id": "C09", + "pdk": "ihp130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "ota", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.39, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.39, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.39, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.39, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "2773afcd095b5522", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 45.42 + }, + "ugf": { + "min": 16230000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 48.41935, + "ugf": 27051630.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 9.1, + "schematic_measures": { + "vout0": 0.5399999, + "idd": 2e-05, + "vos": -0.00106018, + "gain_lf": 48.41935, + "ph_lf": 0.1895577, + "ugf": 27051630.0, + "ph_ugf": -97.19938, + "f3db": 103583.1, + "pm": 82.6110623 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1_sL1.5/specs.json new file mode 100644 index 00000000..9b4c492d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 45.42 + }, + "ugf": { + "min": 16230000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 48.41935, + "ugf": 27051630.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1_sL1.5/target.spice new file mode 100644 index 00000000..68c4fac5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1_sL1.5/target.spice @@ -0,0 +1,10 @@ +.subckt C09_ihp130_sW1_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 +XM1 net018 VIN1 IB1 VSS sg13_lv_nmos w=8u l=0.39u ng=16 m=1 +XM2 net016 VIN2 IB1 VSS sg13_lv_nmos w=8u l=0.39u ng=16 m=1 +XM3 net04 VB1 net018 VSS sg13_lv_nmos w=8u l=0.39u ng=16 m=1 +XM4 VOUT1 VB1 net016 VSS sg13_lv_nmos w=8u l=0.39u ng=16 m=1 +XM5 net04 net04 net019 VDD sg13_lv_pmos w=16u l=0.39u ng=32 m=1 +XM6 VOUT1 net04 net017 VDD sg13_lv_pmos w=16u l=0.39u ng=32 m=1 +XM7 net019 net019 VDD VDD sg13_lv_pmos w=16u l=0.39u ng=32 m=1 +XM8 net017 net019 VDD VDD sg13_lv_pmos w=16u l=0.39u ng=32 m=1 +.ends C09_ihp130_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1_sL1.5/target_lvs.spice new file mode 100644 index 00000000..ce5c122a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1_sL1.5/target_lvs.spice @@ -0,0 +1,194 @@ +.subckt C09_ihp130_sW1_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 +XM1_f0 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f1 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f2 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f3 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f4 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f5 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f6 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f7 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f8 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f9 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f10 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f11 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f12 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f13 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f14 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f15 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f0 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f1 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f2 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f3 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f4 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f5 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f6 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f7 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f8 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f9 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f10 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f11 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f12 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f13 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f14 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f15 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f0 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f1 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f2 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f3 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f4 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f5 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f6 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f7 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f8 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f9 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f10 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f11 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f12 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f13 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f14 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f15 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f0 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f1 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f2 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f3 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f4 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f5 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f6 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f7 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f8 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f9 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f10 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f11 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f12 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f13 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f14 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f15 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f0 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f1 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f2 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f3 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f4 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f5 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f6 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f7 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f8 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f9 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f10 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f11 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f12 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f13 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f14 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f15 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f16 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f17 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f18 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f19 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f20 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f21 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f22 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f23 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f24 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f25 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f26 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f27 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f28 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f29 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f30 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f31 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f0 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f1 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f2 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f3 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f4 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f5 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f6 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f7 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f8 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f9 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f10 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f11 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f12 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f13 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f14 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f15 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f16 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f17 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f18 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f19 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f20 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f21 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f22 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f23 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f24 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f25 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f26 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f27 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f28 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f29 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f30 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f31 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f0 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f1 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f2 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f3 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f4 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f5 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f6 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f7 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f8 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f9 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f10 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f11 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f12 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f13 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f14 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f15 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f16 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f17 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f18 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f19 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f20 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f21 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f22 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f23 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f24 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f25 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f26 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f27 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f28 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f29 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f30 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f31 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f0 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f1 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f2 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f3 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f4 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f5 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f6 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f7 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f8 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f9 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f10 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f11 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f12 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f13 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f14 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f15 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f16 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f17 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f18 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f19 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f20 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f21 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f22 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f23 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f24 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f25 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f26 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f27 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f28 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f29 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f30 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f31 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +.ends C09_ihp130_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1_sL1.5/testbench.spice new file mode 100644 index 00000000..4eecf3ec --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1_sL1.5/testbench.spice @@ -0,0 +1,42 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 C09_ihp130_sW1_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIB1 IB1 VSS 2e-05 +.nodeset v(IB1)=0.84 +XB_VB1 VB1 VB1 VSS VSS sg13_lv_nmos w=8u l=0.39u +IB_VB1 VDDB VB1 4e-05 +XB_GS_M3 GS_M3 GS_M3 VSS VSS sg13_lv_nmos w=8u l=0.39u +IB_GS_M3 VDDB GS_M3 1e-05 +XB_GS_M1 GS_M1 GS_M1 VSS VSS sg13_lv_nmos w=8u l=0.39u +IB_GS_M1 VDDB GS_M1 1e-05 +B_VCM VCM 0 V = v(VB1) - v(GS_M3) + v(GS_M1) - 0.1 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 0.54 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN2 VCM VINT 0 1 +EIN VIN1 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN2) - v(VIN1) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1_sL1/case.json new file mode 100644 index 00000000..9ec231f0 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1_sL1/case.json @@ -0,0 +1,235 @@ +{ + "case_id": "C09_ihp130_sW1_sL1", + "circuit_id": "C09", + "pdk": "ihp130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "dut_name": "C09_ihp130_sW1_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VB1", + "IB1" + ], + "sizing": { + "M1": { + "w": 8.0, + "l": 0.26, + "nf": 16 + }, + "M2": { + "w": 8.0, + "l": 0.26, + "nf": 16 + }, + "M3": { + "w": 8.0, + "l": 0.26, + "nf": 16 + }, + "M4": { + "w": 8.0, + "l": 0.26, + "nf": 16 + }, + "M5": { + "w": 16.0, + "l": 0.26, + "nf": 32 + }, + "M6": { + "w": 16.0, + "l": 0.26, + "nf": 32 + }, + "M7": { + "w": 16.0, + "l": 0.26, + "nf": 32 + }, + "M8": { + "w": 16.0, + "l": 0.26, + "nf": 32 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 1e-05, + "kind": "cascode" + }, + "IB1": { + "i": 2e-05, + "from": "VSS" + } + }, + "load": { + "vcm": { + "expr": "v(VB1) - gs(M3) + gs(M1) - 0.1", + "currents": { + "M3": 1e-05, + "M1": 1e-05 + } + }, + "CL": 1e-12, + "inv_input": "VIN2", + "vout_target": 0.54 + }, + "category": "ota", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 8.0, + "l": 0.26, + "nf": 16, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 8.0, + "l": 0.26, + "nf": 16, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 8.0, + "l": 0.26, + "nf": 16, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 8.0, + "l": 0.26, + "nf": 16, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.26, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.26, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.26, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.26, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "07fe9430f41bc598", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 1e-05, + "variant": "cascode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1_sL1/manifest.json new file mode 100644 index 00000000..270f8453 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "74d17796af77b04fd522e08bc7f48816b5fa1922eb759640d129c878155e2884", + "qualification.json": "b2d39d19c76cb9e44b54f4c2d9042fb3bdcc7340b3f9c4747f1951375e14d981", + "specs.json": "0fb3e7bed14eb80f59ba8add454b77677d4cf2cf42b7a55c7c596f3e7995ab9c", + "target.spice": "55f1a3ca78294e103c266a660eb589383ee7e420637e9133d937ec755e241550", + "target_lvs.spice": "2aed63126250dea5a95b52d33074f7347252762d0e24f43cbbbdf01c8753d6a3", + "testbench.spice": "d359e40c7e5b899c103788a02ea314e22d3cd35befcd5d0cddc80701855613b7" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1_sL1/qualification.json new file mode 100644 index 00000000..2192f884 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1_sL1/qualification.json @@ -0,0 +1,158 @@ +{ + "case_id": "C09_ihp130_sW1_sL1", + "circuit_id": "C09", + "pdk": "ihp130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "ota", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 8.0, + "l": 0.26, + "nf": 16, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 8.0, + "l": 0.26, + "nf": 16, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 8.0, + "l": 0.26, + "nf": 16, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 8.0, + "l": 0.26, + "nf": 16, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.26, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.26, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.26, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.26, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "07fe9430f41bc598", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 43.79 + }, + "ugf": { + "min": 17120000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 46.79468, + "ugf": 28533340.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 9.8, + "schematic_measures": { + "vout0": 0.5399999, + "idd": 2e-05, + "vos": -0.00121206, + "gain_lf": 46.79468, + "ph_lf": 0.1587416, + "ugf": 28533340.0, + "ph_ugf": -95.19714, + "f3db": 131028.6, + "pm": 84.6441184 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1_sL1/specs.json new file mode 100644 index 00000000..6c73bc7a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 43.79 + }, + "ugf": { + "min": 17120000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 46.79468, + "ugf": 28533340.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1_sL1/target.spice new file mode 100644 index 00000000..86ddf796 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1_sL1/target.spice @@ -0,0 +1,10 @@ +.subckt C09_ihp130_sW1_sL1 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 +XM1 net018 VIN1 IB1 VSS sg13_lv_nmos w=8u l=0.26u ng=16 m=1 +XM2 net016 VIN2 IB1 VSS sg13_lv_nmos w=8u l=0.26u ng=16 m=1 +XM3 net04 VB1 net018 VSS sg13_lv_nmos w=8u l=0.26u ng=16 m=1 +XM4 VOUT1 VB1 net016 VSS sg13_lv_nmos w=8u l=0.26u ng=16 m=1 +XM5 net04 net04 net019 VDD sg13_lv_pmos w=16u l=0.26u ng=32 m=1 +XM6 VOUT1 net04 net017 VDD sg13_lv_pmos w=16u l=0.26u ng=32 m=1 +XM7 net019 net019 VDD VDD sg13_lv_pmos w=16u l=0.26u ng=32 m=1 +XM8 net017 net019 VDD VDD sg13_lv_pmos w=16u l=0.26u ng=32 m=1 +.ends C09_ihp130_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1_sL1/target_lvs.spice new file mode 100644 index 00000000..4d1c5232 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1_sL1/target_lvs.spice @@ -0,0 +1,194 @@ +.subckt C09_ihp130_sW1_sL1 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 +XM1_f0 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f1 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f2 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f3 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f4 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f5 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f6 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f7 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f8 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f9 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f10 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f11 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f12 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f13 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f14 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f15 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f0 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f1 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f2 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f3 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f4 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f5 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f6 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f7 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f8 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f9 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f10 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f11 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f12 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f13 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f14 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f15 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f0 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f1 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f2 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f3 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f4 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f5 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f6 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f7 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f8 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f9 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f10 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f11 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f12 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f13 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f14 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f15 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f0 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f1 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f2 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f3 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f4 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f5 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f6 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f7 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f8 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f9 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f10 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f11 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f12 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f13 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f14 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f15 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f0 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f1 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f2 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f3 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f4 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f5 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f6 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f7 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f8 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f9 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f10 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f11 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f12 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f13 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f14 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f15 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f16 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f17 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f18 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f19 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f20 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f21 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f22 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f23 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f24 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f25 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f26 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f27 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f28 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f29 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f30 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f31 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f0 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f1 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f2 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f3 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f4 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f5 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f6 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f7 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f8 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f9 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f10 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f11 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f12 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f13 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f14 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f15 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f16 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f17 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f18 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f19 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f20 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f21 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f22 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f23 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f24 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f25 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f26 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f27 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f28 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f29 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f30 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f31 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f0 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f1 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f2 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f3 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f4 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f5 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f6 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f7 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f8 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f9 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f10 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f11 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f12 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f13 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f14 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f15 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f16 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f17 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f18 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f19 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f20 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f21 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f22 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f23 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f24 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f25 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f26 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f27 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f28 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f29 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f30 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f31 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f0 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f1 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f2 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f3 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f4 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f5 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f6 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f7 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f8 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f9 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f10 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f11 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f12 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f13 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f14 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f15 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f16 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f17 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f18 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f19 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f20 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f21 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f22 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f23 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f24 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f25 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f26 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f27 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f28 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f29 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f30 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f31 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +.ends C09_ihp130_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1_sL1/testbench.spice new file mode 100644 index 00000000..fa3783a6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1_sL1/testbench.spice @@ -0,0 +1,42 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 C09_ihp130_sW1_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIB1 IB1 VSS 2e-05 +.nodeset v(IB1)=0.84 +XB_VB1 VB1 VB1 VSS VSS sg13_lv_nmos w=8u l=0.26u +IB_VB1 VDDB VB1 4e-05 +XB_GS_M3 GS_M3 GS_M3 VSS VSS sg13_lv_nmos w=8u l=0.26u +IB_GS_M3 VDDB GS_M3 1e-05 +XB_GS_M1 GS_M1 GS_M1 VSS VSS sg13_lv_nmos w=8u l=0.26u +IB_GS_M1 VDDB GS_M1 1e-05 +B_VCM VCM 0 V = v(VB1) - v(GS_M3) + v(GS_M1) - 0.1 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 0.54 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN2 VCM VINT 0 1 +EIN VIN1 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN2) - v(VIN1) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1_sL2/case.json new file mode 100644 index 00000000..075b8a75 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1_sL2/case.json @@ -0,0 +1,235 @@ +{ + "case_id": "C09_ihp130_sW1_sL2", + "circuit_id": "C09", + "pdk": "ihp130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "dut_name": "C09_ihp130_sW1_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VB1", + "IB1" + ], + "sizing": { + "M1": { + "w": 8.0, + "l": 0.52, + "nf": 16 + }, + "M2": { + "w": 8.0, + "l": 0.52, + "nf": 16 + }, + "M3": { + "w": 8.0, + "l": 0.52, + "nf": 16 + }, + "M4": { + "w": 8.0, + "l": 0.52, + "nf": 16 + }, + "M5": { + "w": 16.0, + "l": 0.52, + "nf": 32 + }, + "M6": { + "w": 16.0, + "l": 0.52, + "nf": 32 + }, + "M7": { + "w": 16.0, + "l": 0.52, + "nf": 32 + }, + "M8": { + "w": 16.0, + "l": 0.52, + "nf": 32 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 1e-05, + "kind": "cascode" + }, + "IB1": { + "i": 2e-05, + "from": "VSS" + } + }, + "load": { + "vcm": { + "expr": "v(VB1) - gs(M3) + gs(M1) - 0.1", + "currents": { + "M3": 1e-05, + "M1": 1e-05 + } + }, + "CL": 1e-12, + "inv_input": "VIN2", + "vout_target": 0.54 + }, + "category": "ota", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.52, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.52, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.52, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.52, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "4f835db8a1834f5b", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 1e-05, + "variant": "cascode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1_sL2/manifest.json new file mode 100644 index 00000000..767aa741 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "1fb7e6e953fbe1efaffc4810307f2e3147faba685b4f97b74f4e8a68cabd6e21", + "qualification.json": "04b2d0dc9a621b33317abbffc9dbecf4004d2c9c93f62f9a05aaa662820fc5f1", + "specs.json": "55ee0665d91547b620ab9ef0c33ba8e53c9a7ca908e8e73bcd2e33eef925b5a7", + "target.spice": "b38beda2622393d86a8a83061ff0a3f90c142714cd9c6a02a90624adcc02fe4c", + "target_lvs.spice": "2348434756355cd863bafefeea6a482a7cf10068ba8baed63577c64363828230", + "testbench.spice": "2adaeafd3be1614412c9b81503cc5e34a5dfeffe1c8333c8a19d587dc44d5b33" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1_sL2/qualification.json new file mode 100644 index 00000000..f938aec9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1_sL2/qualification.json @@ -0,0 +1,158 @@ +{ + "case_id": "C09_ihp130_sW1_sL2", + "circuit_id": "C09", + "pdk": "ihp130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "ota", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.52, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.52, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.52, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.52, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "4f835db8a1834f5b", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 45.68 + }, + "ugf": { + "min": 15040000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 48.6813, + "ugf": 25073620.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 10.3, + "schematic_measures": { + "vout0": 0.5399999, + "idd": 1.999999e-05, + "vos": -0.0011112, + "gain_lf": 48.6813, + "ph_lf": 0.1926998, + "ugf": 25073620.0, + "ph_ugf": -99.08496, + "f3db": 94007.78, + "pm": 80.7223402 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1_sL2/specs.json new file mode 100644 index 00000000..f8f49fca --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 45.68 + }, + "ugf": { + "min": 15040000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 48.6813, + "ugf": 25073620.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1_sL2/target.spice new file mode 100644 index 00000000..4dd1db59 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1_sL2/target.spice @@ -0,0 +1,10 @@ +.subckt C09_ihp130_sW1_sL2 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 +XM1 net018 VIN1 IB1 VSS sg13_lv_nmos w=8u l=0.52u ng=16 m=1 +XM2 net016 VIN2 IB1 VSS sg13_lv_nmos w=8u l=0.52u ng=16 m=1 +XM3 net04 VB1 net018 VSS sg13_lv_nmos w=8u l=0.52u ng=16 m=1 +XM4 VOUT1 VB1 net016 VSS sg13_lv_nmos w=8u l=0.52u ng=16 m=1 +XM5 net04 net04 net019 VDD sg13_lv_pmos w=16u l=0.52u ng=32 m=1 +XM6 VOUT1 net04 net017 VDD sg13_lv_pmos w=16u l=0.52u ng=32 m=1 +XM7 net019 net019 VDD VDD sg13_lv_pmos w=16u l=0.52u ng=32 m=1 +XM8 net017 net019 VDD VDD sg13_lv_pmos w=16u l=0.52u ng=32 m=1 +.ends C09_ihp130_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1_sL2/target_lvs.spice new file mode 100644 index 00000000..17149af7 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1_sL2/target_lvs.spice @@ -0,0 +1,194 @@ +.subckt C09_ihp130_sW1_sL2 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 +XM1_f0 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f1 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f2 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f3 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f4 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f5 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f6 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f7 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f8 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f9 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f10 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f11 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f12 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f13 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f14 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f15 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f0 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f1 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f2 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f3 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f4 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f5 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f6 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f7 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f8 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f9 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f10 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f11 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f12 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f13 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f14 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f15 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f0 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f1 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f2 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f3 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f4 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f5 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f6 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f7 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f8 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f9 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f10 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f11 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f12 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f13 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f14 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f15 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f0 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f1 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f2 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f3 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f4 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f5 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f6 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f7 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f8 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f9 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f10 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f11 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f12 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f13 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f14 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f15 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f0 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f1 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f2 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f3 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f4 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f5 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f6 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f7 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f8 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f9 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f10 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f11 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f12 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f13 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f14 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f15 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f16 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f17 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f18 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f19 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f20 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f21 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f22 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f23 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f24 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f25 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f26 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f27 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f28 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f29 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f30 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f31 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f0 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f1 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f2 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f3 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f4 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f5 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f6 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f7 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f8 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f9 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f10 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f11 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f12 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f13 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f14 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f15 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f16 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f17 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f18 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f19 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f20 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f21 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f22 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f23 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f24 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f25 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f26 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f27 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f28 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f29 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f30 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f31 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f0 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f1 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f2 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f3 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f4 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f5 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f6 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f7 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f8 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f9 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f10 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f11 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f12 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f13 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f14 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f15 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f16 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f17 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f18 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f19 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f20 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f21 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f22 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f23 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f24 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f25 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f26 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f27 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f28 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f29 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f30 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f31 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f0 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f1 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f2 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f3 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f4 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f5 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f6 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f7 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f8 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f9 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f10 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f11 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f12 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f13 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f14 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f15 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f16 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f17 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f18 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f19 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f20 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f21 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f22 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f23 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f24 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f25 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f26 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f27 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f28 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f29 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f30 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f31 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +.ends C09_ihp130_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1_sL2/testbench.spice new file mode 100644 index 00000000..406e581c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW1_sL2/testbench.spice @@ -0,0 +1,42 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 C09_ihp130_sW1_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIB1 IB1 VSS 2e-05 +.nodeset v(IB1)=0.84 +XB_VB1 VB1 VB1 VSS VSS sg13_lv_nmos w=8u l=0.52u +IB_VB1 VDDB VB1 4e-05 +XB_GS_M3 GS_M3 GS_M3 VSS VSS sg13_lv_nmos w=8u l=0.52u +IB_GS_M3 VDDB GS_M3 1e-05 +XB_GS_M1 GS_M1 GS_M1 VSS VSS sg13_lv_nmos w=8u l=0.52u +IB_GS_M1 VDDB GS_M1 1e-05 +B_VCM VCM 0 V = v(VB1) - v(GS_M3) + v(GS_M1) - 0.1 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 0.54 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN2 VCM VINT 0 1 +EIN VIN1 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN2) - v(VIN1) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW2_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW2_sL1.5/case.json new file mode 100644 index 00000000..c8673c26 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW2_sL1.5/case.json @@ -0,0 +1,235 @@ +{ + "case_id": "C09_ihp130_sW2_sL1.5", + "circuit_id": "C09", + "pdk": "ihp130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "dut_name": "C09_ihp130_sW2_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VB1", + "IB1" + ], + "sizing": { + "M1": { + "w": 16.0, + "l": 0.39, + "nf": 32 + }, + "M2": { + "w": 16.0, + "l": 0.39, + "nf": 32 + }, + "M3": { + "w": 16.0, + "l": 0.39, + "nf": 32 + }, + "M4": { + "w": 16.0, + "l": 0.39, + "nf": 32 + }, + "M5": { + "w": 32.0, + "l": 0.39, + "nf": 64 + }, + "M6": { + "w": 32.0, + "l": 0.39, + "nf": 64 + }, + "M7": { + "w": 32.0, + "l": 0.39, + "nf": 64 + }, + "M8": { + "w": 32.0, + "l": 0.39, + "nf": 64 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 1e-05, + "kind": "cascode" + }, + "IB1": { + "i": 2e-05, + "from": "VSS" + } + }, + "load": { + "vcm": { + "expr": "v(VB1) - gs(M3) + gs(M1) - 0.1", + "currents": { + "M3": 1e-05, + "M1": 1e-05 + } + }, + "CL": 1e-12, + "inv_input": "VIN2", + "vout_target": 0.54 + }, + "category": "ota", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 16.0, + "l": 0.39, + "nf": 32, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 16.0, + "l": 0.39, + "nf": 32, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 16.0, + "l": 0.39, + "nf": 32, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 16.0, + "l": 0.39, + "nf": 32, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.39, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.39, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.39, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.39, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "893e19d18b5b4777", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 1e-05, + "variant": "cascode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW2_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW2_sL1.5/manifest.json new file mode 100644 index 00000000..e2cf6568 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW2_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "90d581dad3bc10dca89b472f171b292c37fc6daca3fd1920b079d02f5b53c86d", + "qualification.json": "d7c47f4233d56b0e75a0105975d0619684411d22194c0314f30450f8d81089bb", + "specs.json": "8796ca6dc1a5683403b70db07d491acf009ecb34f89fd558a4db799072d4bf83", + "target.spice": "cd7ea475b0ca10d70ecee967456a9a0cf18a1eab92b9e53ec8f6d275af23fba4", + "target_lvs.spice": "d13fe3b1726ef00dc7eaaff2ba8d128a003d8e0827524840c4171fb0d726e830", + "testbench.spice": "c0ef3988989b804290a3628c1ba7921ac1226a9939ccde2a260f003eba02e737" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW2_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW2_sL1.5/qualification.json new file mode 100644 index 00000000..f90191cf --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW2_sL1.5/qualification.json @@ -0,0 +1,158 @@ +{ + "case_id": "C09_ihp130_sW2_sL1.5", + "circuit_id": "C09", + "pdk": "ihp130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "ota", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 16.0, + "l": 0.39, + "nf": 32, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 16.0, + "l": 0.39, + "nf": 32, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 16.0, + "l": 0.39, + "nf": 32, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 16.0, + "l": 0.39, + "nf": 32, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.39, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.39, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.39, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.39, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "893e19d18b5b4777", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 48.11 + }, + "ugf": { + "min": 18620000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 51.11291, + "ugf": 31038840.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 18.2, + "schematic_measures": { + "vout0": 0.5399999, + "idd": 2e-05, + "vos": -0.000504572, + "gain_lf": 51.11291, + "ph_lf": 0.2661535, + "ugf": 31038840.0, + "ph_ugf": -102.3014, + "f3db": 89504.81, + "pm": 77.4324465 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW2_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW2_sL1.5/specs.json new file mode 100644 index 00000000..7bdc3fd1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW2_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 48.11 + }, + "ugf": { + "min": 18620000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 51.11291, + "ugf": 31038840.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW2_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW2_sL1.5/target.spice new file mode 100644 index 00000000..d513098e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW2_sL1.5/target.spice @@ -0,0 +1,10 @@ +.subckt C09_ihp130_sW2_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 +XM1 net018 VIN1 IB1 VSS sg13_lv_nmos w=16u l=0.39u ng=32 m=1 +XM2 net016 VIN2 IB1 VSS sg13_lv_nmos w=16u l=0.39u ng=32 m=1 +XM3 net04 VB1 net018 VSS sg13_lv_nmos w=16u l=0.39u ng=32 m=1 +XM4 VOUT1 VB1 net016 VSS sg13_lv_nmos w=16u l=0.39u ng=32 m=1 +XM5 net04 net04 net019 VDD sg13_lv_pmos w=32u l=0.39u ng=64 m=1 +XM6 VOUT1 net04 net017 VDD sg13_lv_pmos w=32u l=0.39u ng=64 m=1 +XM7 net019 net019 VDD VDD sg13_lv_pmos w=32u l=0.39u ng=64 m=1 +XM8 net017 net019 VDD VDD sg13_lv_pmos w=32u l=0.39u ng=64 m=1 +.ends C09_ihp130_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW2_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW2_sL1.5/target_lvs.spice new file mode 100644 index 00000000..2e2681a3 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW2_sL1.5/target_lvs.spice @@ -0,0 +1,386 @@ +.subckt C09_ihp130_sW2_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 +XM1_f0 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f1 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f2 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f3 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f4 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f5 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f6 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f7 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f8 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f9 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f10 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f11 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f12 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f13 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f14 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f15 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f16 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f17 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f18 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f19 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f20 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f21 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f22 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f23 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f24 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f25 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f26 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f27 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f28 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f29 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f30 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f31 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f0 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f1 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f2 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f3 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f4 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f5 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f6 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f7 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f8 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f9 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f10 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f11 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f12 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f13 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f14 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f15 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f16 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f17 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f18 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f19 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f20 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f21 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f22 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f23 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f24 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f25 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f26 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f27 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f28 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f29 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f30 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f31 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f0 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f1 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f2 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f3 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f4 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f5 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f6 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f7 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f8 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f9 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f10 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f11 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f12 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f13 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f14 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f15 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f16 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f17 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f18 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f19 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f20 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f21 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f22 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f23 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f24 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f25 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f26 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f27 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f28 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f29 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f30 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f31 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f0 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f1 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f2 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f3 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f4 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f5 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f6 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f7 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f8 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f9 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f10 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f11 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f12 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f13 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f14 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f15 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f16 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f17 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f18 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f19 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f20 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f21 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f22 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f23 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f24 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f25 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f26 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f27 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f28 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f29 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f30 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f31 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f0 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f1 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f2 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f3 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f4 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f5 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f6 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f7 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f8 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f9 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f10 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f11 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f12 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f13 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f14 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f15 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f16 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f17 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f18 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f19 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f20 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f21 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f22 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f23 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f24 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f25 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f26 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f27 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f28 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f29 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f30 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f31 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f32 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f33 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f34 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f35 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f36 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f37 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f38 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f39 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f40 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f41 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f42 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f43 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f44 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f45 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f46 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f47 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f48 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f49 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f50 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f51 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f52 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f53 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f54 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f55 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f56 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f57 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f58 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f59 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f60 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f61 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f62 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f63 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f0 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f1 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f2 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f3 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f4 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f5 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f6 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f7 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f8 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f9 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f10 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f11 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f12 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f13 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f14 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f15 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f16 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f17 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f18 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f19 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f20 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f21 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f22 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f23 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f24 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f25 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f26 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f27 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f28 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f29 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f30 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f31 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f32 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f33 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f34 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f35 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f36 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f37 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f38 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f39 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f40 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f41 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f42 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f43 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f44 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f45 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f46 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f47 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f48 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f49 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f50 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f51 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f52 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f53 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f54 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f55 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f56 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f57 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f58 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f59 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f60 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f61 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f62 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f63 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f0 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f1 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f2 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f3 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f4 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f5 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f6 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f7 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f8 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f9 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f10 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f11 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f12 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f13 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f14 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f15 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f16 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f17 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f18 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f19 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f20 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f21 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f22 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f23 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f24 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f25 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f26 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f27 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f28 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f29 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f30 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f31 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f32 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f33 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f34 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f35 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f36 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f37 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f38 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f39 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f40 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f41 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f42 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f43 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f44 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f45 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f46 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f47 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f48 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f49 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f50 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f51 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f52 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f53 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f54 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f55 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f56 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f57 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f58 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f59 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f60 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f61 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f62 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f63 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f0 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f1 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f2 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f3 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f4 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f5 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f6 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f7 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f8 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f9 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f10 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f11 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f12 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f13 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f14 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f15 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f16 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f17 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f18 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f19 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f20 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f21 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f22 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f23 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f24 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f25 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f26 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f27 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f28 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f29 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f30 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f31 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f32 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f33 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f34 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f35 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f36 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f37 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f38 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f39 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f40 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f41 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f42 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f43 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f44 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f45 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f46 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f47 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f48 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f49 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f50 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f51 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f52 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f53 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f54 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f55 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f56 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f57 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f58 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f59 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f60 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f61 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f62 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f63 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +.ends C09_ihp130_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW2_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW2_sL1.5/testbench.spice new file mode 100644 index 00000000..f60c7f23 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW2_sL1.5/testbench.spice @@ -0,0 +1,42 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 C09_ihp130_sW2_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIB1 IB1 VSS 2e-05 +.nodeset v(IB1)=0.84 +XB_VB1 VB1 VB1 VSS VSS sg13_lv_nmos w=16u l=0.39u +IB_VB1 VDDB VB1 4e-05 +XB_GS_M3 GS_M3 GS_M3 VSS VSS sg13_lv_nmos w=16u l=0.39u +IB_GS_M3 VDDB GS_M3 1e-05 +XB_GS_M1 GS_M1 GS_M1 VSS VSS sg13_lv_nmos w=16u l=0.39u +IB_GS_M1 VDDB GS_M1 1e-05 +B_VCM VCM 0 V = v(VB1) - v(GS_M3) + v(GS_M1) - 0.1 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 0.54 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN2 VCM VINT 0 1 +EIN VIN1 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN2) - v(VIN1) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW2_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW2_sL1/case.json new file mode 100644 index 00000000..7e897444 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW2_sL1/case.json @@ -0,0 +1,235 @@ +{ + "case_id": "C09_ihp130_sW2_sL1", + "circuit_id": "C09", + "pdk": "ihp130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "dut_name": "C09_ihp130_sW2_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VB1", + "IB1" + ], + "sizing": { + "M1": { + "w": 16.0, + "l": 0.26, + "nf": 32 + }, + "M2": { + "w": 16.0, + "l": 0.26, + "nf": 32 + }, + "M3": { + "w": 16.0, + "l": 0.26, + "nf": 32 + }, + "M4": { + "w": 16.0, + "l": 0.26, + "nf": 32 + }, + "M5": { + "w": 32.0, + "l": 0.26, + "nf": 64 + }, + "M6": { + "w": 32.0, + "l": 0.26, + "nf": 64 + }, + "M7": { + "w": 32.0, + "l": 0.26, + "nf": 64 + }, + "M8": { + "w": 32.0, + "l": 0.26, + "nf": 64 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 1e-05, + "kind": "cascode" + }, + "IB1": { + "i": 2e-05, + "from": "VSS" + } + }, + "load": { + "vcm": { + "expr": "v(VB1) - gs(M3) + gs(M1) - 0.1", + "currents": { + "M3": 1e-05, + "M1": 1e-05 + } + }, + "CL": 1e-12, + "inv_input": "VIN2", + "vout_target": 0.54 + }, + "category": "ota", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 16.0, + "l": 0.26, + "nf": 32, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 16.0, + "l": 0.26, + "nf": 32, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 16.0, + "l": 0.26, + "nf": 32, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 16.0, + "l": 0.26, + "nf": 32, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.26, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.26, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.26, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.26, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "c11cce1d9fae50fc", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 1e-05, + "variant": "cascode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW2_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW2_sL1/manifest.json new file mode 100644 index 00000000..e2d14c2e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW2_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "a096664bd67cadd2a0e5c3ed9d3485eadaadda13f81598cc2c0ea19dfaea69f9", + "qualification.json": "30ab26b0884f4670a934204e869a803db4176957e984f5405334afedef0a40c5", + "specs.json": "c3324a6c4383eb9414ab4ab0027680e410d5169701512de88929a9433f5b5afe", + "target.spice": "6aba3988cd1c0b5d5744e310b69c38698ada17cba64c1379ce50ff3e12ec8e63", + "target_lvs.spice": "85c538516bc0b8c37c549ddbf0be9f03fc1158aec3953c162774337f96bab94a", + "testbench.spice": "9568e2faa4b64c93704dee97ea8a711f2c83db0f54a005a2a73c5273a93cc35e" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW2_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW2_sL1/qualification.json new file mode 100644 index 00000000..05bb4796 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW2_sL1/qualification.json @@ -0,0 +1,158 @@ +{ + "case_id": "C09_ihp130_sW2_sL1", + "circuit_id": "C09", + "pdk": "ihp130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "ota", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 16.0, + "l": 0.26, + "nf": 32, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 16.0, + "l": 0.26, + "nf": 32, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 16.0, + "l": 0.26, + "nf": 32, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 16.0, + "l": 0.26, + "nf": 32, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.26, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.26, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.26, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.26, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "c11cce1d9fae50fc", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 46.0 + }, + "ugf": { + "min": 19340000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 49.00288, + "ugf": 32225140.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 20.3, + "schematic_measures": { + "vout0": 0.5399999, + "idd": 2e-05, + "vos": -0.000623098, + "gain_lf": 49.00288, + "ph_lf": 0.2096117, + "ugf": 32225140.0, + "ph_ugf": -99.42526, + "f3db": 116519.7, + "pm": 80.36512830000001 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW2_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW2_sL1/specs.json new file mode 100644 index 00000000..96c6dd2d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW2_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 46.0 + }, + "ugf": { + "min": 19340000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 49.00288, + "ugf": 32225140.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW2_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW2_sL1/target.spice new file mode 100644 index 00000000..75db7f7b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW2_sL1/target.spice @@ -0,0 +1,10 @@ +.subckt C09_ihp130_sW2_sL1 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 +XM1 net018 VIN1 IB1 VSS sg13_lv_nmos w=16u l=0.26u ng=32 m=1 +XM2 net016 VIN2 IB1 VSS sg13_lv_nmos w=16u l=0.26u ng=32 m=1 +XM3 net04 VB1 net018 VSS sg13_lv_nmos w=16u l=0.26u ng=32 m=1 +XM4 VOUT1 VB1 net016 VSS sg13_lv_nmos w=16u l=0.26u ng=32 m=1 +XM5 net04 net04 net019 VDD sg13_lv_pmos w=32u l=0.26u ng=64 m=1 +XM6 VOUT1 net04 net017 VDD sg13_lv_pmos w=32u l=0.26u ng=64 m=1 +XM7 net019 net019 VDD VDD sg13_lv_pmos w=32u l=0.26u ng=64 m=1 +XM8 net017 net019 VDD VDD sg13_lv_pmos w=32u l=0.26u ng=64 m=1 +.ends C09_ihp130_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW2_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW2_sL1/target_lvs.spice new file mode 100644 index 00000000..ce17e3b1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW2_sL1/target_lvs.spice @@ -0,0 +1,386 @@ +.subckt C09_ihp130_sW2_sL1 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 +XM1_f0 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f1 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f2 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f3 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f4 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f5 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f6 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f7 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f8 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f9 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f10 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f11 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f12 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f13 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f14 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f15 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f16 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f17 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f18 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f19 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f20 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f21 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f22 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f23 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f24 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f25 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f26 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f27 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f28 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f29 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f30 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f31 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f0 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f1 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f2 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f3 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f4 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f5 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f6 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f7 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f8 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f9 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f10 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f11 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f12 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f13 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f14 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f15 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f16 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f17 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f18 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f19 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f20 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f21 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f22 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f23 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f24 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f25 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f26 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f27 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f28 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f29 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f30 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f31 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f0 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f1 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f2 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f3 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f4 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f5 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f6 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f7 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f8 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f9 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f10 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f11 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f12 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f13 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f14 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f15 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f16 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f17 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f18 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f19 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f20 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f21 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f22 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f23 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f24 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f25 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f26 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f27 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f28 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f29 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f30 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f31 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f0 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f1 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f2 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f3 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f4 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f5 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f6 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f7 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f8 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f9 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f10 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f11 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f12 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f13 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f14 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f15 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f16 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f17 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f18 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f19 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f20 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f21 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f22 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f23 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f24 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f25 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f26 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f27 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f28 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f29 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f30 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f31 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f0 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f1 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f2 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f3 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f4 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f5 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f6 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f7 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f8 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f9 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f10 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f11 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f12 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f13 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f14 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f15 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f16 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f17 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f18 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f19 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f20 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f21 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f22 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f23 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f24 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f25 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f26 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f27 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f28 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f29 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f30 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f31 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f32 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f33 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f34 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f35 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f36 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f37 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f38 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f39 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f40 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f41 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f42 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f43 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f44 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f45 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f46 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f47 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f48 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f49 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f50 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f51 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f52 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f53 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f54 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f55 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f56 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f57 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f58 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f59 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f60 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f61 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f62 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f63 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f0 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f1 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f2 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f3 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f4 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f5 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f6 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f7 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f8 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f9 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f10 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f11 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f12 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f13 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f14 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f15 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f16 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f17 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f18 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f19 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f20 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f21 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f22 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f23 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f24 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f25 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f26 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f27 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f28 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f29 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f30 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f31 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f32 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f33 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f34 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f35 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f36 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f37 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f38 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f39 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f40 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f41 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f42 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f43 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f44 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f45 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f46 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f47 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f48 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f49 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f50 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f51 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f52 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f53 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f54 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f55 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f56 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f57 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f58 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f59 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f60 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f61 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f62 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f63 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f0 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f1 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f2 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f3 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f4 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f5 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f6 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f7 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f8 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f9 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f10 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f11 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f12 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f13 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f14 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f15 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f16 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f17 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f18 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f19 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f20 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f21 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f22 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f23 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f24 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f25 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f26 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f27 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f28 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f29 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f30 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f31 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f32 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f33 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f34 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f35 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f36 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f37 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f38 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f39 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f40 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f41 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f42 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f43 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f44 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f45 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f46 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f47 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f48 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f49 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f50 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f51 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f52 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f53 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f54 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f55 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f56 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f57 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f58 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f59 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f60 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f61 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f62 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f63 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f0 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f1 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f2 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f3 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f4 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f5 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f6 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f7 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f8 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f9 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f10 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f11 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f12 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f13 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f14 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f15 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f16 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f17 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f18 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f19 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f20 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f21 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f22 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f23 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f24 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f25 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f26 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f27 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f28 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f29 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f30 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f31 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f32 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f33 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f34 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f35 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f36 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f37 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f38 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f39 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f40 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f41 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f42 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f43 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f44 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f45 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f46 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f47 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f48 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f49 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f50 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f51 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f52 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f53 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f54 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f55 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f56 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f57 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f58 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f59 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f60 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f61 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f62 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f63 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +.ends C09_ihp130_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW2_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW2_sL1/testbench.spice new file mode 100644 index 00000000..7628fb5e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW2_sL1/testbench.spice @@ -0,0 +1,42 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 C09_ihp130_sW2_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIB1 IB1 VSS 2e-05 +.nodeset v(IB1)=0.84 +XB_VB1 VB1 VB1 VSS VSS sg13_lv_nmos w=16u l=0.26u +IB_VB1 VDDB VB1 4e-05 +XB_GS_M3 GS_M3 GS_M3 VSS VSS sg13_lv_nmos w=16u l=0.26u +IB_GS_M3 VDDB GS_M3 1e-05 +XB_GS_M1 GS_M1 GS_M1 VSS VSS sg13_lv_nmos w=16u l=0.26u +IB_GS_M1 VDDB GS_M1 1e-05 +B_VCM VCM 0 V = v(VB1) - v(GS_M3) + v(GS_M1) - 0.1 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 0.54 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN2 VCM VINT 0 1 +EIN VIN1 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN2) - v(VIN1) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW2_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW2_sL2/case.json new file mode 100644 index 00000000..048fae93 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW2_sL2/case.json @@ -0,0 +1,235 @@ +{ + "case_id": "C09_ihp130_sW2_sL2", + "circuit_id": "C09", + "pdk": "ihp130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "dut_name": "C09_ihp130_sW2_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VB1", + "IB1" + ], + "sizing": { + "M1": { + "w": 16.0, + "l": 0.52, + "nf": 32 + }, + "M2": { + "w": 16.0, + "l": 0.52, + "nf": 32 + }, + "M3": { + "w": 16.0, + "l": 0.52, + "nf": 32 + }, + "M4": { + "w": 16.0, + "l": 0.52, + "nf": 32 + }, + "M5": { + "w": 32.0, + "l": 0.52, + "nf": 64 + }, + "M6": { + "w": 32.0, + "l": 0.52, + "nf": 64 + }, + "M7": { + "w": 32.0, + "l": 0.52, + "nf": 64 + }, + "M8": { + "w": 32.0, + "l": 0.52, + "nf": 64 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 1e-05, + "kind": "cascode" + }, + "IB1": { + "i": 2e-05, + "from": "VSS" + } + }, + "load": { + "vcm": { + "expr": "v(VB1) - gs(M3) + gs(M1) - 0.1", + "currents": { + "M3": 1e-05, + "M1": 1e-05 + } + }, + "CL": 1e-12, + "inv_input": "VIN2", + "vout_target": 0.54 + }, + "category": "ota", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 16.0, + "l": 0.52, + "nf": 32, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 16.0, + "l": 0.52, + "nf": 32, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 16.0, + "l": 0.52, + "nf": 32, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 16.0, + "l": 0.52, + "nf": 32, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.52, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.52, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.52, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.52, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "59f0815772422d47", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 1e-05, + "variant": "cascode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW2_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW2_sL2/manifest.json new file mode 100644 index 00000000..cca3cc24 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW2_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "43661607a5900a8aca729428242b736593b3167dc6489b2524ca13d303cda0b2", + "qualification.json": "6f3c43418b574e3dd261595e9f7240b4f0fef22686f6559b92f9e576db813a03", + "specs.json": "1e205aea252257f74b2c2b54b11384b1dbdab4f0923a9e03c047ea8732270cfc", + "target.spice": "7a14b472b6c618383e43091234a4d412e632c6baf28b5852f77e4b0f21b536e4", + "target_lvs.spice": "59d73fe13fe96f0035aef5fe1b507b588bc2d632e64295a77c0adfb55c03217a", + "testbench.spice": "1c8a119c84d657ca3677061dd0ae2a3fd86cbcb6a4b67544261ffe7079b5d1e0" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW2_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW2_sL2/qualification.json new file mode 100644 index 00000000..3063b903 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW2_sL2/qualification.json @@ -0,0 +1,158 @@ +{ + "case_id": "C09_ihp130_sW2_sL2", + "circuit_id": "C09", + "pdk": "ihp130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "ota", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 16.0, + "l": 0.52, + "nf": 32, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 16.0, + "l": 0.52, + "nf": 32, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 16.0, + "l": 0.52, + "nf": 32, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 16.0, + "l": 0.52, + "nf": 32, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.52, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.52, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.52, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.52, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "59f0815772422d47", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 48.92 + }, + "ugf": { + "min": 17550000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 51.92119, + "ugf": 29256470.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 18.5, + "schematic_measures": { + "vout0": 0.54, + "idd": 1.999999e-05, + "vos": -0.00049106, + "gain_lf": 51.92119, + "ph_lf": 0.2898429, + "ugf": 29256470.0, + "ph_ugf": -105.043, + "f3db": 78417.83, + "pm": 74.6671571 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW2_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW2_sL2/specs.json new file mode 100644 index 00000000..0ff87d35 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW2_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 48.92 + }, + "ugf": { + "min": 17550000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 51.92119, + "ugf": 29256470.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW2_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW2_sL2/target.spice new file mode 100644 index 00000000..fa04e5fe --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW2_sL2/target.spice @@ -0,0 +1,10 @@ +.subckt C09_ihp130_sW2_sL2 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 +XM1 net018 VIN1 IB1 VSS sg13_lv_nmos w=16u l=0.52u ng=32 m=1 +XM2 net016 VIN2 IB1 VSS sg13_lv_nmos w=16u l=0.52u ng=32 m=1 +XM3 net04 VB1 net018 VSS sg13_lv_nmos w=16u l=0.52u ng=32 m=1 +XM4 VOUT1 VB1 net016 VSS sg13_lv_nmos w=16u l=0.52u ng=32 m=1 +XM5 net04 net04 net019 VDD sg13_lv_pmos w=32u l=0.52u ng=64 m=1 +XM6 VOUT1 net04 net017 VDD sg13_lv_pmos w=32u l=0.52u ng=64 m=1 +XM7 net019 net019 VDD VDD sg13_lv_pmos w=32u l=0.52u ng=64 m=1 +XM8 net017 net019 VDD VDD sg13_lv_pmos w=32u l=0.52u ng=64 m=1 +.ends C09_ihp130_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW2_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW2_sL2/target_lvs.spice new file mode 100644 index 00000000..5d7c2a89 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW2_sL2/target_lvs.spice @@ -0,0 +1,386 @@ +.subckt C09_ihp130_sW2_sL2 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 +XM1_f0 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f1 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f2 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f3 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f4 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f5 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f6 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f7 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f8 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f9 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f10 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f11 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f12 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f13 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f14 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f15 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f16 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f17 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f18 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f19 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f20 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f21 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f22 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f23 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f24 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f25 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f26 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f27 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f28 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f29 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f30 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f31 net018 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f0 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f1 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f2 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f3 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f4 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f5 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f6 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f7 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f8 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f9 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f10 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f11 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f12 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f13 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f14 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f15 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f16 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f17 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f18 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f19 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f20 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f21 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f22 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f23 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f24 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f25 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f26 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f27 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f28 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f29 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f30 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f31 net016 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f0 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f1 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f2 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f3 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f4 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f5 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f6 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f7 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f8 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f9 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f10 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f11 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f12 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f13 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f14 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f15 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f16 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f17 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f18 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f19 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f20 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f21 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f22 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f23 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f24 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f25 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f26 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f27 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f28 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f29 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f30 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f31 net04 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f0 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f1 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f2 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f3 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f4 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f5 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f6 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f7 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f8 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f9 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f10 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f11 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f12 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f13 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f14 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f15 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f16 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f17 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f18 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f19 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f20 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f21 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f22 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f23 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f24 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f25 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f26 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f27 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f28 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f29 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f30 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f31 VOUT1 VB1 net016 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f0 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f1 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f2 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f3 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f4 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f5 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f6 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f7 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f8 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f9 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f10 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f11 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f12 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f13 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f14 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f15 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f16 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f17 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f18 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f19 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f20 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f21 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f22 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f23 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f24 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f25 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f26 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f27 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f28 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f29 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f30 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f31 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f32 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f33 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f34 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f35 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f36 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f37 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f38 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f39 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f40 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f41 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f42 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f43 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f44 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f45 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f46 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f47 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f48 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f49 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f50 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f51 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f52 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f53 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f54 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f55 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f56 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f57 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f58 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f59 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f60 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f61 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f62 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f63 net04 net04 net019 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f0 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f1 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f2 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f3 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f4 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f5 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f6 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f7 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f8 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f9 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f10 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f11 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f12 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f13 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f14 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f15 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f16 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f17 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f18 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f19 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f20 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f21 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f22 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f23 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f24 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f25 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f26 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f27 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f28 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f29 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f30 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f31 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f32 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f33 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f34 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f35 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f36 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f37 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f38 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f39 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f40 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f41 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f42 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f43 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f44 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f45 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f46 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f47 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f48 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f49 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f50 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f51 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f52 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f53 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f54 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f55 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f56 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f57 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f58 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f59 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f60 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f61 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f62 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f63 VOUT1 net04 net017 VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f0 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f1 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f2 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f3 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f4 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f5 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f6 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f7 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f8 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f9 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f10 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f11 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f12 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f13 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f14 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f15 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f16 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f17 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f18 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f19 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f20 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f21 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f22 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f23 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f24 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f25 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f26 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f27 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f28 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f29 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f30 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f31 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f32 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f33 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f34 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f35 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f36 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f37 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f38 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f39 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f40 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f41 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f42 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f43 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f44 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f45 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f46 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f47 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f48 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f49 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f50 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f51 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f52 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f53 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f54 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f55 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f56 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f57 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f58 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f59 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f60 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f61 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f62 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f63 net019 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f0 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f1 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f2 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f3 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f4 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f5 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f6 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f7 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f8 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f9 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f10 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f11 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f12 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f13 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f14 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f15 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f16 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f17 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f18 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f19 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f20 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f21 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f22 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f23 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f24 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f25 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f26 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f27 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f28 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f29 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f30 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f31 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f32 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f33 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f34 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f35 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f36 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f37 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f38 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f39 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f40 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f41 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f42 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f43 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f44 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f45 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f46 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f47 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f48 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f49 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f50 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f51 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f52 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f53 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f54 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f55 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f56 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f57 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f58 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f59 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f60 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f61 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f62 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f63 net017 net019 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +.ends C09_ihp130_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW2_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW2_sL2/testbench.spice new file mode 100644 index 00000000..901410a4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/ihp130/sW2_sL2/testbench.spice @@ -0,0 +1,42 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 C09_ihp130_sW2_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIB1 IB1 VSS 2e-05 +.nodeset v(IB1)=0.84 +XB_VB1 VB1 VB1 VSS VSS sg13_lv_nmos w=16u l=0.52u +IB_VB1 VDDB VB1 4e-05 +XB_GS_M3 GS_M3 GS_M3 VSS VSS sg13_lv_nmos w=16u l=0.52u +IB_GS_M3 VDDB GS_M3 1e-05 +XB_GS_M1 GS_M1 GS_M1 VSS VSS sg13_lv_nmos w=16u l=0.52u +IB_GS_M1 VDDB GS_M1 1e-05 +B_VCM VCM 0 V = v(VB1) - v(GS_M3) + v(GS_M1) - 0.1 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 0.54 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN2 VCM VINT 0 1 +EIN VIN1 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN2) - v(VIN1) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C09/sky130/sW0.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW0.5_sL1.5/case.json new file mode 100644 index 00000000..2f746174 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW0.5_sL1.5/case.json @@ -0,0 +1,235 @@ +{ + "case_id": "C09_sky130_sW0.5_sL1.5", + "circuit_id": "C09", + "pdk": "sky130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "dut_name": "C09_sky130_sW0.5_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VB1", + "IB1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.45, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 0.45, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 0.45, + "nf": 8 + }, + "M4": { + "w": 4.0, + "l": 0.45, + "nf": 8 + }, + "M5": { + "w": 8.0, + "l": 0.45, + "nf": 16 + }, + "M6": { + "w": 8.0, + "l": 0.45, + "nf": 16 + }, + "M7": { + "w": 8.0, + "l": 0.45, + "nf": 16 + }, + "M8": { + "w": 8.0, + "l": 0.45, + "nf": 16 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 1e-05, + "kind": "cascode" + }, + "IB1": { + "i": 2e-05, + "from": "VSS" + } + }, + "load": { + "vcm": { + "expr": "v(VB1) - gs(M3) + gs(M1) - 0.1", + "currents": { + "M3": 1e-05, + "M1": 1e-05 + } + }, + "CL": 1e-12, + "inv_input": "VIN2", + "vout_target": 0.81 + }, + "category": "ota", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "19df375125cff68f", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 1e-05, + "variant": "cascode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/sky130/sW0.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW0.5_sL1.5/manifest.json new file mode 100644 index 00000000..8188e76b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW0.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "f9db1ab256d3d6636c0ac68edff01e7f7301904ef1f4be3b5d4f85b4183f0c80", + "qualification.json": "2c25e7df214b21831a9c6860768d6195a4b04d82bf2f68057af7e39facb1d453", + "specs.json": "086000ac4ff7bc7dc03ae3b048940144fc3017dafd9b9fc5efd16e9ee6ae558a", + "target.spice": "65526aefa6c81acce4c93bfdc6f0478436d8dbb0b39c6ba753718422bd24806e", + "target_lvs.spice": "687908f9136ccd2a153c44876a1fb3d3e1b041aa4309509cef54765cccc3574b", + "testbench.spice": "11aa7588a6639c0b55ac516cc9cc462b05d4e9fa18f0f6b990be43de606aa0bc" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/sky130/sW0.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW0.5_sL1.5/qualification.json new file mode 100644 index 00000000..7a966f5d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW0.5_sL1.5/qualification.json @@ -0,0 +1,161 @@ +{ + "case_id": "C09_sky130_sW0.5_sL1.5", + "circuit_id": "C09", + "pdk": "sky130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "ota", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "19df375125cff68f", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "gain_lf=8.451 below floor 35", + "ugf=2.38e+05 below floor 2e+06" + ], + "spec": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 8.450714, + "ugf": 237980.3 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 9.8, + "schematic_measures": { + "vout0": 0.8099353, + "idd": 1.998931e-05, + "vos": -0.430166, + "gain_lf": 8.450714, + "ph_lf": -0.03354311, + "ugf": 237980.3, + "ph_ugf": -67.36812, + "f3db": 96809.53, + "pm": 112.66542310999999 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/sky130/sW0.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW0.5_sL1.5/specs.json new file mode 100644 index 00000000..4cb576ae --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW0.5_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 8.450714, + "ugf": 237980.3 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/sky130/sW0.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW0.5_sL1.5/target.spice new file mode 100644 index 00000000..ed54f716 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW0.5_sL1.5/target.spice @@ -0,0 +1,10 @@ +.subckt C09_sky130_sW0.5_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 +XM1 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=4 l=0.45 nf=8 +XM2 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=4 l=0.45 nf=8 +XM3 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=4 l=0.45 nf=8 +XM4 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=4 l=0.45 nf=8 +XM5 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=8 l=0.45 nf=16 +XM6 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=8 l=0.45 nf=16 +XM7 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=8 l=0.45 nf=16 +XM8 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=8 l=0.45 nf=16 +.ends C09_sky130_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C09/sky130/sW0.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW0.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..ca6e949b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW0.5_sL1.5/target_lvs.spice @@ -0,0 +1,98 @@ +.subckt C09_sky130_sW0.5_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 +XM1_f0 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f1 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f2 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f3 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f4 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f5 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f6 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f7 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f0 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f1 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f2 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f3 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f4 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f5 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f6 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f7 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f0 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f1 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f2 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f3 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f4 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f5 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f6 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f7 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f0 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f1 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f2 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f3 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f4 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f5 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f6 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f7 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f0 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f1 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f2 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f3 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f4 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f5 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f6 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f7 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f8 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f9 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f10 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f11 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f12 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f13 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f14 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f15 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f0 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f1 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f2 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f3 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f4 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f5 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f6 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f7 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f8 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f9 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f10 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f11 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f12 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f13 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f14 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f15 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f0 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f1 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f2 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f3 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f4 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f5 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f6 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f7 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f8 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f9 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f10 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f11 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f12 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f13 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f14 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f15 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f0 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f1 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f2 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f3 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f4 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f5 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f6 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f7 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f8 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f9 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f10 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f11 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f12 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f13 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f14 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f15 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +.ends C09_sky130_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C09/sky130/sW0.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW0.5_sL1.5/testbench.spice new file mode 100644 index 00000000..d0bc92d3 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW0.5_sL1.5/testbench.spice @@ -0,0 +1,42 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 C09_sky130_sW0.5_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIB1 IB1 VSS 2e-05 +.nodeset v(IB1)=1.26 +XB_VB1 VB1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=4 l=0.45 +IB_VB1 VDDB VB1 4e-05 +XB_GS_M3 GS_M3 GS_M3 VSS VSS sky130_fd_pr__nfet_01v8 w=4 l=0.45 +IB_GS_M3 VDDB GS_M3 1e-05 +XB_GS_M1 GS_M1 GS_M1 VSS VSS sky130_fd_pr__nfet_01v8 w=4 l=0.45 +IB_GS_M1 VDDB GS_M1 1e-05 +B_VCM VCM 0 V = v(VB1) - v(GS_M3) + v(GS_M1) - 0.1 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 0.81 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN2 VCM VINT 0 1 +EIN VIN1 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN2) - v(VIN1) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C09/sky130/sW0.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW0.5_sL1/case.json new file mode 100644 index 00000000..b2f33023 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW0.5_sL1/case.json @@ -0,0 +1,235 @@ +{ + "case_id": "C09_sky130_sW0.5_sL1", + "circuit_id": "C09", + "pdk": "sky130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "dut_name": "C09_sky130_sW0.5_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VB1", + "IB1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.3, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 0.3, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 0.3, + "nf": 8 + }, + "M4": { + "w": 4.0, + "l": 0.3, + "nf": 8 + }, + "M5": { + "w": 8.0, + "l": 0.3, + "nf": 16 + }, + "M6": { + "w": 8.0, + "l": 0.3, + "nf": 16 + }, + "M7": { + "w": 8.0, + "l": 0.3, + "nf": 16 + }, + "M8": { + "w": 8.0, + "l": 0.3, + "nf": 16 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 1e-05, + "kind": "cascode" + }, + "IB1": { + "i": 2e-05, + "from": "VSS" + } + }, + "load": { + "vcm": { + "expr": "v(VB1) - gs(M3) + gs(M1) - 0.1", + "currents": { + "M3": 1e-05, + "M1": 1e-05 + } + }, + "CL": 1e-12, + "inv_input": "VIN2", + "vout_target": 0.81 + }, + "category": "ota", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "c5f1c2be5c408f29", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 1e-05, + "variant": "cascode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/sky130/sW0.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW0.5_sL1/manifest.json new file mode 100644 index 00000000..b4592ade --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW0.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "cd5ebfababe985f261225af868ca04dcd1bd4470efac2c30d21febf56764eed4", + "qualification.json": "bbd43b21c6e9a1dc57fd948c5612bcd152e9cc4dd039b042e2dc6fe985f08667", + "specs.json": "29cb5acc3d1db9e997ab9bece8903fa63a37100b3fb7913c5ebe03d28bc75cc2", + "target.spice": "6bcccc2f9c4a19258fbfdbc01d6c6670174a306c9c8295dc8a09ffffe35baf71", + "target_lvs.spice": "e993cf2728c93e89d205db0cb5a2bbb983daa44b15599c825763ddd7df049e07", + "testbench.spice": "1ac994d009d358a73db17b19433cef3e48786caa7341fa2f9d5d0b457f1599f5" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/sky130/sW0.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW0.5_sL1/qualification.json new file mode 100644 index 00000000..3e889312 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW0.5_sL1/qualification.json @@ -0,0 +1,161 @@ +{ + "case_id": "C09_sky130_sW0.5_sL1", + "circuit_id": "C09", + "pdk": "sky130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "ota", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "c5f1c2be5c408f29", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "gain_lf=22.39 below floor 35", + "ugf=8.161e+05 below floor 2e+06" + ], + "spec": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 22.38777, + "ugf": 816125.7 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 9.6, + "schematic_measures": { + "vout0": 0.8099784, + "idd": 1.999994e-05, + "vos": -0.203514, + "gain_lf": 22.38777, + "ph_lf": 0.04722269, + "ugf": 816125.7, + "ph_ugf": -85.36469, + "f3db": 61954.29, + "pm": 94.58808731 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/sky130/sW0.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW0.5_sL1/specs.json new file mode 100644 index 00000000..a81d0822 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW0.5_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 22.38777, + "ugf": 816125.7 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/sky130/sW0.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW0.5_sL1/target.spice new file mode 100644 index 00000000..945bf1c5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW0.5_sL1/target.spice @@ -0,0 +1,10 @@ +.subckt C09_sky130_sW0.5_sL1 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 +XM1 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=4 l=0.3 nf=8 +XM2 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=4 l=0.3 nf=8 +XM3 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=4 l=0.3 nf=8 +XM4 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=4 l=0.3 nf=8 +XM5 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=8 l=0.3 nf=16 +XM6 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=8 l=0.3 nf=16 +XM7 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=8 l=0.3 nf=16 +XM8 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=8 l=0.3 nf=16 +.ends C09_sky130_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C09/sky130/sW0.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW0.5_sL1/target_lvs.spice new file mode 100644 index 00000000..b6c0601e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW0.5_sL1/target_lvs.spice @@ -0,0 +1,98 @@ +.subckt C09_sky130_sW0.5_sL1 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 +XM1_f0 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f1 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f2 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f3 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f4 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f5 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f6 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f7 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f0 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f1 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f2 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f3 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f4 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f5 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f6 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f7 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f0 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f1 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f2 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f3 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f4 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f5 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f6 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f7 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f0 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f1 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f2 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f3 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f4 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f5 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f6 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f7 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f0 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f1 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f2 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f3 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f4 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f5 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f6 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f7 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f8 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f9 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f10 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f11 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f12 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f13 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f14 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f15 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f0 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f1 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f2 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f3 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f4 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f5 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f6 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f7 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f8 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f9 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f10 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f11 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f12 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f13 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f14 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f15 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f0 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f1 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f2 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f3 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f4 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f5 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f6 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f7 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f8 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f9 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f10 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f11 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f12 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f13 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f14 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f15 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f0 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f1 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f2 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f3 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f4 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f5 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f6 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f7 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f8 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f9 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f10 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f11 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f12 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f13 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f14 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f15 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +.ends C09_sky130_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C09/sky130/sW0.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW0.5_sL1/testbench.spice new file mode 100644 index 00000000..3162929a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW0.5_sL1/testbench.spice @@ -0,0 +1,42 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 C09_sky130_sW0.5_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIB1 IB1 VSS 2e-05 +.nodeset v(IB1)=1.26 +XB_VB1 VB1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=4 l=0.3 +IB_VB1 VDDB VB1 4e-05 +XB_GS_M3 GS_M3 GS_M3 VSS VSS sky130_fd_pr__nfet_01v8 w=4 l=0.3 +IB_GS_M3 VDDB GS_M3 1e-05 +XB_GS_M1 GS_M1 GS_M1 VSS VSS sky130_fd_pr__nfet_01v8 w=4 l=0.3 +IB_GS_M1 VDDB GS_M1 1e-05 +B_VCM VCM 0 V = v(VB1) - v(GS_M3) + v(GS_M1) - 0.1 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 0.81 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN2 VCM VINT 0 1 +EIN VIN1 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN2) - v(VIN1) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C09/sky130/sW0.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW0.5_sL2/case.json new file mode 100644 index 00000000..0f8f4b87 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW0.5_sL2/case.json @@ -0,0 +1,235 @@ +{ + "case_id": "C09_sky130_sW0.5_sL2", + "circuit_id": "C09", + "pdk": "sky130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "dut_name": "C09_sky130_sW0.5_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VB1", + "IB1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.6, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 0.6, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 0.6, + "nf": 8 + }, + "M4": { + "w": 4.0, + "l": 0.6, + "nf": 8 + }, + "M5": { + "w": 8.0, + "l": 0.6, + "nf": 16 + }, + "M6": { + "w": 8.0, + "l": 0.6, + "nf": 16 + }, + "M7": { + "w": 8.0, + "l": 0.6, + "nf": 16 + }, + "M8": { + "w": 8.0, + "l": 0.6, + "nf": 16 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 1e-05, + "kind": "cascode" + }, + "IB1": { + "i": 2e-05, + "from": "VSS" + } + }, + "load": { + "vcm": { + "expr": "v(VB1) - gs(M3) + gs(M1) - 0.1", + "currents": { + "M3": 1e-05, + "M1": 1e-05 + } + }, + "CL": 1e-12, + "inv_input": "VIN2", + "vout_target": 0.81 + }, + "category": "ota", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "ccb734ca7f830377", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 1e-05, + "variant": "cascode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/sky130/sW0.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW0.5_sL2/manifest.json new file mode 100644 index 00000000..d2e67d91 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW0.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "29e812a909a4320259d8b9631afdbf00d4efae0a4b940864a9eb6cc0bf8c15c9", + "qualification.json": "1929263713cdec845b975dfcbc5604a6f24671d2cd8f0245b78127fa20961b45", + "specs.json": "a133de319dd86ae7abe6bafe7d96c6a46813ce623331e279757e519935574550", + "target.spice": "f98079b3d139157a4f309b08e514345b9ea838eb197e6cab1f5b9955dd5a7853", + "target_lvs.spice": "002c3e2b094fe0518b726a17cb2a4b4c104cd7bda5da8e1467b4cfc50485b1da", + "testbench.spice": "2892e81ff292b17a57c380385b979e74e1bdaeccc61a9f377991778ee0295e24" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/sky130/sW0.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW0.5_sL2/qualification.json new file mode 100644 index 00000000..770aa2f0 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW0.5_sL2/qualification.json @@ -0,0 +1,156 @@ +{ + "case_id": "C09_sky130_sW0.5_sL2", + "circuit_id": "C09", + "pdk": "sky130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "ota", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "ccb734ca7f830377", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "servo did not reach the output target: vout0=-0.378581 target=0.81 (tol 0.036 V)", + "gain_lf=-32.29 below floor 35", + "ugf: not measurable in the schematic" + ], + "spec": { + "gain_lf": { + "min": 35.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": -32.28633, + "ugf": null + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 8.8, + "schematic_measures": { + "vout0": -0.378581, + "idd": 1.979847e-05, + "vos": -0.5, + "gain_lf": -32.28633, + "ph_lf": -0.0004297137, + "f3db": 9692172.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/sky130/sW0.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW0.5_sL2/specs.json new file mode 100644 index 00000000..86f8ed04 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW0.5_sL2/specs.json @@ -0,0 +1,20 @@ +{ + "gain_lf": { + "min": 35.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": -32.28633, + "ugf": null + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/sky130/sW0.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW0.5_sL2/target.spice new file mode 100644 index 00000000..b12984f3 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW0.5_sL2/target.spice @@ -0,0 +1,10 @@ +.subckt C09_sky130_sW0.5_sL2 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 +XM1 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=4 l=0.6 nf=8 +XM2 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=4 l=0.6 nf=8 +XM3 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=4 l=0.6 nf=8 +XM4 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=4 l=0.6 nf=8 +XM5 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=8 l=0.6 nf=16 +XM6 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=8 l=0.6 nf=16 +XM7 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=8 l=0.6 nf=16 +XM8 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=8 l=0.6 nf=16 +.ends C09_sky130_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C09/sky130/sW0.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW0.5_sL2/target_lvs.spice new file mode 100644 index 00000000..3d35d2f6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW0.5_sL2/target_lvs.spice @@ -0,0 +1,98 @@ +.subckt C09_sky130_sW0.5_sL2 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 +XM1_f0 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f1 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f2 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f3 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f4 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f5 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f6 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f7 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f0 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f1 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f2 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f3 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f4 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f5 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f6 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f7 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f0 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f1 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f2 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f3 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f4 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f5 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f6 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f7 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f0 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f1 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f2 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f3 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f4 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f5 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f6 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f7 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f0 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f1 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f2 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f3 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f4 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f5 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f6 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f7 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f8 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f9 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f10 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f11 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f12 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f13 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f14 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f15 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f0 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f1 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f2 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f3 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f4 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f5 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f6 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f7 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f8 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f9 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f10 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f11 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f12 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f13 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f14 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f15 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f0 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f1 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f2 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f3 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f4 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f5 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f6 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f7 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f8 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f9 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f10 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f11 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f12 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f13 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f14 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f15 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f0 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f1 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f2 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f3 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f4 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f5 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f6 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f7 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f8 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f9 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f10 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f11 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f12 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f13 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f14 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f15 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +.ends C09_sky130_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C09/sky130/sW0.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW0.5_sL2/testbench.spice new file mode 100644 index 00000000..4bc0e273 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW0.5_sL2/testbench.spice @@ -0,0 +1,42 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 C09_sky130_sW0.5_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIB1 IB1 VSS 2e-05 +.nodeset v(IB1)=1.26 +XB_VB1 VB1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=4 l=0.6 +IB_VB1 VDDB VB1 4e-05 +XB_GS_M3 GS_M3 GS_M3 VSS VSS sky130_fd_pr__nfet_01v8 w=4 l=0.6 +IB_GS_M3 VDDB GS_M3 1e-05 +XB_GS_M1 GS_M1 GS_M1 VSS VSS sky130_fd_pr__nfet_01v8 w=4 l=0.6 +IB_GS_M1 VDDB GS_M1 1e-05 +B_VCM VCM 0 V = v(VB1) - v(GS_M3) + v(GS_M1) - 0.1 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 0.81 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN2 VCM VINT 0 1 +EIN VIN1 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN2) - v(VIN1) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1.5_sL1.5/case.json new file mode 100644 index 00000000..de7ade94 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1.5_sL1.5/case.json @@ -0,0 +1,235 @@ +{ + "case_id": "C09_sky130_sW1.5_sL1.5", + "circuit_id": "C09", + "pdk": "sky130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "dut_name": "C09_sky130_sW1.5_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VB1", + "IB1" + ], + "sizing": { + "M1": { + "w": 12.0, + "l": 0.45, + "nf": 24 + }, + "M2": { + "w": 12.0, + "l": 0.45, + "nf": 24 + }, + "M3": { + "w": 12.0, + "l": 0.45, + "nf": 24 + }, + "M4": { + "w": 12.0, + "l": 0.45, + "nf": 24 + }, + "M5": { + "w": 24.0, + "l": 0.45, + "nf": 48 + }, + "M6": { + "w": 24.0, + "l": 0.45, + "nf": 48 + }, + "M7": { + "w": 24.0, + "l": 0.45, + "nf": 48 + }, + "M8": { + "w": 24.0, + "l": 0.45, + "nf": 48 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 1e-05, + "kind": "cascode" + }, + "IB1": { + "i": 2e-05, + "from": "VSS" + } + }, + "load": { + "vcm": { + "expr": "v(VB1) - gs(M3) + gs(M1) - 0.1", + "currents": { + "M3": 1e-05, + "M1": 1e-05 + } + }, + "CL": 1e-12, + "inv_input": "VIN2", + "vout_target": 0.81 + }, + "category": "ota", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 12.0, + "l": 0.45, + "nf": 24, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 12.0, + "l": 0.45, + "nf": 24, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 12.0, + "l": 0.45, + "nf": 24, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 12.0, + "l": 0.45, + "nf": 24, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.45, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.45, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.45, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.45, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "bdc2f7fa87756349", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 1e-05, + "variant": "cascode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1.5_sL1.5/manifest.json new file mode 100644 index 00000000..61771804 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "d4117e10e6c151e8e4b6610b822002a8b02ceaf3051c67c989207c3affe3bdbb", + "qualification.json": "9bae3cd587ebd88864293793bd317813f51aaa6aba2ef31444955120a61edb4c", + "specs.json": "d7cfb24e4a5c5077976d3903581045d0e673f4bc959506e326c14f581824a069", + "target.spice": "faf33c2b16fcc0d47c7a29fd0549ffda67895be2fb61ea11a0f512187f2eeec9", + "target_lvs.spice": "4aeeb4ac9a1135d1c2bd56cf9955817d17a32e1fdc8db0d7e8bc0072015a99a7", + "testbench.spice": "d95fc129323276f468deb012db81a39be7a155ae3e59afd3c218d7aaa109e233" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1.5_sL1.5/qualification.json new file mode 100644 index 00000000..f8fa88d2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1.5_sL1.5/qualification.json @@ -0,0 +1,161 @@ +{ + "case_id": "C09_sky130_sW1.5_sL1.5", + "circuit_id": "C09", + "pdk": "sky130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "ota", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 12.0, + "l": 0.45, + "nf": 24, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 12.0, + "l": 0.45, + "nf": 24, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 12.0, + "l": 0.45, + "nf": 24, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 12.0, + "l": 0.45, + "nf": 24, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.45, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.45, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.45, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.45, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "bdc2f7fa87756349", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "gain_lf=32.13 below floor 35", + "ugf=8.883e+05 below floor 2e+06" + ], + "spec": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 32.1333, + "ugf": 888255.2 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 15.1, + "schematic_measures": { + "vout0": 0.8099819, + "idd": 1.99998e-05, + "vos": -0.173456, + "gain_lf": 32.1333, + "ph_lf": 0.2317307, + "ugf": 888255.2, + "ph_ugf": -87.46472, + "f3db": 21917.11, + "pm": 92.3035493 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1.5_sL1.5/specs.json new file mode 100644 index 00000000..b316f236 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1.5_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 32.1333, + "ugf": 888255.2 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1.5_sL1.5/target.spice new file mode 100644 index 00000000..f9876c9b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1.5_sL1.5/target.spice @@ -0,0 +1,10 @@ +.subckt C09_sky130_sW1.5_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 +XM1 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=12 l=0.45 nf=24 +XM2 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=12 l=0.45 nf=24 +XM3 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=12 l=0.45 nf=24 +XM4 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=12 l=0.45 nf=24 +XM5 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=24 l=0.45 nf=48 +XM6 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=24 l=0.45 nf=48 +XM7 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=24 l=0.45 nf=48 +XM8 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=24 l=0.45 nf=48 +.ends C09_sky130_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..b72bb2df --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1.5_sL1.5/target_lvs.spice @@ -0,0 +1,290 @@ +.subckt C09_sky130_sW1.5_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 +XM1_f0 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f1 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f2 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f3 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f4 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f5 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f6 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f7 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f8 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f9 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f10 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f11 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f12 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f13 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f14 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f15 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f16 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f17 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f18 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f19 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f20 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f21 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f22 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f23 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f0 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f1 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f2 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f3 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f4 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f5 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f6 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f7 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f8 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f9 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f10 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f11 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f12 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f13 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f14 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f15 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f16 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f17 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f18 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f19 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f20 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f21 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f22 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f23 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f0 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f1 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f2 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f3 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f4 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f5 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f6 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f7 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f8 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f9 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f10 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f11 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f12 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f13 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f14 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f15 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f16 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f17 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f18 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f19 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f20 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f21 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f22 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f23 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f0 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f1 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f2 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f3 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f4 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f5 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f6 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f7 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f8 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f9 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f10 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f11 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f12 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f13 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f14 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f15 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f16 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f17 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f18 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f19 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f20 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f21 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f22 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f23 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f0 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f1 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f2 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f3 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f4 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f5 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f6 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f7 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f8 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f9 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f10 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f11 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f12 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f13 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f14 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f15 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f16 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f17 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f18 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f19 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f20 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f21 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f22 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f23 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f24 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f25 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f26 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f27 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f28 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f29 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f30 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f31 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f32 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f33 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f34 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f35 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f36 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f37 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f38 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f39 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f40 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f41 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f42 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f43 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f44 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f45 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f46 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f47 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f0 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f1 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f2 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f3 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f4 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f5 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f6 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f7 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f8 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f9 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f10 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f11 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f12 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f13 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f14 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f15 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f16 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f17 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f18 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f19 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f20 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f21 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f22 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f23 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f24 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f25 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f26 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f27 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f28 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f29 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f30 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f31 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f32 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f33 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f34 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f35 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f36 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f37 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f38 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f39 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f40 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f41 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f42 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f43 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f44 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f45 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f46 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f47 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f0 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f1 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f2 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f3 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f4 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f5 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f6 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f7 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f8 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f9 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f10 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f11 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f12 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f13 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f14 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f15 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f16 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f17 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f18 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f19 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f20 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f21 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f22 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f23 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f24 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f25 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f26 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f27 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f28 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f29 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f30 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f31 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f32 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f33 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f34 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f35 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f36 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f37 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f38 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f39 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f40 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f41 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f42 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f43 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f44 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f45 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f46 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f47 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f0 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f1 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f2 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f3 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f4 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f5 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f6 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f7 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f8 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f9 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f10 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f11 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f12 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f13 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f14 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f15 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f16 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f17 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f18 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f19 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f20 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f21 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f22 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f23 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f24 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f25 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f26 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f27 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f28 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f29 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f30 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f31 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f32 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f33 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f34 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f35 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f36 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f37 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f38 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f39 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f40 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f41 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f42 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f43 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f44 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f45 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f46 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f47 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +.ends C09_sky130_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1.5_sL1.5/testbench.spice new file mode 100644 index 00000000..5f2b6608 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1.5_sL1.5/testbench.spice @@ -0,0 +1,42 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 C09_sky130_sW1.5_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIB1 IB1 VSS 2e-05 +.nodeset v(IB1)=1.26 +XB_VB1 VB1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=12 l=0.45 +IB_VB1 VDDB VB1 4e-05 +XB_GS_M3 GS_M3 GS_M3 VSS VSS sky130_fd_pr__nfet_01v8 w=12 l=0.45 +IB_GS_M3 VDDB GS_M3 1e-05 +XB_GS_M1 GS_M1 GS_M1 VSS VSS sky130_fd_pr__nfet_01v8 w=12 l=0.45 +IB_GS_M1 VDDB GS_M1 1e-05 +B_VCM VCM 0 V = v(VB1) - v(GS_M3) + v(GS_M1) - 0.1 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 0.81 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN2 VCM VINT 0 1 +EIN VIN1 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN2) - v(VIN1) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1.5_sL1/case.json new file mode 100644 index 00000000..ab98842b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1.5_sL1/case.json @@ -0,0 +1,235 @@ +{ + "case_id": "C09_sky130_sW1.5_sL1", + "circuit_id": "C09", + "pdk": "sky130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "dut_name": "C09_sky130_sW1.5_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VB1", + "IB1" + ], + "sizing": { + "M1": { + "w": 12.0, + "l": 0.3, + "nf": 24 + }, + "M2": { + "w": 12.0, + "l": 0.3, + "nf": 24 + }, + "M3": { + "w": 12.0, + "l": 0.3, + "nf": 24 + }, + "M4": { + "w": 12.0, + "l": 0.3, + "nf": 24 + }, + "M5": { + "w": 24.0, + "l": 0.3, + "nf": 48 + }, + "M6": { + "w": 24.0, + "l": 0.3, + "nf": 48 + }, + "M7": { + "w": 24.0, + "l": 0.3, + "nf": 48 + }, + "M8": { + "w": 24.0, + "l": 0.3, + "nf": 48 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 1e-05, + "kind": "cascode" + }, + "IB1": { + "i": 2e-05, + "from": "VSS" + } + }, + "load": { + "vcm": { + "expr": "v(VB1) - gs(M3) + gs(M1) - 0.1", + "currents": { + "M3": 1e-05, + "M1": 1e-05 + } + }, + "CL": 1e-12, + "inv_input": "VIN2", + "vout_target": 0.81 + }, + "category": "ota", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 12.0, + "l": 0.3, + "nf": 24, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 12.0, + "l": 0.3, + "nf": 24, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 12.0, + "l": 0.3, + "nf": 24, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 12.0, + "l": 0.3, + "nf": 24, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.3, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.3, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.3, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.3, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "c62225e8e02aeb09", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 1e-05, + "variant": "cascode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1.5_sL1/manifest.json new file mode 100644 index 00000000..03a0e2cd --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "93ae4da6aa9578e2e3b0084050c45dc8a6b37125820a04675645cda37617712a", + "qualification.json": "c94b33ce4836fb9e187cefb8f52339d84133d505adc2bf421c820bbe0b012a66", + "specs.json": "5f148b6990ff22598d46c92278bf52c9fa907a2d10b2a13c3406c338ceb7e4d8", + "target.spice": "e468bde7e9bd560feb017b9aa249cc72b0fcbda09b2e85ab4ffffe6c03932dac", + "target_lvs.spice": "6713be2349e261b1817afe9e986629711a20629b16d90be9f0053255246538b3", + "testbench.spice": "0b08da3a5ffaf7595e8448ade1f489cbb414f4ac70347411f63797b4ddd6f9ec" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1.5_sL1/qualification.json new file mode 100644 index 00000000..b708e23d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1.5_sL1/qualification.json @@ -0,0 +1,158 @@ +{ + "case_id": "C09_sky130_sW1.5_sL1", + "circuit_id": "C09", + "pdk": "sky130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "ota", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 12.0, + "l": 0.3, + "nf": 24, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 12.0, + "l": 0.3, + "nf": 24, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 12.0, + "l": 0.3, + "nf": 24, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 12.0, + "l": 0.3, + "nf": 24, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.3, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.3, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.3, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.3, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "c62225e8e02aeb09", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 49.4 + }, + "ugf": { + "min": 7808000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 52.40228, + "ugf": 13012700.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 10.2, + "schematic_measures": { + "vout0": 0.8099983, + "idd": 2.000002e-05, + "vos": -0.0168035, + "gain_lf": 52.40228, + "ph_lf": 0.4020045, + "ugf": 13012700.0, + "ph_ugf": -91.89919, + "f3db": 31157.06, + "pm": 87.69880549999999 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1.5_sL1/specs.json new file mode 100644 index 00000000..a9a68007 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1.5_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 49.4 + }, + "ugf": { + "min": 7808000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 52.40228, + "ugf": 13012700.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1.5_sL1/target.spice new file mode 100644 index 00000000..a515d9e4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1.5_sL1/target.spice @@ -0,0 +1,10 @@ +.subckt C09_sky130_sW1.5_sL1 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 +XM1 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=12 l=0.3 nf=24 +XM2 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=12 l=0.3 nf=24 +XM3 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=12 l=0.3 nf=24 +XM4 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=12 l=0.3 nf=24 +XM5 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=24 l=0.3 nf=48 +XM6 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=24 l=0.3 nf=48 +XM7 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=24 l=0.3 nf=48 +XM8 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=24 l=0.3 nf=48 +.ends C09_sky130_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1.5_sL1/target_lvs.spice new file mode 100644 index 00000000..b744201d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1.5_sL1/target_lvs.spice @@ -0,0 +1,290 @@ +.subckt C09_sky130_sW1.5_sL1 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 +XM1_f0 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f1 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f2 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f3 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f4 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f5 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f6 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f7 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f8 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f9 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f10 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f11 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f12 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f13 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f14 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f15 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f16 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f17 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f18 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f19 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f20 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f21 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f22 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f23 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f0 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f1 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f2 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f3 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f4 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f5 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f6 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f7 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f8 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f9 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f10 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f11 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f12 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f13 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f14 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f15 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f16 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f17 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f18 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f19 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f20 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f21 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f22 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f23 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f0 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f1 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f2 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f3 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f4 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f5 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f6 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f7 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f8 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f9 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f10 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f11 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f12 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f13 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f14 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f15 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f16 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f17 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f18 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f19 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f20 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f21 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f22 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f23 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f0 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f1 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f2 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f3 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f4 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f5 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f6 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f7 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f8 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f9 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f10 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f11 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f12 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f13 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f14 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f15 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f16 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f17 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f18 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f19 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f20 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f21 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f22 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f23 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f0 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f1 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f2 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f3 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f4 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f5 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f6 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f7 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f8 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f9 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f10 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f11 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f12 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f13 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f14 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f15 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f16 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f17 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f18 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f19 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f20 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f21 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f22 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f23 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f24 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f25 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f26 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f27 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f28 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f29 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f30 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f31 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f32 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f33 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f34 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f35 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f36 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f37 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f38 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f39 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f40 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f41 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f42 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f43 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f44 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f45 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f46 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f47 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f0 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f1 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f2 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f3 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f4 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f5 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f6 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f7 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f8 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f9 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f10 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f11 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f12 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f13 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f14 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f15 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f16 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f17 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f18 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f19 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f20 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f21 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f22 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f23 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f24 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f25 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f26 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f27 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f28 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f29 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f30 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f31 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f32 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f33 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f34 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f35 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f36 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f37 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f38 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f39 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f40 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f41 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f42 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f43 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f44 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f45 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f46 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f47 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f0 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f1 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f2 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f3 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f4 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f5 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f6 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f7 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f8 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f9 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f10 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f11 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f12 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f13 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f14 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f15 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f16 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f17 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f18 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f19 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f20 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f21 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f22 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f23 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f24 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f25 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f26 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f27 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f28 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f29 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f30 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f31 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f32 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f33 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f34 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f35 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f36 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f37 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f38 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f39 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f40 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f41 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f42 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f43 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f44 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f45 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f46 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f47 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f0 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f1 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f2 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f3 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f4 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f5 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f6 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f7 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f8 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f9 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f10 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f11 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f12 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f13 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f14 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f15 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f16 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f17 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f18 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f19 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f20 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f21 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f22 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f23 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f24 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f25 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f26 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f27 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f28 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f29 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f30 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f31 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f32 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f33 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f34 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f35 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f36 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f37 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f38 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f39 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f40 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f41 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f42 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f43 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f44 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f45 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f46 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f47 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +.ends C09_sky130_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1.5_sL1/testbench.spice new file mode 100644 index 00000000..be1c249a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1.5_sL1/testbench.spice @@ -0,0 +1,42 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 C09_sky130_sW1.5_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIB1 IB1 VSS 2e-05 +.nodeset v(IB1)=1.26 +XB_VB1 VB1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=12 l=0.3 +IB_VB1 VDDB VB1 4e-05 +XB_GS_M3 GS_M3 GS_M3 VSS VSS sky130_fd_pr__nfet_01v8 w=12 l=0.3 +IB_GS_M3 VDDB GS_M3 1e-05 +XB_GS_M1 GS_M1 GS_M1 VSS VSS sky130_fd_pr__nfet_01v8 w=12 l=0.3 +IB_GS_M1 VDDB GS_M1 1e-05 +B_VCM VCM 0 V = v(VB1) - v(GS_M3) + v(GS_M1) - 0.1 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 0.81 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN2 VCM VINT 0 1 +EIN VIN1 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN2) - v(VIN1) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1.5_sL2/case.json new file mode 100644 index 00000000..8c875c90 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1.5_sL2/case.json @@ -0,0 +1,235 @@ +{ + "case_id": "C09_sky130_sW1.5_sL2", + "circuit_id": "C09", + "pdk": "sky130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "dut_name": "C09_sky130_sW1.5_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VB1", + "IB1" + ], + "sizing": { + "M1": { + "w": 12.0, + "l": 0.6, + "nf": 24 + }, + "M2": { + "w": 12.0, + "l": 0.6, + "nf": 24 + }, + "M3": { + "w": 12.0, + "l": 0.6, + "nf": 24 + }, + "M4": { + "w": 12.0, + "l": 0.6, + "nf": 24 + }, + "M5": { + "w": 24.0, + "l": 0.6, + "nf": 48 + }, + "M6": { + "w": 24.0, + "l": 0.6, + "nf": 48 + }, + "M7": { + "w": 24.0, + "l": 0.6, + "nf": 48 + }, + "M8": { + "w": 24.0, + "l": 0.6, + "nf": 48 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 1e-05, + "kind": "cascode" + }, + "IB1": { + "i": 2e-05, + "from": "VSS" + } + }, + "load": { + "vcm": { + "expr": "v(VB1) - gs(M3) + gs(M1) - 0.1", + "currents": { + "M3": 1e-05, + "M1": 1e-05 + } + }, + "CL": 1e-12, + "inv_input": "VIN2", + "vout_target": 0.81 + }, + "category": "ota", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 12.0, + "l": 0.6, + "nf": 24, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 12.0, + "l": 0.6, + "nf": 24, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 12.0, + "l": 0.6, + "nf": 24, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 12.0, + "l": 0.6, + "nf": 24, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.6, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.6, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.6, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.6, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "ef9ccdc07d28f273", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 1e-05, + "variant": "cascode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1.5_sL2/manifest.json new file mode 100644 index 00000000..e7113c60 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "4a0ed352874fb1db55209903be0d67da09feb311b3b0b0725a6a0b9b95549595", + "qualification.json": "44303b42ecd17dc90f79ed49ccd563bb2444b84dc64b086df2445096df34cc58", + "specs.json": "7d21572f531a677f65aef90d6e282788ed070e09d0a2687b873aafbb5f4e6286", + "target.spice": "e70b132b921dea9fee4ac6517b088e6a6dc2cee194c329c112b24137f58ed115", + "target_lvs.spice": "bcf67e5563bcc9dd0f3d332eb87a162ccf267152ac3222e9bf11cf2bf4885e24", + "testbench.spice": "9b175bb5bc368dc397069f081d40c683b5fbab659f9b92305af65eb2673bcf6f" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1.5_sL2/qualification.json new file mode 100644 index 00000000..240c788c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1.5_sL2/qualification.json @@ -0,0 +1,161 @@ +{ + "case_id": "C09_sky130_sW1.5_sL2", + "circuit_id": "C09", + "pdk": "sky130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "ota", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 12.0, + "l": 0.6, + "nf": 24, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 12.0, + "l": 0.6, + "nf": 24, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 12.0, + "l": 0.6, + "nf": 24, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 12.0, + "l": 0.6, + "nf": 24, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.6, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.6, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.6, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.6, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "ef9ccdc07d28f273", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "gain_lf=20.24 below floor 35", + "ugf=3.812e+05 below floor 2e+06" + ], + "spec": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 20.24485, + "ugf": 381238.9 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 11.8, + "schematic_measures": { + "vout0": 0.8099682, + "idd": 1.999741e-05, + "vos": -0.280805, + "gain_lf": 20.24485, + "ph_lf": 0.05648142, + "ugf": 381238.9, + "ph_ugf": -82.89011, + "f3db": 37081.1, + "pm": 97.05340858 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1.5_sL2/specs.json new file mode 100644 index 00000000..b7a80b57 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1.5_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 20.24485, + "ugf": 381238.9 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1.5_sL2/target.spice new file mode 100644 index 00000000..929e6d40 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1.5_sL2/target.spice @@ -0,0 +1,10 @@ +.subckt C09_sky130_sW1.5_sL2 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 +XM1 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=12 l=0.6 nf=24 +XM2 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=12 l=0.6 nf=24 +XM3 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=12 l=0.6 nf=24 +XM4 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=12 l=0.6 nf=24 +XM5 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=24 l=0.6 nf=48 +XM6 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=24 l=0.6 nf=48 +XM7 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=24 l=0.6 nf=48 +XM8 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=24 l=0.6 nf=48 +.ends C09_sky130_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1.5_sL2/target_lvs.spice new file mode 100644 index 00000000..162c7a7e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1.5_sL2/target_lvs.spice @@ -0,0 +1,290 @@ +.subckt C09_sky130_sW1.5_sL2 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 +XM1_f0 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f1 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f2 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f3 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f4 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f5 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f6 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f7 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f8 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f9 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f10 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f11 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f12 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f13 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f14 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f15 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f16 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f17 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f18 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f19 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f20 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f21 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f22 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f23 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f0 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f1 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f2 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f3 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f4 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f5 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f6 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f7 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f8 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f9 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f10 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f11 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f12 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f13 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f14 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f15 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f16 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f17 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f18 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f19 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f20 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f21 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f22 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f23 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f0 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f1 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f2 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f3 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f4 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f5 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f6 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f7 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f8 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f9 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f10 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f11 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f12 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f13 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f14 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f15 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f16 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f17 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f18 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f19 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f20 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f21 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f22 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f23 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f0 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f1 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f2 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f3 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f4 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f5 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f6 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f7 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f8 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f9 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f10 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f11 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f12 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f13 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f14 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f15 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f16 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f17 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f18 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f19 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f20 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f21 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f22 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f23 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f0 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f1 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f2 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f3 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f4 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f5 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f6 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f7 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f8 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f9 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f10 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f11 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f12 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f13 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f14 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f15 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f16 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f17 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f18 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f19 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f20 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f21 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f22 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f23 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f24 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f25 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f26 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f27 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f28 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f29 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f30 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f31 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f32 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f33 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f34 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f35 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f36 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f37 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f38 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f39 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f40 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f41 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f42 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f43 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f44 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f45 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f46 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f47 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f0 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f1 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f2 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f3 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f4 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f5 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f6 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f7 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f8 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f9 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f10 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f11 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f12 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f13 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f14 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f15 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f16 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f17 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f18 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f19 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f20 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f21 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f22 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f23 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f24 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f25 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f26 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f27 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f28 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f29 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f30 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f31 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f32 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f33 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f34 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f35 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f36 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f37 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f38 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f39 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f40 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f41 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f42 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f43 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f44 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f45 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f46 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f47 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f0 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f1 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f2 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f3 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f4 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f5 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f6 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f7 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f8 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f9 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f10 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f11 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f12 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f13 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f14 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f15 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f16 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f17 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f18 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f19 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f20 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f21 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f22 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f23 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f24 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f25 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f26 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f27 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f28 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f29 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f30 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f31 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f32 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f33 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f34 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f35 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f36 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f37 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f38 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f39 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f40 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f41 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f42 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f43 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f44 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f45 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f46 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f47 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f0 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f1 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f2 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f3 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f4 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f5 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f6 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f7 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f8 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f9 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f10 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f11 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f12 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f13 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f14 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f15 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f16 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f17 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f18 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f19 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f20 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f21 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f22 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f23 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f24 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f25 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f26 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f27 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f28 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f29 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f30 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f31 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f32 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f33 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f34 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f35 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f36 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f37 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f38 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f39 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f40 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f41 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f42 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f43 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f44 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f45 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f46 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f47 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +.ends C09_sky130_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1.5_sL2/testbench.spice new file mode 100644 index 00000000..79284cb6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1.5_sL2/testbench.spice @@ -0,0 +1,42 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 C09_sky130_sW1.5_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIB1 IB1 VSS 2e-05 +.nodeset v(IB1)=1.26 +XB_VB1 VB1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=12 l=0.6 +IB_VB1 VDDB VB1 4e-05 +XB_GS_M3 GS_M3 GS_M3 VSS VSS sky130_fd_pr__nfet_01v8 w=12 l=0.6 +IB_GS_M3 VDDB GS_M3 1e-05 +XB_GS_M1 GS_M1 GS_M1 VSS VSS sky130_fd_pr__nfet_01v8 w=12 l=0.6 +IB_GS_M1 VDDB GS_M1 1e-05 +B_VCM VCM 0 V = v(VB1) - v(GS_M3) + v(GS_M1) - 0.1 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 0.81 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN2 VCM VINT 0 1 +EIN VIN1 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN2) - v(VIN1) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1_sL1.5/case.json new file mode 100644 index 00000000..eed0eec9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1_sL1.5/case.json @@ -0,0 +1,235 @@ +{ + "case_id": "C09_sky130_sW1_sL1.5", + "circuit_id": "C09", + "pdk": "sky130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "dut_name": "C09_sky130_sW1_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VB1", + "IB1" + ], + "sizing": { + "M1": { + "w": 8.0, + "l": 0.45, + "nf": 16 + }, + "M2": { + "w": 8.0, + "l": 0.45, + "nf": 16 + }, + "M3": { + "w": 8.0, + "l": 0.45, + "nf": 16 + }, + "M4": { + "w": 8.0, + "l": 0.45, + "nf": 16 + }, + "M5": { + "w": 16.0, + "l": 0.45, + "nf": 32 + }, + "M6": { + "w": 16.0, + "l": 0.45, + "nf": 32 + }, + "M7": { + "w": 16.0, + "l": 0.45, + "nf": 32 + }, + "M8": { + "w": 16.0, + "l": 0.45, + "nf": 32 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 1e-05, + "kind": "cascode" + }, + "IB1": { + "i": 2e-05, + "from": "VSS" + } + }, + "load": { + "vcm": { + "expr": "v(VB1) - gs(M3) + gs(M1) - 0.1", + "currents": { + "M3": 1e-05, + "M1": 1e-05 + } + }, + "CL": 1e-12, + "inv_input": "VIN2", + "vout_target": 0.81 + }, + "category": "ota", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.45, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.45, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.45, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.45, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "067b1a039bcdf28a", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 1e-05, + "variant": "cascode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1_sL1.5/manifest.json new file mode 100644 index 00000000..8e507207 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "6f9618a5b3c5371a82965c7600e682e022e8c4c23f3faf2fa5460f877611e4f8", + "qualification.json": "35a8116820382c1faced31582b97c9823ba1ecb2f651a9d7e2ed0798c4e254f7", + "specs.json": "e0ba36b5de6641e6e55cd62009a13ad69a18988c67260d3821a948d27d4b642f", + "target.spice": "192448c4d13254c171ccb707456f7e100ebef729e25d2ef2f08a7dba259a8a81", + "target_lvs.spice": "d7a0f4fb2bdcc2e6827cdce7e1b28f5c4443009290fb3696e254da373d4556a9", + "testbench.spice": "7c654b6836f81209f47e201247dc2d86aadb322c8c2fa630190a5e7b3a2c0570" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1_sL1.5/qualification.json new file mode 100644 index 00000000..e8f4a1a6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1_sL1.5/qualification.json @@ -0,0 +1,161 @@ +{ + "case_id": "C09_sky130_sW1_sL1.5", + "circuit_id": "C09", + "pdk": "sky130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "ota", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.45, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.45, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.45, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.45, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "067b1a039bcdf28a", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "gain_lf=19.7 below floor 35", + "ugf=4.845e+05 below floor 2e+06" + ], + "spec": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 19.69825, + "ugf": 484494.6 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 11.8, + "schematic_measures": { + "vout0": 0.8099714, + "idd": 1.999924e-05, + "vos": -0.258346, + "gain_lf": 19.69825, + "ph_lf": 0.05073495, + "ugf": 484494.6, + "ph_ugf": -83.25803, + "f3db": 50240.21, + "pm": 96.69123504999999 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1_sL1.5/specs.json new file mode 100644 index 00000000..7118705e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 19.69825, + "ugf": 484494.6 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1_sL1.5/target.spice new file mode 100644 index 00000000..633685ac --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1_sL1.5/target.spice @@ -0,0 +1,10 @@ +.subckt C09_sky130_sW1_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 +XM1 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=8 l=0.45 nf=16 +XM2 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=8 l=0.45 nf=16 +XM3 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=8 l=0.45 nf=16 +XM4 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=8 l=0.45 nf=16 +XM5 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=16 l=0.45 nf=32 +XM6 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=16 l=0.45 nf=32 +XM7 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=16 l=0.45 nf=32 +XM8 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=16 l=0.45 nf=32 +.ends C09_sky130_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1_sL1.5/target_lvs.spice new file mode 100644 index 00000000..c7db3000 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1_sL1.5/target_lvs.spice @@ -0,0 +1,194 @@ +.subckt C09_sky130_sW1_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 +XM1_f0 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f1 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f2 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f3 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f4 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f5 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f6 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f7 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f8 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f9 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f10 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f11 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f12 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f13 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f14 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f15 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f0 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f1 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f2 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f3 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f4 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f5 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f6 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f7 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f8 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f9 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f10 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f11 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f12 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f13 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f14 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f15 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f0 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f1 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f2 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f3 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f4 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f5 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f6 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f7 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f8 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f9 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f10 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f11 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f12 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f13 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f14 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f15 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f0 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f1 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f2 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f3 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f4 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f5 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f6 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f7 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f8 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f9 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f10 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f11 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f12 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f13 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f14 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f15 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f0 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f1 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f2 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f3 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f4 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f5 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f6 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f7 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f8 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f9 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f10 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f11 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f12 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f13 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f14 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f15 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f16 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f17 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f18 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f19 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f20 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f21 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f22 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f23 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f24 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f25 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f26 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f27 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f28 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f29 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f30 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f31 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f0 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f1 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f2 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f3 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f4 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f5 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f6 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f7 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f8 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f9 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f10 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f11 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f12 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f13 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f14 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f15 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f16 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f17 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f18 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f19 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f20 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f21 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f22 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f23 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f24 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f25 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f26 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f27 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f28 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f29 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f30 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f31 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f0 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f1 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f2 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f3 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f4 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f5 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f6 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f7 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f8 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f9 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f10 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f11 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f12 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f13 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f14 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f15 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f16 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f17 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f18 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f19 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f20 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f21 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f22 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f23 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f24 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f25 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f26 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f27 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f28 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f29 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f30 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f31 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f0 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f1 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f2 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f3 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f4 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f5 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f6 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f7 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f8 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f9 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f10 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f11 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f12 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f13 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f14 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f15 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f16 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f17 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f18 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f19 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f20 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f21 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f22 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f23 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f24 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f25 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f26 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f27 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f28 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f29 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f30 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f31 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +.ends C09_sky130_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1_sL1.5/testbench.spice new file mode 100644 index 00000000..2d4bb770 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1_sL1.5/testbench.spice @@ -0,0 +1,42 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 C09_sky130_sW1_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIB1 IB1 VSS 2e-05 +.nodeset v(IB1)=1.26 +XB_VB1 VB1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=8 l=0.45 +IB_VB1 VDDB VB1 4e-05 +XB_GS_M3 GS_M3 GS_M3 VSS VSS sky130_fd_pr__nfet_01v8 w=8 l=0.45 +IB_GS_M3 VDDB GS_M3 1e-05 +XB_GS_M1 GS_M1 GS_M1 VSS VSS sky130_fd_pr__nfet_01v8 w=8 l=0.45 +IB_GS_M1 VDDB GS_M1 1e-05 +B_VCM VCM 0 V = v(VB1) - v(GS_M3) + v(GS_M1) - 0.1 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 0.81 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN2 VCM VINT 0 1 +EIN VIN1 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN2) - v(VIN1) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1_sL1/case.json new file mode 100644 index 00000000..74736560 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1_sL1/case.json @@ -0,0 +1,235 @@ +{ + "case_id": "C09_sky130_sW1_sL1", + "circuit_id": "C09", + "pdk": "sky130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "dut_name": "C09_sky130_sW1_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VB1", + "IB1" + ], + "sizing": { + "M1": { + "w": 8.0, + "l": 0.3, + "nf": 16 + }, + "M2": { + "w": 8.0, + "l": 0.3, + "nf": 16 + }, + "M3": { + "w": 8.0, + "l": 0.3, + "nf": 16 + }, + "M4": { + "w": 8.0, + "l": 0.3, + "nf": 16 + }, + "M5": { + "w": 16.0, + "l": 0.3, + "nf": 32 + }, + "M6": { + "w": 16.0, + "l": 0.3, + "nf": 32 + }, + "M7": { + "w": 16.0, + "l": 0.3, + "nf": 32 + }, + "M8": { + "w": 16.0, + "l": 0.3, + "nf": 32 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 1e-05, + "kind": "cascode" + }, + "IB1": { + "i": 2e-05, + "from": "VSS" + } + }, + "load": { + "vcm": { + "expr": "v(VB1) - gs(M3) + gs(M1) - 0.1", + "currents": { + "M3": 1e-05, + "M1": 1e-05 + } + }, + "CL": 1e-12, + "inv_input": "VIN2", + "vout_target": 0.81 + }, + "category": "ota", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.3, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.3, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.3, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.3, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "cd1ed5967a96f430", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 1e-05, + "variant": "cascode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1_sL1/manifest.json new file mode 100644 index 00000000..0ac11edc --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "c7abecf8aeb571dcca634c431e73186c94a282ce679b91cadd49eea060e84059", + "qualification.json": "8fa6c2eaf592cc83ab88cc7b4587823a7c1be5a2d5f639b60ebe51f8f7fc54ac", + "specs.json": "c8b3bbdedbc48ae530c86ecb7d6491269ae81eecb23f9de01e120ffe71dda213", + "target.spice": "d39ba6d9a1c5a023853075cab4f35796aab8d91ba76796e3b78a8fdf386e480c", + "target_lvs.spice": "f8f8221ace254ee2fa24e5638f8d35d6d93f09e7102a164dee9013aa2e6b5131", + "testbench.spice": "bf170026ff3e743d54dd043f269808f16745189282d99cb9ce50a3e7df94458f" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1_sL1/qualification.json new file mode 100644 index 00000000..2de2b289 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1_sL1/qualification.json @@ -0,0 +1,158 @@ +{ + "case_id": "C09_sky130_sW1_sL1", + "circuit_id": "C09", + "pdk": "sky130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "ota", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.3, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.3, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.3, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.3, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "cd1ed5967a96f430", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 41.68 + }, + "ugf": { + "min": 2480000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 44.68225, + "ugf": 4133133.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 12.4, + "schematic_measures": { + "vout0": 0.8099937, + "idd": 2e-05, + "vos": -0.0626237, + "gain_lf": 44.68225, + "ph_lf": 0.3094196, + "ugf": 4133133.0, + "ph_ugf": -89.45495, + "f3db": 24016.61, + "pm": 90.2356304 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1_sL1/specs.json new file mode 100644 index 00000000..92271a78 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 41.68 + }, + "ugf": { + "min": 2480000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 44.68225, + "ugf": 4133133.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1_sL1/target.spice new file mode 100644 index 00000000..71e10d92 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1_sL1/target.spice @@ -0,0 +1,10 @@ +.subckt C09_sky130_sW1_sL1 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 +XM1 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=8 l=0.3 nf=16 +XM2 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=8 l=0.3 nf=16 +XM3 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=8 l=0.3 nf=16 +XM4 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=8 l=0.3 nf=16 +XM5 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=16 l=0.3 nf=32 +XM6 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=16 l=0.3 nf=32 +XM7 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=16 l=0.3 nf=32 +XM8 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=16 l=0.3 nf=32 +.ends C09_sky130_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1_sL1/target_lvs.spice new file mode 100644 index 00000000..6b62314f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1_sL1/target_lvs.spice @@ -0,0 +1,194 @@ +.subckt C09_sky130_sW1_sL1 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 +XM1_f0 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f1 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f2 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f3 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f4 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f5 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f6 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f7 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f8 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f9 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f10 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f11 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f12 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f13 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f14 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f15 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f0 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f1 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f2 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f3 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f4 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f5 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f6 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f7 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f8 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f9 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f10 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f11 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f12 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f13 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f14 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f15 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f0 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f1 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f2 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f3 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f4 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f5 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f6 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f7 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f8 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f9 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f10 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f11 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f12 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f13 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f14 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f15 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f0 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f1 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f2 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f3 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f4 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f5 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f6 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f7 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f8 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f9 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f10 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f11 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f12 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f13 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f14 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f15 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f0 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f1 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f2 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f3 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f4 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f5 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f6 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f7 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f8 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f9 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f10 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f11 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f12 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f13 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f14 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f15 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f16 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f17 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f18 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f19 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f20 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f21 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f22 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f23 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f24 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f25 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f26 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f27 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f28 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f29 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f30 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f31 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f0 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f1 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f2 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f3 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f4 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f5 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f6 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f7 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f8 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f9 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f10 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f11 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f12 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f13 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f14 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f15 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f16 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f17 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f18 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f19 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f20 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f21 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f22 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f23 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f24 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f25 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f26 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f27 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f28 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f29 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f30 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f31 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f0 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f1 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f2 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f3 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f4 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f5 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f6 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f7 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f8 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f9 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f10 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f11 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f12 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f13 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f14 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f15 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f16 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f17 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f18 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f19 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f20 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f21 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f22 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f23 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f24 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f25 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f26 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f27 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f28 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f29 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f30 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f31 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f0 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f1 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f2 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f3 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f4 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f5 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f6 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f7 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f8 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f9 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f10 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f11 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f12 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f13 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f14 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f15 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f16 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f17 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f18 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f19 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f20 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f21 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f22 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f23 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f24 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f25 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f26 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f27 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f28 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f29 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f30 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f31 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +.ends C09_sky130_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1_sL1/testbench.spice new file mode 100644 index 00000000..33151d28 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1_sL1/testbench.spice @@ -0,0 +1,42 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 C09_sky130_sW1_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIB1 IB1 VSS 2e-05 +.nodeset v(IB1)=1.26 +XB_VB1 VB1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=8 l=0.3 +IB_VB1 VDDB VB1 4e-05 +XB_GS_M3 GS_M3 GS_M3 VSS VSS sky130_fd_pr__nfet_01v8 w=8 l=0.3 +IB_GS_M3 VDDB GS_M3 1e-05 +XB_GS_M1 GS_M1 GS_M1 VSS VSS sky130_fd_pr__nfet_01v8 w=8 l=0.3 +IB_GS_M1 VDDB GS_M1 1e-05 +B_VCM VCM 0 V = v(VB1) - v(GS_M3) + v(GS_M1) - 0.1 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 0.81 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN2 VCM VINT 0 1 +EIN VIN1 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN2) - v(VIN1) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1_sL2/case.json new file mode 100644 index 00000000..d3e63635 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1_sL2/case.json @@ -0,0 +1,235 @@ +{ + "case_id": "C09_sky130_sW1_sL2", + "circuit_id": "C09", + "pdk": "sky130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "dut_name": "C09_sky130_sW1_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VB1", + "IB1" + ], + "sizing": { + "M1": { + "w": 8.0, + "l": 0.6, + "nf": 16 + }, + "M2": { + "w": 8.0, + "l": 0.6, + "nf": 16 + }, + "M3": { + "w": 8.0, + "l": 0.6, + "nf": 16 + }, + "M4": { + "w": 8.0, + "l": 0.6, + "nf": 16 + }, + "M5": { + "w": 16.0, + "l": 0.6, + "nf": 32 + }, + "M6": { + "w": 16.0, + "l": 0.6, + "nf": 32 + }, + "M7": { + "w": 16.0, + "l": 0.6, + "nf": 32 + }, + "M8": { + "w": 16.0, + "l": 0.6, + "nf": 32 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 1e-05, + "kind": "cascode" + }, + "IB1": { + "i": 2e-05, + "from": "VSS" + } + }, + "load": { + "vcm": { + "expr": "v(VB1) - gs(M3) + gs(M1) - 0.1", + "currents": { + "M3": 1e-05, + "M1": 1e-05 + } + }, + "CL": 1e-12, + "inv_input": "VIN2", + "vout_target": 0.81 + }, + "category": "ota", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.6, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.6, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.6, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.6, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "c6bdd644af3634d8", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 1e-05, + "variant": "cascode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1_sL2/manifest.json new file mode 100644 index 00000000..c83dc337 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "7fa578541f6e74fb379c5e6b70bdf687df9811e5c9779e7bf582b941887eb653", + "qualification.json": "c579c0122f68aa94af28453185f01ecadfb9622b7e4afeea1bae6b8bdaef41ee", + "specs.json": "ecf824ecc89034480e07e081abce3dfb94657d892c3db4808981c9fb2eb7bfc7", + "target.spice": "18dae169cd13e180f4ca47c8ea6444197021b43b972f7f0ff5bc33bd61998eb0", + "target_lvs.spice": "9c2e5e057c9b196fb69112253b4cd8c79cd0af36d74332af3fb994e323b3cc5f", + "testbench.spice": "5d382c9aa7fefa4ae3e3aed7fe42f52792b7e76c915d7e851f986945e2408883" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1_sL2/qualification.json new file mode 100644 index 00000000..25023930 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1_sL2/qualification.json @@ -0,0 +1,161 @@ +{ + "case_id": "C09_sky130_sW1_sL2", + "circuit_id": "C09", + "pdk": "sky130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "ota", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.6, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.6, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.6, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.6, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "c6bdd644af3634d8", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "gain_lf=13.57 below floor 35", + "ugf=2.635e+05 below floor 2e+06" + ], + "spec": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 13.5663, + "ugf": 263476.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 12.1, + "schematic_measures": { + "vout0": 0.8099517, + "idd": 1.998939e-05, + "vos": -0.373543, + "gain_lf": 13.5663, + "ph_lf": -0.01904386, + "ugf": 263476.0, + "ph_ugf": -76.84406, + "f3db": 56293.05, + "pm": 103.17498386 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1_sL2/specs.json new file mode 100644 index 00000000..8878f3be --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 13.5663, + "ugf": 263476.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1_sL2/target.spice new file mode 100644 index 00000000..4816c9d1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1_sL2/target.spice @@ -0,0 +1,10 @@ +.subckt C09_sky130_sW1_sL2 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 +XM1 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=8 l=0.6 nf=16 +XM2 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=8 l=0.6 nf=16 +XM3 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=8 l=0.6 nf=16 +XM4 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=8 l=0.6 nf=16 +XM5 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=16 l=0.6 nf=32 +XM6 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=16 l=0.6 nf=32 +XM7 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=16 l=0.6 nf=32 +XM8 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=16 l=0.6 nf=32 +.ends C09_sky130_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1_sL2/target_lvs.spice new file mode 100644 index 00000000..18b35bcd --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1_sL2/target_lvs.spice @@ -0,0 +1,194 @@ +.subckt C09_sky130_sW1_sL2 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 +XM1_f0 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f1 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f2 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f3 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f4 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f5 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f6 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f7 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f8 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f9 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f10 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f11 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f12 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f13 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f14 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f15 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f0 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f1 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f2 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f3 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f4 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f5 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f6 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f7 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f8 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f9 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f10 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f11 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f12 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f13 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f14 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f15 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f0 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f1 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f2 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f3 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f4 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f5 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f6 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f7 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f8 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f9 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f10 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f11 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f12 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f13 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f14 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f15 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f0 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f1 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f2 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f3 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f4 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f5 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f6 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f7 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f8 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f9 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f10 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f11 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f12 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f13 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f14 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f15 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f0 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f1 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f2 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f3 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f4 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f5 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f6 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f7 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f8 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f9 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f10 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f11 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f12 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f13 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f14 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f15 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f16 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f17 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f18 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f19 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f20 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f21 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f22 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f23 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f24 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f25 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f26 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f27 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f28 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f29 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f30 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f31 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f0 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f1 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f2 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f3 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f4 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f5 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f6 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f7 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f8 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f9 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f10 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f11 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f12 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f13 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f14 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f15 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f16 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f17 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f18 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f19 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f20 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f21 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f22 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f23 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f24 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f25 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f26 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f27 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f28 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f29 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f30 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f31 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f0 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f1 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f2 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f3 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f4 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f5 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f6 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f7 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f8 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f9 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f10 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f11 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f12 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f13 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f14 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f15 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f16 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f17 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f18 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f19 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f20 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f21 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f22 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f23 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f24 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f25 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f26 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f27 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f28 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f29 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f30 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f31 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f0 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f1 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f2 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f3 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f4 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f5 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f6 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f7 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f8 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f9 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f10 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f11 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f12 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f13 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f14 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f15 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f16 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f17 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f18 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f19 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f20 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f21 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f22 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f23 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f24 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f25 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f26 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f27 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f28 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f29 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f30 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f31 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +.ends C09_sky130_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1_sL2/testbench.spice new file mode 100644 index 00000000..8f4c9482 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW1_sL2/testbench.spice @@ -0,0 +1,42 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 C09_sky130_sW1_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIB1 IB1 VSS 2e-05 +.nodeset v(IB1)=1.26 +XB_VB1 VB1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=8 l=0.6 +IB_VB1 VDDB VB1 4e-05 +XB_GS_M3 GS_M3 GS_M3 VSS VSS sky130_fd_pr__nfet_01v8 w=8 l=0.6 +IB_GS_M3 VDDB GS_M3 1e-05 +XB_GS_M1 GS_M1 GS_M1 VSS VSS sky130_fd_pr__nfet_01v8 w=8 l=0.6 +IB_GS_M1 VDDB GS_M1 1e-05 +B_VCM VCM 0 V = v(VB1) - v(GS_M3) + v(GS_M1) - 0.1 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 0.81 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN2 VCM VINT 0 1 +EIN VIN1 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN2) - v(VIN1) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C09/sky130/sW2_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW2_sL1.5/case.json new file mode 100644 index 00000000..159c5554 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW2_sL1.5/case.json @@ -0,0 +1,235 @@ +{ + "case_id": "C09_sky130_sW2_sL1.5", + "circuit_id": "C09", + "pdk": "sky130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "dut_name": "C09_sky130_sW2_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VB1", + "IB1" + ], + "sizing": { + "M1": { + "w": 16.0, + "l": 0.45, + "nf": 32 + }, + "M2": { + "w": 16.0, + "l": 0.45, + "nf": 32 + }, + "M3": { + "w": 16.0, + "l": 0.45, + "nf": 32 + }, + "M4": { + "w": 16.0, + "l": 0.45, + "nf": 32 + }, + "M5": { + "w": 32.0, + "l": 0.45, + "nf": 64 + }, + "M6": { + "w": 32.0, + "l": 0.45, + "nf": 64 + }, + "M7": { + "w": 32.0, + "l": 0.45, + "nf": 64 + }, + "M8": { + "w": 32.0, + "l": 0.45, + "nf": 64 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 1e-05, + "kind": "cascode" + }, + "IB1": { + "i": 2e-05, + "from": "VSS" + } + }, + "load": { + "vcm": { + "expr": "v(VB1) - gs(M3) + gs(M1) - 0.1", + "currents": { + "M3": 1e-05, + "M1": 1e-05 + } + }, + "CL": 1e-12, + "inv_input": "VIN2", + "vout_target": 0.81 + }, + "category": "ota", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 16.0, + "l": 0.45, + "nf": 32, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 16.0, + "l": 0.45, + "nf": 32, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 16.0, + "l": 0.45, + "nf": 32, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 16.0, + "l": 0.45, + "nf": 32, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.45, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.45, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.45, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.45, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "be4570c009a3d202", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 1e-05, + "variant": "cascode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/sky130/sW2_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW2_sL1.5/manifest.json new file mode 100644 index 00000000..06eee8ce --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW2_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "586927c79c3355cd9b95ddc3f281526ca61efe7276626f3bd0f4e1ef7b3c37ec", + "qualification.json": "881b6e5069eec4d93cf13fb28f6bab8eb2fd0c357cfde331c40c6b5981beb8f6", + "specs.json": "733056094b821364a41e7a6f05d11c446a66361045c5742e20354e70a9033912", + "target.spice": "4b90eba14015978afa7e157ba935be59cefac46d65e6ba6458c64326659e2ca3", + "target_lvs.spice": "caf318aec0ae3657c6db070108813c0815004c022cd6d995b0f1edb58125da9c", + "testbench.spice": "188cbb98885dce7d8adc7e19ce2c83b89c27acf9b4bff20fec5a8aa393150897" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/sky130/sW2_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW2_sL1.5/qualification.json new file mode 100644 index 00000000..95e6cb48 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW2_sL1.5/qualification.json @@ -0,0 +1,160 @@ +{ + "case_id": "C09_sky130_sW2_sL1.5", + "circuit_id": "C09", + "pdk": "sky130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "ota", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 16.0, + "l": 0.45, + "nf": 32, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 16.0, + "l": 0.45, + "nf": 32, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 16.0, + "l": 0.45, + "nf": 32, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 16.0, + "l": 0.45, + "nf": 32, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.45, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.45, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.45, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.45, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "be4570c009a3d202", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "ugf=1.549e+06 below floor 2e+06" + ], + "spec": { + "gain_lf": { + "min": 38.61 + }, + "ugf": { + "min": 2000000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 41.61467, + "ugf": 1548783.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 10.5, + "schematic_measures": { + "vout0": 0.8099876, + "idd": 1.999992e-05, + "vos": -0.121526, + "gain_lf": 41.61467, + "ph_lf": 0.5103991, + "ugf": 1548783.0, + "ph_ugf": -88.16643, + "f3db": 12812.55, + "pm": 91.3231709 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/sky130/sW2_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW2_sL1.5/specs.json new file mode 100644 index 00000000..43f00921 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW2_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 38.61 + }, + "ugf": { + "min": 2000000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 41.61467, + "ugf": 1548783.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/sky130/sW2_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW2_sL1.5/target.spice new file mode 100644 index 00000000..c79202d6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW2_sL1.5/target.spice @@ -0,0 +1,10 @@ +.subckt C09_sky130_sW2_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 +XM1 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=16 l=0.45 nf=32 +XM2 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=16 l=0.45 nf=32 +XM3 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=16 l=0.45 nf=32 +XM4 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=16 l=0.45 nf=32 +XM5 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=32 l=0.45 nf=64 +XM6 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=32 l=0.45 nf=64 +XM7 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=32 l=0.45 nf=64 +XM8 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=32 l=0.45 nf=64 +.ends C09_sky130_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C09/sky130/sW2_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW2_sL1.5/target_lvs.spice new file mode 100644 index 00000000..6fcd3848 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW2_sL1.5/target_lvs.spice @@ -0,0 +1,386 @@ +.subckt C09_sky130_sW2_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 +XM1_f0 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f1 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f2 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f3 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f4 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f5 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f6 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f7 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f8 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f9 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f10 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f11 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f12 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f13 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f14 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f15 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f16 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f17 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f18 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f19 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f20 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f21 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f22 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f23 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f24 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f25 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f26 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f27 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f28 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f29 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f30 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f31 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f0 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f1 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f2 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f3 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f4 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f5 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f6 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f7 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f8 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f9 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f10 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f11 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f12 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f13 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f14 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f15 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f16 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f17 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f18 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f19 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f20 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f21 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f22 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f23 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f24 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f25 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f26 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f27 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f28 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f29 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f30 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f31 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f0 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f1 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f2 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f3 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f4 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f5 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f6 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f7 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f8 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f9 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f10 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f11 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f12 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f13 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f14 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f15 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f16 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f17 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f18 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f19 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f20 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f21 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f22 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f23 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f24 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f25 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f26 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f27 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f28 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f29 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f30 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f31 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f0 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f1 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f2 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f3 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f4 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f5 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f6 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f7 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f8 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f9 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f10 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f11 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f12 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f13 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f14 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f15 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f16 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f17 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f18 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f19 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f20 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f21 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f22 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f23 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f24 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f25 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f26 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f27 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f28 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f29 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f30 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f31 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f0 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f1 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f2 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f3 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f4 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f5 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f6 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f7 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f8 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f9 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f10 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f11 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f12 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f13 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f14 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f15 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f16 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f17 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f18 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f19 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f20 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f21 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f22 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f23 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f24 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f25 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f26 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f27 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f28 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f29 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f30 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f31 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f32 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f33 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f34 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f35 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f36 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f37 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f38 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f39 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f40 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f41 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f42 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f43 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f44 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f45 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f46 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f47 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f48 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f49 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f50 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f51 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f52 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f53 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f54 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f55 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f56 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f57 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f58 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f59 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f60 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f61 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f62 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f63 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f0 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f1 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f2 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f3 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f4 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f5 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f6 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f7 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f8 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f9 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f10 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f11 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f12 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f13 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f14 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f15 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f16 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f17 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f18 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f19 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f20 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f21 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f22 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f23 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f24 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f25 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f26 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f27 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f28 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f29 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f30 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f31 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f32 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f33 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f34 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f35 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f36 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f37 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f38 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f39 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f40 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f41 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f42 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f43 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f44 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f45 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f46 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f47 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f48 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f49 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f50 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f51 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f52 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f53 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f54 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f55 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f56 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f57 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f58 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f59 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f60 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f61 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f62 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f63 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f0 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f1 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f2 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f3 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f4 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f5 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f6 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f7 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f8 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f9 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f10 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f11 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f12 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f13 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f14 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f15 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f16 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f17 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f18 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f19 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f20 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f21 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f22 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f23 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f24 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f25 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f26 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f27 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f28 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f29 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f30 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f31 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f32 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f33 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f34 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f35 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f36 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f37 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f38 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f39 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f40 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f41 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f42 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f43 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f44 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f45 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f46 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f47 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f48 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f49 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f50 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f51 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f52 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f53 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f54 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f55 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f56 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f57 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f58 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f59 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f60 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f61 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f62 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f63 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f0 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f1 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f2 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f3 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f4 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f5 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f6 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f7 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f8 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f9 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f10 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f11 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f12 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f13 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f14 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f15 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f16 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f17 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f18 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f19 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f20 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f21 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f22 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f23 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f24 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f25 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f26 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f27 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f28 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f29 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f30 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f31 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f32 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f33 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f34 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f35 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f36 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f37 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f38 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f39 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f40 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f41 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f42 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f43 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f44 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f45 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f46 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f47 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f48 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f49 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f50 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f51 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f52 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f53 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f54 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f55 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f56 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f57 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f58 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f59 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f60 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f61 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f62 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f63 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +.ends C09_sky130_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C09/sky130/sW2_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW2_sL1.5/testbench.spice new file mode 100644 index 00000000..96ac31b3 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW2_sL1.5/testbench.spice @@ -0,0 +1,42 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 C09_sky130_sW2_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIB1 IB1 VSS 2e-05 +.nodeset v(IB1)=1.26 +XB_VB1 VB1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=16 l=0.45 +IB_VB1 VDDB VB1 4e-05 +XB_GS_M3 GS_M3 GS_M3 VSS VSS sky130_fd_pr__nfet_01v8 w=16 l=0.45 +IB_GS_M3 VDDB GS_M3 1e-05 +XB_GS_M1 GS_M1 GS_M1 VSS VSS sky130_fd_pr__nfet_01v8 w=16 l=0.45 +IB_GS_M1 VDDB GS_M1 1e-05 +B_VCM VCM 0 V = v(VB1) - v(GS_M3) + v(GS_M1) - 0.1 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 0.81 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN2 VCM VINT 0 1 +EIN VIN1 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN2) - v(VIN1) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C09/sky130/sW2_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW2_sL1/case.json new file mode 100644 index 00000000..55f0ab4b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW2_sL1/case.json @@ -0,0 +1,235 @@ +{ + "case_id": "C09_sky130_sW2_sL1", + "circuit_id": "C09", + "pdk": "sky130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "dut_name": "C09_sky130_sW2_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VB1", + "IB1" + ], + "sizing": { + "M1": { + "w": 16.0, + "l": 0.3, + "nf": 32 + }, + "M2": { + "w": 16.0, + "l": 0.3, + "nf": 32 + }, + "M3": { + "w": 16.0, + "l": 0.3, + "nf": 32 + }, + "M4": { + "w": 16.0, + "l": 0.3, + "nf": 32 + }, + "M5": { + "w": 32.0, + "l": 0.3, + "nf": 64 + }, + "M6": { + "w": 32.0, + "l": 0.3, + "nf": 64 + }, + "M7": { + "w": 32.0, + "l": 0.3, + "nf": 64 + }, + "M8": { + "w": 32.0, + "l": 0.3, + "nf": 64 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 1e-05, + "kind": "cascode" + }, + "IB1": { + "i": 2e-05, + "from": "VSS" + } + }, + "load": { + "vcm": { + "expr": "v(VB1) - gs(M3) + gs(M1) - 0.1", + "currents": { + "M3": 1e-05, + "M1": 1e-05 + } + }, + "CL": 1e-12, + "inv_input": "VIN2", + "vout_target": 0.81 + }, + "category": "ota", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 16.0, + "l": 0.3, + "nf": 32, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 16.0, + "l": 0.3, + "nf": 32, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 16.0, + "l": 0.3, + "nf": 32, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 16.0, + "l": 0.3, + "nf": 32, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.3, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.3, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.3, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.3, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "d7def710d3e945c9", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 1e-05, + "variant": "cascode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/sky130/sW2_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW2_sL1/manifest.json new file mode 100644 index 00000000..cdcb0d85 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW2_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "9a1300323eb3763b961d9e7bb3b075e9a3cc9a98fd7d797c214305a4580e5e2f", + "qualification.json": "5c7033476ac58523b11ebbf3d0cb1d120ce8c097c9fe8ec736d63b0ba80c9de0", + "specs.json": "90c1643eacd8054f0437ddc1d7fbc4e012e0d6c6ec6d525bdd5421cc16f9af8d", + "target.spice": "2a221ffe553e13cf815c1a49178dd1566204a910bac3c02c615d4bd8158edfb3", + "target_lvs.spice": "d05cf2f860b494926b4c7d51e36f19a165efab6eb70e2f4a7c4ba6a108a5ac69", + "testbench.spice": "ba5ec90d17359430a18ddde2bc8c5b9e15a36ed8dba3ba19ac7b479badc375b3" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/sky130/sW2_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW2_sL1/qualification.json new file mode 100644 index 00000000..7a0e654b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW2_sL1/qualification.json @@ -0,0 +1,158 @@ +{ + "case_id": "C09_sky130_sW2_sL1", + "circuit_id": "C09", + "pdk": "sky130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "ota", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 16.0, + "l": 0.3, + "nf": 32, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 16.0, + "l": 0.3, + "nf": 32, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 16.0, + "l": 0.3, + "nf": 32, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 16.0, + "l": 0.3, + "nf": 32, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.3, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.3, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.3, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.3, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "d7def710d3e945c9", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 52.21 + }, + "ugf": { + "min": 13190000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 55.20624, + "ugf": 21980900.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 10.7, + "schematic_measures": { + "vout0": 0.8099995, + "idd": 2.000003e-05, + "vos": -0.00532868, + "gain_lf": 55.20624, + "ph_lf": 0.450439, + "ugf": 21980900.0, + "ph_ugf": -96.9943, + "f3db": 38654.91, + "pm": 82.555261 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/sky130/sW2_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW2_sL1/specs.json new file mode 100644 index 00000000..c3def46d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW2_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 52.21 + }, + "ugf": { + "min": 13190000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 55.20624, + "ugf": 21980900.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/sky130/sW2_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW2_sL1/target.spice new file mode 100644 index 00000000..a228e049 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW2_sL1/target.spice @@ -0,0 +1,10 @@ +.subckt C09_sky130_sW2_sL1 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 +XM1 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=16 l=0.3 nf=32 +XM2 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=16 l=0.3 nf=32 +XM3 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=16 l=0.3 nf=32 +XM4 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=16 l=0.3 nf=32 +XM5 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=32 l=0.3 nf=64 +XM6 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=32 l=0.3 nf=64 +XM7 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=32 l=0.3 nf=64 +XM8 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=32 l=0.3 nf=64 +.ends C09_sky130_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C09/sky130/sW2_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW2_sL1/target_lvs.spice new file mode 100644 index 00000000..d6032f2b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW2_sL1/target_lvs.spice @@ -0,0 +1,386 @@ +.subckt C09_sky130_sW2_sL1 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 +XM1_f0 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f1 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f2 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f3 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f4 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f5 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f6 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f7 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f8 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f9 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f10 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f11 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f12 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f13 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f14 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f15 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f16 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f17 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f18 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f19 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f20 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f21 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f22 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f23 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f24 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f25 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f26 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f27 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f28 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f29 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f30 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f31 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f0 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f1 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f2 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f3 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f4 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f5 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f6 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f7 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f8 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f9 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f10 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f11 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f12 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f13 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f14 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f15 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f16 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f17 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f18 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f19 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f20 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f21 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f22 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f23 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f24 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f25 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f26 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f27 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f28 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f29 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f30 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f31 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f0 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f1 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f2 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f3 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f4 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f5 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f6 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f7 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f8 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f9 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f10 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f11 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f12 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f13 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f14 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f15 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f16 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f17 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f18 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f19 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f20 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f21 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f22 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f23 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f24 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f25 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f26 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f27 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f28 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f29 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f30 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f31 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f0 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f1 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f2 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f3 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f4 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f5 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f6 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f7 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f8 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f9 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f10 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f11 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f12 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f13 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f14 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f15 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f16 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f17 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f18 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f19 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f20 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f21 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f22 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f23 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f24 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f25 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f26 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f27 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f28 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f29 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f30 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f31 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f0 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f1 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f2 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f3 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f4 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f5 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f6 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f7 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f8 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f9 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f10 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f11 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f12 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f13 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f14 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f15 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f16 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f17 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f18 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f19 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f20 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f21 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f22 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f23 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f24 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f25 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f26 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f27 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f28 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f29 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f30 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f31 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f32 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f33 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f34 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f35 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f36 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f37 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f38 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f39 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f40 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f41 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f42 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f43 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f44 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f45 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f46 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f47 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f48 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f49 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f50 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f51 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f52 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f53 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f54 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f55 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f56 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f57 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f58 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f59 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f60 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f61 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f62 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f63 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f0 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f1 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f2 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f3 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f4 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f5 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f6 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f7 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f8 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f9 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f10 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f11 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f12 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f13 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f14 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f15 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f16 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f17 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f18 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f19 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f20 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f21 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f22 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f23 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f24 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f25 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f26 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f27 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f28 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f29 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f30 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f31 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f32 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f33 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f34 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f35 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f36 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f37 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f38 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f39 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f40 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f41 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f42 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f43 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f44 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f45 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f46 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f47 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f48 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f49 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f50 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f51 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f52 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f53 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f54 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f55 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f56 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f57 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f58 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f59 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f60 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f61 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f62 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f63 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f0 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f1 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f2 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f3 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f4 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f5 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f6 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f7 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f8 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f9 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f10 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f11 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f12 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f13 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f14 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f15 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f16 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f17 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f18 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f19 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f20 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f21 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f22 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f23 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f24 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f25 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f26 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f27 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f28 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f29 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f30 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f31 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f32 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f33 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f34 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f35 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f36 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f37 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f38 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f39 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f40 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f41 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f42 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f43 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f44 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f45 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f46 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f47 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f48 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f49 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f50 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f51 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f52 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f53 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f54 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f55 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f56 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f57 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f58 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f59 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f60 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f61 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f62 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f63 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f0 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f1 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f2 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f3 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f4 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f5 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f6 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f7 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f8 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f9 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f10 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f11 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f12 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f13 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f14 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f15 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f16 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f17 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f18 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f19 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f20 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f21 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f22 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f23 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f24 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f25 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f26 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f27 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f28 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f29 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f30 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f31 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f32 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f33 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f34 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f35 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f36 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f37 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f38 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f39 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f40 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f41 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f42 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f43 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f44 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f45 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f46 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f47 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f48 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f49 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f50 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f51 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f52 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f53 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f54 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f55 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f56 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f57 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f58 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f59 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f60 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f61 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f62 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f63 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +.ends C09_sky130_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C09/sky130/sW2_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW2_sL1/testbench.spice new file mode 100644 index 00000000..fdda5d65 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW2_sL1/testbench.spice @@ -0,0 +1,42 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 C09_sky130_sW2_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIB1 IB1 VSS 2e-05 +.nodeset v(IB1)=1.26 +XB_VB1 VB1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=16 l=0.3 +IB_VB1 VDDB VB1 4e-05 +XB_GS_M3 GS_M3 GS_M3 VSS VSS sky130_fd_pr__nfet_01v8 w=16 l=0.3 +IB_GS_M3 VDDB GS_M3 1e-05 +XB_GS_M1 GS_M1 GS_M1 VSS VSS sky130_fd_pr__nfet_01v8 w=16 l=0.3 +IB_GS_M1 VDDB GS_M1 1e-05 +B_VCM VCM 0 V = v(VB1) - v(GS_M3) + v(GS_M1) - 0.1 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 0.81 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN2 VCM VINT 0 1 +EIN VIN1 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN2) - v(VIN1) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C09/sky130/sW2_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW2_sL2/case.json new file mode 100644 index 00000000..3924d054 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW2_sL2/case.json @@ -0,0 +1,235 @@ +{ + "case_id": "C09_sky130_sW2_sL2", + "circuit_id": "C09", + "pdk": "sky130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "dut_name": "C09_sky130_sW2_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VB1", + "IB1" + ], + "sizing": { + "M1": { + "w": 16.0, + "l": 0.6, + "nf": 32 + }, + "M2": { + "w": 16.0, + "l": 0.6, + "nf": 32 + }, + "M3": { + "w": 16.0, + "l": 0.6, + "nf": 32 + }, + "M4": { + "w": 16.0, + "l": 0.6, + "nf": 32 + }, + "M5": { + "w": 32.0, + "l": 0.6, + "nf": 64 + }, + "M6": { + "w": 32.0, + "l": 0.6, + "nf": 64 + }, + "M7": { + "w": 32.0, + "l": 0.6, + "nf": 64 + }, + "M8": { + "w": 32.0, + "l": 0.6, + "nf": 64 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 1e-05, + "kind": "cascode" + }, + "IB1": { + "i": 2e-05, + "from": "VSS" + } + }, + "load": { + "vcm": { + "expr": "v(VB1) - gs(M3) + gs(M1) - 0.1", + "currents": { + "M3": 1e-05, + "M1": 1e-05 + } + }, + "CL": 1e-12, + "inv_input": "VIN2", + "vout_target": 0.81 + }, + "category": "ota", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 16.0, + "l": 0.6, + "nf": 32, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 16.0, + "l": 0.6, + "nf": 32, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 16.0, + "l": 0.6, + "nf": 32, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 16.0, + "l": 0.6, + "nf": 32, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.6, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.6, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.6, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.6, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "44fe5f1a66fe9b30", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 1e-05, + "variant": "cascode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/sky130/sW2_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW2_sL2/manifest.json new file mode 100644 index 00000000..94aacf25 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW2_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "b51d164cc261ddac0ddeb86b244ccbae03eddb5319e394a43c3b96a9e743619e", + "qualification.json": "e7717543d1890c90cd2582e41e3c66db967f7b41872cf77a94b3c7bff2fb979f", + "specs.json": "0f0cdcf565b1ff1319725bf90b06e0528dee315fe8e6d8ac7021f75c598b8058", + "target.spice": "c783de48614460b840c75970501db778dee251733679a9da8fb0e26ca9bce9f4", + "target_lvs.spice": "6abcafe8547baa41521e8481831dafe16156a05020ae55e3ffc0649fd9538820", + "testbench.spice": "aa89361bf8dc818e00340798dd06ab6612685a652766a7cf49e0348f19ccb9d0" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/sky130/sW2_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW2_sL2/qualification.json new file mode 100644 index 00000000..90d9c414 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW2_sL2/qualification.json @@ -0,0 +1,161 @@ +{ + "case_id": "C09_sky130_sW2_sL2", + "circuit_id": "C09", + "pdk": "sky130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "ota", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 16.0, + "l": 0.6, + "nf": 32, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 16.0, + "l": 0.6, + "nf": 32, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 16.0, + "l": 0.6, + "nf": 32, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 16.0, + "l": 0.6, + "nf": 32, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.6, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.6, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.6, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.6, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "44fe5f1a66fe9b30", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "gain_lf=27.56 below floor 35", + "ugf=5.326e+05 below floor 2e+06" + ], + "spec": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 27.55868, + "ugf": 532603.2 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 10.5, + "schematic_measures": { + "vout0": 0.809976, + "idd": 1.999897e-05, + "vos": -0.222959, + "gain_lf": 27.55868, + "ph_lf": 0.176519, + "ugf": 532603.2, + "ph_ugf": -85.61201, + "f3db": 22222.56, + "pm": 94.211471 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/sky130/sW2_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW2_sL2/specs.json new file mode 100644 index 00000000..ba831e7f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW2_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 27.55868, + "ugf": 532603.2 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C09/sky130/sW2_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW2_sL2/target.spice new file mode 100644 index 00000000..28f83232 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW2_sL2/target.spice @@ -0,0 +1,10 @@ +.subckt C09_sky130_sW2_sL2 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 +XM1 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=16 l=0.6 nf=32 +XM2 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=16 l=0.6 nf=32 +XM3 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=16 l=0.6 nf=32 +XM4 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=16 l=0.6 nf=32 +XM5 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=32 l=0.6 nf=64 +XM6 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=32 l=0.6 nf=64 +XM7 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=32 l=0.6 nf=64 +XM8 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=32 l=0.6 nf=64 +.ends C09_sky130_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C09/sky130/sW2_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW2_sL2/target_lvs.spice new file mode 100644 index 00000000..2c537c5b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW2_sL2/target_lvs.spice @@ -0,0 +1,386 @@ +.subckt C09_sky130_sW2_sL2 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 +XM1_f0 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f1 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f2 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f3 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f4 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f5 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f6 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f7 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f8 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f9 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f10 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f11 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f12 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f13 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f14 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f15 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f16 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f17 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f18 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f19 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f20 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f21 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f22 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f23 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f24 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f25 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f26 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f27 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f28 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f29 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f30 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f31 net018 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f0 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f1 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f2 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f3 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f4 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f5 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f6 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f7 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f8 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f9 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f10 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f11 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f12 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f13 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f14 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f15 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f16 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f17 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f18 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f19 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f20 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f21 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f22 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f23 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f24 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f25 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f26 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f27 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f28 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f29 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f30 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f31 net016 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f0 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f1 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f2 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f3 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f4 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f5 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f6 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f7 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f8 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f9 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f10 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f11 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f12 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f13 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f14 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f15 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f16 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f17 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f18 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f19 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f20 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f21 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f22 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f23 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f24 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f25 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f26 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f27 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f28 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f29 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f30 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f31 net04 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f0 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f1 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f2 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f3 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f4 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f5 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f6 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f7 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f8 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f9 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f10 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f11 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f12 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f13 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f14 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f15 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f16 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f17 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f18 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f19 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f20 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f21 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f22 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f23 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f24 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f25 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f26 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f27 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f28 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f29 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f30 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f31 VOUT1 VB1 net016 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f0 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f1 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f2 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f3 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f4 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f5 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f6 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f7 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f8 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f9 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f10 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f11 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f12 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f13 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f14 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f15 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f16 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f17 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f18 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f19 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f20 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f21 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f22 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f23 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f24 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f25 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f26 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f27 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f28 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f29 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f30 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f31 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f32 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f33 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f34 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f35 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f36 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f37 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f38 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f39 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f40 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f41 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f42 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f43 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f44 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f45 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f46 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f47 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f48 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f49 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f50 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f51 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f52 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f53 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f54 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f55 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f56 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f57 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f58 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f59 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f60 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f61 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f62 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f63 net04 net04 net019 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f0 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f1 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f2 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f3 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f4 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f5 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f6 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f7 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f8 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f9 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f10 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f11 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f12 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f13 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f14 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f15 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f16 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f17 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f18 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f19 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f20 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f21 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f22 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f23 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f24 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f25 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f26 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f27 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f28 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f29 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f30 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f31 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f32 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f33 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f34 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f35 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f36 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f37 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f38 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f39 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f40 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f41 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f42 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f43 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f44 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f45 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f46 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f47 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f48 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f49 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f50 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f51 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f52 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f53 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f54 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f55 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f56 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f57 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f58 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f59 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f60 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f61 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f62 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f63 VOUT1 net04 net017 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f0 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f1 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f2 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f3 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f4 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f5 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f6 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f7 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f8 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f9 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f10 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f11 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f12 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f13 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f14 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f15 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f16 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f17 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f18 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f19 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f20 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f21 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f22 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f23 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f24 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f25 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f26 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f27 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f28 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f29 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f30 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f31 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f32 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f33 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f34 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f35 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f36 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f37 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f38 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f39 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f40 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f41 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f42 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f43 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f44 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f45 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f46 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f47 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f48 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f49 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f50 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f51 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f52 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f53 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f54 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f55 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f56 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f57 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f58 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f59 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f60 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f61 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f62 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f63 net019 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f0 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f1 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f2 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f3 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f4 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f5 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f6 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f7 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f8 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f9 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f10 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f11 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f12 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f13 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f14 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f15 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f16 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f17 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f18 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f19 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f20 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f21 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f22 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f23 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f24 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f25 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f26 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f27 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f28 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f29 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f30 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f31 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f32 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f33 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f34 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f35 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f36 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f37 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f38 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f39 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f40 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f41 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f42 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f43 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f44 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f45 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f46 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f47 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f48 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f49 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f50 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f51 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f52 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f53 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f54 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f55 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f56 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f57 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f58 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f59 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f60 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f61 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f62 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f63 net017 net019 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +.ends C09_sky130_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C09/sky130/sW2_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW2_sL2/testbench.spice new file mode 100644 index 00000000..843b1521 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C09/sky130/sW2_sL2/testbench.spice @@ -0,0 +1,42 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VB1 IB1 C09_sky130_sW2_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIB1 IB1 VSS 2e-05 +.nodeset v(IB1)=1.26 +XB_VB1 VB1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=16 l=0.6 +IB_VB1 VDDB VB1 4e-05 +XB_GS_M3 GS_M3 GS_M3 VSS VSS sky130_fd_pr__nfet_01v8 w=16 l=0.6 +IB_GS_M3 VDDB GS_M3 1e-05 +XB_GS_M1 GS_M1 GS_M1 VSS VSS sky130_fd_pr__nfet_01v8 w=16 l=0.6 +IB_GS_M1 VDDB GS_M1 1e-05 +B_VCM VCM 0 V = v(VB1) - v(GS_M3) + v(GS_M1) - 0.1 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 0.81 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN2 VCM VINT 0 1 +EIN VIN1 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN2) - v(VIN1) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C10/gf180/sW0.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW0.5_sL1.5/case.json new file mode 100644 index 00000000..d4464bbc --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW0.5_sL1.5/case.json @@ -0,0 +1,303 @@ +{ + "case_id": "C10_gf180_sW0.5_sL1.5", + "circuit_id": "C10", + "pdk": "gf180", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "dut_name": "C10_gf180_sW0.5_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1", + "VB2", + "VB3", + "VB4", + "IB1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.84, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 0.84, + "nf": 4 + }, + "M3": { + "w": 2.0, + "l": 0.84, + "nf": 4 + }, + "M4": { + "w": 2.0, + "l": 0.84, + "nf": 4 + }, + "M5": { + "w": 2.0, + "l": 0.84, + "nf": 4 + }, + "M6": { + "w": 2.0, + "l": 0.84, + "nf": 4 + }, + "M7": { + "w": 2.0, + "l": 0.84, + "nf": 4 + }, + "M8": { + "w": 2.0, + "l": 0.84, + "nf": 4 + }, + "M9": { + "w": 2.0, + "l": 0.84, + "nf": 4 + }, + "M10": { + "w": 2.0, + "l": 0.84, + "nf": 4 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M5", + "current": 2e-05, + "kind": "cascode3" + }, + "VB2": { + "replica": "M7", + "current": 2e-05, + "kind": "cascode3" + }, + "VB3": { + "replica": "M9", + "current": 2e-05 + }, + "VB4": { + "replica": "M3", + "current": 4e-05 + }, + "IB1": { + "i": 4e-05, + "from": "VDD" + } + }, + "load": { + "vcm": 1.5, + "CL": 5e-13, + "cmfb_gain": 20.0, + "vocm": 1.65 + }, + "category": "ota_fd", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M9": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M10": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "0b47d0bba5d70315", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M5", + "current_A": 2e-05, + "variant": "cascode3" + }, + { + "kind": "replica_bias", + "port": "VB2", + "replica_of": "M7", + "current_A": 2e-05, + "variant": "cascode3" + }, + { + "kind": "replica_bias", + "port": "VB3", + "replica_of": "M9", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "replica_bias", + "port": "VB4", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VDD" + }, + { + "kind": "testbench_element", + "what": "ideal common-mode feedback on VB4" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8", + "M9", + "M10" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/gf180/sW0.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW0.5_sL1.5/manifest.json new file mode 100644 index 00000000..d5c16585 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW0.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "5b16faaef60631971062edd4fed1056abea1792df6853faeb905f03bab0c4db1", + "qualification.json": "a2d429169b1c9f22c662d9f6d0b43ef18b5e2638938a12401c1b3680835eecc1", + "specs.json": "f58bfcf641bb8253cc956a9bd58b42fb69c4438b24a42fb5a1943d2a2b094e51", + "target.spice": "44278b927f0990f82be70b2aab057f6bea1e577f547ff6ad5ad60f0ffceeb890", + "target_lvs.spice": "861229b03e77240f2dc3a5a36e688a4b682270b317b6eff2c73bfa3f80311d05", + "testbench.spice": "70255b4bcd6fc5e46d01de4f011d393ad4f7fb9accee0c1bd45f383a7680cb78" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/gf180/sW0.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW0.5_sL1.5/qualification.json new file mode 100644 index 00000000..25f46fae --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW0.5_sL1.5/qualification.json @@ -0,0 +1,180 @@ +{ + "case_id": "C10_gf180_sW0.5_sL1.5", + "circuit_id": "C10", + "pdk": "gf180", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "ota_fd", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M9": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M10": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "0b47d0bba5d70315", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 41.19 + }, + "ugf": { + "min": 8907000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 44.18703, + "ugf": 14845750.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vo1": 1.650454, + "vo2": 1.650454, + "idd": 8.02609e-05, + "vos_in": -7.27596e-12, + "gain_lf": 44.18703, + "ugf": 14845750.0, + "f3db": 91314.97 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/gf180/sW0.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW0.5_sL1.5/specs.json new file mode 100644 index 00000000..adfb63bb --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW0.5_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 41.19 + }, + "ugf": { + "min": 8907000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 44.18703, + "ugf": 14845750.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/gf180/sW0.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW0.5_sL1.5/target.spice new file mode 100644 index 00000000..22c45669 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW0.5_sL1.5/target.spice @@ -0,0 +1,12 @@ +.subckt C10_gf180_sW0.5_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 +MM1 net022 VIN1 IB1 VDD pfet_03v3 w=2u l=0.84u nf=4 m=1 +MM2 net018 VIN2 IB1 VDD pfet_03v3 w=2u l=0.84u nf=4 m=1 +MM3 net022 VB4 VSS VSS nfet_03v3 w=2u l=0.84u nf=4 m=1 +MM4 net018 VB4 VSS VSS nfet_03v3 w=2u l=0.84u nf=4 m=1 +MM5 VOUT1 VB1 net022 VSS nfet_03v3 w=2u l=0.84u nf=4 m=1 +MM6 VOUT2 VB1 net018 VSS nfet_03v3 w=2u l=0.84u nf=4 m=1 +MM7 VOUT1 VB2 net023 VDD pfet_03v3 w=2u l=0.84u nf=4 m=1 +MM8 VOUT2 VB2 net021 VDD pfet_03v3 w=2u l=0.84u nf=4 m=1 +MM9 net023 VB3 VDD VDD pfet_03v3 w=2u l=0.84u nf=4 m=1 +MM10 net021 VB3 VDD VDD pfet_03v3 w=2u l=0.84u nf=4 m=1 +.ends C10_gf180_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C10/gf180/sW0.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW0.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..91e62d06 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW0.5_sL1.5/target_lvs.spice @@ -0,0 +1,42 @@ +.subckt C10_gf180_sW0.5_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 +MM1_f0 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=0.84u +MM1_f1 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=0.84u +MM1_f2 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=0.84u +MM1_f3 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=0.84u +MM2_f0 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=0.84u +MM2_f1 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=0.84u +MM2_f2 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=0.84u +MM2_f3 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=0.84u +MM3_f0 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f1 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f2 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f3 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM4_f0 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM4_f1 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM4_f2 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM4_f3 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM5_f0 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f1 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f2 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f3 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=0.84u +MM6_f0 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=0.84u +MM6_f1 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=0.84u +MM6_f2 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=0.84u +MM6_f3 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=0.84u +MM7_f0 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=0.84u +MM7_f1 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=0.84u +MM7_f2 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=0.84u +MM7_f3 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=0.84u +MM8_f0 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=0.84u +MM8_f1 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=0.84u +MM8_f2 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=0.84u +MM8_f3 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=0.84u +MM9_f0 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM9_f1 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM9_f2 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM9_f3 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM10_f0 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM10_f1 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM10_f2 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM10_f3 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +.ends C10_gf180_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C10/gf180/sW0.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW0.5_sL1.5/testbench.spice new file mode 100644 index 00000000..c5f33f22 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW0.5_sL1.5/testbench.spice @@ -0,0 +1,48 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 C10_gf180_sW0.5_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIB1 VDD IB1 4e-05 +.nodeset v(IB1)=0.99 +MB_VB1 VB1 VB1 VSS VSS nfet_03v3 w=2u l=0.84u +IB_VB1 VDDB VB1 0.00018 +MB_VB2 VB2 VB2 VDDB VDDB pfet_03v3 w=2u l=0.84u +IB_VB2 VB2 VSS 0.00018 +MB_VB3 VB3 VB3 VDDB VDDB pfet_03v3 w=2u l=0.84u +IB_VB3 VB3 VSS 2e-05 +MB_VB4n VB4n VB4n VSS VSS nfet_03v3 w=2u l=0.84u +IB_VB4n VDDB VB4n 4e-05 +VCM VCM 0 1.5 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 5e-13 +CL2 VOUT2 0 5e-13 +BCMFB VB4 0 V = v(VB4n) + 20*((v(VOUT1)+v(VOUT2))/2 - 1.65) +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +meas ac ugf when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C10/gf180/sW0.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW0.5_sL1/case.json new file mode 100644 index 00000000..1cf47897 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW0.5_sL1/case.json @@ -0,0 +1,303 @@ +{ + "case_id": "C10_gf180_sW0.5_sL1", + "circuit_id": "C10", + "pdk": "gf180", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "dut_name": "C10_gf180_sW0.5_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1", + "VB2", + "VB3", + "VB4", + "IB1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.56, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 0.56, + "nf": 4 + }, + "M3": { + "w": 2.0, + "l": 0.56, + "nf": 4 + }, + "M4": { + "w": 2.0, + "l": 0.56, + "nf": 4 + }, + "M5": { + "w": 2.0, + "l": 0.56, + "nf": 4 + }, + "M6": { + "w": 2.0, + "l": 0.56, + "nf": 4 + }, + "M7": { + "w": 2.0, + "l": 0.56, + "nf": 4 + }, + "M8": { + "w": 2.0, + "l": 0.56, + "nf": 4 + }, + "M9": { + "w": 2.0, + "l": 0.56, + "nf": 4 + }, + "M10": { + "w": 2.0, + "l": 0.56, + "nf": 4 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M5", + "current": 2e-05, + "kind": "cascode3" + }, + "VB2": { + "replica": "M7", + "current": 2e-05, + "kind": "cascode3" + }, + "VB3": { + "replica": "M9", + "current": 2e-05 + }, + "VB4": { + "replica": "M3", + "current": 4e-05 + }, + "IB1": { + "i": 4e-05, + "from": "VDD" + } + }, + "load": { + "vcm": 1.5, + "CL": 5e-13, + "cmfb_gain": 20.0, + "vocm": 1.65 + }, + "category": "ota_fd", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M9": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M10": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "f8150c9844f1b633", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M5", + "current_A": 2e-05, + "variant": "cascode3" + }, + { + "kind": "replica_bias", + "port": "VB2", + "replica_of": "M7", + "current_A": 2e-05, + "variant": "cascode3" + }, + { + "kind": "replica_bias", + "port": "VB3", + "replica_of": "M9", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "replica_bias", + "port": "VB4", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VDD" + }, + { + "kind": "testbench_element", + "what": "ideal common-mode feedback on VB4" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8", + "M9", + "M10" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/gf180/sW0.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW0.5_sL1/manifest.json new file mode 100644 index 00000000..e1fea4b5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW0.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "247df28df85738f54b3bd67442bb5379515701db963ef7ad9cf6c1ea2e6803db", + "qualification.json": "ef7d50412d360cbbaaa2274fca7f41036cb4f56f724c86274a52c4b2191ea1eb", + "specs.json": "c1223bc59e96e7e5b37c899178ae537749ff7c63c17c216f056adfe1df887326", + "target.spice": "0a407a3f9b1cebc773736e42cd5bf5fa1cb8314c8822c3bc0155857751ac288d", + "target_lvs.spice": "90fe4599c52331aec4bd3e7c51d89b14a3b5694ca9cd16c1af1f35bdcf3dcb7e", + "testbench.spice": "56834af8e830a6fe6e029e57959725a7ca2888434c2abc92d0c2c86f2832bca6" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/gf180/sW0.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW0.5_sL1/qualification.json new file mode 100644 index 00000000..7c50eb3f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW0.5_sL1/qualification.json @@ -0,0 +1,180 @@ +{ + "case_id": "C10_gf180_sW0.5_sL1", + "circuit_id": "C10", + "pdk": "gf180", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "ota_fd", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M9": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M10": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "f8150c9844f1b633", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 52.01 + }, + "ugf": { + "min": 11340000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 55.00841, + "ugf": 18895170.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vo1": 1.649936, + "vo2": 1.649936, + "idd": 8.00532e-05, + "vos_in": 0.0, + "gain_lf": 55.00841, + "ugf": 18895170.0, + "f3db": 33435.54 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/gf180/sW0.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW0.5_sL1/specs.json new file mode 100644 index 00000000..37db5439 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW0.5_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 52.01 + }, + "ugf": { + "min": 11340000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 55.00841, + "ugf": 18895170.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/gf180/sW0.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW0.5_sL1/target.spice new file mode 100644 index 00000000..3f6acd83 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW0.5_sL1/target.spice @@ -0,0 +1,12 @@ +.subckt C10_gf180_sW0.5_sL1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 +MM1 net022 VIN1 IB1 VDD pfet_03v3 w=2u l=0.56u nf=4 m=1 +MM2 net018 VIN2 IB1 VDD pfet_03v3 w=2u l=0.56u nf=4 m=1 +MM3 net022 VB4 VSS VSS nfet_03v3 w=2u l=0.56u nf=4 m=1 +MM4 net018 VB4 VSS VSS nfet_03v3 w=2u l=0.56u nf=4 m=1 +MM5 VOUT1 VB1 net022 VSS nfet_03v3 w=2u l=0.56u nf=4 m=1 +MM6 VOUT2 VB1 net018 VSS nfet_03v3 w=2u l=0.56u nf=4 m=1 +MM7 VOUT1 VB2 net023 VDD pfet_03v3 w=2u l=0.56u nf=4 m=1 +MM8 VOUT2 VB2 net021 VDD pfet_03v3 w=2u l=0.56u nf=4 m=1 +MM9 net023 VB3 VDD VDD pfet_03v3 w=2u l=0.56u nf=4 m=1 +MM10 net021 VB3 VDD VDD pfet_03v3 w=2u l=0.56u nf=4 m=1 +.ends C10_gf180_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C10/gf180/sW0.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW0.5_sL1/target_lvs.spice new file mode 100644 index 00000000..6205c515 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW0.5_sL1/target_lvs.spice @@ -0,0 +1,42 @@ +.subckt C10_gf180_sW0.5_sL1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 +MM1_f0 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=0.56u +MM1_f1 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=0.56u +MM1_f2 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=0.56u +MM1_f3 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=0.56u +MM2_f0 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=0.56u +MM2_f1 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=0.56u +MM2_f2 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=0.56u +MM2_f3 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=0.56u +MM3_f0 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f1 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f2 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f3 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM4_f0 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM4_f1 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM4_f2 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM4_f3 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM5_f0 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f1 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f2 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f3 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=0.56u +MM6_f0 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=0.56u +MM6_f1 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=0.56u +MM6_f2 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=0.56u +MM6_f3 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=0.56u +MM7_f0 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=0.56u +MM7_f1 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=0.56u +MM7_f2 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=0.56u +MM7_f3 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=0.56u +MM8_f0 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=0.56u +MM8_f1 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=0.56u +MM8_f2 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=0.56u +MM8_f3 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=0.56u +MM9_f0 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM9_f1 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM9_f2 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM9_f3 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM10_f0 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM10_f1 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM10_f2 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM10_f3 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +.ends C10_gf180_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C10/gf180/sW0.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW0.5_sL1/testbench.spice new file mode 100644 index 00000000..c8337dca --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW0.5_sL1/testbench.spice @@ -0,0 +1,48 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 C10_gf180_sW0.5_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIB1 VDD IB1 4e-05 +.nodeset v(IB1)=0.99 +MB_VB1 VB1 VB1 VSS VSS nfet_03v3 w=2u l=0.56u +IB_VB1 VDDB VB1 0.00018 +MB_VB2 VB2 VB2 VDDB VDDB pfet_03v3 w=2u l=0.56u +IB_VB2 VB2 VSS 0.00018 +MB_VB3 VB3 VB3 VDDB VDDB pfet_03v3 w=2u l=0.56u +IB_VB3 VB3 VSS 2e-05 +MB_VB4n VB4n VB4n VSS VSS nfet_03v3 w=2u l=0.56u +IB_VB4n VDDB VB4n 4e-05 +VCM VCM 0 1.5 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 5e-13 +CL2 VOUT2 0 5e-13 +BCMFB VB4 0 V = v(VB4n) + 20*((v(VOUT1)+v(VOUT2))/2 - 1.65) +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +meas ac ugf when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C10/gf180/sW0.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW0.5_sL2/case.json new file mode 100644 index 00000000..0e4b0cf3 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW0.5_sL2/case.json @@ -0,0 +1,303 @@ +{ + "case_id": "C10_gf180_sW0.5_sL2", + "circuit_id": "C10", + "pdk": "gf180", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "dut_name": "C10_gf180_sW0.5_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1", + "VB2", + "VB3", + "VB4", + "IB1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 1.12, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 1.12, + "nf": 4 + }, + "M3": { + "w": 2.0, + "l": 1.12, + "nf": 4 + }, + "M4": { + "w": 2.0, + "l": 1.12, + "nf": 4 + }, + "M5": { + "w": 2.0, + "l": 1.12, + "nf": 4 + }, + "M6": { + "w": 2.0, + "l": 1.12, + "nf": 4 + }, + "M7": { + "w": 2.0, + "l": 1.12, + "nf": 4 + }, + "M8": { + "w": 2.0, + "l": 1.12, + "nf": 4 + }, + "M9": { + "w": 2.0, + "l": 1.12, + "nf": 4 + }, + "M10": { + "w": 2.0, + "l": 1.12, + "nf": 4 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M5", + "current": 2e-05, + "kind": "cascode3" + }, + "VB2": { + "replica": "M7", + "current": 2e-05, + "kind": "cascode3" + }, + "VB3": { + "replica": "M9", + "current": 2e-05 + }, + "VB4": { + "replica": "M3", + "current": 4e-05 + }, + "IB1": { + "i": 4e-05, + "from": "VDD" + } + }, + "load": { + "vcm": 1.5, + "CL": 5e-13, + "cmfb_gain": 20.0, + "vocm": 1.65 + }, + "category": "ota_fd", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M9": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M10": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "19c99fdac3b5d49f", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M5", + "current_A": 2e-05, + "variant": "cascode3" + }, + { + "kind": "replica_bias", + "port": "VB2", + "replica_of": "M7", + "current_A": 2e-05, + "variant": "cascode3" + }, + { + "kind": "replica_bias", + "port": "VB3", + "replica_of": "M9", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "replica_bias", + "port": "VB4", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VDD" + }, + { + "kind": "testbench_element", + "what": "ideal common-mode feedback on VB4" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8", + "M9", + "M10" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/gf180/sW0.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW0.5_sL2/manifest.json new file mode 100644 index 00000000..a671c0ae --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW0.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "758d5465aedea444d5f20adddf7cb4742b38b1e67f967ddd24a39c3186cb1dc3", + "qualification.json": "2a66b8bb3269c47f47884e4c95b4e14d682b4b22f4cc4887933796a9ac35f5e9", + "specs.json": "35b2e45e78a9ef9141fc046ea7f2aff54c256dd421bc12ae43fb55aa5a034b53", + "target.spice": "a66803cc7eef4971f1c861d38dcffdd0b0ebe13ba56769c38dae6ef5f2858ff0", + "target_lvs.spice": "784a62c8c58675b98afff56c0970d134fa819ae22539d7580bc05f36b5be80a6", + "testbench.spice": "95cf1a3f0c6b679c8d1c26c86393d7d7963c70940b98204edf382a4f1a8f99a0" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/gf180/sW0.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW0.5_sL2/qualification.json new file mode 100644 index 00000000..9f07ffec --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW0.5_sL2/qualification.json @@ -0,0 +1,180 @@ +{ + "case_id": "C10_gf180_sW0.5_sL2", + "circuit_id": "C10", + "pdk": "gf180", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "ota_fd", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M9": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M10": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "19c99fdac3b5d49f", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 39.36 + }, + "ugf": { + "min": 7541000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 42.36428, + "ugf": 12568580.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vo1": 1.650831, + "vo2": 1.650831, + "idd": 8.050033e-05, + "vos_in": -3.63798e-12, + "gain_lf": 42.36428, + "ugf": 12568580.0, + "f3db": 95502.18 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/gf180/sW0.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW0.5_sL2/specs.json new file mode 100644 index 00000000..6268dc16 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW0.5_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 39.36 + }, + "ugf": { + "min": 7541000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 42.36428, + "ugf": 12568580.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/gf180/sW0.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW0.5_sL2/target.spice new file mode 100644 index 00000000..eab4f250 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW0.5_sL2/target.spice @@ -0,0 +1,12 @@ +.subckt C10_gf180_sW0.5_sL2 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 +MM1 net022 VIN1 IB1 VDD pfet_03v3 w=2u l=1.12u nf=4 m=1 +MM2 net018 VIN2 IB1 VDD pfet_03v3 w=2u l=1.12u nf=4 m=1 +MM3 net022 VB4 VSS VSS nfet_03v3 w=2u l=1.12u nf=4 m=1 +MM4 net018 VB4 VSS VSS nfet_03v3 w=2u l=1.12u nf=4 m=1 +MM5 VOUT1 VB1 net022 VSS nfet_03v3 w=2u l=1.12u nf=4 m=1 +MM6 VOUT2 VB1 net018 VSS nfet_03v3 w=2u l=1.12u nf=4 m=1 +MM7 VOUT1 VB2 net023 VDD pfet_03v3 w=2u l=1.12u nf=4 m=1 +MM8 VOUT2 VB2 net021 VDD pfet_03v3 w=2u l=1.12u nf=4 m=1 +MM9 net023 VB3 VDD VDD pfet_03v3 w=2u l=1.12u nf=4 m=1 +MM10 net021 VB3 VDD VDD pfet_03v3 w=2u l=1.12u nf=4 m=1 +.ends C10_gf180_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C10/gf180/sW0.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW0.5_sL2/target_lvs.spice new file mode 100644 index 00000000..f9e50e64 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW0.5_sL2/target_lvs.spice @@ -0,0 +1,42 @@ +.subckt C10_gf180_sW0.5_sL2 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 +MM1_f0 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=1.12u +MM1_f1 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=1.12u +MM1_f2 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=1.12u +MM1_f3 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=1.12u +MM2_f0 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=1.12u +MM2_f1 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=1.12u +MM2_f2 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=1.12u +MM2_f3 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=1.12u +MM3_f0 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f1 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f2 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f3 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM4_f0 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM4_f1 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM4_f2 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM4_f3 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM5_f0 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f1 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f2 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f3 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=1.12u +MM6_f0 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=1.12u +MM6_f1 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=1.12u +MM6_f2 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=1.12u +MM6_f3 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=1.12u +MM7_f0 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=1.12u +MM7_f1 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=1.12u +MM7_f2 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=1.12u +MM7_f3 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=1.12u +MM8_f0 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=1.12u +MM8_f1 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=1.12u +MM8_f2 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=1.12u +MM8_f3 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=1.12u +MM9_f0 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM9_f1 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM9_f2 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM9_f3 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM10_f0 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM10_f1 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM10_f2 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM10_f3 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +.ends C10_gf180_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C10/gf180/sW0.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW0.5_sL2/testbench.spice new file mode 100644 index 00000000..9d3624f3 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW0.5_sL2/testbench.spice @@ -0,0 +1,48 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 C10_gf180_sW0.5_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIB1 VDD IB1 4e-05 +.nodeset v(IB1)=0.99 +MB_VB1 VB1 VB1 VSS VSS nfet_03v3 w=2u l=1.12u +IB_VB1 VDDB VB1 0.00018 +MB_VB2 VB2 VB2 VDDB VDDB pfet_03v3 w=2u l=1.12u +IB_VB2 VB2 VSS 0.00018 +MB_VB3 VB3 VB3 VDDB VDDB pfet_03v3 w=2u l=1.12u +IB_VB3 VB3 VSS 2e-05 +MB_VB4n VB4n VB4n VSS VSS nfet_03v3 w=2u l=1.12u +IB_VB4n VDDB VB4n 4e-05 +VCM VCM 0 1.5 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 5e-13 +CL2 VOUT2 0 5e-13 +BCMFB VB4 0 V = v(VB4n) + 20*((v(VOUT1)+v(VOUT2))/2 - 1.65) +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +meas ac ugf when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1.5_sL1.5/case.json new file mode 100644 index 00000000..402793c1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1.5_sL1.5/case.json @@ -0,0 +1,303 @@ +{ + "case_id": "C10_gf180_sW1.5_sL1.5", + "circuit_id": "C10", + "pdk": "gf180", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "dut_name": "C10_gf180_sW1.5_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1", + "VB2", + "VB3", + "VB4", + "IB1" + ], + "sizing": { + "M1": { + "w": 6.0, + "l": 0.84, + "nf": 12 + }, + "M2": { + "w": 6.0, + "l": 0.84, + "nf": 12 + }, + "M3": { + "w": 6.0, + "l": 0.84, + "nf": 12 + }, + "M4": { + "w": 6.0, + "l": 0.84, + "nf": 12 + }, + "M5": { + "w": 6.0, + "l": 0.84, + "nf": 12 + }, + "M6": { + "w": 6.0, + "l": 0.84, + "nf": 12 + }, + "M7": { + "w": 6.0, + "l": 0.84, + "nf": 12 + }, + "M8": { + "w": 6.0, + "l": 0.84, + "nf": 12 + }, + "M9": { + "w": 6.0, + "l": 0.84, + "nf": 12 + }, + "M10": { + "w": 6.0, + "l": 0.84, + "nf": 12 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M5", + "current": 2e-05, + "kind": "cascode3" + }, + "VB2": { + "replica": "M7", + "current": 2e-05, + "kind": "cascode3" + }, + "VB3": { + "replica": "M9", + "current": 2e-05 + }, + "VB4": { + "replica": "M3", + "current": 4e-05 + }, + "IB1": { + "i": 4e-05, + "from": "VDD" + } + }, + "load": { + "vcm": 1.5, + "CL": 5e-13, + "cmfb_gain": 20.0, + "vocm": 1.65 + }, + "category": "ota_fd", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M9": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M10": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "24c456bcb054a1a9", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M5", + "current_A": 2e-05, + "variant": "cascode3" + }, + { + "kind": "replica_bias", + "port": "VB2", + "replica_of": "M7", + "current_A": 2e-05, + "variant": "cascode3" + }, + { + "kind": "replica_bias", + "port": "VB3", + "replica_of": "M9", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "replica_bias", + "port": "VB4", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VDD" + }, + { + "kind": "testbench_element", + "what": "ideal common-mode feedback on VB4" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8", + "M9", + "M10" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1.5_sL1.5/manifest.json new file mode 100644 index 00000000..82c7959f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "13995da7cbe2e684e0c46eb491f3fcb5d794ee9aaf8a21e6f683a9fd2c399ff9", + "qualification.json": "0bf1d7291e3bc71bfcae6d260593e87e4b571807c4df9e3aada03d484e55cbcd", + "specs.json": "4d0852fb9f186f3a2ffd7ff1085e83be0a64bd5d814a0a0720233c37216cb72e", + "target.spice": "6968ac2c82987cd5221604a148eef8c75dd5ab1b261e141a0c8766696e362e91", + "target_lvs.spice": "dc1a5af95086fa8020a1478b91a75ab6ff93bceac2d889c3e174bb5e4d81afbe", + "testbench.spice": "d747c3ccaa376e425ffefbcb3d4899727da78e00848a3c2c3d4400c32dfed60a" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1.5_sL1.5/qualification.json new file mode 100644 index 00000000..cb2b1ae2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1.5_sL1.5/qualification.json @@ -0,0 +1,180 @@ +{ + "case_id": "C10_gf180_sW1.5_sL1.5", + "circuit_id": "C10", + "pdk": "gf180", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "ota_fd", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M9": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M10": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "24c456bcb054a1a9", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 66.04 + }, + "ugf": { + "min": 15900000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 69.04331, + "ugf": 26497430.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.2, + "schematic_measures": { + "vo1": 1.650297, + "vo2": 1.650297, + "idd": 7.965916e-05, + "vos_in": 0.0, + "gain_lf": 69.04331, + "ugf": 26497430.0, + "f3db": 9329.025 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1.5_sL1.5/specs.json new file mode 100644 index 00000000..8e07393c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1.5_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 66.04 + }, + "ugf": { + "min": 15900000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 69.04331, + "ugf": 26497430.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1.5_sL1.5/target.spice new file mode 100644 index 00000000..adfa8ceb --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1.5_sL1.5/target.spice @@ -0,0 +1,12 @@ +.subckt C10_gf180_sW1.5_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 +MM1 net022 VIN1 IB1 VDD pfet_03v3 w=6u l=0.84u nf=12 m=1 +MM2 net018 VIN2 IB1 VDD pfet_03v3 w=6u l=0.84u nf=12 m=1 +MM3 net022 VB4 VSS VSS nfet_03v3 w=6u l=0.84u nf=12 m=1 +MM4 net018 VB4 VSS VSS nfet_03v3 w=6u l=0.84u nf=12 m=1 +MM5 VOUT1 VB1 net022 VSS nfet_03v3 w=6u l=0.84u nf=12 m=1 +MM6 VOUT2 VB1 net018 VSS nfet_03v3 w=6u l=0.84u nf=12 m=1 +MM7 VOUT1 VB2 net023 VDD pfet_03v3 w=6u l=0.84u nf=12 m=1 +MM8 VOUT2 VB2 net021 VDD pfet_03v3 w=6u l=0.84u nf=12 m=1 +MM9 net023 VB3 VDD VDD pfet_03v3 w=6u l=0.84u nf=12 m=1 +MM10 net021 VB3 VDD VDD pfet_03v3 w=6u l=0.84u nf=12 m=1 +.ends C10_gf180_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..500eaa59 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1.5_sL1.5/target_lvs.spice @@ -0,0 +1,122 @@ +.subckt C10_gf180_sW1.5_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 +MM1_f0 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=0.84u +MM1_f1 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=0.84u +MM1_f2 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=0.84u +MM1_f3 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=0.84u +MM1_f4 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=0.84u +MM1_f5 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=0.84u +MM1_f6 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=0.84u +MM1_f7 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=0.84u +MM1_f8 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=0.84u +MM1_f9 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=0.84u +MM1_f10 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=0.84u +MM1_f11 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=0.84u +MM2_f0 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=0.84u +MM2_f1 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=0.84u +MM2_f2 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=0.84u +MM2_f3 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=0.84u +MM2_f4 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=0.84u +MM2_f5 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=0.84u +MM2_f6 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=0.84u +MM2_f7 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=0.84u +MM2_f8 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=0.84u +MM2_f9 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=0.84u +MM2_f10 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=0.84u +MM2_f11 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=0.84u +MM3_f0 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f1 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f2 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f3 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f4 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f5 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f6 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f7 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f8 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f9 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f10 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f11 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM4_f0 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM4_f1 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM4_f2 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM4_f3 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM4_f4 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM4_f5 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM4_f6 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM4_f7 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM4_f8 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM4_f9 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM4_f10 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM4_f11 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM5_f0 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f1 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f2 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f3 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f4 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f5 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f6 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f7 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f8 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f9 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f10 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f11 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=0.84u +MM6_f0 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=0.84u +MM6_f1 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=0.84u +MM6_f2 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=0.84u +MM6_f3 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=0.84u +MM6_f4 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=0.84u +MM6_f5 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=0.84u +MM6_f6 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=0.84u +MM6_f7 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=0.84u +MM6_f8 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=0.84u +MM6_f9 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=0.84u +MM6_f10 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=0.84u +MM6_f11 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=0.84u +MM7_f0 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=0.84u +MM7_f1 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=0.84u +MM7_f2 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=0.84u +MM7_f3 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=0.84u +MM7_f4 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=0.84u +MM7_f5 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=0.84u +MM7_f6 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=0.84u +MM7_f7 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=0.84u +MM7_f8 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=0.84u +MM7_f9 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=0.84u +MM7_f10 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=0.84u +MM7_f11 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=0.84u +MM8_f0 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=0.84u +MM8_f1 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=0.84u +MM8_f2 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=0.84u +MM8_f3 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=0.84u +MM8_f4 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=0.84u +MM8_f5 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=0.84u +MM8_f6 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=0.84u +MM8_f7 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=0.84u +MM8_f8 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=0.84u +MM8_f9 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=0.84u +MM8_f10 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=0.84u +MM8_f11 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=0.84u +MM9_f0 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM9_f1 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM9_f2 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM9_f3 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM9_f4 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM9_f5 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM9_f6 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM9_f7 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM9_f8 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM9_f9 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM9_f10 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM9_f11 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM10_f0 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM10_f1 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM10_f2 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM10_f3 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM10_f4 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM10_f5 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM10_f6 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM10_f7 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM10_f8 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM10_f9 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM10_f10 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM10_f11 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +.ends C10_gf180_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1.5_sL1.5/testbench.spice new file mode 100644 index 00000000..d9beca79 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1.5_sL1.5/testbench.spice @@ -0,0 +1,48 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 C10_gf180_sW1.5_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIB1 VDD IB1 4e-05 +.nodeset v(IB1)=0.99 +MB_VB1 VB1 VB1 VSS VSS nfet_03v3 w=6u l=0.84u +IB_VB1 VDDB VB1 0.00018 +MB_VB2 VB2 VB2 VDDB VDDB pfet_03v3 w=6u l=0.84u +IB_VB2 VB2 VSS 0.00018 +MB_VB3 VB3 VB3 VDDB VDDB pfet_03v3 w=6u l=0.84u +IB_VB3 VB3 VSS 2e-05 +MB_VB4n VB4n VB4n VSS VSS nfet_03v3 w=6u l=0.84u +IB_VB4n VDDB VB4n 4e-05 +VCM VCM 0 1.5 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 5e-13 +CL2 VOUT2 0 5e-13 +BCMFB VB4 0 V = v(VB4n) + 20*((v(VOUT1)+v(VOUT2))/2 - 1.65) +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +meas ac ugf when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1.5_sL1/case.json new file mode 100644 index 00000000..ef0d6b4a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1.5_sL1/case.json @@ -0,0 +1,303 @@ +{ + "case_id": "C10_gf180_sW1.5_sL1", + "circuit_id": "C10", + "pdk": "gf180", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "dut_name": "C10_gf180_sW1.5_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1", + "VB2", + "VB3", + "VB4", + "IB1" + ], + "sizing": { + "M1": { + "w": 6.0, + "l": 0.56, + "nf": 12 + }, + "M2": { + "w": 6.0, + "l": 0.56, + "nf": 12 + }, + "M3": { + "w": 6.0, + "l": 0.56, + "nf": 12 + }, + "M4": { + "w": 6.0, + "l": 0.56, + "nf": 12 + }, + "M5": { + "w": 6.0, + "l": 0.56, + "nf": 12 + }, + "M6": { + "w": 6.0, + "l": 0.56, + "nf": 12 + }, + "M7": { + "w": 6.0, + "l": 0.56, + "nf": 12 + }, + "M8": { + "w": 6.0, + "l": 0.56, + "nf": 12 + }, + "M9": { + "w": 6.0, + "l": 0.56, + "nf": 12 + }, + "M10": { + "w": 6.0, + "l": 0.56, + "nf": 12 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M5", + "current": 2e-05, + "kind": "cascode3" + }, + "VB2": { + "replica": "M7", + "current": 2e-05, + "kind": "cascode3" + }, + "VB3": { + "replica": "M9", + "current": 2e-05 + }, + "VB4": { + "replica": "M3", + "current": 4e-05 + }, + "IB1": { + "i": 4e-05, + "from": "VDD" + } + }, + "load": { + "vcm": 1.5, + "CL": 5e-13, + "cmfb_gain": 20.0, + "vocm": 1.65 + }, + "category": "ota_fd", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M9": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M10": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "a57bf2de4e1e77d3", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M5", + "current_A": 2e-05, + "variant": "cascode3" + }, + { + "kind": "replica_bias", + "port": "VB2", + "replica_of": "M7", + "current_A": 2e-05, + "variant": "cascode3" + }, + { + "kind": "replica_bias", + "port": "VB3", + "replica_of": "M9", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "replica_bias", + "port": "VB4", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VDD" + }, + { + "kind": "testbench_element", + "what": "ideal common-mode feedback on VB4" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8", + "M9", + "M10" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1.5_sL1/manifest.json new file mode 100644 index 00000000..9114082d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "0b1a13e42ae8e34b116afdc09719040e7cba75049b08896ff3160078e519d0f4", + "qualification.json": "1552c5429bdf8a6a1203bb0a08dbc66b3719eeefa944e6f37102c781f7a5ca46", + "specs.json": "194687be97cd7872629982e4fd3ce008976f639ecb6ac6c3b23a9d9f63c64741", + "target.spice": "5cfa02c8646f38554ca8062d1960fb518fe5e9b36c6da031656b2c2ee2134129", + "target_lvs.spice": "3e1e0b908aab6e487f0dc294c0c951fb7e34e6341a5595b00ee2bdb82df6ec2c", + "testbench.spice": "fdbc9ac8145d3238ee232af3fb116f14059e9e80ed7df0cc37e5d6bf1460b0a1" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1.5_sL1/qualification.json new file mode 100644 index 00000000..c88d133c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1.5_sL1/qualification.json @@ -0,0 +1,180 @@ +{ + "case_id": "C10_gf180_sW1.5_sL1", + "circuit_id": "C10", + "pdk": "gf180", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "ota_fd", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M9": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M10": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "a57bf2de4e1e77d3", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 59.85 + }, + "ugf": { + "min": 19880000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 62.84618, + "ugf": 33128080.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.2, + "schematic_measures": { + "vo1": 1.649799, + "vo2": 1.649799, + "idd": 8.059775e-05, + "vos_in": 1.091394e-11, + "gain_lf": 62.84618, + "ugf": 33128080.0, + "f3db": 23787.08 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1.5_sL1/specs.json new file mode 100644 index 00000000..7d7ad817 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1.5_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 59.85 + }, + "ugf": { + "min": 19880000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 62.84618, + "ugf": 33128080.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1.5_sL1/target.spice new file mode 100644 index 00000000..f37e8f3a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1.5_sL1/target.spice @@ -0,0 +1,12 @@ +.subckt C10_gf180_sW1.5_sL1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 +MM1 net022 VIN1 IB1 VDD pfet_03v3 w=6u l=0.56u nf=12 m=1 +MM2 net018 VIN2 IB1 VDD pfet_03v3 w=6u l=0.56u nf=12 m=1 +MM3 net022 VB4 VSS VSS nfet_03v3 w=6u l=0.56u nf=12 m=1 +MM4 net018 VB4 VSS VSS nfet_03v3 w=6u l=0.56u nf=12 m=1 +MM5 VOUT1 VB1 net022 VSS nfet_03v3 w=6u l=0.56u nf=12 m=1 +MM6 VOUT2 VB1 net018 VSS nfet_03v3 w=6u l=0.56u nf=12 m=1 +MM7 VOUT1 VB2 net023 VDD pfet_03v3 w=6u l=0.56u nf=12 m=1 +MM8 VOUT2 VB2 net021 VDD pfet_03v3 w=6u l=0.56u nf=12 m=1 +MM9 net023 VB3 VDD VDD pfet_03v3 w=6u l=0.56u nf=12 m=1 +MM10 net021 VB3 VDD VDD pfet_03v3 w=6u l=0.56u nf=12 m=1 +.ends C10_gf180_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1.5_sL1/target_lvs.spice new file mode 100644 index 00000000..7c7a8ae4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1.5_sL1/target_lvs.spice @@ -0,0 +1,122 @@ +.subckt C10_gf180_sW1.5_sL1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 +MM1_f0 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=0.56u +MM1_f1 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=0.56u +MM1_f2 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=0.56u +MM1_f3 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=0.56u +MM1_f4 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=0.56u +MM1_f5 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=0.56u +MM1_f6 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=0.56u +MM1_f7 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=0.56u +MM1_f8 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=0.56u +MM1_f9 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=0.56u +MM1_f10 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=0.56u +MM1_f11 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=0.56u +MM2_f0 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=0.56u +MM2_f1 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=0.56u +MM2_f2 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=0.56u +MM2_f3 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=0.56u +MM2_f4 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=0.56u +MM2_f5 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=0.56u +MM2_f6 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=0.56u +MM2_f7 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=0.56u +MM2_f8 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=0.56u +MM2_f9 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=0.56u +MM2_f10 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=0.56u +MM2_f11 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=0.56u +MM3_f0 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f1 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f2 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f3 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f4 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f5 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f6 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f7 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f8 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f9 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f10 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f11 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM4_f0 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM4_f1 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM4_f2 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM4_f3 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM4_f4 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM4_f5 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM4_f6 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM4_f7 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM4_f8 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM4_f9 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM4_f10 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM4_f11 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM5_f0 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f1 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f2 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f3 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f4 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f5 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f6 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f7 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f8 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f9 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f10 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f11 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=0.56u +MM6_f0 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=0.56u +MM6_f1 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=0.56u +MM6_f2 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=0.56u +MM6_f3 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=0.56u +MM6_f4 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=0.56u +MM6_f5 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=0.56u +MM6_f6 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=0.56u +MM6_f7 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=0.56u +MM6_f8 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=0.56u +MM6_f9 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=0.56u +MM6_f10 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=0.56u +MM6_f11 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=0.56u +MM7_f0 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=0.56u +MM7_f1 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=0.56u +MM7_f2 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=0.56u +MM7_f3 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=0.56u +MM7_f4 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=0.56u +MM7_f5 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=0.56u +MM7_f6 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=0.56u +MM7_f7 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=0.56u +MM7_f8 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=0.56u +MM7_f9 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=0.56u +MM7_f10 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=0.56u +MM7_f11 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=0.56u +MM8_f0 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=0.56u +MM8_f1 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=0.56u +MM8_f2 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=0.56u +MM8_f3 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=0.56u +MM8_f4 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=0.56u +MM8_f5 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=0.56u +MM8_f6 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=0.56u +MM8_f7 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=0.56u +MM8_f8 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=0.56u +MM8_f9 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=0.56u +MM8_f10 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=0.56u +MM8_f11 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=0.56u +MM9_f0 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM9_f1 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM9_f2 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM9_f3 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM9_f4 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM9_f5 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM9_f6 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM9_f7 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM9_f8 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM9_f9 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM9_f10 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM9_f11 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM10_f0 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM10_f1 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM10_f2 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM10_f3 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM10_f4 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM10_f5 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM10_f6 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM10_f7 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM10_f8 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM10_f9 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM10_f10 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM10_f11 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +.ends C10_gf180_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1.5_sL1/testbench.spice new file mode 100644 index 00000000..c875d8d9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1.5_sL1/testbench.spice @@ -0,0 +1,48 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 C10_gf180_sW1.5_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIB1 VDD IB1 4e-05 +.nodeset v(IB1)=0.99 +MB_VB1 VB1 VB1 VSS VSS nfet_03v3 w=6u l=0.56u +IB_VB1 VDDB VB1 0.00018 +MB_VB2 VB2 VB2 VDDB VDDB pfet_03v3 w=6u l=0.56u +IB_VB2 VB2 VSS 0.00018 +MB_VB3 VB3 VB3 VDDB VDDB pfet_03v3 w=6u l=0.56u +IB_VB3 VB3 VSS 2e-05 +MB_VB4n VB4n VB4n VSS VSS nfet_03v3 w=6u l=0.56u +IB_VB4n VDDB VB4n 4e-05 +VCM VCM 0 1.5 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 5e-13 +CL2 VOUT2 0 5e-13 +BCMFB VB4 0 V = v(VB4n) + 20*((v(VOUT1)+v(VOUT2))/2 - 1.65) +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +meas ac ugf when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1.5_sL2/case.json new file mode 100644 index 00000000..bbad17c1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1.5_sL2/case.json @@ -0,0 +1,303 @@ +{ + "case_id": "C10_gf180_sW1.5_sL2", + "circuit_id": "C10", + "pdk": "gf180", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "dut_name": "C10_gf180_sW1.5_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1", + "VB2", + "VB3", + "VB4", + "IB1" + ], + "sizing": { + "M1": { + "w": 6.0, + "l": 1.12, + "nf": 12 + }, + "M2": { + "w": 6.0, + "l": 1.12, + "nf": 12 + }, + "M3": { + "w": 6.0, + "l": 1.12, + "nf": 12 + }, + "M4": { + "w": 6.0, + "l": 1.12, + "nf": 12 + }, + "M5": { + "w": 6.0, + "l": 1.12, + "nf": 12 + }, + "M6": { + "w": 6.0, + "l": 1.12, + "nf": 12 + }, + "M7": { + "w": 6.0, + "l": 1.12, + "nf": 12 + }, + "M8": { + "w": 6.0, + "l": 1.12, + "nf": 12 + }, + "M9": { + "w": 6.0, + "l": 1.12, + "nf": 12 + }, + "M10": { + "w": 6.0, + "l": 1.12, + "nf": 12 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M5", + "current": 2e-05, + "kind": "cascode3" + }, + "VB2": { + "replica": "M7", + "current": 2e-05, + "kind": "cascode3" + }, + "VB3": { + "replica": "M9", + "current": 2e-05 + }, + "VB4": { + "replica": "M3", + "current": 4e-05 + }, + "IB1": { + "i": 4e-05, + "from": "VDD" + } + }, + "load": { + "vcm": 1.5, + "CL": 5e-13, + "cmfb_gain": 20.0, + "vocm": 1.65 + }, + "category": "ota_fd", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M9": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M10": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "44ad043904d485b6", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M5", + "current_A": 2e-05, + "variant": "cascode3" + }, + { + "kind": "replica_bias", + "port": "VB2", + "replica_of": "M7", + "current_A": 2e-05, + "variant": "cascode3" + }, + { + "kind": "replica_bias", + "port": "VB3", + "replica_of": "M9", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "replica_bias", + "port": "VB4", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VDD" + }, + { + "kind": "testbench_element", + "what": "ideal common-mode feedback on VB4" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8", + "M9", + "M10" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1.5_sL2/manifest.json new file mode 100644 index 00000000..355707d2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "d73bc9db003b38b9d88f1da1fb126df5f698c8aa8e076e799bcbf03469a7ddba", + "qualification.json": "d97a4462f67385495b7dbe1e6172bfc6c9c1fed6bf665f947a866e3400f2ccf2", + "specs.json": "af4aafb581158c0ecdc06fb2396062bfb5dd222233b284aa4824fc7d2737a7b1", + "target.spice": "393ee7afcd5188c471a3bd5ae6a38c05b6cf5af2d4895485ae5f2df42560e03e", + "target_lvs.spice": "8b12c5bc442d8494e83e71e7e563b7f64856bfe308137f11a1e9b1bb4961db1b", + "testbench.spice": "04422b16bc43e1692dc8932a618c26b0e098f7beca605eaf44df8c1f7f6e6130" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1.5_sL2/qualification.json new file mode 100644 index 00000000..bf47b3e3 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1.5_sL2/qualification.json @@ -0,0 +1,180 @@ +{ + "case_id": "C10_gf180_sW1.5_sL2", + "circuit_id": "C10", + "pdk": "gf180", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "ota_fd", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M9": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M10": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "44ad043904d485b6", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 69.23 + }, + "ugf": { + "min": 13670000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 72.2261, + "ugf": 22776580.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.2, + "schematic_measures": { + "vo1": 1.650689, + "vo2": 1.650689, + "idd": 7.953871e-05, + "vos_in": -2.21917e-10, + "gain_lf": 72.2261, + "ugf": 22776580.0, + "f3db": 5569.856 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1.5_sL2/specs.json new file mode 100644 index 00000000..f8315218 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1.5_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 69.23 + }, + "ugf": { + "min": 13670000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 72.2261, + "ugf": 22776580.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1.5_sL2/target.spice new file mode 100644 index 00000000..2dee6902 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1.5_sL2/target.spice @@ -0,0 +1,12 @@ +.subckt C10_gf180_sW1.5_sL2 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 +MM1 net022 VIN1 IB1 VDD pfet_03v3 w=6u l=1.12u nf=12 m=1 +MM2 net018 VIN2 IB1 VDD pfet_03v3 w=6u l=1.12u nf=12 m=1 +MM3 net022 VB4 VSS VSS nfet_03v3 w=6u l=1.12u nf=12 m=1 +MM4 net018 VB4 VSS VSS nfet_03v3 w=6u l=1.12u nf=12 m=1 +MM5 VOUT1 VB1 net022 VSS nfet_03v3 w=6u l=1.12u nf=12 m=1 +MM6 VOUT2 VB1 net018 VSS nfet_03v3 w=6u l=1.12u nf=12 m=1 +MM7 VOUT1 VB2 net023 VDD pfet_03v3 w=6u l=1.12u nf=12 m=1 +MM8 VOUT2 VB2 net021 VDD pfet_03v3 w=6u l=1.12u nf=12 m=1 +MM9 net023 VB3 VDD VDD pfet_03v3 w=6u l=1.12u nf=12 m=1 +MM10 net021 VB3 VDD VDD pfet_03v3 w=6u l=1.12u nf=12 m=1 +.ends C10_gf180_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1.5_sL2/target_lvs.spice new file mode 100644 index 00000000..0e091768 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1.5_sL2/target_lvs.spice @@ -0,0 +1,122 @@ +.subckt C10_gf180_sW1.5_sL2 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 +MM1_f0 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=1.12u +MM1_f1 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=1.12u +MM1_f2 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=1.12u +MM1_f3 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=1.12u +MM1_f4 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=1.12u +MM1_f5 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=1.12u +MM1_f6 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=1.12u +MM1_f7 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=1.12u +MM1_f8 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=1.12u +MM1_f9 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=1.12u +MM1_f10 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=1.12u +MM1_f11 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=1.12u +MM2_f0 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=1.12u +MM2_f1 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=1.12u +MM2_f2 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=1.12u +MM2_f3 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=1.12u +MM2_f4 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=1.12u +MM2_f5 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=1.12u +MM2_f6 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=1.12u +MM2_f7 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=1.12u +MM2_f8 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=1.12u +MM2_f9 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=1.12u +MM2_f10 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=1.12u +MM2_f11 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=1.12u +MM3_f0 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f1 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f2 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f3 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f4 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f5 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f6 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f7 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f8 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f9 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f10 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f11 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM4_f0 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM4_f1 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM4_f2 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM4_f3 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM4_f4 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM4_f5 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM4_f6 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM4_f7 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM4_f8 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM4_f9 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM4_f10 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM4_f11 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM5_f0 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f1 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f2 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f3 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f4 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f5 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f6 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f7 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f8 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f9 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f10 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f11 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=1.12u +MM6_f0 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=1.12u +MM6_f1 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=1.12u +MM6_f2 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=1.12u +MM6_f3 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=1.12u +MM6_f4 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=1.12u +MM6_f5 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=1.12u +MM6_f6 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=1.12u +MM6_f7 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=1.12u +MM6_f8 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=1.12u +MM6_f9 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=1.12u +MM6_f10 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=1.12u +MM6_f11 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=1.12u +MM7_f0 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=1.12u +MM7_f1 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=1.12u +MM7_f2 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=1.12u +MM7_f3 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=1.12u +MM7_f4 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=1.12u +MM7_f5 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=1.12u +MM7_f6 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=1.12u +MM7_f7 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=1.12u +MM7_f8 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=1.12u +MM7_f9 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=1.12u +MM7_f10 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=1.12u +MM7_f11 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=1.12u +MM8_f0 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=1.12u +MM8_f1 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=1.12u +MM8_f2 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=1.12u +MM8_f3 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=1.12u +MM8_f4 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=1.12u +MM8_f5 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=1.12u +MM8_f6 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=1.12u +MM8_f7 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=1.12u +MM8_f8 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=1.12u +MM8_f9 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=1.12u +MM8_f10 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=1.12u +MM8_f11 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=1.12u +MM9_f0 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM9_f1 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM9_f2 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM9_f3 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM9_f4 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM9_f5 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM9_f6 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM9_f7 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM9_f8 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM9_f9 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM9_f10 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM9_f11 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM10_f0 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM10_f1 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM10_f2 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM10_f3 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM10_f4 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM10_f5 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM10_f6 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM10_f7 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM10_f8 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM10_f9 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM10_f10 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM10_f11 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +.ends C10_gf180_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1.5_sL2/testbench.spice new file mode 100644 index 00000000..b9e557a9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1.5_sL2/testbench.spice @@ -0,0 +1,48 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 C10_gf180_sW1.5_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIB1 VDD IB1 4e-05 +.nodeset v(IB1)=0.99 +MB_VB1 VB1 VB1 VSS VSS nfet_03v3 w=6u l=1.12u +IB_VB1 VDDB VB1 0.00018 +MB_VB2 VB2 VB2 VDDB VDDB pfet_03v3 w=6u l=1.12u +IB_VB2 VB2 VSS 0.00018 +MB_VB3 VB3 VB3 VDDB VDDB pfet_03v3 w=6u l=1.12u +IB_VB3 VB3 VSS 2e-05 +MB_VB4n VB4n VB4n VSS VSS nfet_03v3 w=6u l=1.12u +IB_VB4n VDDB VB4n 4e-05 +VCM VCM 0 1.5 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 5e-13 +CL2 VOUT2 0 5e-13 +BCMFB VB4 0 V = v(VB4n) + 20*((v(VOUT1)+v(VOUT2))/2 - 1.65) +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +meas ac ugf when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1_sL1.5/case.json new file mode 100644 index 00000000..a1c52107 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1_sL1.5/case.json @@ -0,0 +1,303 @@ +{ + "case_id": "C10_gf180_sW1_sL1.5", + "circuit_id": "C10", + "pdk": "gf180", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "dut_name": "C10_gf180_sW1_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1", + "VB2", + "VB3", + "VB4", + "IB1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.84, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 0.84, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 0.84, + "nf": 8 + }, + "M4": { + "w": 4.0, + "l": 0.84, + "nf": 8 + }, + "M5": { + "w": 4.0, + "l": 0.84, + "nf": 8 + }, + "M6": { + "w": 4.0, + "l": 0.84, + "nf": 8 + }, + "M7": { + "w": 4.0, + "l": 0.84, + "nf": 8 + }, + "M8": { + "w": 4.0, + "l": 0.84, + "nf": 8 + }, + "M9": { + "w": 4.0, + "l": 0.84, + "nf": 8 + }, + "M10": { + "w": 4.0, + "l": 0.84, + "nf": 8 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M5", + "current": 2e-05, + "kind": "cascode3" + }, + "VB2": { + "replica": "M7", + "current": 2e-05, + "kind": "cascode3" + }, + "VB3": { + "replica": "M9", + "current": 2e-05 + }, + "VB4": { + "replica": "M3", + "current": 4e-05 + }, + "IB1": { + "i": 4e-05, + "from": "VDD" + } + }, + "load": { + "vcm": 1.5, + "CL": 5e-13, + "cmfb_gain": 20.0, + "vocm": 1.65 + }, + "category": "ota_fd", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M9": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M10": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "f8bf9d5f97abbb01", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M5", + "current_A": 2e-05, + "variant": "cascode3" + }, + { + "kind": "replica_bias", + "port": "VB2", + "replica_of": "M7", + "current_A": 2e-05, + "variant": "cascode3" + }, + { + "kind": "replica_bias", + "port": "VB3", + "replica_of": "M9", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "replica_bias", + "port": "VB4", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VDD" + }, + { + "kind": "testbench_element", + "what": "ideal common-mode feedback on VB4" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8", + "M9", + "M10" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1_sL1.5/manifest.json new file mode 100644 index 00000000..2cde796c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "941b530a2e1a08c367048db85010fe043a57bd75dd210a13fd1d1d0270b0e04d", + "qualification.json": "2779fdee9742278b85d03271be60e50b7102ab2b01d62d6df82ef59dd08efd64", + "specs.json": "df8308173fae8cca854f446523e3b2f0270ce444fb6fcb65dd63eaabe7c7fc6a", + "target.spice": "2d3c8e3b5d6ac8f300c0003bb30bd5902719ba95d61fcc48509d256c323560c0", + "target_lvs.spice": "0a28eb6cd02e65d469371f50ab76dcde4d94b5fa0ee05c67822528bb0c8b8c42", + "testbench.spice": "93937e73d06ed517a5461e25c72e89f08929c2f53fd38705c9fd4859108e7f13" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1_sL1.5/qualification.json new file mode 100644 index 00000000..843236ea --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1_sL1.5/qualification.json @@ -0,0 +1,180 @@ +{ + "case_id": "C10_gf180_sW1_sL1.5", + "circuit_id": "C10", + "pdk": "gf180", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "ota_fd", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M9": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M10": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "f8bf9d5f97abbb01", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 65.34 + }, + "ugf": { + "min": 13000000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 68.34192, + "ugf": 21665870.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.2, + "schematic_measures": { + "vo1": 1.650431, + "vo2": 1.650431, + "idd": 7.966196e-05, + "vos_in": 1.091394e-11, + "gain_lf": 68.34192, + "ugf": 21665870.0, + "f3db": 8269.995 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1_sL1.5/specs.json new file mode 100644 index 00000000..284fe82f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 65.34 + }, + "ugf": { + "min": 13000000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 68.34192, + "ugf": 21665870.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1_sL1.5/target.spice new file mode 100644 index 00000000..8bd32416 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1_sL1.5/target.spice @@ -0,0 +1,12 @@ +.subckt C10_gf180_sW1_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 +MM1 net022 VIN1 IB1 VDD pfet_03v3 w=4u l=0.84u nf=8 m=1 +MM2 net018 VIN2 IB1 VDD pfet_03v3 w=4u l=0.84u nf=8 m=1 +MM3 net022 VB4 VSS VSS nfet_03v3 w=4u l=0.84u nf=8 m=1 +MM4 net018 VB4 VSS VSS nfet_03v3 w=4u l=0.84u nf=8 m=1 +MM5 VOUT1 VB1 net022 VSS nfet_03v3 w=4u l=0.84u nf=8 m=1 +MM6 VOUT2 VB1 net018 VSS nfet_03v3 w=4u l=0.84u nf=8 m=1 +MM7 VOUT1 VB2 net023 VDD pfet_03v3 w=4u l=0.84u nf=8 m=1 +MM8 VOUT2 VB2 net021 VDD pfet_03v3 w=4u l=0.84u nf=8 m=1 +MM9 net023 VB3 VDD VDD pfet_03v3 w=4u l=0.84u nf=8 m=1 +MM10 net021 VB3 VDD VDD pfet_03v3 w=4u l=0.84u nf=8 m=1 +.ends C10_gf180_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1_sL1.5/target_lvs.spice new file mode 100644 index 00000000..ed6b619d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1_sL1.5/target_lvs.spice @@ -0,0 +1,82 @@ +.subckt C10_gf180_sW1_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 +MM1_f0 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=0.84u +MM1_f1 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=0.84u +MM1_f2 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=0.84u +MM1_f3 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=0.84u +MM1_f4 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=0.84u +MM1_f5 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=0.84u +MM1_f6 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=0.84u +MM1_f7 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=0.84u +MM2_f0 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=0.84u +MM2_f1 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=0.84u +MM2_f2 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=0.84u +MM2_f3 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=0.84u +MM2_f4 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=0.84u +MM2_f5 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=0.84u +MM2_f6 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=0.84u +MM2_f7 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=0.84u +MM3_f0 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f1 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f2 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f3 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f4 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f5 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f6 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f7 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM4_f0 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM4_f1 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM4_f2 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM4_f3 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM4_f4 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM4_f5 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM4_f6 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM4_f7 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM5_f0 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f1 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f2 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f3 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f4 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f5 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f6 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f7 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=0.84u +MM6_f0 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=0.84u +MM6_f1 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=0.84u +MM6_f2 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=0.84u +MM6_f3 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=0.84u +MM6_f4 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=0.84u +MM6_f5 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=0.84u +MM6_f6 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=0.84u +MM6_f7 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=0.84u +MM7_f0 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=0.84u +MM7_f1 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=0.84u +MM7_f2 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=0.84u +MM7_f3 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=0.84u +MM7_f4 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=0.84u +MM7_f5 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=0.84u +MM7_f6 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=0.84u +MM7_f7 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=0.84u +MM8_f0 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=0.84u +MM8_f1 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=0.84u +MM8_f2 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=0.84u +MM8_f3 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=0.84u +MM8_f4 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=0.84u +MM8_f5 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=0.84u +MM8_f6 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=0.84u +MM8_f7 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=0.84u +MM9_f0 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM9_f1 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM9_f2 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM9_f3 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM9_f4 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM9_f5 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM9_f6 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM9_f7 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM10_f0 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM10_f1 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM10_f2 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM10_f3 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM10_f4 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM10_f5 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM10_f6 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM10_f7 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +.ends C10_gf180_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1_sL1.5/testbench.spice new file mode 100644 index 00000000..bc5f13c6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1_sL1.5/testbench.spice @@ -0,0 +1,48 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 C10_gf180_sW1_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIB1 VDD IB1 4e-05 +.nodeset v(IB1)=0.99 +MB_VB1 VB1 VB1 VSS VSS nfet_03v3 w=4u l=0.84u +IB_VB1 VDDB VB1 0.00018 +MB_VB2 VB2 VB2 VDDB VDDB pfet_03v3 w=4u l=0.84u +IB_VB2 VB2 VSS 0.00018 +MB_VB3 VB3 VB3 VDDB VDDB pfet_03v3 w=4u l=0.84u +IB_VB3 VB3 VSS 2e-05 +MB_VB4n VB4n VB4n VSS VSS nfet_03v3 w=4u l=0.84u +IB_VB4n VDDB VB4n 4e-05 +VCM VCM 0 1.5 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 5e-13 +CL2 VOUT2 0 5e-13 +BCMFB VB4 0 V = v(VB4n) + 20*((v(VOUT1)+v(VOUT2))/2 - 1.65) +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +meas ac ugf when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1_sL1/case.json new file mode 100644 index 00000000..e095c6e2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1_sL1/case.json @@ -0,0 +1,303 @@ +{ + "case_id": "C10_gf180_sW1_sL1", + "circuit_id": "C10", + "pdk": "gf180", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "dut_name": "C10_gf180_sW1_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1", + "VB2", + "VB3", + "VB4", + "IB1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "M4": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "M5": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "M6": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "M7": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "M8": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "M9": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "M10": { + "w": 4.0, + "l": 0.56, + "nf": 8 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M5", + "current": 2e-05, + "kind": "cascode3" + }, + "VB2": { + "replica": "M7", + "current": 2e-05, + "kind": "cascode3" + }, + "VB3": { + "replica": "M9", + "current": 2e-05 + }, + "VB4": { + "replica": "M3", + "current": 4e-05 + }, + "IB1": { + "i": 4e-05, + "from": "VDD" + } + }, + "load": { + "vcm": 1.5, + "CL": 5e-13, + "cmfb_gain": 20.0, + "vocm": 1.65 + }, + "category": "ota_fd", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M9": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M10": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "d66d7444939df7ce", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M5", + "current_A": 2e-05, + "variant": "cascode3" + }, + { + "kind": "replica_bias", + "port": "VB2", + "replica_of": "M7", + "current_A": 2e-05, + "variant": "cascode3" + }, + { + "kind": "replica_bias", + "port": "VB3", + "replica_of": "M9", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "replica_bias", + "port": "VB4", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VDD" + }, + { + "kind": "testbench_element", + "what": "ideal common-mode feedback on VB4" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8", + "M9", + "M10" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1_sL1/manifest.json new file mode 100644 index 00000000..75cd8632 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "3aba5253fbea73dea8ddd59cdc1ef6e74707f08d907cc0aaef46c7ab9dc2f714", + "qualification.json": "a8cd7bb52aeca8ceefa62bbe3304f892243a3600e7fe2fc9e8ffe3bcea050525", + "specs.json": "59e4015cff8b05ab072ff3c7007c72f166dcad08a3ac1929cbc6c3e5aeabe801", + "target.spice": "323778a0a9a87af4258e221e1a4460a423e02e9ed2632e95be620d195da37890", + "target_lvs.spice": "4ba7f23da652175f60e359ad600bcdfa19696a55e2da41ab7c07c8566d9fdae2", + "testbench.spice": "2c5f619e785da0bbc27f8597a428ff97d793d5b6b542dc2eb6c180cf75888eaf" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1_sL1/qualification.json new file mode 100644 index 00000000..c28b9d1e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1_sL1/qualification.json @@ -0,0 +1,180 @@ +{ + "case_id": "C10_gf180_sW1_sL1", + "circuit_id": "C10", + "pdk": "gf180", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "ota_fd", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M9": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M10": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "d66d7444939df7ce", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 59.87 + }, + "ugf": { + "min": 16310000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 62.87385, + "ugf": 27175880.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vo1": 1.649878, + "vo2": 1.649878, + "idd": 8.003606e-05, + "vos_in": -3.63798e-12, + "gain_lf": 62.87385, + "ugf": 27175880.0, + "f3db": 19452.04 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1_sL1/specs.json new file mode 100644 index 00000000..05777d42 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 59.87 + }, + "ugf": { + "min": 16310000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 62.87385, + "ugf": 27175880.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1_sL1/target.spice new file mode 100644 index 00000000..1c9dd827 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1_sL1/target.spice @@ -0,0 +1,12 @@ +.subckt C10_gf180_sW1_sL1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 +MM1 net022 VIN1 IB1 VDD pfet_03v3 w=4u l=0.56u nf=8 m=1 +MM2 net018 VIN2 IB1 VDD pfet_03v3 w=4u l=0.56u nf=8 m=1 +MM3 net022 VB4 VSS VSS nfet_03v3 w=4u l=0.56u nf=8 m=1 +MM4 net018 VB4 VSS VSS nfet_03v3 w=4u l=0.56u nf=8 m=1 +MM5 VOUT1 VB1 net022 VSS nfet_03v3 w=4u l=0.56u nf=8 m=1 +MM6 VOUT2 VB1 net018 VSS nfet_03v3 w=4u l=0.56u nf=8 m=1 +MM7 VOUT1 VB2 net023 VDD pfet_03v3 w=4u l=0.56u nf=8 m=1 +MM8 VOUT2 VB2 net021 VDD pfet_03v3 w=4u l=0.56u nf=8 m=1 +MM9 net023 VB3 VDD VDD pfet_03v3 w=4u l=0.56u nf=8 m=1 +MM10 net021 VB3 VDD VDD pfet_03v3 w=4u l=0.56u nf=8 m=1 +.ends C10_gf180_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1_sL1/target_lvs.spice new file mode 100644 index 00000000..4935242f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1_sL1/target_lvs.spice @@ -0,0 +1,82 @@ +.subckt C10_gf180_sW1_sL1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 +MM1_f0 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=0.56u +MM1_f1 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=0.56u +MM1_f2 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=0.56u +MM1_f3 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=0.56u +MM1_f4 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=0.56u +MM1_f5 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=0.56u +MM1_f6 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=0.56u +MM1_f7 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=0.56u +MM2_f0 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=0.56u +MM2_f1 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=0.56u +MM2_f2 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=0.56u +MM2_f3 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=0.56u +MM2_f4 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=0.56u +MM2_f5 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=0.56u +MM2_f6 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=0.56u +MM2_f7 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=0.56u +MM3_f0 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f1 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f2 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f3 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f4 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f5 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f6 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f7 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM4_f0 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM4_f1 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM4_f2 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM4_f3 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM4_f4 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM4_f5 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM4_f6 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM4_f7 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM5_f0 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f1 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f2 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f3 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f4 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f5 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f6 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f7 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=0.56u +MM6_f0 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=0.56u +MM6_f1 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=0.56u +MM6_f2 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=0.56u +MM6_f3 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=0.56u +MM6_f4 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=0.56u +MM6_f5 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=0.56u +MM6_f6 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=0.56u +MM6_f7 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=0.56u +MM7_f0 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=0.56u +MM7_f1 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=0.56u +MM7_f2 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=0.56u +MM7_f3 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=0.56u +MM7_f4 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=0.56u +MM7_f5 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=0.56u +MM7_f6 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=0.56u +MM7_f7 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=0.56u +MM8_f0 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=0.56u +MM8_f1 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=0.56u +MM8_f2 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=0.56u +MM8_f3 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=0.56u +MM8_f4 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=0.56u +MM8_f5 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=0.56u +MM8_f6 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=0.56u +MM8_f7 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=0.56u +MM9_f0 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM9_f1 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM9_f2 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM9_f3 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM9_f4 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM9_f5 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM9_f6 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM9_f7 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM10_f0 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM10_f1 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM10_f2 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM10_f3 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM10_f4 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM10_f5 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM10_f6 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM10_f7 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +.ends C10_gf180_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1_sL1/testbench.spice new file mode 100644 index 00000000..73080e28 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1_sL1/testbench.spice @@ -0,0 +1,48 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 C10_gf180_sW1_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIB1 VDD IB1 4e-05 +.nodeset v(IB1)=0.99 +MB_VB1 VB1 VB1 VSS VSS nfet_03v3 w=4u l=0.56u +IB_VB1 VDDB VB1 0.00018 +MB_VB2 VB2 VB2 VDDB VDDB pfet_03v3 w=4u l=0.56u +IB_VB2 VB2 VSS 0.00018 +MB_VB3 VB3 VB3 VDDB VDDB pfet_03v3 w=4u l=0.56u +IB_VB3 VB3 VSS 2e-05 +MB_VB4n VB4n VB4n VSS VSS nfet_03v3 w=4u l=0.56u +IB_VB4n VDDB VB4n 4e-05 +VCM VCM 0 1.5 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 5e-13 +CL2 VOUT2 0 5e-13 +BCMFB VB4 0 V = v(VB4n) + 20*((v(VOUT1)+v(VOUT2))/2 - 1.65) +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +meas ac ugf when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1_sL2/case.json new file mode 100644 index 00000000..210c7dd1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1_sL2/case.json @@ -0,0 +1,303 @@ +{ + "case_id": "C10_gf180_sW1_sL2", + "circuit_id": "C10", + "pdk": "gf180", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "dut_name": "C10_gf180_sW1_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1", + "VB2", + "VB3", + "VB4", + "IB1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 1.12, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 1.12, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 1.12, + "nf": 8 + }, + "M4": { + "w": 4.0, + "l": 1.12, + "nf": 8 + }, + "M5": { + "w": 4.0, + "l": 1.12, + "nf": 8 + }, + "M6": { + "w": 4.0, + "l": 1.12, + "nf": 8 + }, + "M7": { + "w": 4.0, + "l": 1.12, + "nf": 8 + }, + "M8": { + "w": 4.0, + "l": 1.12, + "nf": 8 + }, + "M9": { + "w": 4.0, + "l": 1.12, + "nf": 8 + }, + "M10": { + "w": 4.0, + "l": 1.12, + "nf": 8 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M5", + "current": 2e-05, + "kind": "cascode3" + }, + "VB2": { + "replica": "M7", + "current": 2e-05, + "kind": "cascode3" + }, + "VB3": { + "replica": "M9", + "current": 2e-05 + }, + "VB4": { + "replica": "M3", + "current": 4e-05 + }, + "IB1": { + "i": 4e-05, + "from": "VDD" + } + }, + "load": { + "vcm": 1.5, + "CL": 5e-13, + "cmfb_gain": 20.0, + "vocm": 1.65 + }, + "category": "ota_fd", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M9": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M10": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "a424ad6b4c28d155", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M5", + "current_A": 2e-05, + "variant": "cascode3" + }, + { + "kind": "replica_bias", + "port": "VB2", + "replica_of": "M7", + "current_A": 2e-05, + "variant": "cascode3" + }, + { + "kind": "replica_bias", + "port": "VB3", + "replica_of": "M9", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "replica_bias", + "port": "VB4", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VDD" + }, + { + "kind": "testbench_element", + "what": "ideal common-mode feedback on VB4" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8", + "M9", + "M10" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1_sL2/manifest.json new file mode 100644 index 00000000..e54aae98 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "bfc9f793fc5ecda4ddfc9a021ffd601d137b754a7b993a714d91fe1519c2546c", + "qualification.json": "c1a66c83049e07dc3df7c016724c994a33fe7b7027be3dd7eef8ec3ce79e3132", + "specs.json": "3bff0583244bb841c445ad4aa3e4c2e395ab4a1b9204cadbb817fdc9c3a64a61", + "target.spice": "bb7d33d77ae35d7e984ee1945e26493db249ed0fa0805a5bee0eedd74b2708c3", + "target_lvs.spice": "7170fc184b36010bbd9ebc7f47d302dd8c9223110e77be443ad2739c3f46d274", + "testbench.spice": "43a2321cfb8843330caffee0f7dfca36df7f2b16cd9ed571882d9c06569ce6da" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1_sL2/qualification.json new file mode 100644 index 00000000..641828ee --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1_sL2/qualification.json @@ -0,0 +1,180 @@ +{ + "case_id": "C10_gf180_sW1_sL2", + "circuit_id": "C10", + "pdk": "gf180", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "ota_fd", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M9": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M10": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "a424ad6b4c28d155", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 64.24 + }, + "ugf": { + "min": 11110000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 67.23655, + "ugf": 18515360.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vo1": 1.650858, + "vo2": 1.650858, + "idd": 7.976098e-05, + "vos_in": -1.45519e-11, + "gain_lf": 67.23655, + "ugf": 18515360.0, + "f3db": 8023.884 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1_sL2/specs.json new file mode 100644 index 00000000..ed18d3cd --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 64.24 + }, + "ugf": { + "min": 11110000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 67.23655, + "ugf": 18515360.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1_sL2/target.spice new file mode 100644 index 00000000..e028aac0 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1_sL2/target.spice @@ -0,0 +1,12 @@ +.subckt C10_gf180_sW1_sL2 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 +MM1 net022 VIN1 IB1 VDD pfet_03v3 w=4u l=1.12u nf=8 m=1 +MM2 net018 VIN2 IB1 VDD pfet_03v3 w=4u l=1.12u nf=8 m=1 +MM3 net022 VB4 VSS VSS nfet_03v3 w=4u l=1.12u nf=8 m=1 +MM4 net018 VB4 VSS VSS nfet_03v3 w=4u l=1.12u nf=8 m=1 +MM5 VOUT1 VB1 net022 VSS nfet_03v3 w=4u l=1.12u nf=8 m=1 +MM6 VOUT2 VB1 net018 VSS nfet_03v3 w=4u l=1.12u nf=8 m=1 +MM7 VOUT1 VB2 net023 VDD pfet_03v3 w=4u l=1.12u nf=8 m=1 +MM8 VOUT2 VB2 net021 VDD pfet_03v3 w=4u l=1.12u nf=8 m=1 +MM9 net023 VB3 VDD VDD pfet_03v3 w=4u l=1.12u nf=8 m=1 +MM10 net021 VB3 VDD VDD pfet_03v3 w=4u l=1.12u nf=8 m=1 +.ends C10_gf180_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1_sL2/target_lvs.spice new file mode 100644 index 00000000..3ac15872 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1_sL2/target_lvs.spice @@ -0,0 +1,82 @@ +.subckt C10_gf180_sW1_sL2 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 +MM1_f0 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=1.12u +MM1_f1 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=1.12u +MM1_f2 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=1.12u +MM1_f3 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=1.12u +MM1_f4 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=1.12u +MM1_f5 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=1.12u +MM1_f6 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=1.12u +MM1_f7 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=1.12u +MM2_f0 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=1.12u +MM2_f1 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=1.12u +MM2_f2 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=1.12u +MM2_f3 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=1.12u +MM2_f4 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=1.12u +MM2_f5 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=1.12u +MM2_f6 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=1.12u +MM2_f7 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=1.12u +MM3_f0 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f1 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f2 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f3 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f4 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f5 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f6 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f7 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM4_f0 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM4_f1 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM4_f2 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM4_f3 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM4_f4 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM4_f5 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM4_f6 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM4_f7 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM5_f0 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f1 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f2 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f3 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f4 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f5 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f6 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f7 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=1.12u +MM6_f0 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=1.12u +MM6_f1 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=1.12u +MM6_f2 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=1.12u +MM6_f3 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=1.12u +MM6_f4 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=1.12u +MM6_f5 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=1.12u +MM6_f6 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=1.12u +MM6_f7 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=1.12u +MM7_f0 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=1.12u +MM7_f1 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=1.12u +MM7_f2 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=1.12u +MM7_f3 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=1.12u +MM7_f4 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=1.12u +MM7_f5 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=1.12u +MM7_f6 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=1.12u +MM7_f7 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=1.12u +MM8_f0 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=1.12u +MM8_f1 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=1.12u +MM8_f2 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=1.12u +MM8_f3 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=1.12u +MM8_f4 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=1.12u +MM8_f5 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=1.12u +MM8_f6 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=1.12u +MM8_f7 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=1.12u +MM9_f0 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM9_f1 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM9_f2 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM9_f3 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM9_f4 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM9_f5 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM9_f6 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM9_f7 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM10_f0 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM10_f1 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM10_f2 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM10_f3 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM10_f4 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM10_f5 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM10_f6 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM10_f7 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +.ends C10_gf180_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1_sL2/testbench.spice new file mode 100644 index 00000000..b77ae6bd --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW1_sL2/testbench.spice @@ -0,0 +1,48 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 C10_gf180_sW1_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIB1 VDD IB1 4e-05 +.nodeset v(IB1)=0.99 +MB_VB1 VB1 VB1 VSS VSS nfet_03v3 w=4u l=1.12u +IB_VB1 VDDB VB1 0.00018 +MB_VB2 VB2 VB2 VDDB VDDB pfet_03v3 w=4u l=1.12u +IB_VB2 VB2 VSS 0.00018 +MB_VB3 VB3 VB3 VDDB VDDB pfet_03v3 w=4u l=1.12u +IB_VB3 VB3 VSS 2e-05 +MB_VB4n VB4n VB4n VSS VSS nfet_03v3 w=4u l=1.12u +IB_VB4n VDDB VB4n 4e-05 +VCM VCM 0 1.5 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 5e-13 +CL2 VOUT2 0 5e-13 +BCMFB VB4 0 V = v(VB4n) + 20*((v(VOUT1)+v(VOUT2))/2 - 1.65) +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +meas ac ugf when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C10/gf180/sW2_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW2_sL1.5/case.json new file mode 100644 index 00000000..b5b1a657 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW2_sL1.5/case.json @@ -0,0 +1,303 @@ +{ + "case_id": "C10_gf180_sW2_sL1.5", + "circuit_id": "C10", + "pdk": "gf180", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "dut_name": "C10_gf180_sW2_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1", + "VB2", + "VB3", + "VB4", + "IB1" + ], + "sizing": { + "M1": { + "w": 8.0, + "l": 0.84, + "nf": 16 + }, + "M2": { + "w": 8.0, + "l": 0.84, + "nf": 16 + }, + "M3": { + "w": 8.0, + "l": 0.84, + "nf": 16 + }, + "M4": { + "w": 8.0, + "l": 0.84, + "nf": 16 + }, + "M5": { + "w": 8.0, + "l": 0.84, + "nf": 16 + }, + "M6": { + "w": 8.0, + "l": 0.84, + "nf": 16 + }, + "M7": { + "w": 8.0, + "l": 0.84, + "nf": 16 + }, + "M8": { + "w": 8.0, + "l": 0.84, + "nf": 16 + }, + "M9": { + "w": 8.0, + "l": 0.84, + "nf": 16 + }, + "M10": { + "w": 8.0, + "l": 0.84, + "nf": 16 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M5", + "current": 2e-05, + "kind": "cascode3" + }, + "VB2": { + "replica": "M7", + "current": 2e-05, + "kind": "cascode3" + }, + "VB3": { + "replica": "M9", + "current": 2e-05 + }, + "VB4": { + "replica": "M3", + "current": 4e-05 + }, + "IB1": { + "i": 4e-05, + "from": "VDD" + } + }, + "load": { + "vcm": 1.5, + "CL": 5e-13, + "cmfb_gain": 20.0, + "vocm": 1.65 + }, + "category": "ota_fd", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M9": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M10": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "fe5158b497bc63fc", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M5", + "current_A": 2e-05, + "variant": "cascode3" + }, + { + "kind": "replica_bias", + "port": "VB2", + "replica_of": "M7", + "current_A": 2e-05, + "variant": "cascode3" + }, + { + "kind": "replica_bias", + "port": "VB3", + "replica_of": "M9", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "replica_bias", + "port": "VB4", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VDD" + }, + { + "kind": "testbench_element", + "what": "ideal common-mode feedback on VB4" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8", + "M9", + "M10" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/gf180/sW2_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW2_sL1.5/manifest.json new file mode 100644 index 00000000..6850b3bc --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW2_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "6d5bf15a37a0e5ce272df96149f18ae9335430666a7df82590833f5831d5b987", + "qualification.json": "c3d56e6fb7a3f924c7660481336cf866b95ec3c0a234981104f2b2d1163e1e99", + "specs.json": "20bf51015bfb1ddba9444f46561b5eebd851782cc18c018154960b3c58eaecff", + "target.spice": "3709e99da68c91c8f566e7cfad8d9ac0565133770271179fd6654c6f34f9e776", + "target_lvs.spice": "6976c54c39f7aa37515081650acd6fa2a79256b070b7a02251c6f58791214293", + "testbench.spice": "f73f6540591b34ef17e2da00d3c0a2cb115a484f7b1c74480a8c2399cac5a4b4" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/gf180/sW2_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW2_sL1.5/qualification.json new file mode 100644 index 00000000..cc8a3dae --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW2_sL1.5/qualification.json @@ -0,0 +1,180 @@ +{ + "case_id": "C10_gf180_sW2_sL1.5", + "circuit_id": "C10", + "pdk": "gf180", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "ota_fd", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M9": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M10": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "fe5158b497bc63fc", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 65.88 + }, + "ugf": { + "min": 18210000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 68.87529, + "ugf": 30356750.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.2, + "schematic_measures": { + "vo1": 1.650197, + "vo2": 1.650197, + "idd": 7.982058e-05, + "vos_in": -7.27596e-12, + "gain_lf": 68.87529, + "ugf": 30356750.0, + "f3db": 10898.23 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/gf180/sW2_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW2_sL1.5/specs.json new file mode 100644 index 00000000..bb2cbda7 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW2_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 65.88 + }, + "ugf": { + "min": 18210000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 68.87529, + "ugf": 30356750.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/gf180/sW2_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW2_sL1.5/target.spice new file mode 100644 index 00000000..d394ae88 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW2_sL1.5/target.spice @@ -0,0 +1,12 @@ +.subckt C10_gf180_sW2_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 +MM1 net022 VIN1 IB1 VDD pfet_03v3 w=8u l=0.84u nf=16 m=1 +MM2 net018 VIN2 IB1 VDD pfet_03v3 w=8u l=0.84u nf=16 m=1 +MM3 net022 VB4 VSS VSS nfet_03v3 w=8u l=0.84u nf=16 m=1 +MM4 net018 VB4 VSS VSS nfet_03v3 w=8u l=0.84u nf=16 m=1 +MM5 VOUT1 VB1 net022 VSS nfet_03v3 w=8u l=0.84u nf=16 m=1 +MM6 VOUT2 VB1 net018 VSS nfet_03v3 w=8u l=0.84u nf=16 m=1 +MM7 VOUT1 VB2 net023 VDD pfet_03v3 w=8u l=0.84u nf=16 m=1 +MM8 VOUT2 VB2 net021 VDD pfet_03v3 w=8u l=0.84u nf=16 m=1 +MM9 net023 VB3 VDD VDD pfet_03v3 w=8u l=0.84u nf=16 m=1 +MM10 net021 VB3 VDD VDD pfet_03v3 w=8u l=0.84u nf=16 m=1 +.ends C10_gf180_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C10/gf180/sW2_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW2_sL1.5/target_lvs.spice new file mode 100644 index 00000000..6dff79f8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW2_sL1.5/target_lvs.spice @@ -0,0 +1,162 @@ +.subckt C10_gf180_sW2_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 +MM1_f0 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=0.84u +MM1_f1 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=0.84u +MM1_f2 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=0.84u +MM1_f3 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=0.84u +MM1_f4 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=0.84u +MM1_f5 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=0.84u +MM1_f6 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=0.84u +MM1_f7 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=0.84u +MM1_f8 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=0.84u +MM1_f9 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=0.84u +MM1_f10 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=0.84u +MM1_f11 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=0.84u +MM1_f12 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=0.84u +MM1_f13 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=0.84u +MM1_f14 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=0.84u +MM1_f15 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=0.84u +MM2_f0 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=0.84u +MM2_f1 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=0.84u +MM2_f2 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=0.84u +MM2_f3 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=0.84u +MM2_f4 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=0.84u +MM2_f5 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=0.84u +MM2_f6 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=0.84u +MM2_f7 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=0.84u +MM2_f8 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=0.84u +MM2_f9 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=0.84u +MM2_f10 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=0.84u +MM2_f11 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=0.84u +MM2_f12 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=0.84u +MM2_f13 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=0.84u +MM2_f14 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=0.84u +MM2_f15 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=0.84u +MM3_f0 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f1 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f2 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f3 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f4 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f5 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f6 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f7 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f8 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f9 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f10 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f11 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f12 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f13 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f14 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f15 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM4_f0 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM4_f1 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM4_f2 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM4_f3 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM4_f4 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM4_f5 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM4_f6 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM4_f7 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM4_f8 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM4_f9 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM4_f10 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM4_f11 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM4_f12 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM4_f13 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM4_f14 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM4_f15 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM5_f0 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f1 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f2 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f3 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f4 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f5 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f6 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f7 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f8 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f9 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f10 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f11 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f12 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f13 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f14 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f15 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=0.84u +MM6_f0 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=0.84u +MM6_f1 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=0.84u +MM6_f2 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=0.84u +MM6_f3 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=0.84u +MM6_f4 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=0.84u +MM6_f5 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=0.84u +MM6_f6 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=0.84u +MM6_f7 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=0.84u +MM6_f8 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=0.84u +MM6_f9 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=0.84u +MM6_f10 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=0.84u +MM6_f11 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=0.84u +MM6_f12 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=0.84u +MM6_f13 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=0.84u +MM6_f14 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=0.84u +MM6_f15 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=0.84u +MM7_f0 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=0.84u +MM7_f1 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=0.84u +MM7_f2 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=0.84u +MM7_f3 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=0.84u +MM7_f4 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=0.84u +MM7_f5 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=0.84u +MM7_f6 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=0.84u +MM7_f7 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=0.84u +MM7_f8 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=0.84u +MM7_f9 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=0.84u +MM7_f10 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=0.84u +MM7_f11 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=0.84u +MM7_f12 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=0.84u +MM7_f13 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=0.84u +MM7_f14 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=0.84u +MM7_f15 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=0.84u +MM8_f0 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=0.84u +MM8_f1 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=0.84u +MM8_f2 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=0.84u +MM8_f3 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=0.84u +MM8_f4 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=0.84u +MM8_f5 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=0.84u +MM8_f6 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=0.84u +MM8_f7 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=0.84u +MM8_f8 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=0.84u +MM8_f9 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=0.84u +MM8_f10 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=0.84u +MM8_f11 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=0.84u +MM8_f12 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=0.84u +MM8_f13 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=0.84u +MM8_f14 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=0.84u +MM8_f15 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=0.84u +MM9_f0 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM9_f1 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM9_f2 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM9_f3 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM9_f4 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM9_f5 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM9_f6 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM9_f7 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM9_f8 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM9_f9 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM9_f10 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM9_f11 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM9_f12 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM9_f13 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM9_f14 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM9_f15 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM10_f0 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM10_f1 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM10_f2 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM10_f3 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM10_f4 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM10_f5 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM10_f6 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM10_f7 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM10_f8 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM10_f9 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM10_f10 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM10_f11 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM10_f12 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM10_f13 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM10_f14 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM10_f15 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=0.84u +.ends C10_gf180_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C10/gf180/sW2_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW2_sL1.5/testbench.spice new file mode 100644 index 00000000..c8eeca47 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW2_sL1.5/testbench.spice @@ -0,0 +1,48 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 C10_gf180_sW2_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIB1 VDD IB1 4e-05 +.nodeset v(IB1)=0.99 +MB_VB1 VB1 VB1 VSS VSS nfet_03v3 w=8u l=0.84u +IB_VB1 VDDB VB1 0.00018 +MB_VB2 VB2 VB2 VDDB VDDB pfet_03v3 w=8u l=0.84u +IB_VB2 VB2 VSS 0.00018 +MB_VB3 VB3 VB3 VDDB VDDB pfet_03v3 w=8u l=0.84u +IB_VB3 VB3 VSS 2e-05 +MB_VB4n VB4n VB4n VSS VSS nfet_03v3 w=8u l=0.84u +IB_VB4n VDDB VB4n 4e-05 +VCM VCM 0 1.5 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 5e-13 +CL2 VOUT2 0 5e-13 +BCMFB VB4 0 V = v(VB4n) + 20*((v(VOUT1)+v(VOUT2))/2 - 1.65) +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +meas ac ugf when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C10/gf180/sW2_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW2_sL1/case.json new file mode 100644 index 00000000..bb6e2384 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW2_sL1/case.json @@ -0,0 +1,303 @@ +{ + "case_id": "C10_gf180_sW2_sL1", + "circuit_id": "C10", + "pdk": "gf180", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "dut_name": "C10_gf180_sW2_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1", + "VB2", + "VB3", + "VB4", + "IB1" + ], + "sizing": { + "M1": { + "w": 8.0, + "l": 0.56, + "nf": 16 + }, + "M2": { + "w": 8.0, + "l": 0.56, + "nf": 16 + }, + "M3": { + "w": 8.0, + "l": 0.56, + "nf": 16 + }, + "M4": { + "w": 8.0, + "l": 0.56, + "nf": 16 + }, + "M5": { + "w": 8.0, + "l": 0.56, + "nf": 16 + }, + "M6": { + "w": 8.0, + "l": 0.56, + "nf": 16 + }, + "M7": { + "w": 8.0, + "l": 0.56, + "nf": 16 + }, + "M8": { + "w": 8.0, + "l": 0.56, + "nf": 16 + }, + "M9": { + "w": 8.0, + "l": 0.56, + "nf": 16 + }, + "M10": { + "w": 8.0, + "l": 0.56, + "nf": 16 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M5", + "current": 2e-05, + "kind": "cascode3" + }, + "VB2": { + "replica": "M7", + "current": 2e-05, + "kind": "cascode3" + }, + "VB3": { + "replica": "M9", + "current": 2e-05 + }, + "VB4": { + "replica": "M3", + "current": 4e-05 + }, + "IB1": { + "i": 4e-05, + "from": "VDD" + } + }, + "load": { + "vcm": 1.5, + "CL": 5e-13, + "cmfb_gain": 20.0, + "vocm": 1.65 + }, + "category": "ota_fd", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M9": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M10": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "2b37eb1bddd0a71f", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M5", + "current_A": 2e-05, + "variant": "cascode3" + }, + { + "kind": "replica_bias", + "port": "VB2", + "replica_of": "M7", + "current_A": 2e-05, + "variant": "cascode3" + }, + { + "kind": "replica_bias", + "port": "VB3", + "replica_of": "M9", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "replica_bias", + "port": "VB4", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VDD" + }, + { + "kind": "testbench_element", + "what": "ideal common-mode feedback on VB4" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8", + "M9", + "M10" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/gf180/sW2_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW2_sL1/manifest.json new file mode 100644 index 00000000..67b3078b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW2_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "7b47e294fd52d1f07ef0b83ed48c445ab274a9d4b3250b5df2abbef3f7499da5", + "qualification.json": "61f4d821105231f90814c140e395051a10e3a37f0834dbd2357dd9fea1d32d0b", + "specs.json": "b1059ddd34fcafb81fb6ec9890a2b028ba2791a283750292e030eb72b5a4e746", + "target.spice": "da51f2e768c91249988c4d6bef3ac2202fd14b911d585f928fdacd1139b7bf90", + "target_lvs.spice": "fad05b8a33d82112e24f614ab5324ac45de972f7d81fd8bb83b2b79e96742bf5", + "testbench.spice": "88d35f8983511db98b95124bbaedf398067d9c08fc00f11c18912ee8d5c24866" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/gf180/sW2_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW2_sL1/qualification.json new file mode 100644 index 00000000..9a04dcd6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW2_sL1/qualification.json @@ -0,0 +1,180 @@ +{ + "case_id": "C10_gf180_sW2_sL1", + "circuit_id": "C10", + "pdk": "gf180", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "ota_fd", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M9": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M10": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "2b37eb1bddd0a71f", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 59.56 + }, + "ugf": { + "min": 22670000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 62.56124, + "ugf": 37786640.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.2, + "schematic_measures": { + "vo1": 1.649748, + "vo2": 1.649748, + "idd": 8.122218e-05, + "vos_in": 3.637979e-12, + "gain_lf": 62.56124, + "ugf": 37786640.0, + "f3db": 28038.02 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/gf180/sW2_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW2_sL1/specs.json new file mode 100644 index 00000000..2fe7448a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW2_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 59.56 + }, + "ugf": { + "min": 22670000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 62.56124, + "ugf": 37786640.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/gf180/sW2_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW2_sL1/target.spice new file mode 100644 index 00000000..6cb400fa --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW2_sL1/target.spice @@ -0,0 +1,12 @@ +.subckt C10_gf180_sW2_sL1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 +MM1 net022 VIN1 IB1 VDD pfet_03v3 w=8u l=0.56u nf=16 m=1 +MM2 net018 VIN2 IB1 VDD pfet_03v3 w=8u l=0.56u nf=16 m=1 +MM3 net022 VB4 VSS VSS nfet_03v3 w=8u l=0.56u nf=16 m=1 +MM4 net018 VB4 VSS VSS nfet_03v3 w=8u l=0.56u nf=16 m=1 +MM5 VOUT1 VB1 net022 VSS nfet_03v3 w=8u l=0.56u nf=16 m=1 +MM6 VOUT2 VB1 net018 VSS nfet_03v3 w=8u l=0.56u nf=16 m=1 +MM7 VOUT1 VB2 net023 VDD pfet_03v3 w=8u l=0.56u nf=16 m=1 +MM8 VOUT2 VB2 net021 VDD pfet_03v3 w=8u l=0.56u nf=16 m=1 +MM9 net023 VB3 VDD VDD pfet_03v3 w=8u l=0.56u nf=16 m=1 +MM10 net021 VB3 VDD VDD pfet_03v3 w=8u l=0.56u nf=16 m=1 +.ends C10_gf180_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C10/gf180/sW2_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW2_sL1/target_lvs.spice new file mode 100644 index 00000000..9fb63424 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW2_sL1/target_lvs.spice @@ -0,0 +1,162 @@ +.subckt C10_gf180_sW2_sL1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 +MM1_f0 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=0.56u +MM1_f1 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=0.56u +MM1_f2 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=0.56u +MM1_f3 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=0.56u +MM1_f4 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=0.56u +MM1_f5 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=0.56u +MM1_f6 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=0.56u +MM1_f7 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=0.56u +MM1_f8 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=0.56u +MM1_f9 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=0.56u +MM1_f10 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=0.56u +MM1_f11 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=0.56u +MM1_f12 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=0.56u +MM1_f13 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=0.56u +MM1_f14 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=0.56u +MM1_f15 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=0.56u +MM2_f0 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=0.56u +MM2_f1 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=0.56u +MM2_f2 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=0.56u +MM2_f3 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=0.56u +MM2_f4 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=0.56u +MM2_f5 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=0.56u +MM2_f6 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=0.56u +MM2_f7 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=0.56u +MM2_f8 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=0.56u +MM2_f9 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=0.56u +MM2_f10 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=0.56u +MM2_f11 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=0.56u +MM2_f12 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=0.56u +MM2_f13 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=0.56u +MM2_f14 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=0.56u +MM2_f15 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=0.56u +MM3_f0 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f1 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f2 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f3 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f4 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f5 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f6 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f7 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f8 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f9 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f10 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f11 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f12 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f13 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f14 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f15 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM4_f0 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM4_f1 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM4_f2 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM4_f3 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM4_f4 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM4_f5 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM4_f6 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM4_f7 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM4_f8 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM4_f9 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM4_f10 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM4_f11 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM4_f12 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM4_f13 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM4_f14 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM4_f15 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM5_f0 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f1 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f2 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f3 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f4 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f5 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f6 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f7 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f8 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f9 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f10 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f11 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f12 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f13 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f14 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f15 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=0.56u +MM6_f0 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=0.56u +MM6_f1 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=0.56u +MM6_f2 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=0.56u +MM6_f3 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=0.56u +MM6_f4 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=0.56u +MM6_f5 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=0.56u +MM6_f6 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=0.56u +MM6_f7 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=0.56u +MM6_f8 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=0.56u +MM6_f9 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=0.56u +MM6_f10 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=0.56u +MM6_f11 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=0.56u +MM6_f12 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=0.56u +MM6_f13 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=0.56u +MM6_f14 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=0.56u +MM6_f15 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=0.56u +MM7_f0 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=0.56u +MM7_f1 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=0.56u +MM7_f2 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=0.56u +MM7_f3 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=0.56u +MM7_f4 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=0.56u +MM7_f5 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=0.56u +MM7_f6 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=0.56u +MM7_f7 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=0.56u +MM7_f8 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=0.56u +MM7_f9 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=0.56u +MM7_f10 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=0.56u +MM7_f11 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=0.56u +MM7_f12 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=0.56u +MM7_f13 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=0.56u +MM7_f14 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=0.56u +MM7_f15 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=0.56u +MM8_f0 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=0.56u +MM8_f1 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=0.56u +MM8_f2 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=0.56u +MM8_f3 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=0.56u +MM8_f4 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=0.56u +MM8_f5 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=0.56u +MM8_f6 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=0.56u +MM8_f7 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=0.56u +MM8_f8 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=0.56u +MM8_f9 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=0.56u +MM8_f10 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=0.56u +MM8_f11 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=0.56u +MM8_f12 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=0.56u +MM8_f13 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=0.56u +MM8_f14 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=0.56u +MM8_f15 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=0.56u +MM9_f0 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM9_f1 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM9_f2 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM9_f3 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM9_f4 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM9_f5 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM9_f6 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM9_f7 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM9_f8 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM9_f9 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM9_f10 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM9_f11 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM9_f12 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM9_f13 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM9_f14 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM9_f15 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM10_f0 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM10_f1 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM10_f2 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM10_f3 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM10_f4 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM10_f5 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM10_f6 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM10_f7 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM10_f8 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM10_f9 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM10_f10 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM10_f11 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM10_f12 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM10_f13 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM10_f14 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM10_f15 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=0.56u +.ends C10_gf180_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C10/gf180/sW2_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW2_sL1/testbench.spice new file mode 100644 index 00000000..fb0d829b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW2_sL1/testbench.spice @@ -0,0 +1,48 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 C10_gf180_sW2_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIB1 VDD IB1 4e-05 +.nodeset v(IB1)=0.99 +MB_VB1 VB1 VB1 VSS VSS nfet_03v3 w=8u l=0.56u +IB_VB1 VDDB VB1 0.00018 +MB_VB2 VB2 VB2 VDDB VDDB pfet_03v3 w=8u l=0.56u +IB_VB2 VB2 VSS 0.00018 +MB_VB3 VB3 VB3 VDDB VDDB pfet_03v3 w=8u l=0.56u +IB_VB3 VB3 VSS 2e-05 +MB_VB4n VB4n VB4n VSS VSS nfet_03v3 w=8u l=0.56u +IB_VB4n VDDB VB4n 4e-05 +VCM VCM 0 1.5 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 5e-13 +CL2 VOUT2 0 5e-13 +BCMFB VB4 0 V = v(VB4n) + 20*((v(VOUT1)+v(VOUT2))/2 - 1.65) +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +meas ac ugf when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C10/gf180/sW2_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW2_sL2/case.json new file mode 100644 index 00000000..2f87b957 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW2_sL2/case.json @@ -0,0 +1,303 @@ +{ + "case_id": "C10_gf180_sW2_sL2", + "circuit_id": "C10", + "pdk": "gf180", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "dut_name": "C10_gf180_sW2_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1", + "VB2", + "VB3", + "VB4", + "IB1" + ], + "sizing": { + "M1": { + "w": 8.0, + "l": 1.12, + "nf": 16 + }, + "M2": { + "w": 8.0, + "l": 1.12, + "nf": 16 + }, + "M3": { + "w": 8.0, + "l": 1.12, + "nf": 16 + }, + "M4": { + "w": 8.0, + "l": 1.12, + "nf": 16 + }, + "M5": { + "w": 8.0, + "l": 1.12, + "nf": 16 + }, + "M6": { + "w": 8.0, + "l": 1.12, + "nf": 16 + }, + "M7": { + "w": 8.0, + "l": 1.12, + "nf": 16 + }, + "M8": { + "w": 8.0, + "l": 1.12, + "nf": 16 + }, + "M9": { + "w": 8.0, + "l": 1.12, + "nf": 16 + }, + "M10": { + "w": 8.0, + "l": 1.12, + "nf": 16 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M5", + "current": 2e-05, + "kind": "cascode3" + }, + "VB2": { + "replica": "M7", + "current": 2e-05, + "kind": "cascode3" + }, + "VB3": { + "replica": "M9", + "current": 2e-05 + }, + "VB4": { + "replica": "M3", + "current": 4e-05 + }, + "IB1": { + "i": 4e-05, + "from": "VDD" + } + }, + "load": { + "vcm": 1.5, + "CL": 5e-13, + "cmfb_gain": 20.0, + "vocm": 1.65 + }, + "category": "ota_fd", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M9": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M10": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "f2098ffbf1d166a7", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M5", + "current_A": 2e-05, + "variant": "cascode3" + }, + { + "kind": "replica_bias", + "port": "VB2", + "replica_of": "M7", + "current_A": 2e-05, + "variant": "cascode3" + }, + { + "kind": "replica_bias", + "port": "VB3", + "replica_of": "M9", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "replica_bias", + "port": "VB4", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VDD" + }, + { + "kind": "testbench_element", + "what": "ideal common-mode feedback on VB4" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8", + "M9", + "M10" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/gf180/sW2_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW2_sL2/manifest.json new file mode 100644 index 00000000..3027fc31 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW2_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "faf5bb15fddb9f05e97efa6317c201a86ebcd2337e28ea5377b17011b76edf47", + "qualification.json": "df62717f9a2e21b8040f6b52062c47ae13dfbee66e074cabcfbef06ec8a58bf0", + "specs.json": "5285e6a3897ff26d04f96636085f29f384711029d734c3e091444e3ecc3abbfc", + "target.spice": "0763329743187e1109fd26c9d12d79cac9c3a600573ebe0c7437f3ded7778f77", + "target_lvs.spice": "6ed0c9d117340da55c0fb780c0bc194b3e6faf8d91be960ae803b10ebcebf44f", + "testbench.spice": "073d132bddc518e3d41cb65bc7560de76f16ec5fcd4b4799e43ac11e9b69317a" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/gf180/sW2_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW2_sL2/qualification.json new file mode 100644 index 00000000..fba0a30f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW2_sL2/qualification.json @@ -0,0 +1,180 @@ +{ + "case_id": "C10_gf180_sW2_sL2", + "circuit_id": "C10", + "pdk": "gf180", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "ota_fd", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M9": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M10": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "f2098ffbf1d166a7", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 69.25 + }, + "ugf": { + "min": 15630000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 72.24854, + "ugf": 26051210.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.2, + "schematic_measures": { + "vo1": 1.650557, + "vo2": 1.650557, + "idd": 7.950629e-05, + "vos_in": 3.637979e-12, + "gain_lf": 72.24854, + "ugf": 26051210.0, + "f3db": 6351.242 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/gf180/sW2_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW2_sL2/specs.json new file mode 100644 index 00000000..732ca26e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW2_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 69.25 + }, + "ugf": { + "min": 15630000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 72.24854, + "ugf": 26051210.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/gf180/sW2_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW2_sL2/target.spice new file mode 100644 index 00000000..075b3af0 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW2_sL2/target.spice @@ -0,0 +1,12 @@ +.subckt C10_gf180_sW2_sL2 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 +MM1 net022 VIN1 IB1 VDD pfet_03v3 w=8u l=1.12u nf=16 m=1 +MM2 net018 VIN2 IB1 VDD pfet_03v3 w=8u l=1.12u nf=16 m=1 +MM3 net022 VB4 VSS VSS nfet_03v3 w=8u l=1.12u nf=16 m=1 +MM4 net018 VB4 VSS VSS nfet_03v3 w=8u l=1.12u nf=16 m=1 +MM5 VOUT1 VB1 net022 VSS nfet_03v3 w=8u l=1.12u nf=16 m=1 +MM6 VOUT2 VB1 net018 VSS nfet_03v3 w=8u l=1.12u nf=16 m=1 +MM7 VOUT1 VB2 net023 VDD pfet_03v3 w=8u l=1.12u nf=16 m=1 +MM8 VOUT2 VB2 net021 VDD pfet_03v3 w=8u l=1.12u nf=16 m=1 +MM9 net023 VB3 VDD VDD pfet_03v3 w=8u l=1.12u nf=16 m=1 +MM10 net021 VB3 VDD VDD pfet_03v3 w=8u l=1.12u nf=16 m=1 +.ends C10_gf180_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C10/gf180/sW2_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW2_sL2/target_lvs.spice new file mode 100644 index 00000000..9440bb20 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW2_sL2/target_lvs.spice @@ -0,0 +1,162 @@ +.subckt C10_gf180_sW2_sL2 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 +MM1_f0 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=1.12u +MM1_f1 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=1.12u +MM1_f2 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=1.12u +MM1_f3 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=1.12u +MM1_f4 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=1.12u +MM1_f5 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=1.12u +MM1_f6 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=1.12u +MM1_f7 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=1.12u +MM1_f8 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=1.12u +MM1_f9 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=1.12u +MM1_f10 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=1.12u +MM1_f11 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=1.12u +MM1_f12 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=1.12u +MM1_f13 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=1.12u +MM1_f14 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=1.12u +MM1_f15 net022 VIN1 IB1 VDD pfet_03v3 w=0.5u l=1.12u +MM2_f0 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=1.12u +MM2_f1 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=1.12u +MM2_f2 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=1.12u +MM2_f3 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=1.12u +MM2_f4 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=1.12u +MM2_f5 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=1.12u +MM2_f6 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=1.12u +MM2_f7 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=1.12u +MM2_f8 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=1.12u +MM2_f9 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=1.12u +MM2_f10 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=1.12u +MM2_f11 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=1.12u +MM2_f12 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=1.12u +MM2_f13 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=1.12u +MM2_f14 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=1.12u +MM2_f15 net018 VIN2 IB1 VDD pfet_03v3 w=0.5u l=1.12u +MM3_f0 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f1 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f2 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f3 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f4 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f5 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f6 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f7 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f8 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f9 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f10 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f11 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f12 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f13 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f14 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f15 net022 VB4 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM4_f0 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM4_f1 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM4_f2 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM4_f3 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM4_f4 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM4_f5 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM4_f6 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM4_f7 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM4_f8 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM4_f9 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM4_f10 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM4_f11 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM4_f12 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM4_f13 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM4_f14 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM4_f15 net018 VB4 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM5_f0 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f1 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f2 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f3 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f4 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f5 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f6 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f7 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f8 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f9 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f10 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f11 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f12 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f13 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f14 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f15 VOUT1 VB1 net022 VSS nfet_03v3 w=0.5u l=1.12u +MM6_f0 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=1.12u +MM6_f1 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=1.12u +MM6_f2 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=1.12u +MM6_f3 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=1.12u +MM6_f4 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=1.12u +MM6_f5 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=1.12u +MM6_f6 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=1.12u +MM6_f7 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=1.12u +MM6_f8 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=1.12u +MM6_f9 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=1.12u +MM6_f10 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=1.12u +MM6_f11 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=1.12u +MM6_f12 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=1.12u +MM6_f13 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=1.12u +MM6_f14 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=1.12u +MM6_f15 VOUT2 VB1 net018 VSS nfet_03v3 w=0.5u l=1.12u +MM7_f0 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=1.12u +MM7_f1 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=1.12u +MM7_f2 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=1.12u +MM7_f3 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=1.12u +MM7_f4 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=1.12u +MM7_f5 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=1.12u +MM7_f6 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=1.12u +MM7_f7 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=1.12u +MM7_f8 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=1.12u +MM7_f9 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=1.12u +MM7_f10 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=1.12u +MM7_f11 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=1.12u +MM7_f12 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=1.12u +MM7_f13 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=1.12u +MM7_f14 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=1.12u +MM7_f15 VOUT1 VB2 net023 VDD pfet_03v3 w=0.5u l=1.12u +MM8_f0 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=1.12u +MM8_f1 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=1.12u +MM8_f2 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=1.12u +MM8_f3 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=1.12u +MM8_f4 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=1.12u +MM8_f5 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=1.12u +MM8_f6 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=1.12u +MM8_f7 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=1.12u +MM8_f8 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=1.12u +MM8_f9 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=1.12u +MM8_f10 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=1.12u +MM8_f11 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=1.12u +MM8_f12 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=1.12u +MM8_f13 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=1.12u +MM8_f14 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=1.12u +MM8_f15 VOUT2 VB2 net021 VDD pfet_03v3 w=0.5u l=1.12u +MM9_f0 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM9_f1 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM9_f2 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM9_f3 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM9_f4 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM9_f5 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM9_f6 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM9_f7 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM9_f8 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM9_f9 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM9_f10 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM9_f11 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM9_f12 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM9_f13 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM9_f14 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM9_f15 net023 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM10_f0 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM10_f1 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM10_f2 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM10_f3 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM10_f4 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM10_f5 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM10_f6 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM10_f7 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM10_f8 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM10_f9 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM10_f10 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM10_f11 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM10_f12 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM10_f13 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM10_f14 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM10_f15 net021 VB3 VDD VDD pfet_03v3 w=0.5u l=1.12u +.ends C10_gf180_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C10/gf180/sW2_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW2_sL2/testbench.spice new file mode 100644 index 00000000..7ec32ae9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/gf180/sW2_sL2/testbench.spice @@ -0,0 +1,48 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 C10_gf180_sW2_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIB1 VDD IB1 4e-05 +.nodeset v(IB1)=0.99 +MB_VB1 VB1 VB1 VSS VSS nfet_03v3 w=8u l=1.12u +IB_VB1 VDDB VB1 0.00018 +MB_VB2 VB2 VB2 VDDB VDDB pfet_03v3 w=8u l=1.12u +IB_VB2 VB2 VSS 0.00018 +MB_VB3 VB3 VB3 VDDB VDDB pfet_03v3 w=8u l=1.12u +IB_VB3 VB3 VSS 2e-05 +MB_VB4n VB4n VB4n VSS VSS nfet_03v3 w=8u l=1.12u +IB_VB4n VDDB VB4n 4e-05 +VCM VCM 0 1.5 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 5e-13 +CL2 VOUT2 0 5e-13 +BCMFB VB4 0 V = v(VB4n) + 20*((v(VOUT1)+v(VOUT2))/2 - 1.65) +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +meas ac ugf when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW0.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW0.5_sL1.5/case.json new file mode 100644 index 00000000..91d977cf --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW0.5_sL1.5/case.json @@ -0,0 +1,303 @@ +{ + "case_id": "C10_ihp130_sW0.5_sL1.5", + "circuit_id": "C10", + "pdk": "ihp130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "dut_name": "C10_ihp130_sW0.5_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1", + "VB2", + "VB3", + "VB4", + "IB1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.78, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 0.78, + "nf": 4 + }, + "M3": { + "w": 2.0, + "l": 0.78, + "nf": 4 + }, + "M4": { + "w": 2.0, + "l": 0.78, + "nf": 4 + }, + "M5": { + "w": 2.0, + "l": 0.78, + "nf": 4 + }, + "M6": { + "w": 2.0, + "l": 0.78, + "nf": 4 + }, + "M7": { + "w": 2.0, + "l": 0.78, + "nf": 4 + }, + "M8": { + "w": 2.0, + "l": 0.78, + "nf": 4 + }, + "M9": { + "w": 2.0, + "l": 0.78, + "nf": 4 + }, + "M10": { + "w": 2.0, + "l": 0.78, + "nf": 4 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M5", + "current": 2e-05, + "kind": "cascode3" + }, + "VB2": { + "replica": "M7", + "current": 2e-05, + "kind": "cascode3" + }, + "VB3": { + "replica": "M9", + "current": 2e-05 + }, + "VB4": { + "replica": "M3", + "current": 4e-05 + }, + "IB1": { + "i": 4e-05, + "from": "VDD" + } + }, + "load": { + "vcm": 0.6, + "CL": 5e-13, + "cmfb_gain": 20.0, + "vocm": 0.6 + }, + "category": "ota_fd", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.78, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.78, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.78, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.78, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.78, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.78, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.78, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.78, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M9": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.78, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M10": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.78, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "15af3e252f0102f6", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M5", + "current_A": 2e-05, + "variant": "cascode3" + }, + { + "kind": "replica_bias", + "port": "VB2", + "replica_of": "M7", + "current_A": 2e-05, + "variant": "cascode3" + }, + { + "kind": "replica_bias", + "port": "VB3", + "replica_of": "M9", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "replica_bias", + "port": "VB4", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VDD" + }, + { + "kind": "testbench_element", + "what": "ideal common-mode feedback on VB4" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8", + "M9", + "M10" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW0.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW0.5_sL1.5/manifest.json new file mode 100644 index 00000000..602ef859 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW0.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "325598f1fd9ad25e592f72ae0b1b2933f2e0383d861ecf7da5a9f45071d06b88", + "qualification.json": "e0958c397eb49662738378bb02692b2ee8332e665e431165707c2e118659b8e3", + "specs.json": "f93216ccdeadcd4c580c96e384fa53228b7cdcc7ef376f25390121257512f8a6", + "target.spice": "6c43c3cabbe67e333b2b7d6d6940d3e74ee878c684483bd44298108f5fbce0a0", + "target_lvs.spice": "09f7d4b1d65c1ae00d1323a2b4689651f27899fe572bb0f5a8b10a9371d8c4f5", + "testbench.spice": "3af45f13decbadc9494627db478c71d982d4a0bed75508c462a497f75ca1b434" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW0.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW0.5_sL1.5/qualification.json new file mode 100644 index 00000000..9b9964c5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW0.5_sL1.5/qualification.json @@ -0,0 +1,182 @@ +{ + "case_id": "C10_ihp130_sW0.5_sL1.5", + "circuit_id": "C10", + "pdk": "ihp130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "ota_fd", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.78, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.78, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.78, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.78, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.78, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.78, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.78, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.78, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M9": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.78, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M10": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.78, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "15af3e252f0102f6", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "gain_lf=27.28 below floor 35" + ], + "spec": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 16330000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 27.28475, + "ugf": 27211820.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.5, + "schematic_measures": { + "vo1": 0.6013167, + "vo2": 0.6013167, + "idd": 8.423659e-05, + "vos_in": 4.547474e-12, + "gain_lf": 27.28475, + "ugf": 27211820.0, + "f3db": 1172969.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW0.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW0.5_sL1.5/specs.json new file mode 100644 index 00000000..c1658251 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW0.5_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 16330000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 27.28475, + "ugf": 27211820.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW0.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW0.5_sL1.5/target.spice new file mode 100644 index 00000000..70b46c13 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW0.5_sL1.5/target.spice @@ -0,0 +1,12 @@ +.subckt C10_ihp130_sW0.5_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 +XM1 net022 VIN1 IB1 VDD sg13_lv_pmos w=2u l=0.78u ng=4 m=1 +XM2 net018 VIN2 IB1 VDD sg13_lv_pmos w=2u l=0.78u ng=4 m=1 +XM3 net022 VB4 VSS VSS sg13_lv_nmos w=2u l=0.78u ng=4 m=1 +XM4 net018 VB4 VSS VSS sg13_lv_nmos w=2u l=0.78u ng=4 m=1 +XM5 VOUT1 VB1 net022 VSS sg13_lv_nmos w=2u l=0.78u ng=4 m=1 +XM6 VOUT2 VB1 net018 VSS sg13_lv_nmos w=2u l=0.78u ng=4 m=1 +XM7 VOUT1 VB2 net023 VDD sg13_lv_pmos w=2u l=0.78u ng=4 m=1 +XM8 VOUT2 VB2 net021 VDD sg13_lv_pmos w=2u l=0.78u ng=4 m=1 +XM9 net023 VB3 VDD VDD sg13_lv_pmos w=2u l=0.78u ng=4 m=1 +XM10 net021 VB3 VDD VDD sg13_lv_pmos w=2u l=0.78u ng=4 m=1 +.ends C10_ihp130_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW0.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW0.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..745a0e6a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW0.5_sL1.5/target_lvs.spice @@ -0,0 +1,42 @@ +.subckt C10_ihp130_sW0.5_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 +XM1_f0 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=0.78u +XM1_f1 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=0.78u +XM1_f2 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=0.78u +XM1_f3 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=0.78u +XM2_f0 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=0.78u +XM2_f1 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=0.78u +XM2_f2 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=0.78u +XM2_f3 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=0.78u +XM3_f0 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f1 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f2 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f3 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM4_f0 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM4_f1 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM4_f2 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM4_f3 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM5_f0 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=0.78u +XM5_f1 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=0.78u +XM5_f2 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=0.78u +XM5_f3 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=0.78u +XM6_f0 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.78u +XM6_f1 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.78u +XM6_f2 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.78u +XM6_f3 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.78u +XM7_f0 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=0.78u +XM7_f1 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=0.78u +XM7_f2 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=0.78u +XM7_f3 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=0.78u +XM8_f0 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=0.78u +XM8_f1 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=0.78u +XM8_f2 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=0.78u +XM8_f3 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=0.78u +XM9_f0 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM9_f1 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM9_f2 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM9_f3 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM10_f0 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM10_f1 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM10_f2 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM10_f3 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +.ends C10_ihp130_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW0.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW0.5_sL1.5/testbench.spice new file mode 100644 index 00000000..f212bde9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW0.5_sL1.5/testbench.spice @@ -0,0 +1,48 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 C10_ihp130_sW0.5_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIB1 VDD IB1 4e-05 +.nodeset v(IB1)=0.36 +XB_VB1 VB1 VB1 VSS VSS sg13_lv_nmos w=2u l=0.78u +IB_VB1 VDDB VB1 0.00018 +XB_VB2 VB2 VB2 VDDB VDDB sg13_lv_pmos w=2u l=0.78u +IB_VB2 VB2 VSS 0.00018 +XB_VB3 VB3 VB3 VDDB VDDB sg13_lv_pmos w=2u l=0.78u +IB_VB3 VB3 VSS 2e-05 +XB_VB4n VB4n VB4n VSS VSS sg13_lv_nmos w=2u l=0.78u +IB_VB4n VDDB VB4n 4e-05 +VCM VCM 0 0.6 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 5e-13 +CL2 VOUT2 0 5e-13 +BCMFB VB4 0 V = v(VB4n) + 20*((v(VOUT1)+v(VOUT2))/2 - 0.6) +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +meas ac ugf when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW0.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW0.5_sL1/case.json new file mode 100644 index 00000000..081be765 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW0.5_sL1/case.json @@ -0,0 +1,303 @@ +{ + "case_id": "C10_ihp130_sW0.5_sL1", + "circuit_id": "C10", + "pdk": "ihp130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "dut_name": "C10_ihp130_sW0.5_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1", + "VB2", + "VB3", + "VB4", + "IB1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.52, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 0.52, + "nf": 4 + }, + "M3": { + "w": 2.0, + "l": 0.52, + "nf": 4 + }, + "M4": { + "w": 2.0, + "l": 0.52, + "nf": 4 + }, + "M5": { + "w": 2.0, + "l": 0.52, + "nf": 4 + }, + "M6": { + "w": 2.0, + "l": 0.52, + "nf": 4 + }, + "M7": { + "w": 2.0, + "l": 0.52, + "nf": 4 + }, + "M8": { + "w": 2.0, + "l": 0.52, + "nf": 4 + }, + "M9": { + "w": 2.0, + "l": 0.52, + "nf": 4 + }, + "M10": { + "w": 2.0, + "l": 0.52, + "nf": 4 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M5", + "current": 2e-05, + "kind": "cascode3" + }, + "VB2": { + "replica": "M7", + "current": 2e-05, + "kind": "cascode3" + }, + "VB3": { + "replica": "M9", + "current": 2e-05 + }, + "VB4": { + "replica": "M3", + "current": 4e-05 + }, + "IB1": { + "i": 4e-05, + "from": "VDD" + } + }, + "load": { + "vcm": 0.6, + "CL": 5e-13, + "cmfb_gain": 20.0, + "vocm": 0.6 + }, + "category": "ota_fd", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M9": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M10": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "3c17ac99e063492f", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M5", + "current_A": 2e-05, + "variant": "cascode3" + }, + { + "kind": "replica_bias", + "port": "VB2", + "replica_of": "M7", + "current_A": 2e-05, + "variant": "cascode3" + }, + { + "kind": "replica_bias", + "port": "VB3", + "replica_of": "M9", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "replica_bias", + "port": "VB4", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VDD" + }, + { + "kind": "testbench_element", + "what": "ideal common-mode feedback on VB4" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8", + "M9", + "M10" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW0.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW0.5_sL1/manifest.json new file mode 100644 index 00000000..88b4ae52 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW0.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "099573ab51a0b8ff357241298ffb13c0d2aeff97535cd6d27ae7b882b5f4efc1", + "qualification.json": "87214d4c38aaa7e949a934647b00af65bd14ad573baeea2580406c40751d0668", + "specs.json": "9c2f090c54f603a34bc2f4ea4879891621d18593fd85526858041b605c37afba", + "target.spice": "9ebee905280b7fdf5e5c7c30af53d4e71bbbac53336ccc744098028277feb928", + "target_lvs.spice": "56788be11e510c2657c5d41605f6e13c6b6d55f049635906992cf9f27e88183d", + "testbench.spice": "7a6ccfb632dc008523fa6bff94e37f9eab4dba318d684c9646520f42c0a374a0" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW0.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW0.5_sL1/qualification.json new file mode 100644 index 00000000..001cc7b2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW0.5_sL1/qualification.json @@ -0,0 +1,182 @@ +{ + "case_id": "C10_ihp130_sW0.5_sL1", + "circuit_id": "C10", + "pdk": "ihp130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "ota_fd", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M9": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M10": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "3c17ac99e063492f", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "gain_lf=30.08 below floor 35" + ], + "spec": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 19710000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 30.0802, + "ugf": 32857060.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.7, + "schematic_measures": { + "vo1": 0.6014065, + "vo2": 0.6014065, + "idd": 8.360509e-05, + "vos_in": 9.094947e-13, + "gain_lf": 30.0802, + "ugf": 32857060.0, + "f3db": 1026079.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW0.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW0.5_sL1/specs.json new file mode 100644 index 00000000..bb598685 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW0.5_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 19710000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 30.0802, + "ugf": 32857060.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW0.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW0.5_sL1/target.spice new file mode 100644 index 00000000..b5b0a5b1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW0.5_sL1/target.spice @@ -0,0 +1,12 @@ +.subckt C10_ihp130_sW0.5_sL1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 +XM1 net022 VIN1 IB1 VDD sg13_lv_pmos w=2u l=0.52u ng=4 m=1 +XM2 net018 VIN2 IB1 VDD sg13_lv_pmos w=2u l=0.52u ng=4 m=1 +XM3 net022 VB4 VSS VSS sg13_lv_nmos w=2u l=0.52u ng=4 m=1 +XM4 net018 VB4 VSS VSS sg13_lv_nmos w=2u l=0.52u ng=4 m=1 +XM5 VOUT1 VB1 net022 VSS sg13_lv_nmos w=2u l=0.52u ng=4 m=1 +XM6 VOUT2 VB1 net018 VSS sg13_lv_nmos w=2u l=0.52u ng=4 m=1 +XM7 VOUT1 VB2 net023 VDD sg13_lv_pmos w=2u l=0.52u ng=4 m=1 +XM8 VOUT2 VB2 net021 VDD sg13_lv_pmos w=2u l=0.52u ng=4 m=1 +XM9 net023 VB3 VDD VDD sg13_lv_pmos w=2u l=0.52u ng=4 m=1 +XM10 net021 VB3 VDD VDD sg13_lv_pmos w=2u l=0.52u ng=4 m=1 +.ends C10_ihp130_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW0.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW0.5_sL1/target_lvs.spice new file mode 100644 index 00000000..f1ea1328 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW0.5_sL1/target_lvs.spice @@ -0,0 +1,42 @@ +.subckt C10_ihp130_sW0.5_sL1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 +XM1_f0 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f1 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f2 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f3 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f0 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f1 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f2 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f3 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM3_f0 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f1 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f2 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f3 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f0 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f1 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f2 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f3 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f0 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f1 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f2 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f3 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=0.52u +XM6_f0 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM6_f1 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM6_f2 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM6_f3 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM7_f0 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f1 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f2 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f3 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f0 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f1 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f2 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f3 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=0.52u +XM9_f0 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM9_f1 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM9_f2 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM9_f3 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM10_f0 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM10_f1 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM10_f2 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM10_f3 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +.ends C10_ihp130_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW0.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW0.5_sL1/testbench.spice new file mode 100644 index 00000000..e02d6c29 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW0.5_sL1/testbench.spice @@ -0,0 +1,48 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 C10_ihp130_sW0.5_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIB1 VDD IB1 4e-05 +.nodeset v(IB1)=0.36 +XB_VB1 VB1 VB1 VSS VSS sg13_lv_nmos w=2u l=0.52u +IB_VB1 VDDB VB1 0.00018 +XB_VB2 VB2 VB2 VDDB VDDB sg13_lv_pmos w=2u l=0.52u +IB_VB2 VB2 VSS 0.00018 +XB_VB3 VB3 VB3 VDDB VDDB sg13_lv_pmos w=2u l=0.52u +IB_VB3 VB3 VSS 2e-05 +XB_VB4n VB4n VB4n VSS VSS sg13_lv_nmos w=2u l=0.52u +IB_VB4n VDDB VB4n 4e-05 +VCM VCM 0 0.6 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 5e-13 +CL2 VOUT2 0 5e-13 +BCMFB VB4 0 V = v(VB4n) + 20*((v(VOUT1)+v(VOUT2))/2 - 0.6) +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +meas ac ugf when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW0.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW0.5_sL2/case.json new file mode 100644 index 00000000..bab12718 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW0.5_sL2/case.json @@ -0,0 +1,303 @@ +{ + "case_id": "C10_ihp130_sW0.5_sL2", + "circuit_id": "C10", + "pdk": "ihp130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "dut_name": "C10_ihp130_sW0.5_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1", + "VB2", + "VB3", + "VB4", + "IB1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 1.04, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 1.04, + "nf": 4 + }, + "M3": { + "w": 2.0, + "l": 1.04, + "nf": 4 + }, + "M4": { + "w": 2.0, + "l": 1.04, + "nf": 4 + }, + "M5": { + "w": 2.0, + "l": 1.04, + "nf": 4 + }, + "M6": { + "w": 2.0, + "l": 1.04, + "nf": 4 + }, + "M7": { + "w": 2.0, + "l": 1.04, + "nf": 4 + }, + "M8": { + "w": 2.0, + "l": 1.04, + "nf": 4 + }, + "M9": { + "w": 2.0, + "l": 1.04, + "nf": 4 + }, + "M10": { + "w": 2.0, + "l": 1.04, + "nf": 4 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M5", + "current": 2e-05, + "kind": "cascode3" + }, + "VB2": { + "replica": "M7", + "current": 2e-05, + "kind": "cascode3" + }, + "VB3": { + "replica": "M9", + "current": 2e-05 + }, + "VB4": { + "replica": "M3", + "current": 4e-05 + }, + "IB1": { + "i": 4e-05, + "from": "VDD" + } + }, + "load": { + "vcm": 0.6, + "CL": 5e-13, + "cmfb_gain": 20.0, + "vocm": 0.6 + }, + "category": "ota_fd", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.04, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.04, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.04, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.04, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.04, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.04, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.04, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.04, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M9": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.04, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M10": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.04, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "5b68becc522af8b2", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M5", + "current_A": 2e-05, + "variant": "cascode3" + }, + { + "kind": "replica_bias", + "port": "VB2", + "replica_of": "M7", + "current_A": 2e-05, + "variant": "cascode3" + }, + { + "kind": "replica_bias", + "port": "VB3", + "replica_of": "M9", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "replica_bias", + "port": "VB4", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VDD" + }, + { + "kind": "testbench_element", + "what": "ideal common-mode feedback on VB4" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8", + "M9", + "M10" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW0.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW0.5_sL2/manifest.json new file mode 100644 index 00000000..45599061 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW0.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "53773df5b6402ef94f2227eec38e5db2f3f4a571aec1a0a822ad2fe8fead722c", + "qualification.json": "2b128a0621a6ff0e59ee5d01793da480230c7e5bbeeb60fab66f3dfc9871e3ea", + "specs.json": "dae12c934e45f00b24cc08a93618947eac4b3b8534af77faacb42c089a78d61f", + "target.spice": "7b4402bb9e668044e55aa902961528432dcd064e8fffda7def3b511fcac511c3", + "target_lvs.spice": "ec188974a5c4b07650ce53b94fc3169fcd65f79ed15148af678f0e12f478cb35", + "testbench.spice": "eda02ce08d619fbecdfe9c1abfa9dff0b3681cd8830f6a741a7ff149db916e0d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW0.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW0.5_sL2/qualification.json new file mode 100644 index 00000000..049095e1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW0.5_sL2/qualification.json @@ -0,0 +1,182 @@ +{ + "case_id": "C10_ihp130_sW0.5_sL2", + "circuit_id": "C10", + "pdk": "ihp130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "ota_fd", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.04, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.04, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.04, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.04, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.04, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.04, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.04, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.04, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M9": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.04, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M10": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.04, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "5b68becc522af8b2", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "gain_lf=21.41 below floor 35" + ], + "spec": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 13890000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 21.40682, + "ugf": 23152470.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.5, + "schematic_measures": { + "vo1": 0.6012868, + "vo2": 0.6012868, + "idd": 8.429907e-05, + "vos_in": 0.0, + "gain_lf": 21.40682, + "ugf": 23152470.0, + "f3db": 1968790.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW0.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW0.5_sL2/specs.json new file mode 100644 index 00000000..c4c77467 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW0.5_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 13890000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 21.40682, + "ugf": 23152470.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW0.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW0.5_sL2/target.spice new file mode 100644 index 00000000..a955c357 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW0.5_sL2/target.spice @@ -0,0 +1,12 @@ +.subckt C10_ihp130_sW0.5_sL2 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 +XM1 net022 VIN1 IB1 VDD sg13_lv_pmos w=2u l=1.04u ng=4 m=1 +XM2 net018 VIN2 IB1 VDD sg13_lv_pmos w=2u l=1.04u ng=4 m=1 +XM3 net022 VB4 VSS VSS sg13_lv_nmos w=2u l=1.04u ng=4 m=1 +XM4 net018 VB4 VSS VSS sg13_lv_nmos w=2u l=1.04u ng=4 m=1 +XM5 VOUT1 VB1 net022 VSS sg13_lv_nmos w=2u l=1.04u ng=4 m=1 +XM6 VOUT2 VB1 net018 VSS sg13_lv_nmos w=2u l=1.04u ng=4 m=1 +XM7 VOUT1 VB2 net023 VDD sg13_lv_pmos w=2u l=1.04u ng=4 m=1 +XM8 VOUT2 VB2 net021 VDD sg13_lv_pmos w=2u l=1.04u ng=4 m=1 +XM9 net023 VB3 VDD VDD sg13_lv_pmos w=2u l=1.04u ng=4 m=1 +XM10 net021 VB3 VDD VDD sg13_lv_pmos w=2u l=1.04u ng=4 m=1 +.ends C10_ihp130_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW0.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW0.5_sL2/target_lvs.spice new file mode 100644 index 00000000..860d8903 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW0.5_sL2/target_lvs.spice @@ -0,0 +1,42 @@ +.subckt C10_ihp130_sW0.5_sL2 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 +XM1_f0 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=1.04u +XM1_f1 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=1.04u +XM1_f2 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=1.04u +XM1_f3 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=1.04u +XM2_f0 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=1.04u +XM2_f1 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=1.04u +XM2_f2 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=1.04u +XM2_f3 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=1.04u +XM3_f0 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM3_f1 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM3_f2 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM3_f3 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM4_f0 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM4_f1 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM4_f2 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM4_f3 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM5_f0 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=1.04u +XM5_f1 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=1.04u +XM5_f2 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=1.04u +XM5_f3 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=1.04u +XM6_f0 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=1.04u +XM6_f1 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=1.04u +XM6_f2 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=1.04u +XM6_f3 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=1.04u +XM7_f0 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=1.04u +XM7_f1 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=1.04u +XM7_f2 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=1.04u +XM7_f3 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=1.04u +XM8_f0 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=1.04u +XM8_f1 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=1.04u +XM8_f2 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=1.04u +XM8_f3 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=1.04u +XM9_f0 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=1.04u +XM9_f1 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=1.04u +XM9_f2 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=1.04u +XM9_f3 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=1.04u +XM10_f0 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=1.04u +XM10_f1 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=1.04u +XM10_f2 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=1.04u +XM10_f3 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=1.04u +.ends C10_ihp130_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW0.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW0.5_sL2/testbench.spice new file mode 100644 index 00000000..867bd899 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW0.5_sL2/testbench.spice @@ -0,0 +1,48 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 C10_ihp130_sW0.5_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIB1 VDD IB1 4e-05 +.nodeset v(IB1)=0.36 +XB_VB1 VB1 VB1 VSS VSS sg13_lv_nmos w=2u l=1.04u +IB_VB1 VDDB VB1 0.00018 +XB_VB2 VB2 VB2 VDDB VDDB sg13_lv_pmos w=2u l=1.04u +IB_VB2 VB2 VSS 0.00018 +XB_VB3 VB3 VB3 VDDB VDDB sg13_lv_pmos w=2u l=1.04u +IB_VB3 VB3 VSS 2e-05 +XB_VB4n VB4n VB4n VSS VSS sg13_lv_nmos w=2u l=1.04u +IB_VB4n VDDB VB4n 4e-05 +VCM VCM 0 0.6 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 5e-13 +CL2 VOUT2 0 5e-13 +BCMFB VB4 0 V = v(VB4n) + 20*((v(VOUT1)+v(VOUT2))/2 - 0.6) +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +meas ac ugf when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1.5_sL1.5/case.json new file mode 100644 index 00000000..451de5f5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1.5_sL1.5/case.json @@ -0,0 +1,303 @@ +{ + "case_id": "C10_ihp130_sW1.5_sL1.5", + "circuit_id": "C10", + "pdk": "ihp130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "dut_name": "C10_ihp130_sW1.5_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1", + "VB2", + "VB3", + "VB4", + "IB1" + ], + "sizing": { + "M1": { + "w": 6.0, + "l": 0.78, + "nf": 12 + }, + "M2": { + "w": 6.0, + "l": 0.78, + "nf": 12 + }, + "M3": { + "w": 6.0, + "l": 0.78, + "nf": 12 + }, + "M4": { + "w": 6.0, + "l": 0.78, + "nf": 12 + }, + "M5": { + "w": 6.0, + "l": 0.78, + "nf": 12 + }, + "M6": { + "w": 6.0, + "l": 0.78, + "nf": 12 + }, + "M7": { + "w": 6.0, + "l": 0.78, + "nf": 12 + }, + "M8": { + "w": 6.0, + "l": 0.78, + "nf": 12 + }, + "M9": { + "w": 6.0, + "l": 0.78, + "nf": 12 + }, + "M10": { + "w": 6.0, + "l": 0.78, + "nf": 12 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M5", + "current": 2e-05, + "kind": "cascode3" + }, + "VB2": { + "replica": "M7", + "current": 2e-05, + "kind": "cascode3" + }, + "VB3": { + "replica": "M9", + "current": 2e-05 + }, + "VB4": { + "replica": "M3", + "current": 4e-05 + }, + "IB1": { + "i": 4e-05, + "from": "VDD" + } + }, + "load": { + "vcm": 0.6, + "CL": 5e-13, + "cmfb_gain": 20.0, + "vocm": 0.6 + }, + "category": "ota_fd", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.78, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.78, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.78, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.78, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.78, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.78, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.78, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.78, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M9": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.78, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M10": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.78, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "9e8226f5d66e075f", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M5", + "current_A": 2e-05, + "variant": "cascode3" + }, + { + "kind": "replica_bias", + "port": "VB2", + "replica_of": "M7", + "current_A": 2e-05, + "variant": "cascode3" + }, + { + "kind": "replica_bias", + "port": "VB3", + "replica_of": "M9", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "replica_bias", + "port": "VB4", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VDD" + }, + { + "kind": "testbench_element", + "what": "ideal common-mode feedback on VB4" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8", + "M9", + "M10" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1.5_sL1.5/manifest.json new file mode 100644 index 00000000..84b442e3 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "f2ad3b4e72d1095527b837c92085f64bb8b522aebb5cd09de310e05b8c3aa0be", + "qualification.json": "dc76f466dfba9a7052c7da3ab847e4ecdabfe63eeca90d0ead0224e47a220fa5", + "specs.json": "12131826dedebb732e787fc22e681f804d9ee5d6fcb77d35d7f599870477399d", + "target.spice": "784957df572c45585cd13207ac2322512596b2ebec48d659f838b6c580d1c93f", + "target_lvs.spice": "922b6b2cd25c00ccd149a93bf48a2f3828271bb2ecddcc77d8eec255916284bd", + "testbench.spice": "25052094cc1d982f10edeee19229912ede4f3a0c4f0ecaba0b3f490b5892dfc4" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1.5_sL1.5/qualification.json new file mode 100644 index 00000000..25a28e09 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1.5_sL1.5/qualification.json @@ -0,0 +1,180 @@ +{ + "case_id": "C10_ihp130_sW1.5_sL1.5", + "circuit_id": "C10", + "pdk": "ihp130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "ota_fd", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.78, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.78, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.78, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.78, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.78, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.78, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.78, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.78, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M9": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.78, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M10": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.78, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "9e8226f5d66e075f", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 25850000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 37.46391, + "ugf": 43086990.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 2.1, + "schematic_measures": { + "vo1": 0.6022738, + "vo2": 0.6022738, + "idd": 8.728037e-05, + "vos_in": -2.54659e-11, + "gain_lf": 37.46391, + "ugf": 43086990.0, + "f3db": 574821.5 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1.5_sL1.5/specs.json new file mode 100644 index 00000000..09656a6a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1.5_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 25850000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 37.46391, + "ugf": 43086990.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1.5_sL1.5/target.spice new file mode 100644 index 00000000..bed623e3 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1.5_sL1.5/target.spice @@ -0,0 +1,12 @@ +.subckt C10_ihp130_sW1.5_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 +XM1 net022 VIN1 IB1 VDD sg13_lv_pmos w=6u l=0.78u ng=12 m=1 +XM2 net018 VIN2 IB1 VDD sg13_lv_pmos w=6u l=0.78u ng=12 m=1 +XM3 net022 VB4 VSS VSS sg13_lv_nmos w=6u l=0.78u ng=12 m=1 +XM4 net018 VB4 VSS VSS sg13_lv_nmos w=6u l=0.78u ng=12 m=1 +XM5 VOUT1 VB1 net022 VSS sg13_lv_nmos w=6u l=0.78u ng=12 m=1 +XM6 VOUT2 VB1 net018 VSS sg13_lv_nmos w=6u l=0.78u ng=12 m=1 +XM7 VOUT1 VB2 net023 VDD sg13_lv_pmos w=6u l=0.78u ng=12 m=1 +XM8 VOUT2 VB2 net021 VDD sg13_lv_pmos w=6u l=0.78u ng=12 m=1 +XM9 net023 VB3 VDD VDD sg13_lv_pmos w=6u l=0.78u ng=12 m=1 +XM10 net021 VB3 VDD VDD sg13_lv_pmos w=6u l=0.78u ng=12 m=1 +.ends C10_ihp130_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..0be0f5ec --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1.5_sL1.5/target_lvs.spice @@ -0,0 +1,122 @@ +.subckt C10_ihp130_sW1.5_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 +XM1_f0 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=0.78u +XM1_f1 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=0.78u +XM1_f2 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=0.78u +XM1_f3 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=0.78u +XM1_f4 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=0.78u +XM1_f5 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=0.78u +XM1_f6 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=0.78u +XM1_f7 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=0.78u +XM1_f8 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=0.78u +XM1_f9 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=0.78u +XM1_f10 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=0.78u +XM1_f11 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=0.78u +XM2_f0 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=0.78u +XM2_f1 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=0.78u +XM2_f2 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=0.78u +XM2_f3 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=0.78u +XM2_f4 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=0.78u +XM2_f5 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=0.78u +XM2_f6 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=0.78u +XM2_f7 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=0.78u +XM2_f8 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=0.78u +XM2_f9 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=0.78u +XM2_f10 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=0.78u +XM2_f11 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=0.78u +XM3_f0 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f1 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f2 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f3 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f4 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f5 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f6 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f7 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f8 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f9 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f10 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f11 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM4_f0 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM4_f1 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM4_f2 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM4_f3 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM4_f4 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM4_f5 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM4_f6 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM4_f7 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM4_f8 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM4_f9 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM4_f10 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM4_f11 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM5_f0 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=0.78u +XM5_f1 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=0.78u +XM5_f2 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=0.78u +XM5_f3 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=0.78u +XM5_f4 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=0.78u +XM5_f5 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=0.78u +XM5_f6 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=0.78u +XM5_f7 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=0.78u +XM5_f8 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=0.78u +XM5_f9 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=0.78u +XM5_f10 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=0.78u +XM5_f11 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=0.78u +XM6_f0 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.78u +XM6_f1 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.78u +XM6_f2 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.78u +XM6_f3 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.78u +XM6_f4 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.78u +XM6_f5 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.78u +XM6_f6 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.78u +XM6_f7 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.78u +XM6_f8 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.78u +XM6_f9 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.78u +XM6_f10 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.78u +XM6_f11 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.78u +XM7_f0 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=0.78u +XM7_f1 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=0.78u +XM7_f2 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=0.78u +XM7_f3 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=0.78u +XM7_f4 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=0.78u +XM7_f5 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=0.78u +XM7_f6 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=0.78u +XM7_f7 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=0.78u +XM7_f8 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=0.78u +XM7_f9 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=0.78u +XM7_f10 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=0.78u +XM7_f11 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=0.78u +XM8_f0 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=0.78u +XM8_f1 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=0.78u +XM8_f2 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=0.78u +XM8_f3 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=0.78u +XM8_f4 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=0.78u +XM8_f5 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=0.78u +XM8_f6 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=0.78u +XM8_f7 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=0.78u +XM8_f8 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=0.78u +XM8_f9 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=0.78u +XM8_f10 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=0.78u +XM8_f11 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=0.78u +XM9_f0 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM9_f1 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM9_f2 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM9_f3 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM9_f4 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM9_f5 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM9_f6 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM9_f7 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM9_f8 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM9_f9 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM9_f10 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM9_f11 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM10_f0 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM10_f1 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM10_f2 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM10_f3 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM10_f4 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM10_f5 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM10_f6 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM10_f7 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM10_f8 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM10_f9 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM10_f10 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM10_f11 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +.ends C10_ihp130_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1.5_sL1.5/testbench.spice new file mode 100644 index 00000000..9dfbdeab --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1.5_sL1.5/testbench.spice @@ -0,0 +1,48 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 C10_ihp130_sW1.5_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIB1 VDD IB1 4e-05 +.nodeset v(IB1)=0.36 +XB_VB1 VB1 VB1 VSS VSS sg13_lv_nmos w=6u l=0.78u +IB_VB1 VDDB VB1 0.00018 +XB_VB2 VB2 VB2 VDDB VDDB sg13_lv_pmos w=6u l=0.78u +IB_VB2 VB2 VSS 0.00018 +XB_VB3 VB3 VB3 VDDB VDDB sg13_lv_pmos w=6u l=0.78u +IB_VB3 VB3 VSS 2e-05 +XB_VB4n VB4n VB4n VSS VSS sg13_lv_nmos w=6u l=0.78u +IB_VB4n VDDB VB4n 4e-05 +VCM VCM 0 0.6 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 5e-13 +CL2 VOUT2 0 5e-13 +BCMFB VB4 0 V = v(VB4n) + 20*((v(VOUT1)+v(VOUT2))/2 - 0.6) +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +meas ac ugf when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1.5_sL1/case.json new file mode 100644 index 00000000..f1ef6f03 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1.5_sL1/case.json @@ -0,0 +1,303 @@ +{ + "case_id": "C10_ihp130_sW1.5_sL1", + "circuit_id": "C10", + "pdk": "ihp130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "dut_name": "C10_ihp130_sW1.5_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1", + "VB2", + "VB3", + "VB4", + "IB1" + ], + "sizing": { + "M1": { + "w": 6.0, + "l": 0.52, + "nf": 12 + }, + "M2": { + "w": 6.0, + "l": 0.52, + "nf": 12 + }, + "M3": { + "w": 6.0, + "l": 0.52, + "nf": 12 + }, + "M4": { + "w": 6.0, + "l": 0.52, + "nf": 12 + }, + "M5": { + "w": 6.0, + "l": 0.52, + "nf": 12 + }, + "M6": { + "w": 6.0, + "l": 0.52, + "nf": 12 + }, + "M7": { + "w": 6.0, + "l": 0.52, + "nf": 12 + }, + "M8": { + "w": 6.0, + "l": 0.52, + "nf": 12 + }, + "M9": { + "w": 6.0, + "l": 0.52, + "nf": 12 + }, + "M10": { + "w": 6.0, + "l": 0.52, + "nf": 12 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M5", + "current": 2e-05, + "kind": "cascode3" + }, + "VB2": { + "replica": "M7", + "current": 2e-05, + "kind": "cascode3" + }, + "VB3": { + "replica": "M9", + "current": 2e-05 + }, + "VB4": { + "replica": "M3", + "current": 4e-05 + }, + "IB1": { + "i": 4e-05, + "from": "VDD" + } + }, + "load": { + "vcm": 0.6, + "CL": 5e-13, + "cmfb_gain": 20.0, + "vocm": 0.6 + }, + "category": "ota_fd", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.52, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.52, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.52, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.52, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.52, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.52, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.52, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.52, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M9": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.52, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M10": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.52, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "6c93bbbca6a8632f", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M5", + "current_A": 2e-05, + "variant": "cascode3" + }, + { + "kind": "replica_bias", + "port": "VB2", + "replica_of": "M7", + "current_A": 2e-05, + "variant": "cascode3" + }, + { + "kind": "replica_bias", + "port": "VB3", + "replica_of": "M9", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "replica_bias", + "port": "VB4", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VDD" + }, + { + "kind": "testbench_element", + "what": "ideal common-mode feedback on VB4" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8", + "M9", + "M10" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1.5_sL1/manifest.json new file mode 100644 index 00000000..75eb1a3f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "1fd6d09bf97ebb4450543f8b0c63a7351b10173b997535d8ff24796731c4c365", + "qualification.json": "8d47f679f38c4b4e9f7b7e28605ab9b8dbe17f50857dd75e1c0ece291268909c", + "specs.json": "94d44bc7e560e3022e840524059b5489ffcd4b6adb033689b9d583826d13f621", + "target.spice": "a28817ed3e331564d39f06b0bdda417fa326cacca80df64c5e7a846adfb11d10", + "target_lvs.spice": "7e0c0f40d7f04644497408762796253a0059d55b7715cf3f15fe7b6df3774d1f", + "testbench.spice": "9d8e71ac92557914847f835cabef08ea6b5ac0ce0fb7f1dac9588e15506df778" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1.5_sL1/qualification.json new file mode 100644 index 00000000..68abefaf --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1.5_sL1/qualification.json @@ -0,0 +1,180 @@ +{ + "case_id": "C10_ihp130_sW1.5_sL1", + "circuit_id": "C10", + "pdk": "ihp130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "ota_fd", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.52, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.52, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.52, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.52, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.52, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.52, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.52, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.52, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M9": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.52, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M10": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.52, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "6c93bbbca6a8632f", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 35.99 + }, + "ugf": { + "min": 31020000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 38.99394, + "ugf": 51696740.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 1.4, + "schematic_measures": { + "vo1": 0.6023343, + "vo2": 0.6023343, + "idd": 8.566161e-05, + "vos_in": -1.09139e-11, + "gain_lf": 38.99394, + "ugf": 51696740.0, + "f3db": 578425.3 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1.5_sL1/specs.json new file mode 100644 index 00000000..8249a6e0 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1.5_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 35.99 + }, + "ugf": { + "min": 31020000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 38.99394, + "ugf": 51696740.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1.5_sL1/target.spice new file mode 100644 index 00000000..865297ed --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1.5_sL1/target.spice @@ -0,0 +1,12 @@ +.subckt C10_ihp130_sW1.5_sL1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 +XM1 net022 VIN1 IB1 VDD sg13_lv_pmos w=6u l=0.52u ng=12 m=1 +XM2 net018 VIN2 IB1 VDD sg13_lv_pmos w=6u l=0.52u ng=12 m=1 +XM3 net022 VB4 VSS VSS sg13_lv_nmos w=6u l=0.52u ng=12 m=1 +XM4 net018 VB4 VSS VSS sg13_lv_nmos w=6u l=0.52u ng=12 m=1 +XM5 VOUT1 VB1 net022 VSS sg13_lv_nmos w=6u l=0.52u ng=12 m=1 +XM6 VOUT2 VB1 net018 VSS sg13_lv_nmos w=6u l=0.52u ng=12 m=1 +XM7 VOUT1 VB2 net023 VDD sg13_lv_pmos w=6u l=0.52u ng=12 m=1 +XM8 VOUT2 VB2 net021 VDD sg13_lv_pmos w=6u l=0.52u ng=12 m=1 +XM9 net023 VB3 VDD VDD sg13_lv_pmos w=6u l=0.52u ng=12 m=1 +XM10 net021 VB3 VDD VDD sg13_lv_pmos w=6u l=0.52u ng=12 m=1 +.ends C10_ihp130_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1.5_sL1/target_lvs.spice new file mode 100644 index 00000000..13434152 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1.5_sL1/target_lvs.spice @@ -0,0 +1,122 @@ +.subckt C10_ihp130_sW1.5_sL1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 +XM1_f0 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f1 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f2 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f3 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f4 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f5 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f6 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f7 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f8 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f9 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f10 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f11 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f0 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f1 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f2 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f3 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f4 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f5 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f6 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f7 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f8 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f9 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f10 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f11 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM3_f0 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f1 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f2 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f3 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f4 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f5 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f6 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f7 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f8 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f9 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f10 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f11 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f0 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f1 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f2 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f3 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f4 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f5 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f6 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f7 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f8 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f9 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f10 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f11 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f0 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f1 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f2 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f3 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f4 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f5 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f6 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f7 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f8 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f9 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f10 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f11 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=0.52u +XM6_f0 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM6_f1 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM6_f2 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM6_f3 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM6_f4 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM6_f5 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM6_f6 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM6_f7 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM6_f8 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM6_f9 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM6_f10 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM6_f11 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM7_f0 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f1 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f2 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f3 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f4 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f5 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f6 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f7 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f8 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f9 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f10 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f11 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f0 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f1 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f2 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f3 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f4 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f5 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f6 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f7 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f8 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f9 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f10 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f11 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=0.52u +XM9_f0 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM9_f1 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM9_f2 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM9_f3 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM9_f4 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM9_f5 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM9_f6 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM9_f7 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM9_f8 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM9_f9 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM9_f10 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM9_f11 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM10_f0 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM10_f1 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM10_f2 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM10_f3 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM10_f4 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM10_f5 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM10_f6 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM10_f7 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM10_f8 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM10_f9 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM10_f10 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM10_f11 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +.ends C10_ihp130_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1.5_sL1/testbench.spice new file mode 100644 index 00000000..82d0c054 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1.5_sL1/testbench.spice @@ -0,0 +1,48 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 C10_ihp130_sW1.5_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIB1 VDD IB1 4e-05 +.nodeset v(IB1)=0.36 +XB_VB1 VB1 VB1 VSS VSS sg13_lv_nmos w=6u l=0.52u +IB_VB1 VDDB VB1 0.00018 +XB_VB2 VB2 VB2 VDDB VDDB sg13_lv_pmos w=6u l=0.52u +IB_VB2 VB2 VSS 0.00018 +XB_VB3 VB3 VB3 VDDB VDDB sg13_lv_pmos w=6u l=0.52u +IB_VB3 VB3 VSS 2e-05 +XB_VB4n VB4n VB4n VSS VSS sg13_lv_nmos w=6u l=0.52u +IB_VB4n VDDB VB4n 4e-05 +VCM VCM 0 0.6 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 5e-13 +CL2 VOUT2 0 5e-13 +BCMFB VB4 0 V = v(VB4n) + 20*((v(VOUT1)+v(VOUT2))/2 - 0.6) +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +meas ac ugf when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1.5_sL2/case.json new file mode 100644 index 00000000..eff648ea --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1.5_sL2/case.json @@ -0,0 +1,303 @@ +{ + "case_id": "C10_ihp130_sW1.5_sL2", + "circuit_id": "C10", + "pdk": "ihp130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "dut_name": "C10_ihp130_sW1.5_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1", + "VB2", + "VB3", + "VB4", + "IB1" + ], + "sizing": { + "M1": { + "w": 6.0, + "l": 1.04, + "nf": 12 + }, + "M2": { + "w": 6.0, + "l": 1.04, + "nf": 12 + }, + "M3": { + "w": 6.0, + "l": 1.04, + "nf": 12 + }, + "M4": { + "w": 6.0, + "l": 1.04, + "nf": 12 + }, + "M5": { + "w": 6.0, + "l": 1.04, + "nf": 12 + }, + "M6": { + "w": 6.0, + "l": 1.04, + "nf": 12 + }, + "M7": { + "w": 6.0, + "l": 1.04, + "nf": 12 + }, + "M8": { + "w": 6.0, + "l": 1.04, + "nf": 12 + }, + "M9": { + "w": 6.0, + "l": 1.04, + "nf": 12 + }, + "M10": { + "w": 6.0, + "l": 1.04, + "nf": 12 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M5", + "current": 2e-05, + "kind": "cascode3" + }, + "VB2": { + "replica": "M7", + "current": 2e-05, + "kind": "cascode3" + }, + "VB3": { + "replica": "M9", + "current": 2e-05 + }, + "VB4": { + "replica": "M3", + "current": 4e-05 + }, + "IB1": { + "i": 4e-05, + "from": "VDD" + } + }, + "load": { + "vcm": 0.6, + "CL": 5e-13, + "cmfb_gain": 20.0, + "vocm": 0.6 + }, + "category": "ota_fd", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.04, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.04, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.04, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.04, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.04, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.04, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.04, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.04, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M9": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.04, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M10": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.04, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "5586335ab17c4366", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M5", + "current_A": 2e-05, + "variant": "cascode3" + }, + { + "kind": "replica_bias", + "port": "VB2", + "replica_of": "M7", + "current_A": 2e-05, + "variant": "cascode3" + }, + { + "kind": "replica_bias", + "port": "VB3", + "replica_of": "M9", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "replica_bias", + "port": "VB4", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VDD" + }, + { + "kind": "testbench_element", + "what": "ideal common-mode feedback on VB4" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8", + "M9", + "M10" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1.5_sL2/manifest.json new file mode 100644 index 00000000..782f2d31 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "e74892f1356e405c38e5216b2f89df076060b52027cc6f58401f4d5572f23526", + "qualification.json": "010b8e0dd8532a4a9ce0db15505c6c3203bc9411125c9963024ddfdb0a2d3c90", + "specs.json": "f845ece228bad5aeaa04137d9fd928a44fa24a05cfd442742a1509d73e3d69f7", + "target.spice": "6e5b064461f400e2419688de2b231725bc3526bb6300bd309f06235eb6423e62", + "target_lvs.spice": "16134be29b7cb5588b399f38841e35b76ce96a4d409dacfab8ffd6e33e1df943", + "testbench.spice": "32dad2c5ff9ebab26f12e8d0d18193ef9d727b60e2574ac3da20524ed9bd1960" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1.5_sL2/qualification.json new file mode 100644 index 00000000..3d8b7aee --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1.5_sL2/qualification.json @@ -0,0 +1,180 @@ +{ + "case_id": "C10_ihp130_sW1.5_sL2", + "circuit_id": "C10", + "pdk": "ihp130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "ota_fd", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.04, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.04, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.04, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.04, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.04, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.04, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.04, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.04, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M9": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.04, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M10": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.04, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "5586335ab17c4366", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 21870000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 36.16087, + "ugf": 36451150.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 2.3, + "schematic_measures": { + "vo1": 0.6022597, + "vo2": 0.6022597, + "idd": 8.7871e-05, + "vos_in": 1.546141e-11, + "gain_lf": 36.16087, + "ugf": 36451150.0, + "f3db": 565070.4 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1.5_sL2/specs.json new file mode 100644 index 00000000..c1983ac5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1.5_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 21870000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 36.16087, + "ugf": 36451150.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1.5_sL2/target.spice new file mode 100644 index 00000000..c4c2ba38 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1.5_sL2/target.spice @@ -0,0 +1,12 @@ +.subckt C10_ihp130_sW1.5_sL2 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 +XM1 net022 VIN1 IB1 VDD sg13_lv_pmos w=6u l=1.04u ng=12 m=1 +XM2 net018 VIN2 IB1 VDD sg13_lv_pmos w=6u l=1.04u ng=12 m=1 +XM3 net022 VB4 VSS VSS sg13_lv_nmos w=6u l=1.04u ng=12 m=1 +XM4 net018 VB4 VSS VSS sg13_lv_nmos w=6u l=1.04u ng=12 m=1 +XM5 VOUT1 VB1 net022 VSS sg13_lv_nmos w=6u l=1.04u ng=12 m=1 +XM6 VOUT2 VB1 net018 VSS sg13_lv_nmos w=6u l=1.04u ng=12 m=1 +XM7 VOUT1 VB2 net023 VDD sg13_lv_pmos w=6u l=1.04u ng=12 m=1 +XM8 VOUT2 VB2 net021 VDD sg13_lv_pmos w=6u l=1.04u ng=12 m=1 +XM9 net023 VB3 VDD VDD sg13_lv_pmos w=6u l=1.04u ng=12 m=1 +XM10 net021 VB3 VDD VDD sg13_lv_pmos w=6u l=1.04u ng=12 m=1 +.ends C10_ihp130_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1.5_sL2/target_lvs.spice new file mode 100644 index 00000000..c691092d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1.5_sL2/target_lvs.spice @@ -0,0 +1,122 @@ +.subckt C10_ihp130_sW1.5_sL2 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 +XM1_f0 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=1.04u +XM1_f1 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=1.04u +XM1_f2 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=1.04u +XM1_f3 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=1.04u +XM1_f4 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=1.04u +XM1_f5 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=1.04u +XM1_f6 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=1.04u +XM1_f7 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=1.04u +XM1_f8 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=1.04u +XM1_f9 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=1.04u +XM1_f10 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=1.04u +XM1_f11 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=1.04u +XM2_f0 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=1.04u +XM2_f1 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=1.04u +XM2_f2 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=1.04u +XM2_f3 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=1.04u +XM2_f4 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=1.04u +XM2_f5 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=1.04u +XM2_f6 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=1.04u +XM2_f7 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=1.04u +XM2_f8 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=1.04u +XM2_f9 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=1.04u +XM2_f10 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=1.04u +XM2_f11 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=1.04u +XM3_f0 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM3_f1 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM3_f2 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM3_f3 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM3_f4 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM3_f5 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM3_f6 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM3_f7 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM3_f8 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM3_f9 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM3_f10 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM3_f11 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM4_f0 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM4_f1 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM4_f2 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM4_f3 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM4_f4 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM4_f5 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM4_f6 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM4_f7 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM4_f8 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM4_f9 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM4_f10 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM4_f11 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM5_f0 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=1.04u +XM5_f1 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=1.04u +XM5_f2 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=1.04u +XM5_f3 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=1.04u +XM5_f4 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=1.04u +XM5_f5 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=1.04u +XM5_f6 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=1.04u +XM5_f7 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=1.04u +XM5_f8 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=1.04u +XM5_f9 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=1.04u +XM5_f10 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=1.04u +XM5_f11 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=1.04u +XM6_f0 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=1.04u +XM6_f1 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=1.04u +XM6_f2 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=1.04u +XM6_f3 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=1.04u +XM6_f4 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=1.04u +XM6_f5 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=1.04u +XM6_f6 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=1.04u +XM6_f7 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=1.04u +XM6_f8 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=1.04u +XM6_f9 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=1.04u +XM6_f10 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=1.04u +XM6_f11 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=1.04u +XM7_f0 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=1.04u +XM7_f1 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=1.04u +XM7_f2 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=1.04u +XM7_f3 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=1.04u +XM7_f4 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=1.04u +XM7_f5 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=1.04u +XM7_f6 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=1.04u +XM7_f7 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=1.04u +XM7_f8 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=1.04u +XM7_f9 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=1.04u +XM7_f10 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=1.04u +XM7_f11 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=1.04u +XM8_f0 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=1.04u +XM8_f1 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=1.04u +XM8_f2 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=1.04u +XM8_f3 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=1.04u +XM8_f4 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=1.04u +XM8_f5 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=1.04u +XM8_f6 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=1.04u +XM8_f7 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=1.04u +XM8_f8 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=1.04u +XM8_f9 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=1.04u +XM8_f10 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=1.04u +XM8_f11 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=1.04u +XM9_f0 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=1.04u +XM9_f1 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=1.04u +XM9_f2 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=1.04u +XM9_f3 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=1.04u +XM9_f4 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=1.04u +XM9_f5 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=1.04u +XM9_f6 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=1.04u +XM9_f7 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=1.04u +XM9_f8 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=1.04u +XM9_f9 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=1.04u +XM9_f10 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=1.04u +XM9_f11 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=1.04u +XM10_f0 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=1.04u +XM10_f1 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=1.04u +XM10_f2 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=1.04u +XM10_f3 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=1.04u +XM10_f4 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=1.04u +XM10_f5 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=1.04u +XM10_f6 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=1.04u +XM10_f7 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=1.04u +XM10_f8 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=1.04u +XM10_f9 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=1.04u +XM10_f10 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=1.04u +XM10_f11 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=1.04u +.ends C10_ihp130_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1.5_sL2/testbench.spice new file mode 100644 index 00000000..f95285d6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1.5_sL2/testbench.spice @@ -0,0 +1,48 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 C10_ihp130_sW1.5_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIB1 VDD IB1 4e-05 +.nodeset v(IB1)=0.36 +XB_VB1 VB1 VB1 VSS VSS sg13_lv_nmos w=6u l=1.04u +IB_VB1 VDDB VB1 0.00018 +XB_VB2 VB2 VB2 VDDB VDDB sg13_lv_pmos w=6u l=1.04u +IB_VB2 VB2 VSS 0.00018 +XB_VB3 VB3 VB3 VDDB VDDB sg13_lv_pmos w=6u l=1.04u +IB_VB3 VB3 VSS 2e-05 +XB_VB4n VB4n VB4n VSS VSS sg13_lv_nmos w=6u l=1.04u +IB_VB4n VDDB VB4n 4e-05 +VCM VCM 0 0.6 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 5e-13 +CL2 VOUT2 0 5e-13 +BCMFB VB4 0 V = v(VB4n) + 20*((v(VOUT1)+v(VOUT2))/2 - 0.6) +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +meas ac ugf when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1_sL1.5/case.json new file mode 100644 index 00000000..a46c8747 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1_sL1.5/case.json @@ -0,0 +1,303 @@ +{ + "case_id": "C10_ihp130_sW1_sL1.5", + "circuit_id": "C10", + "pdk": "ihp130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "dut_name": "C10_ihp130_sW1_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1", + "VB2", + "VB3", + "VB4", + "IB1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.78, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 0.78, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 0.78, + "nf": 8 + }, + "M4": { + "w": 4.0, + "l": 0.78, + "nf": 8 + }, + "M5": { + "w": 4.0, + "l": 0.78, + "nf": 8 + }, + "M6": { + "w": 4.0, + "l": 0.78, + "nf": 8 + }, + "M7": { + "w": 4.0, + "l": 0.78, + "nf": 8 + }, + "M8": { + "w": 4.0, + "l": 0.78, + "nf": 8 + }, + "M9": { + "w": 4.0, + "l": 0.78, + "nf": 8 + }, + "M10": { + "w": 4.0, + "l": 0.78, + "nf": 8 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M5", + "current": 2e-05, + "kind": "cascode3" + }, + "VB2": { + "replica": "M7", + "current": 2e-05, + "kind": "cascode3" + }, + "VB3": { + "replica": "M9", + "current": 2e-05 + }, + "VB4": { + "replica": "M3", + "current": 4e-05 + }, + "IB1": { + "i": 4e-05, + "from": "VDD" + } + }, + "load": { + "vcm": 0.6, + "CL": 5e-13, + "cmfb_gain": 20.0, + "vocm": 0.6 + }, + "category": "ota_fd", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.78, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.78, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.78, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.78, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.78, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.78, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.78, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.78, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M9": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.78, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M10": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.78, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "c8041ee9ebc99c29", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M5", + "current_A": 2e-05, + "variant": "cascode3" + }, + { + "kind": "replica_bias", + "port": "VB2", + "replica_of": "M7", + "current_A": 2e-05, + "variant": "cascode3" + }, + { + "kind": "replica_bias", + "port": "VB3", + "replica_of": "M9", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "replica_bias", + "port": "VB4", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VDD" + }, + { + "kind": "testbench_element", + "what": "ideal common-mode feedback on VB4" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8", + "M9", + "M10" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1_sL1.5/manifest.json new file mode 100644 index 00000000..83a34915 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "e7d0a0fb8967d3a05d5fae307f6780468d4b2f9384e92b9d1ea5e71e2dc6e476", + "qualification.json": "71b1ac4c04b57819287ad7dc226befb54da983ba7ea9267e6cd1e7383c2f5085", + "specs.json": "6713fdffed86734fe952cd8b6726edf8f3c98893af7532eec52de36ef79c8e4c", + "target.spice": "a983f3f8ebae63b003894fdf417e61888c108fa986af99129ef09ba63473ba03", + "target_lvs.spice": "35d80ebda84b641c17dbfee39704bac99970e8d11e0c7f152ffa4d72d9306515", + "testbench.spice": "1671b7b2bdc09336767c4691b968ae88c4b1e236752922f50d09b3f5744ce9cd" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1_sL1.5/qualification.json new file mode 100644 index 00000000..0102b850 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1_sL1.5/qualification.json @@ -0,0 +1,182 @@ +{ + "case_id": "C10_ihp130_sW1_sL1.5", + "circuit_id": "C10", + "pdk": "ihp130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "ota_fd", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.78, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.78, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.78, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.78, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.78, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.78, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.78, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.78, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M9": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.78, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M10": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.78, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "c8041ee9ebc99c29", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "gain_lf=34.19 below floor 35" + ], + "spec": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 21860000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 34.18552, + "ugf": 36435230.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 1.6, + "schematic_measures": { + "vo1": 0.6018909, + "vo2": 0.6018909, + "idd": 8.644131e-05, + "vos_in": 1.818989e-12, + "gain_lf": 34.18552, + "ugf": 36435230.0, + "f3db": 709232.2 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1_sL1.5/specs.json new file mode 100644 index 00000000..61439a6a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 21860000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 34.18552, + "ugf": 36435230.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1_sL1.5/target.spice new file mode 100644 index 00000000..792c08c5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1_sL1.5/target.spice @@ -0,0 +1,12 @@ +.subckt C10_ihp130_sW1_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 +XM1 net022 VIN1 IB1 VDD sg13_lv_pmos w=4u l=0.78u ng=8 m=1 +XM2 net018 VIN2 IB1 VDD sg13_lv_pmos w=4u l=0.78u ng=8 m=1 +XM3 net022 VB4 VSS VSS sg13_lv_nmos w=4u l=0.78u ng=8 m=1 +XM4 net018 VB4 VSS VSS sg13_lv_nmos w=4u l=0.78u ng=8 m=1 +XM5 VOUT1 VB1 net022 VSS sg13_lv_nmos w=4u l=0.78u ng=8 m=1 +XM6 VOUT2 VB1 net018 VSS sg13_lv_nmos w=4u l=0.78u ng=8 m=1 +XM7 VOUT1 VB2 net023 VDD sg13_lv_pmos w=4u l=0.78u ng=8 m=1 +XM8 VOUT2 VB2 net021 VDD sg13_lv_pmos w=4u l=0.78u ng=8 m=1 +XM9 net023 VB3 VDD VDD sg13_lv_pmos w=4u l=0.78u ng=8 m=1 +XM10 net021 VB3 VDD VDD sg13_lv_pmos w=4u l=0.78u ng=8 m=1 +.ends C10_ihp130_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1_sL1.5/target_lvs.spice new file mode 100644 index 00000000..387e4d90 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1_sL1.5/target_lvs.spice @@ -0,0 +1,82 @@ +.subckt C10_ihp130_sW1_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 +XM1_f0 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=0.78u +XM1_f1 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=0.78u +XM1_f2 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=0.78u +XM1_f3 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=0.78u +XM1_f4 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=0.78u +XM1_f5 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=0.78u +XM1_f6 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=0.78u +XM1_f7 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=0.78u +XM2_f0 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=0.78u +XM2_f1 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=0.78u +XM2_f2 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=0.78u +XM2_f3 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=0.78u +XM2_f4 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=0.78u +XM2_f5 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=0.78u +XM2_f6 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=0.78u +XM2_f7 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=0.78u +XM3_f0 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f1 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f2 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f3 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f4 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f5 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f6 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f7 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM4_f0 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM4_f1 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM4_f2 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM4_f3 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM4_f4 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM4_f5 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM4_f6 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM4_f7 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM5_f0 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=0.78u +XM5_f1 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=0.78u +XM5_f2 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=0.78u +XM5_f3 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=0.78u +XM5_f4 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=0.78u +XM5_f5 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=0.78u +XM5_f6 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=0.78u +XM5_f7 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=0.78u +XM6_f0 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.78u +XM6_f1 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.78u +XM6_f2 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.78u +XM6_f3 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.78u +XM6_f4 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.78u +XM6_f5 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.78u +XM6_f6 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.78u +XM6_f7 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.78u +XM7_f0 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=0.78u +XM7_f1 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=0.78u +XM7_f2 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=0.78u +XM7_f3 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=0.78u +XM7_f4 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=0.78u +XM7_f5 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=0.78u +XM7_f6 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=0.78u +XM7_f7 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=0.78u +XM8_f0 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=0.78u +XM8_f1 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=0.78u +XM8_f2 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=0.78u +XM8_f3 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=0.78u +XM8_f4 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=0.78u +XM8_f5 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=0.78u +XM8_f6 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=0.78u +XM8_f7 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=0.78u +XM9_f0 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM9_f1 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM9_f2 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM9_f3 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM9_f4 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM9_f5 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM9_f6 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM9_f7 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM10_f0 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM10_f1 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM10_f2 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM10_f3 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM10_f4 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM10_f5 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM10_f6 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM10_f7 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +.ends C10_ihp130_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1_sL1.5/testbench.spice new file mode 100644 index 00000000..1d35def4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1_sL1.5/testbench.spice @@ -0,0 +1,48 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 C10_ihp130_sW1_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIB1 VDD IB1 4e-05 +.nodeset v(IB1)=0.36 +XB_VB1 VB1 VB1 VSS VSS sg13_lv_nmos w=4u l=0.78u +IB_VB1 VDDB VB1 0.00018 +XB_VB2 VB2 VB2 VDDB VDDB sg13_lv_pmos w=4u l=0.78u +IB_VB2 VB2 VSS 0.00018 +XB_VB3 VB3 VB3 VDDB VDDB sg13_lv_pmos w=4u l=0.78u +IB_VB3 VB3 VSS 2e-05 +XB_VB4n VB4n VB4n VSS VSS sg13_lv_nmos w=4u l=0.78u +IB_VB4n VDDB VB4n 4e-05 +VCM VCM 0 0.6 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 5e-13 +CL2 VOUT2 0 5e-13 +BCMFB VB4 0 V = v(VB4n) + 20*((v(VOUT1)+v(VOUT2))/2 - 0.6) +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +meas ac ugf when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1_sL1/case.json new file mode 100644 index 00000000..7cdb8e41 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1_sL1/case.json @@ -0,0 +1,303 @@ +{ + "case_id": "C10_ihp130_sW1_sL1", + "circuit_id": "C10", + "pdk": "ihp130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "dut_name": "C10_ihp130_sW1_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1", + "VB2", + "VB3", + "VB4", + "IB1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.52, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 0.52, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 0.52, + "nf": 8 + }, + "M4": { + "w": 4.0, + "l": 0.52, + "nf": 8 + }, + "M5": { + "w": 4.0, + "l": 0.52, + "nf": 8 + }, + "M6": { + "w": 4.0, + "l": 0.52, + "nf": 8 + }, + "M7": { + "w": 4.0, + "l": 0.52, + "nf": 8 + }, + "M8": { + "w": 4.0, + "l": 0.52, + "nf": 8 + }, + "M9": { + "w": 4.0, + "l": 0.52, + "nf": 8 + }, + "M10": { + "w": 4.0, + "l": 0.52, + "nf": 8 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M5", + "current": 2e-05, + "kind": "cascode3" + }, + "VB2": { + "replica": "M7", + "current": 2e-05, + "kind": "cascode3" + }, + "VB3": { + "replica": "M9", + "current": 2e-05 + }, + "VB4": { + "replica": "M3", + "current": 4e-05 + }, + "IB1": { + "i": 4e-05, + "from": "VDD" + } + }, + "load": { + "vcm": 0.6, + "CL": 5e-13, + "cmfb_gain": 20.0, + "vocm": 0.6 + }, + "category": "ota_fd", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M9": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M10": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "11509295a52bdb08", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M5", + "current_A": 2e-05, + "variant": "cascode3" + }, + { + "kind": "replica_bias", + "port": "VB2", + "replica_of": "M7", + "current_A": 2e-05, + "variant": "cascode3" + }, + { + "kind": "replica_bias", + "port": "VB3", + "replica_of": "M9", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "replica_bias", + "port": "VB4", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VDD" + }, + { + "kind": "testbench_element", + "what": "ideal common-mode feedback on VB4" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8", + "M9", + "M10" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1_sL1/manifest.json new file mode 100644 index 00000000..3d7a2677 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "77cd9b3a918a79e06761d17cee0f751aafa5b28aec860e4493f531b893125141", + "qualification.json": "3fb0d41a43216f4fedc5777084fb5b316497b9e32e477fbe1dfc31ff953fe14a", + "specs.json": "5ed65edc406ce2d2a05fdf88b0891332aa1b283bf7ace1324c9698148c9b135b", + "target.spice": "77d6a04077f80a48e76b98ac48aa511a6bf86e229c347db17c6075f9119efa46", + "target_lvs.spice": "393b91676075193bbbc501a4b357360caa6c7743d63c6f452a80e6faf73cb65d", + "testbench.spice": "ae94f7503d7f1507e42c629a48f9d4873d32c357f08539c05eb4b8c226a18a5a" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1_sL1/qualification.json new file mode 100644 index 00000000..8d2557e6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1_sL1/qualification.json @@ -0,0 +1,180 @@ +{ + "case_id": "C10_ihp130_sW1_sL1", + "circuit_id": "C10", + "pdk": "ihp130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "ota_fd", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M9": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M10": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "11509295a52bdb08", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 26400000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 36.03274, + "ugf": 43998640.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 1.4, + "schematic_measures": { + "vo1": 0.6019595, + "vo2": 0.6019595, + "idd": 8.52423e-05, + "vos_in": 1.818989e-12, + "gain_lf": 36.03274, + "ugf": 43998640.0, + "f3db": 692621.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1_sL1/specs.json new file mode 100644 index 00000000..85e8dde3 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 26400000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 36.03274, + "ugf": 43998640.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1_sL1/target.spice new file mode 100644 index 00000000..e02f005b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1_sL1/target.spice @@ -0,0 +1,12 @@ +.subckt C10_ihp130_sW1_sL1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 +XM1 net022 VIN1 IB1 VDD sg13_lv_pmos w=4u l=0.52u ng=8 m=1 +XM2 net018 VIN2 IB1 VDD sg13_lv_pmos w=4u l=0.52u ng=8 m=1 +XM3 net022 VB4 VSS VSS sg13_lv_nmos w=4u l=0.52u ng=8 m=1 +XM4 net018 VB4 VSS VSS sg13_lv_nmos w=4u l=0.52u ng=8 m=1 +XM5 VOUT1 VB1 net022 VSS sg13_lv_nmos w=4u l=0.52u ng=8 m=1 +XM6 VOUT2 VB1 net018 VSS sg13_lv_nmos w=4u l=0.52u ng=8 m=1 +XM7 VOUT1 VB2 net023 VDD sg13_lv_pmos w=4u l=0.52u ng=8 m=1 +XM8 VOUT2 VB2 net021 VDD sg13_lv_pmos w=4u l=0.52u ng=8 m=1 +XM9 net023 VB3 VDD VDD sg13_lv_pmos w=4u l=0.52u ng=8 m=1 +XM10 net021 VB3 VDD VDD sg13_lv_pmos w=4u l=0.52u ng=8 m=1 +.ends C10_ihp130_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1_sL1/target_lvs.spice new file mode 100644 index 00000000..6b2e55c1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1_sL1/target_lvs.spice @@ -0,0 +1,82 @@ +.subckt C10_ihp130_sW1_sL1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 +XM1_f0 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f1 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f2 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f3 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f4 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f5 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f6 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f7 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f0 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f1 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f2 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f3 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f4 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f5 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f6 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f7 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM3_f0 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f1 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f2 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f3 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f4 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f5 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f6 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f7 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f0 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f1 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f2 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f3 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f4 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f5 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f6 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f7 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f0 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f1 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f2 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f3 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f4 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f5 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f6 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f7 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=0.52u +XM6_f0 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM6_f1 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM6_f2 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM6_f3 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM6_f4 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM6_f5 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM6_f6 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM6_f7 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM7_f0 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f1 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f2 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f3 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f4 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f5 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f6 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f7 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f0 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f1 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f2 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f3 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f4 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f5 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f6 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f7 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=0.52u +XM9_f0 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM9_f1 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM9_f2 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM9_f3 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM9_f4 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM9_f5 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM9_f6 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM9_f7 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM10_f0 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM10_f1 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM10_f2 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM10_f3 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM10_f4 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM10_f5 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM10_f6 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM10_f7 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +.ends C10_ihp130_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1_sL1/testbench.spice new file mode 100644 index 00000000..5cd57576 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1_sL1/testbench.spice @@ -0,0 +1,48 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 C10_ihp130_sW1_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIB1 VDD IB1 4e-05 +.nodeset v(IB1)=0.36 +XB_VB1 VB1 VB1 VSS VSS sg13_lv_nmos w=4u l=0.52u +IB_VB1 VDDB VB1 0.00018 +XB_VB2 VB2 VB2 VDDB VDDB sg13_lv_pmos w=4u l=0.52u +IB_VB2 VB2 VSS 0.00018 +XB_VB3 VB3 VB3 VDDB VDDB sg13_lv_pmos w=4u l=0.52u +IB_VB3 VB3 VSS 2e-05 +XB_VB4n VB4n VB4n VSS VSS sg13_lv_nmos w=4u l=0.52u +IB_VB4n VDDB VB4n 4e-05 +VCM VCM 0 0.6 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 5e-13 +CL2 VOUT2 0 5e-13 +BCMFB VB4 0 V = v(VB4n) + 20*((v(VOUT1)+v(VOUT2))/2 - 0.6) +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +meas ac ugf when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1_sL2/case.json new file mode 100644 index 00000000..14985302 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1_sL2/case.json @@ -0,0 +1,303 @@ +{ + "case_id": "C10_ihp130_sW1_sL2", + "circuit_id": "C10", + "pdk": "ihp130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "dut_name": "C10_ihp130_sW1_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1", + "VB2", + "VB3", + "VB4", + "IB1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 1.04, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 1.04, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 1.04, + "nf": 8 + }, + "M4": { + "w": 4.0, + "l": 1.04, + "nf": 8 + }, + "M5": { + "w": 4.0, + "l": 1.04, + "nf": 8 + }, + "M6": { + "w": 4.0, + "l": 1.04, + "nf": 8 + }, + "M7": { + "w": 4.0, + "l": 1.04, + "nf": 8 + }, + "M8": { + "w": 4.0, + "l": 1.04, + "nf": 8 + }, + "M9": { + "w": 4.0, + "l": 1.04, + "nf": 8 + }, + "M10": { + "w": 4.0, + "l": 1.04, + "nf": 8 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M5", + "current": 2e-05, + "kind": "cascode3" + }, + "VB2": { + "replica": "M7", + "current": 2e-05, + "kind": "cascode3" + }, + "VB3": { + "replica": "M9", + "current": 2e-05 + }, + "VB4": { + "replica": "M3", + "current": 4e-05 + }, + "IB1": { + "i": 4e-05, + "from": "VDD" + } + }, + "load": { + "vcm": 0.6, + "CL": 5e-13, + "cmfb_gain": 20.0, + "vocm": 0.6 + }, + "category": "ota_fd", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.04, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.04, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.04, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.04, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.04, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.04, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.04, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.04, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M9": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.04, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M10": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.04, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "8b6f51e6560bffce", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M5", + "current_A": 2e-05, + "variant": "cascode3" + }, + { + "kind": "replica_bias", + "port": "VB2", + "replica_of": "M7", + "current_A": 2e-05, + "variant": "cascode3" + }, + { + "kind": "replica_bias", + "port": "VB3", + "replica_of": "M9", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "replica_bias", + "port": "VB4", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VDD" + }, + { + "kind": "testbench_element", + "what": "ideal common-mode feedback on VB4" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8", + "M9", + "M10" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1_sL2/manifest.json new file mode 100644 index 00000000..87b17526 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "64795e82a9d3ef554f171879692ff94a939c87747790a62ad4ee274953fc600c", + "qualification.json": "f3ba9f8f9cf154acfe88c818be32f27339aadd60867507650da56b9487c4ec26", + "specs.json": "5ae72b25355176d41d71ad36ce4034aee1e312a279500f722c2d78ee02e75efc", + "target.spice": "8e835234c26426790a68caebe993a0cd92b0629b202748ab1c0a298c0faf4372", + "target_lvs.spice": "ea284d928097b0559c755851aeba0f72b16eb81c2a2d5bb6a9358ed86912e87f", + "testbench.spice": "4285c800cd38eff9d188abebc26027df913e55ddea473841b272588b5d889da7" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1_sL2/qualification.json new file mode 100644 index 00000000..d5ae5437 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1_sL2/qualification.json @@ -0,0 +1,182 @@ +{ + "case_id": "C10_ihp130_sW1_sL2", + "circuit_id": "C10", + "pdk": "ihp130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "ota_fd", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.04, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.04, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.04, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.04, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.04, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.04, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.04, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.04, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M9": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.04, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M10": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.04, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "8b6f51e6560bffce", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "gain_lf=33.42 below floor 35" + ], + "spec": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 18830000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 33.41973, + "ugf": 31377570.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 1.5, + "schematic_measures": { + "vo1": 0.6018748, + "vo2": 0.6018748, + "idd": 8.686533e-05, + "vos_in": 0.0, + "gain_lf": 33.41973, + "ugf": 31377570.0, + "f3db": 667546.7 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1_sL2/specs.json new file mode 100644 index 00000000..ee2a73f9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 18830000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 33.41973, + "ugf": 31377570.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1_sL2/target.spice new file mode 100644 index 00000000..ebbc5f13 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1_sL2/target.spice @@ -0,0 +1,12 @@ +.subckt C10_ihp130_sW1_sL2 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 +XM1 net022 VIN1 IB1 VDD sg13_lv_pmos w=4u l=1.04u ng=8 m=1 +XM2 net018 VIN2 IB1 VDD sg13_lv_pmos w=4u l=1.04u ng=8 m=1 +XM3 net022 VB4 VSS VSS sg13_lv_nmos w=4u l=1.04u ng=8 m=1 +XM4 net018 VB4 VSS VSS sg13_lv_nmos w=4u l=1.04u ng=8 m=1 +XM5 VOUT1 VB1 net022 VSS sg13_lv_nmos w=4u l=1.04u ng=8 m=1 +XM6 VOUT2 VB1 net018 VSS sg13_lv_nmos w=4u l=1.04u ng=8 m=1 +XM7 VOUT1 VB2 net023 VDD sg13_lv_pmos w=4u l=1.04u ng=8 m=1 +XM8 VOUT2 VB2 net021 VDD sg13_lv_pmos w=4u l=1.04u ng=8 m=1 +XM9 net023 VB3 VDD VDD sg13_lv_pmos w=4u l=1.04u ng=8 m=1 +XM10 net021 VB3 VDD VDD sg13_lv_pmos w=4u l=1.04u ng=8 m=1 +.ends C10_ihp130_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1_sL2/target_lvs.spice new file mode 100644 index 00000000..ef0f023f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1_sL2/target_lvs.spice @@ -0,0 +1,82 @@ +.subckt C10_ihp130_sW1_sL2 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 +XM1_f0 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=1.04u +XM1_f1 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=1.04u +XM1_f2 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=1.04u +XM1_f3 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=1.04u +XM1_f4 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=1.04u +XM1_f5 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=1.04u +XM1_f6 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=1.04u +XM1_f7 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=1.04u +XM2_f0 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=1.04u +XM2_f1 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=1.04u +XM2_f2 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=1.04u +XM2_f3 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=1.04u +XM2_f4 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=1.04u +XM2_f5 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=1.04u +XM2_f6 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=1.04u +XM2_f7 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=1.04u +XM3_f0 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM3_f1 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM3_f2 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM3_f3 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM3_f4 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM3_f5 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM3_f6 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM3_f7 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM4_f0 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM4_f1 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM4_f2 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM4_f3 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM4_f4 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM4_f5 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM4_f6 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM4_f7 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM5_f0 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=1.04u +XM5_f1 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=1.04u +XM5_f2 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=1.04u +XM5_f3 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=1.04u +XM5_f4 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=1.04u +XM5_f5 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=1.04u +XM5_f6 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=1.04u +XM5_f7 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=1.04u +XM6_f0 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=1.04u +XM6_f1 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=1.04u +XM6_f2 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=1.04u +XM6_f3 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=1.04u +XM6_f4 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=1.04u +XM6_f5 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=1.04u +XM6_f6 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=1.04u +XM6_f7 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=1.04u +XM7_f0 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=1.04u +XM7_f1 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=1.04u +XM7_f2 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=1.04u +XM7_f3 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=1.04u +XM7_f4 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=1.04u +XM7_f5 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=1.04u +XM7_f6 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=1.04u +XM7_f7 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=1.04u +XM8_f0 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=1.04u +XM8_f1 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=1.04u +XM8_f2 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=1.04u +XM8_f3 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=1.04u +XM8_f4 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=1.04u +XM8_f5 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=1.04u +XM8_f6 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=1.04u +XM8_f7 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=1.04u +XM9_f0 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=1.04u +XM9_f1 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=1.04u +XM9_f2 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=1.04u +XM9_f3 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=1.04u +XM9_f4 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=1.04u +XM9_f5 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=1.04u +XM9_f6 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=1.04u +XM9_f7 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=1.04u +XM10_f0 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=1.04u +XM10_f1 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=1.04u +XM10_f2 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=1.04u +XM10_f3 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=1.04u +XM10_f4 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=1.04u +XM10_f5 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=1.04u +XM10_f6 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=1.04u +XM10_f7 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=1.04u +.ends C10_ihp130_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1_sL2/testbench.spice new file mode 100644 index 00000000..00af5a02 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW1_sL2/testbench.spice @@ -0,0 +1,48 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 C10_ihp130_sW1_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIB1 VDD IB1 4e-05 +.nodeset v(IB1)=0.36 +XB_VB1 VB1 VB1 VSS VSS sg13_lv_nmos w=4u l=1.04u +IB_VB1 VDDB VB1 0.00018 +XB_VB2 VB2 VB2 VDDB VDDB sg13_lv_pmos w=4u l=1.04u +IB_VB2 VB2 VSS 0.00018 +XB_VB3 VB3 VB3 VDDB VDDB sg13_lv_pmos w=4u l=1.04u +IB_VB3 VB3 VSS 2e-05 +XB_VB4n VB4n VB4n VSS VSS sg13_lv_nmos w=4u l=1.04u +IB_VB4n VDDB VB4n 4e-05 +VCM VCM 0 0.6 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 5e-13 +CL2 VOUT2 0 5e-13 +BCMFB VB4 0 V = v(VB4n) + 20*((v(VOUT1)+v(VOUT2))/2 - 0.6) +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +meas ac ugf when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW2_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW2_sL1.5/case.json new file mode 100644 index 00000000..06acbffd --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW2_sL1.5/case.json @@ -0,0 +1,303 @@ +{ + "case_id": "C10_ihp130_sW2_sL1.5", + "circuit_id": "C10", + "pdk": "ihp130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "dut_name": "C10_ihp130_sW2_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1", + "VB2", + "VB3", + "VB4", + "IB1" + ], + "sizing": { + "M1": { + "w": 8.0, + "l": 0.78, + "nf": 16 + }, + "M2": { + "w": 8.0, + "l": 0.78, + "nf": 16 + }, + "M3": { + "w": 8.0, + "l": 0.78, + "nf": 16 + }, + "M4": { + "w": 8.0, + "l": 0.78, + "nf": 16 + }, + "M5": { + "w": 8.0, + "l": 0.78, + "nf": 16 + }, + "M6": { + "w": 8.0, + "l": 0.78, + "nf": 16 + }, + "M7": { + "w": 8.0, + "l": 0.78, + "nf": 16 + }, + "M8": { + "w": 8.0, + "l": 0.78, + "nf": 16 + }, + "M9": { + "w": 8.0, + "l": 0.78, + "nf": 16 + }, + "M10": { + "w": 8.0, + "l": 0.78, + "nf": 16 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M5", + "current": 2e-05, + "kind": "cascode3" + }, + "VB2": { + "replica": "M7", + "current": 2e-05, + "kind": "cascode3" + }, + "VB3": { + "replica": "M9", + "current": 2e-05 + }, + "VB4": { + "replica": "M3", + "current": 4e-05 + }, + "IB1": { + "i": 4e-05, + "from": "VDD" + } + }, + "load": { + "vcm": 0.6, + "CL": 5e-13, + "cmfb_gain": 20.0, + "vocm": 0.6 + }, + "category": "ota_fd", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.78, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.78, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.78, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.78, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.78, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.78, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.78, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.78, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M9": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.78, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M10": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.78, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "0ea063e7887a656d", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M5", + "current_A": 2e-05, + "variant": "cascode3" + }, + { + "kind": "replica_bias", + "port": "VB2", + "replica_of": "M7", + "current_A": 2e-05, + "variant": "cascode3" + }, + { + "kind": "replica_bias", + "port": "VB3", + "replica_of": "M9", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "replica_bias", + "port": "VB4", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VDD" + }, + { + "kind": "testbench_element", + "what": "ideal common-mode feedback on VB4" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8", + "M9", + "M10" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW2_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW2_sL1.5/manifest.json new file mode 100644 index 00000000..0fb2fe65 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW2_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "229d139fcd8a13577ef176cf1ac51927a77449232556959acfd21e414998f512", + "qualification.json": "4fc2960ffbc434bfecc238d849151e6e434cfa1d76ba047e78f2d2829912a04e", + "specs.json": "1ca06c2c0c09bacdaf735acda3dd09338a0840b7edbbc633c613a717e6160690", + "target.spice": "caf75fad400950d7482a86fc0e0292927f7d5ca2f8f5f1cec7114cb7839bd72c", + "target_lvs.spice": "118e9196b8ab8deb06081a840877a92f7fecebf67f324f492536996ae42162dc", + "testbench.spice": "6f0898995ecb13aa159439760d9126477a73b3bbca83f1fb7eefb4db4daaa303" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW2_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW2_sL1.5/qualification.json new file mode 100644 index 00000000..d1097692 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW2_sL1.5/qualification.json @@ -0,0 +1,180 @@ +{ + "case_id": "C10_ihp130_sW2_sL1.5", + "circuit_id": "C10", + "pdk": "ihp130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "ota_fd", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.78, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.78, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.78, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.78, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.78, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.78, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.78, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.78, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M9": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.78, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M10": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.78, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "0ea063e7887a656d", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 36.56 + }, + "ugf": { + "min": 29300000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 39.55606, + "ugf": 48839540.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 2.9, + "schematic_measures": { + "vo1": 0.602577, + "vo2": 0.602577, + "idd": 8.765805e-05, + "vos_in": 2.091838e-11, + "gain_lf": 39.55606, + "ugf": 48839540.0, + "f3db": 512234.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW2_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW2_sL1.5/specs.json new file mode 100644 index 00000000..e7159f3e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW2_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 36.56 + }, + "ugf": { + "min": 29300000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 39.55606, + "ugf": 48839540.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW2_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW2_sL1.5/target.spice new file mode 100644 index 00000000..e064c76c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW2_sL1.5/target.spice @@ -0,0 +1,12 @@ +.subckt C10_ihp130_sW2_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 +XM1 net022 VIN1 IB1 VDD sg13_lv_pmos w=8u l=0.78u ng=16 m=1 +XM2 net018 VIN2 IB1 VDD sg13_lv_pmos w=8u l=0.78u ng=16 m=1 +XM3 net022 VB4 VSS VSS sg13_lv_nmos w=8u l=0.78u ng=16 m=1 +XM4 net018 VB4 VSS VSS sg13_lv_nmos w=8u l=0.78u ng=16 m=1 +XM5 VOUT1 VB1 net022 VSS sg13_lv_nmos w=8u l=0.78u ng=16 m=1 +XM6 VOUT2 VB1 net018 VSS sg13_lv_nmos w=8u l=0.78u ng=16 m=1 +XM7 VOUT1 VB2 net023 VDD sg13_lv_pmos w=8u l=0.78u ng=16 m=1 +XM8 VOUT2 VB2 net021 VDD sg13_lv_pmos w=8u l=0.78u ng=16 m=1 +XM9 net023 VB3 VDD VDD sg13_lv_pmos w=8u l=0.78u ng=16 m=1 +XM10 net021 VB3 VDD VDD sg13_lv_pmos w=8u l=0.78u ng=16 m=1 +.ends C10_ihp130_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW2_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW2_sL1.5/target_lvs.spice new file mode 100644 index 00000000..c05caca4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW2_sL1.5/target_lvs.spice @@ -0,0 +1,162 @@ +.subckt C10_ihp130_sW2_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 +XM1_f0 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=0.78u +XM1_f1 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=0.78u +XM1_f2 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=0.78u +XM1_f3 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=0.78u +XM1_f4 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=0.78u +XM1_f5 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=0.78u +XM1_f6 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=0.78u +XM1_f7 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=0.78u +XM1_f8 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=0.78u +XM1_f9 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=0.78u +XM1_f10 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=0.78u +XM1_f11 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=0.78u +XM1_f12 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=0.78u +XM1_f13 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=0.78u +XM1_f14 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=0.78u +XM1_f15 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=0.78u +XM2_f0 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=0.78u +XM2_f1 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=0.78u +XM2_f2 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=0.78u +XM2_f3 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=0.78u +XM2_f4 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=0.78u +XM2_f5 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=0.78u +XM2_f6 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=0.78u +XM2_f7 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=0.78u +XM2_f8 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=0.78u +XM2_f9 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=0.78u +XM2_f10 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=0.78u +XM2_f11 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=0.78u +XM2_f12 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=0.78u +XM2_f13 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=0.78u +XM2_f14 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=0.78u +XM2_f15 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=0.78u +XM3_f0 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f1 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f2 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f3 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f4 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f5 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f6 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f7 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f8 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f9 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f10 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f11 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f12 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f13 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f14 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f15 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM4_f0 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM4_f1 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM4_f2 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM4_f3 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM4_f4 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM4_f5 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM4_f6 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM4_f7 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM4_f8 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM4_f9 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM4_f10 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM4_f11 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM4_f12 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM4_f13 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM4_f14 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM4_f15 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM5_f0 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=0.78u +XM5_f1 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=0.78u +XM5_f2 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=0.78u +XM5_f3 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=0.78u +XM5_f4 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=0.78u +XM5_f5 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=0.78u +XM5_f6 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=0.78u +XM5_f7 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=0.78u +XM5_f8 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=0.78u +XM5_f9 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=0.78u +XM5_f10 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=0.78u +XM5_f11 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=0.78u +XM5_f12 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=0.78u +XM5_f13 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=0.78u +XM5_f14 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=0.78u +XM5_f15 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=0.78u +XM6_f0 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.78u +XM6_f1 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.78u +XM6_f2 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.78u +XM6_f3 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.78u +XM6_f4 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.78u +XM6_f5 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.78u +XM6_f6 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.78u +XM6_f7 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.78u +XM6_f8 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.78u +XM6_f9 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.78u +XM6_f10 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.78u +XM6_f11 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.78u +XM6_f12 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.78u +XM6_f13 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.78u +XM6_f14 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.78u +XM6_f15 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.78u +XM7_f0 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=0.78u +XM7_f1 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=0.78u +XM7_f2 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=0.78u +XM7_f3 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=0.78u +XM7_f4 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=0.78u +XM7_f5 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=0.78u +XM7_f6 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=0.78u +XM7_f7 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=0.78u +XM7_f8 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=0.78u +XM7_f9 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=0.78u +XM7_f10 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=0.78u +XM7_f11 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=0.78u +XM7_f12 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=0.78u +XM7_f13 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=0.78u +XM7_f14 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=0.78u +XM7_f15 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=0.78u +XM8_f0 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=0.78u +XM8_f1 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=0.78u +XM8_f2 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=0.78u +XM8_f3 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=0.78u +XM8_f4 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=0.78u +XM8_f5 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=0.78u +XM8_f6 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=0.78u +XM8_f7 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=0.78u +XM8_f8 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=0.78u +XM8_f9 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=0.78u +XM8_f10 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=0.78u +XM8_f11 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=0.78u +XM8_f12 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=0.78u +XM8_f13 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=0.78u +XM8_f14 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=0.78u +XM8_f15 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=0.78u +XM9_f0 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM9_f1 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM9_f2 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM9_f3 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM9_f4 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM9_f5 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM9_f6 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM9_f7 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM9_f8 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM9_f9 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM9_f10 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM9_f11 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM9_f12 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM9_f13 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM9_f14 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM9_f15 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM10_f0 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM10_f1 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM10_f2 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM10_f3 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM10_f4 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM10_f5 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM10_f6 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM10_f7 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM10_f8 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM10_f9 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM10_f10 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM10_f11 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM10_f12 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM10_f13 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM10_f14 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +XM10_f15 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.78u +.ends C10_ihp130_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW2_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW2_sL1.5/testbench.spice new file mode 100644 index 00000000..717d302b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW2_sL1.5/testbench.spice @@ -0,0 +1,48 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 C10_ihp130_sW2_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIB1 VDD IB1 4e-05 +.nodeset v(IB1)=0.36 +XB_VB1 VB1 VB1 VSS VSS sg13_lv_nmos w=8u l=0.78u +IB_VB1 VDDB VB1 0.00018 +XB_VB2 VB2 VB2 VDDB VDDB sg13_lv_pmos w=8u l=0.78u +IB_VB2 VB2 VSS 0.00018 +XB_VB3 VB3 VB3 VDDB VDDB sg13_lv_pmos w=8u l=0.78u +IB_VB3 VB3 VSS 2e-05 +XB_VB4n VB4n VB4n VSS VSS sg13_lv_nmos w=8u l=0.78u +IB_VB4n VDDB VB4n 4e-05 +VCM VCM 0 0.6 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 5e-13 +CL2 VOUT2 0 5e-13 +BCMFB VB4 0 V = v(VB4n) + 20*((v(VOUT1)+v(VOUT2))/2 - 0.6) +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +meas ac ugf when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW2_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW2_sL1/case.json new file mode 100644 index 00000000..f4503223 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW2_sL1/case.json @@ -0,0 +1,303 @@ +{ + "case_id": "C10_ihp130_sW2_sL1", + "circuit_id": "C10", + "pdk": "ihp130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "dut_name": "C10_ihp130_sW2_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1", + "VB2", + "VB3", + "VB4", + "IB1" + ], + "sizing": { + "M1": { + "w": 8.0, + "l": 0.52, + "nf": 16 + }, + "M2": { + "w": 8.0, + "l": 0.52, + "nf": 16 + }, + "M3": { + "w": 8.0, + "l": 0.52, + "nf": 16 + }, + "M4": { + "w": 8.0, + "l": 0.52, + "nf": 16 + }, + "M5": { + "w": 8.0, + "l": 0.52, + "nf": 16 + }, + "M6": { + "w": 8.0, + "l": 0.52, + "nf": 16 + }, + "M7": { + "w": 8.0, + "l": 0.52, + "nf": 16 + }, + "M8": { + "w": 8.0, + "l": 0.52, + "nf": 16 + }, + "M9": { + "w": 8.0, + "l": 0.52, + "nf": 16 + }, + "M10": { + "w": 8.0, + "l": 0.52, + "nf": 16 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M5", + "current": 2e-05, + "kind": "cascode3" + }, + "VB2": { + "replica": "M7", + "current": 2e-05, + "kind": "cascode3" + }, + "VB3": { + "replica": "M9", + "current": 2e-05 + }, + "VB4": { + "replica": "M3", + "current": 4e-05 + }, + "IB1": { + "i": 4e-05, + "from": "VDD" + } + }, + "load": { + "vcm": 0.6, + "CL": 5e-13, + "cmfb_gain": 20.0, + "vocm": 0.6 + }, + "category": "ota_fd", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M9": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M10": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "05a65252be3caf9c", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M5", + "current_A": 2e-05, + "variant": "cascode3" + }, + { + "kind": "replica_bias", + "port": "VB2", + "replica_of": "M7", + "current_A": 2e-05, + "variant": "cascode3" + }, + { + "kind": "replica_bias", + "port": "VB3", + "replica_of": "M9", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "replica_bias", + "port": "VB4", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VDD" + }, + { + "kind": "testbench_element", + "what": "ideal common-mode feedback on VB4" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8", + "M9", + "M10" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW2_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW2_sL1/manifest.json new file mode 100644 index 00000000..2c279332 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW2_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "499926b5a88c6aff416b983794ed8d50342edc4cf3b0f8f998e736718fe49bf6", + "qualification.json": "8ba67335a4101f8b4cc0e0aaa9ec112046e18d6e26632674accb014ddd7f9b3d", + "specs.json": "c56c34bc985c4a043eb627553fb4a9d1a3e57abc90ccbda498cbb89b7ee6b41d", + "target.spice": "62190fc9a8e979e8b78ab78166444de230700d8fd7c26a0230feec1a2f92a1dc", + "target_lvs.spice": "2db9daa36bbe6795c069ee0270db6dc333aaab11fdb95dc6f5badd672255c23a", + "testbench.spice": "cce90279557b04f17cf683945a5711b8b735848d578450faf0aac04af37fb272" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW2_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW2_sL1/qualification.json new file mode 100644 index 00000000..6998a22e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW2_sL1/qualification.json @@ -0,0 +1,180 @@ +{ + "case_id": "C10_ihp130_sW2_sL1", + "circuit_id": "C10", + "pdk": "ihp130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "ota_fd", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M9": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M10": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "05a65252be3caf9c", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 35.51 + }, + "ugf": { + "min": 33870000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 38.50789, + "ugf": 56447740.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 3.9, + "schematic_measures": { + "vo1": 0.6026398, + "vo2": 0.6026398, + "idd": 8.581298e-05, + "vos_in": 0.0, + "gain_lf": 38.50789, + "ugf": 56447740.0, + "f3db": 668684.3 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW2_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW2_sL1/specs.json new file mode 100644 index 00000000..b8e2a54b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW2_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 35.51 + }, + "ugf": { + "min": 33870000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 38.50789, + "ugf": 56447740.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW2_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW2_sL1/target.spice new file mode 100644 index 00000000..54cec55e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW2_sL1/target.spice @@ -0,0 +1,12 @@ +.subckt C10_ihp130_sW2_sL1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 +XM1 net022 VIN1 IB1 VDD sg13_lv_pmos w=8u l=0.52u ng=16 m=1 +XM2 net018 VIN2 IB1 VDD sg13_lv_pmos w=8u l=0.52u ng=16 m=1 +XM3 net022 VB4 VSS VSS sg13_lv_nmos w=8u l=0.52u ng=16 m=1 +XM4 net018 VB4 VSS VSS sg13_lv_nmos w=8u l=0.52u ng=16 m=1 +XM5 VOUT1 VB1 net022 VSS sg13_lv_nmos w=8u l=0.52u ng=16 m=1 +XM6 VOUT2 VB1 net018 VSS sg13_lv_nmos w=8u l=0.52u ng=16 m=1 +XM7 VOUT1 VB2 net023 VDD sg13_lv_pmos w=8u l=0.52u ng=16 m=1 +XM8 VOUT2 VB2 net021 VDD sg13_lv_pmos w=8u l=0.52u ng=16 m=1 +XM9 net023 VB3 VDD VDD sg13_lv_pmos w=8u l=0.52u ng=16 m=1 +XM10 net021 VB3 VDD VDD sg13_lv_pmos w=8u l=0.52u ng=16 m=1 +.ends C10_ihp130_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW2_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW2_sL1/target_lvs.spice new file mode 100644 index 00000000..5498cbf7 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW2_sL1/target_lvs.spice @@ -0,0 +1,162 @@ +.subckt C10_ihp130_sW2_sL1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 +XM1_f0 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f1 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f2 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f3 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f4 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f5 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f6 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f7 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f8 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f9 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f10 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f11 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f12 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f13 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f14 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f15 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f0 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f1 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f2 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f3 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f4 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f5 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f6 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f7 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f8 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f9 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f10 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f11 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f12 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f13 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f14 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f15 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM3_f0 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f1 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f2 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f3 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f4 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f5 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f6 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f7 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f8 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f9 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f10 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f11 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f12 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f13 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f14 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f15 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f0 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f1 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f2 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f3 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f4 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f5 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f6 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f7 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f8 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f9 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f10 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f11 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f12 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f13 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f14 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f15 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f0 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f1 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f2 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f3 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f4 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f5 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f6 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f7 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f8 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f9 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f10 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f11 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f12 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f13 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f14 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f15 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=0.52u +XM6_f0 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM6_f1 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM6_f2 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM6_f3 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM6_f4 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM6_f5 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM6_f6 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM6_f7 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM6_f8 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM6_f9 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM6_f10 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM6_f11 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM6_f12 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM6_f13 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM6_f14 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM6_f15 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=0.52u +XM7_f0 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f1 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f2 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f3 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f4 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f5 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f6 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f7 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f8 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f9 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f10 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f11 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f12 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f13 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f14 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f15 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f0 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f1 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f2 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f3 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f4 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f5 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f6 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f7 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f8 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f9 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f10 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f11 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f12 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f13 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f14 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f15 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=0.52u +XM9_f0 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM9_f1 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM9_f2 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM9_f3 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM9_f4 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM9_f5 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM9_f6 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM9_f7 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM9_f8 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM9_f9 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM9_f10 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM9_f11 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM9_f12 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM9_f13 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM9_f14 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM9_f15 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM10_f0 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM10_f1 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM10_f2 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM10_f3 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM10_f4 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM10_f5 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM10_f6 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM10_f7 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM10_f8 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM10_f9 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM10_f10 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM10_f11 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM10_f12 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM10_f13 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM10_f14 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM10_f15 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +.ends C10_ihp130_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW2_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW2_sL1/testbench.spice new file mode 100644 index 00000000..c84aaf5c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW2_sL1/testbench.spice @@ -0,0 +1,48 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 C10_ihp130_sW2_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIB1 VDD IB1 4e-05 +.nodeset v(IB1)=0.36 +XB_VB1 VB1 VB1 VSS VSS sg13_lv_nmos w=8u l=0.52u +IB_VB1 VDDB VB1 0.00018 +XB_VB2 VB2 VB2 VDDB VDDB sg13_lv_pmos w=8u l=0.52u +IB_VB2 VB2 VSS 0.00018 +XB_VB3 VB3 VB3 VDDB VDDB sg13_lv_pmos w=8u l=0.52u +IB_VB3 VB3 VSS 2e-05 +XB_VB4n VB4n VB4n VSS VSS sg13_lv_nmos w=8u l=0.52u +IB_VB4n VDDB VB4n 4e-05 +VCM VCM 0 0.6 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 5e-13 +CL2 VOUT2 0 5e-13 +BCMFB VB4 0 V = v(VB4n) + 20*((v(VOUT1)+v(VOUT2))/2 - 0.6) +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +meas ac ugf when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW2_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW2_sL2/case.json new file mode 100644 index 00000000..0151670f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW2_sL2/case.json @@ -0,0 +1,303 @@ +{ + "case_id": "C10_ihp130_sW2_sL2", + "circuit_id": "C10", + "pdk": "ihp130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "dut_name": "C10_ihp130_sW2_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1", + "VB2", + "VB3", + "VB4", + "IB1" + ], + "sizing": { + "M1": { + "w": 8.0, + "l": 1.04, + "nf": 16 + }, + "M2": { + "w": 8.0, + "l": 1.04, + "nf": 16 + }, + "M3": { + "w": 8.0, + "l": 1.04, + "nf": 16 + }, + "M4": { + "w": 8.0, + "l": 1.04, + "nf": 16 + }, + "M5": { + "w": 8.0, + "l": 1.04, + "nf": 16 + }, + "M6": { + "w": 8.0, + "l": 1.04, + "nf": 16 + }, + "M7": { + "w": 8.0, + "l": 1.04, + "nf": 16 + }, + "M8": { + "w": 8.0, + "l": 1.04, + "nf": 16 + }, + "M9": { + "w": 8.0, + "l": 1.04, + "nf": 16 + }, + "M10": { + "w": 8.0, + "l": 1.04, + "nf": 16 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M5", + "current": 2e-05, + "kind": "cascode3" + }, + "VB2": { + "replica": "M7", + "current": 2e-05, + "kind": "cascode3" + }, + "VB3": { + "replica": "M9", + "current": 2e-05 + }, + "VB4": { + "replica": "M3", + "current": 4e-05 + }, + "IB1": { + "i": 4e-05, + "from": "VDD" + } + }, + "load": { + "vcm": 0.6, + "CL": 5e-13, + "cmfb_gain": 20.0, + "vocm": 0.6 + }, + "category": "ota_fd", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.04, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.04, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.04, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.04, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.04, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.04, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.04, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.04, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M9": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.04, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M10": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.04, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "3d8989a11cd4e825", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M5", + "current_A": 2e-05, + "variant": "cascode3" + }, + { + "kind": "replica_bias", + "port": "VB2", + "replica_of": "M7", + "current_A": 2e-05, + "variant": "cascode3" + }, + { + "kind": "replica_bias", + "port": "VB3", + "replica_of": "M9", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "replica_bias", + "port": "VB4", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VDD" + }, + { + "kind": "testbench_element", + "what": "ideal common-mode feedback on VB4" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8", + "M9", + "M10" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW2_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW2_sL2/manifest.json new file mode 100644 index 00000000..ee276045 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW2_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "d56a032bef846447256e0dbeb078ce27104c046026881550d2452b093a3c85de", + "qualification.json": "f97f797a17f1e47493fef82dbc675b91e5816c7203982b28c53f19d87e27f2f9", + "specs.json": "15bc48e113ba3b9d78bd05aaf826deaf9b43b34fb343d68ebfa375fae8570e6e", + "target.spice": "434f0b7de135f015687579d91d831d7b0b97770228086d6040002d6fd237a87c", + "target_lvs.spice": "7cb6d1327360478d2a2ba07c72d5387639131e606d2b67e175618f1dcd59adae", + "testbench.spice": "0deb2f3b0ddf4e58d0c18b12250a8c007a01ab5592c87522164f2d7b17787275" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW2_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW2_sL2/qualification.json new file mode 100644 index 00000000..e697d211 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW2_sL2/qualification.json @@ -0,0 +1,180 @@ +{ + "case_id": "C10_ihp130_sW2_sL2", + "circuit_id": "C10", + "pdk": "ihp130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "ota_fd", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.04, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.04, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.04, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.04, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.04, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.04, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.04, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.04, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M9": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.04, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M10": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.04, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "3d8989a11cd4e825", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 35.14 + }, + "ugf": { + "min": 24650000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 38.13594, + "ugf": 41078900.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 3.5, + "schematic_measures": { + "vo1": 0.6025637, + "vo2": 0.6025637, + "idd": 8.841174e-05, + "vos_in": -9.09495e-13, + "gain_lf": 38.13594, + "ugf": 41078900.0, + "f3db": 507139.7 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW2_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW2_sL2/specs.json new file mode 100644 index 00000000..a32df4f5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW2_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 35.14 + }, + "ugf": { + "min": 24650000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 38.13594, + "ugf": 41078900.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW2_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW2_sL2/target.spice new file mode 100644 index 00000000..e70ba095 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW2_sL2/target.spice @@ -0,0 +1,12 @@ +.subckt C10_ihp130_sW2_sL2 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 +XM1 net022 VIN1 IB1 VDD sg13_lv_pmos w=8u l=1.04u ng=16 m=1 +XM2 net018 VIN2 IB1 VDD sg13_lv_pmos w=8u l=1.04u ng=16 m=1 +XM3 net022 VB4 VSS VSS sg13_lv_nmos w=8u l=1.04u ng=16 m=1 +XM4 net018 VB4 VSS VSS sg13_lv_nmos w=8u l=1.04u ng=16 m=1 +XM5 VOUT1 VB1 net022 VSS sg13_lv_nmos w=8u l=1.04u ng=16 m=1 +XM6 VOUT2 VB1 net018 VSS sg13_lv_nmos w=8u l=1.04u ng=16 m=1 +XM7 VOUT1 VB2 net023 VDD sg13_lv_pmos w=8u l=1.04u ng=16 m=1 +XM8 VOUT2 VB2 net021 VDD sg13_lv_pmos w=8u l=1.04u ng=16 m=1 +XM9 net023 VB3 VDD VDD sg13_lv_pmos w=8u l=1.04u ng=16 m=1 +XM10 net021 VB3 VDD VDD sg13_lv_pmos w=8u l=1.04u ng=16 m=1 +.ends C10_ihp130_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW2_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW2_sL2/target_lvs.spice new file mode 100644 index 00000000..0b090615 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW2_sL2/target_lvs.spice @@ -0,0 +1,162 @@ +.subckt C10_ihp130_sW2_sL2 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 +XM1_f0 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=1.04u +XM1_f1 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=1.04u +XM1_f2 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=1.04u +XM1_f3 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=1.04u +XM1_f4 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=1.04u +XM1_f5 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=1.04u +XM1_f6 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=1.04u +XM1_f7 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=1.04u +XM1_f8 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=1.04u +XM1_f9 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=1.04u +XM1_f10 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=1.04u +XM1_f11 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=1.04u +XM1_f12 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=1.04u +XM1_f13 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=1.04u +XM1_f14 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=1.04u +XM1_f15 net022 VIN1 IB1 VDD sg13_lv_pmos w=0.5u l=1.04u +XM2_f0 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=1.04u +XM2_f1 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=1.04u +XM2_f2 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=1.04u +XM2_f3 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=1.04u +XM2_f4 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=1.04u +XM2_f5 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=1.04u +XM2_f6 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=1.04u +XM2_f7 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=1.04u +XM2_f8 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=1.04u +XM2_f9 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=1.04u +XM2_f10 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=1.04u +XM2_f11 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=1.04u +XM2_f12 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=1.04u +XM2_f13 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=1.04u +XM2_f14 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=1.04u +XM2_f15 net018 VIN2 IB1 VDD sg13_lv_pmos w=0.5u l=1.04u +XM3_f0 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM3_f1 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM3_f2 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM3_f3 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM3_f4 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM3_f5 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM3_f6 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM3_f7 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM3_f8 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM3_f9 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM3_f10 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM3_f11 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM3_f12 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM3_f13 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM3_f14 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM3_f15 net022 VB4 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM4_f0 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM4_f1 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM4_f2 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM4_f3 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM4_f4 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM4_f5 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM4_f6 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM4_f7 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM4_f8 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM4_f9 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM4_f10 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM4_f11 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM4_f12 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM4_f13 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM4_f14 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM4_f15 net018 VB4 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM5_f0 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=1.04u +XM5_f1 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=1.04u +XM5_f2 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=1.04u +XM5_f3 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=1.04u +XM5_f4 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=1.04u +XM5_f5 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=1.04u +XM5_f6 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=1.04u +XM5_f7 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=1.04u +XM5_f8 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=1.04u +XM5_f9 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=1.04u +XM5_f10 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=1.04u +XM5_f11 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=1.04u +XM5_f12 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=1.04u +XM5_f13 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=1.04u +XM5_f14 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=1.04u +XM5_f15 VOUT1 VB1 net022 VSS sg13_lv_nmos w=0.5u l=1.04u +XM6_f0 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=1.04u +XM6_f1 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=1.04u +XM6_f2 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=1.04u +XM6_f3 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=1.04u +XM6_f4 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=1.04u +XM6_f5 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=1.04u +XM6_f6 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=1.04u +XM6_f7 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=1.04u +XM6_f8 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=1.04u +XM6_f9 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=1.04u +XM6_f10 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=1.04u +XM6_f11 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=1.04u +XM6_f12 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=1.04u +XM6_f13 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=1.04u +XM6_f14 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=1.04u +XM6_f15 VOUT2 VB1 net018 VSS sg13_lv_nmos w=0.5u l=1.04u +XM7_f0 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=1.04u +XM7_f1 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=1.04u +XM7_f2 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=1.04u +XM7_f3 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=1.04u +XM7_f4 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=1.04u +XM7_f5 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=1.04u +XM7_f6 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=1.04u +XM7_f7 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=1.04u +XM7_f8 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=1.04u +XM7_f9 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=1.04u +XM7_f10 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=1.04u +XM7_f11 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=1.04u +XM7_f12 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=1.04u +XM7_f13 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=1.04u +XM7_f14 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=1.04u +XM7_f15 VOUT1 VB2 net023 VDD sg13_lv_pmos w=0.5u l=1.04u +XM8_f0 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=1.04u +XM8_f1 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=1.04u +XM8_f2 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=1.04u +XM8_f3 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=1.04u +XM8_f4 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=1.04u +XM8_f5 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=1.04u +XM8_f6 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=1.04u +XM8_f7 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=1.04u +XM8_f8 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=1.04u +XM8_f9 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=1.04u +XM8_f10 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=1.04u +XM8_f11 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=1.04u +XM8_f12 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=1.04u +XM8_f13 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=1.04u +XM8_f14 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=1.04u +XM8_f15 VOUT2 VB2 net021 VDD sg13_lv_pmos w=0.5u l=1.04u +XM9_f0 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=1.04u +XM9_f1 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=1.04u +XM9_f2 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=1.04u +XM9_f3 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=1.04u +XM9_f4 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=1.04u +XM9_f5 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=1.04u +XM9_f6 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=1.04u +XM9_f7 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=1.04u +XM9_f8 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=1.04u +XM9_f9 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=1.04u +XM9_f10 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=1.04u +XM9_f11 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=1.04u +XM9_f12 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=1.04u +XM9_f13 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=1.04u +XM9_f14 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=1.04u +XM9_f15 net023 VB3 VDD VDD sg13_lv_pmos w=0.5u l=1.04u +XM10_f0 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=1.04u +XM10_f1 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=1.04u +XM10_f2 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=1.04u +XM10_f3 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=1.04u +XM10_f4 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=1.04u +XM10_f5 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=1.04u +XM10_f6 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=1.04u +XM10_f7 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=1.04u +XM10_f8 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=1.04u +XM10_f9 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=1.04u +XM10_f10 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=1.04u +XM10_f11 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=1.04u +XM10_f12 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=1.04u +XM10_f13 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=1.04u +XM10_f14 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=1.04u +XM10_f15 net021 VB3 VDD VDD sg13_lv_pmos w=0.5u l=1.04u +.ends C10_ihp130_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW2_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW2_sL2/testbench.spice new file mode 100644 index 00000000..66c3b825 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/ihp130/sW2_sL2/testbench.spice @@ -0,0 +1,48 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 C10_ihp130_sW2_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIB1 VDD IB1 4e-05 +.nodeset v(IB1)=0.36 +XB_VB1 VB1 VB1 VSS VSS sg13_lv_nmos w=8u l=1.04u +IB_VB1 VDDB VB1 0.00018 +XB_VB2 VB2 VB2 VDDB VDDB sg13_lv_pmos w=8u l=1.04u +IB_VB2 VB2 VSS 0.00018 +XB_VB3 VB3 VB3 VDDB VDDB sg13_lv_pmos w=8u l=1.04u +IB_VB3 VB3 VSS 2e-05 +XB_VB4n VB4n VB4n VSS VSS sg13_lv_nmos w=8u l=1.04u +IB_VB4n VDDB VB4n 4e-05 +VCM VCM 0 0.6 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 5e-13 +CL2 VOUT2 0 5e-13 +BCMFB VB4 0 V = v(VB4n) + 20*((v(VOUT1)+v(VOUT2))/2 - 0.6) +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +meas ac ugf when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C10/sky130/sW0.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW0.5_sL1.5/case.json new file mode 100644 index 00000000..1bad990b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW0.5_sL1.5/case.json @@ -0,0 +1,303 @@ +{ + "case_id": "C10_sky130_sW0.5_sL1.5", + "circuit_id": "C10", + "pdk": "sky130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "dut_name": "C10_sky130_sW0.5_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1", + "VB2", + "VB3", + "VB4", + "IB1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.9, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 0.9, + "nf": 4 + }, + "M3": { + "w": 2.0, + "l": 0.9, + "nf": 4 + }, + "M4": { + "w": 2.0, + "l": 0.9, + "nf": 4 + }, + "M5": { + "w": 2.0, + "l": 0.9, + "nf": 4 + }, + "M6": { + "w": 2.0, + "l": 0.9, + "nf": 4 + }, + "M7": { + "w": 2.0, + "l": 0.9, + "nf": 4 + }, + "M8": { + "w": 2.0, + "l": 0.9, + "nf": 4 + }, + "M9": { + "w": 2.0, + "l": 0.9, + "nf": 4 + }, + "M10": { + "w": 2.0, + "l": 0.9, + "nf": 4 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M5", + "current": 2e-05, + "kind": "cascode3" + }, + "VB2": { + "replica": "M7", + "current": 2e-05, + "kind": "cascode3" + }, + "VB3": { + "replica": "M9", + "current": 2e-05 + }, + "VB4": { + "replica": "M3", + "current": 4e-05 + }, + "IB1": { + "i": 4e-05, + "from": "VDD" + } + }, + "load": { + "vcm": 0.9, + "CL": 5e-13, + "cmfb_gain": 20.0, + "vocm": 0.9 + }, + "category": "ota_fd", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.9, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.9, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.9, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.9, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.9, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.9, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.9, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.9, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M9": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.9, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M10": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.9, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "e2db45bf4d49b061", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M5", + "current_A": 2e-05, + "variant": "cascode3" + }, + { + "kind": "replica_bias", + "port": "VB2", + "replica_of": "M7", + "current_A": 2e-05, + "variant": "cascode3" + }, + { + "kind": "replica_bias", + "port": "VB3", + "replica_of": "M9", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "replica_bias", + "port": "VB4", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VDD" + }, + { + "kind": "testbench_element", + "what": "ideal common-mode feedback on VB4" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8", + "M9", + "M10" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/sky130/sW0.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW0.5_sL1.5/manifest.json new file mode 100644 index 00000000..6c4498b2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW0.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "fdce4b323abbf627f9b1a2b78218627acaf1773bb8b1ed288c0b6776660f0c5b", + "qualification.json": "27e5cf500e79f473dbe82f0a83b3e942a6da37862c0f7aa7786a761ed8e04cfc", + "specs.json": "579f4970918a608dab5937bc09523057e9e5e9c8b5e912452f433acd070d9e52", + "target.spice": "a047cfebdf55a1f97c322823b08cce432f070d75b097d248d0fe4c65f9ce3746", + "target_lvs.spice": "f6060d5067dac89eefd43f8612d68ebe0b4236ec693a3488b7392d496938a2a7", + "testbench.spice": "5a728298e95fd3ff5c328c09f18cf91ff3a6cb109c6e545039fde0fd18bdb83f" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/sky130/sW0.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW0.5_sL1.5/qualification.json new file mode 100644 index 00000000..8906edbe --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW0.5_sL1.5/qualification.json @@ -0,0 +1,182 @@ +{ + "case_id": "C10_sky130_sW0.5_sL1.5", + "circuit_id": "C10", + "pdk": "sky130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "ota_fd", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.9, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.9, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.9, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.9, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.9, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.9, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.9, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.9, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M9": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.9, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M10": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.9, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "e2db45bf4d49b061", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "gain_lf=28.3 below floor 35" + ], + "spec": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 13000000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 28.30011, + "ugf": 21671540.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 9.4, + "schematic_measures": { + "vo1": 0.9038703, + "vo2": 0.9038703, + "idd": 9.247186e-05, + "vos_in": 0.0, + "gain_lf": 28.30011, + "ugf": 21671540.0, + "f3db": 830977.5 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/sky130/sW0.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW0.5_sL1.5/specs.json new file mode 100644 index 00000000..6627153a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW0.5_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 13000000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 28.30011, + "ugf": 21671540.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/sky130/sW0.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW0.5_sL1.5/target.spice new file mode 100644 index 00000000..f56d414b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW0.5_sL1.5/target.spice @@ -0,0 +1,12 @@ +.subckt C10_sky130_sW0.5_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 +XM1 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=2 l=0.9 nf=4 +XM2 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=2 l=0.9 nf=4 +XM3 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=2 l=0.9 nf=4 +XM4 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=2 l=0.9 nf=4 +XM5 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=2 l=0.9 nf=4 +XM6 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=2 l=0.9 nf=4 +XM7 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=2 l=0.9 nf=4 +XM8 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=2 l=0.9 nf=4 +XM9 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=2 l=0.9 nf=4 +XM10 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=2 l=0.9 nf=4 +.ends C10_sky130_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C10/sky130/sW0.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW0.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..a2698567 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW0.5_sL1.5/target_lvs.spice @@ -0,0 +1,42 @@ +.subckt C10_sky130_sW0.5_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 +XM1_f0 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM1_f1 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM1_f2 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM1_f3 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM2_f0 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM2_f1 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM2_f2 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM2_f3 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM3_f0 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM3_f1 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM3_f2 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM3_f3 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM4_f0 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM4_f1 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM4_f2 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM4_f3 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM5_f0 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM5_f1 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM5_f2 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM5_f3 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM6_f0 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM6_f1 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM6_f2 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM6_f3 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM7_f0 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM7_f1 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM7_f2 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM7_f3 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM8_f0 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM8_f1 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM8_f2 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM8_f3 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM9_f0 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM9_f1 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM9_f2 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM9_f3 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM10_f0 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM10_f1 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM10_f2 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM10_f3 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +.ends C10_sky130_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C10/sky130/sW0.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW0.5_sL1.5/testbench.spice new file mode 100644 index 00000000..128467ef --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW0.5_sL1.5/testbench.spice @@ -0,0 +1,48 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 C10_sky130_sW0.5_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIB1 VDD IB1 4e-05 +.nodeset v(IB1)=0.54 +XB_VB1 VB1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=2 l=0.9 +IB_VB1 VDDB VB1 0.00018 +XB_VB2 VB2 VB2 VDDB VDDB sky130_fd_pr__pfet_01v8 w=2 l=0.9 +IB_VB2 VB2 VSS 0.00018 +XB_VB3 VB3 VB3 VDDB VDDB sky130_fd_pr__pfet_01v8 w=2 l=0.9 +IB_VB3 VB3 VSS 2e-05 +XB_VB4n VB4n VB4n VSS VSS sky130_fd_pr__nfet_01v8 w=2 l=0.9 +IB_VB4n VDDB VB4n 4e-05 +VCM VCM 0 0.9 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 5e-13 +CL2 VOUT2 0 5e-13 +BCMFB VB4 0 V = v(VB4n) + 20*((v(VOUT1)+v(VOUT2))/2 - 0.9) +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +meas ac ugf when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C10/sky130/sW0.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW0.5_sL1/case.json new file mode 100644 index 00000000..e063c0de --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW0.5_sL1/case.json @@ -0,0 +1,303 @@ +{ + "case_id": "C10_sky130_sW0.5_sL1", + "circuit_id": "C10", + "pdk": "sky130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "dut_name": "C10_sky130_sW0.5_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1", + "VB2", + "VB3", + "VB4", + "IB1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.6, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 0.6, + "nf": 4 + }, + "M3": { + "w": 2.0, + "l": 0.6, + "nf": 4 + }, + "M4": { + "w": 2.0, + "l": 0.6, + "nf": 4 + }, + "M5": { + "w": 2.0, + "l": 0.6, + "nf": 4 + }, + "M6": { + "w": 2.0, + "l": 0.6, + "nf": 4 + }, + "M7": { + "w": 2.0, + "l": 0.6, + "nf": 4 + }, + "M8": { + "w": 2.0, + "l": 0.6, + "nf": 4 + }, + "M9": { + "w": 2.0, + "l": 0.6, + "nf": 4 + }, + "M10": { + "w": 2.0, + "l": 0.6, + "nf": 4 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M5", + "current": 2e-05, + "kind": "cascode3" + }, + "VB2": { + "replica": "M7", + "current": 2e-05, + "kind": "cascode3" + }, + "VB3": { + "replica": "M9", + "current": 2e-05 + }, + "VB4": { + "replica": "M3", + "current": 4e-05 + }, + "IB1": { + "i": 4e-05, + "from": "VDD" + } + }, + "load": { + "vcm": 0.9, + "CL": 5e-13, + "cmfb_gain": 20.0, + "vocm": 0.9 + }, + "category": "ota_fd", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M9": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M10": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "ae35d796e7f3ce5a", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M5", + "current_A": 2e-05, + "variant": "cascode3" + }, + { + "kind": "replica_bias", + "port": "VB2", + "replica_of": "M7", + "current_A": 2e-05, + "variant": "cascode3" + }, + { + "kind": "replica_bias", + "port": "VB3", + "replica_of": "M9", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "replica_bias", + "port": "VB4", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VDD" + }, + { + "kind": "testbench_element", + "what": "ideal common-mode feedback on VB4" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8", + "M9", + "M10" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/sky130/sW0.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW0.5_sL1/manifest.json new file mode 100644 index 00000000..f7f38df3 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW0.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "9501f7528b7cc5ea56dfd2aea3e73031782b9fca17d9539b1eb2e8c5cb190453", + "qualification.json": "73f9fc919c7d9d91f6b2689afdbc6fbcdc71c81312ace194a542ef62e54962a3", + "specs.json": "2903d62825512e900b84bd930548fdb14ac78fde3863694d72705e790d361748", + "target.spice": "ddfa11ae615bc7433b177eff0e54d296272cebccea8809cd8737038f5dc26a65", + "target_lvs.spice": "de6922472be4a008019d18a2ccc990aabedd58dc6e50be191dcef6e68e12f2cf", + "testbench.spice": "5d6dc841eef4e316ca702b5436f25385b0b573d0574d57828e47d7259f7ff6d3" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/sky130/sW0.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW0.5_sL1/qualification.json new file mode 100644 index 00000000..94f2c1f6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW0.5_sL1/qualification.json @@ -0,0 +1,182 @@ +{ + "case_id": "C10_sky130_sW0.5_sL1", + "circuit_id": "C10", + "pdk": "sky130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "ota_fd", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M9": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M10": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "ae35d796e7f3ce5a", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "gain_lf=31.79 below floor 35" + ], + "spec": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 15880000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 31.7936, + "ugf": 26458940.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 9.6, + "schematic_measures": { + "vo1": 0.9031849, + "vo2": 0.9031849, + "idd": 9.346657e-05, + "vos_in": 3.637979e-12, + "gain_lf": 31.7936, + "ugf": 26458940.0, + "f3db": 678087.9 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/sky130/sW0.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW0.5_sL1/specs.json new file mode 100644 index 00000000..d8f4a656 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW0.5_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 15880000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 31.7936, + "ugf": 26458940.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/sky130/sW0.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW0.5_sL1/target.spice new file mode 100644 index 00000000..239778eb --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW0.5_sL1/target.spice @@ -0,0 +1,12 @@ +.subckt C10_sky130_sW0.5_sL1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 +XM1 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=2 l=0.6 nf=4 +XM2 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=2 l=0.6 nf=4 +XM3 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=2 l=0.6 nf=4 +XM4 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=2 l=0.6 nf=4 +XM5 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=2 l=0.6 nf=4 +XM6 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=2 l=0.6 nf=4 +XM7 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=2 l=0.6 nf=4 +XM8 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=2 l=0.6 nf=4 +XM9 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=2 l=0.6 nf=4 +XM10 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=2 l=0.6 nf=4 +.ends C10_sky130_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C10/sky130/sW0.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW0.5_sL1/target_lvs.spice new file mode 100644 index 00000000..b68dcf65 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW0.5_sL1/target_lvs.spice @@ -0,0 +1,42 @@ +.subckt C10_sky130_sW0.5_sL1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 +XM1_f0 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f1 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f2 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f3 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f0 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f1 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f2 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f3 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM3_f0 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f1 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f2 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f3 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f0 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f1 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f2 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f3 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f0 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f1 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f2 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f3 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM6_f0 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM6_f1 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM6_f2 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM6_f3 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM7_f0 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f1 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f2 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f3 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f0 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f1 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f2 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f3 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM9_f0 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM9_f1 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM9_f2 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM9_f3 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM10_f0 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM10_f1 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM10_f2 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM10_f3 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +.ends C10_sky130_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C10/sky130/sW0.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW0.5_sL1/testbench.spice new file mode 100644 index 00000000..6bc71401 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW0.5_sL1/testbench.spice @@ -0,0 +1,48 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 C10_sky130_sW0.5_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIB1 VDD IB1 4e-05 +.nodeset v(IB1)=0.54 +XB_VB1 VB1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=2 l=0.6 +IB_VB1 VDDB VB1 0.00018 +XB_VB2 VB2 VB2 VDDB VDDB sky130_fd_pr__pfet_01v8 w=2 l=0.6 +IB_VB2 VB2 VSS 0.00018 +XB_VB3 VB3 VB3 VDDB VDDB sky130_fd_pr__pfet_01v8 w=2 l=0.6 +IB_VB3 VB3 VSS 2e-05 +XB_VB4n VB4n VB4n VSS VSS sky130_fd_pr__nfet_01v8 w=2 l=0.6 +IB_VB4n VDDB VB4n 4e-05 +VCM VCM 0 0.9 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 5e-13 +CL2 VOUT2 0 5e-13 +BCMFB VB4 0 V = v(VB4n) + 20*((v(VOUT1)+v(VOUT2))/2 - 0.9) +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +meas ac ugf when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C10/sky130/sW0.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW0.5_sL2/case.json new file mode 100644 index 00000000..27d66940 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW0.5_sL2/case.json @@ -0,0 +1,303 @@ +{ + "case_id": "C10_sky130_sW0.5_sL2", + "circuit_id": "C10", + "pdk": "sky130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "dut_name": "C10_sky130_sW0.5_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1", + "VB2", + "VB3", + "VB4", + "IB1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 1.2, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 1.2, + "nf": 4 + }, + "M3": { + "w": 2.0, + "l": 1.2, + "nf": 4 + }, + "M4": { + "w": 2.0, + "l": 1.2, + "nf": 4 + }, + "M5": { + "w": 2.0, + "l": 1.2, + "nf": 4 + }, + "M6": { + "w": 2.0, + "l": 1.2, + "nf": 4 + }, + "M7": { + "w": 2.0, + "l": 1.2, + "nf": 4 + }, + "M8": { + "w": 2.0, + "l": 1.2, + "nf": 4 + }, + "M9": { + "w": 2.0, + "l": 1.2, + "nf": 4 + }, + "M10": { + "w": 2.0, + "l": 1.2, + "nf": 4 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M5", + "current": 2e-05, + "kind": "cascode3" + }, + "VB2": { + "replica": "M7", + "current": 2e-05, + "kind": "cascode3" + }, + "VB3": { + "replica": "M9", + "current": 2e-05 + }, + "VB4": { + "replica": "M3", + "current": 4e-05 + }, + "IB1": { + "i": 4e-05, + "from": "VDD" + } + }, + "load": { + "vcm": 0.9, + "CL": 5e-13, + "cmfb_gain": 20.0, + "vocm": 0.9 + }, + "category": "ota_fd", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.2, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.2, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.2, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.2, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.2, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.2, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.2, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.2, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M9": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.2, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M10": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.2, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "c5068b3c22cce6c8", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M5", + "current_A": 2e-05, + "variant": "cascode3" + }, + { + "kind": "replica_bias", + "port": "VB2", + "replica_of": "M7", + "current_A": 2e-05, + "variant": "cascode3" + }, + { + "kind": "replica_bias", + "port": "VB3", + "replica_of": "M9", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "replica_bias", + "port": "VB4", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VDD" + }, + { + "kind": "testbench_element", + "what": "ideal common-mode feedback on VB4" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8", + "M9", + "M10" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/sky130/sW0.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW0.5_sL2/manifest.json new file mode 100644 index 00000000..3938eb34 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW0.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "fe759de3bb149443a9014350b319848f12dfd72ab9eb1c055afba6886c4dcc95", + "qualification.json": "226628d2f8ec0f5a3a44a5931d0704a688bff2f2075b20bfd57d8a189da9ff1c", + "specs.json": "899807e5df97eb4607dcf1a6e4a144f699598e577eabf7283cb4af27cafa4aa3", + "target.spice": "500823283e98e62ae12d6d006859cf3a59ba2d5d1807d822c558ff2e6020229a", + "target_lvs.spice": "7fe11a65f81211059cffe7a767ad36715695f641641178bc547e0418d42365cf", + "testbench.spice": "a3c209d3d8a41426d88d13cce8346ab454ef29b2ed369bd14d404dde71dbdeea" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/sky130/sW0.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW0.5_sL2/qualification.json new file mode 100644 index 00000000..9612a992 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW0.5_sL2/qualification.json @@ -0,0 +1,182 @@ +{ + "case_id": "C10_sky130_sW0.5_sL2", + "circuit_id": "C10", + "pdk": "sky130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "ota_fd", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.2, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.2, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.2, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.2, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.2, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.2, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.2, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.2, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M9": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.2, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M10": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.2, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "c5068b3c22cce6c8", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "gain_lf=24.99 below floor 35" + ], + "spec": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 11200000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 24.98593, + "ugf": 18659840.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 9.5, + "schematic_measures": { + "vo1": 0.903966, + "vo2": 0.903966, + "idd": 9.122761e-05, + "vos_in": -1.81899e-12, + "gain_lf": 24.98593, + "ugf": 18659840.0, + "f3db": 1048510.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/sky130/sW0.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW0.5_sL2/specs.json new file mode 100644 index 00000000..52f53abf --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW0.5_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 11200000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 24.98593, + "ugf": 18659840.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/sky130/sW0.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW0.5_sL2/target.spice new file mode 100644 index 00000000..5cffe803 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW0.5_sL2/target.spice @@ -0,0 +1,12 @@ +.subckt C10_sky130_sW0.5_sL2 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 +XM1 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=2 l=1.2 nf=4 +XM2 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=2 l=1.2 nf=4 +XM3 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=2 l=1.2 nf=4 +XM4 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=2 l=1.2 nf=4 +XM5 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=2 l=1.2 nf=4 +XM6 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=2 l=1.2 nf=4 +XM7 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=2 l=1.2 nf=4 +XM8 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=2 l=1.2 nf=4 +XM9 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=2 l=1.2 nf=4 +XM10 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=2 l=1.2 nf=4 +.ends C10_sky130_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C10/sky130/sW0.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW0.5_sL2/target_lvs.spice new file mode 100644 index 00000000..c0a3ab30 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW0.5_sL2/target_lvs.spice @@ -0,0 +1,42 @@ +.subckt C10_sky130_sW0.5_sL2 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 +XM1_f0 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM1_f1 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM1_f2 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM1_f3 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM2_f0 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM2_f1 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM2_f2 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM2_f3 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM3_f0 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM3_f1 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM3_f2 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM3_f3 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM4_f0 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM4_f1 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM4_f2 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM4_f3 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM5_f0 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM5_f1 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM5_f2 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM5_f3 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM6_f0 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM6_f1 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM6_f2 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM6_f3 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM7_f0 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM7_f1 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM7_f2 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM7_f3 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM8_f0 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM8_f1 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM8_f2 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM8_f3 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM9_f0 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM9_f1 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM9_f2 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM9_f3 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM10_f0 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM10_f1 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM10_f2 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM10_f3 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +.ends C10_sky130_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C10/sky130/sW0.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW0.5_sL2/testbench.spice new file mode 100644 index 00000000..e7220dec --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW0.5_sL2/testbench.spice @@ -0,0 +1,48 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 C10_sky130_sW0.5_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIB1 VDD IB1 4e-05 +.nodeset v(IB1)=0.54 +XB_VB1 VB1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=2 l=1.2 +IB_VB1 VDDB VB1 0.00018 +XB_VB2 VB2 VB2 VDDB VDDB sky130_fd_pr__pfet_01v8 w=2 l=1.2 +IB_VB2 VB2 VSS 0.00018 +XB_VB3 VB3 VB3 VDDB VDDB sky130_fd_pr__pfet_01v8 w=2 l=1.2 +IB_VB3 VB3 VSS 2e-05 +XB_VB4n VB4n VB4n VSS VSS sky130_fd_pr__nfet_01v8 w=2 l=1.2 +IB_VB4n VDDB VB4n 4e-05 +VCM VCM 0 0.9 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 5e-13 +CL2 VOUT2 0 5e-13 +BCMFB VB4 0 V = v(VB4n) + 20*((v(VOUT1)+v(VOUT2))/2 - 0.9) +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +meas ac ugf when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1.5_sL1.5/case.json new file mode 100644 index 00000000..231026e9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1.5_sL1.5/case.json @@ -0,0 +1,303 @@ +{ + "case_id": "C10_sky130_sW1.5_sL1.5", + "circuit_id": "C10", + "pdk": "sky130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "dut_name": "C10_sky130_sW1.5_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1", + "VB2", + "VB3", + "VB4", + "IB1" + ], + "sizing": { + "M1": { + "w": 6.0, + "l": 0.9, + "nf": 12 + }, + "M2": { + "w": 6.0, + "l": 0.9, + "nf": 12 + }, + "M3": { + "w": 6.0, + "l": 0.9, + "nf": 12 + }, + "M4": { + "w": 6.0, + "l": 0.9, + "nf": 12 + }, + "M5": { + "w": 6.0, + "l": 0.9, + "nf": 12 + }, + "M6": { + "w": 6.0, + "l": 0.9, + "nf": 12 + }, + "M7": { + "w": 6.0, + "l": 0.9, + "nf": 12 + }, + "M8": { + "w": 6.0, + "l": 0.9, + "nf": 12 + }, + "M9": { + "w": 6.0, + "l": 0.9, + "nf": 12 + }, + "M10": { + "w": 6.0, + "l": 0.9, + "nf": 12 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M5", + "current": 2e-05, + "kind": "cascode3" + }, + "VB2": { + "replica": "M7", + "current": 2e-05, + "kind": "cascode3" + }, + "VB3": { + "replica": "M9", + "current": 2e-05 + }, + "VB4": { + "replica": "M3", + "current": 4e-05 + }, + "IB1": { + "i": 4e-05, + "from": "VDD" + } + }, + "load": { + "vcm": 0.9, + "CL": 5e-13, + "cmfb_gain": 20.0, + "vocm": 0.9 + }, + "category": "ota_fd", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.9, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.9, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.9, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.9, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.9, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.9, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.9, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.9, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M9": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.9, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M10": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.9, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "e77df1bf272837ab", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M5", + "current_A": 2e-05, + "variant": "cascode3" + }, + { + "kind": "replica_bias", + "port": "VB2", + "replica_of": "M7", + "current_A": 2e-05, + "variant": "cascode3" + }, + { + "kind": "replica_bias", + "port": "VB3", + "replica_of": "M9", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "replica_bias", + "port": "VB4", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VDD" + }, + { + "kind": "testbench_element", + "what": "ideal common-mode feedback on VB4" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8", + "M9", + "M10" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1.5_sL1.5/manifest.json new file mode 100644 index 00000000..d5268f54 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "85fcc7aa1a40b027bb2d12354d8d59cc085519372afcb993325cf10ec13effac", + "qualification.json": "47812c91925f82b8a1b1236477718cb886bbc2f37619e1943e36da2e0195bc7c", + "specs.json": "38b620c102e48f3324678339429b0b2a49a9997e61f371370e80573996902416", + "target.spice": "b8c289e871da82ee0cff5354b20b8a39733e655a0630665ff4f963cde62492d1", + "target_lvs.spice": "330b2fb0fdb5151aa29e751b84438a90044338383b35247ab05f9f1b27ad31d6", + "testbench.spice": "5416819f5c3b908c0c6a4890b11a968e586757e2f29d2530fbecc1a97af3c497" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1.5_sL1.5/qualification.json new file mode 100644 index 00000000..ae39c3d1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1.5_sL1.5/qualification.json @@ -0,0 +1,180 @@ +{ + "case_id": "C10_sky130_sW1.5_sL1.5", + "circuit_id": "C10", + "pdk": "sky130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "ota_fd", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.9, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.9, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.9, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.9, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.9, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.9, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.9, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.9, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M9": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.9, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M10": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.9, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "e77df1bf272837ab", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 37.34 + }, + "ugf": { + "min": 19790000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 40.34035, + "ugf": 32978840.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 11.3, + "schematic_measures": { + "vo1": 0.9043928, + "vo2": 0.9043928, + "idd": 0.000108377, + "vos_in": 1.818989e-12, + "gain_lf": 40.34035, + "ugf": 32978840.0, + "f3db": 315879.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1.5_sL1.5/specs.json new file mode 100644 index 00000000..4274f6de --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1.5_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 37.34 + }, + "ugf": { + "min": 19790000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 40.34035, + "ugf": 32978840.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1.5_sL1.5/target.spice new file mode 100644 index 00000000..ab4a5567 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1.5_sL1.5/target.spice @@ -0,0 +1,12 @@ +.subckt C10_sky130_sW1.5_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 +XM1 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=6 l=0.9 nf=12 +XM2 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=6 l=0.9 nf=12 +XM3 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=6 l=0.9 nf=12 +XM4 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=6 l=0.9 nf=12 +XM5 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=6 l=0.9 nf=12 +XM6 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=6 l=0.9 nf=12 +XM7 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=6 l=0.9 nf=12 +XM8 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=6 l=0.9 nf=12 +XM9 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=6 l=0.9 nf=12 +XM10 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=6 l=0.9 nf=12 +.ends C10_sky130_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..195aa6fb --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1.5_sL1.5/target_lvs.spice @@ -0,0 +1,122 @@ +.subckt C10_sky130_sW1.5_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 +XM1_f0 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM1_f1 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM1_f2 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM1_f3 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM1_f4 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM1_f5 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM1_f6 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM1_f7 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM1_f8 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM1_f9 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM1_f10 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM1_f11 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM2_f0 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM2_f1 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM2_f2 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM2_f3 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM2_f4 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM2_f5 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM2_f6 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM2_f7 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM2_f8 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM2_f9 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM2_f10 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM2_f11 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM3_f0 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM3_f1 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM3_f2 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM3_f3 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM3_f4 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM3_f5 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM3_f6 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM3_f7 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM3_f8 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM3_f9 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM3_f10 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM3_f11 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM4_f0 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM4_f1 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM4_f2 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM4_f3 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM4_f4 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM4_f5 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM4_f6 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM4_f7 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM4_f8 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM4_f9 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM4_f10 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM4_f11 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM5_f0 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM5_f1 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM5_f2 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM5_f3 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM5_f4 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM5_f5 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM5_f6 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM5_f7 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM5_f8 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM5_f9 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM5_f10 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM5_f11 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM6_f0 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM6_f1 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM6_f2 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM6_f3 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM6_f4 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM6_f5 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM6_f6 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM6_f7 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM6_f8 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM6_f9 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM6_f10 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM6_f11 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM7_f0 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM7_f1 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM7_f2 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM7_f3 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM7_f4 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM7_f5 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM7_f6 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM7_f7 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM7_f8 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM7_f9 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM7_f10 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM7_f11 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM8_f0 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM8_f1 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM8_f2 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM8_f3 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM8_f4 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM8_f5 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM8_f6 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM8_f7 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM8_f8 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM8_f9 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM8_f10 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM8_f11 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM9_f0 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM9_f1 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM9_f2 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM9_f3 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM9_f4 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM9_f5 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM9_f6 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM9_f7 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM9_f8 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM9_f9 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM9_f10 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM9_f11 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM10_f0 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM10_f1 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM10_f2 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM10_f3 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM10_f4 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM10_f5 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM10_f6 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM10_f7 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM10_f8 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM10_f9 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM10_f10 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM10_f11 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +.ends C10_sky130_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1.5_sL1.5/testbench.spice new file mode 100644 index 00000000..671756b5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1.5_sL1.5/testbench.spice @@ -0,0 +1,48 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 C10_sky130_sW1.5_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIB1 VDD IB1 4e-05 +.nodeset v(IB1)=0.54 +XB_VB1 VB1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=6 l=0.9 +IB_VB1 VDDB VB1 0.00018 +XB_VB2 VB2 VB2 VDDB VDDB sky130_fd_pr__pfet_01v8 w=6 l=0.9 +IB_VB2 VB2 VSS 0.00018 +XB_VB3 VB3 VB3 VDDB VDDB sky130_fd_pr__pfet_01v8 w=6 l=0.9 +IB_VB3 VB3 VSS 2e-05 +XB_VB4n VB4n VB4n VSS VSS sky130_fd_pr__nfet_01v8 w=6 l=0.9 +IB_VB4n VDDB VB4n 4e-05 +VCM VCM 0 0.9 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 5e-13 +CL2 VOUT2 0 5e-13 +BCMFB VB4 0 V = v(VB4n) + 20*((v(VOUT1)+v(VOUT2))/2 - 0.9) +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +meas ac ugf when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1.5_sL1/case.json new file mode 100644 index 00000000..be47d29f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1.5_sL1/case.json @@ -0,0 +1,303 @@ +{ + "case_id": "C10_sky130_sW1.5_sL1", + "circuit_id": "C10", + "pdk": "sky130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "dut_name": "C10_sky130_sW1.5_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1", + "VB2", + "VB3", + "VB4", + "IB1" + ], + "sizing": { + "M1": { + "w": 6.0, + "l": 0.6, + "nf": 12 + }, + "M2": { + "w": 6.0, + "l": 0.6, + "nf": 12 + }, + "M3": { + "w": 6.0, + "l": 0.6, + "nf": 12 + }, + "M4": { + "w": 6.0, + "l": 0.6, + "nf": 12 + }, + "M5": { + "w": 6.0, + "l": 0.6, + "nf": 12 + }, + "M6": { + "w": 6.0, + "l": 0.6, + "nf": 12 + }, + "M7": { + "w": 6.0, + "l": 0.6, + "nf": 12 + }, + "M8": { + "w": 6.0, + "l": 0.6, + "nf": 12 + }, + "M9": { + "w": 6.0, + "l": 0.6, + "nf": 12 + }, + "M10": { + "w": 6.0, + "l": 0.6, + "nf": 12 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M5", + "current": 2e-05, + "kind": "cascode3" + }, + "VB2": { + "replica": "M7", + "current": 2e-05, + "kind": "cascode3" + }, + "VB3": { + "replica": "M9", + "current": 2e-05 + }, + "VB4": { + "replica": "M3", + "current": 4e-05 + }, + "IB1": { + "i": 4e-05, + "from": "VDD" + } + }, + "load": { + "vcm": 0.9, + "CL": 5e-13, + "cmfb_gain": 20.0, + "vocm": 0.9 + }, + "category": "ota_fd", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.6, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.6, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.6, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.6, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.6, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.6, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.6, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.6, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M9": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.6, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M10": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.6, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "5a570e4dc6968024", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M5", + "current_A": 2e-05, + "variant": "cascode3" + }, + { + "kind": "replica_bias", + "port": "VB2", + "replica_of": "M7", + "current_A": 2e-05, + "variant": "cascode3" + }, + { + "kind": "replica_bias", + "port": "VB3", + "replica_of": "M9", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "replica_bias", + "port": "VB4", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VDD" + }, + { + "kind": "testbench_element", + "what": "ideal common-mode feedback on VB4" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8", + "M9", + "M10" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1.5_sL1/manifest.json new file mode 100644 index 00000000..ec33bc2e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "e3bc3ecdf4a1fbc95bbc22944de72dc4e1e95fce2a6555139395018794cf09ee", + "qualification.json": "ac78897b53bc5925718cffad873227ce00bfa2de1277465b514a3e317330f36f", + "specs.json": "8e3d39047701d1bc9e8a37201eb23be3401cb4690c7567ac885c4af5743b04fb", + "target.spice": "4487198e27a36a6b073e6dc283ba4fe92b9f0bd7219594e5f8d6035e070e00a0", + "target_lvs.spice": "1865c85b5d61a05a93a340f4d246c48c633bb81ccc0eb26b512d78c3da904b62", + "testbench.spice": "6265f19b2f37b918e00c651f35fb9116128ee0cfa24a8794c5b4b02eeb4bc4ed" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1.5_sL1/qualification.json new file mode 100644 index 00000000..a264238e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1.5_sL1/qualification.json @@ -0,0 +1,180 @@ +{ + "case_id": "C10_sky130_sW1.5_sL1", + "circuit_id": "C10", + "pdk": "sky130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "ota_fd", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.6, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.6, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.6, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.6, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.6, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.6, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.6, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.6, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M9": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.6, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M10": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.6, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "5a570e4dc6968024", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 38.24 + }, + "ugf": { + "min": 22370000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 41.24251, + "ugf": 37287640.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 11.6, + "schematic_measures": { + "vo1": 0.9041499, + "vo2": 0.9041499, + "idd": 0.0001118322, + "vos_in": 0.0, + "gain_lf": 41.24251, + "ugf": 37287640.0, + "f3db": 321902.3 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1.5_sL1/specs.json new file mode 100644 index 00000000..8a093e51 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1.5_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 38.24 + }, + "ugf": { + "min": 22370000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 41.24251, + "ugf": 37287640.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1.5_sL1/target.spice new file mode 100644 index 00000000..19c1f41b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1.5_sL1/target.spice @@ -0,0 +1,12 @@ +.subckt C10_sky130_sW1.5_sL1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 +XM1 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=6 l=0.6 nf=12 +XM2 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=6 l=0.6 nf=12 +XM3 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=6 l=0.6 nf=12 +XM4 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=6 l=0.6 nf=12 +XM5 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=6 l=0.6 nf=12 +XM6 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=6 l=0.6 nf=12 +XM7 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=6 l=0.6 nf=12 +XM8 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=6 l=0.6 nf=12 +XM9 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=6 l=0.6 nf=12 +XM10 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=6 l=0.6 nf=12 +.ends C10_sky130_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1.5_sL1/target_lvs.spice new file mode 100644 index 00000000..b6c1d8ad --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1.5_sL1/target_lvs.spice @@ -0,0 +1,122 @@ +.subckt C10_sky130_sW1.5_sL1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 +XM1_f0 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f1 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f2 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f3 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f4 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f5 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f6 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f7 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f8 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f9 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f10 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f11 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f0 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f1 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f2 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f3 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f4 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f5 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f6 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f7 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f8 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f9 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f10 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f11 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM3_f0 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f1 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f2 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f3 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f4 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f5 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f6 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f7 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f8 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f9 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f10 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f11 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f0 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f1 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f2 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f3 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f4 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f5 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f6 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f7 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f8 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f9 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f10 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f11 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f0 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f1 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f2 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f3 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f4 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f5 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f6 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f7 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f8 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f9 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f10 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f11 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM6_f0 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM6_f1 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM6_f2 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM6_f3 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM6_f4 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM6_f5 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM6_f6 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM6_f7 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM6_f8 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM6_f9 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM6_f10 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM6_f11 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM7_f0 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f1 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f2 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f3 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f4 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f5 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f6 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f7 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f8 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f9 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f10 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f11 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f0 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f1 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f2 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f3 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f4 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f5 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f6 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f7 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f8 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f9 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f10 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f11 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM9_f0 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM9_f1 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM9_f2 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM9_f3 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM9_f4 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM9_f5 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM9_f6 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM9_f7 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM9_f8 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM9_f9 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM9_f10 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM9_f11 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM10_f0 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM10_f1 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM10_f2 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM10_f3 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM10_f4 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM10_f5 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM10_f6 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM10_f7 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM10_f8 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM10_f9 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM10_f10 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM10_f11 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +.ends C10_sky130_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1.5_sL1/testbench.spice new file mode 100644 index 00000000..af7db11d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1.5_sL1/testbench.spice @@ -0,0 +1,48 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 C10_sky130_sW1.5_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIB1 VDD IB1 4e-05 +.nodeset v(IB1)=0.54 +XB_VB1 VB1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=6 l=0.6 +IB_VB1 VDDB VB1 0.00018 +XB_VB2 VB2 VB2 VDDB VDDB sky130_fd_pr__pfet_01v8 w=6 l=0.6 +IB_VB2 VB2 VSS 0.00018 +XB_VB3 VB3 VB3 VDDB VDDB sky130_fd_pr__pfet_01v8 w=6 l=0.6 +IB_VB3 VB3 VSS 2e-05 +XB_VB4n VB4n VB4n VSS VSS sky130_fd_pr__nfet_01v8 w=6 l=0.6 +IB_VB4n VDDB VB4n 4e-05 +VCM VCM 0 0.9 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 5e-13 +CL2 VOUT2 0 5e-13 +BCMFB VB4 0 V = v(VB4n) + 20*((v(VOUT1)+v(VOUT2))/2 - 0.9) +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +meas ac ugf when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1.5_sL2/case.json new file mode 100644 index 00000000..0092d6ef --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1.5_sL2/case.json @@ -0,0 +1,303 @@ +{ + "case_id": "C10_sky130_sW1.5_sL2", + "circuit_id": "C10", + "pdk": "sky130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "dut_name": "C10_sky130_sW1.5_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1", + "VB2", + "VB3", + "VB4", + "IB1" + ], + "sizing": { + "M1": { + "w": 6.0, + "l": 1.2, + "nf": 12 + }, + "M2": { + "w": 6.0, + "l": 1.2, + "nf": 12 + }, + "M3": { + "w": 6.0, + "l": 1.2, + "nf": 12 + }, + "M4": { + "w": 6.0, + "l": 1.2, + "nf": 12 + }, + "M5": { + "w": 6.0, + "l": 1.2, + "nf": 12 + }, + "M6": { + "w": 6.0, + "l": 1.2, + "nf": 12 + }, + "M7": { + "w": 6.0, + "l": 1.2, + "nf": 12 + }, + "M8": { + "w": 6.0, + "l": 1.2, + "nf": 12 + }, + "M9": { + "w": 6.0, + "l": 1.2, + "nf": 12 + }, + "M10": { + "w": 6.0, + "l": 1.2, + "nf": 12 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M5", + "current": 2e-05, + "kind": "cascode3" + }, + "VB2": { + "replica": "M7", + "current": 2e-05, + "kind": "cascode3" + }, + "VB3": { + "replica": "M9", + "current": 2e-05 + }, + "VB4": { + "replica": "M3", + "current": 4e-05 + }, + "IB1": { + "i": 4e-05, + "from": "VDD" + } + }, + "load": { + "vcm": 0.9, + "CL": 5e-13, + "cmfb_gain": 20.0, + "vocm": 0.9 + }, + "category": "ota_fd", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.2, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.2, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.2, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.2, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.2, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.2, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.2, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.2, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M9": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.2, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M10": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.2, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "3c07779a6f1822cc", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M5", + "current_A": 2e-05, + "variant": "cascode3" + }, + { + "kind": "replica_bias", + "port": "VB2", + "replica_of": "M7", + "current_A": 2e-05, + "variant": "cascode3" + }, + { + "kind": "replica_bias", + "port": "VB3", + "replica_of": "M9", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "replica_bias", + "port": "VB4", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VDD" + }, + { + "kind": "testbench_element", + "what": "ideal common-mode feedback on VB4" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8", + "M9", + "M10" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1.5_sL2/manifest.json new file mode 100644 index 00000000..b1873757 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "35ba95b759c4c3758b35adaa71e3500ac1b9231a8ed88db8e563255d081da170", + "qualification.json": "792224f0a2e9ae5c7d6a94dfb1c923f4c2492aad3d5ad12321efc985f0c3a906", + "specs.json": "162b878192867ccc75cb37a65a25c2891f0c95e9b269a4d7143b6bcde99b8c5b", + "target.spice": "a1af3bc82ac629b9df6223efea83f42342ba0e35e40a52e933bca6a42274f023", + "target_lvs.spice": "810c212a35edac45301cc88728d503ccfaaf85803a29562a9957b3331e4428a0", + "testbench.spice": "bfb12f6c4e90a41ea7d50497b5ea449530ce65ba97ddb5c6f1d740d655de0ff2" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1.5_sL2/qualification.json new file mode 100644 index 00000000..665249dc --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1.5_sL2/qualification.json @@ -0,0 +1,180 @@ +{ + "case_id": "C10_sky130_sW1.5_sL2", + "circuit_id": "C10", + "pdk": "sky130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "ota_fd", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.2, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.2, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.2, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.2, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.2, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.2, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.2, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.2, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M9": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.2, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M10": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.2, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "3c07779a6f1822cc", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 16980000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 37.05462, + "ugf": 28302730.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 10.2, + "schematic_measures": { + "vo1": 0.9046205, + "vo2": 0.9046205, + "idd": 0.0001059207, + "vos_in": -3.63798e-12, + "gain_lf": 37.05462, + "ugf": 28302730.0, + "f3db": 396235.1 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1.5_sL2/specs.json new file mode 100644 index 00000000..9b6058e6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1.5_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 16980000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 37.05462, + "ugf": 28302730.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1.5_sL2/target.spice new file mode 100644 index 00000000..df16d057 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1.5_sL2/target.spice @@ -0,0 +1,12 @@ +.subckt C10_sky130_sW1.5_sL2 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 +XM1 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=6 l=1.2 nf=12 +XM2 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=6 l=1.2 nf=12 +XM3 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=6 l=1.2 nf=12 +XM4 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=6 l=1.2 nf=12 +XM5 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=6 l=1.2 nf=12 +XM6 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=6 l=1.2 nf=12 +XM7 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=6 l=1.2 nf=12 +XM8 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=6 l=1.2 nf=12 +XM9 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=6 l=1.2 nf=12 +XM10 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=6 l=1.2 nf=12 +.ends C10_sky130_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1.5_sL2/target_lvs.spice new file mode 100644 index 00000000..06bdf5ac --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1.5_sL2/target_lvs.spice @@ -0,0 +1,122 @@ +.subckt C10_sky130_sW1.5_sL2 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 +XM1_f0 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM1_f1 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM1_f2 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM1_f3 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM1_f4 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM1_f5 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM1_f6 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM1_f7 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM1_f8 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM1_f9 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM1_f10 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM1_f11 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM2_f0 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM2_f1 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM2_f2 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM2_f3 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM2_f4 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM2_f5 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM2_f6 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM2_f7 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM2_f8 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM2_f9 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM2_f10 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM2_f11 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM3_f0 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM3_f1 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM3_f2 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM3_f3 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM3_f4 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM3_f5 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM3_f6 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM3_f7 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM3_f8 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM3_f9 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM3_f10 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM3_f11 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM4_f0 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM4_f1 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM4_f2 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM4_f3 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM4_f4 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM4_f5 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM4_f6 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM4_f7 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM4_f8 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM4_f9 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM4_f10 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM4_f11 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM5_f0 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM5_f1 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM5_f2 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM5_f3 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM5_f4 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM5_f5 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM5_f6 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM5_f7 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM5_f8 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM5_f9 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM5_f10 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM5_f11 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM6_f0 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM6_f1 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM6_f2 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM6_f3 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM6_f4 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM6_f5 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM6_f6 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM6_f7 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM6_f8 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM6_f9 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM6_f10 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM6_f11 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM7_f0 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM7_f1 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM7_f2 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM7_f3 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM7_f4 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM7_f5 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM7_f6 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM7_f7 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM7_f8 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM7_f9 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM7_f10 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM7_f11 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM8_f0 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM8_f1 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM8_f2 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM8_f3 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM8_f4 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM8_f5 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM8_f6 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM8_f7 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM8_f8 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM8_f9 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM8_f10 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM8_f11 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM9_f0 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM9_f1 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM9_f2 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM9_f3 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM9_f4 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM9_f5 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM9_f6 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM9_f7 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM9_f8 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM9_f9 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM9_f10 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM9_f11 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM10_f0 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM10_f1 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM10_f2 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM10_f3 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM10_f4 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM10_f5 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM10_f6 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM10_f7 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM10_f8 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM10_f9 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM10_f10 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM10_f11 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +.ends C10_sky130_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1.5_sL2/testbench.spice new file mode 100644 index 00000000..77c6b180 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1.5_sL2/testbench.spice @@ -0,0 +1,48 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 C10_sky130_sW1.5_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIB1 VDD IB1 4e-05 +.nodeset v(IB1)=0.54 +XB_VB1 VB1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=6 l=1.2 +IB_VB1 VDDB VB1 0.00018 +XB_VB2 VB2 VB2 VDDB VDDB sky130_fd_pr__pfet_01v8 w=6 l=1.2 +IB_VB2 VB2 VSS 0.00018 +XB_VB3 VB3 VB3 VDDB VDDB sky130_fd_pr__pfet_01v8 w=6 l=1.2 +IB_VB3 VB3 VSS 2e-05 +XB_VB4n VB4n VB4n VSS VSS sky130_fd_pr__nfet_01v8 w=6 l=1.2 +IB_VB4n VDDB VB4n 4e-05 +VCM VCM 0 0.9 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 5e-13 +CL2 VOUT2 0 5e-13 +BCMFB VB4 0 V = v(VB4n) + 20*((v(VOUT1)+v(VOUT2))/2 - 0.9) +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +meas ac ugf when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1_sL1.5/case.json new file mode 100644 index 00000000..f18c3e73 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1_sL1.5/case.json @@ -0,0 +1,303 @@ +{ + "case_id": "C10_sky130_sW1_sL1.5", + "circuit_id": "C10", + "pdk": "sky130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "dut_name": "C10_sky130_sW1_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1", + "VB2", + "VB3", + "VB4", + "IB1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.9, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 0.9, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 0.9, + "nf": 8 + }, + "M4": { + "w": 4.0, + "l": 0.9, + "nf": 8 + }, + "M5": { + "w": 4.0, + "l": 0.9, + "nf": 8 + }, + "M6": { + "w": 4.0, + "l": 0.9, + "nf": 8 + }, + "M7": { + "w": 4.0, + "l": 0.9, + "nf": 8 + }, + "M8": { + "w": 4.0, + "l": 0.9, + "nf": 8 + }, + "M9": { + "w": 4.0, + "l": 0.9, + "nf": 8 + }, + "M10": { + "w": 4.0, + "l": 0.9, + "nf": 8 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M5", + "current": 2e-05, + "kind": "cascode3" + }, + "VB2": { + "replica": "M7", + "current": 2e-05, + "kind": "cascode3" + }, + "VB3": { + "replica": "M9", + "current": 2e-05 + }, + "VB4": { + "replica": "M3", + "current": 4e-05 + }, + "IB1": { + "i": 4e-05, + "from": "VDD" + } + }, + "load": { + "vcm": 0.9, + "CL": 5e-13, + "cmfb_gain": 20.0, + "vocm": 0.9 + }, + "category": "ota_fd", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.9, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.9, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.9, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.9, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.9, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.9, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.9, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.9, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M9": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.9, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M10": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.9, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "016bed964adb8f5a", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M5", + "current_A": 2e-05, + "variant": "cascode3" + }, + { + "kind": "replica_bias", + "port": "VB2", + "replica_of": "M7", + "current_A": 2e-05, + "variant": "cascode3" + }, + { + "kind": "replica_bias", + "port": "VB3", + "replica_of": "M9", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "replica_bias", + "port": "VB4", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VDD" + }, + { + "kind": "testbench_element", + "what": "ideal common-mode feedback on VB4" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8", + "M9", + "M10" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1_sL1.5/manifest.json new file mode 100644 index 00000000..9e8d0e1a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "93987e2c5ee7b374bc6ff959fda9b2002b6858150fd6e170ff4d4eb2b94ec91f", + "qualification.json": "6f32c97e670404c74467f8839e1bad8fe4d4febbf8710a0a38404e5cd3f73376", + "specs.json": "a66e8770b3b57afc96d4fc5c0734e036fcfdf97317bd523bc8d09aa180c192c4", + "target.spice": "75629d115571fa0802700331a9ea40be02cbd84ad1cb0a029e33c1cf1dbacfbf", + "target_lvs.spice": "09cb90f55948bf097aa8fd930e3b9373b61d6834af836046c35589aef6f56632", + "testbench.spice": "1044c77e3d9a266f65807abe957701e0480ba337b31c5ac8e3e0e4a71cf856e5" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1_sL1.5/qualification.json new file mode 100644 index 00000000..ef149c68 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1_sL1.5/qualification.json @@ -0,0 +1,180 @@ +{ + "case_id": "C10_sky130_sW1_sL1.5", + "circuit_id": "C10", + "pdk": "sky130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "ota_fd", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.9, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.9, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.9, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.9, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.9, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.9, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.9, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.9, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M9": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.9, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M10": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.9, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "016bed964adb8f5a", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 17280000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 35.65616, + "ugf": 28796160.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 9.7, + "schematic_measures": { + "vo1": 0.9039441, + "vo2": 0.9039441, + "idd": 0.0001006574, + "vos_in": -1.81899e-12, + "gain_lf": 35.65616, + "ugf": 28796160.0, + "f3db": 473269.6 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1_sL1.5/specs.json new file mode 100644 index 00000000..4c41ee99 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 17280000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 35.65616, + "ugf": 28796160.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1_sL1.5/target.spice new file mode 100644 index 00000000..2e45d4c4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1_sL1.5/target.spice @@ -0,0 +1,12 @@ +.subckt C10_sky130_sW1_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 +XM1 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=4 l=0.9 nf=8 +XM2 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=4 l=0.9 nf=8 +XM3 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=4 l=0.9 nf=8 +XM4 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=4 l=0.9 nf=8 +XM5 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=4 l=0.9 nf=8 +XM6 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=4 l=0.9 nf=8 +XM7 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=4 l=0.9 nf=8 +XM8 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=4 l=0.9 nf=8 +XM9 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=4 l=0.9 nf=8 +XM10 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=4 l=0.9 nf=8 +.ends C10_sky130_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1_sL1.5/target_lvs.spice new file mode 100644 index 00000000..b2476343 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1_sL1.5/target_lvs.spice @@ -0,0 +1,82 @@ +.subckt C10_sky130_sW1_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 +XM1_f0 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM1_f1 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM1_f2 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM1_f3 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM1_f4 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM1_f5 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM1_f6 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM1_f7 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM2_f0 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM2_f1 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM2_f2 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM2_f3 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM2_f4 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM2_f5 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM2_f6 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM2_f7 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM3_f0 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM3_f1 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM3_f2 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM3_f3 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM3_f4 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM3_f5 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM3_f6 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM3_f7 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM4_f0 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM4_f1 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM4_f2 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM4_f3 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM4_f4 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM4_f5 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM4_f6 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM4_f7 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM5_f0 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM5_f1 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM5_f2 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM5_f3 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM5_f4 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM5_f5 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM5_f6 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM5_f7 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM6_f0 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM6_f1 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM6_f2 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM6_f3 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM6_f4 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM6_f5 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM6_f6 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM6_f7 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM7_f0 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM7_f1 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM7_f2 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM7_f3 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM7_f4 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM7_f5 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM7_f6 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM7_f7 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM8_f0 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM8_f1 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM8_f2 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM8_f3 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM8_f4 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM8_f5 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM8_f6 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM8_f7 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM9_f0 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM9_f1 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM9_f2 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM9_f3 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM9_f4 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM9_f5 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM9_f6 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM9_f7 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM10_f0 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM10_f1 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM10_f2 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM10_f3 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM10_f4 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM10_f5 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM10_f6 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM10_f7 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +.ends C10_sky130_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1_sL1.5/testbench.spice new file mode 100644 index 00000000..5b0d446f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1_sL1.5/testbench.spice @@ -0,0 +1,48 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 C10_sky130_sW1_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIB1 VDD IB1 4e-05 +.nodeset v(IB1)=0.54 +XB_VB1 VB1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=4 l=0.9 +IB_VB1 VDDB VB1 0.00018 +XB_VB2 VB2 VB2 VDDB VDDB sky130_fd_pr__pfet_01v8 w=4 l=0.9 +IB_VB2 VB2 VSS 0.00018 +XB_VB3 VB3 VB3 VDDB VDDB sky130_fd_pr__pfet_01v8 w=4 l=0.9 +IB_VB3 VB3 VSS 2e-05 +XB_VB4n VB4n VB4n VSS VSS sky130_fd_pr__nfet_01v8 w=4 l=0.9 +IB_VB4n VDDB VB4n 4e-05 +VCM VCM 0 0.9 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 5e-13 +CL2 VOUT2 0 5e-13 +BCMFB VB4 0 V = v(VB4n) + 20*((v(VOUT1)+v(VOUT2))/2 - 0.9) +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +meas ac ugf when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1_sL1/case.json new file mode 100644 index 00000000..e539f6d4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1_sL1/case.json @@ -0,0 +1,303 @@ +{ + "case_id": "C10_sky130_sW1_sL1", + "circuit_id": "C10", + "pdk": "sky130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "dut_name": "C10_sky130_sW1_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1", + "VB2", + "VB3", + "VB4", + "IB1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.6, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 0.6, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 0.6, + "nf": 8 + }, + "M4": { + "w": 4.0, + "l": 0.6, + "nf": 8 + }, + "M5": { + "w": 4.0, + "l": 0.6, + "nf": 8 + }, + "M6": { + "w": 4.0, + "l": 0.6, + "nf": 8 + }, + "M7": { + "w": 4.0, + "l": 0.6, + "nf": 8 + }, + "M8": { + "w": 4.0, + "l": 0.6, + "nf": 8 + }, + "M9": { + "w": 4.0, + "l": 0.6, + "nf": 8 + }, + "M10": { + "w": 4.0, + "l": 0.6, + "nf": 8 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M5", + "current": 2e-05, + "kind": "cascode3" + }, + "VB2": { + "replica": "M7", + "current": 2e-05, + "kind": "cascode3" + }, + "VB3": { + "replica": "M9", + "current": 2e-05 + }, + "VB4": { + "replica": "M3", + "current": 4e-05 + }, + "IB1": { + "i": 4e-05, + "from": "VDD" + } + }, + "load": { + "vcm": 0.9, + "CL": 5e-13, + "cmfb_gain": 20.0, + "vocm": 0.9 + }, + "category": "ota_fd", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M9": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M10": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "a64df7aeeefcce85", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M5", + "current_A": 2e-05, + "variant": "cascode3" + }, + { + "kind": "replica_bias", + "port": "VB2", + "replica_of": "M7", + "current_A": 2e-05, + "variant": "cascode3" + }, + { + "kind": "replica_bias", + "port": "VB3", + "replica_of": "M9", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "replica_bias", + "port": "VB4", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VDD" + }, + { + "kind": "testbench_element", + "what": "ideal common-mode feedback on VB4" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8", + "M9", + "M10" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1_sL1/manifest.json new file mode 100644 index 00000000..f6d837f1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "c98aca59fab807f9300238faa1131db6ef630bdb2b648095e9ddc8f277604219", + "qualification.json": "93c56b379608765a86b6c23ae8d9b73059e775c2d730b97bce6635e1d44e5005", + "specs.json": "11f81092ff1e3b344abe1b015e50a2ee35d62eb72b5af3217e06f5a52ddf3d80", + "target.spice": "5cd31e3a4c609ee6e591d81e57afe693482b4fc16b1eec47780e0e048e7814fb", + "target_lvs.spice": "e4ec8ec8644a4c6e49e21f3f17307c71c7e898ac6af44fb7575dc77e5c2714a0", + "testbench.spice": "79f7bb031d0fc220f5dad96d325ff8dad682a53be252aa860aefcab893e768fb" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1_sL1/qualification.json new file mode 100644 index 00000000..c6060024 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1_sL1/qualification.json @@ -0,0 +1,180 @@ +{ + "case_id": "C10_sky130_sW1_sL1", + "circuit_id": "C10", + "pdk": "sky130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "ota_fd", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M9": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M10": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "a64df7aeeefcce85", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 38.92 + }, + "ugf": { + "min": 20810000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 41.92104, + "ugf": 34675090.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 8.5, + "schematic_measures": { + "vo1": 0.903568, + "vo2": 0.903568, + "idd": 0.0001034238, + "vos_in": 3.637979e-12, + "gain_lf": 41.92104, + "ugf": 34675090.0, + "f3db": 276994.2 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1_sL1/specs.json new file mode 100644 index 00000000..827b59c9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 38.92 + }, + "ugf": { + "min": 20810000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 41.92104, + "ugf": 34675090.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1_sL1/target.spice new file mode 100644 index 00000000..cf69d297 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1_sL1/target.spice @@ -0,0 +1,12 @@ +.subckt C10_sky130_sW1_sL1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 +XM1 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=4 l=0.6 nf=8 +XM2 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=4 l=0.6 nf=8 +XM3 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=4 l=0.6 nf=8 +XM4 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=4 l=0.6 nf=8 +XM5 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=4 l=0.6 nf=8 +XM6 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=4 l=0.6 nf=8 +XM7 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=4 l=0.6 nf=8 +XM8 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=4 l=0.6 nf=8 +XM9 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=4 l=0.6 nf=8 +XM10 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=4 l=0.6 nf=8 +.ends C10_sky130_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1_sL1/target_lvs.spice new file mode 100644 index 00000000..fd29a382 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1_sL1/target_lvs.spice @@ -0,0 +1,82 @@ +.subckt C10_sky130_sW1_sL1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 +XM1_f0 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f1 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f2 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f3 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f4 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f5 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f6 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f7 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f0 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f1 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f2 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f3 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f4 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f5 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f6 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f7 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM3_f0 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f1 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f2 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f3 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f4 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f5 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f6 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f7 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f0 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f1 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f2 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f3 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f4 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f5 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f6 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f7 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f0 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f1 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f2 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f3 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f4 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f5 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f6 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f7 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM6_f0 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM6_f1 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM6_f2 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM6_f3 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM6_f4 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM6_f5 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM6_f6 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM6_f7 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM7_f0 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f1 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f2 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f3 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f4 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f5 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f6 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f7 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f0 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f1 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f2 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f3 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f4 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f5 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f6 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f7 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM9_f0 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM9_f1 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM9_f2 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM9_f3 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM9_f4 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM9_f5 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM9_f6 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM9_f7 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM10_f0 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM10_f1 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM10_f2 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM10_f3 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM10_f4 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM10_f5 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM10_f6 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM10_f7 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +.ends C10_sky130_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1_sL1/testbench.spice new file mode 100644 index 00000000..d7adfeba --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1_sL1/testbench.spice @@ -0,0 +1,48 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 C10_sky130_sW1_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIB1 VDD IB1 4e-05 +.nodeset v(IB1)=0.54 +XB_VB1 VB1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=4 l=0.6 +IB_VB1 VDDB VB1 0.00018 +XB_VB2 VB2 VB2 VDDB VDDB sky130_fd_pr__pfet_01v8 w=4 l=0.6 +IB_VB2 VB2 VSS 0.00018 +XB_VB3 VB3 VB3 VDDB VDDB sky130_fd_pr__pfet_01v8 w=4 l=0.6 +IB_VB3 VB3 VSS 2e-05 +XB_VB4n VB4n VB4n VSS VSS sky130_fd_pr__nfet_01v8 w=4 l=0.6 +IB_VB4n VDDB VB4n 4e-05 +VCM VCM 0 0.9 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 5e-13 +CL2 VOUT2 0 5e-13 +BCMFB VB4 0 V = v(VB4n) + 20*((v(VOUT1)+v(VOUT2))/2 - 0.9) +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +meas ac ugf when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1_sL2/case.json new file mode 100644 index 00000000..dbe3d9c3 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1_sL2/case.json @@ -0,0 +1,303 @@ +{ + "case_id": "C10_sky130_sW1_sL2", + "circuit_id": "C10", + "pdk": "sky130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "dut_name": "C10_sky130_sW1_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1", + "VB2", + "VB3", + "VB4", + "IB1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 1.2, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 1.2, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 1.2, + "nf": 8 + }, + "M4": { + "w": 4.0, + "l": 1.2, + "nf": 8 + }, + "M5": { + "w": 4.0, + "l": 1.2, + "nf": 8 + }, + "M6": { + "w": 4.0, + "l": 1.2, + "nf": 8 + }, + "M7": { + "w": 4.0, + "l": 1.2, + "nf": 8 + }, + "M8": { + "w": 4.0, + "l": 1.2, + "nf": 8 + }, + "M9": { + "w": 4.0, + "l": 1.2, + "nf": 8 + }, + "M10": { + "w": 4.0, + "l": 1.2, + "nf": 8 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M5", + "current": 2e-05, + "kind": "cascode3" + }, + "VB2": { + "replica": "M7", + "current": 2e-05, + "kind": "cascode3" + }, + "VB3": { + "replica": "M9", + "current": 2e-05 + }, + "VB4": { + "replica": "M3", + "current": 4e-05 + }, + "IB1": { + "i": 4e-05, + "from": "VDD" + } + }, + "load": { + "vcm": 0.9, + "CL": 5e-13, + "cmfb_gain": 20.0, + "vocm": 0.9 + }, + "category": "ota_fd", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.2, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.2, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.2, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.2, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.2, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.2, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.2, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.2, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M9": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.2, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M10": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.2, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "554daf197d6a22ee", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M5", + "current_A": 2e-05, + "variant": "cascode3" + }, + { + "kind": "replica_bias", + "port": "VB2", + "replica_of": "M7", + "current_A": 2e-05, + "variant": "cascode3" + }, + { + "kind": "replica_bias", + "port": "VB3", + "replica_of": "M9", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "replica_bias", + "port": "VB4", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VDD" + }, + { + "kind": "testbench_element", + "what": "ideal common-mode feedback on VB4" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8", + "M9", + "M10" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1_sL2/manifest.json new file mode 100644 index 00000000..57c738c3 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "c8a40648f5aa465976a3bb53ddff242678ac753cf8368af891e433441d4a5cff", + "qualification.json": "82ecfd8d05f1cce4199d9c7b7c284bfb76ecd460fba7f2898d6ec8ad680f61f5", + "specs.json": "22391bb2d456c697dd9760027f8ff70c6f258ce7374468c2ca337ed430019a20", + "target.spice": "3e63d0d7a9a8a4db98195d054e1971d7e25fb9cf1328ec48317dff9f91f84dc0", + "target_lvs.spice": "8a1c122b19c7e221a22ab39c11965e828d62eb4bd17058c57b6abf83e2a8ae43", + "testbench.spice": "f90a799224e8b9ddabe2d79a502390a453961ac5b0631496d23ecb5d122fbc78" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1_sL2/qualification.json new file mode 100644 index 00000000..009cd5e1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1_sL2/qualification.json @@ -0,0 +1,182 @@ +{ + "case_id": "C10_sky130_sW1_sL2", + "circuit_id": "C10", + "pdk": "sky130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "ota_fd", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.2, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.2, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.2, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.2, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.2, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.2, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.2, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.2, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M9": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.2, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M10": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.2, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "554daf197d6a22ee", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "gain_lf=33.8 below floor 35" + ], + "spec": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 14790000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 33.80061, + "ugf": 24651180.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 8.5, + "schematic_measures": { + "vo1": 0.9041324, + "vo2": 0.9041324, + "idd": 9.880095e-05, + "vos_in": 1.818989e-12, + "gain_lf": 33.80061, + "ugf": 24651180.0, + "f3db": 501697.7 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1_sL2/specs.json new file mode 100644 index 00000000..cccb16b7 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 14790000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 33.80061, + "ugf": 24651180.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1_sL2/target.spice new file mode 100644 index 00000000..93ba1f45 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1_sL2/target.spice @@ -0,0 +1,12 @@ +.subckt C10_sky130_sW1_sL2 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 +XM1 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=4 l=1.2 nf=8 +XM2 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=4 l=1.2 nf=8 +XM3 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=4 l=1.2 nf=8 +XM4 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=4 l=1.2 nf=8 +XM5 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=4 l=1.2 nf=8 +XM6 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=4 l=1.2 nf=8 +XM7 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=4 l=1.2 nf=8 +XM8 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=4 l=1.2 nf=8 +XM9 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=4 l=1.2 nf=8 +XM10 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=4 l=1.2 nf=8 +.ends C10_sky130_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1_sL2/target_lvs.spice new file mode 100644 index 00000000..74167dcd --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1_sL2/target_lvs.spice @@ -0,0 +1,82 @@ +.subckt C10_sky130_sW1_sL2 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 +XM1_f0 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM1_f1 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM1_f2 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM1_f3 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM1_f4 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM1_f5 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM1_f6 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM1_f7 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM2_f0 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM2_f1 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM2_f2 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM2_f3 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM2_f4 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM2_f5 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM2_f6 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM2_f7 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM3_f0 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM3_f1 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM3_f2 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM3_f3 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM3_f4 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM3_f5 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM3_f6 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM3_f7 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM4_f0 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM4_f1 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM4_f2 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM4_f3 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM4_f4 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM4_f5 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM4_f6 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM4_f7 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM5_f0 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM5_f1 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM5_f2 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM5_f3 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM5_f4 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM5_f5 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM5_f6 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM5_f7 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM6_f0 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM6_f1 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM6_f2 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM6_f3 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM6_f4 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM6_f5 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM6_f6 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM6_f7 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM7_f0 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM7_f1 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM7_f2 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM7_f3 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM7_f4 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM7_f5 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM7_f6 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM7_f7 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM8_f0 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM8_f1 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM8_f2 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM8_f3 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM8_f4 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM8_f5 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM8_f6 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM8_f7 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM9_f0 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM9_f1 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM9_f2 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM9_f3 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM9_f4 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM9_f5 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM9_f6 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM9_f7 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM10_f0 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM10_f1 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM10_f2 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM10_f3 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM10_f4 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM10_f5 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM10_f6 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM10_f7 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +.ends C10_sky130_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1_sL2/testbench.spice new file mode 100644 index 00000000..8f2f575b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW1_sL2/testbench.spice @@ -0,0 +1,48 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 C10_sky130_sW1_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIB1 VDD IB1 4e-05 +.nodeset v(IB1)=0.54 +XB_VB1 VB1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=4 l=1.2 +IB_VB1 VDDB VB1 0.00018 +XB_VB2 VB2 VB2 VDDB VDDB sky130_fd_pr__pfet_01v8 w=4 l=1.2 +IB_VB2 VB2 VSS 0.00018 +XB_VB3 VB3 VB3 VDDB VDDB sky130_fd_pr__pfet_01v8 w=4 l=1.2 +IB_VB3 VB3 VSS 2e-05 +XB_VB4n VB4n VB4n VSS VSS sky130_fd_pr__nfet_01v8 w=4 l=1.2 +IB_VB4n VDDB VB4n 4e-05 +VCM VCM 0 0.9 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 5e-13 +CL2 VOUT2 0 5e-13 +BCMFB VB4 0 V = v(VB4n) + 20*((v(VOUT1)+v(VOUT2))/2 - 0.9) +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +meas ac ugf when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C10/sky130/sW2_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW2_sL1.5/case.json new file mode 100644 index 00000000..7af1e9d1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW2_sL1.5/case.json @@ -0,0 +1,303 @@ +{ + "case_id": "C10_sky130_sW2_sL1.5", + "circuit_id": "C10", + "pdk": "sky130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "dut_name": "C10_sky130_sW2_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1", + "VB2", + "VB3", + "VB4", + "IB1" + ], + "sizing": { + "M1": { + "w": 8.0, + "l": 0.9, + "nf": 16 + }, + "M2": { + "w": 8.0, + "l": 0.9, + "nf": 16 + }, + "M3": { + "w": 8.0, + "l": 0.9, + "nf": 16 + }, + "M4": { + "w": 8.0, + "l": 0.9, + "nf": 16 + }, + "M5": { + "w": 8.0, + "l": 0.9, + "nf": 16 + }, + "M6": { + "w": 8.0, + "l": 0.9, + "nf": 16 + }, + "M7": { + "w": 8.0, + "l": 0.9, + "nf": 16 + }, + "M8": { + "w": 8.0, + "l": 0.9, + "nf": 16 + }, + "M9": { + "w": 8.0, + "l": 0.9, + "nf": 16 + }, + "M10": { + "w": 8.0, + "l": 0.9, + "nf": 16 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M5", + "current": 2e-05, + "kind": "cascode3" + }, + "VB2": { + "replica": "M7", + "current": 2e-05, + "kind": "cascode3" + }, + "VB3": { + "replica": "M9", + "current": 2e-05 + }, + "VB4": { + "replica": "M3", + "current": 4e-05 + }, + "IB1": { + "i": 4e-05, + "from": "VDD" + } + }, + "load": { + "vcm": 0.9, + "CL": 5e-13, + "cmfb_gain": 20.0, + "vocm": 0.9 + }, + "category": "ota_fd", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.9, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.9, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.9, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.9, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.9, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.9, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.9, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.9, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M9": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.9, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M10": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.9, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "db5926e088d11aed", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M5", + "current_A": 2e-05, + "variant": "cascode3" + }, + { + "kind": "replica_bias", + "port": "VB2", + "replica_of": "M7", + "current_A": 2e-05, + "variant": "cascode3" + }, + { + "kind": "replica_bias", + "port": "VB3", + "replica_of": "M9", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "replica_bias", + "port": "VB4", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VDD" + }, + { + "kind": "testbench_element", + "what": "ideal common-mode feedback on VB4" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8", + "M9", + "M10" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/sky130/sW2_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW2_sL1.5/manifest.json new file mode 100644 index 00000000..6df55539 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW2_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "32cbdfc1870082c29129249ada700d77e33e2f1e2f07b30ccd9ee24d4f07e2e1", + "qualification.json": "a8d1528d1b221bf06d0885d922728f47b8c76e4574cedef2e94b13a73d8c394f", + "specs.json": "f7ee2c3a581e6243246cd0f3f3c62996b8a8e9aac62ae8f64de184370a11db99", + "target.spice": "705f24be49763488e429d6e6853a3d59e35b2ff337d75b3592c37e85ce9731a0", + "target_lvs.spice": "d3c2f5dd913569703e6174b71761263fbb1471b4b5ee67d33d956b41dcf7e7c2", + "testbench.spice": "f0ccf693e3878c2896be61b0413bf80ee325de50ddc5a98c36b0fdd50600cbc4" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/sky130/sW2_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW2_sL1.5/qualification.json new file mode 100644 index 00000000..023f8bd5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW2_sL1.5/qualification.json @@ -0,0 +1,180 @@ +{ + "case_id": "C10_sky130_sW2_sL1.5", + "circuit_id": "C10", + "pdk": "sky130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "ota_fd", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.9, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.9, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.9, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.9, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.9, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.9, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.9, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.9, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M9": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.9, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M10": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.9, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "db5926e088d11aed", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 36.21 + }, + "ugf": { + "min": 20400000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 39.21398, + "ugf": 33994410.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 7.4, + "schematic_measures": { + "vo1": 0.9051101, + "vo2": 0.9051101, + "idd": 0.0001152521, + "vos_in": -3.63798e-12, + "gain_lf": 39.21398, + "ugf": 33994410.0, + "f3db": 370679.4 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/sky130/sW2_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW2_sL1.5/specs.json new file mode 100644 index 00000000..95847d04 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW2_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 36.21 + }, + "ugf": { + "min": 20400000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 39.21398, + "ugf": 33994410.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/sky130/sW2_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW2_sL1.5/target.spice new file mode 100644 index 00000000..8e1502d8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW2_sL1.5/target.spice @@ -0,0 +1,12 @@ +.subckt C10_sky130_sW2_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 +XM1 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=8 l=0.9 nf=16 +XM2 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=8 l=0.9 nf=16 +XM3 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=8 l=0.9 nf=16 +XM4 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=8 l=0.9 nf=16 +XM5 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=8 l=0.9 nf=16 +XM6 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=8 l=0.9 nf=16 +XM7 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=8 l=0.9 nf=16 +XM8 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=8 l=0.9 nf=16 +XM9 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=8 l=0.9 nf=16 +XM10 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=8 l=0.9 nf=16 +.ends C10_sky130_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C10/sky130/sW2_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW2_sL1.5/target_lvs.spice new file mode 100644 index 00000000..c7ae2c05 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW2_sL1.5/target_lvs.spice @@ -0,0 +1,162 @@ +.subckt C10_sky130_sW2_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 +XM1_f0 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM1_f1 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM1_f2 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM1_f3 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM1_f4 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM1_f5 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM1_f6 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM1_f7 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM1_f8 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM1_f9 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM1_f10 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM1_f11 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM1_f12 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM1_f13 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM1_f14 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM1_f15 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM2_f0 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM2_f1 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM2_f2 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM2_f3 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM2_f4 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM2_f5 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM2_f6 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM2_f7 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM2_f8 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM2_f9 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM2_f10 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM2_f11 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM2_f12 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM2_f13 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM2_f14 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM2_f15 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM3_f0 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM3_f1 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM3_f2 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM3_f3 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM3_f4 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM3_f5 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM3_f6 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM3_f7 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM3_f8 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM3_f9 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM3_f10 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM3_f11 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM3_f12 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM3_f13 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM3_f14 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM3_f15 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM4_f0 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM4_f1 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM4_f2 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM4_f3 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM4_f4 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM4_f5 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM4_f6 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM4_f7 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM4_f8 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM4_f9 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM4_f10 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM4_f11 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM4_f12 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM4_f13 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM4_f14 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM4_f15 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM5_f0 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM5_f1 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM5_f2 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM5_f3 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM5_f4 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM5_f5 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM5_f6 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM5_f7 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM5_f8 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM5_f9 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM5_f10 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM5_f11 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM5_f12 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM5_f13 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM5_f14 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM5_f15 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM6_f0 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM6_f1 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM6_f2 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM6_f3 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM6_f4 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM6_f5 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM6_f6 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM6_f7 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM6_f8 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM6_f9 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM6_f10 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM6_f11 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM6_f12 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM6_f13 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM6_f14 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM6_f15 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM7_f0 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM7_f1 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM7_f2 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM7_f3 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM7_f4 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM7_f5 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM7_f6 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM7_f7 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM7_f8 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM7_f9 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM7_f10 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM7_f11 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM7_f12 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM7_f13 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM7_f14 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM7_f15 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM8_f0 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM8_f1 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM8_f2 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM8_f3 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM8_f4 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM8_f5 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM8_f6 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM8_f7 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM8_f8 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM8_f9 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM8_f10 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM8_f11 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM8_f12 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM8_f13 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM8_f14 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM8_f15 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM9_f0 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM9_f1 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM9_f2 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM9_f3 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM9_f4 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM9_f5 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM9_f6 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM9_f7 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM9_f8 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM9_f9 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM9_f10 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM9_f11 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM9_f12 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM9_f13 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM9_f14 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM9_f15 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM10_f0 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM10_f1 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM10_f2 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM10_f3 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM10_f4 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM10_f5 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM10_f6 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM10_f7 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM10_f8 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM10_f9 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM10_f10 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM10_f11 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM10_f12 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM10_f13 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM10_f14 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +XM10_f15 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.9 +.ends C10_sky130_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C10/sky130/sW2_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW2_sL1.5/testbench.spice new file mode 100644 index 00000000..bc9ae448 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW2_sL1.5/testbench.spice @@ -0,0 +1,48 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 C10_sky130_sW2_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIB1 VDD IB1 4e-05 +.nodeset v(IB1)=0.54 +XB_VB1 VB1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=8 l=0.9 +IB_VB1 VDDB VB1 0.00018 +XB_VB2 VB2 VB2 VDDB VDDB sky130_fd_pr__pfet_01v8 w=8 l=0.9 +IB_VB2 VB2 VSS 0.00018 +XB_VB3 VB3 VB3 VDDB VDDB sky130_fd_pr__pfet_01v8 w=8 l=0.9 +IB_VB3 VB3 VSS 2e-05 +XB_VB4n VB4n VB4n VSS VSS sky130_fd_pr__nfet_01v8 w=8 l=0.9 +IB_VB4n VDDB VB4n 4e-05 +VCM VCM 0 0.9 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 5e-13 +CL2 VOUT2 0 5e-13 +BCMFB VB4 0 V = v(VB4n) + 20*((v(VOUT1)+v(VOUT2))/2 - 0.9) +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +meas ac ugf when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C10/sky130/sW2_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW2_sL1/case.json new file mode 100644 index 00000000..3ebaff1d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW2_sL1/case.json @@ -0,0 +1,303 @@ +{ + "case_id": "C10_sky130_sW2_sL1", + "circuit_id": "C10", + "pdk": "sky130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "dut_name": "C10_sky130_sW2_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1", + "VB2", + "VB3", + "VB4", + "IB1" + ], + "sizing": { + "M1": { + "w": 8.0, + "l": 0.6, + "nf": 16 + }, + "M2": { + "w": 8.0, + "l": 0.6, + "nf": 16 + }, + "M3": { + "w": 8.0, + "l": 0.6, + "nf": 16 + }, + "M4": { + "w": 8.0, + "l": 0.6, + "nf": 16 + }, + "M5": { + "w": 8.0, + "l": 0.6, + "nf": 16 + }, + "M6": { + "w": 8.0, + "l": 0.6, + "nf": 16 + }, + "M7": { + "w": 8.0, + "l": 0.6, + "nf": 16 + }, + "M8": { + "w": 8.0, + "l": 0.6, + "nf": 16 + }, + "M9": { + "w": 8.0, + "l": 0.6, + "nf": 16 + }, + "M10": { + "w": 8.0, + "l": 0.6, + "nf": 16 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M5", + "current": 2e-05, + "kind": "cascode3" + }, + "VB2": { + "replica": "M7", + "current": 2e-05, + "kind": "cascode3" + }, + "VB3": { + "replica": "M9", + "current": 2e-05 + }, + "VB4": { + "replica": "M3", + "current": 4e-05 + }, + "IB1": { + "i": 4e-05, + "from": "VDD" + } + }, + "load": { + "vcm": 0.9, + "CL": 5e-13, + "cmfb_gain": 20.0, + "vocm": 0.9 + }, + "category": "ota_fd", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M9": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M10": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "7e08dbb075cd10c8", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M5", + "current_A": 2e-05, + "variant": "cascode3" + }, + { + "kind": "replica_bias", + "port": "VB2", + "replica_of": "M7", + "current_A": 2e-05, + "variant": "cascode3" + }, + { + "kind": "replica_bias", + "port": "VB3", + "replica_of": "M9", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "replica_bias", + "port": "VB4", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VDD" + }, + { + "kind": "testbench_element", + "what": "ideal common-mode feedback on VB4" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8", + "M9", + "M10" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/sky130/sW2_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW2_sL1/manifest.json new file mode 100644 index 00000000..bc4dcf6e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW2_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "f9fcd5c748ea27f89959b5d8fd543514afe95d084658c469af43fa9ea3a584af", + "qualification.json": "3e567fcdd67a11c603b233c0d0cd6fd131c4f2ad6e299a7bc3761e018dadda92", + "specs.json": "3e2cb60001b7bbabd2b947c601413e970bd6391a07a9db06e1c32fe9a2b130e8", + "target.spice": "bbc867e42583aeeb444f38027915f1a31640f2e4db720a88eb20a43ffa6ad2f5", + "target_lvs.spice": "2d6d8cce7a79656231d0263606374e23062e90fb2aa046bb43822da112c919aa", + "testbench.spice": "30f6edc3b02481b276f30ecc1dc9d6e1bf9ca2de0aba26f02b7f6aefcd4345e2" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/sky130/sW2_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW2_sL1/qualification.json new file mode 100644 index 00000000..ddf80ec9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW2_sL1/qualification.json @@ -0,0 +1,180 @@ +{ + "case_id": "C10_sky130_sW2_sL1", + "circuit_id": "C10", + "pdk": "sky130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "ota_fd", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M9": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M10": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "7e08dbb075cd10c8", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 35.78 + }, + "ugf": { + "min": 22660000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 38.78135, + "ugf": 37772910.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 10.8, + "schematic_measures": { + "vo1": 0.9049236, + "vo2": 0.9049236, + "idd": 0.0001190659, + "vos_in": -1.81899e-12, + "gain_lf": 38.78135, + "ugf": 37772910.0, + "f3db": 432885.8 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/sky130/sW2_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW2_sL1/specs.json new file mode 100644 index 00000000..e5c8cdba --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW2_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 35.78 + }, + "ugf": { + "min": 22660000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 38.78135, + "ugf": 37772910.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/sky130/sW2_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW2_sL1/target.spice new file mode 100644 index 00000000..a2fe6376 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW2_sL1/target.spice @@ -0,0 +1,12 @@ +.subckt C10_sky130_sW2_sL1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 +XM1 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=8 l=0.6 nf=16 +XM2 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=8 l=0.6 nf=16 +XM3 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=8 l=0.6 nf=16 +XM4 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=8 l=0.6 nf=16 +XM5 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=8 l=0.6 nf=16 +XM6 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=8 l=0.6 nf=16 +XM7 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=8 l=0.6 nf=16 +XM8 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=8 l=0.6 nf=16 +XM9 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=8 l=0.6 nf=16 +XM10 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=8 l=0.6 nf=16 +.ends C10_sky130_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C10/sky130/sW2_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW2_sL1/target_lvs.spice new file mode 100644 index 00000000..7100aeb0 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW2_sL1/target_lvs.spice @@ -0,0 +1,162 @@ +.subckt C10_sky130_sW2_sL1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 +XM1_f0 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f1 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f2 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f3 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f4 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f5 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f6 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f7 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f8 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f9 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f10 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f11 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f12 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f13 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f14 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f15 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f0 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f1 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f2 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f3 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f4 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f5 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f6 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f7 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f8 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f9 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f10 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f11 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f12 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f13 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f14 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f15 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM3_f0 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f1 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f2 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f3 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f4 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f5 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f6 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f7 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f8 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f9 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f10 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f11 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f12 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f13 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f14 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f15 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f0 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f1 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f2 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f3 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f4 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f5 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f6 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f7 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f8 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f9 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f10 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f11 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f12 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f13 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f14 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f15 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f0 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f1 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f2 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f3 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f4 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f5 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f6 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f7 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f8 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f9 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f10 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f11 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f12 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f13 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f14 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f15 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM6_f0 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM6_f1 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM6_f2 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM6_f3 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM6_f4 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM6_f5 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM6_f6 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM6_f7 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM6_f8 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM6_f9 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM6_f10 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM6_f11 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM6_f12 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM6_f13 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM6_f14 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM6_f15 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM7_f0 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f1 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f2 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f3 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f4 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f5 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f6 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f7 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f8 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f9 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f10 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f11 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f12 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f13 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f14 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f15 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f0 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f1 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f2 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f3 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f4 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f5 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f6 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f7 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f8 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f9 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f10 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f11 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f12 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f13 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f14 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f15 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM9_f0 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM9_f1 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM9_f2 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM9_f3 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM9_f4 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM9_f5 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM9_f6 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM9_f7 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM9_f8 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM9_f9 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM9_f10 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM9_f11 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM9_f12 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM9_f13 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM9_f14 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM9_f15 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM10_f0 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM10_f1 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM10_f2 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM10_f3 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM10_f4 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM10_f5 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM10_f6 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM10_f7 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM10_f8 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM10_f9 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM10_f10 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM10_f11 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM10_f12 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM10_f13 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM10_f14 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM10_f15 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +.ends C10_sky130_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C10/sky130/sW2_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW2_sL1/testbench.spice new file mode 100644 index 00000000..7ee6b98c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW2_sL1/testbench.spice @@ -0,0 +1,48 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 C10_sky130_sW2_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIB1 VDD IB1 4e-05 +.nodeset v(IB1)=0.54 +XB_VB1 VB1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=8 l=0.6 +IB_VB1 VDDB VB1 0.00018 +XB_VB2 VB2 VB2 VDDB VDDB sky130_fd_pr__pfet_01v8 w=8 l=0.6 +IB_VB2 VB2 VSS 0.00018 +XB_VB3 VB3 VB3 VDDB VDDB sky130_fd_pr__pfet_01v8 w=8 l=0.6 +IB_VB3 VB3 VSS 2e-05 +XB_VB4n VB4n VB4n VSS VSS sky130_fd_pr__nfet_01v8 w=8 l=0.6 +IB_VB4n VDDB VB4n 4e-05 +VCM VCM 0 0.9 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 5e-13 +CL2 VOUT2 0 5e-13 +BCMFB VB4 0 V = v(VB4n) + 20*((v(VOUT1)+v(VOUT2))/2 - 0.9) +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +meas ac ugf when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C10/sky130/sW2_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW2_sL2/case.json new file mode 100644 index 00000000..b9e5cde7 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW2_sL2/case.json @@ -0,0 +1,303 @@ +{ + "case_id": "C10_sky130_sW2_sL2", + "circuit_id": "C10", + "pdk": "sky130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "dut_name": "C10_sky130_sW2_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1", + "VB2", + "VB3", + "VB4", + "IB1" + ], + "sizing": { + "M1": { + "w": 8.0, + "l": 1.2, + "nf": 16 + }, + "M2": { + "w": 8.0, + "l": 1.2, + "nf": 16 + }, + "M3": { + "w": 8.0, + "l": 1.2, + "nf": 16 + }, + "M4": { + "w": 8.0, + "l": 1.2, + "nf": 16 + }, + "M5": { + "w": 8.0, + "l": 1.2, + "nf": 16 + }, + "M6": { + "w": 8.0, + "l": 1.2, + "nf": 16 + }, + "M7": { + "w": 8.0, + "l": 1.2, + "nf": 16 + }, + "M8": { + "w": 8.0, + "l": 1.2, + "nf": 16 + }, + "M9": { + "w": 8.0, + "l": 1.2, + "nf": 16 + }, + "M10": { + "w": 8.0, + "l": 1.2, + "nf": 16 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M5", + "current": 2e-05, + "kind": "cascode3" + }, + "VB2": { + "replica": "M7", + "current": 2e-05, + "kind": "cascode3" + }, + "VB3": { + "replica": "M9", + "current": 2e-05 + }, + "VB4": { + "replica": "M3", + "current": 4e-05 + }, + "IB1": { + "i": 4e-05, + "from": "VDD" + } + }, + "load": { + "vcm": 0.9, + "CL": 5e-13, + "cmfb_gain": 20.0, + "vocm": 0.9 + }, + "category": "ota_fd", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.2, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.2, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.2, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.2, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.2, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.2, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.2, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.2, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M9": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.2, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M10": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.2, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "8aa0b696ebfac126", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M5", + "current_A": 2e-05, + "variant": "cascode3" + }, + { + "kind": "replica_bias", + "port": "VB2", + "replica_of": "M7", + "current_A": 2e-05, + "variant": "cascode3" + }, + { + "kind": "replica_bias", + "port": "VB3", + "replica_of": "M9", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "replica_bias", + "port": "VB4", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VDD" + }, + { + "kind": "testbench_element", + "what": "ideal common-mode feedback on VB4" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8", + "M9", + "M10" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/sky130/sW2_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW2_sL2/manifest.json new file mode 100644 index 00000000..444d12d4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW2_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "4f1f2da238b76af765497d9b0b5f0ffa15c58ae97055d51813bdf31a10268e99", + "qualification.json": "343c1d129d81abf70f5883b2462a46ad7ad210335b2a3a6cb528120daf23af55", + "specs.json": "0590d9ea9e1451fbaa9682d101f683e4308ef29ac6056c56c59cb41f131ff744", + "target.spice": "845914b4b3d4291b37930490bd52d8ddd9a9f604177861ee03af3f00f5784aca", + "target_lvs.spice": "ec26076f21b5fd3ca98cb1e6ba7ac72957d76069be6533d64b202c24603cfb6f", + "testbench.spice": "50355bafe27b5e7a8aaab169c333c8bc02eab6ffe2778a03f89dc60a40cfe7c7" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/sky130/sW2_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW2_sL2/qualification.json new file mode 100644 index 00000000..fd0e3d42 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW2_sL2/qualification.json @@ -0,0 +1,180 @@ +{ + "case_id": "C10_sky130_sW2_sL2", + "circuit_id": "C10", + "pdk": "sky130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "ota_fd", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.2, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.2, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.2, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.2, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.2, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.2, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.2, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.2, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M9": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.2, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M10": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.2, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "8aa0b696ebfac126", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 35.86 + }, + "ugf": { + "min": 18450000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 38.86216, + "ugf": 30752370.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 7.3, + "schematic_measures": { + "vo1": 0.9052035, + "vo2": 0.9052035, + "idd": 0.0001121763, + "vos_in": 3.637979e-12, + "gain_lf": 38.86216, + "ugf": 30752370.0, + "f3db": 349260.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/sky130/sW2_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW2_sL2/specs.json new file mode 100644 index 00000000..89f8d732 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW2_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 35.86 + }, + "ugf": { + "min": 18450000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 38.86216, + "ugf": 30752370.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C10/sky130/sW2_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW2_sL2/target.spice new file mode 100644 index 00000000..f782e3a5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW2_sL2/target.spice @@ -0,0 +1,12 @@ +.subckt C10_sky130_sW2_sL2 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 +XM1 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=8 l=1.2 nf=16 +XM2 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=8 l=1.2 nf=16 +XM3 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=8 l=1.2 nf=16 +XM4 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=8 l=1.2 nf=16 +XM5 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=8 l=1.2 nf=16 +XM6 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=8 l=1.2 nf=16 +XM7 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=8 l=1.2 nf=16 +XM8 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=8 l=1.2 nf=16 +XM9 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=8 l=1.2 nf=16 +XM10 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=8 l=1.2 nf=16 +.ends C10_sky130_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C10/sky130/sW2_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW2_sL2/target_lvs.spice new file mode 100644 index 00000000..1e44f374 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW2_sL2/target_lvs.spice @@ -0,0 +1,162 @@ +.subckt C10_sky130_sW2_sL2 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 +XM1_f0 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM1_f1 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM1_f2 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM1_f3 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM1_f4 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM1_f5 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM1_f6 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM1_f7 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM1_f8 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM1_f9 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM1_f10 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM1_f11 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM1_f12 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM1_f13 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM1_f14 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM1_f15 net022 VIN1 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM2_f0 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM2_f1 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM2_f2 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM2_f3 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM2_f4 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM2_f5 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM2_f6 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM2_f7 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM2_f8 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM2_f9 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM2_f10 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM2_f11 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM2_f12 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM2_f13 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM2_f14 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM2_f15 net018 VIN2 IB1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM3_f0 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM3_f1 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM3_f2 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM3_f3 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM3_f4 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM3_f5 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM3_f6 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM3_f7 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM3_f8 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM3_f9 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM3_f10 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM3_f11 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM3_f12 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM3_f13 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM3_f14 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM3_f15 net022 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM4_f0 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM4_f1 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM4_f2 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM4_f3 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM4_f4 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM4_f5 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM4_f6 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM4_f7 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM4_f8 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM4_f9 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM4_f10 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM4_f11 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM4_f12 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM4_f13 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM4_f14 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM4_f15 net018 VB4 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM5_f0 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM5_f1 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM5_f2 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM5_f3 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM5_f4 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM5_f5 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM5_f6 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM5_f7 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM5_f8 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM5_f9 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM5_f10 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM5_f11 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM5_f12 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM5_f13 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM5_f14 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM5_f15 VOUT1 VB1 net022 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM6_f0 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM6_f1 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM6_f2 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM6_f3 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM6_f4 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM6_f5 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM6_f6 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM6_f7 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM6_f8 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM6_f9 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM6_f10 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM6_f11 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM6_f12 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM6_f13 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM6_f14 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM6_f15 VOUT2 VB1 net018 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM7_f0 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM7_f1 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM7_f2 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM7_f3 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM7_f4 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM7_f5 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM7_f6 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM7_f7 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM7_f8 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM7_f9 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM7_f10 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM7_f11 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM7_f12 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM7_f13 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM7_f14 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM7_f15 VOUT1 VB2 net023 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM8_f0 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM8_f1 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM8_f2 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM8_f3 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM8_f4 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM8_f5 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM8_f6 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM8_f7 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM8_f8 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM8_f9 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM8_f10 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM8_f11 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM8_f12 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM8_f13 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM8_f14 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM8_f15 VOUT2 VB2 net021 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM9_f0 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM9_f1 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM9_f2 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM9_f3 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM9_f4 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM9_f5 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM9_f6 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM9_f7 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM9_f8 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM9_f9 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM9_f10 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM9_f11 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM9_f12 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM9_f13 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM9_f14 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM9_f15 net023 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM10_f0 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM10_f1 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM10_f2 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM10_f3 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM10_f4 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM10_f5 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM10_f6 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM10_f7 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM10_f8 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM10_f9 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM10_f10 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM10_f11 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM10_f12 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM10_f13 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM10_f14 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +XM10_f15 net021 VB3 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=1.2 +.ends C10_sky130_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C10/sky130/sW2_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW2_sL2/testbench.spice new file mode 100644 index 00000000..2a3b0dcc --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C10/sky130/sW2_sL2/testbench.spice @@ -0,0 +1,48 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 VB2 VB3 VB4 IB1 C10_sky130_sW2_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIB1 VDD IB1 4e-05 +.nodeset v(IB1)=0.54 +XB_VB1 VB1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=8 l=1.2 +IB_VB1 VDDB VB1 0.00018 +XB_VB2 VB2 VB2 VDDB VDDB sky130_fd_pr__pfet_01v8 w=8 l=1.2 +IB_VB2 VB2 VSS 0.00018 +XB_VB3 VB3 VB3 VDDB VDDB sky130_fd_pr__pfet_01v8 w=8 l=1.2 +IB_VB3 VB3 VSS 2e-05 +XB_VB4n VB4n VB4n VSS VSS sky130_fd_pr__nfet_01v8 w=8 l=1.2 +IB_VB4n VDDB VB4n 4e-05 +VCM VCM 0 0.9 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 5e-13 +CL2 VOUT2 0 5e-13 +BCMFB VB4 0 V = v(VB4n) + 20*((v(VOUT1)+v(VOUT2))/2 - 0.9) +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +meas ac ugf when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C11/gf180/sW0.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW0.5_sL1.5/case.json new file mode 100644 index 00000000..9bba558f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW0.5_sL1.5/case.json @@ -0,0 +1,230 @@ +{ + "case_id": "C11_gf180_sW0.5_sL1.5", + "circuit_id": "C11", + "pdk": "gf180", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "dut_name": "C11_gf180_sW0.5_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "IB1" + ], + "sizing": { + "M1": { + "w": 1.0, + "l": 0.84, + "nf": 2 + }, + "M2": { + "w": 2.0, + "l": 0.84, + "nf": 4 + }, + "M3": { + "w": 2.0, + "l": 0.84, + "nf": 4 + }, + "M4": { + "w": 2.0, + "l": 0.84, + "nf": 4 + }, + "M5": { + "w": 1.0, + "l": 0.84, + "nf": 2 + }, + "M6": { + "w": 1.0, + "l": 0.84, + "nf": 2 + }, + "M7": { + "w": 2.0, + "l": 0.84, + "nf": 4 + }, + "M8": { + "w": 2.0, + "l": 0.84, + "nf": 4 + }, + "R1": { + "r": 3000.0, + "body": "VSS", + "w": 1.0, + "l": 7.795 + }, + "C1": { + "c": 1e-12, + "w": 22.365, + "l": 22.365, + "model": "cap_mim_2f0fF" + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 1.32, + "CL": 1e-12, + "inv_input": "VIN1", + "vout_target": 1.65 + }, + "category": "twostage", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.84, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.84, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.84, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "30a2cf3b9ee09c6e", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8", + "R1", + "C1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/gf180/sW0.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW0.5_sL1.5/manifest.json new file mode 100644 index 00000000..1603ccf7 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW0.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "9eeab4e76b6301282bfa9fdad44a2c4b4e5a3ceaa5185fbec1350eaa022d3658", + "qualification.json": "27e6fbf769e4de3bd79f39c80187196891a5555bc3e1619240ce362eb4d6afcb", + "specs.json": "1a13b3867a270554a7ca498c92f8f98060eb966cc0d694fbbead78ac858fc99f", + "target.spice": "81d29bb394d53687905696750bd29774dac6a38529ff90671c82be6ed14ec75b", + "target_lvs.spice": "de90d0f744b61c6a2df64d74287cdfefd43c872bad88ede79f785dabd31c4894", + "testbench.spice": "8e99eafe9793235ba67abdcf785e656de6bc6e895e601cdcda272d3965f8f60b" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/gf180/sW0.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW0.5_sL1.5/qualification.json new file mode 100644 index 00000000..7529a983 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW0.5_sL1.5/qualification.json @@ -0,0 +1,165 @@ +{ + "case_id": "C11_gf180_sW0.5_sL1.5", + "circuit_id": "C11", + "pdk": "gf180", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "twostage", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.84, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.84, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.84, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "30a2cf3b9ee09c6e", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 70.86 + }, + "ugf": { + "min": 3684000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 73.86129, + "ugf": 6139199.0, + "pm": 63.546246409999995 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.3, + "schematic_measures": { + "vout0": 1.65, + "idd": 8.74172e-05, + "vos": 0.001506027, + "gain_lf": 73.86129, + "ph_lf": -0.01194641, + "ugf": 6139199.0, + "ph_ugf": -116.4657, + "f3db": 1278.467, + "pm": 63.546246409999995 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/gf180/sW0.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW0.5_sL1.5/specs.json new file mode 100644 index 00000000..e2ee1d66 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW0.5_sL1.5/specs.json @@ -0,0 +1,30 @@ +{ + "gain_lf": { + "min": 70.86 + }, + "ugf": { + "min": 3684000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 73.86129, + "ugf": 6139199.0, + "pm": 63.546246409999995 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/gf180/sW0.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW0.5_sL1.5/target.spice new file mode 100644 index 00000000..e59fcc79 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW0.5_sL1.5/target.spice @@ -0,0 +1,12 @@ +.subckt C11_gf180_sW0.5_sL1.5 VDD VSS VIN1 VIN2 VOUT1 IB1 +MM1 IB1 IB1 VDD VDD pfet_03v3 w=1u l=0.84u nf=2 m=1 +MM2 net97 IB1 VDD VDD pfet_03v3 w=2u l=0.84u nf=4 m=1 +MM3 net014 VIN1 net97 VDD pfet_03v3 w=2u l=0.84u nf=4 m=1 +MM4 net016 VIN2 net97 VDD pfet_03v3 w=2u l=0.84u nf=4 m=1 +MM5 net014 net014 VSS VSS nfet_03v3 w=1u l=0.84u nf=2 m=1 +MM6 net016 net014 VSS VSS nfet_03v3 w=1u l=0.84u nf=2 m=1 +MM7 VOUT1 IB1 VDD VDD pfet_03v3 w=2u l=0.84u nf=4 m=1 +MM8 VOUT1 net016 VSS VSS nfet_03v3 w=2u l=0.84u nf=4 m=1 +XRR1 net016 net022 VSS ppolyf_u r_width=1u r_length=7.795u +XCC1 net022 VOUT1 cap_mim_2f0fF c_width=22.365u c_length=22.365u +.ends C11_gf180_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C11/gf180/sW0.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW0.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..e1f704fe --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW0.5_sL1.5/target_lvs.spice @@ -0,0 +1,30 @@ +.subckt C11_gf180_sW0.5_sL1.5 VDD VSS VIN1 VIN2 VOUT1 IB1 +MM1_f0 IB1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM1_f1 IB1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f0 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f1 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f2 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f3 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM3_f0 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=0.84u +MM3_f1 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=0.84u +MM3_f2 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=0.84u +MM3_f3 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f0 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f1 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f2 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f3 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=0.84u +MM5_f0 net014 net014 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM5_f1 net014 net014 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM6_f0 net016 net014 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM6_f1 net016 net014 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM7_f0 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM7_f1 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM7_f2 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM7_f3 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM8_f0 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM8_f1 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM8_f2 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM8_f3 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=0.84u +RR1 net016 net022 VSS ppolyf_u L=7.795u W=1u +CC1 net022 VOUT1 cap_mim_2f0_m4m5_noshield W=22.365u L=22.365u +.ends C11_gf180_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C11/gf180/sW0.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW0.5_sL1.5/testbench.spice new file mode 100644 index 00000000..83d1c853 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW0.5_sL1.5/testbench.spice @@ -0,0 +1,37 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 IB1 C11_gf180_sW0.5_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIB1 IB1 VSS 2e-05 +.nodeset v(IB1)=2.31 + +VCM VCM 0 1.32 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 1.65 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN1 VCM VINT 0 1 +EIN VIN2 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN1) - v(VIN2) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C11/gf180/sW0.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW0.5_sL1/case.json new file mode 100644 index 00000000..5ce150a8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW0.5_sL1/case.json @@ -0,0 +1,230 @@ +{ + "case_id": "C11_gf180_sW0.5_sL1", + "circuit_id": "C11", + "pdk": "gf180", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "dut_name": "C11_gf180_sW0.5_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "IB1" + ], + "sizing": { + "M1": { + "w": 1.0, + "l": 0.56, + "nf": 2 + }, + "M2": { + "w": 2.0, + "l": 0.56, + "nf": 4 + }, + "M3": { + "w": 2.0, + "l": 0.56, + "nf": 4 + }, + "M4": { + "w": 2.0, + "l": 0.56, + "nf": 4 + }, + "M5": { + "w": 1.0, + "l": 0.56, + "nf": 2 + }, + "M6": { + "w": 1.0, + "l": 0.56, + "nf": 2 + }, + "M7": { + "w": 2.0, + "l": 0.56, + "nf": 4 + }, + "M8": { + "w": 2.0, + "l": 0.56, + "nf": 4 + }, + "R1": { + "r": 3000.0, + "body": "VSS", + "w": 1.0, + "l": 7.795 + }, + "C1": { + "c": 1e-12, + "w": 22.365, + "l": 22.365, + "model": "cap_mim_2f0fF" + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 1.32, + "CL": 1e-12, + "inv_input": "VIN1", + "vout_target": 1.65 + }, + "category": "twostage", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.56, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.56, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.56, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "53f95ae2cd8a5d4a", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8", + "R1", + "C1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/gf180/sW0.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW0.5_sL1/manifest.json new file mode 100644 index 00000000..d098a129 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW0.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "1e2c7f7118fea9c37848788d680808e993b7cb81b37d3a6ac81efcc4b62d2176", + "qualification.json": "627c71449806493a58e8597fffa3b2e3246a3bf7619760be577603365d59106b", + "specs.json": "e401b51bb4628fe52e47b41be5000c78a2e12b646675c4b4640af8b672d29072", + "target.spice": "c9df9462b255b6f5d9412965b1996850040131b47a995ac61bb2290780d06bd8", + "target_lvs.spice": "825957f24e7bc69600ff080b7354a5cc995a4aba5996672f584786bb2884906f", + "testbench.spice": "de093c8ac0af609a6f97b5a1c28cbf4bb2a1b227cf64ed655cfa24ef88909821" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/gf180/sW0.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW0.5_sL1/qualification.json new file mode 100644 index 00000000..b0de0091 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW0.5_sL1/qualification.json @@ -0,0 +1,165 @@ +{ + "case_id": "C11_gf180_sW0.5_sL1", + "circuit_id": "C11", + "pdk": "gf180", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "twostage", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.56, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.56, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.56, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "53f95ae2cd8a5d4a", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 65.48 + }, + "ugf": { + "min": 4984000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 68.48272, + "ugf": 8307234.0, + "pm": 62.6064719 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.2, + "schematic_measures": { + "vout0": 1.65, + "idd": 9.347894e-05, + "vos": 0.0008384993, + "gain_lf": 68.48272, + "ph_lf": 0.6402281, + "ugf": 8307234.0, + "ph_ugf": -116.7533, + "f3db": 3225.827, + "pm": 62.6064719 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/gf180/sW0.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW0.5_sL1/specs.json new file mode 100644 index 00000000..bc5ca718 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW0.5_sL1/specs.json @@ -0,0 +1,30 @@ +{ + "gain_lf": { + "min": 65.48 + }, + "ugf": { + "min": 4984000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 68.48272, + "ugf": 8307234.0, + "pm": 62.6064719 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/gf180/sW0.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW0.5_sL1/target.spice new file mode 100644 index 00000000..8cac2e7c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW0.5_sL1/target.spice @@ -0,0 +1,12 @@ +.subckt C11_gf180_sW0.5_sL1 VDD VSS VIN1 VIN2 VOUT1 IB1 +MM1 IB1 IB1 VDD VDD pfet_03v3 w=1u l=0.56u nf=2 m=1 +MM2 net97 IB1 VDD VDD pfet_03v3 w=2u l=0.56u nf=4 m=1 +MM3 net014 VIN1 net97 VDD pfet_03v3 w=2u l=0.56u nf=4 m=1 +MM4 net016 VIN2 net97 VDD pfet_03v3 w=2u l=0.56u nf=4 m=1 +MM5 net014 net014 VSS VSS nfet_03v3 w=1u l=0.56u nf=2 m=1 +MM6 net016 net014 VSS VSS nfet_03v3 w=1u l=0.56u nf=2 m=1 +MM7 VOUT1 IB1 VDD VDD pfet_03v3 w=2u l=0.56u nf=4 m=1 +MM8 VOUT1 net016 VSS VSS nfet_03v3 w=2u l=0.56u nf=4 m=1 +XRR1 net016 net022 VSS ppolyf_u r_width=1u r_length=7.795u +XCC1 net022 VOUT1 cap_mim_2f0fF c_width=22.365u c_length=22.365u +.ends C11_gf180_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C11/gf180/sW0.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW0.5_sL1/target_lvs.spice new file mode 100644 index 00000000..e513c58b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW0.5_sL1/target_lvs.spice @@ -0,0 +1,30 @@ +.subckt C11_gf180_sW0.5_sL1 VDD VSS VIN1 VIN2 VOUT1 IB1 +MM1_f0 IB1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM1_f1 IB1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f0 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f1 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f2 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f3 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM3_f0 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=0.56u +MM3_f1 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=0.56u +MM3_f2 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=0.56u +MM3_f3 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f0 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f1 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f2 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f3 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=0.56u +MM5_f0 net014 net014 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM5_f1 net014 net014 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM6_f0 net016 net014 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM6_f1 net016 net014 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM7_f0 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM7_f1 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM7_f2 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM7_f3 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM8_f0 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM8_f1 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM8_f2 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM8_f3 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=0.56u +RR1 net016 net022 VSS ppolyf_u L=7.795u W=1u +CC1 net022 VOUT1 cap_mim_2f0_m4m5_noshield W=22.365u L=22.365u +.ends C11_gf180_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C11/gf180/sW0.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW0.5_sL1/testbench.spice new file mode 100644 index 00000000..c7c41030 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW0.5_sL1/testbench.spice @@ -0,0 +1,37 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 IB1 C11_gf180_sW0.5_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIB1 IB1 VSS 2e-05 +.nodeset v(IB1)=2.31 + +VCM VCM 0 1.32 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 1.65 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN1 VCM VINT 0 1 +EIN VIN2 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN1) - v(VIN2) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C11/gf180/sW0.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW0.5_sL2/case.json new file mode 100644 index 00000000..cf591c1e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW0.5_sL2/case.json @@ -0,0 +1,230 @@ +{ + "case_id": "C11_gf180_sW0.5_sL2", + "circuit_id": "C11", + "pdk": "gf180", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "dut_name": "C11_gf180_sW0.5_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "IB1" + ], + "sizing": { + "M1": { + "w": 1.0, + "l": 1.12, + "nf": 2 + }, + "M2": { + "w": 2.0, + "l": 1.12, + "nf": 4 + }, + "M3": { + "w": 2.0, + "l": 1.12, + "nf": 4 + }, + "M4": { + "w": 2.0, + "l": 1.12, + "nf": 4 + }, + "M5": { + "w": 1.0, + "l": 1.12, + "nf": 2 + }, + "M6": { + "w": 1.0, + "l": 1.12, + "nf": 2 + }, + "M7": { + "w": 2.0, + "l": 1.12, + "nf": 4 + }, + "M8": { + "w": 2.0, + "l": 1.12, + "nf": 4 + }, + "R1": { + "r": 3000.0, + "body": "VSS", + "w": 1.0, + "l": 7.795 + }, + "C1": { + "c": 1e-12, + "w": 22.365, + "l": 22.365, + "model": "cap_mim_2f0fF" + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 1.32, + "CL": 1e-12, + "inv_input": "VIN1", + "vout_target": 1.65 + }, + "category": "twostage", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.12, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.12, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.12, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "8c0111900cefe3a9", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8", + "R1", + "C1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/gf180/sW0.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW0.5_sL2/manifest.json new file mode 100644 index 00000000..912b8077 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW0.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "f10648a219ec4190ce2124b3c6cb20c1f3b8eae1785b7e8a2037f5a92e69939d", + "qualification.json": "cbf145abb4cdede709a79fcdf53e228972c49a7bb8b243eda51eb8beb59dc907", + "specs.json": "e90d033674776ef2f5cd8c8baa68974b1fdf12dce32fc1d1e5d4c047afa6640b", + "target.spice": "1f48e06e8160cc85f9174f038fc57060279140ab56fad165e1013bbcc4ce0521", + "target_lvs.spice": "ea015ed3f101330ea076d0a120a55229d3ce8bb176772da92bfb13a16013efb6", + "testbench.spice": "113ae46b5ca3caf284b7ab07ed09babc879937e6a1b3d9198a87ae17aa8dc624" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/gf180/sW0.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW0.5_sL2/qualification.json new file mode 100644 index 00000000..5b5d7e61 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW0.5_sL2/qualification.json @@ -0,0 +1,165 @@ +{ + "case_id": "C11_gf180_sW0.5_sL2", + "circuit_id": "C11", + "pdk": "gf180", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "twostage", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.12, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.12, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.12, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "8c0111900cefe3a9", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 73.58 + }, + "ugf": { + "min": 2935000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 76.58088, + "ugf": 4891370.0, + "pm": 66.238562 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.2, + "schematic_measures": { + "vout0": 1.65, + "idd": 8.309113e-05, + "vos": 0.001951382, + "gain_lf": 76.58088, + "ph_lf": -1.626862, + "ugf": 4891370.0, + "ph_ugf": -115.3883, + "f3db": 10.46153, + "pm": 66.238562 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/gf180/sW0.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW0.5_sL2/specs.json new file mode 100644 index 00000000..deefe4af --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW0.5_sL2/specs.json @@ -0,0 +1,30 @@ +{ + "gain_lf": { + "min": 73.58 + }, + "ugf": { + "min": 2935000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 76.58088, + "ugf": 4891370.0, + "pm": 66.238562 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/gf180/sW0.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW0.5_sL2/target.spice new file mode 100644 index 00000000..17b13001 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW0.5_sL2/target.spice @@ -0,0 +1,12 @@ +.subckt C11_gf180_sW0.5_sL2 VDD VSS VIN1 VIN2 VOUT1 IB1 +MM1 IB1 IB1 VDD VDD pfet_03v3 w=1u l=1.12u nf=2 m=1 +MM2 net97 IB1 VDD VDD pfet_03v3 w=2u l=1.12u nf=4 m=1 +MM3 net014 VIN1 net97 VDD pfet_03v3 w=2u l=1.12u nf=4 m=1 +MM4 net016 VIN2 net97 VDD pfet_03v3 w=2u l=1.12u nf=4 m=1 +MM5 net014 net014 VSS VSS nfet_03v3 w=1u l=1.12u nf=2 m=1 +MM6 net016 net014 VSS VSS nfet_03v3 w=1u l=1.12u nf=2 m=1 +MM7 VOUT1 IB1 VDD VDD pfet_03v3 w=2u l=1.12u nf=4 m=1 +MM8 VOUT1 net016 VSS VSS nfet_03v3 w=2u l=1.12u nf=4 m=1 +XRR1 net016 net022 VSS ppolyf_u r_width=1u r_length=7.795u +XCC1 net022 VOUT1 cap_mim_2f0fF c_width=22.365u c_length=22.365u +.ends C11_gf180_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C11/gf180/sW0.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW0.5_sL2/target_lvs.spice new file mode 100644 index 00000000..e71420cf --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW0.5_sL2/target_lvs.spice @@ -0,0 +1,30 @@ +.subckt C11_gf180_sW0.5_sL2 VDD VSS VIN1 VIN2 VOUT1 IB1 +MM1_f0 IB1 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM1_f1 IB1 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f0 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f1 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f2 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f3 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM3_f0 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=1.12u +MM3_f1 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=1.12u +MM3_f2 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=1.12u +MM3_f3 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f0 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f1 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f2 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f3 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=1.12u +MM5_f0 net014 net014 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM5_f1 net014 net014 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM6_f0 net016 net014 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM6_f1 net016 net014 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM7_f0 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM7_f1 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM7_f2 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM7_f3 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM8_f0 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM8_f1 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM8_f2 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM8_f3 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=1.12u +RR1 net016 net022 VSS ppolyf_u L=7.795u W=1u +CC1 net022 VOUT1 cap_mim_2f0_m4m5_noshield W=22.365u L=22.365u +.ends C11_gf180_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C11/gf180/sW0.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW0.5_sL2/testbench.spice new file mode 100644 index 00000000..2a44c217 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW0.5_sL2/testbench.spice @@ -0,0 +1,37 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 IB1 C11_gf180_sW0.5_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIB1 IB1 VSS 2e-05 +.nodeset v(IB1)=2.31 + +VCM VCM 0 1.32 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 1.65 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN1 VCM VINT 0 1 +EIN VIN2 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN1) - v(VIN2) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1.5_sL1.5/case.json new file mode 100644 index 00000000..7c6f6c5b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1.5_sL1.5/case.json @@ -0,0 +1,230 @@ +{ + "case_id": "C11_gf180_sW1.5_sL1.5", + "circuit_id": "C11", + "pdk": "gf180", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "dut_name": "C11_gf180_sW1.5_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "IB1" + ], + "sizing": { + "M1": { + "w": 3.0, + "l": 0.84, + "nf": 6 + }, + "M2": { + "w": 6.0, + "l": 0.84, + "nf": 12 + }, + "M3": { + "w": 6.0, + "l": 0.84, + "nf": 12 + }, + "M4": { + "w": 6.0, + "l": 0.84, + "nf": 12 + }, + "M5": { + "w": 3.0, + "l": 0.84, + "nf": 6 + }, + "M6": { + "w": 3.0, + "l": 0.84, + "nf": 6 + }, + "M7": { + "w": 6.0, + "l": 0.84, + "nf": 12 + }, + "M8": { + "w": 6.0, + "l": 0.84, + "nf": 12 + }, + "R1": { + "r": 3000.0, + "body": "VSS", + "w": 1.0, + "l": 7.795 + }, + "C1": { + "c": 1e-12, + "w": 22.365, + "l": 22.365, + "model": "cap_mim_2f0fF" + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 1.32, + "CL": 1e-12, + "inv_input": "VIN1", + "vout_target": 1.65 + }, + "category": "twostage", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.84, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.84, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.84, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "374a28d6ec0f1425", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8", + "R1", + "C1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1.5_sL1.5/manifest.json new file mode 100644 index 00000000..e7427bbb --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "10e22fe2a487334f88022ad463f8b8ca0eb2c6a512ae337f2a00c333e99b7171", + "qualification.json": "dc69c2cfda3e04f20c0203bda0a82a2a592b9c76745f843ce1487a48a4b869a6", + "specs.json": "02f3598cdd38da05d8307f224f587f39376a19ad33a9ae93d3e4a5eee1621a96", + "target.spice": "26d6fbabfb2d00ff9b104cea696dea8847c7a366189fa6018caffc42a66cbba7", + "target_lvs.spice": "6878724b55340c53416371db3925c68d362086218b144a1de819a28bae04d410", + "testbench.spice": "55defad97130cfa44276c765e55870512e689c4813e68a03736dcd0d9b45b3d5" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1.5_sL1.5/qualification.json new file mode 100644 index 00000000..fbc66008 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1.5_sL1.5/qualification.json @@ -0,0 +1,165 @@ +{ + "case_id": "C11_gf180_sW1.5_sL1.5", + "circuit_id": "C11", + "pdk": "gf180", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "twostage", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.84, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.84, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.84, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "374a28d6ec0f1425", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 78.27 + }, + "ugf": { + "min": 7628000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 81.26861, + "ugf": 12712850.0, + "pm": 59.506123 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.3, + "schematic_measures": { + "vout0": 1.65, + "idd": 9.88841e-05, + "vos": 3.760084e-05, + "gain_lf": 81.26861, + "ph_lf": 5.590777, + "ugf": 12712850.0, + "ph_ugf": -114.9031, + "f3db": 18.11987, + "pm": 59.506123 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1.5_sL1.5/specs.json new file mode 100644 index 00000000..be219195 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1.5_sL1.5/specs.json @@ -0,0 +1,30 @@ +{ + "gain_lf": { + "min": 78.27 + }, + "ugf": { + "min": 7628000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 81.26861, + "ugf": 12712850.0, + "pm": 59.506123 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1.5_sL1.5/target.spice new file mode 100644 index 00000000..f2936309 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1.5_sL1.5/target.spice @@ -0,0 +1,12 @@ +.subckt C11_gf180_sW1.5_sL1.5 VDD VSS VIN1 VIN2 VOUT1 IB1 +MM1 IB1 IB1 VDD VDD pfet_03v3 w=3u l=0.84u nf=6 m=1 +MM2 net97 IB1 VDD VDD pfet_03v3 w=6u l=0.84u nf=12 m=1 +MM3 net014 VIN1 net97 VDD pfet_03v3 w=6u l=0.84u nf=12 m=1 +MM4 net016 VIN2 net97 VDD pfet_03v3 w=6u l=0.84u nf=12 m=1 +MM5 net014 net014 VSS VSS nfet_03v3 w=3u l=0.84u nf=6 m=1 +MM6 net016 net014 VSS VSS nfet_03v3 w=3u l=0.84u nf=6 m=1 +MM7 VOUT1 IB1 VDD VDD pfet_03v3 w=6u l=0.84u nf=12 m=1 +MM8 VOUT1 net016 VSS VSS nfet_03v3 w=6u l=0.84u nf=12 m=1 +XRR1 net016 net022 VSS ppolyf_u r_width=1u r_length=7.795u +XCC1 net022 VOUT1 cap_mim_2f0fF c_width=22.365u c_length=22.365u +.ends C11_gf180_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..0cf1b0e2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1.5_sL1.5/target_lvs.spice @@ -0,0 +1,82 @@ +.subckt C11_gf180_sW1.5_sL1.5 VDD VSS VIN1 VIN2 VOUT1 IB1 +MM1_f0 IB1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM1_f1 IB1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM1_f2 IB1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM1_f3 IB1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM1_f4 IB1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM1_f5 IB1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f0 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f1 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f2 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f3 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f4 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f5 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f6 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f7 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f8 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f9 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f10 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f11 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM3_f0 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=0.84u +MM3_f1 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=0.84u +MM3_f2 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=0.84u +MM3_f3 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=0.84u +MM3_f4 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=0.84u +MM3_f5 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=0.84u +MM3_f6 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=0.84u +MM3_f7 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=0.84u +MM3_f8 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=0.84u +MM3_f9 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=0.84u +MM3_f10 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=0.84u +MM3_f11 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f0 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f1 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f2 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f3 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f4 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f5 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f6 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f7 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f8 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f9 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f10 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f11 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=0.84u +MM5_f0 net014 net014 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM5_f1 net014 net014 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM5_f2 net014 net014 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM5_f3 net014 net014 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM5_f4 net014 net014 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM5_f5 net014 net014 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM6_f0 net016 net014 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM6_f1 net016 net014 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM6_f2 net016 net014 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM6_f3 net016 net014 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM6_f4 net016 net014 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM6_f5 net016 net014 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM7_f0 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM7_f1 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM7_f2 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM7_f3 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM7_f4 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM7_f5 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM7_f6 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM7_f7 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM7_f8 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM7_f9 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM7_f10 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM7_f11 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM8_f0 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM8_f1 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM8_f2 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM8_f3 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM8_f4 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM8_f5 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM8_f6 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM8_f7 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM8_f8 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM8_f9 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM8_f10 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM8_f11 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=0.84u +RR1 net016 net022 VSS ppolyf_u L=7.795u W=1u +CC1 net022 VOUT1 cap_mim_2f0_m4m5_noshield W=22.365u L=22.365u +.ends C11_gf180_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1.5_sL1.5/testbench.spice new file mode 100644 index 00000000..a2d0003b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1.5_sL1.5/testbench.spice @@ -0,0 +1,37 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 IB1 C11_gf180_sW1.5_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIB1 IB1 VSS 2e-05 +.nodeset v(IB1)=2.31 + +VCM VCM 0 1.32 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 1.65 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN1 VCM VINT 0 1 +EIN VIN2 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN1) - v(VIN2) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1.5_sL1/case.json new file mode 100644 index 00000000..b12d8903 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1.5_sL1/case.json @@ -0,0 +1,230 @@ +{ + "case_id": "C11_gf180_sW1.5_sL1", + "circuit_id": "C11", + "pdk": "gf180", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "dut_name": "C11_gf180_sW1.5_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "IB1" + ], + "sizing": { + "M1": { + "w": 3.0, + "l": 0.56, + "nf": 6 + }, + "M2": { + "w": 6.0, + "l": 0.56, + "nf": 12 + }, + "M3": { + "w": 6.0, + "l": 0.56, + "nf": 12 + }, + "M4": { + "w": 6.0, + "l": 0.56, + "nf": 12 + }, + "M5": { + "w": 3.0, + "l": 0.56, + "nf": 6 + }, + "M6": { + "w": 3.0, + "l": 0.56, + "nf": 6 + }, + "M7": { + "w": 6.0, + "l": 0.56, + "nf": 12 + }, + "M8": { + "w": 6.0, + "l": 0.56, + "nf": 12 + }, + "R1": { + "r": 3000.0, + "body": "VSS", + "w": 1.0, + "l": 7.795 + }, + "C1": { + "c": 1e-12, + "w": 22.365, + "l": 22.365, + "model": "cap_mim_2f0fF" + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 1.32, + "CL": 1e-12, + "inv_input": "VIN1", + "vout_target": 1.65 + }, + "category": "twostage", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.56, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.56, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.56, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "a8a036a8bd0a1d5a", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8", + "R1", + "C1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1.5_sL1/manifest.json new file mode 100644 index 00000000..158476cd --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "0c7e678c5b66889ca40cb3ca76cdcea8f53327e44dd7fb7248e7cb7773f27047", + "qualification.json": "55422b56a41007431d8f85f9dc674629c6a22031395e9db8990e94280597f678", + "specs.json": "aeba66a86cdd15e4ac02ac43aabcfc88671e74dddeb2eadee07bd30eceb7cd0f", + "target.spice": "49280663629de5ec093c5bb553dbd6618b68f8ffc235eac7874c6eb3a94714a7", + "target_lvs.spice": "8b6a3fa9e78e41072f5773b64f733285152888eb59bac750d92bcdcb4e56ba9c", + "testbench.spice": "987e68e285a455e6a9ccaa74e4c216912361fa59237a65402d0fa726ba91a0bc" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1.5_sL1/qualification.json new file mode 100644 index 00000000..b06e6c8c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1.5_sL1/qualification.json @@ -0,0 +1,165 @@ +{ + "case_id": "C11_gf180_sW1.5_sL1", + "circuit_id": "C11", + "pdk": "gf180", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "twostage", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.56, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.56, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.56, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "a8a036a8bd0a1d5a", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 72.66 + }, + "ugf": { + "min": 9590000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 75.65867, + "ugf": 15982530.0, + "pm": 65.109734 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.4, + "schematic_measures": { + "vout0": 1.65, + "idd": 9.935793e-05, + "vos": 1.32633e-05, + "gain_lf": 75.65867, + "ph_lf": 3.469366, + "ugf": 15982530.0, + "ph_ugf": -111.4209, + "f3db": 2784.256, + "pm": 65.109734 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1.5_sL1/specs.json new file mode 100644 index 00000000..dcdea6b9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1.5_sL1/specs.json @@ -0,0 +1,30 @@ +{ + "gain_lf": { + "min": 72.66 + }, + "ugf": { + "min": 9590000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 75.65867, + "ugf": 15982530.0, + "pm": 65.109734 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1.5_sL1/target.spice new file mode 100644 index 00000000..e2e95bd7 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1.5_sL1/target.spice @@ -0,0 +1,12 @@ +.subckt C11_gf180_sW1.5_sL1 VDD VSS VIN1 VIN2 VOUT1 IB1 +MM1 IB1 IB1 VDD VDD pfet_03v3 w=3u l=0.56u nf=6 m=1 +MM2 net97 IB1 VDD VDD pfet_03v3 w=6u l=0.56u nf=12 m=1 +MM3 net014 VIN1 net97 VDD pfet_03v3 w=6u l=0.56u nf=12 m=1 +MM4 net016 VIN2 net97 VDD pfet_03v3 w=6u l=0.56u nf=12 m=1 +MM5 net014 net014 VSS VSS nfet_03v3 w=3u l=0.56u nf=6 m=1 +MM6 net016 net014 VSS VSS nfet_03v3 w=3u l=0.56u nf=6 m=1 +MM7 VOUT1 IB1 VDD VDD pfet_03v3 w=6u l=0.56u nf=12 m=1 +MM8 VOUT1 net016 VSS VSS nfet_03v3 w=6u l=0.56u nf=12 m=1 +XRR1 net016 net022 VSS ppolyf_u r_width=1u r_length=7.795u +XCC1 net022 VOUT1 cap_mim_2f0fF c_width=22.365u c_length=22.365u +.ends C11_gf180_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1.5_sL1/target_lvs.spice new file mode 100644 index 00000000..ea10ad71 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1.5_sL1/target_lvs.spice @@ -0,0 +1,82 @@ +.subckt C11_gf180_sW1.5_sL1 VDD VSS VIN1 VIN2 VOUT1 IB1 +MM1_f0 IB1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM1_f1 IB1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM1_f2 IB1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM1_f3 IB1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM1_f4 IB1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM1_f5 IB1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f0 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f1 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f2 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f3 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f4 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f5 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f6 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f7 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f8 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f9 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f10 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f11 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM3_f0 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=0.56u +MM3_f1 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=0.56u +MM3_f2 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=0.56u +MM3_f3 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=0.56u +MM3_f4 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=0.56u +MM3_f5 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=0.56u +MM3_f6 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=0.56u +MM3_f7 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=0.56u +MM3_f8 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=0.56u +MM3_f9 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=0.56u +MM3_f10 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=0.56u +MM3_f11 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f0 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f1 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f2 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f3 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f4 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f5 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f6 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f7 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f8 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f9 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f10 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f11 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=0.56u +MM5_f0 net014 net014 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM5_f1 net014 net014 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM5_f2 net014 net014 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM5_f3 net014 net014 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM5_f4 net014 net014 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM5_f5 net014 net014 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM6_f0 net016 net014 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM6_f1 net016 net014 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM6_f2 net016 net014 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM6_f3 net016 net014 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM6_f4 net016 net014 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM6_f5 net016 net014 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM7_f0 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM7_f1 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM7_f2 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM7_f3 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM7_f4 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM7_f5 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM7_f6 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM7_f7 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM7_f8 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM7_f9 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM7_f10 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM7_f11 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM8_f0 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM8_f1 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM8_f2 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM8_f3 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM8_f4 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM8_f5 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM8_f6 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM8_f7 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM8_f8 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM8_f9 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM8_f10 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM8_f11 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=0.56u +RR1 net016 net022 VSS ppolyf_u L=7.795u W=1u +CC1 net022 VOUT1 cap_mim_2f0_m4m5_noshield W=22.365u L=22.365u +.ends C11_gf180_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1.5_sL1/testbench.spice new file mode 100644 index 00000000..0fb426d0 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1.5_sL1/testbench.spice @@ -0,0 +1,37 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 IB1 C11_gf180_sW1.5_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIB1 IB1 VSS 2e-05 +.nodeset v(IB1)=2.31 + +VCM VCM 0 1.32 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 1.65 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN1 VCM VINT 0 1 +EIN VIN2 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN1) - v(VIN2) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1.5_sL2/case.json new file mode 100644 index 00000000..3d95b47a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1.5_sL2/case.json @@ -0,0 +1,230 @@ +{ + "case_id": "C11_gf180_sW1.5_sL2", + "circuit_id": "C11", + "pdk": "gf180", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "dut_name": "C11_gf180_sW1.5_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "IB1" + ], + "sizing": { + "M1": { + "w": 3.0, + "l": 1.12, + "nf": 6 + }, + "M2": { + "w": 6.0, + "l": 1.12, + "nf": 12 + }, + "M3": { + "w": 6.0, + "l": 1.12, + "nf": 12 + }, + "M4": { + "w": 6.0, + "l": 1.12, + "nf": 12 + }, + "M5": { + "w": 3.0, + "l": 1.12, + "nf": 6 + }, + "M6": { + "w": 3.0, + "l": 1.12, + "nf": 6 + }, + "M7": { + "w": 6.0, + "l": 1.12, + "nf": 12 + }, + "M8": { + "w": 6.0, + "l": 1.12, + "nf": 12 + }, + "R1": { + "r": 3000.0, + "body": "VSS", + "w": 1.0, + "l": 7.795 + }, + "C1": { + "c": 1e-12, + "w": 22.365, + "l": 22.365, + "model": "cap_mim_2f0fF" + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 1.32, + "CL": 1e-12, + "inv_input": "VIN1", + "vout_target": 1.65 + }, + "category": "twostage", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.12, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.12, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.12, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "593f571f82dba8c2", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8", + "R1", + "C1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1.5_sL2/manifest.json new file mode 100644 index 00000000..00753bc3 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "f85d836d76a88574c4670f0d1a975ed0a7952d7694d136ea83c628735ef5a447", + "qualification.json": "95061b94251a037b187813465281169a6c456a1c84de23b214c98938bf794c98", + "specs.json": "79460521e1bd05748074136cdc304705561215aecb7bf16b311cdebbec5f16f5", + "target.spice": "70fe4230b7813279958669b46b85e22f7d82d7bfff320e487c5299a6c39588ab", + "target_lvs.spice": "2c1171b0fc1357cd96c17af59bc887245dff0575e3997f065650bd7e7e05f7c3", + "testbench.spice": "39e4aa991d9820be3320bf1d9857c00aa6b6c9738d63adf6fadfe8721b3b89b9" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1.5_sL2/qualification.json new file mode 100644 index 00000000..d57c1e42 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1.5_sL2/qualification.json @@ -0,0 +1,165 @@ +{ + "case_id": "C11_gf180_sW1.5_sL2", + "circuit_id": "C11", + "pdk": "gf180", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "twostage", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.12, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.12, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.12, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "593f571f82dba8c2", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 80.9 + }, + "ugf": { + "min": 6471000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 83.90365, + "ugf": 10785700.0, + "pm": 56.909099 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.3, + "schematic_measures": { + "vout0": 1.65, + "idd": 9.793855e-05, + "vos": 8.268192e-05, + "gain_lf": 83.90365, + "ph_lf": 6.323901, + "ugf": 10785700.0, + "ph_ugf": -116.767, + "f3db": 24.11151, + "pm": 56.909099 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1.5_sL2/specs.json new file mode 100644 index 00000000..8df69887 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1.5_sL2/specs.json @@ -0,0 +1,30 @@ +{ + "gain_lf": { + "min": 80.9 + }, + "ugf": { + "min": 6471000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 83.90365, + "ugf": 10785700.0, + "pm": 56.909099 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1.5_sL2/target.spice new file mode 100644 index 00000000..df1b4308 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1.5_sL2/target.spice @@ -0,0 +1,12 @@ +.subckt C11_gf180_sW1.5_sL2 VDD VSS VIN1 VIN2 VOUT1 IB1 +MM1 IB1 IB1 VDD VDD pfet_03v3 w=3u l=1.12u nf=6 m=1 +MM2 net97 IB1 VDD VDD pfet_03v3 w=6u l=1.12u nf=12 m=1 +MM3 net014 VIN1 net97 VDD pfet_03v3 w=6u l=1.12u nf=12 m=1 +MM4 net016 VIN2 net97 VDD pfet_03v3 w=6u l=1.12u nf=12 m=1 +MM5 net014 net014 VSS VSS nfet_03v3 w=3u l=1.12u nf=6 m=1 +MM6 net016 net014 VSS VSS nfet_03v3 w=3u l=1.12u nf=6 m=1 +MM7 VOUT1 IB1 VDD VDD pfet_03v3 w=6u l=1.12u nf=12 m=1 +MM8 VOUT1 net016 VSS VSS nfet_03v3 w=6u l=1.12u nf=12 m=1 +XRR1 net016 net022 VSS ppolyf_u r_width=1u r_length=7.795u +XCC1 net022 VOUT1 cap_mim_2f0fF c_width=22.365u c_length=22.365u +.ends C11_gf180_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1.5_sL2/target_lvs.spice new file mode 100644 index 00000000..b50374ef --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1.5_sL2/target_lvs.spice @@ -0,0 +1,82 @@ +.subckt C11_gf180_sW1.5_sL2 VDD VSS VIN1 VIN2 VOUT1 IB1 +MM1_f0 IB1 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM1_f1 IB1 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM1_f2 IB1 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM1_f3 IB1 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM1_f4 IB1 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM1_f5 IB1 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f0 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f1 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f2 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f3 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f4 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f5 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f6 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f7 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f8 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f9 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f10 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f11 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM3_f0 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=1.12u +MM3_f1 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=1.12u +MM3_f2 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=1.12u +MM3_f3 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=1.12u +MM3_f4 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=1.12u +MM3_f5 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=1.12u +MM3_f6 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=1.12u +MM3_f7 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=1.12u +MM3_f8 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=1.12u +MM3_f9 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=1.12u +MM3_f10 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=1.12u +MM3_f11 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f0 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f1 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f2 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f3 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f4 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f5 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f6 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f7 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f8 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f9 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f10 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f11 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=1.12u +MM5_f0 net014 net014 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM5_f1 net014 net014 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM5_f2 net014 net014 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM5_f3 net014 net014 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM5_f4 net014 net014 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM5_f5 net014 net014 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM6_f0 net016 net014 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM6_f1 net016 net014 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM6_f2 net016 net014 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM6_f3 net016 net014 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM6_f4 net016 net014 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM6_f5 net016 net014 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM7_f0 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM7_f1 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM7_f2 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM7_f3 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM7_f4 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM7_f5 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM7_f6 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM7_f7 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM7_f8 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM7_f9 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM7_f10 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM7_f11 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM8_f0 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM8_f1 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM8_f2 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM8_f3 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM8_f4 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM8_f5 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM8_f6 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM8_f7 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM8_f8 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM8_f9 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM8_f10 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM8_f11 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=1.12u +RR1 net016 net022 VSS ppolyf_u L=7.795u W=1u +CC1 net022 VOUT1 cap_mim_2f0_m4m5_noshield W=22.365u L=22.365u +.ends C11_gf180_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1.5_sL2/testbench.spice new file mode 100644 index 00000000..08a6c444 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1.5_sL2/testbench.spice @@ -0,0 +1,37 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 IB1 C11_gf180_sW1.5_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIB1 IB1 VSS 2e-05 +.nodeset v(IB1)=2.31 + +VCM VCM 0 1.32 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 1.65 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN1 VCM VINT 0 1 +EIN VIN2 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN1) - v(VIN2) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1_sL1.5/case.json new file mode 100644 index 00000000..51535aff --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1_sL1.5/case.json @@ -0,0 +1,230 @@ +{ + "case_id": "C11_gf180_sW1_sL1.5", + "circuit_id": "C11", + "pdk": "gf180", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "dut_name": "C11_gf180_sW1_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "IB1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.84, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.84, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 0.84, + "nf": 8 + }, + "M4": { + "w": 4.0, + "l": 0.84, + "nf": 8 + }, + "M5": { + "w": 2.0, + "l": 0.84, + "nf": 4 + }, + "M6": { + "w": 2.0, + "l": 0.84, + "nf": 4 + }, + "M7": { + "w": 4.0, + "l": 0.84, + "nf": 8 + }, + "M8": { + "w": 4.0, + "l": 0.84, + "nf": 8 + }, + "R1": { + "r": 3000.0, + "body": "VSS", + "w": 1.0, + "l": 7.795 + }, + "C1": { + "c": 1e-12, + "w": 22.365, + "l": 22.365, + "model": "cap_mim_2f0fF" + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 1.32, + "CL": 1e-12, + "inv_input": "VIN1", + "vout_target": 1.65 + }, + "category": "twostage", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "70a5e2c282688cde", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8", + "R1", + "C1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1_sL1.5/manifest.json new file mode 100644 index 00000000..74c2e643 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "6ada1e8f5a862f6154446353e9f83c413fb0073f0bdbe11f03fe6917530c968b", + "qualification.json": "3145b2c89abf376c7361dffc91ee899bec2aa29c57e601c17f670f4da229af01", + "specs.json": "aeb1b518ee25b62cf829db831ef0a8dc3c504fbda21054fc065f67d91357d9ed", + "target.spice": "267cba317352fe970b70da7a9d6cc261eb1c52b46b60ee31d6b48621bbe74ab0", + "target_lvs.spice": "55970a8f472be56868bd7cb63c4dc5acecd388ed9eebf6203861910d1b51c698", + "testbench.spice": "3b05d7ef100c6ef1e3c9e1aaec6e71da9b48ac99cbfad63ef990d2783342205c" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1_sL1.5/qualification.json new file mode 100644 index 00000000..b1186cb0 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1_sL1.5/qualification.json @@ -0,0 +1,165 @@ +{ + "case_id": "C11_gf180_sW1_sL1.5", + "circuit_id": "C11", + "pdk": "gf180", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "twostage", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "70a5e2c282688cde", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 75.59 + }, + "ugf": { + "min": 6033000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 78.59393, + "ugf": 10055800.0, + "pm": 60.540797 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.3, + "schematic_measures": { + "vout0": 1.65, + "idd": 9.683367e-05, + "vos": 0.0001905323, + "gain_lf": 78.59393, + "ph_lf": 3.096203, + "ugf": 10055800.0, + "ph_ugf": -116.363, + "f3db": 13.43361, + "pm": 60.540797 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1_sL1.5/specs.json new file mode 100644 index 00000000..a6bbd4bb --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1_sL1.5/specs.json @@ -0,0 +1,30 @@ +{ + "gain_lf": { + "min": 75.59 + }, + "ugf": { + "min": 6033000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 78.59393, + "ugf": 10055800.0, + "pm": 60.540797 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1_sL1.5/target.spice new file mode 100644 index 00000000..a31e8d2b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1_sL1.5/target.spice @@ -0,0 +1,12 @@ +.subckt C11_gf180_sW1_sL1.5 VDD VSS VIN1 VIN2 VOUT1 IB1 +MM1 IB1 IB1 VDD VDD pfet_03v3 w=2u l=0.84u nf=4 m=1 +MM2 net97 IB1 VDD VDD pfet_03v3 w=4u l=0.84u nf=8 m=1 +MM3 net014 VIN1 net97 VDD pfet_03v3 w=4u l=0.84u nf=8 m=1 +MM4 net016 VIN2 net97 VDD pfet_03v3 w=4u l=0.84u nf=8 m=1 +MM5 net014 net014 VSS VSS nfet_03v3 w=2u l=0.84u nf=4 m=1 +MM6 net016 net014 VSS VSS nfet_03v3 w=2u l=0.84u nf=4 m=1 +MM7 VOUT1 IB1 VDD VDD pfet_03v3 w=4u l=0.84u nf=8 m=1 +MM8 VOUT1 net016 VSS VSS nfet_03v3 w=4u l=0.84u nf=8 m=1 +XRR1 net016 net022 VSS ppolyf_u r_width=1u r_length=7.795u +XCC1 net022 VOUT1 cap_mim_2f0fF c_width=22.365u c_length=22.365u +.ends C11_gf180_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1_sL1.5/target_lvs.spice new file mode 100644 index 00000000..0c85c4da --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1_sL1.5/target_lvs.spice @@ -0,0 +1,56 @@ +.subckt C11_gf180_sW1_sL1.5 VDD VSS VIN1 VIN2 VOUT1 IB1 +MM1_f0 IB1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM1_f1 IB1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM1_f2 IB1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM1_f3 IB1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f0 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f1 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f2 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f3 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f4 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f5 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f6 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f7 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM3_f0 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=0.84u +MM3_f1 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=0.84u +MM3_f2 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=0.84u +MM3_f3 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=0.84u +MM3_f4 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=0.84u +MM3_f5 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=0.84u +MM3_f6 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=0.84u +MM3_f7 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f0 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f1 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f2 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f3 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f4 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f5 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f6 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f7 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=0.84u +MM5_f0 net014 net014 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM5_f1 net014 net014 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM5_f2 net014 net014 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM5_f3 net014 net014 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM6_f0 net016 net014 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM6_f1 net016 net014 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM6_f2 net016 net014 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM6_f3 net016 net014 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM7_f0 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM7_f1 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM7_f2 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM7_f3 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM7_f4 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM7_f5 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM7_f6 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM7_f7 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM8_f0 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM8_f1 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM8_f2 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM8_f3 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM8_f4 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM8_f5 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM8_f6 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM8_f7 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=0.84u +RR1 net016 net022 VSS ppolyf_u L=7.795u W=1u +CC1 net022 VOUT1 cap_mim_2f0_m4m5_noshield W=22.365u L=22.365u +.ends C11_gf180_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1_sL1.5/testbench.spice new file mode 100644 index 00000000..23b97693 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1_sL1.5/testbench.spice @@ -0,0 +1,37 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 IB1 C11_gf180_sW1_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIB1 IB1 VSS 2e-05 +.nodeset v(IB1)=2.31 + +VCM VCM 0 1.32 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 1.65 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN1 VCM VINT 0 1 +EIN VIN2 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN1) - v(VIN2) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1_sL1/case.json new file mode 100644 index 00000000..f2202119 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1_sL1/case.json @@ -0,0 +1,230 @@ +{ + "case_id": "C11_gf180_sW1_sL1", + "circuit_id": "C11", + "pdk": "gf180", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "dut_name": "C11_gf180_sW1_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "IB1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.56, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "M4": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "M5": { + "w": 2.0, + "l": 0.56, + "nf": 4 + }, + "M6": { + "w": 2.0, + "l": 0.56, + "nf": 4 + }, + "M7": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "M8": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "R1": { + "r": 3000.0, + "body": "VSS", + "w": 1.0, + "l": 7.795 + }, + "C1": { + "c": 1e-12, + "w": 22.365, + "l": 22.365, + "model": "cap_mim_2f0fF" + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 1.32, + "CL": 1e-12, + "inv_input": "VIN1", + "vout_target": 1.65 + }, + "category": "twostage", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "8b4b65717367801b", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8", + "R1", + "C1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1_sL1/manifest.json new file mode 100644 index 00000000..3f6c0189 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "f00c153d993550ab6e2f5944d72334de508ddd23718d9dfc3ed595940314d3dd", + "qualification.json": "c85ee2b8f3aced5c06fe724c1d3b5eeabb9595283e6c72fe74326772e7bf9f92", + "specs.json": "1eb582e201079d2b094d4b24c5d68f5245a4659b8cd091862be61e357efdf29e", + "target.spice": "751ac652330c12dabd718b14217431ed58b6e278241c72a64ae4eeb8efa881cb", + "target_lvs.spice": "4ab49ff7ffce578df04db695e1845f613197211d20b5e2890c48f9ba87c09248", + "testbench.spice": "7024c7f939214aa9eb0dddabfd191033fc0b808e6062c40176e936df1c1321f3" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1_sL1/qualification.json new file mode 100644 index 00000000..7ba830c3 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1_sL1/qualification.json @@ -0,0 +1,165 @@ +{ + "case_id": "C11_gf180_sW1_sL1", + "circuit_id": "C11", + "pdk": "gf180", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "twostage", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "8b4b65717367801b", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 70.18 + }, + "ugf": { + "min": 7692000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 73.18377, + "ugf": 12819770.0, + "pm": 63.88807100000001 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.2, + "schematic_measures": { + "vout0": 1.65, + "idd": 9.862901e-05, + "vos": 6.958778e-05, + "gain_lf": 73.18377, + "ph_lf": 2.213129, + "ugf": 12819770.0, + "ph_ugf": -113.8988, + "f3db": 2946.208, + "pm": 63.88807100000001 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1_sL1/specs.json new file mode 100644 index 00000000..989e52a2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1_sL1/specs.json @@ -0,0 +1,30 @@ +{ + "gain_lf": { + "min": 70.18 + }, + "ugf": { + "min": 7692000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 73.18377, + "ugf": 12819770.0, + "pm": 63.88807100000001 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1_sL1/target.spice new file mode 100644 index 00000000..a1b04f8b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1_sL1/target.spice @@ -0,0 +1,12 @@ +.subckt C11_gf180_sW1_sL1 VDD VSS VIN1 VIN2 VOUT1 IB1 +MM1 IB1 IB1 VDD VDD pfet_03v3 w=2u l=0.56u nf=4 m=1 +MM2 net97 IB1 VDD VDD pfet_03v3 w=4u l=0.56u nf=8 m=1 +MM3 net014 VIN1 net97 VDD pfet_03v3 w=4u l=0.56u nf=8 m=1 +MM4 net016 VIN2 net97 VDD pfet_03v3 w=4u l=0.56u nf=8 m=1 +MM5 net014 net014 VSS VSS nfet_03v3 w=2u l=0.56u nf=4 m=1 +MM6 net016 net014 VSS VSS nfet_03v3 w=2u l=0.56u nf=4 m=1 +MM7 VOUT1 IB1 VDD VDD pfet_03v3 w=4u l=0.56u nf=8 m=1 +MM8 VOUT1 net016 VSS VSS nfet_03v3 w=4u l=0.56u nf=8 m=1 +XRR1 net016 net022 VSS ppolyf_u r_width=1u r_length=7.795u +XCC1 net022 VOUT1 cap_mim_2f0fF c_width=22.365u c_length=22.365u +.ends C11_gf180_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1_sL1/target_lvs.spice new file mode 100644 index 00000000..a6e21533 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1_sL1/target_lvs.spice @@ -0,0 +1,56 @@ +.subckt C11_gf180_sW1_sL1 VDD VSS VIN1 VIN2 VOUT1 IB1 +MM1_f0 IB1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM1_f1 IB1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM1_f2 IB1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM1_f3 IB1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f0 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f1 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f2 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f3 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f4 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f5 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f6 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f7 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM3_f0 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=0.56u +MM3_f1 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=0.56u +MM3_f2 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=0.56u +MM3_f3 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=0.56u +MM3_f4 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=0.56u +MM3_f5 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=0.56u +MM3_f6 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=0.56u +MM3_f7 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f0 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f1 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f2 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f3 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f4 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f5 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f6 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f7 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=0.56u +MM5_f0 net014 net014 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM5_f1 net014 net014 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM5_f2 net014 net014 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM5_f3 net014 net014 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM6_f0 net016 net014 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM6_f1 net016 net014 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM6_f2 net016 net014 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM6_f3 net016 net014 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM7_f0 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM7_f1 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM7_f2 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM7_f3 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM7_f4 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM7_f5 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM7_f6 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM7_f7 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM8_f0 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM8_f1 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM8_f2 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM8_f3 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM8_f4 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM8_f5 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM8_f6 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM8_f7 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=0.56u +RR1 net016 net022 VSS ppolyf_u L=7.795u W=1u +CC1 net022 VOUT1 cap_mim_2f0_m4m5_noshield W=22.365u L=22.365u +.ends C11_gf180_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1_sL1/testbench.spice new file mode 100644 index 00000000..6b2b79d1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1_sL1/testbench.spice @@ -0,0 +1,37 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 IB1 C11_gf180_sW1_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIB1 IB1 VSS 2e-05 +.nodeset v(IB1)=2.31 + +VCM VCM 0 1.32 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 1.65 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN1 VCM VINT 0 1 +EIN VIN2 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN1) - v(VIN2) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1_sL2/case.json new file mode 100644 index 00000000..9b95d78e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1_sL2/case.json @@ -0,0 +1,230 @@ +{ + "case_id": "C11_gf180_sW1_sL2", + "circuit_id": "C11", + "pdk": "gf180", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "dut_name": "C11_gf180_sW1_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "IB1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 1.12, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 1.12, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 1.12, + "nf": 8 + }, + "M4": { + "w": 4.0, + "l": 1.12, + "nf": 8 + }, + "M5": { + "w": 2.0, + "l": 1.12, + "nf": 4 + }, + "M6": { + "w": 2.0, + "l": 1.12, + "nf": 4 + }, + "M7": { + "w": 4.0, + "l": 1.12, + "nf": 8 + }, + "M8": { + "w": 4.0, + "l": 1.12, + "nf": 8 + }, + "R1": { + "r": 3000.0, + "body": "VSS", + "w": 1.0, + "l": 7.795 + }, + "C1": { + "c": 1e-12, + "w": 22.365, + "l": 22.365, + "model": "cap_mim_2f0fF" + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 1.32, + "CL": 1e-12, + "inv_input": "VIN1", + "vout_target": 1.65 + }, + "category": "twostage", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "7c4a5bbbb66c5162", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8", + "R1", + "C1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1_sL2/manifest.json new file mode 100644 index 00000000..b439f0a9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "ee8a563ac6133b59254ab8ccd3f5e5d53d852b7df47b04a1fb04e25031397f0d", + "qualification.json": "b7b7dd035240321924ed6f7dbf6b32627ffda2d9e4e5ee01a34dc173118b6628", + "specs.json": "5a570e5303d96ab3fb1ef64b097f5e474dfa4d214bc7cb4c51330628d9149fc0", + "target.spice": "d7ad406688e38f6fd77c0498560a44558924b978549de227945b794a1d9dbc9a", + "target_lvs.spice": "9d1710ba9c11a5448a1624a3c496fbed014bd092e828d8ab81bc9f179a5c3359", + "testbench.spice": "c148960d023d12c15716bd64ca45eeefacb48874c70d99953b2e423f882cb9cc" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1_sL2/qualification.json new file mode 100644 index 00000000..5235c360 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1_sL2/qualification.json @@ -0,0 +1,165 @@ +{ + "case_id": "C11_gf180_sW1_sL2", + "circuit_id": "C11", + "pdk": "gf180", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "twostage", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "7c4a5bbbb66c5162", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 78.41 + }, + "ugf": { + "min": 4980000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 81.40751, + "ugf": 8300766.0, + "pm": 60.156407 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.3, + "schematic_measures": { + "vout0": 1.65, + "idd": 9.360237e-05, + "vos": 0.0004053435, + "gain_lf": 81.40751, + "ph_lf": 2.854793, + "ugf": 8300766.0, + "ph_ugf": -116.9888, + "f3db": 18.29642, + "pm": 60.156407 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1_sL2/specs.json new file mode 100644 index 00000000..878a883c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1_sL2/specs.json @@ -0,0 +1,30 @@ +{ + "gain_lf": { + "min": 78.41 + }, + "ugf": { + "min": 4980000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 81.40751, + "ugf": 8300766.0, + "pm": 60.156407 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1_sL2/target.spice new file mode 100644 index 00000000..e4eed142 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1_sL2/target.spice @@ -0,0 +1,12 @@ +.subckt C11_gf180_sW1_sL2 VDD VSS VIN1 VIN2 VOUT1 IB1 +MM1 IB1 IB1 VDD VDD pfet_03v3 w=2u l=1.12u nf=4 m=1 +MM2 net97 IB1 VDD VDD pfet_03v3 w=4u l=1.12u nf=8 m=1 +MM3 net014 VIN1 net97 VDD pfet_03v3 w=4u l=1.12u nf=8 m=1 +MM4 net016 VIN2 net97 VDD pfet_03v3 w=4u l=1.12u nf=8 m=1 +MM5 net014 net014 VSS VSS nfet_03v3 w=2u l=1.12u nf=4 m=1 +MM6 net016 net014 VSS VSS nfet_03v3 w=2u l=1.12u nf=4 m=1 +MM7 VOUT1 IB1 VDD VDD pfet_03v3 w=4u l=1.12u nf=8 m=1 +MM8 VOUT1 net016 VSS VSS nfet_03v3 w=4u l=1.12u nf=8 m=1 +XRR1 net016 net022 VSS ppolyf_u r_width=1u r_length=7.795u +XCC1 net022 VOUT1 cap_mim_2f0fF c_width=22.365u c_length=22.365u +.ends C11_gf180_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1_sL2/target_lvs.spice new file mode 100644 index 00000000..aa8fc8a5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1_sL2/target_lvs.spice @@ -0,0 +1,56 @@ +.subckt C11_gf180_sW1_sL2 VDD VSS VIN1 VIN2 VOUT1 IB1 +MM1_f0 IB1 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM1_f1 IB1 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM1_f2 IB1 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM1_f3 IB1 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f0 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f1 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f2 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f3 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f4 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f5 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f6 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f7 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM3_f0 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=1.12u +MM3_f1 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=1.12u +MM3_f2 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=1.12u +MM3_f3 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=1.12u +MM3_f4 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=1.12u +MM3_f5 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=1.12u +MM3_f6 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=1.12u +MM3_f7 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f0 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f1 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f2 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f3 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f4 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f5 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f6 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f7 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=1.12u +MM5_f0 net014 net014 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM5_f1 net014 net014 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM5_f2 net014 net014 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM5_f3 net014 net014 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM6_f0 net016 net014 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM6_f1 net016 net014 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM6_f2 net016 net014 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM6_f3 net016 net014 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM7_f0 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM7_f1 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM7_f2 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM7_f3 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM7_f4 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM7_f5 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM7_f6 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM7_f7 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM8_f0 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM8_f1 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM8_f2 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM8_f3 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM8_f4 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM8_f5 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM8_f6 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM8_f7 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=1.12u +RR1 net016 net022 VSS ppolyf_u L=7.795u W=1u +CC1 net022 VOUT1 cap_mim_2f0_m4m5_noshield W=22.365u L=22.365u +.ends C11_gf180_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1_sL2/testbench.spice new file mode 100644 index 00000000..6b676b5b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW1_sL2/testbench.spice @@ -0,0 +1,37 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 IB1 C11_gf180_sW1_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIB1 IB1 VSS 2e-05 +.nodeset v(IB1)=2.31 + +VCM VCM 0 1.32 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 1.65 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN1 VCM VINT 0 1 +EIN VIN2 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN1) - v(VIN2) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C11/gf180/sW2_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW2_sL1.5/case.json new file mode 100644 index 00000000..f7521fe8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW2_sL1.5/case.json @@ -0,0 +1,230 @@ +{ + "case_id": "C11_gf180_sW2_sL1.5", + "circuit_id": "C11", + "pdk": "gf180", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "dut_name": "C11_gf180_sW2_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "IB1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.84, + "nf": 8 + }, + "M2": { + "w": 8.0, + "l": 0.84, + "nf": 16 + }, + "M3": { + "w": 8.0, + "l": 0.84, + "nf": 16 + }, + "M4": { + "w": 8.0, + "l": 0.84, + "nf": 16 + }, + "M5": { + "w": 4.0, + "l": 0.84, + "nf": 8 + }, + "M6": { + "w": 4.0, + "l": 0.84, + "nf": 8 + }, + "M7": { + "w": 8.0, + "l": 0.84, + "nf": 16 + }, + "M8": { + "w": 8.0, + "l": 0.84, + "nf": 16 + }, + "R1": { + "r": 3000.0, + "body": "VSS", + "w": 1.0, + "l": 7.795 + }, + "C1": { + "c": 1e-12, + "w": 22.365, + "l": 22.365, + "model": "cap_mim_2f0fF" + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 1.32, + "CL": 1e-12, + "inv_input": "VIN1", + "vout_target": 1.65 + }, + "category": "twostage", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "c8c4c93e8c03f24a", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8", + "R1", + "C1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/gf180/sW2_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW2_sL1.5/manifest.json new file mode 100644 index 00000000..64a588dc --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW2_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "090a94343bb98ab9e6d7ccf6ff90792e0a8688fb29a70f50e3966c690bf7f800", + "qualification.json": "0654fbe7d9d4b39d775c5c23cdd56726fee4adaa986a92473d0eadd720e5e9d9", + "specs.json": "b88575f9c00ee52528d90ba71b385e032a241c753b46d989934215e745aa4fa4", + "target.spice": "ef2ecef0716d265b1724302c21b8ca22c097835bd43f461aff2e7ae5c7c6ec52", + "target_lvs.spice": "21c9606b8503c3a558fa8ca0288f8e343fc32d6b189bbdb9ac4b33cafbca0627", + "testbench.spice": "63b94310f53d66bfaa7589ce3cdabe485ed9ab35d3ad5bb035f797ede6fb49cc" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/gf180/sW2_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW2_sL1.5/qualification.json new file mode 100644 index 00000000..3e877c1f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW2_sL1.5/qualification.json @@ -0,0 +1,165 @@ +{ + "case_id": "C11_gf180_sW2_sL1.5", + "circuit_id": "C11", + "pdk": "gf180", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "twostage", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "c8c4c93e8c03f24a", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 80.03 + }, + "ugf": { + "min": 8890000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 83.02858, + "ugf": 14815990.0, + "pm": 58.66306 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.3, + "schematic_measures": { + "vout0": 1.65, + "idd": 9.933259e-05, + "vos": 1.36988e-05, + "gain_lf": 83.02858, + "ph_lf": 7.74254, + "ugf": 14815990.0, + "ph_ugf": -113.5944, + "f3db": 22.00551, + "pm": 58.66306 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/gf180/sW2_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW2_sL1.5/specs.json new file mode 100644 index 00000000..05470585 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW2_sL1.5/specs.json @@ -0,0 +1,30 @@ +{ + "gain_lf": { + "min": 80.03 + }, + "ugf": { + "min": 8890000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 83.02858, + "ugf": 14815990.0, + "pm": 58.66306 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/gf180/sW2_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW2_sL1.5/target.spice new file mode 100644 index 00000000..80b8c5aa --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW2_sL1.5/target.spice @@ -0,0 +1,12 @@ +.subckt C11_gf180_sW2_sL1.5 VDD VSS VIN1 VIN2 VOUT1 IB1 +MM1 IB1 IB1 VDD VDD pfet_03v3 w=4u l=0.84u nf=8 m=1 +MM2 net97 IB1 VDD VDD pfet_03v3 w=8u l=0.84u nf=16 m=1 +MM3 net014 VIN1 net97 VDD pfet_03v3 w=8u l=0.84u nf=16 m=1 +MM4 net016 VIN2 net97 VDD pfet_03v3 w=8u l=0.84u nf=16 m=1 +MM5 net014 net014 VSS VSS nfet_03v3 w=4u l=0.84u nf=8 m=1 +MM6 net016 net014 VSS VSS nfet_03v3 w=4u l=0.84u nf=8 m=1 +MM7 VOUT1 IB1 VDD VDD pfet_03v3 w=8u l=0.84u nf=16 m=1 +MM8 VOUT1 net016 VSS VSS nfet_03v3 w=8u l=0.84u nf=16 m=1 +XRR1 net016 net022 VSS ppolyf_u r_width=1u r_length=7.795u +XCC1 net022 VOUT1 cap_mim_2f0fF c_width=22.365u c_length=22.365u +.ends C11_gf180_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C11/gf180/sW2_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW2_sL1.5/target_lvs.spice new file mode 100644 index 00000000..54a4236a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW2_sL1.5/target_lvs.spice @@ -0,0 +1,108 @@ +.subckt C11_gf180_sW2_sL1.5 VDD VSS VIN1 VIN2 VOUT1 IB1 +MM1_f0 IB1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM1_f1 IB1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM1_f2 IB1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM1_f3 IB1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM1_f4 IB1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM1_f5 IB1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM1_f6 IB1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM1_f7 IB1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f0 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f1 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f2 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f3 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f4 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f5 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f6 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f7 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f8 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f9 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f10 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f11 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f12 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f13 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f14 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f15 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM3_f0 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=0.84u +MM3_f1 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=0.84u +MM3_f2 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=0.84u +MM3_f3 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=0.84u +MM3_f4 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=0.84u +MM3_f5 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=0.84u +MM3_f6 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=0.84u +MM3_f7 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=0.84u +MM3_f8 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=0.84u +MM3_f9 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=0.84u +MM3_f10 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=0.84u +MM3_f11 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=0.84u +MM3_f12 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=0.84u +MM3_f13 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=0.84u +MM3_f14 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=0.84u +MM3_f15 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f0 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f1 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f2 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f3 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f4 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f5 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f6 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f7 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f8 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f9 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f10 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f11 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f12 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f13 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f14 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f15 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=0.84u +MM5_f0 net014 net014 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM5_f1 net014 net014 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM5_f2 net014 net014 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM5_f3 net014 net014 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM5_f4 net014 net014 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM5_f5 net014 net014 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM5_f6 net014 net014 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM5_f7 net014 net014 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM6_f0 net016 net014 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM6_f1 net016 net014 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM6_f2 net016 net014 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM6_f3 net016 net014 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM6_f4 net016 net014 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM6_f5 net016 net014 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM6_f6 net016 net014 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM6_f7 net016 net014 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM7_f0 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM7_f1 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM7_f2 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM7_f3 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM7_f4 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM7_f5 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM7_f6 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM7_f7 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM7_f8 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM7_f9 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM7_f10 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM7_f11 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM7_f12 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM7_f13 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM7_f14 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM7_f15 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM8_f0 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM8_f1 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM8_f2 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM8_f3 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM8_f4 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM8_f5 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM8_f6 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM8_f7 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM8_f8 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM8_f9 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM8_f10 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM8_f11 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM8_f12 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM8_f13 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM8_f14 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM8_f15 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=0.84u +RR1 net016 net022 VSS ppolyf_u L=7.795u W=1u +CC1 net022 VOUT1 cap_mim_2f0_m4m5_noshield W=22.365u L=22.365u +.ends C11_gf180_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C11/gf180/sW2_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW2_sL1.5/testbench.spice new file mode 100644 index 00000000..2839f924 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW2_sL1.5/testbench.spice @@ -0,0 +1,37 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 IB1 C11_gf180_sW2_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIB1 IB1 VSS 2e-05 +.nodeset v(IB1)=2.31 + +VCM VCM 0 1.32 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 1.65 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN1 VCM VINT 0 1 +EIN VIN2 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN1) - v(VIN2) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C11/gf180/sW2_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW2_sL1/case.json new file mode 100644 index 00000000..8279a6f3 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW2_sL1/case.json @@ -0,0 +1,230 @@ +{ + "case_id": "C11_gf180_sW2_sL1", + "circuit_id": "C11", + "pdk": "gf180", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "dut_name": "C11_gf180_sW2_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "IB1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "M2": { + "w": 8.0, + "l": 0.56, + "nf": 16 + }, + "M3": { + "w": 8.0, + "l": 0.56, + "nf": 16 + }, + "M4": { + "w": 8.0, + "l": 0.56, + "nf": 16 + }, + "M5": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "M6": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "M7": { + "w": 8.0, + "l": 0.56, + "nf": 16 + }, + "M8": { + "w": 8.0, + "l": 0.56, + "nf": 16 + }, + "R1": { + "r": 3000.0, + "body": "VSS", + "w": 1.0, + "l": 7.795 + }, + "C1": { + "c": 1e-12, + "w": 22.365, + "l": 22.365, + "model": "cap_mim_2f0fF" + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 1.32, + "CL": 1e-12, + "inv_input": "VIN1", + "vout_target": 1.65 + }, + "category": "twostage", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "c1b2b26fcf3b72e6", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8", + "R1", + "C1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/gf180/sW2_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW2_sL1/manifest.json new file mode 100644 index 00000000..da176c58 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW2_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "108dc5de7ce60acd3882197c9535692253fe90b817d264bbb43565094f1cc6dd", + "qualification.json": "90dc561a948f7fc274d593afa573ee07bd40986959f97aa8670bc7fb2c53fc53", + "specs.json": "e8c5d67222c6cfaf2aaa32bc225f8a24a6e6af9a40a2631dbc3547f57b8645a2", + "target.spice": "a041eb6b9a9c6e0796fa480af418339e8255639f0e6794e9cb231578bc22b74c", + "target_lvs.spice": "d64984de073eb31c73b4ce11f6460215b5370ad419c38d58e3a06c7aa2fce51a", + "testbench.spice": "89862bcc88f8db0d61bda33203c817911d5ad7c923a5f33af06c1c6323c46a92" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/gf180/sW2_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW2_sL1/qualification.json new file mode 100644 index 00000000..010c4025 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW2_sL1/qualification.json @@ -0,0 +1,165 @@ +{ + "case_id": "C11_gf180_sW2_sL1", + "circuit_id": "C11", + "pdk": "gf180", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "twostage", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "c1b2b26fcf3b72e6", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 74.19 + }, + "ugf": { + "min": 11160000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 77.19261, + "ugf": 18596840.0, + "pm": 65.895181 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.5, + "schematic_measures": { + "vout0": 1.65, + "idd": 9.97155e-05, + "vos": -4.51224e-06, + "gain_lf": 77.19261, + "ph_lf": 4.491219, + "ugf": 18596840.0, + "ph_ugf": -109.6136, + "f3db": 11.48645, + "pm": 65.895181 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/gf180/sW2_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW2_sL1/specs.json new file mode 100644 index 00000000..67cb90f1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW2_sL1/specs.json @@ -0,0 +1,30 @@ +{ + "gain_lf": { + "min": 74.19 + }, + "ugf": { + "min": 11160000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 77.19261, + "ugf": 18596840.0, + "pm": 65.895181 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/gf180/sW2_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW2_sL1/target.spice new file mode 100644 index 00000000..9dc8f89f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW2_sL1/target.spice @@ -0,0 +1,12 @@ +.subckt C11_gf180_sW2_sL1 VDD VSS VIN1 VIN2 VOUT1 IB1 +MM1 IB1 IB1 VDD VDD pfet_03v3 w=4u l=0.56u nf=8 m=1 +MM2 net97 IB1 VDD VDD pfet_03v3 w=8u l=0.56u nf=16 m=1 +MM3 net014 VIN1 net97 VDD pfet_03v3 w=8u l=0.56u nf=16 m=1 +MM4 net016 VIN2 net97 VDD pfet_03v3 w=8u l=0.56u nf=16 m=1 +MM5 net014 net014 VSS VSS nfet_03v3 w=4u l=0.56u nf=8 m=1 +MM6 net016 net014 VSS VSS nfet_03v3 w=4u l=0.56u nf=8 m=1 +MM7 VOUT1 IB1 VDD VDD pfet_03v3 w=8u l=0.56u nf=16 m=1 +MM8 VOUT1 net016 VSS VSS nfet_03v3 w=8u l=0.56u nf=16 m=1 +XRR1 net016 net022 VSS ppolyf_u r_width=1u r_length=7.795u +XCC1 net022 VOUT1 cap_mim_2f0fF c_width=22.365u c_length=22.365u +.ends C11_gf180_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C11/gf180/sW2_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW2_sL1/target_lvs.spice new file mode 100644 index 00000000..8422330a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW2_sL1/target_lvs.spice @@ -0,0 +1,108 @@ +.subckt C11_gf180_sW2_sL1 VDD VSS VIN1 VIN2 VOUT1 IB1 +MM1_f0 IB1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM1_f1 IB1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM1_f2 IB1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM1_f3 IB1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM1_f4 IB1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM1_f5 IB1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM1_f6 IB1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM1_f7 IB1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f0 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f1 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f2 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f3 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f4 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f5 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f6 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f7 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f8 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f9 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f10 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f11 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f12 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f13 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f14 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f15 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM3_f0 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=0.56u +MM3_f1 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=0.56u +MM3_f2 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=0.56u +MM3_f3 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=0.56u +MM3_f4 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=0.56u +MM3_f5 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=0.56u +MM3_f6 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=0.56u +MM3_f7 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=0.56u +MM3_f8 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=0.56u +MM3_f9 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=0.56u +MM3_f10 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=0.56u +MM3_f11 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=0.56u +MM3_f12 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=0.56u +MM3_f13 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=0.56u +MM3_f14 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=0.56u +MM3_f15 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f0 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f1 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f2 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f3 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f4 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f5 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f6 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f7 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f8 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f9 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f10 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f11 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f12 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f13 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f14 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f15 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=0.56u +MM5_f0 net014 net014 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM5_f1 net014 net014 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM5_f2 net014 net014 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM5_f3 net014 net014 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM5_f4 net014 net014 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM5_f5 net014 net014 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM5_f6 net014 net014 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM5_f7 net014 net014 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM6_f0 net016 net014 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM6_f1 net016 net014 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM6_f2 net016 net014 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM6_f3 net016 net014 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM6_f4 net016 net014 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM6_f5 net016 net014 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM6_f6 net016 net014 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM6_f7 net016 net014 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM7_f0 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM7_f1 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM7_f2 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM7_f3 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM7_f4 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM7_f5 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM7_f6 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM7_f7 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM7_f8 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM7_f9 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM7_f10 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM7_f11 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM7_f12 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM7_f13 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM7_f14 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM7_f15 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM8_f0 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM8_f1 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM8_f2 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM8_f3 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM8_f4 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM8_f5 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM8_f6 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM8_f7 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM8_f8 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM8_f9 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM8_f10 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM8_f11 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM8_f12 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM8_f13 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM8_f14 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM8_f15 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=0.56u +RR1 net016 net022 VSS ppolyf_u L=7.795u W=1u +CC1 net022 VOUT1 cap_mim_2f0_m4m5_noshield W=22.365u L=22.365u +.ends C11_gf180_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C11/gf180/sW2_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW2_sL1/testbench.spice new file mode 100644 index 00000000..83549c6a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW2_sL1/testbench.spice @@ -0,0 +1,37 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 IB1 C11_gf180_sW2_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIB1 IB1 VSS 2e-05 +.nodeset v(IB1)=2.31 + +VCM VCM 0 1.32 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 1.65 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN1 VCM VINT 0 1 +EIN VIN2 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN1) - v(VIN2) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C11/gf180/sW2_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW2_sL2/case.json new file mode 100644 index 00000000..2b1cd507 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW2_sL2/case.json @@ -0,0 +1,230 @@ +{ + "case_id": "C11_gf180_sW2_sL2", + "circuit_id": "C11", + "pdk": "gf180", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "dut_name": "C11_gf180_sW2_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "IB1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 1.12, + "nf": 8 + }, + "M2": { + "w": 8.0, + "l": 1.12, + "nf": 16 + }, + "M3": { + "w": 8.0, + "l": 1.12, + "nf": 16 + }, + "M4": { + "w": 8.0, + "l": 1.12, + "nf": 16 + }, + "M5": { + "w": 4.0, + "l": 1.12, + "nf": 8 + }, + "M6": { + "w": 4.0, + "l": 1.12, + "nf": 8 + }, + "M7": { + "w": 8.0, + "l": 1.12, + "nf": 16 + }, + "M8": { + "w": 8.0, + "l": 1.12, + "nf": 16 + }, + "R1": { + "r": 3000.0, + "body": "VSS", + "w": 1.0, + "l": 7.795 + }, + "C1": { + "c": 1e-12, + "w": 22.365, + "l": 22.365, + "model": "cap_mim_2f0fF" + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 1.32, + "CL": 1e-12, + "inv_input": "VIN1", + "vout_target": 1.65 + }, + "category": "twostage", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "f8af15a1bc1ae4d7", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8", + "R1", + "C1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/gf180/sW2_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW2_sL2/manifest.json new file mode 100644 index 00000000..81831579 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW2_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "cd8d54f85e430cc16fc443acb2c3ce571314ab31018762e850f0cabd1360ceda", + "qualification.json": "b6624f81ab6544aef9c5d9a5634370321039f50da5f79a0ffdbee01a733e37b8", + "specs.json": "2783337f98354b6977ed00f087622d98c7fd7a516f03bbcba43479ac8161d01b", + "target.spice": "c7033999cbe2416eb32cde66e1755bf1330d6b47aed8da27e437e87d8b510d32", + "target_lvs.spice": "c49a6a2c371334b95bb217a54e18614141cfa18fbf68b4bec16bef1cd39a973a", + "testbench.spice": "865460d1d9c7a2476b5bf01f766e80e9da4557bb4cd3a0f4571ef0b7881501ac" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/gf180/sW2_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW2_sL2/qualification.json new file mode 100644 index 00000000..ef9d3e75 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW2_sL2/qualification.json @@ -0,0 +1,165 @@ +{ + "case_id": "C11_gf180_sW2_sL2", + "circuit_id": "C11", + "pdk": "gf180", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "twostage", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "f8af15a1bc1ae4d7", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 82.63 + }, + "ugf": { + "min": 7580000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 85.63474, + "ugf": 12633350.0, + "pm": 54.78100499999999 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.6, + "schematic_measures": { + "vout0": 1.65, + "idd": 9.905801e-05, + "vos": 2.397089e-05, + "gain_lf": 85.63474, + "ph_lf": 9.230995, + "ugf": 12633350.0, + "ph_ugf": -115.988, + "f3db": 29.00301, + "pm": 54.78100499999999 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/gf180/sW2_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW2_sL2/specs.json new file mode 100644 index 00000000..774248ce --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW2_sL2/specs.json @@ -0,0 +1,30 @@ +{ + "gain_lf": { + "min": 82.63 + }, + "ugf": { + "min": 7580000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 85.63474, + "ugf": 12633350.0, + "pm": 54.78100499999999 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/gf180/sW2_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW2_sL2/target.spice new file mode 100644 index 00000000..895d61ae --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW2_sL2/target.spice @@ -0,0 +1,12 @@ +.subckt C11_gf180_sW2_sL2 VDD VSS VIN1 VIN2 VOUT1 IB1 +MM1 IB1 IB1 VDD VDD pfet_03v3 w=4u l=1.12u nf=8 m=1 +MM2 net97 IB1 VDD VDD pfet_03v3 w=8u l=1.12u nf=16 m=1 +MM3 net014 VIN1 net97 VDD pfet_03v3 w=8u l=1.12u nf=16 m=1 +MM4 net016 VIN2 net97 VDD pfet_03v3 w=8u l=1.12u nf=16 m=1 +MM5 net014 net014 VSS VSS nfet_03v3 w=4u l=1.12u nf=8 m=1 +MM6 net016 net014 VSS VSS nfet_03v3 w=4u l=1.12u nf=8 m=1 +MM7 VOUT1 IB1 VDD VDD pfet_03v3 w=8u l=1.12u nf=16 m=1 +MM8 VOUT1 net016 VSS VSS nfet_03v3 w=8u l=1.12u nf=16 m=1 +XRR1 net016 net022 VSS ppolyf_u r_width=1u r_length=7.795u +XCC1 net022 VOUT1 cap_mim_2f0fF c_width=22.365u c_length=22.365u +.ends C11_gf180_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C11/gf180/sW2_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW2_sL2/target_lvs.spice new file mode 100644 index 00000000..3969029b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW2_sL2/target_lvs.spice @@ -0,0 +1,108 @@ +.subckt C11_gf180_sW2_sL2 VDD VSS VIN1 VIN2 VOUT1 IB1 +MM1_f0 IB1 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM1_f1 IB1 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM1_f2 IB1 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM1_f3 IB1 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM1_f4 IB1 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM1_f5 IB1 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM1_f6 IB1 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM1_f7 IB1 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f0 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f1 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f2 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f3 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f4 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f5 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f6 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f7 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f8 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f9 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f10 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f11 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f12 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f13 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f14 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f15 net97 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM3_f0 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=1.12u +MM3_f1 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=1.12u +MM3_f2 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=1.12u +MM3_f3 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=1.12u +MM3_f4 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=1.12u +MM3_f5 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=1.12u +MM3_f6 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=1.12u +MM3_f7 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=1.12u +MM3_f8 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=1.12u +MM3_f9 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=1.12u +MM3_f10 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=1.12u +MM3_f11 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=1.12u +MM3_f12 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=1.12u +MM3_f13 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=1.12u +MM3_f14 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=1.12u +MM3_f15 net014 VIN1 net97 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f0 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f1 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f2 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f3 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f4 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f5 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f6 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f7 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f8 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f9 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f10 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f11 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f12 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f13 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f14 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f15 net016 VIN2 net97 VDD pfet_03v3 w=0.5u l=1.12u +MM5_f0 net014 net014 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM5_f1 net014 net014 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM5_f2 net014 net014 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM5_f3 net014 net014 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM5_f4 net014 net014 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM5_f5 net014 net014 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM5_f6 net014 net014 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM5_f7 net014 net014 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM6_f0 net016 net014 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM6_f1 net016 net014 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM6_f2 net016 net014 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM6_f3 net016 net014 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM6_f4 net016 net014 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM6_f5 net016 net014 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM6_f6 net016 net014 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM6_f7 net016 net014 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM7_f0 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM7_f1 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM7_f2 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM7_f3 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM7_f4 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM7_f5 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM7_f6 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM7_f7 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM7_f8 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM7_f9 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM7_f10 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM7_f11 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM7_f12 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM7_f13 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM7_f14 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM7_f15 VOUT1 IB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM8_f0 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM8_f1 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM8_f2 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM8_f3 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM8_f4 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM8_f5 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM8_f6 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM8_f7 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM8_f8 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM8_f9 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM8_f10 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM8_f11 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM8_f12 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM8_f13 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM8_f14 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM8_f15 VOUT1 net016 VSS VSS nfet_03v3 w=0.5u l=1.12u +RR1 net016 net022 VSS ppolyf_u L=7.795u W=1u +CC1 net022 VOUT1 cap_mim_2f0_m4m5_noshield W=22.365u L=22.365u +.ends C11_gf180_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C11/gf180/sW2_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW2_sL2/testbench.spice new file mode 100644 index 00000000..a93083a2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/gf180/sW2_sL2/testbench.spice @@ -0,0 +1,37 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 IB1 C11_gf180_sW2_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIB1 IB1 VSS 2e-05 +.nodeset v(IB1)=2.31 + +VCM VCM 0 1.32 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 1.65 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN1 VCM VINT 0 1 +EIN VIN2 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN1) - v(VIN2) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW0.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW0.5_sL1.5/case.json new file mode 100644 index 00000000..22146b16 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW0.5_sL1.5/case.json @@ -0,0 +1,230 @@ +{ + "case_id": "C11_ihp130_sW0.5_sL1.5", + "circuit_id": "C11", + "pdk": "ihp130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "dut_name": "C11_ihp130_sW0.5_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "IB1" + ], + "sizing": { + "M1": { + "w": 1.0, + "l": 0.39, + "nf": 2 + }, + "M2": { + "w": 2.0, + "l": 0.39, + "nf": 4 + }, + "M3": { + "w": 2.0, + "l": 0.39, + "nf": 4 + }, + "M4": { + "w": 2.0, + "l": 0.39, + "nf": 4 + }, + "M5": { + "w": 1.0, + "l": 0.39, + "nf": 2 + }, + "M6": { + "w": 1.0, + "l": 0.39, + "nf": 2 + }, + "M7": { + "w": 2.0, + "l": 0.39, + "nf": 4 + }, + "M8": { + "w": 2.0, + "l": 0.39, + "nf": 4 + }, + "R1": { + "r": 3000.0, + "body": "VSS", + "w": 1.0, + "l": 11.38 + }, + "C1": { + "c": 1e-12, + "w": 25.82, + "l": 25.82, + "model": "cap_cmim" + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 0.48, + "CL": 1e-12, + "inv_input": "VIN1", + "vout_target": 0.6 + }, + "category": "twostage", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.39, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.39, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.39, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "68fe1c7fac0a4350", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8", + "R1", + "C1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW0.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW0.5_sL1.5/manifest.json new file mode 100644 index 00000000..4390d100 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW0.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "5a4951c90d78ce862f841d943fb5d1434818d95a39dd28887bcb825ef4e18385", + "qualification.json": "481719e6132bd06be8e20bd762c26ad03346cb04098ec08570e57a3fab39de6a", + "specs.json": "5c14bd0157a174a23c2fbd8a187b16b9f2d051bcb0a7d10d25507242ec48ed91", + "target.spice": "0182b18c6bc4efb6a092087d87217fa65be7e4548d20d6f2eadeb1ab50ee5d00", + "target_lvs.spice": "3916f326d6ab2576810e0e6ebe7a35387790aa22648594b7d6cfea3cdd281552", + "testbench.spice": "0e7b32afa6c423618cf9280bd8f2021570eb059bbaf990031f7c85ede48044a8" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW0.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW0.5_sL1.5/qualification.json new file mode 100644 index 00000000..6bfbb991 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW0.5_sL1.5/qualification.json @@ -0,0 +1,165 @@ +{ + "case_id": "C11_ihp130_sW0.5_sL1.5", + "circuit_id": "C11", + "pdk": "ihp130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "twostage", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.39, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.39, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.39, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "68fe1c7fac0a4350", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 45.57 + }, + "ugf": { + "min": 7661000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 48.57331, + "ugf": 12767720.0, + "pm": 75.3038516 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.9, + "schematic_measures": { + "vout0": 0.6000004, + "idd": 8.059249e-05, + "vos": 0.004174753, + "gain_lf": 48.57331, + "ph_lf": 0.1230484, + "ugf": 12767720.0, + "ph_ugf": -104.5731, + "f3db": 48756.62, + "pm": 75.3038516 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW0.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW0.5_sL1.5/specs.json new file mode 100644 index 00000000..1b27a952 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW0.5_sL1.5/specs.json @@ -0,0 +1,30 @@ +{ + "gain_lf": { + "min": 45.57 + }, + "ugf": { + "min": 7661000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 48.57331, + "ugf": 12767720.0, + "pm": 75.3038516 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW0.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW0.5_sL1.5/target.spice new file mode 100644 index 00000000..efe86672 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW0.5_sL1.5/target.spice @@ -0,0 +1,12 @@ +.subckt C11_ihp130_sW0.5_sL1.5 VDD VSS VIN1 VIN2 VOUT1 IB1 +XM1 IB1 IB1 VDD VDD sg13_lv_pmos w=1u l=0.39u ng=2 m=1 +XM2 net97 IB1 VDD VDD sg13_lv_pmos w=2u l=0.39u ng=4 m=1 +XM3 net014 VIN1 net97 VDD sg13_lv_pmos w=2u l=0.39u ng=4 m=1 +XM4 net016 VIN2 net97 VDD sg13_lv_pmos w=2u l=0.39u ng=4 m=1 +XM5 net014 net014 VSS VSS sg13_lv_nmos w=1u l=0.39u ng=2 m=1 +XM6 net016 net014 VSS VSS sg13_lv_nmos w=1u l=0.39u ng=2 m=1 +XM7 VOUT1 IB1 VDD VDD sg13_lv_pmos w=2u l=0.39u ng=4 m=1 +XM8 VOUT1 net016 VSS VSS sg13_lv_nmos w=2u l=0.39u ng=4 m=1 +XRR1 net016 net022 rppd w=1u l=11.38u m=1 +XCC1 net022 VOUT1 cap_cmim w=25.82u l=25.82u +.ends C11_ihp130_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW0.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW0.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..fd9b2d9f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW0.5_sL1.5/target_lvs.spice @@ -0,0 +1,30 @@ +.subckt C11_ihp130_sW0.5_sL1.5 VDD VSS VIN1 VIN2 VOUT1 IB1 +XM1_f0 IB1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM1_f1 IB1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f0 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f1 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f2 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f3 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM3_f0 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.39u +XM3_f1 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.39u +XM3_f2 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.39u +XM3_f3 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f0 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f1 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f2 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f3 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f0 net014 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f1 net014 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM6_f0 net016 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM6_f1 net016 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM7_f0 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f1 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f2 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f3 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f0 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM8_f1 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM8_f2 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM8_f3 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XRR1 net016 net022 rppd w=1u l=11.38u m=1 +XCC1 net022 VOUT1 cap_cmim w=25.82u l=25.82u +.ends C11_ihp130_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW0.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW0.5_sL1.5/testbench.spice new file mode 100644 index 00000000..db258f3d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW0.5_sL1.5/testbench.spice @@ -0,0 +1,37 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 IB1 C11_ihp130_sW0.5_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIB1 IB1 VSS 2e-05 +.nodeset v(IB1)=0.84 + +VCM VCM 0 0.48 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 0.6 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN1 VCM VINT 0 1 +EIN VIN2 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN1) - v(VIN2) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW0.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW0.5_sL1/case.json new file mode 100644 index 00000000..8f999308 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW0.5_sL1/case.json @@ -0,0 +1,230 @@ +{ + "case_id": "C11_ihp130_sW0.5_sL1", + "circuit_id": "C11", + "pdk": "ihp130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "dut_name": "C11_ihp130_sW0.5_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "IB1" + ], + "sizing": { + "M1": { + "w": 1.0, + "l": 0.26, + "nf": 2 + }, + "M2": { + "w": 2.0, + "l": 0.26, + "nf": 4 + }, + "M3": { + "w": 2.0, + "l": 0.26, + "nf": 4 + }, + "M4": { + "w": 2.0, + "l": 0.26, + "nf": 4 + }, + "M5": { + "w": 1.0, + "l": 0.26, + "nf": 2 + }, + "M6": { + "w": 1.0, + "l": 0.26, + "nf": 2 + }, + "M7": { + "w": 2.0, + "l": 0.26, + "nf": 4 + }, + "M8": { + "w": 2.0, + "l": 0.26, + "nf": 4 + }, + "R1": { + "r": 3000.0, + "body": "VSS", + "w": 1.0, + "l": 11.38 + }, + "C1": { + "c": 1e-12, + "w": 25.82, + "l": 25.82, + "model": "cap_cmim" + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 0.48, + "CL": 1e-12, + "inv_input": "VIN1", + "vout_target": 0.6 + }, + "category": "twostage", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.26, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.26, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.26, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.26, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.26, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.26, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.26, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.26, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "88ea587afaa71a38", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8", + "R1", + "C1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW0.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW0.5_sL1/manifest.json new file mode 100644 index 00000000..e364d0b9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW0.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "8b0e55f9d5b3a1de4eee040498025ad58058838b30614d1562728990b2194c00", + "qualification.json": "749c48c461ef0c0ebfb80312b5b1236ef41f5fe9c4f1b1fc8b428a61e5ac2999", + "specs.json": "77fadfd97205c8cbda3d0334c65cb053e47de3bba8dfce9f504c93ef3145ab47", + "target.spice": "debef5f378172a1a77757e2a4f662ba42a3e3c9673dc0b3421207a1dfb338b07", + "target_lvs.spice": "e4ad1dd748fbb5da26854447f9721793d98f52970c261f406d4f0fc7ba678a27", + "testbench.spice": "5039ff4eed2f9cd399e4e3bd5ce9b3370a381e5e4df8afd64bf54aca8f6aaf6a" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW0.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW0.5_sL1/qualification.json new file mode 100644 index 00000000..cbbfd9bd --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW0.5_sL1/qualification.json @@ -0,0 +1,165 @@ +{ + "case_id": "C11_ihp130_sW0.5_sL1", + "circuit_id": "C11", + "pdk": "ihp130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "twostage", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.26, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.26, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.26, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.26, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.26, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.26, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.26, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.26, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "88ea587afaa71a38", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 43.16 + }, + "ugf": { + "min": 9294000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 46.16096, + "ugf": 15490510.0, + "pm": 76.337805 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.9, + "schematic_measures": { + "vout0": 0.6000003, + "idd": 8.361483e-05, + "vos": 0.003398534, + "gain_lf": 46.16096, + "ph_lf": 0.108995, + "ugf": 15490510.0, + "ph_ugf": -103.5532, + "f3db": 78375.89, + "pm": 76.337805 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW0.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW0.5_sL1/specs.json new file mode 100644 index 00000000..b958de7b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW0.5_sL1/specs.json @@ -0,0 +1,30 @@ +{ + "gain_lf": { + "min": 43.16 + }, + "ugf": { + "min": 9294000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 46.16096, + "ugf": 15490510.0, + "pm": 76.337805 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW0.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW0.5_sL1/target.spice new file mode 100644 index 00000000..874e4628 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW0.5_sL1/target.spice @@ -0,0 +1,12 @@ +.subckt C11_ihp130_sW0.5_sL1 VDD VSS VIN1 VIN2 VOUT1 IB1 +XM1 IB1 IB1 VDD VDD sg13_lv_pmos w=1u l=0.26u ng=2 m=1 +XM2 net97 IB1 VDD VDD sg13_lv_pmos w=2u l=0.26u ng=4 m=1 +XM3 net014 VIN1 net97 VDD sg13_lv_pmos w=2u l=0.26u ng=4 m=1 +XM4 net016 VIN2 net97 VDD sg13_lv_pmos w=2u l=0.26u ng=4 m=1 +XM5 net014 net014 VSS VSS sg13_lv_nmos w=1u l=0.26u ng=2 m=1 +XM6 net016 net014 VSS VSS sg13_lv_nmos w=1u l=0.26u ng=2 m=1 +XM7 VOUT1 IB1 VDD VDD sg13_lv_pmos w=2u l=0.26u ng=4 m=1 +XM8 VOUT1 net016 VSS VSS sg13_lv_nmos w=2u l=0.26u ng=4 m=1 +XRR1 net016 net022 rppd w=1u l=11.38u m=1 +XCC1 net022 VOUT1 cap_cmim w=25.82u l=25.82u +.ends C11_ihp130_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW0.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW0.5_sL1/target_lvs.spice new file mode 100644 index 00000000..ac78f279 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW0.5_sL1/target_lvs.spice @@ -0,0 +1,30 @@ +.subckt C11_ihp130_sW0.5_sL1 VDD VSS VIN1 VIN2 VOUT1 IB1 +XM1_f0 IB1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM1_f1 IB1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f0 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f1 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f2 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f3 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM3_f0 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.26u +XM3_f1 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.26u +XM3_f2 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.26u +XM3_f3 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f0 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f1 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f2 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f3 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f0 net014 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f1 net014 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM6_f0 net016 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM6_f1 net016 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM7_f0 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f1 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f2 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f3 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f0 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM8_f1 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM8_f2 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM8_f3 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XRR1 net016 net022 rppd w=1u l=11.38u m=1 +XCC1 net022 VOUT1 cap_cmim w=25.82u l=25.82u +.ends C11_ihp130_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW0.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW0.5_sL1/testbench.spice new file mode 100644 index 00000000..cb4bc721 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW0.5_sL1/testbench.spice @@ -0,0 +1,37 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 IB1 C11_ihp130_sW0.5_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIB1 IB1 VSS 2e-05 +.nodeset v(IB1)=0.84 + +VCM VCM 0 0.48 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 0.6 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN1 VCM VINT 0 1 +EIN VIN2 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN1) - v(VIN2) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW0.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW0.5_sL2/case.json new file mode 100644 index 00000000..83c2c88e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW0.5_sL2/case.json @@ -0,0 +1,230 @@ +{ + "case_id": "C11_ihp130_sW0.5_sL2", + "circuit_id": "C11", + "pdk": "ihp130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "dut_name": "C11_ihp130_sW0.5_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "IB1" + ], + "sizing": { + "M1": { + "w": 1.0, + "l": 0.52, + "nf": 2 + }, + "M2": { + "w": 2.0, + "l": 0.52, + "nf": 4 + }, + "M3": { + "w": 2.0, + "l": 0.52, + "nf": 4 + }, + "M4": { + "w": 2.0, + "l": 0.52, + "nf": 4 + }, + "M5": { + "w": 1.0, + "l": 0.52, + "nf": 2 + }, + "M6": { + "w": 1.0, + "l": 0.52, + "nf": 2 + }, + "M7": { + "w": 2.0, + "l": 0.52, + "nf": 4 + }, + "M8": { + "w": 2.0, + "l": 0.52, + "nf": 4 + }, + "R1": { + "r": 3000.0, + "body": "VSS", + "w": 1.0, + "l": 11.38 + }, + "C1": { + "c": 1e-12, + "w": 25.82, + "l": 25.82, + "model": "cap_cmim" + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 0.48, + "CL": 1e-12, + "inv_input": "VIN1", + "vout_target": 0.6 + }, + "category": "twostage", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.52, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.52, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.52, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "412ec07f00f7c402", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8", + "R1", + "C1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW0.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW0.5_sL2/manifest.json new file mode 100644 index 00000000..171efabc --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW0.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "a54d9fee0bca8c0ea07a33ff059aa64ba2ff819983a3e184423dccb480365204", + "qualification.json": "26946ce7fc99a42a4ffda44ca5bf7ec0c470e9405320b51e72d2b6793105d9e6", + "specs.json": "b8f90b714cbfcf7062fae2f2cd42a5d2bdce14bc8070e1b14cee6b6cecb9c630", + "target.spice": "1cbf09f5e4ec278934dbc68e1df021051370de40380489526d0e2d97fc09759f", + "target_lvs.spice": "792d90860bd6047305d1332cd92159ec3680a926f415fcc09d710d022980f508", + "testbench.spice": "e48fc6837286f45397f590fc61923b69fedb800a73b279df2199c8d86ac600f4" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW0.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW0.5_sL2/qualification.json new file mode 100644 index 00000000..fb021a0c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW0.5_sL2/qualification.json @@ -0,0 +1,165 @@ +{ + "case_id": "C11_ihp130_sW0.5_sL2", + "circuit_id": "C11", + "pdk": "ihp130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "twostage", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.52, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.52, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.52, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "412ec07f00f7c402", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 46.82 + }, + "ugf": { + "min": 6467000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 49.81679, + "ugf": 10778910.0, + "pm": 74.81895320000001 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 1.0, + "schematic_measures": { + "vout0": 0.6000005, + "idd": 7.789472e-05, + "vos": 0.005019453, + "gain_lf": 49.81679, + "ph_lf": 0.1165468, + "ugf": 10778910.0, + "ph_ugf": -105.0645, + "f3db": 35507.67, + "pm": 74.81895320000001 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW0.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW0.5_sL2/specs.json new file mode 100644 index 00000000..ab9f0cfc --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW0.5_sL2/specs.json @@ -0,0 +1,30 @@ +{ + "gain_lf": { + "min": 46.82 + }, + "ugf": { + "min": 6467000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 49.81679, + "ugf": 10778910.0, + "pm": 74.81895320000001 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW0.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW0.5_sL2/target.spice new file mode 100644 index 00000000..e3acfb63 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW0.5_sL2/target.spice @@ -0,0 +1,12 @@ +.subckt C11_ihp130_sW0.5_sL2 VDD VSS VIN1 VIN2 VOUT1 IB1 +XM1 IB1 IB1 VDD VDD sg13_lv_pmos w=1u l=0.52u ng=2 m=1 +XM2 net97 IB1 VDD VDD sg13_lv_pmos w=2u l=0.52u ng=4 m=1 +XM3 net014 VIN1 net97 VDD sg13_lv_pmos w=2u l=0.52u ng=4 m=1 +XM4 net016 VIN2 net97 VDD sg13_lv_pmos w=2u l=0.52u ng=4 m=1 +XM5 net014 net014 VSS VSS sg13_lv_nmos w=1u l=0.52u ng=2 m=1 +XM6 net016 net014 VSS VSS sg13_lv_nmos w=1u l=0.52u ng=2 m=1 +XM7 VOUT1 IB1 VDD VDD sg13_lv_pmos w=2u l=0.52u ng=4 m=1 +XM8 VOUT1 net016 VSS VSS sg13_lv_nmos w=2u l=0.52u ng=4 m=1 +XRR1 net016 net022 rppd w=1u l=11.38u m=1 +XCC1 net022 VOUT1 cap_cmim w=25.82u l=25.82u +.ends C11_ihp130_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW0.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW0.5_sL2/target_lvs.spice new file mode 100644 index 00000000..4c3afdf4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW0.5_sL2/target_lvs.spice @@ -0,0 +1,30 @@ +.subckt C11_ihp130_sW0.5_sL2 VDD VSS VIN1 VIN2 VOUT1 IB1 +XM1_f0 IB1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f1 IB1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f0 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f1 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f2 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f3 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM3_f0 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.52u +XM3_f1 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.52u +XM3_f2 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.52u +XM3_f3 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f0 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f1 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f2 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f3 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f0 net014 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f1 net014 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM6_f0 net016 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM6_f1 net016 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM7_f0 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f1 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f2 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f3 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f0 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM8_f1 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM8_f2 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM8_f3 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XRR1 net016 net022 rppd w=1u l=11.38u m=1 +XCC1 net022 VOUT1 cap_cmim w=25.82u l=25.82u +.ends C11_ihp130_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW0.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW0.5_sL2/testbench.spice new file mode 100644 index 00000000..bb214a5a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW0.5_sL2/testbench.spice @@ -0,0 +1,37 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 IB1 C11_ihp130_sW0.5_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIB1 IB1 VSS 2e-05 +.nodeset v(IB1)=0.84 + +VCM VCM 0 0.48 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 0.6 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN1 VCM VINT 0 1 +EIN VIN2 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN1) - v(VIN2) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1.5_sL1.5/case.json new file mode 100644 index 00000000..2284c4c6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1.5_sL1.5/case.json @@ -0,0 +1,230 @@ +{ + "case_id": "C11_ihp130_sW1.5_sL1.5", + "circuit_id": "C11", + "pdk": "ihp130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "dut_name": "C11_ihp130_sW1.5_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "IB1" + ], + "sizing": { + "M1": { + "w": 3.0, + "l": 0.39, + "nf": 6 + }, + "M2": { + "w": 6.0, + "l": 0.39, + "nf": 12 + }, + "M3": { + "w": 6.0, + "l": 0.39, + "nf": 12 + }, + "M4": { + "w": 6.0, + "l": 0.39, + "nf": 12 + }, + "M5": { + "w": 3.0, + "l": 0.39, + "nf": 6 + }, + "M6": { + "w": 3.0, + "l": 0.39, + "nf": 6 + }, + "M7": { + "w": 6.0, + "l": 0.39, + "nf": 12 + }, + "M8": { + "w": 6.0, + "l": 0.39, + "nf": 12 + }, + "R1": { + "r": 3000.0, + "body": "VSS", + "w": 1.0, + "l": 11.38 + }, + "C1": { + "c": 1e-12, + "w": 25.82, + "l": 25.82, + "model": "cap_cmim" + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 0.48, + "CL": 1e-12, + "inv_input": "VIN1", + "vout_target": 0.6 + }, + "category": "twostage", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.39, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.39, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.39, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.39, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.39, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.39, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.39, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.39, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "0ff76684b29ba066", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8", + "R1", + "C1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1.5_sL1.5/manifest.json new file mode 100644 index 00000000..7c34aabd --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "dff7dc06c95f53e6d1ff254eacc0e52d29156b8206751569425f1a09363b2a71", + "qualification.json": "ddec490aaa5475b39134735cf060032eafe690158445bc1fb31ef6044bdc903e", + "specs.json": "464368c88b4c197d3f2ab9e4404e39eb5eb17911aea04cbaba8b04e97521b1ac", + "target.spice": "ab1861a7b54afeca5c8b4c6b8e338824ffdeaee5b406816ae2663c9c742b562a", + "target_lvs.spice": "87b15ae0b741d4324361e64e54d1b148409f6c3e2e82e3f2317d5f1e441aff40", + "testbench.spice": "25e3d8e84e74cff46d3cc7d068459a2ebef2c8ebd36b3eeb2a5e05da8c951951" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1.5_sL1.5/qualification.json new file mode 100644 index 00000000..b878846c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1.5_sL1.5/qualification.json @@ -0,0 +1,165 @@ +{ + "case_id": "C11_ihp130_sW1.5_sL1.5", + "circuit_id": "C11", + "pdk": "ihp130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "twostage", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.39, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.39, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.39, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.39, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.39, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.39, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.39, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.39, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "0ff76684b29ba066", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 47.28 + }, + "ugf": { + "min": 15540000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 50.28308, + "ugf": 25892190.0, + "pm": 79.2430392 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 2.8, + "schematic_measures": { + "vout0": 0.6, + "idd": 9.418466e-05, + "vos": 0.0003122778, + "gain_lf": 50.28308, + "ph_lf": 0.2261608, + "ugf": 25892190.0, + "ph_ugf": -100.5308, + "f3db": 81807.34, + "pm": 79.2430392 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1.5_sL1.5/specs.json new file mode 100644 index 00000000..fbd4c95c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1.5_sL1.5/specs.json @@ -0,0 +1,30 @@ +{ + "gain_lf": { + "min": 47.28 + }, + "ugf": { + "min": 15540000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 50.28308, + "ugf": 25892190.0, + "pm": 79.2430392 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1.5_sL1.5/target.spice new file mode 100644 index 00000000..123f4056 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1.5_sL1.5/target.spice @@ -0,0 +1,12 @@ +.subckt C11_ihp130_sW1.5_sL1.5 VDD VSS VIN1 VIN2 VOUT1 IB1 +XM1 IB1 IB1 VDD VDD sg13_lv_pmos w=3u l=0.39u ng=6 m=1 +XM2 net97 IB1 VDD VDD sg13_lv_pmos w=6u l=0.39u ng=12 m=1 +XM3 net014 VIN1 net97 VDD sg13_lv_pmos w=6u l=0.39u ng=12 m=1 +XM4 net016 VIN2 net97 VDD sg13_lv_pmos w=6u l=0.39u ng=12 m=1 +XM5 net014 net014 VSS VSS sg13_lv_nmos w=3u l=0.39u ng=6 m=1 +XM6 net016 net014 VSS VSS sg13_lv_nmos w=3u l=0.39u ng=6 m=1 +XM7 VOUT1 IB1 VDD VDD sg13_lv_pmos w=6u l=0.39u ng=12 m=1 +XM8 VOUT1 net016 VSS VSS sg13_lv_nmos w=6u l=0.39u ng=12 m=1 +XRR1 net016 net022 rppd w=1u l=11.38u m=1 +XCC1 net022 VOUT1 cap_cmim w=25.82u l=25.82u +.ends C11_ihp130_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..bebf223a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1.5_sL1.5/target_lvs.spice @@ -0,0 +1,82 @@ +.subckt C11_ihp130_sW1.5_sL1.5 VDD VSS VIN1 VIN2 VOUT1 IB1 +XM1_f0 IB1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM1_f1 IB1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM1_f2 IB1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM1_f3 IB1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM1_f4 IB1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM1_f5 IB1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f0 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f1 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f2 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f3 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f4 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f5 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f6 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f7 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f8 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f9 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f10 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f11 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM3_f0 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.39u +XM3_f1 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.39u +XM3_f2 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.39u +XM3_f3 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.39u +XM3_f4 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.39u +XM3_f5 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.39u +XM3_f6 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.39u +XM3_f7 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.39u +XM3_f8 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.39u +XM3_f9 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.39u +XM3_f10 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.39u +XM3_f11 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f0 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f1 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f2 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f3 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f4 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f5 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f6 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f7 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f8 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f9 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f10 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f11 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f0 net014 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f1 net014 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f2 net014 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f3 net014 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f4 net014 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f5 net014 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM6_f0 net016 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM6_f1 net016 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM6_f2 net016 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM6_f3 net016 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM6_f4 net016 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM6_f5 net016 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM7_f0 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f1 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f2 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f3 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f4 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f5 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f6 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f7 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f8 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f9 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f10 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f11 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f0 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM8_f1 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM8_f2 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM8_f3 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM8_f4 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM8_f5 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM8_f6 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM8_f7 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM8_f8 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM8_f9 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM8_f10 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM8_f11 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XRR1 net016 net022 rppd w=1u l=11.38u m=1 +XCC1 net022 VOUT1 cap_cmim w=25.82u l=25.82u +.ends C11_ihp130_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1.5_sL1.5/testbench.spice new file mode 100644 index 00000000..4692df0f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1.5_sL1.5/testbench.spice @@ -0,0 +1,37 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 IB1 C11_ihp130_sW1.5_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIB1 IB1 VSS 2e-05 +.nodeset v(IB1)=0.84 + +VCM VCM 0 0.48 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 0.6 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN1 VCM VINT 0 1 +EIN VIN2 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN1) - v(VIN2) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1.5_sL1/case.json new file mode 100644 index 00000000..19b0d991 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1.5_sL1/case.json @@ -0,0 +1,230 @@ +{ + "case_id": "C11_ihp130_sW1.5_sL1", + "circuit_id": "C11", + "pdk": "ihp130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "dut_name": "C11_ihp130_sW1.5_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "IB1" + ], + "sizing": { + "M1": { + "w": 3.0, + "l": 0.26, + "nf": 6 + }, + "M2": { + "w": 6.0, + "l": 0.26, + "nf": 12 + }, + "M3": { + "w": 6.0, + "l": 0.26, + "nf": 12 + }, + "M4": { + "w": 6.0, + "l": 0.26, + "nf": 12 + }, + "M5": { + "w": 3.0, + "l": 0.26, + "nf": 6 + }, + "M6": { + "w": 3.0, + "l": 0.26, + "nf": 6 + }, + "M7": { + "w": 6.0, + "l": 0.26, + "nf": 12 + }, + "M8": { + "w": 6.0, + "l": 0.26, + "nf": 12 + }, + "R1": { + "r": 3000.0, + "body": "VSS", + "w": 1.0, + "l": 11.38 + }, + "C1": { + "c": 1e-12, + "w": 25.82, + "l": 25.82, + "model": "cap_cmim" + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 0.48, + "CL": 1e-12, + "inv_input": "VIN1", + "vout_target": 0.6 + }, + "category": "twostage", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.26, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.26, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.26, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.26, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.26, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.26, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.26, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.26, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "414c659d5ec3491e", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8", + "R1", + "C1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1.5_sL1/manifest.json new file mode 100644 index 00000000..e3b14930 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "077f000c8267510df4df9ee49c940ca70f12edce019b5cf9ab774d5e64e3b9eb", + "qualification.json": "adee4e43655cb37c8872d89f57e96427ec8382debf672108f2703823c6202d2e", + "specs.json": "e610fda0adca521e32a8616d1b28f5dab76bc43a94c62671a31167667f855e73", + "target.spice": "a7fb881731033e034a579a62c2773a3cd05f03cd1a4cf4448b11038a00ba50d6", + "target_lvs.spice": "38ab0c2a97c8535feccb04bcbd353d7911ac777c2881f778095b6ffc23029664", + "testbench.spice": "3472c3b7587536afc435e80e4b095290a36c4114d9fcbc4880c877fd24ac7331" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1.5_sL1/qualification.json new file mode 100644 index 00000000..50f1d72b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1.5_sL1/qualification.json @@ -0,0 +1,165 @@ +{ + "case_id": "C11_ihp130_sW1.5_sL1", + "circuit_id": "C11", + "pdk": "ihp130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "twostage", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.26, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.26, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.26, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.26, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.26, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.26, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.26, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.26, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "414c659d5ec3491e", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 44.49 + }, + "ugf": { + "min": 17400000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 47.49291, + "ugf": 29004360.0, + "pm": 82.2825251 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 2.8, + "schematic_measures": { + "vout0": 0.6, + "idd": 9.458112e-05, + "vos": 0.0002541931, + "gain_lf": 47.49291, + "ph_lf": 0.1694349, + "ugf": 29004360.0, + "ph_ugf": -97.54804, + "f3db": 125441.4, + "pm": 82.2825251 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1.5_sL1/specs.json new file mode 100644 index 00000000..1bf84741 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1.5_sL1/specs.json @@ -0,0 +1,30 @@ +{ + "gain_lf": { + "min": 44.49 + }, + "ugf": { + "min": 17400000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 47.49291, + "ugf": 29004360.0, + "pm": 82.2825251 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1.5_sL1/target.spice new file mode 100644 index 00000000..7bf7be9c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1.5_sL1/target.spice @@ -0,0 +1,12 @@ +.subckt C11_ihp130_sW1.5_sL1 VDD VSS VIN1 VIN2 VOUT1 IB1 +XM1 IB1 IB1 VDD VDD sg13_lv_pmos w=3u l=0.26u ng=6 m=1 +XM2 net97 IB1 VDD VDD sg13_lv_pmos w=6u l=0.26u ng=12 m=1 +XM3 net014 VIN1 net97 VDD sg13_lv_pmos w=6u l=0.26u ng=12 m=1 +XM4 net016 VIN2 net97 VDD sg13_lv_pmos w=6u l=0.26u ng=12 m=1 +XM5 net014 net014 VSS VSS sg13_lv_nmos w=3u l=0.26u ng=6 m=1 +XM6 net016 net014 VSS VSS sg13_lv_nmos w=3u l=0.26u ng=6 m=1 +XM7 VOUT1 IB1 VDD VDD sg13_lv_pmos w=6u l=0.26u ng=12 m=1 +XM8 VOUT1 net016 VSS VSS sg13_lv_nmos w=6u l=0.26u ng=12 m=1 +XRR1 net016 net022 rppd w=1u l=11.38u m=1 +XCC1 net022 VOUT1 cap_cmim w=25.82u l=25.82u +.ends C11_ihp130_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1.5_sL1/target_lvs.spice new file mode 100644 index 00000000..378c2cb1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1.5_sL1/target_lvs.spice @@ -0,0 +1,82 @@ +.subckt C11_ihp130_sW1.5_sL1 VDD VSS VIN1 VIN2 VOUT1 IB1 +XM1_f0 IB1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM1_f1 IB1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM1_f2 IB1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM1_f3 IB1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM1_f4 IB1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM1_f5 IB1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f0 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f1 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f2 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f3 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f4 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f5 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f6 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f7 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f8 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f9 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f10 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f11 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM3_f0 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.26u +XM3_f1 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.26u +XM3_f2 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.26u +XM3_f3 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.26u +XM3_f4 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.26u +XM3_f5 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.26u +XM3_f6 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.26u +XM3_f7 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.26u +XM3_f8 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.26u +XM3_f9 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.26u +XM3_f10 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.26u +XM3_f11 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f0 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f1 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f2 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f3 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f4 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f5 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f6 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f7 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f8 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f9 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f10 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f11 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f0 net014 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f1 net014 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f2 net014 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f3 net014 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f4 net014 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f5 net014 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM6_f0 net016 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM6_f1 net016 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM6_f2 net016 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM6_f3 net016 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM6_f4 net016 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM6_f5 net016 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM7_f0 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f1 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f2 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f3 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f4 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f5 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f6 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f7 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f8 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f9 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f10 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f11 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f0 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM8_f1 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM8_f2 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM8_f3 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM8_f4 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM8_f5 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM8_f6 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM8_f7 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM8_f8 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM8_f9 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM8_f10 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM8_f11 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XRR1 net016 net022 rppd w=1u l=11.38u m=1 +XCC1 net022 VOUT1 cap_cmim w=25.82u l=25.82u +.ends C11_ihp130_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1.5_sL1/testbench.spice new file mode 100644 index 00000000..15017b42 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1.5_sL1/testbench.spice @@ -0,0 +1,37 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 IB1 C11_ihp130_sW1.5_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIB1 IB1 VSS 2e-05 +.nodeset v(IB1)=0.84 + +VCM VCM 0 0.48 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 0.6 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN1 VCM VINT 0 1 +EIN VIN2 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN1) - v(VIN2) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1.5_sL2/case.json new file mode 100644 index 00000000..d78e860b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1.5_sL2/case.json @@ -0,0 +1,230 @@ +{ + "case_id": "C11_ihp130_sW1.5_sL2", + "circuit_id": "C11", + "pdk": "ihp130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "dut_name": "C11_ihp130_sW1.5_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "IB1" + ], + "sizing": { + "M1": { + "w": 3.0, + "l": 0.52, + "nf": 6 + }, + "M2": { + "w": 6.0, + "l": 0.52, + "nf": 12 + }, + "M3": { + "w": 6.0, + "l": 0.52, + "nf": 12 + }, + "M4": { + "w": 6.0, + "l": 0.52, + "nf": 12 + }, + "M5": { + "w": 3.0, + "l": 0.52, + "nf": 6 + }, + "M6": { + "w": 3.0, + "l": 0.52, + "nf": 6 + }, + "M7": { + "w": 6.0, + "l": 0.52, + "nf": 12 + }, + "M8": { + "w": 6.0, + "l": 0.52, + "nf": 12 + }, + "R1": { + "r": 3000.0, + "body": "VSS", + "w": 1.0, + "l": 11.38 + }, + "C1": { + "c": 1e-12, + "w": 25.82, + "l": 25.82, + "model": "cap_cmim" + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 0.48, + "CL": 1e-12, + "inv_input": "VIN1", + "vout_target": 0.6 + }, + "category": "twostage", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.52, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.52, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.52, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.52, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.52, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.52, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.52, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.52, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "1ba3764d535990c7", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8", + "R1", + "C1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1.5_sL2/manifest.json new file mode 100644 index 00000000..cdb9431c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "bc37ba570710ca990b908c31ef71281fd63ebd8aeff3d7679d17eb04614c12c3", + "qualification.json": "04ca035aa3f5794d51d642ab76677839897ae325e4a518649f667b0162630955", + "specs.json": "89f20c0ac2d6b3c99f35923d50eee41e2b497e4c9e88e389840e51ee333f200d", + "target.spice": "fb06d9f54fba5db2559a0a4ea330befd80de64cc62502c9be52970f5c6bbb787", + "target_lvs.spice": "39f489b0100f7ebcc19e961f565a6b29815b32579a678fc4c3b4480a6dcb8baa", + "testbench.spice": "f035d56a1316bf0b2f7545e021a21704a86a51473be91f7095f4892d9582eb21" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1.5_sL2/qualification.json new file mode 100644 index 00000000..0e827fe9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1.5_sL2/qualification.json @@ -0,0 +1,165 @@ +{ + "case_id": "C11_ihp130_sW1.5_sL2", + "circuit_id": "C11", + "pdk": "ihp130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "twostage", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.52, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.52, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.52, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.52, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.52, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.52, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.52, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.52, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "1ba3764d535990c7", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 48.97 + }, + "ugf": { + "min": 13890000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 51.96874, + "ugf": 23157510.0, + "pm": 76.86364549999999 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 2.5, + "schematic_measures": { + "vout0": 0.6000001, + "idd": 9.285203e-05, + "vos": 0.0005491362, + "gain_lf": 51.96874, + "ph_lf": 0.2641545, + "ugf": 23157510.0, + "ph_ugf": -102.8722, + "f3db": 60434.27, + "pm": 76.86364549999999 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1.5_sL2/specs.json new file mode 100644 index 00000000..94a54d74 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1.5_sL2/specs.json @@ -0,0 +1,30 @@ +{ + "gain_lf": { + "min": 48.97 + }, + "ugf": { + "min": 13890000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 51.96874, + "ugf": 23157510.0, + "pm": 76.86364549999999 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1.5_sL2/target.spice new file mode 100644 index 00000000..df6aa667 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1.5_sL2/target.spice @@ -0,0 +1,12 @@ +.subckt C11_ihp130_sW1.5_sL2 VDD VSS VIN1 VIN2 VOUT1 IB1 +XM1 IB1 IB1 VDD VDD sg13_lv_pmos w=3u l=0.52u ng=6 m=1 +XM2 net97 IB1 VDD VDD sg13_lv_pmos w=6u l=0.52u ng=12 m=1 +XM3 net014 VIN1 net97 VDD sg13_lv_pmos w=6u l=0.52u ng=12 m=1 +XM4 net016 VIN2 net97 VDD sg13_lv_pmos w=6u l=0.52u ng=12 m=1 +XM5 net014 net014 VSS VSS sg13_lv_nmos w=3u l=0.52u ng=6 m=1 +XM6 net016 net014 VSS VSS sg13_lv_nmos w=3u l=0.52u ng=6 m=1 +XM7 VOUT1 IB1 VDD VDD sg13_lv_pmos w=6u l=0.52u ng=12 m=1 +XM8 VOUT1 net016 VSS VSS sg13_lv_nmos w=6u l=0.52u ng=12 m=1 +XRR1 net016 net022 rppd w=1u l=11.38u m=1 +XCC1 net022 VOUT1 cap_cmim w=25.82u l=25.82u +.ends C11_ihp130_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1.5_sL2/target_lvs.spice new file mode 100644 index 00000000..4095ba0c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1.5_sL2/target_lvs.spice @@ -0,0 +1,82 @@ +.subckt C11_ihp130_sW1.5_sL2 VDD VSS VIN1 VIN2 VOUT1 IB1 +XM1_f0 IB1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f1 IB1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f2 IB1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f3 IB1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f4 IB1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f5 IB1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f0 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f1 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f2 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f3 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f4 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f5 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f6 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f7 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f8 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f9 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f10 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f11 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM3_f0 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.52u +XM3_f1 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.52u +XM3_f2 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.52u +XM3_f3 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.52u +XM3_f4 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.52u +XM3_f5 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.52u +XM3_f6 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.52u +XM3_f7 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.52u +XM3_f8 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.52u +XM3_f9 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.52u +XM3_f10 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.52u +XM3_f11 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f0 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f1 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f2 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f3 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f4 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f5 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f6 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f7 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f8 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f9 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f10 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f11 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f0 net014 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f1 net014 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f2 net014 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f3 net014 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f4 net014 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f5 net014 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM6_f0 net016 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM6_f1 net016 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM6_f2 net016 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM6_f3 net016 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM6_f4 net016 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM6_f5 net016 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM7_f0 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f1 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f2 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f3 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f4 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f5 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f6 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f7 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f8 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f9 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f10 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f11 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f0 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM8_f1 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM8_f2 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM8_f3 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM8_f4 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM8_f5 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM8_f6 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM8_f7 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM8_f8 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM8_f9 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM8_f10 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM8_f11 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XRR1 net016 net022 rppd w=1u l=11.38u m=1 +XCC1 net022 VOUT1 cap_cmim w=25.82u l=25.82u +.ends C11_ihp130_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1.5_sL2/testbench.spice new file mode 100644 index 00000000..bf0c388a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1.5_sL2/testbench.spice @@ -0,0 +1,37 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 IB1 C11_ihp130_sW1.5_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIB1 IB1 VSS 2e-05 +.nodeset v(IB1)=0.84 + +VCM VCM 0 0.48 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 0.6 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN1 VCM VINT 0 1 +EIN VIN2 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN1) - v(VIN2) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1_sL1.5/case.json new file mode 100644 index 00000000..c79c684e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1_sL1.5/case.json @@ -0,0 +1,230 @@ +{ + "case_id": "C11_ihp130_sW1_sL1.5", + "circuit_id": "C11", + "pdk": "ihp130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "dut_name": "C11_ihp130_sW1_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "IB1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.39, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.39, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 0.39, + "nf": 8 + }, + "M4": { + "w": 4.0, + "l": 0.39, + "nf": 8 + }, + "M5": { + "w": 2.0, + "l": 0.39, + "nf": 4 + }, + "M6": { + "w": 2.0, + "l": 0.39, + "nf": 4 + }, + "M7": { + "w": 4.0, + "l": 0.39, + "nf": 8 + }, + "M8": { + "w": 4.0, + "l": 0.39, + "nf": 8 + }, + "R1": { + "r": 3000.0, + "body": "VSS", + "w": 1.0, + "l": 11.38 + }, + "C1": { + "c": 1e-12, + "w": 25.82, + "l": 25.82, + "model": "cap_cmim" + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 0.48, + "CL": 1e-12, + "inv_input": "VIN1", + "vout_target": 0.6 + }, + "category": "twostage", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "70ea72afbd6a2557", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8", + "R1", + "C1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1_sL1.5/manifest.json new file mode 100644 index 00000000..1a3d54c7 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "ee5f9e9c4663bc12bd888552ef82c19074cc09cae4d9e89f734774afe50d50b9", + "qualification.json": "2e03d371167cc6e9fe311d2bf55aef38175e2adccbb259bb64c60b68587b45e6", + "specs.json": "e378837f6eb1037b47ee096f30935192aa6a17953e71064ade8e2751c57fc0db", + "target.spice": "3d46942edee91a52d9963a8e41e0c5159ea64c5fece49439af73a1eeee9f7c6b", + "target_lvs.spice": "f9d12edee6492fd8b511da0c2e2ae5fc1edc13dd75724a5be66aa77d9d9b2e1b", + "testbench.spice": "7e3fd7b0ecffc8b1872c9ec03058d53bcc989d0a1899f985e69dc09f0443c2bd" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1_sL1.5/qualification.json new file mode 100644 index 00000000..1ffe8050 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1_sL1.5/qualification.json @@ -0,0 +1,165 @@ +{ + "case_id": "C11_ihp130_sW1_sL1.5", + "circuit_id": "C11", + "pdk": "ihp130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "twostage", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "70ea72afbd6a2557", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 46.84 + }, + "ugf": { + "min": 12340000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 49.84097, + "ugf": 20571200.0, + "pm": 77.0407355 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 1.5, + "schematic_measures": { + "vout0": 0.6000001, + "idd": 9.010908e-05, + "vos": 0.001164414, + "gain_lf": 49.84097, + "ph_lf": 0.1964645, + "ugf": 20571200.0, + "ph_ugf": -102.7628, + "f3db": 68519.9, + "pm": 77.0407355 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1_sL1.5/specs.json new file mode 100644 index 00000000..bb1d179a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1_sL1.5/specs.json @@ -0,0 +1,30 @@ +{ + "gain_lf": { + "min": 46.84 + }, + "ugf": { + "min": 12340000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 49.84097, + "ugf": 20571200.0, + "pm": 77.0407355 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1_sL1.5/target.spice new file mode 100644 index 00000000..8bb0b153 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1_sL1.5/target.spice @@ -0,0 +1,12 @@ +.subckt C11_ihp130_sW1_sL1.5 VDD VSS VIN1 VIN2 VOUT1 IB1 +XM1 IB1 IB1 VDD VDD sg13_lv_pmos w=2u l=0.39u ng=4 m=1 +XM2 net97 IB1 VDD VDD sg13_lv_pmos w=4u l=0.39u ng=8 m=1 +XM3 net014 VIN1 net97 VDD sg13_lv_pmos w=4u l=0.39u ng=8 m=1 +XM4 net016 VIN2 net97 VDD sg13_lv_pmos w=4u l=0.39u ng=8 m=1 +XM5 net014 net014 VSS VSS sg13_lv_nmos w=2u l=0.39u ng=4 m=1 +XM6 net016 net014 VSS VSS sg13_lv_nmos w=2u l=0.39u ng=4 m=1 +XM7 VOUT1 IB1 VDD VDD sg13_lv_pmos w=4u l=0.39u ng=8 m=1 +XM8 VOUT1 net016 VSS VSS sg13_lv_nmos w=4u l=0.39u ng=8 m=1 +XRR1 net016 net022 rppd w=1u l=11.38u m=1 +XCC1 net022 VOUT1 cap_cmim w=25.82u l=25.82u +.ends C11_ihp130_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1_sL1.5/target_lvs.spice new file mode 100644 index 00000000..4dfe7efc --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1_sL1.5/target_lvs.spice @@ -0,0 +1,56 @@ +.subckt C11_ihp130_sW1_sL1.5 VDD VSS VIN1 VIN2 VOUT1 IB1 +XM1_f0 IB1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM1_f1 IB1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM1_f2 IB1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM1_f3 IB1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f0 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f1 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f2 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f3 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f4 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f5 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f6 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f7 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM3_f0 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.39u +XM3_f1 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.39u +XM3_f2 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.39u +XM3_f3 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.39u +XM3_f4 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.39u +XM3_f5 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.39u +XM3_f6 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.39u +XM3_f7 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f0 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f1 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f2 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f3 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f4 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f5 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f6 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f7 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f0 net014 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f1 net014 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f2 net014 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f3 net014 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM6_f0 net016 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM6_f1 net016 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM6_f2 net016 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM6_f3 net016 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM7_f0 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f1 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f2 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f3 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f4 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f5 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f6 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f7 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f0 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM8_f1 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM8_f2 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM8_f3 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM8_f4 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM8_f5 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM8_f6 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM8_f7 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XRR1 net016 net022 rppd w=1u l=11.38u m=1 +XCC1 net022 VOUT1 cap_cmim w=25.82u l=25.82u +.ends C11_ihp130_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1_sL1.5/testbench.spice new file mode 100644 index 00000000..742b6a11 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1_sL1.5/testbench.spice @@ -0,0 +1,37 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 IB1 C11_ihp130_sW1_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIB1 IB1 VSS 2e-05 +.nodeset v(IB1)=0.84 + +VCM VCM 0 0.48 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 0.6 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN1 VCM VINT 0 1 +EIN VIN2 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN1) - v(VIN2) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1_sL1/case.json new file mode 100644 index 00000000..d857d0ac --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1_sL1/case.json @@ -0,0 +1,230 @@ +{ + "case_id": "C11_ihp130_sW1_sL1", + "circuit_id": "C11", + "pdk": "ihp130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "dut_name": "C11_ihp130_sW1_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "IB1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.26, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.26, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 0.26, + "nf": 8 + }, + "M4": { + "w": 4.0, + "l": 0.26, + "nf": 8 + }, + "M5": { + "w": 2.0, + "l": 0.26, + "nf": 4 + }, + "M6": { + "w": 2.0, + "l": 0.26, + "nf": 4 + }, + "M7": { + "w": 4.0, + "l": 0.26, + "nf": 8 + }, + "M8": { + "w": 4.0, + "l": 0.26, + "nf": 8 + }, + "R1": { + "r": 3000.0, + "body": "VSS", + "w": 1.0, + "l": 11.38 + }, + "C1": { + "c": 1e-12, + "w": 25.82, + "l": 25.82, + "model": "cap_cmim" + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 0.48, + "CL": 1e-12, + "inv_input": "VIN1", + "vout_target": 0.6 + }, + "category": "twostage", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.26, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.26, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.26, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "e756b93b17af3c2f", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8", + "R1", + "C1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1_sL1/manifest.json new file mode 100644 index 00000000..361a8b40 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "013d3ad3c5b00f441ba99a03e529b2fe7119f2b8ac247686602e6b28fc79bce5", + "qualification.json": "314957ce1e3063c76ad6cc3038837461aa8467d7569d53e59d685ebda6bf9688", + "specs.json": "652f8766f124db2f10c5f51b00e3759aa82092d5d9a8a907c24d51732cacc1c3", + "target.spice": "c060088afa632f67f71f8500680abc1407f1479d69cb8f270e63212f408b7186", + "target_lvs.spice": "ab0b6243e2fce1cc03eb82cba8323a718814a6d4a58bbd475ba9b64bf629673e", + "testbench.spice": "0bc743e391d288a13f15ac086d53780e42d00c20925c5cfe6670b1e3f3b845d7" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1_sL1/qualification.json new file mode 100644 index 00000000..aa7b79ea --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1_sL1/qualification.json @@ -0,0 +1,165 @@ +{ + "case_id": "C11_ihp130_sW1_sL1", + "circuit_id": "C11", + "pdk": "ihp130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "twostage", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.26, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.26, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.26, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "e756b93b17af3c2f", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 44.12 + }, + "ugf": { + "min": 14200000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 47.12022, + "ugf": 23668180.0, + "pm": 79.4408445 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 1.8, + "schematic_measures": { + "vout0": 0.6000001, + "idd": 9.172873e-05, + "vos": 0.0008903594, + "gain_lf": 47.12022, + "ph_lf": 0.1519555, + "ugf": 23668180.0, + "ph_ugf": -100.4072, + "f3db": 107608.4, + "pm": 79.4408445 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1_sL1/specs.json new file mode 100644 index 00000000..509b2b7d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1_sL1/specs.json @@ -0,0 +1,30 @@ +{ + "gain_lf": { + "min": 44.12 + }, + "ugf": { + "min": 14200000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 47.12022, + "ugf": 23668180.0, + "pm": 79.4408445 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1_sL1/target.spice new file mode 100644 index 00000000..a04b11be --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1_sL1/target.spice @@ -0,0 +1,12 @@ +.subckt C11_ihp130_sW1_sL1 VDD VSS VIN1 VIN2 VOUT1 IB1 +XM1 IB1 IB1 VDD VDD sg13_lv_pmos w=2u l=0.26u ng=4 m=1 +XM2 net97 IB1 VDD VDD sg13_lv_pmos w=4u l=0.26u ng=8 m=1 +XM3 net014 VIN1 net97 VDD sg13_lv_pmos w=4u l=0.26u ng=8 m=1 +XM4 net016 VIN2 net97 VDD sg13_lv_pmos w=4u l=0.26u ng=8 m=1 +XM5 net014 net014 VSS VSS sg13_lv_nmos w=2u l=0.26u ng=4 m=1 +XM6 net016 net014 VSS VSS sg13_lv_nmos w=2u l=0.26u ng=4 m=1 +XM7 VOUT1 IB1 VDD VDD sg13_lv_pmos w=4u l=0.26u ng=8 m=1 +XM8 VOUT1 net016 VSS VSS sg13_lv_nmos w=4u l=0.26u ng=8 m=1 +XRR1 net016 net022 rppd w=1u l=11.38u m=1 +XCC1 net022 VOUT1 cap_cmim w=25.82u l=25.82u +.ends C11_ihp130_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1_sL1/target_lvs.spice new file mode 100644 index 00000000..c961ee38 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1_sL1/target_lvs.spice @@ -0,0 +1,56 @@ +.subckt C11_ihp130_sW1_sL1 VDD VSS VIN1 VIN2 VOUT1 IB1 +XM1_f0 IB1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM1_f1 IB1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM1_f2 IB1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM1_f3 IB1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f0 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f1 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f2 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f3 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f4 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f5 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f6 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f7 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM3_f0 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.26u +XM3_f1 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.26u +XM3_f2 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.26u +XM3_f3 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.26u +XM3_f4 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.26u +XM3_f5 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.26u +XM3_f6 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.26u +XM3_f7 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f0 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f1 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f2 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f3 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f4 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f5 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f6 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f7 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f0 net014 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f1 net014 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f2 net014 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f3 net014 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM6_f0 net016 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM6_f1 net016 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM6_f2 net016 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM6_f3 net016 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM7_f0 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f1 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f2 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f3 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f4 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f5 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f6 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f7 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f0 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM8_f1 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM8_f2 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM8_f3 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM8_f4 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM8_f5 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM8_f6 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM8_f7 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XRR1 net016 net022 rppd w=1u l=11.38u m=1 +XCC1 net022 VOUT1 cap_cmim w=25.82u l=25.82u +.ends C11_ihp130_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1_sL1/testbench.spice new file mode 100644 index 00000000..e3bda52c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1_sL1/testbench.spice @@ -0,0 +1,37 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 IB1 C11_ihp130_sW1_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIB1 IB1 VSS 2e-05 +.nodeset v(IB1)=0.84 + +VCM VCM 0 0.48 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 0.6 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN1 VCM VINT 0 1 +EIN VIN2 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN1) - v(VIN2) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1_sL2/case.json new file mode 100644 index 00000000..8a30cccd --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1_sL2/case.json @@ -0,0 +1,230 @@ +{ + "case_id": "C11_ihp130_sW1_sL2", + "circuit_id": "C11", + "pdk": "ihp130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "dut_name": "C11_ihp130_sW1_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "IB1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.52, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.52, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 0.52, + "nf": 8 + }, + "M4": { + "w": 4.0, + "l": 0.52, + "nf": 8 + }, + "M5": { + "w": 2.0, + "l": 0.52, + "nf": 4 + }, + "M6": { + "w": 2.0, + "l": 0.52, + "nf": 4 + }, + "M7": { + "w": 4.0, + "l": 0.52, + "nf": 8 + }, + "M8": { + "w": 4.0, + "l": 0.52, + "nf": 8 + }, + "R1": { + "r": 3000.0, + "body": "VSS", + "w": 1.0, + "l": 11.38 + }, + "C1": { + "c": 1e-12, + "w": 25.82, + "l": 25.82, + "model": "cap_cmim" + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 0.48, + "CL": 1e-12, + "inv_input": "VIN1", + "vout_target": 0.6 + }, + "category": "twostage", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "68af9296ffd48da9", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8", + "R1", + "C1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1_sL2/manifest.json new file mode 100644 index 00000000..15bcbdee --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "44e7df00ec58924a92e23745f5f5d5ac9818addfaa074ab5dcc058b1f6a03d98", + "qualification.json": "2206002b481d2425a3dceea1e439c0d2fe417eff5803542a6c1657eec9131893", + "specs.json": "16d7f67073afd0f3e62d6d5abe0772a6e05550dc979be35895ab03406e1565d3", + "target.spice": "2e0776725168ce3c08f4a35cb90a8b74e0d8824d1febb307923681458fdac989", + "target_lvs.spice": "ef2b2736e374fdef8564e8c139bc63adc2a8d3242ad23fee56dbd39af572fed7", + "testbench.spice": "36a726265c7b4ec9dd2039530e26a94f32a668a010c4a8a1f8bbe7d4ff085be1" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1_sL2/qualification.json new file mode 100644 index 00000000..cedc5803 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1_sL2/qualification.json @@ -0,0 +1,165 @@ +{ + "case_id": "C11_ihp130_sW1_sL2", + "circuit_id": "C11", + "pdk": "ihp130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "twostage", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "68af9296ffd48da9", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 48.48 + }, + "ugf": { + "min": 10780000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 51.47979, + "ugf": 17958840.0, + "pm": 75.4006569 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 1.9, + "schematic_measures": { + "vout0": 0.6000002, + "idd": 8.774862e-05, + "vos": 0.001640854, + "gain_lf": 51.47979, + "ph_lf": 0.2220431, + "ugf": 17958840.0, + "ph_ugf": -104.3773, + "f3db": 49508.27, + "pm": 75.4006569 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1_sL2/specs.json new file mode 100644 index 00000000..1aff1b9f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1_sL2/specs.json @@ -0,0 +1,30 @@ +{ + "gain_lf": { + "min": 48.48 + }, + "ugf": { + "min": 10780000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 51.47979, + "ugf": 17958840.0, + "pm": 75.4006569 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1_sL2/target.spice new file mode 100644 index 00000000..deae6e34 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1_sL2/target.spice @@ -0,0 +1,12 @@ +.subckt C11_ihp130_sW1_sL2 VDD VSS VIN1 VIN2 VOUT1 IB1 +XM1 IB1 IB1 VDD VDD sg13_lv_pmos w=2u l=0.52u ng=4 m=1 +XM2 net97 IB1 VDD VDD sg13_lv_pmos w=4u l=0.52u ng=8 m=1 +XM3 net014 VIN1 net97 VDD sg13_lv_pmos w=4u l=0.52u ng=8 m=1 +XM4 net016 VIN2 net97 VDD sg13_lv_pmos w=4u l=0.52u ng=8 m=1 +XM5 net014 net014 VSS VSS sg13_lv_nmos w=2u l=0.52u ng=4 m=1 +XM6 net016 net014 VSS VSS sg13_lv_nmos w=2u l=0.52u ng=4 m=1 +XM7 VOUT1 IB1 VDD VDD sg13_lv_pmos w=4u l=0.52u ng=8 m=1 +XM8 VOUT1 net016 VSS VSS sg13_lv_nmos w=4u l=0.52u ng=8 m=1 +XRR1 net016 net022 rppd w=1u l=11.38u m=1 +XCC1 net022 VOUT1 cap_cmim w=25.82u l=25.82u +.ends C11_ihp130_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1_sL2/target_lvs.spice new file mode 100644 index 00000000..1adb99ac --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1_sL2/target_lvs.spice @@ -0,0 +1,56 @@ +.subckt C11_ihp130_sW1_sL2 VDD VSS VIN1 VIN2 VOUT1 IB1 +XM1_f0 IB1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f1 IB1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f2 IB1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f3 IB1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f0 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f1 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f2 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f3 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f4 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f5 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f6 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f7 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM3_f0 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.52u +XM3_f1 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.52u +XM3_f2 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.52u +XM3_f3 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.52u +XM3_f4 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.52u +XM3_f5 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.52u +XM3_f6 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.52u +XM3_f7 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f0 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f1 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f2 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f3 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f4 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f5 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f6 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f7 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f0 net014 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f1 net014 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f2 net014 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f3 net014 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM6_f0 net016 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM6_f1 net016 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM6_f2 net016 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM6_f3 net016 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM7_f0 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f1 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f2 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f3 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f4 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f5 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f6 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f7 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f0 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM8_f1 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM8_f2 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM8_f3 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM8_f4 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM8_f5 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM8_f6 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM8_f7 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XRR1 net016 net022 rppd w=1u l=11.38u m=1 +XCC1 net022 VOUT1 cap_cmim w=25.82u l=25.82u +.ends C11_ihp130_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1_sL2/testbench.spice new file mode 100644 index 00000000..bd03f8bc --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW1_sL2/testbench.spice @@ -0,0 +1,37 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 IB1 C11_ihp130_sW1_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIB1 IB1 VSS 2e-05 +.nodeset v(IB1)=0.84 + +VCM VCM 0 0.48 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 0.6 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN1 VCM VINT 0 1 +EIN VIN2 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN1) - v(VIN2) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW2_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW2_sL1.5/case.json new file mode 100644 index 00000000..d85cbd2e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW2_sL1.5/case.json @@ -0,0 +1,230 @@ +{ + "case_id": "C11_ihp130_sW2_sL1.5", + "circuit_id": "C11", + "pdk": "ihp130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "dut_name": "C11_ihp130_sW2_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "IB1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.39, + "nf": 8 + }, + "M2": { + "w": 8.0, + "l": 0.39, + "nf": 16 + }, + "M3": { + "w": 8.0, + "l": 0.39, + "nf": 16 + }, + "M4": { + "w": 8.0, + "l": 0.39, + "nf": 16 + }, + "M5": { + "w": 4.0, + "l": 0.39, + "nf": 8 + }, + "M6": { + "w": 4.0, + "l": 0.39, + "nf": 8 + }, + "M7": { + "w": 8.0, + "l": 0.39, + "nf": 16 + }, + "M8": { + "w": 8.0, + "l": 0.39, + "nf": 16 + }, + "R1": { + "r": 3000.0, + "body": "VSS", + "w": 1.0, + "l": 11.38 + }, + "C1": { + "c": 1e-12, + "w": 25.82, + "l": 25.82, + "model": "cap_cmim" + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 0.48, + "CL": 1e-12, + "inv_input": "VIN1", + "vout_target": 0.6 + }, + "category": "twostage", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "6223827e0f779bdd", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8", + "R1", + "C1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW2_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW2_sL1.5/manifest.json new file mode 100644 index 00000000..f2e6ab51 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW2_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "dbda0a6530cb6b6cb7b4688da6ec01349fa558bf9cbfcb7f48bec6515a607cba", + "qualification.json": "bd5c02fb6ff869337f68ff4fa413dfd8836f6f7083e9557cbee159a36e89914d", + "specs.json": "22e886b7eff2de56de4e0a324f1980a917f3fd3a41abeea7402e1a585fe23819", + "target.spice": "d1b87ede52f8bd74ed1e5fd3b4178c405c51b9094d8616ae80d292059077bb36", + "target_lvs.spice": "ad4a0096575f23ce69ae055f2ae1775117f6073f8a112602a062e0f6c554bfbc", + "testbench.spice": "71ce0b6a7bc52caffd1d9bab945ca9fe90dd351e7a3f06c239eaf2baa05b696f" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW2_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW2_sL1.5/qualification.json new file mode 100644 index 00000000..715d3171 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW2_sL1.5/qualification.json @@ -0,0 +1,165 @@ +{ + "case_id": "C11_ihp130_sW2_sL1.5", + "circuit_id": "C11", + "pdk": "ihp130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "twostage", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "6223827e0f779bdd", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 47.57 + }, + "ugf": { + "min": 17950000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 50.5663, + "ugf": 29909400.0, + "pm": 81.1490187 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 8.0, + "schematic_measures": { + "vout0": 0.6, + "idd": 9.596058e-05, + "vos": -3.77671e-06, + "gain_lf": 50.5663, + "ph_lf": 0.2437113, + "ugf": 29909400.0, + "ph_ugf": -98.60727, + "f3db": 90802.36, + "pm": 81.1490187 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW2_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW2_sL1.5/specs.json new file mode 100644 index 00000000..d4edb15c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW2_sL1.5/specs.json @@ -0,0 +1,30 @@ +{ + "gain_lf": { + "min": 47.57 + }, + "ugf": { + "min": 17950000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 50.5663, + "ugf": 29909400.0, + "pm": 81.1490187 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW2_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW2_sL1.5/target.spice new file mode 100644 index 00000000..fe5217d3 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW2_sL1.5/target.spice @@ -0,0 +1,12 @@ +.subckt C11_ihp130_sW2_sL1.5 VDD VSS VIN1 VIN2 VOUT1 IB1 +XM1 IB1 IB1 VDD VDD sg13_lv_pmos w=4u l=0.39u ng=8 m=1 +XM2 net97 IB1 VDD VDD sg13_lv_pmos w=8u l=0.39u ng=16 m=1 +XM3 net014 VIN1 net97 VDD sg13_lv_pmos w=8u l=0.39u ng=16 m=1 +XM4 net016 VIN2 net97 VDD sg13_lv_pmos w=8u l=0.39u ng=16 m=1 +XM5 net014 net014 VSS VSS sg13_lv_nmos w=4u l=0.39u ng=8 m=1 +XM6 net016 net014 VSS VSS sg13_lv_nmos w=4u l=0.39u ng=8 m=1 +XM7 VOUT1 IB1 VDD VDD sg13_lv_pmos w=8u l=0.39u ng=16 m=1 +XM8 VOUT1 net016 VSS VSS sg13_lv_nmos w=8u l=0.39u ng=16 m=1 +XRR1 net016 net022 rppd w=1u l=11.38u m=1 +XCC1 net022 VOUT1 cap_cmim w=25.82u l=25.82u +.ends C11_ihp130_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW2_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW2_sL1.5/target_lvs.spice new file mode 100644 index 00000000..bfe3c961 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW2_sL1.5/target_lvs.spice @@ -0,0 +1,108 @@ +.subckt C11_ihp130_sW2_sL1.5 VDD VSS VIN1 VIN2 VOUT1 IB1 +XM1_f0 IB1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM1_f1 IB1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM1_f2 IB1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM1_f3 IB1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM1_f4 IB1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM1_f5 IB1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM1_f6 IB1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM1_f7 IB1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f0 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f1 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f2 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f3 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f4 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f5 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f6 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f7 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f8 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f9 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f10 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f11 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f12 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f13 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f14 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f15 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM3_f0 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.39u +XM3_f1 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.39u +XM3_f2 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.39u +XM3_f3 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.39u +XM3_f4 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.39u +XM3_f5 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.39u +XM3_f6 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.39u +XM3_f7 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.39u +XM3_f8 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.39u +XM3_f9 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.39u +XM3_f10 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.39u +XM3_f11 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.39u +XM3_f12 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.39u +XM3_f13 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.39u +XM3_f14 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.39u +XM3_f15 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f0 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f1 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f2 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f3 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f4 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f5 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f6 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f7 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f8 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f9 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f10 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f11 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f12 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f13 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f14 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f15 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f0 net014 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f1 net014 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f2 net014 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f3 net014 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f4 net014 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f5 net014 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f6 net014 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f7 net014 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM6_f0 net016 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM6_f1 net016 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM6_f2 net016 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM6_f3 net016 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM6_f4 net016 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM6_f5 net016 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM6_f6 net016 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM6_f7 net016 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM7_f0 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f1 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f2 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f3 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f4 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f5 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f6 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f7 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f8 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f9 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f10 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f11 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f12 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f13 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f14 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM7_f15 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM8_f0 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM8_f1 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM8_f2 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM8_f3 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM8_f4 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM8_f5 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM8_f6 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM8_f7 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM8_f8 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM8_f9 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM8_f10 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM8_f11 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM8_f12 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM8_f13 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM8_f14 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM8_f15 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XRR1 net016 net022 rppd w=1u l=11.38u m=1 +XCC1 net022 VOUT1 cap_cmim w=25.82u l=25.82u +.ends C11_ihp130_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW2_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW2_sL1.5/testbench.spice new file mode 100644 index 00000000..bcf1ee08 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW2_sL1.5/testbench.spice @@ -0,0 +1,37 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 IB1 C11_ihp130_sW2_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIB1 IB1 VSS 2e-05 +.nodeset v(IB1)=0.84 + +VCM VCM 0 0.48 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 0.6 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN1 VCM VINT 0 1 +EIN VIN2 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN1) - v(VIN2) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW2_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW2_sL1/case.json new file mode 100644 index 00000000..d1451f4a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW2_sL1/case.json @@ -0,0 +1,230 @@ +{ + "case_id": "C11_ihp130_sW2_sL1", + "circuit_id": "C11", + "pdk": "ihp130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "dut_name": "C11_ihp130_sW2_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "IB1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.26, + "nf": 8 + }, + "M2": { + "w": 8.0, + "l": 0.26, + "nf": 16 + }, + "M3": { + "w": 8.0, + "l": 0.26, + "nf": 16 + }, + "M4": { + "w": 8.0, + "l": 0.26, + "nf": 16 + }, + "M5": { + "w": 4.0, + "l": 0.26, + "nf": 8 + }, + "M6": { + "w": 4.0, + "l": 0.26, + "nf": 8 + }, + "M7": { + "w": 8.0, + "l": 0.26, + "nf": 16 + }, + "M8": { + "w": 8.0, + "l": 0.26, + "nf": 16 + }, + "R1": { + "r": 3000.0, + "body": "VSS", + "w": 1.0, + "l": 11.38 + }, + "C1": { + "c": 1e-12, + "w": 25.82, + "l": 25.82, + "model": "cap_cmim" + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 0.48, + "CL": 1e-12, + "inv_input": "VIN1", + "vout_target": 0.6 + }, + "category": "twostage", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.26, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.26, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.26, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.26, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.26, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "2673c12ef849322d", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8", + "R1", + "C1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW2_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW2_sL1/manifest.json new file mode 100644 index 00000000..6b142d17 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW2_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "d258e2057d7c097ec16e0c3d85fceeb0a53c5bbea80f6ae6f4f9ea9805b3ff54", + "qualification.json": "26f6f2262576f087212e044559152f30824cdf06ed3389a62c6769c880183d7f", + "specs.json": "40f9c168a069b224af918422bb7d7532c29183987b102a52ce8f8621e1da7eca", + "target.spice": "6a436230d4cca872b1863673059db3585632bd850e0b473b8777dc5f1c6f628a", + "target_lvs.spice": "d5bb0c8259ce379bd2a3e85c3fab49b496776d51d9847bf5e08a676e4d00ef9f", + "testbench.spice": "c230533d5e9b4f1562bc727f4c4fc06e33e37d71f67714e6ebce7078f21ac40d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW2_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW2_sL1/qualification.json new file mode 100644 index 00000000..0dc32f62 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW2_sL1/qualification.json @@ -0,0 +1,165 @@ +{ + "case_id": "C11_ihp130_sW2_sL1", + "circuit_id": "C11", + "pdk": "ihp130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "twostage", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.26, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.26, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.26, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.26, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.26, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "2673c12ef849322d", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 44.74 + }, + "ugf": { + "min": 19870000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 47.74041, + "ugf": 33122360.0, + "pm": 84.5240709 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 4.3, + "schematic_measures": { + "vout0": 0.6, + "idd": 9.586525e-05, + "vos": -6.08798e-08, + "gain_lf": 47.74041, + "ph_lf": 0.1800691, + "ugf": 33122360.0, + "ph_ugf": -95.29586, + "f3db": 137634.3, + "pm": 84.5240709 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW2_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW2_sL1/specs.json new file mode 100644 index 00000000..afdfc74f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW2_sL1/specs.json @@ -0,0 +1,30 @@ +{ + "gain_lf": { + "min": 44.74 + }, + "ugf": { + "min": 19870000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 47.74041, + "ugf": 33122360.0, + "pm": 84.5240709 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW2_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW2_sL1/target.spice new file mode 100644 index 00000000..73f42fed --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW2_sL1/target.spice @@ -0,0 +1,12 @@ +.subckt C11_ihp130_sW2_sL1 VDD VSS VIN1 VIN2 VOUT1 IB1 +XM1 IB1 IB1 VDD VDD sg13_lv_pmos w=4u l=0.26u ng=8 m=1 +XM2 net97 IB1 VDD VDD sg13_lv_pmos w=8u l=0.26u ng=16 m=1 +XM3 net014 VIN1 net97 VDD sg13_lv_pmos w=8u l=0.26u ng=16 m=1 +XM4 net016 VIN2 net97 VDD sg13_lv_pmos w=8u l=0.26u ng=16 m=1 +XM5 net014 net014 VSS VSS sg13_lv_nmos w=4u l=0.26u ng=8 m=1 +XM6 net016 net014 VSS VSS sg13_lv_nmos w=4u l=0.26u ng=8 m=1 +XM7 VOUT1 IB1 VDD VDD sg13_lv_pmos w=8u l=0.26u ng=16 m=1 +XM8 VOUT1 net016 VSS VSS sg13_lv_nmos w=8u l=0.26u ng=16 m=1 +XRR1 net016 net022 rppd w=1u l=11.38u m=1 +XCC1 net022 VOUT1 cap_cmim w=25.82u l=25.82u +.ends C11_ihp130_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW2_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW2_sL1/target_lvs.spice new file mode 100644 index 00000000..184c3bde --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW2_sL1/target_lvs.spice @@ -0,0 +1,108 @@ +.subckt C11_ihp130_sW2_sL1 VDD VSS VIN1 VIN2 VOUT1 IB1 +XM1_f0 IB1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM1_f1 IB1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM1_f2 IB1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM1_f3 IB1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM1_f4 IB1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM1_f5 IB1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM1_f6 IB1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM1_f7 IB1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f0 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f1 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f2 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f3 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f4 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f5 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f6 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f7 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f8 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f9 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f10 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f11 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f12 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f13 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f14 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f15 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM3_f0 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.26u +XM3_f1 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.26u +XM3_f2 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.26u +XM3_f3 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.26u +XM3_f4 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.26u +XM3_f5 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.26u +XM3_f6 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.26u +XM3_f7 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.26u +XM3_f8 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.26u +XM3_f9 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.26u +XM3_f10 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.26u +XM3_f11 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.26u +XM3_f12 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.26u +XM3_f13 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.26u +XM3_f14 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.26u +XM3_f15 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f0 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f1 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f2 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f3 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f4 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f5 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f6 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f7 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f8 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f9 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f10 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f11 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f12 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f13 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f14 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f15 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f0 net014 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f1 net014 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f2 net014 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f3 net014 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f4 net014 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f5 net014 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f6 net014 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f7 net014 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM6_f0 net016 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM6_f1 net016 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM6_f2 net016 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM6_f3 net016 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM6_f4 net016 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM6_f5 net016 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM6_f6 net016 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM6_f7 net016 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM7_f0 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f1 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f2 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f3 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f4 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f5 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f6 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f7 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f8 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f9 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f10 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f11 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f12 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f13 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f14 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM7_f15 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM8_f0 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM8_f1 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM8_f2 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM8_f3 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM8_f4 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM8_f5 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM8_f6 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM8_f7 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM8_f8 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM8_f9 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM8_f10 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM8_f11 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM8_f12 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM8_f13 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM8_f14 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM8_f15 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XRR1 net016 net022 rppd w=1u l=11.38u m=1 +XCC1 net022 VOUT1 cap_cmim w=25.82u l=25.82u +.ends C11_ihp130_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW2_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW2_sL1/testbench.spice new file mode 100644 index 00000000..ab78f69d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW2_sL1/testbench.spice @@ -0,0 +1,37 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 IB1 C11_ihp130_sW2_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIB1 IB1 VSS 2e-05 +.nodeset v(IB1)=0.84 + +VCM VCM 0 0.48 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 0.6 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN1 VCM VINT 0 1 +EIN VIN2 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN1) - v(VIN2) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW2_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW2_sL2/case.json new file mode 100644 index 00000000..650811ee --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW2_sL2/case.json @@ -0,0 +1,230 @@ +{ + "case_id": "C11_ihp130_sW2_sL2", + "circuit_id": "C11", + "pdk": "ihp130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "dut_name": "C11_ihp130_sW2_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "IB1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.52, + "nf": 8 + }, + "M2": { + "w": 8.0, + "l": 0.52, + "nf": 16 + }, + "M3": { + "w": 8.0, + "l": 0.52, + "nf": 16 + }, + "M4": { + "w": 8.0, + "l": 0.52, + "nf": 16 + }, + "M5": { + "w": 4.0, + "l": 0.52, + "nf": 8 + }, + "M6": { + "w": 4.0, + "l": 0.52, + "nf": 8 + }, + "M7": { + "w": 8.0, + "l": 0.52, + "nf": 16 + }, + "M8": { + "w": 8.0, + "l": 0.52, + "nf": 16 + }, + "R1": { + "r": 3000.0, + "body": "VSS", + "w": 1.0, + "l": 11.38 + }, + "C1": { + "c": 1e-12, + "w": 25.82, + "l": 25.82, + "model": "cap_cmim" + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 0.48, + "CL": 1e-12, + "inv_input": "VIN1", + "vout_target": 0.6 + }, + "category": "twostage", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "9afe5b647cc2e80b", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8", + "R1", + "C1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW2_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW2_sL2/manifest.json new file mode 100644 index 00000000..ce461a54 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW2_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "e677ba31875ee8d5ae336377cbfc76b20812a12081ff1e1be8f9332231c1a34c", + "qualification.json": "163e4f62fc1eb998ce2bcab9180631968c8df44ea780138419a54aef7a8121d1", + "specs.json": "d1e3fea698ef06557e66a0e91650f94037e79522de6c2afa351e72e827287610", + "target.spice": "3cda494a06e7241626f4c83e2911ce6de696e49a431a1eeae26d27e7d94a84cb", + "target_lvs.spice": "d8b8a36afb93626f4e5af38cdf2eee84be4f1ee358bba2f2eaa4b8dad8e75351", + "testbench.spice": "310bdf79260a6fb095f8d273e4a1553c2ee7ed68d0570ce0bb62ddd75ceea4c1" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW2_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW2_sL2/qualification.json new file mode 100644 index 00000000..d8a49d88 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW2_sL2/qualification.json @@ -0,0 +1,165 @@ +{ + "case_id": "C11_ihp130_sW2_sL2", + "circuit_id": "C11", + "pdk": "ihp130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "twostage", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "9afe5b647cc2e80b", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 49.26 + }, + "ugf": { + "min": 16250000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 52.26004, + "ugf": 27091400.0, + "pm": 78.3270603 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 3.9, + "schematic_measures": { + "vout0": 0.6, + "idd": 9.536886e-05, + "vos": 0.0001160888, + "gain_lf": 52.26004, + "ph_lf": 0.2883397, + "ugf": 27091400.0, + "ph_ugf": -101.3846, + "f3db": 68141.79, + "pm": 78.3270603 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW2_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW2_sL2/specs.json new file mode 100644 index 00000000..ebec6816 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW2_sL2/specs.json @@ -0,0 +1,30 @@ +{ + "gain_lf": { + "min": 49.26 + }, + "ugf": { + "min": 16250000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 52.26004, + "ugf": 27091400.0, + "pm": 78.3270603 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW2_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW2_sL2/target.spice new file mode 100644 index 00000000..b64b75e0 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW2_sL2/target.spice @@ -0,0 +1,12 @@ +.subckt C11_ihp130_sW2_sL2 VDD VSS VIN1 VIN2 VOUT1 IB1 +XM1 IB1 IB1 VDD VDD sg13_lv_pmos w=4u l=0.52u ng=8 m=1 +XM2 net97 IB1 VDD VDD sg13_lv_pmos w=8u l=0.52u ng=16 m=1 +XM3 net014 VIN1 net97 VDD sg13_lv_pmos w=8u l=0.52u ng=16 m=1 +XM4 net016 VIN2 net97 VDD sg13_lv_pmos w=8u l=0.52u ng=16 m=1 +XM5 net014 net014 VSS VSS sg13_lv_nmos w=4u l=0.52u ng=8 m=1 +XM6 net016 net014 VSS VSS sg13_lv_nmos w=4u l=0.52u ng=8 m=1 +XM7 VOUT1 IB1 VDD VDD sg13_lv_pmos w=8u l=0.52u ng=16 m=1 +XM8 VOUT1 net016 VSS VSS sg13_lv_nmos w=8u l=0.52u ng=16 m=1 +XRR1 net016 net022 rppd w=1u l=11.38u m=1 +XCC1 net022 VOUT1 cap_cmim w=25.82u l=25.82u +.ends C11_ihp130_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW2_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW2_sL2/target_lvs.spice new file mode 100644 index 00000000..e6363bdc --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW2_sL2/target_lvs.spice @@ -0,0 +1,108 @@ +.subckt C11_ihp130_sW2_sL2 VDD VSS VIN1 VIN2 VOUT1 IB1 +XM1_f0 IB1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f1 IB1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f2 IB1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f3 IB1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f4 IB1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f5 IB1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f6 IB1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM1_f7 IB1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f0 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f1 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f2 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f3 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f4 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f5 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f6 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f7 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f8 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f9 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f10 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f11 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f12 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f13 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f14 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f15 net97 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM3_f0 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.52u +XM3_f1 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.52u +XM3_f2 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.52u +XM3_f3 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.52u +XM3_f4 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.52u +XM3_f5 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.52u +XM3_f6 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.52u +XM3_f7 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.52u +XM3_f8 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.52u +XM3_f9 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.52u +XM3_f10 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.52u +XM3_f11 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.52u +XM3_f12 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.52u +XM3_f13 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.52u +XM3_f14 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.52u +XM3_f15 net014 VIN1 net97 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f0 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f1 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f2 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f3 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f4 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f5 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f6 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f7 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f8 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f9 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f10 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f11 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f12 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f13 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f14 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f15 net016 VIN2 net97 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f0 net014 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f1 net014 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f2 net014 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f3 net014 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f4 net014 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f5 net014 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f6 net014 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f7 net014 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM6_f0 net016 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM6_f1 net016 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM6_f2 net016 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM6_f3 net016 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM6_f4 net016 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM6_f5 net016 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM6_f6 net016 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM6_f7 net016 net014 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM7_f0 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f1 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f2 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f3 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f4 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f5 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f6 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f7 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f8 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f9 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f10 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f11 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f12 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f13 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f14 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM7_f15 VOUT1 IB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM8_f0 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM8_f1 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM8_f2 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM8_f3 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM8_f4 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM8_f5 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM8_f6 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM8_f7 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM8_f8 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM8_f9 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM8_f10 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM8_f11 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM8_f12 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM8_f13 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM8_f14 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM8_f15 VOUT1 net016 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XRR1 net016 net022 rppd w=1u l=11.38u m=1 +XCC1 net022 VOUT1 cap_cmim w=25.82u l=25.82u +.ends C11_ihp130_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW2_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW2_sL2/testbench.spice new file mode 100644 index 00000000..2c9394b5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/ihp130/sW2_sL2/testbench.spice @@ -0,0 +1,37 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 IB1 C11_ihp130_sW2_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIB1 IB1 VSS 2e-05 +.nodeset v(IB1)=0.84 + +VCM VCM 0 0.48 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 0.6 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN1 VCM VINT 0 1 +EIN VIN2 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN1) - v(VIN2) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C11/sky130/sW0.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW0.5_sL1.5/case.json new file mode 100644 index 00000000..e975bd46 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW0.5_sL1.5/case.json @@ -0,0 +1,230 @@ +{ + "case_id": "C11_sky130_sW0.5_sL1.5", + "circuit_id": "C11", + "pdk": "sky130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "dut_name": "C11_sky130_sW0.5_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "IB1" + ], + "sizing": { + "M1": { + "w": 1.0, + "l": 0.45, + "nf": 2 + }, + "M2": { + "w": 2.0, + "l": 0.45, + "nf": 4 + }, + "M3": { + "w": 2.0, + "l": 0.45, + "nf": 4 + }, + "M4": { + "w": 2.0, + "l": 0.45, + "nf": 4 + }, + "M5": { + "w": 1.0, + "l": 0.45, + "nf": 2 + }, + "M6": { + "w": 1.0, + "l": 0.45, + "nf": 2 + }, + "M7": { + "w": 2.0, + "l": 0.45, + "nf": 4 + }, + "M8": { + "w": 2.0, + "l": 0.45, + "nf": 4 + }, + "R1": { + "r": 3000.0, + "body": "VSS", + "w": 0.35, + "l": 2.155 + }, + "C1": { + "c": 1e-12, + "w": 22.365, + "l": 22.365, + "model": "sky130_fd_pr__cap_mim_m3_1" + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 0.7200000000000001, + "CL": 1e-12, + "inv_input": "VIN1", + "vout_target": 0.9 + }, + "category": "twostage", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.45, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.45, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.45, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "f2fd6a3c14b5b945", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8", + "R1", + "C1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/sky130/sW0.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW0.5_sL1.5/manifest.json new file mode 100644 index 00000000..be9b5e1f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW0.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "13b7c491586b9ad08e6eb4a1c00ad833a709b5d1b686bd0400eacd2951e745ff", + "qualification.json": "3e9f5c25ad008bc6f721259b93ec31cb1a431a0c58b2dbd13938703c770efbaf", + "specs.json": "be6a31806a43fff9979d2cc4a33b32e2febcf21ce90e4c90ba25b78d90e8f435", + "target.spice": "bf7c9097b8d1fa509b0a16fb0bbe1162fff5b5e3a69dc75beaf001d403f4b8a2", + "target_lvs.spice": "e6e4c8bc2dd31b0e8dba9644c9a0864277aa3904b9c9f08e1b709dda17342fb3", + "testbench.spice": "224c2212a2aeec19e1fc1992b312ef8f68cd7d04907904735392cb1501d56a1f" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/sky130/sW0.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW0.5_sL1.5/qualification.json new file mode 100644 index 00000000..4673efc1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW0.5_sL1.5/qualification.json @@ -0,0 +1,165 @@ +{ + "case_id": "C11_sky130_sW0.5_sL1.5", + "circuit_id": "C11", + "pdk": "sky130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "twostage", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.45, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.45, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.45, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "f2fd6a3c14b5b945", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 60.47 + }, + "ugf": { + "min": 3706000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 63.46528, + "ugf": 6177062.0, + "pm": 80.00739835 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 9.1, + "schematic_measures": { + "vout0": 0.9000004, + "idd": 6.628901e-05, + "vos": 0.003838643, + "gain_lf": 63.46528, + "ph_lf": -0.01879835, + "ugf": 6177062.0, + "ph_ugf": -100.0114, + "f3db": 4176.243, + "pm": 80.00739835 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/sky130/sW0.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW0.5_sL1.5/specs.json new file mode 100644 index 00000000..7c87a96e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW0.5_sL1.5/specs.json @@ -0,0 +1,30 @@ +{ + "gain_lf": { + "min": 60.47 + }, + "ugf": { + "min": 3706000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 63.46528, + "ugf": 6177062.0, + "pm": 80.00739835 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/sky130/sW0.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW0.5_sL1.5/target.spice new file mode 100644 index 00000000..2cdf7e40 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW0.5_sL1.5/target.spice @@ -0,0 +1,12 @@ +.subckt C11_sky130_sW0.5_sL1.5 VDD VSS VIN1 VIN2 VOUT1 IB1 +XM1 IB1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=1 l=0.45 nf=2 +XM2 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=2 l=0.45 nf=4 +XM3 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=2 l=0.45 nf=4 +XM4 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=2 l=0.45 nf=4 +XM5 net014 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=1 l=0.45 nf=2 +XM6 net016 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=1 l=0.45 nf=2 +XM7 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=2 l=0.45 nf=4 +XM8 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=2 l=0.45 nf=4 +XRR1 net016 net022 VSS sky130_fd_pr__res_high_po_0p35 l=2.155 mult=1 +XCC1 net022 VOUT1 sky130_fd_pr__cap_mim_m3_1 w=22.365 l=22.365 +.ends C11_sky130_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C11/sky130/sW0.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW0.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..e6853953 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW0.5_sL1.5/target_lvs.spice @@ -0,0 +1,30 @@ +.subckt C11_sky130_sW0.5_sL1.5 VDD VSS VIN1 VIN2 VOUT1 IB1 +XM1_f0 IB1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM1_f1 IB1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f0 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f1 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f2 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f3 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM3_f0 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM3_f1 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM3_f2 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM3_f3 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f0 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f1 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f2 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f3 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f0 net014 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f1 net014 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM6_f0 net016 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM6_f1 net016 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM7_f0 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f1 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f2 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f3 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f0 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM8_f1 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM8_f2 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM8_f3 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XRR1 net016 net022 VSS sky130_fd_pr__res_high_po_0p35 l=2.155 mult=1 +XCC1 net022 VOUT1 sky130_fd_pr__cap_mim_m3_1 w=22.365 l=22.365 +.ends C11_sky130_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C11/sky130/sW0.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW0.5_sL1.5/testbench.spice new file mode 100644 index 00000000..2ec6d58f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW0.5_sL1.5/testbench.spice @@ -0,0 +1,37 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 IB1 C11_sky130_sW0.5_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIB1 IB1 VSS 2e-05 +.nodeset v(IB1)=1.26 + +VCM VCM 0 0.72 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 0.9 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN1 VCM VINT 0 1 +EIN VIN2 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN1) - v(VIN2) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C11/sky130/sW0.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW0.5_sL1/case.json new file mode 100644 index 00000000..2a4731a0 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW0.5_sL1/case.json @@ -0,0 +1,230 @@ +{ + "case_id": "C11_sky130_sW0.5_sL1", + "circuit_id": "C11", + "pdk": "sky130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "dut_name": "C11_sky130_sW0.5_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "IB1" + ], + "sizing": { + "M1": { + "w": 1.0, + "l": 0.3, + "nf": 2 + }, + "M2": { + "w": 2.0, + "l": 0.3, + "nf": 4 + }, + "M3": { + "w": 2.0, + "l": 0.3, + "nf": 4 + }, + "M4": { + "w": 2.0, + "l": 0.3, + "nf": 4 + }, + "M5": { + "w": 1.0, + "l": 0.3, + "nf": 2 + }, + "M6": { + "w": 1.0, + "l": 0.3, + "nf": 2 + }, + "M7": { + "w": 2.0, + "l": 0.3, + "nf": 4 + }, + "M8": { + "w": 2.0, + "l": 0.3, + "nf": 4 + }, + "R1": { + "r": 3000.0, + "body": "VSS", + "w": 0.35, + "l": 2.155 + }, + "C1": { + "c": 1e-12, + "w": 22.365, + "l": 22.365, + "model": "sky130_fd_pr__cap_mim_m3_1" + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 0.7200000000000001, + "CL": 1e-12, + "inv_input": "VIN1", + "vout_target": 0.9 + }, + "category": "twostage", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.3, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.3, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.3, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "b28cc014c5ff4795", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8", + "R1", + "C1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/sky130/sW0.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW0.5_sL1/manifest.json new file mode 100644 index 00000000..ceb28d27 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW0.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "f276a291c77be86a17e080149929c18ed1c36177465f67f6a2b0c8c7ccd1c433", + "qualification.json": "3cf18044eb957bff947ab29871304a69087d968fbeb5c5e4a6b19324a5b22d48", + "specs.json": "1dc84c946f65f384f1687b5063c7651968c6f048f136f54e7262d43c9b23b9f1", + "target.spice": "d3b7b08648aac25214418197cf7d2ad28ecc8df832c725675bce53c4540bfce4", + "target_lvs.spice": "2eb127eedccf82a5f8a2e5f39cfc6b4e4f1bf357189bec86aeeffe42e3f9e3e5", + "testbench.spice": "b3f1a08b61dc5bd5d4227b85f4dd724531b554bec235749f1c49109194665235" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/sky130/sW0.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW0.5_sL1/qualification.json new file mode 100644 index 00000000..01e358da --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW0.5_sL1/qualification.json @@ -0,0 +1,165 @@ +{ + "case_id": "C11_sky130_sW0.5_sL1", + "circuit_id": "C11", + "pdk": "sky130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "twostage", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.3, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.3, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.3, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "b28cc014c5ff4795", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 54.71 + }, + "ugf": { + "min": 5518000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 57.71389, + "ugf": 9196623.0, + "pm": 79.91076799999999 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 8.6, + "schematic_measures": { + "vout0": 0.9000004, + "idd": 7.08425e-05, + "vos": 0.003997836, + "gain_lf": 57.71389, + "ph_lf": 0.221512, + "ugf": 9196623.0, + "ph_ugf": -99.86772, + "f3db": 12107.36, + "pm": 79.91076799999999 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/sky130/sW0.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW0.5_sL1/specs.json new file mode 100644 index 00000000..7b9d3ce7 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW0.5_sL1/specs.json @@ -0,0 +1,30 @@ +{ + "gain_lf": { + "min": 54.71 + }, + "ugf": { + "min": 5518000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 57.71389, + "ugf": 9196623.0, + "pm": 79.91076799999999 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/sky130/sW0.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW0.5_sL1/target.spice new file mode 100644 index 00000000..eec00b04 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW0.5_sL1/target.spice @@ -0,0 +1,12 @@ +.subckt C11_sky130_sW0.5_sL1 VDD VSS VIN1 VIN2 VOUT1 IB1 +XM1 IB1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=1 l=0.3 nf=2 +XM2 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=2 l=0.3 nf=4 +XM3 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=2 l=0.3 nf=4 +XM4 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=2 l=0.3 nf=4 +XM5 net014 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=1 l=0.3 nf=2 +XM6 net016 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=1 l=0.3 nf=2 +XM7 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=2 l=0.3 nf=4 +XM8 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=2 l=0.3 nf=4 +XRR1 net016 net022 VSS sky130_fd_pr__res_high_po_0p35 l=2.155 mult=1 +XCC1 net022 VOUT1 sky130_fd_pr__cap_mim_m3_1 w=22.365 l=22.365 +.ends C11_sky130_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C11/sky130/sW0.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW0.5_sL1/target_lvs.spice new file mode 100644 index 00000000..76d7e1b8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW0.5_sL1/target_lvs.spice @@ -0,0 +1,30 @@ +.subckt C11_sky130_sW0.5_sL1 VDD VSS VIN1 VIN2 VOUT1 IB1 +XM1_f0 IB1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM1_f1 IB1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f0 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f1 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f2 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f3 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM3_f0 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM3_f1 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM3_f2 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM3_f3 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f0 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f1 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f2 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f3 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f0 net014 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f1 net014 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM6_f0 net016 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM6_f1 net016 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM7_f0 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f1 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f2 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f3 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f0 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM8_f1 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM8_f2 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM8_f3 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XRR1 net016 net022 VSS sky130_fd_pr__res_high_po_0p35 l=2.155 mult=1 +XCC1 net022 VOUT1 sky130_fd_pr__cap_mim_m3_1 w=22.365 l=22.365 +.ends C11_sky130_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C11/sky130/sW0.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW0.5_sL1/testbench.spice new file mode 100644 index 00000000..1b2ce41b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW0.5_sL1/testbench.spice @@ -0,0 +1,37 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 IB1 C11_sky130_sW0.5_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIB1 IB1 VSS 2e-05 +.nodeset v(IB1)=1.26 + +VCM VCM 0 0.72 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 0.9 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN1 VCM VINT 0 1 +EIN VIN2 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN1) - v(VIN2) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C11/sky130/sW0.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW0.5_sL2/case.json new file mode 100644 index 00000000..ba3bf28e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW0.5_sL2/case.json @@ -0,0 +1,230 @@ +{ + "case_id": "C11_sky130_sW0.5_sL2", + "circuit_id": "C11", + "pdk": "sky130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "dut_name": "C11_sky130_sW0.5_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "IB1" + ], + "sizing": { + "M1": { + "w": 1.0, + "l": 0.6, + "nf": 2 + }, + "M2": { + "w": 2.0, + "l": 0.6, + "nf": 4 + }, + "M3": { + "w": 2.0, + "l": 0.6, + "nf": 4 + }, + "M4": { + "w": 2.0, + "l": 0.6, + "nf": 4 + }, + "M5": { + "w": 1.0, + "l": 0.6, + "nf": 2 + }, + "M6": { + "w": 1.0, + "l": 0.6, + "nf": 2 + }, + "M7": { + "w": 2.0, + "l": 0.6, + "nf": 4 + }, + "M8": { + "w": 2.0, + "l": 0.6, + "nf": 4 + }, + "R1": { + "r": 3000.0, + "body": "VSS", + "w": 0.35, + "l": 2.155 + }, + "C1": { + "c": 1e-12, + "w": 22.365, + "l": 22.365, + "model": "sky130_fd_pr__cap_mim_m3_1" + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 0.7200000000000001, + "CL": 1e-12, + "inv_input": "VIN1", + "vout_target": 0.9 + }, + "category": "twostage", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.6, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.6, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.6, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "4264c4edf25c1d71", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8", + "R1", + "C1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/sky130/sW0.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW0.5_sL2/manifest.json new file mode 100644 index 00000000..81aa2bc7 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW0.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "6fd10590c936a432fd26fc9b15080be898221e7d9e63d1f29f8ba2e9ae5cb2a3", + "qualification.json": "e37f2bf674cf73f41d25f53b7111e70d35668f73c6b17e420a076902db61c298", + "specs.json": "103cc08c9b290278b03157df589ee7f9f979ce5178a1a5f897fa29ee240ac515", + "target.spice": "92e9943b3b186ee7a3a86ae83fa806bba6e257458a24043d4751c6eafe8c0625", + "target_lvs.spice": "78b07ef6a779ecde4c516e13346ef6fe4967144d53a38604937873ab7225fc59", + "testbench.spice": "cb9547bbc340a1e773224e3d812f8b4a891a8a06e6bc094a8e6f0e8e72326446" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/sky130/sW0.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW0.5_sL2/qualification.json new file mode 100644 index 00000000..61bf9982 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW0.5_sL2/qualification.json @@ -0,0 +1,165 @@ +{ + "case_id": "C11_sky130_sW0.5_sL2", + "circuit_id": "C11", + "pdk": "sky130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "twostage", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.6, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.6, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.6, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "4264c4edf25c1d71", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 64.47 + }, + "ugf": { + "min": 2792000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 67.46989, + "ugf": 4653428.0, + "pm": 80.8851173 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 9.9, + "schematic_measures": { + "vout0": 0.9000003, + "idd": 6.430267e-05, + "vos": 0.003289089, + "gain_lf": 67.46989, + "ph_lf": -0.7426173, + "ugf": 4653428.0, + "ph_ugf": -99.8575, + "f3db": 1980.305, + "pm": 80.8851173 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/sky130/sW0.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW0.5_sL2/specs.json new file mode 100644 index 00000000..2664720d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW0.5_sL2/specs.json @@ -0,0 +1,30 @@ +{ + "gain_lf": { + "min": 64.47 + }, + "ugf": { + "min": 2792000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 67.46989, + "ugf": 4653428.0, + "pm": 80.8851173 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/sky130/sW0.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW0.5_sL2/target.spice new file mode 100644 index 00000000..33b4d6e6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW0.5_sL2/target.spice @@ -0,0 +1,12 @@ +.subckt C11_sky130_sW0.5_sL2 VDD VSS VIN1 VIN2 VOUT1 IB1 +XM1 IB1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=1 l=0.6 nf=2 +XM2 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=2 l=0.6 nf=4 +XM3 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=2 l=0.6 nf=4 +XM4 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=2 l=0.6 nf=4 +XM5 net014 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=1 l=0.6 nf=2 +XM6 net016 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=1 l=0.6 nf=2 +XM7 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=2 l=0.6 nf=4 +XM8 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=2 l=0.6 nf=4 +XRR1 net016 net022 VSS sky130_fd_pr__res_high_po_0p35 l=2.155 mult=1 +XCC1 net022 VOUT1 sky130_fd_pr__cap_mim_m3_1 w=22.365 l=22.365 +.ends C11_sky130_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C11/sky130/sW0.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW0.5_sL2/target_lvs.spice new file mode 100644 index 00000000..e21ac1ab --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW0.5_sL2/target_lvs.spice @@ -0,0 +1,30 @@ +.subckt C11_sky130_sW0.5_sL2 VDD VSS VIN1 VIN2 VOUT1 IB1 +XM1_f0 IB1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f1 IB1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f0 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f1 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f2 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f3 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM3_f0 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM3_f1 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM3_f2 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM3_f3 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f0 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f1 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f2 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f3 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f0 net014 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f1 net014 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM6_f0 net016 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM6_f1 net016 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM7_f0 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f1 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f2 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f3 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f0 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM8_f1 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM8_f2 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM8_f3 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XRR1 net016 net022 VSS sky130_fd_pr__res_high_po_0p35 l=2.155 mult=1 +XCC1 net022 VOUT1 sky130_fd_pr__cap_mim_m3_1 w=22.365 l=22.365 +.ends C11_sky130_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C11/sky130/sW0.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW0.5_sL2/testbench.spice new file mode 100644 index 00000000..04ebcbea --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW0.5_sL2/testbench.spice @@ -0,0 +1,37 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 IB1 C11_sky130_sW0.5_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIB1 IB1 VSS 2e-05 +.nodeset v(IB1)=1.26 + +VCM VCM 0 0.72 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 0.9 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN1 VCM VINT 0 1 +EIN VIN2 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN1) - v(VIN2) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1.5_sL1.5/case.json new file mode 100644 index 00000000..43af85d9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1.5_sL1.5/case.json @@ -0,0 +1,230 @@ +{ + "case_id": "C11_sky130_sW1.5_sL1.5", + "circuit_id": "C11", + "pdk": "sky130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "dut_name": "C11_sky130_sW1.5_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "IB1" + ], + "sizing": { + "M1": { + "w": 3.0, + "l": 0.45, + "nf": 6 + }, + "M2": { + "w": 6.0, + "l": 0.45, + "nf": 12 + }, + "M3": { + "w": 6.0, + "l": 0.45, + "nf": 12 + }, + "M4": { + "w": 6.0, + "l": 0.45, + "nf": 12 + }, + "M5": { + "w": 3.0, + "l": 0.45, + "nf": 6 + }, + "M6": { + "w": 3.0, + "l": 0.45, + "nf": 6 + }, + "M7": { + "w": 6.0, + "l": 0.45, + "nf": 12 + }, + "M8": { + "w": 6.0, + "l": 0.45, + "nf": 12 + }, + "R1": { + "r": 3000.0, + "body": "VSS", + "w": 0.35, + "l": 2.155 + }, + "C1": { + "c": 1e-12, + "w": 22.365, + "l": 22.365, + "model": "sky130_fd_pr__cap_mim_m3_1" + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 0.7200000000000001, + "CL": 1e-12, + "inv_input": "VIN1", + "vout_target": 0.9 + }, + "category": "twostage", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.45, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.45, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.45, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.45, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.45, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.45, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.45, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.45, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "ffa3ae67729e74b2", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8", + "R1", + "C1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1.5_sL1.5/manifest.json new file mode 100644 index 00000000..c824134c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "b5bdb42fc3a2fb98ff222269e237f993816d10d19f989a9a57cafc4d3bb1b534", + "qualification.json": "2d22197cb6b80800fb3514ae9c0b2823c293e77d361784948d77523ce3233f7c", + "specs.json": "94a7b75decdc552461981b2ca0abffff8c33b0067bb96efb5b83e7da3e410e30", + "target.spice": "be352effe3880b14ace33bc6842986b5d0d86ab37bfb8f951ede0f0d02c4fb90", + "target_lvs.spice": "e251ce9363a2676af00fa661c7819a084424449428eca4fc6c64a0b273d4def2", + "testbench.spice": "e8012a27e0427b0e7acc0b3870fdfac3c07857893462f1ec4828aae5a0854989" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1.5_sL1.5/qualification.json new file mode 100644 index 00000000..9612806e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1.5_sL1.5/qualification.json @@ -0,0 +1,165 @@ +{ + "case_id": "C11_sky130_sW1.5_sL1.5", + "circuit_id": "C11", + "pdk": "sky130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "twostage", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.45, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.45, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.45, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.45, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.45, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.45, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.45, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.45, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "ffa3ae67729e74b2", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 64.58 + }, + "ugf": { + "min": 8902000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 67.57983, + "ugf": 14836950.0, + "pm": 81.356473 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 6.7, + "schematic_measures": { + "vout0": 0.9000001, + "idd": 7.584572e-05, + "vos": 0.001411123, + "gain_lf": 67.57983, + "ph_lf": 1.258137, + "ugf": 14836950.0, + "ph_ugf": -97.38539, + "f3db": 6281.387, + "pm": 81.356473 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1.5_sL1.5/specs.json new file mode 100644 index 00000000..cc1a61a1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1.5_sL1.5/specs.json @@ -0,0 +1,30 @@ +{ + "gain_lf": { + "min": 64.58 + }, + "ugf": { + "min": 8902000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 67.57983, + "ugf": 14836950.0, + "pm": 81.356473 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1.5_sL1.5/target.spice new file mode 100644 index 00000000..6f5e23cd --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1.5_sL1.5/target.spice @@ -0,0 +1,12 @@ +.subckt C11_sky130_sW1.5_sL1.5 VDD VSS VIN1 VIN2 VOUT1 IB1 +XM1 IB1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=3 l=0.45 nf=6 +XM2 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=6 l=0.45 nf=12 +XM3 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=6 l=0.45 nf=12 +XM4 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=6 l=0.45 nf=12 +XM5 net014 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=3 l=0.45 nf=6 +XM6 net016 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=3 l=0.45 nf=6 +XM7 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=6 l=0.45 nf=12 +XM8 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=6 l=0.45 nf=12 +XRR1 net016 net022 VSS sky130_fd_pr__res_high_po_0p35 l=2.155 mult=1 +XCC1 net022 VOUT1 sky130_fd_pr__cap_mim_m3_1 w=22.365 l=22.365 +.ends C11_sky130_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..12448e21 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1.5_sL1.5/target_lvs.spice @@ -0,0 +1,82 @@ +.subckt C11_sky130_sW1.5_sL1.5 VDD VSS VIN1 VIN2 VOUT1 IB1 +XM1_f0 IB1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM1_f1 IB1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM1_f2 IB1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM1_f3 IB1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM1_f4 IB1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM1_f5 IB1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f0 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f1 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f2 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f3 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f4 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f5 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f6 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f7 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f8 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f9 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f10 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f11 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM3_f0 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM3_f1 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM3_f2 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM3_f3 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM3_f4 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM3_f5 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM3_f6 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM3_f7 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM3_f8 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM3_f9 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM3_f10 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM3_f11 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f0 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f1 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f2 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f3 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f4 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f5 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f6 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f7 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f8 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f9 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f10 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f11 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f0 net014 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f1 net014 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f2 net014 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f3 net014 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f4 net014 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f5 net014 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM6_f0 net016 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM6_f1 net016 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM6_f2 net016 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM6_f3 net016 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM6_f4 net016 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM6_f5 net016 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM7_f0 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f1 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f2 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f3 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f4 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f5 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f6 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f7 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f8 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f9 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f10 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f11 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f0 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM8_f1 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM8_f2 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM8_f3 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM8_f4 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM8_f5 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM8_f6 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM8_f7 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM8_f8 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM8_f9 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM8_f10 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM8_f11 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XRR1 net016 net022 VSS sky130_fd_pr__res_high_po_0p35 l=2.155 mult=1 +XCC1 net022 VOUT1 sky130_fd_pr__cap_mim_m3_1 w=22.365 l=22.365 +.ends C11_sky130_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1.5_sL1.5/testbench.spice new file mode 100644 index 00000000..63b690cb --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1.5_sL1.5/testbench.spice @@ -0,0 +1,37 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 IB1 C11_sky130_sW1.5_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIB1 IB1 VSS 2e-05 +.nodeset v(IB1)=1.26 + +VCM VCM 0 0.72 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 0.9 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN1 VCM VINT 0 1 +EIN VIN2 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN1) - v(VIN2) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1.5_sL1/case.json new file mode 100644 index 00000000..c28d3536 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1.5_sL1/case.json @@ -0,0 +1,230 @@ +{ + "case_id": "C11_sky130_sW1.5_sL1", + "circuit_id": "C11", + "pdk": "sky130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "dut_name": "C11_sky130_sW1.5_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "IB1" + ], + "sizing": { + "M1": { + "w": 3.0, + "l": 0.3, + "nf": 6 + }, + "M2": { + "w": 6.0, + "l": 0.3, + "nf": 12 + }, + "M3": { + "w": 6.0, + "l": 0.3, + "nf": 12 + }, + "M4": { + "w": 6.0, + "l": 0.3, + "nf": 12 + }, + "M5": { + "w": 3.0, + "l": 0.3, + "nf": 6 + }, + "M6": { + "w": 3.0, + "l": 0.3, + "nf": 6 + }, + "M7": { + "w": 6.0, + "l": 0.3, + "nf": 12 + }, + "M8": { + "w": 6.0, + "l": 0.3, + "nf": 12 + }, + "R1": { + "r": 3000.0, + "body": "VSS", + "w": 0.35, + "l": 2.155 + }, + "C1": { + "c": 1e-12, + "w": 22.365, + "l": 22.365, + "model": "sky130_fd_pr__cap_mim_m3_1" + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 0.7200000000000001, + "CL": 1e-12, + "inv_input": "VIN1", + "vout_target": 0.9 + }, + "category": "twostage", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.3, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.3, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.3, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.3, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.3, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.3, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.3, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.3, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "dc7a3013f5e26714", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8", + "R1", + "C1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1.5_sL1/manifest.json new file mode 100644 index 00000000..b679660d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "14ff2cc934f05d1c2e37db99c6752b8479b52fff8ded7bb79a083df62b29ab41", + "qualification.json": "3938edfaa0ad57e41dc01eb419028e604386423ade0286db9a2a527aeab2fabb", + "specs.json": "c4e22894169482f17af626761e15bd7fd0c92a257dd0b25326fc378fe3760022", + "target.spice": "4a9451daeb81f398ccc629f75394ac91cfceb39c0e382c6269291bcdce6a673e", + "target_lvs.spice": "2e1ad1e9a4bc56f516b3de0337cc158b66a14b7ab5b411c2254db6cc6af5d2dd", + "testbench.spice": "69e1febdafc6634f1dd54ca3da368f9801eee6279a179fce6ddd9b05de072c99" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1.5_sL1/qualification.json new file mode 100644 index 00000000..8ce5df36 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1.5_sL1/qualification.json @@ -0,0 +1,165 @@ +{ + "case_id": "C11_sky130_sW1.5_sL1", + "circuit_id": "C11", + "pdk": "sky130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "twostage", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.3, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.3, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.3, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.3, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.3, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.3, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.3, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.3, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "dc7a3013f5e26714", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 57.29 + }, + "ugf": { + "min": 12250000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 60.28898, + "ugf": 20415820.0, + "pm": 84.0980606 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 8.4, + "schematic_measures": { + "vout0": 0.9000001, + "idd": 8.303241e-05, + "vos": 0.001193754, + "gain_lf": 60.28898, + "ph_lf": 0.6498294, + "ugf": 20415820.0, + "ph_ugf": -95.25211, + "f3db": 19992.76, + "pm": 84.0980606 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1.5_sL1/specs.json new file mode 100644 index 00000000..3a2dcb21 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1.5_sL1/specs.json @@ -0,0 +1,30 @@ +{ + "gain_lf": { + "min": 57.29 + }, + "ugf": { + "min": 12250000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 60.28898, + "ugf": 20415820.0, + "pm": 84.0980606 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1.5_sL1/target.spice new file mode 100644 index 00000000..147eaa03 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1.5_sL1/target.spice @@ -0,0 +1,12 @@ +.subckt C11_sky130_sW1.5_sL1 VDD VSS VIN1 VIN2 VOUT1 IB1 +XM1 IB1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=3 l=0.3 nf=6 +XM2 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=6 l=0.3 nf=12 +XM3 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=6 l=0.3 nf=12 +XM4 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=6 l=0.3 nf=12 +XM5 net014 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=3 l=0.3 nf=6 +XM6 net016 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=3 l=0.3 nf=6 +XM7 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=6 l=0.3 nf=12 +XM8 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=6 l=0.3 nf=12 +XRR1 net016 net022 VSS sky130_fd_pr__res_high_po_0p35 l=2.155 mult=1 +XCC1 net022 VOUT1 sky130_fd_pr__cap_mim_m3_1 w=22.365 l=22.365 +.ends C11_sky130_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1.5_sL1/target_lvs.spice new file mode 100644 index 00000000..3f30f9c7 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1.5_sL1/target_lvs.spice @@ -0,0 +1,82 @@ +.subckt C11_sky130_sW1.5_sL1 VDD VSS VIN1 VIN2 VOUT1 IB1 +XM1_f0 IB1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM1_f1 IB1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM1_f2 IB1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM1_f3 IB1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM1_f4 IB1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM1_f5 IB1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f0 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f1 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f2 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f3 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f4 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f5 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f6 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f7 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f8 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f9 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f10 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f11 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM3_f0 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM3_f1 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM3_f2 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM3_f3 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM3_f4 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM3_f5 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM3_f6 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM3_f7 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM3_f8 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM3_f9 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM3_f10 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM3_f11 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f0 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f1 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f2 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f3 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f4 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f5 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f6 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f7 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f8 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f9 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f10 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f11 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f0 net014 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f1 net014 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f2 net014 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f3 net014 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f4 net014 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f5 net014 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM6_f0 net016 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM6_f1 net016 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM6_f2 net016 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM6_f3 net016 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM6_f4 net016 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM6_f5 net016 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM7_f0 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f1 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f2 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f3 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f4 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f5 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f6 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f7 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f8 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f9 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f10 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f11 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f0 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM8_f1 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM8_f2 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM8_f3 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM8_f4 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM8_f5 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM8_f6 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM8_f7 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM8_f8 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM8_f9 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM8_f10 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM8_f11 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XRR1 net016 net022 VSS sky130_fd_pr__res_high_po_0p35 l=2.155 mult=1 +XCC1 net022 VOUT1 sky130_fd_pr__cap_mim_m3_1 w=22.365 l=22.365 +.ends C11_sky130_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1.5_sL1/testbench.spice new file mode 100644 index 00000000..0d55c47f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1.5_sL1/testbench.spice @@ -0,0 +1,37 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 IB1 C11_sky130_sW1.5_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIB1 IB1 VSS 2e-05 +.nodeset v(IB1)=1.26 + +VCM VCM 0 0.72 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 0.9 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN1 VCM VINT 0 1 +EIN VIN2 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN1) - v(VIN2) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1.5_sL2/case.json new file mode 100644 index 00000000..31e1a711 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1.5_sL2/case.json @@ -0,0 +1,230 @@ +{ + "case_id": "C11_sky130_sW1.5_sL2", + "circuit_id": "C11", + "pdk": "sky130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "dut_name": "C11_sky130_sW1.5_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "IB1" + ], + "sizing": { + "M1": { + "w": 3.0, + "l": 0.6, + "nf": 6 + }, + "M2": { + "w": 6.0, + "l": 0.6, + "nf": 12 + }, + "M3": { + "w": 6.0, + "l": 0.6, + "nf": 12 + }, + "M4": { + "w": 6.0, + "l": 0.6, + "nf": 12 + }, + "M5": { + "w": 3.0, + "l": 0.6, + "nf": 6 + }, + "M6": { + "w": 3.0, + "l": 0.6, + "nf": 6 + }, + "M7": { + "w": 6.0, + "l": 0.6, + "nf": 12 + }, + "M8": { + "w": 6.0, + "l": 0.6, + "nf": 12 + }, + "R1": { + "r": 3000.0, + "body": "VSS", + "w": 0.35, + "l": 2.155 + }, + "C1": { + "c": 1e-12, + "w": 22.365, + "l": 22.365, + "model": "sky130_fd_pr__cap_mim_m3_1" + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 0.7200000000000001, + "CL": 1e-12, + "inv_input": "VIN1", + "vout_target": 0.9 + }, + "category": "twostage", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.6, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.6, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.6, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.6, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.6, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.6, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.6, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.6, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "04830be76542c849", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8", + "R1", + "C1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1.5_sL2/manifest.json new file mode 100644 index 00000000..767e2e90 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "10c3c50a82fe3778504aef135cc413c79b4960b723db6d96332779f27f0ce185", + "qualification.json": "700d99c8fe7ca5b0d0e4540a4df33780bd095fb553d94b6b4feb1a36ff88bcec", + "specs.json": "bda53321ca9099a50ed95567d81ae835c83c84834a82de231915536d7dce40e7", + "target.spice": "cb0ed389d5278c668d7560292881bdbd33ce3ef8a53e4034987fb60b11e25caf", + "target_lvs.spice": "864a7ca865af31a9b522eea17580628c8e6b6c275f2a922ff832471258dee408", + "testbench.spice": "afcfdf3fef9b0bdd055501c1d0c8633af86aef5fc96693eef081f7e5be504561" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1.5_sL2/qualification.json new file mode 100644 index 00000000..58fe63e9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1.5_sL2/qualification.json @@ -0,0 +1,165 @@ +{ + "case_id": "C11_sky130_sW1.5_sL2", + "circuit_id": "C11", + "pdk": "sky130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "twostage", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.6, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.6, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.6, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.6, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.6, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.6, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.6, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.6, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "04830be76542c849", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 70.23 + }, + "ugf": { + "min": 6970000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 73.23297, + "ugf": 11617010.0, + "pm": 79.454114 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 6.8, + "schematic_measures": { + "vout0": 0.9000001, + "idd": 7.204728e-05, + "vos": 0.00132239, + "gain_lf": 73.23297, + "ph_lf": 1.933746, + "ugf": 11617010.0, + "ph_ugf": -98.61214, + "f3db": 2568.78, + "pm": 79.454114 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1.5_sL2/specs.json new file mode 100644 index 00000000..298d1298 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1.5_sL2/specs.json @@ -0,0 +1,30 @@ +{ + "gain_lf": { + "min": 70.23 + }, + "ugf": { + "min": 6970000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 73.23297, + "ugf": 11617010.0, + "pm": 79.454114 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1.5_sL2/target.spice new file mode 100644 index 00000000..032de3bd --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1.5_sL2/target.spice @@ -0,0 +1,12 @@ +.subckt C11_sky130_sW1.5_sL2 VDD VSS VIN1 VIN2 VOUT1 IB1 +XM1 IB1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=3 l=0.6 nf=6 +XM2 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=6 l=0.6 nf=12 +XM3 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=6 l=0.6 nf=12 +XM4 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=6 l=0.6 nf=12 +XM5 net014 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=3 l=0.6 nf=6 +XM6 net016 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=3 l=0.6 nf=6 +XM7 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=6 l=0.6 nf=12 +XM8 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=6 l=0.6 nf=12 +XRR1 net016 net022 VSS sky130_fd_pr__res_high_po_0p35 l=2.155 mult=1 +XCC1 net022 VOUT1 sky130_fd_pr__cap_mim_m3_1 w=22.365 l=22.365 +.ends C11_sky130_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1.5_sL2/target_lvs.spice new file mode 100644 index 00000000..6d1315ab --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1.5_sL2/target_lvs.spice @@ -0,0 +1,82 @@ +.subckt C11_sky130_sW1.5_sL2 VDD VSS VIN1 VIN2 VOUT1 IB1 +XM1_f0 IB1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f1 IB1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f2 IB1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f3 IB1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f4 IB1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f5 IB1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f0 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f1 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f2 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f3 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f4 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f5 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f6 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f7 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f8 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f9 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f10 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f11 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM3_f0 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM3_f1 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM3_f2 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM3_f3 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM3_f4 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM3_f5 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM3_f6 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM3_f7 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM3_f8 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM3_f9 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM3_f10 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM3_f11 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f0 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f1 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f2 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f3 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f4 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f5 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f6 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f7 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f8 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f9 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f10 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f11 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f0 net014 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f1 net014 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f2 net014 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f3 net014 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f4 net014 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f5 net014 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM6_f0 net016 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM6_f1 net016 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM6_f2 net016 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM6_f3 net016 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM6_f4 net016 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM6_f5 net016 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM7_f0 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f1 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f2 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f3 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f4 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f5 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f6 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f7 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f8 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f9 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f10 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f11 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f0 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM8_f1 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM8_f2 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM8_f3 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM8_f4 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM8_f5 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM8_f6 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM8_f7 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM8_f8 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM8_f9 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM8_f10 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM8_f11 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XRR1 net016 net022 VSS sky130_fd_pr__res_high_po_0p35 l=2.155 mult=1 +XCC1 net022 VOUT1 sky130_fd_pr__cap_mim_m3_1 w=22.365 l=22.365 +.ends C11_sky130_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1.5_sL2/testbench.spice new file mode 100644 index 00000000..2d56ddba --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1.5_sL2/testbench.spice @@ -0,0 +1,37 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 IB1 C11_sky130_sW1.5_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIB1 IB1 VSS 2e-05 +.nodeset v(IB1)=1.26 + +VCM VCM 0 0.72 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 0.9 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN1 VCM VINT 0 1 +EIN VIN2 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN1) - v(VIN2) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1_sL1.5/case.json new file mode 100644 index 00000000..eea9d567 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1_sL1.5/case.json @@ -0,0 +1,230 @@ +{ + "case_id": "C11_sky130_sW1_sL1.5", + "circuit_id": "C11", + "pdk": "sky130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "dut_name": "C11_sky130_sW1_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "IB1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.45, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.45, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 0.45, + "nf": 8 + }, + "M4": { + "w": 4.0, + "l": 0.45, + "nf": 8 + }, + "M5": { + "w": 2.0, + "l": 0.45, + "nf": 4 + }, + "M6": { + "w": 2.0, + "l": 0.45, + "nf": 4 + }, + "M7": { + "w": 4.0, + "l": 0.45, + "nf": 8 + }, + "M8": { + "w": 4.0, + "l": 0.45, + "nf": 8 + }, + "R1": { + "r": 3000.0, + "body": "VSS", + "w": 0.35, + "l": 2.155 + }, + "C1": { + "c": 1e-12, + "w": 22.365, + "l": 22.365, + "model": "sky130_fd_pr__cap_mim_m3_1" + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 0.7200000000000001, + "CL": 1e-12, + "inv_input": "VIN1", + "vout_target": 0.9 + }, + "category": "twostage", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "2d7b224f2eca0675", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8", + "R1", + "C1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1_sL1.5/manifest.json new file mode 100644 index 00000000..ed909493 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "4314885db44e91d48c4e60df496094e14ebf398518dd1f1e60b69c0e749c8ad4", + "qualification.json": "7b1e802c83a9163e3ce905524da3f5ec9820dc089abb7fc5734274c2ac31d033", + "specs.json": "e980ec32b756d19fba2e0c84c5c5184d09b7efe41d701f4180183230100bfa23", + "target.spice": "4a6211b883b9079b9803200abec3f6efed5def50dd8a655c5965bc990d806b96", + "target_lvs.spice": "efba59fd420cda24f6cad9e2470cc4caa3af329529cb4cd779aa9725c0c99c8d", + "testbench.spice": "fcbd7f9ba938e32fd66f4011be4c1dd556b03fc9870207f10453dee730be5a7b" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1_sL1.5/qualification.json new file mode 100644 index 00000000..feb12c33 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1_sL1.5/qualification.json @@ -0,0 +1,165 @@ +{ + "case_id": "C11_sky130_sW1_sL1.5", + "circuit_id": "C11", + "pdk": "sky130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "twostage", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "2d7b224f2eca0675", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 63.38 + }, + "ugf": { + "min": 6534000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 66.38135, + "ugf": 10889710.0, + "pm": 80.4318989 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 10.7, + "schematic_measures": { + "vout0": 0.9000002, + "idd": 7.1761e-05, + "vos": 0.002102033, + "gain_lf": 66.38135, + "ph_lf": 0.8071111, + "ugf": 10889710.0, + "ph_ugf": -98.76099, + "f3db": 5288.982, + "pm": 80.4318989 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1_sL1.5/specs.json new file mode 100644 index 00000000..6ba20d29 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1_sL1.5/specs.json @@ -0,0 +1,30 @@ +{ + "gain_lf": { + "min": 63.38 + }, + "ugf": { + "min": 6534000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 66.38135, + "ugf": 10889710.0, + "pm": 80.4318989 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1_sL1.5/target.spice new file mode 100644 index 00000000..428de3e0 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1_sL1.5/target.spice @@ -0,0 +1,12 @@ +.subckt C11_sky130_sW1_sL1.5 VDD VSS VIN1 VIN2 VOUT1 IB1 +XM1 IB1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=2 l=0.45 nf=4 +XM2 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=4 l=0.45 nf=8 +XM3 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=4 l=0.45 nf=8 +XM4 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=4 l=0.45 nf=8 +XM5 net014 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=2 l=0.45 nf=4 +XM6 net016 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=2 l=0.45 nf=4 +XM7 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=4 l=0.45 nf=8 +XM8 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=4 l=0.45 nf=8 +XRR1 net016 net022 VSS sky130_fd_pr__res_high_po_0p35 l=2.155 mult=1 +XCC1 net022 VOUT1 sky130_fd_pr__cap_mim_m3_1 w=22.365 l=22.365 +.ends C11_sky130_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1_sL1.5/target_lvs.spice new file mode 100644 index 00000000..3856740e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1_sL1.5/target_lvs.spice @@ -0,0 +1,56 @@ +.subckt C11_sky130_sW1_sL1.5 VDD VSS VIN1 VIN2 VOUT1 IB1 +XM1_f0 IB1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM1_f1 IB1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM1_f2 IB1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM1_f3 IB1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f0 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f1 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f2 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f3 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f4 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f5 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f6 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f7 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM3_f0 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM3_f1 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM3_f2 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM3_f3 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM3_f4 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM3_f5 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM3_f6 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM3_f7 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f0 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f1 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f2 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f3 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f4 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f5 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f6 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f7 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f0 net014 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f1 net014 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f2 net014 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f3 net014 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM6_f0 net016 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM6_f1 net016 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM6_f2 net016 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM6_f3 net016 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM7_f0 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f1 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f2 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f3 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f4 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f5 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f6 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f7 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f0 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM8_f1 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM8_f2 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM8_f3 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM8_f4 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM8_f5 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM8_f6 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM8_f7 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XRR1 net016 net022 VSS sky130_fd_pr__res_high_po_0p35 l=2.155 mult=1 +XCC1 net022 VOUT1 sky130_fd_pr__cap_mim_m3_1 w=22.365 l=22.365 +.ends C11_sky130_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1_sL1.5/testbench.spice new file mode 100644 index 00000000..dd525a83 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1_sL1.5/testbench.spice @@ -0,0 +1,37 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 IB1 C11_sky130_sW1_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIB1 IB1 VSS 2e-05 +.nodeset v(IB1)=1.26 + +VCM VCM 0 0.72 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 0.9 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN1 VCM VINT 0 1 +EIN VIN2 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN1) - v(VIN2) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1_sL1/case.json new file mode 100644 index 00000000..1eb60a79 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1_sL1/case.json @@ -0,0 +1,230 @@ +{ + "case_id": "C11_sky130_sW1_sL1", + "circuit_id": "C11", + "pdk": "sky130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "dut_name": "C11_sky130_sW1_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "IB1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.3, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.3, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 0.3, + "nf": 8 + }, + "M4": { + "w": 4.0, + "l": 0.3, + "nf": 8 + }, + "M5": { + "w": 2.0, + "l": 0.3, + "nf": 4 + }, + "M6": { + "w": 2.0, + "l": 0.3, + "nf": 4 + }, + "M7": { + "w": 4.0, + "l": 0.3, + "nf": 8 + }, + "M8": { + "w": 4.0, + "l": 0.3, + "nf": 8 + }, + "R1": { + "r": 3000.0, + "body": "VSS", + "w": 0.35, + "l": 2.155 + }, + "C1": { + "c": 1e-12, + "w": 22.365, + "l": 22.365, + "model": "sky130_fd_pr__cap_mim_m3_1" + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 0.7200000000000001, + "CL": 1e-12, + "inv_input": "VIN1", + "vout_target": 0.9 + }, + "category": "twostage", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "aa6df86bf40f1e84", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8", + "R1", + "C1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1_sL1/manifest.json new file mode 100644 index 00000000..a2654c7a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "990425fb2a1806ab99156899c963ed99abbe316a80137b010eac190dcaf57e40", + "qualification.json": "7d3c04f457710d863a50577b604cde9fc341635e6fd2b76629aeb7cf6ae53f90", + "specs.json": "0f0efff214196c6b2dd437d09a8eb1cc9fae5b95491fc282dfca437e084dcdc6", + "target.spice": "a9eec135586e1b8a89a790f66139d4c6bb8a092beda0a37e83533c395ac96716", + "target_lvs.spice": "64368b66f18470ed4a994ad7036717924c84860e10e9fd7ac409b61bf2322e31", + "testbench.spice": "dc63de854cca3e27a51daa85a4093c8b7747e16508309dbb85d01011a2bc0120" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1_sL1/qualification.json new file mode 100644 index 00000000..e0956913 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1_sL1/qualification.json @@ -0,0 +1,165 @@ +{ + "case_id": "C11_sky130_sW1_sL1", + "circuit_id": "C11", + "pdk": "sky130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "twostage", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "aa6df86bf40f1e84", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 56.62 + }, + "ugf": { + "min": 9313000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 59.62107, + "ugf": 15521590.0, + "pm": 82.0995872 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 7.9, + "schematic_measures": { + "vout0": 0.9000002, + "idd": 7.821191e-05, + "vos": 0.001955459, + "gain_lf": 59.62107, + "ph_lf": 0.5179528, + "ugf": 15521590.0, + "ph_ugf": -97.38246, + "f3db": 16466.22, + "pm": 82.0995872 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1_sL1/specs.json new file mode 100644 index 00000000..394d3f32 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1_sL1/specs.json @@ -0,0 +1,30 @@ +{ + "gain_lf": { + "min": 56.62 + }, + "ugf": { + "min": 9313000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 59.62107, + "ugf": 15521590.0, + "pm": 82.0995872 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1_sL1/target.spice new file mode 100644 index 00000000..4db45b01 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1_sL1/target.spice @@ -0,0 +1,12 @@ +.subckt C11_sky130_sW1_sL1 VDD VSS VIN1 VIN2 VOUT1 IB1 +XM1 IB1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=2 l=0.3 nf=4 +XM2 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=4 l=0.3 nf=8 +XM3 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=4 l=0.3 nf=8 +XM4 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=4 l=0.3 nf=8 +XM5 net014 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=2 l=0.3 nf=4 +XM6 net016 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=2 l=0.3 nf=4 +XM7 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=4 l=0.3 nf=8 +XM8 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=4 l=0.3 nf=8 +XRR1 net016 net022 VSS sky130_fd_pr__res_high_po_0p35 l=2.155 mult=1 +XCC1 net022 VOUT1 sky130_fd_pr__cap_mim_m3_1 w=22.365 l=22.365 +.ends C11_sky130_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1_sL1/target_lvs.spice new file mode 100644 index 00000000..084bb34d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1_sL1/target_lvs.spice @@ -0,0 +1,56 @@ +.subckt C11_sky130_sW1_sL1 VDD VSS VIN1 VIN2 VOUT1 IB1 +XM1_f0 IB1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM1_f1 IB1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM1_f2 IB1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM1_f3 IB1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f0 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f1 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f2 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f3 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f4 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f5 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f6 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f7 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM3_f0 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM3_f1 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM3_f2 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM3_f3 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM3_f4 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM3_f5 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM3_f6 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM3_f7 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f0 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f1 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f2 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f3 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f4 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f5 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f6 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f7 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f0 net014 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f1 net014 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f2 net014 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f3 net014 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM6_f0 net016 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM6_f1 net016 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM6_f2 net016 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM6_f3 net016 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM7_f0 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f1 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f2 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f3 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f4 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f5 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f6 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f7 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f0 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM8_f1 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM8_f2 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM8_f3 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM8_f4 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM8_f5 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM8_f6 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM8_f7 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XRR1 net016 net022 VSS sky130_fd_pr__res_high_po_0p35 l=2.155 mult=1 +XCC1 net022 VOUT1 sky130_fd_pr__cap_mim_m3_1 w=22.365 l=22.365 +.ends C11_sky130_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1_sL1/testbench.spice new file mode 100644 index 00000000..936aff4c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1_sL1/testbench.spice @@ -0,0 +1,37 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 IB1 C11_sky130_sW1_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIB1 IB1 VSS 2e-05 +.nodeset v(IB1)=1.26 + +VCM VCM 0 0.72 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 0.9 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN1 VCM VINT 0 1 +EIN VIN2 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN1) - v(VIN2) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1_sL2/case.json new file mode 100644 index 00000000..14656ad1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1_sL2/case.json @@ -0,0 +1,230 @@ +{ + "case_id": "C11_sky130_sW1_sL2", + "circuit_id": "C11", + "pdk": "sky130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "dut_name": "C11_sky130_sW1_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "IB1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.6, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.6, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 0.6, + "nf": 8 + }, + "M4": { + "w": 4.0, + "l": 0.6, + "nf": 8 + }, + "M5": { + "w": 2.0, + "l": 0.6, + "nf": 4 + }, + "M6": { + "w": 2.0, + "l": 0.6, + "nf": 4 + }, + "M7": { + "w": 4.0, + "l": 0.6, + "nf": 8 + }, + "M8": { + "w": 4.0, + "l": 0.6, + "nf": 8 + }, + "R1": { + "r": 3000.0, + "body": "VSS", + "w": 0.35, + "l": 2.155 + }, + "C1": { + "c": 1e-12, + "w": 22.365, + "l": 22.365, + "model": "sky130_fd_pr__cap_mim_m3_1" + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 0.7200000000000001, + "CL": 1e-12, + "inv_input": "VIN1", + "vout_target": 0.9 + }, + "category": "twostage", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "9354e6f133edc4c0", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8", + "R1", + "C1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1_sL2/manifest.json new file mode 100644 index 00000000..9bfa64d5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "5dcb9a8552eb3c162b3e9798d3f4628c0ab157ca6de7b1ee65cf7723139803a6", + "qualification.json": "2ebf6b750d342bc65c2e9526555e634098517c6cd7b8faf0fdfa41b9ae49d5c0", + "specs.json": "472c751cd413fddd5679033bfe5b7607613fdf20a22677a3b8a83261c56a9b51", + "target.spice": "8c980d6c2566017bf3b085af3c0b7000eb5986f1f5472389e48ca7078276795a", + "target_lvs.spice": "2341aa1fb4539345ee1a46c7dbb0efb8490dcc18b6554322d540dbf8b2578c00", + "testbench.spice": "1f3cb286d18f425f6c3e045777ea2725462e9c547b4a252a84ab67d21a6bd5bb" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1_sL2/qualification.json new file mode 100644 index 00000000..51d0e77c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1_sL2/qualification.json @@ -0,0 +1,165 @@ +{ + "case_id": "C11_sky130_sW1_sL2", + "circuit_id": "C11", + "pdk": "sky130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "twostage", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "9354e6f133edc4c0", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 68.48 + }, + "ugf": { + "min": 5037000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 71.48478, + "ugf": 8395595.0, + "pm": 79.7019255 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 10.3, + "schematic_measures": { + "vout0": 0.9000002, + "idd": 6.866944e-05, + "vos": 0.001888361, + "gain_lf": 71.48478, + "ph_lf": 0.8750745, + "ugf": 8395595.0, + "ph_ugf": -99.423, + "f3db": 2263.368, + "pm": 79.7019255 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1_sL2/specs.json new file mode 100644 index 00000000..e73da8c7 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1_sL2/specs.json @@ -0,0 +1,30 @@ +{ + "gain_lf": { + "min": 68.48 + }, + "ugf": { + "min": 5037000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 71.48478, + "ugf": 8395595.0, + "pm": 79.7019255 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1_sL2/target.spice new file mode 100644 index 00000000..3133c1b3 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1_sL2/target.spice @@ -0,0 +1,12 @@ +.subckt C11_sky130_sW1_sL2 VDD VSS VIN1 VIN2 VOUT1 IB1 +XM1 IB1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=2 l=0.6 nf=4 +XM2 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=4 l=0.6 nf=8 +XM3 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=4 l=0.6 nf=8 +XM4 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=4 l=0.6 nf=8 +XM5 net014 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=2 l=0.6 nf=4 +XM6 net016 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=2 l=0.6 nf=4 +XM7 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=4 l=0.6 nf=8 +XM8 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=4 l=0.6 nf=8 +XRR1 net016 net022 VSS sky130_fd_pr__res_high_po_0p35 l=2.155 mult=1 +XCC1 net022 VOUT1 sky130_fd_pr__cap_mim_m3_1 w=22.365 l=22.365 +.ends C11_sky130_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1_sL2/target_lvs.spice new file mode 100644 index 00000000..c921c356 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1_sL2/target_lvs.spice @@ -0,0 +1,56 @@ +.subckt C11_sky130_sW1_sL2 VDD VSS VIN1 VIN2 VOUT1 IB1 +XM1_f0 IB1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f1 IB1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f2 IB1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f3 IB1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f0 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f1 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f2 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f3 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f4 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f5 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f6 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f7 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM3_f0 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM3_f1 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM3_f2 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM3_f3 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM3_f4 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM3_f5 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM3_f6 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM3_f7 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f0 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f1 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f2 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f3 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f4 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f5 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f6 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f7 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f0 net014 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f1 net014 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f2 net014 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f3 net014 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM6_f0 net016 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM6_f1 net016 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM6_f2 net016 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM6_f3 net016 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM7_f0 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f1 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f2 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f3 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f4 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f5 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f6 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f7 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f0 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM8_f1 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM8_f2 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM8_f3 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM8_f4 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM8_f5 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM8_f6 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM8_f7 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XRR1 net016 net022 VSS sky130_fd_pr__res_high_po_0p35 l=2.155 mult=1 +XCC1 net022 VOUT1 sky130_fd_pr__cap_mim_m3_1 w=22.365 l=22.365 +.ends C11_sky130_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1_sL2/testbench.spice new file mode 100644 index 00000000..de3726ee --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW1_sL2/testbench.spice @@ -0,0 +1,37 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 IB1 C11_sky130_sW1_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIB1 IB1 VSS 2e-05 +.nodeset v(IB1)=1.26 + +VCM VCM 0 0.72 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 0.9 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN1 VCM VINT 0 1 +EIN VIN2 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN1) - v(VIN2) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C11/sky130/sW2_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW2_sL1.5/case.json new file mode 100644 index 00000000..5ff3366b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW2_sL1.5/case.json @@ -0,0 +1,230 @@ +{ + "case_id": "C11_sky130_sW2_sL1.5", + "circuit_id": "C11", + "pdk": "sky130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "dut_name": "C11_sky130_sW2_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "IB1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.45, + "nf": 8 + }, + "M2": { + "w": 8.0, + "l": 0.45, + "nf": 16 + }, + "M3": { + "w": 8.0, + "l": 0.45, + "nf": 16 + }, + "M4": { + "w": 8.0, + "l": 0.45, + "nf": 16 + }, + "M5": { + "w": 4.0, + "l": 0.45, + "nf": 8 + }, + "M6": { + "w": 4.0, + "l": 0.45, + "nf": 8 + }, + "M7": { + "w": 8.0, + "l": 0.45, + "nf": 16 + }, + "M8": { + "w": 8.0, + "l": 0.45, + "nf": 16 + }, + "R1": { + "r": 3000.0, + "body": "VSS", + "w": 0.35, + "l": 2.155 + }, + "C1": { + "c": 1e-12, + "w": 22.365, + "l": 22.365, + "model": "sky130_fd_pr__cap_mim_m3_1" + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 0.7200000000000001, + "CL": 1e-12, + "inv_input": "VIN1", + "vout_target": 0.9 + }, + "category": "twostage", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "571b9207288eaf32", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8", + "R1", + "C1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/sky130/sW2_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW2_sL1.5/manifest.json new file mode 100644 index 00000000..cd36c25c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW2_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "2798ffd1fc4032df1c19d934d81d407154727374e9145f4cfbc414edda8d471f", + "qualification.json": "18bd231565826c2c16b4d4ed1e4085d5878bb080835674bac10ac02f6b4aa109", + "specs.json": "00b1d0378c57d39ec542612e98aa5c122de600ab9a0eafe30f01dd797a45b540", + "target.spice": "9ce6ff8e5bc6f2943e7f4dbf34d12c6d452802eb76db97261681f83078450173", + "target_lvs.spice": "14bad3e9fe8883b2cafb391c9bfeb755885b3ce8eaadceed33bd20913e378104", + "testbench.spice": "b610ae8fd50419e45013e94c411e69a51c3b19e5f14e43577ad3654989ef169f" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/sky130/sW2_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW2_sL1.5/qualification.json new file mode 100644 index 00000000..840c79b7 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW2_sL1.5/qualification.json @@ -0,0 +1,165 @@ +{ + "case_id": "C11_sky130_sW2_sL1.5", + "circuit_id": "C11", + "pdk": "sky130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "twostage", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "571b9207288eaf32", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 65.25 + }, + "ugf": { + "min": 10950000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 68.24719, + "ugf": 18256050.0, + "pm": 82.302631 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 9.5, + "schematic_measures": { + "vout0": 0.9000001, + "idd": 7.911434e-05, + "vos": 0.001030174, + "gain_lf": 68.24719, + "ph_lf": 1.542879, + "ugf": 18256050.0, + "ph_ugf": -96.15449, + "f3db": 7148.059, + "pm": 82.302631 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/sky130/sW2_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW2_sL1.5/specs.json new file mode 100644 index 00000000..d6e6a1f4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW2_sL1.5/specs.json @@ -0,0 +1,30 @@ +{ + "gain_lf": { + "min": 65.25 + }, + "ugf": { + "min": 10950000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 68.24719, + "ugf": 18256050.0, + "pm": 82.302631 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/sky130/sW2_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW2_sL1.5/target.spice new file mode 100644 index 00000000..af81d109 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW2_sL1.5/target.spice @@ -0,0 +1,12 @@ +.subckt C11_sky130_sW2_sL1.5 VDD VSS VIN1 VIN2 VOUT1 IB1 +XM1 IB1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=4 l=0.45 nf=8 +XM2 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=8 l=0.45 nf=16 +XM3 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=8 l=0.45 nf=16 +XM4 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=8 l=0.45 nf=16 +XM5 net014 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=4 l=0.45 nf=8 +XM6 net016 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=4 l=0.45 nf=8 +XM7 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=8 l=0.45 nf=16 +XM8 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=8 l=0.45 nf=16 +XRR1 net016 net022 VSS sky130_fd_pr__res_high_po_0p35 l=2.155 mult=1 +XCC1 net022 VOUT1 sky130_fd_pr__cap_mim_m3_1 w=22.365 l=22.365 +.ends C11_sky130_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C11/sky130/sW2_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW2_sL1.5/target_lvs.spice new file mode 100644 index 00000000..eafc3c14 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW2_sL1.5/target_lvs.spice @@ -0,0 +1,108 @@ +.subckt C11_sky130_sW2_sL1.5 VDD VSS VIN1 VIN2 VOUT1 IB1 +XM1_f0 IB1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM1_f1 IB1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM1_f2 IB1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM1_f3 IB1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM1_f4 IB1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM1_f5 IB1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM1_f6 IB1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM1_f7 IB1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f0 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f1 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f2 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f3 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f4 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f5 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f6 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f7 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f8 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f9 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f10 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f11 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f12 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f13 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f14 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f15 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM3_f0 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM3_f1 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM3_f2 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM3_f3 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM3_f4 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM3_f5 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM3_f6 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM3_f7 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM3_f8 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM3_f9 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM3_f10 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM3_f11 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM3_f12 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM3_f13 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM3_f14 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM3_f15 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f0 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f1 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f2 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f3 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f4 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f5 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f6 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f7 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f8 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f9 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f10 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f11 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f12 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f13 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f14 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f15 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f0 net014 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f1 net014 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f2 net014 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f3 net014 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f4 net014 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f5 net014 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f6 net014 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f7 net014 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM6_f0 net016 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM6_f1 net016 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM6_f2 net016 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM6_f3 net016 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM6_f4 net016 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM6_f5 net016 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM6_f6 net016 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM6_f7 net016 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM7_f0 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f1 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f2 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f3 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f4 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f5 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f6 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f7 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f8 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f9 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f10 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f11 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f12 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f13 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f14 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM7_f15 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM8_f0 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM8_f1 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM8_f2 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM8_f3 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM8_f4 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM8_f5 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM8_f6 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM8_f7 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM8_f8 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM8_f9 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM8_f10 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM8_f11 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM8_f12 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM8_f13 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM8_f14 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM8_f15 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XRR1 net016 net022 VSS sky130_fd_pr__res_high_po_0p35 l=2.155 mult=1 +XCC1 net022 VOUT1 sky130_fd_pr__cap_mim_m3_1 w=22.365 l=22.365 +.ends C11_sky130_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C11/sky130/sW2_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW2_sL1.5/testbench.spice new file mode 100644 index 00000000..97f37e99 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW2_sL1.5/testbench.spice @@ -0,0 +1,37 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 IB1 C11_sky130_sW2_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIB1 IB1 VSS 2e-05 +.nodeset v(IB1)=1.26 + +VCM VCM 0 0.72 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 0.9 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN1 VCM VINT 0 1 +EIN VIN2 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN1) - v(VIN2) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C11/sky130/sW2_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW2_sL1/case.json new file mode 100644 index 00000000..8833faad --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW2_sL1/case.json @@ -0,0 +1,230 @@ +{ + "case_id": "C11_sky130_sW2_sL1", + "circuit_id": "C11", + "pdk": "sky130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "dut_name": "C11_sky130_sW2_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "IB1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.3, + "nf": 8 + }, + "M2": { + "w": 8.0, + "l": 0.3, + "nf": 16 + }, + "M3": { + "w": 8.0, + "l": 0.3, + "nf": 16 + }, + "M4": { + "w": 8.0, + "l": 0.3, + "nf": 16 + }, + "M5": { + "w": 4.0, + "l": 0.3, + "nf": 8 + }, + "M6": { + "w": 4.0, + "l": 0.3, + "nf": 8 + }, + "M7": { + "w": 8.0, + "l": 0.3, + "nf": 16 + }, + "M8": { + "w": 8.0, + "l": 0.3, + "nf": 16 + }, + "R1": { + "r": 3000.0, + "body": "VSS", + "w": 0.35, + "l": 2.155 + }, + "C1": { + "c": 1e-12, + "w": 22.365, + "l": 22.365, + "model": "sky130_fd_pr__cap_mim_m3_1" + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 0.7200000000000001, + "CL": 1e-12, + "inv_input": "VIN1", + "vout_target": 0.9 + }, + "category": "twostage", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "1c4c341f77f8a3c6", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8", + "R1", + "C1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/sky130/sW2_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW2_sL1/manifest.json new file mode 100644 index 00000000..a8e52996 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW2_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "27a761cca40befa749d01fd5cea0458d0cab6d46cd70f08d2d66255a5847c6cf", + "qualification.json": "8f8dd0c4aedce44ed3159a75586d5489c03e2a4fd3ef860f55926bd4af5fe45a", + "specs.json": "46733eae3896928e5b667b198c4c664e84b71d54cc7fe6c7ae0279eee7612385", + "target.spice": "df38e9935fb3f3c10e49ef21290d468513f8c9aa135ca9ad35f26477faf16dca", + "target_lvs.spice": "923a2d1ab0e70cada251d9c499b6045dbff5ebc78421dfb78c3a3f4c41e75cd8", + "testbench.spice": "60493dc256f9c0f17ea3f01e6d5e812ae68b8777fa29604e88d9a25691ca8ec5" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/sky130/sW2_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW2_sL1/qualification.json new file mode 100644 index 00000000..a4802dd6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW2_sL1/qualification.json @@ -0,0 +1,165 @@ +{ + "case_id": "C11_sky130_sW2_sL1", + "circuit_id": "C11", + "pdk": "sky130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "twostage", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "1c4c341f77f8a3c6", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 57.59 + }, + "ugf": { + "min": 14590000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 60.59334, + "ugf": 24313470.0, + "pm": 85.74901139999999 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 11.3, + "schematic_measures": { + "vout0": 0.9000001, + "idd": 8.632783e-05, + "vos": 0.0008089348, + "gain_lf": 60.59334, + "ph_lf": 0.7202986, + "ugf": 24313470.0, + "ph_ugf": -93.53069, + "f3db": 22841.22, + "pm": 85.74901139999999 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/sky130/sW2_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW2_sL1/specs.json new file mode 100644 index 00000000..eb0bd3b8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW2_sL1/specs.json @@ -0,0 +1,30 @@ +{ + "gain_lf": { + "min": 57.59 + }, + "ugf": { + "min": 14590000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 60.59334, + "ugf": 24313470.0, + "pm": 85.74901139999999 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/sky130/sW2_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW2_sL1/target.spice new file mode 100644 index 00000000..425abeb9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW2_sL1/target.spice @@ -0,0 +1,12 @@ +.subckt C11_sky130_sW2_sL1 VDD VSS VIN1 VIN2 VOUT1 IB1 +XM1 IB1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=4 l=0.3 nf=8 +XM2 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=8 l=0.3 nf=16 +XM3 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=8 l=0.3 nf=16 +XM4 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=8 l=0.3 nf=16 +XM5 net014 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=4 l=0.3 nf=8 +XM6 net016 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=4 l=0.3 nf=8 +XM7 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=8 l=0.3 nf=16 +XM8 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=8 l=0.3 nf=16 +XRR1 net016 net022 VSS sky130_fd_pr__res_high_po_0p35 l=2.155 mult=1 +XCC1 net022 VOUT1 sky130_fd_pr__cap_mim_m3_1 w=22.365 l=22.365 +.ends C11_sky130_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C11/sky130/sW2_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW2_sL1/target_lvs.spice new file mode 100644 index 00000000..f64d6d78 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW2_sL1/target_lvs.spice @@ -0,0 +1,108 @@ +.subckt C11_sky130_sW2_sL1 VDD VSS VIN1 VIN2 VOUT1 IB1 +XM1_f0 IB1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM1_f1 IB1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM1_f2 IB1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM1_f3 IB1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM1_f4 IB1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM1_f5 IB1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM1_f6 IB1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM1_f7 IB1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f0 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f1 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f2 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f3 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f4 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f5 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f6 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f7 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f8 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f9 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f10 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f11 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f12 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f13 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f14 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f15 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM3_f0 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM3_f1 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM3_f2 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM3_f3 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM3_f4 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM3_f5 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM3_f6 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM3_f7 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM3_f8 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM3_f9 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM3_f10 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM3_f11 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM3_f12 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM3_f13 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM3_f14 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM3_f15 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f0 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f1 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f2 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f3 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f4 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f5 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f6 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f7 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f8 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f9 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f10 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f11 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f12 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f13 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f14 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f15 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f0 net014 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f1 net014 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f2 net014 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f3 net014 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f4 net014 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f5 net014 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f6 net014 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f7 net014 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM6_f0 net016 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM6_f1 net016 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM6_f2 net016 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM6_f3 net016 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM6_f4 net016 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM6_f5 net016 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM6_f6 net016 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM6_f7 net016 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM7_f0 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f1 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f2 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f3 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f4 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f5 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f6 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f7 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f8 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f9 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f10 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f11 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f12 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f13 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f14 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM7_f15 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM8_f0 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM8_f1 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM8_f2 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM8_f3 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM8_f4 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM8_f5 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM8_f6 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM8_f7 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM8_f8 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM8_f9 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM8_f10 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM8_f11 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM8_f12 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM8_f13 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM8_f14 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM8_f15 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XRR1 net016 net022 VSS sky130_fd_pr__res_high_po_0p35 l=2.155 mult=1 +XCC1 net022 VOUT1 sky130_fd_pr__cap_mim_m3_1 w=22.365 l=22.365 +.ends C11_sky130_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C11/sky130/sW2_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW2_sL1/testbench.spice new file mode 100644 index 00000000..8264caea --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW2_sL1/testbench.spice @@ -0,0 +1,37 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 IB1 C11_sky130_sW2_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIB1 IB1 VSS 2e-05 +.nodeset v(IB1)=1.26 + +VCM VCM 0 0.72 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 0.9 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN1 VCM VINT 0 1 +EIN VIN2 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN1) - v(VIN2) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C11/sky130/sW2_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW2_sL2/case.json new file mode 100644 index 00000000..6bd49386 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW2_sL2/case.json @@ -0,0 +1,230 @@ +{ + "case_id": "C11_sky130_sW2_sL2", + "circuit_id": "C11", + "pdk": "sky130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "dut_name": "C11_sky130_sW2_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "IB1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.6, + "nf": 8 + }, + "M2": { + "w": 8.0, + "l": 0.6, + "nf": 16 + }, + "M3": { + "w": 8.0, + "l": 0.6, + "nf": 16 + }, + "M4": { + "w": 8.0, + "l": 0.6, + "nf": 16 + }, + "M5": { + "w": 4.0, + "l": 0.6, + "nf": 8 + }, + "M6": { + "w": 4.0, + "l": 0.6, + "nf": 8 + }, + "M7": { + "w": 8.0, + "l": 0.6, + "nf": 16 + }, + "M8": { + "w": 8.0, + "l": 0.6, + "nf": 16 + }, + "R1": { + "r": 3000.0, + "body": "VSS", + "w": 0.35, + "l": 2.155 + }, + "C1": { + "c": 1e-12, + "w": 22.365, + "l": 22.365, + "model": "sky130_fd_pr__cap_mim_m3_1" + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 0.7200000000000001, + "CL": 1e-12, + "inv_input": "VIN1", + "vout_target": 0.9 + }, + "category": "twostage", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "6826f554f16982db", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo setting V_out,dc" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6", + "M7", + "M8", + "R1", + "C1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/sky130/sW2_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW2_sL2/manifest.json new file mode 100644 index 00000000..12294580 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW2_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "4d98336257792678be7bb2c5b68d50a331543654d8cf659a936dc6c69d523800", + "qualification.json": "60d3ed88f352765bd6c453015198b910cc86ccc58a7b994261ecb908599b516c", + "specs.json": "509cf0ae85a967e969f487d74ed62825ae8ffc9a69f822c06c5357448333ed85", + "target.spice": "7e2447ee3eb636060c64341facd0a0eded244b80513ab4fe35ae9e9e50285075", + "target_lvs.spice": "b94c12070c1c4d8bf4a13383cbd1ae0d27e63085a5e805eb241be57b2de75abc", + "testbench.spice": "16a79611721c1ca07bf4a5a3f229dc1d2bec28950bc3331d75d272eef842be14" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/sky130/sW2_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW2_sL2/qualification.json new file mode 100644 index 00000000..a0b6e95d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW2_sL2/qualification.json @@ -0,0 +1,165 @@ +{ + "case_id": "C11_sky130_sW2_sL2", + "circuit_id": "C11", + "pdk": "sky130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "twostage", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "6826f554f16982db", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 71.25 + }, + "ugf": { + "min": 8693000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 74.24809, + "ugf": 14488170.0, + "pm": 79.503574 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 8.0, + "schematic_measures": { + "vout0": 0.9000001, + "idd": 7.486715e-05, + "vos": 0.001005018, + "gain_lf": 74.24809, + "ph_lf": 2.672396, + "ugf": 14488170.0, + "ph_ugf": -97.82403, + "f3db": 2852.949, + "pm": 79.503574 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/sky130/sW2_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW2_sL2/specs.json new file mode 100644 index 00000000..5d0e38ea --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW2_sL2/specs.json @@ -0,0 +1,30 @@ +{ + "gain_lf": { + "min": 71.25 + }, + "ugf": { + "min": 8693000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 74.24809, + "ugf": 14488170.0, + "pm": 79.503574 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C11/sky130/sW2_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW2_sL2/target.spice new file mode 100644 index 00000000..a42e1c09 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW2_sL2/target.spice @@ -0,0 +1,12 @@ +.subckt C11_sky130_sW2_sL2 VDD VSS VIN1 VIN2 VOUT1 IB1 +XM1 IB1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=4 l=0.6 nf=8 +XM2 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=8 l=0.6 nf=16 +XM3 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=8 l=0.6 nf=16 +XM4 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=8 l=0.6 nf=16 +XM5 net014 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=4 l=0.6 nf=8 +XM6 net016 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=4 l=0.6 nf=8 +XM7 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=8 l=0.6 nf=16 +XM8 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=8 l=0.6 nf=16 +XRR1 net016 net022 VSS sky130_fd_pr__res_high_po_0p35 l=2.155 mult=1 +XCC1 net022 VOUT1 sky130_fd_pr__cap_mim_m3_1 w=22.365 l=22.365 +.ends C11_sky130_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C11/sky130/sW2_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW2_sL2/target_lvs.spice new file mode 100644 index 00000000..fdd32bb8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW2_sL2/target_lvs.spice @@ -0,0 +1,108 @@ +.subckt C11_sky130_sW2_sL2 VDD VSS VIN1 VIN2 VOUT1 IB1 +XM1_f0 IB1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f1 IB1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f2 IB1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f3 IB1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f4 IB1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f5 IB1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f6 IB1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM1_f7 IB1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f0 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f1 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f2 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f3 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f4 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f5 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f6 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f7 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f8 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f9 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f10 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f11 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f12 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f13 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f14 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f15 net97 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM3_f0 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM3_f1 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM3_f2 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM3_f3 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM3_f4 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM3_f5 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM3_f6 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM3_f7 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM3_f8 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM3_f9 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM3_f10 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM3_f11 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM3_f12 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM3_f13 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM3_f14 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM3_f15 net014 VIN1 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f0 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f1 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f2 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f3 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f4 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f5 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f6 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f7 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f8 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f9 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f10 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f11 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f12 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f13 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f14 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f15 net016 VIN2 net97 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f0 net014 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f1 net014 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f2 net014 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f3 net014 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f4 net014 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f5 net014 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f6 net014 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f7 net014 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM6_f0 net016 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM6_f1 net016 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM6_f2 net016 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM6_f3 net016 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM6_f4 net016 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM6_f5 net016 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM6_f6 net016 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM6_f7 net016 net014 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM7_f0 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f1 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f2 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f3 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f4 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f5 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f6 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f7 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f8 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f9 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f10 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f11 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f12 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f13 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f14 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM7_f15 VOUT1 IB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM8_f0 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM8_f1 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM8_f2 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM8_f3 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM8_f4 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM8_f5 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM8_f6 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM8_f7 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM8_f8 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM8_f9 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM8_f10 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM8_f11 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM8_f12 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM8_f13 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM8_f14 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM8_f15 VOUT1 net016 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XRR1 net016 net022 VSS sky130_fd_pr__res_high_po_0p35 l=2.155 mult=1 +XCC1 net022 VOUT1 sky130_fd_pr__cap_mim_m3_1 w=22.365 l=22.365 +.ends C11_sky130_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C11/sky130/sW2_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW2_sL2/testbench.spice new file mode 100644 index 00000000..7ba18ab9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C11/sky130/sW2_sL2/testbench.spice @@ -0,0 +1,37 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 IB1 C11_sky130_sW2_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIB1 IB1 VSS 2e-05 +.nodeset v(IB1)=1.26 + +VCM VCM 0 0.72 +* DC servo (disclosed): VINT = 0.5 tanh(2e4 (VOUT1 - VT)) (bounded to +-0.5 V), low-passed at 0.16 uHz, sets the inverting input DC level +VT VT 0 0.9 +BSRV VSRV 0 V = 0.5*tanh(2e4*(v(VOUT1)-v(VT))) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EINV VIN1 VCM VINT 0 1 +EIN VIN2 VCM VD 0 1 +VD VD 0 dc 0 ac 1 +CL VOUT1 0 1e-12 +.control +op +let vout0 = v(VOUT1) +let idd = -i(VDD) +let vos = v(VIN1) - v(VIN2) +print vout0 idd vos +print v(VCM) +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +let ph = cph(v(VOUT1))*180/pi +meas ac gain_lf find gdb at=100 +meas ac ph_lf find ph at=100 +meas ac ugf when gdb=0 cross=1 +meas ac ph_ugf find ph when gdb=0 cross=1 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C12/gf180/sW0.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW0.5_sL1.5/case.json new file mode 100644 index 00000000..b0dc45c9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW0.5_sL1.5/case.json @@ -0,0 +1,88 @@ +{ + "case_id": "C12_gf180_sW0.5_sL1.5", + "circuit_id": "C12", + "pdk": "gf180", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "dut_name": "C12_gf180_sW0.5_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1" + ], + "sizing": { + "M1": { + "w": 1.0, + "l": 0.84, + "nf": 2 + }, + "M2": { + "w": 2.0, + "l": 0.84, + "nf": 4 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": {}, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.84, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "952a17028df62d86", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/gf180/sW0.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW0.5_sL1.5/manifest.json new file mode 100644 index 00000000..61bfacf6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW0.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "5e573e2d5224a041c22af41e7987bb1ec25c15a6ba055139c190bce021e6da66", + "qualification.json": "ec799e740f4725d0749064ddfb8cf85e4bb1e4763b2c6568e304120330a0be6a", + "specs.json": "78fff68667678591f7d27671eff14d4bec2672040c3f8dd150582fcc7a0b0969", + "target.spice": "927c4c9135c2aaf9742a43e2cbce78f7e18a7945b3545c0d35035400dc7fd721", + "target_lvs.spice": "411eb8907aa39721272004882f76616e706783d154822a4469f3a2267910c531", + "testbench.spice": "b9a83087c1369509d810c9a33b7724603788d4bf5bc1382d97161c4e83826c0e" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/gf180/sW0.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW0.5_sL1.5/qualification.json new file mode 100644 index 00000000..5f7ebc81 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW0.5_sL1.5/qualification.json @@ -0,0 +1,83 @@ +{ + "case_id": "C12_gf180_sW0.5_sL1.5", + "circuit_id": "C12", + "pdk": "gf180", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "single", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.84, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "952a17028df62d86", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 36.27 + }, + "f3db": { + "min": 1515000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 39.26713, + "f3db": 2525533.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vout0": 1.439152, + "vin0": 1.439152, + "idd": 3.874439e-05, + "gain_lf": 39.26713, + "f3db": 2525533.0, + "ugf": 233119300.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/gf180/sW0.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW0.5_sL1.5/specs.json new file mode 100644 index 00000000..ce0741ea --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW0.5_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 36.27 + }, + "f3db": { + "min": 1515000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 39.26713, + "f3db": 2525533.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/gf180/sW0.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW0.5_sL1.5/target.spice new file mode 100644 index 00000000..72b6140b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW0.5_sL1.5/target.spice @@ -0,0 +1,4 @@ +.subckt C12_gf180_sW0.5_sL1.5 VDD VSS VIN1 VOUT1 +MM1 VOUT1 VIN1 VSS VSS nfet_03v3 w=1u l=0.84u nf=2 m=1 +MM2 VOUT1 VIN1 VDD VDD pfet_03v3 w=2u l=0.84u nf=4 m=1 +.ends C12_gf180_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C12/gf180/sW0.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW0.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..7211716c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW0.5_sL1.5/target_lvs.spice @@ -0,0 +1,8 @@ +.subckt C12_gf180_sW0.5_sL1.5 VDD VSS VIN1 VOUT1 +MM1_f0 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM1_f1 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM2_f0 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f1 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f2 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f3 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=0.84u +.ends C12_gf180_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C12/gf180/sW0.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW0.5_sL1.5/testbench.spice new file mode 100644 index 00000000..0ef7c5a3 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW0.5_sL1.5/testbench.spice @@ -0,0 +1,26 @@ +X1 VDD VSS VIN1 VOUT1 C12_gf180_sW0.5_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 + +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C12/gf180/sW0.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW0.5_sL1/case.json new file mode 100644 index 00000000..1e52af31 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW0.5_sL1/case.json @@ -0,0 +1,88 @@ +{ + "case_id": "C12_gf180_sW0.5_sL1", + "circuit_id": "C12", + "pdk": "gf180", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "dut_name": "C12_gf180_sW0.5_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1" + ], + "sizing": { + "M1": { + "w": 1.0, + "l": 0.56, + "nf": 2 + }, + "M2": { + "w": 2.0, + "l": 0.56, + "nf": 4 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": {}, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.56, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "9114ae9a7093c8a0", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/gf180/sW0.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW0.5_sL1/manifest.json new file mode 100644 index 00000000..49656da5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW0.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "dac5031bf14f89635fbbc16e19ceef4b6b66330b049609a8c8fc5f17999ae617", + "qualification.json": "f4b64e61d39359f16db4d8f771035532e901aed50e09db1f4c214fb020c0f7fb", + "specs.json": "f37b8f611c81aeb381d73b4aacd44b22ff3e78691fe5292653cb62f652db6c04", + "target.spice": "bde0204d7a89c298ddbf4863b7b4baf79712234d81a7f1b3fc1de25656ccf351", + "target_lvs.spice": "d21c319e744831d03bf0795d09473796a5daef55f2a0f9e62f4c8d194f4f5dda", + "testbench.spice": "dde2f092343c752a15f069c16f4224c04f04495602811dcfdc80e6b708a8e12f" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/gf180/sW0.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW0.5_sL1/qualification.json new file mode 100644 index 00000000..e3832cdc --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW0.5_sL1/qualification.json @@ -0,0 +1,83 @@ +{ + "case_id": "C12_gf180_sW0.5_sL1", + "circuit_id": "C12", + "pdk": "gf180", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "single", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.56, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "9114ae9a7093c8a0", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 31.9 + }, + "f3db": { + "min": 3603000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 34.89966, + "f3db": 6005391.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vout0": 1.458836, + "vin0": 1.458836, + "idd": 5.888605e-05, + "gain_lf": 34.89966, + "f3db": 6005391.0, + "ugf": 335213900.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/gf180/sW0.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW0.5_sL1/specs.json new file mode 100644 index 00000000..fef89b02 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW0.5_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 31.9 + }, + "f3db": { + "min": 3603000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 34.89966, + "f3db": 6005391.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/gf180/sW0.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW0.5_sL1/target.spice new file mode 100644 index 00000000..48196b90 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW0.5_sL1/target.spice @@ -0,0 +1,4 @@ +.subckt C12_gf180_sW0.5_sL1 VDD VSS VIN1 VOUT1 +MM1 VOUT1 VIN1 VSS VSS nfet_03v3 w=1u l=0.56u nf=2 m=1 +MM2 VOUT1 VIN1 VDD VDD pfet_03v3 w=2u l=0.56u nf=4 m=1 +.ends C12_gf180_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C12/gf180/sW0.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW0.5_sL1/target_lvs.spice new file mode 100644 index 00000000..1aef026d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW0.5_sL1/target_lvs.spice @@ -0,0 +1,8 @@ +.subckt C12_gf180_sW0.5_sL1 VDD VSS VIN1 VOUT1 +MM1_f0 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM1_f1 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM2_f0 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f1 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f2 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f3 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=0.56u +.ends C12_gf180_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C12/gf180/sW0.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW0.5_sL1/testbench.spice new file mode 100644 index 00000000..81d0181b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW0.5_sL1/testbench.spice @@ -0,0 +1,26 @@ +X1 VDD VSS VIN1 VOUT1 C12_gf180_sW0.5_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 + +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C12/gf180/sW0.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW0.5_sL2/case.json new file mode 100644 index 00000000..3b77725f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW0.5_sL2/case.json @@ -0,0 +1,88 @@ +{ + "case_id": "C12_gf180_sW0.5_sL2", + "circuit_id": "C12", + "pdk": "gf180", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "dut_name": "C12_gf180_sW0.5_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1" + ], + "sizing": { + "M1": { + "w": 1.0, + "l": 1.12, + "nf": 2 + }, + "M2": { + "w": 2.0, + "l": 1.12, + "nf": 4 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": {}, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.12, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "595a10478c8a74e5", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/gf180/sW0.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW0.5_sL2/manifest.json new file mode 100644 index 00000000..91d81f73 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW0.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "3366476520f6d646250790babe07774a9624ab65e430ff634d988c9855355a1f", + "qualification.json": "b2fcd049d03121ce338514f3668ee4fa1c339f4d46d7ab6c41a5a351e33d5c8a", + "specs.json": "b62eb46457d1ba8ba421cd2c5f20c0bd13c726460aab2d9828398892e3c99890", + "target.spice": "fbafabcb6bc60d40c09cce388b688aca9005ba0059adc5cba8aec79c0c025315", + "target_lvs.spice": "b0fe163c007593b4c7a092ce789777bddd6487f3c1c7799d338b1dcd55d84c5e", + "testbench.spice": "47fb9ced680f298d92e73e1541019fd6ac50d7439730066c9fc28d073a7c9e65" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/gf180/sW0.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW0.5_sL2/qualification.json new file mode 100644 index 00000000..6b395146 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW0.5_sL2/qualification.json @@ -0,0 +1,83 @@ +{ + "case_id": "C12_gf180_sW0.5_sL2", + "circuit_id": "C12", + "pdk": "gf180", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "single", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.12, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "595a10478c8a74e5", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 38.96 + }, + "f3db": { + "min": 1000000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 41.96165, + "f3db": 1425042.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vout0": 1.429767, + "vin0": 1.429767, + "idd": 2.897452e-05, + "gain_lf": 41.96165, + "f3db": 1425042.0, + "ugf": 179247500.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/gf180/sW0.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW0.5_sL2/specs.json new file mode 100644 index 00000000..b2d1282b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW0.5_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 38.96 + }, + "f3db": { + "min": 1000000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 41.96165, + "f3db": 1425042.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/gf180/sW0.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW0.5_sL2/target.spice new file mode 100644 index 00000000..682b6653 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW0.5_sL2/target.spice @@ -0,0 +1,4 @@ +.subckt C12_gf180_sW0.5_sL2 VDD VSS VIN1 VOUT1 +MM1 VOUT1 VIN1 VSS VSS nfet_03v3 w=1u l=1.12u nf=2 m=1 +MM2 VOUT1 VIN1 VDD VDD pfet_03v3 w=2u l=1.12u nf=4 m=1 +.ends C12_gf180_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C12/gf180/sW0.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW0.5_sL2/target_lvs.spice new file mode 100644 index 00000000..4b3bf709 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW0.5_sL2/target_lvs.spice @@ -0,0 +1,8 @@ +.subckt C12_gf180_sW0.5_sL2 VDD VSS VIN1 VOUT1 +MM1_f0 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM1_f1 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM2_f0 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f1 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f2 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f3 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=1.12u +.ends C12_gf180_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C12/gf180/sW0.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW0.5_sL2/testbench.spice new file mode 100644 index 00000000..90597d42 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW0.5_sL2/testbench.spice @@ -0,0 +1,26 @@ +X1 VDD VSS VIN1 VOUT1 C12_gf180_sW0.5_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 + +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1.5_sL1.5/case.json new file mode 100644 index 00000000..f2a994df --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1.5_sL1.5/case.json @@ -0,0 +1,88 @@ +{ + "case_id": "C12_gf180_sW1.5_sL1.5", + "circuit_id": "C12", + "pdk": "gf180", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "dut_name": "C12_gf180_sW1.5_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1" + ], + "sizing": { + "M1": { + "w": 3.0, + "l": 0.84, + "nf": 6 + }, + "M2": { + "w": 6.0, + "l": 0.84, + "nf": 12 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": {}, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.84, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "fa0a5700f898e6e5", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1.5_sL1.5/manifest.json new file mode 100644 index 00000000..3947277a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "0391116b0bbe4246f3b4525d443513927cbda1a9b72552ffaa8c29eef2fdaa85", + "qualification.json": "c032d0ec00b1529b4e877468224d54ed91e36bf20dd825b2b2a8937c8f3ea3cd", + "specs.json": "0bb76e34c794372e0310edc64eea58010f10219886b585827a1c9603e6ca129a", + "target.spice": "6f6b3398f87d6f02b72cf5be30aea9739817814490b2a30a1f9c7fc455f72aea", + "target_lvs.spice": "0ffc33bf290eacdb146be6285055d11eb496e54368fa12031df602fabda488b8", + "testbench.spice": "8e79c369c3bbd975da0317d125ca44123d7c22b7b2d5da0bbf7086807971d083" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1.5_sL1.5/qualification.json new file mode 100644 index 00000000..64081962 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1.5_sL1.5/qualification.json @@ -0,0 +1,83 @@ +{ + "case_id": "C12_gf180_sW1.5_sL1.5", + "circuit_id": "C12", + "pdk": "gf180", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "single", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.84, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "fa0a5700f898e6e5", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 36.27 + }, + "f3db": { + "min": 4284000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 39.26713, + "f3db": 7139193.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vout0": 1.439152, + "vin0": 1.439152, + "idd": 0.0001162332, + "gain_lf": 39.26713, + "f3db": 7139193.0, + "ugf": 661342500.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1.5_sL1.5/specs.json new file mode 100644 index 00000000..f7ba9662 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1.5_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 36.27 + }, + "f3db": { + "min": 4284000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 39.26713, + "f3db": 7139193.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1.5_sL1.5/target.spice new file mode 100644 index 00000000..3a2b733e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1.5_sL1.5/target.spice @@ -0,0 +1,4 @@ +.subckt C12_gf180_sW1.5_sL1.5 VDD VSS VIN1 VOUT1 +MM1 VOUT1 VIN1 VSS VSS nfet_03v3 w=3u l=0.84u nf=6 m=1 +MM2 VOUT1 VIN1 VDD VDD pfet_03v3 w=6u l=0.84u nf=12 m=1 +.ends C12_gf180_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..d486674c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1.5_sL1.5/target_lvs.spice @@ -0,0 +1,20 @@ +.subckt C12_gf180_sW1.5_sL1.5 VDD VSS VIN1 VOUT1 +MM1_f0 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM1_f1 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM1_f2 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM1_f3 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM1_f4 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM1_f5 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM2_f0 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f1 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f2 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f3 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f4 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f5 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f6 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f7 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f8 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f9 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f10 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f11 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=0.84u +.ends C12_gf180_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1.5_sL1.5/testbench.spice new file mode 100644 index 00000000..64387f05 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1.5_sL1.5/testbench.spice @@ -0,0 +1,26 @@ +X1 VDD VSS VIN1 VOUT1 C12_gf180_sW1.5_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 + +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1.5_sL1/case.json new file mode 100644 index 00000000..6486b7a0 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1.5_sL1/case.json @@ -0,0 +1,88 @@ +{ + "case_id": "C12_gf180_sW1.5_sL1", + "circuit_id": "C12", + "pdk": "gf180", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "dut_name": "C12_gf180_sW1.5_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1" + ], + "sizing": { + "M1": { + "w": 3.0, + "l": 0.56, + "nf": 6 + }, + "M2": { + "w": 6.0, + "l": 0.56, + "nf": 12 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": {}, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.56, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "f80f5b1cea29bcf6", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1.5_sL1/manifest.json new file mode 100644 index 00000000..b8072b49 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "f8f47dca23e1d9ad95d8f0830031a03b33c1db59f8178eab7a0a411bb7453e09", + "qualification.json": "a7ca44a96bcad1725ac07f0ab911419e2c73957735a1e59165bf6be4d24d91b3", + "specs.json": "284a1d258e4dbdf10796e551dc310c4b414beaf75123f0409522639b544354d0", + "target.spice": "04f228b116a175a8269803308f7c1b455416e9de97fc12089b4ebd138f373a2a", + "target_lvs.spice": "162445599f141e0b114eaf6da9475e63569dde624255fe2ccc999439483303fc", + "testbench.spice": "82fdde748b91e35118a5cc3d534f589a7cbae5f1f3f35d9b27b0cea22f271ebe" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1.5_sL1/qualification.json new file mode 100644 index 00000000..81770efa --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1.5_sL1/qualification.json @@ -0,0 +1,83 @@ +{ + "case_id": "C12_gf180_sW1.5_sL1", + "circuit_id": "C12", + "pdk": "gf180", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "single", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.56, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "f80f5b1cea29bcf6", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 31.9 + }, + "f3db": { + "min": 10190000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 34.89966, + "f3db": 16976400.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vout0": 1.458836, + "vin0": 1.458836, + "idd": 0.0001766581, + "gain_lf": 34.89966, + "f3db": 16976400.0, + "ugf": 949313500.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1.5_sL1/specs.json new file mode 100644 index 00000000..c5e5a4dc --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1.5_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 31.9 + }, + "f3db": { + "min": 10190000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 34.89966, + "f3db": 16976400.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1.5_sL1/target.spice new file mode 100644 index 00000000..9c0926a4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1.5_sL1/target.spice @@ -0,0 +1,4 @@ +.subckt C12_gf180_sW1.5_sL1 VDD VSS VIN1 VOUT1 +MM1 VOUT1 VIN1 VSS VSS nfet_03v3 w=3u l=0.56u nf=6 m=1 +MM2 VOUT1 VIN1 VDD VDD pfet_03v3 w=6u l=0.56u nf=12 m=1 +.ends C12_gf180_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1.5_sL1/target_lvs.spice new file mode 100644 index 00000000..6d18d243 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1.5_sL1/target_lvs.spice @@ -0,0 +1,20 @@ +.subckt C12_gf180_sW1.5_sL1 VDD VSS VIN1 VOUT1 +MM1_f0 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM1_f1 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM1_f2 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM1_f3 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM1_f4 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM1_f5 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM2_f0 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f1 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f2 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f3 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f4 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f5 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f6 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f7 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f8 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f9 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f10 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f11 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=0.56u +.ends C12_gf180_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1.5_sL1/testbench.spice new file mode 100644 index 00000000..07c217c8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1.5_sL1/testbench.spice @@ -0,0 +1,26 @@ +X1 VDD VSS VIN1 VOUT1 C12_gf180_sW1.5_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 + +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1.5_sL2/case.json new file mode 100644 index 00000000..8c8713e7 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1.5_sL2/case.json @@ -0,0 +1,88 @@ +{ + "case_id": "C12_gf180_sW1.5_sL2", + "circuit_id": "C12", + "pdk": "gf180", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "dut_name": "C12_gf180_sW1.5_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1" + ], + "sizing": { + "M1": { + "w": 3.0, + "l": 1.12, + "nf": 6 + }, + "M2": { + "w": 6.0, + "l": 1.12, + "nf": 12 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": {}, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.12, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "0c0161a185d1abcc", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1.5_sL2/manifest.json new file mode 100644 index 00000000..683d9f53 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "1f56be1b20c98fc58509c1437b252dbd749cbed1d414e06408e05f46e59172f3", + "qualification.json": "279eacf48673fd7b61d2c31c1b68c168b55fdeaf4a786268df2ad7aa3bd728f6", + "specs.json": "f6b76cb7fb422db3e5c4400a55644b603164840ffa57cd9e37961286587c9f80", + "target.spice": "2935a4e6d81bc480f9625b3fe9dec4da41217c1151a7a4a3cbf68ef9430922a2", + "target_lvs.spice": "7e0b76d3fb007c8dd777a86b8477dc4345e5dde0cad92790e074fed597f48969", + "testbench.spice": "34dbb0ebf066526a0d850abd28ce9778b5afb9cfe4a02e01742c161e10461576" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1.5_sL2/qualification.json new file mode 100644 index 00000000..b9d976e9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1.5_sL2/qualification.json @@ -0,0 +1,83 @@ +{ + "case_id": "C12_gf180_sW1.5_sL2", + "circuit_id": "C12", + "pdk": "gf180", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "single", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.12, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "0c0161a185d1abcc", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 38.96 + }, + "f3db": { + "min": 2417000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 41.96166, + "f3db": 4028244.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vout0": 1.429767, + "vin0": 1.429767, + "idd": 8.692357e-05, + "gain_lf": 41.96166, + "f3db": 4028244.0, + "ugf": 509785600.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1.5_sL2/specs.json new file mode 100644 index 00000000..7a41b3ad --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1.5_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 38.96 + }, + "f3db": { + "min": 2417000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 41.96166, + "f3db": 4028244.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1.5_sL2/target.spice new file mode 100644 index 00000000..c7962c73 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1.5_sL2/target.spice @@ -0,0 +1,4 @@ +.subckt C12_gf180_sW1.5_sL2 VDD VSS VIN1 VOUT1 +MM1 VOUT1 VIN1 VSS VSS nfet_03v3 w=3u l=1.12u nf=6 m=1 +MM2 VOUT1 VIN1 VDD VDD pfet_03v3 w=6u l=1.12u nf=12 m=1 +.ends C12_gf180_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1.5_sL2/target_lvs.spice new file mode 100644 index 00000000..d0bee31e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1.5_sL2/target_lvs.spice @@ -0,0 +1,20 @@ +.subckt C12_gf180_sW1.5_sL2 VDD VSS VIN1 VOUT1 +MM1_f0 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM1_f1 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM1_f2 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM1_f3 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM1_f4 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM1_f5 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM2_f0 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f1 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f2 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f3 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f4 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f5 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f6 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f7 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f8 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f9 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f10 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f11 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=1.12u +.ends C12_gf180_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1.5_sL2/testbench.spice new file mode 100644 index 00000000..07740e7f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1.5_sL2/testbench.spice @@ -0,0 +1,26 @@ +X1 VDD VSS VIN1 VOUT1 C12_gf180_sW1.5_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 + +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1_sL1.5/case.json new file mode 100644 index 00000000..4c85f9e6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1_sL1.5/case.json @@ -0,0 +1,88 @@ +{ + "case_id": "C12_gf180_sW1_sL1.5", + "circuit_id": "C12", + "pdk": "gf180", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "dut_name": "C12_gf180_sW1_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.84, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.84, + "nf": 8 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": {}, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "3aeb1033e3b42900", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1_sL1.5/manifest.json new file mode 100644 index 00000000..4b89111b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "8280083095e0cea120b7bce77c5980dba1d83c8b85ee485967782aa1e63870ed", + "qualification.json": "f7778b23760242dd3721a0755a6dae52adb22579cdbf5981878345531bffcee1", + "specs.json": "d27f18a3f4e3ab133f55380c69b7e5d7245828130672887c4cbfbcaf5aca27cc", + "target.spice": "e5a993bb1ff4a524339e20f03eadbc1387c6221a34b01d2fea0bfcf1f1daa408", + "target_lvs.spice": "9973837a2e30e152f5076735aafa2209b905588dfaefa3a0331980affe3a3849", + "testbench.spice": "4c583d70224f1c3e5e629aef37ed278ffd3076b536f8fe71529d25b11a2e3a42" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1_sL1.5/qualification.json new file mode 100644 index 00000000..65c5e2ef --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1_sL1.5/qualification.json @@ -0,0 +1,83 @@ +{ + "case_id": "C12_gf180_sW1_sL1.5", + "circuit_id": "C12", + "pdk": "gf180", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "single", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "3aeb1033e3b42900", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 36.27 + }, + "f3db": { + "min": 2940000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 39.26713, + "f3db": 4900743.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vout0": 1.439152, + "vin0": 1.439152, + "idd": 7.748878e-05, + "gain_lf": 39.26713, + "f3db": 4900743.0, + "ugf": 452619200.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1_sL1.5/specs.json new file mode 100644 index 00000000..b5472dde --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 36.27 + }, + "f3db": { + "min": 2940000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 39.26713, + "f3db": 4900743.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1_sL1.5/target.spice new file mode 100644 index 00000000..67488a14 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1_sL1.5/target.spice @@ -0,0 +1,4 @@ +.subckt C12_gf180_sW1_sL1.5 VDD VSS VIN1 VOUT1 +MM1 VOUT1 VIN1 VSS VSS nfet_03v3 w=2u l=0.84u nf=4 m=1 +MM2 VOUT1 VIN1 VDD VDD pfet_03v3 w=4u l=0.84u nf=8 m=1 +.ends C12_gf180_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1_sL1.5/target_lvs.spice new file mode 100644 index 00000000..aced7d47 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1_sL1.5/target_lvs.spice @@ -0,0 +1,14 @@ +.subckt C12_gf180_sW1_sL1.5 VDD VSS VIN1 VOUT1 +MM1_f0 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM1_f1 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM1_f2 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM1_f3 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM2_f0 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f1 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f2 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f3 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f4 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f5 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f6 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f7 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=0.84u +.ends C12_gf180_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1_sL1.5/testbench.spice new file mode 100644 index 00000000..a4d5de5f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1_sL1.5/testbench.spice @@ -0,0 +1,26 @@ +X1 VDD VSS VIN1 VOUT1 C12_gf180_sW1_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 + +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1_sL1/case.json new file mode 100644 index 00000000..3ee121f4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1_sL1/case.json @@ -0,0 +1,88 @@ +{ + "case_id": "C12_gf180_sW1_sL1", + "circuit_id": "C12", + "pdk": "gf180", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "dut_name": "C12_gf180_sW1_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.56, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.56, + "nf": 8 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": {}, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "1f4454974ddde722", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1_sL1/manifest.json new file mode 100644 index 00000000..e296e8ec --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "98267b3709800931c68a948f4d5c1ff763e458b643bfea0c1b1228ea6ef56589", + "qualification.json": "304942887a67c8e44fc2475d498a004f120c1befc1bf1d3b980ceb54d8625e95", + "specs.json": "6555ee0afec197bf2f56074ea6a43c17618ae738933a9b66ce68a0f5c7856b9d", + "target.spice": "6c7650887f86e9bb1f3b3c208e567c5df1fcfa329ff56a3ac990eb58893bcde6", + "target_lvs.spice": "0dc25775d3f9f292368c1ddb005e1b79d8cb5bf990a779cf2be549f3081d0cc2", + "testbench.spice": "bafa2185b8bf8baa2abccf6711d226e94a9d2fb0ca2cd6518450b56ccb1a4c25" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1_sL1/qualification.json new file mode 100644 index 00000000..6d9d800c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1_sL1/qualification.json @@ -0,0 +1,83 @@ +{ + "case_id": "C12_gf180_sW1_sL1", + "circuit_id": "C12", + "pdk": "gf180", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "single", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "1f4454974ddde722", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 31.9 + }, + "f3db": { + "min": 6993000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 34.89966, + "f3db": 11654240.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vout0": 1.458836, + "vin0": 1.458836, + "idd": 0.0001177721, + "gain_lf": 34.89966, + "f3db": 11654240.0, + "ugf": 650733700.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1_sL1/specs.json new file mode 100644 index 00000000..6d21d68d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 31.9 + }, + "f3db": { + "min": 6993000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 34.89966, + "f3db": 11654240.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1_sL1/target.spice new file mode 100644 index 00000000..a7d86ec5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1_sL1/target.spice @@ -0,0 +1,4 @@ +.subckt C12_gf180_sW1_sL1 VDD VSS VIN1 VOUT1 +MM1 VOUT1 VIN1 VSS VSS nfet_03v3 w=2u l=0.56u nf=4 m=1 +MM2 VOUT1 VIN1 VDD VDD pfet_03v3 w=4u l=0.56u nf=8 m=1 +.ends C12_gf180_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1_sL1/target_lvs.spice new file mode 100644 index 00000000..7d2c4a7e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1_sL1/target_lvs.spice @@ -0,0 +1,14 @@ +.subckt C12_gf180_sW1_sL1 VDD VSS VIN1 VOUT1 +MM1_f0 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM1_f1 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM1_f2 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM1_f3 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM2_f0 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f1 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f2 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f3 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f4 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f5 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f6 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f7 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=0.56u +.ends C12_gf180_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1_sL1/testbench.spice new file mode 100644 index 00000000..9411d1c1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1_sL1/testbench.spice @@ -0,0 +1,26 @@ +X1 VDD VSS VIN1 VOUT1 C12_gf180_sW1_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 + +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1_sL2/case.json new file mode 100644 index 00000000..b9a52209 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1_sL2/case.json @@ -0,0 +1,88 @@ +{ + "case_id": "C12_gf180_sW1_sL2", + "circuit_id": "C12", + "pdk": "gf180", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "dut_name": "C12_gf180_sW1_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 1.12, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 1.12, + "nf": 8 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": {}, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "cfc6b4eb7d64c5fc", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1_sL2/manifest.json new file mode 100644 index 00000000..5fd2a2a9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "5fb8da7b98d52642f15304d4653642051ebea3cba574714f095427ab5d16b5fa", + "qualification.json": "f00f25e24a14ac7af0fecbc700ccd09d5ad6e8062d42fc21768b61df5a711c60", + "specs.json": "285a8cbcc0ef0c7c52df50f4fd4b118b948a1ba2d0da36bab9feedeeccf77894", + "target.spice": "58b143ce302cf3ca9c403858a5bfbac5c7d96c8e1d40edb853b61bbb28e6191a", + "target_lvs.spice": "5f09a9cf93deecf92c1c5e826cfd349e92a50da86c105e93375a18691cc91633", + "testbench.spice": "98216fb8677749f3964fdda7d1a289d02ebcb22b5b9472c141cecfdac48a2349" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1_sL2/qualification.json new file mode 100644 index 00000000..788adb0b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1_sL2/qualification.json @@ -0,0 +1,83 @@ +{ + "case_id": "C12_gf180_sW1_sL2", + "circuit_id": "C12", + "pdk": "gf180", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "single", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "cfc6b4eb7d64c5fc", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 38.96 + }, + "f3db": { + "min": 1659000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 41.96166, + "f3db": 2765227.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vout0": 1.429767, + "vin0": 1.429767, + "idd": 5.794905e-05, + "gain_lf": 41.96166, + "f3db": 2765227.0, + "ugf": 348768500.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1_sL2/specs.json new file mode 100644 index 00000000..62d18ec6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 38.96 + }, + "f3db": { + "min": 1659000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 41.96166, + "f3db": 2765227.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1_sL2/target.spice new file mode 100644 index 00000000..62ecdd12 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1_sL2/target.spice @@ -0,0 +1,4 @@ +.subckt C12_gf180_sW1_sL2 VDD VSS VIN1 VOUT1 +MM1 VOUT1 VIN1 VSS VSS nfet_03v3 w=2u l=1.12u nf=4 m=1 +MM2 VOUT1 VIN1 VDD VDD pfet_03v3 w=4u l=1.12u nf=8 m=1 +.ends C12_gf180_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1_sL2/target_lvs.spice new file mode 100644 index 00000000..5fe7c17a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1_sL2/target_lvs.spice @@ -0,0 +1,14 @@ +.subckt C12_gf180_sW1_sL2 VDD VSS VIN1 VOUT1 +MM1_f0 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM1_f1 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM1_f2 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM1_f3 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM2_f0 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f1 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f2 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f3 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f4 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f5 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f6 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f7 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=1.12u +.ends C12_gf180_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1_sL2/testbench.spice new file mode 100644 index 00000000..5c48e853 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW1_sL2/testbench.spice @@ -0,0 +1,26 @@ +X1 VDD VSS VIN1 VOUT1 C12_gf180_sW1_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 + +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C12/gf180/sW2_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW2_sL1.5/case.json new file mode 100644 index 00000000..47f796bb --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW2_sL1.5/case.json @@ -0,0 +1,88 @@ +{ + "case_id": "C12_gf180_sW2_sL1.5", + "circuit_id": "C12", + "pdk": "gf180", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "dut_name": "C12_gf180_sW2_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.84, + "nf": 8 + }, + "M2": { + "w": 8.0, + "l": 0.84, + "nf": 16 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": {}, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "470c01e3f59602bd", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/gf180/sW2_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW2_sL1.5/manifest.json new file mode 100644 index 00000000..79c20f06 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW2_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "d5d7486af5469e43bfe0a32d253ccf1b488ec20912e15ab42aa01d617a731baa", + "qualification.json": "2dd4972c24cc67b500845cff855f0850edc453b3ee6ee6bf7bd377d8df0e94bb", + "specs.json": "34f10736a9560d749b27014a5cc749458f4b6281a643bd118bd84fe9d8cf47ab", + "target.spice": "f375b0671f0f41885071180978d5fb8908b8f84cbe4f8649446e0a289743aa42", + "target_lvs.spice": "d562a1a33b33e62d592272b90f85cd32c50a4ab3bb2f02ed05a1062c9bcbb039", + "testbench.spice": "c96d6fc2878940bf80b37a31cead86adb951e1f117a2382cea357d332872eae5" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/gf180/sW2_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW2_sL1.5/qualification.json new file mode 100644 index 00000000..f9b11aa6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW2_sL1.5/qualification.json @@ -0,0 +1,83 @@ +{ + "case_id": "C12_gf180_sW2_sL1.5", + "circuit_id": "C12", + "pdk": "gf180", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "single", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "470c01e3f59602bd", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 36.27 + }, + "f3db": { + "min": 5551000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 39.26713, + "f3db": 9251873.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vout0": 1.439152, + "vin0": 1.439152, + "idd": 0.0001549776, + "gain_lf": 39.26713, + "f3db": 9251873.0, + "ugf": 859253500.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/gf180/sW2_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW2_sL1.5/specs.json new file mode 100644 index 00000000..1173a4db --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW2_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 36.27 + }, + "f3db": { + "min": 5551000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 39.26713, + "f3db": 9251873.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/gf180/sW2_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW2_sL1.5/target.spice new file mode 100644 index 00000000..e9f42b2a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW2_sL1.5/target.spice @@ -0,0 +1,4 @@ +.subckt C12_gf180_sW2_sL1.5 VDD VSS VIN1 VOUT1 +MM1 VOUT1 VIN1 VSS VSS nfet_03v3 w=4u l=0.84u nf=8 m=1 +MM2 VOUT1 VIN1 VDD VDD pfet_03v3 w=8u l=0.84u nf=16 m=1 +.ends C12_gf180_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C12/gf180/sW2_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW2_sL1.5/target_lvs.spice new file mode 100644 index 00000000..8f2766aa --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW2_sL1.5/target_lvs.spice @@ -0,0 +1,26 @@ +.subckt C12_gf180_sW2_sL1.5 VDD VSS VIN1 VOUT1 +MM1_f0 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM1_f1 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM1_f2 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM1_f3 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM1_f4 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM1_f5 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM1_f6 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM1_f7 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM2_f0 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f1 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f2 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f3 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f4 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f5 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f6 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f7 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f8 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f9 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f10 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f11 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f12 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f13 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f14 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f15 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=0.84u +.ends C12_gf180_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C12/gf180/sW2_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW2_sL1.5/testbench.spice new file mode 100644 index 00000000..ecf9b809 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW2_sL1.5/testbench.spice @@ -0,0 +1,26 @@ +X1 VDD VSS VIN1 VOUT1 C12_gf180_sW2_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 + +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C12/gf180/sW2_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW2_sL1/case.json new file mode 100644 index 00000000..6614ffd3 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW2_sL1/case.json @@ -0,0 +1,88 @@ +{ + "case_id": "C12_gf180_sW2_sL1", + "circuit_id": "C12", + "pdk": "gf180", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "dut_name": "C12_gf180_sW2_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "M2": { + "w": 8.0, + "l": 0.56, + "nf": 16 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": {}, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "cb080639ead3a44c", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/gf180/sW2_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW2_sL1/manifest.json new file mode 100644 index 00000000..2872f33a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW2_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "cf2c39fb20dcb86350f8bcf991ba6157062355c5c309cd2b46fa7207cf0b44c0", + "qualification.json": "dadf2924e318b59a381826faf45c69cd504e7659a5e578b446375532e74cfb61", + "specs.json": "7e9221f19679d666f4a3456646a41c71b4c9956fcec99078b8e0754cac5ab2ce", + "target.spice": "6e8a66ab6ed7fa00baeeee15518a3ca1cc220ee770b0aae6569f7e1b97021b05", + "target_lvs.spice": "265c1b74674156c2fe8e39b05cdeecbebe500a22d1f8e9c6449ee0fee51fe459", + "testbench.spice": "a9c7159df064c5f007ebaa48e18aed6fb895f1317aef76993cd4ad67aab15bdb" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/gf180/sW2_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW2_sL1/qualification.json new file mode 100644 index 00000000..bbdd2f65 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW2_sL1/qualification.json @@ -0,0 +1,83 @@ +{ + "case_id": "C12_gf180_sW2_sL1", + "circuit_id": "C12", + "pdk": "gf180", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "single", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "cb080639ead3a44c", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 31.9 + }, + "f3db": { + "min": 13200000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 34.89966, + "f3db": 22000180.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vout0": 1.458836, + "vin0": 1.458836, + "idd": 0.0002355442, + "gain_lf": 34.89966, + "f3db": 22000180.0, + "ugf": 1231243000.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/gf180/sW2_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW2_sL1/specs.json new file mode 100644 index 00000000..0c477325 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW2_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 31.9 + }, + "f3db": { + "min": 13200000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 34.89966, + "f3db": 22000180.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/gf180/sW2_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW2_sL1/target.spice new file mode 100644 index 00000000..26edb999 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW2_sL1/target.spice @@ -0,0 +1,4 @@ +.subckt C12_gf180_sW2_sL1 VDD VSS VIN1 VOUT1 +MM1 VOUT1 VIN1 VSS VSS nfet_03v3 w=4u l=0.56u nf=8 m=1 +MM2 VOUT1 VIN1 VDD VDD pfet_03v3 w=8u l=0.56u nf=16 m=1 +.ends C12_gf180_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C12/gf180/sW2_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW2_sL1/target_lvs.spice new file mode 100644 index 00000000..6b235665 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW2_sL1/target_lvs.spice @@ -0,0 +1,26 @@ +.subckt C12_gf180_sW2_sL1 VDD VSS VIN1 VOUT1 +MM1_f0 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM1_f1 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM1_f2 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM1_f3 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM1_f4 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM1_f5 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM1_f6 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM1_f7 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM2_f0 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f1 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f2 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f3 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f4 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f5 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f6 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f7 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f8 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f9 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f10 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f11 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f12 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f13 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f14 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f15 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=0.56u +.ends C12_gf180_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C12/gf180/sW2_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW2_sL1/testbench.spice new file mode 100644 index 00000000..3edde611 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW2_sL1/testbench.spice @@ -0,0 +1,26 @@ +X1 VDD VSS VIN1 VOUT1 C12_gf180_sW2_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 + +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C12/gf180/sW2_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW2_sL2/case.json new file mode 100644 index 00000000..7af72459 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW2_sL2/case.json @@ -0,0 +1,88 @@ +{ + "case_id": "C12_gf180_sW2_sL2", + "circuit_id": "C12", + "pdk": "gf180", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "dut_name": "C12_gf180_sW2_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 1.12, + "nf": 8 + }, + "M2": { + "w": 8.0, + "l": 1.12, + "nf": 16 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": {}, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "11b233d9c6c48603", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/gf180/sW2_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW2_sL2/manifest.json new file mode 100644 index 00000000..65a0e991 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW2_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "a1db0e47a91d9472a310dc411167377f2d25ad21493ee05d4e7ecb4cb57e9df5", + "qualification.json": "2f0736eabf4298046ba8c69f08a0e00f827b2bdfca2a690ddc6e610ad8016622", + "specs.json": "97a4edd01cc06b17beed0a5305de4c31a33284e2569ef47cfd507d79dde30711", + "target.spice": "714d7fa922e225e34342652cbf945f0321a22ec4c82310eaeaf81fc139595cae", + "target_lvs.spice": "be0c3cf4f35928eb5ea2cad53c7abbb848593231136815562b3653fe09cd15a2", + "testbench.spice": "547f00a208c9f96840a7b7c5b54b15ea0c50929d119a86f852bdd30e6c05b804" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/gf180/sW2_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW2_sL2/qualification.json new file mode 100644 index 00000000..364d2969 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW2_sL2/qualification.json @@ -0,0 +1,83 @@ +{ + "case_id": "C12_gf180_sW2_sL2", + "circuit_id": "C12", + "pdk": "gf180", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "single", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "11b233d9c6c48603", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 38.96 + }, + "f3db": { + "min": 3132000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 41.96166, + "f3db": 5220240.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vout0": 1.429767, + "vin0": 1.429767, + "idd": 0.0001158981, + "gain_lf": 41.96166, + "f3db": 5220240.0, + "ugf": 664154000.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/gf180/sW2_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW2_sL2/specs.json new file mode 100644 index 00000000..7ca87f84 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW2_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 38.96 + }, + "f3db": { + "min": 3132000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 41.96166, + "f3db": 5220240.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/gf180/sW2_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW2_sL2/target.spice new file mode 100644 index 00000000..db67aec6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW2_sL2/target.spice @@ -0,0 +1,4 @@ +.subckt C12_gf180_sW2_sL2 VDD VSS VIN1 VOUT1 +MM1 VOUT1 VIN1 VSS VSS nfet_03v3 w=4u l=1.12u nf=8 m=1 +MM2 VOUT1 VIN1 VDD VDD pfet_03v3 w=8u l=1.12u nf=16 m=1 +.ends C12_gf180_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C12/gf180/sW2_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW2_sL2/target_lvs.spice new file mode 100644 index 00000000..763ac6c3 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW2_sL2/target_lvs.spice @@ -0,0 +1,26 @@ +.subckt C12_gf180_sW2_sL2 VDD VSS VIN1 VOUT1 +MM1_f0 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM1_f1 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM1_f2 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM1_f3 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM1_f4 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM1_f5 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM1_f6 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM1_f7 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM2_f0 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f1 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f2 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f3 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f4 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f5 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f6 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f7 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f8 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f9 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f10 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f11 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f12 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f13 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f14 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f15 VOUT1 VIN1 VDD VDD pfet_03v3 w=0.5u l=1.12u +.ends C12_gf180_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C12/gf180/sW2_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW2_sL2/testbench.spice new file mode 100644 index 00000000..b808fa32 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/gf180/sW2_sL2/testbench.spice @@ -0,0 +1,26 @@ +X1 VDD VSS VIN1 VOUT1 C12_gf180_sW2_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 + +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW0.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW0.5_sL1.5/case.json new file mode 100644 index 00000000..6c0750c6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW0.5_sL1.5/case.json @@ -0,0 +1,88 @@ +{ + "case_id": "C12_ihp130_sW0.5_sL1.5", + "circuit_id": "C12", + "pdk": "ihp130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "dut_name": "C12_ihp130_sW0.5_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1" + ], + "sizing": { + "M1": { + "w": 1.0, + "l": 0.39, + "nf": 2 + }, + "M2": { + "w": 2.0, + "l": 0.39, + "nf": 4 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": {}, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.39, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "89a697c8a44e7f68", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW0.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW0.5_sL1.5/manifest.json new file mode 100644 index 00000000..20bb7a06 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW0.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "64ebd6d7769466f795f2769d44c45fde0e786825dac2a778902e2c033332b1fe", + "qualification.json": "55f88302d8a0d4000b1cc72f0370c865d8d4ce69fe83e28e5292879217f517ef", + "specs.json": "93cb910d4c073dadeaff15d239c000a366782b66b7f3df396d88348b4a386759", + "target.spice": "2772f9b585c98a6f8f51643b8df77fe3c844d50f87f23f77b48ec3924a0f0c82", + "target_lvs.spice": "4234dd953aeb9a6b85ac922c78da86a98f4ff471e45e0792908446e8d3117dd7", + "testbench.spice": "cd703e650998bd557c19c94ac33e42e83ef2e5a7520c6b02be1885d36013db80" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW0.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW0.5_sL1.5/qualification.json new file mode 100644 index 00000000..12de0379 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW0.5_sL1.5/qualification.json @@ -0,0 +1,83 @@ +{ + "case_id": "C12_ihp130_sW0.5_sL1.5", + "circuit_id": "C12", + "pdk": "ihp130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "single", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.39, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "89a697c8a44e7f68", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 27.08 + }, + "f3db": { + "min": 8479000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 30.08356, + "f3db": 14131660.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vout0": 0.536533, + "vin0": 0.536533, + "idd": 2.035058e-05, + "gain_lf": 30.08356, + "f3db": 14131660.0, + "ugf": 452762300.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW0.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW0.5_sL1.5/specs.json new file mode 100644 index 00000000..41f07e88 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW0.5_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 27.08 + }, + "f3db": { + "min": 8479000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 30.08356, + "f3db": 14131660.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW0.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW0.5_sL1.5/target.spice new file mode 100644 index 00000000..2e983d42 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW0.5_sL1.5/target.spice @@ -0,0 +1,4 @@ +.subckt C12_ihp130_sW0.5_sL1.5 VDD VSS VIN1 VOUT1 +XM1 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=1u l=0.39u ng=2 m=1 +XM2 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=2u l=0.39u ng=4 m=1 +.ends C12_ihp130_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW0.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW0.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..8a8c768d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW0.5_sL1.5/target_lvs.spice @@ -0,0 +1,8 @@ +.subckt C12_ihp130_sW0.5_sL1.5 VDD VSS VIN1 VOUT1 +XM1_f0 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f1 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f0 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f1 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f2 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f3 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +.ends C12_ihp130_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW0.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW0.5_sL1.5/testbench.spice new file mode 100644 index 00000000..9b8b82ec --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW0.5_sL1.5/testbench.spice @@ -0,0 +1,26 @@ +X1 VDD VSS VIN1 VOUT1 C12_ihp130_sW0.5_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 + +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW0.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW0.5_sL1/case.json new file mode 100644 index 00000000..d4b9d80c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW0.5_sL1/case.json @@ -0,0 +1,88 @@ +{ + "case_id": "C12_ihp130_sW0.5_sL1", + "circuit_id": "C12", + "pdk": "ihp130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "dut_name": "C12_ihp130_sW0.5_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1" + ], + "sizing": { + "M1": { + "w": 1.0, + "l": 0.26, + "nf": 2 + }, + "M2": { + "w": 2.0, + "l": 0.26, + "nf": 4 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": {}, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.26, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.26, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "a03b17113367c3f7", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW0.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW0.5_sL1/manifest.json new file mode 100644 index 00000000..9bdadf7f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW0.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "556b561130526ff38ff2c096a1b836d8892b76219a6fd47d2fcb8429c348eae4", + "qualification.json": "f5e1fe8bcbdf0ed0e7f848967927d7ec23ff95fe033a5d8d970e2e3303ad7efe", + "specs.json": "2c5816471488f905f5e233014f5da6c4463b901509abd6d391949e5ece4d649b", + "target.spice": "d13240254f44d112a77c36a93dd6573b80876e27be01a79f300b95ef9d3541d8", + "target_lvs.spice": "1407ccb77d74e66ee20fa377bdf127154ac8c97a10a45309341b0d1fb08f04b8", + "testbench.spice": "aa8d6fedb6e2b052ec52af92b5ccba8291af83c567fd10c94c210e9641ec22e8" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW0.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW0.5_sL1/qualification.json new file mode 100644 index 00000000..2b914ba0 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW0.5_sL1/qualification.json @@ -0,0 +1,83 @@ +{ + "case_id": "C12_ihp130_sW0.5_sL1", + "circuit_id": "C12", + "pdk": "ihp130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "single", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.26, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.26, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "a03b17113367c3f7", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 25.79 + }, + "f3db": { + "min": 12110000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 28.78626, + "f3db": 20185360.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vout0": 0.5543392, + "vin0": 0.5543392, + "idd": 2.299929e-05, + "gain_lf": 28.78626, + "f3db": 20185360.0, + "ugf": 556581500.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW0.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW0.5_sL1/specs.json new file mode 100644 index 00000000..b6611d66 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW0.5_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 25.79 + }, + "f3db": { + "min": 12110000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 28.78626, + "f3db": 20185360.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW0.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW0.5_sL1/target.spice new file mode 100644 index 00000000..c3eaa931 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW0.5_sL1/target.spice @@ -0,0 +1,4 @@ +.subckt C12_ihp130_sW0.5_sL1 VDD VSS VIN1 VOUT1 +XM1 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=1u l=0.26u ng=2 m=1 +XM2 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=2u l=0.26u ng=4 m=1 +.ends C12_ihp130_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW0.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW0.5_sL1/target_lvs.spice new file mode 100644 index 00000000..0f63a37e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW0.5_sL1/target_lvs.spice @@ -0,0 +1,8 @@ +.subckt C12_ihp130_sW0.5_sL1 VDD VSS VIN1 VOUT1 +XM1_f0 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f1 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f0 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f1 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f2 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f3 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +.ends C12_ihp130_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW0.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW0.5_sL1/testbench.spice new file mode 100644 index 00000000..e91de72d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW0.5_sL1/testbench.spice @@ -0,0 +1,26 @@ +X1 VDD VSS VIN1 VOUT1 C12_ihp130_sW0.5_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 + +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW0.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW0.5_sL2/case.json new file mode 100644 index 00000000..dc3e5ed4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW0.5_sL2/case.json @@ -0,0 +1,88 @@ +{ + "case_id": "C12_ihp130_sW0.5_sL2", + "circuit_id": "C12", + "pdk": "ihp130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "dut_name": "C12_ihp130_sW0.5_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1" + ], + "sizing": { + "M1": { + "w": 1.0, + "l": 0.52, + "nf": 2 + }, + "M2": { + "w": 2.0, + "l": 0.52, + "nf": 4 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": {}, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.52, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "09cbc581b674ed48", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW0.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW0.5_sL2/manifest.json new file mode 100644 index 00000000..421cc25a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW0.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "9088126c3989addc66591af7b14c4936432c4c16b9ba78399ade81ef9a6c0ea0", + "qualification.json": "30edf565291e7ba07f0fa5bd477f647ebf94626241b1218e0bd625cd0e02d20a", + "specs.json": "7705568bd7c235ccb4b4e2dc85e39cb0f46180128997f828ddada71d1ec0ca99", + "target.spice": "00ca1fafdab68caa37415e49a3184fb158407fc6e15e62128d511bd001200911", + "target_lvs.spice": "c5b433161b862602c28687c7625ccbe49f89b003260fe72c69fc0f37b9220163", + "testbench.spice": "9b076a2ab10b168f80a1be1dce5d6b9d9dc0554fad2c467a950b966e311c0355" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW0.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW0.5_sL2/qualification.json new file mode 100644 index 00000000..3de0d7c8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW0.5_sL2/qualification.json @@ -0,0 +1,83 @@ +{ + "case_id": "C12_ihp130_sW0.5_sL2", + "circuit_id": "C12", + "pdk": "ihp130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "single", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.52, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "09cbc581b674ed48", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 27.95 + }, + "f3db": { + "min": 6334000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 30.94605, + "f3db": 10557420.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vout0": 0.5279493, + "vin0": 0.5279493, + "idd": 1.751375e-05, + "gain_lf": 30.94605, + "f3db": 10557420.0, + "ugf": 374160700.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW0.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW0.5_sL2/specs.json new file mode 100644 index 00000000..520a1dbb --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW0.5_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 27.95 + }, + "f3db": { + "min": 6334000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 30.94605, + "f3db": 10557420.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW0.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW0.5_sL2/target.spice new file mode 100644 index 00000000..63e7a637 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW0.5_sL2/target.spice @@ -0,0 +1,4 @@ +.subckt C12_ihp130_sW0.5_sL2 VDD VSS VIN1 VOUT1 +XM1 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=1u l=0.52u ng=2 m=1 +XM2 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=2u l=0.52u ng=4 m=1 +.ends C12_ihp130_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW0.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW0.5_sL2/target_lvs.spice new file mode 100644 index 00000000..0381837d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW0.5_sL2/target_lvs.spice @@ -0,0 +1,8 @@ +.subckt C12_ihp130_sW0.5_sL2 VDD VSS VIN1 VOUT1 +XM1_f0 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f1 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f0 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f1 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f2 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f3 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +.ends C12_ihp130_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW0.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW0.5_sL2/testbench.spice new file mode 100644 index 00000000..3504d8ba --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW0.5_sL2/testbench.spice @@ -0,0 +1,26 @@ +X1 VDD VSS VIN1 VOUT1 C12_ihp130_sW0.5_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 + +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1.5_sL1.5/case.json new file mode 100644 index 00000000..bc2acac5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1.5_sL1.5/case.json @@ -0,0 +1,88 @@ +{ + "case_id": "C12_ihp130_sW1.5_sL1.5", + "circuit_id": "C12", + "pdk": "ihp130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "dut_name": "C12_ihp130_sW1.5_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1" + ], + "sizing": { + "M1": { + "w": 3.0, + "l": 0.39, + "nf": 6 + }, + "M2": { + "w": 6.0, + "l": 0.39, + "nf": 12 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": {}, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.39, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.39, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "47c566519aff0867", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1.5_sL1.5/manifest.json new file mode 100644 index 00000000..56e8a924 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "c0cdcc285c775fd138d58246f53181c9c3cf98df377af8510961709af2a790f2", + "qualification.json": "8b7a9fe4c44cd009b24eb787cebb232f0a5484b9d972690889c2e6458034d560", + "specs.json": "1408308ae7e5e1f41531f351e5e046e52a25d3f9515847cd695241e0c10b3070", + "target.spice": "c8483302283d274f1a8852ff05526a67b9eaef4b7e4d5fdcd38a2116e9e9477d", + "target_lvs.spice": "3de74d52e03e0e6bffc84f04ca30e5a02ba3342c1c5401cf6864720f473b0730", + "testbench.spice": "1e9084bcc14aa368aaa6c6fbccd858711db6370db951608f3cf55b915f98aa4d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1.5_sL1.5/qualification.json new file mode 100644 index 00000000..81cf336d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1.5_sL1.5/qualification.json @@ -0,0 +1,83 @@ +{ + "case_id": "C12_ihp130_sW1.5_sL1.5", + "circuit_id": "C12", + "pdk": "ihp130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "single", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.39, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.39, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "47c566519aff0867", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 27.08 + }, + "f3db": { + "min": 24200000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 30.08356, + "f3db": 40334740.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.2, + "schematic_measures": { + "vout0": 0.536533, + "vin0": 0.536533, + "idd": 6.105175e-05, + "gain_lf": 30.08356, + "f3db": 40334740.0, + "ugf": 1301497000.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1.5_sL1.5/specs.json new file mode 100644 index 00000000..54d9e4d9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1.5_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 27.08 + }, + "f3db": { + "min": 24200000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 30.08356, + "f3db": 40334740.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1.5_sL1.5/target.spice new file mode 100644 index 00000000..8af13855 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1.5_sL1.5/target.spice @@ -0,0 +1,4 @@ +.subckt C12_ihp130_sW1.5_sL1.5 VDD VSS VIN1 VOUT1 +XM1 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=3u l=0.39u ng=6 m=1 +XM2 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=6u l=0.39u ng=12 m=1 +.ends C12_ihp130_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..a3863017 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1.5_sL1.5/target_lvs.spice @@ -0,0 +1,20 @@ +.subckt C12_ihp130_sW1.5_sL1.5 VDD VSS VIN1 VOUT1 +XM1_f0 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f1 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f2 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f3 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f4 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f5 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f0 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f1 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f2 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f3 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f4 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f5 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f6 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f7 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f8 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f9 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f10 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f11 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +.ends C12_ihp130_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1.5_sL1.5/testbench.spice new file mode 100644 index 00000000..a9215b6e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1.5_sL1.5/testbench.spice @@ -0,0 +1,26 @@ +X1 VDD VSS VIN1 VOUT1 C12_ihp130_sW1.5_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 + +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1.5_sL1/case.json new file mode 100644 index 00000000..28d39226 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1.5_sL1/case.json @@ -0,0 +1,88 @@ +{ + "case_id": "C12_ihp130_sW1.5_sL1", + "circuit_id": "C12", + "pdk": "ihp130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "dut_name": "C12_ihp130_sW1.5_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1" + ], + "sizing": { + "M1": { + "w": 3.0, + "l": 0.26, + "nf": 6 + }, + "M2": { + "w": 6.0, + "l": 0.26, + "nf": 12 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": {}, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.26, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.26, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "b8a8396df71d5d77", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1.5_sL1/manifest.json new file mode 100644 index 00000000..83f8ba62 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "97c2420f6df011cd268de83c1dae6a1ca8ffb2fc9de943b3285760e5081eeeaf", + "qualification.json": "e51d3486239ad646480233a62957169b790984ce40debb6b9bacb99258c807ed", + "specs.json": "4569b0124db98c13cbbe9d08f4b55299d15d6fa9e791c506b7cf9ca81067d9b4", + "target.spice": "637e13ec741e9b917751661fd54694153d30c0bbdcad9453b7cd239f67c23ebe", + "target_lvs.spice": "92051af35df435d8b868997a12c3f29052d7f3edf50a1a866800c737b1d01d00", + "testbench.spice": "ca7bd1fcb682afea2df100b0c15ff9f2ead0922f19e47804af263b33aab29151" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1.5_sL1/qualification.json new file mode 100644 index 00000000..29348942 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1.5_sL1/qualification.json @@ -0,0 +1,83 @@ +{ + "case_id": "C12_ihp130_sW1.5_sL1", + "circuit_id": "C12", + "pdk": "ihp130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "single", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.26, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.26, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "b8a8396df71d5d77", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 25.79 + }, + "f3db": { + "min": 34570000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 28.78626, + "f3db": 57621230.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.2, + "schematic_measures": { + "vout0": 0.5543392, + "vin0": 0.5543392, + "idd": 6.899786e-05, + "gain_lf": 28.78626, + "f3db": 57621230.0, + "ugf": 1593823000.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1.5_sL1/specs.json new file mode 100644 index 00000000..d839f370 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1.5_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 25.79 + }, + "f3db": { + "min": 34570000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 28.78626, + "f3db": 57621230.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1.5_sL1/target.spice new file mode 100644 index 00000000..40f9ca47 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1.5_sL1/target.spice @@ -0,0 +1,4 @@ +.subckt C12_ihp130_sW1.5_sL1 VDD VSS VIN1 VOUT1 +XM1 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=3u l=0.26u ng=6 m=1 +XM2 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=6u l=0.26u ng=12 m=1 +.ends C12_ihp130_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1.5_sL1/target_lvs.spice new file mode 100644 index 00000000..ba08d1bb --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1.5_sL1/target_lvs.spice @@ -0,0 +1,20 @@ +.subckt C12_ihp130_sW1.5_sL1 VDD VSS VIN1 VOUT1 +XM1_f0 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f1 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f2 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f3 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f4 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f5 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f0 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f1 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f2 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f3 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f4 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f5 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f6 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f7 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f8 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f9 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f10 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f11 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +.ends C12_ihp130_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1.5_sL1/testbench.spice new file mode 100644 index 00000000..2f2c2b3e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1.5_sL1/testbench.spice @@ -0,0 +1,26 @@ +X1 VDD VSS VIN1 VOUT1 C12_ihp130_sW1.5_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 + +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1.5_sL2/case.json new file mode 100644 index 00000000..af7284a0 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1.5_sL2/case.json @@ -0,0 +1,88 @@ +{ + "case_id": "C12_ihp130_sW1.5_sL2", + "circuit_id": "C12", + "pdk": "ihp130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "dut_name": "C12_ihp130_sW1.5_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1" + ], + "sizing": { + "M1": { + "w": 3.0, + "l": 0.52, + "nf": 6 + }, + "M2": { + "w": 6.0, + "l": 0.52, + "nf": 12 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": {}, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.52, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.52, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "e7a468f5c301824d", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1.5_sL2/manifest.json new file mode 100644 index 00000000..723c8f98 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "2f1455f74288121c826a39cf98553225229065f504f1619cbf6177e301ba2569", + "qualification.json": "81f0fe509a29d1137c571f3fe71a5a0c556672a2bb5ecab8fe1e4d7d95991376", + "specs.json": "ae9030f10a37d372bad40e0f5cfefab0ab640e964f92c21d44e93edec4126bde", + "target.spice": "9291732b4a227b2702692d31cc609c4436b102e5c6ed19319277820f1efacb46", + "target_lvs.spice": "93e2d81a39c664495863fb1651771f509761809ab1e98928e68e1d214ba04e99", + "testbench.spice": "0c8ac091356e26698f74796afd9d922b6fc836e72a187a7e1f5377523a72c82e" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1.5_sL2/qualification.json new file mode 100644 index 00000000..913802cf --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1.5_sL2/qualification.json @@ -0,0 +1,83 @@ +{ + "case_id": "C12_ihp130_sW1.5_sL2", + "circuit_id": "C12", + "pdk": "ihp130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "single", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.52, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.52, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "e7a468f5c301824d", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 27.95 + }, + "f3db": { + "min": 18080000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 30.94606, + "f3db": 30129050.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.2, + "schematic_measures": { + "vout0": 0.5279493, + "vin0": 0.5279493, + "idd": 5.254126e-05, + "gain_lf": 30.94606, + "f3db": 30129050.0, + "ugf": 1078875000.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1.5_sL2/specs.json new file mode 100644 index 00000000..e4854adf --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1.5_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 27.95 + }, + "f3db": { + "min": 18080000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 30.94606, + "f3db": 30129050.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1.5_sL2/target.spice new file mode 100644 index 00000000..ea05615b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1.5_sL2/target.spice @@ -0,0 +1,4 @@ +.subckt C12_ihp130_sW1.5_sL2 VDD VSS VIN1 VOUT1 +XM1 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=3u l=0.52u ng=6 m=1 +XM2 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=6u l=0.52u ng=12 m=1 +.ends C12_ihp130_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1.5_sL2/target_lvs.spice new file mode 100644 index 00000000..c6b5d69d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1.5_sL2/target_lvs.spice @@ -0,0 +1,20 @@ +.subckt C12_ihp130_sW1.5_sL2 VDD VSS VIN1 VOUT1 +XM1_f0 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f1 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f2 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f3 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f4 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f5 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f0 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f1 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f2 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f3 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f4 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f5 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f6 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f7 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f8 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f9 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f10 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f11 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +.ends C12_ihp130_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1.5_sL2/testbench.spice new file mode 100644 index 00000000..6eb36414 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1.5_sL2/testbench.spice @@ -0,0 +1,26 @@ +X1 VDD VSS VIN1 VOUT1 C12_ihp130_sW1.5_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 + +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1_sL1.5/case.json new file mode 100644 index 00000000..0ca39c77 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1_sL1.5/case.json @@ -0,0 +1,88 @@ +{ + "case_id": "C12_ihp130_sW1_sL1.5", + "circuit_id": "C12", + "pdk": "ihp130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "dut_name": "C12_ihp130_sW1_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.39, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.39, + "nf": 8 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": {}, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "42d505e7cd3febc6", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1_sL1.5/manifest.json new file mode 100644 index 00000000..1667e072 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "b1cb022ec5875f97e1af8ec87ad9e361626bdb1bfcb841c77cc16bb09e881c45", + "qualification.json": "1d0db88047627fc8bda96e231053196c1038c2888c37db7d22681291f45a1e54", + "specs.json": "7c8e8d1505e4e8c29eff61b2e982a851fa30f0d01161896508fc831db8d0d897", + "target.spice": "86db6d8ef778d11b28eb2ae5455eb09d6e5de859d1880437edfae25eb07cd110", + "target_lvs.spice": "8b58e8689830aee1d172423ed249412bc389c0a6782302bb6dbfbccdcd11dda2", + "testbench.spice": "d754f2ee026747f0429f83fbe49e6fa501fc718c80b0885ce8cc487715d446bb" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1_sL1.5/qualification.json new file mode 100644 index 00000000..7d66d32f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1_sL1.5/qualification.json @@ -0,0 +1,83 @@ +{ + "case_id": "C12_ihp130_sW1_sL1.5", + "circuit_id": "C12", + "pdk": "ihp130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "single", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "42d505e7cd3febc6", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 27.08 + }, + "f3db": { + "min": 16540000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 30.08356, + "f3db": 27558440.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.2, + "schematic_measures": { + "vout0": 0.536533, + "vin0": 0.536533, + "idd": 4.070117e-05, + "gain_lf": 30.08356, + "f3db": 27558440.0, + "ugf": 884930600.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1_sL1.5/specs.json new file mode 100644 index 00000000..2d9ce672 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 27.08 + }, + "f3db": { + "min": 16540000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 30.08356, + "f3db": 27558440.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1_sL1.5/target.spice new file mode 100644 index 00000000..d297ede8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1_sL1.5/target.spice @@ -0,0 +1,4 @@ +.subckt C12_ihp130_sW1_sL1.5 VDD VSS VIN1 VOUT1 +XM1 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=2u l=0.39u ng=4 m=1 +XM2 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=4u l=0.39u ng=8 m=1 +.ends C12_ihp130_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1_sL1.5/target_lvs.spice new file mode 100644 index 00000000..81b64d6a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1_sL1.5/target_lvs.spice @@ -0,0 +1,14 @@ +.subckt C12_ihp130_sW1_sL1.5 VDD VSS VIN1 VOUT1 +XM1_f0 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f1 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f2 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f3 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f0 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f1 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f2 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f3 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f4 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f5 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f6 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f7 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +.ends C12_ihp130_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1_sL1.5/testbench.spice new file mode 100644 index 00000000..7abcb55a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1_sL1.5/testbench.spice @@ -0,0 +1,26 @@ +X1 VDD VSS VIN1 VOUT1 C12_ihp130_sW1_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 + +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1_sL1/case.json new file mode 100644 index 00000000..67cd95d8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1_sL1/case.json @@ -0,0 +1,88 @@ +{ + "case_id": "C12_ihp130_sW1_sL1", + "circuit_id": "C12", + "pdk": "ihp130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "dut_name": "C12_ihp130_sW1_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.26, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.26, + "nf": 8 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": {}, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.26, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "48ee1a2627474a85", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1_sL1/manifest.json new file mode 100644 index 00000000..8b28fdf3 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "6695a0897a2a6d6f01bd69992cf66234d8f309c6c6b05622072fde4fb8da5886", + "qualification.json": "ae4269ff787c64fa1d195582593ecdabbc51d3120db6cd8dc3351ec19e7a07ad", + "specs.json": "6d64193173e2ef8207948bf462396ead3a892867905098e72d14b62fd3d16ab1", + "target.spice": "39707f948806ee3eff9b7e28208dc76b50884162be6f34d3df195bb2f0863863", + "target_lvs.spice": "c7527a657d0a08a1869feb31c4d88303ba56163ac305961a108b9f2c42b188ad", + "testbench.spice": "81e838aaa876df47714d35c8e7772f25f7695c7bc556beb48b094776cdfa663f" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1_sL1/qualification.json new file mode 100644 index 00000000..fa353570 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1_sL1/qualification.json @@ -0,0 +1,83 @@ +{ + "case_id": "C12_ihp130_sW1_sL1", + "circuit_id": "C12", + "pdk": "ihp130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "single", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.26, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "48ee1a2627474a85", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 25.79 + }, + "f3db": { + "min": 23620000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 28.78626, + "f3db": 39366570.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.2, + "schematic_measures": { + "vout0": 0.5543392, + "vin0": 0.5543392, + "idd": 4.599857e-05, + "gain_lf": 28.78626, + "f3db": 39366570.0, + "ugf": 1087796000.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1_sL1/specs.json new file mode 100644 index 00000000..ecf32bd9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 25.79 + }, + "f3db": { + "min": 23620000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 28.78626, + "f3db": 39366570.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1_sL1/target.spice new file mode 100644 index 00000000..1f879ed0 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1_sL1/target.spice @@ -0,0 +1,4 @@ +.subckt C12_ihp130_sW1_sL1 VDD VSS VIN1 VOUT1 +XM1 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=2u l=0.26u ng=4 m=1 +XM2 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=4u l=0.26u ng=8 m=1 +.ends C12_ihp130_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1_sL1/target_lvs.spice new file mode 100644 index 00000000..44912493 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1_sL1/target_lvs.spice @@ -0,0 +1,14 @@ +.subckt C12_ihp130_sW1_sL1 VDD VSS VIN1 VOUT1 +XM1_f0 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f1 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f2 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f3 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f0 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f1 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f2 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f3 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f4 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f5 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f6 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f7 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +.ends C12_ihp130_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1_sL1/testbench.spice new file mode 100644 index 00000000..b8371229 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1_sL1/testbench.spice @@ -0,0 +1,26 @@ +X1 VDD VSS VIN1 VOUT1 C12_ihp130_sW1_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 + +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1_sL2/case.json new file mode 100644 index 00000000..ce64e7bd --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1_sL2/case.json @@ -0,0 +1,88 @@ +{ + "case_id": "C12_ihp130_sW1_sL2", + "circuit_id": "C12", + "pdk": "ihp130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "dut_name": "C12_ihp130_sW1_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.52, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.52, + "nf": 8 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": {}, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "4eb2f9a567fcf389", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1_sL2/manifest.json new file mode 100644 index 00000000..d505b830 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "db02b0a722f1b7ffa4e4980ed193087b12d8fb010a91a869c17cf598f00e3b9e", + "qualification.json": "a4a1912dd89b27fd058c5e3385809e380ea7cbf5f2ee087d6a34484cefb62663", + "specs.json": "4f12f44b3ad0d20c79a13ab3045627330e8c9962252f3e90e4a3793c0e63e5bb", + "target.spice": "e4b4440d2500e119115cd4a0576b5456138a565188f8124fbffb0435ffafbab3", + "target_lvs.spice": "5b13346f1f46005d20c5e9131a8396a52c6a43723c974796f317b85b9fd60387", + "testbench.spice": "c284c095e025052d33341e95b6fe6812a5e0206478b9fa3caec18f29b6cd5757" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1_sL2/qualification.json new file mode 100644 index 00000000..26ba5ac3 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1_sL2/qualification.json @@ -0,0 +1,83 @@ +{ + "case_id": "C12_ihp130_sW1_sL2", + "circuit_id": "C12", + "pdk": "ihp130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "single", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "4eb2f9a567fcf389", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 27.95 + }, + "f3db": { + "min": 12350000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 30.94606, + "f3db": 20588090.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.2, + "schematic_measures": { + "vout0": 0.5279493, + "vin0": 0.5279493, + "idd": 3.502751e-05, + "gain_lf": 30.94606, + "f3db": 20588090.0, + "ugf": 732416700.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1_sL2/specs.json new file mode 100644 index 00000000..de6b70d7 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 27.95 + }, + "f3db": { + "min": 12350000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 30.94606, + "f3db": 20588090.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1_sL2/target.spice new file mode 100644 index 00000000..6e4eb4a0 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1_sL2/target.spice @@ -0,0 +1,4 @@ +.subckt C12_ihp130_sW1_sL2 VDD VSS VIN1 VOUT1 +XM1 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=2u l=0.52u ng=4 m=1 +XM2 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=4u l=0.52u ng=8 m=1 +.ends C12_ihp130_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1_sL2/target_lvs.spice new file mode 100644 index 00000000..310ea854 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1_sL2/target_lvs.spice @@ -0,0 +1,14 @@ +.subckt C12_ihp130_sW1_sL2 VDD VSS VIN1 VOUT1 +XM1_f0 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f1 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f2 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f3 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f0 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f1 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f2 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f3 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f4 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f5 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f6 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f7 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +.ends C12_ihp130_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1_sL2/testbench.spice new file mode 100644 index 00000000..5a7e47f2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW1_sL2/testbench.spice @@ -0,0 +1,26 @@ +X1 VDD VSS VIN1 VOUT1 C12_ihp130_sW1_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 + +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW2_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW2_sL1.5/case.json new file mode 100644 index 00000000..97c68e3c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW2_sL1.5/case.json @@ -0,0 +1,88 @@ +{ + "case_id": "C12_ihp130_sW2_sL1.5", + "circuit_id": "C12", + "pdk": "ihp130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "dut_name": "C12_ihp130_sW2_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.39, + "nf": 8 + }, + "M2": { + "w": 8.0, + "l": 0.39, + "nf": 16 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": {}, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "0f43b765ca2619dc", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW2_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW2_sL1.5/manifest.json new file mode 100644 index 00000000..f1a15ff7 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW2_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "47e5623f1c4943236fa6a1e4bf7020b8139b69c3f3cc7150e964ebe4233aea33", + "qualification.json": "221b73a848a5badac4b6e91b221deeb7a5b114abcd2d1458470713fc41ac03db", + "specs.json": "d16ec984cc46f48fd3c644c60dfac309e387ed6a882ae3ca65f463f7ea233fc5", + "target.spice": "38bb9cdde9a04f17e51ef2b0335b9a71f545916cc2ce0088335b4114483986ff", + "target_lvs.spice": "e7857ff1ec9bc62d85405527ea12a293695c51d407b890a7f5432f81db671b58", + "testbench.spice": "cad14209c509568f95c4d70c06cbbbc2db8a7e0cb2625604e0dfc589987e43a6" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW2_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW2_sL1.5/qualification.json new file mode 100644 index 00000000..191c6beb --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW2_sL1.5/qualification.json @@ -0,0 +1,83 @@ +{ + "case_id": "C12_ihp130_sW2_sL1.5", + "circuit_id": "C12", + "pdk": "ihp130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "single", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "0f43b765ca2619dc", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 27.08 + }, + "f3db": { + "min": 31500000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 30.08356, + "f3db": 52503150.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.2, + "schematic_measures": { + "vout0": 0.536533, + "vin0": 0.536533, + "idd": 8.140233e-05, + "gain_lf": 30.08356, + "f3db": 52503150.0, + "ugf": 1703299000.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW2_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW2_sL1.5/specs.json new file mode 100644 index 00000000..9faf9a6c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW2_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 27.08 + }, + "f3db": { + "min": 31500000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 30.08356, + "f3db": 52503150.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW2_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW2_sL1.5/target.spice new file mode 100644 index 00000000..5f84f4ac --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW2_sL1.5/target.spice @@ -0,0 +1,4 @@ +.subckt C12_ihp130_sW2_sL1.5 VDD VSS VIN1 VOUT1 +XM1 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=4u l=0.39u ng=8 m=1 +XM2 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=8u l=0.39u ng=16 m=1 +.ends C12_ihp130_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW2_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW2_sL1.5/target_lvs.spice new file mode 100644 index 00000000..74d9ba26 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW2_sL1.5/target_lvs.spice @@ -0,0 +1,26 @@ +.subckt C12_ihp130_sW2_sL1.5 VDD VSS VIN1 VOUT1 +XM1_f0 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f1 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f2 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f3 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f4 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f5 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f6 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f7 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f0 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f1 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f2 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f3 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f4 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f5 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f6 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f7 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f8 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f9 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f10 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f11 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f12 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f13 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f14 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f15 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +.ends C12_ihp130_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW2_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW2_sL1.5/testbench.spice new file mode 100644 index 00000000..87118327 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW2_sL1.5/testbench.spice @@ -0,0 +1,26 @@ +X1 VDD VSS VIN1 VOUT1 C12_ihp130_sW2_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 + +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW2_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW2_sL1/case.json new file mode 100644 index 00000000..dd1b5eef --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW2_sL1/case.json @@ -0,0 +1,88 @@ +{ + "case_id": "C12_ihp130_sW2_sL1", + "circuit_id": "C12", + "pdk": "ihp130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "dut_name": "C12_ihp130_sW2_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.26, + "nf": 8 + }, + "M2": { + "w": 8.0, + "l": 0.26, + "nf": 16 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": {}, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.26, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "1f7e4b7e71115c2a", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW2_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW2_sL1/manifest.json new file mode 100644 index 00000000..c2883ed5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW2_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "55ac39c2757e30b542cce085bc495ce72557aba49e4c3291332258a1f37c59df", + "qualification.json": "02db435b18e7a876e98d8c3ad58a86a999fcc515fea1e3df46136ee878c94b5d", + "specs.json": "435398b90f2cd6baa2b487a5838139fdaf7c25fffd3df7436d0ab6e124778435", + "target.spice": "e46b87008f6b2a6d4a4768cc1bd8bfeb5e50de24c5bc75a6b026b541396fb463", + "target_lvs.spice": "b00cd4eb1e844b097812239798d117a1b31d3a46407ecb39ea9c011f618b9e28", + "testbench.spice": "9517b40e6ce8c2b56c912d27f75bb5ce1112c2619df2df7f34c522d4b5d80423" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW2_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW2_sL1/qualification.json new file mode 100644 index 00000000..7f8fe482 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW2_sL1/qualification.json @@ -0,0 +1,83 @@ +{ + "case_id": "C12_ihp130_sW2_sL1", + "circuit_id": "C12", + "pdk": "ihp130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "single", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.26, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "1f7e4b7e71115c2a", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 25.79 + }, + "f3db": { + "min": 45010000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 28.78626, + "f3db": 75008680.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.2, + "schematic_measures": { + "vout0": 0.5543392, + "vin0": 0.5543392, + "idd": 9.199715e-05, + "gain_lf": 28.78626, + "f3db": 75008680.0, + "ugf": 2083083000.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW2_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW2_sL1/specs.json new file mode 100644 index 00000000..06ff7449 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW2_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 25.79 + }, + "f3db": { + "min": 45010000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 28.78626, + "f3db": 75008680.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW2_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW2_sL1/target.spice new file mode 100644 index 00000000..49c51e34 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW2_sL1/target.spice @@ -0,0 +1,4 @@ +.subckt C12_ihp130_sW2_sL1 VDD VSS VIN1 VOUT1 +XM1 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=4u l=0.26u ng=8 m=1 +XM2 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=8u l=0.26u ng=16 m=1 +.ends C12_ihp130_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW2_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW2_sL1/target_lvs.spice new file mode 100644 index 00000000..2418f9e2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW2_sL1/target_lvs.spice @@ -0,0 +1,26 @@ +.subckt C12_ihp130_sW2_sL1 VDD VSS VIN1 VOUT1 +XM1_f0 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f1 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f2 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f3 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f4 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f5 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f6 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f7 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f0 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f1 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f2 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f3 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f4 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f5 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f6 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f7 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f8 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f9 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f10 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f11 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f12 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f13 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f14 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f15 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +.ends C12_ihp130_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW2_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW2_sL1/testbench.spice new file mode 100644 index 00000000..f12fb31c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW2_sL1/testbench.spice @@ -0,0 +1,26 @@ +X1 VDD VSS VIN1 VOUT1 C12_ihp130_sW2_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 + +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW2_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW2_sL2/case.json new file mode 100644 index 00000000..7872b7e8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW2_sL2/case.json @@ -0,0 +1,88 @@ +{ + "case_id": "C12_ihp130_sW2_sL2", + "circuit_id": "C12", + "pdk": "ihp130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "dut_name": "C12_ihp130_sW2_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.52, + "nf": 8 + }, + "M2": { + "w": 8.0, + "l": 0.52, + "nf": 16 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": {}, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "b5142b752376cb2d", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW2_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW2_sL2/manifest.json new file mode 100644 index 00000000..c347a6aa --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW2_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "d6174b65b3eb64382f820c1d6d0d46214b65fd02fc4910d22648c18e29821190", + "qualification.json": "a5e45d6250b21b6ed4e11e7521640315446d11cbd2f8ba7499978e11ebb39ebe", + "specs.json": "ab19fe7bb68b90452bd10409ae8b14631bbb55348b966837c7c84d4cb8f2fed8", + "target.spice": "5136538995f02c8328a463716a49fb6b51084f6fd76cc25f28c79c0a817c55fd", + "target_lvs.spice": "766538a4a555c2d8c61bb0c6b7101ea995331d15e0872c2c14629d9d10945d84", + "testbench.spice": "b1d1f1f25568ade7f1fc477ee0fa2dca75a141c0c55fe027a009c243de8d66e1" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW2_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW2_sL2/qualification.json new file mode 100644 index 00000000..cdbe7c3b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW2_sL2/qualification.json @@ -0,0 +1,83 @@ +{ + "case_id": "C12_ihp130_sW2_sL2", + "circuit_id": "C12", + "pdk": "ihp130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "single", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "b5142b752376cb2d", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 27.95 + }, + "f3db": { + "min": 23530000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 30.94606, + "f3db": 39216800.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.2, + "schematic_measures": { + "vout0": 0.5279493, + "vin0": 0.5279493, + "idd": 7.005501e-05, + "gain_lf": 30.94606, + "f3db": 39216800.0, + "ugf": 1414007000.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW2_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW2_sL2/specs.json new file mode 100644 index 00000000..32bf4441 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW2_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 27.95 + }, + "f3db": { + "min": 23530000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 30.94606, + "f3db": 39216800.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW2_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW2_sL2/target.spice new file mode 100644 index 00000000..2643c6d8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW2_sL2/target.spice @@ -0,0 +1,4 @@ +.subckt C12_ihp130_sW2_sL2 VDD VSS VIN1 VOUT1 +XM1 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=4u l=0.52u ng=8 m=1 +XM2 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=8u l=0.52u ng=16 m=1 +.ends C12_ihp130_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW2_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW2_sL2/target_lvs.spice new file mode 100644 index 00000000..984fe958 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW2_sL2/target_lvs.spice @@ -0,0 +1,26 @@ +.subckt C12_ihp130_sW2_sL2 VDD VSS VIN1 VOUT1 +XM1_f0 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f1 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f2 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f3 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f4 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f5 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f6 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f7 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f0 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f1 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f2 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f3 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f4 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f5 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f6 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f7 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f8 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f9 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f10 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f11 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f12 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f13 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f14 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f15 VOUT1 VIN1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +.ends C12_ihp130_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW2_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW2_sL2/testbench.spice new file mode 100644 index 00000000..89073b03 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/ihp130/sW2_sL2/testbench.spice @@ -0,0 +1,26 @@ +X1 VDD VSS VIN1 VOUT1 C12_ihp130_sW2_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 + +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C12/sky130/sW0.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW0.5_sL1.5/case.json new file mode 100644 index 00000000..52690d22 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW0.5_sL1.5/case.json @@ -0,0 +1,88 @@ +{ + "case_id": "C12_sky130_sW0.5_sL1.5", + "circuit_id": "C12", + "pdk": "sky130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "dut_name": "C12_sky130_sW0.5_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1" + ], + "sizing": { + "M1": { + "w": 1.0, + "l": 0.45, + "nf": 2 + }, + "M2": { + "w": 2.0, + "l": 0.45, + "nf": 4 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": {}, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.45, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "477f67efba7c179c", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/sky130/sW0.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW0.5_sL1.5/manifest.json new file mode 100644 index 00000000..9584673e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW0.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "23ef75ad61da8a86a428f1dbba3276e6dc9e66b8885081d32ef8a1f0c5a2db07", + "qualification.json": "02ba5288b43a6e072097273077aeadb23c7a2e146b20f1118e8d4462750bf81f", + "specs.json": "67b00ef91511d8aeef967b8b9f88bf1f09e3a9040b34a97537a223359a5705fe", + "target.spice": "a8ced4cd9bfa5c8c1b97321638a18a142d4e0b66fb7be511e6566bcac3e015f2", + "target_lvs.spice": "230caaac60e51cb6e481f09d431f1a6ab310894aa0fd2d8f5407e9e9e6553435", + "testbench.spice": "51521728bd8e6d91e62155153f7bc6c2eba5d19f498917175fa89ae0af773f8d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/sky130/sW0.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW0.5_sL1.5/qualification.json new file mode 100644 index 00000000..d40b140e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW0.5_sL1.5/qualification.json @@ -0,0 +1,83 @@ +{ + "case_id": "C12_sky130_sW0.5_sL1.5", + "circuit_id": "C12", + "pdk": "sky130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "single", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.45, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "477f67efba7c179c", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 36.41 + }, + "f3db": { + "min": 1162000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 39.41067, + "f3db": 1937173.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 8.9, + "schematic_measures": { + "vout0": 0.7583221, + "vin0": 0.7583221, + "idd": 5.345944e-06, + "gain_lf": 39.41067, + "f3db": 1937173.0, + "ugf": 181679400.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/sky130/sW0.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW0.5_sL1.5/specs.json new file mode 100644 index 00000000..356717f3 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW0.5_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 36.41 + }, + "f3db": { + "min": 1162000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 39.41067, + "f3db": 1937173.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/sky130/sW0.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW0.5_sL1.5/target.spice new file mode 100644 index 00000000..f39994d7 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW0.5_sL1.5/target.spice @@ -0,0 +1,4 @@ +.subckt C12_sky130_sW0.5_sL1.5 VDD VSS VIN1 VOUT1 +XM1 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=1 l=0.45 nf=2 +XM2 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=2 l=0.45 nf=4 +.ends C12_sky130_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C12/sky130/sW0.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW0.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..2a8c3933 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW0.5_sL1.5/target_lvs.spice @@ -0,0 +1,8 @@ +.subckt C12_sky130_sW0.5_sL1.5 VDD VSS VIN1 VOUT1 +XM1_f0 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f1 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f0 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f1 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f2 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f3 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +.ends C12_sky130_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C12/sky130/sW0.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW0.5_sL1.5/testbench.spice new file mode 100644 index 00000000..8bc28d81 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW0.5_sL1.5/testbench.spice @@ -0,0 +1,26 @@ +X1 VDD VSS VIN1 VOUT1 C12_sky130_sW0.5_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 + +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C12/sky130/sW0.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW0.5_sL1/case.json new file mode 100644 index 00000000..eb9a234c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW0.5_sL1/case.json @@ -0,0 +1,88 @@ +{ + "case_id": "C12_sky130_sW0.5_sL1", + "circuit_id": "C12", + "pdk": "sky130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "dut_name": "C12_sky130_sW0.5_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1" + ], + "sizing": { + "M1": { + "w": 1.0, + "l": 0.3, + "nf": 2 + }, + "M2": { + "w": 2.0, + "l": 0.3, + "nf": 4 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": {}, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.3, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "69bc89667e478184", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/sky130/sW0.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW0.5_sL1/manifest.json new file mode 100644 index 00000000..fde7ae16 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW0.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "53bee54cfe39873de0b11ee2d9fff139e7ad38ec78c6706ffea8abcf7cd18454", + "qualification.json": "81cc400281f7ca027f1459539003c52116697be69f88072c28747d534606f72e", + "specs.json": "f06ca0281318b3519da8f6e697a27bb03247dfe8e4ed887f5a90b0c58e966840", + "target.spice": "f71edcfe1467cf7fbe6bde76505617bd56e1b43a6b26a8998322fbb38215affc", + "target_lvs.spice": "ae657a409676aed9b51852fbfce62d8812cf984091864349840bf4ab06763f2a", + "testbench.spice": "ac75f1e22d307bdd995814586e19c1448d84155c4be622a66e302a983806fcee" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/sky130/sW0.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW0.5_sL1/qualification.json new file mode 100644 index 00000000..9ffd4d2f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW0.5_sL1/qualification.json @@ -0,0 +1,83 @@ +{ + "case_id": "C12_sky130_sW0.5_sL1", + "circuit_id": "C12", + "pdk": "sky130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "single", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.3, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "69bc89667e478184", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 32.44 + }, + "f3db": { + "min": 2876000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 35.44454, + "f3db": 4792647.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 8.2, + "schematic_measures": { + "vout0": 0.7891508, + "vin0": 0.7891508, + "idd": 8.966682e-06, + "gain_lf": 35.44454, + "f3db": 4792647.0, + "ugf": 284493400.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/sky130/sW0.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW0.5_sL1/specs.json new file mode 100644 index 00000000..16839454 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW0.5_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 32.44 + }, + "f3db": { + "min": 2876000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 35.44454, + "f3db": 4792647.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/sky130/sW0.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW0.5_sL1/target.spice new file mode 100644 index 00000000..010165bb --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW0.5_sL1/target.spice @@ -0,0 +1,4 @@ +.subckt C12_sky130_sW0.5_sL1 VDD VSS VIN1 VOUT1 +XM1 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=1 l=0.3 nf=2 +XM2 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=2 l=0.3 nf=4 +.ends C12_sky130_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C12/sky130/sW0.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW0.5_sL1/target_lvs.spice new file mode 100644 index 00000000..bc24f8a6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW0.5_sL1/target_lvs.spice @@ -0,0 +1,8 @@ +.subckt C12_sky130_sW0.5_sL1 VDD VSS VIN1 VOUT1 +XM1_f0 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f1 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f0 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f1 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f2 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f3 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +.ends C12_sky130_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C12/sky130/sW0.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW0.5_sL1/testbench.spice new file mode 100644 index 00000000..86da511b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW0.5_sL1/testbench.spice @@ -0,0 +1,26 @@ +X1 VDD VSS VIN1 VOUT1 C12_sky130_sW0.5_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 + +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C12/sky130/sW0.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW0.5_sL2/case.json new file mode 100644 index 00000000..3f934cbd --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW0.5_sL2/case.json @@ -0,0 +1,88 @@ +{ + "case_id": "C12_sky130_sW0.5_sL2", + "circuit_id": "C12", + "pdk": "sky130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "dut_name": "C12_sky130_sW0.5_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1" + ], + "sizing": { + "M1": { + "w": 1.0, + "l": 0.6, + "nf": 2 + }, + "M2": { + "w": 2.0, + "l": 0.6, + "nf": 4 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": {}, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.6, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "95e90493eaf4b295", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/sky130/sW0.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW0.5_sL2/manifest.json new file mode 100644 index 00000000..4956ec42 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW0.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "a2f9633c0f60571c2322215377aa7cfc461ab3d9fd8847dd64e53aca744fbf3a", + "qualification.json": "5f314db5919be71d7a259e249080efb884b376af25d3acae0916b8e0deea3416", + "specs.json": "341333526e13143bdc648312ba22e4ea6bc8ad76156228f82a4debe2617b221a", + "target.spice": "9dd7fed7c17220736b567bf93c20c1539f46560a66e8139c855d0ba274f7a903", + "target_lvs.spice": "c5d830a257eee8edc828b35e7b0fc4ea6e4501d585bf04c741ebf358cc0b694d", + "testbench.spice": "13695ccbe6c8a712d4dfd972a37fb5f2bdc53d6bbe345ab3f58031fc267878bb" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/sky130/sW0.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW0.5_sL2/qualification.json new file mode 100644 index 00000000..fd9b1466 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW0.5_sL2/qualification.json @@ -0,0 +1,85 @@ +{ + "case_id": "C12_sky130_sW0.5_sL2", + "circuit_id": "C12", + "pdk": "sky130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "single", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.6, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "95e90493eaf4b295", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "f3db=9.794e+05 below floor 1e+06" + ], + "spec": { + "gain_lf": { + "min": 39.69 + }, + "f3db": { + "min": 1000000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 42.68887, + "f3db": 979391.6 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 8.6, + "schematic_measures": { + "vout0": 0.7451755, + "vin0": 0.7451755, + "idd": 3.834826e-06, + "gain_lf": 42.68887, + "f3db": 979391.6, + "ugf": 134090900.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/sky130/sW0.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW0.5_sL2/specs.json new file mode 100644 index 00000000..a1fa27ab --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW0.5_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 39.69 + }, + "f3db": { + "min": 1000000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 42.68887, + "f3db": 979391.6 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/sky130/sW0.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW0.5_sL2/target.spice new file mode 100644 index 00000000..c108b6f6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW0.5_sL2/target.spice @@ -0,0 +1,4 @@ +.subckt C12_sky130_sW0.5_sL2 VDD VSS VIN1 VOUT1 +XM1 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=1 l=0.6 nf=2 +XM2 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=2 l=0.6 nf=4 +.ends C12_sky130_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C12/sky130/sW0.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW0.5_sL2/target_lvs.spice new file mode 100644 index 00000000..8228188b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW0.5_sL2/target_lvs.spice @@ -0,0 +1,8 @@ +.subckt C12_sky130_sW0.5_sL2 VDD VSS VIN1 VOUT1 +XM1_f0 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f1 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f0 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f1 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f2 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f3 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +.ends C12_sky130_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C12/sky130/sW0.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW0.5_sL2/testbench.spice new file mode 100644 index 00000000..f17f1035 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW0.5_sL2/testbench.spice @@ -0,0 +1,26 @@ +X1 VDD VSS VIN1 VOUT1 C12_sky130_sW0.5_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 + +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1.5_sL1.5/case.json new file mode 100644 index 00000000..9aba75dd --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1.5_sL1.5/case.json @@ -0,0 +1,88 @@ +{ + "case_id": "C12_sky130_sW1.5_sL1.5", + "circuit_id": "C12", + "pdk": "sky130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "dut_name": "C12_sky130_sW1.5_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1" + ], + "sizing": { + "M1": { + "w": 3.0, + "l": 0.45, + "nf": 6 + }, + "M2": { + "w": 6.0, + "l": 0.45, + "nf": 12 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": {}, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.45, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.45, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "26177c318efa256b", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1.5_sL1.5/manifest.json new file mode 100644 index 00000000..9731a6fe --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "d2578ca31084e4fe8137085f05d42a82783799a49636abe5e9de96d8e6910e73", + "qualification.json": "47384392e855ab21c9bdb77eb6bc56e0a170a37ee20fa2cf6fb5aab785644d33", + "specs.json": "f60fd43715f79ba5541ae480a0a1dd99241f7d3219efaf9f10d1483a398cc175", + "target.spice": "fedbfaf50c89c89ecc4a04b801b4db413748d91295b7c9ce0f5ba247e69f839b", + "target_lvs.spice": "89c118330827811f48d61fd9ff0ec7a38fb297216ee1217c231a9f192d5996ce", + "testbench.spice": "8b0649d03d5f78fbac794ce2d27af07ca4dc5581b177da07ed48e37e9a8c463b" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1.5_sL1.5/qualification.json new file mode 100644 index 00000000..1e56a979 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1.5_sL1.5/qualification.json @@ -0,0 +1,83 @@ +{ + "case_id": "C12_sky130_sW1.5_sL1.5", + "circuit_id": "C12", + "pdk": "sky130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "single", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.45, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.45, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "26177c318efa256b", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 36.41 + }, + "f3db": { + "min": 3431000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 39.41068, + "f3db": 5718338.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 8.5, + "schematic_measures": { + "vout0": 0.7583221, + "vin0": 0.7583221, + "idd": 1.603783e-05, + "gain_lf": 39.41068, + "f3db": 5718338.0, + "ugf": 538082900.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1.5_sL1.5/specs.json new file mode 100644 index 00000000..2bdbd480 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1.5_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 36.41 + }, + "f3db": { + "min": 3431000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 39.41068, + "f3db": 5718338.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1.5_sL1.5/target.spice new file mode 100644 index 00000000..0af9883b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1.5_sL1.5/target.spice @@ -0,0 +1,4 @@ +.subckt C12_sky130_sW1.5_sL1.5 VDD VSS VIN1 VOUT1 +XM1 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=3 l=0.45 nf=6 +XM2 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=6 l=0.45 nf=12 +.ends C12_sky130_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..3927c77a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1.5_sL1.5/target_lvs.spice @@ -0,0 +1,20 @@ +.subckt C12_sky130_sW1.5_sL1.5 VDD VSS VIN1 VOUT1 +XM1_f0 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f1 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f2 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f3 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f4 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f5 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f0 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f1 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f2 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f3 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f4 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f5 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f6 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f7 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f8 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f9 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f10 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f11 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +.ends C12_sky130_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1.5_sL1.5/testbench.spice new file mode 100644 index 00000000..21790989 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1.5_sL1.5/testbench.spice @@ -0,0 +1,26 @@ +X1 VDD VSS VIN1 VOUT1 C12_sky130_sW1.5_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 + +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1.5_sL1/case.json new file mode 100644 index 00000000..c143e3fb --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1.5_sL1/case.json @@ -0,0 +1,88 @@ +{ + "case_id": "C12_sky130_sW1.5_sL1", + "circuit_id": "C12", + "pdk": "sky130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "dut_name": "C12_sky130_sW1.5_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1" + ], + "sizing": { + "M1": { + "w": 3.0, + "l": 0.3, + "nf": 6 + }, + "M2": { + "w": 6.0, + "l": 0.3, + "nf": 12 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": {}, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.3, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.3, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "95ec4a0ec29b0a19", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1.5_sL1/manifest.json new file mode 100644 index 00000000..5de4f83a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "82f82c411df5d76d5e2df6841af1ce76d3c539f16853c9494e3c4c6dfc9b1837", + "qualification.json": "9b34bf78fc3cf5d380726cb529e8f96900ab77597ac13c3c842647e73be9898a", + "specs.json": "3e238a91203d4a45b2c20ed436fae528886e91707bc9c6a14514db054eb68dc0", + "target.spice": "7c639ee28ab4f7987972413dbcfe1d9e924c182707aa1915ac284af1de0c4573", + "target_lvs.spice": "537a0c88efa3bc8426a5a62b611804cdba4a92c477dc8222c1cda1c8659234dd", + "testbench.spice": "73e5a5bef71f6cc1f81e522882d47735bdfee16d8be141f270fcefa02c9056f6" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1.5_sL1/qualification.json new file mode 100644 index 00000000..9ebe2a69 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1.5_sL1/qualification.json @@ -0,0 +1,83 @@ +{ + "case_id": "C12_sky130_sW1.5_sL1", + "circuit_id": "C12", + "pdk": "sky130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "single", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.3, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.3, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "95ec4a0ec29b0a19", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 32.44 + }, + "f3db": { + "min": 8488000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 35.44454, + "f3db": 14146020.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 8.7, + "schematic_measures": { + "vout0": 0.7891508, + "vin0": 0.7891508, + "idd": 2.690005e-05, + "gain_lf": 35.44454, + "f3db": 14146020.0, + "ugf": 841905800.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1.5_sL1/specs.json new file mode 100644 index 00000000..7ae5797f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1.5_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 32.44 + }, + "f3db": { + "min": 8488000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 35.44454, + "f3db": 14146020.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1.5_sL1/target.spice new file mode 100644 index 00000000..56ab145f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1.5_sL1/target.spice @@ -0,0 +1,4 @@ +.subckt C12_sky130_sW1.5_sL1 VDD VSS VIN1 VOUT1 +XM1 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=3 l=0.3 nf=6 +XM2 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=6 l=0.3 nf=12 +.ends C12_sky130_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1.5_sL1/target_lvs.spice new file mode 100644 index 00000000..ae669d46 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1.5_sL1/target_lvs.spice @@ -0,0 +1,20 @@ +.subckt C12_sky130_sW1.5_sL1 VDD VSS VIN1 VOUT1 +XM1_f0 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f1 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f2 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f3 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f4 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f5 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f0 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f1 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f2 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f3 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f4 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f5 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f6 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f7 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f8 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f9 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f10 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f11 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +.ends C12_sky130_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1.5_sL1/testbench.spice new file mode 100644 index 00000000..6afecbc6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1.5_sL1/testbench.spice @@ -0,0 +1,26 @@ +X1 VDD VSS VIN1 VOUT1 C12_sky130_sW1.5_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 + +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1.5_sL2/case.json new file mode 100644 index 00000000..316e0d73 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1.5_sL2/case.json @@ -0,0 +1,88 @@ +{ + "case_id": "C12_sky130_sW1.5_sL2", + "circuit_id": "C12", + "pdk": "sky130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "dut_name": "C12_sky130_sW1.5_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1" + ], + "sizing": { + "M1": { + "w": 3.0, + "l": 0.6, + "nf": 6 + }, + "M2": { + "w": 6.0, + "l": 0.6, + "nf": 12 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": {}, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.6, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.6, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "95016f3292bec7d2", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1.5_sL2/manifest.json new file mode 100644 index 00000000..d213cc6b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "664734ace9cd37e340088d78ea5838dcc548c2bca2b6a1605423ff5ad5906d7f", + "qualification.json": "5a8fe20323a2bd44c2f3eb3afa3bf731d007fb9680a87871e28b7fa591759d6c", + "specs.json": "a521384b0ed8db1f283a0fa562b6ac338ab226f9ffc23e3d9ca837ef5d1654fc", + "target.spice": "ccb47331428e72a092c308188e678e3303734fb763a5a5875129eba830d10869", + "target_lvs.spice": "09c028901ae8301fffe37b5d47b8edc8cc58c6c9aaa5fde2be6db0bfd971f40e", + "testbench.spice": "8a98fdc83da695d7893cbc516e617483b43bfd62e25f73e40f001f2fd9877cd4" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1.5_sL2/qualification.json new file mode 100644 index 00000000..7e3c1fb2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1.5_sL2/qualification.json @@ -0,0 +1,83 @@ +{ + "case_id": "C12_sky130_sW1.5_sL2", + "circuit_id": "C12", + "pdk": "sky130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "single", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.6, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.6, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "95016f3292bec7d2", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 39.69 + }, + "f3db": { + "min": 1735000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 42.68889, + "f3db": 2890836.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 9.8, + "schematic_measures": { + "vout0": 0.7451755, + "vin0": 0.7451755, + "idd": 1.150448e-05, + "gain_lf": 42.68889, + "f3db": 2890836.0, + "ugf": 396986800.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1.5_sL2/specs.json new file mode 100644 index 00000000..f11e4216 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1.5_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 39.69 + }, + "f3db": { + "min": 1735000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 42.68889, + "f3db": 2890836.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1.5_sL2/target.spice new file mode 100644 index 00000000..ce66d5e2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1.5_sL2/target.spice @@ -0,0 +1,4 @@ +.subckt C12_sky130_sW1.5_sL2 VDD VSS VIN1 VOUT1 +XM1 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=3 l=0.6 nf=6 +XM2 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=6 l=0.6 nf=12 +.ends C12_sky130_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1.5_sL2/target_lvs.spice new file mode 100644 index 00000000..f71b28fb --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1.5_sL2/target_lvs.spice @@ -0,0 +1,20 @@ +.subckt C12_sky130_sW1.5_sL2 VDD VSS VIN1 VOUT1 +XM1_f0 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f1 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f2 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f3 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f4 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f5 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f0 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f1 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f2 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f3 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f4 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f5 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f6 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f7 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f8 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f9 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f10 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f11 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +.ends C12_sky130_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1.5_sL2/testbench.spice new file mode 100644 index 00000000..6be93d79 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1.5_sL2/testbench.spice @@ -0,0 +1,26 @@ +X1 VDD VSS VIN1 VOUT1 C12_sky130_sW1.5_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 + +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1_sL1.5/case.json new file mode 100644 index 00000000..edabca97 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1_sL1.5/case.json @@ -0,0 +1,88 @@ +{ + "case_id": "C12_sky130_sW1_sL1.5", + "circuit_id": "C12", + "pdk": "sky130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "dut_name": "C12_sky130_sW1_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.45, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.45, + "nf": 8 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": {}, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "a7f0b2f2b39cf7bc", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1_sL1.5/manifest.json new file mode 100644 index 00000000..6174a5fd --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "0548d2437bf9283fb47ba33cdaa60b3408b30976918414d879ddbba4a1e89957", + "qualification.json": "fb47521e0d3ae7c1ea150983b6d16700f6cfe786a1ac7da5b9a740d2fa775ef6", + "specs.json": "238ed258a737512faf37e4f2ba389e056671c2ef3f2b462d9581feaf6eed226f", + "target.spice": "e009e02c582794f822ea53a2e1e54fcd667e71a4670ac9db7863183ca2340670", + "target_lvs.spice": "10544efe1015f3be3f7e8ba6621efabc677dfece4457099ab74bd9e97ecb24f5", + "testbench.spice": "f90638d7bd1c39ad99e3dc4c2afd97831f15a39df40891cf54f9f1970c686a9f" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1_sL1.5/qualification.json new file mode 100644 index 00000000..9d4a12b3 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1_sL1.5/qualification.json @@ -0,0 +1,83 @@ +{ + "case_id": "C12_sky130_sW1_sL1.5", + "circuit_id": "C12", + "pdk": "sky130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "single", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "a7f0b2f2b39cf7bc", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 36.41 + }, + "f3db": { + "min": 2306000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 39.41068, + "f3db": 3842948.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 10.4, + "schematic_measures": { + "vout0": 0.7583221, + "vin0": 0.7583221, + "idd": 1.069189e-05, + "gain_lf": 39.41068, + "f3db": 3842948.0, + "ugf": 360726400.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1_sL1.5/specs.json new file mode 100644 index 00000000..e90e7930 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 36.41 + }, + "f3db": { + "min": 2306000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 39.41068, + "f3db": 3842948.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1_sL1.5/target.spice new file mode 100644 index 00000000..200315dc --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1_sL1.5/target.spice @@ -0,0 +1,4 @@ +.subckt C12_sky130_sW1_sL1.5 VDD VSS VIN1 VOUT1 +XM1 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=2 l=0.45 nf=4 +XM2 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=4 l=0.45 nf=8 +.ends C12_sky130_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1_sL1.5/target_lvs.spice new file mode 100644 index 00000000..bbc624ed --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1_sL1.5/target_lvs.spice @@ -0,0 +1,14 @@ +.subckt C12_sky130_sW1_sL1.5 VDD VSS VIN1 VOUT1 +XM1_f0 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f1 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f2 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f3 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f0 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f1 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f2 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f3 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f4 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f5 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f6 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f7 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +.ends C12_sky130_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1_sL1.5/testbench.spice new file mode 100644 index 00000000..7186501f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1_sL1.5/testbench.spice @@ -0,0 +1,26 @@ +X1 VDD VSS VIN1 VOUT1 C12_sky130_sW1_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 + +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1_sL1/case.json new file mode 100644 index 00000000..2002afe0 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1_sL1/case.json @@ -0,0 +1,88 @@ +{ + "case_id": "C12_sky130_sW1_sL1", + "circuit_id": "C12", + "pdk": "sky130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "dut_name": "C12_sky130_sW1_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.3, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.3, + "nf": 8 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": {}, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "bde578a4c1c724f3", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1_sL1/manifest.json new file mode 100644 index 00000000..f525de12 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "3a358cc5d79d4cfc8f6be02e800904c83e345800f6a8463ec9684bbe27a5a21c", + "qualification.json": "190e2d47d04cfeef089e47482602a9525a873d2913396ede12f73cfaa4004a8b", + "specs.json": "e9f31a7706ca22bf0bcd9327e453ab664efc0910b4679d47558621e490a90c7a", + "target.spice": "85b876e5bae65428d52177d5e9833a0e599d2b15ba11313b06ce292d8834cd12", + "target_lvs.spice": "00553f15f9fa4c1329b328255a772ff3340f8da8d64fa6d7736f7d94f8dcc0b2", + "testbench.spice": "9be34dc59c1dc03e2072ffb652b3e5417d30e76841cd8963f630ec2672e8403a" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1_sL1/qualification.json new file mode 100644 index 00000000..82b228a9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1_sL1/qualification.json @@ -0,0 +1,83 @@ +{ + "case_id": "C12_sky130_sW1_sL1", + "circuit_id": "C12", + "pdk": "sky130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "single", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "bde578a4c1c724f3", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 32.44 + }, + "f3db": { + "min": 5704000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 35.44454, + "f3db": 9507317.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 9.0, + "schematic_measures": { + "vout0": 0.7891508, + "vin0": 0.7891508, + "idd": 1.793336e-05, + "gain_lf": 35.44454, + "f3db": 9507317.0, + "ugf": 564509400.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1_sL1/specs.json new file mode 100644 index 00000000..f0e8ad40 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 32.44 + }, + "f3db": { + "min": 5704000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 35.44454, + "f3db": 9507317.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1_sL1/target.spice new file mode 100644 index 00000000..97564905 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1_sL1/target.spice @@ -0,0 +1,4 @@ +.subckt C12_sky130_sW1_sL1 VDD VSS VIN1 VOUT1 +XM1 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=2 l=0.3 nf=4 +XM2 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=4 l=0.3 nf=8 +.ends C12_sky130_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1_sL1/target_lvs.spice new file mode 100644 index 00000000..f910a292 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1_sL1/target_lvs.spice @@ -0,0 +1,14 @@ +.subckt C12_sky130_sW1_sL1 VDD VSS VIN1 VOUT1 +XM1_f0 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f1 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f2 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f3 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f0 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f1 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f2 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f3 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f4 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f5 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f6 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f7 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +.ends C12_sky130_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1_sL1/testbench.spice new file mode 100644 index 00000000..cf7ef9fe --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1_sL1/testbench.spice @@ -0,0 +1,26 @@ +X1 VDD VSS VIN1 VOUT1 C12_sky130_sW1_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 + +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1_sL2/case.json new file mode 100644 index 00000000..a83b4ac6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1_sL2/case.json @@ -0,0 +1,88 @@ +{ + "case_id": "C12_sky130_sW1_sL2", + "circuit_id": "C12", + "pdk": "sky130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "dut_name": "C12_sky130_sW1_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.6, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.6, + "nf": 8 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": {}, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "c715dce9369810b6", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1_sL2/manifest.json new file mode 100644 index 00000000..bfa003df --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "f8bd2304242f9f000ab9a54954996ef3ffbcb08e85b1ebd3954e777e5f2e4c06", + "qualification.json": "cc42ae0e1a3f7631b7b726b827f3ca7d3688e4ee48f80ebbd8c577f8458752e0", + "specs.json": "b3b67bd4cd5b1efccaea019a63ee8a8b0c249e5c0888d00ed4f5f209fcf57361", + "target.spice": "27264bb50156ae0707da03416a6a64da05990dc7dd6cb41e8dcc7964834aadb9", + "target_lvs.spice": "3c3e22e59c0186122009a5b7300ccce096d0f636b945e65e897ce751da90daae", + "testbench.spice": "90e325a0b386b449b929c66cbc594c41377e3ff724a550ad246a3e742730c3b9" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1_sL2/qualification.json new file mode 100644 index 00000000..c66e49f4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1_sL2/qualification.json @@ -0,0 +1,83 @@ +{ + "case_id": "C12_sky130_sW1_sL2", + "circuit_id": "C12", + "pdk": "sky130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "single", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "c715dce9369810b6", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 39.69 + }, + "f3db": { + "min": 1166000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 42.68889, + "f3db": 1942822.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 6.2, + "schematic_measures": { + "vout0": 0.7451755, + "vin0": 0.7451755, + "idd": 7.669652e-06, + "gain_lf": 42.68889, + "f3db": 1942822.0, + "ugf": 266463300.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1_sL2/specs.json new file mode 100644 index 00000000..5fb27f6f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 39.69 + }, + "f3db": { + "min": 1166000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 42.68889, + "f3db": 1942822.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1_sL2/target.spice new file mode 100644 index 00000000..05b6cb14 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1_sL2/target.spice @@ -0,0 +1,4 @@ +.subckt C12_sky130_sW1_sL2 VDD VSS VIN1 VOUT1 +XM1 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=2 l=0.6 nf=4 +XM2 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=4 l=0.6 nf=8 +.ends C12_sky130_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1_sL2/target_lvs.spice new file mode 100644 index 00000000..76cbb8ba --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1_sL2/target_lvs.spice @@ -0,0 +1,14 @@ +.subckt C12_sky130_sW1_sL2 VDD VSS VIN1 VOUT1 +XM1_f0 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f1 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f2 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f3 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f0 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f1 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f2 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f3 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f4 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f5 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f6 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f7 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +.ends C12_sky130_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1_sL2/testbench.spice new file mode 100644 index 00000000..208dfd8a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW1_sL2/testbench.spice @@ -0,0 +1,26 @@ +X1 VDD VSS VIN1 VOUT1 C12_sky130_sW1_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 + +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C12/sky130/sW2_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW2_sL1.5/case.json new file mode 100644 index 00000000..25803ef7 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW2_sL1.5/case.json @@ -0,0 +1,88 @@ +{ + "case_id": "C12_sky130_sW2_sL1.5", + "circuit_id": "C12", + "pdk": "sky130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "dut_name": "C12_sky130_sW2_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.45, + "nf": 8 + }, + "M2": { + "w": 8.0, + "l": 0.45, + "nf": 16 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": {}, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "b36759efdec0cc84", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/sky130/sW2_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW2_sL1.5/manifest.json new file mode 100644 index 00000000..32a3b731 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW2_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "1b7e6a414b9cd6a0467e33ba2b73d31232dd13eb3f79a7cea3fb3bc272afe295", + "qualification.json": "079cdc0d6064d52133746ebde50a0389a0ad6c875754d7bd9166d6ec879fd5fe", + "specs.json": "3d66a8e2fd58b047d413f360d10bb213d7c6f070835b7415e9e64bba83148b47", + "target.spice": "a2259b2961c62a70fd4fb376988d29835f7947dfca6c87a9e516b0fb016a3cfe", + "target_lvs.spice": "002924a1e5b8a4f91d1b7c862cc7c9f1d986c6e8c159ac83d5e4ff97aff466b6", + "testbench.spice": "c450f83a7c1e8d224fc4c38e38c20a2c9b8376c12389891e70b036a2154b5c27" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/sky130/sW2_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW2_sL1.5/qualification.json new file mode 100644 index 00000000..971f3bd6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW2_sL1.5/qualification.json @@ -0,0 +1,83 @@ +{ + "case_id": "C12_sky130_sW2_sL1.5", + "circuit_id": "C12", + "pdk": "sky130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "single", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "b36759efdec0cc84", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 36.41 + }, + "f3db": { + "min": 4538000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 39.41068, + "f3db": 7563395.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 10.3, + "schematic_measures": { + "vout0": 0.7583221, + "vin0": 0.7583221, + "idd": 2.138378e-05, + "gain_lf": 39.41068, + "f3db": 7563395.0, + "ugf": 712515700.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/sky130/sW2_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW2_sL1.5/specs.json new file mode 100644 index 00000000..b4ce78be --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW2_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 36.41 + }, + "f3db": { + "min": 4538000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 39.41068, + "f3db": 7563395.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/sky130/sW2_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW2_sL1.5/target.spice new file mode 100644 index 00000000..3ac17382 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW2_sL1.5/target.spice @@ -0,0 +1,4 @@ +.subckt C12_sky130_sW2_sL1.5 VDD VSS VIN1 VOUT1 +XM1 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=4 l=0.45 nf=8 +XM2 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=8 l=0.45 nf=16 +.ends C12_sky130_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C12/sky130/sW2_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW2_sL1.5/target_lvs.spice new file mode 100644 index 00000000..f54e1d5e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW2_sL1.5/target_lvs.spice @@ -0,0 +1,26 @@ +.subckt C12_sky130_sW2_sL1.5 VDD VSS VIN1 VOUT1 +XM1_f0 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f1 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f2 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f3 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f4 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f5 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f6 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f7 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f0 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f1 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f2 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f3 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f4 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f5 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f6 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f7 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f8 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f9 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f10 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f11 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f12 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f13 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f14 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f15 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +.ends C12_sky130_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C12/sky130/sW2_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW2_sL1.5/testbench.spice new file mode 100644 index 00000000..944963d5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW2_sL1.5/testbench.spice @@ -0,0 +1,26 @@ +X1 VDD VSS VIN1 VOUT1 C12_sky130_sW2_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 + +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C12/sky130/sW2_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW2_sL1/case.json new file mode 100644 index 00000000..ba79589b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW2_sL1/case.json @@ -0,0 +1,88 @@ +{ + "case_id": "C12_sky130_sW2_sL1", + "circuit_id": "C12", + "pdk": "sky130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "dut_name": "C12_sky130_sW2_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.3, + "nf": 8 + }, + "M2": { + "w": 8.0, + "l": 0.3, + "nf": 16 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": {}, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "618985fdfbbd2dd0", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/sky130/sW2_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW2_sL1/manifest.json new file mode 100644 index 00000000..4db8ee16 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW2_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "156a22ab38d8087b1e0c55412bb393919cf69a91a1a3c003aaec8c2f6fc7b21d", + "qualification.json": "526346d11626330f12554727138e877e1d10accd58fd7dcc6e9dad9f4eec758d", + "specs.json": "aab382829ce0de95ec0d23afbc93652a93d9a42d61eb30c07f812f97576432ef", + "target.spice": "391f5f61456d86cd863de362f52956b049b6b8d919bd06116780ec1dd8e4830f", + "target_lvs.spice": "e264ee4bc97c9c428c9bdfe1c353a595aab8a9e6c027121c579e04feb8ef88a4", + "testbench.spice": "4a40d682d4ca04bdf8d199a7ce1e41704efdec420072f3bf8c49f88b738f13a9" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/sky130/sW2_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW2_sL1/qualification.json new file mode 100644 index 00000000..8d93487d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW2_sL1/qualification.json @@ -0,0 +1,83 @@ +{ + "case_id": "C12_sky130_sW2_sL1", + "circuit_id": "C12", + "pdk": "sky130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "single", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "618985fdfbbd2dd0", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 32.44 + }, + "f3db": { + "min": 11230000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 35.44454, + "f3db": 18710300.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 8.6, + "schematic_measures": { + "vout0": 0.7891508, + "vin0": 0.7891508, + "idd": 3.586673e-05, + "gain_lf": 35.44454, + "f3db": 18710300.0, + "ugf": 1113531000.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/sky130/sW2_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW2_sL1/specs.json new file mode 100644 index 00000000..9c1fb00f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW2_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 32.44 + }, + "f3db": { + "min": 11230000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 35.44454, + "f3db": 18710300.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/sky130/sW2_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW2_sL1/target.spice new file mode 100644 index 00000000..433259e3 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW2_sL1/target.spice @@ -0,0 +1,4 @@ +.subckt C12_sky130_sW2_sL1 VDD VSS VIN1 VOUT1 +XM1 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=4 l=0.3 nf=8 +XM2 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=8 l=0.3 nf=16 +.ends C12_sky130_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C12/sky130/sW2_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW2_sL1/target_lvs.spice new file mode 100644 index 00000000..9f7e4e37 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW2_sL1/target_lvs.spice @@ -0,0 +1,26 @@ +.subckt C12_sky130_sW2_sL1 VDD VSS VIN1 VOUT1 +XM1_f0 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f1 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f2 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f3 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f4 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f5 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f6 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f7 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f0 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f1 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f2 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f3 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f4 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f5 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f6 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f7 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f8 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f9 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f10 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f11 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f12 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f13 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f14 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f15 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +.ends C12_sky130_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C12/sky130/sW2_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW2_sL1/testbench.spice new file mode 100644 index 00000000..d0d0716b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW2_sL1/testbench.spice @@ -0,0 +1,26 @@ +X1 VDD VSS VIN1 VOUT1 C12_sky130_sW2_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 + +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C12/sky130/sW2_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW2_sL2/case.json new file mode 100644 index 00000000..a2003be9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW2_sL2/case.json @@ -0,0 +1,88 @@ +{ + "case_id": "C12_sky130_sW2_sL2", + "circuit_id": "C12", + "pdk": "sky130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "dut_name": "C12_sky130_sW2_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.6, + "nf": 8 + }, + "M2": { + "w": 8.0, + "l": 0.6, + "nf": 16 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": {}, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "b9b7f63f683b8ad1", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "M2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/sky130/sW2_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW2_sL2/manifest.json new file mode 100644 index 00000000..bd4c221d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW2_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "517ca83f27558040856baa754f7163530a83222f840810e3afa0b33e5fa911c0", + "qualification.json": "3e01854a1d7a20f1623c547642811c4b431c5e84589dd02479c0a8f09a438fcc", + "specs.json": "7c8673ce260cf88fa1c4ec20ac9b801d5ec423132580e75c153df8c83671af23", + "target.spice": "fc55589f93620ecb9534969284e10a47394a211adee70c9debe4646ebf2267c3", + "target_lvs.spice": "8da050ed6e753989bc34a16e4c5f18faa8cea231eb551acdfd2eff570af031d8", + "testbench.spice": "6aa8b5b30e3d7a9e92f3a660bfc35382d0da5c43d1a98af222456531e4acfdc1" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/sky130/sW2_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW2_sL2/qualification.json new file mode 100644 index 00000000..f319e59e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW2_sL2/qualification.json @@ -0,0 +1,83 @@ +{ + "case_id": "C12_sky130_sW2_sL2", + "circuit_id": "C12", + "pdk": "sky130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "single", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "b9b7f63f683b8ad1", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 39.69 + }, + "f3db": { + "min": 2294000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 42.68889, + "f3db": 3823403.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 6.3, + "schematic_measures": { + "vout0": 0.7451755, + "vin0": 0.7451755, + "idd": 1.53393e-05, + "gain_lf": 42.68889, + "f3db": 3823403.0, + "ugf": 527922900.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/sky130/sW2_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW2_sL2/specs.json new file mode 100644 index 00000000..a15f36b7 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW2_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 39.69 + }, + "f3db": { + "min": 2294000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 42.68889, + "f3db": 3823403.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C12/sky130/sW2_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW2_sL2/target.spice new file mode 100644 index 00000000..ee017319 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW2_sL2/target.spice @@ -0,0 +1,4 @@ +.subckt C12_sky130_sW2_sL2 VDD VSS VIN1 VOUT1 +XM1 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=4 l=0.6 nf=8 +XM2 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=8 l=0.6 nf=16 +.ends C12_sky130_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C12/sky130/sW2_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW2_sL2/target_lvs.spice new file mode 100644 index 00000000..dea4b606 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW2_sL2/target_lvs.spice @@ -0,0 +1,26 @@ +.subckt C12_sky130_sW2_sL2 VDD VSS VIN1 VOUT1 +XM1_f0 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f1 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f2 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f3 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f4 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f5 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f6 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f7 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f0 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f1 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f2 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f3 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f4 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f5 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f6 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f7 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f8 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f9 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f10 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f11 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f12 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f13 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f14 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f15 VOUT1 VIN1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +.ends C12_sky130_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C12/sky130/sW2_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW2_sL2/testbench.spice new file mode 100644 index 00000000..ff0ac888 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C12/sky130/sW2_sL2/testbench.spice @@ -0,0 +1,26 @@ +X1 VDD VSS VIN1 VOUT1 C12_sky130_sW2_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 + +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1.5_sL1.5/case.json new file mode 100644 index 00000000..57969cf6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1.5_sL1.5/case.json @@ -0,0 +1,170 @@ +{ + "case_id": "C13_gf180_sW1.5_sL1.5", + "circuit_id": "C13", + "pdk": "gf180", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "dut_name": "C13_gf180_sW1.5_sL1.5", + "ports": [ + "VSS", + "IIN1", + "IOUT1", + "IB1" + ], + "sizing": { + "M1": { + "w": 0.75, + "l": 0.84, + "nf": 1 + }, + "M2": { + "w": 3.0, + "l": 0.84, + "nf": 4 + }, + "M3": { + "w": 3.0, + "l": 0.84, + "nf": 4 + }, + "M4": { + "w": 3.0, + "l": 0.84, + "nf": 4 + }, + "M5": { + "w": 3.0, + "l": 0.84, + "nf": 4 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VDD" + }, + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 1.65, + "tol": 0.03, + "vout_test": 1.86 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "unit width scaled (nf kept)", + "devices": { + "M1": { + "w0": 0.5, + "l0": 0.56, + "nf0": 1, + "uw0": 0.5, + "w": 0.75, + "l": 0.84, + "nf": 1, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.84, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.84, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.84, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.84, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "8b11bd64855278aa", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1.5_sL1.5/manifest.json new file mode 100644 index 00000000..6083f180 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "c19b5dc5c44ee12afa720b9c1438e24520646170b0d2ed1740ec6febbdbf762e", + "qualification.json": "14765af96afee26244b44e758ca7b60bd76f9b63cb537ffe1c57ff57f0ab2b27", + "specs.json": "b04b1fe5f505c140f224ae4b53708798e779f4ecefe85c3b96d47972c61ffa75", + "target.spice": "2c101c4f556ad20d2f4da51a08f363a136aa8ced0dfdb478995598f7dced0cb1", + "target_lvs.spice": "27065f283ab9f7aac1fcc9e7f0235dc7ca5c50b825fb74e7e92348e28470cd48", + "testbench.spice": "3612bc1388bbfd574d2f4eb7426b9b9183020e597908bd8fb599357b71734fe4" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1.5_sL1.5/qualification.json new file mode 100644 index 00000000..82677ce8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1.5_sL1.5/qualification.json @@ -0,0 +1,127 @@ +{ + "case_id": "C13_gf180_sW1.5_sL1.5", + "circuit_id": "C13", + "pdk": "gf180", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "unit width scaled (nf kept)", + "devices": { + "M1": { + "w0": 0.5, + "l0": 0.56, + "nf0": 1, + "uw0": 0.5, + "w": 0.75, + "l": 0.84, + "nf": 1, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.84, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.84, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.84, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.84, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "8b11bd64855278aa", + "mirror_pass1": { + "vmin": 0.4243952, + "status": "passed", + "vout_test": 1.86 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.5244 + }, + "_frozen_from": { + "schematic": { + "err": 0.0032835, + "vmin": 0.4243952 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.32 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.2, + "schematic_measures": { + "iout_t": 2.006567e-05, + "err": 0.0032835, + "vmin": 0.4243952, + "dev_at_vdd": 0.01314676, + "gout_t": 5.70892e-08, + "rout_t": 17516480.0, + "vout_test": 1.86, + "rout_nom": 17516480.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1.5_sL1.5/specs.json new file mode 100644 index 00000000..eaef486a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1.5_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.5244 + }, + "_frozen_from": { + "schematic": { + "err": 0.0032835, + "vmin": 0.4243952 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.32 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1.5_sL1.5/target.spice new file mode 100644 index 00000000..77dde585 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1.5_sL1.5/target.spice @@ -0,0 +1,7 @@ +.subckt C13_gf180_sW1.5_sL1.5 VSS IIN1 IOUT1 IB1 +MM1 IB1 IB1 VSS VSS nfet_03v3 w=0.75u l=0.84u nf=1 m=1 +MM2 IIN1 IB1 net15 VSS nfet_03v3 w=3u l=0.84u nf=4 m=1 +MM3 net15 IIN1 VSS VSS nfet_03v3 w=3u l=0.84u nf=4 m=1 +MM4 IOUT1 IB1 net14 VSS nfet_03v3 w=3u l=0.84u nf=4 m=1 +MM5 net14 IIN1 VSS VSS nfet_03v3 w=3u l=0.84u nf=4 m=1 +.ends C13_gf180_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..dcd9657e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1.5_sL1.5/target_lvs.spice @@ -0,0 +1,19 @@ +.subckt C13_gf180_sW1.5_sL1.5 VSS IIN1 IOUT1 IB1 +MM1_f0 IB1 IB1 VSS VSS nfet_03v3 w=0.75u l=0.84u +MM2_f0 IIN1 IB1 net15 VSS nfet_03v3 w=0.75u l=0.84u +MM2_f1 IIN1 IB1 net15 VSS nfet_03v3 w=0.75u l=0.84u +MM2_f2 IIN1 IB1 net15 VSS nfet_03v3 w=0.75u l=0.84u +MM2_f3 IIN1 IB1 net15 VSS nfet_03v3 w=0.75u l=0.84u +MM3_f0 net15 IIN1 VSS VSS nfet_03v3 w=0.75u l=0.84u +MM3_f1 net15 IIN1 VSS VSS nfet_03v3 w=0.75u l=0.84u +MM3_f2 net15 IIN1 VSS VSS nfet_03v3 w=0.75u l=0.84u +MM3_f3 net15 IIN1 VSS VSS nfet_03v3 w=0.75u l=0.84u +MM4_f0 IOUT1 IB1 net14 VSS nfet_03v3 w=0.75u l=0.84u +MM4_f1 IOUT1 IB1 net14 VSS nfet_03v3 w=0.75u l=0.84u +MM4_f2 IOUT1 IB1 net14 VSS nfet_03v3 w=0.75u l=0.84u +MM4_f3 IOUT1 IB1 net14 VSS nfet_03v3 w=0.75u l=0.84u +MM5_f0 net14 IIN1 VSS VSS nfet_03v3 w=0.75u l=0.84u +MM5_f1 net14 IIN1 VSS VSS nfet_03v3 w=0.75u l=0.84u +MM5_f2 net14 IIN1 VSS VSS nfet_03v3 w=0.75u l=0.84u +MM5_f3 net14 IIN1 VSS VSS nfet_03v3 w=0.75u l=0.84u +.ends C13_gf180_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1.5_sL1.5/testbench.spice new file mode 100644 index 00000000..d8c4332c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1.5_sL1.5/testbench.spice @@ -0,0 +1,26 @@ +X1 VSS IIN1 IOUT1 IB1 C13_gf180_sW1.5_sL1.5 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIIN1 VDDB IIN1 2e-05 +IIB1 VDDB IB1 2e-05 +.nodeset v(IIN1)=0.99 v(IB1)=0.99 + +VOUT IOUT1 0 3.3 +.control +dc VOUT 3.3 0 -0.00825 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=1.86 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.03 cross=last +meas dc dev_at_vdd find dev at=3.2835 +let gout = deriv(iout) +meas dc gout_t find gout at=1.86 +let rout_v = 1/gout +meas dc rout_t find rout_v at=1.86 +echo vout_test = 1.86 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1.5_sL1/case.json new file mode 100644 index 00000000..079a5417 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1.5_sL1/case.json @@ -0,0 +1,170 @@ +{ + "case_id": "C13_gf180_sW1.5_sL1", + "circuit_id": "C13", + "pdk": "gf180", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "dut_name": "C13_gf180_sW1.5_sL1", + "ports": [ + "VSS", + "IIN1", + "IOUT1", + "IB1" + ], + "sizing": { + "M1": { + "w": 0.75, + "l": 0.56, + "nf": 1 + }, + "M2": { + "w": 3.0, + "l": 0.56, + "nf": 4 + }, + "M3": { + "w": 3.0, + "l": 0.56, + "nf": 4 + }, + "M4": { + "w": 3.0, + "l": 0.56, + "nf": 4 + }, + "M5": { + "w": 3.0, + "l": 0.56, + "nf": 4 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VDD" + }, + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 1.65, + "tol": 0.03, + "vout_test": 1.84 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "unit width scaled (nf kept)", + "devices": { + "M1": { + "w0": 0.5, + "l0": 0.56, + "nf0": 1, + "uw0": 0.5, + "w": 0.75, + "l": 0.56, + "nf": 1, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.56, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.56, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.56, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.56, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "7c3b860a1fe73745", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1.5_sL1/manifest.json new file mode 100644 index 00000000..3c48630a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "50bfa53b4b493d7754fa77fea49c876f6a77aeb7c7e71084a8b99baee187facb", + "qualification.json": "33ccf08e870024843d2207424a8a7730c2aef03c13d039f738dd92ee829506ab", + "specs.json": "f7f09c7844d29883a4b591d8634aa44af53cb3ca5477d9095c52f1e1670870f9", + "target.spice": "fda69d884e07c096d6c9c64d4484e7209e1eafa30631f6959e7a8cece05709ac", + "target_lvs.spice": "244345cbae8cfd7bdef895adf014a1c6c1e30e367def787e6a55251aebb1b88d", + "testbench.spice": "71f365bcc8c8e8a9102b5992c1c290c711a79d95313afc42a05540952184dd6d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1.5_sL1/qualification.json new file mode 100644 index 00000000..946f9a68 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1.5_sL1/qualification.json @@ -0,0 +1,127 @@ +{ + "case_id": "C13_gf180_sW1.5_sL1", + "circuit_id": "C13", + "pdk": "gf180", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "unit width scaled (nf kept)", + "devices": { + "M1": { + "w0": 0.5, + "l0": 0.56, + "nf0": 1, + "uw0": 0.5, + "w": 0.75, + "l": 0.56, + "nf": 1, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.56, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.56, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.56, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.56, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "7c3b860a1fe73745", + "mirror_pass1": { + "vmin": 0.3788226, + "status": "passed", + "vout_test": 1.84 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.4788 + }, + "_frozen_from": { + "schematic": { + "err": 0.007247, + "vmin": 0.3788226 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.32 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.2, + "schematic_measures": { + "iout_t": 2.014494e-05, + "err": 0.007247, + "vmin": 0.3788226, + "dev_at_vdd": 0.02427484, + "gout_t": 1.244677e-07, + "rout_t": 8034213.0, + "vout_test": 1.84, + "rout_nom": 8034213.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1.5_sL1/specs.json new file mode 100644 index 00000000..c61f05a3 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1.5_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.4788 + }, + "_frozen_from": { + "schematic": { + "err": 0.007247, + "vmin": 0.3788226 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.32 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1.5_sL1/target.spice new file mode 100644 index 00000000..68040d3f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1.5_sL1/target.spice @@ -0,0 +1,7 @@ +.subckt C13_gf180_sW1.5_sL1 VSS IIN1 IOUT1 IB1 +MM1 IB1 IB1 VSS VSS nfet_03v3 w=0.75u l=0.56u nf=1 m=1 +MM2 IIN1 IB1 net15 VSS nfet_03v3 w=3u l=0.56u nf=4 m=1 +MM3 net15 IIN1 VSS VSS nfet_03v3 w=3u l=0.56u nf=4 m=1 +MM4 IOUT1 IB1 net14 VSS nfet_03v3 w=3u l=0.56u nf=4 m=1 +MM5 net14 IIN1 VSS VSS nfet_03v3 w=3u l=0.56u nf=4 m=1 +.ends C13_gf180_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1.5_sL1/target_lvs.spice new file mode 100644 index 00000000..c76bdc3b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1.5_sL1/target_lvs.spice @@ -0,0 +1,19 @@ +.subckt C13_gf180_sW1.5_sL1 VSS IIN1 IOUT1 IB1 +MM1_f0 IB1 IB1 VSS VSS nfet_03v3 w=0.75u l=0.56u +MM2_f0 IIN1 IB1 net15 VSS nfet_03v3 w=0.75u l=0.56u +MM2_f1 IIN1 IB1 net15 VSS nfet_03v3 w=0.75u l=0.56u +MM2_f2 IIN1 IB1 net15 VSS nfet_03v3 w=0.75u l=0.56u +MM2_f3 IIN1 IB1 net15 VSS nfet_03v3 w=0.75u l=0.56u +MM3_f0 net15 IIN1 VSS VSS nfet_03v3 w=0.75u l=0.56u +MM3_f1 net15 IIN1 VSS VSS nfet_03v3 w=0.75u l=0.56u +MM3_f2 net15 IIN1 VSS VSS nfet_03v3 w=0.75u l=0.56u +MM3_f3 net15 IIN1 VSS VSS nfet_03v3 w=0.75u l=0.56u +MM4_f0 IOUT1 IB1 net14 VSS nfet_03v3 w=0.75u l=0.56u +MM4_f1 IOUT1 IB1 net14 VSS nfet_03v3 w=0.75u l=0.56u +MM4_f2 IOUT1 IB1 net14 VSS nfet_03v3 w=0.75u l=0.56u +MM4_f3 IOUT1 IB1 net14 VSS nfet_03v3 w=0.75u l=0.56u +MM5_f0 net14 IIN1 VSS VSS nfet_03v3 w=0.75u l=0.56u +MM5_f1 net14 IIN1 VSS VSS nfet_03v3 w=0.75u l=0.56u +MM5_f2 net14 IIN1 VSS VSS nfet_03v3 w=0.75u l=0.56u +MM5_f3 net14 IIN1 VSS VSS nfet_03v3 w=0.75u l=0.56u +.ends C13_gf180_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1.5_sL1/testbench.spice new file mode 100644 index 00000000..a81b7f4b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1.5_sL1/testbench.spice @@ -0,0 +1,26 @@ +X1 VSS IIN1 IOUT1 IB1 C13_gf180_sW1.5_sL1 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIIN1 VDDB IIN1 2e-05 +IIB1 VDDB IB1 2e-05 +.nodeset v(IIN1)=0.99 v(IB1)=0.99 + +VOUT IOUT1 0 3.3 +.control +dc VOUT 3.3 0 -0.00825 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=1.84 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.03 cross=last +meas dc dev_at_vdd find dev at=3.2835 +let gout = deriv(iout) +meas dc gout_t find gout at=1.84 +let rout_v = 1/gout +meas dc rout_t find rout_v at=1.84 +echo vout_test = 1.84 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1.5_sL2/case.json new file mode 100644 index 00000000..d6cff297 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1.5_sL2/case.json @@ -0,0 +1,170 @@ +{ + "case_id": "C13_gf180_sW1.5_sL2", + "circuit_id": "C13", + "pdk": "gf180", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "dut_name": "C13_gf180_sW1.5_sL2", + "ports": [ + "VSS", + "IIN1", + "IOUT1", + "IB1" + ], + "sizing": { + "M1": { + "w": 0.75, + "l": 1.12, + "nf": 1 + }, + "M2": { + "w": 3.0, + "l": 1.12, + "nf": 4 + }, + "M3": { + "w": 3.0, + "l": 1.12, + "nf": 4 + }, + "M4": { + "w": 3.0, + "l": 1.12, + "nf": 4 + }, + "M5": { + "w": 3.0, + "l": 1.12, + "nf": 4 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VDD" + }, + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 1.65, + "tol": 0.03, + "vout_test": 1.88 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "unit width scaled (nf kept)", + "devices": { + "M1": { + "w0": 0.5, + "l0": 0.56, + "nf0": 1, + "uw0": 0.5, + "w": 0.75, + "l": 1.12, + "nf": 1, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.12, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.12, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.12, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.12, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "f3065378e1dba6f9", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1.5_sL2/manifest.json new file mode 100644 index 00000000..c8d8c580 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "e5fd4f65911e196ccb2ec037a6c795c806f05d87f2aa1e55d17f0a2a1a31aefb", + "qualification.json": "1e6f106a897abae265edd32f60ece87bf01c97712275698d6f5d104fa203c8e2", + "specs.json": "073dfa9120f438432105c62417fd6010ead1b71b8d9eaf2312e2fb148356a797", + "target.spice": "03de50b8db2a81c048b0ae578c3804895a5ac47e943c42250c61247878ed7a12", + "target_lvs.spice": "754203563918dc7bb3c2e6f50e52fbd2bde5fdd76a552953af4a48771a355c69", + "testbench.spice": "03a2b1c819849cbc44139eefbf43f514996542dcee91218ad575a29601590a40" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1.5_sL2/qualification.json new file mode 100644 index 00000000..ff1da71b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1.5_sL2/qualification.json @@ -0,0 +1,127 @@ +{ + "case_id": "C13_gf180_sW1.5_sL2", + "circuit_id": "C13", + "pdk": "gf180", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "unit width scaled (nf kept)", + "devices": { + "M1": { + "w0": 0.5, + "l0": 0.56, + "nf0": 1, + "uw0": 0.5, + "w": 0.75, + "l": 1.12, + "nf": 1, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.12, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.12, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.12, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.12, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "f3065378e1dba6f9", + "mirror_pass1": { + "vmin": 0.4696164, + "status": "passed", + "vout_test": 1.88 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.5696 + }, + "_frozen_from": { + "schematic": { + "err": 0.002052, + "vmin": 0.4696164 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.32 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.2, + "schematic_measures": { + "iout_t": 2.004104e-05, + "err": 0.002052, + "vmin": 0.4696164, + "dev_at_vdd": 0.00840051, + "gout_t": 3.678481e-08, + "rout_t": 27185160.0, + "vout_test": 1.88, + "rout_nom": 27185160.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1.5_sL2/specs.json new file mode 100644 index 00000000..e72653e4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1.5_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.5696 + }, + "_frozen_from": { + "schematic": { + "err": 0.002052, + "vmin": 0.4696164 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.32 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1.5_sL2/target.spice new file mode 100644 index 00000000..9ebd38dd --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1.5_sL2/target.spice @@ -0,0 +1,7 @@ +.subckt C13_gf180_sW1.5_sL2 VSS IIN1 IOUT1 IB1 +MM1 IB1 IB1 VSS VSS nfet_03v3 w=0.75u l=1.12u nf=1 m=1 +MM2 IIN1 IB1 net15 VSS nfet_03v3 w=3u l=1.12u nf=4 m=1 +MM3 net15 IIN1 VSS VSS nfet_03v3 w=3u l=1.12u nf=4 m=1 +MM4 IOUT1 IB1 net14 VSS nfet_03v3 w=3u l=1.12u nf=4 m=1 +MM5 net14 IIN1 VSS VSS nfet_03v3 w=3u l=1.12u nf=4 m=1 +.ends C13_gf180_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1.5_sL2/target_lvs.spice new file mode 100644 index 00000000..0e849e2c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1.5_sL2/target_lvs.spice @@ -0,0 +1,19 @@ +.subckt C13_gf180_sW1.5_sL2 VSS IIN1 IOUT1 IB1 +MM1_f0 IB1 IB1 VSS VSS nfet_03v3 w=0.75u l=1.12u +MM2_f0 IIN1 IB1 net15 VSS nfet_03v3 w=0.75u l=1.12u +MM2_f1 IIN1 IB1 net15 VSS nfet_03v3 w=0.75u l=1.12u +MM2_f2 IIN1 IB1 net15 VSS nfet_03v3 w=0.75u l=1.12u +MM2_f3 IIN1 IB1 net15 VSS nfet_03v3 w=0.75u l=1.12u +MM3_f0 net15 IIN1 VSS VSS nfet_03v3 w=0.75u l=1.12u +MM3_f1 net15 IIN1 VSS VSS nfet_03v3 w=0.75u l=1.12u +MM3_f2 net15 IIN1 VSS VSS nfet_03v3 w=0.75u l=1.12u +MM3_f3 net15 IIN1 VSS VSS nfet_03v3 w=0.75u l=1.12u +MM4_f0 IOUT1 IB1 net14 VSS nfet_03v3 w=0.75u l=1.12u +MM4_f1 IOUT1 IB1 net14 VSS nfet_03v3 w=0.75u l=1.12u +MM4_f2 IOUT1 IB1 net14 VSS nfet_03v3 w=0.75u l=1.12u +MM4_f3 IOUT1 IB1 net14 VSS nfet_03v3 w=0.75u l=1.12u +MM5_f0 net14 IIN1 VSS VSS nfet_03v3 w=0.75u l=1.12u +MM5_f1 net14 IIN1 VSS VSS nfet_03v3 w=0.75u l=1.12u +MM5_f2 net14 IIN1 VSS VSS nfet_03v3 w=0.75u l=1.12u +MM5_f3 net14 IIN1 VSS VSS nfet_03v3 w=0.75u l=1.12u +.ends C13_gf180_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1.5_sL2/testbench.spice new file mode 100644 index 00000000..2fdbd261 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1.5_sL2/testbench.spice @@ -0,0 +1,26 @@ +X1 VSS IIN1 IOUT1 IB1 C13_gf180_sW1.5_sL2 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIIN1 VDDB IIN1 2e-05 +IIB1 VDDB IB1 2e-05 +.nodeset v(IIN1)=0.99 v(IB1)=0.99 + +VOUT IOUT1 0 3.3 +.control +dc VOUT 3.3 0 -0.00825 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=1.88 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.03 cross=last +meas dc dev_at_vdd find dev at=3.2835 +let gout = deriv(iout) +meas dc gout_t find gout at=1.88 +let rout_v = 1/gout +meas dc rout_t find rout_v at=1.88 +echo vout_test = 1.88 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1_sL1.5/case.json new file mode 100644 index 00000000..add9f58d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1_sL1.5/case.json @@ -0,0 +1,170 @@ +{ + "case_id": "C13_gf180_sW1_sL1.5", + "circuit_id": "C13", + "pdk": "gf180", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "dut_name": "C13_gf180_sW1_sL1.5", + "ports": [ + "VSS", + "IIN1", + "IOUT1", + "IB1" + ], + "sizing": { + "M1": { + "w": 0.5, + "l": 0.84, + "nf": 1 + }, + "M2": { + "w": 2.0, + "l": 0.84, + "nf": 4 + }, + "M3": { + "w": 2.0, + "l": 0.84, + "nf": 4 + }, + "M4": { + "w": 2.0, + "l": 0.84, + "nf": 4 + }, + "M5": { + "w": 2.0, + "l": 0.84, + "nf": 4 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VDD" + }, + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 1.65, + "tol": 0.03, + "vout_test": 1.91 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 0.5, + "l0": 0.56, + "nf0": 1, + "uw0": 0.5, + "w": 0.5, + "l": 0.84, + "nf": 1, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "d0c61bf69907be03", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1_sL1.5/manifest.json new file mode 100644 index 00000000..16aa47df --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "a147bd3f7921642644e387fe9e7e0f512bec44f42d6a7e7c842df0c282266ffd", + "qualification.json": "a322fe31baaa7d59f6e51d9a049c9592f6eff3f636a20716f3dc9bd27ba80f1e", + "specs.json": "60521a7dd24634a49c87f92365415d5509a5de55b75a77c9596916cd3ce91bb5", + "target.spice": "ff3186b38999453afbee0fb6f4a6c5409d967b17922bc51d08bdc87940cf5f51", + "target_lvs.spice": "158598eff07e80e1f89bd421f946229f022ee40165f241bd096bb7064db53a77", + "testbench.spice": "a293cfb77bb58d7d5603a1247be62025b3e862acf54ba0004a6ba0b2b025dfc9" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1_sL1.5/qualification.json new file mode 100644 index 00000000..3a9e53d9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1_sL1.5/qualification.json @@ -0,0 +1,127 @@ +{ + "case_id": "C13_gf180_sW1_sL1.5", + "circuit_id": "C13", + "pdk": "gf180", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 0.5, + "l0": 0.56, + "nf0": 1, + "uw0": 0.5, + "w": 0.5, + "l": 0.84, + "nf": 1, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "d0c61bf69907be03", + "mirror_pass1": { + "vmin": 0.514447, + "status": "passed", + "vout_test": 1.91 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.6144 + }, + "_frozen_from": { + "schematic": { + "err": 0.0026085, + "vmin": 0.514447 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.32 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.2, + "schematic_measures": { + "iout_t": 2.005217e-05, + "err": 0.0026085, + "vmin": 0.514447, + "dev_at_vdd": 0.009134582, + "gout_t": 4.323265e-08, + "rout_t": 23130740.0, + "vout_test": 1.91, + "rout_nom": 23130740.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1_sL1.5/specs.json new file mode 100644 index 00000000..b9d6edc3 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.6144 + }, + "_frozen_from": { + "schematic": { + "err": 0.0026085, + "vmin": 0.514447 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.32 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1_sL1.5/target.spice new file mode 100644 index 00000000..9eb45d3d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1_sL1.5/target.spice @@ -0,0 +1,7 @@ +.subckt C13_gf180_sW1_sL1.5 VSS IIN1 IOUT1 IB1 +MM1 IB1 IB1 VSS VSS nfet_03v3 w=0.5u l=0.84u nf=1 m=1 +MM2 IIN1 IB1 net15 VSS nfet_03v3 w=2u l=0.84u nf=4 m=1 +MM3 net15 IIN1 VSS VSS nfet_03v3 w=2u l=0.84u nf=4 m=1 +MM4 IOUT1 IB1 net14 VSS nfet_03v3 w=2u l=0.84u nf=4 m=1 +MM5 net14 IIN1 VSS VSS nfet_03v3 w=2u l=0.84u nf=4 m=1 +.ends C13_gf180_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1_sL1.5/target_lvs.spice new file mode 100644 index 00000000..edba15b2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1_sL1.5/target_lvs.spice @@ -0,0 +1,19 @@ +.subckt C13_gf180_sW1_sL1.5 VSS IIN1 IOUT1 IB1 +MM1_f0 IB1 IB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM2_f0 IIN1 IB1 net15 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f1 IIN1 IB1 net15 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f2 IIN1 IB1 net15 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f3 IIN1 IB1 net15 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f0 net15 IIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f1 net15 IIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f2 net15 IIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f3 net15 IIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM4_f0 IOUT1 IB1 net14 VSS nfet_03v3 w=0.5u l=0.84u +MM4_f1 IOUT1 IB1 net14 VSS nfet_03v3 w=0.5u l=0.84u +MM4_f2 IOUT1 IB1 net14 VSS nfet_03v3 w=0.5u l=0.84u +MM4_f3 IOUT1 IB1 net14 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f0 net14 IIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM5_f1 net14 IIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM5_f2 net14 IIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM5_f3 net14 IIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +.ends C13_gf180_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1_sL1.5/testbench.spice new file mode 100644 index 00000000..c7c8370a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1_sL1.5/testbench.spice @@ -0,0 +1,26 @@ +X1 VSS IIN1 IOUT1 IB1 C13_gf180_sW1_sL1.5 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIIN1 VDDB IIN1 2e-05 +IIB1 VDDB IB1 2e-05 +.nodeset v(IIN1)=0.99 v(IB1)=0.99 + +VOUT IOUT1 0 3.3 +.control +dc VOUT 3.3 0 -0.00825 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=1.91 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.03 cross=last +meas dc dev_at_vdd find dev at=3.2835 +let gout = deriv(iout) +meas dc gout_t find gout at=1.91 +let rout_v = 1/gout +meas dc rout_t find rout_v at=1.91 +echo vout_test = 1.91 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1_sL1/case.json new file mode 100644 index 00000000..22ba7f3f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1_sL1/case.json @@ -0,0 +1,170 @@ +{ + "case_id": "C13_gf180_sW1_sL1", + "circuit_id": "C13", + "pdk": "gf180", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "dut_name": "C13_gf180_sW1_sL1", + "ports": [ + "VSS", + "IIN1", + "IOUT1", + "IB1" + ], + "sizing": { + "M1": { + "w": 0.5, + "l": 0.56, + "nf": 1 + }, + "M2": { + "w": 2.0, + "l": 0.56, + "nf": 4 + }, + "M3": { + "w": 2.0, + "l": 0.56, + "nf": 4 + }, + "M4": { + "w": 2.0, + "l": 0.56, + "nf": 4 + }, + "M5": { + "w": 2.0, + "l": 0.56, + "nf": 4 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VDD" + }, + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 1.65, + "tol": 0.03, + "vout_test": 1.88 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 0.5, + "l0": 0.56, + "nf0": 1, + "uw0": 0.5, + "w": 0.5, + "l": 0.56, + "nf": 1, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "c3220a42e3e2e956", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1_sL1/manifest.json new file mode 100644 index 00000000..e23dfb91 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "32dbc9e9bd046a6da5a7863715e1a8cc59e647d3bce0130bf6c254197bfef82c", + "qualification.json": "6d46a0a56b24f85353186db786ee76d0d44a891e184c3136b7100ce56a687d3b", + "specs.json": "074cfb2bc7f6cacccc5062dd364dfb5494061d068326678ec7a06d450127dd1c", + "target.spice": "db967eeaf377f7881d4e254a401bee6e9780d46c976758114ff0960fd483ccfe", + "target_lvs.spice": "539cfa3d5cd4986fc795d9e11bf28faede54d2ec4388dc58b2926338aa5407e4", + "testbench.spice": "f2a41b7ca81c1d5bd3a4b0f6cc5cc344c3155f15db64beff1da38960ce0f102c" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1_sL1/qualification.json new file mode 100644 index 00000000..4c48258c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1_sL1/qualification.json @@ -0,0 +1,127 @@ +{ + "case_id": "C13_gf180_sW1_sL1", + "circuit_id": "C13", + "pdk": "gf180", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 0.5, + "l0": 0.56, + "nf0": 1, + "uw0": 0.5, + "w": 0.5, + "l": 0.56, + "nf": 1, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "c3220a42e3e2e956", + "mirror_pass1": { + "vmin": 0.4546396, + "status": "passed", + "vout_test": 1.88 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.5546 + }, + "_frozen_from": { + "schematic": { + "err": 0.00595, + "vmin": 0.4546396 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.32 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.2, + "schematic_measures": { + "iout_t": 2.0119e-05, + "err": 0.00595, + "vmin": 0.4546396, + "dev_at_vdd": 0.01859027, + "gout_t": 9.758502e-08, + "rout_t": 10247480.0, + "vout_test": 1.88, + "rout_nom": 10247480.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1_sL1/specs.json new file mode 100644 index 00000000..b6964cf0 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.5546 + }, + "_frozen_from": { + "schematic": { + "err": 0.00595, + "vmin": 0.4546396 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.32 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1_sL1/target.spice new file mode 100644 index 00000000..7b3409ed --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1_sL1/target.spice @@ -0,0 +1,7 @@ +.subckt C13_gf180_sW1_sL1 VSS IIN1 IOUT1 IB1 +MM1 IB1 IB1 VSS VSS nfet_03v3 w=0.5u l=0.56u nf=1 m=1 +MM2 IIN1 IB1 net15 VSS nfet_03v3 w=2u l=0.56u nf=4 m=1 +MM3 net15 IIN1 VSS VSS nfet_03v3 w=2u l=0.56u nf=4 m=1 +MM4 IOUT1 IB1 net14 VSS nfet_03v3 w=2u l=0.56u nf=4 m=1 +MM5 net14 IIN1 VSS VSS nfet_03v3 w=2u l=0.56u nf=4 m=1 +.ends C13_gf180_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1_sL1/target_lvs.spice new file mode 100644 index 00000000..6fe9cf6c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1_sL1/target_lvs.spice @@ -0,0 +1,19 @@ +.subckt C13_gf180_sW1_sL1 VSS IIN1 IOUT1 IB1 +MM1_f0 IB1 IB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM2_f0 IIN1 IB1 net15 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f1 IIN1 IB1 net15 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f2 IIN1 IB1 net15 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f3 IIN1 IB1 net15 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f0 net15 IIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f1 net15 IIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f2 net15 IIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f3 net15 IIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM4_f0 IOUT1 IB1 net14 VSS nfet_03v3 w=0.5u l=0.56u +MM4_f1 IOUT1 IB1 net14 VSS nfet_03v3 w=0.5u l=0.56u +MM4_f2 IOUT1 IB1 net14 VSS nfet_03v3 w=0.5u l=0.56u +MM4_f3 IOUT1 IB1 net14 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f0 net14 IIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM5_f1 net14 IIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM5_f2 net14 IIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM5_f3 net14 IIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +.ends C13_gf180_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1_sL1/testbench.spice new file mode 100644 index 00000000..8445676d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1_sL1/testbench.spice @@ -0,0 +1,26 @@ +X1 VSS IIN1 IOUT1 IB1 C13_gf180_sW1_sL1 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIIN1 VDDB IIN1 2e-05 +IIB1 VDDB IB1 2e-05 +.nodeset v(IIN1)=0.99 v(IB1)=0.99 + +VOUT IOUT1 0 3.3 +.control +dc VOUT 3.3 0 -0.00825 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=1.88 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.03 cross=last +meas dc dev_at_vdd find dev at=3.2835 +let gout = deriv(iout) +meas dc gout_t find gout at=1.88 +let rout_v = 1/gout +meas dc rout_t find rout_v at=1.88 +echo vout_test = 1.88 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1_sL2/case.json new file mode 100644 index 00000000..1ccf447b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1_sL2/case.json @@ -0,0 +1,170 @@ +{ + "case_id": "C13_gf180_sW1_sL2", + "circuit_id": "C13", + "pdk": "gf180", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "dut_name": "C13_gf180_sW1_sL2", + "ports": [ + "VSS", + "IIN1", + "IOUT1", + "IB1" + ], + "sizing": { + "M1": { + "w": 0.5, + "l": 1.12, + "nf": 1 + }, + "M2": { + "w": 2.0, + "l": 1.12, + "nf": 4 + }, + "M3": { + "w": 2.0, + "l": 1.12, + "nf": 4 + }, + "M4": { + "w": 2.0, + "l": 1.12, + "nf": 4 + }, + "M5": { + "w": 2.0, + "l": 1.12, + "nf": 4 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VDD" + }, + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 1.65, + "tol": 0.03, + "vout_test": 1.94 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 0.5, + "l0": 0.56, + "nf0": 1, + "uw0": 0.5, + "w": 0.5, + "l": 1.12, + "nf": 1, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "83ab95de4bd1df51", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1_sL2/manifest.json new file mode 100644 index 00000000..38d5528f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "f9ed3b9ee6c662a9c28d27921ce4f588765c668acd969c343c8c7726492482f8", + "qualification.json": "548bea22d30c39d2178b55c9808967857ca357b58a42f41a1f71fa43df495e0d", + "specs.json": "ec0ce58aa325b62b348aff498daa8dd5c5966e290ee5c839b11c1512856a15bc", + "target.spice": "f8c3a4a4a281c586f2f03333304d803ac926504b4cf7ab94d34595e4cffd3e2b", + "target_lvs.spice": "c4ecab53011eb3ff777eb727dd317d3ae7fcfa3bbfcf51b579a87bef874c2d97", + "testbench.spice": "a19bd3b8dcd3b9d4c9327765b78ceccc1681cc90e1e3662ae54430c7dd3fdb41" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1_sL2/qualification.json new file mode 100644 index 00000000..fc500b72 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1_sL2/qualification.json @@ -0,0 +1,127 @@ +{ + "case_id": "C13_gf180_sW1_sL2", + "circuit_id": "C13", + "pdk": "gf180", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 0.5, + "l0": 0.56, + "nf0": 1, + "uw0": 0.5, + "w": 0.5, + "l": 1.12, + "nf": 1, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "83ab95de4bd1df51", + "mirror_pass1": { + "vmin": 0.5713862, + "status": "passed", + "vout_test": 1.94 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.6714 + }, + "_frozen_from": { + "schematic": { + "err": 0.0016055, + "vmin": 0.5713862 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.32 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.2, + "schematic_measures": { + "iout_t": 2.003211e-05, + "err": 0.0016055, + "vmin": 0.5713862, + "dev_at_vdd": 0.005457576, + "gout_t": 2.738518e-08, + "rout_t": 36516170.0, + "vout_test": 1.94, + "rout_nom": 36516170.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1_sL2/specs.json new file mode 100644 index 00000000..80c5334c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.6714 + }, + "_frozen_from": { + "schematic": { + "err": 0.0016055, + "vmin": 0.5713862 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.32 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1_sL2/target.spice new file mode 100644 index 00000000..886e0b55 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1_sL2/target.spice @@ -0,0 +1,7 @@ +.subckt C13_gf180_sW1_sL2 VSS IIN1 IOUT1 IB1 +MM1 IB1 IB1 VSS VSS nfet_03v3 w=0.5u l=1.12u nf=1 m=1 +MM2 IIN1 IB1 net15 VSS nfet_03v3 w=2u l=1.12u nf=4 m=1 +MM3 net15 IIN1 VSS VSS nfet_03v3 w=2u l=1.12u nf=4 m=1 +MM4 IOUT1 IB1 net14 VSS nfet_03v3 w=2u l=1.12u nf=4 m=1 +MM5 net14 IIN1 VSS VSS nfet_03v3 w=2u l=1.12u nf=4 m=1 +.ends C13_gf180_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1_sL2/target_lvs.spice new file mode 100644 index 00000000..ca8f5dbf --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1_sL2/target_lvs.spice @@ -0,0 +1,19 @@ +.subckt C13_gf180_sW1_sL2 VSS IIN1 IOUT1 IB1 +MM1_f0 IB1 IB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM2_f0 IIN1 IB1 net15 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f1 IIN1 IB1 net15 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f2 IIN1 IB1 net15 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f3 IIN1 IB1 net15 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f0 net15 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f1 net15 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f2 net15 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f3 net15 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM4_f0 IOUT1 IB1 net14 VSS nfet_03v3 w=0.5u l=1.12u +MM4_f1 IOUT1 IB1 net14 VSS nfet_03v3 w=0.5u l=1.12u +MM4_f2 IOUT1 IB1 net14 VSS nfet_03v3 w=0.5u l=1.12u +MM4_f3 IOUT1 IB1 net14 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f0 net14 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM5_f1 net14 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM5_f2 net14 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM5_f3 net14 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +.ends C13_gf180_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1_sL2/testbench.spice new file mode 100644 index 00000000..3bd344d3 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW1_sL2/testbench.spice @@ -0,0 +1,26 @@ +X1 VSS IIN1 IOUT1 IB1 C13_gf180_sW1_sL2 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIIN1 VDDB IIN1 2e-05 +IIB1 VDDB IB1 2e-05 +.nodeset v(IIN1)=0.99 v(IB1)=0.99 + +VOUT IOUT1 0 3.3 +.control +dc VOUT 3.3 0 -0.00825 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=1.94 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.03 cross=last +meas dc dev_at_vdd find dev at=3.2835 +let gout = deriv(iout) +meas dc gout_t find gout at=1.94 +let rout_v = 1/gout +meas dc rout_t find rout_v at=1.94 +echo vout_test = 1.94 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C13/gf180/sW2_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW2_sL1.5/case.json new file mode 100644 index 00000000..1ebc063a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW2_sL1.5/case.json @@ -0,0 +1,170 @@ +{ + "case_id": "C13_gf180_sW2_sL1.5", + "circuit_id": "C13", + "pdk": "gf180", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "dut_name": "C13_gf180_sW2_sL1.5", + "ports": [ + "VSS", + "IIN1", + "IOUT1", + "IB1" + ], + "sizing": { + "M1": { + "w": 1.0, + "l": 0.84, + "nf": 2 + }, + "M2": { + "w": 4.0, + "l": 0.84, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 0.84, + "nf": 8 + }, + "M4": { + "w": 4.0, + "l": 0.84, + "nf": 8 + }, + "M5": { + "w": 4.0, + "l": 0.84, + "nf": 8 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VDD" + }, + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 1.65, + "tol": 0.03, + "vout_test": 1.84 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 0.5, + "l0": 0.56, + "nf0": 1, + "uw0": 0.5, + "w": 1.0, + "l": 0.84, + "nf": 2, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "247be6bcb62f3bd4", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/gf180/sW2_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW2_sL1.5/manifest.json new file mode 100644 index 00000000..178b8ea4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW2_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "48b93535f43ecc918954e3854fcbe84c81de3fe1bb8931477009acb7ee07e49e", + "qualification.json": "cbfeef37112cf85f8e1cb8223d73d32f5ee73cf9375dd34894fb5a19011ccdc9", + "specs.json": "b7bba9ac6a76c4b582392bb22d2a52ca020742d4ca5fff001569968f473c9bc5", + "target.spice": "d3fc3c282b6ebfe7e15f5ccf4ac523132b53edd583087f3cfe98b903da4d85f5", + "target_lvs.spice": "6dd0e2625f4c9d6218b17330ced8a8ae379784f5784d979e458f32dc834602ae", + "testbench.spice": "35fc09dbbcceb2e540d418ffa828828ddeef88616e51cf37e1136f4ab53debce" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/gf180/sW2_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW2_sL1.5/qualification.json new file mode 100644 index 00000000..108140c4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW2_sL1.5/qualification.json @@ -0,0 +1,127 @@ +{ + "case_id": "C13_gf180_sW2_sL1.5", + "circuit_id": "C13", + "pdk": "gf180", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 0.5, + "l0": 0.56, + "nf0": 1, + "uw0": 0.5, + "w": 1.0, + "l": 0.84, + "nf": 2, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "247be6bcb62f3bd4", + "mirror_pass1": { + "vmin": 0.3754779, + "status": "passed", + "vout_test": 1.84 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.4755 + }, + "_frozen_from": { + "schematic": { + "err": 0.0040535, + "vmin": 0.3754779 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.32 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.2, + "schematic_measures": { + "iout_t": 2.008107e-05, + "err": 0.0040535, + "vmin": 0.3754779, + "dev_at_vdd": 0.01609027, + "gout_t": 6.94235e-08, + "rout_t": 14404350.0, + "vout_test": 1.84, + "rout_nom": 14404350.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/gf180/sW2_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW2_sL1.5/specs.json new file mode 100644 index 00000000..6c458697 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW2_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.4755 + }, + "_frozen_from": { + "schematic": { + "err": 0.0040535, + "vmin": 0.3754779 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.32 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/gf180/sW2_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW2_sL1.5/target.spice new file mode 100644 index 00000000..56eaf911 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW2_sL1.5/target.spice @@ -0,0 +1,7 @@ +.subckt C13_gf180_sW2_sL1.5 VSS IIN1 IOUT1 IB1 +MM1 IB1 IB1 VSS VSS nfet_03v3 w=1u l=0.84u nf=2 m=1 +MM2 IIN1 IB1 net15 VSS nfet_03v3 w=4u l=0.84u nf=8 m=1 +MM3 net15 IIN1 VSS VSS nfet_03v3 w=4u l=0.84u nf=8 m=1 +MM4 IOUT1 IB1 net14 VSS nfet_03v3 w=4u l=0.84u nf=8 m=1 +MM5 net14 IIN1 VSS VSS nfet_03v3 w=4u l=0.84u nf=8 m=1 +.ends C13_gf180_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C13/gf180/sW2_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW2_sL1.5/target_lvs.spice new file mode 100644 index 00000000..0a30374c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW2_sL1.5/target_lvs.spice @@ -0,0 +1,36 @@ +.subckt C13_gf180_sW2_sL1.5 VSS IIN1 IOUT1 IB1 +MM1_f0 IB1 IB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM1_f1 IB1 IB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM2_f0 IIN1 IB1 net15 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f1 IIN1 IB1 net15 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f2 IIN1 IB1 net15 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f3 IIN1 IB1 net15 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f4 IIN1 IB1 net15 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f5 IIN1 IB1 net15 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f6 IIN1 IB1 net15 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f7 IIN1 IB1 net15 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f0 net15 IIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f1 net15 IIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f2 net15 IIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f3 net15 IIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f4 net15 IIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f5 net15 IIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f6 net15 IIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f7 net15 IIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM4_f0 IOUT1 IB1 net14 VSS nfet_03v3 w=0.5u l=0.84u +MM4_f1 IOUT1 IB1 net14 VSS nfet_03v3 w=0.5u l=0.84u +MM4_f2 IOUT1 IB1 net14 VSS nfet_03v3 w=0.5u l=0.84u +MM4_f3 IOUT1 IB1 net14 VSS nfet_03v3 w=0.5u l=0.84u +MM4_f4 IOUT1 IB1 net14 VSS nfet_03v3 w=0.5u l=0.84u +MM4_f5 IOUT1 IB1 net14 VSS nfet_03v3 w=0.5u l=0.84u +MM4_f6 IOUT1 IB1 net14 VSS nfet_03v3 w=0.5u l=0.84u +MM4_f7 IOUT1 IB1 net14 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f0 net14 IIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM5_f1 net14 IIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM5_f2 net14 IIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM5_f3 net14 IIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM5_f4 net14 IIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM5_f5 net14 IIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM5_f6 net14 IIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM5_f7 net14 IIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +.ends C13_gf180_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C13/gf180/sW2_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW2_sL1.5/testbench.spice new file mode 100644 index 00000000..a17a13cc --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW2_sL1.5/testbench.spice @@ -0,0 +1,26 @@ +X1 VSS IIN1 IOUT1 IB1 C13_gf180_sW2_sL1.5 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIIN1 VDDB IIN1 2e-05 +IIB1 VDDB IB1 2e-05 +.nodeset v(IIN1)=0.99 v(IB1)=0.99 + +VOUT IOUT1 0 3.3 +.control +dc VOUT 3.3 0 -0.00825 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=1.84 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.03 cross=last +meas dc dev_at_vdd find dev at=3.2835 +let gout = deriv(iout) +meas dc gout_t find gout at=1.84 +let rout_v = 1/gout +meas dc rout_t find rout_v at=1.84 +echo vout_test = 1.84 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C13/gf180/sW2_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW2_sL1/case.json new file mode 100644 index 00000000..f9d03611 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW2_sL1/case.json @@ -0,0 +1,170 @@ +{ + "case_id": "C13_gf180_sW2_sL1", + "circuit_id": "C13", + "pdk": "gf180", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "dut_name": "C13_gf180_sW2_sL1", + "ports": [ + "VSS", + "IIN1", + "IOUT1", + "IB1" + ], + "sizing": { + "M1": { + "w": 1.0, + "l": 0.56, + "nf": 2 + }, + "M2": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "M4": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "M5": { + "w": 4.0, + "l": 0.56, + "nf": 8 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VDD" + }, + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 1.65, + "tol": 0.03, + "vout_test": 1.82 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 0.5, + "l0": 0.56, + "nf0": 1, + "uw0": 0.5, + "w": 1.0, + "l": 0.56, + "nf": 2, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "a061c1e243689d8a", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/gf180/sW2_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW2_sL1/manifest.json new file mode 100644 index 00000000..33ae8c5a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW2_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "208d96b0e9a6a93f30c3c42dafbf912f88e6b413c65caecf164e807d682c1a16", + "qualification.json": "f6b1c88648488d7f30af9d0b5f39f556686727fcaf24d83236e0008e673ab28d", + "specs.json": "c9e52c9776d699938d8691b05858ea2be7cc69da6028dd639596a22d6358c9a6", + "target.spice": "93ccf18578ec85e55360ac3cf55cdb9e4f20e644425e87b711b6c5a23ff326c8", + "target_lvs.spice": "644c135d0d5253fe33453586a2c35778e6cbb65c75af70acd14d8db71ce5d450", + "testbench.spice": "91ee8ba87bb9b3e6c15a92d8e103479c2d094d2fb0bf589f22359105f6cec8a0" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/gf180/sW2_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW2_sL1/qualification.json new file mode 100644 index 00000000..5fd86ac6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW2_sL1/qualification.json @@ -0,0 +1,127 @@ +{ + "case_id": "C13_gf180_sW2_sL1", + "circuit_id": "C13", + "pdk": "gf180", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 0.5, + "l0": 0.56, + "nf0": 1, + "uw0": 0.5, + "w": 1.0, + "l": 0.56, + "nf": 2, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "a061c1e243689d8a", + "mirror_pass1": { + "vmin": 0.3391952, + "status": "passed", + "vout_test": 1.82 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.4392 + }, + "_frozen_from": { + "schematic": { + "err": 0.008924, + "vmin": 0.3391952 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.32 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.2, + "schematic_measures": { + "iout_t": 2.017848e-05, + "err": 0.008924, + "vmin": 0.3391952, + "dev_at_vdd": 0.02969435, + "gout_t": 1.510911e-07, + "rout_t": 6618531.0, + "vout_test": 1.82, + "rout_nom": 6618531.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/gf180/sW2_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW2_sL1/specs.json new file mode 100644 index 00000000..b194c150 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW2_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.4392 + }, + "_frozen_from": { + "schematic": { + "err": 0.008924, + "vmin": 0.3391952 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.32 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/gf180/sW2_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW2_sL1/target.spice new file mode 100644 index 00000000..c286bb9e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW2_sL1/target.spice @@ -0,0 +1,7 @@ +.subckt C13_gf180_sW2_sL1 VSS IIN1 IOUT1 IB1 +MM1 IB1 IB1 VSS VSS nfet_03v3 w=1u l=0.56u nf=2 m=1 +MM2 IIN1 IB1 net15 VSS nfet_03v3 w=4u l=0.56u nf=8 m=1 +MM3 net15 IIN1 VSS VSS nfet_03v3 w=4u l=0.56u nf=8 m=1 +MM4 IOUT1 IB1 net14 VSS nfet_03v3 w=4u l=0.56u nf=8 m=1 +MM5 net14 IIN1 VSS VSS nfet_03v3 w=4u l=0.56u nf=8 m=1 +.ends C13_gf180_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C13/gf180/sW2_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW2_sL1/target_lvs.spice new file mode 100644 index 00000000..52fa5ec3 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW2_sL1/target_lvs.spice @@ -0,0 +1,36 @@ +.subckt C13_gf180_sW2_sL1 VSS IIN1 IOUT1 IB1 +MM1_f0 IB1 IB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM1_f1 IB1 IB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM2_f0 IIN1 IB1 net15 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f1 IIN1 IB1 net15 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f2 IIN1 IB1 net15 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f3 IIN1 IB1 net15 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f4 IIN1 IB1 net15 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f5 IIN1 IB1 net15 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f6 IIN1 IB1 net15 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f7 IIN1 IB1 net15 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f0 net15 IIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f1 net15 IIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f2 net15 IIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f3 net15 IIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f4 net15 IIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f5 net15 IIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f6 net15 IIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f7 net15 IIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM4_f0 IOUT1 IB1 net14 VSS nfet_03v3 w=0.5u l=0.56u +MM4_f1 IOUT1 IB1 net14 VSS nfet_03v3 w=0.5u l=0.56u +MM4_f2 IOUT1 IB1 net14 VSS nfet_03v3 w=0.5u l=0.56u +MM4_f3 IOUT1 IB1 net14 VSS nfet_03v3 w=0.5u l=0.56u +MM4_f4 IOUT1 IB1 net14 VSS nfet_03v3 w=0.5u l=0.56u +MM4_f5 IOUT1 IB1 net14 VSS nfet_03v3 w=0.5u l=0.56u +MM4_f6 IOUT1 IB1 net14 VSS nfet_03v3 w=0.5u l=0.56u +MM4_f7 IOUT1 IB1 net14 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f0 net14 IIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM5_f1 net14 IIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM5_f2 net14 IIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM5_f3 net14 IIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM5_f4 net14 IIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM5_f5 net14 IIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM5_f6 net14 IIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM5_f7 net14 IIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +.ends C13_gf180_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C13/gf180/sW2_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW2_sL1/testbench.spice new file mode 100644 index 00000000..53c2e4e4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW2_sL1/testbench.spice @@ -0,0 +1,26 @@ +X1 VSS IIN1 IOUT1 IB1 C13_gf180_sW2_sL1 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIIN1 VDDB IIN1 2e-05 +IIB1 VDDB IB1 2e-05 +.nodeset v(IIN1)=0.99 v(IB1)=0.99 + +VOUT IOUT1 0 3.3 +.control +dc VOUT 3.3 0 -0.00825 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=1.82 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.03 cross=last +meas dc dev_at_vdd find dev at=3.2835 +let gout = deriv(iout) +meas dc gout_t find gout at=1.82 +let rout_v = 1/gout +meas dc rout_t find rout_v at=1.82 +echo vout_test = 1.82 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C13/gf180/sW2_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW2_sL2/case.json new file mode 100644 index 00000000..bf505679 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW2_sL2/case.json @@ -0,0 +1,170 @@ +{ + "case_id": "C13_gf180_sW2_sL2", + "circuit_id": "C13", + "pdk": "gf180", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "dut_name": "C13_gf180_sW2_sL2", + "ports": [ + "VSS", + "IIN1", + "IOUT1", + "IB1" + ], + "sizing": { + "M1": { + "w": 1.0, + "l": 1.12, + "nf": 2 + }, + "M2": { + "w": 4.0, + "l": 1.12, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 1.12, + "nf": 8 + }, + "M4": { + "w": 4.0, + "l": 1.12, + "nf": 8 + }, + "M5": { + "w": 4.0, + "l": 1.12, + "nf": 8 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VDD" + }, + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 1.65, + "tol": 0.03, + "vout_test": 1.86 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 0.5, + "l0": 0.56, + "nf0": 1, + "uw0": 0.5, + "w": 1.0, + "l": 1.12, + "nf": 2, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "bf140597675567a1", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/gf180/sW2_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW2_sL2/manifest.json new file mode 100644 index 00000000..bd557a1b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW2_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "95ada34e78da102a877a7c54d7199629474c20cb6555cf70f5fa16a5800d2324", + "qualification.json": "6c47b21a92059a3db3dba30f39befc847de6a498e989276d099d38b65b534496", + "specs.json": "9c5c715366e9f90b12c24e9d43a3de8b9171f03242fafd9ed731c7bd510e87e1", + "target.spice": "9980874a2c354e31c32378bb846639abb6e99ade53a5ef588e3dabcb56622a71", + "target_lvs.spice": "8179a17be4c38aca2db6865b67f1f29b638fd0b3248d708c8b3a4b0242c5359f", + "testbench.spice": "64b6821dc98d66f645ccbe499e9e328285ea429bd426f517b3e69572d30c9217" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/gf180/sW2_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW2_sL2/qualification.json new file mode 100644 index 00000000..60757093 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW2_sL2/qualification.json @@ -0,0 +1,127 @@ +{ + "case_id": "C13_gf180_sW2_sL2", + "circuit_id": "C13", + "pdk": "gf180", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 0.5, + "l0": 0.56, + "nf0": 1, + "uw0": 0.5, + "w": 1.0, + "l": 1.12, + "nf": 2, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "bf140597675567a1", + "mirror_pass1": { + "vmin": 0.41394, + "status": "passed", + "vout_test": 1.86 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.5139 + }, + "_frozen_from": { + "schematic": { + "err": 0.002549, + "vmin": 0.41394 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.32 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.3, + "schematic_measures": { + "iout_t": 2.005098e-05, + "err": 0.002549, + "vmin": 0.41394, + "dev_at_vdd": 0.01042855, + "gout_t": 4.486788e-08, + "rout_t": 22287690.0, + "vout_test": 1.86, + "rout_nom": 22287690.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/gf180/sW2_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW2_sL2/specs.json new file mode 100644 index 00000000..05114e08 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW2_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.5139 + }, + "_frozen_from": { + "schematic": { + "err": 0.002549, + "vmin": 0.41394 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.32 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/gf180/sW2_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW2_sL2/target.spice new file mode 100644 index 00000000..709d6a28 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW2_sL2/target.spice @@ -0,0 +1,7 @@ +.subckt C13_gf180_sW2_sL2 VSS IIN1 IOUT1 IB1 +MM1 IB1 IB1 VSS VSS nfet_03v3 w=1u l=1.12u nf=2 m=1 +MM2 IIN1 IB1 net15 VSS nfet_03v3 w=4u l=1.12u nf=8 m=1 +MM3 net15 IIN1 VSS VSS nfet_03v3 w=4u l=1.12u nf=8 m=1 +MM4 IOUT1 IB1 net14 VSS nfet_03v3 w=4u l=1.12u nf=8 m=1 +MM5 net14 IIN1 VSS VSS nfet_03v3 w=4u l=1.12u nf=8 m=1 +.ends C13_gf180_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C13/gf180/sW2_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW2_sL2/target_lvs.spice new file mode 100644 index 00000000..d3036099 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW2_sL2/target_lvs.spice @@ -0,0 +1,36 @@ +.subckt C13_gf180_sW2_sL2 VSS IIN1 IOUT1 IB1 +MM1_f0 IB1 IB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM1_f1 IB1 IB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM2_f0 IIN1 IB1 net15 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f1 IIN1 IB1 net15 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f2 IIN1 IB1 net15 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f3 IIN1 IB1 net15 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f4 IIN1 IB1 net15 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f5 IIN1 IB1 net15 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f6 IIN1 IB1 net15 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f7 IIN1 IB1 net15 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f0 net15 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f1 net15 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f2 net15 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f3 net15 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f4 net15 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f5 net15 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f6 net15 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f7 net15 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM4_f0 IOUT1 IB1 net14 VSS nfet_03v3 w=0.5u l=1.12u +MM4_f1 IOUT1 IB1 net14 VSS nfet_03v3 w=0.5u l=1.12u +MM4_f2 IOUT1 IB1 net14 VSS nfet_03v3 w=0.5u l=1.12u +MM4_f3 IOUT1 IB1 net14 VSS nfet_03v3 w=0.5u l=1.12u +MM4_f4 IOUT1 IB1 net14 VSS nfet_03v3 w=0.5u l=1.12u +MM4_f5 IOUT1 IB1 net14 VSS nfet_03v3 w=0.5u l=1.12u +MM4_f6 IOUT1 IB1 net14 VSS nfet_03v3 w=0.5u l=1.12u +MM4_f7 IOUT1 IB1 net14 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f0 net14 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM5_f1 net14 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM5_f2 net14 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM5_f3 net14 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM5_f4 net14 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM5_f5 net14 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM5_f6 net14 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM5_f7 net14 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +.ends C13_gf180_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C13/gf180/sW2_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW2_sL2/testbench.spice new file mode 100644 index 00000000..f3c45fbe --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/gf180/sW2_sL2/testbench.spice @@ -0,0 +1,26 @@ +X1 VSS IIN1 IOUT1 IB1 C13_gf180_sW2_sL2 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIIN1 VDDB IIN1 2e-05 +IIB1 VDDB IB1 2e-05 +.nodeset v(IIN1)=0.99 v(IB1)=0.99 + +VOUT IOUT1 0 3.3 +.control +dc VOUT 3.3 0 -0.00825 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=1.86 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.03 cross=last +meas dc dev_at_vdd find dev at=3.2835 +let gout = deriv(iout) +meas dc gout_t find gout at=1.86 +let rout_v = 1/gout +meas dc rout_t find rout_v at=1.86 +echo vout_test = 1.86 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1.5_sL1.5/case.json new file mode 100644 index 00000000..dc665540 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1.5_sL1.5/case.json @@ -0,0 +1,170 @@ +{ + "case_id": "C13_ihp130_sW1.5_sL1.5", + "circuit_id": "C13", + "pdk": "ihp130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "dut_name": "C13_ihp130_sW1.5_sL1.5", + "ports": [ + "VSS", + "IIN1", + "IOUT1", + "IB1" + ], + "sizing": { + "M1": { + "w": 0.75, + "l": 0.78, + "nf": 1 + }, + "M2": { + "w": 3.0, + "l": 0.78, + "nf": 4 + }, + "M3": { + "w": 3.0, + "l": 0.78, + "nf": 4 + }, + "M4": { + "w": 3.0, + "l": 0.78, + "nf": 4 + }, + "M5": { + "w": 3.0, + "l": 0.78, + "nf": 4 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VDD" + }, + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 0.6, + "tol": 0.03, + "vout_test": 0.73 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "unit width scaled (nf kept)", + "devices": { + "M1": { + "w0": 0.5, + "l0": 0.52, + "nf0": 1, + "uw0": 0.5, + "w": 0.75, + "l": 0.78, + "nf": 1, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.78, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.78, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.78, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.78, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "f941650ac44f4d6f", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1.5_sL1.5/manifest.json new file mode 100644 index 00000000..fe6b12e2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "42a4e54a4553e4b656e6e99a219494f8c13ecee3076b679c47a69c76d6856900", + "qualification.json": "603ee2c483525252ee04cf11ea19882b0b0c64674e4526164cb0cea3ff57c6b7", + "specs.json": "4fe0aa117fb127a2e97d2024c75f112051c48dd9a4bf58051ec24f1a3821f207", + "target.spice": "1535aecb07df43d8359b4fcddad93f132dc2d1ed177599f8b85548d5f537639d", + "target_lvs.spice": "06f12863d04ad38f14ea5084917cb05cb0041714a35ff3a2d1ecb1021018ef31", + "testbench.spice": "ea85e25f18febf79a0d5ffb1e72086d0fd14f0e00190925fae839b58c9817416" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1.5_sL1.5/qualification.json new file mode 100644 index 00000000..f7bb2dcb --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1.5_sL1.5/qualification.json @@ -0,0 +1,127 @@ +{ + "case_id": "C13_ihp130_sW1.5_sL1.5", + "circuit_id": "C13", + "pdk": "ihp130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "unit width scaled (nf kept)", + "devices": { + "M1": { + "w0": 0.5, + "l0": 0.52, + "nf0": 1, + "uw0": 0.5, + "w": 0.75, + "l": 0.78, + "nf": 1, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.78, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.78, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.78, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.78, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "f941650ac44f4d6f", + "mirror_pass1": { + "vmin": 0.269955, + "status": "passed", + "vout_test": 0.73 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.37 + }, + "_frozen_from": { + "schematic": { + "err": 0.013075, + "vmin": 0.269955 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.48 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.7, + "schematic_measures": { + "iout_t": 2.02615e-05, + "err": 0.013075, + "vmin": 0.269955, + "dev_at_vdd": 0.02656023, + "gout_t": 7.633454e-07, + "rout_t": 1310028.0, + "vout_test": 0.73, + "rout_nom": 1310028.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1.5_sL1.5/specs.json new file mode 100644 index 00000000..82055dc6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1.5_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.37 + }, + "_frozen_from": { + "schematic": { + "err": 0.013075, + "vmin": 0.269955 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.48 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1.5_sL1.5/target.spice new file mode 100644 index 00000000..b0802fef --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1.5_sL1.5/target.spice @@ -0,0 +1,7 @@ +.subckt C13_ihp130_sW1.5_sL1.5 VSS IIN1 IOUT1 IB1 +XM1 IB1 IB1 VSS VSS sg13_lv_nmos w=0.75u l=0.78u ng=1 m=1 +XM2 IIN1 IB1 net15 VSS sg13_lv_nmos w=3u l=0.78u ng=4 m=1 +XM3 net15 IIN1 VSS VSS sg13_lv_nmos w=3u l=0.78u ng=4 m=1 +XM4 IOUT1 IB1 net14 VSS sg13_lv_nmos w=3u l=0.78u ng=4 m=1 +XM5 net14 IIN1 VSS VSS sg13_lv_nmos w=3u l=0.78u ng=4 m=1 +.ends C13_ihp130_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..1c16cea1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1.5_sL1.5/target_lvs.spice @@ -0,0 +1,19 @@ +.subckt C13_ihp130_sW1.5_sL1.5 VSS IIN1 IOUT1 IB1 +XM1_f0 IB1 IB1 VSS VSS sg13_lv_nmos w=0.75u l=0.78u +XM2_f0 IIN1 IB1 net15 VSS sg13_lv_nmos w=0.75u l=0.78u +XM2_f1 IIN1 IB1 net15 VSS sg13_lv_nmos w=0.75u l=0.78u +XM2_f2 IIN1 IB1 net15 VSS sg13_lv_nmos w=0.75u l=0.78u +XM2_f3 IIN1 IB1 net15 VSS sg13_lv_nmos w=0.75u l=0.78u +XM3_f0 net15 IIN1 VSS VSS sg13_lv_nmos w=0.75u l=0.78u +XM3_f1 net15 IIN1 VSS VSS sg13_lv_nmos w=0.75u l=0.78u +XM3_f2 net15 IIN1 VSS VSS sg13_lv_nmos w=0.75u l=0.78u +XM3_f3 net15 IIN1 VSS VSS sg13_lv_nmos w=0.75u l=0.78u +XM4_f0 IOUT1 IB1 net14 VSS sg13_lv_nmos w=0.75u l=0.78u +XM4_f1 IOUT1 IB1 net14 VSS sg13_lv_nmos w=0.75u l=0.78u +XM4_f2 IOUT1 IB1 net14 VSS sg13_lv_nmos w=0.75u l=0.78u +XM4_f3 IOUT1 IB1 net14 VSS sg13_lv_nmos w=0.75u l=0.78u +XM5_f0 net14 IIN1 VSS VSS sg13_lv_nmos w=0.75u l=0.78u +XM5_f1 net14 IIN1 VSS VSS sg13_lv_nmos w=0.75u l=0.78u +XM5_f2 net14 IIN1 VSS VSS sg13_lv_nmos w=0.75u l=0.78u +XM5_f3 net14 IIN1 VSS VSS sg13_lv_nmos w=0.75u l=0.78u +.ends C13_ihp130_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1.5_sL1.5/testbench.spice new file mode 100644 index 00000000..4167b8af --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1.5_sL1.5/testbench.spice @@ -0,0 +1,26 @@ +X1 VSS IIN1 IOUT1 IB1 C13_ihp130_sW1.5_sL1.5 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIIN1 VDDB IIN1 2e-05 +IIB1 VDDB IB1 2e-05 +.nodeset v(IIN1)=0.36 v(IB1)=0.36 + +VOUT IOUT1 0 1.2 +.control +dc VOUT 1.2 0 -0.003 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=0.73 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.03 cross=last +meas dc dev_at_vdd find dev at=1.194 +let gout = deriv(iout) +meas dc gout_t find gout at=0.73 +let rout_v = 1/gout +meas dc rout_t find rout_v at=0.73 +echo vout_test = 0.73 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1.5_sL1/case.json new file mode 100644 index 00000000..86da42c5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1.5_sL1/case.json @@ -0,0 +1,170 @@ +{ + "case_id": "C13_ihp130_sW1.5_sL1", + "circuit_id": "C13", + "pdk": "ihp130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "dut_name": "C13_ihp130_sW1.5_sL1", + "ports": [ + "VSS", + "IIN1", + "IOUT1", + "IB1" + ], + "sizing": { + "M1": { + "w": 0.75, + "l": 0.52, + "nf": 1 + }, + "M2": { + "w": 3.0, + "l": 0.52, + "nf": 4 + }, + "M3": { + "w": 3.0, + "l": 0.52, + "nf": 4 + }, + "M4": { + "w": 3.0, + "l": 0.52, + "nf": 4 + }, + "M5": { + "w": 3.0, + "l": 0.52, + "nf": 4 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VDD" + }, + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 0.6, + "tol": 0.03, + "vout_test": 0.73 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "unit width scaled (nf kept)", + "devices": { + "M1": { + "w0": 0.5, + "l0": 0.52, + "nf0": 1, + "uw0": 0.5, + "w": 0.75, + "l": 0.52, + "nf": 1, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.52, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.52, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.52, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.52, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "34e3b673916c0cb0", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1.5_sL1/manifest.json new file mode 100644 index 00000000..3ad8169c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "1136fcfadcd3d47aa64c49ddd2394a14ac62bf6b91c935461232d072d7b1dfd0", + "qualification.json": "7a1e2ff3f7ac53ba962461b7d14b0fa1801a296df15e328ec1b4504c7e95e8c9", + "specs.json": "a63303f7c76fdbdb9ff97e4e8b3138ce86ca96c7c49cf83c9adc506b91010191", + "target.spice": "f9402dc63c00d30f57380815571649f26e302a9f0450cc6e3a3632ddd6030c21", + "target_lvs.spice": "5972758903ee112cf227fbe4fdd8b9bbfce0be8b0c32c799d0444450d93853e2", + "testbench.spice": "8d2553dbdf777e116166312f0441ac1709ac9282d413f419cdd9e773d4134b9a" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1.5_sL1/qualification.json new file mode 100644 index 00000000..c32ebba8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1.5_sL1/qualification.json @@ -0,0 +1,127 @@ +{ + "case_id": "C13_ihp130_sW1.5_sL1", + "circuit_id": "C13", + "pdk": "ihp130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "unit width scaled (nf kept)", + "devices": { + "M1": { + "w0": 0.5, + "l0": 0.52, + "nf0": 1, + "uw0": 0.5, + "w": 0.75, + "l": 0.52, + "nf": 1, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.52, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.52, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.52, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.52, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "34e3b673916c0cb0", + "mirror_pass1": { + "vmin": 0.2513401, + "status": "passed", + "vout_test": 0.73 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.3513 + }, + "_frozen_from": { + "schematic": { + "err": 0.0188565, + "vmin": 0.2513401 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.48 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.6, + "schematic_measures": { + "iout_t": 2.037713e-05, + "err": 0.0188565, + "vmin": 0.2513401, + "dev_at_vdd": 0.03790745, + "gout_t": 1.069849e-06, + "rout_t": 934715.0, + "vout_test": 0.73, + "rout_nom": 934715.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1.5_sL1/specs.json new file mode 100644 index 00000000..3a166a86 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1.5_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.3513 + }, + "_frozen_from": { + "schematic": { + "err": 0.0188565, + "vmin": 0.2513401 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.48 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1.5_sL1/target.spice new file mode 100644 index 00000000..a27b7510 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1.5_sL1/target.spice @@ -0,0 +1,7 @@ +.subckt C13_ihp130_sW1.5_sL1 VSS IIN1 IOUT1 IB1 +XM1 IB1 IB1 VSS VSS sg13_lv_nmos w=0.75u l=0.52u ng=1 m=1 +XM2 IIN1 IB1 net15 VSS sg13_lv_nmos w=3u l=0.52u ng=4 m=1 +XM3 net15 IIN1 VSS VSS sg13_lv_nmos w=3u l=0.52u ng=4 m=1 +XM4 IOUT1 IB1 net14 VSS sg13_lv_nmos w=3u l=0.52u ng=4 m=1 +XM5 net14 IIN1 VSS VSS sg13_lv_nmos w=3u l=0.52u ng=4 m=1 +.ends C13_ihp130_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1.5_sL1/target_lvs.spice new file mode 100644 index 00000000..1e7d77f2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1.5_sL1/target_lvs.spice @@ -0,0 +1,19 @@ +.subckt C13_ihp130_sW1.5_sL1 VSS IIN1 IOUT1 IB1 +XM1_f0 IB1 IB1 VSS VSS sg13_lv_nmos w=0.75u l=0.52u +XM2_f0 IIN1 IB1 net15 VSS sg13_lv_nmos w=0.75u l=0.52u +XM2_f1 IIN1 IB1 net15 VSS sg13_lv_nmos w=0.75u l=0.52u +XM2_f2 IIN1 IB1 net15 VSS sg13_lv_nmos w=0.75u l=0.52u +XM2_f3 IIN1 IB1 net15 VSS sg13_lv_nmos w=0.75u l=0.52u +XM3_f0 net15 IIN1 VSS VSS sg13_lv_nmos w=0.75u l=0.52u +XM3_f1 net15 IIN1 VSS VSS sg13_lv_nmos w=0.75u l=0.52u +XM3_f2 net15 IIN1 VSS VSS sg13_lv_nmos w=0.75u l=0.52u +XM3_f3 net15 IIN1 VSS VSS sg13_lv_nmos w=0.75u l=0.52u +XM4_f0 IOUT1 IB1 net14 VSS sg13_lv_nmos w=0.75u l=0.52u +XM4_f1 IOUT1 IB1 net14 VSS sg13_lv_nmos w=0.75u l=0.52u +XM4_f2 IOUT1 IB1 net14 VSS sg13_lv_nmos w=0.75u l=0.52u +XM4_f3 IOUT1 IB1 net14 VSS sg13_lv_nmos w=0.75u l=0.52u +XM5_f0 net14 IIN1 VSS VSS sg13_lv_nmos w=0.75u l=0.52u +XM5_f1 net14 IIN1 VSS VSS sg13_lv_nmos w=0.75u l=0.52u +XM5_f2 net14 IIN1 VSS VSS sg13_lv_nmos w=0.75u l=0.52u +XM5_f3 net14 IIN1 VSS VSS sg13_lv_nmos w=0.75u l=0.52u +.ends C13_ihp130_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1.5_sL1/testbench.spice new file mode 100644 index 00000000..ce31cfb2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1.5_sL1/testbench.spice @@ -0,0 +1,26 @@ +X1 VSS IIN1 IOUT1 IB1 C13_ihp130_sW1.5_sL1 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIIN1 VDDB IIN1 2e-05 +IIB1 VDDB IB1 2e-05 +.nodeset v(IIN1)=0.36 v(IB1)=0.36 + +VOUT IOUT1 0 1.2 +.control +dc VOUT 1.2 0 -0.003 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=0.73 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.03 cross=last +meas dc dev_at_vdd find dev at=1.194 +let gout = deriv(iout) +meas dc gout_t find gout at=0.73 +let rout_v = 1/gout +meas dc rout_t find rout_v at=0.73 +echo vout_test = 0.73 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1.5_sL2/case.json new file mode 100644 index 00000000..4ef2ddb1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1.5_sL2/case.json @@ -0,0 +1,170 @@ +{ + "case_id": "C13_ihp130_sW1.5_sL2", + "circuit_id": "C13", + "pdk": "ihp130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "dut_name": "C13_ihp130_sW1.5_sL2", + "ports": [ + "VSS", + "IIN1", + "IOUT1", + "IB1" + ], + "sizing": { + "M1": { + "w": 0.75, + "l": 1.04, + "nf": 1 + }, + "M2": { + "w": 3.0, + "l": 1.04, + "nf": 4 + }, + "M3": { + "w": 3.0, + "l": 1.04, + "nf": 4 + }, + "M4": { + "w": 3.0, + "l": 1.04, + "nf": 4 + }, + "M5": { + "w": 3.0, + "l": 1.04, + "nf": 4 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VDD" + }, + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 0.6, + "tol": 0.03, + "vout_test": 0.75 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "unit width scaled (nf kept)", + "devices": { + "M1": { + "w0": 0.5, + "l0": 0.52, + "nf0": 1, + "uw0": 0.5, + "w": 0.75, + "l": 1.04, + "nf": 1, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.04, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.04, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.04, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.04, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "f14cb069a03f1fd1", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1.5_sL2/manifest.json new file mode 100644 index 00000000..16d97728 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "81f58b85ec458c6b17ae5b9df689bf23d1fb2291d9167df5197624453251521a", + "qualification.json": "021436875327d1dc4ebab3f7cb2cc251174be544841c11b6c24b782ea54ed577", + "specs.json": "81a300697956f53e3a5b73fb89b3c13779fb196b36ca62bfb66995abef678f08", + "target.spice": "af6e5b13fe4119fab66ecd36f57ac5133fd30982611b3d1b2c7724d7b36054ad", + "target_lvs.spice": "1f811155d9db21e98d020e72c69c8ce0938b910268a7f62f67bbed095eb35ea6", + "testbench.spice": "768228f81392f867385e4d8e5b339eed8f2b05da3173bde250134bba66444fb7" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1.5_sL2/qualification.json new file mode 100644 index 00000000..29d8c0ee --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1.5_sL2/qualification.json @@ -0,0 +1,127 @@ +{ + "case_id": "C13_ihp130_sW1.5_sL2", + "circuit_id": "C13", + "pdk": "ihp130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "unit width scaled (nf kept)", + "devices": { + "M1": { + "w0": 0.5, + "l0": 0.52, + "nf0": 1, + "uw0": 0.5, + "w": 0.75, + "l": 1.04, + "nf": 1, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.04, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.04, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.04, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.04, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "f14cb069a03f1fd1", + "mirror_pass1": { + "vmin": 0.2927887, + "status": "passed", + "vout_test": 0.75 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.3928 + }, + "_frozen_from": { + "schematic": { + "err": 0.010306, + "vmin": 0.2927887 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.48 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.6, + "schematic_measures": { + "iout_t": 2.020612e-05, + "err": 0.010306, + "vmin": 0.2927887, + "dev_at_vdd": 0.02019321, + "gout_t": 5.809266e-07, + "rout_t": 1721388.0, + "vout_test": 0.75, + "rout_nom": 1721388.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1.5_sL2/specs.json new file mode 100644 index 00000000..7bedfa4b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1.5_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.3928 + }, + "_frozen_from": { + "schematic": { + "err": 0.010306, + "vmin": 0.2927887 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.48 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1.5_sL2/target.spice new file mode 100644 index 00000000..039b9f06 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1.5_sL2/target.spice @@ -0,0 +1,7 @@ +.subckt C13_ihp130_sW1.5_sL2 VSS IIN1 IOUT1 IB1 +XM1 IB1 IB1 VSS VSS sg13_lv_nmos w=0.75u l=1.04u ng=1 m=1 +XM2 IIN1 IB1 net15 VSS sg13_lv_nmos w=3u l=1.04u ng=4 m=1 +XM3 net15 IIN1 VSS VSS sg13_lv_nmos w=3u l=1.04u ng=4 m=1 +XM4 IOUT1 IB1 net14 VSS sg13_lv_nmos w=3u l=1.04u ng=4 m=1 +XM5 net14 IIN1 VSS VSS sg13_lv_nmos w=3u l=1.04u ng=4 m=1 +.ends C13_ihp130_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1.5_sL2/target_lvs.spice new file mode 100644 index 00000000..99fcbe48 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1.5_sL2/target_lvs.spice @@ -0,0 +1,19 @@ +.subckt C13_ihp130_sW1.5_sL2 VSS IIN1 IOUT1 IB1 +XM1_f0 IB1 IB1 VSS VSS sg13_lv_nmos w=0.75u l=1.04u +XM2_f0 IIN1 IB1 net15 VSS sg13_lv_nmos w=0.75u l=1.04u +XM2_f1 IIN1 IB1 net15 VSS sg13_lv_nmos w=0.75u l=1.04u +XM2_f2 IIN1 IB1 net15 VSS sg13_lv_nmos w=0.75u l=1.04u +XM2_f3 IIN1 IB1 net15 VSS sg13_lv_nmos w=0.75u l=1.04u +XM3_f0 net15 IIN1 VSS VSS sg13_lv_nmos w=0.75u l=1.04u +XM3_f1 net15 IIN1 VSS VSS sg13_lv_nmos w=0.75u l=1.04u +XM3_f2 net15 IIN1 VSS VSS sg13_lv_nmos w=0.75u l=1.04u +XM3_f3 net15 IIN1 VSS VSS sg13_lv_nmos w=0.75u l=1.04u +XM4_f0 IOUT1 IB1 net14 VSS sg13_lv_nmos w=0.75u l=1.04u +XM4_f1 IOUT1 IB1 net14 VSS sg13_lv_nmos w=0.75u l=1.04u +XM4_f2 IOUT1 IB1 net14 VSS sg13_lv_nmos w=0.75u l=1.04u +XM4_f3 IOUT1 IB1 net14 VSS sg13_lv_nmos w=0.75u l=1.04u +XM5_f0 net14 IIN1 VSS VSS sg13_lv_nmos w=0.75u l=1.04u +XM5_f1 net14 IIN1 VSS VSS sg13_lv_nmos w=0.75u l=1.04u +XM5_f2 net14 IIN1 VSS VSS sg13_lv_nmos w=0.75u l=1.04u +XM5_f3 net14 IIN1 VSS VSS sg13_lv_nmos w=0.75u l=1.04u +.ends C13_ihp130_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1.5_sL2/testbench.spice new file mode 100644 index 00000000..a7e50432 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1.5_sL2/testbench.spice @@ -0,0 +1,26 @@ +X1 VSS IIN1 IOUT1 IB1 C13_ihp130_sW1.5_sL2 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIIN1 VDDB IIN1 2e-05 +IIB1 VDDB IB1 2e-05 +.nodeset v(IIN1)=0.36 v(IB1)=0.36 + +VOUT IOUT1 0 1.2 +.control +dc VOUT 1.2 0 -0.003 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=0.75 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.03 cross=last +meas dc dev_at_vdd find dev at=1.194 +let gout = deriv(iout) +meas dc gout_t find gout at=0.75 +let rout_v = 1/gout +meas dc rout_t find rout_v at=0.75 +echo vout_test = 0.75 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1_sL1.5/case.json new file mode 100644 index 00000000..e8929595 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1_sL1.5/case.json @@ -0,0 +1,170 @@ +{ + "case_id": "C13_ihp130_sW1_sL1.5", + "circuit_id": "C13", + "pdk": "ihp130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "dut_name": "C13_ihp130_sW1_sL1.5", + "ports": [ + "VSS", + "IIN1", + "IOUT1", + "IB1" + ], + "sizing": { + "M1": { + "w": 0.5, + "l": 0.78, + "nf": 1 + }, + "M2": { + "w": 2.0, + "l": 0.78, + "nf": 4 + }, + "M3": { + "w": 2.0, + "l": 0.78, + "nf": 4 + }, + "M4": { + "w": 2.0, + "l": 0.78, + "nf": 4 + }, + "M5": { + "w": 2.0, + "l": 0.78, + "nf": 4 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VDD" + }, + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 0.6, + "tol": 0.03, + "vout_test": 0.76 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 0.5, + "l0": 0.52, + "nf0": 1, + "uw0": 0.5, + "w": 0.5, + "l": 0.78, + "nf": 1, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.78, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.78, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.78, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.78, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "4f4a9ce82de22f07", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1_sL1.5/manifest.json new file mode 100644 index 00000000..5c3048cc --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "4b188e6cd046f5b1165f10a37d0aeac38ee476a385308a148128369902195afc", + "qualification.json": "ddd4467cb509e91daa05e50bd39081884e0d1eb1bc24c1149c28645455d830f7", + "specs.json": "b7a01c66666d5d061df7abfee5a4b4e008ecee00eea3341bb7ce3ff2b1910129", + "target.spice": "214829b8ce58d92fcb1c4c042699c5f4ca6b007ff0b03ffa4ddc8445b72b90c9", + "target_lvs.spice": "4602c5f8cfe4cdcb94d03cbaa81259d5f2fc0303b4fe55178c9f62151c135b10", + "testbench.spice": "b3d3ed36b8dcf3acf22313c3d95149fde69dd9ab45d72469b56eb5ee10e6808f" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1_sL1.5/qualification.json new file mode 100644 index 00000000..9b465569 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1_sL1.5/qualification.json @@ -0,0 +1,127 @@ +{ + "case_id": "C13_ihp130_sW1_sL1.5", + "circuit_id": "C13", + "pdk": "ihp130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 0.5, + "l0": 0.52, + "nf0": 1, + "uw0": 0.5, + "w": 0.5, + "l": 0.78, + "nf": 1, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.78, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.78, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.78, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.78, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "4f4a9ce82de22f07", + "mirror_pass1": { + "vmin": 0.3111346, + "status": "passed", + "vout_test": 0.76 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.4111 + }, + "_frozen_from": { + "schematic": { + "err": 0.0096275, + "vmin": 0.3111346 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.48 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.6, + "schematic_measures": { + "iout_t": 2.019255e-05, + "err": 0.0096275, + "vmin": 0.3111346, + "dev_at_vdd": 0.01941545, + "gout_t": 5.859922e-07, + "rout_t": 1706515.0, + "vout_test": 0.76, + "rout_nom": 1706515.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1_sL1.5/specs.json new file mode 100644 index 00000000..f5f30769 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.4111 + }, + "_frozen_from": { + "schematic": { + "err": 0.0096275, + "vmin": 0.3111346 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.48 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1_sL1.5/target.spice new file mode 100644 index 00000000..35d1c3ed --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1_sL1.5/target.spice @@ -0,0 +1,7 @@ +.subckt C13_ihp130_sW1_sL1.5 VSS IIN1 IOUT1 IB1 +XM1 IB1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=0.78u ng=1 m=1 +XM2 IIN1 IB1 net15 VSS sg13_lv_nmos w=2u l=0.78u ng=4 m=1 +XM3 net15 IIN1 VSS VSS sg13_lv_nmos w=2u l=0.78u ng=4 m=1 +XM4 IOUT1 IB1 net14 VSS sg13_lv_nmos w=2u l=0.78u ng=4 m=1 +XM5 net14 IIN1 VSS VSS sg13_lv_nmos w=2u l=0.78u ng=4 m=1 +.ends C13_ihp130_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1_sL1.5/target_lvs.spice new file mode 100644 index 00000000..31fc8ffe --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1_sL1.5/target_lvs.spice @@ -0,0 +1,19 @@ +.subckt C13_ihp130_sW1_sL1.5 VSS IIN1 IOUT1 IB1 +XM1_f0 IB1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM2_f0 IIN1 IB1 net15 VSS sg13_lv_nmos w=0.5u l=0.78u +XM2_f1 IIN1 IB1 net15 VSS sg13_lv_nmos w=0.5u l=0.78u +XM2_f2 IIN1 IB1 net15 VSS sg13_lv_nmos w=0.5u l=0.78u +XM2_f3 IIN1 IB1 net15 VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f0 net15 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f1 net15 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f2 net15 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f3 net15 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM4_f0 IOUT1 IB1 net14 VSS sg13_lv_nmos w=0.5u l=0.78u +XM4_f1 IOUT1 IB1 net14 VSS sg13_lv_nmos w=0.5u l=0.78u +XM4_f2 IOUT1 IB1 net14 VSS sg13_lv_nmos w=0.5u l=0.78u +XM4_f3 IOUT1 IB1 net14 VSS sg13_lv_nmos w=0.5u l=0.78u +XM5_f0 net14 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM5_f1 net14 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM5_f2 net14 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM5_f3 net14 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +.ends C13_ihp130_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1_sL1.5/testbench.spice new file mode 100644 index 00000000..c553e36c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1_sL1.5/testbench.spice @@ -0,0 +1,26 @@ +X1 VSS IIN1 IOUT1 IB1 C13_ihp130_sW1_sL1.5 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIIN1 VDDB IIN1 2e-05 +IIB1 VDDB IB1 2e-05 +.nodeset v(IIN1)=0.36 v(IB1)=0.36 + +VOUT IOUT1 0 1.2 +.control +dc VOUT 1.2 0 -0.003 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=0.76 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.03 cross=last +meas dc dev_at_vdd find dev at=1.194 +let gout = deriv(iout) +meas dc gout_t find gout at=0.76 +let rout_v = 1/gout +meas dc rout_t find rout_v at=0.76 +echo vout_test = 0.76 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1_sL1/case.json new file mode 100644 index 00000000..22e92f31 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1_sL1/case.json @@ -0,0 +1,170 @@ +{ + "case_id": "C13_ihp130_sW1_sL1", + "circuit_id": "C13", + "pdk": "ihp130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "dut_name": "C13_ihp130_sW1_sL1", + "ports": [ + "VSS", + "IIN1", + "IOUT1", + "IB1" + ], + "sizing": { + "M1": { + "w": 0.5, + "l": 0.52, + "nf": 1 + }, + "M2": { + "w": 2.0, + "l": 0.52, + "nf": 4 + }, + "M3": { + "w": 2.0, + "l": 0.52, + "nf": 4 + }, + "M4": { + "w": 2.0, + "l": 0.52, + "nf": 4 + }, + "M5": { + "w": 2.0, + "l": 0.52, + "nf": 4 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VDD" + }, + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 0.6, + "tol": 0.03, + "vout_test": 0.74 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 0.5, + "l0": 0.52, + "nf0": 1, + "uw0": 0.5, + "w": 0.5, + "l": 0.52, + "nf": 1, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "1e3699f2b75dcc6b", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1_sL1/manifest.json new file mode 100644 index 00000000..72facf4c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "f6339de07e980c134be61fc69cae5d3ffed96955159c137c860e8696b8db1eef", + "qualification.json": "25e15435e7506221c8d26bfdac90c01921072fc7656556ea8a80ce2dbf654be6", + "specs.json": "11853bf9a8a9357c1d5915e11bab46985dc5f1d3b22e4d75f13deb1f6dafec08", + "target.spice": "03112b22ea169ae29edfc048d9e8fb1d40a555144d9b093733308a620b4b85ac", + "target_lvs.spice": "db38a38710ec043d1dd48c28fe51bf820498b3ecc2a59ca29a0f9897e9951eb4", + "testbench.spice": "0986f50815a37c797c5cf4241c76ffc15168326a9ac5ac9b90b5e32e69d09ce3" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1_sL1/qualification.json new file mode 100644 index 00000000..17adaf02 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1_sL1/qualification.json @@ -0,0 +1,127 @@ +{ + "case_id": "C13_ihp130_sW1_sL1", + "circuit_id": "C13", + "pdk": "ihp130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 0.5, + "l0": 0.52, + "nf0": 1, + "uw0": 0.5, + "w": 0.5, + "l": 0.52, + "nf": 1, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "1e3699f2b75dcc6b", + "mirror_pass1": { + "vmin": 0.2824946, + "status": "passed", + "vout_test": 0.74 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.3825 + }, + "_frozen_from": { + "schematic": { + "err": 0.013431, + "vmin": 0.2824946 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.48 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.6, + "schematic_measures": { + "iout_t": 2.026862e-05, + "err": 0.013431, + "vmin": 0.2824946, + "dev_at_vdd": 0.02833661, + "gout_t": 8.5428e-07, + "rout_t": 1170581.0, + "vout_test": 0.74, + "rout_nom": 1170581.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1_sL1/specs.json new file mode 100644 index 00000000..20ade76e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.3825 + }, + "_frozen_from": { + "schematic": { + "err": 0.013431, + "vmin": 0.2824946 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.48 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1_sL1/target.spice new file mode 100644 index 00000000..90998917 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1_sL1/target.spice @@ -0,0 +1,7 @@ +.subckt C13_ihp130_sW1_sL1 VSS IIN1 IOUT1 IB1 +XM1 IB1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u ng=1 m=1 +XM2 IIN1 IB1 net15 VSS sg13_lv_nmos w=2u l=0.52u ng=4 m=1 +XM3 net15 IIN1 VSS VSS sg13_lv_nmos w=2u l=0.52u ng=4 m=1 +XM4 IOUT1 IB1 net14 VSS sg13_lv_nmos w=2u l=0.52u ng=4 m=1 +XM5 net14 IIN1 VSS VSS sg13_lv_nmos w=2u l=0.52u ng=4 m=1 +.ends C13_ihp130_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1_sL1/target_lvs.spice new file mode 100644 index 00000000..0da5635c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1_sL1/target_lvs.spice @@ -0,0 +1,19 @@ +.subckt C13_ihp130_sW1_sL1 VSS IIN1 IOUT1 IB1 +XM1_f0 IB1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f0 IIN1 IB1 net15 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f1 IIN1 IB1 net15 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f2 IIN1 IB1 net15 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f3 IIN1 IB1 net15 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f0 net15 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f1 net15 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f2 net15 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f3 net15 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f0 IOUT1 IB1 net14 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f1 IOUT1 IB1 net14 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f2 IOUT1 IB1 net14 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f3 IOUT1 IB1 net14 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f0 net14 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f1 net14 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f2 net14 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f3 net14 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +.ends C13_ihp130_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1_sL1/testbench.spice new file mode 100644 index 00000000..9b385ce5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1_sL1/testbench.spice @@ -0,0 +1,26 @@ +X1 VSS IIN1 IOUT1 IB1 C13_ihp130_sW1_sL1 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIIN1 VDDB IIN1 2e-05 +IIB1 VDDB IB1 2e-05 +.nodeset v(IIN1)=0.36 v(IB1)=0.36 + +VOUT IOUT1 0 1.2 +.control +dc VOUT 1.2 0 -0.003 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=0.74 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.03 cross=last +meas dc dev_at_vdd find dev at=1.194 +let gout = deriv(iout) +meas dc gout_t find gout at=0.74 +let rout_v = 1/gout +meas dc rout_t find rout_v at=0.74 +echo vout_test = 0.74 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1_sL2/case.json new file mode 100644 index 00000000..b0520172 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1_sL2/case.json @@ -0,0 +1,170 @@ +{ + "case_id": "C13_ihp130_sW1_sL2", + "circuit_id": "C13", + "pdk": "ihp130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "dut_name": "C13_ihp130_sW1_sL2", + "ports": [ + "VSS", + "IIN1", + "IOUT1", + "IB1" + ], + "sizing": { + "M1": { + "w": 0.5, + "l": 1.04, + "nf": 1 + }, + "M2": { + "w": 2.0, + "l": 1.04, + "nf": 4 + }, + "M3": { + "w": 2.0, + "l": 1.04, + "nf": 4 + }, + "M4": { + "w": 2.0, + "l": 1.04, + "nf": 4 + }, + "M5": { + "w": 2.0, + "l": 1.04, + "nf": 4 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VDD" + }, + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 0.6, + "tol": 0.03, + "vout_test": 0.77 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 0.5, + "l0": 0.52, + "nf0": 1, + "uw0": 0.5, + "w": 0.5, + "l": 1.04, + "nf": 1, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.04, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.04, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.04, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.04, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "870f690a2828127d", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1_sL2/manifest.json new file mode 100644 index 00000000..301f8503 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "e692f8e0d56ff1b15799f04d5a15de197d613913c44afaf5ae4b1110e5c6ae84", + "qualification.json": "b233f1b3a0bb38c7374bf2f744ffe6e4c5cb73059d56bb27e54a719c80541516", + "specs.json": "1a14d5d0d8510001e340020b5d92f19a630e46b7d69eb19a1801a8d5d2c3dbee", + "target.spice": "52f2b685a6556f7d205ee080c5e26fbddf19ad651da682214adfefdb9292b346", + "target_lvs.spice": "0937a9c3ac140936f0ea158e40a5e3e6e895b65ea672c222e44f8c9fba35ada3", + "testbench.spice": "395a24a2bb3cb2ef8ed5334c878f81f03ff39d6522b5e1a8b6e07a768afdd05a" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1_sL2/qualification.json new file mode 100644 index 00000000..0fc1c334 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1_sL2/qualification.json @@ -0,0 +1,127 @@ +{ + "case_id": "C13_ihp130_sW1_sL2", + "circuit_id": "C13", + "pdk": "ihp130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 0.5, + "l0": 0.52, + "nf0": 1, + "uw0": 0.5, + "w": 0.5, + "l": 1.04, + "nf": 1, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.04, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.04, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.04, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.04, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "870f690a2828127d", + "mirror_pass1": { + "vmin": 0.341118, + "status": "passed", + "vout_test": 0.77 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.4411 + }, + "_frozen_from": { + "schematic": { + "err": 0.007254, + "vmin": 0.341118 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.48 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.5, + "schematic_measures": { + "iout_t": 2.014508e-05, + "err": 0.007254, + "vmin": 0.341118, + "dev_at_vdd": 0.01455954, + "gout_t": 4.498607e-07, + "rout_t": 2222921.0, + "vout_test": 0.77, + "rout_nom": 2222921.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1_sL2/specs.json new file mode 100644 index 00000000..6689cf0b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.4411 + }, + "_frozen_from": { + "schematic": { + "err": 0.007254, + "vmin": 0.341118 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.48 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1_sL2/target.spice new file mode 100644 index 00000000..46fbc8d7 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1_sL2/target.spice @@ -0,0 +1,7 @@ +.subckt C13_ihp130_sW1_sL2 VSS IIN1 IOUT1 IB1 +XM1 IB1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u ng=1 m=1 +XM2 IIN1 IB1 net15 VSS sg13_lv_nmos w=2u l=1.04u ng=4 m=1 +XM3 net15 IIN1 VSS VSS sg13_lv_nmos w=2u l=1.04u ng=4 m=1 +XM4 IOUT1 IB1 net14 VSS sg13_lv_nmos w=2u l=1.04u ng=4 m=1 +XM5 net14 IIN1 VSS VSS sg13_lv_nmos w=2u l=1.04u ng=4 m=1 +.ends C13_ihp130_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1_sL2/target_lvs.spice new file mode 100644 index 00000000..f872749e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1_sL2/target_lvs.spice @@ -0,0 +1,19 @@ +.subckt C13_ihp130_sW1_sL2 VSS IIN1 IOUT1 IB1 +XM1_f0 IB1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM2_f0 IIN1 IB1 net15 VSS sg13_lv_nmos w=0.5u l=1.04u +XM2_f1 IIN1 IB1 net15 VSS sg13_lv_nmos w=0.5u l=1.04u +XM2_f2 IIN1 IB1 net15 VSS sg13_lv_nmos w=0.5u l=1.04u +XM2_f3 IIN1 IB1 net15 VSS sg13_lv_nmos w=0.5u l=1.04u +XM3_f0 net15 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM3_f1 net15 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM3_f2 net15 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM3_f3 net15 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM4_f0 IOUT1 IB1 net14 VSS sg13_lv_nmos w=0.5u l=1.04u +XM4_f1 IOUT1 IB1 net14 VSS sg13_lv_nmos w=0.5u l=1.04u +XM4_f2 IOUT1 IB1 net14 VSS sg13_lv_nmos w=0.5u l=1.04u +XM4_f3 IOUT1 IB1 net14 VSS sg13_lv_nmos w=0.5u l=1.04u +XM5_f0 net14 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM5_f1 net14 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM5_f2 net14 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM5_f3 net14 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +.ends C13_ihp130_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1_sL2/testbench.spice new file mode 100644 index 00000000..fb93d2e9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW1_sL2/testbench.spice @@ -0,0 +1,26 @@ +X1 VSS IIN1 IOUT1 IB1 C13_ihp130_sW1_sL2 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIIN1 VDDB IIN1 2e-05 +IIB1 VDDB IB1 2e-05 +.nodeset v(IIN1)=0.36 v(IB1)=0.36 + +VOUT IOUT1 0 1.2 +.control +dc VOUT 1.2 0 -0.003 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=0.77 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.03 cross=last +meas dc dev_at_vdd find dev at=1.194 +let gout = deriv(iout) +meas dc gout_t find gout at=0.77 +let rout_v = 1/gout +meas dc rout_t find rout_v at=0.77 +echo vout_test = 0.77 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW2_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW2_sL1.5/case.json new file mode 100644 index 00000000..2bf99daa --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW2_sL1.5/case.json @@ -0,0 +1,170 @@ +{ + "case_id": "C13_ihp130_sW2_sL1.5", + "circuit_id": "C13", + "pdk": "ihp130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "dut_name": "C13_ihp130_sW2_sL1.5", + "ports": [ + "VSS", + "IIN1", + "IOUT1", + "IB1" + ], + "sizing": { + "M1": { + "w": 1.0, + "l": 0.78, + "nf": 2 + }, + "M2": { + "w": 4.0, + "l": 0.78, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 0.78, + "nf": 8 + }, + "M4": { + "w": 4.0, + "l": 0.78, + "nf": 8 + }, + "M5": { + "w": 4.0, + "l": 0.78, + "nf": 8 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VDD" + }, + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 0.6, + "tol": 0.03, + "vout_test": 0.72 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 0.5, + "l0": 0.52, + "nf0": 1, + "uw0": 0.5, + "w": 1.0, + "l": 0.78, + "nf": 2, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.78, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.78, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.78, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.78, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "d595e7d146a31041", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW2_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW2_sL1.5/manifest.json new file mode 100644 index 00000000..95dde5bf --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW2_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "0e7ed4d238b4fb3edae427a2d6458f11b6d5a913010ce3f264df5378f0c2e5e8", + "qualification.json": "e68d049cc811b3187d1b01579176a86752a624146dad0a07de090d79d508ea2e", + "specs.json": "25fa53a13518e54bed053231a1ce9a36155d69953dfccb0a07c17213d844abca", + "target.spice": "30246df5c3f14d252e922b02f518df316288e62eb6349866aa8b2ff81fda2c25", + "target_lvs.spice": "f8dbe3d724c864c46f40f2825a53cd1da8f77cdd987180b0aa5d7b41622e3052", + "testbench.spice": "1150df4f568b58e9e7f36e64115cfa115a82d3265dd3103f37c2b6a2d9a75068" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW2_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW2_sL1.5/qualification.json new file mode 100644 index 00000000..a94f0a23 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW2_sL1.5/qualification.json @@ -0,0 +1,127 @@ +{ + "case_id": "C13_ihp130_sW2_sL1.5", + "circuit_id": "C13", + "pdk": "ihp130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 0.5, + "l0": 0.52, + "nf0": 1, + "uw0": 0.5, + "w": 1.0, + "l": 0.78, + "nf": 2, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.78, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.78, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.78, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.78, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "d595e7d146a31041", + "mirror_pass1": { + "vmin": 0.2463465, + "status": "passed", + "vout_test": 0.72 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.3463 + }, + "_frozen_from": { + "schematic": { + "err": 0.015422, + "vmin": 0.2463465 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.48 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 1.2, + "schematic_measures": { + "iout_t": 2.030844e-05, + "err": 0.015422, + "vmin": 0.2463465, + "dev_at_vdd": 0.03041006, + "gout_t": 8.35527e-07, + "rout_t": 1196849.0, + "vout_test": 0.72, + "rout_nom": 1196849.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW2_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW2_sL1.5/specs.json new file mode 100644 index 00000000..203c7e38 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW2_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.3463 + }, + "_frozen_from": { + "schematic": { + "err": 0.015422, + "vmin": 0.2463465 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.48 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW2_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW2_sL1.5/target.spice new file mode 100644 index 00000000..3f1e5e13 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW2_sL1.5/target.spice @@ -0,0 +1,7 @@ +.subckt C13_ihp130_sW2_sL1.5 VSS IIN1 IOUT1 IB1 +XM1 IB1 IB1 VSS VSS sg13_lv_nmos w=1u l=0.78u ng=2 m=1 +XM2 IIN1 IB1 net15 VSS sg13_lv_nmos w=4u l=0.78u ng=8 m=1 +XM3 net15 IIN1 VSS VSS sg13_lv_nmos w=4u l=0.78u ng=8 m=1 +XM4 IOUT1 IB1 net14 VSS sg13_lv_nmos w=4u l=0.78u ng=8 m=1 +XM5 net14 IIN1 VSS VSS sg13_lv_nmos w=4u l=0.78u ng=8 m=1 +.ends C13_ihp130_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW2_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW2_sL1.5/target_lvs.spice new file mode 100644 index 00000000..22d4de4d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW2_sL1.5/target_lvs.spice @@ -0,0 +1,36 @@ +.subckt C13_ihp130_sW2_sL1.5 VSS IIN1 IOUT1 IB1 +XM1_f0 IB1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM1_f1 IB1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM2_f0 IIN1 IB1 net15 VSS sg13_lv_nmos w=0.5u l=0.78u +XM2_f1 IIN1 IB1 net15 VSS sg13_lv_nmos w=0.5u l=0.78u +XM2_f2 IIN1 IB1 net15 VSS sg13_lv_nmos w=0.5u l=0.78u +XM2_f3 IIN1 IB1 net15 VSS sg13_lv_nmos w=0.5u l=0.78u +XM2_f4 IIN1 IB1 net15 VSS sg13_lv_nmos w=0.5u l=0.78u +XM2_f5 IIN1 IB1 net15 VSS sg13_lv_nmos w=0.5u l=0.78u +XM2_f6 IIN1 IB1 net15 VSS sg13_lv_nmos w=0.5u l=0.78u +XM2_f7 IIN1 IB1 net15 VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f0 net15 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f1 net15 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f2 net15 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f3 net15 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f4 net15 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f5 net15 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f6 net15 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM3_f7 net15 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM4_f0 IOUT1 IB1 net14 VSS sg13_lv_nmos w=0.5u l=0.78u +XM4_f1 IOUT1 IB1 net14 VSS sg13_lv_nmos w=0.5u l=0.78u +XM4_f2 IOUT1 IB1 net14 VSS sg13_lv_nmos w=0.5u l=0.78u +XM4_f3 IOUT1 IB1 net14 VSS sg13_lv_nmos w=0.5u l=0.78u +XM4_f4 IOUT1 IB1 net14 VSS sg13_lv_nmos w=0.5u l=0.78u +XM4_f5 IOUT1 IB1 net14 VSS sg13_lv_nmos w=0.5u l=0.78u +XM4_f6 IOUT1 IB1 net14 VSS sg13_lv_nmos w=0.5u l=0.78u +XM4_f7 IOUT1 IB1 net14 VSS sg13_lv_nmos w=0.5u l=0.78u +XM5_f0 net14 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM5_f1 net14 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM5_f2 net14 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM5_f3 net14 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM5_f4 net14 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM5_f5 net14 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM5_f6 net14 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +XM5_f7 net14 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.78u +.ends C13_ihp130_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW2_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW2_sL1.5/testbench.spice new file mode 100644 index 00000000..97dfc286 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW2_sL1.5/testbench.spice @@ -0,0 +1,26 @@ +X1 VSS IIN1 IOUT1 IB1 C13_ihp130_sW2_sL1.5 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIIN1 VDDB IIN1 2e-05 +IIB1 VDDB IB1 2e-05 +.nodeset v(IIN1)=0.36 v(IB1)=0.36 + +VOUT IOUT1 0 1.2 +.control +dc VOUT 1.2 0 -0.003 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=0.72 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.03 cross=last +meas dc dev_at_vdd find dev at=1.194 +let gout = deriv(iout) +meas dc gout_t find gout at=0.72 +let rout_v = 1/gout +meas dc rout_t find rout_v at=0.72 +echo vout_test = 0.72 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW2_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW2_sL1/case.json new file mode 100644 index 00000000..a9c62588 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW2_sL1/case.json @@ -0,0 +1,170 @@ +{ + "case_id": "C13_ihp130_sW2_sL1", + "circuit_id": "C13", + "pdk": "ihp130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "dut_name": "C13_ihp130_sW2_sL1", + "ports": [ + "VSS", + "IIN1", + "IOUT1", + "IB1" + ], + "sizing": { + "M1": { + "w": 1.0, + "l": 0.52, + "nf": 2 + }, + "M2": { + "w": 4.0, + "l": 0.52, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 0.52, + "nf": 8 + }, + "M4": { + "w": 4.0, + "l": 0.52, + "nf": 8 + }, + "M5": { + "w": 4.0, + "l": 0.52, + "nf": 8 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VDD" + }, + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 0.6, + "tol": 0.03, + "vout_test": 0.72 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 0.5, + "l0": 0.52, + "nf0": 1, + "uw0": 0.5, + "w": 1.0, + "l": 0.52, + "nf": 2, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "89f5efd015f5dcc6", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW2_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW2_sL1/manifest.json new file mode 100644 index 00000000..07c3937c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW2_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "df6ce5a5ca38489f99e3410db4eadcc9b48f06b49a32f73ac99f109c23684fe8", + "qualification.json": "161f97c098f8df27b103bb49fa941703cb104790b4d47592fa8a51fb5481ec88", + "specs.json": "57b609cfd38b944d9004689ba4ae33eb72cb93475e6a11aadcef3cea56c52abc", + "target.spice": "4afa41223e3c9e03a3bc2c0d16674c83fa863a826df1a56ea81869994e9fc88b", + "target_lvs.spice": "489b322c01952f3de96460a4f8ee6d2f404fa978f29c4fccf69b7e214e8d0bd2", + "testbench.spice": "d102ed96b287f0b7e1aaa69ff0bdf184f8c131ec9b56cb0c9586c50f5565eb68" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW2_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW2_sL1/qualification.json new file mode 100644 index 00000000..05aa54e7 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW2_sL1/qualification.json @@ -0,0 +1,127 @@ +{ + "case_id": "C13_ihp130_sW2_sL1", + "circuit_id": "C13", + "pdk": "ihp130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 0.5, + "l0": 0.52, + "nf0": 1, + "uw0": 0.5, + "w": 1.0, + "l": 0.52, + "nf": 2, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "89f5efd015f5dcc6", + "mirror_pass1": { + "vmin": 0.2329467, + "status": "passed", + "vout_test": 0.72 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.3329 + }, + "_frozen_from": { + "schematic": { + "err": 0.0216245, + "vmin": 0.2329467 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.48 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 1.2, + "schematic_measures": { + "iout_t": 2.043249e-05, + "err": 0.0216245, + "vmin": 0.2329467, + "dev_at_vdd": 0.04239439, + "gout_t": 1.153404e-06, + "rout_t": 866998.8, + "vout_test": 0.72, + "rout_nom": 866998.8, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW2_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW2_sL1/specs.json new file mode 100644 index 00000000..2aef3ffd --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW2_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.3329 + }, + "_frozen_from": { + "schematic": { + "err": 0.0216245, + "vmin": 0.2329467 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.48 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW2_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW2_sL1/target.spice new file mode 100644 index 00000000..6e1b1b90 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW2_sL1/target.spice @@ -0,0 +1,7 @@ +.subckt C13_ihp130_sW2_sL1 VSS IIN1 IOUT1 IB1 +XM1 IB1 IB1 VSS VSS sg13_lv_nmos w=1u l=0.52u ng=2 m=1 +XM2 IIN1 IB1 net15 VSS sg13_lv_nmos w=4u l=0.52u ng=8 m=1 +XM3 net15 IIN1 VSS VSS sg13_lv_nmos w=4u l=0.52u ng=8 m=1 +XM4 IOUT1 IB1 net14 VSS sg13_lv_nmos w=4u l=0.52u ng=8 m=1 +XM5 net14 IIN1 VSS VSS sg13_lv_nmos w=4u l=0.52u ng=8 m=1 +.ends C13_ihp130_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW2_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW2_sL1/target_lvs.spice new file mode 100644 index 00000000..2853cc47 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW2_sL1/target_lvs.spice @@ -0,0 +1,36 @@ +.subckt C13_ihp130_sW2_sL1 VSS IIN1 IOUT1 IB1 +XM1_f0 IB1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f1 IB1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f0 IIN1 IB1 net15 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f1 IIN1 IB1 net15 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f2 IIN1 IB1 net15 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f3 IIN1 IB1 net15 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f4 IIN1 IB1 net15 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f5 IIN1 IB1 net15 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f6 IIN1 IB1 net15 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f7 IIN1 IB1 net15 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f0 net15 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f1 net15 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f2 net15 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f3 net15 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f4 net15 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f5 net15 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f6 net15 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f7 net15 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f0 IOUT1 IB1 net14 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f1 IOUT1 IB1 net14 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f2 IOUT1 IB1 net14 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f3 IOUT1 IB1 net14 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f4 IOUT1 IB1 net14 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f5 IOUT1 IB1 net14 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f6 IOUT1 IB1 net14 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f7 IOUT1 IB1 net14 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f0 net14 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f1 net14 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f2 net14 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f3 net14 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f4 net14 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f5 net14 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f6 net14 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f7 net14 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +.ends C13_ihp130_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW2_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW2_sL1/testbench.spice new file mode 100644 index 00000000..cbbf2944 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW2_sL1/testbench.spice @@ -0,0 +1,26 @@ +X1 VSS IIN1 IOUT1 IB1 C13_ihp130_sW2_sL1 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIIN1 VDDB IIN1 2e-05 +IIB1 VDDB IB1 2e-05 +.nodeset v(IIN1)=0.36 v(IB1)=0.36 + +VOUT IOUT1 0 1.2 +.control +dc VOUT 1.2 0 -0.003 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=0.72 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.03 cross=last +meas dc dev_at_vdd find dev at=1.194 +let gout = deriv(iout) +meas dc gout_t find gout at=0.72 +let rout_v = 1/gout +meas dc rout_t find rout_v at=0.72 +echo vout_test = 0.72 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW2_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW2_sL2/case.json new file mode 100644 index 00000000..c2a4e12d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW2_sL2/case.json @@ -0,0 +1,170 @@ +{ + "case_id": "C13_ihp130_sW2_sL2", + "circuit_id": "C13", + "pdk": "ihp130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "dut_name": "C13_ihp130_sW2_sL2", + "ports": [ + "VSS", + "IIN1", + "IOUT1", + "IB1" + ], + "sizing": { + "M1": { + "w": 1.0, + "l": 1.04, + "nf": 2 + }, + "M2": { + "w": 4.0, + "l": 1.04, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 1.04, + "nf": 8 + }, + "M4": { + "w": 4.0, + "l": 1.04, + "nf": 8 + }, + "M5": { + "w": 4.0, + "l": 1.04, + "nf": 8 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VDD" + }, + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 0.6, + "tol": 0.03, + "vout_test": 0.73 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 0.5, + "l0": 0.52, + "nf0": 1, + "uw0": 0.5, + "w": 1.0, + "l": 1.04, + "nf": 2, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.04, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.04, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.04, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.04, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "db11b7917011c8fb", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW2_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW2_sL2/manifest.json new file mode 100644 index 00000000..52e7f623 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW2_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "e195689c0bf261edd14793c7a67469f25ad80c972bd2891cb31f6c386b2e845f", + "qualification.json": "47062e0a19f8ad7d047f3014588b2e00e7237f676be86eb78bf2277395326dc5", + "specs.json": "be373b28f0f1647f417306410f95dfd9111c780f7d966c91d60e02b5ea3a0873", + "target.spice": "4c9272bb3167b1e61818535f04f03f2cea85b53a93704e2ef6a0fbf57d452ba5", + "target_lvs.spice": "f560394f3b7afe413ae2bb7ab93fd166f0c8014842db1cec8e9cbe8788f1c1d8", + "testbench.spice": "b2ced9458a6cd69cd2325cc909e7914fc36dfbf9d0d3f3a2ed2b6edbb8c03630" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW2_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW2_sL2/qualification.json new file mode 100644 index 00000000..02d9f7a5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW2_sL2/qualification.json @@ -0,0 +1,127 @@ +{ + "case_id": "C13_ihp130_sW2_sL2", + "circuit_id": "C13", + "pdk": "ihp130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 0.5, + "l0": 0.52, + "nf0": 1, + "uw0": 0.5, + "w": 1.0, + "l": 1.04, + "nf": 2, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.04, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.04, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.04, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.04, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "db11b7917011c8fb", + "mirror_pass1": { + "vmin": 0.2651642, + "status": "passed", + "vout_test": 0.73 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.3652 + }, + "_frozen_from": { + "schematic": { + "err": 0.01204, + "vmin": 0.2651642 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.48 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 1.3, + "schematic_measures": { + "iout_t": 2.02408e-05, + "err": 0.01204, + "vmin": 0.2651642, + "dev_at_vdd": 0.02349678, + "gout_t": 6.50998e-07, + "rout_t": 1536109.0, + "vout_test": 0.73, + "rout_nom": 1536109.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW2_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW2_sL2/specs.json new file mode 100644 index 00000000..779b270a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW2_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.3652 + }, + "_frozen_from": { + "schematic": { + "err": 0.01204, + "vmin": 0.2651642 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.48 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW2_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW2_sL2/target.spice new file mode 100644 index 00000000..56113e69 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW2_sL2/target.spice @@ -0,0 +1,7 @@ +.subckt C13_ihp130_sW2_sL2 VSS IIN1 IOUT1 IB1 +XM1 IB1 IB1 VSS VSS sg13_lv_nmos w=1u l=1.04u ng=2 m=1 +XM2 IIN1 IB1 net15 VSS sg13_lv_nmos w=4u l=1.04u ng=8 m=1 +XM3 net15 IIN1 VSS VSS sg13_lv_nmos w=4u l=1.04u ng=8 m=1 +XM4 IOUT1 IB1 net14 VSS sg13_lv_nmos w=4u l=1.04u ng=8 m=1 +XM5 net14 IIN1 VSS VSS sg13_lv_nmos w=4u l=1.04u ng=8 m=1 +.ends C13_ihp130_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW2_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW2_sL2/target_lvs.spice new file mode 100644 index 00000000..68dcf110 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW2_sL2/target_lvs.spice @@ -0,0 +1,36 @@ +.subckt C13_ihp130_sW2_sL2 VSS IIN1 IOUT1 IB1 +XM1_f0 IB1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM1_f1 IB1 IB1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM2_f0 IIN1 IB1 net15 VSS sg13_lv_nmos w=0.5u l=1.04u +XM2_f1 IIN1 IB1 net15 VSS sg13_lv_nmos w=0.5u l=1.04u +XM2_f2 IIN1 IB1 net15 VSS sg13_lv_nmos w=0.5u l=1.04u +XM2_f3 IIN1 IB1 net15 VSS sg13_lv_nmos w=0.5u l=1.04u +XM2_f4 IIN1 IB1 net15 VSS sg13_lv_nmos w=0.5u l=1.04u +XM2_f5 IIN1 IB1 net15 VSS sg13_lv_nmos w=0.5u l=1.04u +XM2_f6 IIN1 IB1 net15 VSS sg13_lv_nmos w=0.5u l=1.04u +XM2_f7 IIN1 IB1 net15 VSS sg13_lv_nmos w=0.5u l=1.04u +XM3_f0 net15 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM3_f1 net15 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM3_f2 net15 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM3_f3 net15 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM3_f4 net15 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM3_f5 net15 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM3_f6 net15 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM3_f7 net15 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM4_f0 IOUT1 IB1 net14 VSS sg13_lv_nmos w=0.5u l=1.04u +XM4_f1 IOUT1 IB1 net14 VSS sg13_lv_nmos w=0.5u l=1.04u +XM4_f2 IOUT1 IB1 net14 VSS sg13_lv_nmos w=0.5u l=1.04u +XM4_f3 IOUT1 IB1 net14 VSS sg13_lv_nmos w=0.5u l=1.04u +XM4_f4 IOUT1 IB1 net14 VSS sg13_lv_nmos w=0.5u l=1.04u +XM4_f5 IOUT1 IB1 net14 VSS sg13_lv_nmos w=0.5u l=1.04u +XM4_f6 IOUT1 IB1 net14 VSS sg13_lv_nmos w=0.5u l=1.04u +XM4_f7 IOUT1 IB1 net14 VSS sg13_lv_nmos w=0.5u l=1.04u +XM5_f0 net14 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM5_f1 net14 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM5_f2 net14 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM5_f3 net14 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM5_f4 net14 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM5_f5 net14 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM5_f6 net14 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM5_f7 net14 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +.ends C13_ihp130_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW2_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW2_sL2/testbench.spice new file mode 100644 index 00000000..67f796ba --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/ihp130/sW2_sL2/testbench.spice @@ -0,0 +1,26 @@ +X1 VSS IIN1 IOUT1 IB1 C13_ihp130_sW2_sL2 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIIN1 VDDB IIN1 2e-05 +IIB1 VDDB IB1 2e-05 +.nodeset v(IIN1)=0.36 v(IB1)=0.36 + +VOUT IOUT1 0 1.2 +.control +dc VOUT 1.2 0 -0.003 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=0.73 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.03 cross=last +meas dc dev_at_vdd find dev at=1.194 +let gout = deriv(iout) +meas dc gout_t find gout at=0.73 +let rout_v = 1/gout +meas dc rout_t find rout_v at=0.73 +echo vout_test = 0.73 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1.5_sL1.5/case.json new file mode 100644 index 00000000..0516211a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1.5_sL1.5/case.json @@ -0,0 +1,170 @@ +{ + "case_id": "C13_sky130_sW1.5_sL1.5", + "circuit_id": "C13", + "pdk": "sky130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "dut_name": "C13_sky130_sW1.5_sL1.5", + "ports": [ + "VSS", + "IIN1", + "IOUT1", + "IB1" + ], + "sizing": { + "M1": { + "w": 0.75, + "l": 0.45, + "nf": 1 + }, + "M2": { + "w": 3.0, + "l": 0.45, + "nf": 4 + }, + "M3": { + "w": 3.0, + "l": 0.45, + "nf": 4 + }, + "M4": { + "w": 3.0, + "l": 0.45, + "nf": 4 + }, + "M5": { + "w": 3.0, + "l": 0.45, + "nf": 4 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VDD" + }, + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 0.9, + "tol": 0.03, + "vout_test": 1.04 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "unit width scaled (nf kept)", + "devices": { + "M1": { + "w0": 0.5, + "l0": 0.3, + "nf0": 1, + "uw0": 0.5, + "w": 0.75, + "l": 0.45, + "nf": 1, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.45, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.45, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.45, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.45, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "d1ed7a2f3f1633f3", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1.5_sL1.5/manifest.json new file mode 100644 index 00000000..2f480350 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "58532f27fe888c641167bda3fb0653f3ed4e58d1669b8ca3ff7dedfa8114296e", + "qualification.json": "5cb97f84ccaf806d4c2fc109f4a218c2d452aa43ede7f814a223d664c2be896e", + "specs.json": "0acd976872343193bdeda9570de3a91974152d289091cab977389645e6cdec5c", + "target.spice": "683803b3f5f1aa7dbeeeae95e44fa45731c1b9e66a8199dc2f4bbb9ccecb3a93", + "target_lvs.spice": "af7079c8b21bc1563208ed57e89e3335f8c5ba2446dfdb4c98e86f0e6eb09dff", + "testbench.spice": "448975e079c84616f7e5bcbb093c6c56e67b21eded8eebea9e296b4eae42c3cb" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1.5_sL1.5/qualification.json new file mode 100644 index 00000000..f7c59412 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1.5_sL1.5/qualification.json @@ -0,0 +1,127 @@ +{ + "case_id": "C13_sky130_sW1.5_sL1.5", + "circuit_id": "C13", + "pdk": "sky130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "unit width scaled (nf kept)", + "devices": { + "M1": { + "w0": 0.5, + "l0": 0.3, + "nf0": 1, + "uw0": 0.5, + "w": 0.75, + "l": 0.45, + "nf": 1, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.45, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.45, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.45, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.45, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "d1ed7a2f3f1633f3", + "mirror_pass1": { + "vmin": 0.2886881, + "status": "passed", + "vout_test": 1.04 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.3887 + }, + "_frozen_from": { + "schematic": { + "err": 0.005341, + "vmin": 0.2886881 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.7200000000000001 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 19.8, + "schematic_measures": { + "iout_t": 2.010682e-05, + "err": 0.005341, + "vmin": 0.2886881, + "dev_at_vdd": 0.01758996, + "gout_t": 3.827309e-07, + "rout_t": 2612804.0, + "vout_test": 1.04, + "rout_nom": 2612804.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1.5_sL1.5/specs.json new file mode 100644 index 00000000..0ec826c5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1.5_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.3887 + }, + "_frozen_from": { + "schematic": { + "err": 0.005341, + "vmin": 0.2886881 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.7200000000000001 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1.5_sL1.5/target.spice new file mode 100644 index 00000000..2e553152 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1.5_sL1.5/target.spice @@ -0,0 +1,7 @@ +.subckt C13_sky130_sW1.5_sL1.5 VSS IIN1 IOUT1 IB1 +XM1 IB1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.75 l=0.45 nf=1 +XM2 IIN1 IB1 net15 VSS sky130_fd_pr__nfet_01v8 w=3 l=0.45 nf=4 +XM3 net15 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=3 l=0.45 nf=4 +XM4 IOUT1 IB1 net14 VSS sky130_fd_pr__nfet_01v8 w=3 l=0.45 nf=4 +XM5 net14 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=3 l=0.45 nf=4 +.ends C13_sky130_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..aa07010e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1.5_sL1.5/target_lvs.spice @@ -0,0 +1,19 @@ +.subckt C13_sky130_sW1.5_sL1.5 VSS IIN1 IOUT1 IB1 +XM1_f0 IB1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.75 l=0.45 +XM2_f0 IIN1 IB1 net15 VSS sky130_fd_pr__nfet_01v8 w=0.75 l=0.45 +XM2_f1 IIN1 IB1 net15 VSS sky130_fd_pr__nfet_01v8 w=0.75 l=0.45 +XM2_f2 IIN1 IB1 net15 VSS sky130_fd_pr__nfet_01v8 w=0.75 l=0.45 +XM2_f3 IIN1 IB1 net15 VSS sky130_fd_pr__nfet_01v8 w=0.75 l=0.45 +XM3_f0 net15 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.75 l=0.45 +XM3_f1 net15 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.75 l=0.45 +XM3_f2 net15 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.75 l=0.45 +XM3_f3 net15 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.75 l=0.45 +XM4_f0 IOUT1 IB1 net14 VSS sky130_fd_pr__nfet_01v8 w=0.75 l=0.45 +XM4_f1 IOUT1 IB1 net14 VSS sky130_fd_pr__nfet_01v8 w=0.75 l=0.45 +XM4_f2 IOUT1 IB1 net14 VSS sky130_fd_pr__nfet_01v8 w=0.75 l=0.45 +XM4_f3 IOUT1 IB1 net14 VSS sky130_fd_pr__nfet_01v8 w=0.75 l=0.45 +XM5_f0 net14 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.75 l=0.45 +XM5_f1 net14 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.75 l=0.45 +XM5_f2 net14 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.75 l=0.45 +XM5_f3 net14 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.75 l=0.45 +.ends C13_sky130_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1.5_sL1.5/testbench.spice new file mode 100644 index 00000000..61e8ece3 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1.5_sL1.5/testbench.spice @@ -0,0 +1,26 @@ +X1 VSS IIN1 IOUT1 IB1 C13_sky130_sW1.5_sL1.5 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIIN1 VDDB IIN1 2e-05 +IIB1 VDDB IB1 2e-05 +.nodeset v(IIN1)=0.54 v(IB1)=0.54 + +VOUT IOUT1 0 1.8 +.control +dc VOUT 1.8 0 -0.0045 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=1.04 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.03 cross=last +meas dc dev_at_vdd find dev at=1.791 +let gout = deriv(iout) +meas dc gout_t find gout at=1.04 +let rout_v = 1/gout +meas dc rout_t find rout_v at=1.04 +echo vout_test = 1.04 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1.5_sL1/case.json new file mode 100644 index 00000000..ef752824 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1.5_sL1/case.json @@ -0,0 +1,170 @@ +{ + "case_id": "C13_sky130_sW1.5_sL1", + "circuit_id": "C13", + "pdk": "sky130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "dut_name": "C13_sky130_sW1.5_sL1", + "ports": [ + "VSS", + "IIN1", + "IOUT1", + "IB1" + ], + "sizing": { + "M1": { + "w": 0.75, + "l": 0.3, + "nf": 1 + }, + "M2": { + "w": 3.0, + "l": 0.3, + "nf": 4 + }, + "M3": { + "w": 3.0, + "l": 0.3, + "nf": 4 + }, + "M4": { + "w": 3.0, + "l": 0.3, + "nf": 4 + }, + "M5": { + "w": 3.0, + "l": 0.3, + "nf": 4 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VDD" + }, + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 0.9, + "tol": 0.03, + "vout_test": 1.05 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "unit width scaled (nf kept)", + "devices": { + "M1": { + "w0": 0.5, + "l0": 0.3, + "nf0": 1, + "uw0": 0.5, + "w": 0.75, + "l": 0.3, + "nf": 1, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.3, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.3, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.3, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.3, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "bcf4ecc14cdef995", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1.5_sL1/manifest.json new file mode 100644 index 00000000..a00ff44e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "2899f1e6435390a4476f8665657feefbcd49f9b1390d48ed8819a678be04b0c5", + "qualification.json": "514eb720ea3dde0985c0e3f3cea84492e10b4f94626a29e5ca17cdd67186d725", + "specs.json": "78d726935f14db5c99deae969b9974c8cb39228c0ef77156d6006ca21c01646a", + "target.spice": "922d6d4026b01c6ac83e341506b222ab93261719f14dad8a9d62076c79764425", + "target_lvs.spice": "3759c158f4ca05ac33bea87d6bfbec23ad360a6af06ab948571e4c57f3c6a8af", + "testbench.spice": "ebfc278a4b4baaf8bbe68365c96691b1d9ce1e795f1490acbc131758fde90c3d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1.5_sL1/qualification.json new file mode 100644 index 00000000..827058fe --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1.5_sL1/qualification.json @@ -0,0 +1,127 @@ +{ + "case_id": "C13_sky130_sW1.5_sL1", + "circuit_id": "C13", + "pdk": "sky130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "unit width scaled (nf kept)", + "devices": { + "M1": { + "w0": 0.5, + "l0": 0.3, + "nf0": 1, + "uw0": 0.5, + "w": 0.75, + "l": 0.3, + "nf": 1, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.3, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.3, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.3, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.3, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "bcf4ecc14cdef995", + "mirror_pass1": { + "vmin": 0.2971104, + "status": "passed", + "vout_test": 1.05 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.3971 + }, + "_frozen_from": { + "schematic": { + "err": 0.0093025, + "vmin": 0.2971104 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.7200000000000001 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 16.9, + "schematic_measures": { + "iout_t": 2.018605e-05, + "err": 0.0093025, + "vmin": 0.2971104, + "dev_at_vdd": 0.03041712, + "gout_t": 6.419703e-07, + "rout_t": 1557706.0, + "vout_test": 1.05, + "rout_nom": 1557706.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1.5_sL1/specs.json new file mode 100644 index 00000000..94d38e1b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1.5_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.3971 + }, + "_frozen_from": { + "schematic": { + "err": 0.0093025, + "vmin": 0.2971104 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.7200000000000001 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1.5_sL1/target.spice new file mode 100644 index 00000000..73de5732 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1.5_sL1/target.spice @@ -0,0 +1,7 @@ +.subckt C13_sky130_sW1.5_sL1 VSS IIN1 IOUT1 IB1 +XM1 IB1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.75 l=0.3 nf=1 +XM2 IIN1 IB1 net15 VSS sky130_fd_pr__nfet_01v8 w=3 l=0.3 nf=4 +XM3 net15 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=3 l=0.3 nf=4 +XM4 IOUT1 IB1 net14 VSS sky130_fd_pr__nfet_01v8 w=3 l=0.3 nf=4 +XM5 net14 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=3 l=0.3 nf=4 +.ends C13_sky130_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1.5_sL1/target_lvs.spice new file mode 100644 index 00000000..ef56990b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1.5_sL1/target_lvs.spice @@ -0,0 +1,19 @@ +.subckt C13_sky130_sW1.5_sL1 VSS IIN1 IOUT1 IB1 +XM1_f0 IB1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.75 l=0.3 +XM2_f0 IIN1 IB1 net15 VSS sky130_fd_pr__nfet_01v8 w=0.75 l=0.3 +XM2_f1 IIN1 IB1 net15 VSS sky130_fd_pr__nfet_01v8 w=0.75 l=0.3 +XM2_f2 IIN1 IB1 net15 VSS sky130_fd_pr__nfet_01v8 w=0.75 l=0.3 +XM2_f3 IIN1 IB1 net15 VSS sky130_fd_pr__nfet_01v8 w=0.75 l=0.3 +XM3_f0 net15 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.75 l=0.3 +XM3_f1 net15 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.75 l=0.3 +XM3_f2 net15 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.75 l=0.3 +XM3_f3 net15 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.75 l=0.3 +XM4_f0 IOUT1 IB1 net14 VSS sky130_fd_pr__nfet_01v8 w=0.75 l=0.3 +XM4_f1 IOUT1 IB1 net14 VSS sky130_fd_pr__nfet_01v8 w=0.75 l=0.3 +XM4_f2 IOUT1 IB1 net14 VSS sky130_fd_pr__nfet_01v8 w=0.75 l=0.3 +XM4_f3 IOUT1 IB1 net14 VSS sky130_fd_pr__nfet_01v8 w=0.75 l=0.3 +XM5_f0 net14 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.75 l=0.3 +XM5_f1 net14 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.75 l=0.3 +XM5_f2 net14 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.75 l=0.3 +XM5_f3 net14 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.75 l=0.3 +.ends C13_sky130_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1.5_sL1/testbench.spice new file mode 100644 index 00000000..ae193db7 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1.5_sL1/testbench.spice @@ -0,0 +1,26 @@ +X1 VSS IIN1 IOUT1 IB1 C13_sky130_sW1.5_sL1 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIIN1 VDDB IIN1 2e-05 +IIB1 VDDB IB1 2e-05 +.nodeset v(IIN1)=0.54 v(IB1)=0.54 + +VOUT IOUT1 0 1.8 +.control +dc VOUT 1.8 0 -0.0045 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=1.05 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.03 cross=last +meas dc dev_at_vdd find dev at=1.791 +let gout = deriv(iout) +meas dc gout_t find gout at=1.05 +let rout_v = 1/gout +meas dc rout_t find rout_v at=1.05 +echo vout_test = 1.05 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1.5_sL2/case.json new file mode 100644 index 00000000..9961fd95 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1.5_sL2/case.json @@ -0,0 +1,170 @@ +{ + "case_id": "C13_sky130_sW1.5_sL2", + "circuit_id": "C13", + "pdk": "sky130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "dut_name": "C13_sky130_sW1.5_sL2", + "ports": [ + "VSS", + "IIN1", + "IOUT1", + "IB1" + ], + "sizing": { + "M1": { + "w": 0.75, + "l": 0.6, + "nf": 1 + }, + "M2": { + "w": 3.0, + "l": 0.6, + "nf": 4 + }, + "M3": { + "w": 3.0, + "l": 0.6, + "nf": 4 + }, + "M4": { + "w": 3.0, + "l": 0.6, + "nf": 4 + }, + "M5": { + "w": 3.0, + "l": 0.6, + "nf": 4 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VDD" + }, + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 0.9, + "tol": 0.03, + "vout_test": 1.06 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "unit width scaled (nf kept)", + "devices": { + "M1": { + "w0": 0.5, + "l0": 0.3, + "nf0": 1, + "uw0": 0.5, + "w": 0.75, + "l": 0.6, + "nf": 1, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.6, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.6, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.6, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.6, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "8a5a90fb89a67ff2", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1.5_sL2/manifest.json new file mode 100644 index 00000000..05bc31f0 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "39ccc3e85a0f0fe08efa24cd4f0be1270539b7c88c74719ddf5837c2d85e5721", + "qualification.json": "b95d8627cad43135aba7c671ddf7d6ee260c48b6004147d669675a8fd551bbd3", + "specs.json": "9f57300dc2833863929c7a10b35fb9c83afd17e9bf3f0e5e9419eb77295c97d5", + "target.spice": "70f846f1ceb8f1e4612e358786f5f5a013f9ca86e23e9869bf1cbbb148fa0645", + "target_lvs.spice": "6b47804758933d95a13feacfcbd28ace52606edab25fa5e60b175a8ee02d62ce", + "testbench.spice": "2dab3dab6ef270bf326c0c57e6f51572cf7afe6b9b410be0e584f0d1a091c1df" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1.5_sL2/qualification.json new file mode 100644 index 00000000..09771e9c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1.5_sL2/qualification.json @@ -0,0 +1,127 @@ +{ + "case_id": "C13_sky130_sW1.5_sL2", + "circuit_id": "C13", + "pdk": "sky130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "unit width scaled (nf kept)", + "devices": { + "M1": { + "w0": 0.5, + "l0": 0.3, + "nf0": 1, + "uw0": 0.5, + "w": 0.75, + "l": 0.6, + "nf": 1, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.6, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.6, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.6, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.6, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "8a5a90fb89a67ff2", + "mirror_pass1": { + "vmin": 0.3102468, + "status": "passed", + "vout_test": 1.06 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.4102 + }, + "_frozen_from": { + "schematic": { + "err": 0.0035335, + "vmin": 0.3102468 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.7200000000000001 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 16.6, + "schematic_measures": { + "iout_t": 2.007067e-05, + "err": 0.0035335, + "vmin": 0.3102468, + "dev_at_vdd": 0.01072303, + "gout_t": 2.426725e-07, + "rout_t": 4120797.0, + "vout_test": 1.06, + "rout_nom": 4120797.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1.5_sL2/specs.json new file mode 100644 index 00000000..d47e554a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1.5_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.4102 + }, + "_frozen_from": { + "schematic": { + "err": 0.0035335, + "vmin": 0.3102468 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.7200000000000001 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1.5_sL2/target.spice new file mode 100644 index 00000000..bf808e6d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1.5_sL2/target.spice @@ -0,0 +1,7 @@ +.subckt C13_sky130_sW1.5_sL2 VSS IIN1 IOUT1 IB1 +XM1 IB1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.75 l=0.6 nf=1 +XM2 IIN1 IB1 net15 VSS sky130_fd_pr__nfet_01v8 w=3 l=0.6 nf=4 +XM3 net15 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=3 l=0.6 nf=4 +XM4 IOUT1 IB1 net14 VSS sky130_fd_pr__nfet_01v8 w=3 l=0.6 nf=4 +XM5 net14 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=3 l=0.6 nf=4 +.ends C13_sky130_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1.5_sL2/target_lvs.spice new file mode 100644 index 00000000..e9d4a7d3 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1.5_sL2/target_lvs.spice @@ -0,0 +1,19 @@ +.subckt C13_sky130_sW1.5_sL2 VSS IIN1 IOUT1 IB1 +XM1_f0 IB1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.75 l=0.6 +XM2_f0 IIN1 IB1 net15 VSS sky130_fd_pr__nfet_01v8 w=0.75 l=0.6 +XM2_f1 IIN1 IB1 net15 VSS sky130_fd_pr__nfet_01v8 w=0.75 l=0.6 +XM2_f2 IIN1 IB1 net15 VSS sky130_fd_pr__nfet_01v8 w=0.75 l=0.6 +XM2_f3 IIN1 IB1 net15 VSS sky130_fd_pr__nfet_01v8 w=0.75 l=0.6 +XM3_f0 net15 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.75 l=0.6 +XM3_f1 net15 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.75 l=0.6 +XM3_f2 net15 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.75 l=0.6 +XM3_f3 net15 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.75 l=0.6 +XM4_f0 IOUT1 IB1 net14 VSS sky130_fd_pr__nfet_01v8 w=0.75 l=0.6 +XM4_f1 IOUT1 IB1 net14 VSS sky130_fd_pr__nfet_01v8 w=0.75 l=0.6 +XM4_f2 IOUT1 IB1 net14 VSS sky130_fd_pr__nfet_01v8 w=0.75 l=0.6 +XM4_f3 IOUT1 IB1 net14 VSS sky130_fd_pr__nfet_01v8 w=0.75 l=0.6 +XM5_f0 net14 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.75 l=0.6 +XM5_f1 net14 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.75 l=0.6 +XM5_f2 net14 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.75 l=0.6 +XM5_f3 net14 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.75 l=0.6 +.ends C13_sky130_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1.5_sL2/testbench.spice new file mode 100644 index 00000000..24e6768d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1.5_sL2/testbench.spice @@ -0,0 +1,26 @@ +X1 VSS IIN1 IOUT1 IB1 C13_sky130_sW1.5_sL2 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIIN1 VDDB IIN1 2e-05 +IIB1 VDDB IB1 2e-05 +.nodeset v(IIN1)=0.54 v(IB1)=0.54 + +VOUT IOUT1 0 1.8 +.control +dc VOUT 1.8 0 -0.0045 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=1.06 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.03 cross=last +meas dc dev_at_vdd find dev at=1.791 +let gout = deriv(iout) +meas dc gout_t find gout at=1.06 +let rout_v = 1/gout +meas dc rout_t find rout_v at=1.06 +echo vout_test = 1.06 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1_sL1.5/case.json new file mode 100644 index 00000000..571a934a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1_sL1.5/case.json @@ -0,0 +1,170 @@ +{ + "case_id": "C13_sky130_sW1_sL1.5", + "circuit_id": "C13", + "pdk": "sky130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "dut_name": "C13_sky130_sW1_sL1.5", + "ports": [ + "VSS", + "IIN1", + "IOUT1", + "IB1" + ], + "sizing": { + "M1": { + "w": 0.5, + "l": 0.45, + "nf": 1 + }, + "M2": { + "w": 2.0, + "l": 0.45, + "nf": 4 + }, + "M3": { + "w": 2.0, + "l": 0.45, + "nf": 4 + }, + "M4": { + "w": 2.0, + "l": 0.45, + "nf": 4 + }, + "M5": { + "w": 2.0, + "l": 0.45, + "nf": 4 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VDD" + }, + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 0.9, + "tol": 0.03, + "vout_test": 1.07 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 0.5, + "l0": 0.3, + "nf0": 1, + "uw0": 0.5, + "w": 0.5, + "l": 0.45, + "nf": 1, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "c59d2c767e881918", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1_sL1.5/manifest.json new file mode 100644 index 00000000..06c9bc28 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "93a7ed953d0ca516f76c283628e798c8aff0d2a9af5b37f3db4d0be6c65e340c", + "qualification.json": "3c15c3a302a15d45c9f66f6f1fa7ac3206eaf11729a97d3fa2f6021a0cd2025c", + "specs.json": "2e4d2ed164b22ec00712227bb74280e32bd6b2fad7b6f5510d99b1466370d85a", + "target.spice": "964ce70a2b9496d8874de9bbf0a67828966bdf17fa8ca29744cda81a8485767d", + "target_lvs.spice": "74a667e7996fe65c4d638662aeee6f8976f5f8743f6a2b0a8c8564180f564ed2", + "testbench.spice": "6c0890a28ef4cac23f04115fadaafd849b1cb4f2f9a93968491ba03c015c415d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1_sL1.5/qualification.json new file mode 100644 index 00000000..030950e1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1_sL1.5/qualification.json @@ -0,0 +1,127 @@ +{ + "case_id": "C13_sky130_sW1_sL1.5", + "circuit_id": "C13", + "pdk": "sky130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 0.5, + "l0": 0.3, + "nf0": 1, + "uw0": 0.5, + "w": 0.5, + "l": 0.45, + "nf": 1, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "c59d2c767e881918", + "mirror_pass1": { + "vmin": 0.3394912, + "status": "passed", + "vout_test": 1.07 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.4395 + }, + "_frozen_from": { + "schematic": { + "err": 0.0040145, + "vmin": 0.3394912 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.7200000000000001 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 18.0, + "schematic_measures": { + "iout_t": 2.008029e-05, + "err": 0.0040145, + "vmin": 0.3394912, + "dev_at_vdd": 0.01329274, + "gout_t": 3.114416e-07, + "rout_t": 3210882.0, + "vout_test": 1.07, + "rout_nom": 3210882.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1_sL1.5/specs.json new file mode 100644 index 00000000..fa01dff4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.4395 + }, + "_frozen_from": { + "schematic": { + "err": 0.0040145, + "vmin": 0.3394912 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.7200000000000001 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1_sL1.5/target.spice new file mode 100644 index 00000000..8e719231 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1_sL1.5/target.spice @@ -0,0 +1,7 @@ +.subckt C13_sky130_sW1_sL1.5 VSS IIN1 IOUT1 IB1 +XM1 IB1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 nf=1 +XM2 IIN1 IB1 net15 VSS sky130_fd_pr__nfet_01v8 w=2 l=0.45 nf=4 +XM3 net15 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=2 l=0.45 nf=4 +XM4 IOUT1 IB1 net14 VSS sky130_fd_pr__nfet_01v8 w=2 l=0.45 nf=4 +XM5 net14 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=2 l=0.45 nf=4 +.ends C13_sky130_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1_sL1.5/target_lvs.spice new file mode 100644 index 00000000..d447e5e7 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1_sL1.5/target_lvs.spice @@ -0,0 +1,19 @@ +.subckt C13_sky130_sW1_sL1.5 VSS IIN1 IOUT1 IB1 +XM1_f0 IB1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f0 IIN1 IB1 net15 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f1 IIN1 IB1 net15 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f2 IIN1 IB1 net15 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f3 IIN1 IB1 net15 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f0 net15 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f1 net15 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f2 net15 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f3 net15 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f0 IOUT1 IB1 net14 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f1 IOUT1 IB1 net14 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f2 IOUT1 IB1 net14 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f3 IOUT1 IB1 net14 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f0 net14 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f1 net14 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f2 net14 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f3 net14 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +.ends C13_sky130_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1_sL1.5/testbench.spice new file mode 100644 index 00000000..1ab4f115 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1_sL1.5/testbench.spice @@ -0,0 +1,26 @@ +X1 VSS IIN1 IOUT1 IB1 C13_sky130_sW1_sL1.5 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIIN1 VDDB IIN1 2e-05 +IIB1 VDDB IB1 2e-05 +.nodeset v(IIN1)=0.54 v(IB1)=0.54 + +VOUT IOUT1 0 1.8 +.control +dc VOUT 1.8 0 -0.0045 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=1.07 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.03 cross=last +meas dc dev_at_vdd find dev at=1.791 +let gout = deriv(iout) +meas dc gout_t find gout at=1.07 +let rout_v = 1/gout +meas dc rout_t find rout_v at=1.07 +echo vout_test = 1.07 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1_sL1/case.json new file mode 100644 index 00000000..6cd08bf8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1_sL1/case.json @@ -0,0 +1,170 @@ +{ + "case_id": "C13_sky130_sW1_sL1", + "circuit_id": "C13", + "pdk": "sky130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "dut_name": "C13_sky130_sW1_sL1", + "ports": [ + "VSS", + "IIN1", + "IOUT1", + "IB1" + ], + "sizing": { + "M1": { + "w": 0.5, + "l": 0.3, + "nf": 1 + }, + "M2": { + "w": 2.0, + "l": 0.3, + "nf": 4 + }, + "M3": { + "w": 2.0, + "l": 0.3, + "nf": 4 + }, + "M4": { + "w": 2.0, + "l": 0.3, + "nf": 4 + }, + "M5": { + "w": 2.0, + "l": 0.3, + "nf": 4 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VDD" + }, + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 0.9, + "tol": 0.03, + "vout_test": 1.06 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 0.5, + "l0": 0.3, + "nf0": 1, + "uw0": 0.5, + "w": 0.5, + "l": 0.3, + "nf": 1, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "8e41465834e6a761", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1_sL1/manifest.json new file mode 100644 index 00000000..be8159bd --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "13f6f50e5ca85b5dcc8c457cebcc6cfba10ec90b0f7f629a51ce70d77dbf73d2", + "qualification.json": "e9e6d1af31dad10244b2c83acfa31788edb923bfb67b9ecdbb0ca38167ccadc8", + "specs.json": "eb6b69d195af696971458f364f42c68e3ebdf4d73891431123da7674c1c186f0", + "target.spice": "69199642dfe4bef0f9094c1b0f3bae6fc9c80549a7306bf76438315aa3920caa", + "target_lvs.spice": "bfdd88e8084a9db03d131a0229faa662240fd090f61050e79fc0b8e596558c06", + "testbench.spice": "f4723968361449938cad47045495fc3be8115a1cd31c963a9beb25b85cefd3e6" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1_sL1/qualification.json new file mode 100644 index 00000000..45fcc130 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1_sL1/qualification.json @@ -0,0 +1,127 @@ +{ + "case_id": "C13_sky130_sW1_sL1", + "circuit_id": "C13", + "pdk": "sky130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 0.5, + "l0": 0.3, + "nf0": 1, + "uw0": 0.5, + "w": 0.5, + "l": 0.3, + "nf": 1, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "8e41465834e6a761", + "mirror_pass1": { + "vmin": 0.3184171, + "status": "passed", + "vout_test": 1.06 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.4184 + }, + "_frozen_from": { + "schematic": { + "err": 0.006713, + "vmin": 0.3184171 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.7200000000000001 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 19.0, + "schematic_measures": { + "iout_t": 2.013426e-05, + "err": 0.006713, + "vmin": 0.3184171, + "dev_at_vdd": 0.02351458, + "gout_t": 5.268826e-07, + "rout_t": 1897959.0, + "vout_test": 1.06, + "rout_nom": 1897959.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1_sL1/specs.json new file mode 100644 index 00000000..09debb96 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.4184 + }, + "_frozen_from": { + "schematic": { + "err": 0.006713, + "vmin": 0.3184171 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.7200000000000001 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1_sL1/target.spice new file mode 100644 index 00000000..3b27e447 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1_sL1/target.spice @@ -0,0 +1,7 @@ +.subckt C13_sky130_sW1_sL1 VSS IIN1 IOUT1 IB1 +XM1 IB1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 nf=1 +XM2 IIN1 IB1 net15 VSS sky130_fd_pr__nfet_01v8 w=2 l=0.3 nf=4 +XM3 net15 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=2 l=0.3 nf=4 +XM4 IOUT1 IB1 net14 VSS sky130_fd_pr__nfet_01v8 w=2 l=0.3 nf=4 +XM5 net14 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=2 l=0.3 nf=4 +.ends C13_sky130_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1_sL1/target_lvs.spice new file mode 100644 index 00000000..e07296b5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1_sL1/target_lvs.spice @@ -0,0 +1,19 @@ +.subckt C13_sky130_sW1_sL1 VSS IIN1 IOUT1 IB1 +XM1_f0 IB1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f0 IIN1 IB1 net15 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f1 IIN1 IB1 net15 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f2 IIN1 IB1 net15 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f3 IIN1 IB1 net15 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f0 net15 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f1 net15 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f2 net15 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f3 net15 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f0 IOUT1 IB1 net14 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f1 IOUT1 IB1 net14 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f2 IOUT1 IB1 net14 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f3 IOUT1 IB1 net14 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f0 net14 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f1 net14 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f2 net14 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f3 net14 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +.ends C13_sky130_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1_sL1/testbench.spice new file mode 100644 index 00000000..b229e300 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1_sL1/testbench.spice @@ -0,0 +1,26 @@ +X1 VSS IIN1 IOUT1 IB1 C13_sky130_sW1_sL1 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIIN1 VDDB IIN1 2e-05 +IIB1 VDDB IB1 2e-05 +.nodeset v(IIN1)=0.54 v(IB1)=0.54 + +VOUT IOUT1 0 1.8 +.control +dc VOUT 1.8 0 -0.0045 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=1.06 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.03 cross=last +meas dc dev_at_vdd find dev at=1.791 +let gout = deriv(iout) +meas dc gout_t find gout at=1.06 +let rout_v = 1/gout +meas dc rout_t find rout_v at=1.06 +echo vout_test = 1.06 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1_sL2/case.json new file mode 100644 index 00000000..d924a230 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1_sL2/case.json @@ -0,0 +1,170 @@ +{ + "case_id": "C13_sky130_sW1_sL2", + "circuit_id": "C13", + "pdk": "sky130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "dut_name": "C13_sky130_sW1_sL2", + "ports": [ + "VSS", + "IIN1", + "IOUT1", + "IB1" + ], + "sizing": { + "M1": { + "w": 0.5, + "l": 0.6, + "nf": 1 + }, + "M2": { + "w": 2.0, + "l": 0.6, + "nf": 4 + }, + "M3": { + "w": 2.0, + "l": 0.6, + "nf": 4 + }, + "M4": { + "w": 2.0, + "l": 0.6, + "nf": 4 + }, + "M5": { + "w": 2.0, + "l": 0.6, + "nf": 4 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VDD" + }, + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 0.9, + "tol": 0.03, + "vout_test": 1.08 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 0.5, + "l0": 0.3, + "nf0": 1, + "uw0": 0.5, + "w": 0.5, + "l": 0.6, + "nf": 1, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "34d9b48425c961ba", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1_sL2/manifest.json new file mode 100644 index 00000000..ba0f0faa --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "4a8563336d61fb5dc3dc59781d5971350477eebbff07d569bb9b318b9eb9e791", + "qualification.json": "12d80b99336237328a4cf5701c224a87a7eb5685cbc1e3fbf26ddb7d31e5b3fb", + "specs.json": "1eb5bf1121f8ab446f1002dd674847b04888d1fc6888afde6a417daa6aa37d03", + "target.spice": "055abbe20a2c3f21c3d19d24b866f63c7c7b4223b670a2717b1fef03c361e3a3", + "target_lvs.spice": "446a5939c122f297d1841f3b7026e5ba468535f7d6efda9165be07dca8170d20", + "testbench.spice": "fe701e4cb9a450ba76ead6e8a55552d33892a7d4d5dd80ea872f2dd043c79abc" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1_sL2/qualification.json new file mode 100644 index 00000000..6f819ca2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1_sL2/qualification.json @@ -0,0 +1,127 @@ +{ + "case_id": "C13_sky130_sW1_sL2", + "circuit_id": "C13", + "pdk": "sky130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 0.5, + "l0": 0.3, + "nf0": 1, + "uw0": 0.5, + "w": 0.5, + "l": 0.6, + "nf": 1, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "34d9b48425c961ba", + "mirror_pass1": { + "vmin": 0.3698112, + "status": "passed", + "vout_test": 1.08 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.4698 + }, + "_frozen_from": { + "schematic": { + "err": 0.002608, + "vmin": 0.3698112 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.7200000000000001 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 17.9, + "schematic_measures": { + "iout_t": 2.005216e-05, + "err": 0.002608, + "vmin": 0.3698112, + "dev_at_vdd": 0.00812611, + "gout_t": 2.04396e-07, + "rout_t": 4892465.0, + "vout_test": 1.08, + "rout_nom": 4892465.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1_sL2/specs.json new file mode 100644 index 00000000..f79bf1aa --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.4698 + }, + "_frozen_from": { + "schematic": { + "err": 0.002608, + "vmin": 0.3698112 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.7200000000000001 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1_sL2/target.spice new file mode 100644 index 00000000..282dc85b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1_sL2/target.spice @@ -0,0 +1,7 @@ +.subckt C13_sky130_sW1_sL2 VSS IIN1 IOUT1 IB1 +XM1 IB1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 nf=1 +XM2 IIN1 IB1 net15 VSS sky130_fd_pr__nfet_01v8 w=2 l=0.6 nf=4 +XM3 net15 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=2 l=0.6 nf=4 +XM4 IOUT1 IB1 net14 VSS sky130_fd_pr__nfet_01v8 w=2 l=0.6 nf=4 +XM5 net14 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=2 l=0.6 nf=4 +.ends C13_sky130_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1_sL2/target_lvs.spice new file mode 100644 index 00000000..2d058e21 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1_sL2/target_lvs.spice @@ -0,0 +1,19 @@ +.subckt C13_sky130_sW1_sL2 VSS IIN1 IOUT1 IB1 +XM1_f0 IB1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f0 IIN1 IB1 net15 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f1 IIN1 IB1 net15 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f2 IIN1 IB1 net15 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f3 IIN1 IB1 net15 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f0 net15 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f1 net15 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f2 net15 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f3 net15 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f0 IOUT1 IB1 net14 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f1 IOUT1 IB1 net14 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f2 IOUT1 IB1 net14 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f3 IOUT1 IB1 net14 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f0 net14 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f1 net14 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f2 net14 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f3 net14 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +.ends C13_sky130_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1_sL2/testbench.spice new file mode 100644 index 00000000..78603182 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW1_sL2/testbench.spice @@ -0,0 +1,26 @@ +X1 VSS IIN1 IOUT1 IB1 C13_sky130_sW1_sL2 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIIN1 VDDB IIN1 2e-05 +IIB1 VDDB IB1 2e-05 +.nodeset v(IIN1)=0.54 v(IB1)=0.54 + +VOUT IOUT1 0 1.8 +.control +dc VOUT 1.8 0 -0.0045 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=1.08 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.03 cross=last +meas dc dev_at_vdd find dev at=1.791 +let gout = deriv(iout) +meas dc gout_t find gout at=1.08 +let rout_v = 1/gout +meas dc rout_t find rout_v at=1.08 +echo vout_test = 1.08 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C13/sky130/sW2_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW2_sL1.5/case.json new file mode 100644 index 00000000..b0e2dfbf --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW2_sL1.5/case.json @@ -0,0 +1,170 @@ +{ + "case_id": "C13_sky130_sW2_sL1.5", + "circuit_id": "C13", + "pdk": "sky130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "dut_name": "C13_sky130_sW2_sL1.5", + "ports": [ + "VSS", + "IIN1", + "IOUT1", + "IB1" + ], + "sizing": { + "M1": { + "w": 1.0, + "l": 0.45, + "nf": 2 + }, + "M2": { + "w": 4.0, + "l": 0.45, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 0.45, + "nf": 8 + }, + "M4": { + "w": 4.0, + "l": 0.45, + "nf": 8 + }, + "M5": { + "w": 4.0, + "l": 0.45, + "nf": 8 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VDD" + }, + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 0.9, + "tol": 0.03, + "vout_test": 1.04 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 0.5, + "l0": 0.3, + "nf0": 1, + "uw0": 0.5, + "w": 1.0, + "l": 0.45, + "nf": 2, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "e301942eaaf247c4", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/sky130/sW2_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW2_sL1.5/manifest.json new file mode 100644 index 00000000..fbb9623d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW2_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "886a45bccd3c428f4a434b54a40e019aac90d18022d30cf7744d8618ed0f1ad3", + "qualification.json": "c2ab32dcba0c3bfbe83db7ab20465f338f208d74efe0c4e4b58c625c03d62676", + "specs.json": "7e6db8696e82c1bea7af954b793c4dc400659f9692427059c56b53374558334d", + "target.spice": "83886241d1c8a51a22e9eace56d99f1f18c77eed254ab9491460d59ec0877313", + "target_lvs.spice": "eeced37a9b693099b548b119211253e92fd76d691d94174ddd0390f51238f8d4", + "testbench.spice": "2dca32c816f0c607150758238927f0cc07813f253dbd1e43ab0f1a08f3236292" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/sky130/sW2_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW2_sL1.5/qualification.json new file mode 100644 index 00000000..a5815c39 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW2_sL1.5/qualification.json @@ -0,0 +1,127 @@ +{ + "case_id": "C13_sky130_sW2_sL1.5", + "circuit_id": "C13", + "pdk": "sky130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 0.5, + "l0": 0.3, + "nf0": 1, + "uw0": 0.5, + "w": 1.0, + "l": 0.45, + "nf": 2, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "e301942eaaf247c4", + "mirror_pass1": { + "vmin": 0.2747151, + "status": "passed", + "vout_test": 1.04 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.3747 + }, + "_frozen_from": { + "schematic": { + "err": 0.0062795, + "vmin": 0.2747151 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.7200000000000001 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 12.5, + "schematic_measures": { + "iout_t": 2.012559e-05, + "err": 0.0062795, + "vmin": 0.2747151, + "dev_at_vdd": 0.0201392, + "gout_t": 4.284173e-07, + "rout_t": 2334174.0, + "vout_test": 1.04, + "rout_nom": 2334174.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/sky130/sW2_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW2_sL1.5/specs.json new file mode 100644 index 00000000..c6d39508 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW2_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.3747 + }, + "_frozen_from": { + "schematic": { + "err": 0.0062795, + "vmin": 0.2747151 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.7200000000000001 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/sky130/sW2_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW2_sL1.5/target.spice new file mode 100644 index 00000000..6f9ddff8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW2_sL1.5/target.spice @@ -0,0 +1,7 @@ +.subckt C13_sky130_sW2_sL1.5 VSS IIN1 IOUT1 IB1 +XM1 IB1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=1 l=0.45 nf=2 +XM2 IIN1 IB1 net15 VSS sky130_fd_pr__nfet_01v8 w=4 l=0.45 nf=8 +XM3 net15 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=4 l=0.45 nf=8 +XM4 IOUT1 IB1 net14 VSS sky130_fd_pr__nfet_01v8 w=4 l=0.45 nf=8 +XM5 net14 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=4 l=0.45 nf=8 +.ends C13_sky130_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C13/sky130/sW2_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW2_sL1.5/target_lvs.spice new file mode 100644 index 00000000..21bc2630 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW2_sL1.5/target_lvs.spice @@ -0,0 +1,36 @@ +.subckt C13_sky130_sW2_sL1.5 VSS IIN1 IOUT1 IB1 +XM1_f0 IB1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f1 IB1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f0 IIN1 IB1 net15 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f1 IIN1 IB1 net15 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f2 IIN1 IB1 net15 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f3 IIN1 IB1 net15 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f4 IIN1 IB1 net15 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f5 IIN1 IB1 net15 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f6 IIN1 IB1 net15 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f7 IIN1 IB1 net15 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f0 net15 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f1 net15 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f2 net15 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f3 net15 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f4 net15 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f5 net15 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f6 net15 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f7 net15 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f0 IOUT1 IB1 net14 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f1 IOUT1 IB1 net14 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f2 IOUT1 IB1 net14 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f3 IOUT1 IB1 net14 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f4 IOUT1 IB1 net14 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f5 IOUT1 IB1 net14 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f6 IOUT1 IB1 net14 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f7 IOUT1 IB1 net14 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f0 net14 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f1 net14 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f2 net14 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f3 net14 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f4 net14 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f5 net14 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f6 net14 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f7 net14 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +.ends C13_sky130_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C13/sky130/sW2_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW2_sL1.5/testbench.spice new file mode 100644 index 00000000..2874d521 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW2_sL1.5/testbench.spice @@ -0,0 +1,26 @@ +X1 VSS IIN1 IOUT1 IB1 C13_sky130_sW2_sL1.5 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIIN1 VDDB IIN1 2e-05 +IIB1 VDDB IB1 2e-05 +.nodeset v(IIN1)=0.54 v(IB1)=0.54 + +VOUT IOUT1 0 1.8 +.control +dc VOUT 1.8 0 -0.0045 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=1.04 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.03 cross=last +meas dc dev_at_vdd find dev at=1.791 +let gout = deriv(iout) +meas dc gout_t find gout at=1.04 +let rout_v = 1/gout +meas dc rout_t find rout_v at=1.04 +echo vout_test = 1.04 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C13/sky130/sW2_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW2_sL1/case.json new file mode 100644 index 00000000..a4309719 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW2_sL1/case.json @@ -0,0 +1,170 @@ +{ + "case_id": "C13_sky130_sW2_sL1", + "circuit_id": "C13", + "pdk": "sky130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "dut_name": "C13_sky130_sW2_sL1", + "ports": [ + "VSS", + "IIN1", + "IOUT1", + "IB1" + ], + "sizing": { + "M1": { + "w": 1.0, + "l": 0.3, + "nf": 2 + }, + "M2": { + "w": 4.0, + "l": 0.3, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 0.3, + "nf": 8 + }, + "M4": { + "w": 4.0, + "l": 0.3, + "nf": 8 + }, + "M5": { + "w": 4.0, + "l": 0.3, + "nf": 8 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VDD" + }, + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 0.9, + "tol": 0.03, + "vout_test": 1.05 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 0.5, + "l0": 0.3, + "nf0": 1, + "uw0": 0.5, + "w": 1.0, + "l": 0.3, + "nf": 2, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "e36dae11343dafcd", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/sky130/sW2_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW2_sL1/manifest.json new file mode 100644 index 00000000..5c106f42 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW2_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "189f00d31c27b3127f46f4bc0c6df3b9eedb225dfa2caa1db526e3ce13cb4bc2", + "qualification.json": "65d4a56e4d7dbf33e519865fbfa57fb41d4e9dc76d3e1bb47ca8cd3ea5a25b0d", + "specs.json": "296c9a116faddfa3d744940047ebe3ac03207af668e0105aaf872d1da04375f0", + "target.spice": "ad98f66fc120f0042aaeac94fe785744c442a5dd22559f408c97e8ceacbee356", + "target_lvs.spice": "a4b3479eec2c2595485c0e578c7e0614c0bdff0455317752bfab3664b8068de0", + "testbench.spice": "99d33ab62e1be3bbd10b84615b41047a2bb05c0509952538d01c3bebaf0d2ec2" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/sky130/sW2_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW2_sL1/qualification.json new file mode 100644 index 00000000..2da68956 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW2_sL1/qualification.json @@ -0,0 +1,127 @@ +{ + "case_id": "C13_sky130_sW2_sL1", + "circuit_id": "C13", + "pdk": "sky130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 0.5, + "l0": 0.3, + "nf0": 1, + "uw0": 0.5, + "w": 1.0, + "l": 0.3, + "nf": 2, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "e36dae11343dafcd", + "mirror_pass1": { + "vmin": 0.2975041, + "status": "passed", + "vout_test": 1.05 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.3975 + }, + "_frozen_from": { + "schematic": { + "err": 0.010947, + "vmin": 0.2975041 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.7200000000000001 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 12.6, + "schematic_measures": { + "iout_t": 2.021894e-05, + "err": 0.010947, + "vmin": 0.2975041, + "dev_at_vdd": 0.03467514, + "gout_t": 7.184159e-07, + "rout_t": 1391953.0, + "vout_test": 1.05, + "rout_nom": 1391953.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/sky130/sW2_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW2_sL1/specs.json new file mode 100644 index 00000000..f69a033b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW2_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.3975 + }, + "_frozen_from": { + "schematic": { + "err": 0.010947, + "vmin": 0.2975041 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.7200000000000001 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/sky130/sW2_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW2_sL1/target.spice new file mode 100644 index 00000000..e4c79e40 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW2_sL1/target.spice @@ -0,0 +1,7 @@ +.subckt C13_sky130_sW2_sL1 VSS IIN1 IOUT1 IB1 +XM1 IB1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=1 l=0.3 nf=2 +XM2 IIN1 IB1 net15 VSS sky130_fd_pr__nfet_01v8 w=4 l=0.3 nf=8 +XM3 net15 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=4 l=0.3 nf=8 +XM4 IOUT1 IB1 net14 VSS sky130_fd_pr__nfet_01v8 w=4 l=0.3 nf=8 +XM5 net14 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=4 l=0.3 nf=8 +.ends C13_sky130_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C13/sky130/sW2_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW2_sL1/target_lvs.spice new file mode 100644 index 00000000..795d1a2e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW2_sL1/target_lvs.spice @@ -0,0 +1,36 @@ +.subckt C13_sky130_sW2_sL1 VSS IIN1 IOUT1 IB1 +XM1_f0 IB1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f1 IB1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f0 IIN1 IB1 net15 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f1 IIN1 IB1 net15 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f2 IIN1 IB1 net15 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f3 IIN1 IB1 net15 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f4 IIN1 IB1 net15 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f5 IIN1 IB1 net15 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f6 IIN1 IB1 net15 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f7 IIN1 IB1 net15 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f0 net15 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f1 net15 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f2 net15 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f3 net15 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f4 net15 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f5 net15 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f6 net15 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f7 net15 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f0 IOUT1 IB1 net14 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f1 IOUT1 IB1 net14 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f2 IOUT1 IB1 net14 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f3 IOUT1 IB1 net14 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f4 IOUT1 IB1 net14 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f5 IOUT1 IB1 net14 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f6 IOUT1 IB1 net14 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f7 IOUT1 IB1 net14 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f0 net14 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f1 net14 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f2 net14 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f3 net14 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f4 net14 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f5 net14 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f6 net14 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f7 net14 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +.ends C13_sky130_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C13/sky130/sW2_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW2_sL1/testbench.spice new file mode 100644 index 00000000..33aa0533 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW2_sL1/testbench.spice @@ -0,0 +1,26 @@ +X1 VSS IIN1 IOUT1 IB1 C13_sky130_sW2_sL1 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIIN1 VDDB IIN1 2e-05 +IIB1 VDDB IB1 2e-05 +.nodeset v(IIN1)=0.54 v(IB1)=0.54 + +VOUT IOUT1 0 1.8 +.control +dc VOUT 1.8 0 -0.0045 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=1.05 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.03 cross=last +meas dc dev_at_vdd find dev at=1.791 +let gout = deriv(iout) +meas dc gout_t find gout at=1.05 +let rout_v = 1/gout +meas dc rout_t find rout_v at=1.05 +echo vout_test = 1.05 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C13/sky130/sW2_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW2_sL2/case.json new file mode 100644 index 00000000..d1f3e02b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW2_sL2/case.json @@ -0,0 +1,170 @@ +{ + "case_id": "C13_sky130_sW2_sL2", + "circuit_id": "C13", + "pdk": "sky130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "dut_name": "C13_sky130_sW2_sL2", + "ports": [ + "VSS", + "IIN1", + "IOUT1", + "IB1" + ], + "sizing": { + "M1": { + "w": 1.0, + "l": 0.6, + "nf": 2 + }, + "M2": { + "w": 4.0, + "l": 0.6, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 0.6, + "nf": 8 + }, + "M4": { + "w": 4.0, + "l": 0.6, + "nf": 8 + }, + "M5": { + "w": 4.0, + "l": 0.6, + "nf": 8 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VDD" + }, + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 0.9, + "tol": 0.03, + "vout_test": 1.04 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 0.5, + "l0": 0.3, + "nf0": 1, + "uw0": 0.5, + "w": 1.0, + "l": 0.6, + "nf": 2, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "ea2079e4099fc136", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/sky130/sW2_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW2_sL2/manifest.json new file mode 100644 index 00000000..fcb65c30 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW2_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "3e280f62f7f2cec7b7008b103a0354643ebddfab2de57fba7402cd101be519d5", + "qualification.json": "19c8a9eec525694de37a23ffc11e45e4ce44031daf6c3aad8d399e2dd3842414", + "specs.json": "15315d05d13f7626d82b4f758ad85135da1e62f25916ed8aa2667b4f0789b227", + "target.spice": "e31fe92bb9698d8d48f5f5689a1891fad619eff15f90ef17482de994ab2fed78", + "target_lvs.spice": "bf1d42c3a529af930636023baac4606375432e0d25dcb0dbdc843e733cc2e21b", + "testbench.spice": "ab65997dd2ae341e0621fc525a8ba5ba8e561fb143c6a0591bab2fbf52966143" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/sky130/sW2_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW2_sL2/qualification.json new file mode 100644 index 00000000..071af647 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW2_sL2/qualification.json @@ -0,0 +1,127 @@ +{ + "case_id": "C13_sky130_sW2_sL2", + "circuit_id": "C13", + "pdk": "sky130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 0.5, + "l0": 0.3, + "nf0": 1, + "uw0": 0.5, + "w": 1.0, + "l": 0.6, + "nf": 2, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "ea2079e4099fc136", + "mirror_pass1": { + "vmin": 0.2858051, + "status": "passed", + "vout_test": 1.04 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.3858 + }, + "_frozen_from": { + "schematic": { + "err": 0.0038505, + "vmin": 0.2858051 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.7200000000000001 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 12.2, + "schematic_measures": { + "iout_t": 2.007701e-05, + "err": 0.0038505, + "vmin": 0.2858051, + "dev_at_vdd": 0.0118518, + "gout_t": 2.654067e-07, + "rout_t": 3767809.0, + "vout_test": 1.04, + "rout_nom": 3767809.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/sky130/sW2_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW2_sL2/specs.json new file mode 100644 index 00000000..48a8ec70 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW2_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.3858 + }, + "_frozen_from": { + "schematic": { + "err": 0.0038505, + "vmin": 0.2858051 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.7200000000000001 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C13/sky130/sW2_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW2_sL2/target.spice new file mode 100644 index 00000000..092f7944 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW2_sL2/target.spice @@ -0,0 +1,7 @@ +.subckt C13_sky130_sW2_sL2 VSS IIN1 IOUT1 IB1 +XM1 IB1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=1 l=0.6 nf=2 +XM2 IIN1 IB1 net15 VSS sky130_fd_pr__nfet_01v8 w=4 l=0.6 nf=8 +XM3 net15 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=4 l=0.6 nf=8 +XM4 IOUT1 IB1 net14 VSS sky130_fd_pr__nfet_01v8 w=4 l=0.6 nf=8 +XM5 net14 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=4 l=0.6 nf=8 +.ends C13_sky130_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C13/sky130/sW2_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW2_sL2/target_lvs.spice new file mode 100644 index 00000000..b0e8cae0 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW2_sL2/target_lvs.spice @@ -0,0 +1,36 @@ +.subckt C13_sky130_sW2_sL2 VSS IIN1 IOUT1 IB1 +XM1_f0 IB1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f1 IB1 IB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f0 IIN1 IB1 net15 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f1 IIN1 IB1 net15 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f2 IIN1 IB1 net15 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f3 IIN1 IB1 net15 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f4 IIN1 IB1 net15 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f5 IIN1 IB1 net15 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f6 IIN1 IB1 net15 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f7 IIN1 IB1 net15 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f0 net15 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f1 net15 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f2 net15 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f3 net15 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f4 net15 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f5 net15 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f6 net15 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f7 net15 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f0 IOUT1 IB1 net14 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f1 IOUT1 IB1 net14 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f2 IOUT1 IB1 net14 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f3 IOUT1 IB1 net14 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f4 IOUT1 IB1 net14 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f5 IOUT1 IB1 net14 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f6 IOUT1 IB1 net14 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f7 IOUT1 IB1 net14 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f0 net14 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f1 net14 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f2 net14 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f3 net14 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f4 net14 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f5 net14 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f6 net14 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f7 net14 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +.ends C13_sky130_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C13/sky130/sW2_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW2_sL2/testbench.spice new file mode 100644 index 00000000..c48d8938 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C13/sky130/sW2_sL2/testbench.spice @@ -0,0 +1,26 @@ +X1 VSS IIN1 IOUT1 IB1 C13_sky130_sW2_sL2 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIIN1 VDDB IIN1 2e-05 +IIB1 VDDB IB1 2e-05 +.nodeset v(IIN1)=0.54 v(IB1)=0.54 + +VOUT IOUT1 0 1.8 +.control +dc VOUT 1.8 0 -0.0045 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=1.04 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.03 cross=last +meas dc dev_at_vdd find dev at=1.791 +let gout = deriv(iout) +meas dc gout_t find gout at=1.04 +let rout_v = 1/gout +meas dc rout_t find rout_v at=1.04 +echo vout_test = 1.04 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C14/gf180/sW0.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW0.5_sL1.5/case.json new file mode 100644 index 00000000..cb16c977 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW0.5_sL1.5/case.json @@ -0,0 +1,152 @@ +{ + "case_id": "C14_gf180_sW0.5_sL1.5", + "circuit_id": "C14", + "pdk": "gf180", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "dut_name": "C14_gf180_sW0.5_sL1.5", + "ports": [ + "VSS", + "IIN1", + "IOUT1", + "IREF1" + ], + "sizing": { + "M1": { + "w": 1.0, + "l": 1.68, + "nf": 2 + }, + "M2": { + "w": 1.0, + "l": 1.68, + "nf": 2 + }, + "M3": { + "w": 0.5, + "l": 1.68, + "nf": 1 + }, + "M4": { + "w": 1.0, + "l": 1.68, + "nf": 2 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF1": { + "i": 5e-06, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 2.145, + "tol": 0.03, + "vout_test": 2.04 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.68, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.68, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 1.0, + "l0": 1.12, + "nf0": 2, + "uw0": 0.5, + "w": 0.5, + "l": 1.68, + "nf": 1, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.68, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "ade2c7d0fafd684f", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "ideal_current_source", + "port": "IREF1", + "current_A": 5e-06, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/gf180/sW0.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW0.5_sL1.5/manifest.json new file mode 100644 index 00000000..2d9e347f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW0.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "f5c79e9f144144c5def391e788c4fc5bff793b4ce045f207277caccf2a6592ef", + "qualification.json": "3f2c3efe5193827f6ec4b953ace81b4605f9a70601e81092d13d841ac9b58003", + "specs.json": "b48ced2d30b64f88c09ad4677249f3a4869f19660208c7cdb6b507d7b1fffbde", + "target.spice": "5d652982960c3b2fbb6684e1b94c308ff1117e8f8f04d72c1204c9c0dcd2890b", + "target_lvs.spice": "0eb542115bcf290ea324d26785b1f87c42e11eecbe845bf01537258657e9c498", + "testbench.spice": "5a2f790c2b4f0e1c562ebb72ada9534be7edaffeb3f5349bda617bfe876db6dc" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/gf180/sW0.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW0.5_sL1.5/qualification.json new file mode 100644 index 00000000..3bd8adb8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW0.5_sL1.5/qualification.json @@ -0,0 +1,115 @@ +{ + "case_id": "C14_gf180_sW0.5_sL1.5", + "circuit_id": "C14", + "pdk": "gf180", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.68, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.68, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 1.0, + "l0": 1.12, + "nf0": 2, + "uw0": 0.5, + "w": 0.5, + "l": 1.68, + "nf": 1, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.68, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "ade2c7d0fafd684f", + "mirror_pass1": { + "vmin": 0.7763944, + "status": "passed", + "vout_test": 2.04 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.8764 + }, + "_frozen_from": { + "schematic": { + "err": -0.0033225, + "vmin": 0.7763944 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.9799999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.2, + "schematic_measures": { + "iout_t": 1.993355e-05, + "err": -0.0033225, + "vmin": 0.7763944, + "dev_at_vdd": 0.003317149, + "gout_t": 5.946231e-11, + "rout_t": 16824180000.0, + "vout_test": 2.04, + "rout_nom": 16824180000.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/gf180/sW0.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW0.5_sL1.5/specs.json new file mode 100644 index 00000000..35cfbbc4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW0.5_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.8764 + }, + "_frozen_from": { + "schematic": { + "err": -0.0033225, + "vmin": 0.7763944 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.9799999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/gf180/sW0.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW0.5_sL1.5/target.spice new file mode 100644 index 00000000..f211ab46 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW0.5_sL1.5/target.spice @@ -0,0 +1,6 @@ +.subckt C14_gf180_sW0.5_sL1.5 VSS IIN1 IOUT1 IREF1 +MM1 IIN1 IIN1 VSS VSS nfet_03v3 w=1u l=1.68u nf=2 m=1 +MM2 net11 IIN1 VSS VSS nfet_03v3 w=1u l=1.68u nf=2 m=1 +MM3 IREF1 net11 VSS VSS nfet_03v3 w=0.5u l=1.68u nf=1 m=1 +MM4 IOUT1 IREF1 net11 VSS nfet_03v3 w=1u l=1.68u nf=2 m=1 +.ends C14_gf180_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C14/gf180/sW0.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW0.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..6efcad0d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW0.5_sL1.5/target_lvs.spice @@ -0,0 +1,9 @@ +.subckt C14_gf180_sW0.5_sL1.5 VSS IIN1 IOUT1 IREF1 +MM1_f0 IIN1 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.68u +MM1_f1 IIN1 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.68u +MM2_f0 net11 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.68u +MM2_f1 net11 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.68u +MM3_f0 IREF1 net11 VSS VSS nfet_03v3 w=0.5u l=1.68u +MM4_f0 IOUT1 IREF1 net11 VSS nfet_03v3 w=0.5u l=1.68u +MM4_f1 IOUT1 IREF1 net11 VSS nfet_03v3 w=0.5u l=1.68u +.ends C14_gf180_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C14/gf180/sW0.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW0.5_sL1.5/testbench.spice new file mode 100644 index 00000000..0cb6501e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW0.5_sL1.5/testbench.spice @@ -0,0 +1,26 @@ +X1 VSS IIN1 IOUT1 IREF1 C14_gf180_sW0.5_sL1.5 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIIN1 VDDB IIN1 2e-05 +IIREF1 VDDB IREF1 5e-06 +.nodeset v(IIN1)=0.99 v(IREF1)=0.99 + +VOUT IOUT1 0 3.3 +.control +dc VOUT 3.3 0 -0.00825 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=2.04 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.03 cross=last +meas dc dev_at_vdd find dev at=3.2835 +let gout = deriv(iout) +meas dc gout_t find gout at=2.04 +let rout_v = 1/gout +meas dc rout_t find rout_v at=2.04 +echo vout_test = 2.04 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C14/gf180/sW0.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW0.5_sL1/case.json new file mode 100644 index 00000000..ce90405a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW0.5_sL1/case.json @@ -0,0 +1,152 @@ +{ + "case_id": "C14_gf180_sW0.5_sL1", + "circuit_id": "C14", + "pdk": "gf180", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "dut_name": "C14_gf180_sW0.5_sL1", + "ports": [ + "VSS", + "IIN1", + "IOUT1", + "IREF1" + ], + "sizing": { + "M1": { + "w": 1.0, + "l": 1.12, + "nf": 2 + }, + "M2": { + "w": 1.0, + "l": 1.12, + "nf": 2 + }, + "M3": { + "w": 0.5, + "l": 1.12, + "nf": 1 + }, + "M4": { + "w": 1.0, + "l": 1.12, + "nf": 2 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF1": { + "i": 5e-06, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 2.145, + "tol": 0.03, + "vout_test": 2.0 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.12, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.12, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 1.0, + "l0": 1.12, + "nf0": 2, + "uw0": 0.5, + "w": 0.5, + "l": 1.12, + "nf": 1, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.12, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "4905de285a7cb6e7", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "ideal_current_source", + "port": "IREF1", + "current_A": 5e-06, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/gf180/sW0.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW0.5_sL1/manifest.json new file mode 100644 index 00000000..e04ca059 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW0.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "8a998c8a2069c52582bf82266b2e32380e4b801ce67f02231a68718c4e13bdbe", + "qualification.json": "517c5d46088d3fb5c6d084649f61350746ef87a58cbf64d9aca71fa8027fab37", + "specs.json": "36ddcf9a2a3ee2cc44771cb0b3817d35cec521cdedac405cbe1f75e4df247817", + "target.spice": "2d3f2c86cadbd16ddfa871fea26cb055a1095a888f8d6a61c7e8c10bd2098e26", + "target_lvs.spice": "1b3e24ab1e28644dc183c891a0ac54bede19c4f3304e03edd36a9a24eb896f20", + "testbench.spice": "b6f730fcbaa6e91241baaf0808f2f74a136096405e26885915b7f6be6ccedd9b" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/gf180/sW0.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW0.5_sL1/qualification.json new file mode 100644 index 00000000..903259e7 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW0.5_sL1/qualification.json @@ -0,0 +1,115 @@ +{ + "case_id": "C14_gf180_sW0.5_sL1", + "circuit_id": "C14", + "pdk": "gf180", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.12, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.12, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 1.0, + "l0": 1.12, + "nf0": 2, + "uw0": 0.5, + "w": 0.5, + "l": 1.12, + "nf": 1, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.12, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "4905de285a7cb6e7", + "mirror_pass1": { + "vmin": 0.7094948, + "status": "passed", + "vout_test": 2.0 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.8095 + }, + "_frozen_from": { + "schematic": { + "err": -0.0043175, + "vmin": 0.7094948 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.9799999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.2, + "schematic_measures": { + "iout_t": 1.991365e-05, + "err": -0.0043175, + "vmin": 0.7094948, + "dev_at_vdd": 0.004299304, + "gout_t": 2.39829e-11, + "rout_t": 41699820000.0, + "vout_test": 2.0, + "rout_nom": 41699820000.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/gf180/sW0.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW0.5_sL1/specs.json new file mode 100644 index 00000000..60a76e6a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW0.5_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.8095 + }, + "_frozen_from": { + "schematic": { + "err": -0.0043175, + "vmin": 0.7094948 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.9799999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/gf180/sW0.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW0.5_sL1/target.spice new file mode 100644 index 00000000..fd47b00c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW0.5_sL1/target.spice @@ -0,0 +1,6 @@ +.subckt C14_gf180_sW0.5_sL1 VSS IIN1 IOUT1 IREF1 +MM1 IIN1 IIN1 VSS VSS nfet_03v3 w=1u l=1.12u nf=2 m=1 +MM2 net11 IIN1 VSS VSS nfet_03v3 w=1u l=1.12u nf=2 m=1 +MM3 IREF1 net11 VSS VSS nfet_03v3 w=0.5u l=1.12u nf=1 m=1 +MM4 IOUT1 IREF1 net11 VSS nfet_03v3 w=1u l=1.12u nf=2 m=1 +.ends C14_gf180_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C14/gf180/sW0.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW0.5_sL1/target_lvs.spice new file mode 100644 index 00000000..63d10666 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW0.5_sL1/target_lvs.spice @@ -0,0 +1,9 @@ +.subckt C14_gf180_sW0.5_sL1 VSS IIN1 IOUT1 IREF1 +MM1_f0 IIN1 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM1_f1 IIN1 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM2_f0 net11 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM2_f1 net11 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f0 IREF1 net11 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM4_f0 IOUT1 IREF1 net11 VSS nfet_03v3 w=0.5u l=1.12u +MM4_f1 IOUT1 IREF1 net11 VSS nfet_03v3 w=0.5u l=1.12u +.ends C14_gf180_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C14/gf180/sW0.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW0.5_sL1/testbench.spice new file mode 100644 index 00000000..c26e95f4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW0.5_sL1/testbench.spice @@ -0,0 +1,26 @@ +X1 VSS IIN1 IOUT1 IREF1 C14_gf180_sW0.5_sL1 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIIN1 VDDB IIN1 2e-05 +IIREF1 VDDB IREF1 5e-06 +.nodeset v(IIN1)=0.99 v(IREF1)=0.99 + +VOUT IOUT1 0 3.3 +.control +dc VOUT 3.3 0 -0.00825 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=2 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.03 cross=last +meas dc dev_at_vdd find dev at=3.2835 +let gout = deriv(iout) +meas dc gout_t find gout at=2 +let rout_v = 1/gout +meas dc rout_t find rout_v at=2 +echo vout_test = 2 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C14/gf180/sW0.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW0.5_sL2/case.json new file mode 100644 index 00000000..8d995458 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW0.5_sL2/case.json @@ -0,0 +1,152 @@ +{ + "case_id": "C14_gf180_sW0.5_sL2", + "circuit_id": "C14", + "pdk": "gf180", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "dut_name": "C14_gf180_sW0.5_sL2", + "ports": [ + "VSS", + "IIN1", + "IOUT1", + "IREF1" + ], + "sizing": { + "M1": { + "w": 1.0, + "l": 2.24, + "nf": 2 + }, + "M2": { + "w": 1.0, + "l": 2.24, + "nf": 2 + }, + "M3": { + "w": 0.5, + "l": 2.24, + "nf": 1 + }, + "M4": { + "w": 1.0, + "l": 2.24, + "nf": 2 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF1": { + "i": 5e-06, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 2.145, + "tol": 0.03, + "vout_test": 2.08 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 2.24, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 2.24, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 1.0, + "l0": 1.12, + "nf0": 2, + "uw0": 0.5, + "w": 0.5, + "l": 2.24, + "nf": 1, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 2.24, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "3047c5f4031e8aa1", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "ideal_current_source", + "port": "IREF1", + "current_A": 5e-06, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/gf180/sW0.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW0.5_sL2/manifest.json new file mode 100644 index 00000000..a1e10a81 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW0.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "bb2f93c503473f4bfc61f5f2229331454f6df54c06c1139fcd236f499b41ba70", + "qualification.json": "b21b0cf14ab7294e791080a15f5f3d185b421c6b21572b4535a45add14d0f9b8", + "specs.json": "285fe31f12dd2c800f439629850cdaef56618e89259235e39760606179464580", + "target.spice": "0c556bbc2df3587f6852374befa77ef209d60cf5018412bc801e600b0103eccb", + "target_lvs.spice": "c577da043b9b4e37cde18beb5b6c676e450f7c75d62ba0db5bbe41818c346c46", + "testbench.spice": "1d3c55120ecf93f8a749480441b423fb73817cf4a34c2acc0e840be451d71da5" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/gf180/sW0.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW0.5_sL2/qualification.json new file mode 100644 index 00000000..1250cbc4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW0.5_sL2/qualification.json @@ -0,0 +1,115 @@ +{ + "case_id": "C14_gf180_sW0.5_sL2", + "circuit_id": "C14", + "pdk": "gf180", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 2.24, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 2.24, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 1.0, + "l0": 1.12, + "nf0": 2, + "uw0": 0.5, + "w": 0.5, + "l": 2.24, + "nf": 1, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 2.24, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "3047c5f4031e8aa1", + "mirror_pass1": { + "vmin": 0.8593138, + "status": "passed", + "vout_test": 2.08 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.9593 + }, + "_frozen_from": { + "schematic": { + "err": -0.002807, + "vmin": 0.8593138 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.9799999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.2, + "schematic_measures": { + "iout_t": 1.994386e-05, + "err": -0.002807, + "vmin": 0.8593138, + "dev_at_vdd": 0.002804686, + "gout_t": 2.856617e-10, + "rout_t": 3505060000.0, + "vout_test": 2.08, + "rout_nom": 3505060000.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/gf180/sW0.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW0.5_sL2/specs.json new file mode 100644 index 00000000..cafb399c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW0.5_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.9593 + }, + "_frozen_from": { + "schematic": { + "err": -0.002807, + "vmin": 0.8593138 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.9799999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/gf180/sW0.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW0.5_sL2/target.spice new file mode 100644 index 00000000..62977798 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW0.5_sL2/target.spice @@ -0,0 +1,6 @@ +.subckt C14_gf180_sW0.5_sL2 VSS IIN1 IOUT1 IREF1 +MM1 IIN1 IIN1 VSS VSS nfet_03v3 w=1u l=2.24u nf=2 m=1 +MM2 net11 IIN1 VSS VSS nfet_03v3 w=1u l=2.24u nf=2 m=1 +MM3 IREF1 net11 VSS VSS nfet_03v3 w=0.5u l=2.24u nf=1 m=1 +MM4 IOUT1 IREF1 net11 VSS nfet_03v3 w=1u l=2.24u nf=2 m=1 +.ends C14_gf180_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C14/gf180/sW0.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW0.5_sL2/target_lvs.spice new file mode 100644 index 00000000..8c468243 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW0.5_sL2/target_lvs.spice @@ -0,0 +1,9 @@ +.subckt C14_gf180_sW0.5_sL2 VSS IIN1 IOUT1 IREF1 +MM1_f0 IIN1 IIN1 VSS VSS nfet_03v3 w=0.5u l=2.24u +MM1_f1 IIN1 IIN1 VSS VSS nfet_03v3 w=0.5u l=2.24u +MM2_f0 net11 IIN1 VSS VSS nfet_03v3 w=0.5u l=2.24u +MM2_f1 net11 IIN1 VSS VSS nfet_03v3 w=0.5u l=2.24u +MM3_f0 IREF1 net11 VSS VSS nfet_03v3 w=0.5u l=2.24u +MM4_f0 IOUT1 IREF1 net11 VSS nfet_03v3 w=0.5u l=2.24u +MM4_f1 IOUT1 IREF1 net11 VSS nfet_03v3 w=0.5u l=2.24u +.ends C14_gf180_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C14/gf180/sW0.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW0.5_sL2/testbench.spice new file mode 100644 index 00000000..d80766c1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW0.5_sL2/testbench.spice @@ -0,0 +1,26 @@ +X1 VSS IIN1 IOUT1 IREF1 C14_gf180_sW0.5_sL2 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIIN1 VDDB IIN1 2e-05 +IIREF1 VDDB IREF1 5e-06 +.nodeset v(IIN1)=0.99 v(IREF1)=0.99 + +VOUT IOUT1 0 3.3 +.control +dc VOUT 3.3 0 -0.00825 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=2.08 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.03 cross=last +meas dc dev_at_vdd find dev at=3.2835 +let gout = deriv(iout) +meas dc gout_t find gout at=2.08 +let rout_v = 1/gout +meas dc rout_t find rout_v at=2.08 +echo vout_test = 2.08 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1.5_sL1.5/case.json new file mode 100644 index 00000000..6c5a6921 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1.5_sL1.5/case.json @@ -0,0 +1,152 @@ +{ + "case_id": "C14_gf180_sW1.5_sL1.5", + "circuit_id": "C14", + "pdk": "gf180", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "dut_name": "C14_gf180_sW1.5_sL1.5", + "ports": [ + "VSS", + "IIN1", + "IOUT1", + "IREF1" + ], + "sizing": { + "M1": { + "w": 3.0, + "l": 1.68, + "nf": 6 + }, + "M2": { + "w": 3.0, + "l": 1.68, + "nf": 6 + }, + "M3": { + "w": 1.5, + "l": 1.68, + "nf": 3 + }, + "M4": { + "w": 3.0, + "l": 1.68, + "nf": 6 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF1": { + "i": 5e-06, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 2.145, + "tol": 0.03, + "vout_test": 1.94 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.68, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.68, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 1.0, + "l0": 1.12, + "nf0": 2, + "uw0": 0.5, + "w": 1.5, + "l": 1.68, + "nf": 3, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.68, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "6970d3dc60c2448f", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "ideal_current_source", + "port": "IREF1", + "current_A": 5e-06, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1.5_sL1.5/manifest.json new file mode 100644 index 00000000..eb6f1c1d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "f77f62385b6244e51b36e4be7c4081d4c407b3f5a51146e164e50ce1dfb59f11", + "qualification.json": "d17aad04a38a2cac269a4136a85b00392c8d236c7e20932efe89061dc64edc77", + "specs.json": "246aaf6253c681a02a58557261e14462df9d08b73e3dc64c94a9ee91cdea5952", + "target.spice": "fa0312ff1d35014aa5ef824c0b8a4aa8443d79cf930ddd02ddbdc08d3bf5655f", + "target_lvs.spice": "3e1c4751354b491cf9c36bdfb7d698c98a42aa91276d627af145924db4e35dfd", + "testbench.spice": "f00c353741feca2c2958d8667ba1c2c732c043534a8742fd704614cbb137bc46" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1.5_sL1.5/qualification.json new file mode 100644 index 00000000..848b7784 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1.5_sL1.5/qualification.json @@ -0,0 +1,115 @@ +{ + "case_id": "C14_gf180_sW1.5_sL1.5", + "circuit_id": "C14", + "pdk": "gf180", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.68, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.68, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 1.0, + "l0": 1.12, + "nf0": 2, + "uw0": 0.5, + "w": 1.5, + "l": 1.68, + "nf": 3, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.68, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "6970d3dc60c2448f", + "mirror_pass1": { + "vmin": 0.5855717, + "status": "passed", + "vout_test": 1.94 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.6856 + }, + "_frozen_from": { + "schematic": { + "err": -0.0023405, + "vmin": 0.5855717 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.9799999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.2, + "schematic_measures": { + "iout_t": 1.995319e-05, + "err": -0.0023405, + "vmin": 0.5855717, + "dev_at_vdd": 0.00196495, + "gout_t": 9.850565e-12, + "rout_t": 101517200000.0, + "vout_test": 1.94, + "rout_nom": 101517200000.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1.5_sL1.5/specs.json new file mode 100644 index 00000000..e8761ba4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1.5_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.6856 + }, + "_frozen_from": { + "schematic": { + "err": -0.0023405, + "vmin": 0.5855717 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.9799999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1.5_sL1.5/target.spice new file mode 100644 index 00000000..a1d9edba --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1.5_sL1.5/target.spice @@ -0,0 +1,6 @@ +.subckt C14_gf180_sW1.5_sL1.5 VSS IIN1 IOUT1 IREF1 +MM1 IIN1 IIN1 VSS VSS nfet_03v3 w=3u l=1.68u nf=6 m=1 +MM2 net11 IIN1 VSS VSS nfet_03v3 w=3u l=1.68u nf=6 m=1 +MM3 IREF1 net11 VSS VSS nfet_03v3 w=1.5u l=1.68u nf=3 m=1 +MM4 IOUT1 IREF1 net11 VSS nfet_03v3 w=3u l=1.68u nf=6 m=1 +.ends C14_gf180_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..a386ee59 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1.5_sL1.5/target_lvs.spice @@ -0,0 +1,23 @@ +.subckt C14_gf180_sW1.5_sL1.5 VSS IIN1 IOUT1 IREF1 +MM1_f0 IIN1 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.68u +MM1_f1 IIN1 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.68u +MM1_f2 IIN1 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.68u +MM1_f3 IIN1 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.68u +MM1_f4 IIN1 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.68u +MM1_f5 IIN1 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.68u +MM2_f0 net11 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.68u +MM2_f1 net11 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.68u +MM2_f2 net11 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.68u +MM2_f3 net11 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.68u +MM2_f4 net11 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.68u +MM2_f5 net11 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.68u +MM3_f0 IREF1 net11 VSS VSS nfet_03v3 w=0.5u l=1.68u +MM3_f1 IREF1 net11 VSS VSS nfet_03v3 w=0.5u l=1.68u +MM3_f2 IREF1 net11 VSS VSS nfet_03v3 w=0.5u l=1.68u +MM4_f0 IOUT1 IREF1 net11 VSS nfet_03v3 w=0.5u l=1.68u +MM4_f1 IOUT1 IREF1 net11 VSS nfet_03v3 w=0.5u l=1.68u +MM4_f2 IOUT1 IREF1 net11 VSS nfet_03v3 w=0.5u l=1.68u +MM4_f3 IOUT1 IREF1 net11 VSS nfet_03v3 w=0.5u l=1.68u +MM4_f4 IOUT1 IREF1 net11 VSS nfet_03v3 w=0.5u l=1.68u +MM4_f5 IOUT1 IREF1 net11 VSS nfet_03v3 w=0.5u l=1.68u +.ends C14_gf180_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1.5_sL1.5/testbench.spice new file mode 100644 index 00000000..872f9a07 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1.5_sL1.5/testbench.spice @@ -0,0 +1,26 @@ +X1 VSS IIN1 IOUT1 IREF1 C14_gf180_sW1.5_sL1.5 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIIN1 VDDB IIN1 2e-05 +IIREF1 VDDB IREF1 5e-06 +.nodeset v(IIN1)=0.99 v(IREF1)=0.99 + +VOUT IOUT1 0 3.3 +.control +dc VOUT 3.3 0 -0.00825 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=1.94 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.03 cross=last +meas dc dev_at_vdd find dev at=3.2835 +let gout = deriv(iout) +meas dc gout_t find gout at=1.94 +let rout_v = 1/gout +meas dc rout_t find rout_v at=1.94 +echo vout_test = 1.94 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1.5_sL1/case.json new file mode 100644 index 00000000..7deb1504 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1.5_sL1/case.json @@ -0,0 +1,152 @@ +{ + "case_id": "C14_gf180_sW1.5_sL1", + "circuit_id": "C14", + "pdk": "gf180", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "dut_name": "C14_gf180_sW1.5_sL1", + "ports": [ + "VSS", + "IIN1", + "IOUT1", + "IREF1" + ], + "sizing": { + "M1": { + "w": 3.0, + "l": 1.12, + "nf": 6 + }, + "M2": { + "w": 3.0, + "l": 1.12, + "nf": 6 + }, + "M3": { + "w": 1.5, + "l": 1.12, + "nf": 3 + }, + "M4": { + "w": 3.0, + "l": 1.12, + "nf": 6 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF1": { + "i": 5e-06, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 2.145, + "tol": 0.03, + "vout_test": 1.92 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.12, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.12, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 1.0, + "l0": 1.12, + "nf0": 2, + "uw0": 0.5, + "w": 1.5, + "l": 1.12, + "nf": 3, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.12, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "860f9f227b5e4ca4", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "ideal_current_source", + "port": "IREF1", + "current_A": 5e-06, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1.5_sL1/manifest.json new file mode 100644 index 00000000..002eb401 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "095d87ce7414aaa53ce3f305ddcbde7a3a15127e7c5c8bae9d0670b66ee68332", + "qualification.json": "421a8b6c38095c64a18f42529a02e297b6f5e51c27e5773ef34cbdbbb2f58e19", + "specs.json": "4ad82858efcb2473bbad4ee981833653e2bbc69cd01358acfc2ffedd358054f2", + "target.spice": "4ab105f2b62dbb2f456fc8dc22f6ec7559c536315b1c1c8b59ed569672e03d91", + "target_lvs.spice": "cd89cfdd7592ef68b08ebe3129d18daf8407fdbdc772591ffceb43d025bf95ce", + "testbench.spice": "cecd79aca33a8ddcca766baa4ccd7488ef226c23a45060260ed7cfdb7f39d611" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1.5_sL1/qualification.json new file mode 100644 index 00000000..4e507e94 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1.5_sL1/qualification.json @@ -0,0 +1,115 @@ +{ + "case_id": "C14_gf180_sW1.5_sL1", + "circuit_id": "C14", + "pdk": "gf180", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.12, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.12, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 1.0, + "l0": 1.12, + "nf0": 2, + "uw0": 0.5, + "w": 1.5, + "l": 1.12, + "nf": 3, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.12, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "860f9f227b5e4ca4", + "mirror_pass1": { + "vmin": 0.5361322, + "status": "passed", + "vout_test": 1.92 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.6361 + }, + "_frozen_from": { + "schematic": { + "err": -0.0030695, + "vmin": 0.5361322 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.9799999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "iout_t": 1.993861e-05, + "err": -0.0030695, + "vmin": 0.5361322, + "dev_at_vdd": 0.002771026, + "gout_t": 1.299068e-11, + "rout_t": 76978480000.0, + "vout_test": 1.92, + "rout_nom": 76978480000.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1.5_sL1/specs.json new file mode 100644 index 00000000..e485de66 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1.5_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.6361 + }, + "_frozen_from": { + "schematic": { + "err": -0.0030695, + "vmin": 0.5361322 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.9799999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1.5_sL1/target.spice new file mode 100644 index 00000000..9279c3e8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1.5_sL1/target.spice @@ -0,0 +1,6 @@ +.subckt C14_gf180_sW1.5_sL1 VSS IIN1 IOUT1 IREF1 +MM1 IIN1 IIN1 VSS VSS nfet_03v3 w=3u l=1.12u nf=6 m=1 +MM2 net11 IIN1 VSS VSS nfet_03v3 w=3u l=1.12u nf=6 m=1 +MM3 IREF1 net11 VSS VSS nfet_03v3 w=1.5u l=1.12u nf=3 m=1 +MM4 IOUT1 IREF1 net11 VSS nfet_03v3 w=3u l=1.12u nf=6 m=1 +.ends C14_gf180_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1.5_sL1/target_lvs.spice new file mode 100644 index 00000000..535ee8cb --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1.5_sL1/target_lvs.spice @@ -0,0 +1,23 @@ +.subckt C14_gf180_sW1.5_sL1 VSS IIN1 IOUT1 IREF1 +MM1_f0 IIN1 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM1_f1 IIN1 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM1_f2 IIN1 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM1_f3 IIN1 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM1_f4 IIN1 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM1_f5 IIN1 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM2_f0 net11 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM2_f1 net11 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM2_f2 net11 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM2_f3 net11 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM2_f4 net11 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM2_f5 net11 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f0 IREF1 net11 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f1 IREF1 net11 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f2 IREF1 net11 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM4_f0 IOUT1 IREF1 net11 VSS nfet_03v3 w=0.5u l=1.12u +MM4_f1 IOUT1 IREF1 net11 VSS nfet_03v3 w=0.5u l=1.12u +MM4_f2 IOUT1 IREF1 net11 VSS nfet_03v3 w=0.5u l=1.12u +MM4_f3 IOUT1 IREF1 net11 VSS nfet_03v3 w=0.5u l=1.12u +MM4_f4 IOUT1 IREF1 net11 VSS nfet_03v3 w=0.5u l=1.12u +MM4_f5 IOUT1 IREF1 net11 VSS nfet_03v3 w=0.5u l=1.12u +.ends C14_gf180_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1.5_sL1/testbench.spice new file mode 100644 index 00000000..b5b58f85 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1.5_sL1/testbench.spice @@ -0,0 +1,26 @@ +X1 VSS IIN1 IOUT1 IREF1 C14_gf180_sW1.5_sL1 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIIN1 VDDB IIN1 2e-05 +IIREF1 VDDB IREF1 5e-06 +.nodeset v(IIN1)=0.99 v(IREF1)=0.99 + +VOUT IOUT1 0 3.3 +.control +dc VOUT 3.3 0 -0.00825 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=1.92 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.03 cross=last +meas dc dev_at_vdd find dev at=3.2835 +let gout = deriv(iout) +meas dc gout_t find gout at=1.92 +let rout_v = 1/gout +meas dc rout_t find rout_v at=1.92 +echo vout_test = 1.92 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1.5_sL2/case.json new file mode 100644 index 00000000..564e6907 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1.5_sL2/case.json @@ -0,0 +1,152 @@ +{ + "case_id": "C14_gf180_sW1.5_sL2", + "circuit_id": "C14", + "pdk": "gf180", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "dut_name": "C14_gf180_sW1.5_sL2", + "ports": [ + "VSS", + "IIN1", + "IOUT1", + "IREF1" + ], + "sizing": { + "M1": { + "w": 3.0, + "l": 2.24, + "nf": 6 + }, + "M2": { + "w": 3.0, + "l": 2.24, + "nf": 6 + }, + "M3": { + "w": 1.5, + "l": 2.24, + "nf": 3 + }, + "M4": { + "w": 3.0, + "l": 2.24, + "nf": 6 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF1": { + "i": 5e-06, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 2.145, + "tol": 0.03, + "vout_test": 1.96 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 2.24, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 2.24, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 1.0, + "l0": 1.12, + "nf0": 2, + "uw0": 0.5, + "w": 1.5, + "l": 2.24, + "nf": 3, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 2.24, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "6cd1b2cee7c1f8fd", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "ideal_current_source", + "port": "IREF1", + "current_A": 5e-06, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1.5_sL2/manifest.json new file mode 100644 index 00000000..a8f88ebd --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "c99f775da0a5f7d2e7b81e173fa028df482b5927fb966504e4612d8ffba9dea0", + "qualification.json": "f60e44306377a620cab0f03f659bfb0f838046d06f9738e78352c53a7c9cc0c9", + "specs.json": "e3e99ed04fb04974c62c55b41eeaf2e2811b1c7225ab30816e3b4ce41f8c069e", + "target.spice": "dc3a8ea0b60eadcd5dcde93104789e34a5ecc6a4b5f4041fd19ae80364a6295d", + "target_lvs.spice": "4e27cb4adc3da8d42e47d76ca820b2c57306fb9f824c63e3d13da242576eaa87", + "testbench.spice": "4e9d79676c54ceafc7f85723554659c37e2e5696e39b0398d7a51a79f5348017" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1.5_sL2/qualification.json new file mode 100644 index 00000000..f639b6b0 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1.5_sL2/qualification.json @@ -0,0 +1,115 @@ +{ + "case_id": "C14_gf180_sW1.5_sL2", + "circuit_id": "C14", + "pdk": "gf180", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 2.24, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 2.24, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 1.0, + "l0": 1.12, + "nf0": 2, + "uw0": 0.5, + "w": 1.5, + "l": 2.24, + "nf": 3, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 2.24, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "6cd1b2cee7c1f8fd", + "mirror_pass1": { + "vmin": 0.6268137, + "status": "passed", + "vout_test": 1.96 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.7268 + }, + "_frozen_from": { + "schematic": { + "err": -0.001958, + "vmin": 0.6268137 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.9799999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.2, + "schematic_measures": { + "iout_t": 1.996084e-05, + "err": -0.001958, + "vmin": 0.6268137, + "dev_at_vdd": 0.001807008, + "gout_t": 8.866212e-12, + "rout_t": 112788100000.0, + "vout_test": 1.96, + "rout_nom": 112788100000.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1.5_sL2/specs.json new file mode 100644 index 00000000..2aa1829a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1.5_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.7268 + }, + "_frozen_from": { + "schematic": { + "err": -0.001958, + "vmin": 0.6268137 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.9799999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1.5_sL2/target.spice new file mode 100644 index 00000000..51c44f24 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1.5_sL2/target.spice @@ -0,0 +1,6 @@ +.subckt C14_gf180_sW1.5_sL2 VSS IIN1 IOUT1 IREF1 +MM1 IIN1 IIN1 VSS VSS nfet_03v3 w=3u l=2.24u nf=6 m=1 +MM2 net11 IIN1 VSS VSS nfet_03v3 w=3u l=2.24u nf=6 m=1 +MM3 IREF1 net11 VSS VSS nfet_03v3 w=1.5u l=2.24u nf=3 m=1 +MM4 IOUT1 IREF1 net11 VSS nfet_03v3 w=3u l=2.24u nf=6 m=1 +.ends C14_gf180_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1.5_sL2/target_lvs.spice new file mode 100644 index 00000000..374f61d5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1.5_sL2/target_lvs.spice @@ -0,0 +1,23 @@ +.subckt C14_gf180_sW1.5_sL2 VSS IIN1 IOUT1 IREF1 +MM1_f0 IIN1 IIN1 VSS VSS nfet_03v3 w=0.5u l=2.24u +MM1_f1 IIN1 IIN1 VSS VSS nfet_03v3 w=0.5u l=2.24u +MM1_f2 IIN1 IIN1 VSS VSS nfet_03v3 w=0.5u l=2.24u +MM1_f3 IIN1 IIN1 VSS VSS nfet_03v3 w=0.5u l=2.24u +MM1_f4 IIN1 IIN1 VSS VSS nfet_03v3 w=0.5u l=2.24u +MM1_f5 IIN1 IIN1 VSS VSS nfet_03v3 w=0.5u l=2.24u +MM2_f0 net11 IIN1 VSS VSS nfet_03v3 w=0.5u l=2.24u +MM2_f1 net11 IIN1 VSS VSS nfet_03v3 w=0.5u l=2.24u +MM2_f2 net11 IIN1 VSS VSS nfet_03v3 w=0.5u l=2.24u +MM2_f3 net11 IIN1 VSS VSS nfet_03v3 w=0.5u l=2.24u +MM2_f4 net11 IIN1 VSS VSS nfet_03v3 w=0.5u l=2.24u +MM2_f5 net11 IIN1 VSS VSS nfet_03v3 w=0.5u l=2.24u +MM3_f0 IREF1 net11 VSS VSS nfet_03v3 w=0.5u l=2.24u +MM3_f1 IREF1 net11 VSS VSS nfet_03v3 w=0.5u l=2.24u +MM3_f2 IREF1 net11 VSS VSS nfet_03v3 w=0.5u l=2.24u +MM4_f0 IOUT1 IREF1 net11 VSS nfet_03v3 w=0.5u l=2.24u +MM4_f1 IOUT1 IREF1 net11 VSS nfet_03v3 w=0.5u l=2.24u +MM4_f2 IOUT1 IREF1 net11 VSS nfet_03v3 w=0.5u l=2.24u +MM4_f3 IOUT1 IREF1 net11 VSS nfet_03v3 w=0.5u l=2.24u +MM4_f4 IOUT1 IREF1 net11 VSS nfet_03v3 w=0.5u l=2.24u +MM4_f5 IOUT1 IREF1 net11 VSS nfet_03v3 w=0.5u l=2.24u +.ends C14_gf180_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1.5_sL2/testbench.spice new file mode 100644 index 00000000..507487ea --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1.5_sL2/testbench.spice @@ -0,0 +1,26 @@ +X1 VSS IIN1 IOUT1 IREF1 C14_gf180_sW1.5_sL2 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIIN1 VDDB IIN1 2e-05 +IIREF1 VDDB IREF1 5e-06 +.nodeset v(IIN1)=0.99 v(IREF1)=0.99 + +VOUT IOUT1 0 3.3 +.control +dc VOUT 3.3 0 -0.00825 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=1.96 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.03 cross=last +meas dc dev_at_vdd find dev at=3.2835 +let gout = deriv(iout) +meas dc gout_t find gout at=1.96 +let rout_v = 1/gout +meas dc rout_t find rout_v at=1.96 +echo vout_test = 1.96 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1_sL1.5/case.json new file mode 100644 index 00000000..94f6757d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1_sL1.5/case.json @@ -0,0 +1,152 @@ +{ + "case_id": "C14_gf180_sW1_sL1.5", + "circuit_id": "C14", + "pdk": "gf180", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "dut_name": "C14_gf180_sW1_sL1.5", + "ports": [ + "VSS", + "IIN1", + "IOUT1", + "IREF1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 1.68, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 1.68, + "nf": 4 + }, + "M3": { + "w": 1.0, + "l": 1.68, + "nf": 2 + }, + "M4": { + "w": 2.0, + "l": 1.68, + "nf": 4 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF1": { + "i": 5e-06, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 2.145, + "tol": 0.03, + "vout_test": 1.97 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.68, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.68, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 1.0, + "l0": 1.12, + "nf0": 2, + "uw0": 0.5, + "w": 1.0, + "l": 1.68, + "nf": 2, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.68, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "66fb7161948868f1", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "ideal_current_source", + "port": "IREF1", + "current_A": 5e-06, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1_sL1.5/manifest.json new file mode 100644 index 00000000..d036b0dc --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "4d4f377e5cdf829b019e29a26cbc9d453b253fc8db48e5541ef273d7242d14fc", + "qualification.json": "1d2621cc2bce8e7fedd478b18549607d4b91d8c632df6742e753f23ccb4ea690", + "specs.json": "ff2fc86d6c1c720a13d6975066526112fc32aff24feb50efd8879a51b66caba8", + "target.spice": "65d3808744f79c36c89b05e6e04180097b6ca287a4a04f40f667a033fb9c2be3", + "target_lvs.spice": "fdb8cc77227a07fc41ca668b7c9bd28b77a6068713f53e634bf43fd5ec20489e", + "testbench.spice": "0d4dd5287a19be606c529aaef99032f4ce472b7428105b98481a267f7a3225c3" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1_sL1.5/qualification.json new file mode 100644 index 00000000..d5fbc78f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1_sL1.5/qualification.json @@ -0,0 +1,115 @@ +{ + "case_id": "C14_gf180_sW1_sL1.5", + "circuit_id": "C14", + "pdk": "gf180", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.68, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.68, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 1.0, + "l0": 1.12, + "nf0": 2, + "uw0": 0.5, + "w": 1.0, + "l": 1.68, + "nf": 2, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.68, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "66fb7161948868f1", + "mirror_pass1": { + "vmin": 0.6433773, + "status": "passed", + "vout_test": 1.97 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.7434 + }, + "_frozen_from": { + "schematic": { + "err": -0.002634, + "vmin": 0.6433773 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.9799999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "iout_t": 1.994732e-05, + "err": -0.002634, + "vmin": 0.6433773, + "dev_at_vdd": 0.002509207, + "gout_t": 1.08626e-11, + "rout_t": 92060170000.0, + "vout_test": 1.97, + "rout_nom": 92060170000.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1_sL1.5/specs.json new file mode 100644 index 00000000..22f73643 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.7434 + }, + "_frozen_from": { + "schematic": { + "err": -0.002634, + "vmin": 0.6433773 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.9799999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1_sL1.5/target.spice new file mode 100644 index 00000000..3aaf7ca5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1_sL1.5/target.spice @@ -0,0 +1,6 @@ +.subckt C14_gf180_sW1_sL1.5 VSS IIN1 IOUT1 IREF1 +MM1 IIN1 IIN1 VSS VSS nfet_03v3 w=2u l=1.68u nf=4 m=1 +MM2 net11 IIN1 VSS VSS nfet_03v3 w=2u l=1.68u nf=4 m=1 +MM3 IREF1 net11 VSS VSS nfet_03v3 w=1u l=1.68u nf=2 m=1 +MM4 IOUT1 IREF1 net11 VSS nfet_03v3 w=2u l=1.68u nf=4 m=1 +.ends C14_gf180_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1_sL1.5/target_lvs.spice new file mode 100644 index 00000000..ff2f1838 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1_sL1.5/target_lvs.spice @@ -0,0 +1,16 @@ +.subckt C14_gf180_sW1_sL1.5 VSS IIN1 IOUT1 IREF1 +MM1_f0 IIN1 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.68u +MM1_f1 IIN1 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.68u +MM1_f2 IIN1 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.68u +MM1_f3 IIN1 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.68u +MM2_f0 net11 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.68u +MM2_f1 net11 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.68u +MM2_f2 net11 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.68u +MM2_f3 net11 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.68u +MM3_f0 IREF1 net11 VSS VSS nfet_03v3 w=0.5u l=1.68u +MM3_f1 IREF1 net11 VSS VSS nfet_03v3 w=0.5u l=1.68u +MM4_f0 IOUT1 IREF1 net11 VSS nfet_03v3 w=0.5u l=1.68u +MM4_f1 IOUT1 IREF1 net11 VSS nfet_03v3 w=0.5u l=1.68u +MM4_f2 IOUT1 IREF1 net11 VSS nfet_03v3 w=0.5u l=1.68u +MM4_f3 IOUT1 IREF1 net11 VSS nfet_03v3 w=0.5u l=1.68u +.ends C14_gf180_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1_sL1.5/testbench.spice new file mode 100644 index 00000000..470f22ef --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1_sL1.5/testbench.spice @@ -0,0 +1,26 @@ +X1 VSS IIN1 IOUT1 IREF1 C14_gf180_sW1_sL1.5 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIIN1 VDDB IIN1 2e-05 +IIREF1 VDDB IREF1 5e-06 +.nodeset v(IIN1)=0.99 v(IREF1)=0.99 + +VOUT IOUT1 0 3.3 +.control +dc VOUT 3.3 0 -0.00825 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=1.97 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.03 cross=last +meas dc dev_at_vdd find dev at=3.2835 +let gout = deriv(iout) +meas dc gout_t find gout at=1.97 +let rout_v = 1/gout +meas dc rout_t find rout_v at=1.97 +echo vout_test = 1.97 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1_sL1/case.json new file mode 100644 index 00000000..5744f1a9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1_sL1/case.json @@ -0,0 +1,152 @@ +{ + "case_id": "C14_gf180_sW1_sL1", + "circuit_id": "C14", + "pdk": "gf180", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "dut_name": "C14_gf180_sW1_sL1", + "ports": [ + "VSS", + "IIN1", + "IOUT1", + "IREF1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 1.12, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 1.12, + "nf": 4 + }, + "M3": { + "w": 1.0, + "l": 1.12, + "nf": 2 + }, + "M4": { + "w": 2.0, + "l": 1.12, + "nf": 4 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF1": { + "i": 5e-06, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 2.145, + "tol": 0.03, + "vout_test": 1.95 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 1.0, + "l0": 1.12, + "nf0": 2, + "uw0": 0.5, + "w": 1.0, + "l": 1.12, + "nf": 2, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "eb0d615f654305b0", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "ideal_current_source", + "port": "IREF1", + "current_A": 5e-06, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1_sL1/manifest.json new file mode 100644 index 00000000..36c269e7 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "830f254340390ed86c566278dcf9ec3c6879ceb977e4858275ff3317d58bd5e9", + "qualification.json": "74ef673a5a1dbfeb76c0e0a25a3d95b6901e6c8a2eff5707745ca6d2a24b6442", + "specs.json": "003edfe3a956abf7852233f6e0ca254a04ed7cae4800119059a722eb327289a8", + "target.spice": "c396f9c7613aeff70a94119b7ac100a4d42891a29eac9d93a6961429bdf16a73", + "target_lvs.spice": "e369bf4dd67bb75cf5fb2127e5574a9759924af39bf7972716b8368f8adfe5e6", + "testbench.spice": "c9a6b3b694176f85b3cd3826a0cb94b44db3c2ab4529877728bdde4abb35475f" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1_sL1/qualification.json new file mode 100644 index 00000000..6ca16e64 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1_sL1/qualification.json @@ -0,0 +1,115 @@ +{ + "case_id": "C14_gf180_sW1_sL1", + "circuit_id": "C14", + "pdk": "gf180", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 1.0, + "l0": 1.12, + "nf0": 2, + "uw0": 0.5, + "w": 1.0, + "l": 1.12, + "nf": 2, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "eb0d615f654305b0", + "mirror_pass1": { + "vmin": 0.5939181, + "status": "passed", + "vout_test": 1.95 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.6939 + }, + "_frozen_from": { + "schematic": { + "err": -0.003444, + "vmin": 0.5939181 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.9799999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.2, + "schematic_measures": { + "iout_t": 1.993112e-05, + "err": -0.003444, + "vmin": 0.5939181, + "dev_at_vdd": 0.003301525, + "gout_t": 1.294508e-11, + "rout_t": 77250220000.0, + "vout_test": 1.95, + "rout_nom": 77250220000.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1_sL1/specs.json new file mode 100644 index 00000000..6f9883d3 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.6939 + }, + "_frozen_from": { + "schematic": { + "err": -0.003444, + "vmin": 0.5939181 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.9799999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1_sL1/target.spice new file mode 100644 index 00000000..8f9271b6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1_sL1/target.spice @@ -0,0 +1,6 @@ +.subckt C14_gf180_sW1_sL1 VSS IIN1 IOUT1 IREF1 +MM1 IIN1 IIN1 VSS VSS nfet_03v3 w=2u l=1.12u nf=4 m=1 +MM2 net11 IIN1 VSS VSS nfet_03v3 w=2u l=1.12u nf=4 m=1 +MM3 IREF1 net11 VSS VSS nfet_03v3 w=1u l=1.12u nf=2 m=1 +MM4 IOUT1 IREF1 net11 VSS nfet_03v3 w=2u l=1.12u nf=4 m=1 +.ends C14_gf180_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1_sL1/target_lvs.spice new file mode 100644 index 00000000..452ba627 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1_sL1/target_lvs.spice @@ -0,0 +1,16 @@ +.subckt C14_gf180_sW1_sL1 VSS IIN1 IOUT1 IREF1 +MM1_f0 IIN1 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM1_f1 IIN1 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM1_f2 IIN1 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM1_f3 IIN1 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM2_f0 net11 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM2_f1 net11 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM2_f2 net11 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM2_f3 net11 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f0 IREF1 net11 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f1 IREF1 net11 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM4_f0 IOUT1 IREF1 net11 VSS nfet_03v3 w=0.5u l=1.12u +MM4_f1 IOUT1 IREF1 net11 VSS nfet_03v3 w=0.5u l=1.12u +MM4_f2 IOUT1 IREF1 net11 VSS nfet_03v3 w=0.5u l=1.12u +MM4_f3 IOUT1 IREF1 net11 VSS nfet_03v3 w=0.5u l=1.12u +.ends C14_gf180_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1_sL1/testbench.spice new file mode 100644 index 00000000..087b41db --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1_sL1/testbench.spice @@ -0,0 +1,26 @@ +X1 VSS IIN1 IOUT1 IREF1 C14_gf180_sW1_sL1 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIIN1 VDDB IIN1 2e-05 +IIREF1 VDDB IREF1 5e-06 +.nodeset v(IIN1)=0.99 v(IREF1)=0.99 + +VOUT IOUT1 0 3.3 +.control +dc VOUT 3.3 0 -0.00825 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=1.95 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.03 cross=last +meas dc dev_at_vdd find dev at=3.2835 +let gout = deriv(iout) +meas dc gout_t find gout at=1.95 +let rout_v = 1/gout +meas dc rout_t find rout_v at=1.95 +echo vout_test = 1.95 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1_sL2/case.json new file mode 100644 index 00000000..09982a4e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1_sL2/case.json @@ -0,0 +1,152 @@ +{ + "case_id": "C14_gf180_sW1_sL2", + "circuit_id": "C14", + "pdk": "gf180", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "dut_name": "C14_gf180_sW1_sL2", + "ports": [ + "VSS", + "IIN1", + "IOUT1", + "IREF1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 2.24, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 2.24, + "nf": 4 + }, + "M3": { + "w": 1.0, + "l": 2.24, + "nf": 2 + }, + "M4": { + "w": 2.0, + "l": 2.24, + "nf": 4 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF1": { + "i": 5e-06, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 2.145, + "tol": 0.03, + "vout_test": 2.0 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 2.24, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 2.24, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 1.0, + "l0": 1.12, + "nf0": 2, + "uw0": 0.5, + "w": 1.0, + "l": 2.24, + "nf": 2, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 2.24, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "be9d26616d20ba9f", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "ideal_current_source", + "port": "IREF1", + "current_A": 5e-06, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1_sL2/manifest.json new file mode 100644 index 00000000..0efa094c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "6efd686b9765c1b846f6e2779d7c1bc8c2440b5bfc90f856967f56806327fcde", + "qualification.json": "f237f3d77d15209aa3d17c671ae4bdc26cc2c1af16efda3715c0dd4ed145b3dd", + "specs.json": "6de23aebe67b593e491ba5f6d5f2766a3f07e0c2c07fded9a663a4a27e7adcd8", + "target.spice": "b893974d52c0d53257d21b307e7cc6af4479e208393c7918fb3acd08c582f64d", + "target_lvs.spice": "a4eb9a5f462e108e0c309680c32fd1a7f0cb76bb09fb47a044e409533ff7f001", + "testbench.spice": "b93f88fb7c6494a4163ab619bcb293cadede127d5ff4f8a48de9e5cae4bc0478" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1_sL2/qualification.json new file mode 100644 index 00000000..74d76a49 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1_sL2/qualification.json @@ -0,0 +1,115 @@ +{ + "case_id": "C14_gf180_sW1_sL2", + "circuit_id": "C14", + "pdk": "gf180", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 2.24, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 2.24, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 1.0, + "l0": 1.12, + "nf0": 2, + "uw0": 0.5, + "w": 1.0, + "l": 2.24, + "nf": 2, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 2.24, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "be9d26616d20ba9f", + "mirror_pass1": { + "vmin": 0.7010976, + "status": "passed", + "vout_test": 2.0 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.8011 + }, + "_frozen_from": { + "schematic": { + "err": -0.002207, + "vmin": 0.7010976 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.9799999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "iout_t": 1.995586e-05, + "err": -0.002207, + "vmin": 0.7010976, + "dev_at_vdd": 0.002173331, + "gout_t": 1.070011e-11, + "rout_t": 93460290000.0, + "vout_test": 2.0, + "rout_nom": 93460290000.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1_sL2/specs.json new file mode 100644 index 00000000..35109b5c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.8011 + }, + "_frozen_from": { + "schematic": { + "err": -0.002207, + "vmin": 0.7010976 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.9799999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1_sL2/target.spice new file mode 100644 index 00000000..3b347fa7 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1_sL2/target.spice @@ -0,0 +1,6 @@ +.subckt C14_gf180_sW1_sL2 VSS IIN1 IOUT1 IREF1 +MM1 IIN1 IIN1 VSS VSS nfet_03v3 w=2u l=2.24u nf=4 m=1 +MM2 net11 IIN1 VSS VSS nfet_03v3 w=2u l=2.24u nf=4 m=1 +MM3 IREF1 net11 VSS VSS nfet_03v3 w=1u l=2.24u nf=2 m=1 +MM4 IOUT1 IREF1 net11 VSS nfet_03v3 w=2u l=2.24u nf=4 m=1 +.ends C14_gf180_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1_sL2/target_lvs.spice new file mode 100644 index 00000000..d02db2b5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1_sL2/target_lvs.spice @@ -0,0 +1,16 @@ +.subckt C14_gf180_sW1_sL2 VSS IIN1 IOUT1 IREF1 +MM1_f0 IIN1 IIN1 VSS VSS nfet_03v3 w=0.5u l=2.24u +MM1_f1 IIN1 IIN1 VSS VSS nfet_03v3 w=0.5u l=2.24u +MM1_f2 IIN1 IIN1 VSS VSS nfet_03v3 w=0.5u l=2.24u +MM1_f3 IIN1 IIN1 VSS VSS nfet_03v3 w=0.5u l=2.24u +MM2_f0 net11 IIN1 VSS VSS nfet_03v3 w=0.5u l=2.24u +MM2_f1 net11 IIN1 VSS VSS nfet_03v3 w=0.5u l=2.24u +MM2_f2 net11 IIN1 VSS VSS nfet_03v3 w=0.5u l=2.24u +MM2_f3 net11 IIN1 VSS VSS nfet_03v3 w=0.5u l=2.24u +MM3_f0 IREF1 net11 VSS VSS nfet_03v3 w=0.5u l=2.24u +MM3_f1 IREF1 net11 VSS VSS nfet_03v3 w=0.5u l=2.24u +MM4_f0 IOUT1 IREF1 net11 VSS nfet_03v3 w=0.5u l=2.24u +MM4_f1 IOUT1 IREF1 net11 VSS nfet_03v3 w=0.5u l=2.24u +MM4_f2 IOUT1 IREF1 net11 VSS nfet_03v3 w=0.5u l=2.24u +MM4_f3 IOUT1 IREF1 net11 VSS nfet_03v3 w=0.5u l=2.24u +.ends C14_gf180_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1_sL2/testbench.spice new file mode 100644 index 00000000..5890a8cc --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW1_sL2/testbench.spice @@ -0,0 +1,26 @@ +X1 VSS IIN1 IOUT1 IREF1 C14_gf180_sW1_sL2 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIIN1 VDDB IIN1 2e-05 +IIREF1 VDDB IREF1 5e-06 +.nodeset v(IIN1)=0.99 v(IREF1)=0.99 + +VOUT IOUT1 0 3.3 +.control +dc VOUT 3.3 0 -0.00825 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=2 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.03 cross=last +meas dc dev_at_vdd find dev at=3.2835 +let gout = deriv(iout) +meas dc gout_t find gout at=2 +let rout_v = 1/gout +meas dc rout_t find rout_v at=2 +echo vout_test = 2 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C14/gf180/sW2_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW2_sL1.5/case.json new file mode 100644 index 00000000..8dce7376 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW2_sL1.5/case.json @@ -0,0 +1,152 @@ +{ + "case_id": "C14_gf180_sW2_sL1.5", + "circuit_id": "C14", + "pdk": "gf180", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "dut_name": "C14_gf180_sW2_sL1.5", + "ports": [ + "VSS", + "IIN1", + "IOUT1", + "IREF1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 1.68, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 1.68, + "nf": 8 + }, + "M3": { + "w": 2.0, + "l": 1.68, + "nf": 4 + }, + "M4": { + "w": 4.0, + "l": 1.68, + "nf": 8 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF1": { + "i": 5e-06, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 2.145, + "tol": 0.03, + "vout_test": 1.92 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.68, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.68, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 1.0, + "l0": 1.12, + "nf0": 2, + "uw0": 0.5, + "w": 2.0, + "l": 1.68, + "nf": 4, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.68, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "50e268d6bfb195a2", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "ideal_current_source", + "port": "IREF1", + "current_A": 5e-06, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/gf180/sW2_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW2_sL1.5/manifest.json new file mode 100644 index 00000000..63af15e1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW2_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "ce40ca36a0f3de35e728eb3420c403216e7f414c0726ed41a73b200758f7fa6a", + "qualification.json": "5e3f058dae9aea04a396c8a1560fd46f32468787c940d8c244cb44f7439b83a6", + "specs.json": "ae10d5393a8827471211454cc8275a379f4152ecbd840fe84f69575d05bafca2", + "target.spice": "4d29d1622c7cfcb04d480c14e23d12ff8d06cad9d60d4bbc13374a56b184856e", + "target_lvs.spice": "233cc05641a02ffce21a443f378b0841b760f6072cab0e2a256fc97908b3c517", + "testbench.spice": "319d70668fb89962a605df9dcce235bd2783e214845200193247c7f0d30cfb01" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/gf180/sW2_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW2_sL1.5/qualification.json new file mode 100644 index 00000000..4c5ba30a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW2_sL1.5/qualification.json @@ -0,0 +1,115 @@ +{ + "case_id": "C14_gf180_sW2_sL1.5", + "circuit_id": "C14", + "pdk": "gf180", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.68, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.68, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 1.0, + "l0": 1.12, + "nf0": 2, + "uw0": 0.5, + "w": 2.0, + "l": 1.68, + "nf": 4, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.68, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "50e268d6bfb195a2", + "mirror_pass1": { + "vmin": 0.5442732, + "status": "passed", + "vout_test": 1.92 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.6443 + }, + "_frozen_from": { + "schematic": { + "err": -0.0021705, + "vmin": 0.5442732 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.9799999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.2, + "schematic_measures": { + "iout_t": 1.995659e-05, + "err": -0.0021705, + "vmin": 0.5442732, + "dev_at_vdd": 0.001501267, + "gout_t": 1.099459e-11, + "rout_t": 90953880000.0, + "vout_test": 1.92, + "rout_nom": 90953880000.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/gf180/sW2_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW2_sL1.5/specs.json new file mode 100644 index 00000000..f03a6219 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW2_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.6443 + }, + "_frozen_from": { + "schematic": { + "err": -0.0021705, + "vmin": 0.5442732 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.9799999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/gf180/sW2_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW2_sL1.5/target.spice new file mode 100644 index 00000000..3ca37b71 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW2_sL1.5/target.spice @@ -0,0 +1,6 @@ +.subckt C14_gf180_sW2_sL1.5 VSS IIN1 IOUT1 IREF1 +MM1 IIN1 IIN1 VSS VSS nfet_03v3 w=4u l=1.68u nf=8 m=1 +MM2 net11 IIN1 VSS VSS nfet_03v3 w=4u l=1.68u nf=8 m=1 +MM3 IREF1 net11 VSS VSS nfet_03v3 w=2u l=1.68u nf=4 m=1 +MM4 IOUT1 IREF1 net11 VSS nfet_03v3 w=4u l=1.68u nf=8 m=1 +.ends C14_gf180_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C14/gf180/sW2_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW2_sL1.5/target_lvs.spice new file mode 100644 index 00000000..21e76d9e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW2_sL1.5/target_lvs.spice @@ -0,0 +1,30 @@ +.subckt C14_gf180_sW2_sL1.5 VSS IIN1 IOUT1 IREF1 +MM1_f0 IIN1 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.68u +MM1_f1 IIN1 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.68u +MM1_f2 IIN1 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.68u +MM1_f3 IIN1 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.68u +MM1_f4 IIN1 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.68u +MM1_f5 IIN1 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.68u +MM1_f6 IIN1 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.68u +MM1_f7 IIN1 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.68u +MM2_f0 net11 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.68u +MM2_f1 net11 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.68u +MM2_f2 net11 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.68u +MM2_f3 net11 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.68u +MM2_f4 net11 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.68u +MM2_f5 net11 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.68u +MM2_f6 net11 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.68u +MM2_f7 net11 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.68u +MM3_f0 IREF1 net11 VSS VSS nfet_03v3 w=0.5u l=1.68u +MM3_f1 IREF1 net11 VSS VSS nfet_03v3 w=0.5u l=1.68u +MM3_f2 IREF1 net11 VSS VSS nfet_03v3 w=0.5u l=1.68u +MM3_f3 IREF1 net11 VSS VSS nfet_03v3 w=0.5u l=1.68u +MM4_f0 IOUT1 IREF1 net11 VSS nfet_03v3 w=0.5u l=1.68u +MM4_f1 IOUT1 IREF1 net11 VSS nfet_03v3 w=0.5u l=1.68u +MM4_f2 IOUT1 IREF1 net11 VSS nfet_03v3 w=0.5u l=1.68u +MM4_f3 IOUT1 IREF1 net11 VSS nfet_03v3 w=0.5u l=1.68u +MM4_f4 IOUT1 IREF1 net11 VSS nfet_03v3 w=0.5u l=1.68u +MM4_f5 IOUT1 IREF1 net11 VSS nfet_03v3 w=0.5u l=1.68u +MM4_f6 IOUT1 IREF1 net11 VSS nfet_03v3 w=0.5u l=1.68u +MM4_f7 IOUT1 IREF1 net11 VSS nfet_03v3 w=0.5u l=1.68u +.ends C14_gf180_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C14/gf180/sW2_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW2_sL1.5/testbench.spice new file mode 100644 index 00000000..0ccfae55 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW2_sL1.5/testbench.spice @@ -0,0 +1,26 @@ +X1 VSS IIN1 IOUT1 IREF1 C14_gf180_sW2_sL1.5 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIIN1 VDDB IIN1 2e-05 +IIREF1 VDDB IREF1 5e-06 +.nodeset v(IIN1)=0.99 v(IREF1)=0.99 + +VOUT IOUT1 0 3.3 +.control +dc VOUT 3.3 0 -0.00825 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=1.92 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.03 cross=last +meas dc dev_at_vdd find dev at=3.2835 +let gout = deriv(iout) +meas dc gout_t find gout at=1.92 +let rout_v = 1/gout +meas dc rout_t find rout_v at=1.92 +echo vout_test = 1.92 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C14/gf180/sW2_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW2_sL1/case.json new file mode 100644 index 00000000..ede87b48 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW2_sL1/case.json @@ -0,0 +1,152 @@ +{ + "case_id": "C14_gf180_sW2_sL1", + "circuit_id": "C14", + "pdk": "gf180", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "dut_name": "C14_gf180_sW2_sL1", + "ports": [ + "VSS", + "IIN1", + "IOUT1", + "IREF1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 1.12, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 1.12, + "nf": 8 + }, + "M3": { + "w": 2.0, + "l": 1.12, + "nf": 4 + }, + "M4": { + "w": 4.0, + "l": 1.12, + "nf": 8 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF1": { + "i": 5e-06, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 2.145, + "tol": 0.03, + "vout_test": 1.9 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 1.0, + "l0": 1.12, + "nf0": 2, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "5fb7a92c99701474", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "ideal_current_source", + "port": "IREF1", + "current_A": 5e-06, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/gf180/sW2_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW2_sL1/manifest.json new file mode 100644 index 00000000..25d5e7f1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW2_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "f611217e4ffa7f45e410bb3357c7521918f337ed46b9de4a416b05d95509a812", + "qualification.json": "9b5eefbe84a9ee017ac48cdbacd6bb2f66d4cf63b07a686b9eceaba8561d0335", + "specs.json": "e9bfce1059bf1cd0b17d3475a17053fc4d88ec1e6648ca871d9fb9461f22a984", + "target.spice": "25ecafe3cc7203213c4144c77da529196772e3338a9a11a061060c12f081f288", + "target_lvs.spice": "6ca94b8beb9e19746f6a3358a575974800459a1599c6088346672959899bed23", + "testbench.spice": "0f7614db6b2c80112817eaba5bbd46ab814d827fcdcc9a3e87197fdc4624fd87" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/gf180/sW2_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW2_sL1/qualification.json new file mode 100644 index 00000000..4f621515 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW2_sL1/qualification.json @@ -0,0 +1,115 @@ +{ + "case_id": "C14_gf180_sW2_sL1", + "circuit_id": "C14", + "pdk": "gf180", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 1.0, + "l0": 1.12, + "nf0": 2, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "5fb7a92c99701474", + "mirror_pass1": { + "vmin": 0.5030476, + "status": "passed", + "vout_test": 1.9 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.603 + }, + "_frozen_from": { + "schematic": { + "err": -0.0028555, + "vmin": 0.5030476 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.9799999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.2, + "schematic_measures": { + "iout_t": 1.994289e-05, + "err": -0.0028555, + "vmin": 0.5030476, + "dev_at_vdd": 0.002409741, + "gout_t": 1.426431e-11, + "rout_t": 70105130000.0, + "vout_test": 1.9, + "rout_nom": 70105130000.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/gf180/sW2_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW2_sL1/specs.json new file mode 100644 index 00000000..8f44a9f5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW2_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.603 + }, + "_frozen_from": { + "schematic": { + "err": -0.0028555, + "vmin": 0.5030476 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.9799999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/gf180/sW2_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW2_sL1/target.spice new file mode 100644 index 00000000..0dd59dc3 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW2_sL1/target.spice @@ -0,0 +1,6 @@ +.subckt C14_gf180_sW2_sL1 VSS IIN1 IOUT1 IREF1 +MM1 IIN1 IIN1 VSS VSS nfet_03v3 w=4u l=1.12u nf=8 m=1 +MM2 net11 IIN1 VSS VSS nfet_03v3 w=4u l=1.12u nf=8 m=1 +MM3 IREF1 net11 VSS VSS nfet_03v3 w=2u l=1.12u nf=4 m=1 +MM4 IOUT1 IREF1 net11 VSS nfet_03v3 w=4u l=1.12u nf=8 m=1 +.ends C14_gf180_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C14/gf180/sW2_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW2_sL1/target_lvs.spice new file mode 100644 index 00000000..694d8ade --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW2_sL1/target_lvs.spice @@ -0,0 +1,30 @@ +.subckt C14_gf180_sW2_sL1 VSS IIN1 IOUT1 IREF1 +MM1_f0 IIN1 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM1_f1 IIN1 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM1_f2 IIN1 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM1_f3 IIN1 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM1_f4 IIN1 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM1_f5 IIN1 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM1_f6 IIN1 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM1_f7 IIN1 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM2_f0 net11 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM2_f1 net11 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM2_f2 net11 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM2_f3 net11 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM2_f4 net11 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM2_f5 net11 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM2_f6 net11 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM2_f7 net11 IIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f0 IREF1 net11 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f1 IREF1 net11 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f2 IREF1 net11 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f3 IREF1 net11 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM4_f0 IOUT1 IREF1 net11 VSS nfet_03v3 w=0.5u l=1.12u +MM4_f1 IOUT1 IREF1 net11 VSS nfet_03v3 w=0.5u l=1.12u +MM4_f2 IOUT1 IREF1 net11 VSS nfet_03v3 w=0.5u l=1.12u +MM4_f3 IOUT1 IREF1 net11 VSS nfet_03v3 w=0.5u l=1.12u +MM4_f4 IOUT1 IREF1 net11 VSS nfet_03v3 w=0.5u l=1.12u +MM4_f5 IOUT1 IREF1 net11 VSS nfet_03v3 w=0.5u l=1.12u +MM4_f6 IOUT1 IREF1 net11 VSS nfet_03v3 w=0.5u l=1.12u +MM4_f7 IOUT1 IREF1 net11 VSS nfet_03v3 w=0.5u l=1.12u +.ends C14_gf180_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C14/gf180/sW2_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW2_sL1/testbench.spice new file mode 100644 index 00000000..fb69a5f9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW2_sL1/testbench.spice @@ -0,0 +1,26 @@ +X1 VSS IIN1 IOUT1 IREF1 C14_gf180_sW2_sL1 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIIN1 VDDB IIN1 2e-05 +IIREF1 VDDB IREF1 5e-06 +.nodeset v(IIN1)=0.99 v(IREF1)=0.99 + +VOUT IOUT1 0 3.3 +.control +dc VOUT 3.3 0 -0.00825 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=1.9 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.03 cross=last +meas dc dev_at_vdd find dev at=3.2835 +let gout = deriv(iout) +meas dc gout_t find gout at=1.9 +let rout_v = 1/gout +meas dc rout_t find rout_v at=1.9 +echo vout_test = 1.9 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C14/gf180/sW2_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW2_sL2/case.json new file mode 100644 index 00000000..88b12adc --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW2_sL2/case.json @@ -0,0 +1,152 @@ +{ + "case_id": "C14_gf180_sW2_sL2", + "circuit_id": "C14", + "pdk": "gf180", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "dut_name": "C14_gf180_sW2_sL2", + "ports": [ + "VSS", + "IIN1", + "IOUT1", + "IREF1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 2.24, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 2.24, + "nf": 8 + }, + "M3": { + "w": 2.0, + "l": 2.24, + "nf": 4 + }, + "M4": { + "w": 4.0, + "l": 2.24, + "nf": 8 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF1": { + "i": 5e-06, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 2.145, + "tol": 0.03, + "vout_test": 1.94 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 2.24, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 2.24, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 1.0, + "l0": 1.12, + "nf0": 2, + "uw0": 0.5, + "w": 2.0, + "l": 2.24, + "nf": 4, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 2.24, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "e2ab2475e07a8df1", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "ideal_current_source", + "port": "IREF1", + "current_A": 5e-06, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/gf180/sW2_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW2_sL2/manifest.json new file mode 100644 index 00000000..b548cf3c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW2_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "3df461a2f72371b27826005e72d7b3390de7ddf1a2453cd9d2582e75bf315c4c", + "qualification.json": "5915268599359b95d2f9d74474bafd654bc06a5a1242b25c0c14c31f4f6dfc55", + "specs.json": "59548061a26b1de9d0be34c86808c86469dd2d08b852fc31ae50b9ad7ae740f3", + "target.spice": "ac5b07fd2be5190aad7b3f403718a1c22cd340fd97d3165ec18a17e0b35c4398", + "target_lvs.spice": "65ccef923ca373625bf763468cf4984b7b93582ed97ef14669296721109da699", + "testbench.spice": "bf2915c52b1ff7e105fdc4b3c575b35071f2239a875e802a94b23b27bc7533fc" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/gf180/sW2_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW2_sL2/qualification.json new file mode 100644 index 00000000..91265d01 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW2_sL2/qualification.json @@ -0,0 +1,115 @@ +{ + "case_id": "C14_gf180_sW2_sL2", + "circuit_id": "C14", + "pdk": "gf180", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 2.24, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 2.24, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 1.0, + "l0": 1.12, + "nf0": 2, + "uw0": 0.5, + "w": 2.0, + "l": 2.24, + "nf": 4, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 2.24, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "e2ab2475e07a8df1", + "mirror_pass1": { + "vmin": 0.5855146, + "status": "passed", + "vout_test": 1.94 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.6855 + }, + "_frozen_from": { + "schematic": { + "err": -0.0018125, + "vmin": 0.5855146 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.9799999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.2, + "schematic_measures": { + "iout_t": 1.996375e-05, + "err": -0.0018125, + "vmin": 0.5855146, + "dev_at_vdd": 0.001489803, + "gout_t": 9.950808e-12, + "rout_t": 100494400000.0, + "vout_test": 1.94, + "rout_nom": 100494400000.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/gf180/sW2_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW2_sL2/specs.json new file mode 100644 index 00000000..45293dfe --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW2_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.6855 + }, + "_frozen_from": { + "schematic": { + "err": -0.0018125, + "vmin": 0.5855146 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.9799999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/gf180/sW2_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW2_sL2/target.spice new file mode 100644 index 00000000..0f2b1960 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW2_sL2/target.spice @@ -0,0 +1,6 @@ +.subckt C14_gf180_sW2_sL2 VSS IIN1 IOUT1 IREF1 +MM1 IIN1 IIN1 VSS VSS nfet_03v3 w=4u l=2.24u nf=8 m=1 +MM2 net11 IIN1 VSS VSS nfet_03v3 w=4u l=2.24u nf=8 m=1 +MM3 IREF1 net11 VSS VSS nfet_03v3 w=2u l=2.24u nf=4 m=1 +MM4 IOUT1 IREF1 net11 VSS nfet_03v3 w=4u l=2.24u nf=8 m=1 +.ends C14_gf180_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C14/gf180/sW2_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW2_sL2/target_lvs.spice new file mode 100644 index 00000000..aa789fbd --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW2_sL2/target_lvs.spice @@ -0,0 +1,30 @@ +.subckt C14_gf180_sW2_sL2 VSS IIN1 IOUT1 IREF1 +MM1_f0 IIN1 IIN1 VSS VSS nfet_03v3 w=0.5u l=2.24u +MM1_f1 IIN1 IIN1 VSS VSS nfet_03v3 w=0.5u l=2.24u +MM1_f2 IIN1 IIN1 VSS VSS nfet_03v3 w=0.5u l=2.24u +MM1_f3 IIN1 IIN1 VSS VSS nfet_03v3 w=0.5u l=2.24u +MM1_f4 IIN1 IIN1 VSS VSS nfet_03v3 w=0.5u l=2.24u +MM1_f5 IIN1 IIN1 VSS VSS nfet_03v3 w=0.5u l=2.24u +MM1_f6 IIN1 IIN1 VSS VSS nfet_03v3 w=0.5u l=2.24u +MM1_f7 IIN1 IIN1 VSS VSS nfet_03v3 w=0.5u l=2.24u +MM2_f0 net11 IIN1 VSS VSS nfet_03v3 w=0.5u l=2.24u +MM2_f1 net11 IIN1 VSS VSS nfet_03v3 w=0.5u l=2.24u +MM2_f2 net11 IIN1 VSS VSS nfet_03v3 w=0.5u l=2.24u +MM2_f3 net11 IIN1 VSS VSS nfet_03v3 w=0.5u l=2.24u +MM2_f4 net11 IIN1 VSS VSS nfet_03v3 w=0.5u l=2.24u +MM2_f5 net11 IIN1 VSS VSS nfet_03v3 w=0.5u l=2.24u +MM2_f6 net11 IIN1 VSS VSS nfet_03v3 w=0.5u l=2.24u +MM2_f7 net11 IIN1 VSS VSS nfet_03v3 w=0.5u l=2.24u +MM3_f0 IREF1 net11 VSS VSS nfet_03v3 w=0.5u l=2.24u +MM3_f1 IREF1 net11 VSS VSS nfet_03v3 w=0.5u l=2.24u +MM3_f2 IREF1 net11 VSS VSS nfet_03v3 w=0.5u l=2.24u +MM3_f3 IREF1 net11 VSS VSS nfet_03v3 w=0.5u l=2.24u +MM4_f0 IOUT1 IREF1 net11 VSS nfet_03v3 w=0.5u l=2.24u +MM4_f1 IOUT1 IREF1 net11 VSS nfet_03v3 w=0.5u l=2.24u +MM4_f2 IOUT1 IREF1 net11 VSS nfet_03v3 w=0.5u l=2.24u +MM4_f3 IOUT1 IREF1 net11 VSS nfet_03v3 w=0.5u l=2.24u +MM4_f4 IOUT1 IREF1 net11 VSS nfet_03v3 w=0.5u l=2.24u +MM4_f5 IOUT1 IREF1 net11 VSS nfet_03v3 w=0.5u l=2.24u +MM4_f6 IOUT1 IREF1 net11 VSS nfet_03v3 w=0.5u l=2.24u +MM4_f7 IOUT1 IREF1 net11 VSS nfet_03v3 w=0.5u l=2.24u +.ends C14_gf180_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C14/gf180/sW2_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW2_sL2/testbench.spice new file mode 100644 index 00000000..61c41bd6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/gf180/sW2_sL2/testbench.spice @@ -0,0 +1,26 @@ +X1 VSS IIN1 IOUT1 IREF1 C14_gf180_sW2_sL2 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIIN1 VDDB IIN1 2e-05 +IIREF1 VDDB IREF1 5e-06 +.nodeset v(IIN1)=0.99 v(IREF1)=0.99 + +VOUT IOUT1 0 3.3 +.control +dc VOUT 3.3 0 -0.00825 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=1.94 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.03 cross=last +meas dc dev_at_vdd find dev at=3.2835 +let gout = deriv(iout) +meas dc gout_t find gout at=1.94 +let rout_v = 1/gout +meas dc rout_t find rout_v at=1.94 +echo vout_test = 1.94 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW0.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW0.5_sL1.5/case.json new file mode 100644 index 00000000..57b835fd --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW0.5_sL1.5/case.json @@ -0,0 +1,152 @@ +{ + "case_id": "C14_ihp130_sW0.5_sL1.5", + "circuit_id": "C14", + "pdk": "ihp130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "dut_name": "C14_ihp130_sW0.5_sL1.5", + "ports": [ + "VSS", + "IIN1", + "IOUT1", + "IREF1" + ], + "sizing": { + "M1": { + "w": 1.0, + "l": 1.56, + "nf": 2 + }, + "M2": { + "w": 1.0, + "l": 1.56, + "nf": 2 + }, + "M3": { + "w": 0.5, + "l": 1.56, + "nf": 1 + }, + "M4": { + "w": 1.0, + "l": 1.56, + "nf": 2 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF1": { + "i": 5e-06, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 0.78, + "tol": 0.03, + "vout_test": 0.88 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.56, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.56, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 1.0, + "l0": 1.04, + "nf0": 2, + "uw0": 0.5, + "w": 0.5, + "l": 1.56, + "nf": 1, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.56, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "07e83c784eedc38a", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "ideal_current_source", + "port": "IREF1", + "current_A": 5e-06, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW0.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW0.5_sL1.5/manifest.json new file mode 100644 index 00000000..7e846827 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW0.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "5c210ea71ddb6b5a6bb6b252576d8969e84a30f4c78c5ae51be8fbd59097a2ad", + "qualification.json": "7e3029de5fcb17855a762edc3d79f455d32a4d4f077ef30970d93e9eec55fc1d", + "specs.json": "1299babee7fb795be07737f15b8207e473d32145bf93698d6040a5e68e1e8148", + "target.spice": "e37a7fb86de9dee582442faeca2b96dfa3ff644781ad493c121173841bc5869f", + "target_lvs.spice": "164504047e96da04a0c1544cc13a54c4cd666da6aee9c4f10bb8aadb93503797", + "testbench.spice": "ee3b452948db621c83d9f794c36ad38d54013feeff4b3d51c0ce8d20ccaa9f9e" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW0.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW0.5_sL1.5/qualification.json new file mode 100644 index 00000000..e29d398a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW0.5_sL1.5/qualification.json @@ -0,0 +1,115 @@ +{ + "case_id": "C14_ihp130_sW0.5_sL1.5", + "circuit_id": "C14", + "pdk": "ihp130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.56, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.56, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 1.0, + "l0": 1.04, + "nf0": 2, + "uw0": 0.5, + "w": 0.5, + "l": 1.56, + "nf": 1, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.56, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "07e83c784eedc38a", + "mirror_pass1": { + "vmin": 0.5686029, + "status": "passed", + "vout_test": 0.88 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.6686 + }, + "_frozen_from": { + "schematic": { + "err": -0.0212725, + "vmin": 0.5686029 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.72 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.3, + "schematic_measures": { + "iout_t": 1.957455e-05, + "err": -0.0212725, + "vmin": 0.5686029, + "dev_at_vdd": 0.02122927, + "gout_t": 7.647966e-09, + "rout_t": 130816600.0, + "vout_test": 0.88, + "rout_nom": 130816600.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW0.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW0.5_sL1.5/specs.json new file mode 100644 index 00000000..6b395686 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW0.5_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.6686 + }, + "_frozen_from": { + "schematic": { + "err": -0.0212725, + "vmin": 0.5686029 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.72 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW0.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW0.5_sL1.5/target.spice new file mode 100644 index 00000000..15129082 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW0.5_sL1.5/target.spice @@ -0,0 +1,6 @@ +.subckt C14_ihp130_sW0.5_sL1.5 VSS IIN1 IOUT1 IREF1 +XM1 IIN1 IIN1 VSS VSS sg13_lv_nmos w=1u l=1.56u ng=2 m=1 +XM2 net11 IIN1 VSS VSS sg13_lv_nmos w=1u l=1.56u ng=2 m=1 +XM3 IREF1 net11 VSS VSS sg13_lv_nmos w=0.5u l=1.56u ng=1 m=1 +XM4 IOUT1 IREF1 net11 VSS sg13_lv_nmos w=1u l=1.56u ng=2 m=1 +.ends C14_ihp130_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW0.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW0.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..81a7a89b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW0.5_sL1.5/target_lvs.spice @@ -0,0 +1,9 @@ +.subckt C14_ihp130_sW0.5_sL1.5 VSS IIN1 IOUT1 IREF1 +XM1_f0 IIN1 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.56u +XM1_f1 IIN1 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.56u +XM2_f0 net11 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.56u +XM2_f1 net11 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.56u +XM3_f0 IREF1 net11 VSS VSS sg13_lv_nmos w=0.5u l=1.56u +XM4_f0 IOUT1 IREF1 net11 VSS sg13_lv_nmos w=0.5u l=1.56u +XM4_f1 IOUT1 IREF1 net11 VSS sg13_lv_nmos w=0.5u l=1.56u +.ends C14_ihp130_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW0.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW0.5_sL1.5/testbench.spice new file mode 100644 index 00000000..4c9259a3 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW0.5_sL1.5/testbench.spice @@ -0,0 +1,26 @@ +X1 VSS IIN1 IOUT1 IREF1 C14_ihp130_sW0.5_sL1.5 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIIN1 VDDB IIN1 2e-05 +IIREF1 VDDB IREF1 5e-06 +.nodeset v(IIN1)=0.36 v(IREF1)=0.36 + +VOUT IOUT1 0 1.2 +.control +dc VOUT 1.2 0 -0.003 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=0.88 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.03 cross=last +meas dc dev_at_vdd find dev at=1.194 +let gout = deriv(iout) +meas dc gout_t find gout at=0.88 +let rout_v = 1/gout +meas dc rout_t find rout_v at=0.88 +echo vout_test = 0.88 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW0.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW0.5_sL1/case.json new file mode 100644 index 00000000..55e42dc4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW0.5_sL1/case.json @@ -0,0 +1,152 @@ +{ + "case_id": "C14_ihp130_sW0.5_sL1", + "circuit_id": "C14", + "pdk": "ihp130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "dut_name": "C14_ihp130_sW0.5_sL1", + "ports": [ + "VSS", + "IIN1", + "IOUT1", + "IREF1" + ], + "sizing": { + "M1": { + "w": 1.0, + "l": 1.04, + "nf": 2 + }, + "M2": { + "w": 1.0, + "l": 1.04, + "nf": 2 + }, + "M3": { + "w": 0.5, + "l": 1.04, + "nf": 1 + }, + "M4": { + "w": 1.0, + "l": 1.04, + "nf": 2 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF1": { + "i": 5e-06, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 0.78, + "tol": 0.03, + "vout_test": 0.86 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.04, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.04, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 1.0, + "l0": 1.04, + "nf0": 2, + "uw0": 0.5, + "w": 0.5, + "l": 1.04, + "nf": 1, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.04, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "5d3b293e01331d85", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "ideal_current_source", + "port": "IREF1", + "current_A": 5e-06, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW0.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW0.5_sL1/manifest.json new file mode 100644 index 00000000..91d92923 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW0.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "6ef1c132418bc3bdd5bc1d45a02bcc9735cb1a0c657369ed3e6f826731cfa1cf", + "qualification.json": "0eb5e0f9a0a8b3217d3023bc9fd44a9e6373931f051125c89ffd240a0ef96f1f", + "specs.json": "36b8391ef195ee7db6b9e3cd3224641754fdc8b93eb84cbe966158c33a17fff4", + "target.spice": "b8e9aba4ec89cd28f463690f93f9b998a87d129bae2f255e6324693118517bd6", + "target_lvs.spice": "9ca48608fc337c85ed7aab3aab23f3dffde3382e589212b32f0f1ff437b94f33", + "testbench.spice": "839d9802c97ac7d40a7b507152e1ade42ffb49b896fe3eae2a75bb449b6d5ee1" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW0.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW0.5_sL1/qualification.json new file mode 100644 index 00000000..0901904c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW0.5_sL1/qualification.json @@ -0,0 +1,115 @@ +{ + "case_id": "C14_ihp130_sW0.5_sL1", + "circuit_id": "C14", + "pdk": "ihp130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.04, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.04, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 1.0, + "l0": 1.04, + "nf0": 2, + "uw0": 0.5, + "w": 0.5, + "l": 1.04, + "nf": 1, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.04, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "5d3b293e01331d85", + "mirror_pass1": { + "vmin": 0.5150785, + "status": "passed", + "vout_test": 0.86 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.6151 + }, + "_frozen_from": { + "schematic": { + "err": -0.024261, + "vmin": 0.5150785 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.72 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.3, + "schematic_measures": { + "iout_t": 1.951478e-05, + "err": -0.024261, + "vmin": 0.5150785, + "dev_at_vdd": 0.02420698, + "gout_t": 5.011179e-09, + "rout_t": 199570200.0, + "vout_test": 0.86, + "rout_nom": 199570200.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW0.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW0.5_sL1/specs.json new file mode 100644 index 00000000..bf1c2740 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW0.5_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.6151 + }, + "_frozen_from": { + "schematic": { + "err": -0.024261, + "vmin": 0.5150785 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.72 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW0.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW0.5_sL1/target.spice new file mode 100644 index 00000000..8a049502 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW0.5_sL1/target.spice @@ -0,0 +1,6 @@ +.subckt C14_ihp130_sW0.5_sL1 VSS IIN1 IOUT1 IREF1 +XM1 IIN1 IIN1 VSS VSS sg13_lv_nmos w=1u l=1.04u ng=2 m=1 +XM2 net11 IIN1 VSS VSS sg13_lv_nmos w=1u l=1.04u ng=2 m=1 +XM3 IREF1 net11 VSS VSS sg13_lv_nmos w=0.5u l=1.04u ng=1 m=1 +XM4 IOUT1 IREF1 net11 VSS sg13_lv_nmos w=1u l=1.04u ng=2 m=1 +.ends C14_ihp130_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW0.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW0.5_sL1/target_lvs.spice new file mode 100644 index 00000000..58cda3ca --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW0.5_sL1/target_lvs.spice @@ -0,0 +1,9 @@ +.subckt C14_ihp130_sW0.5_sL1 VSS IIN1 IOUT1 IREF1 +XM1_f0 IIN1 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM1_f1 IIN1 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM2_f0 net11 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM2_f1 net11 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM3_f0 IREF1 net11 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM4_f0 IOUT1 IREF1 net11 VSS sg13_lv_nmos w=0.5u l=1.04u +XM4_f1 IOUT1 IREF1 net11 VSS sg13_lv_nmos w=0.5u l=1.04u +.ends C14_ihp130_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW0.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW0.5_sL1/testbench.spice new file mode 100644 index 00000000..b1392de3 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW0.5_sL1/testbench.spice @@ -0,0 +1,26 @@ +X1 VSS IIN1 IOUT1 IREF1 C14_ihp130_sW0.5_sL1 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIIN1 VDDB IIN1 2e-05 +IIREF1 VDDB IREF1 5e-06 +.nodeset v(IIN1)=0.36 v(IREF1)=0.36 + +VOUT IOUT1 0 1.2 +.control +dc VOUT 1.2 0 -0.003 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=0.86 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.03 cross=last +meas dc dev_at_vdd find dev at=1.194 +let gout = deriv(iout) +meas dc gout_t find gout at=0.86 +let rout_v = 1/gout +meas dc rout_t find rout_v at=0.86 +echo vout_test = 0.86 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW0.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW0.5_sL2/case.json new file mode 100644 index 00000000..6936ff95 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW0.5_sL2/case.json @@ -0,0 +1,152 @@ +{ + "case_id": "C14_ihp130_sW0.5_sL2", + "circuit_id": "C14", + "pdk": "ihp130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "dut_name": "C14_ihp130_sW0.5_sL2", + "ports": [ + "VSS", + "IIN1", + "IOUT1", + "IREF1" + ], + "sizing": { + "M1": { + "w": 1.0, + "l": 2.08, + "nf": 2 + }, + "M2": { + "w": 1.0, + "l": 2.08, + "nf": 2 + }, + "M3": { + "w": 0.5, + "l": 2.08, + "nf": 1 + }, + "M4": { + "w": 1.0, + "l": 2.08, + "nf": 2 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF1": { + "i": 5e-06, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 0.78, + "tol": 0.03, + "vout_test": 0.91 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 2.08, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 2.08, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 1.0, + "l0": 1.04, + "nf0": 2, + "uw0": 0.5, + "w": 0.5, + "l": 2.08, + "nf": 1, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 2.08, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "4076379bf7710c72", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "ideal_current_source", + "port": "IREF1", + "current_A": 5e-06, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW0.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW0.5_sL2/manifest.json new file mode 100644 index 00000000..3e87e458 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW0.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "5dcb486eb515c7546c009b90e3bcc929f9d005e19cb49f092e9e6a51ae2bcb9c", + "qualification.json": "eca88fde8859eda6feb065455655f21a554bb5e7b719ae84734f37a135f18ecc", + "specs.json": "9f4ffb82ab169815584ddc2d9fdee56bf0df2ce007af06078e6478cb59ed5412", + "target.spice": "1d600d152ff6c21c0bbe472b0ed8d51c39f3fd21d02f1bd8f8b40a87491717a3", + "target_lvs.spice": "70efc58c4de7bed8564acd2830aa575b2429f3d34cca955c25e8fde7d57bf481", + "testbench.spice": "4dd9599db3534f229dd1ea6c71eb6b103d0df330a75fa9b16c7392e14221c349" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW0.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW0.5_sL2/qualification.json new file mode 100644 index 00000000..ea215c05 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW0.5_sL2/qualification.json @@ -0,0 +1,115 @@ +{ + "case_id": "C14_ihp130_sW0.5_sL2", + "circuit_id": "C14", + "pdk": "ihp130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 2.08, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 2.08, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 1.0, + "l0": 1.04, + "nf0": 2, + "uw0": 0.5, + "w": 0.5, + "l": 2.08, + "nf": 1, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 2.08, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "4076379bf7710c72", + "mirror_pass1": { + "vmin": 0.6224217, + "status": "passed", + "vout_test": 0.91 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.72 + }, + "_frozen_from": { + "schematic": { + "err": -0.0195255, + "vmin": 0.6224217 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.72 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.3, + "schematic_measures": { + "iout_t": 1.960949e-05, + "err": -0.0195255, + "vmin": 0.6224217, + "dev_at_vdd": 0.01947342, + "gout_t": 1.357794e-08, + "rout_t": 73679960.0, + "vout_test": 0.91, + "rout_nom": 73679960.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW0.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW0.5_sL2/specs.json new file mode 100644 index 00000000..e83dc8b3 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW0.5_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.72 + }, + "_frozen_from": { + "schematic": { + "err": -0.0195255, + "vmin": 0.6224217 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.72 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW0.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW0.5_sL2/target.spice new file mode 100644 index 00000000..fcfae54f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW0.5_sL2/target.spice @@ -0,0 +1,6 @@ +.subckt C14_ihp130_sW0.5_sL2 VSS IIN1 IOUT1 IREF1 +XM1 IIN1 IIN1 VSS VSS sg13_lv_nmos w=1u l=2.08u ng=2 m=1 +XM2 net11 IIN1 VSS VSS sg13_lv_nmos w=1u l=2.08u ng=2 m=1 +XM3 IREF1 net11 VSS VSS sg13_lv_nmos w=0.5u l=2.08u ng=1 m=1 +XM4 IOUT1 IREF1 net11 VSS sg13_lv_nmos w=1u l=2.08u ng=2 m=1 +.ends C14_ihp130_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW0.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW0.5_sL2/target_lvs.spice new file mode 100644 index 00000000..584bad39 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW0.5_sL2/target_lvs.spice @@ -0,0 +1,9 @@ +.subckt C14_ihp130_sW0.5_sL2 VSS IIN1 IOUT1 IREF1 +XM1_f0 IIN1 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM1_f1 IIN1 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM2_f0 net11 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM2_f1 net11 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM3_f0 IREF1 net11 VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM4_f0 IOUT1 IREF1 net11 VSS sg13_lv_nmos w=0.5u l=2.08u +XM4_f1 IOUT1 IREF1 net11 VSS sg13_lv_nmos w=0.5u l=2.08u +.ends C14_ihp130_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW0.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW0.5_sL2/testbench.spice new file mode 100644 index 00000000..94337af0 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW0.5_sL2/testbench.spice @@ -0,0 +1,26 @@ +X1 VSS IIN1 IOUT1 IREF1 C14_ihp130_sW0.5_sL2 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIIN1 VDDB IIN1 2e-05 +IIREF1 VDDB IREF1 5e-06 +.nodeset v(IIN1)=0.36 v(IREF1)=0.36 + +VOUT IOUT1 0 1.2 +.control +dc VOUT 1.2 0 -0.003 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=0.91 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.03 cross=last +meas dc dev_at_vdd find dev at=1.194 +let gout = deriv(iout) +meas dc gout_t find gout at=0.91 +let rout_v = 1/gout +meas dc rout_t find rout_v at=0.91 +echo vout_test = 0.91 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1.5_sL1.5/case.json new file mode 100644 index 00000000..34c83d16 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1.5_sL1.5/case.json @@ -0,0 +1,152 @@ +{ + "case_id": "C14_ihp130_sW1.5_sL1.5", + "circuit_id": "C14", + "pdk": "ihp130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "dut_name": "C14_ihp130_sW1.5_sL1.5", + "ports": [ + "VSS", + "IIN1", + "IOUT1", + "IREF1" + ], + "sizing": { + "M1": { + "w": 3.0, + "l": 1.56, + "nf": 6 + }, + "M2": { + "w": 3.0, + "l": 1.56, + "nf": 6 + }, + "M3": { + "w": 1.5, + "l": 1.56, + "nf": 3 + }, + "M4": { + "w": 3.0, + "l": 1.56, + "nf": 6 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF1": { + "i": 5e-06, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 0.78, + "tol": 0.03, + "vout_test": 0.8 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.56, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.56, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 1.0, + "l0": 1.04, + "nf0": 2, + "uw0": 0.5, + "w": 1.5, + "l": 1.56, + "nf": 3, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.56, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "58117cef7b455207", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "ideal_current_source", + "port": "IREF1", + "current_A": 5e-06, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1.5_sL1.5/manifest.json new file mode 100644 index 00000000..02de412d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "d94b17781813a29223c33b1e5a328992aad642a6f84a9e73288bef9faa326da5", + "qualification.json": "c679ea2236d98c4a3538605d7364ad3cac6a0bce825fd7b64d38ab39309ee586", + "specs.json": "a267e25acf075f972f3632fe12a15c9365c9b54dcc86b8dc86f11f1af04cae5a", + "target.spice": "51255a29342389903eac9973957e9b5c491940678d8bf4da23ae23b5870769ad", + "target_lvs.spice": "a11c9374fb9ca331e87e4e6fe3f4fe653fa697e9a704c1647951e52aa51ee12f", + "testbench.spice": "08eaf9994eac25abb11dc69147756220ce785e0e9b6112d2f6db73fcf352dc45" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1.5_sL1.5/qualification.json new file mode 100644 index 00000000..e9e077b1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1.5_sL1.5/qualification.json @@ -0,0 +1,115 @@ +{ + "case_id": "C14_ihp130_sW1.5_sL1.5", + "circuit_id": "C14", + "pdk": "ihp130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.56, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.56, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 1.0, + "l0": 1.04, + "nf0": 2, + "uw0": 0.5, + "w": 1.5, + "l": 1.56, + "nf": 3, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.56, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "58117cef7b455207", + "mirror_pass1": { + "vmin": 0.4018094, + "status": "passed", + "vout_test": 0.8 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.5018 + }, + "_frozen_from": { + "schematic": { + "err": -0.0212935, + "vmin": 0.4018094 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.72 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.7, + "schematic_measures": { + "iout_t": 1.957413e-05, + "err": -0.0212935, + "vmin": 0.4018094, + "dev_at_vdd": 0.02124491, + "gout_t": 3.139546e-09, + "rout_t": 318519300.0, + "vout_test": 0.8, + "rout_nom": 318519300.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1.5_sL1.5/specs.json new file mode 100644 index 00000000..08d803af --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1.5_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.5018 + }, + "_frozen_from": { + "schematic": { + "err": -0.0212935, + "vmin": 0.4018094 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.72 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1.5_sL1.5/target.spice new file mode 100644 index 00000000..7f17ad85 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1.5_sL1.5/target.spice @@ -0,0 +1,6 @@ +.subckt C14_ihp130_sW1.5_sL1.5 VSS IIN1 IOUT1 IREF1 +XM1 IIN1 IIN1 VSS VSS sg13_lv_nmos w=3u l=1.56u ng=6 m=1 +XM2 net11 IIN1 VSS VSS sg13_lv_nmos w=3u l=1.56u ng=6 m=1 +XM3 IREF1 net11 VSS VSS sg13_lv_nmos w=1.5u l=1.56u ng=3 m=1 +XM4 IOUT1 IREF1 net11 VSS sg13_lv_nmos w=3u l=1.56u ng=6 m=1 +.ends C14_ihp130_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..11b8ab85 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1.5_sL1.5/target_lvs.spice @@ -0,0 +1,23 @@ +.subckt C14_ihp130_sW1.5_sL1.5 VSS IIN1 IOUT1 IREF1 +XM1_f0 IIN1 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.56u +XM1_f1 IIN1 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.56u +XM1_f2 IIN1 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.56u +XM1_f3 IIN1 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.56u +XM1_f4 IIN1 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.56u +XM1_f5 IIN1 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.56u +XM2_f0 net11 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.56u +XM2_f1 net11 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.56u +XM2_f2 net11 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.56u +XM2_f3 net11 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.56u +XM2_f4 net11 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.56u +XM2_f5 net11 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.56u +XM3_f0 IREF1 net11 VSS VSS sg13_lv_nmos w=0.5u l=1.56u +XM3_f1 IREF1 net11 VSS VSS sg13_lv_nmos w=0.5u l=1.56u +XM3_f2 IREF1 net11 VSS VSS sg13_lv_nmos w=0.5u l=1.56u +XM4_f0 IOUT1 IREF1 net11 VSS sg13_lv_nmos w=0.5u l=1.56u +XM4_f1 IOUT1 IREF1 net11 VSS sg13_lv_nmos w=0.5u l=1.56u +XM4_f2 IOUT1 IREF1 net11 VSS sg13_lv_nmos w=0.5u l=1.56u +XM4_f3 IOUT1 IREF1 net11 VSS sg13_lv_nmos w=0.5u l=1.56u +XM4_f4 IOUT1 IREF1 net11 VSS sg13_lv_nmos w=0.5u l=1.56u +XM4_f5 IOUT1 IREF1 net11 VSS sg13_lv_nmos w=0.5u l=1.56u +.ends C14_ihp130_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1.5_sL1.5/testbench.spice new file mode 100644 index 00000000..78b2d7c9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1.5_sL1.5/testbench.spice @@ -0,0 +1,26 @@ +X1 VSS IIN1 IOUT1 IREF1 C14_ihp130_sW1.5_sL1.5 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIIN1 VDDB IIN1 2e-05 +IIREF1 VDDB IREF1 5e-06 +.nodeset v(IIN1)=0.36 v(IREF1)=0.36 + +VOUT IOUT1 0 1.2 +.control +dc VOUT 1.2 0 -0.003 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=0.8 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.03 cross=last +meas dc dev_at_vdd find dev at=1.194 +let gout = deriv(iout) +meas dc gout_t find gout at=0.8 +let rout_v = 1/gout +meas dc rout_t find rout_v at=0.8 +echo vout_test = 0.8 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1.5_sL1/case.json new file mode 100644 index 00000000..b0db6106 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1.5_sL1/case.json @@ -0,0 +1,152 @@ +{ + "case_id": "C14_ihp130_sW1.5_sL1", + "circuit_id": "C14", + "pdk": "ihp130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "dut_name": "C14_ihp130_sW1.5_sL1", + "ports": [ + "VSS", + "IIN1", + "IOUT1", + "IREF1" + ], + "sizing": { + "M1": { + "w": 3.0, + "l": 1.04, + "nf": 6 + }, + "M2": { + "w": 3.0, + "l": 1.04, + "nf": 6 + }, + "M3": { + "w": 1.5, + "l": 1.04, + "nf": 3 + }, + "M4": { + "w": 3.0, + "l": 1.04, + "nf": 6 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF1": { + "i": 5e-06, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 0.78, + "tol": 0.03, + "vout_test": 0.79 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.04, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.04, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 1.0, + "l0": 1.04, + "nf0": 2, + "uw0": 0.5, + "w": 1.5, + "l": 1.04, + "nf": 3, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.04, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "fa54eda32ba64792", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "ideal_current_source", + "port": "IREF1", + "current_A": 5e-06, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1.5_sL1/manifest.json new file mode 100644 index 00000000..0c4ea629 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "8e7d74e0d675328da0e1a61982071a874ebd84be459ade4ace566d9af08db3eb", + "qualification.json": "924719a98e92cd0b98fdce10aef14daf7caa648c14447a40d3d26d2ce0159e1d", + "specs.json": "dda5640853504825775243264a2b10aae592b5434906165a3b6a777643dd8d7d", + "target.spice": "de53c107db5bde5ccd7a9c5164bc42e0553f149b4ef5e304d2a82189c17e3159", + "target_lvs.spice": "63ec9c0a034176d71f55b0a8fc57932ff0fef9c4bca857091ce64b9b190e4bb0", + "testbench.spice": "90cd8f8fa51e0acea6cdf967aaf1a7055609c7827b990ba1d9fc09b20150178d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1.5_sL1/qualification.json new file mode 100644 index 00000000..713a97cf --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1.5_sL1/qualification.json @@ -0,0 +1,115 @@ +{ + "case_id": "C14_ihp130_sW1.5_sL1", + "circuit_id": "C14", + "pdk": "ihp130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.04, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.04, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 1.0, + "l0": 1.04, + "nf0": 2, + "uw0": 0.5, + "w": 1.5, + "l": 1.04, + "nf": 3, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.04, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "fa54eda32ba64792", + "mirror_pass1": { + "vmin": 0.3811875, + "status": "passed", + "vout_test": 0.79 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.4812 + }, + "_frozen_from": { + "schematic": { + "err": -0.0247995, + "vmin": 0.3811875 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.72 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.7, + "schematic_measures": { + "iout_t": 1.950401e-05, + "err": -0.0247995, + "vmin": 0.3811875, + "dev_at_vdd": 0.02471719, + "gout_t": 5.071973e-09, + "rout_t": 197162700.0, + "vout_test": 0.79, + "rout_nom": 197162700.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1.5_sL1/specs.json new file mode 100644 index 00000000..bf9984b6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1.5_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.4812 + }, + "_frozen_from": { + "schematic": { + "err": -0.0247995, + "vmin": 0.3811875 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.72 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1.5_sL1/target.spice new file mode 100644 index 00000000..680934d2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1.5_sL1/target.spice @@ -0,0 +1,6 @@ +.subckt C14_ihp130_sW1.5_sL1 VSS IIN1 IOUT1 IREF1 +XM1 IIN1 IIN1 VSS VSS sg13_lv_nmos w=3u l=1.04u ng=6 m=1 +XM2 net11 IIN1 VSS VSS sg13_lv_nmos w=3u l=1.04u ng=6 m=1 +XM3 IREF1 net11 VSS VSS sg13_lv_nmos w=1.5u l=1.04u ng=3 m=1 +XM4 IOUT1 IREF1 net11 VSS sg13_lv_nmos w=3u l=1.04u ng=6 m=1 +.ends C14_ihp130_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1.5_sL1/target_lvs.spice new file mode 100644 index 00000000..69be4958 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1.5_sL1/target_lvs.spice @@ -0,0 +1,23 @@ +.subckt C14_ihp130_sW1.5_sL1 VSS IIN1 IOUT1 IREF1 +XM1_f0 IIN1 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM1_f1 IIN1 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM1_f2 IIN1 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM1_f3 IIN1 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM1_f4 IIN1 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM1_f5 IIN1 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM2_f0 net11 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM2_f1 net11 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM2_f2 net11 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM2_f3 net11 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM2_f4 net11 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM2_f5 net11 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM3_f0 IREF1 net11 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM3_f1 IREF1 net11 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM3_f2 IREF1 net11 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM4_f0 IOUT1 IREF1 net11 VSS sg13_lv_nmos w=0.5u l=1.04u +XM4_f1 IOUT1 IREF1 net11 VSS sg13_lv_nmos w=0.5u l=1.04u +XM4_f2 IOUT1 IREF1 net11 VSS sg13_lv_nmos w=0.5u l=1.04u +XM4_f3 IOUT1 IREF1 net11 VSS sg13_lv_nmos w=0.5u l=1.04u +XM4_f4 IOUT1 IREF1 net11 VSS sg13_lv_nmos w=0.5u l=1.04u +XM4_f5 IOUT1 IREF1 net11 VSS sg13_lv_nmos w=0.5u l=1.04u +.ends C14_ihp130_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1.5_sL1/testbench.spice new file mode 100644 index 00000000..f3b315b7 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1.5_sL1/testbench.spice @@ -0,0 +1,26 @@ +X1 VSS IIN1 IOUT1 IREF1 C14_ihp130_sW1.5_sL1 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIIN1 VDDB IIN1 2e-05 +IIREF1 VDDB IREF1 5e-06 +.nodeset v(IIN1)=0.36 v(IREF1)=0.36 + +VOUT IOUT1 0 1.2 +.control +dc VOUT 1.2 0 -0.003 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=0.79 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.03 cross=last +meas dc dev_at_vdd find dev at=1.194 +let gout = deriv(iout) +meas dc gout_t find gout at=0.79 +let rout_v = 1/gout +meas dc rout_t find rout_v at=0.79 +echo vout_test = 0.79 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1.5_sL2/case.json new file mode 100644 index 00000000..78455e0b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1.5_sL2/case.json @@ -0,0 +1,152 @@ +{ + "case_id": "C14_ihp130_sW1.5_sL2", + "circuit_id": "C14", + "pdk": "ihp130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "dut_name": "C14_ihp130_sW1.5_sL2", + "ports": [ + "VSS", + "IIN1", + "IOUT1", + "IREF1" + ], + "sizing": { + "M1": { + "w": 3.0, + "l": 2.08, + "nf": 6 + }, + "M2": { + "w": 3.0, + "l": 2.08, + "nf": 6 + }, + "M3": { + "w": 1.5, + "l": 2.08, + "nf": 3 + }, + "M4": { + "w": 3.0, + "l": 2.08, + "nf": 6 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF1": { + "i": 5e-06, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 0.78, + "tol": 0.03, + "vout_test": 0.81 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 2.08, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 2.08, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 1.0, + "l0": 1.04, + "nf0": 2, + "uw0": 0.5, + "w": 1.5, + "l": 2.08, + "nf": 3, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 2.08, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "198656f7f3528079", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "ideal_current_source", + "port": "IREF1", + "current_A": 5e-06, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1.5_sL2/manifest.json new file mode 100644 index 00000000..e94e0182 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "fc77e6572a07a300c43959c03f2070d8b84deb8a526f801e7361df194801ff94", + "qualification.json": "5e9e2aa18944c6754720f46cfed0149a3848e4facf6465c6454b35e86ac68798", + "specs.json": "755c92dc9503f12281eab49acf8534cd92c58cc0939d00b162aa841317afd6ce", + "target.spice": "24154e8ad50242ef00238d8bb14455cf81909199d025b08edfab82c7294913f4", + "target_lvs.spice": "5351add8d7afaf72812a84129b33fcfdb3ff99ecc3876a5e296824728690e705", + "testbench.spice": "6c72e5cefa946d2cb139616fb0c42c0d32bc47000bdcd138d8c85403222516a8" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1.5_sL2/qualification.json new file mode 100644 index 00000000..33e2a7ea --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1.5_sL2/qualification.json @@ -0,0 +1,115 @@ +{ + "case_id": "C14_ihp130_sW1.5_sL2", + "circuit_id": "C14", + "pdk": "ihp130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 2.08, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 2.08, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 1.0, + "l0": 1.04, + "nf0": 2, + "uw0": 0.5, + "w": 1.5, + "l": 2.08, + "nf": 3, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 2.08, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "198656f7f3528079", + "mirror_pass1": { + "vmin": 0.4295694, + "status": "passed", + "vout_test": 0.81 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.5296 + }, + "_frozen_from": { + "schematic": { + "err": -0.0191985, + "vmin": 0.4295694 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.72 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.8, + "schematic_measures": { + "iout_t": 1.961603e-05, + "err": -0.0191985, + "vmin": 0.4295694, + "dev_at_vdd": 0.01916515, + "gout_t": 2.293335e-09, + "rout_t": 436046200.0, + "vout_test": 0.81, + "rout_nom": 436046200.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1.5_sL2/specs.json new file mode 100644 index 00000000..80264c7f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1.5_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.5296 + }, + "_frozen_from": { + "schematic": { + "err": -0.0191985, + "vmin": 0.4295694 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.72 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1.5_sL2/target.spice new file mode 100644 index 00000000..83cea088 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1.5_sL2/target.spice @@ -0,0 +1,6 @@ +.subckt C14_ihp130_sW1.5_sL2 VSS IIN1 IOUT1 IREF1 +XM1 IIN1 IIN1 VSS VSS sg13_lv_nmos w=3u l=2.08u ng=6 m=1 +XM2 net11 IIN1 VSS VSS sg13_lv_nmos w=3u l=2.08u ng=6 m=1 +XM3 IREF1 net11 VSS VSS sg13_lv_nmos w=1.5u l=2.08u ng=3 m=1 +XM4 IOUT1 IREF1 net11 VSS sg13_lv_nmos w=3u l=2.08u ng=6 m=1 +.ends C14_ihp130_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1.5_sL2/target_lvs.spice new file mode 100644 index 00000000..b3af542c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1.5_sL2/target_lvs.spice @@ -0,0 +1,23 @@ +.subckt C14_ihp130_sW1.5_sL2 VSS IIN1 IOUT1 IREF1 +XM1_f0 IIN1 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM1_f1 IIN1 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM1_f2 IIN1 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM1_f3 IIN1 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM1_f4 IIN1 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM1_f5 IIN1 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM2_f0 net11 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM2_f1 net11 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM2_f2 net11 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM2_f3 net11 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM2_f4 net11 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM2_f5 net11 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM3_f0 IREF1 net11 VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM3_f1 IREF1 net11 VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM3_f2 IREF1 net11 VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM4_f0 IOUT1 IREF1 net11 VSS sg13_lv_nmos w=0.5u l=2.08u +XM4_f1 IOUT1 IREF1 net11 VSS sg13_lv_nmos w=0.5u l=2.08u +XM4_f2 IOUT1 IREF1 net11 VSS sg13_lv_nmos w=0.5u l=2.08u +XM4_f3 IOUT1 IREF1 net11 VSS sg13_lv_nmos w=0.5u l=2.08u +XM4_f4 IOUT1 IREF1 net11 VSS sg13_lv_nmos w=0.5u l=2.08u +XM4_f5 IOUT1 IREF1 net11 VSS sg13_lv_nmos w=0.5u l=2.08u +.ends C14_ihp130_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1.5_sL2/testbench.spice new file mode 100644 index 00000000..a1cbd5c5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1.5_sL2/testbench.spice @@ -0,0 +1,26 @@ +X1 VSS IIN1 IOUT1 IREF1 C14_ihp130_sW1.5_sL2 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIIN1 VDDB IIN1 2e-05 +IIREF1 VDDB IREF1 5e-06 +.nodeset v(IIN1)=0.36 v(IREF1)=0.36 + +VOUT IOUT1 0 1.2 +.control +dc VOUT 1.2 0 -0.003 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=0.81 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.03 cross=last +meas dc dev_at_vdd find dev at=1.194 +let gout = deriv(iout) +meas dc gout_t find gout at=0.81 +let rout_v = 1/gout +meas dc rout_t find rout_v at=0.81 +echo vout_test = 0.81 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1_sL1.5/case.json new file mode 100644 index 00000000..4ca4c68b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1_sL1.5/case.json @@ -0,0 +1,152 @@ +{ + "case_id": "C14_ihp130_sW1_sL1.5", + "circuit_id": "C14", + "pdk": "ihp130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "dut_name": "C14_ihp130_sW1_sL1.5", + "ports": [ + "VSS", + "IIN1", + "IOUT1", + "IREF1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 1.56, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 1.56, + "nf": 4 + }, + "M3": { + "w": 1.0, + "l": 1.56, + "nf": 2 + }, + "M4": { + "w": 2.0, + "l": 1.56, + "nf": 4 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF1": { + "i": 5e-06, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 0.78, + "tol": 0.03, + "vout_test": 0.83 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 1.0, + "l0": 1.04, + "nf0": 2, + "uw0": 0.5, + "w": 1.0, + "l": 1.56, + "nf": 2, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "4875bd2cab9213f2", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "ideal_current_source", + "port": "IREF1", + "current_A": 5e-06, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1_sL1.5/manifest.json new file mode 100644 index 00000000..03b5ec5b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "3df8ea39da4ff31219ca41d4295e65db7590bcb5f191f1c9e538ffcce8ac13c5", + "qualification.json": "37e563a4e99b04ff1968c39471b0900006b8d5d1920b9fc72eb75d3f671a530e", + "specs.json": "623e388beb54ef4b6803af0320e457b14c84fbd7df6cdfaf925c9344fa9aa2fe", + "target.spice": "e97ff5662a48a4a865ccd338f1e8d654c031dfc88154192f3b298a842abc95b3", + "target_lvs.spice": "bdc9365a298ae9d8c7fc412f9e4435d7cfbeb4709c2de1d27deaaa0942492719", + "testbench.spice": "a126509911fc1e74351fa89753115b788bee8fa6e62d4885e9159623ebd53a89" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1_sL1.5/qualification.json new file mode 100644 index 00000000..3bde8b94 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1_sL1.5/qualification.json @@ -0,0 +1,115 @@ +{ + "case_id": "C14_ihp130_sW1_sL1.5", + "circuit_id": "C14", + "pdk": "ihp130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 1.0, + "l0": 1.04, + "nf0": 2, + "uw0": 0.5, + "w": 1.0, + "l": 1.56, + "nf": 2, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "4875bd2cab9213f2", + "mirror_pass1": { + "vmin": 0.4521513, + "status": "passed", + "vout_test": 0.83 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.5522 + }, + "_frozen_from": { + "schematic": { + "err": -0.0210755, + "vmin": 0.4521513 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.72 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.5, + "schematic_measures": { + "iout_t": 1.957849e-05, + "err": -0.0210755, + "vmin": 0.4521513, + "dev_at_vdd": 0.02103556, + "gout_t": 2.945076e-09, + "rout_t": 339555500.0, + "vout_test": 0.83, + "rout_nom": 339555500.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1_sL1.5/specs.json new file mode 100644 index 00000000..5793c1ec --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.5522 + }, + "_frozen_from": { + "schematic": { + "err": -0.0210755, + "vmin": 0.4521513 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.72 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1_sL1.5/target.spice new file mode 100644 index 00000000..6088fbe8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1_sL1.5/target.spice @@ -0,0 +1,6 @@ +.subckt C14_ihp130_sW1_sL1.5 VSS IIN1 IOUT1 IREF1 +XM1 IIN1 IIN1 VSS VSS sg13_lv_nmos w=2u l=1.56u ng=4 m=1 +XM2 net11 IIN1 VSS VSS sg13_lv_nmos w=2u l=1.56u ng=4 m=1 +XM3 IREF1 net11 VSS VSS sg13_lv_nmos w=1u l=1.56u ng=2 m=1 +XM4 IOUT1 IREF1 net11 VSS sg13_lv_nmos w=2u l=1.56u ng=4 m=1 +.ends C14_ihp130_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1_sL1.5/target_lvs.spice new file mode 100644 index 00000000..7cccaf4c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1_sL1.5/target_lvs.spice @@ -0,0 +1,16 @@ +.subckt C14_ihp130_sW1_sL1.5 VSS IIN1 IOUT1 IREF1 +XM1_f0 IIN1 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.56u +XM1_f1 IIN1 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.56u +XM1_f2 IIN1 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.56u +XM1_f3 IIN1 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.56u +XM2_f0 net11 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.56u +XM2_f1 net11 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.56u +XM2_f2 net11 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.56u +XM2_f3 net11 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.56u +XM3_f0 IREF1 net11 VSS VSS sg13_lv_nmos w=0.5u l=1.56u +XM3_f1 IREF1 net11 VSS VSS sg13_lv_nmos w=0.5u l=1.56u +XM4_f0 IOUT1 IREF1 net11 VSS sg13_lv_nmos w=0.5u l=1.56u +XM4_f1 IOUT1 IREF1 net11 VSS sg13_lv_nmos w=0.5u l=1.56u +XM4_f2 IOUT1 IREF1 net11 VSS sg13_lv_nmos w=0.5u l=1.56u +XM4_f3 IOUT1 IREF1 net11 VSS sg13_lv_nmos w=0.5u l=1.56u +.ends C14_ihp130_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1_sL1.5/testbench.spice new file mode 100644 index 00000000..a6c17b89 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1_sL1.5/testbench.spice @@ -0,0 +1,26 @@ +X1 VSS IIN1 IOUT1 IREF1 C14_ihp130_sW1_sL1.5 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIIN1 VDDB IIN1 2e-05 +IIREF1 VDDB IREF1 5e-06 +.nodeset v(IIN1)=0.36 v(IREF1)=0.36 + +VOUT IOUT1 0 1.2 +.control +dc VOUT 1.2 0 -0.003 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=0.83 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.03 cross=last +meas dc dev_at_vdd find dev at=1.194 +let gout = deriv(iout) +meas dc gout_t find gout at=0.83 +let rout_v = 1/gout +meas dc rout_t find rout_v at=0.83 +echo vout_test = 0.83 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1_sL1/case.json new file mode 100644 index 00000000..bc3dc6b9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1_sL1/case.json @@ -0,0 +1,152 @@ +{ + "case_id": "C14_ihp130_sW1_sL1", + "circuit_id": "C14", + "pdk": "ihp130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "dut_name": "C14_ihp130_sW1_sL1", + "ports": [ + "VSS", + "IIN1", + "IOUT1", + "IREF1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 1.04, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 1.04, + "nf": 4 + }, + "M3": { + "w": 1.0, + "l": 1.04, + "nf": 2 + }, + "M4": { + "w": 2.0, + "l": 1.04, + "nf": 4 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF1": { + "i": 5e-06, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 0.78, + "tol": 0.03, + "vout_test": 0.81 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.04, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.04, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 1.0, + "l0": 1.04, + "nf0": 2, + "uw0": 0.5, + "w": 1.0, + "l": 1.04, + "nf": 2, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.04, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "670d6b40ce2d2b65", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "ideal_current_source", + "port": "IREF1", + "current_A": 5e-06, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1_sL1/manifest.json new file mode 100644 index 00000000..191ccd9f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "d2791eebc00cc41d97eab6df6acac77b37e2db741b0b7f130496abed967f3f8c", + "qualification.json": "5a7c2a49bf0b6c45804fbd466bf22717827b167b29530b5b593e07c298ce5c5f", + "specs.json": "060cb41307e89fb80de55a2afd6f83883cbe82bc1f2695b2fe7d8795b431b005", + "target.spice": "31bad05f87bea70b3584b1dc159d8aff4e88b726626debb688a142ca90e5e085", + "target_lvs.spice": "62b704113b7361be84f4d91f54f78307afc2f330ec8fb1d00e676726f598345e", + "testbench.spice": "ed56b43700fe479d233f487ff977778dccd75f90bd019f3509c66b60f91bf66c" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1_sL1/qualification.json new file mode 100644 index 00000000..0cc05866 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1_sL1/qualification.json @@ -0,0 +1,115 @@ +{ + "case_id": "C14_ihp130_sW1_sL1", + "circuit_id": "C14", + "pdk": "ihp130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.04, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.04, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 1.0, + "l0": 1.04, + "nf0": 2, + "uw0": 0.5, + "w": 1.0, + "l": 1.04, + "nf": 2, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.04, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "670d6b40ce2d2b65", + "mirror_pass1": { + "vmin": 0.4206067, + "status": "passed", + "vout_test": 0.81 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.5206 + }, + "_frozen_from": { + "schematic": { + "err": -0.0243925, + "vmin": 0.4206067 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.72 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.6, + "schematic_measures": { + "iout_t": 1.951215e-05, + "err": -0.0243925, + "vmin": 0.4206067, + "dev_at_vdd": 0.02432419, + "gout_t": 4.547072e-09, + "rout_t": 219921700.0, + "vout_test": 0.81, + "rout_nom": 219921700.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1_sL1/specs.json new file mode 100644 index 00000000..2881af73 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.5206 + }, + "_frozen_from": { + "schematic": { + "err": -0.0243925, + "vmin": 0.4206067 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.72 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1_sL1/target.spice new file mode 100644 index 00000000..7ffc3657 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1_sL1/target.spice @@ -0,0 +1,6 @@ +.subckt C14_ihp130_sW1_sL1 VSS IIN1 IOUT1 IREF1 +XM1 IIN1 IIN1 VSS VSS sg13_lv_nmos w=2u l=1.04u ng=4 m=1 +XM2 net11 IIN1 VSS VSS sg13_lv_nmos w=2u l=1.04u ng=4 m=1 +XM3 IREF1 net11 VSS VSS sg13_lv_nmos w=1u l=1.04u ng=2 m=1 +XM4 IOUT1 IREF1 net11 VSS sg13_lv_nmos w=2u l=1.04u ng=4 m=1 +.ends C14_ihp130_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1_sL1/target_lvs.spice new file mode 100644 index 00000000..196c7406 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1_sL1/target_lvs.spice @@ -0,0 +1,16 @@ +.subckt C14_ihp130_sW1_sL1 VSS IIN1 IOUT1 IREF1 +XM1_f0 IIN1 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM1_f1 IIN1 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM1_f2 IIN1 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM1_f3 IIN1 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM2_f0 net11 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM2_f1 net11 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM2_f2 net11 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM2_f3 net11 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM3_f0 IREF1 net11 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM3_f1 IREF1 net11 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM4_f0 IOUT1 IREF1 net11 VSS sg13_lv_nmos w=0.5u l=1.04u +XM4_f1 IOUT1 IREF1 net11 VSS sg13_lv_nmos w=0.5u l=1.04u +XM4_f2 IOUT1 IREF1 net11 VSS sg13_lv_nmos w=0.5u l=1.04u +XM4_f3 IOUT1 IREF1 net11 VSS sg13_lv_nmos w=0.5u l=1.04u +.ends C14_ihp130_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1_sL1/testbench.spice new file mode 100644 index 00000000..ce874543 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1_sL1/testbench.spice @@ -0,0 +1,26 @@ +X1 VSS IIN1 IOUT1 IREF1 C14_ihp130_sW1_sL1 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIIN1 VDDB IIN1 2e-05 +IIREF1 VDDB IREF1 5e-06 +.nodeset v(IIN1)=0.36 v(IREF1)=0.36 + +VOUT IOUT1 0 1.2 +.control +dc VOUT 1.2 0 -0.003 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=0.81 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.03 cross=last +meas dc dev_at_vdd find dev at=1.194 +let gout = deriv(iout) +meas dc gout_t find gout at=0.81 +let rout_v = 1/gout +meas dc rout_t find rout_v at=0.81 +echo vout_test = 0.81 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1_sL2/case.json new file mode 100644 index 00000000..3e8f0f97 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1_sL2/case.json @@ -0,0 +1,152 @@ +{ + "case_id": "C14_ihp130_sW1_sL2", + "circuit_id": "C14", + "pdk": "ihp130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "dut_name": "C14_ihp130_sW1_sL2", + "ports": [ + "VSS", + "IIN1", + "IOUT1", + "IREF1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 2.08, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 2.08, + "nf": 4 + }, + "M3": { + "w": 1.0, + "l": 2.08, + "nf": 2 + }, + "M4": { + "w": 2.0, + "l": 2.08, + "nf": 4 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF1": { + "i": 5e-06, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 0.78, + "tol": 0.03, + "vout_test": 0.84 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 2.08, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 2.08, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 1.0, + "l0": 1.04, + "nf0": 2, + "uw0": 0.5, + "w": 1.0, + "l": 2.08, + "nf": 2, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 2.08, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "b9b577a40ce05d31", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "ideal_current_source", + "port": "IREF1", + "current_A": 5e-06, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1_sL2/manifest.json new file mode 100644 index 00000000..0e372a10 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "fa245a725c8dffdd55ab9db611decf0b796dffb6d639d692bff913f3ea485a32", + "qualification.json": "b5d002babcbf063653272fb2ce64a8a63a098eac2e0f3e00ae3d3209ae917bf2", + "specs.json": "c0ea4fc073b10202c3dfd99ddfec90c3c8db045d07cc6cbcf329eb5c0ed6ddcb", + "target.spice": "1afb0f4517764c3c27e86fa28553ab5ae2f17c94d5e1c15b96a3bb01f3239aac", + "target_lvs.spice": "82f30af7918b7efb59009842184bba4d39eca52850aa59997d726f7f7d166996", + "testbench.spice": "643b742ac3a65acc79b002c79ac2dcfab9a43184810b52eaac96d17757b82b6b" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1_sL2/qualification.json new file mode 100644 index 00000000..39f8af1e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1_sL2/qualification.json @@ -0,0 +1,115 @@ +{ + "case_id": "C14_ihp130_sW1_sL2", + "circuit_id": "C14", + "pdk": "ihp130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 2.08, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 2.08, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 1.0, + "l0": 1.04, + "nf0": 2, + "uw0": 0.5, + "w": 1.0, + "l": 2.08, + "nf": 2, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 2.08, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "b9b577a40ce05d31", + "mirror_pass1": { + "vmin": 0.4878588, + "status": "passed", + "vout_test": 0.84 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.5879 + }, + "_frozen_from": { + "schematic": { + "err": -0.019096, + "vmin": 0.4878588 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.72 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.4, + "schematic_measures": { + "iout_t": 1.961808e-05, + "err": -0.019096, + "vmin": 0.4878588, + "dev_at_vdd": 0.01906682, + "gout_t": 2.535919e-09, + "rout_t": 394334300.0, + "vout_test": 0.84, + "rout_nom": 394334300.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1_sL2/specs.json new file mode 100644 index 00000000..00a4f3c9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.5879 + }, + "_frozen_from": { + "schematic": { + "err": -0.019096, + "vmin": 0.4878588 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.72 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1_sL2/target.spice new file mode 100644 index 00000000..b3bd5055 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1_sL2/target.spice @@ -0,0 +1,6 @@ +.subckt C14_ihp130_sW1_sL2 VSS IIN1 IOUT1 IREF1 +XM1 IIN1 IIN1 VSS VSS sg13_lv_nmos w=2u l=2.08u ng=4 m=1 +XM2 net11 IIN1 VSS VSS sg13_lv_nmos w=2u l=2.08u ng=4 m=1 +XM3 IREF1 net11 VSS VSS sg13_lv_nmos w=1u l=2.08u ng=2 m=1 +XM4 IOUT1 IREF1 net11 VSS sg13_lv_nmos w=2u l=2.08u ng=4 m=1 +.ends C14_ihp130_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1_sL2/target_lvs.spice new file mode 100644 index 00000000..e0d9e3fe --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1_sL2/target_lvs.spice @@ -0,0 +1,16 @@ +.subckt C14_ihp130_sW1_sL2 VSS IIN1 IOUT1 IREF1 +XM1_f0 IIN1 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM1_f1 IIN1 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM1_f2 IIN1 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM1_f3 IIN1 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM2_f0 net11 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM2_f1 net11 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM2_f2 net11 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM2_f3 net11 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM3_f0 IREF1 net11 VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM3_f1 IREF1 net11 VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM4_f0 IOUT1 IREF1 net11 VSS sg13_lv_nmos w=0.5u l=2.08u +XM4_f1 IOUT1 IREF1 net11 VSS sg13_lv_nmos w=0.5u l=2.08u +XM4_f2 IOUT1 IREF1 net11 VSS sg13_lv_nmos w=0.5u l=2.08u +XM4_f3 IOUT1 IREF1 net11 VSS sg13_lv_nmos w=0.5u l=2.08u +.ends C14_ihp130_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1_sL2/testbench.spice new file mode 100644 index 00000000..a3aefa05 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW1_sL2/testbench.spice @@ -0,0 +1,26 @@ +X1 VSS IIN1 IOUT1 IREF1 C14_ihp130_sW1_sL2 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIIN1 VDDB IIN1 2e-05 +IIREF1 VDDB IREF1 5e-06 +.nodeset v(IIN1)=0.36 v(IREF1)=0.36 + +VOUT IOUT1 0 1.2 +.control +dc VOUT 1.2 0 -0.003 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=0.84 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.03 cross=last +meas dc dev_at_vdd find dev at=1.194 +let gout = deriv(iout) +meas dc gout_t find gout at=0.84 +let rout_v = 1/gout +meas dc rout_t find rout_v at=0.84 +echo vout_test = 0.84 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW2_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW2_sL1.5/case.json new file mode 100644 index 00000000..d9cf2a57 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW2_sL1.5/case.json @@ -0,0 +1,152 @@ +{ + "case_id": "C14_ihp130_sW2_sL1.5", + "circuit_id": "C14", + "pdk": "ihp130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "dut_name": "C14_ihp130_sW2_sL1.5", + "ports": [ + "VSS", + "IIN1", + "IOUT1", + "IREF1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 1.56, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 1.56, + "nf": 8 + }, + "M3": { + "w": 2.0, + "l": 1.56, + "nf": 4 + }, + "M4": { + "w": 4.0, + "l": 1.56, + "nf": 8 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF1": { + "i": 5e-06, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 0.78, + "tol": 0.03, + "vout_test": 0.79 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 1.0, + "l0": 1.04, + "nf0": 2, + "uw0": 0.5, + "w": 2.0, + "l": 1.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "846970e5d2b47f91", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "ideal_current_source", + "port": "IREF1", + "current_A": 5e-06, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW2_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW2_sL1.5/manifest.json new file mode 100644 index 00000000..d72a7fe8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW2_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "ab774b4ae22e785556692733c9cf0b72b812b48b76ac17fe801f274d86a95b9b", + "qualification.json": "ca5407605ac0c6ed9b4109a5431cdfaed4d6361142dc837ed6945024e5a51370", + "specs.json": "cfd25f6fd39116f3b0b59eae0d073681c27401426f5385835ab7cf07061a18a0", + "target.spice": "f1e3efd504cd5ead97cb78751c1da35ef414a438cef50df2d85ca36221c61efb", + "target_lvs.spice": "d06d3b9d61d23526a4e802bd2c5776546b93ede711b0a2f3463b7dc6b8e7b2b1", + "testbench.spice": "a634455da6b0a831164169c5f579edf5f9773e6109e6d08d9da0509fb8643d64" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW2_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW2_sL1.5/qualification.json new file mode 100644 index 00000000..98589655 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW2_sL1.5/qualification.json @@ -0,0 +1,115 @@ +{ + "case_id": "C14_ihp130_sW2_sL1.5", + "circuit_id": "C14", + "pdk": "ihp130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 1.0, + "l0": 1.04, + "nf0": 2, + "uw0": 0.5, + "w": 2.0, + "l": 1.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "846970e5d2b47f91", + "mirror_pass1": { + "vmin": 0.3723262, + "status": "passed", + "vout_test": 0.79 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.4723 + }, + "_frozen_from": { + "schematic": { + "err": -0.0215525, + "vmin": 0.3723262 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.72 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.8, + "schematic_measures": { + "iout_t": 1.956895e-05, + "err": -0.0215525, + "vmin": 0.3723262, + "dev_at_vdd": 0.02149791, + "gout_t": 3.39237e-09, + "rout_t": 294780300.0, + "vout_test": 0.79, + "rout_nom": 294780300.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW2_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW2_sL1.5/specs.json new file mode 100644 index 00000000..d91f20d7 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW2_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.4723 + }, + "_frozen_from": { + "schematic": { + "err": -0.0215525, + "vmin": 0.3723262 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.72 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW2_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW2_sL1.5/target.spice new file mode 100644 index 00000000..eecb80bb --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW2_sL1.5/target.spice @@ -0,0 +1,6 @@ +.subckt C14_ihp130_sW2_sL1.5 VSS IIN1 IOUT1 IREF1 +XM1 IIN1 IIN1 VSS VSS sg13_lv_nmos w=4u l=1.56u ng=8 m=1 +XM2 net11 IIN1 VSS VSS sg13_lv_nmos w=4u l=1.56u ng=8 m=1 +XM3 IREF1 net11 VSS VSS sg13_lv_nmos w=2u l=1.56u ng=4 m=1 +XM4 IOUT1 IREF1 net11 VSS sg13_lv_nmos w=4u l=1.56u ng=8 m=1 +.ends C14_ihp130_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW2_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW2_sL1.5/target_lvs.spice new file mode 100644 index 00000000..6e797181 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW2_sL1.5/target_lvs.spice @@ -0,0 +1,30 @@ +.subckt C14_ihp130_sW2_sL1.5 VSS IIN1 IOUT1 IREF1 +XM1_f0 IIN1 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.56u +XM1_f1 IIN1 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.56u +XM1_f2 IIN1 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.56u +XM1_f3 IIN1 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.56u +XM1_f4 IIN1 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.56u +XM1_f5 IIN1 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.56u +XM1_f6 IIN1 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.56u +XM1_f7 IIN1 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.56u +XM2_f0 net11 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.56u +XM2_f1 net11 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.56u +XM2_f2 net11 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.56u +XM2_f3 net11 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.56u +XM2_f4 net11 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.56u +XM2_f5 net11 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.56u +XM2_f6 net11 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.56u +XM2_f7 net11 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.56u +XM3_f0 IREF1 net11 VSS VSS sg13_lv_nmos w=0.5u l=1.56u +XM3_f1 IREF1 net11 VSS VSS sg13_lv_nmos w=0.5u l=1.56u +XM3_f2 IREF1 net11 VSS VSS sg13_lv_nmos w=0.5u l=1.56u +XM3_f3 IREF1 net11 VSS VSS sg13_lv_nmos w=0.5u l=1.56u +XM4_f0 IOUT1 IREF1 net11 VSS sg13_lv_nmos w=0.5u l=1.56u +XM4_f1 IOUT1 IREF1 net11 VSS sg13_lv_nmos w=0.5u l=1.56u +XM4_f2 IOUT1 IREF1 net11 VSS sg13_lv_nmos w=0.5u l=1.56u +XM4_f3 IOUT1 IREF1 net11 VSS sg13_lv_nmos w=0.5u l=1.56u +XM4_f4 IOUT1 IREF1 net11 VSS sg13_lv_nmos w=0.5u l=1.56u +XM4_f5 IOUT1 IREF1 net11 VSS sg13_lv_nmos w=0.5u l=1.56u +XM4_f6 IOUT1 IREF1 net11 VSS sg13_lv_nmos w=0.5u l=1.56u +XM4_f7 IOUT1 IREF1 net11 VSS sg13_lv_nmos w=0.5u l=1.56u +.ends C14_ihp130_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW2_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW2_sL1.5/testbench.spice new file mode 100644 index 00000000..fbe678f5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW2_sL1.5/testbench.spice @@ -0,0 +1,26 @@ +X1 VSS IIN1 IOUT1 IREF1 C14_ihp130_sW2_sL1.5 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIIN1 VDDB IIN1 2e-05 +IIREF1 VDDB IREF1 5e-06 +.nodeset v(IIN1)=0.36 v(IREF1)=0.36 + +VOUT IOUT1 0 1.2 +.control +dc VOUT 1.2 0 -0.003 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=0.79 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.03 cross=last +meas dc dev_at_vdd find dev at=1.194 +let gout = deriv(iout) +meas dc gout_t find gout at=0.79 +let rout_v = 1/gout +meas dc rout_t find rout_v at=0.79 +echo vout_test = 0.79 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW2_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW2_sL1/case.json new file mode 100644 index 00000000..3daad9d2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW2_sL1/case.json @@ -0,0 +1,152 @@ +{ + "case_id": "C14_ihp130_sW2_sL1", + "circuit_id": "C14", + "pdk": "ihp130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "dut_name": "C14_ihp130_sW2_sL1", + "ports": [ + "VSS", + "IIN1", + "IOUT1", + "IREF1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 1.04, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 1.04, + "nf": 8 + }, + "M3": { + "w": 2.0, + "l": 1.04, + "nf": 4 + }, + "M4": { + "w": 4.0, + "l": 1.04, + "nf": 8 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF1": { + "i": 5e-06, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 0.78, + "tol": 0.03, + "vout_test": 0.78 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.04, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.04, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 1.0, + "l0": 1.04, + "nf0": 2, + "uw0": 0.5, + "w": 2.0, + "l": 1.04, + "nf": 4, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.04, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "48ca72d1df585caa", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "ideal_current_source", + "port": "IREF1", + "current_A": 5e-06, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW2_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW2_sL1/manifest.json new file mode 100644 index 00000000..1a201718 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW2_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "7c316dfc9e312d585bb875964f2b0aff585bd5b5ee433480fbc22457284ffb02", + "qualification.json": "b9bd7125f3eebff2b5a8bfeb7abaffd56ce736796294b7dfe094839aef69241d", + "specs.json": "467b82b9c76a4f325dd211276187b57b183b96cdc257e4f00a5308a12401fe2b", + "target.spice": "7fd7df686bf2ec07c7e84fc3a2e34dd7ab8e12556a3336daea3e5d4207b9fb70", + "target_lvs.spice": "1111bd63ce1dbbc516c25e18aaf87c44111cb4783e926543a910ec835dbba05f", + "testbench.spice": "11a53ac5da15a5d47a13c3644d697ad1fb8a0c938f0388c8df2d5ca930d10038" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW2_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW2_sL1/qualification.json new file mode 100644 index 00000000..196dbbf8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW2_sL1/qualification.json @@ -0,0 +1,115 @@ +{ + "case_id": "C14_ihp130_sW2_sL1", + "circuit_id": "C14", + "pdk": "ihp130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.04, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.04, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 1.0, + "l0": 1.04, + "nf0": 2, + "uw0": 0.5, + "w": 2.0, + "l": 1.04, + "nf": 4, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.04, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "48ca72d1df585caa", + "mirror_pass1": { + "vmin": 0.3586395, + "status": "passed", + "vout_test": 0.78 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.4586 + }, + "_frozen_from": { + "schematic": { + "err": -0.0251955, + "vmin": 0.3586395 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.72 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.9, + "schematic_measures": { + "iout_t": 1.949609e-05, + "err": -0.0251955, + "vmin": 0.3586395, + "dev_at_vdd": 0.02510205, + "gout_t": 5.580814e-09, + "rout_t": 179185300.0, + "vout_test": 0.78, + "rout_nom": 179185300.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW2_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW2_sL1/specs.json new file mode 100644 index 00000000..5e2212af --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW2_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.4586 + }, + "_frozen_from": { + "schematic": { + "err": -0.0251955, + "vmin": 0.3586395 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.72 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW2_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW2_sL1/target.spice new file mode 100644 index 00000000..169d59e7 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW2_sL1/target.spice @@ -0,0 +1,6 @@ +.subckt C14_ihp130_sW2_sL1 VSS IIN1 IOUT1 IREF1 +XM1 IIN1 IIN1 VSS VSS sg13_lv_nmos w=4u l=1.04u ng=8 m=1 +XM2 net11 IIN1 VSS VSS sg13_lv_nmos w=4u l=1.04u ng=8 m=1 +XM3 IREF1 net11 VSS VSS sg13_lv_nmos w=2u l=1.04u ng=4 m=1 +XM4 IOUT1 IREF1 net11 VSS sg13_lv_nmos w=4u l=1.04u ng=8 m=1 +.ends C14_ihp130_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW2_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW2_sL1/target_lvs.spice new file mode 100644 index 00000000..9a78d6ec --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW2_sL1/target_lvs.spice @@ -0,0 +1,30 @@ +.subckt C14_ihp130_sW2_sL1 VSS IIN1 IOUT1 IREF1 +XM1_f0 IIN1 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM1_f1 IIN1 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM1_f2 IIN1 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM1_f3 IIN1 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM1_f4 IIN1 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM1_f5 IIN1 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM1_f6 IIN1 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM1_f7 IIN1 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM2_f0 net11 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM2_f1 net11 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM2_f2 net11 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM2_f3 net11 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM2_f4 net11 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM2_f5 net11 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM2_f6 net11 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM2_f7 net11 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM3_f0 IREF1 net11 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM3_f1 IREF1 net11 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM3_f2 IREF1 net11 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM3_f3 IREF1 net11 VSS VSS sg13_lv_nmos w=0.5u l=1.04u +XM4_f0 IOUT1 IREF1 net11 VSS sg13_lv_nmos w=0.5u l=1.04u +XM4_f1 IOUT1 IREF1 net11 VSS sg13_lv_nmos w=0.5u l=1.04u +XM4_f2 IOUT1 IREF1 net11 VSS sg13_lv_nmos w=0.5u l=1.04u +XM4_f3 IOUT1 IREF1 net11 VSS sg13_lv_nmos w=0.5u l=1.04u +XM4_f4 IOUT1 IREF1 net11 VSS sg13_lv_nmos w=0.5u l=1.04u +XM4_f5 IOUT1 IREF1 net11 VSS sg13_lv_nmos w=0.5u l=1.04u +XM4_f6 IOUT1 IREF1 net11 VSS sg13_lv_nmos w=0.5u l=1.04u +XM4_f7 IOUT1 IREF1 net11 VSS sg13_lv_nmos w=0.5u l=1.04u +.ends C14_ihp130_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW2_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW2_sL1/testbench.spice new file mode 100644 index 00000000..f15ad626 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW2_sL1/testbench.spice @@ -0,0 +1,26 @@ +X1 VSS IIN1 IOUT1 IREF1 C14_ihp130_sW2_sL1 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIIN1 VDDB IIN1 2e-05 +IIREF1 VDDB IREF1 5e-06 +.nodeset v(IIN1)=0.36 v(IREF1)=0.36 + +VOUT IOUT1 0 1.2 +.control +dc VOUT 1.2 0 -0.003 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=0.78 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.03 cross=last +meas dc dev_at_vdd find dev at=1.194 +let gout = deriv(iout) +meas dc gout_t find gout at=0.78 +let rout_v = 1/gout +meas dc rout_t find rout_v at=0.78 +echo vout_test = 0.78 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW2_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW2_sL2/case.json new file mode 100644 index 00000000..92eff8b5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW2_sL2/case.json @@ -0,0 +1,152 @@ +{ + "case_id": "C14_ihp130_sW2_sL2", + "circuit_id": "C14", + "pdk": "ihp130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "dut_name": "C14_ihp130_sW2_sL2", + "ports": [ + "VSS", + "IIN1", + "IOUT1", + "IREF1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 2.08, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 2.08, + "nf": 8 + }, + "M3": { + "w": 2.0, + "l": 2.08, + "nf": 4 + }, + "M4": { + "w": 4.0, + "l": 2.08, + "nf": 8 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF1": { + "i": 5e-06, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 0.78, + "tol": 0.03, + "vout_test": 0.8 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 2.08, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 2.08, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 1.0, + "l0": 1.04, + "nf0": 2, + "uw0": 0.5, + "w": 2.0, + "l": 2.08, + "nf": 4, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 2.08, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "bd7838c5c1dac2d6", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "ideal_current_source", + "port": "IREF1", + "current_A": 5e-06, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW2_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW2_sL2/manifest.json new file mode 100644 index 00000000..5382fe17 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW2_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "c4ec94d270e19cc5e255a3ab7d64e0548f6a91ad8fc65f3e9bf6967756c00b10", + "qualification.json": "f1d0a8e71f629bd8b13d02290516463fc80fe91774aa585931639b6a4889355e", + "specs.json": "1596be5dc3c379d268f29c1dbe355ea5674874da1032b085dfd4e5ccb1bfa170", + "target.spice": "98002c44cfaa8c1b239d9ff255e27e888cf00362773257d8b407a4140a5fe203", + "target_lvs.spice": "5c4d35818bf9e8df8e092c5c6045ea1326d90f35e25eca0571f48620ded9d67c", + "testbench.spice": "4fe410cd575e6daeacdd2bf5d033c3c29a8c6060deb4604851a91c5e78eddb22" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW2_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW2_sL2/qualification.json new file mode 100644 index 00000000..34d6873a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW2_sL2/qualification.json @@ -0,0 +1,115 @@ +{ + "case_id": "C14_ihp130_sW2_sL2", + "circuit_id": "C14", + "pdk": "ihp130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 2.08, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 2.08, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 1.0, + "l0": 1.04, + "nf0": 2, + "uw0": 0.5, + "w": 2.0, + "l": 2.08, + "nf": 4, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 2.08, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "bd7838c5c1dac2d6", + "mirror_pass1": { + "vmin": 0.3948416, + "status": "passed", + "vout_test": 0.8 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.4948 + }, + "_frozen_from": { + "schematic": { + "err": -0.0193775, + "vmin": 0.3948416 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.72 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 1.0, + "schematic_measures": { + "iout_t": 1.961245e-05, + "err": -0.0193775, + "vmin": 0.3948416, + "dev_at_vdd": 0.01934037, + "gout_t": 2.401369e-09, + "rout_t": 416431300.0, + "vout_test": 0.8, + "rout_nom": 416431300.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW2_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW2_sL2/specs.json new file mode 100644 index 00000000..ccb4aad7 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW2_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.4948 + }, + "_frozen_from": { + "schematic": { + "err": -0.0193775, + "vmin": 0.3948416 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.72 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW2_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW2_sL2/target.spice new file mode 100644 index 00000000..69fe5701 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW2_sL2/target.spice @@ -0,0 +1,6 @@ +.subckt C14_ihp130_sW2_sL2 VSS IIN1 IOUT1 IREF1 +XM1 IIN1 IIN1 VSS VSS sg13_lv_nmos w=4u l=2.08u ng=8 m=1 +XM2 net11 IIN1 VSS VSS sg13_lv_nmos w=4u l=2.08u ng=8 m=1 +XM3 IREF1 net11 VSS VSS sg13_lv_nmos w=2u l=2.08u ng=4 m=1 +XM4 IOUT1 IREF1 net11 VSS sg13_lv_nmos w=4u l=2.08u ng=8 m=1 +.ends C14_ihp130_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW2_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW2_sL2/target_lvs.spice new file mode 100644 index 00000000..720cd020 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW2_sL2/target_lvs.spice @@ -0,0 +1,30 @@ +.subckt C14_ihp130_sW2_sL2 VSS IIN1 IOUT1 IREF1 +XM1_f0 IIN1 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM1_f1 IIN1 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM1_f2 IIN1 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM1_f3 IIN1 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM1_f4 IIN1 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM1_f5 IIN1 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM1_f6 IIN1 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM1_f7 IIN1 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM2_f0 net11 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM2_f1 net11 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM2_f2 net11 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM2_f3 net11 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM2_f4 net11 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM2_f5 net11 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM2_f6 net11 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM2_f7 net11 IIN1 VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM3_f0 IREF1 net11 VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM3_f1 IREF1 net11 VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM3_f2 IREF1 net11 VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM3_f3 IREF1 net11 VSS VSS sg13_lv_nmos w=0.5u l=2.08u +XM4_f0 IOUT1 IREF1 net11 VSS sg13_lv_nmos w=0.5u l=2.08u +XM4_f1 IOUT1 IREF1 net11 VSS sg13_lv_nmos w=0.5u l=2.08u +XM4_f2 IOUT1 IREF1 net11 VSS sg13_lv_nmos w=0.5u l=2.08u +XM4_f3 IOUT1 IREF1 net11 VSS sg13_lv_nmos w=0.5u l=2.08u +XM4_f4 IOUT1 IREF1 net11 VSS sg13_lv_nmos w=0.5u l=2.08u +XM4_f5 IOUT1 IREF1 net11 VSS sg13_lv_nmos w=0.5u l=2.08u +XM4_f6 IOUT1 IREF1 net11 VSS sg13_lv_nmos w=0.5u l=2.08u +XM4_f7 IOUT1 IREF1 net11 VSS sg13_lv_nmos w=0.5u l=2.08u +.ends C14_ihp130_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW2_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW2_sL2/testbench.spice new file mode 100644 index 00000000..2448f927 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/ihp130/sW2_sL2/testbench.spice @@ -0,0 +1,26 @@ +X1 VSS IIN1 IOUT1 IREF1 C14_ihp130_sW2_sL2 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIIN1 VDDB IIN1 2e-05 +IIREF1 VDDB IREF1 5e-06 +.nodeset v(IIN1)=0.36 v(IREF1)=0.36 + +VOUT IOUT1 0 1.2 +.control +dc VOUT 1.2 0 -0.003 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=0.8 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.03 cross=last +meas dc dev_at_vdd find dev at=1.194 +let gout = deriv(iout) +meas dc gout_t find gout at=0.8 +let rout_v = 1/gout +meas dc rout_t find rout_v at=0.8 +echo vout_test = 0.8 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C14/sky130/sW0.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW0.5_sL1.5/case.json new file mode 100644 index 00000000..5afae4cb --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW0.5_sL1.5/case.json @@ -0,0 +1,152 @@ +{ + "case_id": "C14_sky130_sW0.5_sL1.5", + "circuit_id": "C14", + "pdk": "sky130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "dut_name": "C14_sky130_sW0.5_sL1.5", + "ports": [ + "VSS", + "IIN1", + "IOUT1", + "IREF1" + ], + "sizing": { + "M1": { + "w": 1.0, + "l": 0.9, + "nf": 2 + }, + "M2": { + "w": 1.0, + "l": 0.9, + "nf": 2 + }, + "M3": { + "w": 0.5, + "l": 0.9, + "nf": 1 + }, + "M4": { + "w": 1.0, + "l": 0.9, + "nf": 2 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF1": { + "i": 5e-06, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 1.1700000000000002, + "tol": 0.03, + "vout_test": 1.27 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.9, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.9, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 1.0, + "l0": 0.6, + "nf0": 2, + "uw0": 0.5, + "w": 0.5, + "l": 0.9, + "nf": 1, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.9, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "9149c4dac9a1af5b", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "ideal_current_source", + "port": "IREF1", + "current_A": 5e-06, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/sky130/sW0.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW0.5_sL1.5/manifest.json new file mode 100644 index 00000000..98dd044a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW0.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "50dd02b9dc9fa43665b3aa3ad40d983c6dd82dbeb951373d7b9092a9c15a5326", + "qualification.json": "26194b2c030199b164846a41ef07a3a808145012f91c543c101d305a83af55da", + "specs.json": "fa9fb8882197038530b1df87bb7ff9315d5e7d89303a0244725bd644ff29e499", + "target.spice": "debce2f940b59d3dcb2879b8eb313128f39109c7863c27a6031f053e69c7202e", + "target_lvs.spice": "a95ea13d83e53e05821f9a87af8a78af600080e9cda00f1e0ef73ef613d3a3af", + "testbench.spice": "29880827391fefcc8cb4ed89c2a6348cb4c4f19b4f5385e4a35148231899128e" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/sky130/sW0.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW0.5_sL1.5/qualification.json new file mode 100644 index 00000000..47f20560 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW0.5_sL1.5/qualification.json @@ -0,0 +1,115 @@ +{ + "case_id": "C14_sky130_sW0.5_sL1.5", + "circuit_id": "C14", + "pdk": "sky130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.9, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.9, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 1.0, + "l0": 0.6, + "nf0": 2, + "uw0": 0.5, + "w": 0.5, + "l": 0.9, + "nf": 1, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.9, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "9149c4dac9a1af5b", + "mirror_pass1": { + "vmin": 0.7394514, + "status": "passed", + "vout_test": 1.27 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.8395 + }, + "_frozen_from": { + "schematic": { + "err": -0.010322, + "vmin": 0.7394514 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.08 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 19.2, + "schematic_measures": { + "iout_t": 1.979356e-05, + "err": -0.010322, + "vmin": 0.7394514, + "dev_at_vdd": 0.01031004, + "gout_t": 1.451525e-09, + "rout_t": 689193900.0, + "vout_test": 1.27, + "rout_nom": 689193900.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/sky130/sW0.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW0.5_sL1.5/specs.json new file mode 100644 index 00000000..3452809d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW0.5_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.8395 + }, + "_frozen_from": { + "schematic": { + "err": -0.010322, + "vmin": 0.7394514 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.08 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/sky130/sW0.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW0.5_sL1.5/target.spice new file mode 100644 index 00000000..02dee906 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW0.5_sL1.5/target.spice @@ -0,0 +1,6 @@ +.subckt C14_sky130_sW0.5_sL1.5 VSS IIN1 IOUT1 IREF1 +XM1 IIN1 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=1 l=0.9 nf=2 +XM2 net11 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=1 l=0.9 nf=2 +XM3 IREF1 net11 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 nf=1 +XM4 IOUT1 IREF1 net11 VSS sky130_fd_pr__nfet_01v8 w=1 l=0.9 nf=2 +.ends C14_sky130_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C14/sky130/sW0.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW0.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..430f2687 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW0.5_sL1.5/target_lvs.spice @@ -0,0 +1,9 @@ +.subckt C14_sky130_sW0.5_sL1.5 VSS IIN1 IOUT1 IREF1 +XM1_f0 IIN1 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM1_f1 IIN1 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM2_f0 net11 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM2_f1 net11 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM3_f0 IREF1 net11 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM4_f0 IOUT1 IREF1 net11 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM4_f1 IOUT1 IREF1 net11 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +.ends C14_sky130_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C14/sky130/sW0.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW0.5_sL1.5/testbench.spice new file mode 100644 index 00000000..5964a3dd --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW0.5_sL1.5/testbench.spice @@ -0,0 +1,26 @@ +X1 VSS IIN1 IOUT1 IREF1 C14_sky130_sW0.5_sL1.5 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIIN1 VDDB IIN1 2e-05 +IIREF1 VDDB IREF1 5e-06 +.nodeset v(IIN1)=0.54 v(IREF1)=0.54 + +VOUT IOUT1 0 1.8 +.control +dc VOUT 1.8 0 -0.0045 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=1.27 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.03 cross=last +meas dc dev_at_vdd find dev at=1.791 +let gout = deriv(iout) +meas dc gout_t find gout at=1.27 +let rout_v = 1/gout +meas dc rout_t find rout_v at=1.27 +echo vout_test = 1.27 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C14/sky130/sW0.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW0.5_sL1/case.json new file mode 100644 index 00000000..a6e03c2f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW0.5_sL1/case.json @@ -0,0 +1,152 @@ +{ + "case_id": "C14_sky130_sW0.5_sL1", + "circuit_id": "C14", + "pdk": "sky130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "dut_name": "C14_sky130_sW0.5_sL1", + "ports": [ + "VSS", + "IIN1", + "IOUT1", + "IREF1" + ], + "sizing": { + "M1": { + "w": 1.0, + "l": 0.6, + "nf": 2 + }, + "M2": { + "w": 1.0, + "l": 0.6, + "nf": 2 + }, + "M3": { + "w": 0.5, + "l": 0.6, + "nf": 1 + }, + "M4": { + "w": 1.0, + "l": 0.6, + "nf": 2 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF1": { + "i": 5e-06, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 1.1700000000000002, + "tol": 0.03, + "vout_test": 1.24 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.6, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.6, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 1.0, + "l0": 0.6, + "nf0": 2, + "uw0": 0.5, + "w": 0.5, + "l": 0.6, + "nf": 1, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.6, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "cec90c22ccda6260", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "ideal_current_source", + "port": "IREF1", + "current_A": 5e-06, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/sky130/sW0.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW0.5_sL1/manifest.json new file mode 100644 index 00000000..7f647753 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW0.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "57dbeec226df629c0b6d357b18733eeb16b99fb47fafe113149a9392cb02dfee", + "qualification.json": "35f95f0409925899fcf7b64587b891bde8aa62a73c4cf8e2bd6e7ce6f26ae21b", + "specs.json": "1642199fbb35ae5fd693894db8633792fce1cb36253cac1885e163473a1d6631", + "target.spice": "b09742c15b30c6df56a861ab7a4ac840d45c230b8f09f662f63d98705d5a57d1", + "target_lvs.spice": "3aaed56e19baa066bb0c5097b221247ff5ede77c4db61b6271e7d8f7ed66a40c", + "testbench.spice": "09d3a5c3a07e73787357c74bfb06555203b6a1884406fd655a22e4ed59495f1d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/sky130/sW0.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW0.5_sL1/qualification.json new file mode 100644 index 00000000..8760144a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW0.5_sL1/qualification.json @@ -0,0 +1,115 @@ +{ + "case_id": "C14_sky130_sW0.5_sL1", + "circuit_id": "C14", + "pdk": "sky130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.6, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.6, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 1.0, + "l0": 0.6, + "nf0": 2, + "uw0": 0.5, + "w": 0.5, + "l": 0.6, + "nf": 1, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.6, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "cec90c22ccda6260", + "mirror_pass1": { + "vmin": 0.6825595, + "status": "passed", + "vout_test": 1.24 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.7826 + }, + "_frozen_from": { + "schematic": { + "err": -0.008847, + "vmin": 0.6825595 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.08 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 19.1, + "schematic_measures": { + "iout_t": 1.982306e-05, + "err": -0.008847, + "vmin": 0.6825595, + "dev_at_vdd": 0.00883981, + "gout_t": 6.273302e-10, + "rout_t": 1594470000.0, + "vout_test": 1.24, + "rout_nom": 1594470000.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/sky130/sW0.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW0.5_sL1/specs.json new file mode 100644 index 00000000..3617a52b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW0.5_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.7826 + }, + "_frozen_from": { + "schematic": { + "err": -0.008847, + "vmin": 0.6825595 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.08 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/sky130/sW0.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW0.5_sL1/target.spice new file mode 100644 index 00000000..e5051158 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW0.5_sL1/target.spice @@ -0,0 +1,6 @@ +.subckt C14_sky130_sW0.5_sL1 VSS IIN1 IOUT1 IREF1 +XM1 IIN1 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=1 l=0.6 nf=2 +XM2 net11 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=1 l=0.6 nf=2 +XM3 IREF1 net11 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 nf=1 +XM4 IOUT1 IREF1 net11 VSS sky130_fd_pr__nfet_01v8 w=1 l=0.6 nf=2 +.ends C14_sky130_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C14/sky130/sW0.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW0.5_sL1/target_lvs.spice new file mode 100644 index 00000000..b8f3303e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW0.5_sL1/target_lvs.spice @@ -0,0 +1,9 @@ +.subckt C14_sky130_sW0.5_sL1 VSS IIN1 IOUT1 IREF1 +XM1_f0 IIN1 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f1 IIN1 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f0 net11 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f1 net11 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f0 IREF1 net11 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f0 IOUT1 IREF1 net11 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f1 IOUT1 IREF1 net11 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +.ends C14_sky130_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C14/sky130/sW0.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW0.5_sL1/testbench.spice new file mode 100644 index 00000000..f223b4bb --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW0.5_sL1/testbench.spice @@ -0,0 +1,26 @@ +X1 VSS IIN1 IOUT1 IREF1 C14_sky130_sW0.5_sL1 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIIN1 VDDB IIN1 2e-05 +IIREF1 VDDB IREF1 5e-06 +.nodeset v(IIN1)=0.54 v(IREF1)=0.54 + +VOUT IOUT1 0 1.8 +.control +dc VOUT 1.8 0 -0.0045 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=1.24 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.03 cross=last +meas dc dev_at_vdd find dev at=1.791 +let gout = deriv(iout) +meas dc gout_t find gout at=1.24 +let rout_v = 1/gout +meas dc rout_t find rout_v at=1.24 +echo vout_test = 1.24 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C14/sky130/sW0.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW0.5_sL2/case.json new file mode 100644 index 00000000..215db8b1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW0.5_sL2/case.json @@ -0,0 +1,152 @@ +{ + "case_id": "C14_sky130_sW0.5_sL2", + "circuit_id": "C14", + "pdk": "sky130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "dut_name": "C14_sky130_sW0.5_sL2", + "ports": [ + "VSS", + "IIN1", + "IOUT1", + "IREF1" + ], + "sizing": { + "M1": { + "w": 1.0, + "l": 1.2, + "nf": 2 + }, + "M2": { + "w": 1.0, + "l": 1.2, + "nf": 2 + }, + "M3": { + "w": 0.5, + "l": 1.2, + "nf": 1 + }, + "M4": { + "w": 1.0, + "l": 1.2, + "nf": 2 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF1": { + "i": 5e-06, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 1.1700000000000002, + "tol": 0.03, + "vout_test": 1.28 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.2, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.2, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 1.0, + "l0": 0.6, + "nf0": 2, + "uw0": 0.5, + "w": 0.5, + "l": 1.2, + "nf": 1, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.2, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "09e948c51cdf0fa7", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "ideal_current_source", + "port": "IREF1", + "current_A": 5e-06, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/sky130/sW0.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW0.5_sL2/manifest.json new file mode 100644 index 00000000..f9bbd5a2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW0.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "8b0b738293b19c4273e974064482fd2b99a0ed7f5fc9f8a836779d1bdf868462", + "qualification.json": "16e5d44002e28409e445e15c644c81f47790c3c54ba98033a5a3187e0d2716ad", + "specs.json": "4dfe90c7076176e46853492859f32be2c8774781494c6724f3c83366b7eef481", + "target.spice": "62dfcbedb64a8fb9a435f787e2fd89a515e91c5c62be9cd31f5143df6f80b1be", + "target_lvs.spice": "d08b9e722383f2f3113140cb9804b48193960b72971400ce0d8d8746d6441fe6", + "testbench.spice": "21770d65d61c46312e89b23a4b5f7fe244ec7d0d4e413e852b267e42d358a10d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/sky130/sW0.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW0.5_sL2/qualification.json new file mode 100644 index 00000000..1ba6918b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW0.5_sL2/qualification.json @@ -0,0 +1,115 @@ +{ + "case_id": "C14_sky130_sW0.5_sL2", + "circuit_id": "C14", + "pdk": "sky130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.2, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.2, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 1.0, + "l0": 0.6, + "nf0": 2, + "uw0": 0.5, + "w": 0.5, + "l": 1.2, + "nf": 1, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.2, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "09e948c51cdf0fa7", + "mirror_pass1": { + "vmin": 0.7688774, + "status": "passed", + "vout_test": 1.28 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.8689 + }, + "_frozen_from": { + "schematic": { + "err": -0.010678, + "vmin": 0.7688774 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.08 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 19.1, + "schematic_measures": { + "iout_t": 1.978644e-05, + "err": -0.010678, + "vmin": 0.7688774, + "dev_at_vdd": 0.01065672, + "gout_t": 3.72794e-09, + "rout_t": 268445700.0, + "vout_test": 1.28, + "rout_nom": 268445700.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/sky130/sW0.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW0.5_sL2/specs.json new file mode 100644 index 00000000..2995ad21 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW0.5_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.8689 + }, + "_frozen_from": { + "schematic": { + "err": -0.010678, + "vmin": 0.7688774 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.08 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/sky130/sW0.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW0.5_sL2/target.spice new file mode 100644 index 00000000..99eae893 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW0.5_sL2/target.spice @@ -0,0 +1,6 @@ +.subckt C14_sky130_sW0.5_sL2 VSS IIN1 IOUT1 IREF1 +XM1 IIN1 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=1 l=1.2 nf=2 +XM2 net11 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=1 l=1.2 nf=2 +XM3 IREF1 net11 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 nf=1 +XM4 IOUT1 IREF1 net11 VSS sky130_fd_pr__nfet_01v8 w=1 l=1.2 nf=2 +.ends C14_sky130_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C14/sky130/sW0.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW0.5_sL2/target_lvs.spice new file mode 100644 index 00000000..4f8a776f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW0.5_sL2/target_lvs.spice @@ -0,0 +1,9 @@ +.subckt C14_sky130_sW0.5_sL2 VSS IIN1 IOUT1 IREF1 +XM1_f0 IIN1 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM1_f1 IIN1 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM2_f0 net11 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM2_f1 net11 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM3_f0 IREF1 net11 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM4_f0 IOUT1 IREF1 net11 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM4_f1 IOUT1 IREF1 net11 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +.ends C14_sky130_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C14/sky130/sW0.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW0.5_sL2/testbench.spice new file mode 100644 index 00000000..5217842d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW0.5_sL2/testbench.spice @@ -0,0 +1,26 @@ +X1 VSS IIN1 IOUT1 IREF1 C14_sky130_sW0.5_sL2 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIIN1 VDDB IIN1 2e-05 +IIREF1 VDDB IREF1 5e-06 +.nodeset v(IIN1)=0.54 v(IREF1)=0.54 + +VOUT IOUT1 0 1.8 +.control +dc VOUT 1.8 0 -0.0045 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=1.28 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.03 cross=last +meas dc dev_at_vdd find dev at=1.791 +let gout = deriv(iout) +meas dc gout_t find gout at=1.28 +let rout_v = 1/gout +meas dc rout_t find rout_v at=1.28 +echo vout_test = 1.28 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1.5_sL1.5/case.json new file mode 100644 index 00000000..c6284673 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1.5_sL1.5/case.json @@ -0,0 +1,152 @@ +{ + "case_id": "C14_sky130_sW1.5_sL1.5", + "circuit_id": "C14", + "pdk": "sky130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "dut_name": "C14_sky130_sW1.5_sL1.5", + "ports": [ + "VSS", + "IIN1", + "IOUT1", + "IREF1" + ], + "sizing": { + "M1": { + "w": 3.0, + "l": 0.9, + "nf": 6 + }, + "M2": { + "w": 3.0, + "l": 0.9, + "nf": 6 + }, + "M3": { + "w": 1.5, + "l": 0.9, + "nf": 3 + }, + "M4": { + "w": 3.0, + "l": 0.9, + "nf": 6 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF1": { + "i": 5e-06, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 1.1700000000000002, + "tol": 0.03, + "vout_test": 1.18 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.9, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.9, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 1.0, + "l0": 0.6, + "nf0": 2, + "uw0": 0.5, + "w": 1.5, + "l": 0.9, + "nf": 3, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.9, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "e81ecec96cb109d9", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "ideal_current_source", + "port": "IREF1", + "current_A": 5e-06, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1.5_sL1.5/manifest.json new file mode 100644 index 00000000..ed765a79 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "14893addfa3bfdc3144491966868c94b39f70dca88ad59d0e7d6588f54e154c8", + "qualification.json": "9606912a1a52efe09b3c242f0577b3ce11e36c344e8533458e34d87f7132a795", + "specs.json": "aaba5e6eb62a673fb9bebd997c40239e61d296a9ec897a018eb32ef6f33c0758", + "target.spice": "ebd4dd3c51cc5a2e661c1480dd8091b49f818a74948d18d13c856f879a69831a", + "target_lvs.spice": "536dfb0d0cc5b722da026621aa50c2a3f510ac0017da097ec5b1e9bb0c7a8242", + "testbench.spice": "9ef16a6edf1f51661205e074fac69ac8ca01811d0e04635c936eec48fd980a0e" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1.5_sL1.5/qualification.json new file mode 100644 index 00000000..cf204cb4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1.5_sL1.5/qualification.json @@ -0,0 +1,115 @@ +{ + "case_id": "C14_sky130_sW1.5_sL1.5", + "circuit_id": "C14", + "pdk": "sky130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.9, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.9, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 1.0, + "l0": 0.6, + "nf0": 2, + "uw0": 0.5, + "w": 1.5, + "l": 0.9, + "nf": 3, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.9, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "e81ecec96cb109d9", + "mirror_pass1": { + "vmin": 0.5698569, + "status": "passed", + "vout_test": 1.18 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.6699 + }, + "_frozen_from": { + "schematic": { + "err": -0.007168, + "vmin": 0.5698569 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.08 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 12.4, + "schematic_measures": { + "iout_t": 1.985664e-05, + "err": -0.007168, + "vmin": 0.5698569, + "dev_at_vdd": 0.007163431, + "gout_t": 2.607722e-10, + "rout_t": 3834946000.0, + "vout_test": 1.18, + "rout_nom": 3834946000.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1.5_sL1.5/specs.json new file mode 100644 index 00000000..30adb68c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1.5_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.6699 + }, + "_frozen_from": { + "schematic": { + "err": -0.007168, + "vmin": 0.5698569 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.08 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1.5_sL1.5/target.spice new file mode 100644 index 00000000..1a9db8b3 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1.5_sL1.5/target.spice @@ -0,0 +1,6 @@ +.subckt C14_sky130_sW1.5_sL1.5 VSS IIN1 IOUT1 IREF1 +XM1 IIN1 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=3 l=0.9 nf=6 +XM2 net11 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=3 l=0.9 nf=6 +XM3 IREF1 net11 VSS VSS sky130_fd_pr__nfet_01v8 w=1.5 l=0.9 nf=3 +XM4 IOUT1 IREF1 net11 VSS sky130_fd_pr__nfet_01v8 w=3 l=0.9 nf=6 +.ends C14_sky130_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..74c7c9f5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1.5_sL1.5/target_lvs.spice @@ -0,0 +1,23 @@ +.subckt C14_sky130_sW1.5_sL1.5 VSS IIN1 IOUT1 IREF1 +XM1_f0 IIN1 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM1_f1 IIN1 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM1_f2 IIN1 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM1_f3 IIN1 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM1_f4 IIN1 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM1_f5 IIN1 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM2_f0 net11 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM2_f1 net11 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM2_f2 net11 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM2_f3 net11 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM2_f4 net11 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM2_f5 net11 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM3_f0 IREF1 net11 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM3_f1 IREF1 net11 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM3_f2 IREF1 net11 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM4_f0 IOUT1 IREF1 net11 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM4_f1 IOUT1 IREF1 net11 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM4_f2 IOUT1 IREF1 net11 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM4_f3 IOUT1 IREF1 net11 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM4_f4 IOUT1 IREF1 net11 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM4_f5 IOUT1 IREF1 net11 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +.ends C14_sky130_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1.5_sL1.5/testbench.spice new file mode 100644 index 00000000..7a0f8beb --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1.5_sL1.5/testbench.spice @@ -0,0 +1,26 @@ +X1 VSS IIN1 IOUT1 IREF1 C14_sky130_sW1.5_sL1.5 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIIN1 VDDB IIN1 2e-05 +IIREF1 VDDB IREF1 5e-06 +.nodeset v(IIN1)=0.54 v(IREF1)=0.54 + +VOUT IOUT1 0 1.8 +.control +dc VOUT 1.8 0 -0.0045 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=1.18 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.03 cross=last +meas dc dev_at_vdd find dev at=1.791 +let gout = deriv(iout) +meas dc gout_t find gout at=1.18 +let rout_v = 1/gout +meas dc rout_t find rout_v at=1.18 +echo vout_test = 1.18 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1.5_sL1/case.json new file mode 100644 index 00000000..5e76273f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1.5_sL1/case.json @@ -0,0 +1,152 @@ +{ + "case_id": "C14_sky130_sW1.5_sL1", + "circuit_id": "C14", + "pdk": "sky130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "dut_name": "C14_sky130_sW1.5_sL1", + "ports": [ + "VSS", + "IIN1", + "IOUT1", + "IREF1" + ], + "sizing": { + "M1": { + "w": 3.0, + "l": 0.6, + "nf": 6 + }, + "M2": { + "w": 3.0, + "l": 0.6, + "nf": 6 + }, + "M3": { + "w": 1.5, + "l": 0.6, + "nf": 3 + }, + "M4": { + "w": 3.0, + "l": 0.6, + "nf": 6 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF1": { + "i": 5e-06, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 1.1700000000000002, + "tol": 0.03, + "vout_test": 1.17 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.6, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.6, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 1.0, + "l0": 0.6, + "nf0": 2, + "uw0": 0.5, + "w": 1.5, + "l": 0.6, + "nf": 3, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.6, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "ddf8e23b97de0177", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "ideal_current_source", + "port": "IREF1", + "current_A": 5e-06, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1.5_sL1/manifest.json new file mode 100644 index 00000000..61c6bbe8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "6273462e59ed9febfc50eb3f7eb28ae2b17e2b91db594ebf62cbccc5f0c199a8", + "qualification.json": "f52396c5777fbb57854cf48ac34ed1e616d1379b1a6ccc08b3af53fd7c69e5b5", + "specs.json": "d7df9a87acd9278252b45eefa23358285ff3540469d6447e3a768a2575cacc16", + "target.spice": "4a8b064b609daeb29db6f3ff0d2b1a8671aadd26d3c30e5f063ea949f682e3a7", + "target_lvs.spice": "304d0dec8043f40bb2163ac5f257a34bc91445bdf4f7ffd1393eed55c7401305", + "testbench.spice": "5624c922048d6151197dacc258f555a4a855f166c22c98ee1be5a6fc33eba781" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1.5_sL1/qualification.json new file mode 100644 index 00000000..71503139 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1.5_sL1/qualification.json @@ -0,0 +1,115 @@ +{ + "case_id": "C14_sky130_sW1.5_sL1", + "circuit_id": "C14", + "pdk": "sky130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.6, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.6, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 1.0, + "l0": 0.6, + "nf0": 2, + "uw0": 0.5, + "w": 1.5, + "l": 0.6, + "nf": 3, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.6, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "ddf8e23b97de0177", + "mirror_pass1": { + "vmin": 0.546345, + "status": "passed", + "vout_test": 1.17 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.6463 + }, + "_frozen_from": { + "schematic": { + "err": -0.0063195, + "vmin": 0.546345 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.08 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 12.3, + "schematic_measures": { + "iout_t": 1.987361e-05, + "err": -0.0063195, + "vmin": 0.546345, + "dev_at_vdd": 0.00631613, + "gout_t": 1.864492e-10, + "rout_t": 5363391000.0, + "vout_test": 1.17, + "rout_nom": 5363391000.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1.5_sL1/specs.json new file mode 100644 index 00000000..5a27d64d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1.5_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.6463 + }, + "_frozen_from": { + "schematic": { + "err": -0.0063195, + "vmin": 0.546345 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.08 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1.5_sL1/target.spice new file mode 100644 index 00000000..69642904 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1.5_sL1/target.spice @@ -0,0 +1,6 @@ +.subckt C14_sky130_sW1.5_sL1 VSS IIN1 IOUT1 IREF1 +XM1 IIN1 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=3 l=0.6 nf=6 +XM2 net11 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=3 l=0.6 nf=6 +XM3 IREF1 net11 VSS VSS sky130_fd_pr__nfet_01v8 w=1.5 l=0.6 nf=3 +XM4 IOUT1 IREF1 net11 VSS sky130_fd_pr__nfet_01v8 w=3 l=0.6 nf=6 +.ends C14_sky130_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1.5_sL1/target_lvs.spice new file mode 100644 index 00000000..b537c63a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1.5_sL1/target_lvs.spice @@ -0,0 +1,23 @@ +.subckt C14_sky130_sW1.5_sL1 VSS IIN1 IOUT1 IREF1 +XM1_f0 IIN1 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f1 IIN1 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f2 IIN1 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f3 IIN1 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f4 IIN1 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f5 IIN1 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f0 net11 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f1 net11 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f2 net11 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f3 net11 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f4 net11 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f5 net11 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f0 IREF1 net11 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f1 IREF1 net11 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f2 IREF1 net11 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f0 IOUT1 IREF1 net11 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f1 IOUT1 IREF1 net11 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f2 IOUT1 IREF1 net11 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f3 IOUT1 IREF1 net11 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f4 IOUT1 IREF1 net11 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f5 IOUT1 IREF1 net11 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +.ends C14_sky130_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1.5_sL1/testbench.spice new file mode 100644 index 00000000..5fd2d369 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1.5_sL1/testbench.spice @@ -0,0 +1,26 @@ +X1 VSS IIN1 IOUT1 IREF1 C14_sky130_sW1.5_sL1 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIIN1 VDDB IIN1 2e-05 +IIREF1 VDDB IREF1 5e-06 +.nodeset v(IIN1)=0.54 v(IREF1)=0.54 + +VOUT IOUT1 0 1.8 +.control +dc VOUT 1.8 0 -0.0045 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=1.17 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.03 cross=last +meas dc dev_at_vdd find dev at=1.791 +let gout = deriv(iout) +meas dc gout_t find gout at=1.17 +let rout_v = 1/gout +meas dc rout_t find rout_v at=1.17 +echo vout_test = 1.17 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1.5_sL2/case.json new file mode 100644 index 00000000..3de052bb --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1.5_sL2/case.json @@ -0,0 +1,152 @@ +{ + "case_id": "C14_sky130_sW1.5_sL2", + "circuit_id": "C14", + "pdk": "sky130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "dut_name": "C14_sky130_sW1.5_sL2", + "ports": [ + "VSS", + "IIN1", + "IOUT1", + "IREF1" + ], + "sizing": { + "M1": { + "w": 3.0, + "l": 1.2, + "nf": 6 + }, + "M2": { + "w": 3.0, + "l": 1.2, + "nf": 6 + }, + "M3": { + "w": 1.5, + "l": 1.2, + "nf": 3 + }, + "M4": { + "w": 3.0, + "l": 1.2, + "nf": 6 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF1": { + "i": 5e-06, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 1.1700000000000002, + "tol": 0.03, + "vout_test": 1.19 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.2, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.2, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 1.0, + "l0": 0.6, + "nf0": 2, + "uw0": 0.5, + "w": 1.5, + "l": 1.2, + "nf": 3, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.2, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "cf7ee1291b61ccbb", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "ideal_current_source", + "port": "IREF1", + "current_A": 5e-06, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1.5_sL2/manifest.json new file mode 100644 index 00000000..240e2c31 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "0d5ccc3b5e6db3d359741213429d68d4529901df54002541a3a0c03ced36346a", + "qualification.json": "184c1be61a944eab5800b90337a528af5c32f83fa8cb543dbfdf9320f7a4ff43", + "specs.json": "d89aae57dfba16cc0c6fdfb8770cca1fbbb78b9f5d0e1f0dd09f111dfa244016", + "target.spice": "f8e80c0cd60e62e422c1ac658582b1186c07f3622e84fd45666382e0662ac738", + "target_lvs.spice": "f98552ac4ad81ac823db58af4e77c19c85a73c32bcbf4db500218bbbef2e346b", + "testbench.spice": "50e041d060e32c1ce8c82f95b1fd06340c1d62b1cdbcf745981bfd0d45677c37" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1.5_sL2/qualification.json new file mode 100644 index 00000000..152a325a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1.5_sL2/qualification.json @@ -0,0 +1,115 @@ +{ + "case_id": "C14_sky130_sW1.5_sL2", + "circuit_id": "C14", + "pdk": "sky130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.2, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.2, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 1.0, + "l0": 0.6, + "nf0": 2, + "uw0": 0.5, + "w": 1.5, + "l": 1.2, + "nf": 3, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.2, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "cf7ee1291b61ccbb", + "mirror_pass1": { + "vmin": 0.5775861, + "status": "passed", + "vout_test": 1.19 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.6776 + }, + "_frozen_from": { + "schematic": { + "err": -0.007468, + "vmin": 0.5775861 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.08 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 12.3, + "schematic_measures": { + "iout_t": 1.985064e-05, + "err": -0.007468, + "vmin": 0.5775861, + "dev_at_vdd": 0.00746273, + "gout_t": 3.154333e-10, + "rout_t": 3170565000.0, + "vout_test": 1.19, + "rout_nom": 3170565000.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1.5_sL2/specs.json new file mode 100644 index 00000000..b905987d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1.5_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.6776 + }, + "_frozen_from": { + "schematic": { + "err": -0.007468, + "vmin": 0.5775861 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.08 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1.5_sL2/target.spice new file mode 100644 index 00000000..83122ad1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1.5_sL2/target.spice @@ -0,0 +1,6 @@ +.subckt C14_sky130_sW1.5_sL2 VSS IIN1 IOUT1 IREF1 +XM1 IIN1 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=3 l=1.2 nf=6 +XM2 net11 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=3 l=1.2 nf=6 +XM3 IREF1 net11 VSS VSS sky130_fd_pr__nfet_01v8 w=1.5 l=1.2 nf=3 +XM4 IOUT1 IREF1 net11 VSS sky130_fd_pr__nfet_01v8 w=3 l=1.2 nf=6 +.ends C14_sky130_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1.5_sL2/target_lvs.spice new file mode 100644 index 00000000..39d6628b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1.5_sL2/target_lvs.spice @@ -0,0 +1,23 @@ +.subckt C14_sky130_sW1.5_sL2 VSS IIN1 IOUT1 IREF1 +XM1_f0 IIN1 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM1_f1 IIN1 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM1_f2 IIN1 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM1_f3 IIN1 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM1_f4 IIN1 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM1_f5 IIN1 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM2_f0 net11 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM2_f1 net11 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM2_f2 net11 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM2_f3 net11 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM2_f4 net11 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM2_f5 net11 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM3_f0 IREF1 net11 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM3_f1 IREF1 net11 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM3_f2 IREF1 net11 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM4_f0 IOUT1 IREF1 net11 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM4_f1 IOUT1 IREF1 net11 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM4_f2 IOUT1 IREF1 net11 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM4_f3 IOUT1 IREF1 net11 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM4_f4 IOUT1 IREF1 net11 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM4_f5 IOUT1 IREF1 net11 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +.ends C14_sky130_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1.5_sL2/testbench.spice new file mode 100644 index 00000000..c22a0eaa --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1.5_sL2/testbench.spice @@ -0,0 +1,26 @@ +X1 VSS IIN1 IOUT1 IREF1 C14_sky130_sW1.5_sL2 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIIN1 VDDB IIN1 2e-05 +IIREF1 VDDB IREF1 5e-06 +.nodeset v(IIN1)=0.54 v(IREF1)=0.54 + +VOUT IOUT1 0 1.8 +.control +dc VOUT 1.8 0 -0.0045 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=1.19 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.03 cross=last +meas dc dev_at_vdd find dev at=1.791 +let gout = deriv(iout) +meas dc gout_t find gout at=1.19 +let rout_v = 1/gout +meas dc rout_t find rout_v at=1.19 +echo vout_test = 1.19 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1_sL1.5/case.json new file mode 100644 index 00000000..9eecc0aa --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1_sL1.5/case.json @@ -0,0 +1,152 @@ +{ + "case_id": "C14_sky130_sW1_sL1.5", + "circuit_id": "C14", + "pdk": "sky130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "dut_name": "C14_sky130_sW1_sL1.5", + "ports": [ + "VSS", + "IIN1", + "IOUT1", + "IREF1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.9, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 0.9, + "nf": 4 + }, + "M3": { + "w": 1.0, + "l": 0.9, + "nf": 2 + }, + "M4": { + "w": 2.0, + "l": 0.9, + "nf": 4 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF1": { + "i": 5e-06, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 1.1700000000000002, + "tol": 0.03, + "vout_test": 1.21 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.9, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.9, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 1.0, + "l0": 0.6, + "nf0": 2, + "uw0": 0.5, + "w": 1.0, + "l": 0.9, + "nf": 2, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.9, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "a2f661aad0521e79", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "ideal_current_source", + "port": "IREF1", + "current_A": 5e-06, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1_sL1.5/manifest.json new file mode 100644 index 00000000..711f964a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "9cfff12af92e89b70f54a23d7b0c8af9af113e90eac3c83b02f017428e1160c9", + "qualification.json": "97e2d827036706a015640121d779078042946d641744bf24e87d4efc4780a9e0", + "specs.json": "05ee4ddc04c5814c94ab087cf310ede77b6550d8b407e74511a4da36c8bfa29f", + "target.spice": "6f3baee2147288c1de82f5ed022d464a81e1698ab66fb3778e89ab1e1ac4d775", + "target_lvs.spice": "90a42c5b8bffbb3f7be384feca95e9f186df994f4b5494382fd097f77b35abbd", + "testbench.spice": "f1e9bcf15df87865c88f551f1e538203ca1e533348eb9cfbbf8cc850b133cd92" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1_sL1.5/qualification.json new file mode 100644 index 00000000..db5c1a0c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1_sL1.5/qualification.json @@ -0,0 +1,115 @@ +{ + "case_id": "C14_sky130_sW1_sL1.5", + "circuit_id": "C14", + "pdk": "sky130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.9, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.9, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 1.0, + "l0": 0.6, + "nf0": 2, + "uw0": 0.5, + "w": 1.0, + "l": 0.9, + "nf": 2, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.9, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "a2f661aad0521e79", + "mirror_pass1": { + "vmin": 0.6196821, + "status": "passed", + "vout_test": 1.21 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.7197 + }, + "_frozen_from": { + "schematic": { + "err": -0.008077, + "vmin": 0.6196821 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.08 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 12.3, + "schematic_measures": { + "iout_t": 1.983846e-05, + "err": -0.008077, + "vmin": 0.6196821, + "dev_at_vdd": 0.008071483, + "gout_t": 3.878803e-10, + "rout_t": 2578252000.0, + "vout_test": 1.21, + "rout_nom": 2578252000.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1_sL1.5/specs.json new file mode 100644 index 00000000..0a8fbcc9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.7197 + }, + "_frozen_from": { + "schematic": { + "err": -0.008077, + "vmin": 0.6196821 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.08 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1_sL1.5/target.spice new file mode 100644 index 00000000..6c5f1530 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1_sL1.5/target.spice @@ -0,0 +1,6 @@ +.subckt C14_sky130_sW1_sL1.5 VSS IIN1 IOUT1 IREF1 +XM1 IIN1 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=2 l=0.9 nf=4 +XM2 net11 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=2 l=0.9 nf=4 +XM3 IREF1 net11 VSS VSS sky130_fd_pr__nfet_01v8 w=1 l=0.9 nf=2 +XM4 IOUT1 IREF1 net11 VSS sky130_fd_pr__nfet_01v8 w=2 l=0.9 nf=4 +.ends C14_sky130_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1_sL1.5/target_lvs.spice new file mode 100644 index 00000000..a0e913d9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1_sL1.5/target_lvs.spice @@ -0,0 +1,16 @@ +.subckt C14_sky130_sW1_sL1.5 VSS IIN1 IOUT1 IREF1 +XM1_f0 IIN1 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM1_f1 IIN1 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM1_f2 IIN1 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM1_f3 IIN1 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM2_f0 net11 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM2_f1 net11 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM2_f2 net11 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM2_f3 net11 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM3_f0 IREF1 net11 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM3_f1 IREF1 net11 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM4_f0 IOUT1 IREF1 net11 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM4_f1 IOUT1 IREF1 net11 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM4_f2 IOUT1 IREF1 net11 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM4_f3 IOUT1 IREF1 net11 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +.ends C14_sky130_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1_sL1.5/testbench.spice new file mode 100644 index 00000000..d5b8f915 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1_sL1.5/testbench.spice @@ -0,0 +1,26 @@ +X1 VSS IIN1 IOUT1 IREF1 C14_sky130_sW1_sL1.5 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIIN1 VDDB IIN1 2e-05 +IIREF1 VDDB IREF1 5e-06 +.nodeset v(IIN1)=0.54 v(IREF1)=0.54 + +VOUT IOUT1 0 1.8 +.control +dc VOUT 1.8 0 -0.0045 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=1.21 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.03 cross=last +meas dc dev_at_vdd find dev at=1.791 +let gout = deriv(iout) +meas dc gout_t find gout at=1.21 +let rout_v = 1/gout +meas dc rout_t find rout_v at=1.21 +echo vout_test = 1.21 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1_sL1/case.json new file mode 100644 index 00000000..cee29fac --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1_sL1/case.json @@ -0,0 +1,152 @@ +{ + "case_id": "C14_sky130_sW1_sL1", + "circuit_id": "C14", + "pdk": "sky130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "dut_name": "C14_sky130_sW1_sL1", + "ports": [ + "VSS", + "IIN1", + "IOUT1", + "IREF1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.6, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 0.6, + "nf": 4 + }, + "M3": { + "w": 1.0, + "l": 0.6, + "nf": 2 + }, + "M4": { + "w": 2.0, + "l": 0.6, + "nf": 4 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF1": { + "i": 5e-06, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 1.1700000000000002, + "tol": 0.03, + "vout_test": 1.19 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 1.0, + "l0": 0.6, + "nf0": 2, + "uw0": 0.5, + "w": 1.0, + "l": 0.6, + "nf": 2, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "e52fa280169f5140", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "ideal_current_source", + "port": "IREF1", + "current_A": 5e-06, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1_sL1/manifest.json new file mode 100644 index 00000000..5d0ef83f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "bf1af23f61b501bbce30a0281cb0e41b330a5298b506e5b7fc630bc680e5ea51", + "qualification.json": "2b01955b399ce91cf8ed728c64a98f4eda16a0299167c328f791431df3d748f4", + "specs.json": "086e08f1348a2ee374b3f7baee394d664c7443cb699b1cdfc7dccc4a21a8d663", + "target.spice": "c41c78d920bbfb883d8b0e67b1acf33eb38e2010b6e1cef5011eea90fca3ab00", + "target_lvs.spice": "a2f3edec11d9debdbed090993c9b42965d8a2aa5b1b0ec81e6cb30711d2c62b0", + "testbench.spice": "5f0f1d3c63482c9434871ab250691ddfab36d5b6cbda71ac4696e747284be445" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1_sL1/qualification.json new file mode 100644 index 00000000..bc2b1faa --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1_sL1/qualification.json @@ -0,0 +1,115 @@ +{ + "case_id": "C14_sky130_sW1_sL1", + "circuit_id": "C14", + "pdk": "sky130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 1.0, + "l0": 0.6, + "nf0": 2, + "uw0": 0.5, + "w": 1.0, + "l": 0.6, + "nf": 2, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "e52fa280169f5140", + "mirror_pass1": { + "vmin": 0.5866486, + "status": "passed", + "vout_test": 1.19 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.6866 + }, + "_frozen_from": { + "schematic": { + "err": -0.0070175, + "vmin": 0.5866486 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.08 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 18.7, + "schematic_measures": { + "iout_t": 1.985965e-05, + "err": -0.0070175, + "vmin": 0.5866486, + "dev_at_vdd": 0.007013247, + "gout_t": 2.542863e-10, + "rout_t": 3932890000.0, + "vout_test": 1.19, + "rout_nom": 3932890000.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1_sL1/specs.json new file mode 100644 index 00000000..8fe35831 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.6866 + }, + "_frozen_from": { + "schematic": { + "err": -0.0070175, + "vmin": 0.5866486 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.08 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1_sL1/target.spice new file mode 100644 index 00000000..ca7c5b58 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1_sL1/target.spice @@ -0,0 +1,6 @@ +.subckt C14_sky130_sW1_sL1 VSS IIN1 IOUT1 IREF1 +XM1 IIN1 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=2 l=0.6 nf=4 +XM2 net11 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=2 l=0.6 nf=4 +XM3 IREF1 net11 VSS VSS sky130_fd_pr__nfet_01v8 w=1 l=0.6 nf=2 +XM4 IOUT1 IREF1 net11 VSS sky130_fd_pr__nfet_01v8 w=2 l=0.6 nf=4 +.ends C14_sky130_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1_sL1/target_lvs.spice new file mode 100644 index 00000000..8649a2e8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1_sL1/target_lvs.spice @@ -0,0 +1,16 @@ +.subckt C14_sky130_sW1_sL1 VSS IIN1 IOUT1 IREF1 +XM1_f0 IIN1 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f1 IIN1 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f2 IIN1 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f3 IIN1 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f0 net11 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f1 net11 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f2 net11 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f3 net11 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f0 IREF1 net11 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f1 IREF1 net11 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f0 IOUT1 IREF1 net11 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f1 IOUT1 IREF1 net11 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f2 IOUT1 IREF1 net11 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f3 IOUT1 IREF1 net11 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +.ends C14_sky130_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1_sL1/testbench.spice new file mode 100644 index 00000000..3362a5e6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1_sL1/testbench.spice @@ -0,0 +1,26 @@ +X1 VSS IIN1 IOUT1 IREF1 C14_sky130_sW1_sL1 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIIN1 VDDB IIN1 2e-05 +IIREF1 VDDB IREF1 5e-06 +.nodeset v(IIN1)=0.54 v(IREF1)=0.54 + +VOUT IOUT1 0 1.8 +.control +dc VOUT 1.8 0 -0.0045 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=1.19 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.03 cross=last +meas dc dev_at_vdd find dev at=1.791 +let gout = deriv(iout) +meas dc gout_t find gout at=1.19 +let rout_v = 1/gout +meas dc rout_t find rout_v at=1.19 +echo vout_test = 1.19 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1_sL2/case.json new file mode 100644 index 00000000..44d01795 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1_sL2/case.json @@ -0,0 +1,152 @@ +{ + "case_id": "C14_sky130_sW1_sL2", + "circuit_id": "C14", + "pdk": "sky130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "dut_name": "C14_sky130_sW1_sL2", + "ports": [ + "VSS", + "IIN1", + "IOUT1", + "IREF1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 1.2, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 1.2, + "nf": 4 + }, + "M3": { + "w": 1.0, + "l": 1.2, + "nf": 2 + }, + "M4": { + "w": 2.0, + "l": 1.2, + "nf": 4 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF1": { + "i": 5e-06, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 1.1700000000000002, + "tol": 0.03, + "vout_test": 1.22 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.2, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.2, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 1.0, + "l0": 0.6, + "nf0": 2, + "uw0": 0.5, + "w": 1.0, + "l": 1.2, + "nf": 2, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.2, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "4071a01c9b314c3d", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "ideal_current_source", + "port": "IREF1", + "current_A": 5e-06, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1_sL2/manifest.json new file mode 100644 index 00000000..99e86c2d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "2bd19f8dc2976707c38eb6fc3132221f3654953354d05b450fee8d3d107474e9", + "qualification.json": "853a8048db8d7ea45433a5e377d6b7876ee7cb422a87c7b6068f111c96210971", + "specs.json": "7d7140fe379490486ee32bf81bbc0d0f432fbdfbedfc46da6ab4ebdbc3cba934", + "target.spice": "3470d4e9ec20fa40fb0b60b861f0c97332ce394231384d3b09d36f28a66f5c42", + "target_lvs.spice": "1939a4f24317264579b346367cdd01485e5439ff0bfa60ad4df1d7aeffe1bc75", + "testbench.spice": "72e33f1caa80e7db7015e29f7a90a03910dfa713ea5b28c5b7b42be461e98d39" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1_sL2/qualification.json new file mode 100644 index 00000000..5d07a41b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1_sL2/qualification.json @@ -0,0 +1,115 @@ +{ + "case_id": "C14_sky130_sW1_sL2", + "circuit_id": "C14", + "pdk": "sky130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.2, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.2, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 1.0, + "l0": 0.6, + "nf0": 2, + "uw0": 0.5, + "w": 1.0, + "l": 1.2, + "nf": 2, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.2, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "4071a01c9b314c3d", + "mirror_pass1": { + "vmin": 0.6332049, + "status": "passed", + "vout_test": 1.22 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.7332 + }, + "_frozen_from": { + "schematic": { + "err": -0.0084205, + "vmin": 0.6332049 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.08 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 15.6, + "schematic_measures": { + "iout_t": 1.983159e-05, + "err": -0.0084205, + "vmin": 0.6332049, + "dev_at_vdd": 0.00841385, + "gout_t": 5.408206e-10, + "rout_t": 1849226000.0, + "vout_test": 1.22, + "rout_nom": 1849226000.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1_sL2/specs.json new file mode 100644 index 00000000..bf388f70 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.7332 + }, + "_frozen_from": { + "schematic": { + "err": -0.0084205, + "vmin": 0.6332049 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.08 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1_sL2/target.spice new file mode 100644 index 00000000..656ac2cc --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1_sL2/target.spice @@ -0,0 +1,6 @@ +.subckt C14_sky130_sW1_sL2 VSS IIN1 IOUT1 IREF1 +XM1 IIN1 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=2 l=1.2 nf=4 +XM2 net11 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=2 l=1.2 nf=4 +XM3 IREF1 net11 VSS VSS sky130_fd_pr__nfet_01v8 w=1 l=1.2 nf=2 +XM4 IOUT1 IREF1 net11 VSS sky130_fd_pr__nfet_01v8 w=2 l=1.2 nf=4 +.ends C14_sky130_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1_sL2/target_lvs.spice new file mode 100644 index 00000000..02a91992 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1_sL2/target_lvs.spice @@ -0,0 +1,16 @@ +.subckt C14_sky130_sW1_sL2 VSS IIN1 IOUT1 IREF1 +XM1_f0 IIN1 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM1_f1 IIN1 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM1_f2 IIN1 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM1_f3 IIN1 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM2_f0 net11 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM2_f1 net11 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM2_f2 net11 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM2_f3 net11 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM3_f0 IREF1 net11 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM3_f1 IREF1 net11 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM4_f0 IOUT1 IREF1 net11 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM4_f1 IOUT1 IREF1 net11 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM4_f2 IOUT1 IREF1 net11 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM4_f3 IOUT1 IREF1 net11 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +.ends C14_sky130_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1_sL2/testbench.spice new file mode 100644 index 00000000..308e1932 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW1_sL2/testbench.spice @@ -0,0 +1,26 @@ +X1 VSS IIN1 IOUT1 IREF1 C14_sky130_sW1_sL2 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIIN1 VDDB IIN1 2e-05 +IIREF1 VDDB IREF1 5e-06 +.nodeset v(IIN1)=0.54 v(IREF1)=0.54 + +VOUT IOUT1 0 1.8 +.control +dc VOUT 1.8 0 -0.0045 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=1.22 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.03 cross=last +meas dc dev_at_vdd find dev at=1.791 +let gout = deriv(iout) +meas dc gout_t find gout at=1.22 +let rout_v = 1/gout +meas dc rout_t find rout_v at=1.22 +echo vout_test = 1.22 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C14/sky130/sW2_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW2_sL1.5/case.json new file mode 100644 index 00000000..0d48f50d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW2_sL1.5/case.json @@ -0,0 +1,152 @@ +{ + "case_id": "C14_sky130_sW2_sL1.5", + "circuit_id": "C14", + "pdk": "sky130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "dut_name": "C14_sky130_sW2_sL1.5", + "ports": [ + "VSS", + "IIN1", + "IOUT1", + "IREF1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.9, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 0.9, + "nf": 8 + }, + "M3": { + "w": 2.0, + "l": 0.9, + "nf": 4 + }, + "M4": { + "w": 4.0, + "l": 0.9, + "nf": 8 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF1": { + "i": 5e-06, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 1.1700000000000002, + "tol": 0.03, + "vout_test": 1.17 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.9, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.9, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 1.0, + "l0": 0.6, + "nf0": 2, + "uw0": 0.5, + "w": 2.0, + "l": 0.9, + "nf": 4, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.9, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "cf5bd71dfe67d9fd", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "ideal_current_source", + "port": "IREF1", + "current_A": 5e-06, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/sky130/sW2_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW2_sL1.5/manifest.json new file mode 100644 index 00000000..c482b03f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW2_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "bcc2794ab074b38629c34e2218c8dbbadd5f6a90dc73b11810ed6e794fd1e9a7", + "qualification.json": "44b920b798b24cbbbcd7d03e7ddf52626be154c3c851345b76fac2b1ff464f33", + "specs.json": "50b6c77317c913d546b94b07e26d97fa1078428995c5c1eb712015b5f3b8e051", + "target.spice": "c6e19be42636d7b8e1d1013459c9f4c26240654141fe511dc4cf5ddf312aeb88", + "target_lvs.spice": "99bab95f6b6bf8e3a746e5ff3b48b695f027fa413e7d07ee44b9d989209fce33", + "testbench.spice": "4ee8b044201826cdfc4708f33d8aa1383636a58ce70bc7906afdb69d95c5a8f6" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/sky130/sW2_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW2_sL1.5/qualification.json new file mode 100644 index 00000000..14227bc5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW2_sL1.5/qualification.json @@ -0,0 +1,115 @@ +{ + "case_id": "C14_sky130_sW2_sL1.5", + "circuit_id": "C14", + "pdk": "sky130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.9, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.9, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 1.0, + "l0": 0.6, + "nf0": 2, + "uw0": 0.5, + "w": 2.0, + "l": 0.9, + "nf": 4, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.9, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "cf5bd71dfe67d9fd", + "mirror_pass1": { + "vmin": 0.5415636, + "status": "passed", + "vout_test": 1.17 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.6416 + }, + "_frozen_from": { + "schematic": { + "err": -0.0066865, + "vmin": 0.5415636 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.08 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 12.1, + "schematic_measures": { + "iout_t": 1.986627e-05, + "err": -0.0066865, + "vmin": 0.5415636, + "dev_at_vdd": 0.006682356, + "gout_t": 2.10599e-10, + "rout_t": 4748360000.0, + "vout_test": 1.17, + "rout_nom": 4748360000.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/sky130/sW2_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW2_sL1.5/specs.json new file mode 100644 index 00000000..8e5e9d67 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW2_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.6416 + }, + "_frozen_from": { + "schematic": { + "err": -0.0066865, + "vmin": 0.5415636 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.08 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/sky130/sW2_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW2_sL1.5/target.spice new file mode 100644 index 00000000..cdeca0ed --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW2_sL1.5/target.spice @@ -0,0 +1,6 @@ +.subckt C14_sky130_sW2_sL1.5 VSS IIN1 IOUT1 IREF1 +XM1 IIN1 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=4 l=0.9 nf=8 +XM2 net11 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=4 l=0.9 nf=8 +XM3 IREF1 net11 VSS VSS sky130_fd_pr__nfet_01v8 w=2 l=0.9 nf=4 +XM4 IOUT1 IREF1 net11 VSS sky130_fd_pr__nfet_01v8 w=4 l=0.9 nf=8 +.ends C14_sky130_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C14/sky130/sW2_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW2_sL1.5/target_lvs.spice new file mode 100644 index 00000000..0747db32 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW2_sL1.5/target_lvs.spice @@ -0,0 +1,30 @@ +.subckt C14_sky130_sW2_sL1.5 VSS IIN1 IOUT1 IREF1 +XM1_f0 IIN1 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM1_f1 IIN1 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM1_f2 IIN1 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM1_f3 IIN1 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM1_f4 IIN1 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM1_f5 IIN1 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM1_f6 IIN1 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM1_f7 IIN1 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM2_f0 net11 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM2_f1 net11 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM2_f2 net11 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM2_f3 net11 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM2_f4 net11 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM2_f5 net11 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM2_f6 net11 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM2_f7 net11 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM3_f0 IREF1 net11 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM3_f1 IREF1 net11 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM3_f2 IREF1 net11 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM3_f3 IREF1 net11 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM4_f0 IOUT1 IREF1 net11 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM4_f1 IOUT1 IREF1 net11 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM4_f2 IOUT1 IREF1 net11 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM4_f3 IOUT1 IREF1 net11 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM4_f4 IOUT1 IREF1 net11 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM4_f5 IOUT1 IREF1 net11 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM4_f6 IOUT1 IREF1 net11 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +XM4_f7 IOUT1 IREF1 net11 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.9 +.ends C14_sky130_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C14/sky130/sW2_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW2_sL1.5/testbench.spice new file mode 100644 index 00000000..6050f4d0 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW2_sL1.5/testbench.spice @@ -0,0 +1,26 @@ +X1 VSS IIN1 IOUT1 IREF1 C14_sky130_sW2_sL1.5 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIIN1 VDDB IIN1 2e-05 +IIREF1 VDDB IREF1 5e-06 +.nodeset v(IIN1)=0.54 v(IREF1)=0.54 + +VOUT IOUT1 0 1.8 +.control +dc VOUT 1.8 0 -0.0045 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=1.17 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.03 cross=last +meas dc dev_at_vdd find dev at=1.791 +let gout = deriv(iout) +meas dc gout_t find gout at=1.17 +let rout_v = 1/gout +meas dc rout_t find rout_v at=1.17 +echo vout_test = 1.17 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C14/sky130/sW2_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW2_sL1/case.json new file mode 100644 index 00000000..416afb9d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW2_sL1/case.json @@ -0,0 +1,152 @@ +{ + "case_id": "C14_sky130_sW2_sL1", + "circuit_id": "C14", + "pdk": "sky130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "dut_name": "C14_sky130_sW2_sL1", + "ports": [ + "VSS", + "IIN1", + "IOUT1", + "IREF1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.6, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 0.6, + "nf": 8 + }, + "M3": { + "w": 2.0, + "l": 0.6, + "nf": 4 + }, + "M4": { + "w": 4.0, + "l": 0.6, + "nf": 8 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF1": { + "i": 5e-06, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 1.1700000000000002, + "tol": 0.03, + "vout_test": 1.16 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 1.0, + "l0": 0.6, + "nf0": 2, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "e689edfc71f66240", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "ideal_current_source", + "port": "IREF1", + "current_A": 5e-06, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/sky130/sW2_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW2_sL1/manifest.json new file mode 100644 index 00000000..3bb33c28 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW2_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "eabfa30223e9a38dd6984be536e71852ae3b7987e7ae66b233297ddeed89141b", + "qualification.json": "40fc0147b012385cf1c8a51e1f805dd3b7d29b6534450501ad1bb3326e8ad769", + "specs.json": "b9a4990bf4c9e7063a4de1c01b1c88ae5dd2139d548c70804019243c21fb6fd3", + "target.spice": "37fe1572078b2174b11deab25575721eaf4fe46285cf746d444d26a3cdf97cae", + "target_lvs.spice": "d0620c590b17d8d8521e90cc6e57e8e091e441f14df48e7f7d9b18f6f471b865", + "testbench.spice": "27fc429bc4ebfba0d6bf402b99610f393dc2b09d7665786547a5ce0dc27844ad" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/sky130/sW2_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW2_sL1/qualification.json new file mode 100644 index 00000000..3ebdedd8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW2_sL1/qualification.json @@ -0,0 +1,115 @@ +{ + "case_id": "C14_sky130_sW2_sL1", + "circuit_id": "C14", + "pdk": "sky130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 1.0, + "l0": 0.6, + "nf0": 2, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "e689edfc71f66240", + "mirror_pass1": { + "vmin": 0.523346, + "status": "passed", + "vout_test": 1.16 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.6233 + }, + "_frozen_from": { + "schematic": { + "err": -0.0059585, + "vmin": 0.523346 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.08 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 12.1, + "schematic_measures": { + "iout_t": 1.988083e-05, + "err": -0.0059585, + "vmin": 0.523346, + "dev_at_vdd": 0.005955145, + "gout_t": 1.600138e-10, + "rout_t": 6249602000.0, + "vout_test": 1.16, + "rout_nom": 6249602000.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/sky130/sW2_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW2_sL1/specs.json new file mode 100644 index 00000000..1b52d7a0 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW2_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.6233 + }, + "_frozen_from": { + "schematic": { + "err": -0.0059585, + "vmin": 0.523346 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.08 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/sky130/sW2_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW2_sL1/target.spice new file mode 100644 index 00000000..aa1b8f1f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW2_sL1/target.spice @@ -0,0 +1,6 @@ +.subckt C14_sky130_sW2_sL1 VSS IIN1 IOUT1 IREF1 +XM1 IIN1 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=4 l=0.6 nf=8 +XM2 net11 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=4 l=0.6 nf=8 +XM3 IREF1 net11 VSS VSS sky130_fd_pr__nfet_01v8 w=2 l=0.6 nf=4 +XM4 IOUT1 IREF1 net11 VSS sky130_fd_pr__nfet_01v8 w=4 l=0.6 nf=8 +.ends C14_sky130_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C14/sky130/sW2_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW2_sL1/target_lvs.spice new file mode 100644 index 00000000..cd767956 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW2_sL1/target_lvs.spice @@ -0,0 +1,30 @@ +.subckt C14_sky130_sW2_sL1 VSS IIN1 IOUT1 IREF1 +XM1_f0 IIN1 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f1 IIN1 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f2 IIN1 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f3 IIN1 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f4 IIN1 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f5 IIN1 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f6 IIN1 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f7 IIN1 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f0 net11 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f1 net11 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f2 net11 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f3 net11 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f4 net11 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f5 net11 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f6 net11 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f7 net11 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f0 IREF1 net11 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f1 IREF1 net11 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f2 IREF1 net11 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f3 IREF1 net11 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f0 IOUT1 IREF1 net11 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f1 IOUT1 IREF1 net11 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f2 IOUT1 IREF1 net11 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f3 IOUT1 IREF1 net11 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f4 IOUT1 IREF1 net11 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f5 IOUT1 IREF1 net11 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f6 IOUT1 IREF1 net11 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f7 IOUT1 IREF1 net11 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +.ends C14_sky130_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C14/sky130/sW2_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW2_sL1/testbench.spice new file mode 100644 index 00000000..a09cedf3 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW2_sL1/testbench.spice @@ -0,0 +1,26 @@ +X1 VSS IIN1 IOUT1 IREF1 C14_sky130_sW2_sL1 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIIN1 VDDB IIN1 2e-05 +IIREF1 VDDB IREF1 5e-06 +.nodeset v(IIN1)=0.54 v(IREF1)=0.54 + +VOUT IOUT1 0 1.8 +.control +dc VOUT 1.8 0 -0.0045 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=1.16 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.03 cross=last +meas dc dev_at_vdd find dev at=1.791 +let gout = deriv(iout) +meas dc gout_t find gout at=1.16 +let rout_v = 1/gout +meas dc rout_t find rout_v at=1.16 +echo vout_test = 1.16 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C14/sky130/sW2_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW2_sL2/case.json new file mode 100644 index 00000000..f61335ac --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW2_sL2/case.json @@ -0,0 +1,152 @@ +{ + "case_id": "C14_sky130_sW2_sL2", + "circuit_id": "C14", + "pdk": "sky130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "dut_name": "C14_sky130_sW2_sL2", + "ports": [ + "VSS", + "IIN1", + "IOUT1", + "IREF1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 1.2, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 1.2, + "nf": 8 + }, + "M3": { + "w": 2.0, + "l": 1.2, + "nf": 4 + }, + "M4": { + "w": 4.0, + "l": 1.2, + "nf": 8 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF1": { + "i": 5e-06, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 1.1700000000000002, + "tol": 0.03, + "vout_test": 1.17 + }, + "category": "mirror", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.2, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.2, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 1.0, + "l0": 0.6, + "nf0": 2, + "uw0": 0.5, + "w": 2.0, + "l": 1.2, + "nf": 4, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.2, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "6753c26801898c56", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IIN1", + "current_A": 2e-05, + "from": "VDD" + }, + { + "kind": "ideal_current_source", + "port": "IREF1", + "current_A": 5e-06, + "from": "VDD" + }, + { + "kind": "reference_current_value", + "value_A": 2e-05 + }, + { + "kind": "testbench_element", + "what": "ideal reference current source(s)" + }, + { + "kind": "testbench_element", + "what": "ideal output voltage source (swept)" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/sky130/sW2_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW2_sL2/manifest.json new file mode 100644 index 00000000..528339e0 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW2_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "a9ff060c3656310149f19ad754e74ae548031b28bbaf4cd85e29d244548ed902", + "qualification.json": "1908fe59798536b94733161ecb4dd7002f04722177bfc9773c20f029074861b6", + "specs.json": "94eda37e225b901be9010c54d2515581ce42897dc7aa5c2e2782389cdf8351ce", + "target.spice": "0c879cd89afaf9a84b058974fe3a40a1f4cfa7f6b47a7d55f927ade649ecfa71", + "target_lvs.spice": "665dd093f0e45d2f56d437bb5cfe6deb23d8b767e14d56669175bfa287990f2f", + "testbench.spice": "c1426bd82f74cfcf2a1b097d30ae6e6bd8ddc9ebf0f34a291328f74a4458df85" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/sky130/sW2_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW2_sL2/qualification.json new file mode 100644 index 00000000..3b489978 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW2_sL2/qualification.json @@ -0,0 +1,115 @@ +{ + "case_id": "C14_sky130_sW2_sL2", + "circuit_id": "C14", + "pdk": "sky130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.2, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.2, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 1.0, + "l0": 0.6, + "nf0": 2, + "uw0": 0.5, + "w": 2.0, + "l": 1.2, + "nf": 4, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.2, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "6753c26801898c56", + "mirror_pass1": { + "vmin": 0.5463274, + "status": "passed", + "vout_test": 1.17 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.6463 + }, + "_frozen_from": { + "schematic": { + "err": -0.0069555, + "vmin": 0.5463274 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.08 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 12.1, + "schematic_measures": { + "iout_t": 1.986089e-05, + "err": -0.0069555, + "vmin": 0.5463274, + "dev_at_vdd": 0.006950881, + "gout_t": 2.502328e-10, + "rout_t": 3996279000.0, + "vout_test": 1.17, + "rout_nom": 3996279000.0, + "ok_at_vdd": 1.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/sky130/sW2_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW2_sL2/specs.json new file mode 100644 index 00000000..9cbd723e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW2_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.6463 + }, + "_frozen_from": { + "schematic": { + "err": -0.0069555, + "vmin": 0.5463274 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.08 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C14/sky130/sW2_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW2_sL2/target.spice new file mode 100644 index 00000000..5b72fbc4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW2_sL2/target.spice @@ -0,0 +1,6 @@ +.subckt C14_sky130_sW2_sL2 VSS IIN1 IOUT1 IREF1 +XM1 IIN1 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=4 l=1.2 nf=8 +XM2 net11 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=4 l=1.2 nf=8 +XM3 IREF1 net11 VSS VSS sky130_fd_pr__nfet_01v8 w=2 l=1.2 nf=4 +XM4 IOUT1 IREF1 net11 VSS sky130_fd_pr__nfet_01v8 w=4 l=1.2 nf=8 +.ends C14_sky130_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C14/sky130/sW2_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW2_sL2/target_lvs.spice new file mode 100644 index 00000000..0669ad6d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW2_sL2/target_lvs.spice @@ -0,0 +1,30 @@ +.subckt C14_sky130_sW2_sL2 VSS IIN1 IOUT1 IREF1 +XM1_f0 IIN1 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM1_f1 IIN1 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM1_f2 IIN1 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM1_f3 IIN1 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM1_f4 IIN1 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM1_f5 IIN1 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM1_f6 IIN1 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM1_f7 IIN1 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM2_f0 net11 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM2_f1 net11 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM2_f2 net11 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM2_f3 net11 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM2_f4 net11 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM2_f5 net11 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM2_f6 net11 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM2_f7 net11 IIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM3_f0 IREF1 net11 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM3_f1 IREF1 net11 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM3_f2 IREF1 net11 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM3_f3 IREF1 net11 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM4_f0 IOUT1 IREF1 net11 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM4_f1 IOUT1 IREF1 net11 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM4_f2 IOUT1 IREF1 net11 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM4_f3 IOUT1 IREF1 net11 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM4_f4 IOUT1 IREF1 net11 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM4_f5 IOUT1 IREF1 net11 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM4_f6 IOUT1 IREF1 net11 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +XM4_f7 IOUT1 IREF1 net11 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=1.2 +.ends C14_sky130_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C14/sky130/sW2_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW2_sL2/testbench.spice new file mode 100644 index 00000000..2afd9922 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C14/sky130/sW2_sL2/testbench.spice @@ -0,0 +1,26 @@ +X1 VSS IIN1 IOUT1 IREF1 C14_sky130_sW2_sL2 +.include DUT_INCLUDE_PATH +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIIN1 VDDB IIN1 2e-05 +IIREF1 VDDB IREF1 5e-06 +.nodeset v(IIN1)=0.54 v(IREF1)=0.54 + +VOUT IOUT1 0 1.8 +.control +dc VOUT 1.8 0 -0.0045 +let iout = -i(VOUT) +let dev = abs(iout - 2e-05)/2e-05 +meas dc iout_t find iout at=1.17 +let err = (iout_t - 2e-05)/2e-05 +print err +meas dc vmin find v(IOUT1) when dev=0.03 cross=last +meas dc dev_at_vdd find dev at=1.791 +let gout = deriv(iout) +meas dc gout_t find gout at=1.17 +let rout_v = 1/gout +meas dc rout_t find rout_v at=1.17 +echo vout_test = 1.17 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C15/gf180/sW0.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW0.5_sL1.5/case.json new file mode 100644 index 00000000..d9e8f671 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW0.5_sL1.5/case.json @@ -0,0 +1,77 @@ +{ + "case_id": "C15_gf180_sW0.5_sL1.5", + "circuit_id": "C15", + "pdk": "gf180", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "dut_name": "C15_gf180_sW0.5_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1" + ], + "sizing": { + "M1": { + "w": 1.0, + "l": 0.84, + "nf": 2 + }, + "R1": { + "r": 40000.0, + "body": "VSS", + "w": 1.0, + "l": 60.0 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": {}, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.84, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "e5c92a4c6f49b5ae", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "R1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/gf180/sW0.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW0.5_sL1.5/manifest.json new file mode 100644 index 00000000..db629019 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW0.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "3107cb1c541d7a7f16d562ac68e0931f67417b9376d228494bb71e1c0b17f1ab", + "qualification.json": "d95a55cadeb5a54d7a5fec762b14fa18f35a46d932ffd5bb0152a825c9f6636f", + "specs.json": "9457e8d8a8a246f367401c55410250aa8159114718db706b99703cd6ee8e9455", + "target.spice": "d21ca5b1f0855c571eae600c2574fbbcea2f51f6f9742592169d80f86a9a5f38", + "target_lvs.spice": "9200a83e97c3eecb1642b57a64e43cacb84f7cd1e6f0db93ca80fc50204b5db0", + "testbench.spice": "2abe6a4a330a76f79eb61ec62793b42328b7a41c10d0f42ee713e6c62de4d914" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/gf180/sW0.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW0.5_sL1.5/qualification.json new file mode 100644 index 00000000..30ad0784 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW0.5_sL1.5/qualification.json @@ -0,0 +1,73 @@ +{ + "case_id": "C15_gf180_sW0.5_sL1.5", + "circuit_id": "C15", + "pdk": "gf180", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "single", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.84, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "e5c92a4c6f49b5ae", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "gain_lf=7.201 below floor 8" + ], + "spec": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 42490000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 7.201418, + "f3db": 70820190.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vout0": 1.753914, + "vin0": 1.753914, + "idd": 6.948485e-05, + "gain_lf": 7.201418, + "f3db": 70820190.0, + "ugf": 146479100.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/gf180/sW0.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW0.5_sL1.5/specs.json new file mode 100644 index 00000000..45e9348b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW0.5_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 42490000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 7.201418, + "f3db": 70820190.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/gf180/sW0.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW0.5_sL1.5/target.spice new file mode 100644 index 00000000..022a751d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW0.5_sL1.5/target.spice @@ -0,0 +1,4 @@ +.subckt C15_gf180_sW0.5_sL1.5 VDD VSS VIN1 VOUT1 +MM1 VOUT1 VIN1 VSS VSS nfet_03v3 w=1u l=0.84u nf=2 m=1 +XRR1 VDD VOUT1 VSS ppolyf_u r_width=1u r_length=60u +.ends C15_gf180_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C15/gf180/sW0.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW0.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..67404c60 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW0.5_sL1.5/target_lvs.spice @@ -0,0 +1,5 @@ +.subckt C15_gf180_sW0.5_sL1.5 VDD VSS VIN1 VOUT1 +MM1_f0 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM1_f1 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +RR1 VDD VOUT1 VSS ppolyf_u L=60u W=1u +.ends C15_gf180_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C15/gf180/sW0.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW0.5_sL1.5/testbench.spice new file mode 100644 index 00000000..5c86010a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW0.5_sL1.5/testbench.spice @@ -0,0 +1,26 @@ +X1 VDD VSS VIN1 VOUT1 C15_gf180_sW0.5_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 + +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C15/gf180/sW0.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW0.5_sL1/case.json new file mode 100644 index 00000000..79a2b4a7 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW0.5_sL1/case.json @@ -0,0 +1,77 @@ +{ + "case_id": "C15_gf180_sW0.5_sL1", + "circuit_id": "C15", + "pdk": "gf180", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "dut_name": "C15_gf180_sW0.5_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1" + ], + "sizing": { + "M1": { + "w": 1.0, + "l": 0.56, + "nf": 2 + }, + "R1": { + "r": 40000.0, + "body": "VSS", + "w": 1.0, + "l": 60.0 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": {}, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.56, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "3ea6591d35394b90", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "R1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/gf180/sW0.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW0.5_sL1/manifest.json new file mode 100644 index 00000000..dfa2bc12 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW0.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "313def0cb3903f4617d0adfc5646eaacf532b207be4239bbda4c9cfd71b1127f", + "qualification.json": "69ea7f757d68e68994e4ef87c81190d41c5a57cb5678adaf9301ee2c696cf3cc", + "specs.json": "be432a83e4d48833c7759a6e7a766c1b65ea9cfb6c92443c856005d9c59f4f08", + "target.spice": "6dac371f5a9df7f0a4c17bfd3b10e0e242318f5deadaa2a5fe080cac5be4aa97", + "target_lvs.spice": "0dc8686b283baf65b3dca205416b00eeca1709b7f16031c69e958b69b1917b6e", + "testbench.spice": "b613854fff8afcd527da10ede4176138ceb2a7d2191f620961a9a84a1498a994" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/gf180/sW0.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW0.5_sL1/qualification.json new file mode 100644 index 00000000..e2ba93a0 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW0.5_sL1/qualification.json @@ -0,0 +1,71 @@ +{ + "case_id": "C15_gf180_sW0.5_sL1", + "circuit_id": "C15", + "pdk": "gf180", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "single", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.56, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "3ea6591d35394b90", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 43520000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 8.859438, + "f3db": 72536000.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vout0": 1.596329, + "vin0": 1.596329, + "idd": 7.656709e-05, + "gain_lf": 8.859438, + "f3db": 72536000.0, + "ugf": 188295400.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/gf180/sW0.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW0.5_sL1/specs.json new file mode 100644 index 00000000..9d8b21f4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW0.5_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 43520000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 8.859438, + "f3db": 72536000.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/gf180/sW0.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW0.5_sL1/target.spice new file mode 100644 index 00000000..9c5626f4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW0.5_sL1/target.spice @@ -0,0 +1,4 @@ +.subckt C15_gf180_sW0.5_sL1 VDD VSS VIN1 VOUT1 +MM1 VOUT1 VIN1 VSS VSS nfet_03v3 w=1u l=0.56u nf=2 m=1 +XRR1 VDD VOUT1 VSS ppolyf_u r_width=1u r_length=60u +.ends C15_gf180_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C15/gf180/sW0.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW0.5_sL1/target_lvs.spice new file mode 100644 index 00000000..91744c74 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW0.5_sL1/target_lvs.spice @@ -0,0 +1,5 @@ +.subckt C15_gf180_sW0.5_sL1 VDD VSS VIN1 VOUT1 +MM1_f0 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM1_f1 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +RR1 VDD VOUT1 VSS ppolyf_u L=60u W=1u +.ends C15_gf180_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C15/gf180/sW0.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW0.5_sL1/testbench.spice new file mode 100644 index 00000000..44dd2445 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW0.5_sL1/testbench.spice @@ -0,0 +1,26 @@ +X1 VDD VSS VIN1 VOUT1 C15_gf180_sW0.5_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 + +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C15/gf180/sW0.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW0.5_sL2/case.json new file mode 100644 index 00000000..0ce1006e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW0.5_sL2/case.json @@ -0,0 +1,77 @@ +{ + "case_id": "C15_gf180_sW0.5_sL2", + "circuit_id": "C15", + "pdk": "gf180", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "dut_name": "C15_gf180_sW0.5_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1" + ], + "sizing": { + "M1": { + "w": 1.0, + "l": 1.12, + "nf": 2 + }, + "R1": { + "r": 40000.0, + "body": "VSS", + "w": 1.0, + "l": 60.0 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": {}, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.12, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "0e75830eef7fa606", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "R1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/gf180/sW0.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW0.5_sL2/manifest.json new file mode 100644 index 00000000..d5894bec --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW0.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "57f242d92ab0e9c751949f39a14cf796736434c51c9ff19f6cfe5fb2c05115f4", + "qualification.json": "c17c8cb552891cdb41817c7e5d6ba05339a2d2350a0128d6ac48e982ce0841b1", + "specs.json": "16e978277d04dcd7337637b9f0c47a65f402f941741dd12dfb233b36f22dcdbb", + "target.spice": "4a585d8000b5b0958266468c413050acb043e481891c029de58e550d7d3ef340", + "target_lvs.spice": "50356ebbd769293cbfc0c13614dca7201cb8a29cb01e8770ee34021cb92f0af8", + "testbench.spice": "2a53b1e920b87a5c02fe1fcb8b284ba8d248d7ad9efcfc25cbcef32def310b2e" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/gf180/sW0.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW0.5_sL2/qualification.json new file mode 100644 index 00000000..5f2b1afc --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW0.5_sL2/qualification.json @@ -0,0 +1,73 @@ +{ + "case_id": "C15_gf180_sW0.5_sL2", + "circuit_id": "C15", + "pdk": "gf180", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "single", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.12, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "0e75830eef7fa606", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "gain_lf=5.973 below floor 8" + ], + "spec": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 42110000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 5.973049, + "f3db": 70183790.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vout0": 1.868614, + "vin0": 1.868614, + "idd": 6.432993e-05, + "gain_lf": 5.973049, + "f3db": 70183790.0, + "ugf": 121057600.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/gf180/sW0.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW0.5_sL2/specs.json new file mode 100644 index 00000000..d673d58f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW0.5_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 42110000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 5.973049, + "f3db": 70183790.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/gf180/sW0.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW0.5_sL2/target.spice new file mode 100644 index 00000000..e89d153d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW0.5_sL2/target.spice @@ -0,0 +1,4 @@ +.subckt C15_gf180_sW0.5_sL2 VDD VSS VIN1 VOUT1 +MM1 VOUT1 VIN1 VSS VSS nfet_03v3 w=1u l=1.12u nf=2 m=1 +XRR1 VDD VOUT1 VSS ppolyf_u r_width=1u r_length=60u +.ends C15_gf180_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C15/gf180/sW0.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW0.5_sL2/target_lvs.spice new file mode 100644 index 00000000..964e1a67 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW0.5_sL2/target_lvs.spice @@ -0,0 +1,5 @@ +.subckt C15_gf180_sW0.5_sL2 VDD VSS VIN1 VOUT1 +MM1_f0 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM1_f1 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +RR1 VDD VOUT1 VSS ppolyf_u L=60u W=1u +.ends C15_gf180_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C15/gf180/sW0.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW0.5_sL2/testbench.spice new file mode 100644 index 00000000..db0811fa --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW0.5_sL2/testbench.spice @@ -0,0 +1,26 @@ +X1 VDD VSS VIN1 VOUT1 C15_gf180_sW0.5_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 + +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1.5_sL1.5/case.json new file mode 100644 index 00000000..35414ba7 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1.5_sL1.5/case.json @@ -0,0 +1,77 @@ +{ + "case_id": "C15_gf180_sW1.5_sL1.5", + "circuit_id": "C15", + "pdk": "gf180", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "dut_name": "C15_gf180_sW1.5_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1" + ], + "sizing": { + "M1": { + "w": 3.0, + "l": 0.84, + "nf": 6 + }, + "R1": { + "r": 40000.0, + "body": "VSS", + "w": 1.0, + "l": 60.0 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": {}, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.84, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "4c8495fad8681d30", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "R1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1.5_sL1.5/manifest.json new file mode 100644 index 00000000..e8b161e5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "c46ad0f11f2ca67ae2c337d931c399971ed4df42b209567c5b9f7e88f751e30c", + "qualification.json": "de77446c62d0bce6890701bc82ead3332f56b7cfa2b6989925d5687f360ece9b", + "specs.json": "eb264340679d25090a12e5070e1b05dc24d0c3aef5d3c5bd70b7d56b860c1604", + "target.spice": "d4800579a1e9a8b9e2dae26bb36dac99e3a108196b0c310bd3d86c20cc274311", + "target_lvs.spice": "a6696019897bc06c130d541337d23f415564e33b67bb44b988521ca6323d3a55", + "testbench.spice": "505f5bad41cb2ccf8343893488de7c828e9db7cdd27f4b3443e1b31f340d8ca1" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1.5_sL1.5/qualification.json new file mode 100644 index 00000000..b5def9e9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1.5_sL1.5/qualification.json @@ -0,0 +1,71 @@ +{ + "case_id": "C15_gf180_sW1.5_sL1.5", + "circuit_id": "C15", + "pdk": "gf180", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "single", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.84, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "4c8495fad8681d30", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 10.89 + }, + "f3db": { + "min": 42350000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 13.8931, + "f3db": 70579120.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vout0": 1.328069, + "vin0": 1.328069, + "idd": 8.862334e-05, + "gain_lf": 13.8931, + "f3db": 70579120.0, + "ugf": 343586600.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1.5_sL1.5/specs.json new file mode 100644 index 00000000..299a4838 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1.5_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 10.89 + }, + "f3db": { + "min": 42350000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 13.8931, + "f3db": 70579120.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1.5_sL1.5/target.spice new file mode 100644 index 00000000..65e0d574 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1.5_sL1.5/target.spice @@ -0,0 +1,4 @@ +.subckt C15_gf180_sW1.5_sL1.5 VDD VSS VIN1 VOUT1 +MM1 VOUT1 VIN1 VSS VSS nfet_03v3 w=3u l=0.84u nf=6 m=1 +XRR1 VDD VOUT1 VSS ppolyf_u r_width=1u r_length=60u +.ends C15_gf180_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..47f86003 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1.5_sL1.5/target_lvs.spice @@ -0,0 +1,9 @@ +.subckt C15_gf180_sW1.5_sL1.5 VDD VSS VIN1 VOUT1 +MM1_f0 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM1_f1 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM1_f2 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM1_f3 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM1_f4 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM1_f5 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +RR1 VDD VOUT1 VSS ppolyf_u L=60u W=1u +.ends C15_gf180_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1.5_sL1.5/testbench.spice new file mode 100644 index 00000000..1db214da --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1.5_sL1.5/testbench.spice @@ -0,0 +1,26 @@ +X1 VDD VSS VIN1 VOUT1 C15_gf180_sW1.5_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 + +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1.5_sL1/case.json new file mode 100644 index 00000000..11b9a2ad --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1.5_sL1/case.json @@ -0,0 +1,77 @@ +{ + "case_id": "C15_gf180_sW1.5_sL1", + "circuit_id": "C15", + "pdk": "gf180", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "dut_name": "C15_gf180_sW1.5_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1" + ], + "sizing": { + "M1": { + "w": 3.0, + "l": 0.56, + "nf": 6 + }, + "R1": { + "r": 40000.0, + "body": "VSS", + "w": 1.0, + "l": 60.0 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": {}, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.56, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "86a486d0e4f5032f", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "R1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1.5_sL1/manifest.json new file mode 100644 index 00000000..ffe2c1b3 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "55e9e27352670c19afbcea38566261f026c569b3baa254bb1c645ff2771e23f3", + "qualification.json": "8f82f0dc64c48f55f59522221863d86cf3d460b83b4322d0d6d21eec3a191ebb", + "specs.json": "54abddd6cd2a4f1f250614d02d7133b40b3e4e2b54476f0fd20488eb91141011", + "target.spice": "1f7eb6186e9cab06246da924f7107ad3ec6ee5699b757679574fc4934d522e65", + "target_lvs.spice": "beb213052eab3b5ae2e760e7440a6887ccc68fdb0adee7b1b9cf570cf3d85d16", + "testbench.spice": "a7ea0b7dae557980cc9c547be781ff875e7babeb10c48541b5c376a4e7b44193" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1.5_sL1/qualification.json new file mode 100644 index 00000000..e54093f2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1.5_sL1/qualification.json @@ -0,0 +1,71 @@ +{ + "case_id": "C15_gf180_sW1.5_sL1", + "circuit_id": "C15", + "pdk": "gf180", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "single", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.56, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "86a486d0e4f5032f", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 12.52 + }, + "f3db": { + "min": 43980000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 15.51781, + "f3db": 73303320.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vout0": 1.211577, + "vin0": 1.211577, + "idd": 9.385875e-05, + "gain_lf": 15.51781, + "f3db": 73303320.0, + "ugf": 433003800.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1.5_sL1/specs.json new file mode 100644 index 00000000..32e04597 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1.5_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 12.52 + }, + "f3db": { + "min": 43980000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 15.51781, + "f3db": 73303320.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1.5_sL1/target.spice new file mode 100644 index 00000000..660bd734 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1.5_sL1/target.spice @@ -0,0 +1,4 @@ +.subckt C15_gf180_sW1.5_sL1 VDD VSS VIN1 VOUT1 +MM1 VOUT1 VIN1 VSS VSS nfet_03v3 w=3u l=0.56u nf=6 m=1 +XRR1 VDD VOUT1 VSS ppolyf_u r_width=1u r_length=60u +.ends C15_gf180_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1.5_sL1/target_lvs.spice new file mode 100644 index 00000000..90b59479 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1.5_sL1/target_lvs.spice @@ -0,0 +1,9 @@ +.subckt C15_gf180_sW1.5_sL1 VDD VSS VIN1 VOUT1 +MM1_f0 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM1_f1 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM1_f2 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM1_f3 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM1_f4 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM1_f5 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +RR1 VDD VOUT1 VSS ppolyf_u L=60u W=1u +.ends C15_gf180_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1.5_sL1/testbench.spice new file mode 100644 index 00000000..5f8f8945 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1.5_sL1/testbench.spice @@ -0,0 +1,26 @@ +X1 VDD VSS VIN1 VOUT1 C15_gf180_sW1.5_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 + +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1.5_sL2/case.json new file mode 100644 index 00000000..e206de15 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1.5_sL2/case.json @@ -0,0 +1,77 @@ +{ + "case_id": "C15_gf180_sW1.5_sL2", + "circuit_id": "C15", + "pdk": "gf180", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "dut_name": "C15_gf180_sW1.5_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1" + ], + "sizing": { + "M1": { + "w": 3.0, + "l": 1.12, + "nf": 6 + }, + "R1": { + "r": 40000.0, + "body": "VSS", + "w": 1.0, + "l": 60.0 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": {}, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.12, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "01ed2036739dac11", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "R1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1.5_sL2/manifest.json new file mode 100644 index 00000000..4ea0f925 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "5c86c78df66b5d670e0a6e5ac7c05c3037fb0da8522932d33a1e62e34370605d", + "qualification.json": "cdabacdf29977284d169a656b713fb67784c66386039b7cd02eb83c2c9492637", + "specs.json": "aee13cfa659e34c0c58192e0566076d46ada26e4ae9eed1e710963a90e5c1f2d", + "target.spice": "a510390021c31233273a99e971dda7895f45bd8c227f649767382438cd3d3d95", + "target_lvs.spice": "14372db62c7542eae059c34e1e46f018863084e1ea5443ca49243ad333630dd0", + "testbench.spice": "27ccbeee786949f9e429af451cc709f31cd82070b7056b417975439449ee0902" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1.5_sL2/qualification.json new file mode 100644 index 00000000..70bcc86e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1.5_sL2/qualification.json @@ -0,0 +1,71 @@ +{ + "case_id": "C15_gf180_sW1.5_sL2", + "circuit_id": "C15", + "pdk": "gf180", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "single", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.12, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "01ed2036739dac11", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 9.672 + }, + "f3db": { + "min": 41740000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 12.67212, + "f3db": 69571380.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vout0": 1.418151, + "vin0": 1.418151, + "idd": 8.457483e-05, + "gain_lf": 12.67212, + "f3db": 69571380.0, + "ugf": 292319300.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1.5_sL2/specs.json new file mode 100644 index 00000000..233c2b11 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1.5_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 9.672 + }, + "f3db": { + "min": 41740000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 12.67212, + "f3db": 69571380.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1.5_sL2/target.spice new file mode 100644 index 00000000..0c208da3 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1.5_sL2/target.spice @@ -0,0 +1,4 @@ +.subckt C15_gf180_sW1.5_sL2 VDD VSS VIN1 VOUT1 +MM1 VOUT1 VIN1 VSS VSS nfet_03v3 w=3u l=1.12u nf=6 m=1 +XRR1 VDD VOUT1 VSS ppolyf_u r_width=1u r_length=60u +.ends C15_gf180_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1.5_sL2/target_lvs.spice new file mode 100644 index 00000000..9fb8d159 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1.5_sL2/target_lvs.spice @@ -0,0 +1,9 @@ +.subckt C15_gf180_sW1.5_sL2 VDD VSS VIN1 VOUT1 +MM1_f0 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM1_f1 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM1_f2 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM1_f3 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM1_f4 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM1_f5 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +RR1 VDD VOUT1 VSS ppolyf_u L=60u W=1u +.ends C15_gf180_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1.5_sL2/testbench.spice new file mode 100644 index 00000000..ba68648b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1.5_sL2/testbench.spice @@ -0,0 +1,26 @@ +X1 VDD VSS VIN1 VOUT1 C15_gf180_sW1.5_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 + +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1_sL1.5/case.json new file mode 100644 index 00000000..66401d4e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1_sL1.5/case.json @@ -0,0 +1,77 @@ +{ + "case_id": "C15_gf180_sW1_sL1.5", + "circuit_id": "C15", + "pdk": "gf180", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "dut_name": "C15_gf180_sW1_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.84, + "nf": 4 + }, + "R1": { + "r": 40000.0, + "body": "VSS", + "w": 1.0, + "l": 60.0 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": {}, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "ce02ba3fd6fac776", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "R1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1_sL1.5/manifest.json new file mode 100644 index 00000000..865a8c5b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "1ac1fda88cc0547e373fd4a72667cc1f03adc2df12122a441b95e7fa92e09325", + "qualification.json": "2a60741b173f9b834760cdc2c1dd0cf563bf3418a1fb7284fe23ba9b35b0b30f", + "specs.json": "4fbf02cbac5fd5ee909594917eb5c97abd60fda4a3c14066268b7f55862bf19b", + "target.spice": "59335d209cff532e391257310fae508b70f347d0e7d9dedca7ea33e6c6538301", + "target_lvs.spice": "c6472224267e021557a1641e50375c66628e167fafa8acfba96e5ec5dcc8d10a", + "testbench.spice": "f564e852f65aeb92e4b8ad2170fd0d3aa5c87ebdea21330e7bb1d25c52c0f625" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1_sL1.5/qualification.json new file mode 100644 index 00000000..08bc508c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1_sL1.5/qualification.json @@ -0,0 +1,71 @@ +{ + "case_id": "C15_gf180_sW1_sL1.5", + "circuit_id": "C15", + "pdk": "gf180", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "single", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "ce02ba3fd6fac776", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 8.539 + }, + "f3db": { + "min": 42510000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 11.53859, + "f3db": 70852030.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vout0": 1.466917, + "vin0": 1.466917, + "idd": 8.238316e-05, + "gain_lf": 11.53859, + "f3db": 70852030.0, + "ugf": 258862800.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1_sL1.5/specs.json new file mode 100644 index 00000000..11565778 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 8.539 + }, + "f3db": { + "min": 42510000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 11.53859, + "f3db": 70852030.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1_sL1.5/target.spice new file mode 100644 index 00000000..3be82ce6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1_sL1.5/target.spice @@ -0,0 +1,4 @@ +.subckt C15_gf180_sW1_sL1.5 VDD VSS VIN1 VOUT1 +MM1 VOUT1 VIN1 VSS VSS nfet_03v3 w=2u l=0.84u nf=4 m=1 +XRR1 VDD VOUT1 VSS ppolyf_u r_width=1u r_length=60u +.ends C15_gf180_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1_sL1.5/target_lvs.spice new file mode 100644 index 00000000..14a2b135 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1_sL1.5/target_lvs.spice @@ -0,0 +1,7 @@ +.subckt C15_gf180_sW1_sL1.5 VDD VSS VIN1 VOUT1 +MM1_f0 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM1_f1 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM1_f2 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM1_f3 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +RR1 VDD VOUT1 VSS ppolyf_u L=60u W=1u +.ends C15_gf180_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1_sL1.5/testbench.spice new file mode 100644 index 00000000..485c1d8d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1_sL1.5/testbench.spice @@ -0,0 +1,26 @@ +X1 VDD VSS VIN1 VOUT1 C15_gf180_sW1_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 + +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1_sL1/case.json new file mode 100644 index 00000000..da67c785 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1_sL1/case.json @@ -0,0 +1,77 @@ +{ + "case_id": "C15_gf180_sW1_sL1", + "circuit_id": "C15", + "pdk": "gf180", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "dut_name": "C15_gf180_sW1_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.56, + "nf": 4 + }, + "R1": { + "r": 40000.0, + "body": "VSS", + "w": 1.0, + "l": 60.0 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": {}, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "741d811afb36a449", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "R1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1_sL1/manifest.json new file mode 100644 index 00000000..ea7c83c7 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "8f859b78631709c83474d2f13bd4ca9af95a01bcd2451f7a889e34be6be19f09", + "qualification.json": "b2e3990a66bbf7d20809131a57a123027c63d2281c45d016683dc5af97a19a16", + "specs.json": "aa1063b4b9d093a26e1125534f4fdb0467a0b6b8113feb162fe019672a4859c7", + "target.spice": "05de7b139001242227a2d435913e3afc10d9ebef3acc7c957157f7c3e758b496", + "target_lvs.spice": "886637ad9fcc2ddf0e0cc3510aeb485818c7125a281c9c19f76c74ba4e582ee5", + "testbench.spice": "203b396bb597443b6bf61176b88bd828ccad0af3406d16c19dbead51e51ed7c4" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1_sL1/qualification.json new file mode 100644 index 00000000..c61c223f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1_sL1/qualification.json @@ -0,0 +1,71 @@ +{ + "case_id": "C15_gf180_sW1_sL1", + "circuit_id": "C15", + "pdk": "gf180", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "single", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "741d811afb36a449", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 10.18 + }, + "f3db": { + "min": 43920000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 13.1781, + "f3db": 73207020.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vout0": 1.333873, + "vin0": 1.333873, + "idd": 8.83625e-05, + "gain_lf": 13.1781, + "f3db": 73207020.0, + "ugf": 326850000.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1_sL1/specs.json new file mode 100644 index 00000000..302920f1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 10.18 + }, + "f3db": { + "min": 43920000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 13.1781, + "f3db": 73207020.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1_sL1/target.spice new file mode 100644 index 00000000..fb0a3481 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1_sL1/target.spice @@ -0,0 +1,4 @@ +.subckt C15_gf180_sW1_sL1 VDD VSS VIN1 VOUT1 +MM1 VOUT1 VIN1 VSS VSS nfet_03v3 w=2u l=0.56u nf=4 m=1 +XRR1 VDD VOUT1 VSS ppolyf_u r_width=1u r_length=60u +.ends C15_gf180_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1_sL1/target_lvs.spice new file mode 100644 index 00000000..f5d87590 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1_sL1/target_lvs.spice @@ -0,0 +1,7 @@ +.subckt C15_gf180_sW1_sL1 VDD VSS VIN1 VOUT1 +MM1_f0 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM1_f1 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM1_f2 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM1_f3 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +RR1 VDD VOUT1 VSS ppolyf_u L=60u W=1u +.ends C15_gf180_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1_sL1/testbench.spice new file mode 100644 index 00000000..5af7ddd3 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1_sL1/testbench.spice @@ -0,0 +1,26 @@ +X1 VDD VSS VIN1 VOUT1 C15_gf180_sW1_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 + +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1_sL2/case.json new file mode 100644 index 00000000..65c856b1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1_sL2/case.json @@ -0,0 +1,77 @@ +{ + "case_id": "C15_gf180_sW1_sL2", + "circuit_id": "C15", + "pdk": "gf180", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "dut_name": "C15_gf180_sW1_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 1.12, + "nf": 4 + }, + "R1": { + "r": 40000.0, + "body": "VSS", + "w": 1.0, + "l": 60.0 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": {}, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "1cd57dfdb1973c1c", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "R1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1_sL2/manifest.json new file mode 100644 index 00000000..324d5f76 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "5e692994fe6facc503c868f5a61080516ddabdcd9cdf05a1e22757d2fbb81708", + "qualification.json": "1eeb0de64007b95dcb77c372881cc761e2ccfbfbefb75920ed88e1f4e82f5541", + "specs.json": "e23ce34bc701c0a3da8cd4a18fcfcb0be4724f759e5729748b1563f143280d93", + "target.spice": "0104e8a720f270e7a37e4dc83fc494a16849c83d0a52a3e0bcfe6980005218a2", + "target_lvs.spice": "fd37dec7e370da3f97076aeae9fb03c9cf06fd529030b0368f600d68632e17fc", + "testbench.spice": "ad8431249c55183f43c65c84b5e24cbac5760bf97d46af1b1fb74cd72d368b5a" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1_sL2/qualification.json new file mode 100644 index 00000000..4e2c3a1b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1_sL2/qualification.json @@ -0,0 +1,71 @@ +{ + "case_id": "C15_gf180_sW1_sL2", + "circuit_id": "C15", + "pdk": "gf180", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "single", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "1cd57dfdb1973c1c", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 41990000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 10.31506, + "f3db": 69977800.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vout0": 1.567756, + "vin0": 1.567756, + "idd": 7.785124e-05, + "gain_lf": 10.31506, + "f3db": 69977800.0, + "ugf": 219291100.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1_sL2/specs.json new file mode 100644 index 00000000..2c819c1e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 41990000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 10.31506, + "f3db": 69977800.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1_sL2/target.spice new file mode 100644 index 00000000..02039d78 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1_sL2/target.spice @@ -0,0 +1,4 @@ +.subckt C15_gf180_sW1_sL2 VDD VSS VIN1 VOUT1 +MM1 VOUT1 VIN1 VSS VSS nfet_03v3 w=2u l=1.12u nf=4 m=1 +XRR1 VDD VOUT1 VSS ppolyf_u r_width=1u r_length=60u +.ends C15_gf180_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1_sL2/target_lvs.spice new file mode 100644 index 00000000..7547bb6c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1_sL2/target_lvs.spice @@ -0,0 +1,7 @@ +.subckt C15_gf180_sW1_sL2 VDD VSS VIN1 VOUT1 +MM1_f0 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM1_f1 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM1_f2 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM1_f3 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +RR1 VDD VOUT1 VSS ppolyf_u L=60u W=1u +.ends C15_gf180_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1_sL2/testbench.spice new file mode 100644 index 00000000..1d45a19d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW1_sL2/testbench.spice @@ -0,0 +1,26 @@ +X1 VDD VSS VIN1 VOUT1 C15_gf180_sW1_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 + +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C15/gf180/sW2_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW2_sL1.5/case.json new file mode 100644 index 00000000..36fdf5a4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW2_sL1.5/case.json @@ -0,0 +1,77 @@ +{ + "case_id": "C15_gf180_sW2_sL1.5", + "circuit_id": "C15", + "pdk": "gf180", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "dut_name": "C15_gf180_sW2_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.84, + "nf": 8 + }, + "R1": { + "r": 40000.0, + "body": "VSS", + "w": 1.0, + "l": 60.0 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": {}, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "49b7a00077cfbee6", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "R1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/gf180/sW2_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW2_sL1.5/manifest.json new file mode 100644 index 00000000..3c4f2d87 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW2_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "e801381db2bea5b462eb6324b417cc5330d6ce20f1f792ef79b897c047eb4768", + "qualification.json": "85fbd9dfb88672494cf4aa3526bde0737cc356a461679cffdfe132c977a298e8", + "specs.json": "3c9b88ba36668aebde64ea0e50adce701037a5b6119eaee45b17a2a18d19a831", + "target.spice": "ab5e009be98c2a3e987899fb53f1c3902fd2136d81f200fb4ead00b07737128b", + "target_lvs.spice": "2c4fad83082941b50b7228fad1735e505af269955f3f7c6085b4f62fe1b271b2", + "testbench.spice": "33184bf50154ece547598ce254b292455298e2c6868fb7409392e65b078aa86a" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/gf180/sW2_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW2_sL1.5/qualification.json new file mode 100644 index 00000000..b8148a92 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW2_sL1.5/qualification.json @@ -0,0 +1,71 @@ +{ + "case_id": "C15_gf180_sW2_sL1.5", + "circuit_id": "C15", + "pdk": "gf180", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "single", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "49b7a00077cfbee6", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 12.49 + }, + "f3db": { + "min": 42100000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 15.491, + "f3db": 70173410.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vout0": 1.242207, + "vin0": 1.242207, + "idd": 9.248218e-05, + "gain_lf": 15.491, + "f3db": 70173410.0, + "ugf": 413486600.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/gf180/sW2_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW2_sL1.5/specs.json new file mode 100644 index 00000000..3265fe32 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW2_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 12.49 + }, + "f3db": { + "min": 42100000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 15.491, + "f3db": 70173410.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/gf180/sW2_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW2_sL1.5/target.spice new file mode 100644 index 00000000..2e3cb811 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW2_sL1.5/target.spice @@ -0,0 +1,4 @@ +.subckt C15_gf180_sW2_sL1.5 VDD VSS VIN1 VOUT1 +MM1 VOUT1 VIN1 VSS VSS nfet_03v3 w=4u l=0.84u nf=8 m=1 +XRR1 VDD VOUT1 VSS ppolyf_u r_width=1u r_length=60u +.ends C15_gf180_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C15/gf180/sW2_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW2_sL1.5/target_lvs.spice new file mode 100644 index 00000000..90da0c56 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW2_sL1.5/target_lvs.spice @@ -0,0 +1,11 @@ +.subckt C15_gf180_sW2_sL1.5 VDD VSS VIN1 VOUT1 +MM1_f0 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM1_f1 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM1_f2 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM1_f3 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM1_f4 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM1_f5 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM1_f6 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM1_f7 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +RR1 VDD VOUT1 VSS ppolyf_u L=60u W=1u +.ends C15_gf180_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C15/gf180/sW2_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW2_sL1.5/testbench.spice new file mode 100644 index 00000000..4fec46a9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW2_sL1.5/testbench.spice @@ -0,0 +1,26 @@ +X1 VDD VSS VIN1 VOUT1 C15_gf180_sW2_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 + +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C15/gf180/sW2_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW2_sL1/case.json new file mode 100644 index 00000000..789cc9e5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW2_sL1/case.json @@ -0,0 +1,77 @@ +{ + "case_id": "C15_gf180_sW2_sL1", + "circuit_id": "C15", + "pdk": "gf180", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "dut_name": "C15_gf180_sW2_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "R1": { + "r": 40000.0, + "body": "VSS", + "w": 1.0, + "l": 60.0 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": {}, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "dfff483edf5d728d", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "R1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/gf180/sW2_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW2_sL1/manifest.json new file mode 100644 index 00000000..cc28d08c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW2_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "5bfe6eb4e2ceb3ee7269ad05a825ce85b7dfb3c012bb641d426b25e5119de13c", + "qualification.json": "210d78f54ec26a2a073803eb7f649b92cbcb8d0a6118f60e077e6be42e049899", + "specs.json": "03f7b4e2450af06bf3fe52d561d0a5df47486a18029477b6e3f42f374fc89588", + "target.spice": "d0271081d8df39516b837d446f520205813772e8c6021025eff2f2f16d8e30cb", + "target_lvs.spice": "cf6ef9670e1f5903ec5d34013ca010703c1936660352200d3f46543de4e983bf", + "testbench.spice": "4246f432b37b9d4f33da5a803bab299286fca3537f47389f2b64773f9f003a3a" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/gf180/sW2_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW2_sL1/qualification.json new file mode 100644 index 00000000..924b202a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW2_sL1/qualification.json @@ -0,0 +1,71 @@ +{ + "case_id": "C15_gf180_sW2_sL1", + "circuit_id": "C15", + "pdk": "gf180", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "single", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "dfff483edf5d728d", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 14.1 + }, + "f3db": { + "min": 43890000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 17.09957, + "f3db": 73149630.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vout0": 1.137371, + "vin0": 1.137371, + "idd": 9.719374e-05, + "gain_lf": 17.09957, + "f3db": 73149630.0, + "ugf": 520860300.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/gf180/sW2_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW2_sL1/specs.json new file mode 100644 index 00000000..ec8fede6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW2_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 14.1 + }, + "f3db": { + "min": 43890000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 17.09957, + "f3db": 73149630.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/gf180/sW2_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW2_sL1/target.spice new file mode 100644 index 00000000..01164f99 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW2_sL1/target.spice @@ -0,0 +1,4 @@ +.subckt C15_gf180_sW2_sL1 VDD VSS VIN1 VOUT1 +MM1 VOUT1 VIN1 VSS VSS nfet_03v3 w=4u l=0.56u nf=8 m=1 +XRR1 VDD VOUT1 VSS ppolyf_u r_width=1u r_length=60u +.ends C15_gf180_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C15/gf180/sW2_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW2_sL1/target_lvs.spice new file mode 100644 index 00000000..04037bc8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW2_sL1/target_lvs.spice @@ -0,0 +1,11 @@ +.subckt C15_gf180_sW2_sL1 VDD VSS VIN1 VOUT1 +MM1_f0 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM1_f1 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM1_f2 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM1_f3 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM1_f4 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM1_f5 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM1_f6 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM1_f7 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +RR1 VDD VOUT1 VSS ppolyf_u L=60u W=1u +.ends C15_gf180_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C15/gf180/sW2_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW2_sL1/testbench.spice new file mode 100644 index 00000000..68fb6ad9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW2_sL1/testbench.spice @@ -0,0 +1,26 @@ +X1 VDD VSS VIN1 VOUT1 C15_gf180_sW2_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 + +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C15/gf180/sW2_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW2_sL2/case.json new file mode 100644 index 00000000..dbcd9e80 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW2_sL2/case.json @@ -0,0 +1,77 @@ +{ + "case_id": "C15_gf180_sW2_sL2", + "circuit_id": "C15", + "pdk": "gf180", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "dut_name": "C15_gf180_sW2_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 1.12, + "nf": 8 + }, + "R1": { + "r": 40000.0, + "body": "VSS", + "w": 1.0, + "l": 60.0 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": {}, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "13fc8e728fc9fd01", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "R1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/gf180/sW2_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW2_sL2/manifest.json new file mode 100644 index 00000000..1fa106eb --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW2_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "0a60c2ddfa5d9fae3ec7ee8db3456babcb478d5f8cdb1394a423645224a18c9d", + "qualification.json": "a4b14ecd187e88cfeeb2d26bc42ffff6fbf33f914a351b50412371fd99559284", + "specs.json": "65dfd5940467afd55ab3293c74e88490cd75c0269652e8c49b0c537bee4323bb", + "target.spice": "a2ef64386858fb5c9aaeb07bb956f2c28ec0a4fad8ed7efc95fc18ff2e230a5d", + "target_lvs.spice": "5b46778fe6a18e84c55a029403582298e0731d8dd71f133f95e6814b9d594e5b", + "testbench.spice": "703cd90268b7060ab5089160dfcde4b67c8b1f15d79a926d290876d8c2667482" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/gf180/sW2_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW2_sL2/qualification.json new file mode 100644 index 00000000..4b5441e9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW2_sL2/qualification.json @@ -0,0 +1,71 @@ +{ + "case_id": "C15_gf180_sW2_sL2", + "circuit_id": "C15", + "pdk": "gf180", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "single", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "13fc8e728fc9fd01", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 11.27 + }, + "f3db": { + "min": 41450000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 14.27284, + "f3db": 69077760.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vout0": 1.32431, + "vin0": 1.32431, + "idd": 8.879226e-05, + "gain_lf": 14.27284, + "f3db": 69077760.0, + "ugf": 351920900.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/gf180/sW2_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW2_sL2/specs.json new file mode 100644 index 00000000..d4c45721 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW2_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 11.27 + }, + "f3db": { + "min": 41450000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 14.27284, + "f3db": 69077760.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/gf180/sW2_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW2_sL2/target.spice new file mode 100644 index 00000000..58c00780 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW2_sL2/target.spice @@ -0,0 +1,4 @@ +.subckt C15_gf180_sW2_sL2 VDD VSS VIN1 VOUT1 +MM1 VOUT1 VIN1 VSS VSS nfet_03v3 w=4u l=1.12u nf=8 m=1 +XRR1 VDD VOUT1 VSS ppolyf_u r_width=1u r_length=60u +.ends C15_gf180_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C15/gf180/sW2_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW2_sL2/target_lvs.spice new file mode 100644 index 00000000..cd4db33c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW2_sL2/target_lvs.spice @@ -0,0 +1,11 @@ +.subckt C15_gf180_sW2_sL2 VDD VSS VIN1 VOUT1 +MM1_f0 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM1_f1 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM1_f2 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM1_f3 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM1_f4 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM1_f5 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM1_f6 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM1_f7 VOUT1 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +RR1 VDD VOUT1 VSS ppolyf_u L=60u W=1u +.ends C15_gf180_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C15/gf180/sW2_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW2_sL2/testbench.spice new file mode 100644 index 00000000..c40528c6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/gf180/sW2_sL2/testbench.spice @@ -0,0 +1,26 @@ +X1 VDD VSS VIN1 VOUT1 C15_gf180_sW2_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 + +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW0.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW0.5_sL1.5/case.json new file mode 100644 index 00000000..c148cbf8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW0.5_sL1.5/case.json @@ -0,0 +1,77 @@ +{ + "case_id": "C15_ihp130_sW0.5_sL1.5", + "circuit_id": "C15", + "pdk": "ihp130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "dut_name": "C15_ihp130_sW0.5_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1" + ], + "sizing": { + "M1": { + "w": 1.0, + "l": 0.39, + "nf": 2 + }, + "R1": { + "r": 12000.0, + "body": "VSS", + "w": 1.0, + "l": 46.385 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": {}, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.39, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "87a6b19045a6cb8c", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "R1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW0.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW0.5_sL1.5/manifest.json new file mode 100644 index 00000000..c5e83ec8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW0.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "9ba73379493e8fd9dd505b988ba7ebf75c6c39c89c5c83ede682a2ebf793386b", + "qualification.json": "84e9e92401c033425deb7195e170b5dad6282ad04306938186b8b5fcff36d420", + "specs.json": "52892c1cf4f367863c931fa83e296cdb2211ec038ba04f55a063bc14aa9968f4", + "target.spice": "da57f22a5a61b23e4d91a015478037d73d57991e6ddda5e5c789148829769d72", + "target_lvs.spice": "10d2737fbd34e0ad0a7e0c4e97f47c0dafb0b7d75661cd34db51db8c10234682", + "testbench.spice": "97689607f95cc38b7247a4c076c930d2029e66948cce26cf189f78da2c43e2d7" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW0.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW0.5_sL1.5/qualification.json new file mode 100644 index 00000000..dc8556dd --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW0.5_sL1.5/qualification.json @@ -0,0 +1,71 @@ +{ + "case_id": "C15_ihp130_sW0.5_sL1.5", + "circuit_id": "C15", + "pdk": "ihp130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "single", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.39, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "87a6b19045a6cb8c", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 86530000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 8.319831, + "f3db": 144216600.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vout0": 0.6544276, + "vin0": 0.6544276, + "idd": 4.546971e-05, + "gain_lf": 8.319831, + "f3db": 144216600.0, + "ugf": 348140800.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW0.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW0.5_sL1.5/specs.json new file mode 100644 index 00000000..c3b2451b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW0.5_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 86530000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 8.319831, + "f3db": 144216600.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW0.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW0.5_sL1.5/target.spice new file mode 100644 index 00000000..dc32b60f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW0.5_sL1.5/target.spice @@ -0,0 +1,4 @@ +.subckt C15_ihp130_sW0.5_sL1.5 VDD VSS VIN1 VOUT1 +XM1 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=1u l=0.39u ng=2 m=1 +XRR1 VDD VOUT1 rppd w=1u l=46.385u m=1 +.ends C15_ihp130_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW0.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW0.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..32e88929 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW0.5_sL1.5/target_lvs.spice @@ -0,0 +1,5 @@ +.subckt C15_ihp130_sW0.5_sL1.5 VDD VSS VIN1 VOUT1 +XM1_f0 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f1 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XRR1 VDD VOUT1 rppd w=1u l=46.385u m=1 +.ends C15_ihp130_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW0.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW0.5_sL1.5/testbench.spice new file mode 100644 index 00000000..ad495e1e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW0.5_sL1.5/testbench.spice @@ -0,0 +1,26 @@ +X1 VDD VSS VIN1 VOUT1 C15_ihp130_sW0.5_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 + +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW0.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW0.5_sL1/case.json new file mode 100644 index 00000000..51578d5d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW0.5_sL1/case.json @@ -0,0 +1,77 @@ +{ + "case_id": "C15_ihp130_sW0.5_sL1", + "circuit_id": "C15", + "pdk": "ihp130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "dut_name": "C15_ihp130_sW0.5_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1" + ], + "sizing": { + "M1": { + "w": 1.0, + "l": 0.26, + "nf": 2 + }, + "R1": { + "r": 12000.0, + "body": "VSS", + "w": 1.0, + "l": 46.385 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": {}, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.26, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "9b70078aee21bb36", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "R1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW0.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW0.5_sL1/manifest.json new file mode 100644 index 00000000..ed8b5916 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW0.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "710df4f1e24e36702fefb989e77b46660cc7238d1e16fbead4104c0d8dca82ef", + "qualification.json": "250ce8adfe472f1ec169a864db9bfa9945c01ca340da890da2cd6c370fd80a68", + "specs.json": "2cb77ce03a7d4ac04dfd59c41b237af645936435aa6ca0ebde49ae1b724d631c", + "target.spice": "da9a6e2c06e2a8f2504be800b7805504fb583ba3113eebe6a70f19042d7a698f", + "target_lvs.spice": "9533742926c834eeb45b2db34c50053f2127879aa76d7d648b90b450f1054447", + "testbench.spice": "2a201c32300bf13d1065e1af9d9bd6f301019711fcb27573f30797dc3da05df9" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW0.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW0.5_sL1/qualification.json new file mode 100644 index 00000000..34dcb07e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW0.5_sL1/qualification.json @@ -0,0 +1,71 @@ +{ + "case_id": "C15_ihp130_sW0.5_sL1", + "circuit_id": "C15", + "pdk": "ihp130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "single", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.26, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "9b70078aee21bb36", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 89420000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 9.307059, + "f3db": 149028300.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vout0": 0.6462885, + "vin0": 0.6462885, + "idd": 4.614805e-05, + "gain_lf": 9.307059, + "f3db": 149028300.0, + "ugf": 410210500.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW0.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW0.5_sL1/specs.json new file mode 100644 index 00000000..d6bc9fca --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW0.5_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 89420000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 9.307059, + "f3db": 149028300.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW0.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW0.5_sL1/target.spice new file mode 100644 index 00000000..984c62a7 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW0.5_sL1/target.spice @@ -0,0 +1,4 @@ +.subckt C15_ihp130_sW0.5_sL1 VDD VSS VIN1 VOUT1 +XM1 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=1u l=0.26u ng=2 m=1 +XRR1 VDD VOUT1 rppd w=1u l=46.385u m=1 +.ends C15_ihp130_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW0.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW0.5_sL1/target_lvs.spice new file mode 100644 index 00000000..fb77cc17 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW0.5_sL1/target_lvs.spice @@ -0,0 +1,5 @@ +.subckt C15_ihp130_sW0.5_sL1 VDD VSS VIN1 VOUT1 +XM1_f0 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f1 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XRR1 VDD VOUT1 rppd w=1u l=46.385u m=1 +.ends C15_ihp130_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW0.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW0.5_sL1/testbench.spice new file mode 100644 index 00000000..002d6fcc --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW0.5_sL1/testbench.spice @@ -0,0 +1,26 @@ +X1 VDD VSS VIN1 VOUT1 C15_ihp130_sW0.5_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 + +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW0.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW0.5_sL2/case.json new file mode 100644 index 00000000..8f5f68da --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW0.5_sL2/case.json @@ -0,0 +1,77 @@ +{ + "case_id": "C15_ihp130_sW0.5_sL2", + "circuit_id": "C15", + "pdk": "ihp130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "dut_name": "C15_ihp130_sW0.5_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1" + ], + "sizing": { + "M1": { + "w": 1.0, + "l": 0.52, + "nf": 2 + }, + "R1": { + "r": 12000.0, + "body": "VSS", + "w": 1.0, + "l": 46.385 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": {}, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.52, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "3772d1331b2bfd17", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "R1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW0.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW0.5_sL2/manifest.json new file mode 100644 index 00000000..859f6f1e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW0.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "0eca39e9df21bbfe6f4cf6994eaf501db136ca152ba24007d113c9dfbc34579a", + "qualification.json": "76b0880d76b18ddc2b3e906f70fc18d703a2543666f62cd423ef40f8d96d8bd6", + "specs.json": "09fd81a200ad07927e64b8a6f7d7dc37fe722ebf404bb100a8287c4dc35f9ee6", + "target.spice": "9ed10fd727723ba49edc8a20b19da8f827319078a4b0408ceea174884963af71", + "target_lvs.spice": "b3f7ce1569f8aa151721851da0d521d17075006b1040141312bb77fa28caf9f8", + "testbench.spice": "86c6db166833801439c98cb417e1330d0a782b3b276e21a13bba95a1ab45fce9" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW0.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW0.5_sL2/qualification.json new file mode 100644 index 00000000..165fb9d1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW0.5_sL2/qualification.json @@ -0,0 +1,73 @@ +{ + "case_id": "C15_ihp130_sW0.5_sL2", + "circuit_id": "C15", + "pdk": "ihp130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "single", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.52, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "3772d1331b2bfd17", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "gain_lf=7.377 below floor 8" + ], + "spec": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 84590000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 7.377442, + "f3db": 140980200.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vout0": 0.6726415, + "vin0": 0.6726415, + "idd": 4.395171e-05, + "gain_lf": 7.377442, + "f3db": 140980200.0, + "ugf": 299023600.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW0.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW0.5_sL2/specs.json new file mode 100644 index 00000000..8559f9d9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW0.5_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 84590000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 7.377442, + "f3db": 140980200.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW0.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW0.5_sL2/target.spice new file mode 100644 index 00000000..ecc6b72b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW0.5_sL2/target.spice @@ -0,0 +1,4 @@ +.subckt C15_ihp130_sW0.5_sL2 VDD VSS VIN1 VOUT1 +XM1 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=1u l=0.52u ng=2 m=1 +XRR1 VDD VOUT1 rppd w=1u l=46.385u m=1 +.ends C15_ihp130_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW0.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW0.5_sL2/target_lvs.spice new file mode 100644 index 00000000..1ceedf3c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW0.5_sL2/target_lvs.spice @@ -0,0 +1,5 @@ +.subckt C15_ihp130_sW0.5_sL2 VDD VSS VIN1 VOUT1 +XM1_f0 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f1 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XRR1 VDD VOUT1 rppd w=1u l=46.385u m=1 +.ends C15_ihp130_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW0.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW0.5_sL2/testbench.spice new file mode 100644 index 00000000..4f628f81 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW0.5_sL2/testbench.spice @@ -0,0 +1,26 @@ +X1 VDD VSS VIN1 VOUT1 C15_ihp130_sW0.5_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 + +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1.5_sL1.5/case.json new file mode 100644 index 00000000..facedbd8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1.5_sL1.5/case.json @@ -0,0 +1,77 @@ +{ + "case_id": "C15_ihp130_sW1.5_sL1.5", + "circuit_id": "C15", + "pdk": "ihp130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "dut_name": "C15_ihp130_sW1.5_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1" + ], + "sizing": { + "M1": { + "w": 3.0, + "l": 0.39, + "nf": 6 + }, + "R1": { + "r": 12000.0, + "body": "VSS", + "w": 1.0, + "l": 46.385 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": {}, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.39, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "0076cec2241a3686", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "R1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1.5_sL1.5/manifest.json new file mode 100644 index 00000000..5b043336 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "9ed1a6ae8123adf4d86c8413681677dbc784b2c30871065d3c6ff4cb06c9ea95", + "qualification.json": "62e4e1ff0ccae0c1ba7372d5ba37ede5101e19ee4188e212dea182b0e39c919c", + "specs.json": "9502bc64d2187642c890646628b867fb13a41c7399404542ddca95eb2f785cbd", + "target.spice": "ad03ec5d6e2c45798d0a4b2fa495e55a585b94a259f8c5fb15a8e15135ae1cc2", + "target_lvs.spice": "9a44ac2c77a7f09d1e4d5c2d955dfe3769946978d22775a4993ff044127c6898", + "testbench.spice": "bb20c61ffde6706d510cb12e37c78739519166a18721c5ab7da6ca07c8b9004d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1.5_sL1.5/qualification.json new file mode 100644 index 00000000..c61ebf5e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1.5_sL1.5/qualification.json @@ -0,0 +1,71 @@ +{ + "case_id": "C15_ihp130_sW1.5_sL1.5", + "circuit_id": "C15", + "pdk": "ihp130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "single", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.39, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "0076cec2241a3686", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 9.877 + }, + "f3db": { + "min": 92970000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 12.877, + "f3db": 154945300.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vout0": 0.5264768, + "vin0": 0.5264768, + "idd": 5.613354e-05, + "gain_lf": 12.877, + "f3db": 154945300.0, + "ugf": 667673000.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1.5_sL1.5/specs.json new file mode 100644 index 00000000..5f5d9921 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1.5_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 9.877 + }, + "f3db": { + "min": 92970000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 12.877, + "f3db": 154945300.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1.5_sL1.5/target.spice new file mode 100644 index 00000000..87aef741 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1.5_sL1.5/target.spice @@ -0,0 +1,4 @@ +.subckt C15_ihp130_sW1.5_sL1.5 VDD VSS VIN1 VOUT1 +XM1 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=3u l=0.39u ng=6 m=1 +XRR1 VDD VOUT1 rppd w=1u l=46.385u m=1 +.ends C15_ihp130_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..3ca9bb31 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1.5_sL1.5/target_lvs.spice @@ -0,0 +1,9 @@ +.subckt C15_ihp130_sW1.5_sL1.5 VDD VSS VIN1 VOUT1 +XM1_f0 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f1 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f2 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f3 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f4 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f5 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XRR1 VDD VOUT1 rppd w=1u l=46.385u m=1 +.ends C15_ihp130_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1.5_sL1.5/testbench.spice new file mode 100644 index 00000000..e07c1f35 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1.5_sL1.5/testbench.spice @@ -0,0 +1,26 @@ +X1 VDD VSS VIN1 VOUT1 C15_ihp130_sW1.5_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 + +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1.5_sL1/case.json new file mode 100644 index 00000000..b7817057 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1.5_sL1/case.json @@ -0,0 +1,77 @@ +{ + "case_id": "C15_ihp130_sW1.5_sL1", + "circuit_id": "C15", + "pdk": "ihp130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "dut_name": "C15_ihp130_sW1.5_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1" + ], + "sizing": { + "M1": { + "w": 3.0, + "l": 0.26, + "nf": 6 + }, + "R1": { + "r": 12000.0, + "body": "VSS", + "w": 1.0, + "l": 46.385 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": {}, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.26, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "d3209990dbb25d8e", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "R1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1.5_sL1/manifest.json new file mode 100644 index 00000000..1f0ff1dd --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "9566f9ba7d1344ce8761bd808194dd4dc02b7191b49f3e4d49f8943db7673c9e", + "qualification.json": "51e750fdac7e515b3de489bc73f7cb4fcb634cfcdfe98caa8990ef1be4b07a0b", + "specs.json": "404a9bc3d453d653b1bc14ad94dd4741372cf1abd2250d89feae7a53a63a3ca9", + "target.spice": "f3032bf018ec6490fa8be95d05db2c5f2f448b1b8773caaaa521cb10820480f6", + "target_lvs.spice": "1cc5395ead020c3ff7968e76b35a391ab58056b85d9c0d21bacf915353fcb0d7", + "testbench.spice": "7742922b10128849aae081dec56da9ca5c8325ebf2a9e5cb86f2ce70cbf9982f" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1.5_sL1/qualification.json new file mode 100644 index 00000000..57235585 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1.5_sL1/qualification.json @@ -0,0 +1,71 @@ +{ + "case_id": "C15_ihp130_sW1.5_sL1", + "circuit_id": "C15", + "pdk": "ihp130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "single", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.26, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "d3209990dbb25d8e", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 10.44 + }, + "f3db": { + "min": 97350000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 13.4412, + "f3db": 162241800.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vout0": 0.5311651, + "vin0": 0.5311651, + "idd": 5.57428e-05, + "gain_lf": 13.4412, + "f3db": 162241800.0, + "ugf": 748211300.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1.5_sL1/specs.json new file mode 100644 index 00000000..8e083759 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1.5_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 10.44 + }, + "f3db": { + "min": 97350000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 13.4412, + "f3db": 162241800.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1.5_sL1/target.spice new file mode 100644 index 00000000..25636359 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1.5_sL1/target.spice @@ -0,0 +1,4 @@ +.subckt C15_ihp130_sW1.5_sL1 VDD VSS VIN1 VOUT1 +XM1 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=3u l=0.26u ng=6 m=1 +XRR1 VDD VOUT1 rppd w=1u l=46.385u m=1 +.ends C15_ihp130_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1.5_sL1/target_lvs.spice new file mode 100644 index 00000000..69a0b2c8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1.5_sL1/target_lvs.spice @@ -0,0 +1,9 @@ +.subckt C15_ihp130_sW1.5_sL1 VDD VSS VIN1 VOUT1 +XM1_f0 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f1 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f2 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f3 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f4 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f5 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XRR1 VDD VOUT1 rppd w=1u l=46.385u m=1 +.ends C15_ihp130_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1.5_sL1/testbench.spice new file mode 100644 index 00000000..e95cba11 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1.5_sL1/testbench.spice @@ -0,0 +1,26 @@ +X1 VDD VSS VIN1 VOUT1 C15_ihp130_sW1.5_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 + +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1.5_sL2/case.json new file mode 100644 index 00000000..14fe40e2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1.5_sL2/case.json @@ -0,0 +1,77 @@ +{ + "case_id": "C15_ihp130_sW1.5_sL2", + "circuit_id": "C15", + "pdk": "ihp130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "dut_name": "C15_ihp130_sW1.5_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1" + ], + "sizing": { + "M1": { + "w": 3.0, + "l": 0.52, + "nf": 6 + }, + "R1": { + "r": 12000.0, + "body": "VSS", + "w": 1.0, + "l": 46.385 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": {}, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.52, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "dfe46ecfb09fcaff", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "R1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1.5_sL2/manifest.json new file mode 100644 index 00000000..363eea9b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "9a0884539809d21bb998bfbc146800f3b80487a61743495d7a9331267914b27c", + "qualification.json": "5b874e2aaaf324759dec4cde3a2a738e7ce3411cf283f7a750cd07a5ae5c6a7b", + "specs.json": "fea9842633e421b0c0c589e81188239b97f024ffae91b9b5ea40cc14bd0e68ae", + "target.spice": "3b59b9dbbde6dcfe5cd076b56d7f8ba71ad5f7214e3093717f4f8b63c3882c37", + "target_lvs.spice": "1ab9deba5c089d4d47771675ac30bd09f97817dc5fa3594145460ee957a68e96", + "testbench.spice": "19dde049fc47ec8a00d788d9068afab07641bde93b31a1644056a493beb3fa09" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1.5_sL2/qualification.json new file mode 100644 index 00000000..6caadfd1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1.5_sL2/qualification.json @@ -0,0 +1,71 @@ +{ + "case_id": "C15_ihp130_sW1.5_sL2", + "circuit_id": "C15", + "pdk": "ihp130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "single", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.52, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "dfe46ecfb09fcaff", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 9.247 + }, + "f3db": { + "min": 89910000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 12.24704, + "f3db": 149846600.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vout0": 0.5348215, + "vin0": 0.5348215, + "idd": 5.543807e-05, + "gain_lf": 12.24704, + "f3db": 149846600.0, + "ugf": 598223700.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1.5_sL2/specs.json new file mode 100644 index 00000000..aad7d3de --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1.5_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 9.247 + }, + "f3db": { + "min": 89910000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 12.24704, + "f3db": 149846600.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1.5_sL2/target.spice new file mode 100644 index 00000000..a1519ceb --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1.5_sL2/target.spice @@ -0,0 +1,4 @@ +.subckt C15_ihp130_sW1.5_sL2 VDD VSS VIN1 VOUT1 +XM1 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=3u l=0.52u ng=6 m=1 +XRR1 VDD VOUT1 rppd w=1u l=46.385u m=1 +.ends C15_ihp130_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1.5_sL2/target_lvs.spice new file mode 100644 index 00000000..6231d26d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1.5_sL2/target_lvs.spice @@ -0,0 +1,9 @@ +.subckt C15_ihp130_sW1.5_sL2 VDD VSS VIN1 VOUT1 +XM1_f0 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f1 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f2 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f3 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f4 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f5 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XRR1 VDD VOUT1 rppd w=1u l=46.385u m=1 +.ends C15_ihp130_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1.5_sL2/testbench.spice new file mode 100644 index 00000000..59c0820a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1.5_sL2/testbench.spice @@ -0,0 +1,26 @@ +X1 VDD VSS VIN1 VOUT1 C15_ihp130_sW1.5_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 + +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1_sL1.5/case.json new file mode 100644 index 00000000..cb7ba0a3 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1_sL1.5/case.json @@ -0,0 +1,77 @@ +{ + "case_id": "C15_ihp130_sW1_sL1.5", + "circuit_id": "C15", + "pdk": "ihp130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "dut_name": "C15_ihp130_sW1_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.39, + "nf": 4 + }, + "R1": { + "r": 12000.0, + "body": "VSS", + "w": 1.0, + "l": 46.385 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": {}, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "a5d13a517b6c773d", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "R1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1_sL1.5/manifest.json new file mode 100644 index 00000000..34b734a6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "7344597e2325e89d887884a003ec07e042e14fad5c1e7ed2748de6562969cb5f", + "qualification.json": "af4c3a9705104643f5657c777e15a5acdac8ccbbd698ab88e5f25f458057e6ab", + "specs.json": "2e174ec1eaf05aebc094c219660830bd77e3b65954224fd9e923704fad9cb055", + "target.spice": "c971d5a08918e906b4a84302d041581d43ceacbc8618e7daf0fe2d08d3f0b0b2", + "target_lvs.spice": "67b7ece4008e523ecafe90686ad2d365b48a5cd4df564131bb6b0d108f680ea3", + "testbench.spice": "8e6d3808d61606663b4b9082ca0933f30364902a449157fe2c5c8ce83ec7a4d4" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1_sL1.5/qualification.json new file mode 100644 index 00000000..eb25222c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1_sL1.5/qualification.json @@ -0,0 +1,71 @@ +{ + "case_id": "C15_ihp130_sW1_sL1.5", + "circuit_id": "C15", + "pdk": "ihp130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "single", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "a5d13a517b6c773d", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 8.351 + }, + "f3db": { + "min": 90400000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 11.35112, + "f3db": 150666800.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vout0": 0.5694624, + "vin0": 0.5694624, + "idd": 5.255099e-05, + "gain_lf": 11.35112, + "f3db": 150666800.0, + "ugf": 538054100.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1_sL1.5/specs.json new file mode 100644 index 00000000..62c06f21 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 8.351 + }, + "f3db": { + "min": 90400000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 11.35112, + "f3db": 150666800.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1_sL1.5/target.spice new file mode 100644 index 00000000..e6959b8b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1_sL1.5/target.spice @@ -0,0 +1,4 @@ +.subckt C15_ihp130_sW1_sL1.5 VDD VSS VIN1 VOUT1 +XM1 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=2u l=0.39u ng=4 m=1 +XRR1 VDD VOUT1 rppd w=1u l=46.385u m=1 +.ends C15_ihp130_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1_sL1.5/target_lvs.spice new file mode 100644 index 00000000..312c464c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1_sL1.5/target_lvs.spice @@ -0,0 +1,7 @@ +.subckt C15_ihp130_sW1_sL1.5 VDD VSS VIN1 VOUT1 +XM1_f0 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f1 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f2 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f3 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XRR1 VDD VOUT1 rppd w=1u l=46.385u m=1 +.ends C15_ihp130_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1_sL1.5/testbench.spice new file mode 100644 index 00000000..2abbfe60 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1_sL1.5/testbench.spice @@ -0,0 +1,26 @@ +X1 VDD VSS VIN1 VOUT1 C15_ihp130_sW1_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 + +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1_sL1/case.json new file mode 100644 index 00000000..f6ac9294 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1_sL1/case.json @@ -0,0 +1,77 @@ +{ + "case_id": "C15_ihp130_sW1_sL1", + "circuit_id": "C15", + "pdk": "ihp130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "dut_name": "C15_ihp130_sW1_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.26, + "nf": 4 + }, + "R1": { + "r": 12000.0, + "body": "VSS", + "w": 1.0, + "l": 46.385 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": {}, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.26, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "d7ff3e1b04562e8f", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "R1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1_sL1/manifest.json new file mode 100644 index 00000000..8fa9f594 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "e4df077f85219d6560e659426f37aaa792840a33e566bdfac2eb9d12fd99bef0", + "qualification.json": "1c54be67022763dc908b88e77717869d4ef4a136f8edc52fddbb8dddc1977e3b", + "specs.json": "cfed887be949b714ce25b972f27f396143afb02bbbf6ae12851ebc0733a1153c", + "target.spice": "16ca468c261badb09f9b2c0327d7f4fdc707aed4cc52b43dea7f239ad8656421", + "target_lvs.spice": "34307335b0fcf4a7fccbd5ded2c336df8a284fec2a9f2480a42e2a7e02a8b164", + "testbench.spice": "1622e52fff1f90987a5b6fd9af35f1b09a0d128307e8650f4a81ef7f6d8e182a" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1_sL1/qualification.json new file mode 100644 index 00000000..bd0c499c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1_sL1/qualification.json @@ -0,0 +1,71 @@ +{ + "case_id": "C15_ihp130_sW1_sL1", + "circuit_id": "C15", + "pdk": "ihp130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "single", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.26, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "d7ff3e1b04562e8f", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 9.071 + }, + "f3db": { + "min": 94170000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 12.07051, + "f3db": 156951600.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vout0": 0.5697971, + "vin0": 0.5697971, + "idd": 5.252309e-05, + "gain_lf": 12.07051, + "f3db": 156951600.0, + "ugf": 612331300.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1_sL1/specs.json new file mode 100644 index 00000000..9976a16a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 9.071 + }, + "f3db": { + "min": 94170000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 12.07051, + "f3db": 156951600.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1_sL1/target.spice new file mode 100644 index 00000000..ea5031b5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1_sL1/target.spice @@ -0,0 +1,4 @@ +.subckt C15_ihp130_sW1_sL1 VDD VSS VIN1 VOUT1 +XM1 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=2u l=0.26u ng=4 m=1 +XRR1 VDD VOUT1 rppd w=1u l=46.385u m=1 +.ends C15_ihp130_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1_sL1/target_lvs.spice new file mode 100644 index 00000000..aa329b43 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1_sL1/target_lvs.spice @@ -0,0 +1,7 @@ +.subckt C15_ihp130_sW1_sL1 VDD VSS VIN1 VOUT1 +XM1_f0 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f1 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f2 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f3 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XRR1 VDD VOUT1 rppd w=1u l=46.385u m=1 +.ends C15_ihp130_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1_sL1/testbench.spice new file mode 100644 index 00000000..66f1ff8a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1_sL1/testbench.spice @@ -0,0 +1,26 @@ +X1 VDD VSS VIN1 VOUT1 C15_ihp130_sW1_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 + +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1_sL2/case.json new file mode 100644 index 00000000..04ed2458 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1_sL2/case.json @@ -0,0 +1,77 @@ +{ + "case_id": "C15_ihp130_sW1_sL2", + "circuit_id": "C15", + "pdk": "ihp130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "dut_name": "C15_ihp130_sW1_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.52, + "nf": 4 + }, + "R1": { + "r": 12000.0, + "body": "VSS", + "w": 1.0, + "l": 46.385 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": {}, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "a0cabdab59942aae", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "R1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1_sL2/manifest.json new file mode 100644 index 00000000..0b5e4850 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "c562cfdf9cdd29fb71a62f9e1c9b67812a9ce7d24e2e513fc9fef3163580ae41", + "qualification.json": "668755fe541886b310bb6344755862cef6e2b4f4af81b86753cc034836c88b88", + "specs.json": "58de11629e939fefaa5fabfb512d381dda2b8e3f41daae85bf4fee9660bbe0cd", + "target.spice": "b3698d060bcf42dec6e764d2d5c4d5b83b5dc0d7567cdf341fcbd67a5141c4af", + "target_lvs.spice": "aba0862d13787ae778f3562440b32997e249a71ecf6e2a48a573c06e6077bde9", + "testbench.spice": "43a1d9504a22b98ad65ab300eaac4ea197f9ecf1d6d53568fadd66c16ca8de41" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1_sL2/qualification.json new file mode 100644 index 00000000..3d844a67 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1_sL2/qualification.json @@ -0,0 +1,71 @@ +{ + "case_id": "C15_ihp130_sW1_sL2", + "circuit_id": "C15", + "pdk": "ihp130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "single", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "a0cabdab59942aae", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 87800000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 10.60652, + "f3db": 146326000.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vout0": 0.5813189, + "vin0": 0.5813189, + "idd": 5.156283e-05, + "gain_lf": 10.60652, + "f3db": 146326000.0, + "ugf": 476155200.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1_sL2/specs.json new file mode 100644 index 00000000..d7b53846 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 87800000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 10.60652, + "f3db": 146326000.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1_sL2/target.spice new file mode 100644 index 00000000..cd6db179 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1_sL2/target.spice @@ -0,0 +1,4 @@ +.subckt C15_ihp130_sW1_sL2 VDD VSS VIN1 VOUT1 +XM1 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=2u l=0.52u ng=4 m=1 +XRR1 VDD VOUT1 rppd w=1u l=46.385u m=1 +.ends C15_ihp130_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1_sL2/target_lvs.spice new file mode 100644 index 00000000..6aa0f36b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1_sL2/target_lvs.spice @@ -0,0 +1,7 @@ +.subckt C15_ihp130_sW1_sL2 VDD VSS VIN1 VOUT1 +XM1_f0 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f1 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f2 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f3 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XRR1 VDD VOUT1 rppd w=1u l=46.385u m=1 +.ends C15_ihp130_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1_sL2/testbench.spice new file mode 100644 index 00000000..17c0eb2b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW1_sL2/testbench.spice @@ -0,0 +1,26 @@ +X1 VDD VSS VIN1 VOUT1 C15_ihp130_sW1_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 + +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW2_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW2_sL1.5/case.json new file mode 100644 index 00000000..6f7cd983 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW2_sL1.5/case.json @@ -0,0 +1,77 @@ +{ + "case_id": "C15_ihp130_sW2_sL1.5", + "circuit_id": "C15", + "pdk": "ihp130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "dut_name": "C15_ihp130_sW2_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.39, + "nf": 8 + }, + "R1": { + "r": 12000.0, + "body": "VSS", + "w": 1.0, + "l": 46.385 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": {}, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "f7049c9dd7d69d1a", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "R1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW2_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW2_sL1.5/manifest.json new file mode 100644 index 00000000..f47b0133 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW2_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "4a3731b428299e75b9643f7a895cbaa481eda522146b9dc33a711ca2c8ab7557", + "qualification.json": "5c436de5440b6e0019058c96e193938ed5d7a365c3afd87a88fc9d1df9c317ce", + "specs.json": "e22a87d00726f2a225f907dd00cc8bfd3c9f7e27f374841ed458ab24244bbe26", + "target.spice": "ce0f51569a2471ebb88e0b815a99efcb11d777d4be1bf0d6598a651409f7cddd", + "target_lvs.spice": "880b727f4b2a37115b66bd2b7f6bfba8ca8e36747690603a158b9651dd4ddc9d", + "testbench.spice": "2be17f7031863893798efac91ad3ab0786ae5d058afc98c1db78b9a4599045d9" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW2_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW2_sL1.5/qualification.json new file mode 100644 index 00000000..610b01b5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW2_sL1.5/qualification.json @@ -0,0 +1,71 @@ +{ + "case_id": "C15_ihp130_sW2_sL1.5", + "circuit_id": "C15", + "pdk": "ihp130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "single", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "f7049c9dd7d69d1a", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 10.86 + }, + "f3db": { + "min": 94880000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 13.85799, + "f3db": 158126100.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vout0": 0.4988202, + "vin0": 0.4988202, + "idd": 5.843853e-05, + "gain_lf": 13.85799, + "f3db": 158126100.0, + "ugf": 767281300.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW2_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW2_sL1.5/specs.json new file mode 100644 index 00000000..99a0b187 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW2_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 10.86 + }, + "f3db": { + "min": 94880000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 13.85799, + "f3db": 158126100.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW2_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW2_sL1.5/target.spice new file mode 100644 index 00000000..c8b92cda --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW2_sL1.5/target.spice @@ -0,0 +1,4 @@ +.subckt C15_ihp130_sW2_sL1.5 VDD VSS VIN1 VOUT1 +XM1 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=4u l=0.39u ng=8 m=1 +XRR1 VDD VOUT1 rppd w=1u l=46.385u m=1 +.ends C15_ihp130_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW2_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW2_sL1.5/target_lvs.spice new file mode 100644 index 00000000..f560df61 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW2_sL1.5/target_lvs.spice @@ -0,0 +1,11 @@ +.subckt C15_ihp130_sW2_sL1.5 VDD VSS VIN1 VOUT1 +XM1_f0 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f1 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f2 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f3 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f4 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f5 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f6 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f7 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XRR1 VDD VOUT1 rppd w=1u l=46.385u m=1 +.ends C15_ihp130_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW2_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW2_sL1.5/testbench.spice new file mode 100644 index 00000000..efb148ae --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW2_sL1.5/testbench.spice @@ -0,0 +1,26 @@ +X1 VDD VSS VIN1 VOUT1 C15_ihp130_sW2_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 + +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW2_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW2_sL1/case.json new file mode 100644 index 00000000..c67c73ad --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW2_sL1/case.json @@ -0,0 +1,77 @@ +{ + "case_id": "C15_ihp130_sW2_sL1", + "circuit_id": "C15", + "pdk": "ihp130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "dut_name": "C15_ihp130_sW2_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.26, + "nf": 8 + }, + "R1": { + "r": 12000.0, + "body": "VSS", + "w": 1.0, + "l": 46.385 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": {}, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "dcad40c2373a6514", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "R1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW2_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW2_sL1/manifest.json new file mode 100644 index 00000000..34d217e7 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW2_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "566347acba3319b83d5eadd7793d99aa46080654dab280c1968ad00980612270", + "qualification.json": "dc4eeffcc4e885153182052837367aa151286418f55151960420da2754f5fe3a", + "specs.json": "bdf86ca6da25bed37ad009d658a23729471a6d00cd2a97dc634ebff2c205cc52", + "target.spice": "1734c64a681637db8e05b0050b5c4c70f5eaf70b042a2deb8b129f9ddff20398", + "target_lvs.spice": "cb2ff34b2722944611c52e8ce82af8e0ca617d37d2f3a4f9e5b60765cae7abc4", + "testbench.spice": "7392a417b01c54092790c86a95311dd595fdcb1b80c8fe607e012c925c7e2888" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW2_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW2_sL1/qualification.json new file mode 100644 index 00000000..41449c2c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW2_sL1/qualification.json @@ -0,0 +1,71 @@ +{ + "case_id": "C15_ihp130_sW2_sL1", + "circuit_id": "C15", + "pdk": "ihp130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "single", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "dcad40c2373a6514", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 11.31 + }, + "f3db": { + "min": 99720000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 14.31278, + "f3db": 166198500.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vout0": 0.5062686, + "vin0": 0.5062686, + "idd": 5.781776e-05, + "gain_lf": 14.31278, + "f3db": 166198500.0, + "ugf": 851250200.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW2_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW2_sL1/specs.json new file mode 100644 index 00000000..7fe1b2f8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW2_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 11.31 + }, + "f3db": { + "min": 99720000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 14.31278, + "f3db": 166198500.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW2_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW2_sL1/target.spice new file mode 100644 index 00000000..318dd46b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW2_sL1/target.spice @@ -0,0 +1,4 @@ +.subckt C15_ihp130_sW2_sL1 VDD VSS VIN1 VOUT1 +XM1 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=4u l=0.26u ng=8 m=1 +XRR1 VDD VOUT1 rppd w=1u l=46.385u m=1 +.ends C15_ihp130_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW2_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW2_sL1/target_lvs.spice new file mode 100644 index 00000000..aa75c53b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW2_sL1/target_lvs.spice @@ -0,0 +1,11 @@ +.subckt C15_ihp130_sW2_sL1 VDD VSS VIN1 VOUT1 +XM1_f0 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f1 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f2 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f3 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f4 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f5 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f6 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f7 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XRR1 VDD VOUT1 rppd w=1u l=46.385u m=1 +.ends C15_ihp130_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW2_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW2_sL1/testbench.spice new file mode 100644 index 00000000..cb6e8f40 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW2_sL1/testbench.spice @@ -0,0 +1,26 @@ +X1 VDD VSS VIN1 VOUT1 C15_ihp130_sW2_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 + +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW2_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW2_sL2/case.json new file mode 100644 index 00000000..a308be36 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW2_sL2/case.json @@ -0,0 +1,77 @@ +{ + "case_id": "C15_ihp130_sW2_sL2", + "circuit_id": "C15", + "pdk": "ihp130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "dut_name": "C15_ihp130_sW2_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.52, + "nf": 8 + }, + "R1": { + "r": 12000.0, + "body": "VSS", + "w": 1.0, + "l": 46.385 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": {}, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "649588b2052271a8", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "R1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW2_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW2_sL2/manifest.json new file mode 100644 index 00000000..1cb345cd --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW2_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "aae50cc12deb29ea34331c1bcb43378400ebf99fb241c25710fb45363c1a4fab", + "qualification.json": "08e42f42a3b143bf7c5e437e264fcce3e682205c95a11b55a37e784916b728da", + "specs.json": "c21faa691ab57bab86a78d12dcb0d62fd0dbd0743fcd60e633f19b72425974fd", + "target.spice": "a543604fa328035fa1f5b07ffbbf7d1be79902b0f8f57bd4dbf57c844d010ff5", + "target_lvs.spice": "d735e0c09746ecb8555cf56188813bc3e42d42dc37d39e1903231bf53ea762c9", + "testbench.spice": "17b0c4c2125585e45133bdb2ff8c2e2f8f5e37fbb8a15edf446862dffdef3b5c" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW2_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW2_sL2/qualification.json new file mode 100644 index 00000000..10751c9b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW2_sL2/qualification.json @@ -0,0 +1,71 @@ +{ + "case_id": "C15_ihp130_sW2_sL2", + "circuit_id": "C15", + "pdk": "ihp130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "single", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "649588b2052271a8", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 10.31 + }, + "f3db": { + "min": 91460000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 13.30866, + "f3db": 152436800.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vout0": 0.5048617, + "vin0": 0.5048617, + "idd": 5.793501e-05, + "gain_lf": 13.30866, + "f3db": 152436800.0, + "ugf": 692654800.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW2_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW2_sL2/specs.json new file mode 100644 index 00000000..24fd8057 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW2_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 10.31 + }, + "f3db": { + "min": 91460000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 13.30866, + "f3db": 152436800.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW2_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW2_sL2/target.spice new file mode 100644 index 00000000..2d42609b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW2_sL2/target.spice @@ -0,0 +1,4 @@ +.subckt C15_ihp130_sW2_sL2 VDD VSS VIN1 VOUT1 +XM1 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=4u l=0.52u ng=8 m=1 +XRR1 VDD VOUT1 rppd w=1u l=46.385u m=1 +.ends C15_ihp130_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW2_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW2_sL2/target_lvs.spice new file mode 100644 index 00000000..2c370d4c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW2_sL2/target_lvs.spice @@ -0,0 +1,11 @@ +.subckt C15_ihp130_sW2_sL2 VDD VSS VIN1 VOUT1 +XM1_f0 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f1 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f2 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f3 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f4 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f5 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f6 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f7 VOUT1 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XRR1 VDD VOUT1 rppd w=1u l=46.385u m=1 +.ends C15_ihp130_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW2_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW2_sL2/testbench.spice new file mode 100644 index 00000000..b4bb6b85 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/ihp130/sW2_sL2/testbench.spice @@ -0,0 +1,26 @@ +X1 VDD VSS VIN1 VOUT1 C15_ihp130_sW2_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 + +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C15/sky130/sW0.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW0.5_sL1.5/case.json new file mode 100644 index 00000000..0579efc2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW0.5_sL1.5/case.json @@ -0,0 +1,77 @@ +{ + "case_id": "C15_sky130_sW0.5_sL1.5", + "circuit_id": "C15", + "pdk": "sky130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "dut_name": "C15_sky130_sW0.5_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1" + ], + "sizing": { + "M1": { + "w": 1.0, + "l": 0.45, + "nf": 2 + }, + "R1": { + "r": 20000.0, + "body": "VSS", + "w": 0.35, + "l": 17.55 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": {}, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.45, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "8998307b59f6d76d", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "R1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/sky130/sW0.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW0.5_sL1.5/manifest.json new file mode 100644 index 00000000..93f9b8c7 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW0.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "dee42a204f4f867d9c5ef18b60752bfe5cb6c08adb33953e1d984ae5dabd7ba6", + "qualification.json": "321afc9f9a8f0301e3a6afb9fe9cd5cfdadc9d7e068467ae31b2faf1332e13ff", + "specs.json": "fb19247ba26d28148a3d9f7c458aa003c65a009d781be09a38071c1fad326555", + "target.spice": "33bf03e966e965a342175424c77a0a2e3cb44e399142963ec359747392de6fcc", + "target_lvs.spice": "f3bc717c4c286b7835b688e333938780e91f9dadd883a3912d0f656b3d2af4af", + "testbench.spice": "a753c80ce70fa5bd0e48e292247d875337e2f33ad027498b92caee26b430b840" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/sky130/sW0.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW0.5_sL1.5/qualification.json new file mode 100644 index 00000000..4bb6324b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW0.5_sL1.5/qualification.json @@ -0,0 +1,71 @@ +{ + "case_id": "C15_sky130_sW0.5_sL1.5", + "circuit_id": "C15", + "pdk": "sky130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "single", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.45, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "8998307b59f6d76d", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 49960000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 10.19672, + "f3db": 83271890.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 9.5, + "schematic_measures": { + "vout0": 1.025537, + "vin0": 1.025537, + "idd": 3.865494e-05, + "gain_lf": 10.19672, + "f3db": 83271890.0, + "ugf": 257005100.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/sky130/sW0.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW0.5_sL1.5/specs.json new file mode 100644 index 00000000..4987ddf1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW0.5_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 49960000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 10.19672, + "f3db": 83271890.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/sky130/sW0.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW0.5_sL1.5/target.spice new file mode 100644 index 00000000..2800ba3a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW0.5_sL1.5/target.spice @@ -0,0 +1,4 @@ +.subckt C15_sky130_sW0.5_sL1.5 VDD VSS VIN1 VOUT1 +XM1 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=1 l=0.45 nf=2 +XRR1 VDD VOUT1 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +.ends C15_sky130_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C15/sky130/sW0.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW0.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..8bede5df --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW0.5_sL1.5/target_lvs.spice @@ -0,0 +1,5 @@ +.subckt C15_sky130_sW0.5_sL1.5 VDD VSS VIN1 VOUT1 +XM1_f0 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f1 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XRR1 VDD VOUT1 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +.ends C15_sky130_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C15/sky130/sW0.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW0.5_sL1.5/testbench.spice new file mode 100644 index 00000000..2b9fe7e4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW0.5_sL1.5/testbench.spice @@ -0,0 +1,26 @@ +X1 VDD VSS VIN1 VOUT1 C15_sky130_sW0.5_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 + +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C15/sky130/sW0.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW0.5_sL1/case.json new file mode 100644 index 00000000..a4913e26 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW0.5_sL1/case.json @@ -0,0 +1,77 @@ +{ + "case_id": "C15_sky130_sW0.5_sL1", + "circuit_id": "C15", + "pdk": "sky130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "dut_name": "C15_sky130_sW0.5_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1" + ], + "sizing": { + "M1": { + "w": 1.0, + "l": 0.3, + "nf": 2 + }, + "R1": { + "r": 20000.0, + "body": "VSS", + "w": 0.35, + "l": 17.55 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": {}, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.3, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "505bd95e8dcbbaed", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "R1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/sky130/sW0.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW0.5_sL1/manifest.json new file mode 100644 index 00000000..8f24884b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW0.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "745e092cf8ccc457259044d2434c70740538f9f81f067fb45c730b37f6eda823", + "qualification.json": "f243b7a22e281cbfcc9abc00599a7f01756ea1aa026c03327cb84764147d26db", + "specs.json": "95ab91b94c1020607243b0bc8132a01f641890488f194e9bc367f876eee8c9a6", + "target.spice": "aabadc00fd4fbf679dc17e50def99779ea8fd415301a7754e23807672be3f557", + "target_lvs.spice": "66ef931a44ba52a545ea63e101c5d2d478d7a2412b2efac8c15b68ae1d0bd1c0", + "testbench.spice": "42b19cd89d10dc462a9f17fa789ae6294ff1d1e716339f686dace3162093f17f" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/sky130/sW0.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW0.5_sL1/qualification.json new file mode 100644 index 00000000..8da007e6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW0.5_sL1/qualification.json @@ -0,0 +1,71 @@ +{ + "case_id": "C15_sky130_sW0.5_sL1", + "circuit_id": "C15", + "pdk": "sky130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "single", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.3, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "505bd95e8dcbbaed", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 9.121 + }, + "f3db": { + "min": 51370000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 12.12053, + "f3db": 85623300.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 8.9, + "schematic_measures": { + "vout0": 0.9785074, + "vin0": 0.9785074, + "idd": 4.101788e-05, + "gain_lf": 12.12053, + "f3db": 85623300.0, + "ugf": 336160500.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/sky130/sW0.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW0.5_sL1/specs.json new file mode 100644 index 00000000..f0ea5452 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW0.5_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 9.121 + }, + "f3db": { + "min": 51370000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 12.12053, + "f3db": 85623300.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/sky130/sW0.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW0.5_sL1/target.spice new file mode 100644 index 00000000..061ccf2f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW0.5_sL1/target.spice @@ -0,0 +1,4 @@ +.subckt C15_sky130_sW0.5_sL1 VDD VSS VIN1 VOUT1 +XM1 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=1 l=0.3 nf=2 +XRR1 VDD VOUT1 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +.ends C15_sky130_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C15/sky130/sW0.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW0.5_sL1/target_lvs.spice new file mode 100644 index 00000000..a6b740fb --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW0.5_sL1/target_lvs.spice @@ -0,0 +1,5 @@ +.subckt C15_sky130_sW0.5_sL1 VDD VSS VIN1 VOUT1 +XM1_f0 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f1 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XRR1 VDD VOUT1 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +.ends C15_sky130_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C15/sky130/sW0.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW0.5_sL1/testbench.spice new file mode 100644 index 00000000..dc2aef23 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW0.5_sL1/testbench.spice @@ -0,0 +1,26 @@ +X1 VDD VSS VIN1 VOUT1 C15_sky130_sW0.5_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 + +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C15/sky130/sW0.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW0.5_sL2/case.json new file mode 100644 index 00000000..153ec8fc --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW0.5_sL2/case.json @@ -0,0 +1,77 @@ +{ + "case_id": "C15_sky130_sW0.5_sL2", + "circuit_id": "C15", + "pdk": "sky130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "dut_name": "C15_sky130_sW0.5_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1" + ], + "sizing": { + "M1": { + "w": 1.0, + "l": 0.6, + "nf": 2 + }, + "R1": { + "r": 20000.0, + "body": "VSS", + "w": 0.35, + "l": 17.55 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": {}, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.6, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "afaff861fdfe443d", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "R1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/sky130/sW0.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW0.5_sL2/manifest.json new file mode 100644 index 00000000..bd03a7bc --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW0.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "dc0df723c627255ef4ab980455b444604ebaebba45d06a65c28c79445b72b8bc", + "qualification.json": "bbd329b50fd5157a986775a8708b4dfe96a3b35c194a9d795c2e786e82338acf", + "specs.json": "cd902ec6d85eda03562f4139354b582ba7af7fc0be8e1947c9cd16e72622ed24", + "target.spice": "4e15e4b8fd61d8e231f9010e4aed9485bf9d799349ef733deff4630a6204f130", + "target_lvs.spice": "9ecb732b4ac454334cbd2c9c318dc36040ca97265a24b8f1bf1f9817f6094bdd", + "testbench.spice": "e227bef8f939ef03c012f5a6d6737ca03dad0660460993352606b8a6a9a0dff8" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/sky130/sW0.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW0.5_sL2/qualification.json new file mode 100644 index 00000000..7924dcd0 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW0.5_sL2/qualification.json @@ -0,0 +1,71 @@ +{ + "case_id": "C15_sky130_sW0.5_sL2", + "circuit_id": "C15", + "pdk": "sky130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "single", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.6, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "afaff861fdfe443d", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 49210000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 8.726616, + "f3db": 82015780.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 10.2, + "schematic_measures": { + "vout0": 1.069306, + "vin0": 1.069306, + "idd": 3.645686e-05, + "gain_lf": 8.726616, + "f3db": 82015780.0, + "ugf": 209186400.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/sky130/sW0.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW0.5_sL2/specs.json new file mode 100644 index 00000000..2f0c24ce --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW0.5_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 49210000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 8.726616, + "f3db": 82015780.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/sky130/sW0.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW0.5_sL2/target.spice new file mode 100644 index 00000000..05a835a8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW0.5_sL2/target.spice @@ -0,0 +1,4 @@ +.subckt C15_sky130_sW0.5_sL2 VDD VSS VIN1 VOUT1 +XM1 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=1 l=0.6 nf=2 +XRR1 VDD VOUT1 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +.ends C15_sky130_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C15/sky130/sW0.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW0.5_sL2/target_lvs.spice new file mode 100644 index 00000000..b4156d20 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW0.5_sL2/target_lvs.spice @@ -0,0 +1,5 @@ +.subckt C15_sky130_sW0.5_sL2 VDD VSS VIN1 VOUT1 +XM1_f0 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f1 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XRR1 VDD VOUT1 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +.ends C15_sky130_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C15/sky130/sW0.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW0.5_sL2/testbench.spice new file mode 100644 index 00000000..3715bdab --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW0.5_sL2/testbench.spice @@ -0,0 +1,26 @@ +X1 VDD VSS VIN1 VOUT1 C15_sky130_sW0.5_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 + +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1.5_sL1.5/case.json new file mode 100644 index 00000000..96fa9e59 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1.5_sL1.5/case.json @@ -0,0 +1,77 @@ +{ + "case_id": "C15_sky130_sW1.5_sL1.5", + "circuit_id": "C15", + "pdk": "sky130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "dut_name": "C15_sky130_sW1.5_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1" + ], + "sizing": { + "M1": { + "w": 3.0, + "l": 0.45, + "nf": 6 + }, + "R1": { + "r": 20000.0, + "body": "VSS", + "w": 0.35, + "l": 17.55 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": {}, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.45, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "21d648e4ab31c007", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "R1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1.5_sL1.5/manifest.json new file mode 100644 index 00000000..63ea12fe --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "2032a5f83a9dcf0a7047bd52991037b04f7615963bfbf35cb5cab54d1277fc14", + "qualification.json": "54305498e899f81cf0b25db9f4dee6740f818d5e755d36b363e7eef8133053a1", + "specs.json": "f4c23d4264ccb6c057b1c150e46f2c90d95db13453b47cb57fa2b6f7d32498ad", + "target.spice": "bf10c41ad12739e0112a83f7ac83b9b2418361da3d1b0b6f7b19bd6753aad759", + "target_lvs.spice": "0553ecf643b6fa44987b129187643be7d6b3ab4a6870bab79f41d3dc004135ae", + "testbench.spice": "a59616a0c694e5c166f50d0defa27d1f39af0246d68146b74aa2955b32291faf" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1.5_sL1.5/qualification.json new file mode 100644 index 00000000..66c19cc0 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1.5_sL1.5/qualification.json @@ -0,0 +1,71 @@ +{ + "case_id": "C15_sky130_sW1.5_sL1.5", + "circuit_id": "C15", + "pdk": "sky130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "single", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.45, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "21d648e4ab31c007", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 12.95 + }, + "f3db": { + "min": 51250000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 15.95233, + "f3db": 85413490.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 6.0, + "schematic_measures": { + "vout0": 0.8689475, + "vin0": 0.8689475, + "idd": 4.652634e-05, + "gain_lf": 15.95233, + "f3db": 85413490.0, + "ugf": 531470000.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1.5_sL1.5/specs.json new file mode 100644 index 00000000..2a72936f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1.5_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 12.95 + }, + "f3db": { + "min": 51250000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 15.95233, + "f3db": 85413490.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1.5_sL1.5/target.spice new file mode 100644 index 00000000..731d7321 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1.5_sL1.5/target.spice @@ -0,0 +1,4 @@ +.subckt C15_sky130_sW1.5_sL1.5 VDD VSS VIN1 VOUT1 +XM1 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=3 l=0.45 nf=6 +XRR1 VDD VOUT1 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +.ends C15_sky130_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..ef13b4fe --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1.5_sL1.5/target_lvs.spice @@ -0,0 +1,9 @@ +.subckt C15_sky130_sW1.5_sL1.5 VDD VSS VIN1 VOUT1 +XM1_f0 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f1 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f2 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f3 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f4 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f5 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XRR1 VDD VOUT1 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +.ends C15_sky130_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1.5_sL1.5/testbench.spice new file mode 100644 index 00000000..9f8dcafd --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1.5_sL1.5/testbench.spice @@ -0,0 +1,26 @@ +X1 VDD VSS VIN1 VOUT1 C15_sky130_sW1.5_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 + +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1.5_sL1/case.json new file mode 100644 index 00000000..00f8b711 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1.5_sL1/case.json @@ -0,0 +1,77 @@ +{ + "case_id": "C15_sky130_sW1.5_sL1", + "circuit_id": "C15", + "pdk": "sky130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "dut_name": "C15_sky130_sW1.5_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1" + ], + "sizing": { + "M1": { + "w": 3.0, + "l": 0.3, + "nf": 6 + }, + "R1": { + "r": 20000.0, + "body": "VSS", + "w": 0.35, + "l": 17.55 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": {}, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.3, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "4b2112236cbf51db", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "R1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1.5_sL1/manifest.json new file mode 100644 index 00000000..f824b76e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "f67c52a403e28e678634ffb4808623243f8bd83602941b3f426eef33783f1e20", + "qualification.json": "1bbb04e18a7fe291dec3f19c249aa1831a6ddff1624fce34a12891bbcd24a935", + "specs.json": "f2d7e0f3eac03b3db879c0b6b461582acb3cb690d4be58245fd60f5c35bd7640", + "target.spice": "496f2f46305cacde565fd62c7cdb5b95d80fae62678076aa940c868758ffd1d4", + "target_lvs.spice": "e010fb76576c2572fbba4feda00f4f2174d576fde9cc2671370b6b5210d27242", + "testbench.spice": "a3ea526806554dc5381649ac2bec2cbab365a2ea6fcba785c80209038bf79162" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1.5_sL1/qualification.json new file mode 100644 index 00000000..c98cab3c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1.5_sL1/qualification.json @@ -0,0 +1,71 @@ +{ + "case_id": "C15_sky130_sW1.5_sL1", + "circuit_id": "C15", + "pdk": "sky130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "single", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.3, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "4b2112236cbf51db", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 14.39 + }, + "f3db": { + "min": 53550000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 17.39146, + "f3db": 89253290.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 9.4, + "schematic_measures": { + "vout0": 0.8448226, + "vin0": 0.8448226, + "idd": 4.77399e-05, + "gain_lf": 17.39146, + "f3db": 89253290.0, + "ugf": 657617900.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1.5_sL1/specs.json new file mode 100644 index 00000000..dd97fb56 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1.5_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 14.39 + }, + "f3db": { + "min": 53550000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 17.39146, + "f3db": 89253290.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1.5_sL1/target.spice new file mode 100644 index 00000000..f8ec7ae8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1.5_sL1/target.spice @@ -0,0 +1,4 @@ +.subckt C15_sky130_sW1.5_sL1 VDD VSS VIN1 VOUT1 +XM1 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=3 l=0.3 nf=6 +XRR1 VDD VOUT1 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +.ends C15_sky130_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1.5_sL1/target_lvs.spice new file mode 100644 index 00000000..54317d76 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1.5_sL1/target_lvs.spice @@ -0,0 +1,9 @@ +.subckt C15_sky130_sW1.5_sL1 VDD VSS VIN1 VOUT1 +XM1_f0 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f1 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f2 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f3 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f4 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f5 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XRR1 VDD VOUT1 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +.ends C15_sky130_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1.5_sL1/testbench.spice new file mode 100644 index 00000000..57469940 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1.5_sL1/testbench.spice @@ -0,0 +1,26 @@ +X1 VDD VSS VIN1 VOUT1 C15_sky130_sW1.5_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 + +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1.5_sL2/case.json new file mode 100644 index 00000000..4fab399c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1.5_sL2/case.json @@ -0,0 +1,77 @@ +{ + "case_id": "C15_sky130_sW1.5_sL2", + "circuit_id": "C15", + "pdk": "sky130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "dut_name": "C15_sky130_sW1.5_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1" + ], + "sizing": { + "M1": { + "w": 3.0, + "l": 0.6, + "nf": 6 + }, + "R1": { + "r": 20000.0, + "body": "VSS", + "w": 0.35, + "l": 17.55 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": {}, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.6, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "d276f4855c7c1e77", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "R1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1.5_sL2/manifest.json new file mode 100644 index 00000000..8f41e8c6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "efd4ff0e2d483c91d8ccf00b2b47ee60f4dc3a995055cbd6478583fb71599ff4", + "qualification.json": "e3d985c7348342f686063de35ca8e768dd2ee71ed552157a904868ac23e8d48d", + "specs.json": "bb99b6da4409f04909449befe72b97c1dbe4fec24fad02907c73126cea1ec7b6", + "target.spice": "f78fac5ba66ee37381b65c0c8f56c72ddd3c5416693b113553e687730cfa40b7", + "target_lvs.spice": "88fdf0c37c8220f2c974239f7aa80d8dd2df20c5388c83b2bfe61462431005aa", + "testbench.spice": "7279ac668c807598159250db6b314d7bac51aa116523ba88ea1b4ae532037e61" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1.5_sL2/qualification.json new file mode 100644 index 00000000..7c351a25 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1.5_sL2/qualification.json @@ -0,0 +1,71 @@ +{ + "case_id": "C15_sky130_sW1.5_sL2", + "circuit_id": "C15", + "pdk": "sky130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "single", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.6, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "d276f4855c7c1e77", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 11.75 + }, + "f3db": { + "min": 49980000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 14.74626, + "f3db": 83303350.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 8.7, + "schematic_measures": { + "vout0": 0.8960326, + "vin0": 0.8960326, + "idd": 4.516411e-05, + "gain_lf": 14.74626, + "f3db": 83303350.0, + "ugf": 448768800.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1.5_sL2/specs.json new file mode 100644 index 00000000..c50b8b53 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1.5_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 11.75 + }, + "f3db": { + "min": 49980000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 14.74626, + "f3db": 83303350.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1.5_sL2/target.spice new file mode 100644 index 00000000..6b0f0337 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1.5_sL2/target.spice @@ -0,0 +1,4 @@ +.subckt C15_sky130_sW1.5_sL2 VDD VSS VIN1 VOUT1 +XM1 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=3 l=0.6 nf=6 +XRR1 VDD VOUT1 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +.ends C15_sky130_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1.5_sL2/target_lvs.spice new file mode 100644 index 00000000..4ab5fffd --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1.5_sL2/target_lvs.spice @@ -0,0 +1,9 @@ +.subckt C15_sky130_sW1.5_sL2 VDD VSS VIN1 VOUT1 +XM1_f0 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f1 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f2 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f3 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f4 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f5 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XRR1 VDD VOUT1 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +.ends C15_sky130_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1.5_sL2/testbench.spice new file mode 100644 index 00000000..85699c98 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1.5_sL2/testbench.spice @@ -0,0 +1,26 @@ +X1 VDD VSS VIN1 VOUT1 C15_sky130_sW1.5_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 + +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1_sL1.5/case.json new file mode 100644 index 00000000..ad336c9b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1_sL1.5/case.json @@ -0,0 +1,77 @@ +{ + "case_id": "C15_sky130_sW1_sL1.5", + "circuit_id": "C15", + "pdk": "sky130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "dut_name": "C15_sky130_sW1_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.45, + "nf": 4 + }, + "R1": { + "r": 20000.0, + "body": "VSS", + "w": 0.35, + "l": 17.55 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": {}, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "369d8c947d175331", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "R1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1_sL1.5/manifest.json new file mode 100644 index 00000000..4ed2b274 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "9af73bbeaddcdce674020d2f1aaa3813e808497cf5476070813310b0f5f309e7", + "qualification.json": "0f04d894b56f994d01c0f34622034ca9f07c93158aeaef7398e225a8fc88982e", + "specs.json": "eb2d2be56ce1bf8565906f5fb28e3940703657047763220148ab61ed9e09782f", + "target.spice": "24085716706f8df460d9cca69243f9e210829e283c78c2dbb60cf98248cdd8a6", + "target_lvs.spice": "fe7051dc0690d6abc8bb778a4356f6e272e72ddfe47076b636ade958a13db2cc", + "testbench.spice": "56949a3d440aff2d67b0a11b7f2549eeee6d05d326c7aa05af1f91daab058b3f" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1_sL1.5/qualification.json new file mode 100644 index 00000000..bd14d22a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1_sL1.5/qualification.json @@ -0,0 +1,71 @@ +{ + "case_id": "C15_sky130_sW1_sL1.5", + "circuit_id": "C15", + "pdk": "sky130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "single", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "369d8c947d175331", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 10.94 + }, + "f3db": { + "min": 50790000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 13.94361, + "f3db": 84652550.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 8.4, + "schematic_measures": { + "vout0": 0.9196854, + "vin0": 0.9196854, + "idd": 4.397473e-05, + "gain_lf": 13.94361, + "f3db": 84652550.0, + "ugf": 414579500.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1_sL1.5/specs.json new file mode 100644 index 00000000..754eb33e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 10.94 + }, + "f3db": { + "min": 50790000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 13.94361, + "f3db": 84652550.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1_sL1.5/target.spice new file mode 100644 index 00000000..359f76cf --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1_sL1.5/target.spice @@ -0,0 +1,4 @@ +.subckt C15_sky130_sW1_sL1.5 VDD VSS VIN1 VOUT1 +XM1 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=2 l=0.45 nf=4 +XRR1 VDD VOUT1 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +.ends C15_sky130_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1_sL1.5/target_lvs.spice new file mode 100644 index 00000000..9ea2c358 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1_sL1.5/target_lvs.spice @@ -0,0 +1,7 @@ +.subckt C15_sky130_sW1_sL1.5 VDD VSS VIN1 VOUT1 +XM1_f0 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f1 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f2 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f3 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XRR1 VDD VOUT1 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +.ends C15_sky130_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1_sL1.5/testbench.spice new file mode 100644 index 00000000..ed95e219 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1_sL1.5/testbench.spice @@ -0,0 +1,26 @@ +X1 VDD VSS VIN1 VOUT1 C15_sky130_sW1_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 + +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1_sL1/case.json new file mode 100644 index 00000000..53ae5ffc --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1_sL1/case.json @@ -0,0 +1,77 @@ +{ + "case_id": "C15_sky130_sW1_sL1", + "circuit_id": "C15", + "pdk": "sky130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "dut_name": "C15_sky130_sW1_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.3, + "nf": 4 + }, + "R1": { + "r": 20000.0, + "body": "VSS", + "w": 0.35, + "l": 17.55 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": {}, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "0f19065f287c7cfb", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "R1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1_sL1/manifest.json new file mode 100644 index 00000000..8332bbc8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "895b36da7297e069f2caf4fca831bef2324a49f249a18880f3d19a67bcadaa52", + "qualification.json": "1d0cd61f2cf0f2ac0ec01a6082c3d65badc42bae82f10f48a4ed21c7a9353032", + "specs.json": "a5558b358b308235c1eb5aac7aac9e34ef9b33a140adb1e4bea0c25e9b805878", + "target.spice": "4ac2c66f4b989e7d6dbe32dddc1a086838552f867e76bb52a6674675a0b15655", + "target_lvs.spice": "a2e3d549f596d8aa2f15f106770acf4680d56996d73d61a55bf80157fef29903", + "testbench.spice": "81ec1dc0ac5d600c1634edcfa8fed8bc8c00d7d638a2cd2246225b62fa5810be" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1_sL1/qualification.json new file mode 100644 index 00000000..350d06ed --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1_sL1/qualification.json @@ -0,0 +1,71 @@ +{ + "case_id": "C15_sky130_sW1_sL1", + "circuit_id": "C15", + "pdk": "sky130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "single", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "0f19065f287c7cfb", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 12.61 + }, + "f3db": { + "min": 52730000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 15.61151, + "f3db": 87882490.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 7.8, + "schematic_measures": { + "vout0": 0.8878716, + "vin0": 0.8878716, + "idd": 4.557453e-05, + "gain_lf": 15.61151, + "f3db": 87882490.0, + "ugf": 525014400.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1_sL1/specs.json new file mode 100644 index 00000000..5accc0ac --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 12.61 + }, + "f3db": { + "min": 52730000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 15.61151, + "f3db": 87882490.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1_sL1/target.spice new file mode 100644 index 00000000..aa85069f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1_sL1/target.spice @@ -0,0 +1,4 @@ +.subckt C15_sky130_sW1_sL1 VDD VSS VIN1 VOUT1 +XM1 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=2 l=0.3 nf=4 +XRR1 VDD VOUT1 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +.ends C15_sky130_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1_sL1/target_lvs.spice new file mode 100644 index 00000000..c1b1c1e4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1_sL1/target_lvs.spice @@ -0,0 +1,7 @@ +.subckt C15_sky130_sW1_sL1 VDD VSS VIN1 VOUT1 +XM1_f0 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f1 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f2 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f3 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XRR1 VDD VOUT1 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +.ends C15_sky130_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1_sL1/testbench.spice new file mode 100644 index 00000000..3abe384b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1_sL1/testbench.spice @@ -0,0 +1,26 @@ +X1 VDD VSS VIN1 VOUT1 C15_sky130_sW1_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 + +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1_sL2/case.json new file mode 100644 index 00000000..cda18203 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1_sL2/case.json @@ -0,0 +1,77 @@ +{ + "case_id": "C15_sky130_sW1_sL2", + "circuit_id": "C15", + "pdk": "sky130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "dut_name": "C15_sky130_sW1_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.6, + "nf": 4 + }, + "R1": { + "r": 20000.0, + "body": "VSS", + "w": 0.35, + "l": 17.55 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": {}, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "264ef86abdf63fdf", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "R1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1_sL2/manifest.json new file mode 100644 index 00000000..a3e2891f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "c14fa2e9c212395f88de05f203950ec1885c15c236a7fd6d81e7bccadeed7d21", + "qualification.json": "dcce383dccdb91c657dafa26fedb88ed654b40a165c65cff962524098e214808", + "specs.json": "48504ba14b5d5536015e6a6324c5eb32a794835b9fb66435ce33b2258ff9a07b", + "target.spice": "d8761ae17b9b79eb5754f0e4189f6a1011969ae11cb1363d50edb63340915682", + "target_lvs.spice": "1fa7ed07dee97cb8272436a9e8aaf976cef342adc02acca1a0dc21efd1161563", + "testbench.spice": "fc4ec9575cb8440285c3bc23ae4f75bfda036c46d40afa187201bac2a44a5a05" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1_sL2/qualification.json new file mode 100644 index 00000000..e0f3fd8b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1_sL2/qualification.json @@ -0,0 +1,71 @@ +{ + "case_id": "C15_sky130_sW1_sL2", + "circuit_id": "C15", + "pdk": "sky130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "single", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "264ef86abdf63fdf", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 9.617 + }, + "f3db": { + "min": 49750000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 12.6172, + "f3db": 82912590.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 10.3, + "schematic_measures": { + "vout0": 0.9527432, + "vin0": 0.9527432, + "idd": 4.23128e-05, + "gain_lf": 12.6172, + "f3db": 82912590.0, + "ugf": 345835500.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1_sL2/specs.json new file mode 100644 index 00000000..9d922daf --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 9.617 + }, + "f3db": { + "min": 49750000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 12.6172, + "f3db": 82912590.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1_sL2/target.spice new file mode 100644 index 00000000..96d66252 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1_sL2/target.spice @@ -0,0 +1,4 @@ +.subckt C15_sky130_sW1_sL2 VDD VSS VIN1 VOUT1 +XM1 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=2 l=0.6 nf=4 +XRR1 VDD VOUT1 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +.ends C15_sky130_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1_sL2/target_lvs.spice new file mode 100644 index 00000000..2e5e7b77 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1_sL2/target_lvs.spice @@ -0,0 +1,7 @@ +.subckt C15_sky130_sW1_sL2 VDD VSS VIN1 VOUT1 +XM1_f0 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f1 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f2 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f3 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XRR1 VDD VOUT1 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +.ends C15_sky130_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1_sL2/testbench.spice new file mode 100644 index 00000000..f2f1084c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW1_sL2/testbench.spice @@ -0,0 +1,26 @@ +X1 VDD VSS VIN1 VOUT1 C15_sky130_sW1_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 + +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C15/sky130/sW2_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW2_sL1.5/case.json new file mode 100644 index 00000000..a9d494b8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW2_sL1.5/case.json @@ -0,0 +1,77 @@ +{ + "case_id": "C15_sky130_sW2_sL1.5", + "circuit_id": "C15", + "pdk": "sky130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "dut_name": "C15_sky130_sW2_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.45, + "nf": 8 + }, + "R1": { + "r": 20000.0, + "body": "VSS", + "w": 0.35, + "l": 17.55 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": {}, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "666425d59334542a", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "R1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/sky130/sW2_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW2_sL1.5/manifest.json new file mode 100644 index 00000000..16e8a56b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW2_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "4acbdbe9ad59c048491430f95987e9120c5708d28c9e622c5466a1b669fd148d", + "qualification.json": "a02876f685ce5553440a3f0c069c233b682755e35f0d94c9f2be92b98289099f", + "specs.json": "b68cacf16e71c4d286773109aa4b7a64edc1d37216d0b47ffb8550360bffd2f3", + "target.spice": "dd09c66527b3583fac11c38367a8e9b4f2c83566a7e8c64b20fc7ff760c4f883", + "target_lvs.spice": "3fa575d1e64186830267a6b6946a0452dab802af41e82d55c386a6690a1c50ed", + "testbench.spice": "182bd7997891c758f56a09f87189a7059e527b05f25a4fde2ffa40a76c34f6a4" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/sky130/sW2_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW2_sL1.5/qualification.json new file mode 100644 index 00000000..15f7109d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW2_sL1.5/qualification.json @@ -0,0 +1,71 @@ +{ + "case_id": "C15_sky130_sW2_sL1.5", + "circuit_id": "C15", + "pdk": "sky130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "single", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "666425d59334542a", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 14.28 + }, + "f3db": { + "min": 51540000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 17.27803, + "f3db": 85900090.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 9.1, + "schematic_measures": { + "vout0": 0.8373893, + "vin0": 0.8373893, + "idd": 4.811385e-05, + "gain_lf": 17.27803, + "f3db": 85900090.0, + "ugf": 624330000.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/sky130/sW2_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW2_sL1.5/specs.json new file mode 100644 index 00000000..5226b565 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW2_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 14.28 + }, + "f3db": { + "min": 51540000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 17.27803, + "f3db": 85900090.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/sky130/sW2_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW2_sL1.5/target.spice new file mode 100644 index 00000000..7ecc6b1f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW2_sL1.5/target.spice @@ -0,0 +1,4 @@ +.subckt C15_sky130_sW2_sL1.5 VDD VSS VIN1 VOUT1 +XM1 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=4 l=0.45 nf=8 +XRR1 VDD VOUT1 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +.ends C15_sky130_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C15/sky130/sW2_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW2_sL1.5/target_lvs.spice new file mode 100644 index 00000000..3334ccb5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW2_sL1.5/target_lvs.spice @@ -0,0 +1,11 @@ +.subckt C15_sky130_sW2_sL1.5 VDD VSS VIN1 VOUT1 +XM1_f0 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f1 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f2 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f3 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f4 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f5 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f6 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f7 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XRR1 VDD VOUT1 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +.ends C15_sky130_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C15/sky130/sW2_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW2_sL1.5/testbench.spice new file mode 100644 index 00000000..d6caef8a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW2_sL1.5/testbench.spice @@ -0,0 +1,26 @@ +X1 VDD VSS VIN1 VOUT1 C15_sky130_sW2_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 + +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C15/sky130/sW2_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW2_sL1/case.json new file mode 100644 index 00000000..51aef486 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW2_sL1/case.json @@ -0,0 +1,77 @@ +{ + "case_id": "C15_sky130_sW2_sL1", + "circuit_id": "C15", + "pdk": "sky130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "dut_name": "C15_sky130_sW2_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.3, + "nf": 8 + }, + "R1": { + "r": 20000.0, + "body": "VSS", + "w": 0.35, + "l": 17.55 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": {}, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "6211f14f6e3e3a9d", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "R1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/sky130/sW2_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW2_sL1/manifest.json new file mode 100644 index 00000000..8dcda990 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW2_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "de4ad79a4ab635199b4461783a55fa58e40990202a8a09806537aa961003a85f", + "qualification.json": "90f3705a328725959221effd348f158d52e7d774e7e3e51a8cb0dbeff8f38228", + "specs.json": "5cd2b55f5e63d0c61bd25ae8505e1fba3199a3ead34bb0ebcf5304fbb2deac40", + "target.spice": "201cf5f5de04879fb404ce7c80df0ab7a86297054f15c164baf83f1223e57208", + "target_lvs.spice": "8fc732ee7357feb7695e2dc4ed0af9cb9623a389da48a63ead4157bb76e8957d", + "testbench.spice": "592ab8b153e3cfdd14da74629654b8b842cc17eac1aa848b06effb5df777451a" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/sky130/sW2_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW2_sL1/qualification.json new file mode 100644 index 00000000..973db194 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW2_sL1/qualification.json @@ -0,0 +1,71 @@ +{ + "case_id": "C15_sky130_sW2_sL1", + "circuit_id": "C15", + "pdk": "sky130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "single", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "6211f14f6e3e3a9d", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 15.52 + }, + "f3db": { + "min": 54130000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 18.52396, + "f3db": 90209280.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 9.4, + "schematic_measures": { + "vout0": 0.8179266, + "vin0": 0.8179266, + "idd": 4.909307e-05, + "gain_lf": 18.52396, + "f3db": 90209280.0, + "ugf": 759025500.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/sky130/sW2_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW2_sL1/specs.json new file mode 100644 index 00000000..dbc4cbd9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW2_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 15.52 + }, + "f3db": { + "min": 54130000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 18.52396, + "f3db": 90209280.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/sky130/sW2_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW2_sL1/target.spice new file mode 100644 index 00000000..6c4567e2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW2_sL1/target.spice @@ -0,0 +1,4 @@ +.subckt C15_sky130_sW2_sL1 VDD VSS VIN1 VOUT1 +XM1 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=4 l=0.3 nf=8 +XRR1 VDD VOUT1 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +.ends C15_sky130_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C15/sky130/sW2_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW2_sL1/target_lvs.spice new file mode 100644 index 00000000..64521712 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW2_sL1/target_lvs.spice @@ -0,0 +1,11 @@ +.subckt C15_sky130_sW2_sL1 VDD VSS VIN1 VOUT1 +XM1_f0 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f1 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f2 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f3 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f4 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f5 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f6 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f7 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XRR1 VDD VOUT1 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +.ends C15_sky130_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C15/sky130/sW2_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW2_sL1/testbench.spice new file mode 100644 index 00000000..e0998a6a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW2_sL1/testbench.spice @@ -0,0 +1,26 @@ +X1 VDD VSS VIN1 VOUT1 C15_sky130_sW2_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 + +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C15/sky130/sW2_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW2_sL2/case.json new file mode 100644 index 00000000..9752a662 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW2_sL2/case.json @@ -0,0 +1,77 @@ +{ + "case_id": "C15_sky130_sW2_sL2", + "circuit_id": "C15", + "pdk": "sky130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "dut_name": "C15_sky130_sW2_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.6, + "nf": 8 + }, + "R1": { + "r": 20000.0, + "body": "VSS", + "w": 0.35, + "l": 17.55 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": {}, + "load": { + "CL": 1e-13 + }, + "category": "single", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "3a8e9c122c45c82e", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "testbench_element", + "what": "DC servo (1 MH / 1 MF) setting V_in,dc = V_out,dc" + }, + { + "kind": "testbench_element", + "what": "load capacitor" + } + ], + "core_devices": [ + "M1", + "R1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/sky130/sW2_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW2_sL2/manifest.json new file mode 100644 index 00000000..9ae28358 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW2_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "33be72cf85f292b604a9b8c0cd5cd47f33806423668ce0f24393dcf9f6e25c01", + "qualification.json": "4fccbdb5766665bd7cb9db74257fdf6495a368de95b73ecba706f1a6c1322097", + "specs.json": "db6b55ac0125b67135651803dd60dc3acbddf0444a3634cb40941fde7b05f7c3", + "target.spice": "1a8c047240776098d2dfd329e088a8a6385e5d4c716b37236fab113240aede6b", + "target_lvs.spice": "db5eaf23bb80ba591f0bc155b9a0846a134c2b63382dba7df0f91a48d60f30d3", + "testbench.spice": "ccc21915563993717574cd86e8c4b8e7e5945db78dbc6de5bf65706acb4e4818" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/sky130/sW2_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW2_sL2/qualification.json new file mode 100644 index 00000000..95e61f57 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW2_sL2/qualification.json @@ -0,0 +1,71 @@ +{ + "case_id": "C15_sky130_sW2_sL2", + "circuit_id": "C15", + "pdk": "sky130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "single", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "3a8e9c122c45c82e", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 13.18 + }, + "f3db": { + "min": 50090000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 16.1788, + "f3db": 83489130.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 6.1, + "schematic_measures": { + "vout0": 0.8606514, + "vin0": 0.8606514, + "idd": 4.694364e-05, + "gain_lf": 16.1788, + "f3db": 83489130.0, + "ugf": 534006600.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/sky130/sW2_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW2_sL2/specs.json new file mode 100644 index 00000000..d12045fb --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW2_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 13.18 + }, + "f3db": { + "min": 50090000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 16.1788, + "f3db": 83489130.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C15/sky130/sW2_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW2_sL2/target.spice new file mode 100644 index 00000000..3db78530 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW2_sL2/target.spice @@ -0,0 +1,4 @@ +.subckt C15_sky130_sW2_sL2 VDD VSS VIN1 VOUT1 +XM1 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=4 l=0.6 nf=8 +XRR1 VDD VOUT1 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +.ends C15_sky130_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C15/sky130/sW2_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW2_sL2/target_lvs.spice new file mode 100644 index 00000000..5250669a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW2_sL2/target_lvs.spice @@ -0,0 +1,11 @@ +.subckt C15_sky130_sW2_sL2 VDD VSS VIN1 VOUT1 +XM1_f0 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f1 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f2 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f3 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f4 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f5 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f6 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f7 VOUT1 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XRR1 VDD VOUT1 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +.ends C15_sky130_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C15/sky130/sW2_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW2_sL2/testbench.spice new file mode 100644 index 00000000..fed2c729 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C15/sky130/sW2_sL2/testbench.spice @@ -0,0 +1,26 @@ +X1 VDD VSS VIN1 VOUT1 C15_sky130_sW2_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 + +* DC servo (disclosed): V_in,dc follows V_out,dc through LFB (open at AC); AC drive through CIN +LFB VOUT1 VIN1 1e6 +CIN VAC VIN1 1e6 +VAC VAC 0 dc 0 ac 1 +CL VOUT1 0 1e-13 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let idd = -i(VDD) +print vout0 vin0 idd +ac dec 20 10 100G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C16/gf180/sW0.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW0.5_sL1.5/case.json new file mode 100644 index 00000000..e68af8fa --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW0.5_sL1.5/case.json @@ -0,0 +1,117 @@ +{ + "case_id": "C16_gf180_sW0.5_sL1.5", + "circuit_id": "C16", + "pdk": "gf180", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "dut_name": "C16_gf180_sW0.5_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "IB1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.84, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 0.84, + "nf": 4 + }, + "R1": { + "r": 40000.0, + "body": "VSS", + "w": 1.0, + "l": 60.0 + }, + "R2": { + "r": 40000.0, + "body": "VSS", + "w": 1.0, + "l": 60.0 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 4e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 1.5, + "CL": 1e-13 + }, + "category": "diff_r", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "137e08d7f3f3e764", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "R1", + "R2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/gf180/sW0.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW0.5_sL1.5/manifest.json new file mode 100644 index 00000000..142e7884 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW0.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "6b7479ea2ea69db18f61c11ad1f4f7ec200eaec96c1563fcfad6b40edf33e28d", + "qualification.json": "d185ed072eee1d7c82d613e4877fb7c8c476db337ad0f422d0e4f1d66e0f7d96", + "specs.json": "a128fe7e52d2f46c7e95c1a5bb5e7581f3d12506ee97f4f85360237f86afd426", + "target.spice": "98a12ea3015f142bcab0ea7d53955f25c2f2255deafdec4fd5653340da4ff616", + "target_lvs.spice": "49665613561a49becf4a88d466b04d9ddff82a5b7c7f66eb929fe2dfeb5e6c42", + "testbench.spice": "9722597c40564904daa69f5b691dadad181dea8c3a6731a4d669550f2cd1448a" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/gf180/sW0.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW0.5_sL1.5/qualification.json new file mode 100644 index 00000000..61072b5d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW0.5_sL1.5/qualification.json @@ -0,0 +1,86 @@ +{ + "case_id": "C16_gf180_sW0.5_sL1.5", + "circuit_id": "C16", + "pdk": "gf180", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "diff_r", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "137e08d7f3f3e764", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "gain_lf=6.852 below floor 8" + ], + "spec": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 41370000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 6.852083, + "f3db": 68950960.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vo1": 2.854718, + "vo2": 2.854718, + "idd": 4.00241e-05, + "vos_in": 0.0, + "gain_lf": 6.852083, + "f3db": 68950960.0, + "ugf": 135645000.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/gf180/sW0.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW0.5_sL1.5/specs.json new file mode 100644 index 00000000..cc2aa637 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW0.5_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 41370000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 6.852083, + "f3db": 68950960.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/gf180/sW0.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW0.5_sL1.5/target.spice new file mode 100644 index 00000000..758c2787 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW0.5_sL1.5/target.spice @@ -0,0 +1,6 @@ +.subckt C16_gf180_sW0.5_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 +MM1 VOUT1 VIN1 IB1 VSS nfet_03v3 w=2u l=0.84u nf=4 m=1 +MM2 VOUT2 VIN2 IB1 VSS nfet_03v3 w=2u l=0.84u nf=4 m=1 +XRR1 VDD VOUT1 VSS ppolyf_u r_width=1u r_length=60u +XRR2 VDD VOUT2 VSS ppolyf_u r_width=1u r_length=60u +.ends C16_gf180_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C16/gf180/sW0.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW0.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..506d17de --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW0.5_sL1.5/target_lvs.spice @@ -0,0 +1,12 @@ +.subckt C16_gf180_sW0.5_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 +MM1_f0 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f1 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f2 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f3 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f0 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f1 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f2 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f3 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +RR1 VDD VOUT1 VSS ppolyf_u L=60u W=1u +RR2 VDD VOUT2 VSS ppolyf_u L=60u W=1u +.ends C16_gf180_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C16/gf180/sW0.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW0.5_sL1.5/testbench.spice new file mode 100644 index 00000000..bb6b47df --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW0.5_sL1.5/testbench.spice @@ -0,0 +1,40 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 C16_gf180_sW0.5_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIB1 IB1 VSS 4e-05 +.nodeset v(IB1)=2.31 + +VCM VCM 0 1.5 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C16/gf180/sW0.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW0.5_sL1/case.json new file mode 100644 index 00000000..6f666277 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW0.5_sL1/case.json @@ -0,0 +1,117 @@ +{ + "case_id": "C16_gf180_sW0.5_sL1", + "circuit_id": "C16", + "pdk": "gf180", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "dut_name": "C16_gf180_sW0.5_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "IB1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.56, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 0.56, + "nf": 4 + }, + "R1": { + "r": 40000.0, + "body": "VSS", + "w": 1.0, + "l": 60.0 + }, + "R2": { + "r": 40000.0, + "body": "VSS", + "w": 1.0, + "l": 60.0 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 4e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 1.5, + "CL": 1e-13 + }, + "category": "diff_r", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "104c0497b6755bd9", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "R1", + "R2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/gf180/sW0.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW0.5_sL1/manifest.json new file mode 100644 index 00000000..f4146530 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW0.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "49f9c83e3c18429681544e8e7154692c91a6175f27d9f93562c525c87ef54485", + "qualification.json": "fb5b9dc6c81993ac08bffeeade861fb9ee721586b187bd4edbbb4300403ef454", + "specs.json": "810873f715ed2cdc7370848ba909a6b0e3ad4a670fbe5c271545663fe1e1543e", + "target.spice": "f717a721203c615baf0fc236093a0962dacaead215643623105cfb44305bd2bc", + "target_lvs.spice": "2c74c5f47d9ee2b55bf4db8b347cb3564e09adf0c5d9df29ef87bee6b4ce1eb9", + "testbench.spice": "d03636a71b5adb3a7a2a042aa485c5573a0c9e94d92a4541e2659e18aebf79cf" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/gf180/sW0.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW0.5_sL1/qualification.json new file mode 100644 index 00000000..83f56db8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW0.5_sL1/qualification.json @@ -0,0 +1,84 @@ +{ + "case_id": "C16_gf180_sW0.5_sL1", + "circuit_id": "C16", + "pdk": "gf180", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "diff_r", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "104c0497b6755bd9", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 41640000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 8.6615, + "f3db": 69405180.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vo1": 2.854677, + "vo2": 2.854677, + "idd": 4.002774e-05, + "vos_in": 3.637979e-12, + "gain_lf": 8.6615, + "f3db": 69405180.0, + "ugf": 175383000.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/gf180/sW0.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW0.5_sL1/specs.json new file mode 100644 index 00000000..456ffb1d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW0.5_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 41640000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 8.6615, + "f3db": 69405180.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/gf180/sW0.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW0.5_sL1/target.spice new file mode 100644 index 00000000..f734ef30 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW0.5_sL1/target.spice @@ -0,0 +1,6 @@ +.subckt C16_gf180_sW0.5_sL1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 +MM1 VOUT1 VIN1 IB1 VSS nfet_03v3 w=2u l=0.56u nf=4 m=1 +MM2 VOUT2 VIN2 IB1 VSS nfet_03v3 w=2u l=0.56u nf=4 m=1 +XRR1 VDD VOUT1 VSS ppolyf_u r_width=1u r_length=60u +XRR2 VDD VOUT2 VSS ppolyf_u r_width=1u r_length=60u +.ends C16_gf180_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C16/gf180/sW0.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW0.5_sL1/target_lvs.spice new file mode 100644 index 00000000..94e0a68f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW0.5_sL1/target_lvs.spice @@ -0,0 +1,12 @@ +.subckt C16_gf180_sW0.5_sL1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 +MM1_f0 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f1 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f2 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f3 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f0 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f1 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f2 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f3 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +RR1 VDD VOUT1 VSS ppolyf_u L=60u W=1u +RR2 VDD VOUT2 VSS ppolyf_u L=60u W=1u +.ends C16_gf180_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C16/gf180/sW0.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW0.5_sL1/testbench.spice new file mode 100644 index 00000000..f485f798 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW0.5_sL1/testbench.spice @@ -0,0 +1,40 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 C16_gf180_sW0.5_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIB1 IB1 VSS 4e-05 +.nodeset v(IB1)=2.31 + +VCM VCM 0 1.5 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C16/gf180/sW0.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW0.5_sL2/case.json new file mode 100644 index 00000000..34007a19 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW0.5_sL2/case.json @@ -0,0 +1,117 @@ +{ + "case_id": "C16_gf180_sW0.5_sL2", + "circuit_id": "C16", + "pdk": "gf180", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "dut_name": "C16_gf180_sW0.5_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "IB1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 1.12, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 1.12, + "nf": 4 + }, + "R1": { + "r": 40000.0, + "body": "VSS", + "w": 1.0, + "l": 60.0 + }, + "R2": { + "r": 40000.0, + "body": "VSS", + "w": 1.0, + "l": 60.0 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 4e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 1.5, + "CL": 1e-13 + }, + "category": "diff_r", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "c89d1ef4a42f7ea3", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "R1", + "R2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/gf180/sW0.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW0.5_sL2/manifest.json new file mode 100644 index 00000000..0acb176f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW0.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "19b387fdc6b2373a1db611fd03f9c0e5aa426b6ccf8a501d317de171c9808fba", + "qualification.json": "f9a6e64c31b80ac625eb80576280e7cf353588d1f99ca24312cab78f0b77e4fb", + "specs.json": "41ab8dd289caa080f8a3fd209183645afd94df5d7ec5ae924ace6eedd6645822", + "target.spice": "780be7282af0b566bc5ce311954696595a856e95a8fdfe95e28c697e57b1be8a", + "target_lvs.spice": "84787b506d1155472d83d20d3d502fd6f5e3279882592bbe18896316d93f5e37", + "testbench.spice": "13622d99ca97e9b68da67d5e67818ceb5489fd3f708f597d7681068d01614ad5" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/gf180/sW0.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW0.5_sL2/qualification.json new file mode 100644 index 00000000..05351316 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW0.5_sL2/qualification.json @@ -0,0 +1,86 @@ +{ + "case_id": "C16_gf180_sW0.5_sL2", + "circuit_id": "C16", + "pdk": "gf180", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "diff_r", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "c89d1ef4a42f7ea3", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "gain_lf=5.577 below floor 8" + ], + "spec": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 41280000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 5.577394, + "f3db": 68802710.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vo1": 2.854768, + "vo2": 2.854768, + "idd": 4.001955e-05, + "vos_in": 0.0, + "gain_lf": 5.577394, + "f3db": 68802710.0, + "ugf": 111493500.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/gf180/sW0.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW0.5_sL2/specs.json new file mode 100644 index 00000000..9e50bd49 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW0.5_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 41280000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 5.577394, + "f3db": 68802710.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/gf180/sW0.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW0.5_sL2/target.spice new file mode 100644 index 00000000..fe53a2dd --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW0.5_sL2/target.spice @@ -0,0 +1,6 @@ +.subckt C16_gf180_sW0.5_sL2 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 +MM1 VOUT1 VIN1 IB1 VSS nfet_03v3 w=2u l=1.12u nf=4 m=1 +MM2 VOUT2 VIN2 IB1 VSS nfet_03v3 w=2u l=1.12u nf=4 m=1 +XRR1 VDD VOUT1 VSS ppolyf_u r_width=1u r_length=60u +XRR2 VDD VOUT2 VSS ppolyf_u r_width=1u r_length=60u +.ends C16_gf180_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C16/gf180/sW0.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW0.5_sL2/target_lvs.spice new file mode 100644 index 00000000..3378c096 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW0.5_sL2/target_lvs.spice @@ -0,0 +1,12 @@ +.subckt C16_gf180_sW0.5_sL2 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 +MM1_f0 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f1 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f2 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f3 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f0 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f1 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f2 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f3 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +RR1 VDD VOUT1 VSS ppolyf_u L=60u W=1u +RR2 VDD VOUT2 VSS ppolyf_u L=60u W=1u +.ends C16_gf180_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C16/gf180/sW0.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW0.5_sL2/testbench.spice new file mode 100644 index 00000000..a0334335 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW0.5_sL2/testbench.spice @@ -0,0 +1,40 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 C16_gf180_sW0.5_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIB1 IB1 VSS 4e-05 +.nodeset v(IB1)=2.31 + +VCM VCM 0 1.5 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1.5_sL1.5/case.json new file mode 100644 index 00000000..eeee1d56 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1.5_sL1.5/case.json @@ -0,0 +1,117 @@ +{ + "case_id": "C16_gf180_sW1.5_sL1.5", + "circuit_id": "C16", + "pdk": "gf180", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "dut_name": "C16_gf180_sW1.5_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "IB1" + ], + "sizing": { + "M1": { + "w": 6.0, + "l": 0.84, + "nf": 12 + }, + "M2": { + "w": 6.0, + "l": 0.84, + "nf": 12 + }, + "R1": { + "r": 40000.0, + "body": "VSS", + "w": 1.0, + "l": 60.0 + }, + "R2": { + "r": 40000.0, + "body": "VSS", + "w": 1.0, + "l": 60.0 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 4e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 1.5, + "CL": 1e-13 + }, + "category": "diff_r", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "9d9530d415cc31cd", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "R1", + "R2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1.5_sL1.5/manifest.json new file mode 100644 index 00000000..d425d7d2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "79c14712b44a543f581cd19e3aed262aab4f3f1658935e5ecff4d4da72d7deca", + "qualification.json": "5b757aedc8fe0f3677ce918d2116445e9515f672601b4520da61209fec124c3f", + "specs.json": "227fed9ff54260050dbcc7025cf52ba2d58106329a04c2677d5edf88de99df85", + "target.spice": "6c7fb86bb44cabf75a57959000e4505fd9e9d47b174a7187d02da9475929a1c1", + "target_lvs.spice": "fd1456a0c611d85b7b91b0fedb28c4e6c90fe6a1e160124fea4a9b148eacaec1", + "testbench.spice": "5bd11ffb8597581cecd5f907687e1fa6f04a1c18f5bab9b9e3f961a303b55007" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1.5_sL1.5/qualification.json new file mode 100644 index 00000000..c82d4903 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1.5_sL1.5/qualification.json @@ -0,0 +1,84 @@ +{ + "case_id": "C16_gf180_sW1.5_sL1.5", + "circuit_id": "C16", + "pdk": "gf180", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "diff_r", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "9d9530d415cc31cd", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 8.579 + }, + "f3db": { + "min": 40030000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 11.57911, + "f3db": 66720130.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vo1": 2.854718, + "vo2": 2.854718, + "idd": 4.002409e-05, + "vos_in": 0.0, + "gain_lf": 11.57911, + "f3db": 66720130.0, + "ugf": 245177300.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1.5_sL1.5/specs.json new file mode 100644 index 00000000..6b494d35 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1.5_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 8.579 + }, + "f3db": { + "min": 40030000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 11.57911, + "f3db": 66720130.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1.5_sL1.5/target.spice new file mode 100644 index 00000000..1d923ec1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1.5_sL1.5/target.spice @@ -0,0 +1,6 @@ +.subckt C16_gf180_sW1.5_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 +MM1 VOUT1 VIN1 IB1 VSS nfet_03v3 w=6u l=0.84u nf=12 m=1 +MM2 VOUT2 VIN2 IB1 VSS nfet_03v3 w=6u l=0.84u nf=12 m=1 +XRR1 VDD VOUT1 VSS ppolyf_u r_width=1u r_length=60u +XRR2 VDD VOUT2 VSS ppolyf_u r_width=1u r_length=60u +.ends C16_gf180_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..59e0434b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1.5_sL1.5/target_lvs.spice @@ -0,0 +1,28 @@ +.subckt C16_gf180_sW1.5_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 +MM1_f0 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f1 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f2 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f3 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f4 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f5 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f6 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f7 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f8 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f9 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f10 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f11 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f0 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f1 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f2 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f3 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f4 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f5 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f6 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f7 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f8 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f9 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f10 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f11 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +RR1 VDD VOUT1 VSS ppolyf_u L=60u W=1u +RR2 VDD VOUT2 VSS ppolyf_u L=60u W=1u +.ends C16_gf180_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1.5_sL1.5/testbench.spice new file mode 100644 index 00000000..25a2b77f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1.5_sL1.5/testbench.spice @@ -0,0 +1,40 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 C16_gf180_sW1.5_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIB1 IB1 VSS 4e-05 +.nodeset v(IB1)=2.31 + +VCM VCM 0 1.5 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1.5_sL1/case.json new file mode 100644 index 00000000..dffa446f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1.5_sL1/case.json @@ -0,0 +1,117 @@ +{ + "case_id": "C16_gf180_sW1.5_sL1", + "circuit_id": "C16", + "pdk": "gf180", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "dut_name": "C16_gf180_sW1.5_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "IB1" + ], + "sizing": { + "M1": { + "w": 6.0, + "l": 0.56, + "nf": 12 + }, + "M2": { + "w": 6.0, + "l": 0.56, + "nf": 12 + }, + "R1": { + "r": 40000.0, + "body": "VSS", + "w": 1.0, + "l": 60.0 + }, + "R2": { + "r": 40000.0, + "body": "VSS", + "w": 1.0, + "l": 60.0 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 4e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 1.5, + "CL": 1e-13 + }, + "category": "diff_r", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "c334fe9064288036", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "R1", + "R2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1.5_sL1/manifest.json new file mode 100644 index 00000000..a584f7f1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "6e95b46bb40f13370c8bd451eed6a8f2f23e838890a5836f3dc29f285068dd9d", + "qualification.json": "3cd3f8e3e058203a9ef5a4d44cea688e00584823afbece4df28c960cfdd97f11", + "specs.json": "a144d37970a4352cf95b6cf13c8a5bbe38964e7869cb244717fab3442a9a963e", + "target.spice": "9f8ea0c2d82b187067ae51034c77ffd14eb4576d9144491c11f72005ccab3638", + "target_lvs.spice": "55305d9063ea87c1abbee51ee4043a3cc7a0f03de14dda6fd1ccc3b19fad16b5", + "testbench.spice": "b68b946f7bb154e9209f96a169a9114c5c33c6348f1fdb314aa2a81202241507" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1.5_sL1/qualification.json new file mode 100644 index 00000000..e16d2897 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1.5_sL1/qualification.json @@ -0,0 +1,84 @@ +{ + "case_id": "C16_gf180_sW1.5_sL1", + "circuit_id": "C16", + "pdk": "gf180", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "diff_r", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "c334fe9064288036", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 10.08 + }, + "f3db": { + "min": 40410000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 13.0785, + "f3db": 67348800.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vo1": 2.85468, + "vo2": 2.85468, + "idd": 4.002751e-05, + "vos_in": 3.637979e-12, + "gain_lf": 13.0785, + "f3db": 67348800.0, + "ugf": 297298700.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1.5_sL1/specs.json new file mode 100644 index 00000000..06d1edcf --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1.5_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 10.08 + }, + "f3db": { + "min": 40410000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 13.0785, + "f3db": 67348800.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1.5_sL1/target.spice new file mode 100644 index 00000000..5e721f35 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1.5_sL1/target.spice @@ -0,0 +1,6 @@ +.subckt C16_gf180_sW1.5_sL1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 +MM1 VOUT1 VIN1 IB1 VSS nfet_03v3 w=6u l=0.56u nf=12 m=1 +MM2 VOUT2 VIN2 IB1 VSS nfet_03v3 w=6u l=0.56u nf=12 m=1 +XRR1 VDD VOUT1 VSS ppolyf_u r_width=1u r_length=60u +XRR2 VDD VOUT2 VSS ppolyf_u r_width=1u r_length=60u +.ends C16_gf180_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1.5_sL1/target_lvs.spice new file mode 100644 index 00000000..a26e2b5c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1.5_sL1/target_lvs.spice @@ -0,0 +1,28 @@ +.subckt C16_gf180_sW1.5_sL1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 +MM1_f0 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f1 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f2 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f3 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f4 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f5 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f6 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f7 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f8 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f9 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f10 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f11 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f0 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f1 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f2 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f3 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f4 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f5 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f6 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f7 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f8 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f9 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f10 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f11 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +RR1 VDD VOUT1 VSS ppolyf_u L=60u W=1u +RR2 VDD VOUT2 VSS ppolyf_u L=60u W=1u +.ends C16_gf180_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1.5_sL1/testbench.spice new file mode 100644 index 00000000..0c24809c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1.5_sL1/testbench.spice @@ -0,0 +1,40 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 C16_gf180_sW1.5_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIB1 IB1 VSS 4e-05 +.nodeset v(IB1)=2.31 + +VCM VCM 0 1.5 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1.5_sL2/case.json new file mode 100644 index 00000000..c57a8515 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1.5_sL2/case.json @@ -0,0 +1,117 @@ +{ + "case_id": "C16_gf180_sW1.5_sL2", + "circuit_id": "C16", + "pdk": "gf180", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "dut_name": "C16_gf180_sW1.5_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "IB1" + ], + "sizing": { + "M1": { + "w": 6.0, + "l": 1.12, + "nf": 12 + }, + "M2": { + "w": 6.0, + "l": 1.12, + "nf": 12 + }, + "R1": { + "r": 40000.0, + "body": "VSS", + "w": 1.0, + "l": 60.0 + }, + "R2": { + "r": 40000.0, + "body": "VSS", + "w": 1.0, + "l": 60.0 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 4e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 1.5, + "CL": 1e-13 + }, + "category": "diff_r", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "ada439db6e83a40c", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "R1", + "R2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1.5_sL2/manifest.json new file mode 100644 index 00000000..ca4ae9f7 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "ba9968086b056941ae7d25c9cd85f0f30064c17e80a9259f58b28903af406d0f", + "qualification.json": "4b7aa90e0f9d2d85d8ee1c6bddfa3e1954f5df30e1ffef66b69697429f74f9c3", + "specs.json": "fc3a49679552d1eef145ed7fb40c1b2d91b4ed0185e3b9a9f67311ad98469b57", + "target.spice": "2e444fc2410f2676925f620b0d3db148bbe1b48322c6cfcd6d6bda0d877f2049", + "target_lvs.spice": "204fa45e0086c143bdec98e4ca56183850fd5eeeacf7dd503b4d66f763196913", + "testbench.spice": "92527e29ea23aa35c67e4f901c30b3e8398a28f3b7e85df58fe38f7211d973f0" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1.5_sL2/qualification.json new file mode 100644 index 00000000..ebea8d51 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1.5_sL2/qualification.json @@ -0,0 +1,84 @@ +{ + "case_id": "C16_gf180_sW1.5_sL2", + "circuit_id": "C16", + "pdk": "gf180", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "diff_r", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "ada439db6e83a40c", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 39920000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 10.44895, + "f3db": 66538770.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vo1": 2.854767, + "vo2": 2.854767, + "idd": 4.001965e-05, + "vos_in": 0.0, + "gain_lf": 10.44895, + "f3db": 66538770.0, + "ugf": 212527800.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1.5_sL2/specs.json new file mode 100644 index 00000000..2384d2aa --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1.5_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 39920000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 10.44895, + "f3db": 66538770.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1.5_sL2/target.spice new file mode 100644 index 00000000..50bcd376 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1.5_sL2/target.spice @@ -0,0 +1,6 @@ +.subckt C16_gf180_sW1.5_sL2 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 +MM1 VOUT1 VIN1 IB1 VSS nfet_03v3 w=6u l=1.12u nf=12 m=1 +MM2 VOUT2 VIN2 IB1 VSS nfet_03v3 w=6u l=1.12u nf=12 m=1 +XRR1 VDD VOUT1 VSS ppolyf_u r_width=1u r_length=60u +XRR2 VDD VOUT2 VSS ppolyf_u r_width=1u r_length=60u +.ends C16_gf180_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1.5_sL2/target_lvs.spice new file mode 100644 index 00000000..e225e347 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1.5_sL2/target_lvs.spice @@ -0,0 +1,28 @@ +.subckt C16_gf180_sW1.5_sL2 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 +MM1_f0 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f1 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f2 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f3 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f4 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f5 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f6 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f7 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f8 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f9 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f10 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f11 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f0 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f1 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f2 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f3 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f4 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f5 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f6 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f7 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f8 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f9 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f10 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f11 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +RR1 VDD VOUT1 VSS ppolyf_u L=60u W=1u +RR2 VDD VOUT2 VSS ppolyf_u L=60u W=1u +.ends C16_gf180_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1.5_sL2/testbench.spice new file mode 100644 index 00000000..d818eca5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1.5_sL2/testbench.spice @@ -0,0 +1,40 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 C16_gf180_sW1.5_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIB1 IB1 VSS 4e-05 +.nodeset v(IB1)=2.31 + +VCM VCM 0 1.5 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1_sL1.5/case.json new file mode 100644 index 00000000..e1173deb --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1_sL1.5/case.json @@ -0,0 +1,117 @@ +{ + "case_id": "C16_gf180_sW1_sL1.5", + "circuit_id": "C16", + "pdk": "gf180", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "dut_name": "C16_gf180_sW1_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "IB1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.84, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 0.84, + "nf": 8 + }, + "R1": { + "r": 40000.0, + "body": "VSS", + "w": 1.0, + "l": 60.0 + }, + "R2": { + "r": 40000.0, + "body": "VSS", + "w": 1.0, + "l": 60.0 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 4e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 1.5, + "CL": 1e-13 + }, + "category": "diff_r", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "44b139f1258451ea", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "R1", + "R2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1_sL1.5/manifest.json new file mode 100644 index 00000000..9b6d1406 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "601067988facba9aff25decd331c2b10c2d4820f4fabaaf091441776b67567c0", + "qualification.json": "c8866a22ee3471cdbe7ac9b0e5ed14c50110cb047c5af710fcdd07186fea8356", + "specs.json": "7593b660ecda41713c6b4b82b812e87066d31246d552033cbe40b83c904e5efa", + "target.spice": "fa9294e6235051b4dabd2d997bd48be18c212a6106d3e7fbe6cd04df068af23c", + "target_lvs.spice": "0b17e8ec5d9d5ccad1b4ba732a235ec19f8d6775b1603f325193a867c9d5aa1e", + "testbench.spice": "646730a12de210b9178b8e8fe97965a32076da75f5a76f560238c9486c86d9b3" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1_sL1.5/qualification.json new file mode 100644 index 00000000..0f54cfd3 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1_sL1.5/qualification.json @@ -0,0 +1,84 @@ +{ + "case_id": "C16_gf180_sW1_sL1.5", + "circuit_id": "C16", + "pdk": "gf180", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "diff_r", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "44b139f1258451ea", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 40700000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 9.95608, + "f3db": 67834790.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vo1": 2.854718, + "vo2": 2.854718, + "idd": 4.002409e-05, + "vos_in": 0.0, + "gain_lf": 9.95608, + "f3db": 67834790.0, + "ugf": 203091000.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1_sL1.5/specs.json new file mode 100644 index 00000000..15013d0a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 40700000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 9.95608, + "f3db": 67834790.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1_sL1.5/target.spice new file mode 100644 index 00000000..35733856 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1_sL1.5/target.spice @@ -0,0 +1,6 @@ +.subckt C16_gf180_sW1_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 +MM1 VOUT1 VIN1 IB1 VSS nfet_03v3 w=4u l=0.84u nf=8 m=1 +MM2 VOUT2 VIN2 IB1 VSS nfet_03v3 w=4u l=0.84u nf=8 m=1 +XRR1 VDD VOUT1 VSS ppolyf_u r_width=1u r_length=60u +XRR2 VDD VOUT2 VSS ppolyf_u r_width=1u r_length=60u +.ends C16_gf180_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1_sL1.5/target_lvs.spice new file mode 100644 index 00000000..e5471986 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1_sL1.5/target_lvs.spice @@ -0,0 +1,20 @@ +.subckt C16_gf180_sW1_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 +MM1_f0 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f1 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f2 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f3 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f4 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f5 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f6 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f7 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f0 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f1 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f2 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f3 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f4 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f5 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f6 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f7 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +RR1 VDD VOUT1 VSS ppolyf_u L=60u W=1u +RR2 VDD VOUT2 VSS ppolyf_u L=60u W=1u +.ends C16_gf180_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1_sL1.5/testbench.spice new file mode 100644 index 00000000..54b3921a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1_sL1.5/testbench.spice @@ -0,0 +1,40 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 C16_gf180_sW1_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIB1 IB1 VSS 4e-05 +.nodeset v(IB1)=2.31 + +VCM VCM 0 1.5 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1_sL1/case.json new file mode 100644 index 00000000..04f24796 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1_sL1/case.json @@ -0,0 +1,117 @@ +{ + "case_id": "C16_gf180_sW1_sL1", + "circuit_id": "C16", + "pdk": "gf180", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "dut_name": "C16_gf180_sW1_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "IB1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "R1": { + "r": 40000.0, + "body": "VSS", + "w": 1.0, + "l": 60.0 + }, + "R2": { + "r": 40000.0, + "body": "VSS", + "w": 1.0, + "l": 60.0 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 4e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 1.5, + "CL": 1e-13 + }, + "category": "diff_r", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "8094ec594a0bafc3", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "R1", + "R2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1_sL1/manifest.json new file mode 100644 index 00000000..660e5a47 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "420992fcfb67979cca3675b47af41534b416be9c65f8bda569c03be688d6b668", + "qualification.json": "eca2b287dd84a1fc81a0ed61f4ac97fa68d0164d58ccfbde8ae45f0f41ed49dc", + "specs.json": "3d8ebdee3e09831b6bbf0dcc6c5c41baeb60da68eb2273b723ccb27736898acd", + "target.spice": "7b2eabba9884259ec0bcb0ccd7068f705fd3329ce8f5b3b0d30352e6a557e88f", + "target_lvs.spice": "4405d2b9af88748380f3d78b5bd22cc63a3c7c97a32c2df0dfb69aea23fcf91f", + "testbench.spice": "ed748efc775e94f9932283391b87de6fb08e922eb9cf55be65d18559bf1a0b72" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1_sL1/qualification.json new file mode 100644 index 00000000..232d6320 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1_sL1/qualification.json @@ -0,0 +1,84 @@ +{ + "case_id": "C16_gf180_sW1_sL1", + "circuit_id": "C16", + "pdk": "gf180", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "diff_r", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "8094ec594a0bafc3", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 8.616 + }, + "f3db": { + "min": 41040000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 11.61561, + "f3db": 68401630.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vo1": 2.854679, + "vo2": 2.854679, + "idd": 4.002764e-05, + "vos_in": 0.0, + "gain_lf": 11.61561, + "f3db": 68401630.0, + "ugf": 252093600.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1_sL1/specs.json new file mode 100644 index 00000000..f4313bb3 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 8.616 + }, + "f3db": { + "min": 41040000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 11.61561, + "f3db": 68401630.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1_sL1/target.spice new file mode 100644 index 00000000..760fb8f4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1_sL1/target.spice @@ -0,0 +1,6 @@ +.subckt C16_gf180_sW1_sL1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 +MM1 VOUT1 VIN1 IB1 VSS nfet_03v3 w=4u l=0.56u nf=8 m=1 +MM2 VOUT2 VIN2 IB1 VSS nfet_03v3 w=4u l=0.56u nf=8 m=1 +XRR1 VDD VOUT1 VSS ppolyf_u r_width=1u r_length=60u +XRR2 VDD VOUT2 VSS ppolyf_u r_width=1u r_length=60u +.ends C16_gf180_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1_sL1/target_lvs.spice new file mode 100644 index 00000000..5563cf9f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1_sL1/target_lvs.spice @@ -0,0 +1,20 @@ +.subckt C16_gf180_sW1_sL1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 +MM1_f0 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f1 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f2 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f3 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f4 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f5 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f6 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f7 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f0 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f1 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f2 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f3 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f4 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f5 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f6 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f7 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +RR1 VDD VOUT1 VSS ppolyf_u L=60u W=1u +RR2 VDD VOUT2 VSS ppolyf_u L=60u W=1u +.ends C16_gf180_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1_sL1/testbench.spice new file mode 100644 index 00000000..ee22df57 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1_sL1/testbench.spice @@ -0,0 +1,40 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 C16_gf180_sW1_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIB1 IB1 VSS 4e-05 +.nodeset v(IB1)=2.31 + +VCM VCM 0 1.5 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1_sL2/case.json new file mode 100644 index 00000000..d5e55864 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1_sL2/case.json @@ -0,0 +1,117 @@ +{ + "case_id": "C16_gf180_sW1_sL2", + "circuit_id": "C16", + "pdk": "gf180", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "dut_name": "C16_gf180_sW1_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "IB1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 1.12, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 1.12, + "nf": 8 + }, + "R1": { + "r": 40000.0, + "body": "VSS", + "w": 1.0, + "l": 60.0 + }, + "R2": { + "r": 40000.0, + "body": "VSS", + "w": 1.0, + "l": 60.0 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 4e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 1.5, + "CL": 1e-13 + }, + "category": "diff_r", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "7e34aaf32d0ab872", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "R1", + "R2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1_sL2/manifest.json new file mode 100644 index 00000000..12d71cf6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "1064b35e9fca88ed6de164b66e926f4e4813fe853e7d3801c233b8e7aa90ba08", + "qualification.json": "0afa9baf1879e63b4c284454d554e8d4b3c50462096c361fb8722325d4683eec", + "specs.json": "78056cbe7a1d29edbfeff72e9356f160327d9c384e55c0d1fb485ef7ab0db37d", + "target.spice": "ceea74a9113f204cfe5adf5eb2a452fc78cdd571a28b2ef5b0359cfeb0f5c5df", + "target_lvs.spice": "6c7a6358308414f893a96461d8ae72c257fcf23228da39e2b295236d33b556e4", + "testbench.spice": "49307763489f9e47d5fe1aeedb3e581e958e71afa8683c7bd51fd2ee47c9eac8" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1_sL2/qualification.json new file mode 100644 index 00000000..64b68cd0 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1_sL2/qualification.json @@ -0,0 +1,84 @@ +{ + "case_id": "C16_gf180_sW1_sL2", + "circuit_id": "C16", + "pdk": "gf180", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "diff_r", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "7e34aaf32d0ab872", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 40600000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 8.731853, + "f3db": 67663690.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vo1": 2.854768, + "vo2": 2.854768, + "idd": 4.00196e-05, + "vos_in": 0.0, + "gain_lf": 8.731853, + "f3db": 67663690.0, + "ugf": 172786600.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1_sL2/specs.json new file mode 100644 index 00000000..3cc533ca --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 40600000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 8.731853, + "f3db": 67663690.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1_sL2/target.spice new file mode 100644 index 00000000..7e10cd3e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1_sL2/target.spice @@ -0,0 +1,6 @@ +.subckt C16_gf180_sW1_sL2 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 +MM1 VOUT1 VIN1 IB1 VSS nfet_03v3 w=4u l=1.12u nf=8 m=1 +MM2 VOUT2 VIN2 IB1 VSS nfet_03v3 w=4u l=1.12u nf=8 m=1 +XRR1 VDD VOUT1 VSS ppolyf_u r_width=1u r_length=60u +XRR2 VDD VOUT2 VSS ppolyf_u r_width=1u r_length=60u +.ends C16_gf180_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1_sL2/target_lvs.spice new file mode 100644 index 00000000..892258d7 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1_sL2/target_lvs.spice @@ -0,0 +1,20 @@ +.subckt C16_gf180_sW1_sL2 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 +MM1_f0 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f1 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f2 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f3 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f4 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f5 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f6 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f7 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f0 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f1 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f2 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f3 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f4 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f5 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f6 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f7 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +RR1 VDD VOUT1 VSS ppolyf_u L=60u W=1u +RR2 VDD VOUT2 VSS ppolyf_u L=60u W=1u +.ends C16_gf180_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1_sL2/testbench.spice new file mode 100644 index 00000000..960515ee --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW1_sL2/testbench.spice @@ -0,0 +1,40 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 C16_gf180_sW1_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIB1 IB1 VSS 4e-05 +.nodeset v(IB1)=2.31 + +VCM VCM 0 1.5 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C16/gf180/sW2_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW2_sL1.5/case.json new file mode 100644 index 00000000..cd8c2f6f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW2_sL1.5/case.json @@ -0,0 +1,117 @@ +{ + "case_id": "C16_gf180_sW2_sL1.5", + "circuit_id": "C16", + "pdk": "gf180", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "dut_name": "C16_gf180_sW2_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "IB1" + ], + "sizing": { + "M1": { + "w": 8.0, + "l": 0.84, + "nf": 16 + }, + "M2": { + "w": 8.0, + "l": 0.84, + "nf": 16 + }, + "R1": { + "r": 40000.0, + "body": "VSS", + "w": 1.0, + "l": 60.0 + }, + "R2": { + "r": 40000.0, + "body": "VSS", + "w": 1.0, + "l": 60.0 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 4e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 1.5, + "CL": 1e-13 + }, + "category": "diff_r", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "04b1a6054b58e13a", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "R1", + "R2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/gf180/sW2_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW2_sL1.5/manifest.json new file mode 100644 index 00000000..8c91f9af --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW2_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "1ed21e30c07d9549b270c2feb2606433812ec3a522a449249f413e65e5e5612e", + "qualification.json": "1b567cad000e3e08fdc3ad88216a44700b1e838604eac05ae952d7e99af4f860", + "specs.json": "68ade61a3edab054c861f8b19ad6b7bd29f3950e3ba79b1456cc4c8b6dd9e3e8", + "target.spice": "638627d0818dc15566835da4365c4de20d80e2b2fe5ed9ae6c12e1fbfa3e52c9", + "target_lvs.spice": "9710f02ec3c4452cdf0909d94b90eed3c50267564ebbfd1a933c6e217505fbf9", + "testbench.spice": "9272982b79d439f2f2ba61ee3baf52b5095eb2d9b2cddc8254c6f27a4348769e" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/gf180/sW2_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW2_sL1.5/qualification.json new file mode 100644 index 00000000..606351f0 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW2_sL1.5/qualification.json @@ -0,0 +1,84 @@ +{ + "case_id": "C16_gf180_sW2_sL1.5", + "circuit_id": "C16", + "pdk": "gf180", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "diff_r", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "04b1a6054b58e13a", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 9.644 + }, + "f3db": { + "min": 39380000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 12.64394, + "f3db": 65626640.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vo1": 2.854719, + "vo2": 2.854719, + "idd": 4.002405e-05, + "vos_in": 0.0, + "gain_lf": 12.64394, + "f3db": 65626640.0, + "ugf": 275012200.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/gf180/sW2_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW2_sL1.5/specs.json new file mode 100644 index 00000000..1d976849 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW2_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 9.644 + }, + "f3db": { + "min": 39380000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 12.64394, + "f3db": 65626640.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/gf180/sW2_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW2_sL1.5/target.spice new file mode 100644 index 00000000..8d6acf00 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW2_sL1.5/target.spice @@ -0,0 +1,6 @@ +.subckt C16_gf180_sW2_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 +MM1 VOUT1 VIN1 IB1 VSS nfet_03v3 w=8u l=0.84u nf=16 m=1 +MM2 VOUT2 VIN2 IB1 VSS nfet_03v3 w=8u l=0.84u nf=16 m=1 +XRR1 VDD VOUT1 VSS ppolyf_u r_width=1u r_length=60u +XRR2 VDD VOUT2 VSS ppolyf_u r_width=1u r_length=60u +.ends C16_gf180_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C16/gf180/sW2_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW2_sL1.5/target_lvs.spice new file mode 100644 index 00000000..7f08577b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW2_sL1.5/target_lvs.spice @@ -0,0 +1,36 @@ +.subckt C16_gf180_sW2_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 +MM1_f0 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f1 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f2 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f3 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f4 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f5 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f6 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f7 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f8 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f9 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f10 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f11 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f12 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f13 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f14 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f15 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f0 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f1 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f2 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f3 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f4 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f5 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f6 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f7 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f8 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f9 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f10 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f11 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f12 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f13 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f14 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f15 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.84u +RR1 VDD VOUT1 VSS ppolyf_u L=60u W=1u +RR2 VDD VOUT2 VSS ppolyf_u L=60u W=1u +.ends C16_gf180_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C16/gf180/sW2_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW2_sL1.5/testbench.spice new file mode 100644 index 00000000..bc62fa84 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW2_sL1.5/testbench.spice @@ -0,0 +1,40 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 C16_gf180_sW2_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIB1 IB1 VSS 4e-05 +.nodeset v(IB1)=2.31 + +VCM VCM 0 1.5 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C16/gf180/sW2_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW2_sL1/case.json new file mode 100644 index 00000000..1c89c043 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW2_sL1/case.json @@ -0,0 +1,117 @@ +{ + "case_id": "C16_gf180_sW2_sL1", + "circuit_id": "C16", + "pdk": "gf180", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "dut_name": "C16_gf180_sW2_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "IB1" + ], + "sizing": { + "M1": { + "w": 8.0, + "l": 0.56, + "nf": 16 + }, + "M2": { + "w": 8.0, + "l": 0.56, + "nf": 16 + }, + "R1": { + "r": 40000.0, + "body": "VSS", + "w": 1.0, + "l": 60.0 + }, + "R2": { + "r": 40000.0, + "body": "VSS", + "w": 1.0, + "l": 60.0 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 4e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 1.5, + "CL": 1e-13 + }, + "category": "diff_r", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "654ff4b73c733749", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "R1", + "R2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/gf180/sW2_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW2_sL1/manifest.json new file mode 100644 index 00000000..f5dfa345 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW2_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "4451ba1f272a3dab845e17d0b71bf61c724dd3c8572421d2d18a1186d5e49f8d", + "qualification.json": "9b07688bca0e229d01b3bdd151074daaa7728a4743fbb29ac4b68b8044c772e2", + "specs.json": "f7c98e56d0d8baba21912eefe58383340a97cb7353e6521e4a58d65d50614e1c", + "target.spice": "7f8674069bb1f2dad30f3bc836ed1f9c4b2503e1855185cf2d39bad5325141bd", + "target_lvs.spice": "bf5b5bbc39708e43a25b59f01c1cf3eb318b0bc141b0dfafd544ff30661fce08", + "testbench.spice": "2531ee643415ce36819a7cdc07cc0330f1a4b32bf5e8d68c701d5e7bab700afd" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/gf180/sW2_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW2_sL1/qualification.json new file mode 100644 index 00000000..52311da4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW2_sL1/qualification.json @@ -0,0 +1,84 @@ +{ + "case_id": "C16_gf180_sW2_sL1", + "circuit_id": "C16", + "pdk": "gf180", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "diff_r", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "654ff4b73c733749", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 11.03 + }, + "f3db": { + "min": 39780000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 14.02758, + "f3db": 66299530.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vo1": 2.854682, + "vo2": 2.854682, + "idd": 4.002735e-05, + "vos_in": 0.0, + "gain_lf": 14.02758, + "f3db": 66299530.0, + "ugf": 328146900.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/gf180/sW2_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW2_sL1/specs.json new file mode 100644 index 00000000..37dff9df --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW2_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 11.03 + }, + "f3db": { + "min": 39780000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 14.02758, + "f3db": 66299530.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/gf180/sW2_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW2_sL1/target.spice new file mode 100644 index 00000000..674efcab --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW2_sL1/target.spice @@ -0,0 +1,6 @@ +.subckt C16_gf180_sW2_sL1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 +MM1 VOUT1 VIN1 IB1 VSS nfet_03v3 w=8u l=0.56u nf=16 m=1 +MM2 VOUT2 VIN2 IB1 VSS nfet_03v3 w=8u l=0.56u nf=16 m=1 +XRR1 VDD VOUT1 VSS ppolyf_u r_width=1u r_length=60u +XRR2 VDD VOUT2 VSS ppolyf_u r_width=1u r_length=60u +.ends C16_gf180_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C16/gf180/sW2_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW2_sL1/target_lvs.spice new file mode 100644 index 00000000..28bba7e5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW2_sL1/target_lvs.spice @@ -0,0 +1,36 @@ +.subckt C16_gf180_sW2_sL1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 +MM1_f0 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f1 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f2 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f3 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f4 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f5 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f6 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f7 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f8 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f9 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f10 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f11 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f12 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f13 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f14 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f15 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f0 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f1 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f2 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f3 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f4 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f5 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f6 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f7 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f8 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f9 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f10 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f11 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f12 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f13 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f14 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f15 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=0.56u +RR1 VDD VOUT1 VSS ppolyf_u L=60u W=1u +RR2 VDD VOUT2 VSS ppolyf_u L=60u W=1u +.ends C16_gf180_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C16/gf180/sW2_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW2_sL1/testbench.spice new file mode 100644 index 00000000..586ef89a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW2_sL1/testbench.spice @@ -0,0 +1,40 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 C16_gf180_sW2_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIB1 IB1 VSS 4e-05 +.nodeset v(IB1)=2.31 + +VCM VCM 0 1.5 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C16/gf180/sW2_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW2_sL2/case.json new file mode 100644 index 00000000..564dac9c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW2_sL2/case.json @@ -0,0 +1,117 @@ +{ + "case_id": "C16_gf180_sW2_sL2", + "circuit_id": "C16", + "pdk": "gf180", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "dut_name": "C16_gf180_sW2_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "IB1" + ], + "sizing": { + "M1": { + "w": 8.0, + "l": 1.12, + "nf": 16 + }, + "M2": { + "w": 8.0, + "l": 1.12, + "nf": 16 + }, + "R1": { + "r": 40000.0, + "body": "VSS", + "w": 1.0, + "l": 60.0 + }, + "R2": { + "r": 40000.0, + "body": "VSS", + "w": 1.0, + "l": 60.0 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 4e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 1.5, + "CL": 1e-13 + }, + "category": "diff_r", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "9d03c44b3a59d72c", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "R1", + "R2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/gf180/sW2_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW2_sL2/manifest.json new file mode 100644 index 00000000..0e0016b2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW2_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "986d331e2fd8457e68f6e96e427eae1fda7f3a73c6378d1cae9c5482954a462a", + "qualification.json": "68495f4d7ff64e1b0461995074c2d77f5e0d87d483d883ae882b4bfee1be7ea2", + "specs.json": "ab1ba3e91bd8b5202ff23aee7aff6396986a14001aa817495b8768688dbfbaff", + "target.spice": "e4c17f9db7f562722093fe57d18463b33015567777cd5835258dd1b23348296a", + "target_lvs.spice": "b17dc9ab0471f629b5a964300776a8568098ec351f627fc290d5c0318b258569", + "testbench.spice": "e7299e415e0aa90c7be44d7876ad41e1b789e8e166646c22fd10faf47052028f" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/gf180/sW2_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW2_sL2/qualification.json new file mode 100644 index 00000000..e809ca5d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW2_sL2/qualification.json @@ -0,0 +1,84 @@ +{ + "case_id": "C16_gf180_sW2_sL2", + "circuit_id": "C16", + "pdk": "gf180", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "diff_r", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "9d03c44b3a59d72c", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 8.559 + }, + "f3db": { + "min": 39260000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 11.55868, + "f3db": 65435360.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vo1": 2.854767, + "vo2": 2.854767, + "idd": 4.001967e-05, + "vos_in": 0.0, + "gain_lf": 11.55868, + "f3db": 65435360.0, + "ugf": 240426500.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/gf180/sW2_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW2_sL2/specs.json new file mode 100644 index 00000000..22b20808 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW2_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 8.559 + }, + "f3db": { + "min": 39260000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 11.55868, + "f3db": 65435360.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/gf180/sW2_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW2_sL2/target.spice new file mode 100644 index 00000000..23354938 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW2_sL2/target.spice @@ -0,0 +1,6 @@ +.subckt C16_gf180_sW2_sL2 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 +MM1 VOUT1 VIN1 IB1 VSS nfet_03v3 w=8u l=1.12u nf=16 m=1 +MM2 VOUT2 VIN2 IB1 VSS nfet_03v3 w=8u l=1.12u nf=16 m=1 +XRR1 VDD VOUT1 VSS ppolyf_u r_width=1u r_length=60u +XRR2 VDD VOUT2 VSS ppolyf_u r_width=1u r_length=60u +.ends C16_gf180_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C16/gf180/sW2_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW2_sL2/target_lvs.spice new file mode 100644 index 00000000..a05d2958 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW2_sL2/target_lvs.spice @@ -0,0 +1,36 @@ +.subckt C16_gf180_sW2_sL2 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 +MM1_f0 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f1 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f2 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f3 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f4 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f5 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f6 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f7 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f8 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f9 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f10 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f11 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f12 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f13 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f14 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f15 VOUT1 VIN1 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f0 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f1 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f2 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f3 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f4 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f5 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f6 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f7 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f8 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f9 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f10 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f11 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f12 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f13 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f14 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f15 VOUT2 VIN2 IB1 VSS nfet_03v3 w=0.5u l=1.12u +RR1 VDD VOUT1 VSS ppolyf_u L=60u W=1u +RR2 VDD VOUT2 VSS ppolyf_u L=60u W=1u +.ends C16_gf180_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C16/gf180/sW2_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW2_sL2/testbench.spice new file mode 100644 index 00000000..b207dedf --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/gf180/sW2_sL2/testbench.spice @@ -0,0 +1,40 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 C16_gf180_sW2_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +IIB1 IB1 VSS 4e-05 +.nodeset v(IB1)=2.31 + +VCM VCM 0 1.5 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW0.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW0.5_sL1.5/case.json new file mode 100644 index 00000000..eb9e2c0e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW0.5_sL1.5/case.json @@ -0,0 +1,117 @@ +{ + "case_id": "C16_ihp130_sW0.5_sL1.5", + "circuit_id": "C16", + "pdk": "ihp130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "dut_name": "C16_ihp130_sW0.5_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "IB1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.39, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 0.39, + "nf": 4 + }, + "R1": { + "r": 12000.0, + "body": "VSS", + "w": 1.0, + "l": 46.385 + }, + "R2": { + "r": 12000.0, + "body": "VSS", + "w": 1.0, + "l": 46.385 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 4e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 0.6, + "CL": 1e-13 + }, + "category": "diff_r", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "90f7962027ac3501", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "R1", + "R2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW0.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW0.5_sL1.5/manifest.json new file mode 100644 index 00000000..e97ba9e9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW0.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "02c758245296464ec60cd6e46f7f4524af4a5f389f237d6d44882344e62fe706", + "qualification.json": "4629829a251a7eb47e985ecd4256689fa0f9450da1d191b2e536175f15c916b6", + "specs.json": "fcb4ab84c48c976b5c4863ea4ba99e3bb0bac6a53369fb8223d2e4515c47a272", + "target.spice": "15a3ce1a24ae715719d25d389e50135865ba6e9d52503675fde7995c2adea716", + "target_lvs.spice": "f2e96395a97966da0c12bc558a0b09ba3add567353236891b00be3bd17432339", + "testbench.spice": "d75eb6c4286c633da15b5dd070bfcaa42f96148aae6533ec9ab1b4932298c6e0" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW0.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW0.5_sL1.5/qualification.json new file mode 100644 index 00000000..49a66102 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW0.5_sL1.5/qualification.json @@ -0,0 +1,86 @@ +{ + "case_id": "C16_ihp130_sW0.5_sL1.5", + "circuit_id": "C16", + "pdk": "ihp130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "diff_r", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "90f7962027ac3501", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "gain_lf=7.371 below floor 8" + ], + "spec": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 81630000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 7.370634, + "f3db": 136047200.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.2, + "schematic_measures": { + "vo1": 0.9600282, + "vo2": 0.9600282, + "idd": 4e-05, + "vos_in": 0.0, + "gain_lf": 7.370634, + "f3db": 136047200.0, + "ugf": 288199800.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW0.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW0.5_sL1.5/specs.json new file mode 100644 index 00000000..4be4c0b9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW0.5_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 81630000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 7.370634, + "f3db": 136047200.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW0.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW0.5_sL1.5/target.spice new file mode 100644 index 00000000..e1a8a188 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW0.5_sL1.5/target.spice @@ -0,0 +1,6 @@ +.subckt C16_ihp130_sW0.5_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 +XM1 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=2u l=0.39u ng=4 m=1 +XM2 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=2u l=0.39u ng=4 m=1 +XRR1 VDD VOUT1 rppd w=1u l=46.385u m=1 +XRR2 VDD VOUT2 rppd w=1u l=46.385u m=1 +.ends C16_ihp130_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW0.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW0.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..147f1757 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW0.5_sL1.5/target_lvs.spice @@ -0,0 +1,12 @@ +.subckt C16_ihp130_sW0.5_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 +XM1_f0 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f1 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f2 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f3 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f0 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f1 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f2 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f3 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XRR1 VDD VOUT1 rppd w=1u l=46.385u m=1 +XRR2 VDD VOUT2 rppd w=1u l=46.385u m=1 +.ends C16_ihp130_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW0.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW0.5_sL1.5/testbench.spice new file mode 100644 index 00000000..8a9c9516 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW0.5_sL1.5/testbench.spice @@ -0,0 +1,40 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 C16_ihp130_sW0.5_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIB1 IB1 VSS 4e-05 +.nodeset v(IB1)=0.84 + +VCM VCM 0 0.6 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW0.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW0.5_sL1/case.json new file mode 100644 index 00000000..ed5bcbdc --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW0.5_sL1/case.json @@ -0,0 +1,117 @@ +{ + "case_id": "C16_ihp130_sW0.5_sL1", + "circuit_id": "C16", + "pdk": "ihp130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "dut_name": "C16_ihp130_sW0.5_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "IB1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.26, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 0.26, + "nf": 4 + }, + "R1": { + "r": 12000.0, + "body": "VSS", + "w": 1.0, + "l": 46.385 + }, + "R2": { + "r": 12000.0, + "body": "VSS", + "w": 1.0, + "l": 46.385 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 4e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 0.6, + "CL": 1e-13 + }, + "category": "diff_r", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.26, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.26, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "7844684450a58e2d", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "R1", + "R2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW0.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW0.5_sL1/manifest.json new file mode 100644 index 00000000..1aed742e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW0.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "00e473020fe108f2e178152862fec81a7731eb0146a982b70bd58af8c0c087fe", + "qualification.json": "99963aa3a0c40d9273367e126803ce53386568577b0577ef8bf3b975d935d652", + "specs.json": "c3ead17c501392b9be3063b0be4e354b7c1036db52ceb70e57c94c829e112b83", + "target.spice": "557d8ccc3ad37297b5ef14a2a3da843861b34a5f67a3dc920ae7adb9cd2980cf", + "target_lvs.spice": "31417162a71cdb5741a61ca8ee102c934e4de0fb8e0181d1a013a544706555c1", + "testbench.spice": "b505d33acbcd21caa94f1812b6b32de25ed709cd8edf7d1fddb0ac486ffc034c" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW0.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW0.5_sL1/qualification.json new file mode 100644 index 00000000..fd94f0fa --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW0.5_sL1/qualification.json @@ -0,0 +1,84 @@ +{ + "case_id": "C16_ihp130_sW0.5_sL1", + "circuit_id": "C16", + "pdk": "ihp130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "diff_r", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.26, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.26, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "7844684450a58e2d", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 83120000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 8.045954, + "f3db": 138540100.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.2, + "schematic_measures": { + "vo1": 0.9600281, + "vo2": 0.9600281, + "idd": 4e-05, + "vos_in": 1.818989e-12, + "gain_lf": 8.045954, + "f3db": 138540100.0, + "ugf": 322254800.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW0.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW0.5_sL1/specs.json new file mode 100644 index 00000000..4dd586c4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW0.5_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 83120000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 8.045954, + "f3db": 138540100.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW0.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW0.5_sL1/target.spice new file mode 100644 index 00000000..d3e82b01 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW0.5_sL1/target.spice @@ -0,0 +1,6 @@ +.subckt C16_ihp130_sW0.5_sL1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 +XM1 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=2u l=0.26u ng=4 m=1 +XM2 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=2u l=0.26u ng=4 m=1 +XRR1 VDD VOUT1 rppd w=1u l=46.385u m=1 +XRR2 VDD VOUT2 rppd w=1u l=46.385u m=1 +.ends C16_ihp130_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW0.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW0.5_sL1/target_lvs.spice new file mode 100644 index 00000000..e2e60972 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW0.5_sL1/target_lvs.spice @@ -0,0 +1,12 @@ +.subckt C16_ihp130_sW0.5_sL1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 +XM1_f0 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f1 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f2 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f3 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f0 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f1 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f2 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f3 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XRR1 VDD VOUT1 rppd w=1u l=46.385u m=1 +XRR2 VDD VOUT2 rppd w=1u l=46.385u m=1 +.ends C16_ihp130_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW0.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW0.5_sL1/testbench.spice new file mode 100644 index 00000000..6bc1b336 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW0.5_sL1/testbench.spice @@ -0,0 +1,40 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 C16_ihp130_sW0.5_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIB1 IB1 VSS 4e-05 +.nodeset v(IB1)=0.84 + +VCM VCM 0 0.6 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW0.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW0.5_sL2/case.json new file mode 100644 index 00000000..c026dce2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW0.5_sL2/case.json @@ -0,0 +1,117 @@ +{ + "case_id": "C16_ihp130_sW0.5_sL2", + "circuit_id": "C16", + "pdk": "ihp130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "dut_name": "C16_ihp130_sW0.5_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "IB1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.52, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 0.52, + "nf": 4 + }, + "R1": { + "r": 12000.0, + "body": "VSS", + "w": 1.0, + "l": 46.385 + }, + "R2": { + "r": 12000.0, + "body": "VSS", + "w": 1.0, + "l": 46.385 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 4e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 0.6, + "CL": 1e-13 + }, + "category": "diff_r", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "e3a20daa1d9d7424", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "R1", + "R2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW0.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW0.5_sL2/manifest.json new file mode 100644 index 00000000..72a18de5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW0.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "fcb11d50d1cc3f750942c004824e1a44884cf4b724c9d442fe6114b309ae0608", + "qualification.json": "2f0a24fe45971a2c1575d3eb5835c7ad0e42d83f7d6dd74e2863b5e208b8c8ae", + "specs.json": "6af02d95c73044fab4f0f8c550fbf963502bc08259b3ed55a67ddf1e88cc5333", + "target.spice": "7bc82f435f4d8d097504ebc3a9e9daa93c0a52f4cabaf3339872e5babe94a887", + "target_lvs.spice": "a5cc242d541e7fa525492de60f740a9d5878d61a92498e2198218fa3c2590e20", + "testbench.spice": "07192449f00fae3f17c54e313673f54fbe65feb0c81bf46b7ee417280a4081d9" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW0.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW0.5_sL2/qualification.json new file mode 100644 index 00000000..352c0d50 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW0.5_sL2/qualification.json @@ -0,0 +1,86 @@ +{ + "case_id": "C16_ihp130_sW0.5_sL2", + "circuit_id": "C16", + "pdk": "ihp130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "diff_r", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "e3a20daa1d9d7424", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "gain_lf=6.721 below floor 8" + ], + "spec": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 80630000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 6.720895, + "f3db": 134386300.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.2, + "schematic_measures": { + "vo1": 0.9600282, + "vo2": 0.9600282, + "idd": 4e-05, + "vos_in": 0.0, + "gain_lf": 6.720895, + "f3db": 134386300.0, + "ugf": 259389900.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW0.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW0.5_sL2/specs.json new file mode 100644 index 00000000..2179e358 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW0.5_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 80630000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 6.720895, + "f3db": 134386300.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW0.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW0.5_sL2/target.spice new file mode 100644 index 00000000..ced832d6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW0.5_sL2/target.spice @@ -0,0 +1,6 @@ +.subckt C16_ihp130_sW0.5_sL2 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 +XM1 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=2u l=0.52u ng=4 m=1 +XM2 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=2u l=0.52u ng=4 m=1 +XRR1 VDD VOUT1 rppd w=1u l=46.385u m=1 +XRR2 VDD VOUT2 rppd w=1u l=46.385u m=1 +.ends C16_ihp130_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW0.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW0.5_sL2/target_lvs.spice new file mode 100644 index 00000000..08384e58 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW0.5_sL2/target_lvs.spice @@ -0,0 +1,12 @@ +.subckt C16_ihp130_sW0.5_sL2 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 +XM1_f0 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f1 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f2 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f3 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f0 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f1 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f2 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f3 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XRR1 VDD VOUT1 rppd w=1u l=46.385u m=1 +XRR2 VDD VOUT2 rppd w=1u l=46.385u m=1 +.ends C16_ihp130_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW0.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW0.5_sL2/testbench.spice new file mode 100644 index 00000000..43d44028 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW0.5_sL2/testbench.spice @@ -0,0 +1,40 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 C16_ihp130_sW0.5_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIB1 IB1 VSS 4e-05 +.nodeset v(IB1)=0.84 + +VCM VCM 0 0.6 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1.5_sL1.5/case.json new file mode 100644 index 00000000..95399586 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1.5_sL1.5/case.json @@ -0,0 +1,117 @@ +{ + "case_id": "C16_ihp130_sW1.5_sL1.5", + "circuit_id": "C16", + "pdk": "ihp130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "dut_name": "C16_ihp130_sW1.5_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "IB1" + ], + "sizing": { + "M1": { + "w": 6.0, + "l": 0.39, + "nf": 12 + }, + "M2": { + "w": 6.0, + "l": 0.39, + "nf": 12 + }, + "R1": { + "r": 12000.0, + "body": "VSS", + "w": 1.0, + "l": 46.385 + }, + "R2": { + "r": 12000.0, + "body": "VSS", + "w": 1.0, + "l": 46.385 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 4e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 0.6, + "CL": 1e-13 + }, + "category": "diff_r", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.39, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.39, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "7ebed7572ae83e36", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "R1", + "R2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1.5_sL1.5/manifest.json new file mode 100644 index 00000000..e829ebb1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "2481161fe405738e9927447f3bcc743a1a385b352b1f6bd43f201dc6d4186fb8", + "qualification.json": "462ec0027e15e041d3dee356f3d6a23dcfae5fabf3ae30940a5afeb74bdf26ff", + "specs.json": "8a9886f59c2bc9f3e77e2849cfdd497d9ec0cc7ef8a176382ae07576d056e11b", + "target.spice": "bca90d5b795ac20f1d99314eeb5d805c6907b9e11facdf3b8628aaf50403063f", + "target_lvs.spice": "29e4e46e1a294426be1401e7d614d7747eecba26c1ef55f5ae3a04459739f06e", + "testbench.spice": "c67221b032d0ecd541d7885d1b9deb70f6296a5534cefcf4292a93e962b9321c" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1.5_sL1.5/qualification.json new file mode 100644 index 00000000..9289eac3 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1.5_sL1.5/qualification.json @@ -0,0 +1,84 @@ +{ + "case_id": "C16_ihp130_sW1.5_sL1.5", + "circuit_id": "C16", + "pdk": "ihp130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "diff_r", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.39, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.39, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "7ebed7572ae83e36", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 82100000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 10.36718, + "f3db": 136826000.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.4, + "schematic_measures": { + "vo1": 0.9600282, + "vo2": 0.9600282, + "idd": 4e-05, + "vos_in": -1.81899e-12, + "gain_lf": 10.36718, + "f3db": 136826000.0, + "ugf": 432273800.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1.5_sL1.5/specs.json new file mode 100644 index 00000000..786c6f26 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1.5_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 82100000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 10.36718, + "f3db": 136826000.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1.5_sL1.5/target.spice new file mode 100644 index 00000000..34977f37 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1.5_sL1.5/target.spice @@ -0,0 +1,6 @@ +.subckt C16_ihp130_sW1.5_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 +XM1 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=6u l=0.39u ng=12 m=1 +XM2 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=6u l=0.39u ng=12 m=1 +XRR1 VDD VOUT1 rppd w=1u l=46.385u m=1 +XRR2 VDD VOUT2 rppd w=1u l=46.385u m=1 +.ends C16_ihp130_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..7e33b0a0 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1.5_sL1.5/target_lvs.spice @@ -0,0 +1,28 @@ +.subckt C16_ihp130_sW1.5_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 +XM1_f0 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f1 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f2 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f3 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f4 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f5 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f6 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f7 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f8 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f9 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f10 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f11 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f0 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f1 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f2 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f3 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f4 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f5 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f6 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f7 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f8 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f9 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f10 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f11 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XRR1 VDD VOUT1 rppd w=1u l=46.385u m=1 +XRR2 VDD VOUT2 rppd w=1u l=46.385u m=1 +.ends C16_ihp130_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1.5_sL1.5/testbench.spice new file mode 100644 index 00000000..609c7d25 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1.5_sL1.5/testbench.spice @@ -0,0 +1,40 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 C16_ihp130_sW1.5_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIB1 IB1 VSS 4e-05 +.nodeset v(IB1)=0.84 + +VCM VCM 0 0.6 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1.5_sL1/case.json new file mode 100644 index 00000000..f280d574 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1.5_sL1/case.json @@ -0,0 +1,117 @@ +{ + "case_id": "C16_ihp130_sW1.5_sL1", + "circuit_id": "C16", + "pdk": "ihp130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "dut_name": "C16_ihp130_sW1.5_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "IB1" + ], + "sizing": { + "M1": { + "w": 6.0, + "l": 0.26, + "nf": 12 + }, + "M2": { + "w": 6.0, + "l": 0.26, + "nf": 12 + }, + "R1": { + "r": 12000.0, + "body": "VSS", + "w": 1.0, + "l": 46.385 + }, + "R2": { + "r": 12000.0, + "body": "VSS", + "w": 1.0, + "l": 46.385 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 4e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 0.6, + "CL": 1e-13 + }, + "category": "diff_r", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.26, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.26, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "b39896e42b07eb87", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "R1", + "R2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1.5_sL1/manifest.json new file mode 100644 index 00000000..a4a896c7 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "fe2bf3a2e82200a6863f76725b01e680ed2c846eb89939fd22f879023823c843", + "qualification.json": "19f1842f01558594dc63f593b5f2e42f8e132da93fea24b7d55dd1d80bda0f6c", + "specs.json": "cea6061a98b0c182f18bb6f8f6f076aa91c2b5a96736a0263386f6df8d684d88", + "target.spice": "229d5fc3f528d4b3431fdce2616211ce5d1ad8ebbd6aeb6c3afda2ca7642aefb", + "target_lvs.spice": "07e0b0faff41e25e5c8d864faa806a638af7d3277e6fccf364768fb617a872e3", + "testbench.spice": "47e07db987bd3aefad8b0ed1fcac336e6a517b0bbaba2d2601e97fd19df7c668" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1.5_sL1/qualification.json new file mode 100644 index 00000000..ff42eda8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1.5_sL1/qualification.json @@ -0,0 +1,84 @@ +{ + "case_id": "C16_ihp130_sW1.5_sL1", + "circuit_id": "C16", + "pdk": "ihp130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "diff_r", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.26, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.26, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "b39896e42b07eb87", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 83990000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 10.80834, + "f3db": 139975700.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.3, + "schematic_measures": { + "vo1": 0.9600281, + "vo2": 0.9600281, + "idd": 4e-05, + "vos_in": 0.0, + "gain_lf": 10.80834, + "f3db": 139975700.0, + "ugf": 467342700.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1.5_sL1/specs.json new file mode 100644 index 00000000..b3691d0e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1.5_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 83990000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 10.80834, + "f3db": 139975700.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1.5_sL1/target.spice new file mode 100644 index 00000000..cc3b1dba --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1.5_sL1/target.spice @@ -0,0 +1,6 @@ +.subckt C16_ihp130_sW1.5_sL1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 +XM1 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=6u l=0.26u ng=12 m=1 +XM2 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=6u l=0.26u ng=12 m=1 +XRR1 VDD VOUT1 rppd w=1u l=46.385u m=1 +XRR2 VDD VOUT2 rppd w=1u l=46.385u m=1 +.ends C16_ihp130_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1.5_sL1/target_lvs.spice new file mode 100644 index 00000000..8d0eb13a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1.5_sL1/target_lvs.spice @@ -0,0 +1,28 @@ +.subckt C16_ihp130_sW1.5_sL1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 +XM1_f0 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f1 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f2 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f3 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f4 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f5 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f6 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f7 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f8 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f9 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f10 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f11 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f0 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f1 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f2 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f3 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f4 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f5 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f6 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f7 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f8 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f9 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f10 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f11 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XRR1 VDD VOUT1 rppd w=1u l=46.385u m=1 +XRR2 VDD VOUT2 rppd w=1u l=46.385u m=1 +.ends C16_ihp130_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1.5_sL1/testbench.spice new file mode 100644 index 00000000..1a087676 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1.5_sL1/testbench.spice @@ -0,0 +1,40 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 C16_ihp130_sW1.5_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIB1 IB1 VSS 4e-05 +.nodeset v(IB1)=0.84 + +VCM VCM 0 0.6 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1.5_sL2/case.json new file mode 100644 index 00000000..5b68d6f8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1.5_sL2/case.json @@ -0,0 +1,117 @@ +{ + "case_id": "C16_ihp130_sW1.5_sL2", + "circuit_id": "C16", + "pdk": "ihp130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "dut_name": "C16_ihp130_sW1.5_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "IB1" + ], + "sizing": { + "M1": { + "w": 6.0, + "l": 0.52, + "nf": 12 + }, + "M2": { + "w": 6.0, + "l": 0.52, + "nf": 12 + }, + "R1": { + "r": 12000.0, + "body": "VSS", + "w": 1.0, + "l": 46.385 + }, + "R2": { + "r": 12000.0, + "body": "VSS", + "w": 1.0, + "l": 46.385 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 4e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 0.6, + "CL": 1e-13 + }, + "category": "diff_r", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.52, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.52, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "bacc38bc5d80bef5", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "R1", + "R2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1.5_sL2/manifest.json new file mode 100644 index 00000000..7e504370 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "529959cf67a127a84572713247024733a17a5b89b0ddf1c1341f0c4a00a12bf4", + "qualification.json": "128aa0c1876d004311c238d007b5c3a688a5f46bb13cdb101f5e341db1d43b33", + "specs.json": "0e60ddb7f685a3cab2a62a28a0750efc353c33ee375de5d675f099e1dab39c44", + "target.spice": "7df045b1f0a291673d949555a9cf196e8714aaf149dd732f0c606c434138ef3b", + "target_lvs.spice": "c4fc1fc5980de4e45d85012e04588ffa7905f64beadd1281e62026bbd3e9a036", + "testbench.spice": "ca9bc42e2100d76f891e6f6a749592ff6e79b127b3751db70c16684294e082d7" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1.5_sL2/qualification.json new file mode 100644 index 00000000..1563ae7b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1.5_sL2/qualification.json @@ -0,0 +1,84 @@ +{ + "case_id": "C16_ihp130_sW1.5_sL2", + "circuit_id": "C16", + "pdk": "ihp130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "diff_r", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.52, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.52, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "bacc38bc5d80bef5", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 80760000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 9.904036, + "f3db": 134605800.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.3, + "schematic_measures": { + "vo1": 0.9600282, + "vo2": 0.9600282, + "idd": 4e-05, + "vos_in": 0.0, + "gain_lf": 9.904036, + "f3db": 134605800.0, + "ugf": 400906900.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1.5_sL2/specs.json new file mode 100644 index 00000000..1998c052 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1.5_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 80760000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 9.904036, + "f3db": 134605800.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1.5_sL2/target.spice new file mode 100644 index 00000000..83d34afb --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1.5_sL2/target.spice @@ -0,0 +1,6 @@ +.subckt C16_ihp130_sW1.5_sL2 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 +XM1 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=6u l=0.52u ng=12 m=1 +XM2 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=6u l=0.52u ng=12 m=1 +XRR1 VDD VOUT1 rppd w=1u l=46.385u m=1 +XRR2 VDD VOUT2 rppd w=1u l=46.385u m=1 +.ends C16_ihp130_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1.5_sL2/target_lvs.spice new file mode 100644 index 00000000..5e3f114b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1.5_sL2/target_lvs.spice @@ -0,0 +1,28 @@ +.subckt C16_ihp130_sW1.5_sL2 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 +XM1_f0 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f1 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f2 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f3 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f4 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f5 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f6 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f7 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f8 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f9 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f10 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f11 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f0 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f1 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f2 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f3 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f4 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f5 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f6 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f7 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f8 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f9 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f10 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f11 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XRR1 VDD VOUT1 rppd w=1u l=46.385u m=1 +XRR2 VDD VOUT2 rppd w=1u l=46.385u m=1 +.ends C16_ihp130_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1.5_sL2/testbench.spice new file mode 100644 index 00000000..6633c75e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1.5_sL2/testbench.spice @@ -0,0 +1,40 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 C16_ihp130_sW1.5_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIB1 IB1 VSS 4e-05 +.nodeset v(IB1)=0.84 + +VCM VCM 0 0.6 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1_sL1.5/case.json new file mode 100644 index 00000000..e89958a1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1_sL1.5/case.json @@ -0,0 +1,117 @@ +{ + "case_id": "C16_ihp130_sW1_sL1.5", + "circuit_id": "C16", + "pdk": "ihp130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "dut_name": "C16_ihp130_sW1_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "IB1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.39, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 0.39, + "nf": 8 + }, + "R1": { + "r": 12000.0, + "body": "VSS", + "w": 1.0, + "l": 46.385 + }, + "R2": { + "r": 12000.0, + "body": "VSS", + "w": 1.0, + "l": 46.385 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 4e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 0.6, + "CL": 1e-13 + }, + "category": "diff_r", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "ab187a703b51798d", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "R1", + "R2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1_sL1.5/manifest.json new file mode 100644 index 00000000..d813281d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "7a6ac5f96142c1c765eb9b7f2c23694c74703f5648806a3095a4e4d341f2a493", + "qualification.json": "e47db43b327c5cc2c29b25c37aed41dc76359a9b34ae8dc7976897780f499438", + "specs.json": "9ae5a99fc3aa6bfc1b6ed5c7bd8dd1e21c6970ec1ff38cc2e23d9ac92baf41af", + "target.spice": "9669dbfd1a9b41bcc425f1bd8989fb5bcc3251afc9f868f0ff3afb1239f4eb4d", + "target_lvs.spice": "4b461777976e35006fb52c7e9bc9394a6cc8743cf1a1dfb54fd6a6c5d6554b84", + "testbench.spice": "be459c5003fad212f5193dd78f9d26f238c163454a3602b3d7e75f19b5bcd267" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1_sL1.5/qualification.json new file mode 100644 index 00000000..222d7692 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1_sL1.5/qualification.json @@ -0,0 +1,84 @@ +{ + "case_id": "C16_ihp130_sW1_sL1.5", + "circuit_id": "C16", + "pdk": "ihp130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "diff_r", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "ab187a703b51798d", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 82190000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 9.322068, + "f3db": 136986900.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.2, + "schematic_measures": { + "vo1": 0.9600282, + "vo2": 0.9600282, + "idd": 4e-05, + "vos_in": 0.0, + "gain_lf": 9.322068, + "f3db": 136986900.0, + "ugf": 378180200.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1_sL1.5/specs.json new file mode 100644 index 00000000..5701e80d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 82190000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 9.322068, + "f3db": 136986900.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1_sL1.5/target.spice new file mode 100644 index 00000000..ab4474d5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1_sL1.5/target.spice @@ -0,0 +1,6 @@ +.subckt C16_ihp130_sW1_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 +XM1 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=4u l=0.39u ng=8 m=1 +XM2 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=4u l=0.39u ng=8 m=1 +XRR1 VDD VOUT1 rppd w=1u l=46.385u m=1 +XRR2 VDD VOUT2 rppd w=1u l=46.385u m=1 +.ends C16_ihp130_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1_sL1.5/target_lvs.spice new file mode 100644 index 00000000..64299ae0 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1_sL1.5/target_lvs.spice @@ -0,0 +1,20 @@ +.subckt C16_ihp130_sW1_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 +XM1_f0 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f1 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f2 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f3 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f4 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f5 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f6 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f7 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f0 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f1 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f2 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f3 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f4 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f5 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f6 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f7 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XRR1 VDD VOUT1 rppd w=1u l=46.385u m=1 +XRR2 VDD VOUT2 rppd w=1u l=46.385u m=1 +.ends C16_ihp130_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1_sL1.5/testbench.spice new file mode 100644 index 00000000..5b170c0a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1_sL1.5/testbench.spice @@ -0,0 +1,40 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 C16_ihp130_sW1_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIB1 IB1 VSS 4e-05 +.nodeset v(IB1)=0.84 + +VCM VCM 0 0.6 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1_sL1/case.json new file mode 100644 index 00000000..ad4a9d0e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1_sL1/case.json @@ -0,0 +1,117 @@ +{ + "case_id": "C16_ihp130_sW1_sL1", + "circuit_id": "C16", + "pdk": "ihp130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "dut_name": "C16_ihp130_sW1_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "IB1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.26, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 0.26, + "nf": 8 + }, + "R1": { + "r": 12000.0, + "body": "VSS", + "w": 1.0, + "l": 46.385 + }, + "R2": { + "r": 12000.0, + "body": "VSS", + "w": 1.0, + "l": 46.385 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 4e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 0.6, + "CL": 1e-13 + }, + "category": "diff_r", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "c560286cd4977237", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "R1", + "R2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1_sL1/manifest.json new file mode 100644 index 00000000..d410f1d2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "27507c71d2eb76f51fcd65f1234525ef69edbd02eda8a1655fb88d346f523d47", + "qualification.json": "4155964589e28da4efe32b41cdb532a207b39acafcdef940316c7485eb418cd2", + "specs.json": "37c04ea856c5f08b869b93abc18587519122ae35d68c240e6e4e64bf26ae8939", + "target.spice": "8f74b8e40ee55ce1fd5305ab1d8d19373facfbb874e530a9cdc218a892d02708", + "target_lvs.spice": "d2404c2314782221c29f3c383e0f68c33f1f9d14316cdb22d93628eca5813c6a", + "testbench.spice": "473baf889dc30b0121212d46953fbb72deed651fc2e086d4098615fa7acddda6" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1_sL1/qualification.json new file mode 100644 index 00000000..bd210608 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1_sL1/qualification.json @@ -0,0 +1,84 @@ +{ + "case_id": "C16_ihp130_sW1_sL1", + "circuit_id": "C16", + "pdk": "ihp130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "diff_r", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "c560286cd4977237", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 83980000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 9.827807, + "f3db": 139975000.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.2, + "schematic_measures": { + "vo1": 0.9600281, + "vo2": 0.9600281, + "idd": 4e-05, + "vos_in": 0.0, + "gain_lf": 9.827807, + "f3db": 139975000.0, + "ugf": 412374600.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1_sL1/specs.json new file mode 100644 index 00000000..9b51ace4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 83980000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 9.827807, + "f3db": 139975000.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1_sL1/target.spice new file mode 100644 index 00000000..f15c0d1a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1_sL1/target.spice @@ -0,0 +1,6 @@ +.subckt C16_ihp130_sW1_sL1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 +XM1 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=4u l=0.26u ng=8 m=1 +XM2 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=4u l=0.26u ng=8 m=1 +XRR1 VDD VOUT1 rppd w=1u l=46.385u m=1 +XRR2 VDD VOUT2 rppd w=1u l=46.385u m=1 +.ends C16_ihp130_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1_sL1/target_lvs.spice new file mode 100644 index 00000000..55ec3746 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1_sL1/target_lvs.spice @@ -0,0 +1,20 @@ +.subckt C16_ihp130_sW1_sL1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 +XM1_f0 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f1 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f2 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f3 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f4 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f5 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f6 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f7 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f0 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f1 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f2 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f3 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f4 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f5 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f6 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f7 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XRR1 VDD VOUT1 rppd w=1u l=46.385u m=1 +XRR2 VDD VOUT2 rppd w=1u l=46.385u m=1 +.ends C16_ihp130_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1_sL1/testbench.spice new file mode 100644 index 00000000..e1880402 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1_sL1/testbench.spice @@ -0,0 +1,40 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 C16_ihp130_sW1_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIB1 IB1 VSS 4e-05 +.nodeset v(IB1)=0.84 + +VCM VCM 0 0.6 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1_sL2/case.json new file mode 100644 index 00000000..7c7f93e4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1_sL2/case.json @@ -0,0 +1,117 @@ +{ + "case_id": "C16_ihp130_sW1_sL2", + "circuit_id": "C16", + "pdk": "ihp130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "dut_name": "C16_ihp130_sW1_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "IB1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.52, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 0.52, + "nf": 8 + }, + "R1": { + "r": 12000.0, + "body": "VSS", + "w": 1.0, + "l": 46.385 + }, + "R2": { + "r": 12000.0, + "body": "VSS", + "w": 1.0, + "l": 46.385 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 4e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 0.6, + "CL": 1e-13 + }, + "category": "diff_r", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "f4f951893cec6bc8", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "R1", + "R2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1_sL2/manifest.json new file mode 100644 index 00000000..3b559870 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "49abbe4d95c4eacd9c3379292700513cd0fd15ce2ea3318211f5835d1c97f16f", + "qualification.json": "f15ab98d2ca1c8bf5097686530cdc4641d2b7ba911d350d2c81cf988399ec555", + "specs.json": "7fc7027058f2e427a5317a91d730225dede84891b39181016cca5e9803f15e87", + "target.spice": "4cc6146a79d8bde5e0858c06144bb5b49057db24e1c964292ffde290e3965744", + "target_lvs.spice": "12526d02f802870c541037e36fdb38b72ae545c92e88565e2186210d2b1d9867", + "testbench.spice": "8e68292fbf73a977b7f0e7f2be41b5371d26d6aeaec79f518be0c54196b719eb" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1_sL2/qualification.json new file mode 100644 index 00000000..0c16c12c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1_sL2/qualification.json @@ -0,0 +1,84 @@ +{ + "case_id": "C16_ihp130_sW1_sL2", + "circuit_id": "C16", + "pdk": "ihp130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "diff_r", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "f4f951893cec6bc8", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 80960000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 8.79747, + "f3db": 134939200.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.2, + "schematic_measures": { + "vo1": 0.9600282, + "vo2": 0.9600282, + "idd": 4e-05, + "vos_in": 0.0, + "gain_lf": 8.79747, + "f3db": 134939200.0, + "ugf": 347657700.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1_sL2/specs.json new file mode 100644 index 00000000..4a8264b6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 80960000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 8.79747, + "f3db": 134939200.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1_sL2/target.spice new file mode 100644 index 00000000..fc56e164 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1_sL2/target.spice @@ -0,0 +1,6 @@ +.subckt C16_ihp130_sW1_sL2 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 +XM1 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=4u l=0.52u ng=8 m=1 +XM2 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=4u l=0.52u ng=8 m=1 +XRR1 VDD VOUT1 rppd w=1u l=46.385u m=1 +XRR2 VDD VOUT2 rppd w=1u l=46.385u m=1 +.ends C16_ihp130_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1_sL2/target_lvs.spice new file mode 100644 index 00000000..01ea4838 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1_sL2/target_lvs.spice @@ -0,0 +1,20 @@ +.subckt C16_ihp130_sW1_sL2 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 +XM1_f0 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f1 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f2 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f3 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f4 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f5 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f6 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f7 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f0 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f1 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f2 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f3 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f4 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f5 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f6 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f7 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XRR1 VDD VOUT1 rppd w=1u l=46.385u m=1 +XRR2 VDD VOUT2 rppd w=1u l=46.385u m=1 +.ends C16_ihp130_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1_sL2/testbench.spice new file mode 100644 index 00000000..9cb2f3d4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW1_sL2/testbench.spice @@ -0,0 +1,40 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 C16_ihp130_sW1_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIB1 IB1 VSS 4e-05 +.nodeset v(IB1)=0.84 + +VCM VCM 0 0.6 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW2_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW2_sL1.5/case.json new file mode 100644 index 00000000..08fe6293 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW2_sL1.5/case.json @@ -0,0 +1,117 @@ +{ + "case_id": "C16_ihp130_sW2_sL1.5", + "circuit_id": "C16", + "pdk": "ihp130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "dut_name": "C16_ihp130_sW2_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "IB1" + ], + "sizing": { + "M1": { + "w": 8.0, + "l": 0.39, + "nf": 16 + }, + "M2": { + "w": 8.0, + "l": 0.39, + "nf": 16 + }, + "R1": { + "r": 12000.0, + "body": "VSS", + "w": 1.0, + "l": 46.385 + }, + "R2": { + "r": 12000.0, + "body": "VSS", + "w": 1.0, + "l": 46.385 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 4e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 0.6, + "CL": 1e-13 + }, + "category": "diff_r", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "397ffbf15ed43bea", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "R1", + "R2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW2_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW2_sL1.5/manifest.json new file mode 100644 index 00000000..c0a29165 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW2_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "791777213d2b9216c16ea48dc9688bc004822654f6d84745b83bece75e5f034c", + "qualification.json": "d6e0ee53a91e68d5b1b5505f5953309f5bb989d501691274187e4fcdc4e5d0d8", + "specs.json": "5ee549d46c734fc9ccec681d47c87c9aef9632a180200de87e977eacb0130cdc", + "target.spice": "ba20e9b8d0986b900037ddab60ba30bf02e66c8eeebe2977bc67b99b7c14eac1", + "target_lvs.spice": "11819bc79bce47fdeb0e5877c63ad17a37b1adee6c4303ed97e12124fd100348", + "testbench.spice": "f77f3bcdbdec0a94dbaa765cb85702fd4f78e21a9cae146513adfceaacff7adb" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW2_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW2_sL1.5/qualification.json new file mode 100644 index 00000000..befaa611 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW2_sL1.5/qualification.json @@ -0,0 +1,84 @@ +{ + "case_id": "C16_ihp130_sW2_sL1.5", + "circuit_id": "C16", + "pdk": "ihp130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "diff_r", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "397ffbf15ed43bea", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 8.072 + }, + "f3db": { + "min": 81670000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 11.0718, + "f3db": 136109000.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.4, + "schematic_measures": { + "vo1": 0.9600282, + "vo2": 0.9600282, + "idd": 4e-05, + "vos_in": 0.0, + "gain_lf": 11.0718, + "f3db": 136109000.0, + "ugf": 470402500.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW2_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW2_sL1.5/specs.json new file mode 100644 index 00000000..cd01c98b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW2_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 8.072 + }, + "f3db": { + "min": 81670000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 11.0718, + "f3db": 136109000.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW2_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW2_sL1.5/target.spice new file mode 100644 index 00000000..703328ef --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW2_sL1.5/target.spice @@ -0,0 +1,6 @@ +.subckt C16_ihp130_sW2_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 +XM1 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=8u l=0.39u ng=16 m=1 +XM2 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=8u l=0.39u ng=16 m=1 +XRR1 VDD VOUT1 rppd w=1u l=46.385u m=1 +XRR2 VDD VOUT2 rppd w=1u l=46.385u m=1 +.ends C16_ihp130_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW2_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW2_sL1.5/target_lvs.spice new file mode 100644 index 00000000..7c8ba715 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW2_sL1.5/target_lvs.spice @@ -0,0 +1,36 @@ +.subckt C16_ihp130_sW2_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 +XM1_f0 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f1 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f2 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f3 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f4 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f5 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f6 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f7 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f8 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f9 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f10 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f11 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f12 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f13 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f14 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f15 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f0 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f1 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f2 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f3 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f4 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f5 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f6 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f7 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f8 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f9 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f10 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f11 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f12 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f13 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f14 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f15 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.39u +XRR1 VDD VOUT1 rppd w=1u l=46.385u m=1 +XRR2 VDD VOUT2 rppd w=1u l=46.385u m=1 +.ends C16_ihp130_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW2_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW2_sL1.5/testbench.spice new file mode 100644 index 00000000..d8f49eb6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW2_sL1.5/testbench.spice @@ -0,0 +1,40 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 C16_ihp130_sW2_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIB1 IB1 VSS 4e-05 +.nodeset v(IB1)=0.84 + +VCM VCM 0 0.6 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW2_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW2_sL1/case.json new file mode 100644 index 00000000..d6fff638 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW2_sL1/case.json @@ -0,0 +1,117 @@ +{ + "case_id": "C16_ihp130_sW2_sL1", + "circuit_id": "C16", + "pdk": "ihp130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "dut_name": "C16_ihp130_sW2_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "IB1" + ], + "sizing": { + "M1": { + "w": 8.0, + "l": 0.26, + "nf": 16 + }, + "M2": { + "w": 8.0, + "l": 0.26, + "nf": 16 + }, + "R1": { + "r": 12000.0, + "body": "VSS", + "w": 1.0, + "l": 46.385 + }, + "R2": { + "r": 12000.0, + "body": "VSS", + "w": 1.0, + "l": 46.385 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 4e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 0.6, + "CL": 1e-13 + }, + "category": "diff_r", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.26, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.26, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "49f4a9c44985bba4", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "R1", + "R2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW2_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW2_sL1/manifest.json new file mode 100644 index 00000000..fa5cb7e0 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW2_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "ba5d48223049ab7c9554c2de81903712bddf3447d7ea2b14d986295e234b9ea0", + "qualification.json": "a2cacd33ae12b5459773e17caee7d46c7cab8cfb57ce6a5471dbc98d6a3f66c5", + "specs.json": "a3f2aae1816bb34c5a1de3b65ab8e42b5f41e39d6dabc8ad2722de188abd508a", + "target.spice": "fbfe910f3ef53e4d8bab1d06963b5f7ff6cadbff55892281b142aee0f04ba552", + "target_lvs.spice": "632657abd735350a1ddaeb69f93c6333f138021589b1ef83f12709537c699f8d", + "testbench.spice": "f27864dab17641e2d0b4aba7591757ceb641de3d474e90afdad7a743fa87dd52" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW2_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW2_sL1/qualification.json new file mode 100644 index 00000000..c0f27765 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW2_sL1/qualification.json @@ -0,0 +1,84 @@ +{ + "case_id": "C16_ihp130_sW2_sL1", + "circuit_id": "C16", + "pdk": "ihp130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "diff_r", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.26, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.26, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "49f4a9c44985bba4", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 8.48 + }, + "f3db": { + "min": 83560000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 11.47984, + "f3db": 139272800.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.4, + "schematic_measures": { + "vo1": 0.9600281, + "vo2": 0.9600281, + "idd": 4e-05, + "vos_in": 0.0, + "gain_lf": 11.47984, + "f3db": 139272800.0, + "ugf": 505411700.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW2_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW2_sL1/specs.json new file mode 100644 index 00000000..05c3951e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW2_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 8.48 + }, + "f3db": { + "min": 83560000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 11.47984, + "f3db": 139272800.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW2_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW2_sL1/target.spice new file mode 100644 index 00000000..7ce25afc --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW2_sL1/target.spice @@ -0,0 +1,6 @@ +.subckt C16_ihp130_sW2_sL1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 +XM1 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=8u l=0.26u ng=16 m=1 +XM2 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=8u l=0.26u ng=16 m=1 +XRR1 VDD VOUT1 rppd w=1u l=46.385u m=1 +XRR2 VDD VOUT2 rppd w=1u l=46.385u m=1 +.ends C16_ihp130_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW2_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW2_sL1/target_lvs.spice new file mode 100644 index 00000000..878fd873 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW2_sL1/target_lvs.spice @@ -0,0 +1,36 @@ +.subckt C16_ihp130_sW2_sL1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 +XM1_f0 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f1 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f2 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f3 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f4 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f5 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f6 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f7 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f8 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f9 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f10 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f11 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f12 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f13 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f14 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f15 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f0 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f1 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f2 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f3 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f4 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f5 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f6 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f7 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f8 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f9 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f10 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f11 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f12 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f13 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f14 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f15 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.26u +XRR1 VDD VOUT1 rppd w=1u l=46.385u m=1 +XRR2 VDD VOUT2 rppd w=1u l=46.385u m=1 +.ends C16_ihp130_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW2_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW2_sL1/testbench.spice new file mode 100644 index 00000000..9f71bcf2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW2_sL1/testbench.spice @@ -0,0 +1,40 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 C16_ihp130_sW2_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIB1 IB1 VSS 4e-05 +.nodeset v(IB1)=0.84 + +VCM VCM 0 0.6 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW2_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW2_sL2/case.json new file mode 100644 index 00000000..dcce6e8e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW2_sL2/case.json @@ -0,0 +1,117 @@ +{ + "case_id": "C16_ihp130_sW2_sL2", + "circuit_id": "C16", + "pdk": "ihp130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "dut_name": "C16_ihp130_sW2_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "IB1" + ], + "sizing": { + "M1": { + "w": 8.0, + "l": 0.52, + "nf": 16 + }, + "M2": { + "w": 8.0, + "l": 0.52, + "nf": 16 + }, + "R1": { + "r": 12000.0, + "body": "VSS", + "w": 1.0, + "l": 46.385 + }, + "R2": { + "r": 12000.0, + "body": "VSS", + "w": 1.0, + "l": 46.385 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 4e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 0.6, + "CL": 1e-13 + }, + "category": "diff_r", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "611a16c2cf270253", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "R1", + "R2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW2_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW2_sL2/manifest.json new file mode 100644 index 00000000..39c459da --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW2_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "77bcdce8135adc07ca15d376a7a4157add5e88c6933549f52ead75f7cd9faa83", + "qualification.json": "90898f4936a0020e2816a717c8d5538e346b945f55771bbc6f406a3f21db37fa", + "specs.json": "4d5df9b2e413e1e5eba7166fad89d09460861ac04dbef93bccd8729ffd95a139", + "target.spice": "731050e9e4c3211f266612e0fe289f4ee4d36d0f62797b7c1f2249c8817058e1", + "target_lvs.spice": "fe91e7a414085bf1eb51a172583c1d9043973496f35620b07c749193eb4f9980", + "testbench.spice": "98f07d2984bed783d8f07b3fd5bd0a7f878ad6e266e693098f29255a51d95bfd" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW2_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW2_sL2/qualification.json new file mode 100644 index 00000000..d16889a0 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW2_sL2/qualification.json @@ -0,0 +1,84 @@ +{ + "case_id": "C16_ihp130_sW2_sL2", + "circuit_id": "C16", + "pdk": "ihp130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "diff_r", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "611a16c2cf270253", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 80290000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 10.6453, + "f3db": 133821800.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.4, + "schematic_measures": { + "vo1": 0.9600282, + "vo2": 0.9600282, + "idd": 3.999999e-05, + "vos_in": -3.63798e-12, + "gain_lf": 10.6453, + "f3db": 133821800.0, + "ugf": 438722600.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW2_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW2_sL2/specs.json new file mode 100644 index 00000000..101d2881 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW2_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 80290000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 10.6453, + "f3db": 133821800.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW2_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW2_sL2/target.spice new file mode 100644 index 00000000..0057ed31 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW2_sL2/target.spice @@ -0,0 +1,6 @@ +.subckt C16_ihp130_sW2_sL2 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 +XM1 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=8u l=0.52u ng=16 m=1 +XM2 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=8u l=0.52u ng=16 m=1 +XRR1 VDD VOUT1 rppd w=1u l=46.385u m=1 +XRR2 VDD VOUT2 rppd w=1u l=46.385u m=1 +.ends C16_ihp130_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW2_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW2_sL2/target_lvs.spice new file mode 100644 index 00000000..52834cd8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW2_sL2/target_lvs.spice @@ -0,0 +1,36 @@ +.subckt C16_ihp130_sW2_sL2 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 +XM1_f0 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f1 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f2 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f3 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f4 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f5 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f6 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f7 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f8 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f9 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f10 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f11 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f12 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f13 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f14 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f15 VOUT1 VIN1 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f0 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f1 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f2 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f3 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f4 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f5 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f6 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f7 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f8 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f9 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f10 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f11 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f12 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f13 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f14 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f15 VOUT2 VIN2 IB1 VSS sg13_lv_nmos w=0.5u l=0.52u +XRR1 VDD VOUT1 rppd w=1u l=46.385u m=1 +XRR2 VDD VOUT2 rppd w=1u l=46.385u m=1 +.ends C16_ihp130_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW2_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW2_sL2/testbench.spice new file mode 100644 index 00000000..4f1c7149 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/ihp130/sW2_sL2/testbench.spice @@ -0,0 +1,40 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 C16_ihp130_sW2_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +IIB1 IB1 VSS 4e-05 +.nodeset v(IB1)=0.84 + +VCM VCM 0 0.6 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C16/sky130/sW0.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW0.5_sL1.5/case.json new file mode 100644 index 00000000..6add528a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW0.5_sL1.5/case.json @@ -0,0 +1,117 @@ +{ + "case_id": "C16_sky130_sW0.5_sL1.5", + "circuit_id": "C16", + "pdk": "sky130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "dut_name": "C16_sky130_sW0.5_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "IB1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.45, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 0.45, + "nf": 4 + }, + "R1": { + "r": 20000.0, + "body": "VSS", + "w": 0.35, + "l": 17.55 + }, + "R2": { + "r": 20000.0, + "body": "VSS", + "w": 0.35, + "l": 17.55 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 4e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 0.9, + "CL": 1e-13 + }, + "category": "diff_r", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "df610f73af6cd6e4", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "R1", + "R2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/sky130/sW0.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW0.5_sL1.5/manifest.json new file mode 100644 index 00000000..70f015a8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW0.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "dbfe6febed54f0b394a24eb49a5f42dcb00654b2233e798b449dedce0d333161", + "qualification.json": "7dca3f0630f6f62c0318ef8bb287473761f9dc211319a4e1ef25458fdbdb2767", + "specs.json": "8affda751062c21b9539d90588ca15752f5ce1acf7f9f779fd8987acd6d9aabe", + "target.spice": "7c23f8bdd2e6e9f5b1e048c0eebec1478a4e5d8a0aa1116dfcba05d6d5670fbc", + "target_lvs.spice": "84af8e3e7bdac99655afc29154f9ae2002c1ae88e571ad123ed374acb420a3c4", + "testbench.spice": "617a94417c8dbb6ea112a6d3f8996b5b443e119651aaac9f8adf5949f59b2509" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/sky130/sW0.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW0.5_sL1.5/qualification.json new file mode 100644 index 00000000..9cb81b7e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW0.5_sL1.5/qualification.json @@ -0,0 +1,84 @@ +{ + "case_id": "C16_sky130_sW0.5_sL1.5", + "circuit_id": "C16", + "pdk": "sky130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "diff_r", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "df610f73af6cd6e4", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 8.188 + }, + "f3db": { + "min": 48280000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 11.1881, + "f3db": 80474360.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 8.8, + "schematic_measures": { + "vo1": 1.39783, + "vo2": 1.39783, + "idd": 4.000012e-05, + "vos_in": 0.0, + "gain_lf": 11.1881, + "f3db": 80474360.0, + "ugf": 281208300.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/sky130/sW0.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW0.5_sL1.5/specs.json new file mode 100644 index 00000000..71d011d9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW0.5_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 8.188 + }, + "f3db": { + "min": 48280000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 11.1881, + "f3db": 80474360.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/sky130/sW0.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW0.5_sL1.5/target.spice new file mode 100644 index 00000000..3687030a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW0.5_sL1.5/target.spice @@ -0,0 +1,6 @@ +.subckt C16_sky130_sW0.5_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 +XM1 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=2 l=0.45 nf=4 +XM2 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=2 l=0.45 nf=4 +XRR1 VDD VOUT1 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +XRR2 VDD VOUT2 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +.ends C16_sky130_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C16/sky130/sW0.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW0.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..387a8b8a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW0.5_sL1.5/target_lvs.spice @@ -0,0 +1,12 @@ +.subckt C16_sky130_sW0.5_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 +XM1_f0 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f1 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f2 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f3 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f0 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f1 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f2 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f3 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XRR1 VDD VOUT1 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +XRR2 VDD VOUT2 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +.ends C16_sky130_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C16/sky130/sW0.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW0.5_sL1.5/testbench.spice new file mode 100644 index 00000000..f70c7df0 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW0.5_sL1.5/testbench.spice @@ -0,0 +1,40 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 C16_sky130_sW0.5_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIB1 IB1 VSS 4e-05 +.nodeset v(IB1)=1.26 + +VCM VCM 0 0.9 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C16/sky130/sW0.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW0.5_sL1/case.json new file mode 100644 index 00000000..ed091571 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW0.5_sL1/case.json @@ -0,0 +1,117 @@ +{ + "case_id": "C16_sky130_sW0.5_sL1", + "circuit_id": "C16", + "pdk": "sky130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "dut_name": "C16_sky130_sW0.5_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "IB1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.3, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 0.3, + "nf": 4 + }, + "R1": { + "r": 20000.0, + "body": "VSS", + "w": 0.35, + "l": 17.55 + }, + "R2": { + "r": 20000.0, + "body": "VSS", + "w": 0.35, + "l": 17.55 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 4e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 0.9, + "CL": 1e-13 + }, + "category": "diff_r", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "23ba434e91ba9cc6", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "R1", + "R2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/sky130/sW0.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW0.5_sL1/manifest.json new file mode 100644 index 00000000..a454af1e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW0.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "a6ae41f238f3d7a1f49fcf5722898f29b48559429ab5cd2255fc2224a489cc4e", + "qualification.json": "f61d974a39c83e01b5476533c6ba86e4cce86f24f31482fab84d1a64c544aca0", + "specs.json": "2609acc976355045a6705c497a3183c26632de0dbb01f97abb6744612d2c191c", + "target.spice": "6fae1f80d6484cef726a6756dfc4b4d606d8c22ff3bdb6e0c89f2bfcdfffef5b", + "target_lvs.spice": "ecf8d5e91653c50dc1f28dc2fa50aa7a04891d7498d640310ba3c2c3afa6fb6c", + "testbench.spice": "ee287c43a81a55176f223410f988afcddfdd3f2c2f5039b3858d1b39214a1815" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/sky130/sW0.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW0.5_sL1/qualification.json new file mode 100644 index 00000000..8ae7e167 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW0.5_sL1/qualification.json @@ -0,0 +1,84 @@ +{ + "case_id": "C16_sky130_sW0.5_sL1", + "circuit_id": "C16", + "pdk": "sky130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "diff_r", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "23ba434e91ba9cc6", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 9.459 + }, + "f3db": { + "min": 49390000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 12.45872, + "f3db": 82314190.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 7.0, + "schematic_measures": { + "vo1": 1.397826, + "vo2": 1.397826, + "idd": 4.000047e-05, + "vos_in": 0.0, + "gain_lf": 12.45872, + "f3db": 82314190.0, + "ugf": 336834500.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/sky130/sW0.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW0.5_sL1/specs.json new file mode 100644 index 00000000..2e0007e8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW0.5_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 9.459 + }, + "f3db": { + "min": 49390000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 12.45872, + "f3db": 82314190.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/sky130/sW0.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW0.5_sL1/target.spice new file mode 100644 index 00000000..3910457d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW0.5_sL1/target.spice @@ -0,0 +1,6 @@ +.subckt C16_sky130_sW0.5_sL1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 +XM1 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=2 l=0.3 nf=4 +XM2 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=2 l=0.3 nf=4 +XRR1 VDD VOUT1 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +XRR2 VDD VOUT2 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +.ends C16_sky130_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C16/sky130/sW0.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW0.5_sL1/target_lvs.spice new file mode 100644 index 00000000..a2792921 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW0.5_sL1/target_lvs.spice @@ -0,0 +1,12 @@ +.subckt C16_sky130_sW0.5_sL1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 +XM1_f0 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f1 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f2 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f3 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f0 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f1 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f2 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f3 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XRR1 VDD VOUT1 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +XRR2 VDD VOUT2 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +.ends C16_sky130_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C16/sky130/sW0.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW0.5_sL1/testbench.spice new file mode 100644 index 00000000..619b9c72 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW0.5_sL1/testbench.spice @@ -0,0 +1,40 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 C16_sky130_sW0.5_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIB1 IB1 VSS 4e-05 +.nodeset v(IB1)=1.26 + +VCM VCM 0 0.9 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C16/sky130/sW0.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW0.5_sL2/case.json new file mode 100644 index 00000000..3e98c0b0 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW0.5_sL2/case.json @@ -0,0 +1,117 @@ +{ + "case_id": "C16_sky130_sW0.5_sL2", + "circuit_id": "C16", + "pdk": "sky130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "dut_name": "C16_sky130_sW0.5_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "IB1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.6, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 0.6, + "nf": 4 + }, + "R1": { + "r": 20000.0, + "body": "VSS", + "w": 0.35, + "l": 17.55 + }, + "R2": { + "r": 20000.0, + "body": "VSS", + "w": 0.35, + "l": 17.55 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 4e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 0.9, + "CL": 1e-13 + }, + "category": "diff_r", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "f98f1ab65c511c92", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "R1", + "R2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/sky130/sW0.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW0.5_sL2/manifest.json new file mode 100644 index 00000000..f0bd8272 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW0.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "f3f3efcb20e2fde825296240fb09c8450518254d50bf1d96cfb76b008c7d95d6", + "qualification.json": "e50cca7a8a13c6a6848404a2052d9c118e5f61b10b603ef4f0e1593b39d36a5a", + "specs.json": "eeb478ddd9eca80d2389289946888e4add9421fdfdfda2458ec85a7effaa26c6", + "target.spice": "95adef4f83c75995e7e1dce90dfc36b21ddf032a28c5e3d127c749b9b9aac0b8", + "target_lvs.spice": "b34a6b94d79da5fd37976536f5165482158227be66fa65bbf0ffdb5011a6ca04", + "testbench.spice": "0fa05d37c4b83cc2ed2a732e44a26bf93fd1f6fab207b0735f7ed5752b3db86c" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/sky130/sW0.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW0.5_sL2/qualification.json new file mode 100644 index 00000000..4f87b42f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW0.5_sL2/qualification.json @@ -0,0 +1,84 @@ +{ + "case_id": "C16_sky130_sW0.5_sL2", + "circuit_id": "C16", + "pdk": "sky130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "diff_r", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "f98f1ab65c511c92", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 47650000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 10.11452, + "f3db": 79422910.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 10.2, + "schematic_measures": { + "vo1": 1.39783, + "vo2": 1.39783, + "idd": 4.00001e-05, + "vos_in": -1.81899e-12, + "gain_lf": 10.11452, + "f3db": 79422910.0, + "ugf": 242691900.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/sky130/sW0.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW0.5_sL2/specs.json new file mode 100644 index 00000000..ab5cbdd4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW0.5_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 47650000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 10.11452, + "f3db": 79422910.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/sky130/sW0.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW0.5_sL2/target.spice new file mode 100644 index 00000000..94077ed6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW0.5_sL2/target.spice @@ -0,0 +1,6 @@ +.subckt C16_sky130_sW0.5_sL2 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 +XM1 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=2 l=0.6 nf=4 +XM2 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=2 l=0.6 nf=4 +XRR1 VDD VOUT1 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +XRR2 VDD VOUT2 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +.ends C16_sky130_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C16/sky130/sW0.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW0.5_sL2/target_lvs.spice new file mode 100644 index 00000000..3c89c6ec --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW0.5_sL2/target_lvs.spice @@ -0,0 +1,12 @@ +.subckt C16_sky130_sW0.5_sL2 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 +XM1_f0 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f1 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f2 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f3 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f0 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f1 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f2 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f3 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XRR1 VDD VOUT1 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +XRR2 VDD VOUT2 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +.ends C16_sky130_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C16/sky130/sW0.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW0.5_sL2/testbench.spice new file mode 100644 index 00000000..0bad7089 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW0.5_sL2/testbench.spice @@ -0,0 +1,40 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 C16_sky130_sW0.5_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIB1 IB1 VSS 4e-05 +.nodeset v(IB1)=1.26 + +VCM VCM 0 0.9 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1.5_sL1.5/case.json new file mode 100644 index 00000000..ede2aee3 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1.5_sL1.5/case.json @@ -0,0 +1,117 @@ +{ + "case_id": "C16_sky130_sW1.5_sL1.5", + "circuit_id": "C16", + "pdk": "sky130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "dut_name": "C16_sky130_sW1.5_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "IB1" + ], + "sizing": { + "M1": { + "w": 6.0, + "l": 0.45, + "nf": 12 + }, + "M2": { + "w": 6.0, + "l": 0.45, + "nf": 12 + }, + "R1": { + "r": 20000.0, + "body": "VSS", + "w": 0.35, + "l": 17.55 + }, + "R2": { + "r": 20000.0, + "body": "VSS", + "w": 0.35, + "l": 17.55 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 4e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 0.9, + "CL": 1e-13 + }, + "category": "diff_r", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.45, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.45, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "7a72245721f90e8b", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "R1", + "R2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1.5_sL1.5/manifest.json new file mode 100644 index 00000000..fc4500b6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "348e37a3d0720d8537d1b764925043d53648ebeb801b51a7c574096b0a74ec0a", + "qualification.json": "64d20783f2bdec72deb3fdb29deca709c5dfe31d0a8a8d40d535a9aee954cf9b", + "specs.json": "2c99b8f4347d2f3b9426f4b8baed738abcaa82f9db3e5c7edb031d5af591a4ae", + "target.spice": "75e2177b91315731a625b4e681550af4b709e0fa033ce5638ce9657824a7113c", + "target_lvs.spice": "f919ce1d8c9e3b71c0a1b59b736acbc96f1a6beccd4dc515fc214a388b27bd67", + "testbench.spice": "d0133cf372bf45ee5186a205d1cc2447146a543fa5e51fbe6215eb18e13dad46" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1.5_sL1.5/qualification.json new file mode 100644 index 00000000..538039f8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1.5_sL1.5/qualification.json @@ -0,0 +1,84 @@ +{ + "case_id": "C16_sky130_sW1.5_sL1.5", + "circuit_id": "C16", + "pdk": "sky130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "diff_r", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.45, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.45, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "7a72245721f90e8b", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 11.76 + }, + "f3db": { + "min": 48220000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 14.76196, + "f3db": 80371300.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 7.6, + "schematic_measures": { + "vo1": 1.39783, + "vo2": 1.39783, + "idd": 4.000012e-05, + "vos_in": -3.63798e-12, + "gain_lf": 14.76196, + "f3db": 80371300.0, + "ugf": 434498500.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1.5_sL1.5/specs.json new file mode 100644 index 00000000..3dd08b94 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1.5_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 11.76 + }, + "f3db": { + "min": 48220000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 14.76196, + "f3db": 80371300.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1.5_sL1.5/target.spice new file mode 100644 index 00000000..4b3d7301 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1.5_sL1.5/target.spice @@ -0,0 +1,6 @@ +.subckt C16_sky130_sW1.5_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 +XM1 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=6 l=0.45 nf=12 +XM2 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=6 l=0.45 nf=12 +XRR1 VDD VOUT1 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +XRR2 VDD VOUT2 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +.ends C16_sky130_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..5777cd41 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1.5_sL1.5/target_lvs.spice @@ -0,0 +1,28 @@ +.subckt C16_sky130_sW1.5_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 +XM1_f0 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f1 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f2 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f3 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f4 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f5 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f6 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f7 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f8 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f9 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f10 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f11 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f0 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f1 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f2 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f3 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f4 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f5 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f6 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f7 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f8 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f9 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f10 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f11 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XRR1 VDD VOUT1 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +XRR2 VDD VOUT2 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +.ends C16_sky130_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1.5_sL1.5/testbench.spice new file mode 100644 index 00000000..b9c77c66 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1.5_sL1.5/testbench.spice @@ -0,0 +1,40 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 C16_sky130_sW1.5_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIB1 IB1 VSS 4e-05 +.nodeset v(IB1)=1.26 + +VCM VCM 0 0.9 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1.5_sL1/case.json new file mode 100644 index 00000000..8ebf61b6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1.5_sL1/case.json @@ -0,0 +1,117 @@ +{ + "case_id": "C16_sky130_sW1.5_sL1", + "circuit_id": "C16", + "pdk": "sky130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "dut_name": "C16_sky130_sW1.5_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "IB1" + ], + "sizing": { + "M1": { + "w": 6.0, + "l": 0.3, + "nf": 12 + }, + "M2": { + "w": 6.0, + "l": 0.3, + "nf": 12 + }, + "R1": { + "r": 20000.0, + "body": "VSS", + "w": 0.35, + "l": 17.55 + }, + "R2": { + "r": 20000.0, + "body": "VSS", + "w": 0.35, + "l": 17.55 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 4e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 0.9, + "CL": 1e-13 + }, + "category": "diff_r", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.3, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.3, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "10a907dd00787c1a", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "R1", + "R2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1.5_sL1/manifest.json new file mode 100644 index 00000000..3d3d9da1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "6609f998f925f7f07d7e136a832c0d1e407144c79cbbeb1f0180052a6492c4b7", + "qualification.json": "1767e55fbf06309542ec2cd6c827314adaba27efa1d6705b8706b9db2387b7e8", + "specs.json": "c26b393cfbb45cf670ecff5222da4cc93b4917c959ee35cc50bb77ef11f910db", + "target.spice": "2d73328f72703799b8b05ae40d7826ba7311484e09c8a053028cabdc8ebf627e", + "target_lvs.spice": "351727ef70b808cd81e02da89171289613b5f19be2b3bafd59019a7310baf238", + "testbench.spice": "ccc37eb77da96a1c9ef382a4246d1a415810d741d3fd5d9526fe7106434f9764" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1.5_sL1/qualification.json new file mode 100644 index 00000000..492580f2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1.5_sL1/qualification.json @@ -0,0 +1,84 @@ +{ + "case_id": "C16_sky130_sW1.5_sL1", + "circuit_id": "C16", + "pdk": "sky130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "diff_r", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.3, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.3, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "10a907dd00787c1a", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 12.26 + }, + "f3db": { + "min": 49780000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 15.25772, + "f3db": 82972260.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 9.7, + "schematic_measures": { + "vo1": 1.397827, + "vo2": 1.397827, + "idd": 4.000039e-05, + "vos_in": 0.0, + "gain_lf": 15.25772, + "f3db": 82972260.0, + "ugf": 475653900.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1.5_sL1/specs.json new file mode 100644 index 00000000..b3cd6cce --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1.5_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 12.26 + }, + "f3db": { + "min": 49780000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 15.25772, + "f3db": 82972260.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1.5_sL1/target.spice new file mode 100644 index 00000000..6016465c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1.5_sL1/target.spice @@ -0,0 +1,6 @@ +.subckt C16_sky130_sW1.5_sL1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 +XM1 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=6 l=0.3 nf=12 +XM2 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=6 l=0.3 nf=12 +XRR1 VDD VOUT1 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +XRR2 VDD VOUT2 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +.ends C16_sky130_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1.5_sL1/target_lvs.spice new file mode 100644 index 00000000..01d56f9e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1.5_sL1/target_lvs.spice @@ -0,0 +1,28 @@ +.subckt C16_sky130_sW1.5_sL1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 +XM1_f0 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f1 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f2 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f3 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f4 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f5 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f6 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f7 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f8 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f9 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f10 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f11 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f0 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f1 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f2 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f3 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f4 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f5 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f6 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f7 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f8 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f9 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f10 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f11 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XRR1 VDD VOUT1 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +XRR2 VDD VOUT2 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +.ends C16_sky130_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1.5_sL1/testbench.spice new file mode 100644 index 00000000..5720c0c4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1.5_sL1/testbench.spice @@ -0,0 +1,40 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 C16_sky130_sW1.5_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIB1 IB1 VSS 4e-05 +.nodeset v(IB1)=1.26 + +VCM VCM 0 0.9 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1.5_sL2/case.json new file mode 100644 index 00000000..5e84a259 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1.5_sL2/case.json @@ -0,0 +1,117 @@ +{ + "case_id": "C16_sky130_sW1.5_sL2", + "circuit_id": "C16", + "pdk": "sky130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "dut_name": "C16_sky130_sW1.5_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "IB1" + ], + "sizing": { + "M1": { + "w": 6.0, + "l": 0.6, + "nf": 12 + }, + "M2": { + "w": 6.0, + "l": 0.6, + "nf": 12 + }, + "R1": { + "r": 20000.0, + "body": "VSS", + "w": 0.35, + "l": 17.55 + }, + "R2": { + "r": 20000.0, + "body": "VSS", + "w": 0.35, + "l": 17.55 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 4e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 0.9, + "CL": 1e-13 + }, + "category": "diff_r", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.6, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.6, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "f571453fdd7e17ca", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "R1", + "R2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1.5_sL2/manifest.json new file mode 100644 index 00000000..43c8e89c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "064d889061101b3204b093c405acd9ec500adf45ed0df05505cfbe6bd770bc11", + "qualification.json": "f5831616f4676ae19f6387467ead54cc2289e513f05e0a90c9a57d84446ba674", + "specs.json": "f1450d04ca301b98d5e722f8c95e8ad4067ded998c29231639c5ae9680275927", + "target.spice": "fbaf91e9fb47919a9521a03e3fdc860a32c69d1ca99db4a239312265e6718f3b", + "target_lvs.spice": "b6abee407f2749f3956d4e93ec853fef807df293bff634f3b04e8a6727ad8cd8", + "testbench.spice": "a76303e1cc8d2d623968b1e5458240b27b9811acd9177c87e7deee6dc59dd23a" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1.5_sL2/qualification.json new file mode 100644 index 00000000..3aa129c8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1.5_sL2/qualification.json @@ -0,0 +1,84 @@ +{ + "case_id": "C16_sky130_sW1.5_sL2", + "circuit_id": "C16", + "pdk": "sky130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "diff_r", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.6, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.6, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "f571453fdd7e17ca", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 11.14 + }, + "f3db": { + "min": 47300000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 14.1392, + "f3db": 78827960.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 6.2, + "schematic_measures": { + "vo1": 1.39783, + "vo2": 1.39783, + "idd": 4.000011e-05, + "vos_in": 0.0, + "gain_lf": 14.1392, + "f3db": 78827960.0, + "ugf": 395668900.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1.5_sL2/specs.json new file mode 100644 index 00000000..435e7f9f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1.5_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 11.14 + }, + "f3db": { + "min": 47300000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 14.1392, + "f3db": 78827960.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1.5_sL2/target.spice new file mode 100644 index 00000000..98ae5a5f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1.5_sL2/target.spice @@ -0,0 +1,6 @@ +.subckt C16_sky130_sW1.5_sL2 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 +XM1 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=6 l=0.6 nf=12 +XM2 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=6 l=0.6 nf=12 +XRR1 VDD VOUT1 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +XRR2 VDD VOUT2 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +.ends C16_sky130_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1.5_sL2/target_lvs.spice new file mode 100644 index 00000000..b4062766 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1.5_sL2/target_lvs.spice @@ -0,0 +1,28 @@ +.subckt C16_sky130_sW1.5_sL2 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 +XM1_f0 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f1 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f2 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f3 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f4 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f5 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f6 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f7 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f8 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f9 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f10 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f11 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f0 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f1 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f2 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f3 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f4 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f5 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f6 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f7 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f8 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f9 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f10 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f11 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XRR1 VDD VOUT1 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +XRR2 VDD VOUT2 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +.ends C16_sky130_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1.5_sL2/testbench.spice new file mode 100644 index 00000000..bd53e76a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1.5_sL2/testbench.spice @@ -0,0 +1,40 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 C16_sky130_sW1.5_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIB1 IB1 VSS 4e-05 +.nodeset v(IB1)=1.26 + +VCM VCM 0 0.9 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1_sL1.5/case.json new file mode 100644 index 00000000..290fbccc --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1_sL1.5/case.json @@ -0,0 +1,117 @@ +{ + "case_id": "C16_sky130_sW1_sL1.5", + "circuit_id": "C16", + "pdk": "sky130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "dut_name": "C16_sky130_sW1_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "IB1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.45, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 0.45, + "nf": 8 + }, + "R1": { + "r": 20000.0, + "body": "VSS", + "w": 0.35, + "l": 17.55 + }, + "R2": { + "r": 20000.0, + "body": "VSS", + "w": 0.35, + "l": 17.55 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 4e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 0.9, + "CL": 1e-13 + }, + "category": "diff_r", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "80bd48e9e064726a", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "R1", + "R2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1_sL1.5/manifest.json new file mode 100644 index 00000000..251bfb19 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "1d7b1b0d34c0dcbc480fa440bf550681e857b81fed6d0a9d60399b05a080ab24", + "qualification.json": "5af629ada60d553f10e841ae089f53e72c03a224685c41f8b65b31a574401f72", + "specs.json": "03c2b8cb4dea304a6f66521b04e487fb0194ff67c45e4af3e3e705ae3af3c33c", + "target.spice": "43ddbf4a4eb6a572e0248c50b9e07b46e25becf55114cbebd24a6d6311de19b3", + "target_lvs.spice": "15d23ede3f5001ef02b937b71713b8a59bfbde7ef56bad815e40ef6ad9c0de22", + "testbench.spice": "57cbd4a09d81ede59bc894d373f4d867ad67b194c10d4ba7ec0be771a2646382" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1_sL1.5/qualification.json new file mode 100644 index 00000000..aaa05239 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1_sL1.5/qualification.json @@ -0,0 +1,84 @@ +{ + "case_id": "C16_sky130_sW1_sL1.5", + "circuit_id": "C16", + "pdk": "sky130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "diff_r", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "80bd48e9e064726a", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 10.62 + }, + "f3db": { + "min": 48330000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 13.62179, + "f3db": 80548140.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 6.6, + "schematic_measures": { + "vo1": 1.39783, + "vo2": 1.39783, + "idd": 4.000012e-05, + "vos_in": 0.0, + "gain_lf": 13.62179, + "f3db": 80548140.0, + "ugf": 379720000.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1_sL1.5/specs.json new file mode 100644 index 00000000..6e9f5984 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 10.62 + }, + "f3db": { + "min": 48330000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 13.62179, + "f3db": 80548140.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1_sL1.5/target.spice new file mode 100644 index 00000000..73e31b38 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1_sL1.5/target.spice @@ -0,0 +1,6 @@ +.subckt C16_sky130_sW1_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 +XM1 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=4 l=0.45 nf=8 +XM2 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=4 l=0.45 nf=8 +XRR1 VDD VOUT1 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +XRR2 VDD VOUT2 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +.ends C16_sky130_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1_sL1.5/target_lvs.spice new file mode 100644 index 00000000..2246f450 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1_sL1.5/target_lvs.spice @@ -0,0 +1,20 @@ +.subckt C16_sky130_sW1_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 +XM1_f0 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f1 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f2 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f3 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f4 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f5 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f6 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f7 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f0 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f1 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f2 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f3 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f4 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f5 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f6 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f7 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XRR1 VDD VOUT1 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +XRR2 VDD VOUT2 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +.ends C16_sky130_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1_sL1.5/testbench.spice new file mode 100644 index 00000000..2828a4f0 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1_sL1.5/testbench.spice @@ -0,0 +1,40 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 C16_sky130_sW1_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIB1 IB1 VSS 4e-05 +.nodeset v(IB1)=1.26 + +VCM VCM 0 0.9 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1_sL1/case.json new file mode 100644 index 00000000..8c236b10 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1_sL1/case.json @@ -0,0 +1,117 @@ +{ + "case_id": "C16_sky130_sW1_sL1", + "circuit_id": "C16", + "pdk": "sky130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "dut_name": "C16_sky130_sW1_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "IB1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.3, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 0.3, + "nf": 8 + }, + "R1": { + "r": 20000.0, + "body": "VSS", + "w": 0.35, + "l": 17.55 + }, + "R2": { + "r": 20000.0, + "body": "VSS", + "w": 0.35, + "l": 17.55 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 4e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 0.9, + "CL": 1e-13 + }, + "category": "diff_r", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "4832805b1b446506", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "R1", + "R2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1_sL1/manifest.json new file mode 100644 index 00000000..2b447b72 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "edf3952122a925b66a8f8c369a5af9fef80b36bfc56d42b9ac6418b076c16218", + "qualification.json": "6e354045a3dfd7760ee2d2b2fdbd23fc11d0e938a57d17c0b16536a3f64d7a32", + "specs.json": "f42ddd640188b11220640f5125d7f12313306097b6bd6b5cbab97a9eb6eebf25", + "target.spice": "7e6cce549206ae5aaad979dd63075d42d0804e681bdd83f3d2a1b1493b0e3c53", + "target_lvs.spice": "0333ba0d60e2867666a67f6f857814e3fa34500de3825a4aebe93f0795963c53", + "testbench.spice": "737f4e0294630240c16515ea621a3f61b7254043eb4c759a1b2dd77d78478c38" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1_sL1/qualification.json new file mode 100644 index 00000000..9e292147 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1_sL1/qualification.json @@ -0,0 +1,84 @@ +{ + "case_id": "C16_sky130_sW1_sL1", + "circuit_id": "C16", + "pdk": "sky130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "diff_r", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "4832805b1b446506", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 11.4 + }, + "f3db": { + "min": 49720000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 14.39639, + "f3db": 82864900.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 9.9, + "schematic_measures": { + "vo1": 1.397827, + "vo2": 1.397827, + "idd": 4.000041e-05, + "vos_in": 0.0, + "gain_lf": 14.39639, + "f3db": 82864900.0, + "ugf": 428504800.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1_sL1/specs.json new file mode 100644 index 00000000..abcbda7b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 11.4 + }, + "f3db": { + "min": 49720000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 14.39639, + "f3db": 82864900.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1_sL1/target.spice new file mode 100644 index 00000000..5d4b69c4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1_sL1/target.spice @@ -0,0 +1,6 @@ +.subckt C16_sky130_sW1_sL1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 +XM1 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=4 l=0.3 nf=8 +XM2 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=4 l=0.3 nf=8 +XRR1 VDD VOUT1 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +XRR2 VDD VOUT2 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +.ends C16_sky130_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1_sL1/target_lvs.spice new file mode 100644 index 00000000..b6021c91 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1_sL1/target_lvs.spice @@ -0,0 +1,20 @@ +.subckt C16_sky130_sW1_sL1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 +XM1_f0 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f1 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f2 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f3 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f4 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f5 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f6 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f7 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f0 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f1 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f2 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f3 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f4 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f5 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f6 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f7 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XRR1 VDD VOUT1 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +XRR2 VDD VOUT2 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +.ends C16_sky130_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1_sL1/testbench.spice new file mode 100644 index 00000000..171068b5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1_sL1/testbench.spice @@ -0,0 +1,40 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 C16_sky130_sW1_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIB1 IB1 VSS 4e-05 +.nodeset v(IB1)=1.26 + +VCM VCM 0 0.9 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1_sL2/case.json new file mode 100644 index 00000000..f0e2a0b0 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1_sL2/case.json @@ -0,0 +1,117 @@ +{ + "case_id": "C16_sky130_sW1_sL2", + "circuit_id": "C16", + "pdk": "sky130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "dut_name": "C16_sky130_sW1_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "IB1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.6, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 0.6, + "nf": 8 + }, + "R1": { + "r": 20000.0, + "body": "VSS", + "w": 0.35, + "l": 17.55 + }, + "R2": { + "r": 20000.0, + "body": "VSS", + "w": 0.35, + "l": 17.55 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 4e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 0.9, + "CL": 1e-13 + }, + "category": "diff_r", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "1062603d06092a5e", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "R1", + "R2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1_sL2/manifest.json new file mode 100644 index 00000000..a6f3fb14 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "bd1c96114f9563dee74bf149bef74e74e8119a33d38d4ec6f1a053efc9b88925", + "qualification.json": "9f96487ee7ca8554c452a8a74f1b4052bcf275757eddc25f276ebdb4fbd16021", + "specs.json": "16c627989236245b6333dd08b2556198a6ea6920da6412e441c9d7d52e99f698", + "target.spice": "17c505fcc8cff050b7ce3540023219acc75f7ce7bf1f6086f82f3666df065fd4", + "target_lvs.spice": "624e0b09501615e070e8377d35c5cbac0db031c54eadf57c3e4377862d201012", + "testbench.spice": "f0b2dc3f9d618f7c92cf1989cdadf34758ac2e80a7f44d68968a2c62383dd8fb" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1_sL2/qualification.json new file mode 100644 index 00000000..ff0af324 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1_sL2/qualification.json @@ -0,0 +1,84 @@ +{ + "case_id": "C16_sky130_sW1_sL2", + "circuit_id": "C16", + "pdk": "sky130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "diff_r", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "1062603d06092a5e", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 9.83 + }, + "f3db": { + "min": 47510000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 12.82955, + "f3db": 79176130.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 6.2, + "schematic_measures": { + "vo1": 1.39783, + "vo2": 1.39783, + "idd": 4.00001e-05, + "vos_in": 0.0, + "gain_lf": 12.82955, + "f3db": 79176130.0, + "ugf": 339298000.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1_sL2/specs.json new file mode 100644 index 00000000..3168e11d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 9.83 + }, + "f3db": { + "min": 47510000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 12.82955, + "f3db": 79176130.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1_sL2/target.spice new file mode 100644 index 00000000..23bad929 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1_sL2/target.spice @@ -0,0 +1,6 @@ +.subckt C16_sky130_sW1_sL2 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 +XM1 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=4 l=0.6 nf=8 +XM2 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=4 l=0.6 nf=8 +XRR1 VDD VOUT1 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +XRR2 VDD VOUT2 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +.ends C16_sky130_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1_sL2/target_lvs.spice new file mode 100644 index 00000000..af864063 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1_sL2/target_lvs.spice @@ -0,0 +1,20 @@ +.subckt C16_sky130_sW1_sL2 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 +XM1_f0 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f1 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f2 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f3 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f4 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f5 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f6 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f7 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f0 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f1 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f2 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f3 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f4 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f5 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f6 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f7 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XRR1 VDD VOUT1 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +XRR2 VDD VOUT2 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +.ends C16_sky130_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1_sL2/testbench.spice new file mode 100644 index 00000000..3254cf1f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW1_sL2/testbench.spice @@ -0,0 +1,40 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 C16_sky130_sW1_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIB1 IB1 VSS 4e-05 +.nodeset v(IB1)=1.26 + +VCM VCM 0 0.9 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C16/sky130/sW2_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW2_sL1.5/case.json new file mode 100644 index 00000000..749c7457 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW2_sL1.5/case.json @@ -0,0 +1,117 @@ +{ + "case_id": "C16_sky130_sW2_sL1.5", + "circuit_id": "C16", + "pdk": "sky130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "dut_name": "C16_sky130_sW2_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "IB1" + ], + "sizing": { + "M1": { + "w": 8.0, + "l": 0.45, + "nf": 16 + }, + "M2": { + "w": 8.0, + "l": 0.45, + "nf": 16 + }, + "R1": { + "r": 20000.0, + "body": "VSS", + "w": 0.35, + "l": 17.55 + }, + "R2": { + "r": 20000.0, + "body": "VSS", + "w": 0.35, + "l": 17.55 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 4e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 0.9, + "CL": 1e-13 + }, + "category": "diff_r", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "9a274eb3b2a75082", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "R1", + "R2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/sky130/sW2_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW2_sL1.5/manifest.json new file mode 100644 index 00000000..99a912e1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW2_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "2c15e8aaf3fb8df01bd9dda3f6341ccd904d977fc4e39d6f78b351bdef3afbe1", + "qualification.json": "5563acbe9132a6c003b2b6bc2717e1dc08c0244ced8078e4c411c8116405d4c2", + "specs.json": "5ef2e72631b1550f09937f7a9d541b3e1504b11398ea93b5902a8fe7010a101f", + "target.spice": "e107177e6b3de3de0c05f20f9558175aca84d3110ea0eda5df178cce7ef7bc01", + "target_lvs.spice": "e6480911d0f6bdcec121041ffd46f965cce5bc261cee8acae7992c2873c7f743", + "testbench.spice": "2d30fb6c42cc348b0880850e52f28f0f0f1cf73fded46af5be08a33abd1f5398" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/sky130/sW2_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW2_sL1.5/qualification.json new file mode 100644 index 00000000..01245706 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW2_sL1.5/qualification.json @@ -0,0 +1,84 @@ +{ + "case_id": "C16_sky130_sW2_sL1.5", + "circuit_id": "C16", + "pdk": "sky130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "diff_r", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "9a274eb3b2a75082", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 12.45 + }, + "f3db": { + "min": 48050000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 15.45251, + "f3db": 80085140.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 10.5, + "schematic_measures": { + "vo1": 1.39783, + "vo2": 1.39783, + "idd": 4.000013e-05, + "vos_in": 1.818989e-12, + "gain_lf": 15.45251, + "f3db": 80085140.0, + "ugf": 470667400.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/sky130/sW2_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW2_sL1.5/specs.json new file mode 100644 index 00000000..843766a7 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW2_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 12.45 + }, + "f3db": { + "min": 48050000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 15.45251, + "f3db": 80085140.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/sky130/sW2_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW2_sL1.5/target.spice new file mode 100644 index 00000000..b2abf5a9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW2_sL1.5/target.spice @@ -0,0 +1,6 @@ +.subckt C16_sky130_sW2_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 +XM1 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=8 l=0.45 nf=16 +XM2 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=8 l=0.45 nf=16 +XRR1 VDD VOUT1 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +XRR2 VDD VOUT2 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +.ends C16_sky130_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C16/sky130/sW2_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW2_sL1.5/target_lvs.spice new file mode 100644 index 00000000..2f000f38 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW2_sL1.5/target_lvs.spice @@ -0,0 +1,36 @@ +.subckt C16_sky130_sW2_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 +XM1_f0 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f1 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f2 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f3 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f4 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f5 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f6 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f7 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f8 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f9 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f10 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f11 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f12 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f13 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f14 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f15 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f0 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f1 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f2 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f3 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f4 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f5 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f6 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f7 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f8 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f9 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f10 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f11 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f12 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f13 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f14 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f15 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XRR1 VDD VOUT1 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +XRR2 VDD VOUT2 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +.ends C16_sky130_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C16/sky130/sW2_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW2_sL1.5/testbench.spice new file mode 100644 index 00000000..674234c5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW2_sL1.5/testbench.spice @@ -0,0 +1,40 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 C16_sky130_sW2_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIB1 IB1 VSS 4e-05 +.nodeset v(IB1)=1.26 + +VCM VCM 0 0.9 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C16/sky130/sW2_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW2_sL1/case.json new file mode 100644 index 00000000..f06a9abb --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW2_sL1/case.json @@ -0,0 +1,117 @@ +{ + "case_id": "C16_sky130_sW2_sL1", + "circuit_id": "C16", + "pdk": "sky130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "dut_name": "C16_sky130_sW2_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "IB1" + ], + "sizing": { + "M1": { + "w": 8.0, + "l": 0.3, + "nf": 16 + }, + "M2": { + "w": 8.0, + "l": 0.3, + "nf": 16 + }, + "R1": { + "r": 20000.0, + "body": "VSS", + "w": 0.35, + "l": 17.55 + }, + "R2": { + "r": 20000.0, + "body": "VSS", + "w": 0.35, + "l": 17.55 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 4e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 0.9, + "CL": 1e-13 + }, + "category": "diff_r", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "31f28fd76db9084e", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "R1", + "R2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/sky130/sW2_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW2_sL1/manifest.json new file mode 100644 index 00000000..868f32b9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW2_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "cf5368d43500dfbee90c1b315fb0bf61ce92a28c770b8cdd5c10dee2b24239b7", + "qualification.json": "5b2051100d444170761a3f13e4e0f7b3c6b9b5da33d54a0dc7b8855b7db24c89", + "specs.json": "3a91ae72cca8beeed4eb2a25ccf221e502cbbedd2f3593cf736fe7f307c31953", + "target.spice": "e94a8cb903dcf170fb9e177197786dd9aca6b5a96a6fb027b1d3f754499a69a6", + "target_lvs.spice": "e350efce701c13b32fb3e454471bc9f8e46e68efcca74ced187da79c8ffe8503", + "testbench.spice": "9585f90212b1de535f97b9e3a4f25bd1d4a7d10427571f70d26154e03beaf1c0" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/sky130/sW2_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW2_sL1/qualification.json new file mode 100644 index 00000000..499225d9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW2_sL1/qualification.json @@ -0,0 +1,84 @@ +{ + "case_id": "C16_sky130_sW2_sL1", + "circuit_id": "C16", + "pdk": "sky130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "diff_r", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "31f28fd76db9084e", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 12.74 + }, + "f3db": { + "min": 49720000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 15.74038, + "f3db": 82863360.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 9.6, + "schematic_measures": { + "vo1": 1.397827, + "vo2": 1.397827, + "idd": 4.000038e-05, + "vos_in": 0.0, + "gain_lf": 15.74038, + "f3db": 82863360.0, + "ugf": 502553600.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/sky130/sW2_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW2_sL1/specs.json new file mode 100644 index 00000000..6da46a1b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW2_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 12.74 + }, + "f3db": { + "min": 49720000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 15.74038, + "f3db": 82863360.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/sky130/sW2_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW2_sL1/target.spice new file mode 100644 index 00000000..ef5ac97c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW2_sL1/target.spice @@ -0,0 +1,6 @@ +.subckt C16_sky130_sW2_sL1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 +XM1 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=8 l=0.3 nf=16 +XM2 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=8 l=0.3 nf=16 +XRR1 VDD VOUT1 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +XRR2 VDD VOUT2 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +.ends C16_sky130_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C16/sky130/sW2_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW2_sL1/target_lvs.spice new file mode 100644 index 00000000..92b91e35 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW2_sL1/target_lvs.spice @@ -0,0 +1,36 @@ +.subckt C16_sky130_sW2_sL1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 +XM1_f0 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f1 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f2 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f3 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f4 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f5 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f6 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f7 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f8 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f9 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f10 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f11 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f12 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f13 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f14 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f15 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f0 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f1 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f2 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f3 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f4 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f5 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f6 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f7 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f8 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f9 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f10 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f11 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f12 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f13 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f14 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f15 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XRR1 VDD VOUT1 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +XRR2 VDD VOUT2 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +.ends C16_sky130_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C16/sky130/sW2_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW2_sL1/testbench.spice new file mode 100644 index 00000000..5ef092de --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW2_sL1/testbench.spice @@ -0,0 +1,40 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 C16_sky130_sW2_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIB1 IB1 VSS 4e-05 +.nodeset v(IB1)=1.26 + +VCM VCM 0 0.9 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C16/sky130/sW2_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW2_sL2/case.json new file mode 100644 index 00000000..0b76a302 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW2_sL2/case.json @@ -0,0 +1,117 @@ +{ + "case_id": "C16_sky130_sW2_sL2", + "circuit_id": "C16", + "pdk": "sky130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "dut_name": "C16_sky130_sW2_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "IB1" + ], + "sizing": { + "M1": { + "w": 8.0, + "l": 0.6, + "nf": 16 + }, + "M2": { + "w": 8.0, + "l": 0.6, + "nf": 16 + }, + "R1": { + "r": 20000.0, + "body": "VSS", + "w": 0.35, + "l": 17.55 + }, + "R2": { + "r": 20000.0, + "body": "VSS", + "w": 0.35, + "l": 17.55 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 4e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 0.9, + "CL": 1e-13 + }, + "category": "diff_r", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "38e046d7bad937af", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "ideal_current_source", + "port": "IB1", + "current_A": 4e-05, + "from": "VSS" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "R1", + "R2" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/sky130/sW2_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW2_sL2/manifest.json new file mode 100644 index 00000000..c6eb29cf --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW2_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "884a1a55c0e5f71af8e70abc437fe8651ee22a725c6a04e788170ba0f3766aa0", + "qualification.json": "bd8bd7c6f9a1b1984fd6f55cf3646c4c6ea2f0e1ad9e7af6dbdb9be1f0987107", + "specs.json": "7b581949321f1f2784dd56877d5831f48ff96f4b011e694f363ff61e4ff995f3", + "target.spice": "11bf6a58adfd6feade96ffe88ae90121ac661a7cdb1f981d97b48d7b0e13ecaf", + "target_lvs.spice": "7500ec417cb1af41aba5c388bbeb71cb2eabfe523367718339ad0c94d34a7ebe", + "testbench.spice": "f84573aa52b8c270e3809219b0d5b00a0b404f702e5439eba34346c5cef5b89b" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/sky130/sW2_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW2_sL2/qualification.json new file mode 100644 index 00000000..15db1270 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW2_sL2/qualification.json @@ -0,0 +1,84 @@ +{ + "case_id": "C16_sky130_sW2_sL2", + "circuit_id": "C16", + "pdk": "sky130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "diff_r", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "38e046d7bad937af", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 11.94 + }, + "f3db": { + "min": 47060000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 14.94208, + "f3db": 78435440.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 6.9, + "schematic_measures": { + "vo1": 1.39783, + "vo2": 1.39783, + "idd": 4.000012e-05, + "vos_in": 0.0, + "gain_lf": 14.94208, + "f3db": 78435440.0, + "ugf": 434414100.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/sky130/sW2_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW2_sL2/specs.json new file mode 100644 index 00000000..367082d1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW2_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 11.94 + }, + "f3db": { + "min": 47060000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 14.94208, + "f3db": 78435440.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C16/sky130/sW2_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW2_sL2/target.spice new file mode 100644 index 00000000..21d5a208 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW2_sL2/target.spice @@ -0,0 +1,6 @@ +.subckt C16_sky130_sW2_sL2 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 +XM1 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=8 l=0.6 nf=16 +XM2 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=8 l=0.6 nf=16 +XRR1 VDD VOUT1 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +XRR2 VDD VOUT2 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +.ends C16_sky130_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C16/sky130/sW2_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW2_sL2/target_lvs.spice new file mode 100644 index 00000000..80694cfb --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW2_sL2/target_lvs.spice @@ -0,0 +1,36 @@ +.subckt C16_sky130_sW2_sL2 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 +XM1_f0 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f1 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f2 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f3 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f4 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f5 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f6 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f7 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f8 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f9 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f10 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f11 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f12 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f13 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f14 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f15 VOUT1 VIN1 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f0 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f1 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f2 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f3 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f4 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f5 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f6 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f7 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f8 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f9 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f10 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f11 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f12 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f13 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f14 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f15 VOUT2 VIN2 IB1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XRR1 VDD VOUT1 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +XRR2 VDD VOUT2 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +.ends C16_sky130_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C16/sky130/sW2_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW2_sL2/testbench.spice new file mode 100644 index 00000000..bed3bc97 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C16/sky130/sW2_sL2/testbench.spice @@ -0,0 +1,40 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 IB1 C16_sky130_sW2_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +IIB1 IB1 VSS 4e-05 +.nodeset v(IB1)=1.26 + +VCM VCM 0 0.9 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C17/gf180/sW0.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW0.5_sL1.5/case.json new file mode 100644 index 00000000..e7c4db2c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW0.5_sL1.5/case.json @@ -0,0 +1,150 @@ +{ + "case_id": "C17_gf180_sW0.5_sL1.5", + "circuit_id": "C17", + "pdk": "gf180", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "dut_name": "C17_gf180_sW0.5_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.84, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 0.84, + "nf": 4 + }, + "M3": { + "w": 2.0, + "l": 0.84, + "nf": 4 + }, + "R1": { + "r": 40000.0, + "body": "VSS", + "w": 1.0, + "l": 60.0 + }, + "R2": { + "r": 40000.0, + "body": "VSS", + "w": 1.0, + "l": 60.0 + }, + "R3": { + "r": 2000.0, + "body": "VSS", + "w": 1.0, + "l": 5.085 + }, + "R4": { + "r": 2000.0, + "body": "VSS", + "w": 1.0, + "l": 5.085 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 4e-05 + } + }, + "load": { + "vcm": 1.5, + "CL": 1e-13 + }, + "category": "diff_r", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "e308b00f7ced0681", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "R1", + "R2", + "R3", + "R4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/gf180/sW0.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW0.5_sL1.5/manifest.json new file mode 100644 index 00000000..416de9ac --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW0.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "c627fe0e5b9aa2e74c7a4f0d15531b2eb2685b5d41e1295f0cdc9780bf8d2efa", + "qualification.json": "a3bcc443defa34a0f4e39de4fb6a78a5bd03a325dd3c19aae9e10fa620fa82b7", + "specs.json": "abd605474be1ef98cd84b0ddb653976062a7f70af09a250196856c5d87c9ef29", + "target.spice": "bb7b4af4b88c427ec281756267ca61c6f7ee7cd5b6b97162bc007ac0694ee096", + "target_lvs.spice": "6d84e04fa515cb39e94014a36d4c032b1cf12b5a53bb85f14589108d01dbca43", + "testbench.spice": "81b3fb005f2999eb64a6a6a889f992ef70861096199669f80611b035cb85ccaf" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/gf180/sW0.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW0.5_sL1.5/qualification.json new file mode 100644 index 00000000..56fa62a0 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW0.5_sL1.5/qualification.json @@ -0,0 +1,98 @@ +{ + "case_id": "C17_gf180_sW0.5_sL1.5", + "circuit_id": "C17", + "pdk": "gf180", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "diff_r", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "e308b00f7ced0681", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "gain_lf=4.396 below floor 6" + ], + "spec": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 41290000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 4.395898, + "f3db": 68814990.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vo1": 2.913756, + "vo2": 2.913756, + "idd": 3.471751e-05, + "vos_in": 0.0, + "gain_lf": 4.395898, + "f3db": 68814990.0, + "ugf": 91327520.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/gf180/sW0.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW0.5_sL1.5/specs.json new file mode 100644 index 00000000..f5fa94bf --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW0.5_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 41290000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 4.395898, + "f3db": 68814990.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/gf180/sW0.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW0.5_sL1.5/target.spice new file mode 100644 index 00000000..168cd017 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW0.5_sL1.5/target.spice @@ -0,0 +1,9 @@ +.subckt C17_gf180_sW0.5_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 +MM1 VOUT1 VIN1 net07 VSS nfet_03v3 w=2u l=0.84u nf=4 m=1 +MM2 VOUT2 VIN2 net09 VSS nfet_03v3 w=2u l=0.84u nf=4 m=1 +MM3 net06 VB1 VSS VSS nfet_03v3 w=2u l=0.84u nf=4 m=1 +XRR1 VDD VOUT1 VSS ppolyf_u r_width=1u r_length=60u +XRR2 VDD VOUT2 VSS ppolyf_u r_width=1u r_length=60u +XRR3 net07 net06 VSS ppolyf_u r_width=1u r_length=5.085u +XRR4 net09 net06 VSS ppolyf_u r_width=1u r_length=5.085u +.ends C17_gf180_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C17/gf180/sW0.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW0.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..469f56f2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW0.5_sL1.5/target_lvs.spice @@ -0,0 +1,18 @@ +.subckt C17_gf180_sW0.5_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 +MM1_f0 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f1 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f2 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f3 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f0 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f1 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f2 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f3 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f0 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f1 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f2 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f3 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +RR1 VDD VOUT1 VSS ppolyf_u L=60u W=1u +RR2 VDD VOUT2 VSS ppolyf_u L=60u W=1u +RR3 net07 net06 VSS ppolyf_u L=5.085u W=1u +RR4 net09 net06 VSS ppolyf_u L=5.085u W=1u +.ends C17_gf180_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C17/gf180/sW0.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW0.5_sL1.5/testbench.spice new file mode 100644 index 00000000..d48b7bb1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW0.5_sL1.5/testbench.spice @@ -0,0 +1,39 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 C17_gf180_sW0.5_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +MB_VB1 VB1 VB1 VSS VSS nfet_03v3 w=2u l=0.84u +IB_VB1 VDDB VB1 4e-05 +VCM VCM 0 1.5 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C17/gf180/sW0.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW0.5_sL1/case.json new file mode 100644 index 00000000..dd69975c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW0.5_sL1/case.json @@ -0,0 +1,150 @@ +{ + "case_id": "C17_gf180_sW0.5_sL1", + "circuit_id": "C17", + "pdk": "gf180", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "dut_name": "C17_gf180_sW0.5_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.56, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 0.56, + "nf": 4 + }, + "M3": { + "w": 2.0, + "l": 0.56, + "nf": 4 + }, + "R1": { + "r": 40000.0, + "body": "VSS", + "w": 1.0, + "l": 60.0 + }, + "R2": { + "r": 40000.0, + "body": "VSS", + "w": 1.0, + "l": 60.0 + }, + "R3": { + "r": 2000.0, + "body": "VSS", + "w": 1.0, + "l": 5.085 + }, + "R4": { + "r": 2000.0, + "body": "VSS", + "w": 1.0, + "l": 5.085 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 4e-05 + } + }, + "load": { + "vcm": 1.5, + "CL": 1e-13 + }, + "category": "diff_r", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "76efb510b767858e", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "R1", + "R2", + "R3", + "R4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/gf180/sW0.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW0.5_sL1/manifest.json new file mode 100644 index 00000000..ebb15d1d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW0.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "0fcd384e9db0fee81584a65a4ea67e90b1b42d0192a8e8e9462dcd70f315a008", + "qualification.json": "207a75e4f898511ec39de0db4400125dffd4c29155a3e4c77580ee551c9bfdf3", + "specs.json": "07dc5a80f2da172a8a3f88c943aca2d431fa4152fd14b034ec0fc03eafb47bb8", + "target.spice": "ec802e77ff3c76b703a0936f5c14162cc4c879c0ad0178a7c5320f5e2a32fe2c", + "target_lvs.spice": "601107a81e1023dbe1b11d53460444424f6c8362c9fb329dd7662c83201906f7", + "testbench.spice": "dd5c65662b405cf506d50ed8cc11c5965b50cc7d7ace1f04892c4a6bb0ba19ee" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/gf180/sW0.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW0.5_sL1/qualification.json new file mode 100644 index 00000000..ccda9884 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW0.5_sL1/qualification.json @@ -0,0 +1,96 @@ +{ + "case_id": "C17_gf180_sW0.5_sL1", + "circuit_id": "C17", + "pdk": "gf180", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "diff_r", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "76efb510b767858e", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 41490000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 6.147384, + "f3db": 69151350.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vo1": 2.872855, + "vo2": 2.872855, + "idd": 3.839382e-05, + "vos_in": 0.0, + "gain_lf": 6.147384, + "f3db": 69151350.0, + "ugf": 122486300.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/gf180/sW0.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW0.5_sL1/specs.json new file mode 100644 index 00000000..d46af734 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW0.5_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 41490000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 6.147384, + "f3db": 69151350.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/gf180/sW0.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW0.5_sL1/target.spice new file mode 100644 index 00000000..0d34b231 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW0.5_sL1/target.spice @@ -0,0 +1,9 @@ +.subckt C17_gf180_sW0.5_sL1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 +MM1 VOUT1 VIN1 net07 VSS nfet_03v3 w=2u l=0.56u nf=4 m=1 +MM2 VOUT2 VIN2 net09 VSS nfet_03v3 w=2u l=0.56u nf=4 m=1 +MM3 net06 VB1 VSS VSS nfet_03v3 w=2u l=0.56u nf=4 m=1 +XRR1 VDD VOUT1 VSS ppolyf_u r_width=1u r_length=60u +XRR2 VDD VOUT2 VSS ppolyf_u r_width=1u r_length=60u +XRR3 net07 net06 VSS ppolyf_u r_width=1u r_length=5.085u +XRR4 net09 net06 VSS ppolyf_u r_width=1u r_length=5.085u +.ends C17_gf180_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C17/gf180/sW0.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW0.5_sL1/target_lvs.spice new file mode 100644 index 00000000..784649bc --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW0.5_sL1/target_lvs.spice @@ -0,0 +1,18 @@ +.subckt C17_gf180_sW0.5_sL1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 +MM1_f0 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f1 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f2 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f3 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f0 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f1 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f2 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f3 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f0 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f1 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f2 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f3 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +RR1 VDD VOUT1 VSS ppolyf_u L=60u W=1u +RR2 VDD VOUT2 VSS ppolyf_u L=60u W=1u +RR3 net07 net06 VSS ppolyf_u L=5.085u W=1u +RR4 net09 net06 VSS ppolyf_u L=5.085u W=1u +.ends C17_gf180_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C17/gf180/sW0.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW0.5_sL1/testbench.spice new file mode 100644 index 00000000..2de6dfe9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW0.5_sL1/testbench.spice @@ -0,0 +1,39 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 C17_gf180_sW0.5_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +MB_VB1 VB1 VB1 VSS VSS nfet_03v3 w=2u l=0.56u +IB_VB1 VDDB VB1 4e-05 +VCM VCM 0 1.5 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C17/gf180/sW0.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW0.5_sL2/case.json new file mode 100644 index 00000000..ce911011 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW0.5_sL2/case.json @@ -0,0 +1,150 @@ +{ + "case_id": "C17_gf180_sW0.5_sL2", + "circuit_id": "C17", + "pdk": "gf180", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "dut_name": "C17_gf180_sW0.5_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 1.12, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 1.12, + "nf": 4 + }, + "M3": { + "w": 2.0, + "l": 1.12, + "nf": 4 + }, + "R1": { + "r": 40000.0, + "body": "VSS", + "w": 1.0, + "l": 60.0 + }, + "R2": { + "r": 40000.0, + "body": "VSS", + "w": 1.0, + "l": 60.0 + }, + "R3": { + "r": 2000.0, + "body": "VSS", + "w": 1.0, + "l": 5.085 + }, + "R4": { + "r": 2000.0, + "body": "VSS", + "w": 1.0, + "l": 5.085 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 4e-05 + } + }, + "load": { + "vcm": 1.5, + "CL": 1e-13 + }, + "category": "diff_r", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "d3626f227a8198d5", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "R1", + "R2", + "R3", + "R4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/gf180/sW0.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW0.5_sL2/manifest.json new file mode 100644 index 00000000..38584fdc --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW0.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "9f70ea398658af01be736aa8aeaebd0824b0f439da830b664e8abafa13ac54cc", + "qualification.json": "31e932bab243c8a945a70fd86a6df0aa7d429acb842bf3fa42160abe659373cd", + "specs.json": "50718db550fa09c231164534097c95d4e3e613ddd262dbb3aca8cff76aa40aea", + "target.spice": "e71ab3b90dfeadcaea031362483b5be20aa9d54cbb0c1b017d7aecd207bb39e9", + "target_lvs.spice": "874e5a8547ce7d15ae90b4525d57ea4a942f575b1ecce79b23a4029c3bc64ce3", + "testbench.spice": "873ff0516706961c87205354796917cb83d99fb6220a91ba61ec3ba2afeb3a2c" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/gf180/sW0.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW0.5_sL2/qualification.json new file mode 100644 index 00000000..ad92d829 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW0.5_sL2/qualification.json @@ -0,0 +1,98 @@ +{ + "case_id": "C17_gf180_sW0.5_sL2", + "circuit_id": "C17", + "pdk": "gf180", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "diff_r", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "d3626f227a8198d5", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "gain_lf=3.003 below floor 6" + ], + "spec": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 41220000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 3.003399, + "f3db": 68701510.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vo1": 2.95199, + "vo2": 2.95199, + "idd": 3.128084e-05, + "vos_in": 0.0, + "gain_lf": 3.003399, + "f3db": 68701510.0, + "ugf": 68755470.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/gf180/sW0.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW0.5_sL2/specs.json new file mode 100644 index 00000000..51614d86 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW0.5_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 41220000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 3.003399, + "f3db": 68701510.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/gf180/sW0.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW0.5_sL2/target.spice new file mode 100644 index 00000000..8a533c55 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW0.5_sL2/target.spice @@ -0,0 +1,9 @@ +.subckt C17_gf180_sW0.5_sL2 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 +MM1 VOUT1 VIN1 net07 VSS nfet_03v3 w=2u l=1.12u nf=4 m=1 +MM2 VOUT2 VIN2 net09 VSS nfet_03v3 w=2u l=1.12u nf=4 m=1 +MM3 net06 VB1 VSS VSS nfet_03v3 w=2u l=1.12u nf=4 m=1 +XRR1 VDD VOUT1 VSS ppolyf_u r_width=1u r_length=60u +XRR2 VDD VOUT2 VSS ppolyf_u r_width=1u r_length=60u +XRR3 net07 net06 VSS ppolyf_u r_width=1u r_length=5.085u +XRR4 net09 net06 VSS ppolyf_u r_width=1u r_length=5.085u +.ends C17_gf180_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C17/gf180/sW0.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW0.5_sL2/target_lvs.spice new file mode 100644 index 00000000..251eb5c7 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW0.5_sL2/target_lvs.spice @@ -0,0 +1,18 @@ +.subckt C17_gf180_sW0.5_sL2 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 +MM1_f0 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f1 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f2 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f3 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f0 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f1 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f2 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f3 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f0 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f1 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f2 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f3 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +RR1 VDD VOUT1 VSS ppolyf_u L=60u W=1u +RR2 VDD VOUT2 VSS ppolyf_u L=60u W=1u +RR3 net07 net06 VSS ppolyf_u L=5.085u W=1u +RR4 net09 net06 VSS ppolyf_u L=5.085u W=1u +.ends C17_gf180_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C17/gf180/sW0.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW0.5_sL2/testbench.spice new file mode 100644 index 00000000..db2ef6a5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW0.5_sL2/testbench.spice @@ -0,0 +1,39 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 C17_gf180_sW0.5_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +MB_VB1 VB1 VB1 VSS VSS nfet_03v3 w=2u l=1.12u +IB_VB1 VDDB VB1 4e-05 +VCM VCM 0 1.5 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1.5_sL1.5/case.json new file mode 100644 index 00000000..1d30aa94 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1.5_sL1.5/case.json @@ -0,0 +1,150 @@ +{ + "case_id": "C17_gf180_sW1.5_sL1.5", + "circuit_id": "C17", + "pdk": "gf180", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "dut_name": "C17_gf180_sW1.5_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1" + ], + "sizing": { + "M1": { + "w": 6.0, + "l": 0.84, + "nf": 12 + }, + "M2": { + "w": 6.0, + "l": 0.84, + "nf": 12 + }, + "M3": { + "w": 6.0, + "l": 0.84, + "nf": 12 + }, + "R1": { + "r": 40000.0, + "body": "VSS", + "w": 1.0, + "l": 60.0 + }, + "R2": { + "r": 40000.0, + "body": "VSS", + "w": 1.0, + "l": 60.0 + }, + "R3": { + "r": 2000.0, + "body": "VSS", + "w": 1.0, + "l": 5.085 + }, + "R4": { + "r": 2000.0, + "body": "VSS", + "w": 1.0, + "l": 5.085 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 4e-05 + } + }, + "load": { + "vcm": 1.5, + "CL": 1e-13 + }, + "category": "diff_r", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "c0e8d314e7790c49", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "R1", + "R2", + "R3", + "R4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1.5_sL1.5/manifest.json new file mode 100644 index 00000000..848a3895 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "27a98bbe91a9e23314c234feed91f21b622c8c4cbd4a5b3ff0b83e072dd8375b", + "qualification.json": "2abf8e3b2d3a33052851f7b47ae554a802808b8851648202862d4b07d4b88dfe", + "specs.json": "38a807383d85d62b069db110d24cd616ed4f150ee529d2eeb55e18921fb30808", + "target.spice": "a1a5e12dd6ac09eb2ad79414250469593d9a8e13e7385524628bc1f8bb678496", + "target_lvs.spice": "99b3447cb99b712ff89384b520d1a333f110872f4e97d5adf6c694837d155b25", + "testbench.spice": "9f282248d02c530857d7a0f90744b999164484d37e7b7dfc7ee72a66a6e38c6f" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1.5_sL1.5/qualification.json new file mode 100644 index 00000000..73e4ef83 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1.5_sL1.5/qualification.json @@ -0,0 +1,96 @@ +{ + "case_id": "C17_gf180_sW1.5_sL1.5", + "circuit_id": "C17", + "pdk": "gf180", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "diff_r", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "c0e8d314e7790c49", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 39890000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 8.305866, + "f3db": 66484790.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vo1": 2.86526, + "vo2": 2.86526, + "idd": 3.907651e-05, + "vos_in": 0.0, + "gain_lf": 8.305866, + "f3db": 66484790.0, + "ugf": 160204800.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1.5_sL1.5/specs.json new file mode 100644 index 00000000..563b7fea --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1.5_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 39890000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 8.305866, + "f3db": 66484790.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1.5_sL1.5/target.spice new file mode 100644 index 00000000..4ea5787d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1.5_sL1.5/target.spice @@ -0,0 +1,9 @@ +.subckt C17_gf180_sW1.5_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 +MM1 VOUT1 VIN1 net07 VSS nfet_03v3 w=6u l=0.84u nf=12 m=1 +MM2 VOUT2 VIN2 net09 VSS nfet_03v3 w=6u l=0.84u nf=12 m=1 +MM3 net06 VB1 VSS VSS nfet_03v3 w=6u l=0.84u nf=12 m=1 +XRR1 VDD VOUT1 VSS ppolyf_u r_width=1u r_length=60u +XRR2 VDD VOUT2 VSS ppolyf_u r_width=1u r_length=60u +XRR3 net07 net06 VSS ppolyf_u r_width=1u r_length=5.085u +XRR4 net09 net06 VSS ppolyf_u r_width=1u r_length=5.085u +.ends C17_gf180_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..90f61e45 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1.5_sL1.5/target_lvs.spice @@ -0,0 +1,42 @@ +.subckt C17_gf180_sW1.5_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 +MM1_f0 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f1 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f2 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f3 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f4 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f5 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f6 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f7 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f8 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f9 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f10 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f11 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f0 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f1 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f2 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f3 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f4 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f5 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f6 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f7 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f8 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f9 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f10 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f11 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f0 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f1 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f2 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f3 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f4 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f5 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f6 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f7 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f8 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f9 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f10 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f11 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +RR1 VDD VOUT1 VSS ppolyf_u L=60u W=1u +RR2 VDD VOUT2 VSS ppolyf_u L=60u W=1u +RR3 net07 net06 VSS ppolyf_u L=5.085u W=1u +RR4 net09 net06 VSS ppolyf_u L=5.085u W=1u +.ends C17_gf180_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1.5_sL1.5/testbench.spice new file mode 100644 index 00000000..1d60d887 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1.5_sL1.5/testbench.spice @@ -0,0 +1,39 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 C17_gf180_sW1.5_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +MB_VB1 VB1 VB1 VSS VSS nfet_03v3 w=6u l=0.84u +IB_VB1 VDDB VB1 4e-05 +VCM VCM 0 1.5 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1.5_sL1/case.json new file mode 100644 index 00000000..9c85b9cd --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1.5_sL1/case.json @@ -0,0 +1,150 @@ +{ + "case_id": "C17_gf180_sW1.5_sL1", + "circuit_id": "C17", + "pdk": "gf180", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "dut_name": "C17_gf180_sW1.5_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1" + ], + "sizing": { + "M1": { + "w": 6.0, + "l": 0.56, + "nf": 12 + }, + "M2": { + "w": 6.0, + "l": 0.56, + "nf": 12 + }, + "M3": { + "w": 6.0, + "l": 0.56, + "nf": 12 + }, + "R1": { + "r": 40000.0, + "body": "VSS", + "w": 1.0, + "l": 60.0 + }, + "R2": { + "r": 40000.0, + "body": "VSS", + "w": 1.0, + "l": 60.0 + }, + "R3": { + "r": 2000.0, + "body": "VSS", + "w": 1.0, + "l": 5.085 + }, + "R4": { + "r": 2000.0, + "body": "VSS", + "w": 1.0, + "l": 5.085 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 4e-05 + } + }, + "load": { + "vcm": 1.5, + "CL": 1e-13 + }, + "category": "diff_r", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "adaaa61db8464556", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "R1", + "R2", + "R3", + "R4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1.5_sL1/manifest.json new file mode 100644 index 00000000..54109a0c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "772e5206ff2155fe272a651588e98e57eda57de49685bf7363c0e5071e96468e", + "qualification.json": "da07ef802c51f719b1b654d46d3f9849822b74bc86815a475281c14e69a40430", + "specs.json": "88676d9bc6267c6d978cf4099998187a2a9807f9ae2c60b5d5c00cf55dc9aa36", + "target.spice": "d303ce1f47e72123cad4348c6e66bec9519bfb939adf35f562575d2cfabf4399", + "target_lvs.spice": "546fb62c31f29a89d9a7b897b533ce04ce5390b32a02a66ceff149e3c04f30fb", + "testbench.spice": "b117b7b508c40de2e2eeab68fb4e0067d82e77f7777ec9f555ea879a3f0f90dc" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1.5_sL1/qualification.json new file mode 100644 index 00000000..3523e1e4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1.5_sL1/qualification.json @@ -0,0 +1,96 @@ +{ + "case_id": "C17_gf180_sW1.5_sL1", + "circuit_id": "C17", + "pdk": "gf180", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "diff_r", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "adaaa61db8464556", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 6.678 + }, + "f3db": { + "min": 40140000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 9.677684, + "f3db": 66891800.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vo1": 2.820001, + "vo2": 2.820001, + "idd": 4.314466e-05, + "vos_in": -3.63798e-12, + "gain_lf": 9.677684, + "f3db": 66891800.0, + "ugf": 193229800.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1.5_sL1/specs.json new file mode 100644 index 00000000..65117208 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1.5_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 6.678 + }, + "f3db": { + "min": 40140000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 9.677684, + "f3db": 66891800.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1.5_sL1/target.spice new file mode 100644 index 00000000..43788646 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1.5_sL1/target.spice @@ -0,0 +1,9 @@ +.subckt C17_gf180_sW1.5_sL1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 +MM1 VOUT1 VIN1 net07 VSS nfet_03v3 w=6u l=0.56u nf=12 m=1 +MM2 VOUT2 VIN2 net09 VSS nfet_03v3 w=6u l=0.56u nf=12 m=1 +MM3 net06 VB1 VSS VSS nfet_03v3 w=6u l=0.56u nf=12 m=1 +XRR1 VDD VOUT1 VSS ppolyf_u r_width=1u r_length=60u +XRR2 VDD VOUT2 VSS ppolyf_u r_width=1u r_length=60u +XRR3 net07 net06 VSS ppolyf_u r_width=1u r_length=5.085u +XRR4 net09 net06 VSS ppolyf_u r_width=1u r_length=5.085u +.ends C17_gf180_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1.5_sL1/target_lvs.spice new file mode 100644 index 00000000..7b9dccd3 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1.5_sL1/target_lvs.spice @@ -0,0 +1,42 @@ +.subckt C17_gf180_sW1.5_sL1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 +MM1_f0 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f1 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f2 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f3 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f4 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f5 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f6 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f7 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f8 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f9 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f10 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f11 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f0 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f1 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f2 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f3 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f4 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f5 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f6 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f7 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f8 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f9 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f10 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f11 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f0 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f1 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f2 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f3 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f4 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f5 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f6 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f7 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f8 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f9 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f10 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f11 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +RR1 VDD VOUT1 VSS ppolyf_u L=60u W=1u +RR2 VDD VOUT2 VSS ppolyf_u L=60u W=1u +RR3 net07 net06 VSS ppolyf_u L=5.085u W=1u +RR4 net09 net06 VSS ppolyf_u L=5.085u W=1u +.ends C17_gf180_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1.5_sL1/testbench.spice new file mode 100644 index 00000000..d9cc138b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1.5_sL1/testbench.spice @@ -0,0 +1,39 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 C17_gf180_sW1.5_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +MB_VB1 VB1 VB1 VSS VSS nfet_03v3 w=6u l=0.56u +IB_VB1 VDDB VB1 4e-05 +VCM VCM 0 1.5 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1.5_sL2/case.json new file mode 100644 index 00000000..885f5849 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1.5_sL2/case.json @@ -0,0 +1,150 @@ +{ + "case_id": "C17_gf180_sW1.5_sL2", + "circuit_id": "C17", + "pdk": "gf180", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "dut_name": "C17_gf180_sW1.5_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1" + ], + "sizing": { + "M1": { + "w": 6.0, + "l": 1.12, + "nf": 12 + }, + "M2": { + "w": 6.0, + "l": 1.12, + "nf": 12 + }, + "M3": { + "w": 6.0, + "l": 1.12, + "nf": 12 + }, + "R1": { + "r": 40000.0, + "body": "VSS", + "w": 1.0, + "l": 60.0 + }, + "R2": { + "r": 40000.0, + "body": "VSS", + "w": 1.0, + "l": 60.0 + }, + "R3": { + "r": 2000.0, + "body": "VSS", + "w": 1.0, + "l": 5.085 + }, + "R4": { + "r": 2000.0, + "body": "VSS", + "w": 1.0, + "l": 5.085 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 4e-05 + } + }, + "load": { + "vcm": 1.5, + "CL": 1e-13 + }, + "category": "diff_r", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "60948ff25ac440c0", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "R1", + "R2", + "R3", + "R4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1.5_sL2/manifest.json new file mode 100644 index 00000000..f5856f3a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "5d2272800ad8bff627254ac655cac7677a90e64a08674354abb5df78c41599e8", + "qualification.json": "cdfa6bb6b525aaadce0e31de493f22842f1bfdf3c33bdca9936041145218d379", + "specs.json": "a46b722fed2cd192baf81f7c2a43e2dc4c67662dca191b198d740c3e66b44fcc", + "target.spice": "298f51b9991b051ec2f361561471617dbf670cdefabf8a153d3598180965ce3a", + "target_lvs.spice": "a0768d3892f0789ce70e5e81b1c0ded68cd4b57752ce442dbfe73c025a70c39a", + "testbench.spice": "fd5d9dd918dc73a67eac8f9dd2cec4c647c494a68707e4cac1b5f7ec5ee01378" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1.5_sL2/qualification.json new file mode 100644 index 00000000..0a27d1b4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1.5_sL2/qualification.json @@ -0,0 +1,96 @@ +{ + "case_id": "C17_gf180_sW1.5_sL2", + "circuit_id": "C17", + "pdk": "gf180", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "diff_r", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "60948ff25ac440c0", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 39820000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 7.315751, + "f3db": 66371130.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vo1": 2.886042, + "vo2": 2.886042, + "idd": 3.720852e-05, + "vos_in": 0.0, + "gain_lf": 7.315751, + "f3db": 66371130.0, + "ugf": 139533800.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1.5_sL2/specs.json new file mode 100644 index 00000000..62b814a3 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1.5_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 39820000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 7.315751, + "f3db": 66371130.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1.5_sL2/target.spice new file mode 100644 index 00000000..20651fd5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1.5_sL2/target.spice @@ -0,0 +1,9 @@ +.subckt C17_gf180_sW1.5_sL2 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 +MM1 VOUT1 VIN1 net07 VSS nfet_03v3 w=6u l=1.12u nf=12 m=1 +MM2 VOUT2 VIN2 net09 VSS nfet_03v3 w=6u l=1.12u nf=12 m=1 +MM3 net06 VB1 VSS VSS nfet_03v3 w=6u l=1.12u nf=12 m=1 +XRR1 VDD VOUT1 VSS ppolyf_u r_width=1u r_length=60u +XRR2 VDD VOUT2 VSS ppolyf_u r_width=1u r_length=60u +XRR3 net07 net06 VSS ppolyf_u r_width=1u r_length=5.085u +XRR4 net09 net06 VSS ppolyf_u r_width=1u r_length=5.085u +.ends C17_gf180_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1.5_sL2/target_lvs.spice new file mode 100644 index 00000000..02da338f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1.5_sL2/target_lvs.spice @@ -0,0 +1,42 @@ +.subckt C17_gf180_sW1.5_sL2 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 +MM1_f0 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f1 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f2 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f3 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f4 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f5 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f6 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f7 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f8 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f9 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f10 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f11 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f0 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f1 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f2 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f3 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f4 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f5 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f6 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f7 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f8 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f9 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f10 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f11 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f0 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f1 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f2 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f3 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f4 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f5 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f6 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f7 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f8 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f9 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f10 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f11 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +RR1 VDD VOUT1 VSS ppolyf_u L=60u W=1u +RR2 VDD VOUT2 VSS ppolyf_u L=60u W=1u +RR3 net07 net06 VSS ppolyf_u L=5.085u W=1u +RR4 net09 net06 VSS ppolyf_u L=5.085u W=1u +.ends C17_gf180_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1.5_sL2/testbench.spice new file mode 100644 index 00000000..1a5de309 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1.5_sL2/testbench.spice @@ -0,0 +1,39 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 C17_gf180_sW1.5_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +MB_VB1 VB1 VB1 VSS VSS nfet_03v3 w=6u l=1.12u +IB_VB1 VDDB VB1 4e-05 +VCM VCM 0 1.5 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1_sL1.5/case.json new file mode 100644 index 00000000..1ce2fb5b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1_sL1.5/case.json @@ -0,0 +1,150 @@ +{ + "case_id": "C17_gf180_sW1_sL1.5", + "circuit_id": "C17", + "pdk": "gf180", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "dut_name": "C17_gf180_sW1_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.84, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 0.84, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 0.84, + "nf": 8 + }, + "R1": { + "r": 40000.0, + "body": "VSS", + "w": 1.0, + "l": 60.0 + }, + "R2": { + "r": 40000.0, + "body": "VSS", + "w": 1.0, + "l": 60.0 + }, + "R3": { + "r": 2000.0, + "body": "VSS", + "w": 1.0, + "l": 5.085 + }, + "R4": { + "r": 2000.0, + "body": "VSS", + "w": 1.0, + "l": 5.085 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 4e-05 + } + }, + "load": { + "vcm": 1.5, + "CL": 1e-13 + }, + "category": "diff_r", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "5db991fefb6215a9", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "R1", + "R2", + "R3", + "R4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1_sL1.5/manifest.json new file mode 100644 index 00000000..4873358f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "f76040e1e435633e2c86c3917f1c1ffdcabe73ab59cbba465626c22e920a7bd8", + "qualification.json": "424b30ccc7d8aed36b7e8c563f36eb5d200f5e33168162532ec1d28805604345", + "specs.json": "e4677c29fcd1a266ca294fb74e0ee5219ceb496bf1dbfb8d9d8df862ff23a6d7", + "target.spice": "e3540e20c5ad292358eff4ec33755ed960da741c2c950a74f616c1257e994d3e", + "target_lvs.spice": "baa1940a053c223c6148edfee057b3164ebf0225c00c90bca7960d229bce55e6", + "testbench.spice": "cd54d11bcac64b009bd7682843c10acb160c91517bf6c9282349c94939bc1d86" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1_sL1.5/qualification.json new file mode 100644 index 00000000..ac6ee722 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1_sL1.5/qualification.json @@ -0,0 +1,96 @@ +{ + "case_id": "C17_gf180_sW1_sL1.5", + "circuit_id": "C17", + "pdk": "gf180", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "diff_r", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "5db991fefb6215a9", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 40590000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 7.062054, + "f3db": 67646170.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vo1": 2.875718, + "vo2": 2.875718, + "idd": 3.813652e-05, + "vos_in": 0.0, + "gain_lf": 7.062054, + "f3db": 67646170.0, + "ugf": 137161400.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1_sL1.5/specs.json new file mode 100644 index 00000000..592c8f67 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 40590000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 7.062054, + "f3db": 67646170.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1_sL1.5/target.spice new file mode 100644 index 00000000..d3991fc9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1_sL1.5/target.spice @@ -0,0 +1,9 @@ +.subckt C17_gf180_sW1_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 +MM1 VOUT1 VIN1 net07 VSS nfet_03v3 w=4u l=0.84u nf=8 m=1 +MM2 VOUT2 VIN2 net09 VSS nfet_03v3 w=4u l=0.84u nf=8 m=1 +MM3 net06 VB1 VSS VSS nfet_03v3 w=4u l=0.84u nf=8 m=1 +XRR1 VDD VOUT1 VSS ppolyf_u r_width=1u r_length=60u +XRR2 VDD VOUT2 VSS ppolyf_u r_width=1u r_length=60u +XRR3 net07 net06 VSS ppolyf_u r_width=1u r_length=5.085u +XRR4 net09 net06 VSS ppolyf_u r_width=1u r_length=5.085u +.ends C17_gf180_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1_sL1.5/target_lvs.spice new file mode 100644 index 00000000..2e31dc9f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1_sL1.5/target_lvs.spice @@ -0,0 +1,30 @@ +.subckt C17_gf180_sW1_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 +MM1_f0 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f1 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f2 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f3 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f4 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f5 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f6 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f7 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f0 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f1 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f2 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f3 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f4 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f5 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f6 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f7 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f0 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f1 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f2 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f3 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f4 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f5 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f6 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f7 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +RR1 VDD VOUT1 VSS ppolyf_u L=60u W=1u +RR2 VDD VOUT2 VSS ppolyf_u L=60u W=1u +RR3 net07 net06 VSS ppolyf_u L=5.085u W=1u +RR4 net09 net06 VSS ppolyf_u L=5.085u W=1u +.ends C17_gf180_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1_sL1.5/testbench.spice new file mode 100644 index 00000000..13e45e89 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1_sL1.5/testbench.spice @@ -0,0 +1,39 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 C17_gf180_sW1_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +MB_VB1 VB1 VB1 VSS VSS nfet_03v3 w=4u l=0.84u +IB_VB1 VDDB VB1 4e-05 +VCM VCM 0 1.5 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1_sL1/case.json new file mode 100644 index 00000000..7168805d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1_sL1/case.json @@ -0,0 +1,150 @@ +{ + "case_id": "C17_gf180_sW1_sL1", + "circuit_id": "C17", + "pdk": "gf180", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "dut_name": "C17_gf180_sW1_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "R1": { + "r": 40000.0, + "body": "VSS", + "w": 1.0, + "l": 60.0 + }, + "R2": { + "r": 40000.0, + "body": "VSS", + "w": 1.0, + "l": 60.0 + }, + "R3": { + "r": 2000.0, + "body": "VSS", + "w": 1.0, + "l": 5.085 + }, + "R4": { + "r": 2000.0, + "body": "VSS", + "w": 1.0, + "l": 5.085 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 4e-05 + } + }, + "load": { + "vcm": 1.5, + "CL": 1e-13 + }, + "category": "diff_r", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "5983103958081783", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "R1", + "R2", + "R3", + "R4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1_sL1/manifest.json new file mode 100644 index 00000000..4ee87d28 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "cfa943d648ade514d6f5cb2158f4b69bab7356e1f0234a701fab843ca63d5765", + "qualification.json": "7c37d5b1b53b924f398e8858e4b3c5ba6fe11c009ce8c8c8d422609095803aee", + "specs.json": "b6d13a6590db22eacf0d3f3957e5b27485b1c78394a9e9a9e322f0a65a047461", + "target.spice": "e361e3a84c5f4719a7ceb8ad4f517dd7a16b2d198dbd900430b09724606c6cbf", + "target_lvs.spice": "3f90d677b4c1c7b04738586a29210642a7a3b9d18edfc40da73f59a76139cdcd", + "testbench.spice": "cd70d99d12ecf2e8b3857d8e4e3fc4635d02e2069130d18e0095dcd3afe13426" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1_sL1/qualification.json new file mode 100644 index 00000000..ab7c9a92 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1_sL1/qualification.json @@ -0,0 +1,96 @@ +{ + "case_id": "C17_gf180_sW1_sL1", + "circuit_id": "C17", + "pdk": "gf180", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "diff_r", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "5983103958081783", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 40820000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 8.524808, + "f3db": 68028250.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vo1": 2.840199, + "vo2": 2.840199, + "idd": 4.132911e-05, + "vos_in": 0.0, + "gain_lf": 8.524808, + "f3db": 68028250.0, + "ugf": 168910800.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1_sL1/specs.json new file mode 100644 index 00000000..0e973a7f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 40820000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 8.524808, + "f3db": 68028250.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1_sL1/target.spice new file mode 100644 index 00000000..6de62d35 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1_sL1/target.spice @@ -0,0 +1,9 @@ +.subckt C17_gf180_sW1_sL1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 +MM1 VOUT1 VIN1 net07 VSS nfet_03v3 w=4u l=0.56u nf=8 m=1 +MM2 VOUT2 VIN2 net09 VSS nfet_03v3 w=4u l=0.56u nf=8 m=1 +MM3 net06 VB1 VSS VSS nfet_03v3 w=4u l=0.56u nf=8 m=1 +XRR1 VDD VOUT1 VSS ppolyf_u r_width=1u r_length=60u +XRR2 VDD VOUT2 VSS ppolyf_u r_width=1u r_length=60u +XRR3 net07 net06 VSS ppolyf_u r_width=1u r_length=5.085u +XRR4 net09 net06 VSS ppolyf_u r_width=1u r_length=5.085u +.ends C17_gf180_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1_sL1/target_lvs.spice new file mode 100644 index 00000000..21e312b6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1_sL1/target_lvs.spice @@ -0,0 +1,30 @@ +.subckt C17_gf180_sW1_sL1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 +MM1_f0 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f1 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f2 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f3 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f4 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f5 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f6 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f7 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f0 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f1 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f2 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f3 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f4 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f5 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f6 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f7 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f0 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f1 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f2 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f3 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f4 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f5 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f6 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f7 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +RR1 VDD VOUT1 VSS ppolyf_u L=60u W=1u +RR2 VDD VOUT2 VSS ppolyf_u L=60u W=1u +RR3 net07 net06 VSS ppolyf_u L=5.085u W=1u +RR4 net09 net06 VSS ppolyf_u L=5.085u W=1u +.ends C17_gf180_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1_sL1/testbench.spice new file mode 100644 index 00000000..c7513c9b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1_sL1/testbench.spice @@ -0,0 +1,39 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 C17_gf180_sW1_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +MB_VB1 VB1 VB1 VSS VSS nfet_03v3 w=4u l=0.56u +IB_VB1 VDDB VB1 4e-05 +VCM VCM 0 1.5 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1_sL2/case.json new file mode 100644 index 00000000..2a0e438a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1_sL2/case.json @@ -0,0 +1,150 @@ +{ + "case_id": "C17_gf180_sW1_sL2", + "circuit_id": "C17", + "pdk": "gf180", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "dut_name": "C17_gf180_sW1_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 1.12, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 1.12, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 1.12, + "nf": 8 + }, + "R1": { + "r": 40000.0, + "body": "VSS", + "w": 1.0, + "l": 60.0 + }, + "R2": { + "r": 40000.0, + "body": "VSS", + "w": 1.0, + "l": 60.0 + }, + "R3": { + "r": 2000.0, + "body": "VSS", + "w": 1.0, + "l": 5.085 + }, + "R4": { + "r": 2000.0, + "body": "VSS", + "w": 1.0, + "l": 5.085 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 4e-05 + } + }, + "load": { + "vcm": 1.5, + "CL": 1e-13 + }, + "category": "diff_r", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "caff61a89c3c6ac3", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "R1", + "R2", + "R3", + "R4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1_sL2/manifest.json new file mode 100644 index 00000000..a27d2471 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "ae5c710febcbeeb758b1c9fbeff2beba5b03449b52ecdc6ef14644d1ef35c946", + "qualification.json": "015b79c825437dee4b785712947f1df8f52ff0621afe896be3cc56f5af4e8210", + "specs.json": "62b724a641f620e44fd3a435191a9538e5a1e16f1e625b90ca6787600359f26f", + "target.spice": "40826b628b79e353addd98b87e83f1e9287b8ad847248d690cbe2eccf3f64ac8", + "target_lvs.spice": "013eece24408388b2158a7c16e2404a73534f36d5677a37765f5d823d5b765c1", + "testbench.spice": "ed247ce9ac7607a3cff3c6944a3209eef9363f2d50dae6d7cdb820f226b9ab1b" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1_sL2/qualification.json new file mode 100644 index 00000000..adcd2a8c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1_sL2/qualification.json @@ -0,0 +1,98 @@ +{ + "case_id": "C17_gf180_sW1_sL2", + "circuit_id": "C17", + "pdk": "gf180", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "diff_r", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "caff61a89c3c6ac3", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "gain_lf=5.996 below floor 6" + ], + "spec": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 40520000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 5.996186, + "f3db": 67532410.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vo1": 2.893826, + "vo2": 2.893826, + "idd": 3.650884e-05, + "vos_in": 0.0, + "gain_lf": 5.996186, + "f3db": 67532410.0, + "ugf": 116934400.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1_sL2/specs.json new file mode 100644 index 00000000..0f307fa0 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 40520000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 5.996186, + "f3db": 67532410.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1_sL2/target.spice new file mode 100644 index 00000000..07e335ce --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1_sL2/target.spice @@ -0,0 +1,9 @@ +.subckt C17_gf180_sW1_sL2 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 +MM1 VOUT1 VIN1 net07 VSS nfet_03v3 w=4u l=1.12u nf=8 m=1 +MM2 VOUT2 VIN2 net09 VSS nfet_03v3 w=4u l=1.12u nf=8 m=1 +MM3 net06 VB1 VSS VSS nfet_03v3 w=4u l=1.12u nf=8 m=1 +XRR1 VDD VOUT1 VSS ppolyf_u r_width=1u r_length=60u +XRR2 VDD VOUT2 VSS ppolyf_u r_width=1u r_length=60u +XRR3 net07 net06 VSS ppolyf_u r_width=1u r_length=5.085u +XRR4 net09 net06 VSS ppolyf_u r_width=1u r_length=5.085u +.ends C17_gf180_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1_sL2/target_lvs.spice new file mode 100644 index 00000000..4755275f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1_sL2/target_lvs.spice @@ -0,0 +1,30 @@ +.subckt C17_gf180_sW1_sL2 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 +MM1_f0 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f1 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f2 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f3 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f4 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f5 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f6 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f7 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f0 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f1 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f2 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f3 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f4 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f5 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f6 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f7 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f0 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f1 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f2 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f3 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f4 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f5 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f6 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f7 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +RR1 VDD VOUT1 VSS ppolyf_u L=60u W=1u +RR2 VDD VOUT2 VSS ppolyf_u L=60u W=1u +RR3 net07 net06 VSS ppolyf_u L=5.085u W=1u +RR4 net09 net06 VSS ppolyf_u L=5.085u W=1u +.ends C17_gf180_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1_sL2/testbench.spice new file mode 100644 index 00000000..8790fab9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW1_sL2/testbench.spice @@ -0,0 +1,39 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 C17_gf180_sW1_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +MB_VB1 VB1 VB1 VSS VSS nfet_03v3 w=4u l=1.12u +IB_VB1 VDDB VB1 4e-05 +VCM VCM 0 1.5 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C17/gf180/sW2_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW2_sL1.5/case.json new file mode 100644 index 00000000..5de520aa --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW2_sL1.5/case.json @@ -0,0 +1,150 @@ +{ + "case_id": "C17_gf180_sW2_sL1.5", + "circuit_id": "C17", + "pdk": "gf180", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "dut_name": "C17_gf180_sW2_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1" + ], + "sizing": { + "M1": { + "w": 8.0, + "l": 0.84, + "nf": 16 + }, + "M2": { + "w": 8.0, + "l": 0.84, + "nf": 16 + }, + "M3": { + "w": 8.0, + "l": 0.84, + "nf": 16 + }, + "R1": { + "r": 40000.0, + "body": "VSS", + "w": 1.0, + "l": 60.0 + }, + "R2": { + "r": 40000.0, + "body": "VSS", + "w": 1.0, + "l": 60.0 + }, + "R3": { + "r": 2000.0, + "body": "VSS", + "w": 1.0, + "l": 5.085 + }, + "R4": { + "r": 2000.0, + "body": "VSS", + "w": 1.0, + "l": 5.085 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 4e-05 + } + }, + "load": { + "vcm": 1.5, + "CL": 1e-13 + }, + "category": "diff_r", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "c5f4f94b1511cbb6", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "R1", + "R2", + "R3", + "R4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/gf180/sW2_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW2_sL1.5/manifest.json new file mode 100644 index 00000000..96d8c0ce --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW2_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "c8340ea476bf540cc751b6defe589dbe31013276c79e517ab7f9ba090841eb86", + "qualification.json": "eae1ce03e53914354dd6c6e87edb677e1234daf0c9b893534134c27d4d65d55a", + "specs.json": "9247c8903d931025cc9f8e9863268fcf1f360854b4434bf442b29e472996d3d4", + "target.spice": "21d00a8a1d96d2009a1f0c8935c2cd1150637810f1abac3e1a47400e7ea84dc7", + "target_lvs.spice": "bc1f30569d185ac01e09278649c6bc56b66513ff166329b3275a77c2f226b2c0", + "testbench.spice": "bd809ff1cec75c708879d10d1637d4fdd3d7e5bcb8c986837bf2e4b6a15d1f39" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/gf180/sW2_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW2_sL1.5/qualification.json new file mode 100644 index 00000000..83638036 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW2_sL1.5/qualification.json @@ -0,0 +1,96 @@ +{ + "case_id": "C17_gf180_sW2_sL1.5", + "circuit_id": "C17", + "pdk": "gf180", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "diff_r", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "c5f4f94b1511cbb6", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 6.099 + }, + "f3db": { + "min": 39210000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 9.099341, + "f3db": 65352150.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vo1": 2.856445, + "vo2": 2.856445, + "idd": 3.98689e-05, + "vos_in": 0.0, + "gain_lf": 9.099341, + "f3db": 65352150.0, + "ugf": 175080000.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/gf180/sW2_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW2_sL1.5/specs.json new file mode 100644 index 00000000..e6b94f22 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW2_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 6.099 + }, + "f3db": { + "min": 39210000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 9.099341, + "f3db": 65352150.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/gf180/sW2_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW2_sL1.5/target.spice new file mode 100644 index 00000000..4e60ecf7 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW2_sL1.5/target.spice @@ -0,0 +1,9 @@ +.subckt C17_gf180_sW2_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 +MM1 VOUT1 VIN1 net07 VSS nfet_03v3 w=8u l=0.84u nf=16 m=1 +MM2 VOUT2 VIN2 net09 VSS nfet_03v3 w=8u l=0.84u nf=16 m=1 +MM3 net06 VB1 VSS VSS nfet_03v3 w=8u l=0.84u nf=16 m=1 +XRR1 VDD VOUT1 VSS ppolyf_u r_width=1u r_length=60u +XRR2 VDD VOUT2 VSS ppolyf_u r_width=1u r_length=60u +XRR3 net07 net06 VSS ppolyf_u r_width=1u r_length=5.085u +XRR4 net09 net06 VSS ppolyf_u r_width=1u r_length=5.085u +.ends C17_gf180_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C17/gf180/sW2_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW2_sL1.5/target_lvs.spice new file mode 100644 index 00000000..678d38fe --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW2_sL1.5/target_lvs.spice @@ -0,0 +1,54 @@ +.subckt C17_gf180_sW2_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 +MM1_f0 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f1 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f2 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f3 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f4 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f5 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f6 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f7 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f8 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f9 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f10 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f11 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f12 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f13 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f14 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=0.84u +MM1_f15 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f0 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f1 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f2 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f3 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f4 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f5 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f6 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f7 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f8 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f9 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f10 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f11 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f12 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f13 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f14 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=0.84u +MM2_f15 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f0 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f1 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f2 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f3 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f4 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f5 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f6 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f7 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f8 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f9 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f10 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f11 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f12 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f13 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f14 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM3_f15 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=0.84u +RR1 VDD VOUT1 VSS ppolyf_u L=60u W=1u +RR2 VDD VOUT2 VSS ppolyf_u L=60u W=1u +RR3 net07 net06 VSS ppolyf_u L=5.085u W=1u +RR4 net09 net06 VSS ppolyf_u L=5.085u W=1u +.ends C17_gf180_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C17/gf180/sW2_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW2_sL1.5/testbench.spice new file mode 100644 index 00000000..7256d5f9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW2_sL1.5/testbench.spice @@ -0,0 +1,39 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 C17_gf180_sW2_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +MB_VB1 VB1 VB1 VSS VSS nfet_03v3 w=8u l=0.84u +IB_VB1 VDDB VB1 4e-05 +VCM VCM 0 1.5 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C17/gf180/sW2_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW2_sL1/case.json new file mode 100644 index 00000000..b971c7c2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW2_sL1/case.json @@ -0,0 +1,150 @@ +{ + "case_id": "C17_gf180_sW2_sL1", + "circuit_id": "C17", + "pdk": "gf180", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "dut_name": "C17_gf180_sW2_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1" + ], + "sizing": { + "M1": { + "w": 8.0, + "l": 0.56, + "nf": 16 + }, + "M2": { + "w": 8.0, + "l": 0.56, + "nf": 16 + }, + "M3": { + "w": 8.0, + "l": 0.56, + "nf": 16 + }, + "R1": { + "r": 40000.0, + "body": "VSS", + "w": 1.0, + "l": 60.0 + }, + "R2": { + "r": 40000.0, + "body": "VSS", + "w": 1.0, + "l": 60.0 + }, + "R3": { + "r": 2000.0, + "body": "VSS", + "w": 1.0, + "l": 5.085 + }, + "R4": { + "r": 2000.0, + "body": "VSS", + "w": 1.0, + "l": 5.085 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 4e-05 + } + }, + "load": { + "vcm": 1.5, + "CL": 1e-13 + }, + "category": "diff_r", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "f8fde3b54068678a", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "R1", + "R2", + "R3", + "R4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/gf180/sW2_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW2_sL1/manifest.json new file mode 100644 index 00000000..9d1f6b87 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW2_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "60044751ad5e818db5f9ea216a61ecf2f60149cb1745f3645036dafb33cc1bd6", + "qualification.json": "563890235abeb3e7008e8a56aa29a9037c390828006d056ce83cf542bdb44237", + "specs.json": "a37b2a97d777a46505feb7ca3b0b094d8e172f5f327abeadfe9004137c646157", + "target.spice": "5477d984a62d37fce3e158e49d7e6834a84427373b20abc560c5ef3980171e33", + "target_lvs.spice": "bdcde11a5faef2c05d55875f79afcf9d0189d3a2a8b41df1cb26c0b5c913c588", + "testbench.spice": "c554128b16782a7d4f62f33156f474804a0277df9ebef9323fb111440c3fd7bc" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/gf180/sW2_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW2_sL1/qualification.json new file mode 100644 index 00000000..a13c394c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW2_sL1/qualification.json @@ -0,0 +1,96 @@ +{ + "case_id": "C17_gf180_sW2_sL1", + "circuit_id": "C17", + "pdk": "gf180", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "diff_r", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "f8fde3b54068678a", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 7.405 + }, + "f3db": { + "min": 39460000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 10.40503, + "f3db": 65772220.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vo1": 2.803843, + "vo2": 2.803843, + "idd": 4.459697e-05, + "vos_in": 3.637979e-12, + "gain_lf": 10.40503, + "f3db": 65772220.0, + "ugf": 208572000.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/gf180/sW2_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW2_sL1/specs.json new file mode 100644 index 00000000..27dceff8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW2_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 7.405 + }, + "f3db": { + "min": 39460000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 10.40503, + "f3db": 65772220.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/gf180/sW2_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW2_sL1/target.spice new file mode 100644 index 00000000..162b402e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW2_sL1/target.spice @@ -0,0 +1,9 @@ +.subckt C17_gf180_sW2_sL1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 +MM1 VOUT1 VIN1 net07 VSS nfet_03v3 w=8u l=0.56u nf=16 m=1 +MM2 VOUT2 VIN2 net09 VSS nfet_03v3 w=8u l=0.56u nf=16 m=1 +MM3 net06 VB1 VSS VSS nfet_03v3 w=8u l=0.56u nf=16 m=1 +XRR1 VDD VOUT1 VSS ppolyf_u r_width=1u r_length=60u +XRR2 VDD VOUT2 VSS ppolyf_u r_width=1u r_length=60u +XRR3 net07 net06 VSS ppolyf_u r_width=1u r_length=5.085u +XRR4 net09 net06 VSS ppolyf_u r_width=1u r_length=5.085u +.ends C17_gf180_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C17/gf180/sW2_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW2_sL1/target_lvs.spice new file mode 100644 index 00000000..9e565950 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW2_sL1/target_lvs.spice @@ -0,0 +1,54 @@ +.subckt C17_gf180_sW2_sL1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 +MM1_f0 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f1 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f2 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f3 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f4 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f5 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f6 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f7 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f8 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f9 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f10 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f11 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f12 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f13 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f14 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=0.56u +MM1_f15 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f0 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f1 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f2 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f3 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f4 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f5 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f6 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f7 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f8 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f9 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f10 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f11 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f12 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f13 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f14 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=0.56u +MM2_f15 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f0 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f1 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f2 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f3 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f4 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f5 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f6 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f7 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f8 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f9 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f10 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f11 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f12 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f13 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f14 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM3_f15 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=0.56u +RR1 VDD VOUT1 VSS ppolyf_u L=60u W=1u +RR2 VDD VOUT2 VSS ppolyf_u L=60u W=1u +RR3 net07 net06 VSS ppolyf_u L=5.085u W=1u +RR4 net09 net06 VSS ppolyf_u L=5.085u W=1u +.ends C17_gf180_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C17/gf180/sW2_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW2_sL1/testbench.spice new file mode 100644 index 00000000..65afe730 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW2_sL1/testbench.spice @@ -0,0 +1,39 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 C17_gf180_sW2_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +MB_VB1 VB1 VB1 VSS VSS nfet_03v3 w=8u l=0.56u +IB_VB1 VDDB VB1 4e-05 +VCM VCM 0 1.5 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C17/gf180/sW2_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW2_sL2/case.json new file mode 100644 index 00000000..0ab89a0f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW2_sL2/case.json @@ -0,0 +1,150 @@ +{ + "case_id": "C17_gf180_sW2_sL2", + "circuit_id": "C17", + "pdk": "gf180", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "dut_name": "C17_gf180_sW2_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1" + ], + "sizing": { + "M1": { + "w": 8.0, + "l": 1.12, + "nf": 16 + }, + "M2": { + "w": 8.0, + "l": 1.12, + "nf": 16 + }, + "M3": { + "w": 8.0, + "l": 1.12, + "nf": 16 + }, + "R1": { + "r": 40000.0, + "body": "VSS", + "w": 1.0, + "l": 60.0 + }, + "R2": { + "r": 40000.0, + "body": "VSS", + "w": 1.0, + "l": 60.0 + }, + "R3": { + "r": 2000.0, + "body": "VSS", + "w": 1.0, + "l": 5.085 + }, + "R4": { + "r": 2000.0, + "body": "VSS", + "w": 1.0, + "l": 5.085 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 4e-05 + } + }, + "load": { + "vcm": 1.5, + "CL": 1e-13 + }, + "category": "diff_r", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "ff66d5a891505aaa", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "R1", + "R2", + "R3", + "R4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/gf180/sW2_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW2_sL2/manifest.json new file mode 100644 index 00000000..8bf273ab --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW2_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "cf165881bccc5996c209061be2e2837c7bdd6f24d8e1f721436fc44945e438fb", + "qualification.json": "592ed36f9210b38c369a7861b9295dfe1d825d6f9daaf684131b2983d1efba9e", + "specs.json": "2517bd9da3d9094898e8640ee7d4383ea6362b176a7ba4056c4e5cc18a5e1a0f", + "target.spice": "589dc2c26bb3eb78d1b975d9964dace0db14432576c2525bdaa1baef1b788075", + "target_lvs.spice": "e8339d566637f687d1b186516a706dcafdb24791db5da92b4eb6e7682e65d544", + "testbench.spice": "a23a9a01b9a219a9a0d2095766e877193145e0ffb04dd8b194880f6f45b3bc1f" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/gf180/sW2_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW2_sL2/qualification.json new file mode 100644 index 00000000..6692b46f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW2_sL2/qualification.json @@ -0,0 +1,96 @@ +{ + "case_id": "C17_gf180_sW2_sL2", + "circuit_id": "C17", + "pdk": "gf180", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "diff_r", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "ff66d5a891505aaa", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 39140000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 8.156878, + "f3db": 65239890.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.1, + "schematic_measures": { + "vo1": 2.880635, + "vo2": 2.880635, + "idd": 3.769457e-05, + "vos_in": -3.63798e-12, + "gain_lf": 8.156878, + "f3db": 65239890.0, + "ugf": 154226200.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/gf180/sW2_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW2_sL2/specs.json new file mode 100644 index 00000000..e47aabc6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW2_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 39140000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 8.156878, + "f3db": 65239890.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/gf180/sW2_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW2_sL2/target.spice new file mode 100644 index 00000000..8961e24e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW2_sL2/target.spice @@ -0,0 +1,9 @@ +.subckt C17_gf180_sW2_sL2 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 +MM1 VOUT1 VIN1 net07 VSS nfet_03v3 w=8u l=1.12u nf=16 m=1 +MM2 VOUT2 VIN2 net09 VSS nfet_03v3 w=8u l=1.12u nf=16 m=1 +MM3 net06 VB1 VSS VSS nfet_03v3 w=8u l=1.12u nf=16 m=1 +XRR1 VDD VOUT1 VSS ppolyf_u r_width=1u r_length=60u +XRR2 VDD VOUT2 VSS ppolyf_u r_width=1u r_length=60u +XRR3 net07 net06 VSS ppolyf_u r_width=1u r_length=5.085u +XRR4 net09 net06 VSS ppolyf_u r_width=1u r_length=5.085u +.ends C17_gf180_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C17/gf180/sW2_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW2_sL2/target_lvs.spice new file mode 100644 index 00000000..bd3b749d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW2_sL2/target_lvs.spice @@ -0,0 +1,54 @@ +.subckt C17_gf180_sW2_sL2 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 +MM1_f0 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f1 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f2 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f3 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f4 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f5 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f6 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f7 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f8 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f9 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f10 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f11 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f12 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f13 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f14 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=1.12u +MM1_f15 VOUT1 VIN1 net07 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f0 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f1 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f2 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f3 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f4 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f5 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f6 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f7 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f8 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f9 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f10 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f11 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f12 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f13 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f14 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=1.12u +MM2_f15 VOUT2 VIN2 net09 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f0 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f1 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f2 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f3 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f4 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f5 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f6 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f7 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f8 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f9 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f10 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f11 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f12 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f13 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f14 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM3_f15 net06 VB1 VSS VSS nfet_03v3 w=0.5u l=1.12u +RR1 VDD VOUT1 VSS ppolyf_u L=60u W=1u +RR2 VDD VOUT2 VSS ppolyf_u L=60u W=1u +RR3 net07 net06 VSS ppolyf_u L=5.085u W=1u +RR4 net09 net06 VSS ppolyf_u L=5.085u W=1u +.ends C17_gf180_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C17/gf180/sW2_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW2_sL2/testbench.spice new file mode 100644 index 00000000..d6ebab77 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/gf180/sW2_sL2/testbench.spice @@ -0,0 +1,39 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 C17_gf180_sW2_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +MB_VB1 VB1 VB1 VSS VSS nfet_03v3 w=8u l=1.12u +IB_VB1 VDDB VB1 4e-05 +VCM VCM 0 1.5 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW0.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW0.5_sL1.5/case.json new file mode 100644 index 00000000..f02adb53 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW0.5_sL1.5/case.json @@ -0,0 +1,150 @@ +{ + "case_id": "C17_ihp130_sW0.5_sL1.5", + "circuit_id": "C17", + "pdk": "ihp130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "dut_name": "C17_ihp130_sW0.5_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.39, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 0.39, + "nf": 4 + }, + "M3": { + "w": 2.0, + "l": 0.39, + "nf": 4 + }, + "R1": { + "r": 15000.0, + "body": "VSS", + "w": 1.0, + "l": 58.055 + }, + "R2": { + "r": 15000.0, + "body": "VSS", + "w": 1.0, + "l": 58.055 + }, + "R3": { + "r": 1000.0, + "body": "VSS", + "w": 1.0, + "l": 3.6 + }, + "R4": { + "r": 1000.0, + "body": "VSS", + "w": 1.0, + "l": 3.6 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 4e-05 + } + }, + "load": { + "vcm": 0.6, + "CL": 1e-13 + }, + "category": "diff_r", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "0aba1e99791534e3", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "R1", + "R2", + "R3", + "R4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW0.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW0.5_sL1.5/manifest.json new file mode 100644 index 00000000..fc14c161 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW0.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "11e92fb25b54fede2c1aed0d9ebc84c3e03b80e9c36372ef691b6769d2c55c9d", + "qualification.json": "9826b18807319a9bded599c1d20d683e636c94243e04eb6d7735b7f425e708ee", + "specs.json": "bd80eb4c695aecca328da4c0427bc8e50a341c9b0410b9012ed72776f2a417bb", + "target.spice": "39939adf933a8826d4db63407e7e87fada1ea2be599dffd900f96e3618cf26d6", + "target_lvs.spice": "5cf327b896546d17a4c3975f1dbe8e095e650bf238a030c96db3a919cc04d1c6", + "testbench.spice": "1d5476e93895d011408e2fd8b32733337b5af4b530c0deac407c63c13ce69c1a" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW0.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW0.5_sL1.5/qualification.json new file mode 100644 index 00000000..c38ede52 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW0.5_sL1.5/qualification.json @@ -0,0 +1,98 @@ +{ + "case_id": "C17_ihp130_sW0.5_sL1.5", + "circuit_id": "C17", + "pdk": "ihp130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "diff_r", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "0aba1e99791534e3", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "gain_lf=5.942 below floor 6" + ], + "spec": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 63990000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 5.941521, + "f3db": 106646300.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.2, + "schematic_measures": { + "vo1": 0.9889885, + "vo2": 0.9889885, + "idd": 2.813885e-05, + "vos_in": 3.637979e-12, + "gain_lf": 5.941521, + "f3db": 106646300.0, + "ugf": 183056300.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW0.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW0.5_sL1.5/specs.json new file mode 100644 index 00000000..89711d2e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW0.5_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 63990000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 5.941521, + "f3db": 106646300.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW0.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW0.5_sL1.5/target.spice new file mode 100644 index 00000000..7d41d86f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW0.5_sL1.5/target.spice @@ -0,0 +1,9 @@ +.subckt C17_ihp130_sW0.5_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 +XM1 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=2u l=0.39u ng=4 m=1 +XM2 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=2u l=0.39u ng=4 m=1 +XM3 net06 VB1 VSS VSS sg13_lv_nmos w=2u l=0.39u ng=4 m=1 +XRR1 VDD VOUT1 rppd w=1u l=58.055u m=1 +XRR2 VDD VOUT2 rppd w=1u l=58.055u m=1 +XRR3 net07 net06 rppd w=1u l=3.6u m=1 +XRR4 net09 net06 rppd w=1u l=3.6u m=1 +.ends C17_ihp130_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW0.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW0.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..191457d0 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW0.5_sL1.5/target_lvs.spice @@ -0,0 +1,18 @@ +.subckt C17_ihp130_sW0.5_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 +XM1_f0 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f1 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f2 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f3 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f0 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f1 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f2 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f3 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f0 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f1 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f2 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f3 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XRR1 VDD VOUT1 rppd w=1u l=58.055u m=1 +XRR2 VDD VOUT2 rppd w=1u l=58.055u m=1 +XRR3 net07 net06 rppd w=1u l=3.6u m=1 +XRR4 net09 net06 rppd w=1u l=3.6u m=1 +.ends C17_ihp130_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW0.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW0.5_sL1.5/testbench.spice new file mode 100644 index 00000000..490cb967 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW0.5_sL1.5/testbench.spice @@ -0,0 +1,39 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 C17_ihp130_sW0.5_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +XB_VB1 VB1 VB1 VSS VSS sg13_lv_nmos w=2u l=0.39u +IB_VB1 VDDB VB1 4e-05 +VCM VCM 0 0.6 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW0.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW0.5_sL1/case.json new file mode 100644 index 00000000..245d5cb8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW0.5_sL1/case.json @@ -0,0 +1,150 @@ +{ + "case_id": "C17_ihp130_sW0.5_sL1", + "circuit_id": "C17", + "pdk": "ihp130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "dut_name": "C17_ihp130_sW0.5_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.26, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 0.26, + "nf": 4 + }, + "M3": { + "w": 2.0, + "l": 0.26, + "nf": 4 + }, + "R1": { + "r": 15000.0, + "body": "VSS", + "w": 1.0, + "l": 58.055 + }, + "R2": { + "r": 15000.0, + "body": "VSS", + "w": 1.0, + "l": 58.055 + }, + "R3": { + "r": 1000.0, + "body": "VSS", + "w": 1.0, + "l": 3.6 + }, + "R4": { + "r": 1000.0, + "body": "VSS", + "w": 1.0, + "l": 3.6 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 4e-05 + } + }, + "load": { + "vcm": 0.6, + "CL": 1e-13 + }, + "category": "diff_r", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.26, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.26, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.26, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "f346c32c94f6ee07", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "R1", + "R2", + "R3", + "R4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW0.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW0.5_sL1/manifest.json new file mode 100644 index 00000000..3a3714e3 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW0.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "92fdc0011fa46a8139d18bff83558be7b0fdc4729798e790b9b4335eb7dbe841", + "qualification.json": "327d34fe8e6f1c31cebf90d0af4f0045b48197a87d47695f8410436aac7d44e2", + "specs.json": "bdf63f595e41b07890ab2bab382a1b73737b864ad5a15ca9265b3dbd371e340b", + "target.spice": "2f9d7af4a7d98267de37e83647b437e78343e4f31c1c1d7bb32294ff9669f2a1", + "target_lvs.spice": "12abba580ab3859f3c67c49777f928d08e00a751f70b15cb147d4f8e35dd4aec", + "testbench.spice": "b5cb944431ff3d821ada731c29269e3ee5426490941d779ed1b8750dc531625f" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW0.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW0.5_sL1/qualification.json new file mode 100644 index 00000000..d22145b8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW0.5_sL1/qualification.json @@ -0,0 +1,96 @@ +{ + "case_id": "C17_ihp130_sW0.5_sL1", + "circuit_id": "C17", + "pdk": "ihp130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "diff_r", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.26, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.26, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.26, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "f346c32c94f6ee07", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 64600000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 6.071398, + "f3db": 107658700.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.2, + "schematic_measures": { + "vo1": 1.006454, + "vo2": 1.006454, + "idd": 2.580981e-05, + "vos_in": 0.0, + "gain_lf": 6.071398, + "f3db": 107658700.0, + "ugf": 188550200.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW0.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW0.5_sL1/specs.json new file mode 100644 index 00000000..2218e92d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW0.5_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 64600000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 6.071398, + "f3db": 107658700.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW0.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW0.5_sL1/target.spice new file mode 100644 index 00000000..36f8ae94 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW0.5_sL1/target.spice @@ -0,0 +1,9 @@ +.subckt C17_ihp130_sW0.5_sL1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 +XM1 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=2u l=0.26u ng=4 m=1 +XM2 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=2u l=0.26u ng=4 m=1 +XM3 net06 VB1 VSS VSS sg13_lv_nmos w=2u l=0.26u ng=4 m=1 +XRR1 VDD VOUT1 rppd w=1u l=58.055u m=1 +XRR2 VDD VOUT2 rppd w=1u l=58.055u m=1 +XRR3 net07 net06 rppd w=1u l=3.6u m=1 +XRR4 net09 net06 rppd w=1u l=3.6u m=1 +.ends C17_ihp130_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW0.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW0.5_sL1/target_lvs.spice new file mode 100644 index 00000000..e466d5c3 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW0.5_sL1/target_lvs.spice @@ -0,0 +1,18 @@ +.subckt C17_ihp130_sW0.5_sL1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 +XM1_f0 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f1 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f2 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f3 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f0 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f1 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f2 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f3 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f0 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f1 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f2 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f3 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XRR1 VDD VOUT1 rppd w=1u l=58.055u m=1 +XRR2 VDD VOUT2 rppd w=1u l=58.055u m=1 +XRR3 net07 net06 rppd w=1u l=3.6u m=1 +XRR4 net09 net06 rppd w=1u l=3.6u m=1 +.ends C17_ihp130_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW0.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW0.5_sL1/testbench.spice new file mode 100644 index 00000000..74fd5521 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW0.5_sL1/testbench.spice @@ -0,0 +1,39 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 C17_ihp130_sW0.5_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +XB_VB1 VB1 VB1 VSS VSS sg13_lv_nmos w=2u l=0.26u +IB_VB1 VDDB VB1 4e-05 +VCM VCM 0 0.6 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW0.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW0.5_sL2/case.json new file mode 100644 index 00000000..9e7d015f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW0.5_sL2/case.json @@ -0,0 +1,150 @@ +{ + "case_id": "C17_ihp130_sW0.5_sL2", + "circuit_id": "C17", + "pdk": "ihp130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "dut_name": "C17_ihp130_sW0.5_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.52, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 0.52, + "nf": 4 + }, + "M3": { + "w": 2.0, + "l": 0.52, + "nf": 4 + }, + "R1": { + "r": 15000.0, + "body": "VSS", + "w": 1.0, + "l": 58.055 + }, + "R2": { + "r": 15000.0, + "body": "VSS", + "w": 1.0, + "l": 58.055 + }, + "R3": { + "r": 1000.0, + "body": "VSS", + "w": 1.0, + "l": 3.6 + }, + "R4": { + "r": 1000.0, + "body": "VSS", + "w": 1.0, + "l": 3.6 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 4e-05 + } + }, + "load": { + "vcm": 0.6, + "CL": 1e-13 + }, + "category": "diff_r", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "5e9312d16677d32d", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "R1", + "R2", + "R3", + "R4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW0.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW0.5_sL2/manifest.json new file mode 100644 index 00000000..bbb3829c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW0.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "e4dd65a510a7544a0c7e62e56878d640ad7b6022af2617d4a688f55cdc13aa6c", + "qualification.json": "ca6b1771ff655f039b1b4d369a6d109bb7293d37297779f95c87b8304954d99a", + "specs.json": "25f49f1720f5501280cf4fb83a8b1bb2ea412a5c1cc3204fec23c880afa9bb87", + "target.spice": "4706fe75e725640330520cb2cb26d2d96de82b05c123d40acb14230136a4f81e", + "target_lvs.spice": "24e41fb8c3f454851f33d7b51cb2b7d7ffb0b770d3f8b221e8773e417e25bad5", + "testbench.spice": "69970473ba1a73e40b1c09bfd5a8ba8089d2975ff5c4bc86e8fa9de19413b05f" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW0.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW0.5_sL2/qualification.json new file mode 100644 index 00000000..d61f6ffb --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW0.5_sL2/qualification.json @@ -0,0 +1,98 @@ +{ + "case_id": "C17_ihp130_sW0.5_sL2", + "circuit_id": "C17", + "pdk": "ihp130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "diff_r", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "5e9312d16677d32d", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "gain_lf=5.469 below floor 6" + ], + "spec": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 63410000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 5.468711, + "f3db": 105677000.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.2, + "schematic_measures": { + "vo1": 0.9872316, + "vo2": 0.9872316, + "idd": 2.837313e-05, + "vos_in": 0.0, + "gain_lf": 5.468711, + "f3db": 105677000.0, + "ugf": 168395000.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW0.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW0.5_sL2/specs.json new file mode 100644 index 00000000..1e195d45 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW0.5_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 63410000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 5.468711, + "f3db": 105677000.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW0.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW0.5_sL2/target.spice new file mode 100644 index 00000000..d7f71adc --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW0.5_sL2/target.spice @@ -0,0 +1,9 @@ +.subckt C17_ihp130_sW0.5_sL2 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 +XM1 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=2u l=0.52u ng=4 m=1 +XM2 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=2u l=0.52u ng=4 m=1 +XM3 net06 VB1 VSS VSS sg13_lv_nmos w=2u l=0.52u ng=4 m=1 +XRR1 VDD VOUT1 rppd w=1u l=58.055u m=1 +XRR2 VDD VOUT2 rppd w=1u l=58.055u m=1 +XRR3 net07 net06 rppd w=1u l=3.6u m=1 +XRR4 net09 net06 rppd w=1u l=3.6u m=1 +.ends C17_ihp130_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW0.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW0.5_sL2/target_lvs.spice new file mode 100644 index 00000000..e8aa1c73 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW0.5_sL2/target_lvs.spice @@ -0,0 +1,18 @@ +.subckt C17_ihp130_sW0.5_sL2 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 +XM1_f0 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f1 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f2 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f3 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f0 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f1 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f2 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f3 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f0 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f1 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f2 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f3 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XRR1 VDD VOUT1 rppd w=1u l=58.055u m=1 +XRR2 VDD VOUT2 rppd w=1u l=58.055u m=1 +XRR3 net07 net06 rppd w=1u l=3.6u m=1 +XRR4 net09 net06 rppd w=1u l=3.6u m=1 +.ends C17_ihp130_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW0.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW0.5_sL2/testbench.spice new file mode 100644 index 00000000..6c95a990 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW0.5_sL2/testbench.spice @@ -0,0 +1,39 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 C17_ihp130_sW0.5_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +XB_VB1 VB1 VB1 VSS VSS sg13_lv_nmos w=2u l=0.52u +IB_VB1 VDDB VB1 4e-05 +VCM VCM 0 0.6 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1.5_sL1.5/case.json new file mode 100644 index 00000000..25a21dc6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1.5_sL1.5/case.json @@ -0,0 +1,150 @@ +{ + "case_id": "C17_ihp130_sW1.5_sL1.5", + "circuit_id": "C17", + "pdk": "ihp130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "dut_name": "C17_ihp130_sW1.5_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1" + ], + "sizing": { + "M1": { + "w": 6.0, + "l": 0.39, + "nf": 12 + }, + "M2": { + "w": 6.0, + "l": 0.39, + "nf": 12 + }, + "M3": { + "w": 6.0, + "l": 0.39, + "nf": 12 + }, + "R1": { + "r": 15000.0, + "body": "VSS", + "w": 1.0, + "l": 58.055 + }, + "R2": { + "r": 15000.0, + "body": "VSS", + "w": 1.0, + "l": 58.055 + }, + "R3": { + "r": 1000.0, + "body": "VSS", + "w": 1.0, + "l": 3.6 + }, + "R4": { + "r": 1000.0, + "body": "VSS", + "w": 1.0, + "l": 3.6 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 4e-05 + } + }, + "load": { + "vcm": 0.6, + "CL": 1e-13 + }, + "category": "diff_r", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.39, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.39, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.39, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "7d30068458eda978", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "R1", + "R2", + "R3", + "R4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1.5_sL1.5/manifest.json new file mode 100644 index 00000000..0fac9ea7 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "604f5295d4cd65da536bece728c0f6f7b1f307476323bc0e3ee2ce20c7d268f8", + "qualification.json": "2c4dddd95d35036d3d9ec8d7fdd8a2dba79e07f9504357d53dabe31f646ca79a", + "specs.json": "7fe580f30da4bfe7e154a664b861467e1d526aefc45f32f62bd97a030d65302c", + "target.spice": "4f9739b98e3b1898fc993c1eb4d749468a131012470ae3eb193cb2b4c6fb0302", + "target_lvs.spice": "69b671cee6c4916c5a155615a911d73764a1f931453c7e8fd909a963a5a66986", + "testbench.spice": "bc51f6131b45d2cc46b5a7a68db4907a70c7033a7843cd5d7c49b975a0f8f4f1" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1.5_sL1.5/qualification.json new file mode 100644 index 00000000..eb67b23a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1.5_sL1.5/qualification.json @@ -0,0 +1,96 @@ +{ + "case_id": "C17_ihp130_sW1.5_sL1.5", + "circuit_id": "C17", + "pdk": "ihp130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "diff_r", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.39, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.39, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.39, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "7d30068458eda978", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 62880000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 7.715947, + "f3db": 104791900.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.3, + "schematic_measures": { + "vo1": 1.01808, + "vo2": 1.01808, + "idd": 2.425947e-05, + "vos_in": 0.0, + "gain_lf": 7.715947, + "f3db": 104791900.0, + "ugf": 233216000.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1.5_sL1.5/specs.json new file mode 100644 index 00000000..5e0ed27b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1.5_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 62880000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 7.715947, + "f3db": 104791900.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1.5_sL1.5/target.spice new file mode 100644 index 00000000..992fb5ac --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1.5_sL1.5/target.spice @@ -0,0 +1,9 @@ +.subckt C17_ihp130_sW1.5_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 +XM1 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=6u l=0.39u ng=12 m=1 +XM2 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=6u l=0.39u ng=12 m=1 +XM3 net06 VB1 VSS VSS sg13_lv_nmos w=6u l=0.39u ng=12 m=1 +XRR1 VDD VOUT1 rppd w=1u l=58.055u m=1 +XRR2 VDD VOUT2 rppd w=1u l=58.055u m=1 +XRR3 net07 net06 rppd w=1u l=3.6u m=1 +XRR4 net09 net06 rppd w=1u l=3.6u m=1 +.ends C17_ihp130_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..f3addb57 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1.5_sL1.5/target_lvs.spice @@ -0,0 +1,42 @@ +.subckt C17_ihp130_sW1.5_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 +XM1_f0 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f1 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f2 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f3 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f4 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f5 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f6 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f7 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f8 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f9 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f10 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f11 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f0 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f1 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f2 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f3 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f4 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f5 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f6 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f7 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f8 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f9 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f10 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f11 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f0 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f1 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f2 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f3 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f4 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f5 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f6 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f7 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f8 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f9 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f10 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f11 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XRR1 VDD VOUT1 rppd w=1u l=58.055u m=1 +XRR2 VDD VOUT2 rppd w=1u l=58.055u m=1 +XRR3 net07 net06 rppd w=1u l=3.6u m=1 +XRR4 net09 net06 rppd w=1u l=3.6u m=1 +.ends C17_ihp130_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1.5_sL1.5/testbench.spice new file mode 100644 index 00000000..6db8c47f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1.5_sL1.5/testbench.spice @@ -0,0 +1,39 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 C17_ihp130_sW1.5_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +XB_VB1 VB1 VB1 VSS VSS sg13_lv_nmos w=6u l=0.39u +IB_VB1 VDDB VB1 4e-05 +VCM VCM 0 0.6 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1.5_sL1/case.json new file mode 100644 index 00000000..a11ce016 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1.5_sL1/case.json @@ -0,0 +1,150 @@ +{ + "case_id": "C17_ihp130_sW1.5_sL1", + "circuit_id": "C17", + "pdk": "ihp130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "dut_name": "C17_ihp130_sW1.5_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1" + ], + "sizing": { + "M1": { + "w": 6.0, + "l": 0.26, + "nf": 12 + }, + "M2": { + "w": 6.0, + "l": 0.26, + "nf": 12 + }, + "M3": { + "w": 6.0, + "l": 0.26, + "nf": 12 + }, + "R1": { + "r": 15000.0, + "body": "VSS", + "w": 1.0, + "l": 58.055 + }, + "R2": { + "r": 15000.0, + "body": "VSS", + "w": 1.0, + "l": 58.055 + }, + "R3": { + "r": 1000.0, + "body": "VSS", + "w": 1.0, + "l": 3.6 + }, + "R4": { + "r": 1000.0, + "body": "VSS", + "w": 1.0, + "l": 3.6 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 4e-05 + } + }, + "load": { + "vcm": 0.6, + "CL": 1e-13 + }, + "category": "diff_r", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.26, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.26, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.26, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "1d0375d5f1075dad", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "R1", + "R2", + "R3", + "R4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1.5_sL1/manifest.json new file mode 100644 index 00000000..38221a34 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "49d5198afd5bf42d776c1056ca80447976ff33a0dd88c69a01d3b2efd7b9e860", + "qualification.json": "3ca499643ed2f836fe642edebd2b8c35726c64d6d737f309d9fd870e6c870d22", + "specs.json": "be228909bdfe1dd3d1478cc4b10611a781e44633b94ba6ff8bd346f174d4d646", + "target.spice": "a995d0300b4c76210b16789fbb18c8698b2d584965d5f19679139b6f96d5f38e", + "target_lvs.spice": "aa802cbd0b3b4d5d85e829c6516a4258beeb43695bc4008a71242f93cd871b4d", + "testbench.spice": "c748151f8d9a64f5da721400e98103bed21484406b3f00ff77a520e1c22eba16" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1.5_sL1/qualification.json new file mode 100644 index 00000000..7305e51d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1.5_sL1/qualification.json @@ -0,0 +1,96 @@ +{ + "case_id": "C17_ihp130_sW1.5_sL1", + "circuit_id": "C17", + "pdk": "ihp130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "diff_r", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.26, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.26, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.26, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "1d0375d5f1075dad", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 63040000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 7.456876, + "f3db": 105071600.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.3, + "schematic_measures": { + "vo1": 1.043034, + "vo2": 1.043034, + "idd": 2.093175e-05, + "vos_in": -1.81899e-12, + "gain_lf": 7.456876, + "f3db": 105071600.0, + "ugf": 225280100.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1.5_sL1/specs.json new file mode 100644 index 00000000..8af27c8d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1.5_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 63040000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 7.456876, + "f3db": 105071600.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1.5_sL1/target.spice new file mode 100644 index 00000000..7e8b11a2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1.5_sL1/target.spice @@ -0,0 +1,9 @@ +.subckt C17_ihp130_sW1.5_sL1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 +XM1 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=6u l=0.26u ng=12 m=1 +XM2 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=6u l=0.26u ng=12 m=1 +XM3 net06 VB1 VSS VSS sg13_lv_nmos w=6u l=0.26u ng=12 m=1 +XRR1 VDD VOUT1 rppd w=1u l=58.055u m=1 +XRR2 VDD VOUT2 rppd w=1u l=58.055u m=1 +XRR3 net07 net06 rppd w=1u l=3.6u m=1 +XRR4 net09 net06 rppd w=1u l=3.6u m=1 +.ends C17_ihp130_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1.5_sL1/target_lvs.spice new file mode 100644 index 00000000..c2a4ffad --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1.5_sL1/target_lvs.spice @@ -0,0 +1,42 @@ +.subckt C17_ihp130_sW1.5_sL1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 +XM1_f0 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f1 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f2 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f3 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f4 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f5 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f6 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f7 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f8 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f9 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f10 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f11 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f0 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f1 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f2 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f3 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f4 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f5 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f6 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f7 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f8 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f9 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f10 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f11 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f0 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f1 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f2 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f3 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f4 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f5 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f6 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f7 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f8 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f9 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f10 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f11 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XRR1 VDD VOUT1 rppd w=1u l=58.055u m=1 +XRR2 VDD VOUT2 rppd w=1u l=58.055u m=1 +XRR3 net07 net06 rppd w=1u l=3.6u m=1 +XRR4 net09 net06 rppd w=1u l=3.6u m=1 +.ends C17_ihp130_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1.5_sL1/testbench.spice new file mode 100644 index 00000000..0d82b2ae --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1.5_sL1/testbench.spice @@ -0,0 +1,39 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 C17_ihp130_sW1.5_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +XB_VB1 VB1 VB1 VSS VSS sg13_lv_nmos w=6u l=0.26u +IB_VB1 VDDB VB1 4e-05 +VCM VCM 0 0.6 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1.5_sL2/case.json new file mode 100644 index 00000000..6c98f90e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1.5_sL2/case.json @@ -0,0 +1,150 @@ +{ + "case_id": "C17_ihp130_sW1.5_sL2", + "circuit_id": "C17", + "pdk": "ihp130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "dut_name": "C17_ihp130_sW1.5_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1" + ], + "sizing": { + "M1": { + "w": 6.0, + "l": 0.52, + "nf": 12 + }, + "M2": { + "w": 6.0, + "l": 0.52, + "nf": 12 + }, + "M3": { + "w": 6.0, + "l": 0.52, + "nf": 12 + }, + "R1": { + "r": 15000.0, + "body": "VSS", + "w": 1.0, + "l": 58.055 + }, + "R2": { + "r": 15000.0, + "body": "VSS", + "w": 1.0, + "l": 58.055 + }, + "R3": { + "r": 1000.0, + "body": "VSS", + "w": 1.0, + "l": 3.6 + }, + "R4": { + "r": 1000.0, + "body": "VSS", + "w": 1.0, + "l": 3.6 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 4e-05 + } + }, + "load": { + "vcm": 0.6, + "CL": 1e-13 + }, + "category": "diff_r", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.52, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.52, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.52, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "c8fb0ecf39c25b8e", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "R1", + "R2", + "R3", + "R4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1.5_sL2/manifest.json new file mode 100644 index 00000000..6a2cf161 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "6cb4147fe772d60cea7b69611def203a2173b7fd01e3a75d2b77cf89c2f3448f", + "qualification.json": "9573e1c3856946b1d4401a9bb4acb6b6568bf9555dca969d2c8293a4e85c4fac", + "specs.json": "e64078b2278477c9ce7916b19343d8f45733c0f2105cb0ced53bda472bf448e7", + "target.spice": "d00c7724fb3ade147358341564db9d71bb021ef516382375f2188e57ca99319d", + "target_lvs.spice": "7f71e9976e9d64f8436185d6ec3d72d7d3f4b0d486f7f267577e2bdc83c27ad9", + "testbench.spice": "e9e1b0ab707c7ad7cfcbb06436c6ded4f341f4de956d57830316497cac83f940" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1.5_sL2/qualification.json new file mode 100644 index 00000000..c052f621 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1.5_sL2/qualification.json @@ -0,0 +1,96 @@ +{ + "case_id": "C17_ihp130_sW1.5_sL2", + "circuit_id": "C17", + "pdk": "ihp130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "diff_r", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.52, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.52, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.52, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "c8fb0ecf39c25b8e", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 62500000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 7.652116, + "f3db": 104159200.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.3, + "schematic_measures": { + "vo1": 1.004767, + "vo2": 1.004767, + "idd": 2.603473e-05, + "vos_in": 0.0, + "gain_lf": 7.652116, + "f3db": 104159200.0, + "ugf": 229824300.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1.5_sL2/specs.json new file mode 100644 index 00000000..7d3e7e95 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1.5_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 62500000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 7.652116, + "f3db": 104159200.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1.5_sL2/target.spice new file mode 100644 index 00000000..d707ae31 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1.5_sL2/target.spice @@ -0,0 +1,9 @@ +.subckt C17_ihp130_sW1.5_sL2 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 +XM1 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=6u l=0.52u ng=12 m=1 +XM2 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=6u l=0.52u ng=12 m=1 +XM3 net06 VB1 VSS VSS sg13_lv_nmos w=6u l=0.52u ng=12 m=1 +XRR1 VDD VOUT1 rppd w=1u l=58.055u m=1 +XRR2 VDD VOUT2 rppd w=1u l=58.055u m=1 +XRR3 net07 net06 rppd w=1u l=3.6u m=1 +XRR4 net09 net06 rppd w=1u l=3.6u m=1 +.ends C17_ihp130_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1.5_sL2/target_lvs.spice new file mode 100644 index 00000000..c94caca4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1.5_sL2/target_lvs.spice @@ -0,0 +1,42 @@ +.subckt C17_ihp130_sW1.5_sL2 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 +XM1_f0 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f1 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f2 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f3 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f4 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f5 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f6 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f7 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f8 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f9 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f10 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f11 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f0 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f1 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f2 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f3 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f4 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f5 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f6 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f7 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f8 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f9 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f10 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f11 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f0 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f1 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f2 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f3 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f4 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f5 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f6 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f7 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f8 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f9 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f10 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f11 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XRR1 VDD VOUT1 rppd w=1u l=58.055u m=1 +XRR2 VDD VOUT2 rppd w=1u l=58.055u m=1 +XRR3 net07 net06 rppd w=1u l=3.6u m=1 +XRR4 net09 net06 rppd w=1u l=3.6u m=1 +.ends C17_ihp130_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1.5_sL2/testbench.spice new file mode 100644 index 00000000..dd7c70d6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1.5_sL2/testbench.spice @@ -0,0 +1,39 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 C17_ihp130_sW1.5_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +XB_VB1 VB1 VB1 VSS VSS sg13_lv_nmos w=6u l=0.52u +IB_VB1 VDDB VB1 4e-05 +VCM VCM 0 0.6 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1_sL1.5/case.json new file mode 100644 index 00000000..2bcafcfe --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1_sL1.5/case.json @@ -0,0 +1,150 @@ +{ + "case_id": "C17_ihp130_sW1_sL1.5", + "circuit_id": "C17", + "pdk": "ihp130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "dut_name": "C17_ihp130_sW1_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.39, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 0.39, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 0.39, + "nf": 8 + }, + "R1": { + "r": 15000.0, + "body": "VSS", + "w": 1.0, + "l": 58.055 + }, + "R2": { + "r": 15000.0, + "body": "VSS", + "w": 1.0, + "l": 58.055 + }, + "R3": { + "r": 1000.0, + "body": "VSS", + "w": 1.0, + "l": 3.6 + }, + "R4": { + "r": 1000.0, + "body": "VSS", + "w": 1.0, + "l": 3.6 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 4e-05 + } + }, + "load": { + "vcm": 0.6, + "CL": 1e-13 + }, + "category": "diff_r", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "cb211546087dec2f", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "R1", + "R2", + "R3", + "R4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1_sL1.5/manifest.json new file mode 100644 index 00000000..acd98509 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "99946854b6df98aa7a0899a80bfa9a647d2df0d88188f1687ce60506b9de8343", + "qualification.json": "f2d55cf7cde502f28e9931a980eb04015a87005a4069b20a2743de8173904778", + "specs.json": "94726ba5313a35e5dc6ca8b5a636c39e2221428b689beddcb2a5c5bf8ad6be3a", + "target.spice": "8505160dbb7a9a9642e83c7e0a787f03827b1a655c10d486c1f73544b715081a", + "target_lvs.spice": "2aedfdd3ccc7dcd3083652729ece901a7cd3480ef993bd4f11e5547fc3334fd9", + "testbench.spice": "e716131e3bbe49f9fc4e7703ff12d90e84c65f5a56cafbd935f0929aa5405a71" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1_sL1.5/qualification.json new file mode 100644 index 00000000..5115fa0e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1_sL1.5/qualification.json @@ -0,0 +1,96 @@ +{ + "case_id": "C17_ihp130_sW1_sL1.5", + "circuit_id": "C17", + "pdk": "ihp130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "diff_r", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "cb211546087dec2f", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 63790000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 7.353998, + "f3db": 106311400.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.2, + "schematic_measures": { + "vo1": 0.9965709, + "vo2": 0.9965709, + "idd": 2.712772e-05, + "vos_in": 1.818989e-12, + "gain_lf": 7.353998, + "f3db": 106311400.0, + "ugf": 224624700.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1_sL1.5/specs.json new file mode 100644 index 00000000..35b51901 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 63790000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 7.353998, + "f3db": 106311400.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1_sL1.5/target.spice new file mode 100644 index 00000000..cf93e547 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1_sL1.5/target.spice @@ -0,0 +1,9 @@ +.subckt C17_ihp130_sW1_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 +XM1 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=4u l=0.39u ng=8 m=1 +XM2 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=4u l=0.39u ng=8 m=1 +XM3 net06 VB1 VSS VSS sg13_lv_nmos w=4u l=0.39u ng=8 m=1 +XRR1 VDD VOUT1 rppd w=1u l=58.055u m=1 +XRR2 VDD VOUT2 rppd w=1u l=58.055u m=1 +XRR3 net07 net06 rppd w=1u l=3.6u m=1 +XRR4 net09 net06 rppd w=1u l=3.6u m=1 +.ends C17_ihp130_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1_sL1.5/target_lvs.spice new file mode 100644 index 00000000..fd68fe9a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1_sL1.5/target_lvs.spice @@ -0,0 +1,30 @@ +.subckt C17_ihp130_sW1_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 +XM1_f0 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f1 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f2 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f3 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f4 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f5 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f6 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f7 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f0 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f1 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f2 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f3 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f4 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f5 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f6 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f7 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f0 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f1 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f2 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f3 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f4 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f5 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f6 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f7 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XRR1 VDD VOUT1 rppd w=1u l=58.055u m=1 +XRR2 VDD VOUT2 rppd w=1u l=58.055u m=1 +XRR3 net07 net06 rppd w=1u l=3.6u m=1 +XRR4 net09 net06 rppd w=1u l=3.6u m=1 +.ends C17_ihp130_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1_sL1.5/testbench.spice new file mode 100644 index 00000000..bf307b3b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1_sL1.5/testbench.spice @@ -0,0 +1,39 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 C17_ihp130_sW1_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +XB_VB1 VB1 VB1 VSS VSS sg13_lv_nmos w=4u l=0.39u +IB_VB1 VDDB VB1 4e-05 +VCM VCM 0 0.6 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1_sL1/case.json new file mode 100644 index 00000000..4131944e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1_sL1/case.json @@ -0,0 +1,150 @@ +{ + "case_id": "C17_ihp130_sW1_sL1", + "circuit_id": "C17", + "pdk": "ihp130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "dut_name": "C17_ihp130_sW1_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.26, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 0.26, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 0.26, + "nf": 8 + }, + "R1": { + "r": 15000.0, + "body": "VSS", + "w": 1.0, + "l": 58.055 + }, + "R2": { + "r": 15000.0, + "body": "VSS", + "w": 1.0, + "l": 58.055 + }, + "R3": { + "r": 1000.0, + "body": "VSS", + "w": 1.0, + "l": 3.6 + }, + "R4": { + "r": 1000.0, + "body": "VSS", + "w": 1.0, + "l": 3.6 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 4e-05 + } + }, + "load": { + "vcm": 0.6, + "CL": 1e-13 + }, + "category": "diff_r", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "674e7201b22c0d84", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "R1", + "R2", + "R3", + "R4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1_sL1/manifest.json new file mode 100644 index 00000000..eefdf8a1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "422111aeaa7c7fe53d79ff3600d70142d62c7cd0a56f5f3df979b4043c56f131", + "qualification.json": "3660285978fcc27d908f6e3f9f787bfc63ea02895d108e71b53fc4ce6fbe6861", + "specs.json": "bed2fa6246bb4afd2642730aeb08a37265bfdf88cd073f929d78f30eedd73658", + "target.spice": "7bc2481ebe0f823005369208929f52a983119469d7b48e54e67ebfe0293d3138", + "target_lvs.spice": "a452319156d260b5024cfa517747d68dbc019a9617a4fc4f7af1589043baef54", + "testbench.spice": "9dccc7f51d00719a29c282b976413c37e4793e2b43e7d7a84cb7f64a0c3576cf" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1_sL1/qualification.json new file mode 100644 index 00000000..a10a23b9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1_sL1/qualification.json @@ -0,0 +1,96 @@ +{ + "case_id": "C17_ihp130_sW1_sL1", + "circuit_id": "C17", + "pdk": "ihp130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "diff_r", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "674e7201b22c0d84", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 64200000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 7.213422, + "f3db": 106993800.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.3, + "schematic_measures": { + "vo1": 1.02104, + "vo2": 1.02104, + "idd": 2.386467e-05, + "vos_in": 3.637979e-12, + "gain_lf": 7.213422, + "f3db": 106993800.0, + "ugf": 221610800.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1_sL1/specs.json new file mode 100644 index 00000000..7bfd50ca --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 64200000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 7.213422, + "f3db": 106993800.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1_sL1/target.spice new file mode 100644 index 00000000..304bc216 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1_sL1/target.spice @@ -0,0 +1,9 @@ +.subckt C17_ihp130_sW1_sL1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 +XM1 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=4u l=0.26u ng=8 m=1 +XM2 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=4u l=0.26u ng=8 m=1 +XM3 net06 VB1 VSS VSS sg13_lv_nmos w=4u l=0.26u ng=8 m=1 +XRR1 VDD VOUT1 rppd w=1u l=58.055u m=1 +XRR2 VDD VOUT2 rppd w=1u l=58.055u m=1 +XRR3 net07 net06 rppd w=1u l=3.6u m=1 +XRR4 net09 net06 rppd w=1u l=3.6u m=1 +.ends C17_ihp130_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1_sL1/target_lvs.spice new file mode 100644 index 00000000..15e25898 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1_sL1/target_lvs.spice @@ -0,0 +1,30 @@ +.subckt C17_ihp130_sW1_sL1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 +XM1_f0 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f1 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f2 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f3 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f4 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f5 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f6 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f7 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f0 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f1 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f2 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f3 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f4 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f5 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f6 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f7 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f0 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f1 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f2 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f3 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f4 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f5 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f6 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f7 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XRR1 VDD VOUT1 rppd w=1u l=58.055u m=1 +XRR2 VDD VOUT2 rppd w=1u l=58.055u m=1 +XRR3 net07 net06 rppd w=1u l=3.6u m=1 +XRR4 net09 net06 rppd w=1u l=3.6u m=1 +.ends C17_ihp130_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1_sL1/testbench.spice new file mode 100644 index 00000000..8e7f75f6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1_sL1/testbench.spice @@ -0,0 +1,39 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 C17_ihp130_sW1_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +XB_VB1 VB1 VB1 VSS VSS sg13_lv_nmos w=4u l=0.26u +IB_VB1 VDDB VB1 4e-05 +VCM VCM 0 0.6 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1_sL2/case.json new file mode 100644 index 00000000..0511bdbb --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1_sL2/case.json @@ -0,0 +1,150 @@ +{ + "case_id": "C17_ihp130_sW1_sL2", + "circuit_id": "C17", + "pdk": "ihp130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "dut_name": "C17_ihp130_sW1_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.52, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 0.52, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 0.52, + "nf": 8 + }, + "R1": { + "r": 15000.0, + "body": "VSS", + "w": 1.0, + "l": 58.055 + }, + "R2": { + "r": 15000.0, + "body": "VSS", + "w": 1.0, + "l": 58.055 + }, + "R3": { + "r": 1000.0, + "body": "VSS", + "w": 1.0, + "l": 3.6 + }, + "R4": { + "r": 1000.0, + "body": "VSS", + "w": 1.0, + "l": 3.6 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 4e-05 + } + }, + "load": { + "vcm": 0.6, + "CL": 1e-13 + }, + "category": "diff_r", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "357001ffc886bf12", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "R1", + "R2", + "R3", + "R4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1_sL2/manifest.json new file mode 100644 index 00000000..25b354de --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "1f57257f4eb797d61760319fe799601944915ab4092137689b3314631f233fda", + "qualification.json": "a2ed80f82a3674ea2bc250ad0927cf417eff8fe7c1fa5c09aa30f9d83a056ef6", + "specs.json": "11c184364685d1127e403b1c593eb31bce1dd3b6f7451adbbfca873ecb37520a", + "target.spice": "14ee414433d0707a47386b63ad2dfdca4c4546de09feeecd6ab60fefb84554b1", + "target_lvs.spice": "96749c4e3f6a681f506599d1202af8cf02e7256c7ebead279d9f5110d1e3598f", + "testbench.spice": "a97bd86b0750bee3a79b2d84a3010ff9c8909c3dcd408f0e99edf98818450ba8" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1_sL2/qualification.json new file mode 100644 index 00000000..757bd1ee --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1_sL2/qualification.json @@ -0,0 +1,96 @@ +{ + "case_id": "C17_ihp130_sW1_sL2", + "circuit_id": "C17", + "pdk": "ihp130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "diff_r", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "357001ffc886bf12", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 63290000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 7.18929, + "f3db": 105477500.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.2, + "schematic_measures": { + "vo1": 0.9847926, + "vo2": 0.9847926, + "idd": 2.869837e-05, + "vos_in": 1.818989e-12, + "gain_lf": 7.18929, + "f3db": 105477500.0, + "ugf": 217910300.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1_sL2/specs.json new file mode 100644 index 00000000..37d4a8be --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 63290000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 7.18929, + "f3db": 105477500.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1_sL2/target.spice new file mode 100644 index 00000000..aa716c65 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1_sL2/target.spice @@ -0,0 +1,9 @@ +.subckt C17_ihp130_sW1_sL2 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 +XM1 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=4u l=0.52u ng=8 m=1 +XM2 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=4u l=0.52u ng=8 m=1 +XM3 net06 VB1 VSS VSS sg13_lv_nmos w=4u l=0.52u ng=8 m=1 +XRR1 VDD VOUT1 rppd w=1u l=58.055u m=1 +XRR2 VDD VOUT2 rppd w=1u l=58.055u m=1 +XRR3 net07 net06 rppd w=1u l=3.6u m=1 +XRR4 net09 net06 rppd w=1u l=3.6u m=1 +.ends C17_ihp130_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1_sL2/target_lvs.spice new file mode 100644 index 00000000..f11c0ff4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1_sL2/target_lvs.spice @@ -0,0 +1,30 @@ +.subckt C17_ihp130_sW1_sL2 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 +XM1_f0 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f1 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f2 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f3 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f4 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f5 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f6 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f7 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f0 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f1 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f2 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f3 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f4 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f5 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f6 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f7 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f0 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f1 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f2 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f3 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f4 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f5 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f6 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f7 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XRR1 VDD VOUT1 rppd w=1u l=58.055u m=1 +XRR2 VDD VOUT2 rppd w=1u l=58.055u m=1 +XRR3 net07 net06 rppd w=1u l=3.6u m=1 +XRR4 net09 net06 rppd w=1u l=3.6u m=1 +.ends C17_ihp130_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1_sL2/testbench.spice new file mode 100644 index 00000000..e29e049c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW1_sL2/testbench.spice @@ -0,0 +1,39 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 C17_ihp130_sW1_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +XB_VB1 VB1 VB1 VSS VSS sg13_lv_nmos w=4u l=0.52u +IB_VB1 VDDB VB1 4e-05 +VCM VCM 0 0.6 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW2_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW2_sL1.5/case.json new file mode 100644 index 00000000..0f0df0e5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW2_sL1.5/case.json @@ -0,0 +1,150 @@ +{ + "case_id": "C17_ihp130_sW2_sL1.5", + "circuit_id": "C17", + "pdk": "ihp130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "dut_name": "C17_ihp130_sW2_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1" + ], + "sizing": { + "M1": { + "w": 8.0, + "l": 0.39, + "nf": 16 + }, + "M2": { + "w": 8.0, + "l": 0.39, + "nf": 16 + }, + "M3": { + "w": 8.0, + "l": 0.39, + "nf": 16 + }, + "R1": { + "r": 15000.0, + "body": "VSS", + "w": 1.0, + "l": 58.055 + }, + "R2": { + "r": 15000.0, + "body": "VSS", + "w": 1.0, + "l": 58.055 + }, + "R3": { + "r": 1000.0, + "body": "VSS", + "w": 1.0, + "l": 3.6 + }, + "R4": { + "r": 1000.0, + "body": "VSS", + "w": 1.0, + "l": 3.6 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 4e-05 + } + }, + "load": { + "vcm": 0.6, + "CL": 1e-13 + }, + "category": "diff_r", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "9f7bed10f4ef6849", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "R1", + "R2", + "R3", + "R4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW2_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW2_sL1.5/manifest.json new file mode 100644 index 00000000..932bf75f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW2_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "20a863fe3e3286b5906aab72be58f13a175e3964733362a3a619ece544b9359b", + "qualification.json": "525b9da51df85cdd86dcf244ba881a330d08e73ba938021845c0047f685ec1ab", + "specs.json": "bc481db264923dda1436d7d3be95817ca4e5b62aad4a8fd4aaf49ee46c376f05", + "target.spice": "55635ebcb648a3b118bf73dfaad63706edd58f3c3ad10e9a17a3443a2db23e69", + "target_lvs.spice": "dc82bc14b4f7a8436207f7f1b813e03a194c151f03249bb29e8ec2c38dd1cfcd", + "testbench.spice": "641df8751d7795b551b2db562849d23fecf4b4e4553af88bbf645baaf7dfd599" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW2_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW2_sL1.5/qualification.json new file mode 100644 index 00000000..a849fef1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW2_sL1.5/qualification.json @@ -0,0 +1,96 @@ +{ + "case_id": "C17_ihp130_sW2_sL1.5", + "circuit_id": "C17", + "pdk": "ihp130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "diff_r", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "9f7bed10f4ef6849", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 61750000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 7.7766, + "f3db": 102911000.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.4, + "schematic_measures": { + "vo1": 1.03766, + "vo2": 1.03766, + "idd": 2.164834e-05, + "vos_in": -1.81899e-12, + "gain_lf": 7.7766, + "f3db": 102911000.0, + "ugf": 231036100.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW2_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW2_sL1.5/specs.json new file mode 100644 index 00000000..965d189a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW2_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 61750000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 7.7766, + "f3db": 102911000.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW2_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW2_sL1.5/target.spice new file mode 100644 index 00000000..691bb92c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW2_sL1.5/target.spice @@ -0,0 +1,9 @@ +.subckt C17_ihp130_sW2_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 +XM1 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=8u l=0.39u ng=16 m=1 +XM2 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=8u l=0.39u ng=16 m=1 +XM3 net06 VB1 VSS VSS sg13_lv_nmos w=8u l=0.39u ng=16 m=1 +XRR1 VDD VOUT1 rppd w=1u l=58.055u m=1 +XRR2 VDD VOUT2 rppd w=1u l=58.055u m=1 +XRR3 net07 net06 rppd w=1u l=3.6u m=1 +XRR4 net09 net06 rppd w=1u l=3.6u m=1 +.ends C17_ihp130_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW2_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW2_sL1.5/target_lvs.spice new file mode 100644 index 00000000..97c516a4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW2_sL1.5/target_lvs.spice @@ -0,0 +1,54 @@ +.subckt C17_ihp130_sW2_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 +XM1_f0 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f1 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f2 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f3 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f4 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f5 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f6 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f7 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f8 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f9 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f10 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f11 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f12 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f13 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f14 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f15 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f0 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f1 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f2 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f3 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f4 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f5 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f6 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f7 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f8 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f9 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f10 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f11 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f12 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f13 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f14 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f15 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f0 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f1 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f2 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f3 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f4 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f5 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f6 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f7 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f8 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f9 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f10 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f11 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f12 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f13 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f14 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f15 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XRR1 VDD VOUT1 rppd w=1u l=58.055u m=1 +XRR2 VDD VOUT2 rppd w=1u l=58.055u m=1 +XRR3 net07 net06 rppd w=1u l=3.6u m=1 +XRR4 net09 net06 rppd w=1u l=3.6u m=1 +.ends C17_ihp130_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW2_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW2_sL1.5/testbench.spice new file mode 100644 index 00000000..b029c320 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW2_sL1.5/testbench.spice @@ -0,0 +1,39 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 C17_ihp130_sW2_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +XB_VB1 VB1 VB1 VSS VSS sg13_lv_nmos w=8u l=0.39u +IB_VB1 VDDB VB1 4e-05 +VCM VCM 0 0.6 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW2_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW2_sL1/case.json new file mode 100644 index 00000000..c327ebd6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW2_sL1/case.json @@ -0,0 +1,150 @@ +{ + "case_id": "C17_ihp130_sW2_sL1", + "circuit_id": "C17", + "pdk": "ihp130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "dut_name": "C17_ihp130_sW2_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1" + ], + "sizing": { + "M1": { + "w": 8.0, + "l": 0.26, + "nf": 16 + }, + "M2": { + "w": 8.0, + "l": 0.26, + "nf": 16 + }, + "M3": { + "w": 8.0, + "l": 0.26, + "nf": 16 + }, + "R1": { + "r": 15000.0, + "body": "VSS", + "w": 1.0, + "l": 58.055 + }, + "R2": { + "r": 15000.0, + "body": "VSS", + "w": 1.0, + "l": 58.055 + }, + "R3": { + "r": 1000.0, + "body": "VSS", + "w": 1.0, + "l": 3.6 + }, + "R4": { + "r": 1000.0, + "body": "VSS", + "w": 1.0, + "l": 3.6 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 4e-05 + } + }, + "load": { + "vcm": 0.6, + "CL": 1e-13 + }, + "category": "diff_r", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.26, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.26, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.26, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "7cc8f02c0a3a3521", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "R1", + "R2", + "R3", + "R4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW2_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW2_sL1/manifest.json new file mode 100644 index 00000000..045907fa --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW2_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "0a450afc941ee4d07d742fe6f74f9c068e44c960ecbaaeb99aa628d1468289e4", + "qualification.json": "b1edfc38ad12495182ce3909d1c818bb8922b49c5f154df2ee616dcbea04e02f", + "specs.json": "cbc8f11fce8419b7ff5bce7b1f8862b8f67204e38be339ffd943263fbd44204c", + "target.spice": "e1d1d2ad6aeb6da43c1bf745e894c3b283fe307182e3b0027fd18d6c9dfa4f1c", + "target_lvs.spice": "d834e5d9b9e44c35a8bb14a84b5ecbf5bed8897ed964829bbb39da95e9cfcd4e", + "testbench.spice": "61ac4640995f88f232f0bfdf71588ee3c5725469703e4bc5ed8593b4a8703df4" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW2_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW2_sL1/qualification.json new file mode 100644 index 00000000..34ac4452 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW2_sL1/qualification.json @@ -0,0 +1,96 @@ +{ + "case_id": "C17_ihp130_sW2_sL1", + "circuit_id": "C17", + "pdk": "ihp130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "diff_r", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.26, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.26, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.26, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "7cc8f02c0a3a3521", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 61730000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 7.382897, + "f3db": 102887100.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.4, + "schematic_measures": { + "vo1": 1.061853, + "vo2": 1.061853, + "idd": 1.842219e-05, + "vos_in": -3.63798e-12, + "gain_lf": 7.382897, + "f3db": 102887100.0, + "ugf": 218482700.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW2_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW2_sL1/specs.json new file mode 100644 index 00000000..9e3aad20 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW2_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 61730000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 7.382897, + "f3db": 102887100.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW2_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW2_sL1/target.spice new file mode 100644 index 00000000..25570b74 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW2_sL1/target.spice @@ -0,0 +1,9 @@ +.subckt C17_ihp130_sW2_sL1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 +XM1 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=8u l=0.26u ng=16 m=1 +XM2 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=8u l=0.26u ng=16 m=1 +XM3 net06 VB1 VSS VSS sg13_lv_nmos w=8u l=0.26u ng=16 m=1 +XRR1 VDD VOUT1 rppd w=1u l=58.055u m=1 +XRR2 VDD VOUT2 rppd w=1u l=58.055u m=1 +XRR3 net07 net06 rppd w=1u l=3.6u m=1 +XRR4 net09 net06 rppd w=1u l=3.6u m=1 +.ends C17_ihp130_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW2_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW2_sL1/target_lvs.spice new file mode 100644 index 00000000..4efe5f59 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW2_sL1/target_lvs.spice @@ -0,0 +1,54 @@ +.subckt C17_ihp130_sW2_sL1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 +XM1_f0 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f1 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f2 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f3 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f4 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f5 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f6 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f7 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f8 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f9 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f10 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f11 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f12 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f13 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f14 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f15 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f0 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f1 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f2 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f3 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f4 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f5 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f6 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f7 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f8 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f9 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f10 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f11 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f12 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f13 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f14 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f15 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f0 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f1 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f2 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f3 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f4 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f5 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f6 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f7 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f8 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f9 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f10 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f11 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f12 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f13 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f14 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f15 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XRR1 VDD VOUT1 rppd w=1u l=58.055u m=1 +XRR2 VDD VOUT2 rppd w=1u l=58.055u m=1 +XRR3 net07 net06 rppd w=1u l=3.6u m=1 +XRR4 net09 net06 rppd w=1u l=3.6u m=1 +.ends C17_ihp130_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW2_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW2_sL1/testbench.spice new file mode 100644 index 00000000..1f1165cf --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW2_sL1/testbench.spice @@ -0,0 +1,39 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 C17_ihp130_sW2_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +XB_VB1 VB1 VB1 VSS VSS sg13_lv_nmos w=8u l=0.26u +IB_VB1 VDDB VB1 4e-05 +VCM VCM 0 0.6 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW2_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW2_sL2/case.json new file mode 100644 index 00000000..6358acf3 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW2_sL2/case.json @@ -0,0 +1,150 @@ +{ + "case_id": "C17_ihp130_sW2_sL2", + "circuit_id": "C17", + "pdk": "ihp130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "dut_name": "C17_ihp130_sW2_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1" + ], + "sizing": { + "M1": { + "w": 8.0, + "l": 0.52, + "nf": 16 + }, + "M2": { + "w": 8.0, + "l": 0.52, + "nf": 16 + }, + "M3": { + "w": 8.0, + "l": 0.52, + "nf": 16 + }, + "R1": { + "r": 15000.0, + "body": "VSS", + "w": 1.0, + "l": 58.055 + }, + "R2": { + "r": 15000.0, + "body": "VSS", + "w": 1.0, + "l": 58.055 + }, + "R3": { + "r": 1000.0, + "body": "VSS", + "w": 1.0, + "l": 3.6 + }, + "R4": { + "r": 1000.0, + "body": "VSS", + "w": 1.0, + "l": 3.6 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 4e-05 + } + }, + "load": { + "vcm": 0.6, + "CL": 1e-13 + }, + "category": "diff_r", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "1826b0386648d6e3", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "R1", + "R2", + "R3", + "R4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW2_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW2_sL2/manifest.json new file mode 100644 index 00000000..d0275e66 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW2_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "6b5b797d1b26ba848e9a8b1d7bfc4425479ce19cb83130e88ad74a064023ddac", + "qualification.json": "0f58ffc6e049bc40e8dfc0fe20fb56858bef45374a6df5ac72ca484109713b52", + "specs.json": "8b89c9dc60e5d04a8282a973b86d6bf8820d8254e79408769f64582037fe6ff7", + "target.spice": "b1d2c36f01c0bf2fb10db5ade85c475ef7c7ac6731e06e494250c0b5177cdbb4", + "target_lvs.spice": "be1350deeb9830bdf126983491907b20de670a41055d8edc12022a11d7205c08", + "testbench.spice": "98447822944673f3ad4197f5e72f5028d9682ccf2668cd4859690272d259c047" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW2_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW2_sL2/qualification.json new file mode 100644 index 00000000..bfb82fa8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW2_sL2/qualification.json @@ -0,0 +1,96 @@ +{ + "case_id": "C17_ihp130_sW2_sL2", + "circuit_id": "C17", + "pdk": "ihp130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "diff_r", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "1826b0386648d6e3", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 61490000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 7.786772, + "f3db": 102489800.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 0.4, + "schematic_measures": { + "vo1": 1.024025, + "vo2": 1.024025, + "idd": 2.346664e-05, + "vos_in": 0.0, + "gain_lf": 7.786772, + "f3db": 102489800.0, + "ugf": 230572000.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW2_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW2_sL2/specs.json new file mode 100644 index 00000000..8fee3ad4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW2_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 61490000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 7.786772, + "f3db": 102489800.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW2_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW2_sL2/target.spice new file mode 100644 index 00000000..61c0b638 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW2_sL2/target.spice @@ -0,0 +1,9 @@ +.subckt C17_ihp130_sW2_sL2 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 +XM1 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=8u l=0.52u ng=16 m=1 +XM2 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=8u l=0.52u ng=16 m=1 +XM3 net06 VB1 VSS VSS sg13_lv_nmos w=8u l=0.52u ng=16 m=1 +XRR1 VDD VOUT1 rppd w=1u l=58.055u m=1 +XRR2 VDD VOUT2 rppd w=1u l=58.055u m=1 +XRR3 net07 net06 rppd w=1u l=3.6u m=1 +XRR4 net09 net06 rppd w=1u l=3.6u m=1 +.ends C17_ihp130_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW2_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW2_sL2/target_lvs.spice new file mode 100644 index 00000000..279b6160 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW2_sL2/target_lvs.spice @@ -0,0 +1,54 @@ +.subckt C17_ihp130_sW2_sL2 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 +XM1_f0 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f1 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f2 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f3 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f4 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f5 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f6 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f7 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f8 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f9 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f10 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f11 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f12 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f13 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f14 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f15 VOUT1 VIN1 net07 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f0 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f1 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f2 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f3 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f4 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f5 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f6 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f7 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f8 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f9 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f10 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f11 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f12 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f13 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f14 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f15 VOUT2 VIN2 net09 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f0 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f1 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f2 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f3 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f4 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f5 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f6 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f7 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f8 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f9 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f10 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f11 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f12 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f13 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f14 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f15 net06 VB1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XRR1 VDD VOUT1 rppd w=1u l=58.055u m=1 +XRR2 VDD VOUT2 rppd w=1u l=58.055u m=1 +XRR3 net07 net06 rppd w=1u l=3.6u m=1 +XRR4 net09 net06 rppd w=1u l=3.6u m=1 +.ends C17_ihp130_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW2_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW2_sL2/testbench.spice new file mode 100644 index 00000000..223b0261 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/ihp130/sW2_sL2/testbench.spice @@ -0,0 +1,39 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 C17_ihp130_sW2_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +XB_VB1 VB1 VB1 VSS VSS sg13_lv_nmos w=8u l=0.52u +IB_VB1 VDDB VB1 4e-05 +VCM VCM 0 0.6 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C17/sky130/sW0.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW0.5_sL1.5/case.json new file mode 100644 index 00000000..bc3888d4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW0.5_sL1.5/case.json @@ -0,0 +1,150 @@ +{ + "case_id": "C17_sky130_sW0.5_sL1.5", + "circuit_id": "C17", + "pdk": "sky130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "dut_name": "C17_sky130_sW0.5_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.45, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 0.45, + "nf": 4 + }, + "M3": { + "w": 2.0, + "l": 0.45, + "nf": 4 + }, + "R1": { + "r": 20000.0, + "body": "VSS", + "w": 0.35, + "l": 17.55 + }, + "R2": { + "r": 20000.0, + "body": "VSS", + "w": 0.35, + "l": 17.55 + }, + "R3": { + "r": 2000.0, + "body": "VSS", + "w": 0.35, + "l": 1.25 + }, + "R4": { + "r": 2000.0, + "body": "VSS", + "w": 0.35, + "l": 1.25 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 4e-05 + } + }, + "load": { + "vcm": 0.9, + "CL": 1e-13 + }, + "category": "diff_r", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "7fdece2029af6a38", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "R1", + "R2", + "R3", + "R4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/sky130/sW0.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW0.5_sL1.5/manifest.json new file mode 100644 index 00000000..092acb18 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW0.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "cfaccbc6b455c418ce580e428a900d3009319d6be5c7c70e1305a33f378d67d5", + "qualification.json": "ed503546fb7ae4552a86fe579f8430f6602a5d3bf7ed68a1b439d0ec98309753", + "specs.json": "365c2be8a227efc2c0003d5ec1e6b03f1fa067ec958a02bd18804c064fdc96a2", + "target.spice": "992b5dc6bbb14e28384bb843632266884115ce244bce3600fd830193ecb2a4ac", + "target_lvs.spice": "a0a5a5135820649773d37cd2ff9d8c376c94ef3ca451d9aeef378e4edca9286b", + "testbench.spice": "87d77f9b0ada1f1eda8d61898a842bcffc763f632d70a0b175b6fde1ab1fac64" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/sky130/sW0.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW0.5_sL1.5/qualification.json new file mode 100644 index 00000000..7916027b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW0.5_sL1.5/qualification.json @@ -0,0 +1,98 @@ +{ + "case_id": "C17_sky130_sW0.5_sL1.5", + "circuit_id": "C17", + "pdk": "sky130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "diff_r", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "7fdece2029af6a38", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "gain_lf=5.423 below floor 6" + ], + "spec": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 47130000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 5.422736, + "f3db": 78553550.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 9.5, + "schematic_measures": { + "vo1": 1.590567, + "vo2": 1.590567, + "idd": 2.078147e-05, + "vos_in": -3.63798e-12, + "gain_lf": 5.422736, + "f3db": 78553550.0, + "ugf": 124182900.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/sky130/sW0.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW0.5_sL1.5/specs.json new file mode 100644 index 00000000..4440d18c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW0.5_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 47130000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 5.422736, + "f3db": 78553550.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/sky130/sW0.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW0.5_sL1.5/target.spice new file mode 100644 index 00000000..d63151f4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW0.5_sL1.5/target.spice @@ -0,0 +1,9 @@ +.subckt C17_sky130_sW0.5_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 +XM1 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=2 l=0.45 nf=4 +XM2 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=2 l=0.45 nf=4 +XM3 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=2 l=0.45 nf=4 +XRR1 VDD VOUT1 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +XRR2 VDD VOUT2 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +XRR3 net07 net06 VSS sky130_fd_pr__res_high_po_0p35 l=1.25 mult=1 +XRR4 net09 net06 VSS sky130_fd_pr__res_high_po_0p35 l=1.25 mult=1 +.ends C17_sky130_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C17/sky130/sW0.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW0.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..4d2333c3 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW0.5_sL1.5/target_lvs.spice @@ -0,0 +1,18 @@ +.subckt C17_sky130_sW0.5_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 +XM1_f0 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f1 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f2 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f3 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f0 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f1 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f2 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f3 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f0 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f1 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f2 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f3 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XRR1 VDD VOUT1 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +XRR2 VDD VOUT2 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +XRR3 net07 net06 VSS sky130_fd_pr__res_high_po_0p35 l=1.25 mult=1 +XRR4 net09 net06 VSS sky130_fd_pr__res_high_po_0p35 l=1.25 mult=1 +.ends C17_sky130_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C17/sky130/sW0.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW0.5_sL1.5/testbench.spice new file mode 100644 index 00000000..a2af929d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW0.5_sL1.5/testbench.spice @@ -0,0 +1,39 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 C17_sky130_sW0.5_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +XB_VB1 VB1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=2 l=0.45 +IB_VB1 VDDB VB1 4e-05 +VCM VCM 0 0.9 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C17/sky130/sW0.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW0.5_sL1/case.json new file mode 100644 index 00000000..804752b4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW0.5_sL1/case.json @@ -0,0 +1,150 @@ +{ + "case_id": "C17_sky130_sW0.5_sL1", + "circuit_id": "C17", + "pdk": "sky130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "dut_name": "C17_sky130_sW0.5_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.3, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 0.3, + "nf": 4 + }, + "M3": { + "w": 2.0, + "l": 0.3, + "nf": 4 + }, + "R1": { + "r": 20000.0, + "body": "VSS", + "w": 0.35, + "l": 17.55 + }, + "R2": { + "r": 20000.0, + "body": "VSS", + "w": 0.35, + "l": 17.55 + }, + "R3": { + "r": 2000.0, + "body": "VSS", + "w": 0.35, + "l": 1.25 + }, + "R4": { + "r": 2000.0, + "body": "VSS", + "w": 0.35, + "l": 1.25 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 4e-05 + } + }, + "load": { + "vcm": 0.9, + "CL": 1e-13 + }, + "category": "diff_r", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "bdfe90aea4ba36ab", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "R1", + "R2", + "R3", + "R4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/sky130/sW0.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW0.5_sL1/manifest.json new file mode 100644 index 00000000..2a037831 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW0.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "bdd5ee81b4e0606f5fdd44952d63016eb636231e2949fc1f73cf2a2ed8c6b1ea", + "qualification.json": "14c8bf139a46739997cfdd110375abc6675605847ec8ae07fecf26b2b50f8f7a", + "specs.json": "0bffcebd6727319fd643c1e932f2c7cf33ef97f760c09f7206fc60fddfee58e4", + "target.spice": "6b8d53186c56893cdf60f5085a1b6069ea1f69084c9dcc80dfc08d3b1cb8f203", + "target_lvs.spice": "6f579f9deb2de7179fafb93945233a71fe82d4e28c6875accd1ec6f656529e20", + "testbench.spice": "1faa4601b12651810a828945ace343e8ff8db3b92df467b2e53bf9e90985b7a1" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/sky130/sW0.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW0.5_sL1/qualification.json new file mode 100644 index 00000000..925cd5a4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW0.5_sL1/qualification.json @@ -0,0 +1,96 @@ +{ + "case_id": "C17_sky130_sW0.5_sL1", + "circuit_id": "C17", + "pdk": "sky130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "diff_r", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "bdfe90aea4ba36ab", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 47700000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 6.458793, + "f3db": 79500490.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 9.0, + "schematic_measures": { + "vo1": 1.567544, + "vo2": 1.567544, + "idd": 2.307286e-05, + "vos_in": -3.63798e-12, + "gain_lf": 6.458793, + "f3db": 79500490.0, + "ugf": 147605100.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/sky130/sW0.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW0.5_sL1/specs.json new file mode 100644 index 00000000..6107dead --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW0.5_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 47700000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 6.458793, + "f3db": 79500490.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/sky130/sW0.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW0.5_sL1/target.spice new file mode 100644 index 00000000..78e19fe4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW0.5_sL1/target.spice @@ -0,0 +1,9 @@ +.subckt C17_sky130_sW0.5_sL1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 +XM1 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=2 l=0.3 nf=4 +XM2 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=2 l=0.3 nf=4 +XM3 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=2 l=0.3 nf=4 +XRR1 VDD VOUT1 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +XRR2 VDD VOUT2 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +XRR3 net07 net06 VSS sky130_fd_pr__res_high_po_0p35 l=1.25 mult=1 +XRR4 net09 net06 VSS sky130_fd_pr__res_high_po_0p35 l=1.25 mult=1 +.ends C17_sky130_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C17/sky130/sW0.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW0.5_sL1/target_lvs.spice new file mode 100644 index 00000000..ec09e91c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW0.5_sL1/target_lvs.spice @@ -0,0 +1,18 @@ +.subckt C17_sky130_sW0.5_sL1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 +XM1_f0 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f1 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f2 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f3 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f0 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f1 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f2 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f3 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f0 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f1 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f2 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f3 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XRR1 VDD VOUT1 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +XRR2 VDD VOUT2 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +XRR3 net07 net06 VSS sky130_fd_pr__res_high_po_0p35 l=1.25 mult=1 +XRR4 net09 net06 VSS sky130_fd_pr__res_high_po_0p35 l=1.25 mult=1 +.ends C17_sky130_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C17/sky130/sW0.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW0.5_sL1/testbench.spice new file mode 100644 index 00000000..e69e339c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW0.5_sL1/testbench.spice @@ -0,0 +1,39 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 C17_sky130_sW0.5_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +XB_VB1 VB1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=2 l=0.3 +IB_VB1 VDDB VB1 4e-05 +VCM VCM 0 0.9 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C17/sky130/sW0.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW0.5_sL2/case.json new file mode 100644 index 00000000..458501cf --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW0.5_sL2/case.json @@ -0,0 +1,150 @@ +{ + "case_id": "C17_sky130_sW0.5_sL2", + "circuit_id": "C17", + "pdk": "sky130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "dut_name": "C17_sky130_sW0.5_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.6, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 0.6, + "nf": 4 + }, + "M3": { + "w": 2.0, + "l": 0.6, + "nf": 4 + }, + "R1": { + "r": 20000.0, + "body": "VSS", + "w": 0.35, + "l": 17.55 + }, + "R2": { + "r": 20000.0, + "body": "VSS", + "w": 0.35, + "l": 17.55 + }, + "R3": { + "r": 2000.0, + "body": "VSS", + "w": 0.35, + "l": 1.25 + }, + "R4": { + "r": 2000.0, + "body": "VSS", + "w": 0.35, + "l": 1.25 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 4e-05 + } + }, + "load": { + "vcm": 0.9, + "CL": 1e-13 + }, + "category": "diff_r", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "ee836db74e1b2dc2", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "R1", + "R2", + "R3", + "R4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/sky130/sW0.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW0.5_sL2/manifest.json new file mode 100644 index 00000000..46f4ee32 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW0.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "0ca8c9bdb668c4017a41ec9d329532cebc656e2b4b1dc652e5688ff4178b3c3c", + "qualification.json": "d4ff3ff944c5f02a445a902b459807d12376cb4a68ddf6e0dc572ab5b81f2673", + "specs.json": "07b8fc737e3cc81a367e2f07a8a153bdc29c0b1b0a9386e417dbe236f0da37ea", + "target.spice": "2cafaf28c9983d1db2a7c38edb6aad1386011f59d43cd5e9707fc8dd716ca6a4", + "target_lvs.spice": "3478b3dd29be8d071db8c294685eb4dd2cb4f6529b117925972165b5f446b173", + "testbench.spice": "54584468d8ab16c5ea3987e4510798608f00d0f09cdba9883a15f6192b240b15" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/sky130/sW0.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW0.5_sL2/qualification.json new file mode 100644 index 00000000..e8affbaf --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW0.5_sL2/qualification.json @@ -0,0 +1,98 @@ +{ + "case_id": "C17_sky130_sW0.5_sL2", + "circuit_id": "C17", + "pdk": "sky130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "diff_r", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "ee836db74e1b2dc2", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "gain_lf=4.267 below floor 6" + ], + "spec": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 46770000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 4.267453, + "f3db": 77942910.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 9.5, + "schematic_measures": { + "vo1": 1.616323, + "vo2": 1.616323, + "idd": 1.821962e-05, + "vos_in": 0.0, + "gain_lf": 4.267453, + "f3db": 77942910.0, + "ugf": 101030500.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/sky130/sW0.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW0.5_sL2/specs.json new file mode 100644 index 00000000..a0666ad0 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW0.5_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 46770000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 4.267453, + "f3db": 77942910.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/sky130/sW0.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW0.5_sL2/target.spice new file mode 100644 index 00000000..9e6099b4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW0.5_sL2/target.spice @@ -0,0 +1,9 @@ +.subckt C17_sky130_sW0.5_sL2 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 +XM1 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=2 l=0.6 nf=4 +XM2 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=2 l=0.6 nf=4 +XM3 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=2 l=0.6 nf=4 +XRR1 VDD VOUT1 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +XRR2 VDD VOUT2 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +XRR3 net07 net06 VSS sky130_fd_pr__res_high_po_0p35 l=1.25 mult=1 +XRR4 net09 net06 VSS sky130_fd_pr__res_high_po_0p35 l=1.25 mult=1 +.ends C17_sky130_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C17/sky130/sW0.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW0.5_sL2/target_lvs.spice new file mode 100644 index 00000000..28fc74b5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW0.5_sL2/target_lvs.spice @@ -0,0 +1,18 @@ +.subckt C17_sky130_sW0.5_sL2 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 +XM1_f0 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f1 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f2 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f3 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f0 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f1 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f2 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f3 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f0 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f1 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f2 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f3 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XRR1 VDD VOUT1 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +XRR2 VDD VOUT2 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +XRR3 net07 net06 VSS sky130_fd_pr__res_high_po_0p35 l=1.25 mult=1 +XRR4 net09 net06 VSS sky130_fd_pr__res_high_po_0p35 l=1.25 mult=1 +.ends C17_sky130_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C17/sky130/sW0.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW0.5_sL2/testbench.spice new file mode 100644 index 00000000..db795857 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW0.5_sL2/testbench.spice @@ -0,0 +1,39 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 C17_sky130_sW0.5_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +XB_VB1 VB1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=2 l=0.6 +IB_VB1 VDDB VB1 4e-05 +VCM VCM 0 0.9 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1.5_sL1.5/case.json new file mode 100644 index 00000000..1a9d7810 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1.5_sL1.5/case.json @@ -0,0 +1,150 @@ +{ + "case_id": "C17_sky130_sW1.5_sL1.5", + "circuit_id": "C17", + "pdk": "sky130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "dut_name": "C17_sky130_sW1.5_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1" + ], + "sizing": { + "M1": { + "w": 6.0, + "l": 0.45, + "nf": 12 + }, + "M2": { + "w": 6.0, + "l": 0.45, + "nf": 12 + }, + "M3": { + "w": 6.0, + "l": 0.45, + "nf": 12 + }, + "R1": { + "r": 20000.0, + "body": "VSS", + "w": 0.35, + "l": 17.55 + }, + "R2": { + "r": 20000.0, + "body": "VSS", + "w": 0.35, + "l": 17.55 + }, + "R3": { + "r": 2000.0, + "body": "VSS", + "w": 0.35, + "l": 1.25 + }, + "R4": { + "r": 2000.0, + "body": "VSS", + "w": 0.35, + "l": 1.25 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 4e-05 + } + }, + "load": { + "vcm": 0.9, + "CL": 1e-13 + }, + "category": "diff_r", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.45, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.45, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.45, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "f1d751cc273d80bf", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "R1", + "R2", + "R3", + "R4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1.5_sL1.5/manifest.json new file mode 100644 index 00000000..122a1384 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "db742c99aeb7698ddd5c27040ab6859afec016f3364d9e976414aec4bb31a74f", + "qualification.json": "1f84d9d79508cd4e6f70797bad5f98b614d22bb36c58150cdb00cb950177a1fc", + "specs.json": "53c228b51e5ff79e56eed562c75a44dbb39c28679b52c76f55a67f0446dcffff", + "target.spice": "6982252d2d05da294de725a889f251a2c8650154a64ad44ebe276650a1f52f6a", + "target_lvs.spice": "6a654b295e84ea2486a2d022f4420037bb0580a202878cd751e8c9d8f92423e0", + "testbench.spice": "0700532dded058ccfaca6012d30afe1d69a51a66e02b65dc7a8c8eaffc67a5b2" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1.5_sL1.5/qualification.json new file mode 100644 index 00000000..9b55e88d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1.5_sL1.5/qualification.json @@ -0,0 +1,96 @@ +{ + "case_id": "C17_sky130_sW1.5_sL1.5", + "circuit_id": "C17", + "pdk": "sky130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "diff_r", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.45, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.45, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.45, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "f1d751cc273d80bf", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 46860000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 8.569138, + "f3db": 78103720.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 10.1, + "schematic_measures": { + "vo1": 1.519202, + "vo2": 1.519202, + "idd": 2.788819e-05, + "vos_in": -1.81899e-12, + "gain_lf": 8.569138, + "f3db": 78103720.0, + "ugf": 195090500.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1.5_sL1.5/specs.json new file mode 100644 index 00000000..19321b3e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1.5_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 46860000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 8.569138, + "f3db": 78103720.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1.5_sL1.5/target.spice new file mode 100644 index 00000000..bd12fc6b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1.5_sL1.5/target.spice @@ -0,0 +1,9 @@ +.subckt C17_sky130_sW1.5_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 +XM1 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=6 l=0.45 nf=12 +XM2 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=6 l=0.45 nf=12 +XM3 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=6 l=0.45 nf=12 +XRR1 VDD VOUT1 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +XRR2 VDD VOUT2 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +XRR3 net07 net06 VSS sky130_fd_pr__res_high_po_0p35 l=1.25 mult=1 +XRR4 net09 net06 VSS sky130_fd_pr__res_high_po_0p35 l=1.25 mult=1 +.ends C17_sky130_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..8296d459 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1.5_sL1.5/target_lvs.spice @@ -0,0 +1,42 @@ +.subckt C17_sky130_sW1.5_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 +XM1_f0 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f1 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f2 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f3 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f4 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f5 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f6 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f7 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f8 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f9 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f10 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f11 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f0 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f1 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f2 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f3 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f4 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f5 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f6 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f7 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f8 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f9 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f10 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f11 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f0 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f1 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f2 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f3 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f4 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f5 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f6 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f7 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f8 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f9 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f10 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f11 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XRR1 VDD VOUT1 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +XRR2 VDD VOUT2 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +XRR3 net07 net06 VSS sky130_fd_pr__res_high_po_0p35 l=1.25 mult=1 +XRR4 net09 net06 VSS sky130_fd_pr__res_high_po_0p35 l=1.25 mult=1 +.ends C17_sky130_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1.5_sL1.5/testbench.spice new file mode 100644 index 00000000..f54b890f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1.5_sL1.5/testbench.spice @@ -0,0 +1,39 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 C17_sky130_sW1.5_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +XB_VB1 VB1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=6 l=0.45 +IB_VB1 VDDB VB1 4e-05 +VCM VCM 0 0.9 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1.5_sL1/case.json new file mode 100644 index 00000000..88f10826 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1.5_sL1/case.json @@ -0,0 +1,150 @@ +{ + "case_id": "C17_sky130_sW1.5_sL1", + "circuit_id": "C17", + "pdk": "sky130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "dut_name": "C17_sky130_sW1.5_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1" + ], + "sizing": { + "M1": { + "w": 6.0, + "l": 0.3, + "nf": 12 + }, + "M2": { + "w": 6.0, + "l": 0.3, + "nf": 12 + }, + "M3": { + "w": 6.0, + "l": 0.3, + "nf": 12 + }, + "R1": { + "r": 20000.0, + "body": "VSS", + "w": 0.35, + "l": 17.55 + }, + "R2": { + "r": 20000.0, + "body": "VSS", + "w": 0.35, + "l": 17.55 + }, + "R3": { + "r": 2000.0, + "body": "VSS", + "w": 0.35, + "l": 1.25 + }, + "R4": { + "r": 2000.0, + "body": "VSS", + "w": 0.35, + "l": 1.25 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 4e-05 + } + }, + "load": { + "vcm": 0.9, + "CL": 1e-13 + }, + "category": "diff_r", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.3, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.3, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.3, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "8c18d770f04bd12d", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "R1", + "R2", + "R3", + "R4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1.5_sL1/manifest.json new file mode 100644 index 00000000..0ce12bad --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "742e085abb66f419d6419d5577c95bc59708770e05fdfda27f9df610c44c05ec", + "qualification.json": "8d0486a365f21a5852c0f726e56905d2505192ea668cb52603862c971d23d3b6", + "specs.json": "cabc9fe921f805fc0db6fa82472c808770e913b09e48ad3f132259057eed4031", + "target.spice": "7f3d7248809c2f49e274022e34a21e25bbe5d3abc958f0e9eb160083c44e2f26", + "target_lvs.spice": "74247fd9b8bcc62dc46c7e06e95a94bf99b1904b313c75d2780063e8aafcf16f", + "testbench.spice": "a88637b5441f0d2fbf3b7bffc9f4269c4871548b1350203ff5de3947628e4cb4" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1.5_sL1/qualification.json new file mode 100644 index 00000000..4a038e08 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1.5_sL1/qualification.json @@ -0,0 +1,96 @@ +{ + "case_id": "C17_sky130_sW1.5_sL1", + "circuit_id": "C17", + "pdk": "sky130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "diff_r", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.3, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.3, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.3, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "8c18d770f04bd12d", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 47510000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 8.631978, + "f3db": 79182690.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 10.6, + "schematic_measures": { + "vo1": 1.524254, + "vo2": 1.524254, + "idd": 2.738469e-05, + "vos_in": 0.0, + "gain_lf": 8.631978, + "f3db": 79182690.0, + "ugf": 199267800.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1.5_sL1/specs.json new file mode 100644 index 00000000..7371e46e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1.5_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 47510000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 8.631978, + "f3db": 79182690.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1.5_sL1/target.spice new file mode 100644 index 00000000..d30b274b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1.5_sL1/target.spice @@ -0,0 +1,9 @@ +.subckt C17_sky130_sW1.5_sL1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 +XM1 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=6 l=0.3 nf=12 +XM2 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=6 l=0.3 nf=12 +XM3 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=6 l=0.3 nf=12 +XRR1 VDD VOUT1 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +XRR2 VDD VOUT2 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +XRR3 net07 net06 VSS sky130_fd_pr__res_high_po_0p35 l=1.25 mult=1 +XRR4 net09 net06 VSS sky130_fd_pr__res_high_po_0p35 l=1.25 mult=1 +.ends C17_sky130_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1.5_sL1/target_lvs.spice new file mode 100644 index 00000000..bba906b9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1.5_sL1/target_lvs.spice @@ -0,0 +1,42 @@ +.subckt C17_sky130_sW1.5_sL1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 +XM1_f0 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f1 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f2 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f3 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f4 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f5 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f6 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f7 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f8 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f9 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f10 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f11 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f0 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f1 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f2 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f3 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f4 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f5 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f6 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f7 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f8 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f9 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f10 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f11 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f0 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f1 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f2 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f3 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f4 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f5 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f6 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f7 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f8 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f9 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f10 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f11 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XRR1 VDD VOUT1 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +XRR2 VDD VOUT2 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +XRR3 net07 net06 VSS sky130_fd_pr__res_high_po_0p35 l=1.25 mult=1 +XRR4 net09 net06 VSS sky130_fd_pr__res_high_po_0p35 l=1.25 mult=1 +.ends C17_sky130_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1.5_sL1/testbench.spice new file mode 100644 index 00000000..1c8a51e2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1.5_sL1/testbench.spice @@ -0,0 +1,39 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 C17_sky130_sW1.5_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +XB_VB1 VB1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=6 l=0.3 +IB_VB1 VDDB VB1 4e-05 +VCM VCM 0 0.9 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1.5_sL2/case.json new file mode 100644 index 00000000..382851ee --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1.5_sL2/case.json @@ -0,0 +1,150 @@ +{ + "case_id": "C17_sky130_sW1.5_sL2", + "circuit_id": "C17", + "pdk": "sky130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "dut_name": "C17_sky130_sW1.5_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1" + ], + "sizing": { + "M1": { + "w": 6.0, + "l": 0.6, + "nf": 12 + }, + "M2": { + "w": 6.0, + "l": 0.6, + "nf": 12 + }, + "M3": { + "w": 6.0, + "l": 0.6, + "nf": 12 + }, + "R1": { + "r": 20000.0, + "body": "VSS", + "w": 0.35, + "l": 17.55 + }, + "R2": { + "r": 20000.0, + "body": "VSS", + "w": 0.35, + "l": 17.55 + }, + "R3": { + "r": 2000.0, + "body": "VSS", + "w": 0.35, + "l": 1.25 + }, + "R4": { + "r": 2000.0, + "body": "VSS", + "w": 0.35, + "l": 1.25 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 4e-05 + } + }, + "load": { + "vcm": 0.9, + "CL": 1e-13 + }, + "category": "diff_r", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.6, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.6, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.6, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "5a506eabdbbefada", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "R1", + "R2", + "R3", + "R4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1.5_sL2/manifest.json new file mode 100644 index 00000000..ed46d202 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "f7e19c57c9b4d680fde8b427f73785aaf908b37fa84fa98b6403ecf08a403545", + "qualification.json": "f9e3b91d745696e0e781920a5ffe4b5ccc87df9686ddc7e343382c9d4e6696ce", + "specs.json": "974409255e28d8241b54873cf73a7824b2bf20a15619c835593d0278c819f58a", + "target.spice": "1d52fddd201dd86e756f0eeaca09b7e9c535a112c748742715165695ba8dfe36", + "target_lvs.spice": "c4ddf5a8e5d17631d095139e5f03a7a440da7cff63507bf90b28fc1e76da301c", + "testbench.spice": "f02fe4614f0bb765314fd5b1a733f1bb88e7c05f48398c559541c855260b3f4b" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1.5_sL2/qualification.json new file mode 100644 index 00000000..993efb76 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1.5_sL2/qualification.json @@ -0,0 +1,96 @@ +{ + "case_id": "C17_sky130_sW1.5_sL2", + "circuit_id": "C17", + "pdk": "sky130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "diff_r", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.6, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.6, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.6, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "5a506eabdbbefada", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 46420000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 8.100762, + "f3db": 77370550.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 10.4, + "schematic_measures": { + "vo1": 1.529405, + "vo2": 1.529405, + "idd": 2.687138e-05, + "vos_in": 3.637979e-12, + "gain_lf": 8.100762, + "f3db": 77370550.0, + "ugf": 181459300.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1.5_sL2/specs.json new file mode 100644 index 00000000..b5584474 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1.5_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 46420000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 8.100762, + "f3db": 77370550.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1.5_sL2/target.spice new file mode 100644 index 00000000..eba67085 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1.5_sL2/target.spice @@ -0,0 +1,9 @@ +.subckt C17_sky130_sW1.5_sL2 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 +XM1 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=6 l=0.6 nf=12 +XM2 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=6 l=0.6 nf=12 +XM3 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=6 l=0.6 nf=12 +XRR1 VDD VOUT1 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +XRR2 VDD VOUT2 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +XRR3 net07 net06 VSS sky130_fd_pr__res_high_po_0p35 l=1.25 mult=1 +XRR4 net09 net06 VSS sky130_fd_pr__res_high_po_0p35 l=1.25 mult=1 +.ends C17_sky130_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1.5_sL2/target_lvs.spice new file mode 100644 index 00000000..c18b27d1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1.5_sL2/target_lvs.spice @@ -0,0 +1,42 @@ +.subckt C17_sky130_sW1.5_sL2 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 +XM1_f0 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f1 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f2 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f3 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f4 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f5 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f6 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f7 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f8 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f9 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f10 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f11 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f0 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f1 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f2 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f3 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f4 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f5 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f6 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f7 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f8 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f9 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f10 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f11 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f0 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f1 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f2 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f3 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f4 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f5 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f6 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f7 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f8 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f9 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f10 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f11 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XRR1 VDD VOUT1 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +XRR2 VDD VOUT2 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +XRR3 net07 net06 VSS sky130_fd_pr__res_high_po_0p35 l=1.25 mult=1 +XRR4 net09 net06 VSS sky130_fd_pr__res_high_po_0p35 l=1.25 mult=1 +.ends C17_sky130_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1.5_sL2/testbench.spice new file mode 100644 index 00000000..212408f6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1.5_sL2/testbench.spice @@ -0,0 +1,39 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 C17_sky130_sW1.5_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +XB_VB1 VB1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=6 l=0.6 +IB_VB1 VDDB VB1 4e-05 +VCM VCM 0 0.9 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1_sL1.5/case.json new file mode 100644 index 00000000..bb6f1ae4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1_sL1.5/case.json @@ -0,0 +1,150 @@ +{ + "case_id": "C17_sky130_sW1_sL1.5", + "circuit_id": "C17", + "pdk": "sky130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "dut_name": "C17_sky130_sW1_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.45, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 0.45, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 0.45, + "nf": 8 + }, + "R1": { + "r": 20000.0, + "body": "VSS", + "w": 0.35, + "l": 17.55 + }, + "R2": { + "r": 20000.0, + "body": "VSS", + "w": 0.35, + "l": 17.55 + }, + "R3": { + "r": 2000.0, + "body": "VSS", + "w": 0.35, + "l": 1.25 + }, + "R4": { + "r": 2000.0, + "body": "VSS", + "w": 0.35, + "l": 1.25 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 4e-05 + } + }, + "load": { + "vcm": 0.9, + "CL": 1e-13 + }, + "category": "diff_r", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "93f6bcf65f79ac74", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "R1", + "R2", + "R3", + "R4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1_sL1.5/manifest.json new file mode 100644 index 00000000..56fcb9e7 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "0399814a027f192e3f1c3ed4a38fb48382a9f41994c242389d6176be6d1c8df4", + "qualification.json": "1444565e024a0124c15352862ff25387f2076417021cf80ca80d03c7cfc6d450", + "specs.json": "6b2acf8393206d3e97889da9133eaa29510dc18810b30dec0f6d8fcbe008b5b8", + "target.spice": "002fd52a58106aae57c6fa43508d7544c138140c6ff7596fb64340f79b92fead", + "target_lvs.spice": "fdd51a96b087a305ce56aacbf817c534cab452f096e56db600f62c42475bfdc6", + "testbench.spice": "87f1f4ec91917a70561806ca841540e15885457c7668df9c0011de8fb77765cd" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1_sL1.5/qualification.json new file mode 100644 index 00000000..ea14c2d1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1_sL1.5/qualification.json @@ -0,0 +1,96 @@ +{ + "case_id": "C17_sky130_sW1_sL1.5", + "circuit_id": "C17", + "pdk": "sky130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "diff_r", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "93f6bcf65f79ac74", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 47090000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 7.751929, + "f3db": 78477050.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 8.4, + "schematic_measures": { + "vo1": 1.533358, + "vo2": 1.533358, + "idd": 2.647755e-05, + "vos_in": -1.81899e-12, + "gain_lf": 7.751929, + "f3db": 78477050.0, + "ugf": 175310600.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1_sL1.5/specs.json new file mode 100644 index 00000000..d71e29a9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 47090000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 7.751929, + "f3db": 78477050.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1_sL1.5/target.spice new file mode 100644 index 00000000..0e0860d0 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1_sL1.5/target.spice @@ -0,0 +1,9 @@ +.subckt C17_sky130_sW1_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 +XM1 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=4 l=0.45 nf=8 +XM2 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=4 l=0.45 nf=8 +XM3 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=4 l=0.45 nf=8 +XRR1 VDD VOUT1 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +XRR2 VDD VOUT2 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +XRR3 net07 net06 VSS sky130_fd_pr__res_high_po_0p35 l=1.25 mult=1 +XRR4 net09 net06 VSS sky130_fd_pr__res_high_po_0p35 l=1.25 mult=1 +.ends C17_sky130_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1_sL1.5/target_lvs.spice new file mode 100644 index 00000000..d2e8e5b2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1_sL1.5/target_lvs.spice @@ -0,0 +1,30 @@ +.subckt C17_sky130_sW1_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 +XM1_f0 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f1 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f2 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f3 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f4 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f5 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f6 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f7 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f0 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f1 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f2 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f3 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f4 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f5 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f6 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f7 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f0 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f1 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f2 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f3 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f4 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f5 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f6 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f7 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XRR1 VDD VOUT1 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +XRR2 VDD VOUT2 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +XRR3 net07 net06 VSS sky130_fd_pr__res_high_po_0p35 l=1.25 mult=1 +XRR4 net09 net06 VSS sky130_fd_pr__res_high_po_0p35 l=1.25 mult=1 +.ends C17_sky130_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1_sL1.5/testbench.spice new file mode 100644 index 00000000..6d3bcbdc --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1_sL1.5/testbench.spice @@ -0,0 +1,39 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 C17_sky130_sW1_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +XB_VB1 VB1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=4 l=0.45 +IB_VB1 VDDB VB1 4e-05 +VCM VCM 0 0.9 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1_sL1/case.json new file mode 100644 index 00000000..9d657a95 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1_sL1/case.json @@ -0,0 +1,150 @@ +{ + "case_id": "C17_sky130_sW1_sL1", + "circuit_id": "C17", + "pdk": "sky130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "dut_name": "C17_sky130_sW1_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.3, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 0.3, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 0.3, + "nf": 8 + }, + "R1": { + "r": 20000.0, + "body": "VSS", + "w": 0.35, + "l": 17.55 + }, + "R2": { + "r": 20000.0, + "body": "VSS", + "w": 0.35, + "l": 17.55 + }, + "R3": { + "r": 2000.0, + "body": "VSS", + "w": 0.35, + "l": 1.25 + }, + "R4": { + "r": 2000.0, + "body": "VSS", + "w": 0.35, + "l": 1.25 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 4e-05 + } + }, + "load": { + "vcm": 0.9, + "CL": 1e-13 + }, + "category": "diff_r", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "e3355a0044395ab0", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "R1", + "R2", + "R3", + "R4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1_sL1/manifest.json new file mode 100644 index 00000000..d0ed8f15 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "54cc5a0756b94b9761209357ac8ef48a1075a8f85df69f383c71de5857cdd4f4", + "qualification.json": "a73f7ce914279b830a46f41087e62991bee3710c5e4396a4f1b55b3ad94bc057", + "specs.json": "067812ace5e5b6baf1397bd03d3c5ed4e1b81c6fe1b7c98e06c478680fc4734d", + "target.spice": "9635dfb5075acab15d8429db52d7823b4261d5648ae6e0336571278cfd71676d", + "target_lvs.spice": "6a93dc340c94cba0b82220a442ce01018f0065d9a6e1555cbcfe67a90f5b9446", + "testbench.spice": "933bfb1e15a7a4d81dd05fd0f5ea416e966759b5668fdc7c9146c9a3c73a4297" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1_sL1/qualification.json new file mode 100644 index 00000000..60351d3c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1_sL1/qualification.json @@ -0,0 +1,96 @@ +{ + "case_id": "C17_sky130_sW1_sL1", + "circuit_id": "C17", + "pdk": "sky130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "diff_r", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "e3355a0044395ab0", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 47730000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 8.178825, + "f3db": 79542460.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 9.5, + "schematic_measures": { + "vo1": 1.524965, + "vo2": 1.524965, + "idd": 2.731382e-05, + "vos_in": -3.63798e-12, + "gain_lf": 8.178825, + "f3db": 79542460.0, + "ugf": 188501400.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1_sL1/specs.json new file mode 100644 index 00000000..d2e88a10 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 47730000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 8.178825, + "f3db": 79542460.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1_sL1/target.spice new file mode 100644 index 00000000..875fb658 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1_sL1/target.spice @@ -0,0 +1,9 @@ +.subckt C17_sky130_sW1_sL1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 +XM1 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=4 l=0.3 nf=8 +XM2 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=4 l=0.3 nf=8 +XM3 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=4 l=0.3 nf=8 +XRR1 VDD VOUT1 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +XRR2 VDD VOUT2 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +XRR3 net07 net06 VSS sky130_fd_pr__res_high_po_0p35 l=1.25 mult=1 +XRR4 net09 net06 VSS sky130_fd_pr__res_high_po_0p35 l=1.25 mult=1 +.ends C17_sky130_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1_sL1/target_lvs.spice new file mode 100644 index 00000000..dc61c0ec --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1_sL1/target_lvs.spice @@ -0,0 +1,30 @@ +.subckt C17_sky130_sW1_sL1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 +XM1_f0 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f1 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f2 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f3 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f4 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f5 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f6 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f7 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f0 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f1 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f2 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f3 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f4 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f5 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f6 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f7 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f0 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f1 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f2 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f3 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f4 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f5 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f6 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f7 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XRR1 VDD VOUT1 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +XRR2 VDD VOUT2 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +XRR3 net07 net06 VSS sky130_fd_pr__res_high_po_0p35 l=1.25 mult=1 +XRR4 net09 net06 VSS sky130_fd_pr__res_high_po_0p35 l=1.25 mult=1 +.ends C17_sky130_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1_sL1/testbench.spice new file mode 100644 index 00000000..5ab8b7fb --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1_sL1/testbench.spice @@ -0,0 +1,39 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 C17_sky130_sW1_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +XB_VB1 VB1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=4 l=0.3 +IB_VB1 VDDB VB1 4e-05 +VCM VCM 0 0.9 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1_sL2/case.json new file mode 100644 index 00000000..582c385c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1_sL2/case.json @@ -0,0 +1,150 @@ +{ + "case_id": "C17_sky130_sW1_sL2", + "circuit_id": "C17", + "pdk": "sky130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "dut_name": "C17_sky130_sW1_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.6, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 0.6, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 0.6, + "nf": 8 + }, + "R1": { + "r": 20000.0, + "body": "VSS", + "w": 0.35, + "l": 17.55 + }, + "R2": { + "r": 20000.0, + "body": "VSS", + "w": 0.35, + "l": 17.55 + }, + "R3": { + "r": 2000.0, + "body": "VSS", + "w": 0.35, + "l": 1.25 + }, + "R4": { + "r": 2000.0, + "body": "VSS", + "w": 0.35, + "l": 1.25 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 4e-05 + } + }, + "load": { + "vcm": 0.9, + "CL": 1e-13 + }, + "category": "diff_r", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "ac667ca55d98cec8", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "R1", + "R2", + "R3", + "R4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1_sL2/manifest.json new file mode 100644 index 00000000..5ef1d827 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "5e4e62147c2e567af8f791378c9e895fca9f5338d895c5c05ddd94fb240e2401", + "qualification.json": "0b0b57c5d0cd38b9c81fd374ea1c2fcb2143ee5c88e5eda31719ed824cc75516", + "specs.json": "0f2b7b7ae0e6b3a5e504faf7ac61478f242c66b0e34e6c35fe8ff01f3a3a644a", + "target.spice": "81130185d7f5729fb0021cd3d708c4f6e1b9247102463ae4fdfa3cd4e11c9ed8", + "target_lvs.spice": "c02a0f967f7fb53ba2453707ec727e99730ed6972c756c4514287a38920e3387", + "testbench.spice": "912015f02e31a43b13d0ac7e8de9a12eae7e0ee066a62c2b691bb8da8eedc570" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1_sL2/qualification.json new file mode 100644 index 00000000..8f22591b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1_sL2/qualification.json @@ -0,0 +1,96 @@ +{ + "case_id": "C17_sky130_sW1_sL2", + "circuit_id": "C17", + "pdk": "sky130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "diff_r", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "ac667ca55d98cec8", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 46650000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 7.011717, + "f3db": 77755120.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 7.3, + "schematic_measures": { + "vo1": 1.553628, + "vo2": 1.553628, + "idd": 2.445846e-05, + "vos_in": 0.0, + "gain_lf": 7.011717, + "f3db": 77755120.0, + "ugf": 156497000.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1_sL2/specs.json new file mode 100644 index 00000000..73961b68 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 46650000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 7.011717, + "f3db": 77755120.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1_sL2/target.spice new file mode 100644 index 00000000..ac9114c7 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1_sL2/target.spice @@ -0,0 +1,9 @@ +.subckt C17_sky130_sW1_sL2 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 +XM1 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=4 l=0.6 nf=8 +XM2 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=4 l=0.6 nf=8 +XM3 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=4 l=0.6 nf=8 +XRR1 VDD VOUT1 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +XRR2 VDD VOUT2 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +XRR3 net07 net06 VSS sky130_fd_pr__res_high_po_0p35 l=1.25 mult=1 +XRR4 net09 net06 VSS sky130_fd_pr__res_high_po_0p35 l=1.25 mult=1 +.ends C17_sky130_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1_sL2/target_lvs.spice new file mode 100644 index 00000000..6cea089e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1_sL2/target_lvs.spice @@ -0,0 +1,30 @@ +.subckt C17_sky130_sW1_sL2 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 +XM1_f0 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f1 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f2 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f3 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f4 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f5 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f6 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f7 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f0 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f1 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f2 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f3 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f4 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f5 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f6 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f7 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f0 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f1 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f2 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f3 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f4 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f5 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f6 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f7 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XRR1 VDD VOUT1 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +XRR2 VDD VOUT2 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +XRR3 net07 net06 VSS sky130_fd_pr__res_high_po_0p35 l=1.25 mult=1 +XRR4 net09 net06 VSS sky130_fd_pr__res_high_po_0p35 l=1.25 mult=1 +.ends C17_sky130_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1_sL2/testbench.spice new file mode 100644 index 00000000..29cdcbe0 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW1_sL2/testbench.spice @@ -0,0 +1,39 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 C17_sky130_sW1_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +XB_VB1 VB1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=4 l=0.6 +IB_VB1 VDDB VB1 4e-05 +VCM VCM 0 0.9 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C17/sky130/sW2_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW2_sL1.5/case.json new file mode 100644 index 00000000..08f33b7f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW2_sL1.5/case.json @@ -0,0 +1,150 @@ +{ + "case_id": "C17_sky130_sW2_sL1.5", + "circuit_id": "C17", + "pdk": "sky130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "dut_name": "C17_sky130_sW2_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1" + ], + "sizing": { + "M1": { + "w": 8.0, + "l": 0.45, + "nf": 16 + }, + "M2": { + "w": 8.0, + "l": 0.45, + "nf": 16 + }, + "M3": { + "w": 8.0, + "l": 0.45, + "nf": 16 + }, + "R1": { + "r": 20000.0, + "body": "VSS", + "w": 0.35, + "l": 17.55 + }, + "R2": { + "r": 20000.0, + "body": "VSS", + "w": 0.35, + "l": 17.55 + }, + "R3": { + "r": 2000.0, + "body": "VSS", + "w": 0.35, + "l": 1.25 + }, + "R4": { + "r": 2000.0, + "body": "VSS", + "w": 0.35, + "l": 1.25 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 4e-05 + } + }, + "load": { + "vcm": 0.9, + "CL": 1e-13 + }, + "category": "diff_r", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "ed5bcaca675aa7a6", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "R1", + "R2", + "R3", + "R4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/sky130/sW2_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW2_sL1.5/manifest.json new file mode 100644 index 00000000..9b3cb6f8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW2_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "3d917a0f135d3e194df5fd2a979cb4215702bada95aac3b7e1ffdfb409604310", + "qualification.json": "caab6e049d9e0a7d2d15a7358840b5b739d4e1b87b23b7d26f65988d19b4093d", + "specs.json": "828068411b8c6c671c7bb8f0d36e1a7f19c81496a77d0d52a43dc83f1c4919b4", + "target.spice": "9f2b3fb108f4aeb28a38fda16eb80e1de3ffebd6218234a79edd6b97c7b14cf8", + "target_lvs.spice": "2c980a16177e542d23f8e870ebd68e6de3ec92e2ab54148ba85655e3b7bc93a2", + "testbench.spice": "b33d26472eaa371c3cfcfbe7ca55b81f99484be0c5c6dd3ee83e1717b8989634" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/sky130/sW2_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW2_sL1.5/qualification.json new file mode 100644 index 00000000..e1082eb2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW2_sL1.5/qualification.json @@ -0,0 +1,96 @@ +{ + "case_id": "C17_sky130_sW2_sL1.5", + "circuit_id": "C17", + "pdk": "sky130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "diff_r", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "ed5bcaca675aa7a6", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 46560000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 8.838831, + "f3db": 77607350.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 7.9, + "schematic_measures": { + "vo1": 1.525305, + "vo2": 1.525305, + "idd": 2.727998e-05, + "vos_in": 0.0, + "gain_lf": 8.838831, + "f3db": 77607350.0, + "ugf": 200921400.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/sky130/sW2_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW2_sL1.5/specs.json new file mode 100644 index 00000000..8654ae81 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW2_sL1.5/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 46560000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 8.838831, + "f3db": 77607350.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/sky130/sW2_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW2_sL1.5/target.spice new file mode 100644 index 00000000..4ea5a365 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW2_sL1.5/target.spice @@ -0,0 +1,9 @@ +.subckt C17_sky130_sW2_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 +XM1 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=8 l=0.45 nf=16 +XM2 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=8 l=0.45 nf=16 +XM3 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=8 l=0.45 nf=16 +XRR1 VDD VOUT1 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +XRR2 VDD VOUT2 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +XRR3 net07 net06 VSS sky130_fd_pr__res_high_po_0p35 l=1.25 mult=1 +XRR4 net09 net06 VSS sky130_fd_pr__res_high_po_0p35 l=1.25 mult=1 +.ends C17_sky130_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C17/sky130/sW2_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW2_sL1.5/target_lvs.spice new file mode 100644 index 00000000..164a908c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW2_sL1.5/target_lvs.spice @@ -0,0 +1,54 @@ +.subckt C17_sky130_sW2_sL1.5 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 +XM1_f0 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f1 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f2 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f3 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f4 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f5 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f6 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f7 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f8 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f9 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f10 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f11 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f12 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f13 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f14 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f15 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f0 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f1 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f2 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f3 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f4 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f5 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f6 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f7 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f8 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f9 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f10 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f11 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f12 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f13 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f14 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f15 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f0 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f1 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f2 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f3 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f4 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f5 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f6 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f7 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f8 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f9 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f10 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f11 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f12 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f13 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f14 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f15 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XRR1 VDD VOUT1 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +XRR2 VDD VOUT2 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +XRR3 net07 net06 VSS sky130_fd_pr__res_high_po_0p35 l=1.25 mult=1 +XRR4 net09 net06 VSS sky130_fd_pr__res_high_po_0p35 l=1.25 mult=1 +.ends C17_sky130_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C17/sky130/sW2_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW2_sL1.5/testbench.spice new file mode 100644 index 00000000..c6ae9d76 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW2_sL1.5/testbench.spice @@ -0,0 +1,39 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 C17_sky130_sW2_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +XB_VB1 VB1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=8 l=0.45 +IB_VB1 VDDB VB1 4e-05 +VCM VCM 0 0.9 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C17/sky130/sW2_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW2_sL1/case.json new file mode 100644 index 00000000..482341aa --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW2_sL1/case.json @@ -0,0 +1,150 @@ +{ + "case_id": "C17_sky130_sW2_sL1", + "circuit_id": "C17", + "pdk": "sky130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "dut_name": "C17_sky130_sW2_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1" + ], + "sizing": { + "M1": { + "w": 8.0, + "l": 0.3, + "nf": 16 + }, + "M2": { + "w": 8.0, + "l": 0.3, + "nf": 16 + }, + "M3": { + "w": 8.0, + "l": 0.3, + "nf": 16 + }, + "R1": { + "r": 20000.0, + "body": "VSS", + "w": 0.35, + "l": 17.55 + }, + "R2": { + "r": 20000.0, + "body": "VSS", + "w": 0.35, + "l": 17.55 + }, + "R3": { + "r": 2000.0, + "body": "VSS", + "w": 0.35, + "l": 1.25 + }, + "R4": { + "r": 2000.0, + "body": "VSS", + "w": 0.35, + "l": 1.25 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 4e-05 + } + }, + "load": { + "vcm": 0.9, + "CL": 1e-13 + }, + "category": "diff_r", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "96d020ab38cf0aef", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "R1", + "R2", + "R3", + "R4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/sky130/sW2_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW2_sL1/manifest.json new file mode 100644 index 00000000..53842805 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW2_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "1776f5a11dcc28208480c253a4baff68110af94f2a9b0aa31605bcf99de69369", + "qualification.json": "e0fc451c7824fe0a19318638354b92aa955c38be2ed29ea472ea7082ed3971b4", + "specs.json": "7b0436631fb557f1150bd21d571210dd61536af72219d1f1455f0d0e33e0eb9a", + "target.spice": "569f31b757c206eca279cf5ce7fc57de6050e18ce45bbe66ea856196115043ce", + "target_lvs.spice": "3757668d82f82858f8f72a5582f33b2d9f8f8f997c34328bbed56f8bce42e084", + "testbench.spice": "c69747c3cf661264c7a526dd6eac9d26aeec42f9593a74704cfe7e1dee1972bc" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/sky130/sW2_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW2_sL1/qualification.json new file mode 100644 index 00000000..97518396 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW2_sL1/qualification.json @@ -0,0 +1,96 @@ +{ + "case_id": "C17_sky130_sW2_sL1", + "circuit_id": "C17", + "pdk": "sky130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "diff_r", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "96d020ab38cf0aef", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 47220000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 8.723596, + "f3db": 78697350.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 7.3, + "schematic_measures": { + "vo1": 1.534642, + "vo2": 1.534642, + "idd": 2.634963e-05, + "vos_in": 3.637979e-12, + "gain_lf": 8.723596, + "f3db": 78697350.0, + "ugf": 200561900.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/sky130/sW2_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW2_sL1/specs.json new file mode 100644 index 00000000..dd15dfae --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW2_sL1/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 47220000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 8.723596, + "f3db": 78697350.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/sky130/sW2_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW2_sL1/target.spice new file mode 100644 index 00000000..8f18cf67 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW2_sL1/target.spice @@ -0,0 +1,9 @@ +.subckt C17_sky130_sW2_sL1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 +XM1 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=8 l=0.3 nf=16 +XM2 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=8 l=0.3 nf=16 +XM3 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=8 l=0.3 nf=16 +XRR1 VDD VOUT1 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +XRR2 VDD VOUT2 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +XRR3 net07 net06 VSS sky130_fd_pr__res_high_po_0p35 l=1.25 mult=1 +XRR4 net09 net06 VSS sky130_fd_pr__res_high_po_0p35 l=1.25 mult=1 +.ends C17_sky130_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C17/sky130/sW2_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW2_sL1/target_lvs.spice new file mode 100644 index 00000000..1a441a33 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW2_sL1/target_lvs.spice @@ -0,0 +1,54 @@ +.subckt C17_sky130_sW2_sL1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 +XM1_f0 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f1 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f2 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f3 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f4 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f5 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f6 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f7 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f8 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f9 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f10 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f11 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f12 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f13 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f14 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f15 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f0 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f1 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f2 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f3 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f4 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f5 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f6 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f7 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f8 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f9 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f10 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f11 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f12 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f13 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f14 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f15 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f0 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f1 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f2 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f3 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f4 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f5 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f6 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f7 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f8 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f9 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f10 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f11 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f12 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f13 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f14 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f15 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XRR1 VDD VOUT1 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +XRR2 VDD VOUT2 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +XRR3 net07 net06 VSS sky130_fd_pr__res_high_po_0p35 l=1.25 mult=1 +XRR4 net09 net06 VSS sky130_fd_pr__res_high_po_0p35 l=1.25 mult=1 +.ends C17_sky130_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C17/sky130/sW2_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW2_sL1/testbench.spice new file mode 100644 index 00000000..dcc6a37a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW2_sL1/testbench.spice @@ -0,0 +1,39 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 C17_sky130_sW2_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +XB_VB1 VB1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=8 l=0.3 +IB_VB1 VDDB VB1 4e-05 +VCM VCM 0 0.9 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C17/sky130/sW2_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW2_sL2/case.json new file mode 100644 index 00000000..39a232cd --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW2_sL2/case.json @@ -0,0 +1,150 @@ +{ + "case_id": "C17_sky130_sW2_sL2", + "circuit_id": "C17", + "pdk": "sky130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "dut_name": "C17_sky130_sW2_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VIN2", + "VOUT1", + "VOUT2", + "VB1" + ], + "sizing": { + "M1": { + "w": 8.0, + "l": 0.6, + "nf": 16 + }, + "M2": { + "w": 8.0, + "l": 0.6, + "nf": 16 + }, + "M3": { + "w": 8.0, + "l": 0.6, + "nf": 16 + }, + "R1": { + "r": 20000.0, + "body": "VSS", + "w": 0.35, + "l": 17.55 + }, + "R2": { + "r": 20000.0, + "body": "VSS", + "w": 0.35, + "l": 17.55 + }, + "R3": { + "r": 2000.0, + "body": "VSS", + "w": 0.35, + "l": 1.25 + }, + "R4": { + "r": 2000.0, + "body": "VSS", + "w": 0.35, + "l": 1.25 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 4e-05 + } + }, + "load": { + "vcm": 0.9, + "CL": 1e-13 + }, + "category": "diff_r", + "notes": [ + "first-pass sizing v1" + ], + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "44f3db779a0eedeb", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M3", + "current_A": 4e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "ideal input common-mode source" + }, + { + "kind": "testbench_element", + "what": "load capacitors" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "R1", + "R2", + "R3", + "R4" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/sky130/sW2_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW2_sL2/manifest.json new file mode 100644 index 00000000..8116c25b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW2_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "3725cf4dd6b2557193d399f3ee5252272f8a78013206fe140842dfc200310cae", + "qualification.json": "daf914622fe4818b19ead5f3af169ce6172cef07fe7d035728a877279099ecb3", + "specs.json": "bbaa18a6f5713a768b33c8a4c3f482e9f7406ec7f77a9307540ad65db86774ce", + "target.spice": "7f5022021e5a0224a853e83e73cc3a18741d7ff7a771962f9b846876a40d50bb", + "target_lvs.spice": "0ae02c754ecc2f68aeaed6c3f5cf09270fdc909f8416ca4eb1a76c0a77c8e516", + "testbench.spice": "af4f55ac53ac9cdca9c5d8127e66d154af0c8929c4acc41d56660d8fa9a155df" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/sky130/sW2_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW2_sL2/qualification.json new file mode 100644 index 00000000..a6e7c92c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW2_sL2/qualification.json @@ -0,0 +1,96 @@ +{ + "case_id": "C17_sky130_sW2_sL2", + "circuit_id": "C17", + "pdk": "sky130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "diff_r", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "44f3db779a0eedeb", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 46130000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 8.509626, + "f3db": 76882420.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 6.4, + "schematic_measures": { + "vo1": 1.530562, + "vo2": 1.530562, + "idd": 2.675617e-05, + "vos_in": 0.0, + "gain_lf": 8.509626, + "f3db": 76882420.0, + "ugf": 190754500.0 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/sky130/sW2_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW2_sL2/specs.json new file mode 100644 index 00000000..cb555fcb --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW2_sL2/specs.json @@ -0,0 +1,23 @@ +{ + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 46130000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 8.509626, + "f3db": 76882420.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C17/sky130/sW2_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW2_sL2/target.spice new file mode 100644 index 00000000..c668c913 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW2_sL2/target.spice @@ -0,0 +1,9 @@ +.subckt C17_sky130_sW2_sL2 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 +XM1 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=8 l=0.6 nf=16 +XM2 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=8 l=0.6 nf=16 +XM3 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=8 l=0.6 nf=16 +XRR1 VDD VOUT1 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +XRR2 VDD VOUT2 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +XRR3 net07 net06 VSS sky130_fd_pr__res_high_po_0p35 l=1.25 mult=1 +XRR4 net09 net06 VSS sky130_fd_pr__res_high_po_0p35 l=1.25 mult=1 +.ends C17_sky130_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C17/sky130/sW2_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW2_sL2/target_lvs.spice new file mode 100644 index 00000000..635f3655 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW2_sL2/target_lvs.spice @@ -0,0 +1,54 @@ +.subckt C17_sky130_sW2_sL2 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 +XM1_f0 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f1 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f2 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f3 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f4 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f5 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f6 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f7 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f8 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f9 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f10 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f11 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f12 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f13 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f14 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f15 VOUT1 VIN1 net07 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f0 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f1 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f2 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f3 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f4 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f5 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f6 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f7 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f8 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f9 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f10 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f11 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f12 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f13 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f14 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f15 VOUT2 VIN2 net09 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f0 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f1 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f2 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f3 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f4 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f5 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f6 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f7 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f8 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f9 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f10 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f11 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f12 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f13 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f14 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f15 net06 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XRR1 VDD VOUT1 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +XRR2 VDD VOUT2 VSS sky130_fd_pr__res_high_po_0p35 l=17.55 mult=1 +XRR3 net07 net06 VSS sky130_fd_pr__res_high_po_0p35 l=1.25 mult=1 +XRR4 net09 net06 VSS sky130_fd_pr__res_high_po_0p35 l=1.25 mult=1 +.ends C17_sky130_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C17/sky130/sW2_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW2_sL2/testbench.spice new file mode 100644 index 00000000..fadc5b01 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C17/sky130/sW2_sL2/testbench.spice @@ -0,0 +1,39 @@ +X1 VDD VSS VIN1 VIN2 VOUT1 VOUT2 VB1 C17_sky130_sW2_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +XB_VB1 VB1 VB1 VSS VSS sky130_fd_pr__nfet_01v8 w=8 l=0.6 +IB_VB1 VDDB VB1 4e-05 +VCM VCM 0 0.9 +* differential DC servo (disclosed test auxiliary, same form as the single-ended OTA servo): an input offset +* VOSI = -0.5 tanh(2e4 (VOUT2 - VOUT1)), low-passed at 0.16 uHz, is added to the differential input, so the open-loop +* gain is measured at the balanced operating point (without it, a sub-mV systematic offset from +* extracted wiring resistance moves the outputs by hundreds of mV at 60-70 dB gain). vos_in reports that offset. +* Sign: V(VOUT2) - V(VOUT1) = +A (V(VIN1) - V(VIN2)) for this topology, so the servo term is negative feedback. +BDSV VDSV 0 V = -0.5*tanh(2e4*(v(VOUT2)-v(VOUT1))) +RDSV VDSV VOSI 1e3 +CDSV VOSI 0 1e3 +BXD VX 0 V = v(VD) + v(VOSI) +EIN1 VIN1 VCM VX 0 0.5 +EIN2 VIN2 VCM VX 0 -0.5 +VD VD 0 dc 0 ac 1 +CL1 VOUT1 0 1e-13 +CL2 VOUT2 0 1e-13 +.control +op +let vo1 = v(VOUT1) +let vo2 = v(VOUT2) +let idd = -i(VDD) +let vos_in = v(VOSI) +print vo1 vo2 idd vos_in +ac dec 20 10 100G +let vdiff = v(VOUT2)-v(VOUT1) +let gdb = db(vdiff) +meas ac gain_lf find gdb at=100 +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +meas ac ugf when gdb=0 cross=1 +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C18/gf180/sW0.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW0.5_sL1.5/case.json new file mode 100644 index 00000000..bf59e85b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW0.5_sL1.5/case.json @@ -0,0 +1,185 @@ +{ + "case_id": "C18_gf180_sW0.5_sL1.5", + "circuit_id": "C18", + "pdk": "gf180", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "dut_name": "C18_gf180_sW0.5_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 1.0, + "l": 0.84, + "nf": 2 + }, + "M2": { + "w": 2.0, + "l": 0.84, + "nf": 4 + }, + "M3": { + "w": 4.0, + "l": 0.84, + "nf": 8 + }, + "M4": { + "w": 8.0, + "l": 0.84, + "nf": 16 + }, + "M5": { + "w": 8.0, + "l": 0.84, + "nf": 16 + }, + "M6": { + "w": 16.0, + "l": 0.84, + "nf": 32 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 2e-05 + } + }, + "load": { + "RL": 20000.0, + "CL": 5e-12, + "vamp": 0.02, + "vout_target": 1.65, + "vin_center": 0.9899999999999999, + "servo_slope": 200.0, + "options": ".option method=gear reltol=1e-3", + "vout_amp": 0.1 + }, + "category": "buffer_ab", + "notes": [ + "first-pass sizing v1", + "RL/CL returned to an ideal mid-supply source; open-loop output-swing metric added" + ], + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.84, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 8.0, + "l0": 0.56, + "nf0": 16, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 16.0, + "l0": 0.56, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 16.0, + "l0": 0.56, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 32.0, + "l0": 0.56, + "nf0": 64, + "uw0": 0.5, + "w": 16.0, + "l": 0.84, + "nf": 32, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "eb34481d183ffc94", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M2", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo (freezable)" + }, + { + "kind": "testbench_element", + "what": "mid-supply load return" + }, + { + "kind": "testbench_element", + "what": "load resistor and capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/gf180/sW0.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW0.5_sL1.5/manifest.json new file mode 100644 index 00000000..f40e8811 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW0.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "d5602bf5654725f2a65c08ab7b9a9fbdfdd30eaccf09fcde346a920b8bf66a9d", + "qualification.json": "81110ef763e54ccdcb81f9b477528afefa90c5e253d0946f46794c546cd1d94d", + "specs.json": "1e0da95a13be2a2dca43e416ce51d2594a72cac4ba5e2114e69b1828eb094506", + "target.spice": "0de5bbd32dfe02c24beb7004a7ba33545308a18edfb394ca25188cbdd11be526", + "target_lvs.spice": "59434ade9cd7f9c21d0de1fc1de3c0c558df9480b0ad98598da249f9c4d22739", + "testbench.spice": "c08f5607b71b901f4ecc3a86864a5e32b8cf4fc1471561262446fbcf8042bb0c" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/gf180/sW0.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW0.5_sL1.5/qualification.json new file mode 100644 index 00000000..ff1bf48d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW0.5_sL1.5/qualification.json @@ -0,0 +1,153 @@ +{ + "case_id": "C18_gf180_sW0.5_sL1.5", + "circuit_id": "C18", + "pdk": "gf180", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "buffer_ab", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.84, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 8.0, + "l0": 0.56, + "nf0": 16, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 16.0, + "l0": 0.56, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 16.0, + "l0": 0.56, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 32.0, + "l0": 0.56, + "nf0": 64, + "uw0": 0.5, + "w": 16.0, + "l": 0.84, + "nf": 32, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "eb34481d183ffc94", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "thd_pct=21.36 above floor 3", + "out_swing=0 below floor 0.825" + ], + "spec": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 10680000.0 + }, + "out_swing": { + "min": 0.825 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 21.3568, + "iq": 4.128334e-05, + "f3db": 17806850.0, + "out_swing": 0.0 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.825 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 1.0, + "schematic_measures": { + "vout0": 1.706328, + "vin0": 1.49, + "iq": 4.128334e-05, + "gain_lf": -22.93675, + "f3db": 17806850.0, + "gmid": 0.07130919, + "vo_a": 1.690331, + "vo_b": 1.690331, + "out_swing": 0.0, + "vamp2": 0.3, + "thd_pct": 21.3568 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/gf180/sW0.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW0.5_sL1.5/specs.json new file mode 100644 index 00000000..27c02df2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW0.5_sL1.5/specs.json @@ -0,0 +1,37 @@ +{ + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 10680000.0 + }, + "out_swing": { + "min": 0.825 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 21.3568, + "iq": 4.128334e-05, + "f3db": 17806850.0, + "out_swing": 0.0 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.825 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/gf180/sW0.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW0.5_sL1.5/target.spice new file mode 100644 index 00000000..506be7ba --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW0.5_sL1.5/target.spice @@ -0,0 +1,8 @@ +.subckt C18_gf180_sW0.5_sL1.5 VDD VSS VIN1 VOUT1 VB1 +MM1 net13 VIN1 VSS VSS nfet_03v3 w=1u l=0.84u nf=2 m=1 +MM2 net9 VB1 VDD VDD pfet_03v3 w=2u l=0.84u nf=4 m=1 +MM3 net9 net9 net22 VSS nfet_03v3 w=4u l=0.84u nf=8 m=1 +MM4 net13 net13 net22 VDD pfet_03v3 w=8u l=0.84u nf=16 m=1 +MM5 VDD net9 VOUT1 VSS nfet_03v3 w=8u l=0.84u nf=16 m=1 +MM6 VSS net13 VOUT1 VDD pfet_03v3 w=16u l=0.84u nf=32 m=1 +.ends C18_gf180_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C18/gf180/sW0.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW0.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..dd8c4b28 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW0.5_sL1.5/target_lvs.spice @@ -0,0 +1,80 @@ +.subckt C18_gf180_sW0.5_sL1.5 VDD VSS VIN1 VOUT1 VB1 +MM1_f0 net13 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM1_f1 net13 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM2_f0 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f1 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f2 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f3 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM3_f0 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f1 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f2 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f3 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f4 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f5 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f6 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f7 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.84u +MM4_f0 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f1 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f2 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f3 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f4 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f5 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f6 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f7 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f8 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f9 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f10 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f11 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f12 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f13 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f14 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f15 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM5_f0 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f1 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f2 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f3 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f4 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f5 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f6 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f7 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f8 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f9 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f10 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f11 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f12 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f13 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f14 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f15 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM6_f0 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f1 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f2 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f3 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f4 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f5 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f6 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f7 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f8 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f9 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f10 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f11 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f12 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f13 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f14 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f15 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f16 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f17 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f18 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f19 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f20 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f21 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f22 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f23 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f24 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f25 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f26 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f27 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f28 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f29 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f30 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f31 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +.ends C18_gf180_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C18/gf180/sW0.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW0.5_sL1.5/testbench.spice new file mode 100644 index 00000000..76da906f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW0.5_sL1.5/testbench.spice @@ -0,0 +1,58 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C18_gf180_sW0.5_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +MB_VB1 VB1 VB1 VDDB VDDB pfet_03v3 w=2u l=0.84u +IB_VB1 VB1 VSS 2e-05 +* DC servo (disclosed test auxiliary): VINT -> input DC level that makes V_out = VT; frozen at VHOLD when KSW = 1 +VT VT 0 1.65 +VMID VMID 0 1.65 +VKSW KSW 0 0 +VHOLD VHOLD 0 0 +BSRV VSRV 0 V = (1-v(KSW))*(0.99 + 0.5*tanh(200*(v(VOUT1)-v(VT)))) + v(KSW)*v(VHOLD) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EIN VIN1 VINT VAC 0 1 +VAC VAC 0 dc 0 ac 1 sin(0 1m 1meg) +RL VOUT1 VMID 20000 +CL VOUT1 VMID 5e-12 +.option method=gear reltol=1e-3 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let iq = -i(VDD) +print vout0 vin0 iq +set vin0_s = "$&vin0" +ac dec 20 10 10G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +set gain_s = "$&gain_lf" +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +* open-loop DC transfer around the operating point (servo frozen at the input level it found) +alter @VHOLD[dc] = $vin0_s +alter @VKSW[dc] = 1 +dc VAC -0.4 0.4 0.001 +let gin = abs(deriv(v(VOUT1))) +meas dc gmid find gin at=0 +let gn = gin/gmid +meas dc vo_a find v(VOUT1) when gn=0.5 cross=1 +meas dc vo_b find v(VOUT1) when gn=0.5 cross=last +let out_swing = abs(vo_b - vo_a) +print out_swing +* distortion at a fixed OUTPUT amplitude of 0.1 V (servo frozen, input amplitude = amplitude / |gain|) +alter @VKSW[dc] = 0 +let a_lin = 10^($gain_s/20) +let vamp2 = 0.1/a_lin +if vamp2 > 0.3 + let vamp2 = 0.3 +end +print vamp2 +alter @VAC[sin] = [ 0 $&vamp2 1meg ] +tran 2n 6u 3u +fourier 1meg v(VOUT1) +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C18/gf180/sW0.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW0.5_sL1/case.json new file mode 100644 index 00000000..8b85b14a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW0.5_sL1/case.json @@ -0,0 +1,185 @@ +{ + "case_id": "C18_gf180_sW0.5_sL1", + "circuit_id": "C18", + "pdk": "gf180", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "dut_name": "C18_gf180_sW0.5_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 1.0, + "l": 0.56, + "nf": 2 + }, + "M2": { + "w": 2.0, + "l": 0.56, + "nf": 4 + }, + "M3": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "M4": { + "w": 8.0, + "l": 0.56, + "nf": 16 + }, + "M5": { + "w": 8.0, + "l": 0.56, + "nf": 16 + }, + "M6": { + "w": 16.0, + "l": 0.56, + "nf": 32 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 2e-05 + } + }, + "load": { + "RL": 20000.0, + "CL": 5e-12, + "vamp": 0.02, + "vout_target": 1.65, + "vin_center": 0.9899999999999999, + "servo_slope": 200.0, + "options": ".option method=gear reltol=1e-3", + "vout_amp": 0.1 + }, + "category": "buffer_ab", + "notes": [ + "first-pass sizing v1", + "RL/CL returned to an ideal mid-supply source; open-loop output-swing metric added" + ], + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.56, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.56, + "nf0": 16, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 16.0, + "l0": 0.56, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.56, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 32.0, + "l0": 0.56, + "nf0": 64, + "uw0": 0.5, + "w": 16.0, + "l": 0.56, + "nf": 32, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "faa3188fe532f1da", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M2", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo (freezable)" + }, + { + "kind": "testbench_element", + "what": "mid-supply load return" + }, + { + "kind": "testbench_element", + "what": "load resistor and capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/gf180/sW0.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW0.5_sL1/manifest.json new file mode 100644 index 00000000..7ce59015 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW0.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "213b205ce6699abc220a7efc8c66e3a2702501ab9d1b75b74235479fc6963228", + "qualification.json": "2d70cc774b4732e87ce89f405b54ea12b6cf10a7d6a24cbe52f1fb7bb85ff9e5", + "specs.json": "9f9f84f232b55450f11cabae2ef08f73a415c2ac56f42dca6f9f55d46a2ba32c", + "target.spice": "54a77576d58f06db6a5c2ad6cdee7bf568d1b4a6eb26ae6bc99561d3be19e65e", + "target_lvs.spice": "14a4a879d5e7bad54ed7c54e9d819e66cddbb44ffb540b87f11cd62874f30709", + "testbench.spice": "165882a5e6e14e944913d2e4e508b415b7fcae8e35b9b04283bc5f75356ff3cf" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/gf180/sW0.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW0.5_sL1/qualification.json new file mode 100644 index 00000000..906905d7 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW0.5_sL1/qualification.json @@ -0,0 +1,153 @@ +{ + "case_id": "C18_gf180_sW0.5_sL1", + "circuit_id": "C18", + "pdk": "gf180", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "buffer_ab", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.56, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.56, + "nf0": 16, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 16.0, + "l0": 0.56, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.56, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 32.0, + "l0": 0.56, + "nf0": 64, + "uw0": 0.5, + "w": 16.0, + "l": 0.56, + "nf": 32, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "faa3188fe532f1da", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "thd_pct=26.94 above floor 3", + "out_swing=0 below floor 0.825" + ], + "spec": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 14570000.0 + }, + "out_swing": { + "min": 0.825 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 26.9362, + "iq": 5.295894e-05, + "f3db": 24278360.0, + "out_swing": 0.0 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.825 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 1.1, + "schematic_measures": { + "vout0": 1.656175, + "vin0": 1.412015, + "iq": 5.295894e-05, + "gain_lf": -19.35979, + "f3db": 24278360.0, + "gmid": 0.107644, + "vo_a": 1.635907, + "vo_b": 1.635907, + "out_swing": 0.0, + "vamp2": 0.3, + "thd_pct": 26.9362 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/gf180/sW0.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW0.5_sL1/specs.json new file mode 100644 index 00000000..a05065d1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW0.5_sL1/specs.json @@ -0,0 +1,37 @@ +{ + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 14570000.0 + }, + "out_swing": { + "min": 0.825 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 26.9362, + "iq": 5.295894e-05, + "f3db": 24278360.0, + "out_swing": 0.0 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.825 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/gf180/sW0.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW0.5_sL1/target.spice new file mode 100644 index 00000000..10a5bb43 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW0.5_sL1/target.spice @@ -0,0 +1,8 @@ +.subckt C18_gf180_sW0.5_sL1 VDD VSS VIN1 VOUT1 VB1 +MM1 net13 VIN1 VSS VSS nfet_03v3 w=1u l=0.56u nf=2 m=1 +MM2 net9 VB1 VDD VDD pfet_03v3 w=2u l=0.56u nf=4 m=1 +MM3 net9 net9 net22 VSS nfet_03v3 w=4u l=0.56u nf=8 m=1 +MM4 net13 net13 net22 VDD pfet_03v3 w=8u l=0.56u nf=16 m=1 +MM5 VDD net9 VOUT1 VSS nfet_03v3 w=8u l=0.56u nf=16 m=1 +MM6 VSS net13 VOUT1 VDD pfet_03v3 w=16u l=0.56u nf=32 m=1 +.ends C18_gf180_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C18/gf180/sW0.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW0.5_sL1/target_lvs.spice new file mode 100644 index 00000000..4ae365af --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW0.5_sL1/target_lvs.spice @@ -0,0 +1,80 @@ +.subckt C18_gf180_sW0.5_sL1 VDD VSS VIN1 VOUT1 VB1 +MM1_f0 net13 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM1_f1 net13 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM2_f0 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f1 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f2 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f3 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM3_f0 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f1 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f2 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f3 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f4 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f5 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f6 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f7 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.56u +MM4_f0 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f1 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f2 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f3 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f4 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f5 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f6 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f7 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f8 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f9 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f10 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f11 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f12 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f13 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f14 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f15 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM5_f0 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f1 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f2 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f3 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f4 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f5 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f6 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f7 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f8 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f9 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f10 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f11 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f12 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f13 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f14 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f15 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM6_f0 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f1 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f2 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f3 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f4 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f5 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f6 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f7 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f8 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f9 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f10 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f11 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f12 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f13 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f14 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f15 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f16 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f17 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f18 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f19 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f20 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f21 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f22 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f23 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f24 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f25 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f26 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f27 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f28 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f29 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f30 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f31 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +.ends C18_gf180_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C18/gf180/sW0.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW0.5_sL1/testbench.spice new file mode 100644 index 00000000..ff18d370 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW0.5_sL1/testbench.spice @@ -0,0 +1,58 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C18_gf180_sW0.5_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +MB_VB1 VB1 VB1 VDDB VDDB pfet_03v3 w=2u l=0.56u +IB_VB1 VB1 VSS 2e-05 +* DC servo (disclosed test auxiliary): VINT -> input DC level that makes V_out = VT; frozen at VHOLD when KSW = 1 +VT VT 0 1.65 +VMID VMID 0 1.65 +VKSW KSW 0 0 +VHOLD VHOLD 0 0 +BSRV VSRV 0 V = (1-v(KSW))*(0.99 + 0.5*tanh(200*(v(VOUT1)-v(VT)))) + v(KSW)*v(VHOLD) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EIN VIN1 VINT VAC 0 1 +VAC VAC 0 dc 0 ac 1 sin(0 1m 1meg) +RL VOUT1 VMID 20000 +CL VOUT1 VMID 5e-12 +.option method=gear reltol=1e-3 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let iq = -i(VDD) +print vout0 vin0 iq +set vin0_s = "$&vin0" +ac dec 20 10 10G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +set gain_s = "$&gain_lf" +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +* open-loop DC transfer around the operating point (servo frozen at the input level it found) +alter @VHOLD[dc] = $vin0_s +alter @VKSW[dc] = 1 +dc VAC -0.4 0.4 0.001 +let gin = abs(deriv(v(VOUT1))) +meas dc gmid find gin at=0 +let gn = gin/gmid +meas dc vo_a find v(VOUT1) when gn=0.5 cross=1 +meas dc vo_b find v(VOUT1) when gn=0.5 cross=last +let out_swing = abs(vo_b - vo_a) +print out_swing +* distortion at a fixed OUTPUT amplitude of 0.1 V (servo frozen, input amplitude = amplitude / |gain|) +alter @VKSW[dc] = 0 +let a_lin = 10^($gain_s/20) +let vamp2 = 0.1/a_lin +if vamp2 > 0.3 + let vamp2 = 0.3 +end +print vamp2 +alter @VAC[sin] = [ 0 $&vamp2 1meg ] +tran 2n 6u 3u +fourier 1meg v(VOUT1) +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C18/gf180/sW0.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW0.5_sL2/case.json new file mode 100644 index 00000000..07a18c8d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW0.5_sL2/case.json @@ -0,0 +1,185 @@ +{ + "case_id": "C18_gf180_sW0.5_sL2", + "circuit_id": "C18", + "pdk": "gf180", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "dut_name": "C18_gf180_sW0.5_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 1.0, + "l": 1.12, + "nf": 2 + }, + "M2": { + "w": 2.0, + "l": 1.12, + "nf": 4 + }, + "M3": { + "w": 4.0, + "l": 1.12, + "nf": 8 + }, + "M4": { + "w": 8.0, + "l": 1.12, + "nf": 16 + }, + "M5": { + "w": 8.0, + "l": 1.12, + "nf": 16 + }, + "M6": { + "w": 16.0, + "l": 1.12, + "nf": 32 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 2e-05 + } + }, + "load": { + "RL": 20000.0, + "CL": 5e-12, + "vamp": 0.02, + "vout_target": 1.65, + "vin_center": 0.9899999999999999, + "servo_slope": 200.0, + "options": ".option method=gear reltol=1e-3", + "vout_amp": 0.1 + }, + "category": "buffer_ab", + "notes": [ + "first-pass sizing v1", + "RL/CL returned to an ideal mid-supply source; open-loop output-swing metric added" + ], + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.12, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.56, + "nf0": 16, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 16.0, + "l0": 0.56, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.56, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 32.0, + "l0": 0.56, + "nf0": 64, + "uw0": 0.5, + "w": 16.0, + "l": 1.12, + "nf": 32, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "0b54a83843c05712", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M2", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo (freezable)" + }, + { + "kind": "testbench_element", + "what": "mid-supply load return" + }, + { + "kind": "testbench_element", + "what": "load resistor and capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/gf180/sW0.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW0.5_sL2/manifest.json new file mode 100644 index 00000000..899fe6bc --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW0.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "95c821f0e693ccb257837cfda2788ff57efce1e18dfa84311c3fa80c3ad88274", + "qualification.json": "c1ccfd1ddbab634fda8f9545c909d1c2a7db38574b7c75f7406aca6818637705", + "specs.json": "3fb5ccf7797df7f50db4145695c93edc236c15d0a1e4e280cc19db98205d4a60", + "target.spice": "be4e4504f842620c33a45987795624519f52d9f7b746041ad1f5df5337495246", + "target_lvs.spice": "76d5dcba2ac84342d757bec49d6754daeb04481fc9efe3f1c6cac41c806db809", + "testbench.spice": "80601bc9bc0098619af864565df0932a3d81d526bc5661a36c98271ed830205b" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/gf180/sW0.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW0.5_sL2/qualification.json new file mode 100644 index 00000000..1bcb6173 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW0.5_sL2/qualification.json @@ -0,0 +1,154 @@ +{ + "case_id": "C18_gf180_sW0.5_sL2", + "circuit_id": "C18", + "pdk": "gf180", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "buffer_ab", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.12, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.56, + "nf0": 16, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 16.0, + "l0": 0.56, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.56, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 32.0, + "l0": 0.56, + "nf0": 64, + "uw0": 0.5, + "w": 16.0, + "l": 1.12, + "nf": 32, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "0b54a83843c05712", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "servo did not reach the output target: vout0=1.725938 target=1.65 (tol 0.066 V)", + "thd_pct=20.72 above floor 3", + "out_swing=0 below floor 0.825" + ], + "spec": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 8494000.0 + }, + "out_swing": { + "min": 0.825 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 20.7249, + "iq": 3.33925e-05, + "f3db": 14157280.0, + "out_swing": 0.0 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.825 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 1.1, + "schematic_measures": { + "vout0": 1.725938, + "vin0": 1.49, + "iq": 3.33925e-05, + "gain_lf": -23.87583, + "f3db": 14157280.0, + "gmid": 0.06400154, + "vo_a": 1.711236, + "vo_b": 1.711236, + "out_swing": 0.0, + "vamp2": 0.3, + "thd_pct": 20.7249 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/gf180/sW0.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW0.5_sL2/specs.json new file mode 100644 index 00000000..8a77ac2a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW0.5_sL2/specs.json @@ -0,0 +1,37 @@ +{ + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 8494000.0 + }, + "out_swing": { + "min": 0.825 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 20.7249, + "iq": 3.33925e-05, + "f3db": 14157280.0, + "out_swing": 0.0 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.825 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/gf180/sW0.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW0.5_sL2/target.spice new file mode 100644 index 00000000..3b691bc0 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW0.5_sL2/target.spice @@ -0,0 +1,8 @@ +.subckt C18_gf180_sW0.5_sL2 VDD VSS VIN1 VOUT1 VB1 +MM1 net13 VIN1 VSS VSS nfet_03v3 w=1u l=1.12u nf=2 m=1 +MM2 net9 VB1 VDD VDD pfet_03v3 w=2u l=1.12u nf=4 m=1 +MM3 net9 net9 net22 VSS nfet_03v3 w=4u l=1.12u nf=8 m=1 +MM4 net13 net13 net22 VDD pfet_03v3 w=8u l=1.12u nf=16 m=1 +MM5 VDD net9 VOUT1 VSS nfet_03v3 w=8u l=1.12u nf=16 m=1 +MM6 VSS net13 VOUT1 VDD pfet_03v3 w=16u l=1.12u nf=32 m=1 +.ends C18_gf180_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C18/gf180/sW0.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW0.5_sL2/target_lvs.spice new file mode 100644 index 00000000..f7e6bb04 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW0.5_sL2/target_lvs.spice @@ -0,0 +1,80 @@ +.subckt C18_gf180_sW0.5_sL2 VDD VSS VIN1 VOUT1 VB1 +MM1_f0 net13 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM1_f1 net13 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM2_f0 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f1 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f2 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f3 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM3_f0 net9 net9 net22 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f1 net9 net9 net22 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f2 net9 net9 net22 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f3 net9 net9 net22 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f4 net9 net9 net22 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f5 net9 net9 net22 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f6 net9 net9 net22 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f7 net9 net9 net22 VSS nfet_03v3 w=0.5u l=1.12u +MM4_f0 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f1 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f2 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f3 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f4 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f5 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f6 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f7 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f8 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f9 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f10 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f11 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f12 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f13 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f14 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f15 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM5_f0 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f1 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f2 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f3 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f4 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f5 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f6 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f7 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f8 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f9 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f10 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f11 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f12 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f13 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f14 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f15 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM6_f0 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f1 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f2 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f3 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f4 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f5 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f6 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f7 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f8 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f9 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f10 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f11 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f12 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f13 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f14 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f15 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f16 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f17 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f18 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f19 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f20 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f21 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f22 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f23 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f24 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f25 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f26 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f27 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f28 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f29 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f30 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f31 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +.ends C18_gf180_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C18/gf180/sW0.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW0.5_sL2/testbench.spice new file mode 100644 index 00000000..7134f9e4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW0.5_sL2/testbench.spice @@ -0,0 +1,58 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C18_gf180_sW0.5_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +MB_VB1 VB1 VB1 VDDB VDDB pfet_03v3 w=2u l=1.12u +IB_VB1 VB1 VSS 2e-05 +* DC servo (disclosed test auxiliary): VINT -> input DC level that makes V_out = VT; frozen at VHOLD when KSW = 1 +VT VT 0 1.65 +VMID VMID 0 1.65 +VKSW KSW 0 0 +VHOLD VHOLD 0 0 +BSRV VSRV 0 V = (1-v(KSW))*(0.99 + 0.5*tanh(200*(v(VOUT1)-v(VT)))) + v(KSW)*v(VHOLD) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EIN VIN1 VINT VAC 0 1 +VAC VAC 0 dc 0 ac 1 sin(0 1m 1meg) +RL VOUT1 VMID 20000 +CL VOUT1 VMID 5e-12 +.option method=gear reltol=1e-3 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let iq = -i(VDD) +print vout0 vin0 iq +set vin0_s = "$&vin0" +ac dec 20 10 10G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +set gain_s = "$&gain_lf" +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +* open-loop DC transfer around the operating point (servo frozen at the input level it found) +alter @VHOLD[dc] = $vin0_s +alter @VKSW[dc] = 1 +dc VAC -0.4 0.4 0.001 +let gin = abs(deriv(v(VOUT1))) +meas dc gmid find gin at=0 +let gn = gin/gmid +meas dc vo_a find v(VOUT1) when gn=0.5 cross=1 +meas dc vo_b find v(VOUT1) when gn=0.5 cross=last +let out_swing = abs(vo_b - vo_a) +print out_swing +* distortion at a fixed OUTPUT amplitude of 0.1 V (servo frozen, input amplitude = amplitude / |gain|) +alter @VKSW[dc] = 0 +let a_lin = 10^($gain_s/20) +let vamp2 = 0.1/a_lin +if vamp2 > 0.3 + let vamp2 = 0.3 +end +print vamp2 +alter @VAC[sin] = [ 0 $&vamp2 1meg ] +tran 2n 6u 3u +fourier 1meg v(VOUT1) +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1.5_sL1.5/case.json new file mode 100644 index 00000000..05745581 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1.5_sL1.5/case.json @@ -0,0 +1,185 @@ +{ + "case_id": "C18_gf180_sW1.5_sL1.5", + "circuit_id": "C18", + "pdk": "gf180", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "dut_name": "C18_gf180_sW1.5_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 3.0, + "l": 0.84, + "nf": 6 + }, + "M2": { + "w": 6.0, + "l": 0.84, + "nf": 12 + }, + "M3": { + "w": 12.0, + "l": 0.84, + "nf": 24 + }, + "M4": { + "w": 24.0, + "l": 0.84, + "nf": 48 + }, + "M5": { + "w": 24.0, + "l": 0.84, + "nf": 48 + }, + "M6": { + "w": 48.0, + "l": 0.84, + "nf": 96 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 2e-05 + } + }, + "load": { + "RL": 20000.0, + "CL": 5e-12, + "vamp": 0.02, + "vout_target": 1.65, + "vin_center": 0.9899999999999999, + "servo_slope": 200.0, + "options": ".option method=gear reltol=1e-3", + "vout_amp": 0.1 + }, + "category": "buffer_ab", + "notes": [ + "first-pass sizing v1", + "RL/CL returned to an ideal mid-supply source; open-loop output-swing metric added" + ], + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.84, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 8.0, + "l0": 0.56, + "nf0": 16, + "uw0": 0.5, + "w": 12.0, + "l": 0.84, + "nf": 24, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 16.0, + "l0": 0.56, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.84, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 16.0, + "l0": 0.56, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.84, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 32.0, + "l0": 0.56, + "nf0": 64, + "uw0": 0.5, + "w": 48.0, + "l": 0.84, + "nf": 96, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "48bcd1ee0b1f064e", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M2", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo (freezable)" + }, + { + "kind": "testbench_element", + "what": "mid-supply load return" + }, + { + "kind": "testbench_element", + "what": "load resistor and capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1.5_sL1.5/manifest.json new file mode 100644 index 00000000..133d87a6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "71dcf2bd761ed601af527de4b3a807e56820384c99e7b0fdc315bcbc300a6ea2", + "qualification.json": "c2145ed5698f61f05fa16ec72284c854a97d28eb870a1ce4e499d1150cbf8e7b", + "specs.json": "df76c38b224aa2ceb28e5d8c5c2eb0c05a4dcab5c88d8874a8c2d139ae17191d", + "target.spice": "6314b051ac2ff9f0f6a554e820b908af5997628cdb395ac4dadd8f28d12033b3", + "target_lvs.spice": "c430ad4ea202def38da0755891b43c24f938148eee0e9dbbdf0ce2e1475c45fb", + "testbench.spice": "8cdc972da893d6345177cda48116bac673787a6d243c9ae28b291d4ce4fcd587" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1.5_sL1.5/qualification.json new file mode 100644 index 00000000..770f3513 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1.5_sL1.5/qualification.json @@ -0,0 +1,153 @@ +{ + "case_id": "C18_gf180_sW1.5_sL1.5", + "circuit_id": "C18", + "pdk": "gf180", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "buffer_ab", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.84, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 8.0, + "l0": 0.56, + "nf0": 16, + "uw0": 0.5, + "w": 12.0, + "l": 0.84, + "nf": 24, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 16.0, + "l0": 0.56, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.84, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 16.0, + "l0": 0.56, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.84, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 32.0, + "l0": 0.56, + "nf0": 64, + "uw0": 0.5, + "w": 48.0, + "l": 0.84, + "nf": 96, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "48bcd1ee0b1f064e", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "thd_pct=38.76 above floor 3", + "out_swing=0.4003 below floor 0.825" + ], + "spec": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 19190000.0 + }, + "out_swing": { + "min": 0.825 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 38.7588, + "iq": 5.853009e-05, + "f3db": 31984040.0, + "out_swing": 0.400254 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.825 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 3.1, + "schematic_measures": { + "vout0": 1.650572, + "vin0": 1.046996, + "iq": 5.853009e-05, + "gain_lf": -7.898394, + "f3db": 31984040.0, + "gmid": 0.4027752, + "vo_a": 2.025529, + "vo_b": 1.625275, + "out_swing": 0.400254, + "vamp2": 0.2482673, + "thd_pct": 38.7588 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1.5_sL1.5/specs.json new file mode 100644 index 00000000..af601a6a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1.5_sL1.5/specs.json @@ -0,0 +1,37 @@ +{ + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 19190000.0 + }, + "out_swing": { + "min": 0.825 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 38.7588, + "iq": 5.853009e-05, + "f3db": 31984040.0, + "out_swing": 0.400254 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.825 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1.5_sL1.5/target.spice new file mode 100644 index 00000000..423a5cc8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1.5_sL1.5/target.spice @@ -0,0 +1,8 @@ +.subckt C18_gf180_sW1.5_sL1.5 VDD VSS VIN1 VOUT1 VB1 +MM1 net13 VIN1 VSS VSS nfet_03v3 w=3u l=0.84u nf=6 m=1 +MM2 net9 VB1 VDD VDD pfet_03v3 w=6u l=0.84u nf=12 m=1 +MM3 net9 net9 net22 VSS nfet_03v3 w=12u l=0.84u nf=24 m=1 +MM4 net13 net13 net22 VDD pfet_03v3 w=24u l=0.84u nf=48 m=1 +MM5 VDD net9 VOUT1 VSS nfet_03v3 w=24u l=0.84u nf=48 m=1 +MM6 VSS net13 VOUT1 VDD pfet_03v3 w=48u l=0.84u nf=96 m=1 +.ends C18_gf180_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..3ef03d3b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1.5_sL1.5/target_lvs.spice @@ -0,0 +1,236 @@ +.subckt C18_gf180_sW1.5_sL1.5 VDD VSS VIN1 VOUT1 VB1 +MM1_f0 net13 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM1_f1 net13 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM1_f2 net13 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM1_f3 net13 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM1_f4 net13 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM1_f5 net13 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM2_f0 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f1 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f2 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f3 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f4 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f5 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f6 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f7 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f8 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f9 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f10 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f11 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM3_f0 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f1 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f2 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f3 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f4 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f5 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f6 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f7 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f8 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f9 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f10 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f11 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f12 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f13 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f14 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f15 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f16 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f17 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f18 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f19 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f20 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f21 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f22 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f23 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.84u +MM4_f0 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f1 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f2 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f3 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f4 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f5 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f6 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f7 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f8 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f9 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f10 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f11 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f12 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f13 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f14 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f15 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f16 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f17 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f18 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f19 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f20 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f21 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f22 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f23 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f24 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f25 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f26 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f27 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f28 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f29 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f30 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f31 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f32 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f33 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f34 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f35 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f36 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f37 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f38 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f39 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f40 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f41 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f42 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f43 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f44 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f45 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f46 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f47 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM5_f0 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f1 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f2 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f3 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f4 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f5 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f6 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f7 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f8 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f9 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f10 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f11 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f12 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f13 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f14 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f15 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f16 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f17 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f18 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f19 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f20 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f21 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f22 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f23 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f24 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f25 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f26 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f27 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f28 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f29 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f30 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f31 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f32 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f33 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f34 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f35 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f36 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f37 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f38 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f39 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f40 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f41 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f42 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f43 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f44 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f45 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f46 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f47 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM6_f0 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f1 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f2 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f3 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f4 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f5 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f6 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f7 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f8 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f9 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f10 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f11 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f12 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f13 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f14 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f15 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f16 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f17 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f18 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f19 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f20 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f21 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f22 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f23 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f24 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f25 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f26 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f27 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f28 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f29 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f30 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f31 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f32 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f33 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f34 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f35 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f36 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f37 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f38 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f39 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f40 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f41 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f42 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f43 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f44 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f45 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f46 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f47 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f48 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f49 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f50 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f51 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f52 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f53 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f54 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f55 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f56 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f57 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f58 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f59 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f60 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f61 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f62 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f63 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f64 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f65 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f66 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f67 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f68 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f69 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f70 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f71 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f72 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f73 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f74 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f75 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f76 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f77 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f78 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f79 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f80 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f81 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f82 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f83 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f84 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f85 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f86 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f87 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f88 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f89 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f90 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f91 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f92 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f93 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f94 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f95 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +.ends C18_gf180_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1.5_sL1.5/testbench.spice new file mode 100644 index 00000000..b732cd3f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1.5_sL1.5/testbench.spice @@ -0,0 +1,58 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C18_gf180_sW1.5_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +MB_VB1 VB1 VB1 VDDB VDDB pfet_03v3 w=6u l=0.84u +IB_VB1 VB1 VSS 2e-05 +* DC servo (disclosed test auxiliary): VINT -> input DC level that makes V_out = VT; frozen at VHOLD when KSW = 1 +VT VT 0 1.65 +VMID VMID 0 1.65 +VKSW KSW 0 0 +VHOLD VHOLD 0 0 +BSRV VSRV 0 V = (1-v(KSW))*(0.99 + 0.5*tanh(200*(v(VOUT1)-v(VT)))) + v(KSW)*v(VHOLD) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EIN VIN1 VINT VAC 0 1 +VAC VAC 0 dc 0 ac 1 sin(0 1m 1meg) +RL VOUT1 VMID 20000 +CL VOUT1 VMID 5e-12 +.option method=gear reltol=1e-3 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let iq = -i(VDD) +print vout0 vin0 iq +set vin0_s = "$&vin0" +ac dec 20 10 10G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +set gain_s = "$&gain_lf" +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +* open-loop DC transfer around the operating point (servo frozen at the input level it found) +alter @VHOLD[dc] = $vin0_s +alter @VKSW[dc] = 1 +dc VAC -0.4 0.4 0.001 +let gin = abs(deriv(v(VOUT1))) +meas dc gmid find gin at=0 +let gn = gin/gmid +meas dc vo_a find v(VOUT1) when gn=0.5 cross=1 +meas dc vo_b find v(VOUT1) when gn=0.5 cross=last +let out_swing = abs(vo_b - vo_a) +print out_swing +* distortion at a fixed OUTPUT amplitude of 0.1 V (servo frozen, input amplitude = amplitude / |gain|) +alter @VKSW[dc] = 0 +let a_lin = 10^($gain_s/20) +let vamp2 = 0.1/a_lin +if vamp2 > 0.3 + let vamp2 = 0.3 +end +print vamp2 +alter @VAC[sin] = [ 0 $&vamp2 1meg ] +tran 2n 6u 3u +fourier 1meg v(VOUT1) +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1.5_sL1/case.json new file mode 100644 index 00000000..f2a97e49 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1.5_sL1/case.json @@ -0,0 +1,185 @@ +{ + "case_id": "C18_gf180_sW1.5_sL1", + "circuit_id": "C18", + "pdk": "gf180", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "dut_name": "C18_gf180_sW1.5_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 3.0, + "l": 0.56, + "nf": 6 + }, + "M2": { + "w": 6.0, + "l": 0.56, + "nf": 12 + }, + "M3": { + "w": 12.0, + "l": 0.56, + "nf": 24 + }, + "M4": { + "w": 24.0, + "l": 0.56, + "nf": 48 + }, + "M5": { + "w": 24.0, + "l": 0.56, + "nf": 48 + }, + "M6": { + "w": 48.0, + "l": 0.56, + "nf": 96 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 2e-05 + } + }, + "load": { + "RL": 20000.0, + "CL": 5e-12, + "vamp": 0.02, + "vout_target": 1.65, + "vin_center": 0.9899999999999999, + "servo_slope": 200.0, + "options": ".option method=gear reltol=1e-3", + "vout_amp": 0.1 + }, + "category": "buffer_ab", + "notes": [ + "first-pass sizing v1", + "RL/CL returned to an ideal mid-supply source; open-loop output-swing metric added" + ], + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.56, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.56, + "nf0": 16, + "uw0": 0.5, + "w": 12.0, + "l": 0.56, + "nf": 24, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 16.0, + "l0": 0.56, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.56, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.56, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.56, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 32.0, + "l0": 0.56, + "nf0": 64, + "uw0": 0.5, + "w": 48.0, + "l": 0.56, + "nf": 96, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "9d239e397e692f04", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M2", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo (freezable)" + }, + { + "kind": "testbench_element", + "what": "mid-supply load return" + }, + { + "kind": "testbench_element", + "what": "load resistor and capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1.5_sL1/manifest.json new file mode 100644 index 00000000..94b3bd5f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "c676d354aff450c6ac3936548b94ace6ac61c8a2953131afebbcbafa7f10302b", + "qualification.json": "c5e58dc745000855ec91219933f81f39c9ef0cf3db063ad15c2f3853983de1bf", + "specs.json": "1eaca97f6fdf57029f101beb64dfb7524d35ae97917cdc937c5d8ec1584a8573", + "target.spice": "a899a204c596565696f80f87935f2f67fac062d3d8afa6fe4497bc0df8db268a", + "target_lvs.spice": "c9f2e691b8b38b60afd7c11620d306e8bf1c4d970d893aa84fb048196a31c890", + "testbench.spice": "655c9afa2b15528e09145cb3f1968247439d614440e9e648b0c859a8155290c4" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1.5_sL1/qualification.json new file mode 100644 index 00000000..1b128fde --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1.5_sL1/qualification.json @@ -0,0 +1,153 @@ +{ + "case_id": "C18_gf180_sW1.5_sL1", + "circuit_id": "C18", + "pdk": "gf180", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "buffer_ab", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.56, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.56, + "nf0": 16, + "uw0": 0.5, + "w": 12.0, + "l": 0.56, + "nf": 24, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 16.0, + "l0": 0.56, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.56, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.56, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.56, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 32.0, + "l0": 0.56, + "nf0": 64, + "uw0": 0.5, + "w": 48.0, + "l": 0.56, + "nf": 96, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "9d239e397e692f04", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "thd_pct=28.89 above floor 3", + "out_swing=0.3135 below floor 0.825" + ], + "spec": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 14450000.0 + }, + "out_swing": { + "min": 0.825 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 28.8929, + "iq": 6.122585e-05, + "f3db": 24088320.0, + "out_swing": 0.313468 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.825 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 3.0, + "schematic_measures": { + "vout0": 1.649173, + "vin0": 0.9080044, + "iq": 6.122585e-05, + "gain_lf": 10.93205, + "f3db": 24088320.0, + "gmid": 3.528578, + "vo_a": 1.935532, + "vo_b": 1.622064, + "out_swing": 0.313468, + "vamp2": 0.02840501, + "thd_pct": 28.8929 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1.5_sL1/specs.json new file mode 100644 index 00000000..572f4608 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1.5_sL1/specs.json @@ -0,0 +1,37 @@ +{ + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 14450000.0 + }, + "out_swing": { + "min": 0.825 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 28.8929, + "iq": 6.122585e-05, + "f3db": 24088320.0, + "out_swing": 0.313468 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.825 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1.5_sL1/target.spice new file mode 100644 index 00000000..953deb84 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1.5_sL1/target.spice @@ -0,0 +1,8 @@ +.subckt C18_gf180_sW1.5_sL1 VDD VSS VIN1 VOUT1 VB1 +MM1 net13 VIN1 VSS VSS nfet_03v3 w=3u l=0.56u nf=6 m=1 +MM2 net9 VB1 VDD VDD pfet_03v3 w=6u l=0.56u nf=12 m=1 +MM3 net9 net9 net22 VSS nfet_03v3 w=12u l=0.56u nf=24 m=1 +MM4 net13 net13 net22 VDD pfet_03v3 w=24u l=0.56u nf=48 m=1 +MM5 VDD net9 VOUT1 VSS nfet_03v3 w=24u l=0.56u nf=48 m=1 +MM6 VSS net13 VOUT1 VDD pfet_03v3 w=48u l=0.56u nf=96 m=1 +.ends C18_gf180_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1.5_sL1/target_lvs.spice new file mode 100644 index 00000000..acfb8267 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1.5_sL1/target_lvs.spice @@ -0,0 +1,236 @@ +.subckt C18_gf180_sW1.5_sL1 VDD VSS VIN1 VOUT1 VB1 +MM1_f0 net13 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM1_f1 net13 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM1_f2 net13 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM1_f3 net13 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM1_f4 net13 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM1_f5 net13 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM2_f0 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f1 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f2 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f3 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f4 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f5 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f6 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f7 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f8 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f9 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f10 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f11 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM3_f0 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f1 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f2 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f3 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f4 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f5 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f6 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f7 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f8 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f9 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f10 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f11 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f12 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f13 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f14 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f15 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f16 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f17 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f18 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f19 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f20 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f21 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f22 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f23 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.56u +MM4_f0 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f1 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f2 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f3 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f4 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f5 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f6 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f7 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f8 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f9 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f10 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f11 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f12 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f13 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f14 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f15 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f16 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f17 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f18 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f19 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f20 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f21 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f22 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f23 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f24 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f25 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f26 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f27 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f28 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f29 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f30 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f31 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f32 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f33 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f34 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f35 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f36 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f37 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f38 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f39 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f40 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f41 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f42 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f43 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f44 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f45 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f46 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f47 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM5_f0 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f1 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f2 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f3 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f4 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f5 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f6 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f7 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f8 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f9 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f10 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f11 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f12 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f13 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f14 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f15 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f16 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f17 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f18 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f19 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f20 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f21 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f22 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f23 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f24 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f25 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f26 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f27 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f28 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f29 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f30 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f31 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f32 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f33 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f34 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f35 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f36 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f37 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f38 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f39 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f40 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f41 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f42 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f43 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f44 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f45 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f46 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f47 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM6_f0 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f1 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f2 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f3 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f4 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f5 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f6 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f7 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f8 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f9 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f10 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f11 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f12 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f13 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f14 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f15 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f16 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f17 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f18 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f19 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f20 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f21 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f22 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f23 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f24 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f25 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f26 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f27 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f28 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f29 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f30 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f31 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f32 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f33 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f34 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f35 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f36 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f37 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f38 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f39 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f40 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f41 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f42 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f43 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f44 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f45 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f46 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f47 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f48 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f49 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f50 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f51 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f52 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f53 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f54 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f55 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f56 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f57 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f58 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f59 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f60 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f61 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f62 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f63 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f64 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f65 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f66 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f67 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f68 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f69 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f70 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f71 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f72 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f73 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f74 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f75 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f76 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f77 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f78 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f79 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f80 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f81 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f82 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f83 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f84 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f85 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f86 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f87 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f88 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f89 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f90 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f91 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f92 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f93 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f94 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f95 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +.ends C18_gf180_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1.5_sL1/testbench.spice new file mode 100644 index 00000000..7dc0c204 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1.5_sL1/testbench.spice @@ -0,0 +1,58 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C18_gf180_sW1.5_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +MB_VB1 VB1 VB1 VDDB VDDB pfet_03v3 w=6u l=0.56u +IB_VB1 VB1 VSS 2e-05 +* DC servo (disclosed test auxiliary): VINT -> input DC level that makes V_out = VT; frozen at VHOLD when KSW = 1 +VT VT 0 1.65 +VMID VMID 0 1.65 +VKSW KSW 0 0 +VHOLD VHOLD 0 0 +BSRV VSRV 0 V = (1-v(KSW))*(0.99 + 0.5*tanh(200*(v(VOUT1)-v(VT)))) + v(KSW)*v(VHOLD) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EIN VIN1 VINT VAC 0 1 +VAC VAC 0 dc 0 ac 1 sin(0 1m 1meg) +RL VOUT1 VMID 20000 +CL VOUT1 VMID 5e-12 +.option method=gear reltol=1e-3 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let iq = -i(VDD) +print vout0 vin0 iq +set vin0_s = "$&vin0" +ac dec 20 10 10G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +set gain_s = "$&gain_lf" +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +* open-loop DC transfer around the operating point (servo frozen at the input level it found) +alter @VHOLD[dc] = $vin0_s +alter @VKSW[dc] = 1 +dc VAC -0.4 0.4 0.001 +let gin = abs(deriv(v(VOUT1))) +meas dc gmid find gin at=0 +let gn = gin/gmid +meas dc vo_a find v(VOUT1) when gn=0.5 cross=1 +meas dc vo_b find v(VOUT1) when gn=0.5 cross=last +let out_swing = abs(vo_b - vo_a) +print out_swing +* distortion at a fixed OUTPUT amplitude of 0.1 V (servo frozen, input amplitude = amplitude / |gain|) +alter @VKSW[dc] = 0 +let a_lin = 10^($gain_s/20) +let vamp2 = 0.1/a_lin +if vamp2 > 0.3 + let vamp2 = 0.3 +end +print vamp2 +alter @VAC[sin] = [ 0 $&vamp2 1meg ] +tran 2n 6u 3u +fourier 1meg v(VOUT1) +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1.5_sL2/case.json new file mode 100644 index 00000000..fd068ae7 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1.5_sL2/case.json @@ -0,0 +1,185 @@ +{ + "case_id": "C18_gf180_sW1.5_sL2", + "circuit_id": "C18", + "pdk": "gf180", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "dut_name": "C18_gf180_sW1.5_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 3.0, + "l": 1.12, + "nf": 6 + }, + "M2": { + "w": 6.0, + "l": 1.12, + "nf": 12 + }, + "M3": { + "w": 12.0, + "l": 1.12, + "nf": 24 + }, + "M4": { + "w": 24.0, + "l": 1.12, + "nf": 48 + }, + "M5": { + "w": 24.0, + "l": 1.12, + "nf": 48 + }, + "M6": { + "w": 48.0, + "l": 1.12, + "nf": 96 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 2e-05 + } + }, + "load": { + "RL": 20000.0, + "CL": 5e-12, + "vamp": 0.02, + "vout_target": 1.65, + "vin_center": 0.9899999999999999, + "servo_slope": 200.0, + "options": ".option method=gear reltol=1e-3", + "vout_amp": 0.1 + }, + "category": "buffer_ab", + "notes": [ + "first-pass sizing v1", + "RL/CL returned to an ideal mid-supply source; open-loop output-swing metric added" + ], + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.12, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.56, + "nf0": 16, + "uw0": 0.5, + "w": 12.0, + "l": 1.12, + "nf": 24, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 16.0, + "l0": 0.56, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 1.12, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.56, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 1.12, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 32.0, + "l0": 0.56, + "nf0": 64, + "uw0": 0.5, + "w": 48.0, + "l": 1.12, + "nf": 96, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "8e140a0f707bbdcc", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M2", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo (freezable)" + }, + { + "kind": "testbench_element", + "what": "mid-supply load return" + }, + { + "kind": "testbench_element", + "what": "load resistor and capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1.5_sL2/manifest.json new file mode 100644 index 00000000..8ae3195e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "37c7d7aac0ce51a9b58512aa71eb93a1a997d34d18e5daf322c330e221f13f11", + "qualification.json": "6a9e138ccfe61f3662dea8d4296d5f2d61d672d7f6843acea1cee997800ac498", + "specs.json": "a132721eeb54d72d8b9af9f6cfd425dfc6466411d3bf688040d1eb8d3de15102", + "target.spice": "d27067fbe7e0f00c2d12182a95fbd814ea7d4adb60b44e30a554b514ad96c470", + "target_lvs.spice": "598da6034596f0eb2eb5e246dc42ae9b4122c6a6ff6b2e5ecf6ba58ed54f37cb", + "testbench.spice": "e1f354c91f945f52396db1721f6908896c31dc82abc870ffd10be5eba2154333" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1.5_sL2/qualification.json new file mode 100644 index 00000000..6a9ec5b2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1.5_sL2/qualification.json @@ -0,0 +1,153 @@ +{ + "case_id": "C18_gf180_sW1.5_sL2", + "circuit_id": "C18", + "pdk": "gf180", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "buffer_ab", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.12, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.56, + "nf0": 16, + "uw0": 0.5, + "w": 12.0, + "l": 1.12, + "nf": 24, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 16.0, + "l0": 0.56, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 1.12, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.56, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 1.12, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 32.0, + "l0": 0.56, + "nf0": 64, + "uw0": 0.5, + "w": 48.0, + "l": 1.12, + "nf": 96, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "8e140a0f707bbdcc", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "thd_pct=33.01 above floor 3", + "out_swing=0 below floor 0.825" + ], + "spec": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 17570000.0 + }, + "out_swing": { + "min": 0.825 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 33.0134, + "iq": 5.690205e-05, + "f3db": 29290630.0, + "out_swing": 0.0 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.825 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 3.1, + "schematic_measures": { + "vout0": 1.65395, + "vin0": 1.319204, + "iq": 5.690205e-05, + "gain_lf": -19.75458, + "f3db": 29290630.0, + "gmid": 0.1028636, + "vo_a": 1.63726, + "vo_b": 1.63726, + "out_swing": 0.0, + "vamp2": 0.3, + "thd_pct": 33.0134 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1.5_sL2/specs.json new file mode 100644 index 00000000..1901edf8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1.5_sL2/specs.json @@ -0,0 +1,37 @@ +{ + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 17570000.0 + }, + "out_swing": { + "min": 0.825 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 33.0134, + "iq": 5.690205e-05, + "f3db": 29290630.0, + "out_swing": 0.0 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.825 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1.5_sL2/target.spice new file mode 100644 index 00000000..ee82c236 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1.5_sL2/target.spice @@ -0,0 +1,8 @@ +.subckt C18_gf180_sW1.5_sL2 VDD VSS VIN1 VOUT1 VB1 +MM1 net13 VIN1 VSS VSS nfet_03v3 w=3u l=1.12u nf=6 m=1 +MM2 net9 VB1 VDD VDD pfet_03v3 w=6u l=1.12u nf=12 m=1 +MM3 net9 net9 net22 VSS nfet_03v3 w=12u l=1.12u nf=24 m=1 +MM4 net13 net13 net22 VDD pfet_03v3 w=24u l=1.12u nf=48 m=1 +MM5 VDD net9 VOUT1 VSS nfet_03v3 w=24u l=1.12u nf=48 m=1 +MM6 VSS net13 VOUT1 VDD pfet_03v3 w=48u l=1.12u nf=96 m=1 +.ends C18_gf180_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1.5_sL2/target_lvs.spice new file mode 100644 index 00000000..c9768e10 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1.5_sL2/target_lvs.spice @@ -0,0 +1,236 @@ +.subckt C18_gf180_sW1.5_sL2 VDD VSS VIN1 VOUT1 VB1 +MM1_f0 net13 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM1_f1 net13 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM1_f2 net13 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM1_f3 net13 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM1_f4 net13 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM1_f5 net13 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM2_f0 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f1 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f2 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f3 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f4 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f5 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f6 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f7 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f8 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f9 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f10 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f11 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM3_f0 net9 net9 net22 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f1 net9 net9 net22 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f2 net9 net9 net22 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f3 net9 net9 net22 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f4 net9 net9 net22 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f5 net9 net9 net22 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f6 net9 net9 net22 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f7 net9 net9 net22 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f8 net9 net9 net22 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f9 net9 net9 net22 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f10 net9 net9 net22 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f11 net9 net9 net22 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f12 net9 net9 net22 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f13 net9 net9 net22 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f14 net9 net9 net22 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f15 net9 net9 net22 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f16 net9 net9 net22 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f17 net9 net9 net22 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f18 net9 net9 net22 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f19 net9 net9 net22 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f20 net9 net9 net22 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f21 net9 net9 net22 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f22 net9 net9 net22 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f23 net9 net9 net22 VSS nfet_03v3 w=0.5u l=1.12u +MM4_f0 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f1 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f2 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f3 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f4 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f5 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f6 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f7 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f8 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f9 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f10 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f11 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f12 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f13 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f14 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f15 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f16 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f17 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f18 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f19 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f20 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f21 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f22 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f23 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f24 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f25 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f26 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f27 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f28 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f29 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f30 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f31 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f32 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f33 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f34 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f35 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f36 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f37 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f38 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f39 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f40 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f41 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f42 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f43 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f44 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f45 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f46 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f47 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM5_f0 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f1 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f2 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f3 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f4 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f5 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f6 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f7 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f8 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f9 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f10 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f11 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f12 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f13 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f14 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f15 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f16 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f17 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f18 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f19 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f20 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f21 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f22 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f23 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f24 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f25 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f26 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f27 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f28 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f29 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f30 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f31 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f32 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f33 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f34 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f35 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f36 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f37 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f38 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f39 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f40 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f41 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f42 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f43 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f44 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f45 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f46 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f47 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM6_f0 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f1 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f2 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f3 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f4 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f5 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f6 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f7 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f8 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f9 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f10 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f11 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f12 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f13 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f14 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f15 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f16 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f17 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f18 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f19 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f20 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f21 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f22 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f23 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f24 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f25 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f26 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f27 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f28 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f29 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f30 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f31 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f32 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f33 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f34 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f35 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f36 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f37 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f38 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f39 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f40 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f41 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f42 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f43 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f44 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f45 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f46 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f47 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f48 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f49 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f50 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f51 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f52 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f53 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f54 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f55 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f56 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f57 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f58 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f59 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f60 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f61 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f62 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f63 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f64 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f65 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f66 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f67 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f68 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f69 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f70 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f71 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f72 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f73 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f74 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f75 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f76 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f77 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f78 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f79 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f80 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f81 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f82 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f83 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f84 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f85 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f86 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f87 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f88 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f89 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f90 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f91 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f92 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f93 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f94 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f95 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +.ends C18_gf180_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1.5_sL2/testbench.spice new file mode 100644 index 00000000..1148bc56 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1.5_sL2/testbench.spice @@ -0,0 +1,58 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C18_gf180_sW1.5_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +MB_VB1 VB1 VB1 VDDB VDDB pfet_03v3 w=6u l=1.12u +IB_VB1 VB1 VSS 2e-05 +* DC servo (disclosed test auxiliary): VINT -> input DC level that makes V_out = VT; frozen at VHOLD when KSW = 1 +VT VT 0 1.65 +VMID VMID 0 1.65 +VKSW KSW 0 0 +VHOLD VHOLD 0 0 +BSRV VSRV 0 V = (1-v(KSW))*(0.99 + 0.5*tanh(200*(v(VOUT1)-v(VT)))) + v(KSW)*v(VHOLD) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EIN VIN1 VINT VAC 0 1 +VAC VAC 0 dc 0 ac 1 sin(0 1m 1meg) +RL VOUT1 VMID 20000 +CL VOUT1 VMID 5e-12 +.option method=gear reltol=1e-3 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let iq = -i(VDD) +print vout0 vin0 iq +set vin0_s = "$&vin0" +ac dec 20 10 10G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +set gain_s = "$&gain_lf" +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +* open-loop DC transfer around the operating point (servo frozen at the input level it found) +alter @VHOLD[dc] = $vin0_s +alter @VKSW[dc] = 1 +dc VAC -0.4 0.4 0.001 +let gin = abs(deriv(v(VOUT1))) +meas dc gmid find gin at=0 +let gn = gin/gmid +meas dc vo_a find v(VOUT1) when gn=0.5 cross=1 +meas dc vo_b find v(VOUT1) when gn=0.5 cross=last +let out_swing = abs(vo_b - vo_a) +print out_swing +* distortion at a fixed OUTPUT amplitude of 0.1 V (servo frozen, input amplitude = amplitude / |gain|) +alter @VKSW[dc] = 0 +let a_lin = 10^($gain_s/20) +let vamp2 = 0.1/a_lin +if vamp2 > 0.3 + let vamp2 = 0.3 +end +print vamp2 +alter @VAC[sin] = [ 0 $&vamp2 1meg ] +tran 2n 6u 3u +fourier 1meg v(VOUT1) +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1_sL1.5/case.json new file mode 100644 index 00000000..f4fdccc0 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1_sL1.5/case.json @@ -0,0 +1,185 @@ +{ + "case_id": "C18_gf180_sW1_sL1.5", + "circuit_id": "C18", + "pdk": "gf180", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "dut_name": "C18_gf180_sW1_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.84, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.84, + "nf": 8 + }, + "M3": { + "w": 8.0, + "l": 0.84, + "nf": 16 + }, + "M4": { + "w": 16.0, + "l": 0.84, + "nf": 32 + }, + "M5": { + "w": 16.0, + "l": 0.84, + "nf": 32 + }, + "M6": { + "w": 32.0, + "l": 0.84, + "nf": 64 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 2e-05 + } + }, + "load": { + "RL": 20000.0, + "CL": 5e-12, + "vamp": 0.02, + "vout_target": 1.65, + "vin_center": 0.9899999999999999, + "servo_slope": 200.0, + "options": ".option method=gear reltol=1e-3", + "vout_amp": 0.1 + }, + "category": "buffer_ab", + "notes": [ + "first-pass sizing v1", + "RL/CL returned to an ideal mid-supply source; open-loop output-swing metric added" + ], + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 8.0, + "l0": 0.56, + "nf0": 16, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 16.0, + "l0": 0.56, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.84, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 16.0, + "l0": 0.56, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.84, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 32.0, + "l0": 0.56, + "nf0": 64, + "uw0": 0.5, + "w": 32.0, + "l": 0.84, + "nf": 64, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "f69b009192ebadc8", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M2", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo (freezable)" + }, + { + "kind": "testbench_element", + "what": "mid-supply load return" + }, + { + "kind": "testbench_element", + "what": "load resistor and capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1_sL1.5/manifest.json new file mode 100644 index 00000000..bcf401b6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "1bddd1da70f8bc384de45da4bec55879044f6059280325548ac0b822274a799e", + "qualification.json": "eafd838a3a41ed2da5da7bcf7f4883a0fc709c5ba63c86b2e50a02a650a37b60", + "specs.json": "72ab025108f4c07eea28147c1810810577a423a0f28f1daafb6e80b1ead60a82", + "target.spice": "5aa71d7c308ac1a7cb23afb8247cb66bf17e82da0eeb192387834b7b708b0c8b", + "target_lvs.spice": "87bfa3873a18c51d40238e7358fc81b2ff6539c48038cccf5020519b19b82f6a", + "testbench.spice": "e067938af14bd4fa32c19588ca5ccde44a1d4c03a58451918116d688c3e0deef" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1_sL1.5/qualification.json new file mode 100644 index 00000000..1ca89191 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1_sL1.5/qualification.json @@ -0,0 +1,153 @@ +{ + "case_id": "C18_gf180_sW1_sL1.5", + "circuit_id": "C18", + "pdk": "gf180", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "buffer_ab", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 8.0, + "l0": 0.56, + "nf0": 16, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 16.0, + "l0": 0.56, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.84, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 16.0, + "l0": 0.56, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.84, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 32.0, + "l0": 0.56, + "nf0": 64, + "uw0": 0.5, + "w": 32.0, + "l": 0.84, + "nf": 64, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "f69b009192ebadc8", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "thd_pct=29.98 above floor 3", + "out_swing=0 below floor 0.825" + ], + "spec": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 17060000.0 + }, + "out_swing": { + "min": 0.825 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 29.979, + "iq": 5.600763e-05, + "f3db": 28436200.0, + "out_swing": 0.0 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.825 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 2.1, + "schematic_measures": { + "vout0": 1.654657, + "vin0": 1.355626, + "iq": 5.600763e-05, + "gain_lf": -19.89406, + "f3db": 28436200.0, + "gmid": 0.1012222, + "vo_a": 1.637144, + "vo_b": 1.637144, + "out_swing": 0.0, + "vamp2": 0.3, + "thd_pct": 29.979 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1_sL1.5/specs.json new file mode 100644 index 00000000..2ba4191f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1_sL1.5/specs.json @@ -0,0 +1,37 @@ +{ + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 17060000.0 + }, + "out_swing": { + "min": 0.825 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 29.979, + "iq": 5.600763e-05, + "f3db": 28436200.0, + "out_swing": 0.0 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.825 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1_sL1.5/target.spice new file mode 100644 index 00000000..7b17d6e1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1_sL1.5/target.spice @@ -0,0 +1,8 @@ +.subckt C18_gf180_sW1_sL1.5 VDD VSS VIN1 VOUT1 VB1 +MM1 net13 VIN1 VSS VSS nfet_03v3 w=2u l=0.84u nf=4 m=1 +MM2 net9 VB1 VDD VDD pfet_03v3 w=4u l=0.84u nf=8 m=1 +MM3 net9 net9 net22 VSS nfet_03v3 w=8u l=0.84u nf=16 m=1 +MM4 net13 net13 net22 VDD pfet_03v3 w=16u l=0.84u nf=32 m=1 +MM5 VDD net9 VOUT1 VSS nfet_03v3 w=16u l=0.84u nf=32 m=1 +MM6 VSS net13 VOUT1 VDD pfet_03v3 w=32u l=0.84u nf=64 m=1 +.ends C18_gf180_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1_sL1.5/target_lvs.spice new file mode 100644 index 00000000..8a846d5b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1_sL1.5/target_lvs.spice @@ -0,0 +1,158 @@ +.subckt C18_gf180_sW1_sL1.5 VDD VSS VIN1 VOUT1 VB1 +MM1_f0 net13 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM1_f1 net13 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM1_f2 net13 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM1_f3 net13 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM2_f0 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f1 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f2 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f3 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f4 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f5 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f6 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f7 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM3_f0 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f1 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f2 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f3 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f4 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f5 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f6 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f7 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f8 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f9 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f10 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f11 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f12 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f13 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f14 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f15 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.84u +MM4_f0 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f1 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f2 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f3 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f4 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f5 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f6 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f7 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f8 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f9 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f10 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f11 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f12 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f13 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f14 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f15 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f16 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f17 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f18 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f19 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f20 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f21 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f22 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f23 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f24 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f25 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f26 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f27 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f28 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f29 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f30 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f31 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM5_f0 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f1 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f2 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f3 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f4 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f5 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f6 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f7 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f8 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f9 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f10 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f11 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f12 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f13 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f14 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f15 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f16 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f17 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f18 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f19 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f20 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f21 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f22 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f23 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f24 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f25 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f26 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f27 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f28 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f29 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f30 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f31 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM6_f0 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f1 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f2 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f3 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f4 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f5 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f6 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f7 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f8 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f9 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f10 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f11 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f12 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f13 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f14 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f15 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f16 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f17 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f18 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f19 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f20 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f21 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f22 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f23 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f24 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f25 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f26 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f27 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f28 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f29 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f30 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f31 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f32 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f33 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f34 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f35 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f36 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f37 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f38 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f39 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f40 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f41 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f42 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f43 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f44 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f45 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f46 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f47 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f48 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f49 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f50 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f51 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f52 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f53 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f54 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f55 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f56 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f57 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f58 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f59 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f60 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f61 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f62 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f63 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +.ends C18_gf180_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1_sL1.5/testbench.spice new file mode 100644 index 00000000..8ccbcff5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1_sL1.5/testbench.spice @@ -0,0 +1,58 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C18_gf180_sW1_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +MB_VB1 VB1 VB1 VDDB VDDB pfet_03v3 w=4u l=0.84u +IB_VB1 VB1 VSS 2e-05 +* DC servo (disclosed test auxiliary): VINT -> input DC level that makes V_out = VT; frozen at VHOLD when KSW = 1 +VT VT 0 1.65 +VMID VMID 0 1.65 +VKSW KSW 0 0 +VHOLD VHOLD 0 0 +BSRV VSRV 0 V = (1-v(KSW))*(0.99 + 0.5*tanh(200*(v(VOUT1)-v(VT)))) + v(KSW)*v(VHOLD) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EIN VIN1 VINT VAC 0 1 +VAC VAC 0 dc 0 ac 1 sin(0 1m 1meg) +RL VOUT1 VMID 20000 +CL VOUT1 VMID 5e-12 +.option method=gear reltol=1e-3 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let iq = -i(VDD) +print vout0 vin0 iq +set vin0_s = "$&vin0" +ac dec 20 10 10G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +set gain_s = "$&gain_lf" +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +* open-loop DC transfer around the operating point (servo frozen at the input level it found) +alter @VHOLD[dc] = $vin0_s +alter @VKSW[dc] = 1 +dc VAC -0.4 0.4 0.001 +let gin = abs(deriv(v(VOUT1))) +meas dc gmid find gin at=0 +let gn = gin/gmid +meas dc vo_a find v(VOUT1) when gn=0.5 cross=1 +meas dc vo_b find v(VOUT1) when gn=0.5 cross=last +let out_swing = abs(vo_b - vo_a) +print out_swing +* distortion at a fixed OUTPUT amplitude of 0.1 V (servo frozen, input amplitude = amplitude / |gain|) +alter @VKSW[dc] = 0 +let a_lin = 10^($gain_s/20) +let vamp2 = 0.1/a_lin +if vamp2 > 0.3 + let vamp2 = 0.3 +end +print vamp2 +alter @VAC[sin] = [ 0 $&vamp2 1meg ] +tran 2n 6u 3u +fourier 1meg v(VOUT1) +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1_sL1/case.json new file mode 100644 index 00000000..a062151c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1_sL1/case.json @@ -0,0 +1,185 @@ +{ + "case_id": "C18_gf180_sW1_sL1", + "circuit_id": "C18", + "pdk": "gf180", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "dut_name": "C18_gf180_sW1_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.56, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "M3": { + "w": 8.0, + "l": 0.56, + "nf": 16 + }, + "M4": { + "w": 16.0, + "l": 0.56, + "nf": 32 + }, + "M5": { + "w": 16.0, + "l": 0.56, + "nf": 32 + }, + "M6": { + "w": 32.0, + "l": 0.56, + "nf": 64 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 2e-05 + } + }, + "load": { + "RL": 20000.0, + "CL": 5e-12, + "vamp": 0.02, + "vout_target": 1.65, + "vin_center": 0.9899999999999999, + "servo_slope": 200.0, + "options": ".option method=gear reltol=1e-3", + "vout_amp": 0.1 + }, + "category": "buffer_ab", + "notes": [ + "first-pass sizing v1", + "RL/CL returned to an ideal mid-supply source; open-loop output-swing metric added" + ], + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.56, + "nf0": 16, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 16.0, + "l0": 0.56, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.56, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.56, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.56, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 32.0, + "l0": 0.56, + "nf0": 64, + "uw0": 0.5, + "w": 32.0, + "l": 0.56, + "nf": 64, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "80490b484f82087d", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M2", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo (freezable)" + }, + { + "kind": "testbench_element", + "what": "mid-supply load return" + }, + { + "kind": "testbench_element", + "what": "load resistor and capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1_sL1/manifest.json new file mode 100644 index 00000000..550c350e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "8ff95f588d475c5b15e173f6469720cc1ca0d063a6660028b5597739c52f5ad4", + "qualification.json": "54bb419fe45d19958b61229a32ae37733c0163830668db63f7f09aac82a0b030", + "specs.json": "8ba62e07ed29b882ee8275c1cda934dfbcb1892a39b1da9421bb8408e9f08318", + "target.spice": "86339751f6b57f4459f5d96fda4f4208166f58ec8f9cbdc3388d5f93055655b4", + "target_lvs.spice": "58027fb64bb0759e4f899c18c79fed7f3b7026390286220f8f38078d4598383d", + "testbench.spice": "799dacf22bcfe6dec4236af9f2e89e99d7992816247420d66728dd1887b635c5" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1_sL1/qualification.json new file mode 100644 index 00000000..8471a6ac --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1_sL1/qualification.json @@ -0,0 +1,153 @@ +{ + "case_id": "C18_gf180_sW1_sL1", + "circuit_id": "C18", + "pdk": "gf180", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "buffer_ab", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.56, + "nf0": 16, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 16.0, + "l0": 0.56, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.56, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.56, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.56, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 32.0, + "l0": 0.56, + "nf0": 64, + "uw0": 0.5, + "w": 32.0, + "l": 0.56, + "nf": 64, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "80490b484f82087d", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "thd_pct=32.9 above floor 3", + "out_swing=0.4151 below floor 0.825" + ], + "spec": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 19870000.0 + }, + "out_swing": { + "min": 0.825 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 32.8993, + "iq": 5.918492e-05, + "f3db": 33112140.0, + "out_swing": 0.41509 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.825 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 2.0, + "schematic_measures": { + "vout0": 1.650088, + "vin0": 0.9988306, + "iq": 5.918492e-05, + "gain_lf": -0.8197628, + "f3db": 33112140.0, + "gmid": 0.9100092, + "vo_a": 2.033717, + "vo_b": 1.618627, + "out_swing": 0.41509, + "vamp2": 0.1098976, + "thd_pct": 32.8993 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1_sL1/specs.json new file mode 100644 index 00000000..00172c3b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1_sL1/specs.json @@ -0,0 +1,37 @@ +{ + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 19870000.0 + }, + "out_swing": { + "min": 0.825 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 32.8993, + "iq": 5.918492e-05, + "f3db": 33112140.0, + "out_swing": 0.41509 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.825 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1_sL1/target.spice new file mode 100644 index 00000000..881f2f4d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1_sL1/target.spice @@ -0,0 +1,8 @@ +.subckt C18_gf180_sW1_sL1 VDD VSS VIN1 VOUT1 VB1 +MM1 net13 VIN1 VSS VSS nfet_03v3 w=2u l=0.56u nf=4 m=1 +MM2 net9 VB1 VDD VDD pfet_03v3 w=4u l=0.56u nf=8 m=1 +MM3 net9 net9 net22 VSS nfet_03v3 w=8u l=0.56u nf=16 m=1 +MM4 net13 net13 net22 VDD pfet_03v3 w=16u l=0.56u nf=32 m=1 +MM5 VDD net9 VOUT1 VSS nfet_03v3 w=16u l=0.56u nf=32 m=1 +MM6 VSS net13 VOUT1 VDD pfet_03v3 w=32u l=0.56u nf=64 m=1 +.ends C18_gf180_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1_sL1/target_lvs.spice new file mode 100644 index 00000000..09cf77e3 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1_sL1/target_lvs.spice @@ -0,0 +1,158 @@ +.subckt C18_gf180_sW1_sL1 VDD VSS VIN1 VOUT1 VB1 +MM1_f0 net13 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM1_f1 net13 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM1_f2 net13 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM1_f3 net13 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM2_f0 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f1 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f2 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f3 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f4 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f5 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f6 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f7 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM3_f0 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f1 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f2 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f3 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f4 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f5 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f6 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f7 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f8 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f9 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f10 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f11 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f12 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f13 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f14 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f15 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.56u +MM4_f0 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f1 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f2 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f3 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f4 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f5 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f6 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f7 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f8 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f9 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f10 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f11 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f12 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f13 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f14 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f15 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f16 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f17 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f18 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f19 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f20 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f21 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f22 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f23 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f24 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f25 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f26 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f27 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f28 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f29 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f30 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f31 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM5_f0 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f1 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f2 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f3 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f4 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f5 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f6 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f7 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f8 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f9 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f10 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f11 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f12 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f13 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f14 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f15 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f16 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f17 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f18 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f19 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f20 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f21 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f22 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f23 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f24 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f25 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f26 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f27 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f28 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f29 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f30 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f31 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM6_f0 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f1 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f2 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f3 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f4 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f5 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f6 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f7 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f8 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f9 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f10 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f11 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f12 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f13 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f14 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f15 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f16 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f17 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f18 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f19 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f20 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f21 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f22 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f23 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f24 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f25 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f26 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f27 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f28 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f29 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f30 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f31 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f32 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f33 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f34 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f35 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f36 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f37 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f38 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f39 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f40 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f41 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f42 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f43 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f44 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f45 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f46 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f47 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f48 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f49 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f50 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f51 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f52 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f53 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f54 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f55 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f56 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f57 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f58 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f59 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f60 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f61 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f62 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f63 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +.ends C18_gf180_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1_sL1/testbench.spice new file mode 100644 index 00000000..ac13245e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1_sL1/testbench.spice @@ -0,0 +1,58 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C18_gf180_sW1_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +MB_VB1 VB1 VB1 VDDB VDDB pfet_03v3 w=4u l=0.56u +IB_VB1 VB1 VSS 2e-05 +* DC servo (disclosed test auxiliary): VINT -> input DC level that makes V_out = VT; frozen at VHOLD when KSW = 1 +VT VT 0 1.65 +VMID VMID 0 1.65 +VKSW KSW 0 0 +VHOLD VHOLD 0 0 +BSRV VSRV 0 V = (1-v(KSW))*(0.99 + 0.5*tanh(200*(v(VOUT1)-v(VT)))) + v(KSW)*v(VHOLD) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EIN VIN1 VINT VAC 0 1 +VAC VAC 0 dc 0 ac 1 sin(0 1m 1meg) +RL VOUT1 VMID 20000 +CL VOUT1 VMID 5e-12 +.option method=gear reltol=1e-3 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let iq = -i(VDD) +print vout0 vin0 iq +set vin0_s = "$&vin0" +ac dec 20 10 10G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +set gain_s = "$&gain_lf" +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +* open-loop DC transfer around the operating point (servo frozen at the input level it found) +alter @VHOLD[dc] = $vin0_s +alter @VKSW[dc] = 1 +dc VAC -0.4 0.4 0.001 +let gin = abs(deriv(v(VOUT1))) +meas dc gmid find gin at=0 +let gn = gin/gmid +meas dc vo_a find v(VOUT1) when gn=0.5 cross=1 +meas dc vo_b find v(VOUT1) when gn=0.5 cross=last +let out_swing = abs(vo_b - vo_a) +print out_swing +* distortion at a fixed OUTPUT amplitude of 0.1 V (servo frozen, input amplitude = amplitude / |gain|) +alter @VKSW[dc] = 0 +let a_lin = 10^($gain_s/20) +let vamp2 = 0.1/a_lin +if vamp2 > 0.3 + let vamp2 = 0.3 +end +print vamp2 +alter @VAC[sin] = [ 0 $&vamp2 1meg ] +tran 2n 6u 3u +fourier 1meg v(VOUT1) +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1_sL2/case.json new file mode 100644 index 00000000..28507d07 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1_sL2/case.json @@ -0,0 +1,185 @@ +{ + "case_id": "C18_gf180_sW1_sL2", + "circuit_id": "C18", + "pdk": "gf180", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "dut_name": "C18_gf180_sW1_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 1.12, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 1.12, + "nf": 8 + }, + "M3": { + "w": 8.0, + "l": 1.12, + "nf": 16 + }, + "M4": { + "w": 16.0, + "l": 1.12, + "nf": 32 + }, + "M5": { + "w": 16.0, + "l": 1.12, + "nf": 32 + }, + "M6": { + "w": 32.0, + "l": 1.12, + "nf": 64 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 2e-05 + } + }, + "load": { + "RL": 20000.0, + "CL": 5e-12, + "vamp": 0.02, + "vout_target": 1.65, + "vin_center": 0.9899999999999999, + "servo_slope": 200.0, + "options": ".option method=gear reltol=1e-3", + "vout_amp": 0.1 + }, + "category": "buffer_ab", + "notes": [ + "first-pass sizing v1", + "RL/CL returned to an ideal mid-supply source; open-loop output-swing metric added" + ], + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.56, + "nf0": 16, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 16.0, + "l0": 0.56, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 1.12, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.56, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 1.12, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 32.0, + "l0": 0.56, + "nf0": 64, + "uw0": 0.5, + "w": 32.0, + "l": 1.12, + "nf": 64, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "5cf5566114aeb37e", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M2", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo (freezable)" + }, + { + "kind": "testbench_element", + "what": "mid-supply load return" + }, + { + "kind": "testbench_element", + "what": "load resistor and capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1_sL2/manifest.json new file mode 100644 index 00000000..82e476b5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "8f2b410344fb5a3fd00ff943ce7d347c0cdca7ba7129e4b0515a52fbe12fad66", + "qualification.json": "5cfd7cc28230fe4590df9aa4e3016aac3b6c622c1ac1785d93be7a21f2fdebe5", + "specs.json": "31f453ca0790d36de84e82e14583cd98da56845d9ed69cad1e563dd4752daff8", + "target.spice": "cae5c86ced32a8374f0d455a5851a00933ffc87dcc39526269e246cfabe3daf6", + "target_lvs.spice": "fa3fed4c19387faa7c01bb6f4973e665efd1a7175a5254f6d00942406edb71a3", + "testbench.spice": "30a34ad2760fac4ace37021572e06c6b56bcc3efca483e6c7efa4456a66dfe78" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1_sL2/qualification.json new file mode 100644 index 00000000..0d4a16b2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1_sL2/qualification.json @@ -0,0 +1,153 @@ +{ + "case_id": "C18_gf180_sW1_sL2", + "circuit_id": "C18", + "pdk": "gf180", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "buffer_ab", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.56, + "nf0": 16, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 16.0, + "l0": 0.56, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 1.12, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.56, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 1.12, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 32.0, + "l0": 0.56, + "nf0": 64, + "uw0": 0.5, + "w": 32.0, + "l": 1.12, + "nf": 64, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "5cf5566114aeb37e", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "thd_pct=21.38 above floor 3", + "out_swing=0 below floor 0.825" + ], + "spec": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 14190000.0 + }, + "out_swing": { + "min": 0.825 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 21.3766, + "iq": 5.028947e-05, + "f3db": 23652200.0, + "out_swing": 0.0 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.825 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 2.2, + "schematic_measures": { + "vout0": 1.683178, + "vin0": 1.489998, + "iq": 5.028947e-05, + "gain_lf": -23.77753, + "f3db": 23652200.0, + "gmid": 0.0647298, + "vo_a": 1.668788, + "vo_b": 1.668788, + "out_swing": 0.0, + "vamp2": 0.3, + "thd_pct": 21.3766 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1_sL2/specs.json new file mode 100644 index 00000000..af04e48b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1_sL2/specs.json @@ -0,0 +1,37 @@ +{ + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 14190000.0 + }, + "out_swing": { + "min": 0.825 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 21.3766, + "iq": 5.028947e-05, + "f3db": 23652200.0, + "out_swing": 0.0 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.825 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1_sL2/target.spice new file mode 100644 index 00000000..42e1f363 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1_sL2/target.spice @@ -0,0 +1,8 @@ +.subckt C18_gf180_sW1_sL2 VDD VSS VIN1 VOUT1 VB1 +MM1 net13 VIN1 VSS VSS nfet_03v3 w=2u l=1.12u nf=4 m=1 +MM2 net9 VB1 VDD VDD pfet_03v3 w=4u l=1.12u nf=8 m=1 +MM3 net9 net9 net22 VSS nfet_03v3 w=8u l=1.12u nf=16 m=1 +MM4 net13 net13 net22 VDD pfet_03v3 w=16u l=1.12u nf=32 m=1 +MM5 VDD net9 VOUT1 VSS nfet_03v3 w=16u l=1.12u nf=32 m=1 +MM6 VSS net13 VOUT1 VDD pfet_03v3 w=32u l=1.12u nf=64 m=1 +.ends C18_gf180_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1_sL2/target_lvs.spice new file mode 100644 index 00000000..3c4cdecd --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1_sL2/target_lvs.spice @@ -0,0 +1,158 @@ +.subckt C18_gf180_sW1_sL2 VDD VSS VIN1 VOUT1 VB1 +MM1_f0 net13 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM1_f1 net13 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM1_f2 net13 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM1_f3 net13 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM2_f0 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f1 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f2 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f3 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f4 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f5 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f6 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f7 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM3_f0 net9 net9 net22 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f1 net9 net9 net22 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f2 net9 net9 net22 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f3 net9 net9 net22 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f4 net9 net9 net22 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f5 net9 net9 net22 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f6 net9 net9 net22 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f7 net9 net9 net22 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f8 net9 net9 net22 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f9 net9 net9 net22 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f10 net9 net9 net22 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f11 net9 net9 net22 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f12 net9 net9 net22 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f13 net9 net9 net22 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f14 net9 net9 net22 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f15 net9 net9 net22 VSS nfet_03v3 w=0.5u l=1.12u +MM4_f0 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f1 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f2 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f3 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f4 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f5 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f6 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f7 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f8 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f9 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f10 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f11 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f12 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f13 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f14 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f15 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f16 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f17 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f18 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f19 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f20 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f21 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f22 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f23 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f24 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f25 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f26 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f27 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f28 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f29 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f30 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f31 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM5_f0 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f1 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f2 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f3 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f4 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f5 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f6 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f7 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f8 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f9 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f10 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f11 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f12 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f13 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f14 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f15 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f16 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f17 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f18 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f19 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f20 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f21 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f22 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f23 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f24 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f25 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f26 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f27 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f28 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f29 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f30 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f31 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM6_f0 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f1 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f2 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f3 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f4 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f5 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f6 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f7 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f8 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f9 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f10 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f11 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f12 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f13 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f14 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f15 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f16 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f17 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f18 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f19 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f20 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f21 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f22 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f23 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f24 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f25 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f26 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f27 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f28 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f29 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f30 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f31 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f32 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f33 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f34 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f35 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f36 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f37 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f38 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f39 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f40 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f41 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f42 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f43 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f44 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f45 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f46 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f47 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f48 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f49 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f50 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f51 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f52 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f53 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f54 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f55 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f56 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f57 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f58 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f59 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f60 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f61 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f62 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f63 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +.ends C18_gf180_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1_sL2/testbench.spice new file mode 100644 index 00000000..a4accccc --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW1_sL2/testbench.spice @@ -0,0 +1,58 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C18_gf180_sW1_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +MB_VB1 VB1 VB1 VDDB VDDB pfet_03v3 w=4u l=1.12u +IB_VB1 VB1 VSS 2e-05 +* DC servo (disclosed test auxiliary): VINT -> input DC level that makes V_out = VT; frozen at VHOLD when KSW = 1 +VT VT 0 1.65 +VMID VMID 0 1.65 +VKSW KSW 0 0 +VHOLD VHOLD 0 0 +BSRV VSRV 0 V = (1-v(KSW))*(0.99 + 0.5*tanh(200*(v(VOUT1)-v(VT)))) + v(KSW)*v(VHOLD) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EIN VIN1 VINT VAC 0 1 +VAC VAC 0 dc 0 ac 1 sin(0 1m 1meg) +RL VOUT1 VMID 20000 +CL VOUT1 VMID 5e-12 +.option method=gear reltol=1e-3 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let iq = -i(VDD) +print vout0 vin0 iq +set vin0_s = "$&vin0" +ac dec 20 10 10G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +set gain_s = "$&gain_lf" +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +* open-loop DC transfer around the operating point (servo frozen at the input level it found) +alter @VHOLD[dc] = $vin0_s +alter @VKSW[dc] = 1 +dc VAC -0.4 0.4 0.001 +let gin = abs(deriv(v(VOUT1))) +meas dc gmid find gin at=0 +let gn = gin/gmid +meas dc vo_a find v(VOUT1) when gn=0.5 cross=1 +meas dc vo_b find v(VOUT1) when gn=0.5 cross=last +let out_swing = abs(vo_b - vo_a) +print out_swing +* distortion at a fixed OUTPUT amplitude of 0.1 V (servo frozen, input amplitude = amplitude / |gain|) +alter @VKSW[dc] = 0 +let a_lin = 10^($gain_s/20) +let vamp2 = 0.1/a_lin +if vamp2 > 0.3 + let vamp2 = 0.3 +end +print vamp2 +alter @VAC[sin] = [ 0 $&vamp2 1meg ] +tran 2n 6u 3u +fourier 1meg v(VOUT1) +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C18/gf180/sW2_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW2_sL1.5/case.json new file mode 100644 index 00000000..18dbd536 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW2_sL1.5/case.json @@ -0,0 +1,185 @@ +{ + "case_id": "C18_gf180_sW2_sL1.5", + "circuit_id": "C18", + "pdk": "gf180", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "dut_name": "C18_gf180_sW2_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.84, + "nf": 8 + }, + "M2": { + "w": 8.0, + "l": 0.84, + "nf": 16 + }, + "M3": { + "w": 16.0, + "l": 0.84, + "nf": 32 + }, + "M4": { + "w": 32.0, + "l": 0.84, + "nf": 64 + }, + "M5": { + "w": 32.0, + "l": 0.84, + "nf": 64 + }, + "M6": { + "w": 64.0, + "l": 0.84, + "nf": 128 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 2e-05 + } + }, + "load": { + "RL": 20000.0, + "CL": 5e-12, + "vamp": 0.02, + "vout_target": 1.65, + "vin_center": 0.9899999999999999, + "servo_slope": 200.0, + "options": ".option method=gear reltol=1e-3", + "vout_amp": 0.1 + }, + "category": "buffer_ab", + "notes": [ + "first-pass sizing v1", + "RL/CL returned to an ideal mid-supply source; open-loop output-swing metric added" + ], + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 8.0, + "l0": 0.56, + "nf0": 16, + "uw0": 0.5, + "w": 16.0, + "l": 0.84, + "nf": 32, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 16.0, + "l0": 0.56, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.84, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 16.0, + "l0": 0.56, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.84, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 32.0, + "l0": 0.56, + "nf0": 64, + "uw0": 0.5, + "w": 64.0, + "l": 0.84, + "nf": 128, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "37371290d4270b9f", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M2", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo (freezable)" + }, + { + "kind": "testbench_element", + "what": "mid-supply load return" + }, + { + "kind": "testbench_element", + "what": "load resistor and capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/gf180/sW2_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW2_sL1.5/manifest.json new file mode 100644 index 00000000..10c55f50 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW2_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "39ff68eb314cfd04484f7042a0f6c2794204d2136de026a297c450d5cdb11c35", + "qualification.json": "c9aae834928c9f82afa2136d12f90c8435262828a0f4bd7cf967616f17e62b42", + "specs.json": "df05babb014ea14944520be075ef12134523f3471004b7251cf326e2969063ef", + "target.spice": "2acdf8aea07f5dbea19ff0f8b0b488761c8b195b61f8aaf60bffb7808f8327e2", + "target_lvs.spice": "e3757ac7e49fdc8992d4ada6c99d6fa5571a15c85fa58e80fbfdd49898cd5d2b", + "testbench.spice": "a370f8f784d6722e6f6c16939d01aa33c4229fe741e87443cff98760dd690ccc" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/gf180/sW2_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW2_sL1.5/qualification.json new file mode 100644 index 00000000..2810b045 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW2_sL1.5/qualification.json @@ -0,0 +1,153 @@ +{ + "case_id": "C18_gf180_sW2_sL1.5", + "circuit_id": "C18", + "pdk": "gf180", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "buffer_ab", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 8.0, + "l0": 0.56, + "nf0": 16, + "uw0": 0.5, + "w": 16.0, + "l": 0.84, + "nf": 32, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 16.0, + "l0": 0.56, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.84, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 16.0, + "l0": 0.56, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.84, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 32.0, + "l0": 0.56, + "nf0": 64, + "uw0": 0.5, + "w": 64.0, + "l": 0.84, + "nf": 128, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "37371290d4270b9f", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "thd_pct=33.43 above floor 3", + "out_swing=0.3971 below floor 0.825" + ], + "spec": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 16840000.0 + }, + "out_swing": { + "min": 0.825 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 33.43, + "iq": 5.946696e-05, + "f3db": 28070750.0, + "out_swing": 0.397109 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.825 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 4.2, + "schematic_measures": { + "vout0": 1.649532, + "vin0": 0.9433282, + "iq": 5.946696e-05, + "gain_lf": 0.1937598, + "f3db": 28070750.0, + "gmid": 1.022776, + "vo_a": 2.020227, + "vo_b": 1.623118, + "out_swing": 0.397109, + "vamp2": 0.09779395, + "thd_pct": 33.43 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/gf180/sW2_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW2_sL1.5/specs.json new file mode 100644 index 00000000..e56a4408 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW2_sL1.5/specs.json @@ -0,0 +1,37 @@ +{ + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 16840000.0 + }, + "out_swing": { + "min": 0.825 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 33.43, + "iq": 5.946696e-05, + "f3db": 28070750.0, + "out_swing": 0.397109 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.825 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/gf180/sW2_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW2_sL1.5/target.spice new file mode 100644 index 00000000..4e4ad6d0 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW2_sL1.5/target.spice @@ -0,0 +1,8 @@ +.subckt C18_gf180_sW2_sL1.5 VDD VSS VIN1 VOUT1 VB1 +MM1 net13 VIN1 VSS VSS nfet_03v3 w=4u l=0.84u nf=8 m=1 +MM2 net9 VB1 VDD VDD pfet_03v3 w=8u l=0.84u nf=16 m=1 +MM3 net9 net9 net22 VSS nfet_03v3 w=16u l=0.84u nf=32 m=1 +MM4 net13 net13 net22 VDD pfet_03v3 w=32u l=0.84u nf=64 m=1 +MM5 VDD net9 VOUT1 VSS nfet_03v3 w=32u l=0.84u nf=64 m=1 +MM6 VSS net13 VOUT1 VDD pfet_03v3 w=64u l=0.84u nf=128 m=1 +.ends C18_gf180_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C18/gf180/sW2_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW2_sL1.5/target_lvs.spice new file mode 100644 index 00000000..a2a66c14 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW2_sL1.5/target_lvs.spice @@ -0,0 +1,314 @@ +.subckt C18_gf180_sW2_sL1.5 VDD VSS VIN1 VOUT1 VB1 +MM1_f0 net13 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM1_f1 net13 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM1_f2 net13 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM1_f3 net13 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM1_f4 net13 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM1_f5 net13 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM1_f6 net13 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM1_f7 net13 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.84u +MM2_f0 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f1 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f2 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f3 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f4 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f5 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f6 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f7 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f8 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f9 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f10 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f11 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f12 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f13 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f14 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM2_f15 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=0.84u +MM3_f0 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f1 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f2 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f3 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f4 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f5 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f6 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f7 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f8 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f9 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f10 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f11 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f12 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f13 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f14 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f15 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f16 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f17 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f18 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f19 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f20 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f21 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f22 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f23 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f24 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f25 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f26 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f27 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f28 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f29 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f30 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.84u +MM3_f31 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.84u +MM4_f0 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f1 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f2 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f3 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f4 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f5 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f6 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f7 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f8 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f9 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f10 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f11 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f12 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f13 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f14 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f15 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f16 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f17 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f18 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f19 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f20 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f21 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f22 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f23 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f24 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f25 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f26 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f27 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f28 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f29 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f30 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f31 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f32 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f33 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f34 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f35 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f36 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f37 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f38 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f39 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f40 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f41 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f42 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f43 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f44 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f45 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f46 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f47 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f48 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f49 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f50 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f51 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f52 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f53 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f54 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f55 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f56 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f57 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f58 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f59 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f60 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f61 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f62 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM4_f63 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.84u +MM5_f0 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f1 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f2 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f3 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f4 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f5 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f6 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f7 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f8 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f9 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f10 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f11 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f12 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f13 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f14 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f15 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f16 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f17 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f18 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f19 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f20 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f21 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f22 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f23 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f24 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f25 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f26 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f27 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f28 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f29 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f30 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f31 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f32 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f33 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f34 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f35 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f36 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f37 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f38 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f39 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f40 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f41 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f42 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f43 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f44 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f45 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f46 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f47 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f48 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f49 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f50 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f51 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f52 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f53 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f54 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f55 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f56 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f57 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f58 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f59 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f60 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f61 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f62 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM5_f63 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.84u +MM6_f0 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f1 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f2 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f3 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f4 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f5 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f6 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f7 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f8 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f9 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f10 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f11 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f12 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f13 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f14 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f15 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f16 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f17 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f18 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f19 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f20 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f21 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f22 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f23 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f24 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f25 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f26 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f27 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f28 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f29 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f30 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f31 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f32 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f33 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f34 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f35 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f36 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f37 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f38 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f39 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f40 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f41 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f42 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f43 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f44 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f45 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f46 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f47 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f48 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f49 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f50 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f51 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f52 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f53 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f54 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f55 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f56 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f57 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f58 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f59 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f60 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f61 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f62 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f63 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f64 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f65 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f66 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f67 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f68 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f69 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f70 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f71 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f72 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f73 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f74 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f75 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f76 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f77 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f78 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f79 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f80 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f81 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f82 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f83 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f84 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f85 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f86 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f87 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f88 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f89 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f90 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f91 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f92 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f93 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f94 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f95 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f96 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f97 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f98 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f99 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f100 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f101 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f102 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f103 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f104 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f105 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f106 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f107 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f108 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f109 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f110 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f111 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f112 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f113 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f114 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f115 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f116 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f117 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f118 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f119 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f120 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f121 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f122 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f123 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f124 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f125 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f126 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +MM6_f127 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.84u +.ends C18_gf180_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C18/gf180/sW2_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW2_sL1.5/testbench.spice new file mode 100644 index 00000000..800a3620 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW2_sL1.5/testbench.spice @@ -0,0 +1,58 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C18_gf180_sW2_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +MB_VB1 VB1 VB1 VDDB VDDB pfet_03v3 w=8u l=0.84u +IB_VB1 VB1 VSS 2e-05 +* DC servo (disclosed test auxiliary): VINT -> input DC level that makes V_out = VT; frozen at VHOLD when KSW = 1 +VT VT 0 1.65 +VMID VMID 0 1.65 +VKSW KSW 0 0 +VHOLD VHOLD 0 0 +BSRV VSRV 0 V = (1-v(KSW))*(0.99 + 0.5*tanh(200*(v(VOUT1)-v(VT)))) + v(KSW)*v(VHOLD) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EIN VIN1 VINT VAC 0 1 +VAC VAC 0 dc 0 ac 1 sin(0 1m 1meg) +RL VOUT1 VMID 20000 +CL VOUT1 VMID 5e-12 +.option method=gear reltol=1e-3 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let iq = -i(VDD) +print vout0 vin0 iq +set vin0_s = "$&vin0" +ac dec 20 10 10G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +set gain_s = "$&gain_lf" +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +* open-loop DC transfer around the operating point (servo frozen at the input level it found) +alter @VHOLD[dc] = $vin0_s +alter @VKSW[dc] = 1 +dc VAC -0.4 0.4 0.001 +let gin = abs(deriv(v(VOUT1))) +meas dc gmid find gin at=0 +let gn = gin/gmid +meas dc vo_a find v(VOUT1) when gn=0.5 cross=1 +meas dc vo_b find v(VOUT1) when gn=0.5 cross=last +let out_swing = abs(vo_b - vo_a) +print out_swing +* distortion at a fixed OUTPUT amplitude of 0.1 V (servo frozen, input amplitude = amplitude / |gain|) +alter @VKSW[dc] = 0 +let a_lin = 10^($gain_s/20) +let vamp2 = 0.1/a_lin +if vamp2 > 0.3 + let vamp2 = 0.3 +end +print vamp2 +alter @VAC[sin] = [ 0 $&vamp2 1meg ] +tran 2n 6u 3u +fourier 1meg v(VOUT1) +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C18/gf180/sW2_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW2_sL1/case.json new file mode 100644 index 00000000..2b3d05b2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW2_sL1/case.json @@ -0,0 +1,185 @@ +{ + "case_id": "C18_gf180_sW2_sL1", + "circuit_id": "C18", + "pdk": "gf180", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "dut_name": "C18_gf180_sW2_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "M2": { + "w": 8.0, + "l": 0.56, + "nf": 16 + }, + "M3": { + "w": 16.0, + "l": 0.56, + "nf": 32 + }, + "M4": { + "w": 32.0, + "l": 0.56, + "nf": 64 + }, + "M5": { + "w": 32.0, + "l": 0.56, + "nf": 64 + }, + "M6": { + "w": 64.0, + "l": 0.56, + "nf": 128 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 2e-05 + } + }, + "load": { + "RL": 20000.0, + "CL": 5e-12, + "vamp": 0.02, + "vout_target": 1.65, + "vin_center": 0.9899999999999999, + "servo_slope": 200.0, + "options": ".option method=gear reltol=1e-3", + "vout_amp": 0.1 + }, + "category": "buffer_ab", + "notes": [ + "first-pass sizing v1", + "RL/CL returned to an ideal mid-supply source; open-loop output-swing metric added" + ], + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.56, + "nf0": 16, + "uw0": 0.5, + "w": 16.0, + "l": 0.56, + "nf": 32, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 16.0, + "l0": 0.56, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.56, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.56, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.56, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 32.0, + "l0": 0.56, + "nf0": 64, + "uw0": 0.5, + "w": 64.0, + "l": 0.56, + "nf": 128, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "051218102f694e22", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M2", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo (freezable)" + }, + { + "kind": "testbench_element", + "what": "mid-supply load return" + }, + { + "kind": "testbench_element", + "what": "load resistor and capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/gf180/sW2_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW2_sL1/manifest.json new file mode 100644 index 00000000..1c135abd --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW2_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "17bf8858ea15bdabc98ff383f81d39e181982968aa5635ddf64a5e911146bd51", + "qualification.json": "fa632f2acdb46f72414d17a0fd72beb06b4d2e7d88cc22b8cbe5a927d079ccac", + "specs.json": "d5a9b75287de9f9ace4fe9a5b33670e3793782f8dd0362c30c7733b87f9c79b6", + "target.spice": "9955de1aa3dc1f44588bd3600519e59427e26df11bcdf2b5f034e039f36e5993", + "target_lvs.spice": "b40ce2682bbc8e170f236aa35465e7f32462f267da1509646b6064b7411c168c", + "testbench.spice": "ece74341ef72ed7bbe3716590291242ef266dc90b48bcde85787e6cd9aa7bcfc" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/gf180/sW2_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW2_sL1/qualification.json new file mode 100644 index 00000000..9a4feba6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW2_sL1/qualification.json @@ -0,0 +1,153 @@ +{ + "case_id": "C18_gf180_sW2_sL1", + "circuit_id": "C18", + "pdk": "gf180", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "buffer_ab", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.56, + "nf0": 16, + "uw0": 0.5, + "w": 16.0, + "l": 0.56, + "nf": 32, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 16.0, + "l0": 0.56, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.56, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.56, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.56, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 32.0, + "l0": 0.56, + "nf0": 64, + "uw0": 0.5, + "w": 64.0, + "l": 0.56, + "nf": 128, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "051218102f694e22", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "thd_pct=26.61 above floor 3", + "out_swing=0.2552 below floor 0.825" + ], + "spec": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 7414000.0 + }, + "out_swing": { + "min": 0.825 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 26.6068, + "iq": 6.284896e-05, + "f3db": 12356960.0, + "out_swing": 0.2552 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.825 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 3.6, + "schematic_measures": { + "vout0": 1.648752, + "vin0": 0.8676934, + "iq": 6.284896e-05, + "gain_lf": 18.96702, + "f3db": 12356960.0, + "gmid": 8.936743, + "vo_a": 1.875164, + "vo_b": 1.619964, + "out_swing": 0.2552, + "vamp2": 0.01126289, + "thd_pct": 26.6068 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/gf180/sW2_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW2_sL1/specs.json new file mode 100644 index 00000000..2ad910d2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW2_sL1/specs.json @@ -0,0 +1,37 @@ +{ + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 7414000.0 + }, + "out_swing": { + "min": 0.825 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 26.6068, + "iq": 6.284896e-05, + "f3db": 12356960.0, + "out_swing": 0.2552 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.825 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/gf180/sW2_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW2_sL1/target.spice new file mode 100644 index 00000000..825613d4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW2_sL1/target.spice @@ -0,0 +1,8 @@ +.subckt C18_gf180_sW2_sL1 VDD VSS VIN1 VOUT1 VB1 +MM1 net13 VIN1 VSS VSS nfet_03v3 w=4u l=0.56u nf=8 m=1 +MM2 net9 VB1 VDD VDD pfet_03v3 w=8u l=0.56u nf=16 m=1 +MM3 net9 net9 net22 VSS nfet_03v3 w=16u l=0.56u nf=32 m=1 +MM4 net13 net13 net22 VDD pfet_03v3 w=32u l=0.56u nf=64 m=1 +MM5 VDD net9 VOUT1 VSS nfet_03v3 w=32u l=0.56u nf=64 m=1 +MM6 VSS net13 VOUT1 VDD pfet_03v3 w=64u l=0.56u nf=128 m=1 +.ends C18_gf180_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C18/gf180/sW2_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW2_sL1/target_lvs.spice new file mode 100644 index 00000000..7409269b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW2_sL1/target_lvs.spice @@ -0,0 +1,314 @@ +.subckt C18_gf180_sW2_sL1 VDD VSS VIN1 VOUT1 VB1 +MM1_f0 net13 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM1_f1 net13 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM1_f2 net13 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM1_f3 net13 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM1_f4 net13 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM1_f5 net13 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM1_f6 net13 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM1_f7 net13 VIN1 VSS VSS nfet_03v3 w=0.5u l=0.56u +MM2_f0 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f1 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f2 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f3 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f4 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f5 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f6 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f7 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f8 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f9 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f10 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f11 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f12 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f13 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f14 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM2_f15 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=0.56u +MM3_f0 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f1 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f2 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f3 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f4 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f5 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f6 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f7 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f8 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f9 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f10 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f11 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f12 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f13 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f14 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f15 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f16 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f17 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f18 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f19 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f20 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f21 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f22 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f23 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f24 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f25 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f26 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f27 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f28 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f29 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f30 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.56u +MM3_f31 net9 net9 net22 VSS nfet_03v3 w=0.5u l=0.56u +MM4_f0 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f1 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f2 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f3 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f4 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f5 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f6 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f7 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f8 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f9 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f10 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f11 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f12 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f13 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f14 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f15 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f16 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f17 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f18 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f19 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f20 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f21 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f22 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f23 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f24 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f25 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f26 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f27 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f28 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f29 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f30 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f31 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f32 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f33 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f34 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f35 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f36 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f37 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f38 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f39 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f40 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f41 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f42 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f43 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f44 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f45 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f46 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f47 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f48 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f49 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f50 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f51 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f52 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f53 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f54 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f55 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f56 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f57 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f58 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f59 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f60 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f61 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f62 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM4_f63 net13 net13 net22 VDD pfet_03v3 w=0.5u l=0.56u +MM5_f0 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f1 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f2 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f3 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f4 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f5 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f6 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f7 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f8 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f9 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f10 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f11 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f12 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f13 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f14 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f15 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f16 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f17 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f18 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f19 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f20 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f21 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f22 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f23 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f24 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f25 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f26 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f27 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f28 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f29 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f30 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f31 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f32 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f33 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f34 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f35 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f36 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f37 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f38 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f39 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f40 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f41 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f42 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f43 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f44 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f45 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f46 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f47 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f48 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f49 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f50 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f51 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f52 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f53 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f54 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f55 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f56 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f57 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f58 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f59 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f60 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f61 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f62 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM5_f63 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=0.56u +MM6_f0 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f1 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f2 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f3 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f4 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f5 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f6 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f7 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f8 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f9 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f10 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f11 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f12 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f13 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f14 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f15 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f16 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f17 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f18 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f19 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f20 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f21 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f22 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f23 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f24 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f25 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f26 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f27 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f28 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f29 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f30 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f31 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f32 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f33 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f34 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f35 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f36 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f37 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f38 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f39 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f40 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f41 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f42 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f43 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f44 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f45 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f46 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f47 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f48 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f49 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f50 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f51 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f52 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f53 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f54 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f55 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f56 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f57 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f58 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f59 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f60 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f61 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f62 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f63 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f64 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f65 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f66 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f67 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f68 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f69 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f70 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f71 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f72 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f73 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f74 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f75 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f76 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f77 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f78 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f79 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f80 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f81 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f82 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f83 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f84 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f85 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f86 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f87 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f88 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f89 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f90 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f91 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f92 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f93 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f94 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f95 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f96 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f97 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f98 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f99 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f100 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f101 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f102 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f103 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f104 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f105 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f106 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f107 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f108 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f109 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f110 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f111 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f112 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f113 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f114 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f115 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f116 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f117 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f118 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f119 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f120 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f121 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f122 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f123 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f124 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f125 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f126 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +MM6_f127 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=0.56u +.ends C18_gf180_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C18/gf180/sW2_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW2_sL1/testbench.spice new file mode 100644 index 00000000..6d3fa1c3 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW2_sL1/testbench.spice @@ -0,0 +1,58 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C18_gf180_sW2_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +MB_VB1 VB1 VB1 VDDB VDDB pfet_03v3 w=8u l=0.56u +IB_VB1 VB1 VSS 2e-05 +* DC servo (disclosed test auxiliary): VINT -> input DC level that makes V_out = VT; frozen at VHOLD when KSW = 1 +VT VT 0 1.65 +VMID VMID 0 1.65 +VKSW KSW 0 0 +VHOLD VHOLD 0 0 +BSRV VSRV 0 V = (1-v(KSW))*(0.99 + 0.5*tanh(200*(v(VOUT1)-v(VT)))) + v(KSW)*v(VHOLD) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EIN VIN1 VINT VAC 0 1 +VAC VAC 0 dc 0 ac 1 sin(0 1m 1meg) +RL VOUT1 VMID 20000 +CL VOUT1 VMID 5e-12 +.option method=gear reltol=1e-3 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let iq = -i(VDD) +print vout0 vin0 iq +set vin0_s = "$&vin0" +ac dec 20 10 10G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +set gain_s = "$&gain_lf" +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +* open-loop DC transfer around the operating point (servo frozen at the input level it found) +alter @VHOLD[dc] = $vin0_s +alter @VKSW[dc] = 1 +dc VAC -0.4 0.4 0.001 +let gin = abs(deriv(v(VOUT1))) +meas dc gmid find gin at=0 +let gn = gin/gmid +meas dc vo_a find v(VOUT1) when gn=0.5 cross=1 +meas dc vo_b find v(VOUT1) when gn=0.5 cross=last +let out_swing = abs(vo_b - vo_a) +print out_swing +* distortion at a fixed OUTPUT amplitude of 0.1 V (servo frozen, input amplitude = amplitude / |gain|) +alter @VKSW[dc] = 0 +let a_lin = 10^($gain_s/20) +let vamp2 = 0.1/a_lin +if vamp2 > 0.3 + let vamp2 = 0.3 +end +print vamp2 +alter @VAC[sin] = [ 0 $&vamp2 1meg ] +tran 2n 6u 3u +fourier 1meg v(VOUT1) +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C18/gf180/sW2_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW2_sL2/case.json new file mode 100644 index 00000000..1cccab9d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW2_sL2/case.json @@ -0,0 +1,185 @@ +{ + "case_id": "C18_gf180_sW2_sL2", + "circuit_id": "C18", + "pdk": "gf180", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "dut_name": "C18_gf180_sW2_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 1.12, + "nf": 8 + }, + "M2": { + "w": 8.0, + "l": 1.12, + "nf": 16 + }, + "M3": { + "w": 16.0, + "l": 1.12, + "nf": 32 + }, + "M4": { + "w": 32.0, + "l": 1.12, + "nf": 64 + }, + "M5": { + "w": 32.0, + "l": 1.12, + "nf": 64 + }, + "M6": { + "w": 64.0, + "l": 1.12, + "nf": 128 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 2e-05 + } + }, + "load": { + "RL": 20000.0, + "CL": 5e-12, + "vamp": 0.02, + "vout_target": 1.65, + "vin_center": 0.9899999999999999, + "servo_slope": 200.0, + "options": ".option method=gear reltol=1e-3", + "vout_amp": 0.1 + }, + "category": "buffer_ab", + "notes": [ + "first-pass sizing v1", + "RL/CL returned to an ideal mid-supply source; open-loop output-swing metric added" + ], + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.56, + "nf0": 16, + "uw0": 0.5, + "w": 16.0, + "l": 1.12, + "nf": 32, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 16.0, + "l0": 0.56, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 1.12, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.56, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 1.12, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 32.0, + "l0": 0.56, + "nf0": 64, + "uw0": 0.5, + "w": 64.0, + "l": 1.12, + "nf": 128, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "5289f1065a71db6a", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M2", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo (freezable)" + }, + { + "kind": "testbench_element", + "what": "mid-supply load return" + }, + { + "kind": "testbench_element", + "what": "load resistor and capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/gf180/sW2_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW2_sL2/manifest.json new file mode 100644 index 00000000..cd0c4b6d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW2_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "dadbdfcf7684608753f7e63f2655457723402caa17c587c6b1258426aad72f06", + "qualification.json": "f1ba2c64318cf178eabf9b3784c3eaf3ad5c3f0f7808c5ca4cc90822f4552fec", + "specs.json": "558929cb4025f25c4781226f7cffd883e9c873ab8b60c728ca3f2b2eefd60c5f", + "target.spice": "bdf7c0ecfb30cf21166600591ea3bac6430dced74770dbe28999ccd76cd40b39", + "target_lvs.spice": "6fada85e15cad200de569ffd81626dbff427485fbac59e44e8db0a16c4e436e8", + "testbench.spice": "c43ef869e2a90a9ea7307efeb9be8b3b4fc0040a7ca5a8e5737dbd02a5de3078" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/gf180/sW2_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW2_sL2/qualification.json new file mode 100644 index 00000000..dc713c70 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW2_sL2/qualification.json @@ -0,0 +1,153 @@ +{ + "case_id": "C18_gf180_sW2_sL2", + "circuit_id": "C18", + "pdk": "gf180", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "buffer_ab", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.56, + "nf0": 16, + "uw0": 0.5, + "w": 16.0, + "l": 1.12, + "nf": 32, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 16.0, + "l0": 0.56, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 1.12, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.56, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 1.12, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 32.0, + "l0": 0.56, + "nf0": 64, + "uw0": 0.5, + "w": 64.0, + "l": 1.12, + "nf": 128, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "5289f1065a71db6a", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "thd_pct=42.28 above floor 3", + "out_swing=0 below floor 0.825" + ], + "spec": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 17710000.0 + }, + "out_swing": { + "min": 0.825 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 42.2833, + "iq": 5.833965e-05, + "f3db": 29518230.0, + "out_swing": 0.0 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.825 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 2.8, + "schematic_measures": { + "vout0": 1.650887, + "vin0": 1.07775, + "iq": 5.833965e-05, + "gain_lf": -10.80582, + "f3db": 29518230.0, + "gmid": 0.2882045, + "vo_a": 1.628495, + "vo_b": 1.628495, + "out_swing": 0.0, + "vamp2": 0.3, + "thd_pct": 42.2833 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/gf180/sW2_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW2_sL2/specs.json new file mode 100644 index 00000000..0a9b77b0 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW2_sL2/specs.json @@ -0,0 +1,37 @@ +{ + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 17710000.0 + }, + "out_swing": { + "min": 0.825 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 42.2833, + "iq": 5.833965e-05, + "f3db": 29518230.0, + "out_swing": 0.0 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.825 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/gf180/sW2_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW2_sL2/target.spice new file mode 100644 index 00000000..71648822 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW2_sL2/target.spice @@ -0,0 +1,8 @@ +.subckt C18_gf180_sW2_sL2 VDD VSS VIN1 VOUT1 VB1 +MM1 net13 VIN1 VSS VSS nfet_03v3 w=4u l=1.12u nf=8 m=1 +MM2 net9 VB1 VDD VDD pfet_03v3 w=8u l=1.12u nf=16 m=1 +MM3 net9 net9 net22 VSS nfet_03v3 w=16u l=1.12u nf=32 m=1 +MM4 net13 net13 net22 VDD pfet_03v3 w=32u l=1.12u nf=64 m=1 +MM5 VDD net9 VOUT1 VSS nfet_03v3 w=32u l=1.12u nf=64 m=1 +MM6 VSS net13 VOUT1 VDD pfet_03v3 w=64u l=1.12u nf=128 m=1 +.ends C18_gf180_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C18/gf180/sW2_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW2_sL2/target_lvs.spice new file mode 100644 index 00000000..76985f74 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW2_sL2/target_lvs.spice @@ -0,0 +1,314 @@ +.subckt C18_gf180_sW2_sL2 VDD VSS VIN1 VOUT1 VB1 +MM1_f0 net13 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM1_f1 net13 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM1_f2 net13 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM1_f3 net13 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM1_f4 net13 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM1_f5 net13 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM1_f6 net13 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM1_f7 net13 VIN1 VSS VSS nfet_03v3 w=0.5u l=1.12u +MM2_f0 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f1 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f2 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f3 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f4 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f5 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f6 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f7 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f8 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f9 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f10 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f11 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f12 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f13 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f14 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM2_f15 net9 VB1 VDD VDD pfet_03v3 w=0.5u l=1.12u +MM3_f0 net9 net9 net22 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f1 net9 net9 net22 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f2 net9 net9 net22 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f3 net9 net9 net22 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f4 net9 net9 net22 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f5 net9 net9 net22 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f6 net9 net9 net22 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f7 net9 net9 net22 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f8 net9 net9 net22 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f9 net9 net9 net22 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f10 net9 net9 net22 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f11 net9 net9 net22 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f12 net9 net9 net22 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f13 net9 net9 net22 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f14 net9 net9 net22 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f15 net9 net9 net22 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f16 net9 net9 net22 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f17 net9 net9 net22 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f18 net9 net9 net22 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f19 net9 net9 net22 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f20 net9 net9 net22 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f21 net9 net9 net22 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f22 net9 net9 net22 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f23 net9 net9 net22 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f24 net9 net9 net22 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f25 net9 net9 net22 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f26 net9 net9 net22 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f27 net9 net9 net22 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f28 net9 net9 net22 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f29 net9 net9 net22 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f30 net9 net9 net22 VSS nfet_03v3 w=0.5u l=1.12u +MM3_f31 net9 net9 net22 VSS nfet_03v3 w=0.5u l=1.12u +MM4_f0 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f1 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f2 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f3 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f4 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f5 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f6 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f7 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f8 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f9 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f10 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f11 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f12 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f13 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f14 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f15 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f16 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f17 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f18 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f19 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f20 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f21 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f22 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f23 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f24 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f25 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f26 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f27 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f28 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f29 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f30 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f31 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f32 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f33 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f34 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f35 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f36 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f37 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f38 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f39 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f40 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f41 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f42 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f43 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f44 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f45 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f46 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f47 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f48 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f49 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f50 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f51 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f52 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f53 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f54 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f55 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f56 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f57 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f58 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f59 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f60 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f61 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f62 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM4_f63 net13 net13 net22 VDD pfet_03v3 w=0.5u l=1.12u +MM5_f0 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f1 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f2 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f3 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f4 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f5 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f6 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f7 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f8 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f9 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f10 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f11 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f12 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f13 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f14 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f15 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f16 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f17 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f18 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f19 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f20 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f21 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f22 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f23 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f24 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f25 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f26 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f27 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f28 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f29 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f30 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f31 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f32 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f33 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f34 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f35 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f36 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f37 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f38 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f39 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f40 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f41 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f42 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f43 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f44 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f45 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f46 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f47 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f48 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f49 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f50 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f51 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f52 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f53 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f54 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f55 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f56 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f57 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f58 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f59 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f60 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f61 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f62 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM5_f63 VDD net9 VOUT1 VSS nfet_03v3 w=0.5u l=1.12u +MM6_f0 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f1 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f2 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f3 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f4 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f5 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f6 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f7 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f8 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f9 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f10 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f11 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f12 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f13 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f14 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f15 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f16 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f17 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f18 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f19 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f20 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f21 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f22 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f23 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f24 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f25 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f26 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f27 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f28 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f29 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f30 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f31 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f32 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f33 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f34 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f35 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f36 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f37 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f38 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f39 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f40 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f41 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f42 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f43 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f44 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f45 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f46 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f47 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f48 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f49 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f50 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f51 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f52 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f53 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f54 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f55 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f56 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f57 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f58 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f59 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f60 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f61 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f62 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f63 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f64 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f65 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f66 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f67 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f68 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f69 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f70 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f71 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f72 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f73 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f74 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f75 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f76 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f77 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f78 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f79 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f80 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f81 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f82 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f83 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f84 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f85 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f86 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f87 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f88 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f89 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f90 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f91 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f92 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f93 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f94 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f95 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f96 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f97 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f98 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f99 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f100 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f101 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f102 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f103 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f104 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f105 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f106 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f107 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f108 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f109 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f110 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f111 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f112 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f113 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f114 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f115 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f116 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f117 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f118 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f119 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f120 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f121 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f122 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f123 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f124 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f125 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f126 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +MM6_f127 VSS net13 VOUT1 VDD pfet_03v3 w=0.5u l=1.12u +.ends C18_gf180_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C18/gf180/sW2_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW2_sL2/testbench.spice new file mode 100644 index 00000000..a911afd7 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/gf180/sW2_sL2/testbench.spice @@ -0,0 +1,58 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C18_gf180_sW2_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 3.3 +VSS VSS 0 0 +VDDB VDDB 0 3.3 +MB_VB1 VB1 VB1 VDDB VDDB pfet_03v3 w=8u l=1.12u +IB_VB1 VB1 VSS 2e-05 +* DC servo (disclosed test auxiliary): VINT -> input DC level that makes V_out = VT; frozen at VHOLD when KSW = 1 +VT VT 0 1.65 +VMID VMID 0 1.65 +VKSW KSW 0 0 +VHOLD VHOLD 0 0 +BSRV VSRV 0 V = (1-v(KSW))*(0.99 + 0.5*tanh(200*(v(VOUT1)-v(VT)))) + v(KSW)*v(VHOLD) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EIN VIN1 VINT VAC 0 1 +VAC VAC 0 dc 0 ac 1 sin(0 1m 1meg) +RL VOUT1 VMID 20000 +CL VOUT1 VMID 5e-12 +.option method=gear reltol=1e-3 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let iq = -i(VDD) +print vout0 vin0 iq +set vin0_s = "$&vin0" +ac dec 20 10 10G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +set gain_s = "$&gain_lf" +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +* open-loop DC transfer around the operating point (servo frozen at the input level it found) +alter @VHOLD[dc] = $vin0_s +alter @VKSW[dc] = 1 +dc VAC -0.4 0.4 0.001 +let gin = abs(deriv(v(VOUT1))) +meas dc gmid find gin at=0 +let gn = gin/gmid +meas dc vo_a find v(VOUT1) when gn=0.5 cross=1 +meas dc vo_b find v(VOUT1) when gn=0.5 cross=last +let out_swing = abs(vo_b - vo_a) +print out_swing +* distortion at a fixed OUTPUT amplitude of 0.1 V (servo frozen, input amplitude = amplitude / |gain|) +alter @VKSW[dc] = 0 +let a_lin = 10^($gain_s/20) +let vamp2 = 0.1/a_lin +if vamp2 > 0.3 + let vamp2 = 0.3 +end +print vamp2 +alter @VAC[sin] = [ 0 $&vamp2 1meg ] +tran 2n 6u 3u +fourier 1meg v(VOUT1) +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW0.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW0.5_sL1.5/case.json new file mode 100644 index 00000000..253dc034 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW0.5_sL1.5/case.json @@ -0,0 +1,185 @@ +{ + "case_id": "C18_ihp130_sW0.5_sL1.5", + "circuit_id": "C18", + "pdk": "ihp130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "dut_name": "C18_ihp130_sW0.5_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 1.0, + "l": 0.39, + "nf": 2 + }, + "M2": { + "w": 2.0, + "l": 0.39, + "nf": 4 + }, + "M3": { + "w": 4.0, + "l": 0.39, + "nf": 8 + }, + "M4": { + "w": 8.0, + "l": 0.39, + "nf": 16 + }, + "M5": { + "w": 8.0, + "l": 0.39, + "nf": 16 + }, + "M6": { + "w": 16.0, + "l": 0.39, + "nf": 32 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 2e-05 + } + }, + "load": { + "RL": 20000.0, + "CL": 5e-12, + "vamp": 0.02, + "vout_target": 0.6, + "vin_center": 0.36, + "servo_slope": 200.0, + "options": ".option method=gear reltol=1e-3", + "vout_amp": 0.1 + }, + "category": "buffer_ab", + "notes": [ + "first-pass sizing v1", + "RL/CL returned to an ideal mid-supply source; open-loop output-swing metric added" + ], + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.39, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 32.0, + "l0": 0.26, + "nf0": 64, + "uw0": 0.5, + "w": 16.0, + "l": 0.39, + "nf": 32, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "08b310978ed647bb", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M2", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo (freezable)" + }, + { + "kind": "testbench_element", + "what": "mid-supply load return" + }, + { + "kind": "testbench_element", + "what": "load resistor and capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW0.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW0.5_sL1.5/manifest.json new file mode 100644 index 00000000..19994086 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW0.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "0548d1b42d16f94d7d192be12361804ae3931e2f31dbb2a5944573c6be45ce63", + "qualification.json": "53cdea33db75976fc2f9c6f37c6478b7fabf88989c3ceac784bf0e6776765761", + "specs.json": "52818eb57b58522e8a51180339cc386aac2e2157195894d8a671fa02e5110a0a", + "target.spice": "e2ec0a0600165b608934641e4fd9461cb73bf12e05eddbb7503a06c46a7d1b36", + "target_lvs.spice": "f6a1d7dff8734ad571a78fe748a29f65f41f0fe803be5677f176d1eb5f022832", + "testbench.spice": "82c182f67353f33c89bdb22c227e0b4ee35fd8e9de906f275db34e23b45de4e7" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW0.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW0.5_sL1.5/qualification.json new file mode 100644 index 00000000..c746215e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW0.5_sL1.5/qualification.json @@ -0,0 +1,153 @@ +{ + "case_id": "C18_ihp130_sW0.5_sL1.5", + "circuit_id": "C18", + "pdk": "ihp130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "buffer_ab", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.39, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 32.0, + "l0": 0.26, + "nf0": 64, + "uw0": 0.5, + "w": 16.0, + "l": 0.39, + "nf": 32, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "08b310978ed647bb", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "thd_pct=40.33 above floor 3", + "out_swing=0 below floor 0.3" + ], + "spec": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 20120000.0 + }, + "out_swing": { + "min": 0.3 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 40.3251, + "iq": 4.742868e-05, + "f3db": 33525560.0, + "out_swing": 0.0 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.3 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 23.8, + "schematic_measures": { + "vout0": 0.6118055, + "vin0": 0.8511827, + "iq": 4.742868e-05, + "gain_lf": -27.96005, + "f3db": 33525560.0, + "gmid": 0.0399938, + "vo_a": 0.6068152, + "vo_b": 0.6068152, + "out_swing": 0.0, + "vamp2": 0.3, + "thd_pct": 40.3251 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW0.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW0.5_sL1.5/specs.json new file mode 100644 index 00000000..8f16ae43 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW0.5_sL1.5/specs.json @@ -0,0 +1,37 @@ +{ + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 20120000.0 + }, + "out_swing": { + "min": 0.3 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 40.3251, + "iq": 4.742868e-05, + "f3db": 33525560.0, + "out_swing": 0.0 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.3 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW0.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW0.5_sL1.5/target.spice new file mode 100644 index 00000000..3d9f1653 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW0.5_sL1.5/target.spice @@ -0,0 +1,8 @@ +.subckt C18_ihp130_sW0.5_sL1.5 VDD VSS VIN1 VOUT1 VB1 +XM1 net13 VIN1 VSS VSS sg13_lv_nmos w=1u l=0.39u ng=2 m=1 +XM2 net9 VB1 VDD VDD sg13_lv_pmos w=2u l=0.39u ng=4 m=1 +XM3 net9 net9 net22 VSS sg13_lv_nmos w=4u l=0.39u ng=8 m=1 +XM4 net13 net13 net22 VDD sg13_lv_pmos w=8u l=0.39u ng=16 m=1 +XM5 VDD net9 VOUT1 VSS sg13_lv_nmos w=8u l=0.39u ng=16 m=1 +XM6 VSS net13 VOUT1 VDD sg13_lv_pmos w=16u l=0.39u ng=32 m=1 +.ends C18_ihp130_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW0.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW0.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..dc5cceb9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW0.5_sL1.5/target_lvs.spice @@ -0,0 +1,80 @@ +.subckt C18_ihp130_sW0.5_sL1.5 VDD VSS VIN1 VOUT1 VB1 +XM1_f0 net13 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f1 net13 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f0 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f1 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f2 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f3 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM3_f0 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f1 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f2 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f3 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f4 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f5 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f6 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f7 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f0 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f1 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f2 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f3 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f4 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f5 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f6 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f7 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f8 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f9 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f10 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f11 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f12 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f13 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f14 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f15 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f0 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f1 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f2 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f3 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f4 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f5 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f6 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f7 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f8 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f9 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f10 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f11 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f12 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f13 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f14 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f15 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM6_f0 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f1 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f2 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f3 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f4 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f5 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f6 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f7 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f8 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f9 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f10 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f11 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f12 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f13 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f14 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f15 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f16 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f17 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f18 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f19 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f20 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f21 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f22 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f23 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f24 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f25 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f26 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f27 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f28 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f29 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f30 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f31 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +.ends C18_ihp130_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW0.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW0.5_sL1.5/testbench.spice new file mode 100644 index 00000000..c54aad68 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW0.5_sL1.5/testbench.spice @@ -0,0 +1,58 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C18_ihp130_sW0.5_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +XB_VB1 VB1 VB1 VDDB VDDB sg13_lv_pmos w=2u l=0.39u +IB_VB1 VB1 VSS 2e-05 +* DC servo (disclosed test auxiliary): VINT -> input DC level that makes V_out = VT; frozen at VHOLD when KSW = 1 +VT VT 0 0.6 +VMID VMID 0 0.6 +VKSW KSW 0 0 +VHOLD VHOLD 0 0 +BSRV VSRV 0 V = (1-v(KSW))*(0.36 + 0.5*tanh(200*(v(VOUT1)-v(VT)))) + v(KSW)*v(VHOLD) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EIN VIN1 VINT VAC 0 1 +VAC VAC 0 dc 0 ac 1 sin(0 1m 1meg) +RL VOUT1 VMID 20000 +CL VOUT1 VMID 5e-12 +.option method=gear reltol=1e-3 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let iq = -i(VDD) +print vout0 vin0 iq +set vin0_s = "$&vin0" +ac dec 20 10 10G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +set gain_s = "$&gain_lf" +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +* open-loop DC transfer around the operating point (servo frozen at the input level it found) +alter @VHOLD[dc] = $vin0_s +alter @VKSW[dc] = 1 +dc VAC -0.4 0.4 0.001 +let gin = abs(deriv(v(VOUT1))) +meas dc gmid find gin at=0 +let gn = gin/gmid +meas dc vo_a find v(VOUT1) when gn=0.5 cross=1 +meas dc vo_b find v(VOUT1) when gn=0.5 cross=last +let out_swing = abs(vo_b - vo_a) +print out_swing +* distortion at a fixed OUTPUT amplitude of 0.1 V (servo frozen, input amplitude = amplitude / |gain|) +alter @VKSW[dc] = 0 +let a_lin = 10^($gain_s/20) +let vamp2 = 0.1/a_lin +if vamp2 > 0.3 + let vamp2 = 0.3 +end +print vamp2 +alter @VAC[sin] = [ 0 $&vamp2 1meg ] +tran 2n 6u 3u +fourier 1meg v(VOUT1) +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW0.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW0.5_sL1/case.json new file mode 100644 index 00000000..8e491b65 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW0.5_sL1/case.json @@ -0,0 +1,185 @@ +{ + "case_id": "C18_ihp130_sW0.5_sL1", + "circuit_id": "C18", + "pdk": "ihp130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "dut_name": "C18_ihp130_sW0.5_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 1.0, + "l": 0.26, + "nf": 2 + }, + "M2": { + "w": 2.0, + "l": 0.26, + "nf": 4 + }, + "M3": { + "w": 4.0, + "l": 0.26, + "nf": 8 + }, + "M4": { + "w": 8.0, + "l": 0.26, + "nf": 16 + }, + "M5": { + "w": 8.0, + "l": 0.26, + "nf": 16 + }, + "M6": { + "w": 16.0, + "l": 0.26, + "nf": 32 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 2e-05 + } + }, + "load": { + "RL": 20000.0, + "CL": 5e-12, + "vamp": 0.02, + "vout_target": 0.6, + "vin_center": 0.36, + "servo_slope": 200.0, + "options": ".option method=gear reltol=1e-3", + "vout_amp": 0.1 + }, + "category": "buffer_ab", + "notes": [ + "first-pass sizing v1", + "RL/CL returned to an ideal mid-supply source; open-loop output-swing metric added" + ], + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.26, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.26, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.26, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.26, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 32.0, + "l0": 0.26, + "nf0": 64, + "uw0": 0.5, + "w": 16.0, + "l": 0.26, + "nf": 32, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "28b505f9731bf2c0", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M2", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo (freezable)" + }, + { + "kind": "testbench_element", + "what": "mid-supply load return" + }, + { + "kind": "testbench_element", + "what": "load resistor and capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW0.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW0.5_sL1/manifest.json new file mode 100644 index 00000000..d1dba261 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW0.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "eac5a0019fddb687c032f09475aae9c99928a2e38e5feaf7d9f04a90e052c090", + "qualification.json": "36bd2e767795f113fa567fa8f80d4179d4ce32f9d6146ab6b2f4b0255e592b92", + "specs.json": "d2cd153a19eca2e5bdd657dc93c0a561985d2206bf2111b57a8cc80942490d09", + "target.spice": "88a5a8bf1a3f27462706afba32d6f395729fa455f357edff080f9b4767220c6e", + "target_lvs.spice": "9446cba31931b8b58336716200a75176b81049a8812fda9f95fef1c1e0c0f02a", + "testbench.spice": "27e26fdfd7834b434dae69fdc84c0643f6906ad7384bf0292b2073089a7f3211" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW0.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW0.5_sL1/qualification.json new file mode 100644 index 00000000..6aa7645b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW0.5_sL1/qualification.json @@ -0,0 +1,153 @@ +{ + "case_id": "C18_ihp130_sW0.5_sL1", + "circuit_id": "C18", + "pdk": "ihp130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "buffer_ab", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.26, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.26, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.26, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.26, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 32.0, + "l0": 0.26, + "nf0": 64, + "uw0": 0.5, + "w": 16.0, + "l": 0.26, + "nf": 32, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "28b505f9731bf2c0", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "thd_pct=54.68 above floor 3", + "out_swing=0 below floor 0.3" + ], + "spec": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 21840000.0 + }, + "out_swing": { + "min": 0.3 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 54.6817, + "iq": 4.628699e-05, + "f3db": 36399540.0, + "out_swing": 0.0 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.3 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 74.6, + "schematic_measures": { + "vout0": 0.6043479, + "vin0": 0.7105812, + "iq": 4.628699e-05, + "gain_lf": -21.08209, + "f3db": 36399540.0, + "gmid": 0.08828463, + "vo_a": 0.5972281, + "vo_b": 0.5972281, + "out_swing": 0.0, + "vamp2": 0.3, + "thd_pct": 54.6817 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW0.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW0.5_sL1/specs.json new file mode 100644 index 00000000..8f742fb5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW0.5_sL1/specs.json @@ -0,0 +1,37 @@ +{ + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 21840000.0 + }, + "out_swing": { + "min": 0.3 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 54.6817, + "iq": 4.628699e-05, + "f3db": 36399540.0, + "out_swing": 0.0 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.3 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW0.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW0.5_sL1/target.spice new file mode 100644 index 00000000..ff201b4e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW0.5_sL1/target.spice @@ -0,0 +1,8 @@ +.subckt C18_ihp130_sW0.5_sL1 VDD VSS VIN1 VOUT1 VB1 +XM1 net13 VIN1 VSS VSS sg13_lv_nmos w=1u l=0.26u ng=2 m=1 +XM2 net9 VB1 VDD VDD sg13_lv_pmos w=2u l=0.26u ng=4 m=1 +XM3 net9 net9 net22 VSS sg13_lv_nmos w=4u l=0.26u ng=8 m=1 +XM4 net13 net13 net22 VDD sg13_lv_pmos w=8u l=0.26u ng=16 m=1 +XM5 VDD net9 VOUT1 VSS sg13_lv_nmos w=8u l=0.26u ng=16 m=1 +XM6 VSS net13 VOUT1 VDD sg13_lv_pmos w=16u l=0.26u ng=32 m=1 +.ends C18_ihp130_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW0.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW0.5_sL1/target_lvs.spice new file mode 100644 index 00000000..9368741b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW0.5_sL1/target_lvs.spice @@ -0,0 +1,80 @@ +.subckt C18_ihp130_sW0.5_sL1 VDD VSS VIN1 VOUT1 VB1 +XM1_f0 net13 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f1 net13 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f0 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f1 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f2 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f3 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM3_f0 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f1 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f2 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f3 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f4 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f5 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f6 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f7 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f0 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f1 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f2 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f3 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f4 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f5 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f6 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f7 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f8 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f9 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f10 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f11 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f12 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f13 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f14 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f15 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f0 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f1 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f2 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f3 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f4 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f5 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f6 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f7 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f8 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f9 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f10 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f11 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f12 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f13 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f14 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f15 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM6_f0 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f1 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f2 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f3 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f4 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f5 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f6 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f7 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f8 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f9 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f10 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f11 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f12 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f13 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f14 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f15 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f16 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f17 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f18 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f19 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f20 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f21 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f22 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f23 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f24 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f25 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f26 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f27 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f28 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f29 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f30 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f31 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +.ends C18_ihp130_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW0.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW0.5_sL1/testbench.spice new file mode 100644 index 00000000..3d5d1b83 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW0.5_sL1/testbench.spice @@ -0,0 +1,58 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C18_ihp130_sW0.5_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +XB_VB1 VB1 VB1 VDDB VDDB sg13_lv_pmos w=2u l=0.26u +IB_VB1 VB1 VSS 2e-05 +* DC servo (disclosed test auxiliary): VINT -> input DC level that makes V_out = VT; frozen at VHOLD when KSW = 1 +VT VT 0 0.6 +VMID VMID 0 0.6 +VKSW KSW 0 0 +VHOLD VHOLD 0 0 +BSRV VSRV 0 V = (1-v(KSW))*(0.36 + 0.5*tanh(200*(v(VOUT1)-v(VT)))) + v(KSW)*v(VHOLD) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EIN VIN1 VINT VAC 0 1 +VAC VAC 0 dc 0 ac 1 sin(0 1m 1meg) +RL VOUT1 VMID 20000 +CL VOUT1 VMID 5e-12 +.option method=gear reltol=1e-3 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let iq = -i(VDD) +print vout0 vin0 iq +set vin0_s = "$&vin0" +ac dec 20 10 10G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +set gain_s = "$&gain_lf" +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +* open-loop DC transfer around the operating point (servo frozen at the input level it found) +alter @VHOLD[dc] = $vin0_s +alter @VKSW[dc] = 1 +dc VAC -0.4 0.4 0.001 +let gin = abs(deriv(v(VOUT1))) +meas dc gmid find gin at=0 +let gn = gin/gmid +meas dc vo_a find v(VOUT1) when gn=0.5 cross=1 +meas dc vo_b find v(VOUT1) when gn=0.5 cross=last +let out_swing = abs(vo_b - vo_a) +print out_swing +* distortion at a fixed OUTPUT amplitude of 0.1 V (servo frozen, input amplitude = amplitude / |gain|) +alter @VKSW[dc] = 0 +let a_lin = 10^($gain_s/20) +let vamp2 = 0.1/a_lin +if vamp2 > 0.3 + let vamp2 = 0.3 +end +print vamp2 +alter @VAC[sin] = [ 0 $&vamp2 1meg ] +tran 2n 6u 3u +fourier 1meg v(VOUT1) +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW0.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW0.5_sL2/case.json new file mode 100644 index 00000000..0b88b6f9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW0.5_sL2/case.json @@ -0,0 +1,185 @@ +{ + "case_id": "C18_ihp130_sW0.5_sL2", + "circuit_id": "C18", + "pdk": "ihp130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "dut_name": "C18_ihp130_sW0.5_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 1.0, + "l": 0.52, + "nf": 2 + }, + "M2": { + "w": 2.0, + "l": 0.52, + "nf": 4 + }, + "M3": { + "w": 4.0, + "l": 0.52, + "nf": 8 + }, + "M4": { + "w": 8.0, + "l": 0.52, + "nf": 16 + }, + "M5": { + "w": 8.0, + "l": 0.52, + "nf": 16 + }, + "M6": { + "w": 16.0, + "l": 0.52, + "nf": 32 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 2e-05 + } + }, + "load": { + "RL": 20000.0, + "CL": 5e-12, + "vamp": 0.02, + "vout_target": 0.6, + "vin_center": 0.36, + "servo_slope": 200.0, + "options": ".option method=gear reltol=1e-3", + "vout_amp": 0.1 + }, + "category": "buffer_ab", + "notes": [ + "first-pass sizing v1", + "RL/CL returned to an ideal mid-supply source; open-loop output-swing metric added" + ], + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.52, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 32.0, + "l0": 0.26, + "nf0": 64, + "uw0": 0.5, + "w": 16.0, + "l": 0.52, + "nf": 32, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "97e6c10759926681", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M2", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo (freezable)" + }, + { + "kind": "testbench_element", + "what": "mid-supply load return" + }, + { + "kind": "testbench_element", + "what": "load resistor and capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW0.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW0.5_sL2/manifest.json new file mode 100644 index 00000000..96edc13f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW0.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "e0d37b476638441a4c56f8a9457b7573c81981e51f9eb0297cbeb79c87410c7f", + "qualification.json": "bb0eeb721e3883a2c42898a4582e64dcf123aeaa6badce4cc93b23834b742cb7", + "specs.json": "e8421b7e3b586325f6b5582d0477885a1a176bc73b6fda3f5a610be9a044ae2e", + "target.spice": "1a3eb5518e484ae1746d56943c41a2025312f7a3875649939eaf2a1402f64cdc", + "target_lvs.spice": "1fcc126db51b0525716c844cade07acadca3cc532b4bd9dd50b2dd12eac71d84", + "testbench.spice": "7101dfee19948a3d95355802e142f55abf0a2623b1a859c37d8c9b2a52700ddd" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW0.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW0.5_sL2/qualification.json new file mode 100644 index 00000000..02bbccf0 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW0.5_sL2/qualification.json @@ -0,0 +1,153 @@ +{ + "case_id": "C18_ihp130_sW0.5_sL2", + "circuit_id": "C18", + "pdk": "ihp130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "buffer_ab", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.52, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 32.0, + "l0": 0.26, + "nf0": 64, + "uw0": 0.5, + "w": 16.0, + "l": 0.52, + "nf": 32, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "97e6c10759926681", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "thd_pct=36.63 above floor 3", + "out_swing=0 below floor 0.3" + ], + "spec": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 17850000.0 + }, + "out_swing": { + "min": 0.3 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 36.632, + "iq": 4.446401e-05, + "f3db": 29750080.0, + "out_swing": 0.0 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.3 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 9.0, + "schematic_measures": { + "vout0": 0.6217032, + "vin0": 0.8598303, + "iq": 4.446401e-05, + "gain_lf": -28.082, + "f3db": 29750080.0, + "gmid": 0.03943634, + "vo_a": 0.6164709, + "vo_b": 0.6164709, + "out_swing": 0.0, + "vamp2": 0.3, + "thd_pct": 36.632 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW0.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW0.5_sL2/specs.json new file mode 100644 index 00000000..6ac82a41 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW0.5_sL2/specs.json @@ -0,0 +1,37 @@ +{ + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 17850000.0 + }, + "out_swing": { + "min": 0.3 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 36.632, + "iq": 4.446401e-05, + "f3db": 29750080.0, + "out_swing": 0.0 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.3 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW0.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW0.5_sL2/target.spice new file mode 100644 index 00000000..a8d3e0d8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW0.5_sL2/target.spice @@ -0,0 +1,8 @@ +.subckt C18_ihp130_sW0.5_sL2 VDD VSS VIN1 VOUT1 VB1 +XM1 net13 VIN1 VSS VSS sg13_lv_nmos w=1u l=0.52u ng=2 m=1 +XM2 net9 VB1 VDD VDD sg13_lv_pmos w=2u l=0.52u ng=4 m=1 +XM3 net9 net9 net22 VSS sg13_lv_nmos w=4u l=0.52u ng=8 m=1 +XM4 net13 net13 net22 VDD sg13_lv_pmos w=8u l=0.52u ng=16 m=1 +XM5 VDD net9 VOUT1 VSS sg13_lv_nmos w=8u l=0.52u ng=16 m=1 +XM6 VSS net13 VOUT1 VDD sg13_lv_pmos w=16u l=0.52u ng=32 m=1 +.ends C18_ihp130_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW0.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW0.5_sL2/target_lvs.spice new file mode 100644 index 00000000..41d135b5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW0.5_sL2/target_lvs.spice @@ -0,0 +1,80 @@ +.subckt C18_ihp130_sW0.5_sL2 VDD VSS VIN1 VOUT1 VB1 +XM1_f0 net13 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f1 net13 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f0 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f1 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f2 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f3 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM3_f0 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f1 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f2 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f3 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f4 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f5 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f6 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f7 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f0 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f1 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f2 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f3 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f4 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f5 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f6 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f7 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f8 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f9 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f10 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f11 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f12 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f13 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f14 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f15 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f0 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f1 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f2 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f3 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f4 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f5 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f6 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f7 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f8 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f9 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f10 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f11 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f12 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f13 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f14 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f15 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM6_f0 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f1 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f2 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f3 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f4 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f5 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f6 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f7 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f8 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f9 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f10 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f11 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f12 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f13 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f14 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f15 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f16 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f17 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f18 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f19 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f20 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f21 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f22 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f23 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f24 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f25 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f26 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f27 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f28 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f29 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f30 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f31 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +.ends C18_ihp130_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW0.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW0.5_sL2/testbench.spice new file mode 100644 index 00000000..20686377 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW0.5_sL2/testbench.spice @@ -0,0 +1,58 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C18_ihp130_sW0.5_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +XB_VB1 VB1 VB1 VDDB VDDB sg13_lv_pmos w=2u l=0.52u +IB_VB1 VB1 VSS 2e-05 +* DC servo (disclosed test auxiliary): VINT -> input DC level that makes V_out = VT; frozen at VHOLD when KSW = 1 +VT VT 0 0.6 +VMID VMID 0 0.6 +VKSW KSW 0 0 +VHOLD VHOLD 0 0 +BSRV VSRV 0 V = (1-v(KSW))*(0.36 + 0.5*tanh(200*(v(VOUT1)-v(VT)))) + v(KSW)*v(VHOLD) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EIN VIN1 VINT VAC 0 1 +VAC VAC 0 dc 0 ac 1 sin(0 1m 1meg) +RL VOUT1 VMID 20000 +CL VOUT1 VMID 5e-12 +.option method=gear reltol=1e-3 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let iq = -i(VDD) +print vout0 vin0 iq +set vin0_s = "$&vin0" +ac dec 20 10 10G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +set gain_s = "$&gain_lf" +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +* open-loop DC transfer around the operating point (servo frozen at the input level it found) +alter @VHOLD[dc] = $vin0_s +alter @VKSW[dc] = 1 +dc VAC -0.4 0.4 0.001 +let gin = abs(deriv(v(VOUT1))) +meas dc gmid find gin at=0 +let gn = gin/gmid +meas dc vo_a find v(VOUT1) when gn=0.5 cross=1 +meas dc vo_b find v(VOUT1) when gn=0.5 cross=last +let out_swing = abs(vo_b - vo_a) +print out_swing +* distortion at a fixed OUTPUT amplitude of 0.1 V (servo frozen, input amplitude = amplitude / |gain|) +alter @VKSW[dc] = 0 +let a_lin = 10^($gain_s/20) +let vamp2 = 0.1/a_lin +if vamp2 > 0.3 + let vamp2 = 0.3 +end +print vamp2 +alter @VAC[sin] = [ 0 $&vamp2 1meg ] +tran 2n 6u 3u +fourier 1meg v(VOUT1) +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1.5_sL1.5/case.json new file mode 100644 index 00000000..f9f09bdb --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1.5_sL1.5/case.json @@ -0,0 +1,185 @@ +{ + "case_id": "C18_ihp130_sW1.5_sL1.5", + "circuit_id": "C18", + "pdk": "ihp130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "dut_name": "C18_ihp130_sW1.5_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 3.0, + "l": 0.39, + "nf": 6 + }, + "M2": { + "w": 6.0, + "l": 0.39, + "nf": 12 + }, + "M3": { + "w": 12.0, + "l": 0.39, + "nf": 24 + }, + "M4": { + "w": 24.0, + "l": 0.39, + "nf": 48 + }, + "M5": { + "w": 24.0, + "l": 0.39, + "nf": 48 + }, + "M6": { + "w": 48.0, + "l": 0.39, + "nf": 96 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 2e-05 + } + }, + "load": { + "RL": 20000.0, + "CL": 5e-12, + "vamp": 0.02, + "vout_target": 0.6, + "vin_center": 0.36, + "servo_slope": 200.0, + "options": ".option method=gear reltol=1e-3", + "vout_amp": 0.1 + }, + "category": "buffer_ab", + "notes": [ + "first-pass sizing v1", + "RL/CL returned to an ideal mid-supply source; open-loop output-swing metric added" + ], + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.39, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.39, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 12.0, + "l": 0.39, + "nf": 24, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.39, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.39, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 32.0, + "l0": 0.26, + "nf0": 64, + "uw0": 0.5, + "w": 48.0, + "l": 0.39, + "nf": 96, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "73e69a61ee8d4e8d", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M2", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo (freezable)" + }, + { + "kind": "testbench_element", + "what": "mid-supply load return" + }, + { + "kind": "testbench_element", + "what": "load resistor and capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1.5_sL1.5/manifest.json new file mode 100644 index 00000000..fc73773d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "005dcb7e1c524bd15fa234020b35741e0d7e8298ffd5bc214448b71449601a3b", + "qualification.json": "f4a6b6ef14c2e848132fcfe527bf33bd9d9cc5163afe0ad513dee83645c94f77", + "specs.json": "6506bc7b41d3592d2fabc3967bd2d28d782c8e5749174311ae83fd33a50aa5c9", + "target.spice": "da355dbfd5eb3d65a6ab0c66d63eadc87abebf4dc0cb631b399dde07f2fee16c", + "target_lvs.spice": "56a368858abfaf6a8fe8f953f3333f5aa107d3731489afa1208090d8c4adbbdd", + "testbench.spice": "7be44a40150981d541b992f02bfa67c6bf065e62b8baa65ea413e445f86ea24f" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1.5_sL1.5/qualification.json new file mode 100644 index 00000000..d9e5e148 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1.5_sL1.5/qualification.json @@ -0,0 +1,153 @@ +{ + "case_id": "C18_ihp130_sW1.5_sL1.5", + "circuit_id": "C18", + "pdk": "ihp130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "buffer_ab", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.39, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.39, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 12.0, + "l": 0.39, + "nf": 24, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.39, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.39, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 32.0, + "l0": 0.26, + "nf0": 64, + "uw0": 0.5, + "w": 48.0, + "l": 0.39, + "nf": 96, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "73e69a61ee8d4e8d", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "thd_pct=31.37 above floor 3", + "out_swing=0.228 below floor 0.3" + ], + "spec": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 36530000.0 + }, + "out_swing": { + "min": 0.3 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 31.3697, + "iq": 6.579642e-05, + "f3db": 60880530.0, + "out_swing": 0.2279786 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.3 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 64.7, + "schematic_measures": { + "vout0": 0.6012279, + "vin0": 0.4803811, + "iq": 6.579642e-05, + "gain_lf": -3.507436, + "f3db": 60880530.0, + "gmid": 0.6679019, + "vo_a": 0.81337, + "vo_b": 0.5853914, + "out_swing": 0.2279786, + "vamp2": 0.1497518, + "thd_pct": 31.3697 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1.5_sL1.5/specs.json new file mode 100644 index 00000000..faa20db0 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1.5_sL1.5/specs.json @@ -0,0 +1,37 @@ +{ + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 36530000.0 + }, + "out_swing": { + "min": 0.3 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 31.3697, + "iq": 6.579642e-05, + "f3db": 60880530.0, + "out_swing": 0.2279786 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.3 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1.5_sL1.5/target.spice new file mode 100644 index 00000000..30df51f2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1.5_sL1.5/target.spice @@ -0,0 +1,8 @@ +.subckt C18_ihp130_sW1.5_sL1.5 VDD VSS VIN1 VOUT1 VB1 +XM1 net13 VIN1 VSS VSS sg13_lv_nmos w=3u l=0.39u ng=6 m=1 +XM2 net9 VB1 VDD VDD sg13_lv_pmos w=6u l=0.39u ng=12 m=1 +XM3 net9 net9 net22 VSS sg13_lv_nmos w=12u l=0.39u ng=24 m=1 +XM4 net13 net13 net22 VDD sg13_lv_pmos w=24u l=0.39u ng=48 m=1 +XM5 VDD net9 VOUT1 VSS sg13_lv_nmos w=24u l=0.39u ng=48 m=1 +XM6 VSS net13 VOUT1 VDD sg13_lv_pmos w=48u l=0.39u ng=96 m=1 +.ends C18_ihp130_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..9c83cf61 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1.5_sL1.5/target_lvs.spice @@ -0,0 +1,236 @@ +.subckt C18_ihp130_sW1.5_sL1.5 VDD VSS VIN1 VOUT1 VB1 +XM1_f0 net13 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f1 net13 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f2 net13 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f3 net13 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f4 net13 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f5 net13 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f0 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f1 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f2 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f3 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f4 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f5 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f6 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f7 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f8 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f9 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f10 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f11 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM3_f0 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f1 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f2 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f3 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f4 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f5 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f6 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f7 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f8 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f9 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f10 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f11 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f12 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f13 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f14 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f15 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f16 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f17 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f18 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f19 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f20 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f21 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f22 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f23 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f0 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f1 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f2 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f3 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f4 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f5 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f6 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f7 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f8 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f9 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f10 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f11 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f12 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f13 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f14 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f15 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f16 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f17 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f18 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f19 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f20 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f21 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f22 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f23 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f24 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f25 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f26 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f27 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f28 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f29 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f30 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f31 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f32 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f33 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f34 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f35 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f36 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f37 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f38 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f39 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f40 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f41 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f42 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f43 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f44 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f45 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f46 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f47 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f0 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f1 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f2 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f3 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f4 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f5 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f6 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f7 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f8 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f9 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f10 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f11 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f12 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f13 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f14 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f15 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f16 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f17 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f18 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f19 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f20 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f21 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f22 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f23 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f24 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f25 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f26 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f27 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f28 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f29 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f30 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f31 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f32 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f33 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f34 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f35 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f36 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f37 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f38 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f39 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f40 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f41 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f42 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f43 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f44 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f45 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f46 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f47 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM6_f0 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f1 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f2 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f3 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f4 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f5 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f6 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f7 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f8 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f9 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f10 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f11 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f12 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f13 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f14 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f15 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f16 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f17 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f18 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f19 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f20 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f21 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f22 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f23 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f24 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f25 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f26 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f27 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f28 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f29 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f30 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f31 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f32 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f33 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f34 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f35 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f36 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f37 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f38 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f39 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f40 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f41 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f42 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f43 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f44 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f45 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f46 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f47 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f48 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f49 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f50 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f51 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f52 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f53 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f54 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f55 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f56 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f57 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f58 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f59 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f60 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f61 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f62 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f63 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f64 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f65 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f66 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f67 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f68 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f69 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f70 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f71 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f72 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f73 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f74 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f75 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f76 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f77 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f78 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f79 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f80 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f81 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f82 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f83 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f84 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f85 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f86 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f87 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f88 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f89 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f90 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f91 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f92 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f93 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f94 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f95 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +.ends C18_ihp130_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1.5_sL1.5/testbench.spice new file mode 100644 index 00000000..ca293340 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1.5_sL1.5/testbench.spice @@ -0,0 +1,58 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C18_ihp130_sW1.5_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +XB_VB1 VB1 VB1 VDDB VDDB sg13_lv_pmos w=6u l=0.39u +IB_VB1 VB1 VSS 2e-05 +* DC servo (disclosed test auxiliary): VINT -> input DC level that makes V_out = VT; frozen at VHOLD when KSW = 1 +VT VT 0 0.6 +VMID VMID 0 0.6 +VKSW KSW 0 0 +VHOLD VHOLD 0 0 +BSRV VSRV 0 V = (1-v(KSW))*(0.36 + 0.5*tanh(200*(v(VOUT1)-v(VT)))) + v(KSW)*v(VHOLD) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EIN VIN1 VINT VAC 0 1 +VAC VAC 0 dc 0 ac 1 sin(0 1m 1meg) +RL VOUT1 VMID 20000 +CL VOUT1 VMID 5e-12 +.option method=gear reltol=1e-3 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let iq = -i(VDD) +print vout0 vin0 iq +set vin0_s = "$&vin0" +ac dec 20 10 10G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +set gain_s = "$&gain_lf" +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +* open-loop DC transfer around the operating point (servo frozen at the input level it found) +alter @VHOLD[dc] = $vin0_s +alter @VKSW[dc] = 1 +dc VAC -0.4 0.4 0.001 +let gin = abs(deriv(v(VOUT1))) +meas dc gmid find gin at=0 +let gn = gin/gmid +meas dc vo_a find v(VOUT1) when gn=0.5 cross=1 +meas dc vo_b find v(VOUT1) when gn=0.5 cross=last +let out_swing = abs(vo_b - vo_a) +print out_swing +* distortion at a fixed OUTPUT amplitude of 0.1 V (servo frozen, input amplitude = amplitude / |gain|) +alter @VKSW[dc] = 0 +let a_lin = 10^($gain_s/20) +let vamp2 = 0.1/a_lin +if vamp2 > 0.3 + let vamp2 = 0.3 +end +print vamp2 +alter @VAC[sin] = [ 0 $&vamp2 1meg ] +tran 2n 6u 3u +fourier 1meg v(VOUT1) +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1.5_sL1/case.json new file mode 100644 index 00000000..1c2a730a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1.5_sL1/case.json @@ -0,0 +1,185 @@ +{ + "case_id": "C18_ihp130_sW1.5_sL1", + "circuit_id": "C18", + "pdk": "ihp130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "dut_name": "C18_ihp130_sW1.5_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 3.0, + "l": 0.26, + "nf": 6 + }, + "M2": { + "w": 6.0, + "l": 0.26, + "nf": 12 + }, + "M3": { + "w": 12.0, + "l": 0.26, + "nf": 24 + }, + "M4": { + "w": 24.0, + "l": 0.26, + "nf": 48 + }, + "M5": { + "w": 24.0, + "l": 0.26, + "nf": 48 + }, + "M6": { + "w": 48.0, + "l": 0.26, + "nf": 96 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 2e-05 + } + }, + "load": { + "RL": 20000.0, + "CL": 5e-12, + "vamp": 0.02, + "vout_target": 0.6, + "vin_center": 0.36, + "servo_slope": 200.0, + "options": ".option method=gear reltol=1e-3", + "vout_amp": 0.1 + }, + "category": "buffer_ab", + "notes": [ + "first-pass sizing v1", + "RL/CL returned to an ideal mid-supply source; open-loop output-swing metric added" + ], + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.26, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.26, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 12.0, + "l": 0.26, + "nf": 24, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.26, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.26, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 32.0, + "l0": 0.26, + "nf0": 64, + "uw0": 0.5, + "w": 48.0, + "l": 0.26, + "nf": 96, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "c8f9c93822d7cdeb", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M2", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo (freezable)" + }, + { + "kind": "testbench_element", + "what": "mid-supply load return" + }, + { + "kind": "testbench_element", + "what": "load resistor and capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1.5_sL1/manifest.json new file mode 100644 index 00000000..c13d4aef --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "b8452648b22ea208b8f0c2afefe9f88e4d19c1cdc5d145ffc64747fa50c12011", + "qualification.json": "f431ae24f16a8fc6744bf5c5dda4b2a29b9fcc3762339052ad62c3878990d131", + "specs.json": "eaab86f1a7a857a6aae8151dcf69b292162dc480bbec9b524632918c30a01482", + "target.spice": "d85b0cb0e5635d4f20448496728c8f28847898ebd326a5256c3601e04af237bf", + "target_lvs.spice": "125e5f86063b8ab871195cb54e4e11dbafa8584e72aa3aca1d3880af3d7afb07", + "testbench.spice": "4cf0838d82fe31b95ce97c6416e892c5744fc0e2f5cdfd30754892edb87f1bc4" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1.5_sL1/qualification.json new file mode 100644 index 00000000..966b9674 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1.5_sL1/qualification.json @@ -0,0 +1,153 @@ +{ + "case_id": "C18_ihp130_sW1.5_sL1", + "circuit_id": "C18", + "pdk": "ihp130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "buffer_ab", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.26, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.26, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 12.0, + "l": 0.26, + "nf": 24, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.26, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.26, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 32.0, + "l0": 0.26, + "nf0": 64, + "uw0": 0.5, + "w": 48.0, + "l": 0.26, + "nf": 96, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "c8f9c93822d7cdeb", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "thd_pct=25.63 above floor 3", + "out_swing=0.1936 below floor 0.3" + ], + "spec": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 35820000.0 + }, + "out_swing": { + "min": 0.3 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 25.6333, + "iq": 6.034971e-05, + "f3db": 59696350.0, + "out_swing": 0.1936459 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.3 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 88.5, + "schematic_measures": { + "vout0": 0.6011689, + "vin0": 0.474809, + "iq": 6.034971e-05, + "gain_lf": 2.389674, + "f3db": 59696350.0, + "gmid": 1.317209, + "vo_a": 0.7765116, + "vo_b": 0.5828657, + "out_swing": 0.1936459, + "vamp2": 0.07594803, + "thd_pct": 25.6333 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1.5_sL1/specs.json new file mode 100644 index 00000000..eda9793d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1.5_sL1/specs.json @@ -0,0 +1,37 @@ +{ + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 35820000.0 + }, + "out_swing": { + "min": 0.3 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 25.6333, + "iq": 6.034971e-05, + "f3db": 59696350.0, + "out_swing": 0.1936459 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.3 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1.5_sL1/target.spice new file mode 100644 index 00000000..1b0542bf --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1.5_sL1/target.spice @@ -0,0 +1,8 @@ +.subckt C18_ihp130_sW1.5_sL1 VDD VSS VIN1 VOUT1 VB1 +XM1 net13 VIN1 VSS VSS sg13_lv_nmos w=3u l=0.26u ng=6 m=1 +XM2 net9 VB1 VDD VDD sg13_lv_pmos w=6u l=0.26u ng=12 m=1 +XM3 net9 net9 net22 VSS sg13_lv_nmos w=12u l=0.26u ng=24 m=1 +XM4 net13 net13 net22 VDD sg13_lv_pmos w=24u l=0.26u ng=48 m=1 +XM5 VDD net9 VOUT1 VSS sg13_lv_nmos w=24u l=0.26u ng=48 m=1 +XM6 VSS net13 VOUT1 VDD sg13_lv_pmos w=48u l=0.26u ng=96 m=1 +.ends C18_ihp130_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1.5_sL1/target_lvs.spice new file mode 100644 index 00000000..93d7e9ff --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1.5_sL1/target_lvs.spice @@ -0,0 +1,236 @@ +.subckt C18_ihp130_sW1.5_sL1 VDD VSS VIN1 VOUT1 VB1 +XM1_f0 net13 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f1 net13 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f2 net13 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f3 net13 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f4 net13 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f5 net13 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f0 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f1 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f2 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f3 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f4 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f5 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f6 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f7 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f8 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f9 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f10 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f11 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM3_f0 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f1 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f2 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f3 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f4 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f5 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f6 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f7 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f8 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f9 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f10 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f11 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f12 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f13 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f14 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f15 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f16 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f17 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f18 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f19 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f20 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f21 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f22 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f23 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f0 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f1 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f2 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f3 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f4 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f5 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f6 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f7 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f8 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f9 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f10 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f11 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f12 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f13 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f14 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f15 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f16 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f17 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f18 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f19 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f20 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f21 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f22 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f23 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f24 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f25 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f26 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f27 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f28 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f29 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f30 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f31 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f32 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f33 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f34 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f35 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f36 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f37 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f38 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f39 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f40 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f41 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f42 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f43 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f44 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f45 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f46 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f47 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f0 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f1 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f2 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f3 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f4 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f5 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f6 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f7 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f8 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f9 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f10 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f11 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f12 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f13 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f14 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f15 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f16 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f17 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f18 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f19 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f20 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f21 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f22 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f23 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f24 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f25 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f26 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f27 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f28 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f29 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f30 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f31 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f32 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f33 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f34 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f35 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f36 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f37 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f38 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f39 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f40 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f41 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f42 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f43 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f44 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f45 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f46 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f47 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM6_f0 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f1 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f2 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f3 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f4 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f5 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f6 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f7 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f8 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f9 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f10 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f11 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f12 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f13 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f14 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f15 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f16 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f17 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f18 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f19 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f20 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f21 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f22 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f23 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f24 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f25 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f26 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f27 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f28 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f29 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f30 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f31 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f32 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f33 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f34 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f35 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f36 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f37 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f38 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f39 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f40 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f41 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f42 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f43 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f44 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f45 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f46 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f47 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f48 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f49 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f50 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f51 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f52 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f53 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f54 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f55 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f56 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f57 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f58 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f59 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f60 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f61 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f62 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f63 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f64 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f65 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f66 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f67 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f68 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f69 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f70 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f71 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f72 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f73 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f74 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f75 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f76 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f77 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f78 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f79 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f80 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f81 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f82 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f83 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f84 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f85 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f86 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f87 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f88 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f89 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f90 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f91 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f92 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f93 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f94 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f95 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +.ends C18_ihp130_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1.5_sL1/testbench.spice new file mode 100644 index 00000000..310b13f6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1.5_sL1/testbench.spice @@ -0,0 +1,58 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C18_ihp130_sW1.5_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +XB_VB1 VB1 VB1 VDDB VDDB sg13_lv_pmos w=6u l=0.26u +IB_VB1 VB1 VSS 2e-05 +* DC servo (disclosed test auxiliary): VINT -> input DC level that makes V_out = VT; frozen at VHOLD when KSW = 1 +VT VT 0 0.6 +VMID VMID 0 0.6 +VKSW KSW 0 0 +VHOLD VHOLD 0 0 +BSRV VSRV 0 V = (1-v(KSW))*(0.36 + 0.5*tanh(200*(v(VOUT1)-v(VT)))) + v(KSW)*v(VHOLD) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EIN VIN1 VINT VAC 0 1 +VAC VAC 0 dc 0 ac 1 sin(0 1m 1meg) +RL VOUT1 VMID 20000 +CL VOUT1 VMID 5e-12 +.option method=gear reltol=1e-3 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let iq = -i(VDD) +print vout0 vin0 iq +set vin0_s = "$&vin0" +ac dec 20 10 10G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +set gain_s = "$&gain_lf" +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +* open-loop DC transfer around the operating point (servo frozen at the input level it found) +alter @VHOLD[dc] = $vin0_s +alter @VKSW[dc] = 1 +dc VAC -0.4 0.4 0.001 +let gin = abs(deriv(v(VOUT1))) +meas dc gmid find gin at=0 +let gn = gin/gmid +meas dc vo_a find v(VOUT1) when gn=0.5 cross=1 +meas dc vo_b find v(VOUT1) when gn=0.5 cross=last +let out_swing = abs(vo_b - vo_a) +print out_swing +* distortion at a fixed OUTPUT amplitude of 0.1 V (servo frozen, input amplitude = amplitude / |gain|) +alter @VKSW[dc] = 0 +let a_lin = 10^($gain_s/20) +let vamp2 = 0.1/a_lin +if vamp2 > 0.3 + let vamp2 = 0.3 +end +print vamp2 +alter @VAC[sin] = [ 0 $&vamp2 1meg ] +tran 2n 6u 3u +fourier 1meg v(VOUT1) +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1.5_sL2/case.json new file mode 100644 index 00000000..671bb2f6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1.5_sL2/case.json @@ -0,0 +1,185 @@ +{ + "case_id": "C18_ihp130_sW1.5_sL2", + "circuit_id": "C18", + "pdk": "ihp130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "dut_name": "C18_ihp130_sW1.5_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 3.0, + "l": 0.52, + "nf": 6 + }, + "M2": { + "w": 6.0, + "l": 0.52, + "nf": 12 + }, + "M3": { + "w": 12.0, + "l": 0.52, + "nf": 24 + }, + "M4": { + "w": 24.0, + "l": 0.52, + "nf": 48 + }, + "M5": { + "w": 24.0, + "l": 0.52, + "nf": 48 + }, + "M6": { + "w": 48.0, + "l": 0.52, + "nf": 96 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 2e-05 + } + }, + "load": { + "RL": 20000.0, + "CL": 5e-12, + "vamp": 0.02, + "vout_target": 0.6, + "vin_center": 0.36, + "servo_slope": 200.0, + "options": ".option method=gear reltol=1e-3", + "vout_amp": 0.1 + }, + "category": "buffer_ab", + "notes": [ + "first-pass sizing v1", + "RL/CL returned to an ideal mid-supply source; open-loop output-swing metric added" + ], + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.52, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.52, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 12.0, + "l": 0.52, + "nf": 24, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.52, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.52, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 32.0, + "l0": 0.26, + "nf0": 64, + "uw0": 0.5, + "w": 48.0, + "l": 0.52, + "nf": 96, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "dce189abb5766e5e", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M2", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo (freezable)" + }, + { + "kind": "testbench_element", + "what": "mid-supply load return" + }, + { + "kind": "testbench_element", + "what": "load resistor and capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1.5_sL2/manifest.json new file mode 100644 index 00000000..681771b9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "c3ea114159b0d08a8190459a726d15653f0ece5a012a9013069ac0ced140c3c7", + "qualification.json": "efd51f73e68a55a386657834fbdc54c8fb438fdbb0211bb2b437d2e65f0b8149", + "specs.json": "acfe2b9d3a5e7bf89470b6f44780d63ebe0040fbe9ba2bd957ff2926320d9d59", + "target.spice": "36ba556a8cc2f769a6c393f62a118bef4c542bba61648f46561d3e871cb3ad4f", + "target_lvs.spice": "09e2dd3603c7c3ec255948b7ff8aa48e098d02be7c9a251b14b91c3abef3133a", + "testbench.spice": "9f59c6d8c04d096e44de6c61f979e65e27eeffc3719e63e20c27d62fe9b5a60d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1.5_sL2/qualification.json new file mode 100644 index 00000000..e713f728 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1.5_sL2/qualification.json @@ -0,0 +1,153 @@ +{ + "case_id": "C18_ihp130_sW1.5_sL2", + "circuit_id": "C18", + "pdk": "ihp130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "buffer_ab", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.52, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.52, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 12.0, + "l": 0.52, + "nf": 24, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.52, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.52, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 32.0, + "l0": 0.26, + "nf0": 64, + "uw0": 0.5, + "w": 48.0, + "l": 0.52, + "nf": 96, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "dce189abb5766e5e", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "thd_pct=34.67 above floor 3", + "out_swing=0.2387 below floor 0.3" + ], + "spec": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 35080000.0 + }, + "out_swing": { + "min": 0.3 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 34.6666, + "iq": 6.750667e-05, + "f3db": 58463990.0, + "out_swing": 0.2387012 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.3 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 74.5, + "schematic_measures": { + "vout0": 0.6015679, + "vin0": 0.5118427, + "iq": 6.750667e-05, + "gain_lf": -8.80122, + "f3db": 58463990.0, + "gmid": 0.3630485, + "vo_a": 0.8261181, + "vo_b": 0.5874169, + "out_swing": 0.2387012, + "vamp2": 0.2754616, + "thd_pct": 34.6666 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1.5_sL2/specs.json new file mode 100644 index 00000000..5ac6bb3a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1.5_sL2/specs.json @@ -0,0 +1,37 @@ +{ + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 35080000.0 + }, + "out_swing": { + "min": 0.3 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 34.6666, + "iq": 6.750667e-05, + "f3db": 58463990.0, + "out_swing": 0.2387012 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.3 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1.5_sL2/target.spice new file mode 100644 index 00000000..bbcd4962 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1.5_sL2/target.spice @@ -0,0 +1,8 @@ +.subckt C18_ihp130_sW1.5_sL2 VDD VSS VIN1 VOUT1 VB1 +XM1 net13 VIN1 VSS VSS sg13_lv_nmos w=3u l=0.52u ng=6 m=1 +XM2 net9 VB1 VDD VDD sg13_lv_pmos w=6u l=0.52u ng=12 m=1 +XM3 net9 net9 net22 VSS sg13_lv_nmos w=12u l=0.52u ng=24 m=1 +XM4 net13 net13 net22 VDD sg13_lv_pmos w=24u l=0.52u ng=48 m=1 +XM5 VDD net9 VOUT1 VSS sg13_lv_nmos w=24u l=0.52u ng=48 m=1 +XM6 VSS net13 VOUT1 VDD sg13_lv_pmos w=48u l=0.52u ng=96 m=1 +.ends C18_ihp130_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1.5_sL2/target_lvs.spice new file mode 100644 index 00000000..33f92b3c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1.5_sL2/target_lvs.spice @@ -0,0 +1,236 @@ +.subckt C18_ihp130_sW1.5_sL2 VDD VSS VIN1 VOUT1 VB1 +XM1_f0 net13 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f1 net13 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f2 net13 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f3 net13 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f4 net13 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f5 net13 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f0 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f1 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f2 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f3 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f4 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f5 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f6 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f7 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f8 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f9 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f10 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f11 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM3_f0 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f1 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f2 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f3 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f4 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f5 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f6 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f7 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f8 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f9 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f10 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f11 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f12 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f13 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f14 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f15 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f16 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f17 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f18 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f19 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f20 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f21 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f22 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f23 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f0 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f1 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f2 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f3 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f4 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f5 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f6 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f7 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f8 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f9 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f10 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f11 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f12 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f13 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f14 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f15 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f16 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f17 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f18 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f19 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f20 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f21 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f22 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f23 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f24 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f25 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f26 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f27 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f28 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f29 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f30 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f31 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f32 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f33 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f34 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f35 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f36 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f37 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f38 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f39 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f40 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f41 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f42 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f43 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f44 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f45 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f46 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f47 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f0 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f1 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f2 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f3 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f4 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f5 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f6 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f7 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f8 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f9 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f10 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f11 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f12 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f13 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f14 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f15 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f16 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f17 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f18 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f19 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f20 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f21 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f22 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f23 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f24 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f25 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f26 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f27 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f28 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f29 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f30 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f31 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f32 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f33 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f34 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f35 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f36 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f37 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f38 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f39 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f40 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f41 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f42 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f43 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f44 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f45 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f46 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f47 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM6_f0 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f1 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f2 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f3 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f4 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f5 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f6 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f7 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f8 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f9 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f10 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f11 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f12 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f13 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f14 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f15 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f16 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f17 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f18 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f19 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f20 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f21 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f22 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f23 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f24 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f25 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f26 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f27 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f28 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f29 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f30 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f31 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f32 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f33 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f34 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f35 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f36 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f37 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f38 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f39 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f40 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f41 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f42 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f43 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f44 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f45 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f46 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f47 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f48 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f49 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f50 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f51 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f52 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f53 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f54 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f55 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f56 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f57 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f58 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f59 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f60 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f61 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f62 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f63 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f64 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f65 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f66 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f67 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f68 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f69 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f70 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f71 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f72 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f73 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f74 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f75 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f76 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f77 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f78 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f79 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f80 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f81 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f82 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f83 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f84 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f85 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f86 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f87 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f88 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f89 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f90 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f91 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f92 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f93 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f94 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f95 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +.ends C18_ihp130_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1.5_sL2/testbench.spice new file mode 100644 index 00000000..437f35a2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1.5_sL2/testbench.spice @@ -0,0 +1,58 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C18_ihp130_sW1.5_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +XB_VB1 VB1 VB1 VDDB VDDB sg13_lv_pmos w=6u l=0.52u +IB_VB1 VB1 VSS 2e-05 +* DC servo (disclosed test auxiliary): VINT -> input DC level that makes V_out = VT; frozen at VHOLD when KSW = 1 +VT VT 0 0.6 +VMID VMID 0 0.6 +VKSW KSW 0 0 +VHOLD VHOLD 0 0 +BSRV VSRV 0 V = (1-v(KSW))*(0.36 + 0.5*tanh(200*(v(VOUT1)-v(VT)))) + v(KSW)*v(VHOLD) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EIN VIN1 VINT VAC 0 1 +VAC VAC 0 dc 0 ac 1 sin(0 1m 1meg) +RL VOUT1 VMID 20000 +CL VOUT1 VMID 5e-12 +.option method=gear reltol=1e-3 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let iq = -i(VDD) +print vout0 vin0 iq +set vin0_s = "$&vin0" +ac dec 20 10 10G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +set gain_s = "$&gain_lf" +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +* open-loop DC transfer around the operating point (servo frozen at the input level it found) +alter @VHOLD[dc] = $vin0_s +alter @VKSW[dc] = 1 +dc VAC -0.4 0.4 0.001 +let gin = abs(deriv(v(VOUT1))) +meas dc gmid find gin at=0 +let gn = gin/gmid +meas dc vo_a find v(VOUT1) when gn=0.5 cross=1 +meas dc vo_b find v(VOUT1) when gn=0.5 cross=last +let out_swing = abs(vo_b - vo_a) +print out_swing +* distortion at a fixed OUTPUT amplitude of 0.1 V (servo frozen, input amplitude = amplitude / |gain|) +alter @VKSW[dc] = 0 +let a_lin = 10^($gain_s/20) +let vamp2 = 0.1/a_lin +if vamp2 > 0.3 + let vamp2 = 0.3 +end +print vamp2 +alter @VAC[sin] = [ 0 $&vamp2 1meg ] +tran 2n 6u 3u +fourier 1meg v(VOUT1) +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1_sL1.5/case.json new file mode 100644 index 00000000..60240afc --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1_sL1.5/case.json @@ -0,0 +1,185 @@ +{ + "case_id": "C18_ihp130_sW1_sL1.5", + "circuit_id": "C18", + "pdk": "ihp130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "dut_name": "C18_ihp130_sW1_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.39, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.39, + "nf": 8 + }, + "M3": { + "w": 8.0, + "l": 0.39, + "nf": 16 + }, + "M4": { + "w": 16.0, + "l": 0.39, + "nf": 32 + }, + "M5": { + "w": 16.0, + "l": 0.39, + "nf": 32 + }, + "M6": { + "w": 32.0, + "l": 0.39, + "nf": 64 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 2e-05 + } + }, + "load": { + "RL": 20000.0, + "CL": 5e-12, + "vamp": 0.02, + "vout_target": 0.6, + "vin_center": 0.36, + "servo_slope": 200.0, + "options": ".option method=gear reltol=1e-3", + "vout_amp": 0.1 + }, + "category": "buffer_ab", + "notes": [ + "first-pass sizing v1", + "RL/CL returned to an ideal mid-supply source; open-loop output-swing metric added" + ], + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.39, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.39, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 32.0, + "l0": 0.26, + "nf0": 64, + "uw0": 0.5, + "w": 32.0, + "l": 0.39, + "nf": 64, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "64d50719a975becd", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M2", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo (freezable)" + }, + { + "kind": "testbench_element", + "what": "mid-supply load return" + }, + { + "kind": "testbench_element", + "what": "load resistor and capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1_sL1.5/manifest.json new file mode 100644 index 00000000..8585b796 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "90092bfc39a3f49b5e2227e5b1eecdd7681d2abbeed6674a123eb8e81b5875c1", + "qualification.json": "ec2ae848ebd58ae607fc4e2813a52935d673c1016d4fde62e86b458e8d3bcf35", + "specs.json": "1f9d2e3a48015a46fc4e1cfdae082091a5e2ba3ec2f0cfd9fdd30ae87d3d7b60", + "target.spice": "eab634c2700cdcc206e277ec9c353c582980b5d1062cce7c1d74bfb7e8359b2f", + "target_lvs.spice": "e2487cf0794c29caaa3bccd69ebdf793fe0949af58e07efc689985a5d3f5ca56", + "testbench.spice": "3742e3cb512027fb5a83a710a7d45dfdf442bc108858878b830b11ee68caffd5" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1_sL1.5/qualification.json new file mode 100644 index 00000000..2cf0015c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1_sL1.5/qualification.json @@ -0,0 +1,153 @@ +{ + "case_id": "C18_ihp130_sW1_sL1.5", + "circuit_id": "C18", + "pdk": "ihp130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "buffer_ab", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.39, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.39, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 32.0, + "l0": 0.26, + "nf0": 64, + "uw0": 0.5, + "w": 32.0, + "l": 0.39, + "nf": 64, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "64d50719a975becd", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "thd_pct=39.25 above floor 3", + "out_swing=0.2183 below floor 0.3" + ], + "spec": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 31080000.0 + }, + "out_swing": { + "min": 0.3 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 39.2533, + "iq": 6.132357e-05, + "f3db": 51793050.0, + "out_swing": 0.2183261 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.3 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 62.7, + "schematic_measures": { + "vout0": 0.6022713, + "vin0": 0.5726971, + "iq": 6.132357e-05, + "gain_lf": -13.14255, + "f3db": 51793050.0, + "gmid": 0.2202138, + "vo_a": 0.8090009, + "vo_b": 0.5906748, + "out_swing": 0.2183261, + "vamp2": 0.3, + "thd_pct": 39.2533 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1_sL1.5/specs.json new file mode 100644 index 00000000..ba3f2bb8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1_sL1.5/specs.json @@ -0,0 +1,37 @@ +{ + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 31080000.0 + }, + "out_swing": { + "min": 0.3 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 39.2533, + "iq": 6.132357e-05, + "f3db": 51793050.0, + "out_swing": 0.2183261 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.3 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1_sL1.5/target.spice new file mode 100644 index 00000000..1c031191 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1_sL1.5/target.spice @@ -0,0 +1,8 @@ +.subckt C18_ihp130_sW1_sL1.5 VDD VSS VIN1 VOUT1 VB1 +XM1 net13 VIN1 VSS VSS sg13_lv_nmos w=2u l=0.39u ng=4 m=1 +XM2 net9 VB1 VDD VDD sg13_lv_pmos w=4u l=0.39u ng=8 m=1 +XM3 net9 net9 net22 VSS sg13_lv_nmos w=8u l=0.39u ng=16 m=1 +XM4 net13 net13 net22 VDD sg13_lv_pmos w=16u l=0.39u ng=32 m=1 +XM5 VDD net9 VOUT1 VSS sg13_lv_nmos w=16u l=0.39u ng=32 m=1 +XM6 VSS net13 VOUT1 VDD sg13_lv_pmos w=32u l=0.39u ng=64 m=1 +.ends C18_ihp130_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1_sL1.5/target_lvs.spice new file mode 100644 index 00000000..734cc16c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1_sL1.5/target_lvs.spice @@ -0,0 +1,158 @@ +.subckt C18_ihp130_sW1_sL1.5 VDD VSS VIN1 VOUT1 VB1 +XM1_f0 net13 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f1 net13 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f2 net13 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f3 net13 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f0 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f1 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f2 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f3 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f4 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f5 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f6 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f7 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM3_f0 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f1 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f2 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f3 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f4 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f5 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f6 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f7 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f8 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f9 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f10 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f11 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f12 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f13 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f14 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f15 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f0 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f1 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f2 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f3 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f4 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f5 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f6 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f7 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f8 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f9 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f10 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f11 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f12 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f13 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f14 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f15 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f16 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f17 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f18 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f19 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f20 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f21 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f22 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f23 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f24 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f25 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f26 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f27 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f28 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f29 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f30 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f31 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f0 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f1 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f2 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f3 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f4 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f5 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f6 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f7 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f8 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f9 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f10 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f11 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f12 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f13 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f14 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f15 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f16 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f17 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f18 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f19 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f20 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f21 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f22 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f23 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f24 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f25 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f26 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f27 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f28 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f29 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f30 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f31 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM6_f0 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f1 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f2 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f3 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f4 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f5 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f6 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f7 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f8 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f9 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f10 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f11 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f12 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f13 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f14 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f15 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f16 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f17 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f18 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f19 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f20 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f21 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f22 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f23 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f24 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f25 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f26 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f27 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f28 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f29 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f30 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f31 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f32 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f33 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f34 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f35 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f36 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f37 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f38 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f39 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f40 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f41 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f42 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f43 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f44 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f45 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f46 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f47 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f48 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f49 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f50 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f51 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f52 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f53 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f54 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f55 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f56 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f57 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f58 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f59 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f60 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f61 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f62 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f63 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +.ends C18_ihp130_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1_sL1.5/testbench.spice new file mode 100644 index 00000000..5e346404 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1_sL1.5/testbench.spice @@ -0,0 +1,58 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C18_ihp130_sW1_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +XB_VB1 VB1 VB1 VDDB VDDB sg13_lv_pmos w=4u l=0.39u +IB_VB1 VB1 VSS 2e-05 +* DC servo (disclosed test auxiliary): VINT -> input DC level that makes V_out = VT; frozen at VHOLD when KSW = 1 +VT VT 0 0.6 +VMID VMID 0 0.6 +VKSW KSW 0 0 +VHOLD VHOLD 0 0 +BSRV VSRV 0 V = (1-v(KSW))*(0.36 + 0.5*tanh(200*(v(VOUT1)-v(VT)))) + v(KSW)*v(VHOLD) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EIN VIN1 VINT VAC 0 1 +VAC VAC 0 dc 0 ac 1 sin(0 1m 1meg) +RL VOUT1 VMID 20000 +CL VOUT1 VMID 5e-12 +.option method=gear reltol=1e-3 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let iq = -i(VDD) +print vout0 vin0 iq +set vin0_s = "$&vin0" +ac dec 20 10 10G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +set gain_s = "$&gain_lf" +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +* open-loop DC transfer around the operating point (servo frozen at the input level it found) +alter @VHOLD[dc] = $vin0_s +alter @VKSW[dc] = 1 +dc VAC -0.4 0.4 0.001 +let gin = abs(deriv(v(VOUT1))) +meas dc gmid find gin at=0 +let gn = gin/gmid +meas dc vo_a find v(VOUT1) when gn=0.5 cross=1 +meas dc vo_b find v(VOUT1) when gn=0.5 cross=last +let out_swing = abs(vo_b - vo_a) +print out_swing +* distortion at a fixed OUTPUT amplitude of 0.1 V (servo frozen, input amplitude = amplitude / |gain|) +alter @VKSW[dc] = 0 +let a_lin = 10^($gain_s/20) +let vamp2 = 0.1/a_lin +if vamp2 > 0.3 + let vamp2 = 0.3 +end +print vamp2 +alter @VAC[sin] = [ 0 $&vamp2 1meg ] +tran 2n 6u 3u +fourier 1meg v(VOUT1) +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1_sL1/case.json new file mode 100644 index 00000000..49d0f2f1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1_sL1/case.json @@ -0,0 +1,185 @@ +{ + "case_id": "C18_ihp130_sW1_sL1", + "circuit_id": "C18", + "pdk": "ihp130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "dut_name": "C18_ihp130_sW1_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.26, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.26, + "nf": 8 + }, + "M3": { + "w": 8.0, + "l": 0.26, + "nf": 16 + }, + "M4": { + "w": 16.0, + "l": 0.26, + "nf": 32 + }, + "M5": { + "w": 16.0, + "l": 0.26, + "nf": 32 + }, + "M6": { + "w": 32.0, + "l": 0.26, + "nf": 64 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 2e-05 + } + }, + "load": { + "RL": 20000.0, + "CL": 5e-12, + "vamp": 0.02, + "vout_target": 0.6, + "vin_center": 0.36, + "servo_slope": 200.0, + "options": ".option method=gear reltol=1e-3", + "vout_amp": 0.1 + }, + "category": "buffer_ab", + "notes": [ + "first-pass sizing v1", + "RL/CL returned to an ideal mid-supply source; open-loop output-swing metric added" + ], + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.26, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 8.0, + "l": 0.26, + "nf": 16, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.26, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.26, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 32.0, + "l0": 0.26, + "nf0": 64, + "uw0": 0.5, + "w": 32.0, + "l": 0.26, + "nf": 64, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "76485ab8bb4105c5", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M2", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo (freezable)" + }, + { + "kind": "testbench_element", + "what": "mid-supply load return" + }, + { + "kind": "testbench_element", + "what": "load resistor and capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1_sL1/manifest.json new file mode 100644 index 00000000..a33e2121 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "620bf35f548e6094dab13a88ab0333335434fac8b8b075e13a66351bd88cc335", + "qualification.json": "770ddbb49dab8a4445b6c78ca8efc3df2fbf2fd11acd0e8647e64f77bebb556b", + "specs.json": "fd071a1bf165712c965bde1560b8bd6be1f23c75a70fd20b1d2524deec2c8fa8", + "target.spice": "f1da45827e54ac7589d9901724d11f52a3c07e665576e27a557ab79868cd991e", + "target_lvs.spice": "536c052531aed4a30a85b36c7437eb8cbcac859175667c9cffb71c70fa147157", + "testbench.spice": "2427bd092e0cf351a537f853d5850f68bcbb8fe5b19bce609317724298f666fa" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1_sL1/qualification.json new file mode 100644 index 00000000..a07092d0 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1_sL1/qualification.json @@ -0,0 +1,153 @@ +{ + "case_id": "C18_ihp130_sW1_sL1", + "circuit_id": "C18", + "pdk": "ihp130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "buffer_ab", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.26, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 8.0, + "l": 0.26, + "nf": 16, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.26, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.26, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 32.0, + "l0": 0.26, + "nf0": 64, + "uw0": 0.5, + "w": 32.0, + "l": 0.26, + "nf": 64, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "76485ab8bb4105c5", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "thd_pct=31.41 above floor 3", + "out_swing=0.1982 below floor 0.3" + ], + "spec": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 32190000.0 + }, + "out_swing": { + "min": 0.3 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 31.4117, + "iq": 5.666062e-05, + "f3db": 53647720.0, + "out_swing": 0.1982082 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.3 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 60.6, + "schematic_measures": { + "vout0": 0.601749, + "vin0": 0.5280955, + "iq": 5.666062e-05, + "gain_lf": -5.664669, + "f3db": 53647720.0, + "gmid": 0.5209781, + "vo_a": 0.7852801, + "vo_b": 0.5870719, + "out_swing": 0.1982082, + "vamp2": 0.1919701, + "thd_pct": 31.4117 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1_sL1/specs.json new file mode 100644 index 00000000..2333675b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1_sL1/specs.json @@ -0,0 +1,37 @@ +{ + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 32190000.0 + }, + "out_swing": { + "min": 0.3 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 31.4117, + "iq": 5.666062e-05, + "f3db": 53647720.0, + "out_swing": 0.1982082 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.3 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1_sL1/target.spice new file mode 100644 index 00000000..ed13f816 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1_sL1/target.spice @@ -0,0 +1,8 @@ +.subckt C18_ihp130_sW1_sL1 VDD VSS VIN1 VOUT1 VB1 +XM1 net13 VIN1 VSS VSS sg13_lv_nmos w=2u l=0.26u ng=4 m=1 +XM2 net9 VB1 VDD VDD sg13_lv_pmos w=4u l=0.26u ng=8 m=1 +XM3 net9 net9 net22 VSS sg13_lv_nmos w=8u l=0.26u ng=16 m=1 +XM4 net13 net13 net22 VDD sg13_lv_pmos w=16u l=0.26u ng=32 m=1 +XM5 VDD net9 VOUT1 VSS sg13_lv_nmos w=16u l=0.26u ng=32 m=1 +XM6 VSS net13 VOUT1 VDD sg13_lv_pmos w=32u l=0.26u ng=64 m=1 +.ends C18_ihp130_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1_sL1/target_lvs.spice new file mode 100644 index 00000000..5401762e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1_sL1/target_lvs.spice @@ -0,0 +1,158 @@ +.subckt C18_ihp130_sW1_sL1 VDD VSS VIN1 VOUT1 VB1 +XM1_f0 net13 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f1 net13 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f2 net13 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f3 net13 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f0 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f1 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f2 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f3 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f4 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f5 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f6 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f7 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM3_f0 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f1 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f2 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f3 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f4 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f5 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f6 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f7 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f8 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f9 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f10 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f11 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f12 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f13 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f14 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f15 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f0 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f1 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f2 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f3 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f4 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f5 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f6 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f7 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f8 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f9 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f10 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f11 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f12 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f13 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f14 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f15 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f16 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f17 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f18 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f19 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f20 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f21 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f22 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f23 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f24 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f25 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f26 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f27 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f28 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f29 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f30 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f31 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f0 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f1 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f2 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f3 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f4 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f5 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f6 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f7 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f8 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f9 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f10 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f11 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f12 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f13 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f14 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f15 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f16 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f17 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f18 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f19 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f20 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f21 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f22 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f23 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f24 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f25 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f26 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f27 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f28 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f29 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f30 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f31 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM6_f0 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f1 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f2 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f3 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f4 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f5 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f6 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f7 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f8 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f9 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f10 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f11 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f12 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f13 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f14 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f15 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f16 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f17 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f18 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f19 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f20 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f21 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f22 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f23 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f24 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f25 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f26 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f27 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f28 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f29 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f30 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f31 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f32 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f33 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f34 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f35 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f36 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f37 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f38 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f39 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f40 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f41 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f42 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f43 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f44 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f45 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f46 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f47 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f48 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f49 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f50 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f51 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f52 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f53 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f54 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f55 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f56 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f57 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f58 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f59 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f60 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f61 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f62 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f63 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +.ends C18_ihp130_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1_sL1/testbench.spice new file mode 100644 index 00000000..daa767ce --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1_sL1/testbench.spice @@ -0,0 +1,58 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C18_ihp130_sW1_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +XB_VB1 VB1 VB1 VDDB VDDB sg13_lv_pmos w=4u l=0.26u +IB_VB1 VB1 VSS 2e-05 +* DC servo (disclosed test auxiliary): VINT -> input DC level that makes V_out = VT; frozen at VHOLD when KSW = 1 +VT VT 0 0.6 +VMID VMID 0 0.6 +VKSW KSW 0 0 +VHOLD VHOLD 0 0 +BSRV VSRV 0 V = (1-v(KSW))*(0.36 + 0.5*tanh(200*(v(VOUT1)-v(VT)))) + v(KSW)*v(VHOLD) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EIN VIN1 VINT VAC 0 1 +VAC VAC 0 dc 0 ac 1 sin(0 1m 1meg) +RL VOUT1 VMID 20000 +CL VOUT1 VMID 5e-12 +.option method=gear reltol=1e-3 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let iq = -i(VDD) +print vout0 vin0 iq +set vin0_s = "$&vin0" +ac dec 20 10 10G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +set gain_s = "$&gain_lf" +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +* open-loop DC transfer around the operating point (servo frozen at the input level it found) +alter @VHOLD[dc] = $vin0_s +alter @VKSW[dc] = 1 +dc VAC -0.4 0.4 0.001 +let gin = abs(deriv(v(VOUT1))) +meas dc gmid find gin at=0 +let gn = gin/gmid +meas dc vo_a find v(VOUT1) when gn=0.5 cross=1 +meas dc vo_b find v(VOUT1) when gn=0.5 cross=last +let out_swing = abs(vo_b - vo_a) +print out_swing +* distortion at a fixed OUTPUT amplitude of 0.1 V (servo frozen, input amplitude = amplitude / |gain|) +alter @VKSW[dc] = 0 +let a_lin = 10^($gain_s/20) +let vamp2 = 0.1/a_lin +if vamp2 > 0.3 + let vamp2 = 0.3 +end +print vamp2 +alter @VAC[sin] = [ 0 $&vamp2 1meg ] +tran 2n 6u 3u +fourier 1meg v(VOUT1) +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1_sL2/case.json new file mode 100644 index 00000000..f4312690 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1_sL2/case.json @@ -0,0 +1,185 @@ +{ + "case_id": "C18_ihp130_sW1_sL2", + "circuit_id": "C18", + "pdk": "ihp130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "dut_name": "C18_ihp130_sW1_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.52, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.52, + "nf": 8 + }, + "M3": { + "w": 8.0, + "l": 0.52, + "nf": 16 + }, + "M4": { + "w": 16.0, + "l": 0.52, + "nf": 32 + }, + "M5": { + "w": 16.0, + "l": 0.52, + "nf": 32 + }, + "M6": { + "w": 32.0, + "l": 0.52, + "nf": 64 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 2e-05 + } + }, + "load": { + "RL": 20000.0, + "CL": 5e-12, + "vamp": 0.02, + "vout_target": 0.6, + "vin_center": 0.36, + "servo_slope": 200.0, + "options": ".option method=gear reltol=1e-3", + "vout_amp": 0.1 + }, + "category": "buffer_ab", + "notes": [ + "first-pass sizing v1", + "RL/CL returned to an ideal mid-supply source; open-loop output-swing metric added" + ], + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.52, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.52, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 32.0, + "l0": 0.26, + "nf0": 64, + "uw0": 0.5, + "w": 32.0, + "l": 0.52, + "nf": 64, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "10054bb31697d3b3", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M2", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo (freezable)" + }, + { + "kind": "testbench_element", + "what": "mid-supply load return" + }, + { + "kind": "testbench_element", + "what": "load resistor and capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1_sL2/manifest.json new file mode 100644 index 00000000..ea803d67 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "9218ef0ec8cd2b5be2d54d1921e9ba8c15f7c7f63dedd24ec8d69184efb2e32e", + "qualification.json": "4c6564e18beea032dd1fe19572a78ecae1eff04ae9de29cd98f4f370868c3d8a", + "specs.json": "ced43bb7ce1400bee0f0396b216993861bbd598aa1cc28968589581761380943", + "target.spice": "ad469f1a56dd28228e1fe72ddf2a3c3e9a3773005a46918c31a121464ca20196", + "target_lvs.spice": "14eb4bf2103429ff98338c7e5bce541a54d84535fcc50b256efb687a3343b5b6", + "testbench.spice": "1d61c950f9641cae6086cf83c2cf343054f857dba90caee10bca96d8573192fa" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1_sL2/qualification.json new file mode 100644 index 00000000..72c6dde9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1_sL2/qualification.json @@ -0,0 +1,153 @@ +{ + "case_id": "C18_ihp130_sW1_sL2", + "circuit_id": "C18", + "pdk": "ihp130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "buffer_ab", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.52, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.52, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 32.0, + "l0": 0.26, + "nf0": 64, + "uw0": 0.5, + "w": 32.0, + "l": 0.52, + "nf": 64, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "10054bb31697d3b3", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "thd_pct=56.22 above floor 3", + "out_swing=0 below floor 0.3" + ], + "spec": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 28880000.0 + }, + "out_swing": { + "min": 0.3 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 56.219, + "iq": 6.201357e-05, + "f3db": 48134030.0, + "out_swing": 0.0 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.3 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 52.2, + "schematic_measures": { + "vout0": 0.6034816, + "vin0": 0.6610136, + "iq": 6.201357e-05, + "gain_lf": -19.58239, + "f3db": 48134030.0, + "gmid": 0.1049226, + "vo_a": 0.5948294, + "vo_b": 0.5948294, + "out_swing": 0.0, + "vamp2": 0.3, + "thd_pct": 56.219 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1_sL2/specs.json new file mode 100644 index 00000000..e56c7786 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1_sL2/specs.json @@ -0,0 +1,37 @@ +{ + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 28880000.0 + }, + "out_swing": { + "min": 0.3 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 56.219, + "iq": 6.201357e-05, + "f3db": 48134030.0, + "out_swing": 0.0 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.3 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1_sL2/target.spice new file mode 100644 index 00000000..1f8a72a1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1_sL2/target.spice @@ -0,0 +1,8 @@ +.subckt C18_ihp130_sW1_sL2 VDD VSS VIN1 VOUT1 VB1 +XM1 net13 VIN1 VSS VSS sg13_lv_nmos w=2u l=0.52u ng=4 m=1 +XM2 net9 VB1 VDD VDD sg13_lv_pmos w=4u l=0.52u ng=8 m=1 +XM3 net9 net9 net22 VSS sg13_lv_nmos w=8u l=0.52u ng=16 m=1 +XM4 net13 net13 net22 VDD sg13_lv_pmos w=16u l=0.52u ng=32 m=1 +XM5 VDD net9 VOUT1 VSS sg13_lv_nmos w=16u l=0.52u ng=32 m=1 +XM6 VSS net13 VOUT1 VDD sg13_lv_pmos w=32u l=0.52u ng=64 m=1 +.ends C18_ihp130_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1_sL2/target_lvs.spice new file mode 100644 index 00000000..99d6abe1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1_sL2/target_lvs.spice @@ -0,0 +1,158 @@ +.subckt C18_ihp130_sW1_sL2 VDD VSS VIN1 VOUT1 VB1 +XM1_f0 net13 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f1 net13 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f2 net13 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f3 net13 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f0 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f1 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f2 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f3 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f4 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f5 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f6 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f7 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM3_f0 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f1 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f2 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f3 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f4 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f5 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f6 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f7 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f8 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f9 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f10 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f11 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f12 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f13 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f14 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f15 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f0 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f1 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f2 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f3 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f4 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f5 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f6 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f7 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f8 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f9 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f10 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f11 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f12 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f13 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f14 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f15 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f16 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f17 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f18 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f19 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f20 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f21 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f22 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f23 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f24 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f25 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f26 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f27 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f28 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f29 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f30 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f31 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f0 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f1 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f2 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f3 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f4 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f5 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f6 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f7 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f8 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f9 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f10 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f11 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f12 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f13 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f14 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f15 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f16 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f17 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f18 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f19 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f20 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f21 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f22 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f23 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f24 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f25 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f26 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f27 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f28 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f29 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f30 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f31 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM6_f0 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f1 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f2 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f3 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f4 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f5 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f6 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f7 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f8 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f9 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f10 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f11 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f12 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f13 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f14 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f15 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f16 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f17 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f18 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f19 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f20 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f21 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f22 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f23 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f24 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f25 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f26 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f27 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f28 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f29 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f30 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f31 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f32 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f33 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f34 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f35 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f36 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f37 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f38 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f39 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f40 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f41 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f42 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f43 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f44 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f45 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f46 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f47 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f48 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f49 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f50 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f51 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f52 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f53 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f54 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f55 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f56 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f57 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f58 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f59 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f60 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f61 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f62 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f63 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +.ends C18_ihp130_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1_sL2/testbench.spice new file mode 100644 index 00000000..dec44978 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW1_sL2/testbench.spice @@ -0,0 +1,58 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C18_ihp130_sW1_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +XB_VB1 VB1 VB1 VDDB VDDB sg13_lv_pmos w=4u l=0.52u +IB_VB1 VB1 VSS 2e-05 +* DC servo (disclosed test auxiliary): VINT -> input DC level that makes V_out = VT; frozen at VHOLD when KSW = 1 +VT VT 0 0.6 +VMID VMID 0 0.6 +VKSW KSW 0 0 +VHOLD VHOLD 0 0 +BSRV VSRV 0 V = (1-v(KSW))*(0.36 + 0.5*tanh(200*(v(VOUT1)-v(VT)))) + v(KSW)*v(VHOLD) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EIN VIN1 VINT VAC 0 1 +VAC VAC 0 dc 0 ac 1 sin(0 1m 1meg) +RL VOUT1 VMID 20000 +CL VOUT1 VMID 5e-12 +.option method=gear reltol=1e-3 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let iq = -i(VDD) +print vout0 vin0 iq +set vin0_s = "$&vin0" +ac dec 20 10 10G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +set gain_s = "$&gain_lf" +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +* open-loop DC transfer around the operating point (servo frozen at the input level it found) +alter @VHOLD[dc] = $vin0_s +alter @VKSW[dc] = 1 +dc VAC -0.4 0.4 0.001 +let gin = abs(deriv(v(VOUT1))) +meas dc gmid find gin at=0 +let gn = gin/gmid +meas dc vo_a find v(VOUT1) when gn=0.5 cross=1 +meas dc vo_b find v(VOUT1) when gn=0.5 cross=last +let out_swing = abs(vo_b - vo_a) +print out_swing +* distortion at a fixed OUTPUT amplitude of 0.1 V (servo frozen, input amplitude = amplitude / |gain|) +alter @VKSW[dc] = 0 +let a_lin = 10^($gain_s/20) +let vamp2 = 0.1/a_lin +if vamp2 > 0.3 + let vamp2 = 0.3 +end +print vamp2 +alter @VAC[sin] = [ 0 $&vamp2 1meg ] +tran 2n 6u 3u +fourier 1meg v(VOUT1) +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW2_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW2_sL1.5/case.json new file mode 100644 index 00000000..361835d4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW2_sL1.5/case.json @@ -0,0 +1,185 @@ +{ + "case_id": "C18_ihp130_sW2_sL1.5", + "circuit_id": "C18", + "pdk": "ihp130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "dut_name": "C18_ihp130_sW2_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.39, + "nf": 8 + }, + "M2": { + "w": 8.0, + "l": 0.39, + "nf": 16 + }, + "M3": { + "w": 16.0, + "l": 0.39, + "nf": 32 + }, + "M4": { + "w": 32.0, + "l": 0.39, + "nf": 64 + }, + "M5": { + "w": 32.0, + "l": 0.39, + "nf": 64 + }, + "M6": { + "w": 64.0, + "l": 0.39, + "nf": 128 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 2e-05 + } + }, + "load": { + "RL": 20000.0, + "CL": 5e-12, + "vamp": 0.02, + "vout_target": 0.6, + "vin_center": 0.36, + "servo_slope": 200.0, + "options": ".option method=gear reltol=1e-3", + "vout_amp": 0.1 + }, + "category": "buffer_ab", + "notes": [ + "first-pass sizing v1", + "RL/CL returned to an ideal mid-supply source; open-loop output-swing metric added" + ], + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 16.0, + "l": 0.39, + "nf": 32, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.39, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.39, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 32.0, + "l0": 0.26, + "nf0": 64, + "uw0": 0.5, + "w": 64.0, + "l": 0.39, + "nf": 128, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "f4d8f3ef142ec982", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M2", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo (freezable)" + }, + { + "kind": "testbench_element", + "what": "mid-supply load return" + }, + { + "kind": "testbench_element", + "what": "load resistor and capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW2_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW2_sL1.5/manifest.json new file mode 100644 index 00000000..3773df48 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW2_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "cb9823b0efd29ac1dc1d504d6b9edd76ea19b8fd7e28094935fba7291cc349ca", + "qualification.json": "cbb7bcff637171a3c354cb69a59585dc4d17e8dec1842e030abf9b0af17f19b6", + "specs.json": "102a86c339ae5fef344d62141e19c54e86ece4f5c57fb083b0209bbf4a52f280", + "target.spice": "a2158e4309ca6fa1545a1d4d137ba9b3ae4fcd1ce9a03c8ace48fa351dd4f63d", + "target_lvs.spice": "c1b2c365e8cc558014d9474062b2b64327e4d60b067e46f7af76102f892e46ba", + "testbench.spice": "8e2f13620250698788f3d581522a627235d3127cf565ae515da0163941c538b6" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW2_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW2_sL1.5/qualification.json new file mode 100644 index 00000000..3c70573b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW2_sL1.5/qualification.json @@ -0,0 +1,153 @@ +{ + "case_id": "C18_ihp130_sW2_sL1.5", + "circuit_id": "C18", + "pdk": "ihp130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "buffer_ab", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 16.0, + "l": 0.39, + "nf": 32, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.39, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.39, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 32.0, + "l0": 0.26, + "nf0": 64, + "uw0": 0.5, + "w": 64.0, + "l": 0.39, + "nf": 128, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "f4d8f3ef142ec982", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "thd_pct=27.96 above floor 3", + "out_swing=0.2199 below floor 0.3" + ], + "spec": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 34300000.0 + }, + "out_swing": { + "min": 0.3 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 27.9647, + "iq": 6.810104e-05, + "f3db": 57174060.0, + "out_swing": 0.2198753 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.3 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 89.9, + "schematic_measures": { + "vout0": 0.60082, + "vin0": 0.4412735, + "iq": 6.810104e-05, + "gain_lf": 2.770807, + "f3db": 57174060.0, + "gmid": 1.376713, + "vo_a": 0.80318, + "vo_b": 0.5833047, + "out_swing": 0.2198753, + "vamp2": 0.07268746, + "thd_pct": 27.9647 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW2_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW2_sL1.5/specs.json new file mode 100644 index 00000000..d27968bd --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW2_sL1.5/specs.json @@ -0,0 +1,37 @@ +{ + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 34300000.0 + }, + "out_swing": { + "min": 0.3 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 27.9647, + "iq": 6.810104e-05, + "f3db": 57174060.0, + "out_swing": 0.2198753 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.3 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW2_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW2_sL1.5/target.spice new file mode 100644 index 00000000..c43c1a98 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW2_sL1.5/target.spice @@ -0,0 +1,8 @@ +.subckt C18_ihp130_sW2_sL1.5 VDD VSS VIN1 VOUT1 VB1 +XM1 net13 VIN1 VSS VSS sg13_lv_nmos w=4u l=0.39u ng=8 m=1 +XM2 net9 VB1 VDD VDD sg13_lv_pmos w=8u l=0.39u ng=16 m=1 +XM3 net9 net9 net22 VSS sg13_lv_nmos w=16u l=0.39u ng=32 m=1 +XM4 net13 net13 net22 VDD sg13_lv_pmos w=32u l=0.39u ng=64 m=1 +XM5 VDD net9 VOUT1 VSS sg13_lv_nmos w=32u l=0.39u ng=64 m=1 +XM6 VSS net13 VOUT1 VDD sg13_lv_pmos w=64u l=0.39u ng=128 m=1 +.ends C18_ihp130_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW2_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW2_sL1.5/target_lvs.spice new file mode 100644 index 00000000..a699ba86 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW2_sL1.5/target_lvs.spice @@ -0,0 +1,314 @@ +.subckt C18_ihp130_sW2_sL1.5 VDD VSS VIN1 VOUT1 VB1 +XM1_f0 net13 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f1 net13 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f2 net13 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f3 net13 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f4 net13 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f5 net13 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f6 net13 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM1_f7 net13 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.39u +XM2_f0 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f1 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f2 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f3 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f4 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f5 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f6 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f7 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f8 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f9 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f10 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f11 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f12 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f13 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f14 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM2_f15 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.39u +XM3_f0 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f1 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f2 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f3 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f4 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f5 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f6 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f7 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f8 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f9 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f10 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f11 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f12 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f13 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f14 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f15 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f16 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f17 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f18 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f19 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f20 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f21 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f22 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f23 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f24 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f25 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f26 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f27 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f28 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f29 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f30 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.39u +XM3_f31 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.39u +XM4_f0 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f1 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f2 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f3 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f4 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f5 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f6 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f7 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f8 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f9 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f10 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f11 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f12 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f13 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f14 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f15 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f16 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f17 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f18 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f19 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f20 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f21 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f22 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f23 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f24 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f25 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f26 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f27 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f28 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f29 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f30 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f31 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f32 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f33 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f34 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f35 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f36 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f37 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f38 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f39 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f40 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f41 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f42 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f43 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f44 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f45 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f46 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f47 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f48 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f49 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f50 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f51 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f52 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f53 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f54 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f55 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f56 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f57 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f58 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f59 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f60 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f61 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f62 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM4_f63 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.39u +XM5_f0 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f1 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f2 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f3 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f4 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f5 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f6 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f7 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f8 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f9 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f10 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f11 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f12 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f13 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f14 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f15 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f16 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f17 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f18 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f19 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f20 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f21 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f22 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f23 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f24 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f25 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f26 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f27 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f28 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f29 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f30 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f31 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f32 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f33 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f34 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f35 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f36 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f37 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f38 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f39 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f40 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f41 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f42 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f43 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f44 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f45 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f46 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f47 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f48 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f49 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f50 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f51 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f52 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f53 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f54 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f55 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f56 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f57 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f58 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f59 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f60 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f61 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f62 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM5_f63 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.39u +XM6_f0 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f1 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f2 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f3 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f4 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f5 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f6 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f7 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f8 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f9 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f10 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f11 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f12 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f13 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f14 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f15 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f16 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f17 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f18 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f19 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f20 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f21 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f22 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f23 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f24 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f25 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f26 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f27 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f28 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f29 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f30 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f31 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f32 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f33 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f34 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f35 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f36 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f37 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f38 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f39 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f40 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f41 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f42 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f43 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f44 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f45 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f46 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f47 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f48 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f49 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f50 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f51 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f52 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f53 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f54 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f55 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f56 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f57 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f58 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f59 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f60 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f61 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f62 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f63 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f64 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f65 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f66 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f67 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f68 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f69 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f70 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f71 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f72 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f73 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f74 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f75 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f76 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f77 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f78 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f79 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f80 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f81 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f82 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f83 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f84 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f85 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f86 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f87 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f88 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f89 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f90 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f91 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f92 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f93 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f94 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f95 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f96 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f97 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f98 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f99 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f100 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f101 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f102 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f103 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f104 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f105 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f106 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f107 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f108 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f109 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f110 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f111 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f112 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f113 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f114 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f115 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f116 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f117 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f118 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f119 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f120 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f121 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f122 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f123 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f124 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f125 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f126 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +XM6_f127 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.39u +.ends C18_ihp130_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW2_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW2_sL1.5/testbench.spice new file mode 100644 index 00000000..4104c608 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW2_sL1.5/testbench.spice @@ -0,0 +1,58 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C18_ihp130_sW2_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +XB_VB1 VB1 VB1 VDDB VDDB sg13_lv_pmos w=8u l=0.39u +IB_VB1 VB1 VSS 2e-05 +* DC servo (disclosed test auxiliary): VINT -> input DC level that makes V_out = VT; frozen at VHOLD when KSW = 1 +VT VT 0 0.6 +VMID VMID 0 0.6 +VKSW KSW 0 0 +VHOLD VHOLD 0 0 +BSRV VSRV 0 V = (1-v(KSW))*(0.36 + 0.5*tanh(200*(v(VOUT1)-v(VT)))) + v(KSW)*v(VHOLD) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EIN VIN1 VINT VAC 0 1 +VAC VAC 0 dc 0 ac 1 sin(0 1m 1meg) +RL VOUT1 VMID 20000 +CL VOUT1 VMID 5e-12 +.option method=gear reltol=1e-3 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let iq = -i(VDD) +print vout0 vin0 iq +set vin0_s = "$&vin0" +ac dec 20 10 10G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +set gain_s = "$&gain_lf" +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +* open-loop DC transfer around the operating point (servo frozen at the input level it found) +alter @VHOLD[dc] = $vin0_s +alter @VKSW[dc] = 1 +dc VAC -0.4 0.4 0.001 +let gin = abs(deriv(v(VOUT1))) +meas dc gmid find gin at=0 +let gn = gin/gmid +meas dc vo_a find v(VOUT1) when gn=0.5 cross=1 +meas dc vo_b find v(VOUT1) when gn=0.5 cross=last +let out_swing = abs(vo_b - vo_a) +print out_swing +* distortion at a fixed OUTPUT amplitude of 0.1 V (servo frozen, input amplitude = amplitude / |gain|) +alter @VKSW[dc] = 0 +let a_lin = 10^($gain_s/20) +let vamp2 = 0.1/a_lin +if vamp2 > 0.3 + let vamp2 = 0.3 +end +print vamp2 +alter @VAC[sin] = [ 0 $&vamp2 1meg ] +tran 2n 6u 3u +fourier 1meg v(VOUT1) +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW2_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW2_sL1/case.json new file mode 100644 index 00000000..dbcb5776 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW2_sL1/case.json @@ -0,0 +1,185 @@ +{ + "case_id": "C18_ihp130_sW2_sL1", + "circuit_id": "C18", + "pdk": "ihp130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "dut_name": "C18_ihp130_sW2_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.26, + "nf": 8 + }, + "M2": { + "w": 8.0, + "l": 0.26, + "nf": 16 + }, + "M3": { + "w": 16.0, + "l": 0.26, + "nf": 32 + }, + "M4": { + "w": 32.0, + "l": 0.26, + "nf": 64 + }, + "M5": { + "w": 32.0, + "l": 0.26, + "nf": 64 + }, + "M6": { + "w": 64.0, + "l": 0.26, + "nf": 128 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 2e-05 + } + }, + "load": { + "RL": 20000.0, + "CL": 5e-12, + "vamp": 0.02, + "vout_target": 0.6, + "vin_center": 0.36, + "servo_slope": 200.0, + "options": ".option method=gear reltol=1e-3", + "vout_amp": 0.1 + }, + "category": "buffer_ab", + "notes": [ + "first-pass sizing v1", + "RL/CL returned to an ideal mid-supply source; open-loop output-swing metric added" + ], + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.26, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 16.0, + "l": 0.26, + "nf": 32, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.26, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.26, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 32.0, + "l0": 0.26, + "nf0": 64, + "uw0": 0.5, + "w": 64.0, + "l": 0.26, + "nf": 128, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "61ce3b7138701efd", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M2", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo (freezable)" + }, + { + "kind": "testbench_element", + "what": "mid-supply load return" + }, + { + "kind": "testbench_element", + "what": "load resistor and capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW2_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW2_sL1/manifest.json new file mode 100644 index 00000000..097a1a76 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW2_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "bd4dcb64013dafd543c1617578df6614360c04eec000e8a6f3abcd2304e1f169", + "qualification.json": "6a918d76b5d3e75a483fb3aa188e27643815750e6d58fbb99f1af5721683aae5", + "specs.json": "c908f0b120bdb42efb6753acce25214e63209507e7338fbc7edd3268e59e0f5c", + "target.spice": "fa47b3ae99bbda4489f2fb6c14960d5090fbcdf2e619dc958b58aeb8de92f0d9", + "target_lvs.spice": "29204b51f771cf691f932e1cadf73b17eccfcd316408dbb657d5e5dbc0e9ea98", + "testbench.spice": "86cc14f061b90e4e4c912af8684afb2cc8148b50f8ea02f5791d6d5e2d195b55" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW2_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW2_sL1/qualification.json new file mode 100644 index 00000000..a5a7d59b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW2_sL1/qualification.json @@ -0,0 +1,153 @@ +{ + "case_id": "C18_ihp130_sW2_sL1", + "circuit_id": "C18", + "pdk": "ihp130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "buffer_ab", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.26, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 16.0, + "l": 0.26, + "nf": 32, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.26, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.26, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 32.0, + "l0": 0.26, + "nf0": 64, + "uw0": 0.5, + "w": 64.0, + "l": 0.26, + "nf": 128, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "61ce3b7138701efd", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "thd_pct=22.86 above floor 3", + "out_swing=0.1709 below floor 0.3" + ], + "spec": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 32290000.0 + }, + "out_swing": { + "min": 0.3 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 22.8591, + "iq": 6.236234e-05, + "f3db": 53820020.0, + "out_swing": 0.1709128 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.3 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 94.8, + "schematic_measures": { + "vout0": 0.6008871, + "vin0": 0.4477911, + "iq": 6.236234e-05, + "gain_lf": 7.291935, + "f3db": 53820020.0, + "gmid": 2.316724, + "vo_a": 0.7506718, + "vo_b": 0.579759, + "out_swing": 0.1709128, + "vamp2": 0.04319202, + "thd_pct": 22.8591 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW2_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW2_sL1/specs.json new file mode 100644 index 00000000..ff38b5bd --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW2_sL1/specs.json @@ -0,0 +1,37 @@ +{ + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 32290000.0 + }, + "out_swing": { + "min": 0.3 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 22.8591, + "iq": 6.236234e-05, + "f3db": 53820020.0, + "out_swing": 0.1709128 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.3 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW2_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW2_sL1/target.spice new file mode 100644 index 00000000..4f2e637b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW2_sL1/target.spice @@ -0,0 +1,8 @@ +.subckt C18_ihp130_sW2_sL1 VDD VSS VIN1 VOUT1 VB1 +XM1 net13 VIN1 VSS VSS sg13_lv_nmos w=4u l=0.26u ng=8 m=1 +XM2 net9 VB1 VDD VDD sg13_lv_pmos w=8u l=0.26u ng=16 m=1 +XM3 net9 net9 net22 VSS sg13_lv_nmos w=16u l=0.26u ng=32 m=1 +XM4 net13 net13 net22 VDD sg13_lv_pmos w=32u l=0.26u ng=64 m=1 +XM5 VDD net9 VOUT1 VSS sg13_lv_nmos w=32u l=0.26u ng=64 m=1 +XM6 VSS net13 VOUT1 VDD sg13_lv_pmos w=64u l=0.26u ng=128 m=1 +.ends C18_ihp130_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW2_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW2_sL1/target_lvs.spice new file mode 100644 index 00000000..2988a043 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW2_sL1/target_lvs.spice @@ -0,0 +1,314 @@ +.subckt C18_ihp130_sW2_sL1 VDD VSS VIN1 VOUT1 VB1 +XM1_f0 net13 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f1 net13 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f2 net13 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f3 net13 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f4 net13 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f5 net13 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f6 net13 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM1_f7 net13 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.26u +XM2_f0 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f1 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f2 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f3 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f4 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f5 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f6 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f7 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f8 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f9 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f10 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f11 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f12 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f13 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f14 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM2_f15 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.26u +XM3_f0 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f1 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f2 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f3 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f4 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f5 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f6 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f7 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f8 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f9 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f10 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f11 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f12 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f13 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f14 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f15 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f16 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f17 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f18 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f19 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f20 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f21 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f22 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f23 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f24 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f25 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f26 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f27 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f28 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f29 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f30 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.26u +XM3_f31 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.26u +XM4_f0 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f1 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f2 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f3 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f4 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f5 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f6 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f7 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f8 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f9 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f10 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f11 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f12 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f13 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f14 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f15 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f16 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f17 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f18 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f19 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f20 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f21 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f22 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f23 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f24 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f25 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f26 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f27 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f28 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f29 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f30 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f31 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f32 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f33 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f34 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f35 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f36 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f37 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f38 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f39 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f40 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f41 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f42 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f43 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f44 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f45 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f46 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f47 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f48 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f49 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f50 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f51 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f52 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f53 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f54 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f55 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f56 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f57 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f58 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f59 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f60 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f61 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f62 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM4_f63 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.26u +XM5_f0 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f1 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f2 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f3 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f4 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f5 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f6 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f7 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f8 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f9 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f10 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f11 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f12 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f13 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f14 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f15 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f16 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f17 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f18 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f19 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f20 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f21 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f22 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f23 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f24 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f25 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f26 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f27 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f28 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f29 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f30 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f31 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f32 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f33 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f34 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f35 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f36 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f37 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f38 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f39 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f40 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f41 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f42 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f43 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f44 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f45 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f46 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f47 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f48 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f49 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f50 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f51 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f52 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f53 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f54 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f55 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f56 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f57 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f58 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f59 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f60 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f61 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f62 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM5_f63 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.26u +XM6_f0 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f1 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f2 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f3 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f4 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f5 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f6 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f7 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f8 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f9 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f10 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f11 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f12 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f13 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f14 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f15 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f16 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f17 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f18 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f19 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f20 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f21 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f22 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f23 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f24 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f25 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f26 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f27 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f28 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f29 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f30 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f31 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f32 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f33 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f34 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f35 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f36 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f37 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f38 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f39 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f40 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f41 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f42 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f43 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f44 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f45 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f46 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f47 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f48 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f49 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f50 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f51 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f52 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f53 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f54 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f55 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f56 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f57 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f58 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f59 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f60 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f61 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f62 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f63 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f64 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f65 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f66 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f67 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f68 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f69 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f70 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f71 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f72 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f73 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f74 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f75 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f76 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f77 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f78 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f79 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f80 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f81 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f82 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f83 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f84 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f85 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f86 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f87 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f88 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f89 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f90 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f91 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f92 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f93 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f94 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f95 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f96 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f97 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f98 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f99 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f100 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f101 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f102 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f103 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f104 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f105 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f106 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f107 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f108 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f109 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f110 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f111 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f112 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f113 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f114 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f115 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f116 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f117 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f118 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f119 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f120 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f121 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f122 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f123 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f124 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f125 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f126 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +XM6_f127 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.26u +.ends C18_ihp130_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW2_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW2_sL1/testbench.spice new file mode 100644 index 00000000..3f26c7a4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW2_sL1/testbench.spice @@ -0,0 +1,58 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C18_ihp130_sW2_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +XB_VB1 VB1 VB1 VDDB VDDB sg13_lv_pmos w=8u l=0.26u +IB_VB1 VB1 VSS 2e-05 +* DC servo (disclosed test auxiliary): VINT -> input DC level that makes V_out = VT; frozen at VHOLD when KSW = 1 +VT VT 0 0.6 +VMID VMID 0 0.6 +VKSW KSW 0 0 +VHOLD VHOLD 0 0 +BSRV VSRV 0 V = (1-v(KSW))*(0.36 + 0.5*tanh(200*(v(VOUT1)-v(VT)))) + v(KSW)*v(VHOLD) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EIN VIN1 VINT VAC 0 1 +VAC VAC 0 dc 0 ac 1 sin(0 1m 1meg) +RL VOUT1 VMID 20000 +CL VOUT1 VMID 5e-12 +.option method=gear reltol=1e-3 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let iq = -i(VDD) +print vout0 vin0 iq +set vin0_s = "$&vin0" +ac dec 20 10 10G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +set gain_s = "$&gain_lf" +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +* open-loop DC transfer around the operating point (servo frozen at the input level it found) +alter @VHOLD[dc] = $vin0_s +alter @VKSW[dc] = 1 +dc VAC -0.4 0.4 0.001 +let gin = abs(deriv(v(VOUT1))) +meas dc gmid find gin at=0 +let gn = gin/gmid +meas dc vo_a find v(VOUT1) when gn=0.5 cross=1 +meas dc vo_b find v(VOUT1) when gn=0.5 cross=last +let out_swing = abs(vo_b - vo_a) +print out_swing +* distortion at a fixed OUTPUT amplitude of 0.1 V (servo frozen, input amplitude = amplitude / |gain|) +alter @VKSW[dc] = 0 +let a_lin = 10^($gain_s/20) +let vamp2 = 0.1/a_lin +if vamp2 > 0.3 + let vamp2 = 0.3 +end +print vamp2 +alter @VAC[sin] = [ 0 $&vamp2 1meg ] +tran 2n 6u 3u +fourier 1meg v(VOUT1) +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW2_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW2_sL2/case.json new file mode 100644 index 00000000..d3f2a310 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW2_sL2/case.json @@ -0,0 +1,185 @@ +{ + "case_id": "C18_ihp130_sW2_sL2", + "circuit_id": "C18", + "pdk": "ihp130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "dut_name": "C18_ihp130_sW2_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.52, + "nf": 8 + }, + "M2": { + "w": 8.0, + "l": 0.52, + "nf": 16 + }, + "M3": { + "w": 16.0, + "l": 0.52, + "nf": 32 + }, + "M4": { + "w": 32.0, + "l": 0.52, + "nf": 64 + }, + "M5": { + "w": 32.0, + "l": 0.52, + "nf": 64 + }, + "M6": { + "w": 64.0, + "l": 0.52, + "nf": 128 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 2e-05 + } + }, + "load": { + "RL": 20000.0, + "CL": 5e-12, + "vamp": 0.02, + "vout_target": 0.6, + "vin_center": 0.36, + "servo_slope": 200.0, + "options": ".option method=gear reltol=1e-3", + "vout_amp": 0.1 + }, + "category": "buffer_ab", + "notes": [ + "first-pass sizing v1", + "RL/CL returned to an ideal mid-supply source; open-loop output-swing metric added" + ], + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 16.0, + "l": 0.52, + "nf": 32, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.52, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.52, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 32.0, + "l0": 0.26, + "nf0": 64, + "uw0": 0.5, + "w": 64.0, + "l": 0.52, + "nf": 128, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "6fe5bda305e5fead", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M2", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo (freezable)" + }, + { + "kind": "testbench_element", + "what": "mid-supply load return" + }, + { + "kind": "testbench_element", + "what": "load resistor and capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW2_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW2_sL2/manifest.json new file mode 100644 index 00000000..33f65006 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW2_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "fcb6ad2987eacda2c69f90db87d78955a7c6d44cf320eccac0c4fa3b12136178", + "qualification.json": "e9a7dc5c06bba5b45451bbfc7f81189f5535727443b1a25ae5657aa7bb8dc126", + "specs.json": "6b134fe6da84f38d5ba3b0feebfebc504fd81d891e4813d8381137aa6d0b9668", + "target.spice": "5d7e704af71b759971f4d0fbd02573fd65f41da7fa8dbca60db0234c4f5dc8b8", + "target_lvs.spice": "a1a8f0179d6cdfaa793fc6b5038fbcfef11a16175f9e27fc324f4074a4b58550", + "testbench.spice": "04ba511ad3f0ad1f4f243e36327beb5ba4d943c331e186fd84a4e73ce0294c96" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW2_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW2_sL2/qualification.json new file mode 100644 index 00000000..92e37452 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW2_sL2/qualification.json @@ -0,0 +1,153 @@ +{ + "case_id": "C18_ihp130_sW2_sL2", + "circuit_id": "C18", + "pdk": "ihp130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "buffer_ab", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 16.0, + "l": 0.52, + "nf": 32, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.52, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.52, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 32.0, + "l0": 0.26, + "nf0": 64, + "uw0": 0.5, + "w": 64.0, + "l": 0.52, + "nf": 128, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "6fe5bda305e5fead", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "thd_pct=31.05 above floor 3", + "out_swing=0.2425 below floor 0.3" + ], + "spec": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 34650000.0 + }, + "out_swing": { + "min": 0.3 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 31.0486, + "iq": 7.012928e-05, + "f3db": 57755300.0, + "out_swing": 0.2424721 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.3 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 81.3, + "schematic_measures": { + "vout0": 0.6009576, + "vin0": 0.4546021, + "iq": 7.012928e-05, + "gain_lf": -1.998438, + "f3db": 57755300.0, + "gmid": 0.7946839, + "vo_a": 0.8267659, + "vo_b": 0.5842938, + "out_swing": 0.2424721, + "vamp2": 0.1258699, + "thd_pct": 31.0486 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW2_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW2_sL2/specs.json new file mode 100644 index 00000000..b3fc9a81 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW2_sL2/specs.json @@ -0,0 +1,37 @@ +{ + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 34650000.0 + }, + "out_swing": { + "min": 0.3 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 31.0486, + "iq": 7.012928e-05, + "f3db": 57755300.0, + "out_swing": 0.2424721 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.3 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW2_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW2_sL2/target.spice new file mode 100644 index 00000000..016ce6a9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW2_sL2/target.spice @@ -0,0 +1,8 @@ +.subckt C18_ihp130_sW2_sL2 VDD VSS VIN1 VOUT1 VB1 +XM1 net13 VIN1 VSS VSS sg13_lv_nmos w=4u l=0.52u ng=8 m=1 +XM2 net9 VB1 VDD VDD sg13_lv_pmos w=8u l=0.52u ng=16 m=1 +XM3 net9 net9 net22 VSS sg13_lv_nmos w=16u l=0.52u ng=32 m=1 +XM4 net13 net13 net22 VDD sg13_lv_pmos w=32u l=0.52u ng=64 m=1 +XM5 VDD net9 VOUT1 VSS sg13_lv_nmos w=32u l=0.52u ng=64 m=1 +XM6 VSS net13 VOUT1 VDD sg13_lv_pmos w=64u l=0.52u ng=128 m=1 +.ends C18_ihp130_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW2_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW2_sL2/target_lvs.spice new file mode 100644 index 00000000..395245fd --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW2_sL2/target_lvs.spice @@ -0,0 +1,314 @@ +.subckt C18_ihp130_sW2_sL2 VDD VSS VIN1 VOUT1 VB1 +XM1_f0 net13 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f1 net13 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f2 net13 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f3 net13 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f4 net13 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f5 net13 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f6 net13 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM1_f7 net13 VIN1 VSS VSS sg13_lv_nmos w=0.5u l=0.52u +XM2_f0 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f1 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f2 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f3 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f4 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f5 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f6 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f7 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f8 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f9 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f10 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f11 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f12 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f13 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f14 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM2_f15 net9 VB1 VDD VDD sg13_lv_pmos w=0.5u l=0.52u +XM3_f0 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f1 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f2 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f3 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f4 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f5 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f6 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f7 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f8 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f9 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f10 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f11 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f12 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f13 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f14 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f15 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f16 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f17 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f18 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f19 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f20 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f21 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f22 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f23 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f24 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f25 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f26 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f27 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f28 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f29 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f30 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.52u +XM3_f31 net9 net9 net22 VSS sg13_lv_nmos w=0.5u l=0.52u +XM4_f0 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f1 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f2 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f3 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f4 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f5 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f6 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f7 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f8 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f9 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f10 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f11 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f12 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f13 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f14 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f15 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f16 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f17 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f18 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f19 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f20 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f21 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f22 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f23 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f24 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f25 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f26 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f27 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f28 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f29 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f30 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f31 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f32 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f33 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f34 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f35 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f36 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f37 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f38 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f39 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f40 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f41 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f42 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f43 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f44 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f45 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f46 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f47 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f48 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f49 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f50 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f51 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f52 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f53 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f54 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f55 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f56 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f57 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f58 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f59 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f60 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f61 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f62 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM4_f63 net13 net13 net22 VDD sg13_lv_pmos w=0.5u l=0.52u +XM5_f0 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f1 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f2 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f3 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f4 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f5 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f6 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f7 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f8 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f9 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f10 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f11 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f12 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f13 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f14 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f15 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f16 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f17 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f18 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f19 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f20 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f21 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f22 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f23 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f24 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f25 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f26 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f27 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f28 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f29 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f30 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f31 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f32 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f33 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f34 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f35 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f36 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f37 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f38 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f39 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f40 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f41 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f42 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f43 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f44 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f45 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f46 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f47 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f48 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f49 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f50 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f51 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f52 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f53 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f54 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f55 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f56 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f57 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f58 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f59 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f60 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f61 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f62 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM5_f63 VDD net9 VOUT1 VSS sg13_lv_nmos w=0.5u l=0.52u +XM6_f0 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f1 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f2 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f3 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f4 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f5 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f6 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f7 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f8 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f9 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f10 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f11 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f12 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f13 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f14 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f15 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f16 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f17 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f18 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f19 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f20 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f21 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f22 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f23 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f24 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f25 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f26 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f27 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f28 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f29 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f30 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f31 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f32 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f33 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f34 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f35 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f36 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f37 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f38 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f39 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f40 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f41 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f42 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f43 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f44 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f45 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f46 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f47 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f48 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f49 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f50 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f51 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f52 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f53 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f54 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f55 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f56 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f57 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f58 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f59 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f60 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f61 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f62 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f63 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f64 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f65 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f66 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f67 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f68 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f69 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f70 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f71 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f72 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f73 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f74 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f75 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f76 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f77 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f78 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f79 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f80 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f81 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f82 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f83 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f84 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f85 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f86 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f87 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f88 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f89 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f90 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f91 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f92 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f93 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f94 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f95 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f96 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f97 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f98 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f99 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f100 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f101 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f102 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f103 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f104 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f105 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f106 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f107 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f108 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f109 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f110 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f111 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f112 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f113 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f114 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f115 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f116 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f117 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f118 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f119 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f120 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f121 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f122 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f123 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f124 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f125 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f126 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +XM6_f127 VSS net13 VOUT1 VDD sg13_lv_pmos w=0.5u l=0.52u +.ends C18_ihp130_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW2_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW2_sL2/testbench.spice new file mode 100644 index 00000000..c940cc6e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/ihp130/sW2_sL2/testbench.spice @@ -0,0 +1,58 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C18_ihp130_sW2_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.2 +VSS VSS 0 0 +VDDB VDDB 0 1.2 +XB_VB1 VB1 VB1 VDDB VDDB sg13_lv_pmos w=8u l=0.52u +IB_VB1 VB1 VSS 2e-05 +* DC servo (disclosed test auxiliary): VINT -> input DC level that makes V_out = VT; frozen at VHOLD when KSW = 1 +VT VT 0 0.6 +VMID VMID 0 0.6 +VKSW KSW 0 0 +VHOLD VHOLD 0 0 +BSRV VSRV 0 V = (1-v(KSW))*(0.36 + 0.5*tanh(200*(v(VOUT1)-v(VT)))) + v(KSW)*v(VHOLD) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EIN VIN1 VINT VAC 0 1 +VAC VAC 0 dc 0 ac 1 sin(0 1m 1meg) +RL VOUT1 VMID 20000 +CL VOUT1 VMID 5e-12 +.option method=gear reltol=1e-3 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let iq = -i(VDD) +print vout0 vin0 iq +set vin0_s = "$&vin0" +ac dec 20 10 10G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +set gain_s = "$&gain_lf" +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +* open-loop DC transfer around the operating point (servo frozen at the input level it found) +alter @VHOLD[dc] = $vin0_s +alter @VKSW[dc] = 1 +dc VAC -0.4 0.4 0.001 +let gin = abs(deriv(v(VOUT1))) +meas dc gmid find gin at=0 +let gn = gin/gmid +meas dc vo_a find v(VOUT1) when gn=0.5 cross=1 +meas dc vo_b find v(VOUT1) when gn=0.5 cross=last +let out_swing = abs(vo_b - vo_a) +print out_swing +* distortion at a fixed OUTPUT amplitude of 0.1 V (servo frozen, input amplitude = amplitude / |gain|) +alter @VKSW[dc] = 0 +let a_lin = 10^($gain_s/20) +let vamp2 = 0.1/a_lin +if vamp2 > 0.3 + let vamp2 = 0.3 +end +print vamp2 +alter @VAC[sin] = [ 0 $&vamp2 1meg ] +tran 2n 6u 3u +fourier 1meg v(VOUT1) +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C18/sky130/sW0.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW0.5_sL1.5/case.json new file mode 100644 index 00000000..d33a46cc --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW0.5_sL1.5/case.json @@ -0,0 +1,185 @@ +{ + "case_id": "C18_sky130_sW0.5_sL1.5", + "circuit_id": "C18", + "pdk": "sky130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "dut_name": "C18_sky130_sW0.5_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 1.0, + "l": 0.45, + "nf": 2 + }, + "M2": { + "w": 2.0, + "l": 0.45, + "nf": 4 + }, + "M3": { + "w": 4.0, + "l": 0.45, + "nf": 8 + }, + "M4": { + "w": 8.0, + "l": 0.45, + "nf": 16 + }, + "M5": { + "w": 8.0, + "l": 0.45, + "nf": 16 + }, + "M6": { + "w": 16.0, + "l": 0.45, + "nf": 32 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 2e-05 + } + }, + "load": { + "RL": 20000.0, + "CL": 5e-12, + "vamp": 0.02, + "vout_target": 0.9, + "vin_center": 0.54, + "servo_slope": 200.0, + "options": ".option method=gear reltol=1e-3", + "vout_amp": 0.1 + }, + "category": "buffer_ab", + "notes": [ + "first-pass sizing v1", + "RL/CL returned to an ideal mid-supply source; open-loop output-swing metric added" + ], + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.45, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 32.0, + "l0": 0.3, + "nf0": 64, + "uw0": 0.5, + "w": 16.0, + "l": 0.45, + "nf": 32, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "7964407fd9178853", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M2", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo (freezable)" + }, + { + "kind": "testbench_element", + "what": "mid-supply load return" + }, + { + "kind": "testbench_element", + "what": "load resistor and capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/sky130/sW0.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW0.5_sL1.5/manifest.json new file mode 100644 index 00000000..f2efa412 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW0.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "2af32d6ee781c53cc72b46de7269f68f248d2c0d405b2fcc22cf1c68b569570b", + "qualification.json": "94298dab75ed8b0e4705c3ab38d5ca02d70e1c6df715c7110243b1791743f00f", + "specs.json": "dfc286f3b34a8e75174cf071926b4995d7de7b8fa6606754d4bc6a0d9673d87c", + "target.spice": "bef774854c264ebb3a1ed5ff9fb2e1065a527efb601f06b15fa07fc2e9fe4a9b", + "target_lvs.spice": "28e3dbb6008df7edcf5be15e3d28904d31f84906b7f1fa3b4c72b2a2056b7faa", + "testbench.spice": "8a9f276721635af6e727b1b6cdb6295da1389f5d8641b1cb9c577402dc7baba4" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/sky130/sW0.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW0.5_sL1.5/qualification.json new file mode 100644 index 00000000..c19b0af5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW0.5_sL1.5/qualification.json @@ -0,0 +1,154 @@ +{ + "case_id": "C18_sky130_sW0.5_sL1.5", + "circuit_id": "C18", + "pdk": "sky130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "buffer_ab", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.45, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 32.0, + "l0": 0.3, + "nf0": 64, + "uw0": 0.5, + "w": 16.0, + "l": 0.45, + "nf": 32, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "7964407fd9178853", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "servo did not reach the output target: vout0=0.983791 target=0.9 (tol 0.036 V)", + "thd_pct=43.65 above floor 3", + "out_swing=0 below floor 0.45" + ], + "spec": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.45 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 43.6465, + "iq": 7.38858e-06, + "f3db": 7027076.0, + "out_swing": 0.0 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.45 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 10.7, + "schematic_measures": { + "vout0": 0.983791, + "vin0": 1.04, + "iq": 7.38858e-06, + "gain_lf": -49.45347, + "f3db": 7027076.0, + "gmid": 0.003367665, + "vo_a": 0.983392, + "vo_b": 0.983392, + "out_swing": 0.0, + "vamp2": 0.3, + "thd_pct": 43.6465 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/sky130/sW0.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW0.5_sL1.5/specs.json new file mode 100644 index 00000000..12556403 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW0.5_sL1.5/specs.json @@ -0,0 +1,37 @@ +{ + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.45 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 43.6465, + "iq": 7.38858e-06, + "f3db": 7027076.0, + "out_swing": 0.0 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.45 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/sky130/sW0.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW0.5_sL1.5/target.spice new file mode 100644 index 00000000..2659526d --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW0.5_sL1.5/target.spice @@ -0,0 +1,8 @@ +.subckt C18_sky130_sW0.5_sL1.5 VDD VSS VIN1 VOUT1 VB1 +XM1 net13 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=1 l=0.45 nf=2 +XM2 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=2 l=0.45 nf=4 +XM3 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=4 l=0.45 nf=8 +XM4 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=8 l=0.45 nf=16 +XM5 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=8 l=0.45 nf=16 +XM6 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=16 l=0.45 nf=32 +.ends C18_sky130_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C18/sky130/sW0.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW0.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..8f5b5bac --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW0.5_sL1.5/target_lvs.spice @@ -0,0 +1,80 @@ +.subckt C18_sky130_sW0.5_sL1.5 VDD VSS VIN1 VOUT1 VB1 +XM1_f0 net13 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f1 net13 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f0 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f1 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f2 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f3 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM3_f0 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f1 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f2 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f3 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f4 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f5 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f6 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f7 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f0 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f1 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f2 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f3 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f4 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f5 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f6 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f7 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f8 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f9 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f10 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f11 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f12 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f13 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f14 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f15 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f0 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f1 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f2 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f3 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f4 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f5 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f6 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f7 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f8 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f9 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f10 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f11 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f12 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f13 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f14 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f15 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM6_f0 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f1 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f2 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f3 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f4 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f5 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f6 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f7 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f8 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f9 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f10 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f11 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f12 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f13 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f14 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f15 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f16 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f17 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f18 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f19 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f20 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f21 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f22 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f23 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f24 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f25 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f26 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f27 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f28 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f29 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f30 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f31 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +.ends C18_sky130_sW0.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C18/sky130/sW0.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW0.5_sL1.5/testbench.spice new file mode 100644 index 00000000..40904adc --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW0.5_sL1.5/testbench.spice @@ -0,0 +1,58 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C18_sky130_sW0.5_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +XB_VB1 VB1 VB1 VDDB VDDB sky130_fd_pr__pfet_01v8 w=2 l=0.45 +IB_VB1 VB1 VSS 2e-05 +* DC servo (disclosed test auxiliary): VINT -> input DC level that makes V_out = VT; frozen at VHOLD when KSW = 1 +VT VT 0 0.9 +VMID VMID 0 0.9 +VKSW KSW 0 0 +VHOLD VHOLD 0 0 +BSRV VSRV 0 V = (1-v(KSW))*(0.54 + 0.5*tanh(200*(v(VOUT1)-v(VT)))) + v(KSW)*v(VHOLD) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EIN VIN1 VINT VAC 0 1 +VAC VAC 0 dc 0 ac 1 sin(0 1m 1meg) +RL VOUT1 VMID 20000 +CL VOUT1 VMID 5e-12 +.option method=gear reltol=1e-3 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let iq = -i(VDD) +print vout0 vin0 iq +set vin0_s = "$&vin0" +ac dec 20 10 10G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +set gain_s = "$&gain_lf" +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +* open-loop DC transfer around the operating point (servo frozen at the input level it found) +alter @VHOLD[dc] = $vin0_s +alter @VKSW[dc] = 1 +dc VAC -0.4 0.4 0.001 +let gin = abs(deriv(v(VOUT1))) +meas dc gmid find gin at=0 +let gn = gin/gmid +meas dc vo_a find v(VOUT1) when gn=0.5 cross=1 +meas dc vo_b find v(VOUT1) when gn=0.5 cross=last +let out_swing = abs(vo_b - vo_a) +print out_swing +* distortion at a fixed OUTPUT amplitude of 0.1 V (servo frozen, input amplitude = amplitude / |gain|) +alter @VKSW[dc] = 0 +let a_lin = 10^($gain_s/20) +let vamp2 = 0.1/a_lin +if vamp2 > 0.3 + let vamp2 = 0.3 +end +print vamp2 +alter @VAC[sin] = [ 0 $&vamp2 1meg ] +tran 2n 6u 3u +fourier 1meg v(VOUT1) +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C18/sky130/sW0.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW0.5_sL1/case.json new file mode 100644 index 00000000..f0d664ef --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW0.5_sL1/case.json @@ -0,0 +1,185 @@ +{ + "case_id": "C18_sky130_sW0.5_sL1", + "circuit_id": "C18", + "pdk": "sky130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "dut_name": "C18_sky130_sW0.5_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 1.0, + "l": 0.3, + "nf": 2 + }, + "M2": { + "w": 2.0, + "l": 0.3, + "nf": 4 + }, + "M3": { + "w": 4.0, + "l": 0.3, + "nf": 8 + }, + "M4": { + "w": 8.0, + "l": 0.3, + "nf": 16 + }, + "M5": { + "w": 8.0, + "l": 0.3, + "nf": 16 + }, + "M6": { + "w": 16.0, + "l": 0.3, + "nf": 32 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 2e-05 + } + }, + "load": { + "RL": 20000.0, + "CL": 5e-12, + "vamp": 0.02, + "vout_target": 0.9, + "vin_center": 0.54, + "servo_slope": 200.0, + "options": ".option method=gear reltol=1e-3", + "vout_amp": 0.1 + }, + "category": "buffer_ab", + "notes": [ + "first-pass sizing v1", + "RL/CL returned to an ideal mid-supply source; open-loop output-swing metric added" + ], + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.3, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 32.0, + "l0": 0.3, + "nf0": 64, + "uw0": 0.5, + "w": 16.0, + "l": 0.3, + "nf": 32, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "21b49306a7f1808e", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M2", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo (freezable)" + }, + { + "kind": "testbench_element", + "what": "mid-supply load return" + }, + { + "kind": "testbench_element", + "what": "load resistor and capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/sky130/sW0.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW0.5_sL1/manifest.json new file mode 100644 index 00000000..e1d9086f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW0.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "1e2429a6195d5c0847ed8a878b6fb13ce991fe47baf3b100355fc1cbdc01bfc8", + "qualification.json": "91c3453ada9c9aa01d7ec66da7e65cee6027f1dfbd16148ccc3b59a25bb43518", + "specs.json": "181f4131de668148f8a40bf29bc400802e4da7a758df1464fad0acc1a28d85bb", + "target.spice": "dfb640ac0514edba203c574dd769287d40dc71d4a4ccee13edf080853d0ab791", + "target_lvs.spice": "5bf47dc79bd5d7f5a03944e4f40df5ac9067ee92dec3d843be3cfc732a7cc4d6", + "testbench.spice": "732d752ce6ff92221e37ffba29da70bcea6b6c0eb9d060574e10653547d43cd3" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/sky130/sW0.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW0.5_sL1/qualification.json new file mode 100644 index 00000000..75e2a68a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW0.5_sL1/qualification.json @@ -0,0 +1,154 @@ +{ + "case_id": "C18_sky130_sW0.5_sL1", + "circuit_id": "C18", + "pdk": "sky130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "buffer_ab", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.3, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 32.0, + "l0": 0.3, + "nf0": 64, + "uw0": 0.5, + "w": 16.0, + "l": 0.3, + "nf": 32, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "21b49306a7f1808e", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "servo did not reach the output target: vout0=0.9614974 target=0.9 (tol 0.036 V)", + "thd_pct=49.73 above floor 3", + "out_swing=0 below floor 0.45" + ], + "spec": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5852000.0 + }, + "out_swing": { + "min": 0.45 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 49.7262, + "iq": 1.024917e-05, + "f3db": 9752937.0, + "out_swing": 0.0 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.45 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 10.7, + "schematic_measures": { + "vout0": 0.9614974, + "vin0": 1.04, + "iq": 1.024917e-05, + "gain_lf": -42.24355, + "f3db": 9752937.0, + "gmid": 0.007723707, + "vo_a": 0.9606606, + "vo_b": 0.9606606, + "out_swing": 0.0, + "vamp2": 0.3, + "thd_pct": 49.7262 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/sky130/sW0.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW0.5_sL1/specs.json new file mode 100644 index 00000000..180657cd --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW0.5_sL1/specs.json @@ -0,0 +1,37 @@ +{ + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5852000.0 + }, + "out_swing": { + "min": 0.45 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 49.7262, + "iq": 1.024917e-05, + "f3db": 9752937.0, + "out_swing": 0.0 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.45 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/sky130/sW0.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW0.5_sL1/target.spice new file mode 100644 index 00000000..f26e6059 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW0.5_sL1/target.spice @@ -0,0 +1,8 @@ +.subckt C18_sky130_sW0.5_sL1 VDD VSS VIN1 VOUT1 VB1 +XM1 net13 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=1 l=0.3 nf=2 +XM2 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=2 l=0.3 nf=4 +XM3 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=4 l=0.3 nf=8 +XM4 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=8 l=0.3 nf=16 +XM5 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=8 l=0.3 nf=16 +XM6 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=16 l=0.3 nf=32 +.ends C18_sky130_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C18/sky130/sW0.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW0.5_sL1/target_lvs.spice new file mode 100644 index 00000000..b749d864 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW0.5_sL1/target_lvs.spice @@ -0,0 +1,80 @@ +.subckt C18_sky130_sW0.5_sL1 VDD VSS VIN1 VOUT1 VB1 +XM1_f0 net13 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f1 net13 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f0 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f1 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f2 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f3 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM3_f0 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f1 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f2 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f3 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f4 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f5 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f6 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f7 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f0 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f1 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f2 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f3 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f4 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f5 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f6 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f7 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f8 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f9 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f10 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f11 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f12 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f13 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f14 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f15 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f0 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f1 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f2 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f3 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f4 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f5 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f6 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f7 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f8 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f9 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f10 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f11 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f12 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f13 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f14 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f15 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM6_f0 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f1 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f2 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f3 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f4 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f5 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f6 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f7 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f8 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f9 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f10 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f11 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f12 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f13 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f14 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f15 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f16 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f17 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f18 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f19 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f20 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f21 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f22 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f23 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f24 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f25 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f26 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f27 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f28 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f29 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f30 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f31 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +.ends C18_sky130_sW0.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C18/sky130/sW0.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW0.5_sL1/testbench.spice new file mode 100644 index 00000000..45007828 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW0.5_sL1/testbench.spice @@ -0,0 +1,58 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C18_sky130_sW0.5_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +XB_VB1 VB1 VB1 VDDB VDDB sky130_fd_pr__pfet_01v8 w=2 l=0.3 +IB_VB1 VB1 VSS 2e-05 +* DC servo (disclosed test auxiliary): VINT -> input DC level that makes V_out = VT; frozen at VHOLD when KSW = 1 +VT VT 0 0.9 +VMID VMID 0 0.9 +VKSW KSW 0 0 +VHOLD VHOLD 0 0 +BSRV VSRV 0 V = (1-v(KSW))*(0.54 + 0.5*tanh(200*(v(VOUT1)-v(VT)))) + v(KSW)*v(VHOLD) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EIN VIN1 VINT VAC 0 1 +VAC VAC 0 dc 0 ac 1 sin(0 1m 1meg) +RL VOUT1 VMID 20000 +CL VOUT1 VMID 5e-12 +.option method=gear reltol=1e-3 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let iq = -i(VDD) +print vout0 vin0 iq +set vin0_s = "$&vin0" +ac dec 20 10 10G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +set gain_s = "$&gain_lf" +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +* open-loop DC transfer around the operating point (servo frozen at the input level it found) +alter @VHOLD[dc] = $vin0_s +alter @VKSW[dc] = 1 +dc VAC -0.4 0.4 0.001 +let gin = abs(deriv(v(VOUT1))) +meas dc gmid find gin at=0 +let gn = gin/gmid +meas dc vo_a find v(VOUT1) when gn=0.5 cross=1 +meas dc vo_b find v(VOUT1) when gn=0.5 cross=last +let out_swing = abs(vo_b - vo_a) +print out_swing +* distortion at a fixed OUTPUT amplitude of 0.1 V (servo frozen, input amplitude = amplitude / |gain|) +alter @VKSW[dc] = 0 +let a_lin = 10^($gain_s/20) +let vamp2 = 0.1/a_lin +if vamp2 > 0.3 + let vamp2 = 0.3 +end +print vamp2 +alter @VAC[sin] = [ 0 $&vamp2 1meg ] +tran 2n 6u 3u +fourier 1meg v(VOUT1) +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C18/sky130/sW0.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW0.5_sL2/case.json new file mode 100644 index 00000000..7ed1b765 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW0.5_sL2/case.json @@ -0,0 +1,185 @@ +{ + "case_id": "C18_sky130_sW0.5_sL2", + "circuit_id": "C18", + "pdk": "sky130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "dut_name": "C18_sky130_sW0.5_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 1.0, + "l": 0.6, + "nf": 2 + }, + "M2": { + "w": 2.0, + "l": 0.6, + "nf": 4 + }, + "M3": { + "w": 4.0, + "l": 0.6, + "nf": 8 + }, + "M4": { + "w": 8.0, + "l": 0.6, + "nf": 16 + }, + "M5": { + "w": 8.0, + "l": 0.6, + "nf": 16 + }, + "M6": { + "w": 16.0, + "l": 0.6, + "nf": 32 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 2e-05 + } + }, + "load": { + "RL": 20000.0, + "CL": 5e-12, + "vamp": 0.02, + "vout_target": 0.9, + "vin_center": 0.54, + "servo_slope": 200.0, + "options": ".option method=gear reltol=1e-3", + "vout_amp": 0.1 + }, + "category": "buffer_ab", + "notes": [ + "first-pass sizing v1", + "RL/CL returned to an ideal mid-supply source; open-loop output-swing metric added" + ], + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.6, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 32.0, + "l0": 0.3, + "nf0": 64, + "uw0": 0.5, + "w": 16.0, + "l": 0.6, + "nf": 32, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "4519e206a6fac587", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M2", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo (freezable)" + }, + { + "kind": "testbench_element", + "what": "mid-supply load return" + }, + { + "kind": "testbench_element", + "what": "load resistor and capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/sky130/sW0.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW0.5_sL2/manifest.json new file mode 100644 index 00000000..817d1193 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW0.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "c743ab592b1533c79433e09f97ff6d7b26bc25282797a7cee549c696f803b6bf", + "qualification.json": "d34c4bc2a2c6ed8ad32d96f7bfa0497fb4df948256b1c2e722e2b8d22d9a7efa", + "specs.json": "b4245d7aeeb4fe98d7a26ebfdd435a32eff2a90a22eba4278c0ec9bf72935252", + "target.spice": "fce0c65427dbd193572d9e086f1755c08c4ab8d5d2a3907f43a1538f2b74be27", + "target_lvs.spice": "1d5110712e94a234ebc14885fa9440558fc4049ab0914f97b57a4a70150f5242", + "testbench.spice": "09d820d22bfb793d79f6a8b904edfa7cdb8b203a85f9931dde3559005c378e86" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/sky130/sW0.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW0.5_sL2/qualification.json new file mode 100644 index 00000000..9f812390 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW0.5_sL2/qualification.json @@ -0,0 +1,154 @@ +{ + "case_id": "C18_sky130_sW0.5_sL2", + "circuit_id": "C18", + "pdk": "sky130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "buffer_ab", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.6, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 32.0, + "l0": 0.3, + "nf0": 64, + "uw0": 0.5, + "w": 16.0, + "l": 0.6, + "nf": 32, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "4519e206a6fac587", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "servo did not reach the output target: vout0=0.9867281 target=0.9 (tol 0.036 V)", + "thd_pct=41.38 above floor 3", + "out_swing=0 below floor 0.45" + ], + "spec": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.45 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 41.3803, + "iq": 6.251843e-06, + "f3db": 5960859.0, + "out_swing": 0.0 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.45 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 9.8, + "schematic_measures": { + "vout0": 0.9867281, + "vin0": 1.04, + "iq": 6.251843e-06, + "gain_lf": -54.26525, + "f3db": 5960859.0, + "gmid": 0.001935263, + "vo_a": 0.9864907, + "vo_b": 0.9864907, + "out_swing": 0.0, + "vamp2": 0.3, + "thd_pct": 41.3803 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/sky130/sW0.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW0.5_sL2/specs.json new file mode 100644 index 00000000..aefa4026 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW0.5_sL2/specs.json @@ -0,0 +1,37 @@ +{ + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.45 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 41.3803, + "iq": 6.251843e-06, + "f3db": 5960859.0, + "out_swing": 0.0 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.45 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/sky130/sW0.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW0.5_sL2/target.spice new file mode 100644 index 00000000..ebf0b77b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW0.5_sL2/target.spice @@ -0,0 +1,8 @@ +.subckt C18_sky130_sW0.5_sL2 VDD VSS VIN1 VOUT1 VB1 +XM1 net13 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=1 l=0.6 nf=2 +XM2 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=2 l=0.6 nf=4 +XM3 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=4 l=0.6 nf=8 +XM4 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=8 l=0.6 nf=16 +XM5 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=8 l=0.6 nf=16 +XM6 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=16 l=0.6 nf=32 +.ends C18_sky130_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C18/sky130/sW0.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW0.5_sL2/target_lvs.spice new file mode 100644 index 00000000..d7157ea8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW0.5_sL2/target_lvs.spice @@ -0,0 +1,80 @@ +.subckt C18_sky130_sW0.5_sL2 VDD VSS VIN1 VOUT1 VB1 +XM1_f0 net13 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f1 net13 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f0 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f1 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f2 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f3 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM3_f0 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f1 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f2 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f3 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f4 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f5 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f6 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f7 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f0 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f1 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f2 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f3 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f4 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f5 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f6 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f7 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f8 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f9 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f10 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f11 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f12 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f13 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f14 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f15 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f0 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f1 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f2 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f3 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f4 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f5 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f6 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f7 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f8 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f9 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f10 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f11 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f12 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f13 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f14 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f15 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM6_f0 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f1 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f2 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f3 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f4 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f5 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f6 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f7 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f8 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f9 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f10 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f11 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f12 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f13 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f14 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f15 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f16 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f17 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f18 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f19 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f20 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f21 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f22 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f23 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f24 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f25 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f26 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f27 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f28 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f29 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f30 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f31 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +.ends C18_sky130_sW0.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C18/sky130/sW0.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW0.5_sL2/testbench.spice new file mode 100644 index 00000000..812f8451 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW0.5_sL2/testbench.spice @@ -0,0 +1,58 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C18_sky130_sW0.5_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +XB_VB1 VB1 VB1 VDDB VDDB sky130_fd_pr__pfet_01v8 w=2 l=0.6 +IB_VB1 VB1 VSS 2e-05 +* DC servo (disclosed test auxiliary): VINT -> input DC level that makes V_out = VT; frozen at VHOLD when KSW = 1 +VT VT 0 0.9 +VMID VMID 0 0.9 +VKSW KSW 0 0 +VHOLD VHOLD 0 0 +BSRV VSRV 0 V = (1-v(KSW))*(0.54 + 0.5*tanh(200*(v(VOUT1)-v(VT)))) + v(KSW)*v(VHOLD) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EIN VIN1 VINT VAC 0 1 +VAC VAC 0 dc 0 ac 1 sin(0 1m 1meg) +RL VOUT1 VMID 20000 +CL VOUT1 VMID 5e-12 +.option method=gear reltol=1e-3 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let iq = -i(VDD) +print vout0 vin0 iq +set vin0_s = "$&vin0" +ac dec 20 10 10G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +set gain_s = "$&gain_lf" +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +* open-loop DC transfer around the operating point (servo frozen at the input level it found) +alter @VHOLD[dc] = $vin0_s +alter @VKSW[dc] = 1 +dc VAC -0.4 0.4 0.001 +let gin = abs(deriv(v(VOUT1))) +meas dc gmid find gin at=0 +let gn = gin/gmid +meas dc vo_a find v(VOUT1) when gn=0.5 cross=1 +meas dc vo_b find v(VOUT1) when gn=0.5 cross=last +let out_swing = abs(vo_b - vo_a) +print out_swing +* distortion at a fixed OUTPUT amplitude of 0.1 V (servo frozen, input amplitude = amplitude / |gain|) +alter @VKSW[dc] = 0 +let a_lin = 10^($gain_s/20) +let vamp2 = 0.1/a_lin +if vamp2 > 0.3 + let vamp2 = 0.3 +end +print vamp2 +alter @VAC[sin] = [ 0 $&vamp2 1meg ] +tran 2n 6u 3u +fourier 1meg v(VOUT1) +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1.5_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1.5_sL1.5/case.json new file mode 100644 index 00000000..bb09f433 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1.5_sL1.5/case.json @@ -0,0 +1,185 @@ +{ + "case_id": "C18_sky130_sW1.5_sL1.5", + "circuit_id": "C18", + "pdk": "sky130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "dut_name": "C18_sky130_sW1.5_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 3.0, + "l": 0.45, + "nf": 6 + }, + "M2": { + "w": 6.0, + "l": 0.45, + "nf": 12 + }, + "M3": { + "w": 12.0, + "l": 0.45, + "nf": 24 + }, + "M4": { + "w": 24.0, + "l": 0.45, + "nf": 48 + }, + "M5": { + "w": 24.0, + "l": 0.45, + "nf": 48 + }, + "M6": { + "w": 48.0, + "l": 0.45, + "nf": 96 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 2e-05 + } + }, + "load": { + "RL": 20000.0, + "CL": 5e-12, + "vamp": 0.02, + "vout_target": 0.9, + "vin_center": 0.54, + "servo_slope": 200.0, + "options": ".option method=gear reltol=1e-3", + "vout_amp": 0.1 + }, + "category": "buffer_ab", + "notes": [ + "first-pass sizing v1", + "RL/CL returned to an ideal mid-supply source; open-loop output-swing metric added" + ], + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.45, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.45, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 12.0, + "l": 0.45, + "nf": 24, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.45, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.45, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 32.0, + "l0": 0.3, + "nf0": 64, + "uw0": 0.5, + "w": 48.0, + "l": 0.45, + "nf": 96, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "27dbdf4b8370397c", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M2", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo (freezable)" + }, + { + "kind": "testbench_element", + "what": "mid-supply load return" + }, + { + "kind": "testbench_element", + "what": "load resistor and capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1.5_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1.5_sL1.5/manifest.json new file mode 100644 index 00000000..ec590a6c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1.5_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "4fd354134e6cd674119e2de404082b20f90d0230547104e70af32c488bdf5b0b", + "qualification.json": "2bdaf2e64b282c57f53d854373067361b50f14564cc5a1431ffb464ffdbf32cd", + "specs.json": "19760f3a6e4ade806375f28238711e21b9dddc71103916b17a973b46da088be9", + "target.spice": "795b6466947bfcd390bced0fb2af6ffa413d9e06ca779b4c42e13d5ad3593613", + "target_lvs.spice": "c7e8585ac90c96712ff6a8c3a5faa750fbbd76b144f1fd45e5bf9edef9abdc88", + "testbench.spice": "b89b66ef47c52ba977df72a82112a596de8598b3b810904b1b2979c591593433" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1.5_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1.5_sL1.5/qualification.json new file mode 100644 index 00000000..7ef34524 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1.5_sL1.5/qualification.json @@ -0,0 +1,154 @@ +{ + "case_id": "C18_sky130_sW1.5_sL1.5", + "circuit_id": "C18", + "pdk": "sky130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "buffer_ab", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.45, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.45, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 12.0, + "l": 0.45, + "nf": 24, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.45, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.45, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 32.0, + "l0": 0.3, + "nf0": 64, + "uw0": 0.5, + "w": 48.0, + "l": 0.45, + "nf": 96, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "27dbdf4b8370397c", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "servo did not reach the output target: vout0=0.99676 target=0.9 (tol 0.036 V)", + "thd_pct=46.44 above floor 3", + "out_swing=0 below floor 0.45" + ], + "spec": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 8890000.0 + }, + "out_swing": { + "min": 0.45 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 46.4405, + "iq": 1.579314e-05, + "f3db": 14816630.0, + "out_swing": 0.0 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.45 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 14.2, + "schematic_measures": { + "vout0": 0.99676, + "vin0": 1.04, + "iq": 1.579314e-05, + "gain_lf": -45.19149, + "f3db": 14816630.0, + "gmid": 0.005500832, + "vo_a": 0.9961201, + "vo_b": 0.9961201, + "out_swing": 0.0, + "vamp2": 0.3, + "thd_pct": 46.4405 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1.5_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1.5_sL1.5/specs.json new file mode 100644 index 00000000..5d0ed3a5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1.5_sL1.5/specs.json @@ -0,0 +1,37 @@ +{ + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 8890000.0 + }, + "out_swing": { + "min": 0.45 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 46.4405, + "iq": 1.579314e-05, + "f3db": 14816630.0, + "out_swing": 0.0 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.45 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1.5_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1.5_sL1.5/target.spice new file mode 100644 index 00000000..e7492443 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1.5_sL1.5/target.spice @@ -0,0 +1,8 @@ +.subckt C18_sky130_sW1.5_sL1.5 VDD VSS VIN1 VOUT1 VB1 +XM1 net13 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=3 l=0.45 nf=6 +XM2 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=6 l=0.45 nf=12 +XM3 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=12 l=0.45 nf=24 +XM4 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=24 l=0.45 nf=48 +XM5 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=24 l=0.45 nf=48 +XM6 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=48 l=0.45 nf=96 +.ends C18_sky130_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1.5_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1.5_sL1.5/target_lvs.spice new file mode 100644 index 00000000..e5e6065c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1.5_sL1.5/target_lvs.spice @@ -0,0 +1,236 @@ +.subckt C18_sky130_sW1.5_sL1.5 VDD VSS VIN1 VOUT1 VB1 +XM1_f0 net13 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f1 net13 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f2 net13 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f3 net13 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f4 net13 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f5 net13 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f0 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f1 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f2 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f3 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f4 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f5 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f6 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f7 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f8 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f9 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f10 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f11 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM3_f0 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f1 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f2 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f3 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f4 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f5 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f6 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f7 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f8 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f9 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f10 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f11 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f12 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f13 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f14 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f15 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f16 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f17 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f18 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f19 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f20 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f21 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f22 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f23 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f0 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f1 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f2 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f3 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f4 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f5 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f6 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f7 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f8 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f9 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f10 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f11 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f12 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f13 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f14 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f15 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f16 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f17 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f18 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f19 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f20 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f21 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f22 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f23 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f24 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f25 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f26 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f27 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f28 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f29 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f30 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f31 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f32 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f33 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f34 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f35 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f36 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f37 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f38 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f39 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f40 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f41 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f42 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f43 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f44 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f45 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f46 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f47 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f0 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f1 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f2 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f3 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f4 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f5 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f6 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f7 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f8 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f9 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f10 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f11 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f12 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f13 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f14 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f15 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f16 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f17 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f18 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f19 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f20 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f21 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f22 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f23 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f24 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f25 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f26 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f27 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f28 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f29 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f30 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f31 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f32 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f33 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f34 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f35 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f36 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f37 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f38 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f39 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f40 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f41 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f42 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f43 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f44 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f45 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f46 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f47 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM6_f0 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f1 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f2 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f3 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f4 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f5 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f6 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f7 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f8 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f9 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f10 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f11 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f12 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f13 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f14 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f15 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f16 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f17 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f18 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f19 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f20 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f21 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f22 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f23 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f24 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f25 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f26 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f27 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f28 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f29 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f30 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f31 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f32 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f33 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f34 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f35 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f36 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f37 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f38 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f39 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f40 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f41 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f42 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f43 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f44 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f45 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f46 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f47 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f48 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f49 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f50 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f51 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f52 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f53 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f54 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f55 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f56 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f57 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f58 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f59 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f60 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f61 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f62 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f63 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f64 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f65 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f66 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f67 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f68 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f69 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f70 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f71 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f72 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f73 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f74 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f75 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f76 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f77 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f78 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f79 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f80 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f81 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f82 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f83 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f84 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f85 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f86 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f87 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f88 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f89 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f90 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f91 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f92 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f93 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f94 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f95 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +.ends C18_sky130_sW1.5_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1.5_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1.5_sL1.5/testbench.spice new file mode 100644 index 00000000..083adfda --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1.5_sL1.5/testbench.spice @@ -0,0 +1,58 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C18_sky130_sW1.5_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +XB_VB1 VB1 VB1 VDDB VDDB sky130_fd_pr__pfet_01v8 w=6 l=0.45 +IB_VB1 VB1 VSS 2e-05 +* DC servo (disclosed test auxiliary): VINT -> input DC level that makes V_out = VT; frozen at VHOLD when KSW = 1 +VT VT 0 0.9 +VMID VMID 0 0.9 +VKSW KSW 0 0 +VHOLD VHOLD 0 0 +BSRV VSRV 0 V = (1-v(KSW))*(0.54 + 0.5*tanh(200*(v(VOUT1)-v(VT)))) + v(KSW)*v(VHOLD) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EIN VIN1 VINT VAC 0 1 +VAC VAC 0 dc 0 ac 1 sin(0 1m 1meg) +RL VOUT1 VMID 20000 +CL VOUT1 VMID 5e-12 +.option method=gear reltol=1e-3 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let iq = -i(VDD) +print vout0 vin0 iq +set vin0_s = "$&vin0" +ac dec 20 10 10G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +set gain_s = "$&gain_lf" +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +* open-loop DC transfer around the operating point (servo frozen at the input level it found) +alter @VHOLD[dc] = $vin0_s +alter @VKSW[dc] = 1 +dc VAC -0.4 0.4 0.001 +let gin = abs(deriv(v(VOUT1))) +meas dc gmid find gin at=0 +let gn = gin/gmid +meas dc vo_a find v(VOUT1) when gn=0.5 cross=1 +meas dc vo_b find v(VOUT1) when gn=0.5 cross=last +let out_swing = abs(vo_b - vo_a) +print out_swing +* distortion at a fixed OUTPUT amplitude of 0.1 V (servo frozen, input amplitude = amplitude / |gain|) +alter @VKSW[dc] = 0 +let a_lin = 10^($gain_s/20) +let vamp2 = 0.1/a_lin +if vamp2 > 0.3 + let vamp2 = 0.3 +end +print vamp2 +alter @VAC[sin] = [ 0 $&vamp2 1meg ] +tran 2n 6u 3u +fourier 1meg v(VOUT1) +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1.5_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1.5_sL1/case.json new file mode 100644 index 00000000..31805fad --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1.5_sL1/case.json @@ -0,0 +1,185 @@ +{ + "case_id": "C18_sky130_sW1.5_sL1", + "circuit_id": "C18", + "pdk": "sky130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "dut_name": "C18_sky130_sW1.5_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 3.0, + "l": 0.3, + "nf": 6 + }, + "M2": { + "w": 6.0, + "l": 0.3, + "nf": 12 + }, + "M3": { + "w": 12.0, + "l": 0.3, + "nf": 24 + }, + "M4": { + "w": 24.0, + "l": 0.3, + "nf": 48 + }, + "M5": { + "w": 24.0, + "l": 0.3, + "nf": 48 + }, + "M6": { + "w": 48.0, + "l": 0.3, + "nf": 96 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 2e-05 + } + }, + "load": { + "RL": 20000.0, + "CL": 5e-12, + "vamp": 0.02, + "vout_target": 0.9, + "vin_center": 0.54, + "servo_slope": 200.0, + "options": ".option method=gear reltol=1e-3", + "vout_amp": 0.1 + }, + "category": "buffer_ab", + "notes": [ + "first-pass sizing v1", + "RL/CL returned to an ideal mid-supply source; open-loop output-swing metric added" + ], + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.3, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.3, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 12.0, + "l": 0.3, + "nf": 24, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.3, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.3, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 32.0, + "l0": 0.3, + "nf0": 64, + "uw0": 0.5, + "w": 48.0, + "l": 0.3, + "nf": 96, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "a5b472df9e3d1b23", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M2", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo (freezable)" + }, + { + "kind": "testbench_element", + "what": "mid-supply load return" + }, + { + "kind": "testbench_element", + "what": "load resistor and capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1.5_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1.5_sL1/manifest.json new file mode 100644 index 00000000..5e817bed --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1.5_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "75aae0f41176739b31ed84eb9117aa40cac1ce4ea008852de1cdb4b4cacd2ced", + "qualification.json": "217bda0872045b6468db1c440b9d25651b5262b62f6e3f49838e5446f87e923f", + "specs.json": "32ad0c2d9b3c76f5c70594a4b11ec45ce4ac2bde734a3f9f26d9d13e04d85c4b", + "target.spice": "e6f45151c54799cbb12e1a6d9bcb39d05db2469c65b028c66a9e57940f8172bd", + "target_lvs.spice": "b639660ff32a5f98186c5b413cfb93fdba8cf402630a7977bb170e85582c9735", + "testbench.spice": "669f738f3a7c69c67901b9ba79005ed78e95d7f3ff5936f7750b2474f7458621" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1.5_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1.5_sL1/qualification.json new file mode 100644 index 00000000..98fc9d37 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1.5_sL1/qualification.json @@ -0,0 +1,154 @@ +{ + "case_id": "C18_sky130_sW1.5_sL1", + "circuit_id": "C18", + "pdk": "sky130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "buffer_ab", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.3, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.3, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 12.0, + "l": 0.3, + "nf": 24, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.3, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.3, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 32.0, + "l0": 0.3, + "nf0": 64, + "uw0": 0.5, + "w": 48.0, + "l": 0.3, + "nf": 96, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "a5b472df9e3d1b23", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "servo did not reach the output target: vout0=0.9648527 target=0.9 (tol 0.036 V)", + "thd_pct=52.47 above floor 3", + "out_swing=0 below floor 0.45" + ], + "spec": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 14070000.0 + }, + "out_swing": { + "min": 0.45 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 52.4707, + "iq": 2.522956e-05, + "f3db": 23454130.0, + "out_swing": 0.0 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.45 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 10.4, + "schematic_measures": { + "vout0": 0.9648527, + "vin0": 1.04, + "iq": 2.522956e-05, + "gain_lf": -40.25145, + "f3db": 23454130.0, + "gmid": 0.009714729, + "vo_a": 0.9638176, + "vo_b": 0.9638176, + "out_swing": 0.0, + "vamp2": 0.3, + "thd_pct": 52.4707 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1.5_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1.5_sL1/specs.json new file mode 100644 index 00000000..e330e4ce --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1.5_sL1/specs.json @@ -0,0 +1,37 @@ +{ + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 14070000.0 + }, + "out_swing": { + "min": 0.45 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 52.4707, + "iq": 2.522956e-05, + "f3db": 23454130.0, + "out_swing": 0.0 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.45 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1.5_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1.5_sL1/target.spice new file mode 100644 index 00000000..49748156 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1.5_sL1/target.spice @@ -0,0 +1,8 @@ +.subckt C18_sky130_sW1.5_sL1 VDD VSS VIN1 VOUT1 VB1 +XM1 net13 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=3 l=0.3 nf=6 +XM2 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=6 l=0.3 nf=12 +XM3 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=12 l=0.3 nf=24 +XM4 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=24 l=0.3 nf=48 +XM5 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=24 l=0.3 nf=48 +XM6 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=48 l=0.3 nf=96 +.ends C18_sky130_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1.5_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1.5_sL1/target_lvs.spice new file mode 100644 index 00000000..84ebabe2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1.5_sL1/target_lvs.spice @@ -0,0 +1,236 @@ +.subckt C18_sky130_sW1.5_sL1 VDD VSS VIN1 VOUT1 VB1 +XM1_f0 net13 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f1 net13 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f2 net13 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f3 net13 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f4 net13 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f5 net13 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f0 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f1 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f2 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f3 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f4 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f5 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f6 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f7 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f8 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f9 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f10 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f11 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM3_f0 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f1 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f2 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f3 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f4 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f5 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f6 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f7 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f8 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f9 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f10 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f11 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f12 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f13 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f14 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f15 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f16 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f17 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f18 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f19 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f20 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f21 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f22 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f23 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f0 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f1 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f2 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f3 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f4 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f5 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f6 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f7 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f8 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f9 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f10 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f11 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f12 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f13 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f14 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f15 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f16 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f17 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f18 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f19 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f20 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f21 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f22 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f23 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f24 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f25 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f26 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f27 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f28 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f29 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f30 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f31 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f32 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f33 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f34 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f35 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f36 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f37 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f38 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f39 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f40 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f41 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f42 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f43 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f44 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f45 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f46 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f47 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f0 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f1 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f2 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f3 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f4 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f5 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f6 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f7 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f8 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f9 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f10 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f11 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f12 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f13 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f14 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f15 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f16 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f17 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f18 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f19 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f20 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f21 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f22 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f23 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f24 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f25 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f26 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f27 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f28 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f29 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f30 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f31 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f32 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f33 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f34 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f35 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f36 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f37 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f38 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f39 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f40 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f41 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f42 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f43 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f44 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f45 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f46 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f47 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM6_f0 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f1 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f2 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f3 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f4 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f5 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f6 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f7 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f8 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f9 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f10 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f11 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f12 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f13 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f14 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f15 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f16 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f17 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f18 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f19 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f20 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f21 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f22 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f23 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f24 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f25 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f26 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f27 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f28 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f29 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f30 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f31 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f32 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f33 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f34 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f35 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f36 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f37 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f38 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f39 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f40 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f41 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f42 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f43 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f44 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f45 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f46 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f47 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f48 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f49 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f50 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f51 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f52 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f53 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f54 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f55 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f56 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f57 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f58 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f59 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f60 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f61 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f62 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f63 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f64 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f65 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f66 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f67 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f68 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f69 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f70 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f71 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f72 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f73 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f74 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f75 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f76 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f77 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f78 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f79 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f80 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f81 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f82 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f83 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f84 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f85 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f86 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f87 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f88 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f89 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f90 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f91 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f92 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f93 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f94 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f95 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +.ends C18_sky130_sW1.5_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1.5_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1.5_sL1/testbench.spice new file mode 100644 index 00000000..43f3e5cf --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1.5_sL1/testbench.spice @@ -0,0 +1,58 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C18_sky130_sW1.5_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +XB_VB1 VB1 VB1 VDDB VDDB sky130_fd_pr__pfet_01v8 w=6 l=0.3 +IB_VB1 VB1 VSS 2e-05 +* DC servo (disclosed test auxiliary): VINT -> input DC level that makes V_out = VT; frozen at VHOLD when KSW = 1 +VT VT 0 0.9 +VMID VMID 0 0.9 +VKSW KSW 0 0 +VHOLD VHOLD 0 0 +BSRV VSRV 0 V = (1-v(KSW))*(0.54 + 0.5*tanh(200*(v(VOUT1)-v(VT)))) + v(KSW)*v(VHOLD) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EIN VIN1 VINT VAC 0 1 +VAC VAC 0 dc 0 ac 1 sin(0 1m 1meg) +RL VOUT1 VMID 20000 +CL VOUT1 VMID 5e-12 +.option method=gear reltol=1e-3 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let iq = -i(VDD) +print vout0 vin0 iq +set vin0_s = "$&vin0" +ac dec 20 10 10G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +set gain_s = "$&gain_lf" +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +* open-loop DC transfer around the operating point (servo frozen at the input level it found) +alter @VHOLD[dc] = $vin0_s +alter @VKSW[dc] = 1 +dc VAC -0.4 0.4 0.001 +let gin = abs(deriv(v(VOUT1))) +meas dc gmid find gin at=0 +let gn = gin/gmid +meas dc vo_a find v(VOUT1) when gn=0.5 cross=1 +meas dc vo_b find v(VOUT1) when gn=0.5 cross=last +let out_swing = abs(vo_b - vo_a) +print out_swing +* distortion at a fixed OUTPUT amplitude of 0.1 V (servo frozen, input amplitude = amplitude / |gain|) +alter @VKSW[dc] = 0 +let a_lin = 10^($gain_s/20) +let vamp2 = 0.1/a_lin +if vamp2 > 0.3 + let vamp2 = 0.3 +end +print vamp2 +alter @VAC[sin] = [ 0 $&vamp2 1meg ] +tran 2n 6u 3u +fourier 1meg v(VOUT1) +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1.5_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1.5_sL2/case.json new file mode 100644 index 00000000..3c274cf3 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1.5_sL2/case.json @@ -0,0 +1,185 @@ +{ + "case_id": "C18_sky130_sW1.5_sL2", + "circuit_id": "C18", + "pdk": "sky130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "dut_name": "C18_sky130_sW1.5_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 3.0, + "l": 0.6, + "nf": 6 + }, + "M2": { + "w": 6.0, + "l": 0.6, + "nf": 12 + }, + "M3": { + "w": 12.0, + "l": 0.6, + "nf": 24 + }, + "M4": { + "w": 24.0, + "l": 0.6, + "nf": 48 + }, + "M5": { + "w": 24.0, + "l": 0.6, + "nf": 48 + }, + "M6": { + "w": 48.0, + "l": 0.6, + "nf": 96 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 2e-05 + } + }, + "load": { + "RL": 20000.0, + "CL": 5e-12, + "vamp": 0.02, + "vout_target": 0.9, + "vin_center": 0.54, + "servo_slope": 200.0, + "options": ".option method=gear reltol=1e-3", + "vout_amp": 0.1 + }, + "category": "buffer_ab", + "notes": [ + "first-pass sizing v1", + "RL/CL returned to an ideal mid-supply source; open-loop output-swing metric added" + ], + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.6, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.6, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 12.0, + "l": 0.6, + "nf": 24, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.6, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.6, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 32.0, + "l0": 0.3, + "nf0": 64, + "uw0": 0.5, + "w": 48.0, + "l": 0.6, + "nf": 96, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "de2cba923b099141", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M2", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo (freezable)" + }, + { + "kind": "testbench_element", + "what": "mid-supply load return" + }, + { + "kind": "testbench_element", + "what": "load resistor and capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1.5_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1.5_sL2/manifest.json new file mode 100644 index 00000000..583d87ce --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1.5_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "ea570e568e50db08409331c87a5c3ba4bd39225fcf6d84ba3957157fa9bc43b9", + "qualification.json": "26d82c078ad520dfc95bf337951d322714edf348cff711c42f2425bc613e8142", + "specs.json": "9ba6a7b0a34b53e5db7034d6dfd2432470d8577b5e2094d5a90e6ed90a4a6747", + "target.spice": "e69c2c044e6263eef3128b7fb02a31d0d4735783c064f930d7ad52b0333c4368", + "target_lvs.spice": "6f5cc0c828a7918baeefedbcf10182db4c9650783b02fc329ff878a039fc8667", + "testbench.spice": "d01596c56af33b4ca0c92a6d3432ae65dc78b4660dfe09d5cb7811b0d6ccf0d7" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1.5_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1.5_sL2/qualification.json new file mode 100644 index 00000000..623fae4f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1.5_sL2/qualification.json @@ -0,0 +1,154 @@ +{ + "case_id": "C18_sky130_sW1.5_sL2", + "circuit_id": "C18", + "pdk": "sky130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "buffer_ab", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.6, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.6, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 12.0, + "l": 0.6, + "nf": 24, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.6, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.6, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 32.0, + "l0": 0.3, + "nf0": 64, + "uw0": 0.5, + "w": 48.0, + "l": 0.6, + "nf": 96, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "de2cba923b099141", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "servo did not reach the output target: vout0=1.005301 target=0.9 (tol 0.036 V)", + "thd_pct=43.98 above floor 3", + "out_swing=0 below floor 0.45" + ], + "spec": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 6813000.0 + }, + "out_swing": { + "min": 0.45 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 43.9839, + "iq": 1.217202e-05, + "f3db": 11354920.0, + "out_swing": 0.0 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.45 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 10.7, + "schematic_measures": { + "vout0": 1.005301, + "vin0": 1.04, + "iq": 1.217202e-05, + "gain_lf": -48.51603, + "f3db": 11354920.0, + "gmid": 0.003751467, + "vo_a": 1.004848, + "vo_b": 1.004848, + "out_swing": 0.0, + "vamp2": 0.3, + "thd_pct": 43.9839 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1.5_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1.5_sL2/specs.json new file mode 100644 index 00000000..9de6d6f9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1.5_sL2/specs.json @@ -0,0 +1,37 @@ +{ + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 6813000.0 + }, + "out_swing": { + "min": 0.45 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 43.9839, + "iq": 1.217202e-05, + "f3db": 11354920.0, + "out_swing": 0.0 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.45 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1.5_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1.5_sL2/target.spice new file mode 100644 index 00000000..68d30313 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1.5_sL2/target.spice @@ -0,0 +1,8 @@ +.subckt C18_sky130_sW1.5_sL2 VDD VSS VIN1 VOUT1 VB1 +XM1 net13 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=3 l=0.6 nf=6 +XM2 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=6 l=0.6 nf=12 +XM3 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=12 l=0.6 nf=24 +XM4 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=24 l=0.6 nf=48 +XM5 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=24 l=0.6 nf=48 +XM6 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=48 l=0.6 nf=96 +.ends C18_sky130_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1.5_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1.5_sL2/target_lvs.spice new file mode 100644 index 00000000..a917ee99 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1.5_sL2/target_lvs.spice @@ -0,0 +1,236 @@ +.subckt C18_sky130_sW1.5_sL2 VDD VSS VIN1 VOUT1 VB1 +XM1_f0 net13 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f1 net13 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f2 net13 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f3 net13 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f4 net13 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f5 net13 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f0 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f1 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f2 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f3 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f4 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f5 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f6 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f7 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f8 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f9 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f10 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f11 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM3_f0 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f1 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f2 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f3 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f4 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f5 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f6 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f7 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f8 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f9 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f10 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f11 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f12 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f13 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f14 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f15 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f16 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f17 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f18 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f19 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f20 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f21 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f22 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f23 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f0 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f1 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f2 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f3 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f4 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f5 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f6 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f7 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f8 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f9 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f10 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f11 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f12 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f13 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f14 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f15 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f16 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f17 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f18 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f19 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f20 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f21 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f22 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f23 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f24 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f25 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f26 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f27 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f28 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f29 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f30 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f31 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f32 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f33 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f34 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f35 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f36 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f37 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f38 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f39 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f40 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f41 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f42 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f43 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f44 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f45 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f46 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f47 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f0 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f1 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f2 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f3 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f4 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f5 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f6 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f7 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f8 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f9 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f10 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f11 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f12 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f13 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f14 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f15 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f16 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f17 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f18 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f19 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f20 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f21 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f22 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f23 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f24 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f25 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f26 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f27 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f28 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f29 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f30 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f31 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f32 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f33 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f34 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f35 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f36 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f37 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f38 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f39 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f40 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f41 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f42 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f43 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f44 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f45 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f46 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f47 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM6_f0 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f1 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f2 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f3 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f4 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f5 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f6 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f7 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f8 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f9 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f10 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f11 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f12 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f13 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f14 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f15 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f16 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f17 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f18 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f19 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f20 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f21 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f22 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f23 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f24 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f25 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f26 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f27 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f28 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f29 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f30 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f31 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f32 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f33 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f34 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f35 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f36 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f37 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f38 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f39 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f40 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f41 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f42 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f43 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f44 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f45 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f46 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f47 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f48 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f49 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f50 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f51 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f52 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f53 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f54 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f55 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f56 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f57 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f58 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f59 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f60 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f61 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f62 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f63 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f64 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f65 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f66 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f67 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f68 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f69 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f70 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f71 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f72 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f73 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f74 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f75 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f76 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f77 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f78 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f79 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f80 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f81 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f82 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f83 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f84 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f85 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f86 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f87 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f88 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f89 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f90 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f91 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f92 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f93 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f94 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f95 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +.ends C18_sky130_sW1.5_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1.5_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1.5_sL2/testbench.spice new file mode 100644 index 00000000..a0a0cd11 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1.5_sL2/testbench.spice @@ -0,0 +1,58 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C18_sky130_sW1.5_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +XB_VB1 VB1 VB1 VDDB VDDB sky130_fd_pr__pfet_01v8 w=6 l=0.6 +IB_VB1 VB1 VSS 2e-05 +* DC servo (disclosed test auxiliary): VINT -> input DC level that makes V_out = VT; frozen at VHOLD when KSW = 1 +VT VT 0 0.9 +VMID VMID 0 0.9 +VKSW KSW 0 0 +VHOLD VHOLD 0 0 +BSRV VSRV 0 V = (1-v(KSW))*(0.54 + 0.5*tanh(200*(v(VOUT1)-v(VT)))) + v(KSW)*v(VHOLD) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EIN VIN1 VINT VAC 0 1 +VAC VAC 0 dc 0 ac 1 sin(0 1m 1meg) +RL VOUT1 VMID 20000 +CL VOUT1 VMID 5e-12 +.option method=gear reltol=1e-3 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let iq = -i(VDD) +print vout0 vin0 iq +set vin0_s = "$&vin0" +ac dec 20 10 10G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +set gain_s = "$&gain_lf" +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +* open-loop DC transfer around the operating point (servo frozen at the input level it found) +alter @VHOLD[dc] = $vin0_s +alter @VKSW[dc] = 1 +dc VAC -0.4 0.4 0.001 +let gin = abs(deriv(v(VOUT1))) +meas dc gmid find gin at=0 +let gn = gin/gmid +meas dc vo_a find v(VOUT1) when gn=0.5 cross=1 +meas dc vo_b find v(VOUT1) when gn=0.5 cross=last +let out_swing = abs(vo_b - vo_a) +print out_swing +* distortion at a fixed OUTPUT amplitude of 0.1 V (servo frozen, input amplitude = amplitude / |gain|) +alter @VKSW[dc] = 0 +let a_lin = 10^($gain_s/20) +let vamp2 = 0.1/a_lin +if vamp2 > 0.3 + let vamp2 = 0.3 +end +print vamp2 +alter @VAC[sin] = [ 0 $&vamp2 1meg ] +tran 2n 6u 3u +fourier 1meg v(VOUT1) +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1_sL1.5/case.json new file mode 100644 index 00000000..54a82a9f --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1_sL1.5/case.json @@ -0,0 +1,185 @@ +{ + "case_id": "C18_sky130_sW1_sL1.5", + "circuit_id": "C18", + "pdk": "sky130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "dut_name": "C18_sky130_sW1_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.45, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.45, + "nf": 8 + }, + "M3": { + "w": 8.0, + "l": 0.45, + "nf": 16 + }, + "M4": { + "w": 16.0, + "l": 0.45, + "nf": 32 + }, + "M5": { + "w": 16.0, + "l": 0.45, + "nf": 32 + }, + "M6": { + "w": 32.0, + "l": 0.45, + "nf": 64 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 2e-05 + } + }, + "load": { + "RL": 20000.0, + "CL": 5e-12, + "vamp": 0.02, + "vout_target": 0.9, + "vin_center": 0.54, + "servo_slope": 200.0, + "options": ".option method=gear reltol=1e-3", + "vout_amp": 0.1 + }, + "category": "buffer_ab", + "notes": [ + "first-pass sizing v1", + "RL/CL returned to an ideal mid-supply source; open-loop output-swing metric added" + ], + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.45, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.45, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 32.0, + "l0": 0.3, + "nf0": 64, + "uw0": 0.5, + "w": 32.0, + "l": 0.45, + "nf": 64, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "00e5f9e72e8e2c2d", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M2", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo (freezable)" + }, + { + "kind": "testbench_element", + "what": "mid-supply load return" + }, + { + "kind": "testbench_element", + "what": "load resistor and capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1_sL1.5/manifest.json new file mode 100644 index 00000000..54b21867 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "a9f76a939a0275661206a610df64373536008414c15e73045d6314a1cff7d638", + "qualification.json": "cf4ee8d39de4acf0a6c2fc20ed9b1e751e9db94dd57dfc85f3ba7bf2ef297b74", + "specs.json": "a07ab948ed316674a6b9ae22957105c706ff2e1b1a9c52cfb93eea320be278ef", + "target.spice": "d49dccce27dd492ba3bdb17fc363494b0d6aad0f8fa7898079870ebb483ce712", + "target_lvs.spice": "15785390d4884818c07c1954b5265be7bb22c7816f613953fd225281c4e08157", + "testbench.spice": "a853a424db55d27d2c8c479fe349b5f0a77a63cd98a2c0ad6efda76bbf8b89e9" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1_sL1.5/qualification.json new file mode 100644 index 00000000..ec7966cd --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1_sL1.5/qualification.json @@ -0,0 +1,154 @@ +{ + "case_id": "C18_sky130_sW1_sL1.5", + "circuit_id": "C18", + "pdk": "sky130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "buffer_ab", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.45, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.45, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 32.0, + "l0": 0.3, + "nf0": 64, + "uw0": 0.5, + "w": 32.0, + "l": 0.45, + "nf": 64, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "00e5f9e72e8e2c2d", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "servo did not reach the output target: vout0=0.9931647 target=0.9 (tol 0.036 V)", + "thd_pct=45.56 above floor 3", + "out_swing=0 below floor 0.45" + ], + "spec": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 6578000.0 + }, + "out_swing": { + "min": 0.45 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 45.5605, + "iq": 1.169591e-05, + "f3db": 10963250.0, + "out_swing": 0.0 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.45 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 9.0, + "schematic_measures": { + "vout0": 0.9931647, + "vin0": 1.04, + "iq": 1.169591e-05, + "gain_lf": -46.4172, + "f3db": 10963250.0, + "gmid": 0.00477686, + "vo_a": 0.9926056, + "vo_b": 0.9926056, + "out_swing": 0.0, + "vamp2": 0.3, + "thd_pct": 45.5605 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1_sL1.5/specs.json new file mode 100644 index 00000000..94fc5fd0 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1_sL1.5/specs.json @@ -0,0 +1,37 @@ +{ + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 6578000.0 + }, + "out_swing": { + "min": 0.45 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 45.5605, + "iq": 1.169591e-05, + "f3db": 10963250.0, + "out_swing": 0.0 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.45 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1_sL1.5/target.spice new file mode 100644 index 00000000..e47a6687 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1_sL1.5/target.spice @@ -0,0 +1,8 @@ +.subckt C18_sky130_sW1_sL1.5 VDD VSS VIN1 VOUT1 VB1 +XM1 net13 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=2 l=0.45 nf=4 +XM2 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=4 l=0.45 nf=8 +XM3 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=8 l=0.45 nf=16 +XM4 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=16 l=0.45 nf=32 +XM5 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=16 l=0.45 nf=32 +XM6 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=32 l=0.45 nf=64 +.ends C18_sky130_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1_sL1.5/target_lvs.spice new file mode 100644 index 00000000..ee376690 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1_sL1.5/target_lvs.spice @@ -0,0 +1,158 @@ +.subckt C18_sky130_sW1_sL1.5 VDD VSS VIN1 VOUT1 VB1 +XM1_f0 net13 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f1 net13 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f2 net13 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f3 net13 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f0 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f1 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f2 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f3 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f4 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f5 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f6 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f7 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM3_f0 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f1 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f2 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f3 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f4 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f5 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f6 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f7 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f8 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f9 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f10 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f11 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f12 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f13 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f14 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f15 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f0 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f1 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f2 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f3 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f4 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f5 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f6 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f7 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f8 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f9 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f10 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f11 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f12 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f13 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f14 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f15 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f16 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f17 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f18 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f19 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f20 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f21 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f22 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f23 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f24 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f25 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f26 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f27 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f28 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f29 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f30 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f31 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f0 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f1 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f2 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f3 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f4 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f5 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f6 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f7 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f8 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f9 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f10 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f11 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f12 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f13 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f14 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f15 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f16 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f17 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f18 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f19 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f20 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f21 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f22 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f23 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f24 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f25 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f26 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f27 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f28 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f29 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f30 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f31 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM6_f0 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f1 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f2 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f3 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f4 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f5 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f6 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f7 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f8 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f9 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f10 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f11 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f12 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f13 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f14 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f15 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f16 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f17 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f18 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f19 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f20 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f21 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f22 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f23 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f24 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f25 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f26 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f27 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f28 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f29 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f30 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f31 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f32 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f33 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f34 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f35 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f36 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f37 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f38 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f39 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f40 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f41 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f42 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f43 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f44 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f45 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f46 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f47 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f48 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f49 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f50 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f51 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f52 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f53 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f54 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f55 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f56 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f57 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f58 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f59 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f60 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f61 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f62 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f63 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +.ends C18_sky130_sW1_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1_sL1.5/testbench.spice new file mode 100644 index 00000000..1de6fd86 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1_sL1.5/testbench.spice @@ -0,0 +1,58 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C18_sky130_sW1_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +XB_VB1 VB1 VB1 VDDB VDDB sky130_fd_pr__pfet_01v8 w=4 l=0.45 +IB_VB1 VB1 VSS 2e-05 +* DC servo (disclosed test auxiliary): VINT -> input DC level that makes V_out = VT; frozen at VHOLD when KSW = 1 +VT VT 0 0.9 +VMID VMID 0 0.9 +VKSW KSW 0 0 +VHOLD VHOLD 0 0 +BSRV VSRV 0 V = (1-v(KSW))*(0.54 + 0.5*tanh(200*(v(VOUT1)-v(VT)))) + v(KSW)*v(VHOLD) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EIN VIN1 VINT VAC 0 1 +VAC VAC 0 dc 0 ac 1 sin(0 1m 1meg) +RL VOUT1 VMID 20000 +CL VOUT1 VMID 5e-12 +.option method=gear reltol=1e-3 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let iq = -i(VDD) +print vout0 vin0 iq +set vin0_s = "$&vin0" +ac dec 20 10 10G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +set gain_s = "$&gain_lf" +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +* open-loop DC transfer around the operating point (servo frozen at the input level it found) +alter @VHOLD[dc] = $vin0_s +alter @VKSW[dc] = 1 +dc VAC -0.4 0.4 0.001 +let gin = abs(deriv(v(VOUT1))) +meas dc gmid find gin at=0 +let gn = gin/gmid +meas dc vo_a find v(VOUT1) when gn=0.5 cross=1 +meas dc vo_b find v(VOUT1) when gn=0.5 cross=last +let out_swing = abs(vo_b - vo_a) +print out_swing +* distortion at a fixed OUTPUT amplitude of 0.1 V (servo frozen, input amplitude = amplitude / |gain|) +alter @VKSW[dc] = 0 +let a_lin = 10^($gain_s/20) +let vamp2 = 0.1/a_lin +if vamp2 > 0.3 + let vamp2 = 0.3 +end +print vamp2 +alter @VAC[sin] = [ 0 $&vamp2 1meg ] +tran 2n 6u 3u +fourier 1meg v(VOUT1) +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1_sL1/case.json new file mode 100644 index 00000000..b98223a5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1_sL1/case.json @@ -0,0 +1,185 @@ +{ + "case_id": "C18_sky130_sW1_sL1", + "circuit_id": "C18", + "pdk": "sky130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "dut_name": "C18_sky130_sW1_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.3, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.3, + "nf": 8 + }, + "M3": { + "w": 8.0, + "l": 0.3, + "nf": 16 + }, + "M4": { + "w": 16.0, + "l": 0.3, + "nf": 32 + }, + "M5": { + "w": 16.0, + "l": 0.3, + "nf": 32 + }, + "M6": { + "w": 32.0, + "l": 0.3, + "nf": 64 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 2e-05 + } + }, + "load": { + "RL": 20000.0, + "CL": 5e-12, + "vamp": 0.02, + "vout_target": 0.9, + "vin_center": 0.54, + "servo_slope": 200.0, + "options": ".option method=gear reltol=1e-3", + "vout_amp": 0.1 + }, + "category": "buffer_ab", + "notes": [ + "first-pass sizing v1", + "RL/CL returned to an ideal mid-supply source; open-loop output-swing metric added" + ], + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.3, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.3, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 32.0, + "l0": 0.3, + "nf0": 64, + "uw0": 0.5, + "w": 32.0, + "l": 0.3, + "nf": 64, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "e13aa8d3c3a2f41f", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M2", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo (freezable)" + }, + { + "kind": "testbench_element", + "what": "mid-supply load return" + }, + { + "kind": "testbench_element", + "what": "load resistor and capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1_sL1/manifest.json new file mode 100644 index 00000000..c3ded06e --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "493b36e4e836772476dc5b6d4268b51dbf852e0628b889a35c861d7a64eb2f41", + "qualification.json": "819746d87a5624ea3fbe211a31409b62397b771e59a6ad9f486f963e1def486f", + "specs.json": "8848e2a6b1ec0470c41ad4173a82085dc0e9598fcfc6b0a15c1ee5cecc9a7bd5", + "target.spice": "eb435e8c2dc7bf73c07b8b0453769c456c24cbe2ec906ce7efb5f64eb02680fb", + "target_lvs.spice": "6fb4b3817180beb45f083054fe43627f5faa3ad6b516982f5e86d5b185a3ce3f", + "testbench.spice": "484298689591b6723434a9846ef9953bdb6670ca11e920a29da44f4f0ea3b882" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1_sL1/qualification.json new file mode 100644 index 00000000..b019e109 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1_sL1/qualification.json @@ -0,0 +1,154 @@ +{ + "case_id": "C18_sky130_sW1_sL1", + "circuit_id": "C18", + "pdk": "sky130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "buffer_ab", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.3, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.3, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 32.0, + "l0": 0.3, + "nf0": 64, + "uw0": 0.5, + "w": 32.0, + "l": 0.3, + "nf": 64, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "e13aa8d3c3a2f41f", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "servo did not reach the output target: vout0=0.9644481 target=0.9 (tol 0.036 V)", + "thd_pct=51.71 above floor 3", + "out_swing=0 below floor 0.45" + ], + "spec": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 10040000.0 + }, + "out_swing": { + "min": 0.45 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 51.7123, + "iq": 1.791735e-05, + "f3db": 16728900.0, + "out_swing": 0.0 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.45 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 11.9, + "schematic_measures": { + "vout0": 0.9644481, + "vin0": 1.04, + "iq": 1.791735e-05, + "gain_lf": -40.76458, + "f3db": 16728900.0, + "gmid": 0.009157438, + "vo_a": 0.9634673, + "vo_b": 0.9634673, + "out_swing": 0.0, + "vamp2": 0.3, + "thd_pct": 51.7123 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1_sL1/specs.json new file mode 100644 index 00000000..73eafc32 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1_sL1/specs.json @@ -0,0 +1,37 @@ +{ + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 10040000.0 + }, + "out_swing": { + "min": 0.45 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 51.7123, + "iq": 1.791735e-05, + "f3db": 16728900.0, + "out_swing": 0.0 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.45 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1_sL1/target.spice new file mode 100644 index 00000000..5b3d26b4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1_sL1/target.spice @@ -0,0 +1,8 @@ +.subckt C18_sky130_sW1_sL1 VDD VSS VIN1 VOUT1 VB1 +XM1 net13 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=2 l=0.3 nf=4 +XM2 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=4 l=0.3 nf=8 +XM3 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=8 l=0.3 nf=16 +XM4 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=16 l=0.3 nf=32 +XM5 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=16 l=0.3 nf=32 +XM6 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=32 l=0.3 nf=64 +.ends C18_sky130_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1_sL1/target_lvs.spice new file mode 100644 index 00000000..97dad1d1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1_sL1/target_lvs.spice @@ -0,0 +1,158 @@ +.subckt C18_sky130_sW1_sL1 VDD VSS VIN1 VOUT1 VB1 +XM1_f0 net13 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f1 net13 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f2 net13 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f3 net13 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f0 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f1 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f2 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f3 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f4 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f5 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f6 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f7 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM3_f0 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f1 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f2 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f3 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f4 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f5 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f6 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f7 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f8 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f9 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f10 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f11 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f12 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f13 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f14 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f15 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f0 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f1 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f2 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f3 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f4 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f5 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f6 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f7 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f8 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f9 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f10 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f11 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f12 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f13 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f14 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f15 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f16 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f17 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f18 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f19 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f20 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f21 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f22 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f23 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f24 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f25 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f26 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f27 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f28 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f29 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f30 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f31 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f0 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f1 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f2 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f3 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f4 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f5 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f6 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f7 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f8 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f9 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f10 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f11 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f12 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f13 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f14 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f15 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f16 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f17 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f18 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f19 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f20 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f21 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f22 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f23 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f24 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f25 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f26 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f27 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f28 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f29 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f30 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f31 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM6_f0 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f1 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f2 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f3 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f4 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f5 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f6 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f7 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f8 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f9 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f10 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f11 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f12 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f13 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f14 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f15 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f16 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f17 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f18 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f19 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f20 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f21 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f22 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f23 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f24 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f25 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f26 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f27 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f28 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f29 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f30 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f31 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f32 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f33 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f34 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f35 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f36 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f37 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f38 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f39 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f40 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f41 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f42 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f43 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f44 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f45 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f46 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f47 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f48 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f49 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f50 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f51 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f52 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f53 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f54 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f55 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f56 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f57 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f58 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f59 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f60 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f61 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f62 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f63 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +.ends C18_sky130_sW1_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1_sL1/testbench.spice new file mode 100644 index 00000000..1059ae60 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1_sL1/testbench.spice @@ -0,0 +1,58 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C18_sky130_sW1_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +XB_VB1 VB1 VB1 VDDB VDDB sky130_fd_pr__pfet_01v8 w=4 l=0.3 +IB_VB1 VB1 VSS 2e-05 +* DC servo (disclosed test auxiliary): VINT -> input DC level that makes V_out = VT; frozen at VHOLD when KSW = 1 +VT VT 0 0.9 +VMID VMID 0 0.9 +VKSW KSW 0 0 +VHOLD VHOLD 0 0 +BSRV VSRV 0 V = (1-v(KSW))*(0.54 + 0.5*tanh(200*(v(VOUT1)-v(VT)))) + v(KSW)*v(VHOLD) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EIN VIN1 VINT VAC 0 1 +VAC VAC 0 dc 0 ac 1 sin(0 1m 1meg) +RL VOUT1 VMID 20000 +CL VOUT1 VMID 5e-12 +.option method=gear reltol=1e-3 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let iq = -i(VDD) +print vout0 vin0 iq +set vin0_s = "$&vin0" +ac dec 20 10 10G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +set gain_s = "$&gain_lf" +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +* open-loop DC transfer around the operating point (servo frozen at the input level it found) +alter @VHOLD[dc] = $vin0_s +alter @VKSW[dc] = 1 +dc VAC -0.4 0.4 0.001 +let gin = abs(deriv(v(VOUT1))) +meas dc gmid find gin at=0 +let gn = gin/gmid +meas dc vo_a find v(VOUT1) when gn=0.5 cross=1 +meas dc vo_b find v(VOUT1) when gn=0.5 cross=last +let out_swing = abs(vo_b - vo_a) +print out_swing +* distortion at a fixed OUTPUT amplitude of 0.1 V (servo frozen, input amplitude = amplitude / |gain|) +alter @VKSW[dc] = 0 +let a_lin = 10^($gain_s/20) +let vamp2 = 0.1/a_lin +if vamp2 > 0.3 + let vamp2 = 0.3 +end +print vamp2 +alter @VAC[sin] = [ 0 $&vamp2 1meg ] +tran 2n 6u 3u +fourier 1meg v(VOUT1) +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1_sL2/case.json new file mode 100644 index 00000000..de90c0d4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1_sL2/case.json @@ -0,0 +1,185 @@ +{ + "case_id": "C18_sky130_sW1_sL2", + "circuit_id": "C18", + "pdk": "sky130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "dut_name": "C18_sky130_sW1_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 2.0, + "l": 0.6, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.6, + "nf": 8 + }, + "M3": { + "w": 8.0, + "l": 0.6, + "nf": 16 + }, + "M4": { + "w": 16.0, + "l": 0.6, + "nf": 32 + }, + "M5": { + "w": 16.0, + "l": 0.6, + "nf": 32 + }, + "M6": { + "w": 32.0, + "l": 0.6, + "nf": 64 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 2e-05 + } + }, + "load": { + "RL": 20000.0, + "CL": 5e-12, + "vamp": 0.02, + "vout_target": 0.9, + "vin_center": 0.54, + "servo_slope": 200.0, + "options": ".option method=gear reltol=1e-3", + "vout_amp": 0.1 + }, + "category": "buffer_ab", + "notes": [ + "first-pass sizing v1", + "RL/CL returned to an ideal mid-supply source; open-loop output-swing metric added" + ], + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.6, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.6, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 32.0, + "l0": 0.3, + "nf0": 64, + "uw0": 0.5, + "w": 32.0, + "l": 0.6, + "nf": 64, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "458fd75b00038f25", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M2", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo (freezable)" + }, + { + "kind": "testbench_element", + "what": "mid-supply load return" + }, + { + "kind": "testbench_element", + "what": "load resistor and capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1_sL2/manifest.json new file mode 100644 index 00000000..ce48c273 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "06a6367006b7ef0fb01a3a32b992f126e3eeb153f44e08a63ca9658f68b566b9", + "qualification.json": "5dd686057532f99818935566faa16f6a08d29115600056b76701465facf149da", + "specs.json": "03d14ea55f4c11ebf1b2e8abb66f4bc9a68ddc890a71066f275cb96eab07a5b8", + "target.spice": "d357ef9dd464bbc1e9bf0bd19a974940df4edb174a841c190e0e2d0ff96175ae", + "target_lvs.spice": "7cd147f3b17d25f0a3c37ebcfca42fa6a5f9563f36a8c8f0d616356fcc20df8d", + "testbench.spice": "00dc1d8d84fe38824fd7588a1e501890d08da4195a1b9a0b0bc12d9acf9d6319" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1_sL2/qualification.json new file mode 100644 index 00000000..6ef2ac06 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1_sL2/qualification.json @@ -0,0 +1,154 @@ +{ + "case_id": "C18_sky130_sW1_sL2", + "circuit_id": "C18", + "pdk": "sky130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "buffer_ab", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.6, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.6, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 32.0, + "l0": 0.3, + "nf0": 64, + "uw0": 0.5, + "w": 32.0, + "l": 0.6, + "nf": 64, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "458fd75b00038f25", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "servo did not reach the output target: vout0=0.999616 target=0.9 (tol 0.036 V)", + "thd_pct=43.08 above floor 3", + "out_swing=0 below floor 0.45" + ], + "spec": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5217000.0 + }, + "out_swing": { + "min": 0.45 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 43.0831, + "iq": 9.318186e-06, + "f3db": 8695030.0, + "out_swing": 0.0 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.45 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 8.9, + "schematic_measures": { + "vout0": 0.999616, + "vin0": 1.04, + "iq": 9.318186e-06, + "gain_lf": -50.29108, + "f3db": 8695030.0, + "gmid": 0.003058079, + "vo_a": 0.9992444, + "vo_b": 0.9992444, + "out_swing": 0.0, + "vamp2": 0.3, + "thd_pct": 43.0831 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1_sL2/specs.json new file mode 100644 index 00000000..5ec8fc10 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1_sL2/specs.json @@ -0,0 +1,37 @@ +{ + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5217000.0 + }, + "out_swing": { + "min": 0.45 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 43.0831, + "iq": 9.318186e-06, + "f3db": 8695030.0, + "out_swing": 0.0 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.45 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1_sL2/target.spice new file mode 100644 index 00000000..9b3a23e4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1_sL2/target.spice @@ -0,0 +1,8 @@ +.subckt C18_sky130_sW1_sL2 VDD VSS VIN1 VOUT1 VB1 +XM1 net13 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=2 l=0.6 nf=4 +XM2 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=4 l=0.6 nf=8 +XM3 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=8 l=0.6 nf=16 +XM4 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=16 l=0.6 nf=32 +XM5 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=16 l=0.6 nf=32 +XM6 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=32 l=0.6 nf=64 +.ends C18_sky130_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1_sL2/target_lvs.spice new file mode 100644 index 00000000..dd37ae85 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1_sL2/target_lvs.spice @@ -0,0 +1,158 @@ +.subckt C18_sky130_sW1_sL2 VDD VSS VIN1 VOUT1 VB1 +XM1_f0 net13 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f1 net13 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f2 net13 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f3 net13 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f0 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f1 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f2 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f3 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f4 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f5 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f6 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f7 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM3_f0 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f1 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f2 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f3 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f4 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f5 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f6 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f7 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f8 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f9 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f10 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f11 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f12 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f13 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f14 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f15 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f0 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f1 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f2 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f3 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f4 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f5 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f6 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f7 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f8 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f9 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f10 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f11 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f12 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f13 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f14 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f15 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f16 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f17 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f18 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f19 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f20 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f21 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f22 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f23 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f24 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f25 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f26 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f27 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f28 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f29 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f30 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f31 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f0 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f1 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f2 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f3 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f4 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f5 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f6 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f7 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f8 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f9 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f10 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f11 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f12 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f13 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f14 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f15 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f16 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f17 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f18 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f19 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f20 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f21 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f22 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f23 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f24 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f25 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f26 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f27 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f28 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f29 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f30 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f31 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM6_f0 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f1 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f2 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f3 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f4 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f5 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f6 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f7 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f8 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f9 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f10 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f11 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f12 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f13 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f14 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f15 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f16 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f17 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f18 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f19 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f20 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f21 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f22 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f23 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f24 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f25 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f26 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f27 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f28 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f29 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f30 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f31 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f32 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f33 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f34 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f35 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f36 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f37 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f38 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f39 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f40 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f41 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f42 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f43 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f44 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f45 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f46 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f47 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f48 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f49 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f50 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f51 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f52 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f53 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f54 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f55 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f56 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f57 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f58 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f59 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f60 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f61 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f62 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f63 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +.ends C18_sky130_sW1_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1_sL2/testbench.spice new file mode 100644 index 00000000..e549000c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW1_sL2/testbench.spice @@ -0,0 +1,58 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C18_sky130_sW1_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +XB_VB1 VB1 VB1 VDDB VDDB sky130_fd_pr__pfet_01v8 w=4 l=0.6 +IB_VB1 VB1 VSS 2e-05 +* DC servo (disclosed test auxiliary): VINT -> input DC level that makes V_out = VT; frozen at VHOLD when KSW = 1 +VT VT 0 0.9 +VMID VMID 0 0.9 +VKSW KSW 0 0 +VHOLD VHOLD 0 0 +BSRV VSRV 0 V = (1-v(KSW))*(0.54 + 0.5*tanh(200*(v(VOUT1)-v(VT)))) + v(KSW)*v(VHOLD) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EIN VIN1 VINT VAC 0 1 +VAC VAC 0 dc 0 ac 1 sin(0 1m 1meg) +RL VOUT1 VMID 20000 +CL VOUT1 VMID 5e-12 +.option method=gear reltol=1e-3 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let iq = -i(VDD) +print vout0 vin0 iq +set vin0_s = "$&vin0" +ac dec 20 10 10G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +set gain_s = "$&gain_lf" +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +* open-loop DC transfer around the operating point (servo frozen at the input level it found) +alter @VHOLD[dc] = $vin0_s +alter @VKSW[dc] = 1 +dc VAC -0.4 0.4 0.001 +let gin = abs(deriv(v(VOUT1))) +meas dc gmid find gin at=0 +let gn = gin/gmid +meas dc vo_a find v(VOUT1) when gn=0.5 cross=1 +meas dc vo_b find v(VOUT1) when gn=0.5 cross=last +let out_swing = abs(vo_b - vo_a) +print out_swing +* distortion at a fixed OUTPUT amplitude of 0.1 V (servo frozen, input amplitude = amplitude / |gain|) +alter @VKSW[dc] = 0 +let a_lin = 10^($gain_s/20) +let vamp2 = 0.1/a_lin +if vamp2 > 0.3 + let vamp2 = 0.3 +end +print vamp2 +alter @VAC[sin] = [ 0 $&vamp2 1meg ] +tran 2n 6u 3u +fourier 1meg v(VOUT1) +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C18/sky130/sW2_sL1.5/case.json b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW2_sL1.5/case.json new file mode 100644 index 00000000..f75c9a4b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW2_sL1.5/case.json @@ -0,0 +1,185 @@ +{ + "case_id": "C18_sky130_sW2_sL1.5", + "circuit_id": "C18", + "pdk": "sky130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "dut_name": "C18_sky130_sW2_sL1.5", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.45, + "nf": 8 + }, + "M2": { + "w": 8.0, + "l": 0.45, + "nf": 16 + }, + "M3": { + "w": 16.0, + "l": 0.45, + "nf": 32 + }, + "M4": { + "w": 32.0, + "l": 0.45, + "nf": 64 + }, + "M5": { + "w": 32.0, + "l": 0.45, + "nf": 64 + }, + "M6": { + "w": 64.0, + "l": 0.45, + "nf": 128 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 2e-05 + } + }, + "load": { + "RL": 20000.0, + "CL": 5e-12, + "vamp": 0.02, + "vout_target": 0.9, + "vin_center": 0.54, + "servo_slope": 200.0, + "options": ".option method=gear reltol=1e-3", + "vout_amp": 0.1 + }, + "category": "buffer_ab", + "notes": [ + "first-pass sizing v1", + "RL/CL returned to an ideal mid-supply source; open-loop output-swing metric added" + ], + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 16.0, + "l": 0.45, + "nf": 32, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.45, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.45, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 32.0, + "l0": 0.3, + "nf0": 64, + "uw0": 0.5, + "w": 64.0, + "l": 0.45, + "nf": 128, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "b3a96efbd6f92422", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M2", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo (freezable)" + }, + { + "kind": "testbench_element", + "what": "mid-supply load return" + }, + { + "kind": "testbench_element", + "what": "load resistor and capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/sky130/sW2_sL1.5/manifest.json b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW2_sL1.5/manifest.json new file mode 100644 index 00000000..d428af8a --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW2_sL1.5/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "8cc919185e45444da4792976cf53afe2ce962292fe7c3b9d8b34d855d44cfb2a", + "qualification.json": "3ee0487c8aea26bee887e946eb296dbd822c81f8c43892e81048c15b310dafea", + "specs.json": "6632780533f4fdf2b5f9ddc941122eb1a36c9852bc67135256fcd66f2ad3c966", + "target.spice": "1ebc04b9f57bb04cbf8283860f559b3863410fbf38908d931cdd6ea0f98560d5", + "target_lvs.spice": "908c708e1cc2a23d902739795899d303bc4e72bbae17dba198bf601301d43a69", + "testbench.spice": "8fd888a248738a1632569531bee1d91abb63730ac50b926c8153d10035efb7bd" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/sky130/sW2_sL1.5/qualification.json b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW2_sL1.5/qualification.json new file mode 100644 index 00000000..2c026af6 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW2_sL1.5/qualification.json @@ -0,0 +1,154 @@ +{ + "case_id": "C18_sky130_sW2_sL1.5", + "circuit_id": "C18", + "pdk": "sky130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "buffer_ab", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 16.0, + "l": 0.45, + "nf": 32, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.45, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.45, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 32.0, + "l0": 0.3, + "nf0": 64, + "uw0": 0.5, + "w": 64.0, + "l": 0.45, + "nf": 128, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "b3a96efbd6f92422", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "servo did not reach the output target: vout0=0.9985048 target=0.9 (tol 0.036 V)", + "thd_pct=46.94 above floor 3", + "out_swing=0 below floor 0.45" + ], + "spec": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 11170000.0 + }, + "out_swing": { + "min": 0.45 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 46.9376, + "iq": 1.978111e-05, + "f3db": 18615980.0, + "out_swing": 0.0 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.45 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 12.0, + "schematic_measures": { + "vout0": 0.9985048, + "vin0": 1.04, + "iq": 1.978111e-05, + "gain_lf": -44.53606, + "f3db": 18615980.0, + "gmid": 0.005931983, + "vo_a": 0.9978174, + "vo_b": 0.9978174, + "out_swing": 0.0, + "vamp2": 0.3, + "thd_pct": 46.9376 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/sky130/sW2_sL1.5/specs.json b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW2_sL1.5/specs.json new file mode 100644 index 00000000..b8462f88 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW2_sL1.5/specs.json @@ -0,0 +1,37 @@ +{ + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 11170000.0 + }, + "out_swing": { + "min": 0.45 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 46.9376, + "iq": 1.978111e-05, + "f3db": 18615980.0, + "out_swing": 0.0 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.45 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/sky130/sW2_sL1.5/target.spice b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW2_sL1.5/target.spice new file mode 100644 index 00000000..94fb3458 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW2_sL1.5/target.spice @@ -0,0 +1,8 @@ +.subckt C18_sky130_sW2_sL1.5 VDD VSS VIN1 VOUT1 VB1 +XM1 net13 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=4 l=0.45 nf=8 +XM2 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=8 l=0.45 nf=16 +XM3 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=16 l=0.45 nf=32 +XM4 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=32 l=0.45 nf=64 +XM5 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=32 l=0.45 nf=64 +XM6 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=64 l=0.45 nf=128 +.ends C18_sky130_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C18/sky130/sW2_sL1.5/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW2_sL1.5/target_lvs.spice new file mode 100644 index 00000000..ed5bec41 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW2_sL1.5/target_lvs.spice @@ -0,0 +1,314 @@ +.subckt C18_sky130_sW2_sL1.5 VDD VSS VIN1 VOUT1 VB1 +XM1_f0 net13 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f1 net13 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f2 net13 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f3 net13 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f4 net13 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f5 net13 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f6 net13 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM1_f7 net13 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM2_f0 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f1 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f2 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f3 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f4 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f5 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f6 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f7 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f8 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f9 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f10 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f11 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f12 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f13 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f14 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM2_f15 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM3_f0 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f1 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f2 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f3 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f4 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f5 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f6 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f7 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f8 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f9 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f10 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f11 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f12 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f13 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f14 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f15 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f16 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f17 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f18 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f19 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f20 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f21 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f22 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f23 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f24 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f25 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f26 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f27 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f28 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f29 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f30 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM3_f31 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM4_f0 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f1 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f2 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f3 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f4 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f5 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f6 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f7 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f8 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f9 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f10 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f11 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f12 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f13 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f14 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f15 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f16 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f17 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f18 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f19 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f20 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f21 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f22 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f23 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f24 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f25 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f26 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f27 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f28 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f29 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f30 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f31 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f32 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f33 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f34 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f35 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f36 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f37 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f38 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f39 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f40 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f41 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f42 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f43 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f44 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f45 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f46 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f47 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f48 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f49 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f50 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f51 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f52 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f53 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f54 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f55 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f56 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f57 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f58 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f59 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f60 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f61 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f62 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM4_f63 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM5_f0 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f1 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f2 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f3 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f4 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f5 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f6 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f7 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f8 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f9 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f10 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f11 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f12 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f13 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f14 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f15 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f16 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f17 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f18 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f19 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f20 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f21 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f22 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f23 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f24 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f25 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f26 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f27 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f28 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f29 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f30 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f31 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f32 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f33 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f34 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f35 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f36 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f37 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f38 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f39 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f40 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f41 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f42 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f43 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f44 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f45 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f46 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f47 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f48 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f49 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f50 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f51 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f52 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f53 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f54 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f55 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f56 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f57 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f58 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f59 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f60 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f61 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f62 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM5_f63 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.45 +XM6_f0 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f1 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f2 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f3 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f4 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f5 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f6 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f7 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f8 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f9 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f10 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f11 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f12 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f13 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f14 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f15 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f16 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f17 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f18 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f19 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f20 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f21 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f22 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f23 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f24 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f25 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f26 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f27 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f28 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f29 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f30 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f31 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f32 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f33 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f34 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f35 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f36 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f37 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f38 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f39 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f40 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f41 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f42 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f43 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f44 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f45 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f46 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f47 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f48 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f49 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f50 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f51 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f52 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f53 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f54 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f55 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f56 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f57 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f58 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f59 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f60 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f61 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f62 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f63 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f64 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f65 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f66 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f67 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f68 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f69 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f70 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f71 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f72 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f73 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f74 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f75 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f76 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f77 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f78 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f79 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f80 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f81 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f82 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f83 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f84 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f85 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f86 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f87 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f88 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f89 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f90 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f91 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f92 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f93 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f94 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f95 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f96 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f97 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f98 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f99 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f100 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f101 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f102 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f103 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f104 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f105 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f106 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f107 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f108 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f109 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f110 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f111 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f112 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f113 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f114 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f115 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f116 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f117 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f118 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f119 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f120 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f121 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f122 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f123 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f124 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f125 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f126 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +XM6_f127 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.45 +.ends C18_sky130_sW2_sL1.5 diff --git a/benchmarks/textbook_sharing/data/cases/C18/sky130/sW2_sL1.5/testbench.spice b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW2_sL1.5/testbench.spice new file mode 100644 index 00000000..5c573fd5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW2_sL1.5/testbench.spice @@ -0,0 +1,58 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C18_sky130_sW2_sL1.5 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +XB_VB1 VB1 VB1 VDDB VDDB sky130_fd_pr__pfet_01v8 w=8 l=0.45 +IB_VB1 VB1 VSS 2e-05 +* DC servo (disclosed test auxiliary): VINT -> input DC level that makes V_out = VT; frozen at VHOLD when KSW = 1 +VT VT 0 0.9 +VMID VMID 0 0.9 +VKSW KSW 0 0 +VHOLD VHOLD 0 0 +BSRV VSRV 0 V = (1-v(KSW))*(0.54 + 0.5*tanh(200*(v(VOUT1)-v(VT)))) + v(KSW)*v(VHOLD) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EIN VIN1 VINT VAC 0 1 +VAC VAC 0 dc 0 ac 1 sin(0 1m 1meg) +RL VOUT1 VMID 20000 +CL VOUT1 VMID 5e-12 +.option method=gear reltol=1e-3 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let iq = -i(VDD) +print vout0 vin0 iq +set vin0_s = "$&vin0" +ac dec 20 10 10G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +set gain_s = "$&gain_lf" +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +* open-loop DC transfer around the operating point (servo frozen at the input level it found) +alter @VHOLD[dc] = $vin0_s +alter @VKSW[dc] = 1 +dc VAC -0.4 0.4 0.001 +let gin = abs(deriv(v(VOUT1))) +meas dc gmid find gin at=0 +let gn = gin/gmid +meas dc vo_a find v(VOUT1) when gn=0.5 cross=1 +meas dc vo_b find v(VOUT1) when gn=0.5 cross=last +let out_swing = abs(vo_b - vo_a) +print out_swing +* distortion at a fixed OUTPUT amplitude of 0.1 V (servo frozen, input amplitude = amplitude / |gain|) +alter @VKSW[dc] = 0 +let a_lin = 10^($gain_s/20) +let vamp2 = 0.1/a_lin +if vamp2 > 0.3 + let vamp2 = 0.3 +end +print vamp2 +alter @VAC[sin] = [ 0 $&vamp2 1meg ] +tran 2n 6u 3u +fourier 1meg v(VOUT1) +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C18/sky130/sW2_sL1/case.json b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW2_sL1/case.json new file mode 100644 index 00000000..edfab9dd --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW2_sL1/case.json @@ -0,0 +1,185 @@ +{ + "case_id": "C18_sky130_sW2_sL1", + "circuit_id": "C18", + "pdk": "sky130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "dut_name": "C18_sky130_sW2_sL1", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.3, + "nf": 8 + }, + "M2": { + "w": 8.0, + "l": 0.3, + "nf": 16 + }, + "M3": { + "w": 16.0, + "l": 0.3, + "nf": 32 + }, + "M4": { + "w": 32.0, + "l": 0.3, + "nf": 64 + }, + "M5": { + "w": 32.0, + "l": 0.3, + "nf": 64 + }, + "M6": { + "w": 64.0, + "l": 0.3, + "nf": 128 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 2e-05 + } + }, + "load": { + "RL": 20000.0, + "CL": 5e-12, + "vamp": 0.02, + "vout_target": 0.9, + "vin_center": 0.54, + "servo_slope": 200.0, + "options": ".option method=gear reltol=1e-3", + "vout_amp": 0.1 + }, + "category": "buffer_ab", + "notes": [ + "first-pass sizing v1", + "RL/CL returned to an ideal mid-supply source; open-loop output-swing metric added" + ], + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 16.0, + "l": 0.3, + "nf": 32, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.3, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.3, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 32.0, + "l0": 0.3, + "nf0": 64, + "uw0": 0.5, + "w": 64.0, + "l": 0.3, + "nf": 128, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "f0ae8d5f09761da9", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M2", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo (freezable)" + }, + { + "kind": "testbench_element", + "what": "mid-supply load return" + }, + { + "kind": "testbench_element", + "what": "load resistor and capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/sky130/sW2_sL1/manifest.json b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW2_sL1/manifest.json new file mode 100644 index 00000000..a88e4012 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW2_sL1/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "0a4373774e9a115dcb9bb200f1bca29d7c8ab81b8a246bbf5c7458d290f07bb7", + "qualification.json": "6e29bb1dd36b55c8dc42d5630feb1dba55f587f5fcd8bc7a771fb53422a69574", + "specs.json": "7677d5dbb8851708218018a8a1ec375dade80aabf504fe6540306ebc4e2d1e43", + "target.spice": "0201c2b1c1f84154c9d3d428f6485e4d6607436f0c44a558fca4d4791d3d5a22", + "target_lvs.spice": "72565d7ad61c3c41d8ecbe74d1560c8e70390297971c3fe339eb876b02279423", + "testbench.spice": "28b8c64b6c081c78f0e958c402639d942e65cfe8825fa006c71e87f8dc0178e1" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/sky130/sW2_sL1/qualification.json b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW2_sL1/qualification.json new file mode 100644 index 00000000..44568de9 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW2_sL1/qualification.json @@ -0,0 +1,154 @@ +{ + "case_id": "C18_sky130_sW2_sL1", + "circuit_id": "C18", + "pdk": "sky130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "buffer_ab", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 16.0, + "l": 0.3, + "nf": 32, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.3, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.3, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 32.0, + "l0": 0.3, + "nf0": 64, + "uw0": 0.5, + "w": 64.0, + "l": 0.3, + "nf": 128, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "f0ae8d5f09761da9", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "servo did not reach the output target: vout0=0.96461 target=0.9 (tol 0.036 V)", + "thd_pct=52.88 above floor 3", + "out_swing=0 below floor 0.45" + ], + "spec": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 17990000.0 + }, + "out_swing": { + "min": 0.45 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 52.8808, + "iq": 3.228383e-05, + "f3db": 29978200.0, + "out_swing": 0.0 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.45 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 12.0, + "schematic_measures": { + "vout0": 0.96461, + "vin0": 1.04, + "iq": 3.228383e-05, + "gain_lf": -40.00373, + "f3db": 29978200.0, + "gmid": 0.009995783, + "vo_a": 0.9635484, + "vo_b": 0.9635484, + "out_swing": 0.0, + "vamp2": 0.3, + "thd_pct": 52.8808 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/sky130/sW2_sL1/specs.json b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW2_sL1/specs.json new file mode 100644 index 00000000..31a70953 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW2_sL1/specs.json @@ -0,0 +1,37 @@ +{ + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 17990000.0 + }, + "out_swing": { + "min": 0.45 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 52.8808, + "iq": 3.228383e-05, + "f3db": 29978200.0, + "out_swing": 0.0 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.45 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/sky130/sW2_sL1/target.spice b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW2_sL1/target.spice new file mode 100644 index 00000000..d4df2da5 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW2_sL1/target.spice @@ -0,0 +1,8 @@ +.subckt C18_sky130_sW2_sL1 VDD VSS VIN1 VOUT1 VB1 +XM1 net13 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=4 l=0.3 nf=8 +XM2 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=8 l=0.3 nf=16 +XM3 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=16 l=0.3 nf=32 +XM4 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=32 l=0.3 nf=64 +XM5 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=32 l=0.3 nf=64 +XM6 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=64 l=0.3 nf=128 +.ends C18_sky130_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C18/sky130/sW2_sL1/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW2_sL1/target_lvs.spice new file mode 100644 index 00000000..afa8cbd2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW2_sL1/target_lvs.spice @@ -0,0 +1,314 @@ +.subckt C18_sky130_sW2_sL1 VDD VSS VIN1 VOUT1 VB1 +XM1_f0 net13 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f1 net13 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f2 net13 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f3 net13 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f4 net13 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f5 net13 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f6 net13 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM1_f7 net13 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM2_f0 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f1 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f2 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f3 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f4 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f5 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f6 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f7 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f8 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f9 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f10 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f11 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f12 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f13 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f14 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM2_f15 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM3_f0 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f1 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f2 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f3 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f4 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f5 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f6 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f7 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f8 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f9 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f10 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f11 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f12 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f13 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f14 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f15 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f16 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f17 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f18 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f19 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f20 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f21 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f22 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f23 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f24 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f25 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f26 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f27 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f28 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f29 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f30 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM3_f31 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM4_f0 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f1 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f2 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f3 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f4 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f5 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f6 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f7 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f8 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f9 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f10 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f11 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f12 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f13 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f14 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f15 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f16 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f17 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f18 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f19 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f20 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f21 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f22 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f23 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f24 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f25 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f26 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f27 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f28 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f29 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f30 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f31 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f32 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f33 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f34 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f35 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f36 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f37 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f38 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f39 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f40 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f41 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f42 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f43 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f44 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f45 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f46 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f47 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f48 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f49 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f50 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f51 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f52 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f53 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f54 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f55 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f56 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f57 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f58 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f59 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f60 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f61 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f62 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM4_f63 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM5_f0 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f1 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f2 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f3 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f4 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f5 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f6 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f7 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f8 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f9 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f10 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f11 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f12 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f13 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f14 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f15 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f16 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f17 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f18 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f19 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f20 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f21 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f22 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f23 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f24 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f25 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f26 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f27 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f28 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f29 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f30 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f31 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f32 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f33 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f34 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f35 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f36 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f37 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f38 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f39 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f40 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f41 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f42 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f43 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f44 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f45 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f46 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f47 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f48 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f49 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f50 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f51 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f52 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f53 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f54 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f55 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f56 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f57 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f58 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f59 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f60 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f61 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f62 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM5_f63 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.3 +XM6_f0 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f1 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f2 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f3 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f4 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f5 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f6 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f7 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f8 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f9 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f10 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f11 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f12 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f13 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f14 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f15 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f16 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f17 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f18 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f19 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f20 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f21 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f22 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f23 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f24 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f25 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f26 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f27 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f28 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f29 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f30 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f31 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f32 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f33 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f34 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f35 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f36 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f37 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f38 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f39 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f40 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f41 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f42 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f43 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f44 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f45 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f46 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f47 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f48 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f49 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f50 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f51 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f52 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f53 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f54 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f55 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f56 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f57 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f58 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f59 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f60 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f61 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f62 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f63 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f64 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f65 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f66 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f67 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f68 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f69 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f70 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f71 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f72 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f73 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f74 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f75 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f76 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f77 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f78 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f79 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f80 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f81 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f82 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f83 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f84 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f85 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f86 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f87 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f88 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f89 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f90 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f91 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f92 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f93 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f94 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f95 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f96 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f97 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f98 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f99 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f100 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f101 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f102 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f103 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f104 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f105 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f106 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f107 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f108 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f109 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f110 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f111 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f112 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f113 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f114 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f115 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f116 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f117 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f118 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f119 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f120 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f121 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f122 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f123 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f124 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f125 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f126 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +XM6_f127 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.3 +.ends C18_sky130_sW2_sL1 diff --git a/benchmarks/textbook_sharing/data/cases/C18/sky130/sW2_sL1/testbench.spice b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW2_sL1/testbench.spice new file mode 100644 index 00000000..a165a3bd --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW2_sL1/testbench.spice @@ -0,0 +1,58 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C18_sky130_sW2_sL1 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +XB_VB1 VB1 VB1 VDDB VDDB sky130_fd_pr__pfet_01v8 w=8 l=0.3 +IB_VB1 VB1 VSS 2e-05 +* DC servo (disclosed test auxiliary): VINT -> input DC level that makes V_out = VT; frozen at VHOLD when KSW = 1 +VT VT 0 0.9 +VMID VMID 0 0.9 +VKSW KSW 0 0 +VHOLD VHOLD 0 0 +BSRV VSRV 0 V = (1-v(KSW))*(0.54 + 0.5*tanh(200*(v(VOUT1)-v(VT)))) + v(KSW)*v(VHOLD) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EIN VIN1 VINT VAC 0 1 +VAC VAC 0 dc 0 ac 1 sin(0 1m 1meg) +RL VOUT1 VMID 20000 +CL VOUT1 VMID 5e-12 +.option method=gear reltol=1e-3 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let iq = -i(VDD) +print vout0 vin0 iq +set vin0_s = "$&vin0" +ac dec 20 10 10G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +set gain_s = "$&gain_lf" +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +* open-loop DC transfer around the operating point (servo frozen at the input level it found) +alter @VHOLD[dc] = $vin0_s +alter @VKSW[dc] = 1 +dc VAC -0.4 0.4 0.001 +let gin = abs(deriv(v(VOUT1))) +meas dc gmid find gin at=0 +let gn = gin/gmid +meas dc vo_a find v(VOUT1) when gn=0.5 cross=1 +meas dc vo_b find v(VOUT1) when gn=0.5 cross=last +let out_swing = abs(vo_b - vo_a) +print out_swing +* distortion at a fixed OUTPUT amplitude of 0.1 V (servo frozen, input amplitude = amplitude / |gain|) +alter @VKSW[dc] = 0 +let a_lin = 10^($gain_s/20) +let vamp2 = 0.1/a_lin +if vamp2 > 0.3 + let vamp2 = 0.3 +end +print vamp2 +alter @VAC[sin] = [ 0 $&vamp2 1meg ] +tran 2n 6u 3u +fourier 1meg v(VOUT1) +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/cases/C18/sky130/sW2_sL2/case.json b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW2_sL2/case.json new file mode 100644 index 00000000..88544682 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW2_sL2/case.json @@ -0,0 +1,185 @@ +{ + "case_id": "C18_sky130_sW2_sL2", + "circuit_id": "C18", + "pdk": "sky130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "dut_name": "C18_sky130_sW2_sL2", + "ports": [ + "VDD", + "VSS", + "VIN1", + "VOUT1", + "VB1" + ], + "sizing": { + "M1": { + "w": 4.0, + "l": 0.6, + "nf": 8 + }, + "M2": { + "w": 8.0, + "l": 0.6, + "nf": 16 + }, + "M3": { + "w": 16.0, + "l": 0.6, + "nf": 32 + }, + "M4": { + "w": 32.0, + "l": 0.6, + "nf": 64 + }, + "M5": { + "w": 32.0, + "l": 0.6, + "nf": 64 + }, + "M6": { + "w": 64.0, + "l": 0.6, + "nf": 128 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 2e-05 + } + }, + "load": { + "RL": 20000.0, + "CL": 5e-12, + "vamp": 0.02, + "vout_target": 0.9, + "vin_center": 0.54, + "servo_slope": 200.0, + "options": ".option method=gear reltol=1e-3", + "vout_amp": 0.1 + }, + "category": "buffer_ab", + "notes": [ + "first-pass sizing v1", + "RL/CL returned to an ideal mid-supply source; open-loop output-swing metric added" + ], + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 16.0, + "l": 0.6, + "nf": 32, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.6, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.6, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 32.0, + "l0": 0.3, + "nf0": 64, + "uw0": 0.5, + "w": 64.0, + "l": 0.6, + "nf": 128, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "3796e57029af3adc", + "testbench_rule": "55e01f6c3361826d", + "test_auxiliaries": [ + { + "kind": "replica_bias", + "port": "VB1", + "replica_of": "M2", + "current_A": 2e-05, + "variant": "diode" + }, + { + "kind": "testbench_element", + "what": "bounded tanh DC servo (freezable)" + }, + { + "kind": "testbench_element", + "what": "mid-supply load return" + }, + { + "kind": "testbench_element", + "what": "load resistor and capacitor" + } + ], + "core_devices": [ + "M1", + "M2", + "M3", + "M4", + "M5", + "M6" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/sky130/sW2_sL2/manifest.json b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW2_sL2/manifest.json new file mode 100644 index 00000000..2add75d1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW2_sL2/manifest.json @@ -0,0 +1,8 @@ +{ + "case.json": "29746c5e532c9bfc88ee33fb8a35050b6276fa9eae1f1628394f3d5d18be7b13", + "qualification.json": "28e9e03779af4b5d1a4c5aa84e59cda492a4fb727caf4f32bc7bb16419db734a", + "specs.json": "6aad2d5abf1cbdf4a57a5c67293a01c725590c9f3038cdbd81ef6fb4f2694d55", + "target.spice": "ee45aec6db1e9dc839c9a0d18619f1d1968c3a0aca43b9e72c1bed91dbb00254", + "target_lvs.spice": "b62235b8099f37c052cba2605785bb7d24efe28efa3e732fdc889ed704c9bfa9", + "testbench.spice": "f4198b7bd7cc6d8d971d3552234f364ff67cf2641eaa7daa11491ef112b00420" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/sky130/sW2_sL2/qualification.json b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW2_sL2/qualification.json new file mode 100644 index 00000000..48f2e881 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW2_sL2/qualification.json @@ -0,0 +1,154 @@ +{ + "case_id": "C18_sky130_sW2_sL2", + "circuit_id": "C18", + "pdk": "sky130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "buffer_ab", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 16.0, + "l": 0.6, + "nf": 32, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.6, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.6, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 32.0, + "l0": 0.3, + "nf0": 64, + "uw0": 0.5, + "w": 64.0, + "l": 0.6, + "nf": 128, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "3796e57029af3adc", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "servo did not reach the output target: vout0=1.008435 target=0.9 (tol 0.036 V)", + "thd_pct=44.53 above floor 3", + "out_swing=0 below floor 0.45" + ], + "spec": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 8401000.0 + }, + "out_swing": { + "min": 0.45 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 44.5327, + "iq": 1.494627e-05, + "f3db": 14001530.0, + "out_swing": 0.0 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.45 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "presim_s": 11.9, + "schematic_measures": { + "vout0": 1.008435, + "vin0": 1.04, + "iq": 1.494627e-05, + "gain_lf": -47.51454, + "f3db": 14001530.0, + "gmid": 0.004209937, + "vo_a": 1.007928, + "vo_b": 1.007928, + "out_swing": 0.0, + "vamp2": 0.3, + "thd_pct": 44.5327 + }, + "testbench_rule": "55e01f6c3361826d" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/sky130/sW2_sL2/specs.json b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW2_sL2/specs.json new file mode 100644 index 00000000..2e84db06 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW2_sL2/specs.json @@ -0,0 +1,37 @@ +{ + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 8401000.0 + }, + "out_swing": { + "min": 0.45 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 44.5327, + "iq": 1.494627e-05, + "f3db": 14001530.0, + "out_swing": 0.0 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.45 + } + }, + "rule": "textbook_sharing.qualify v1" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/cases/C18/sky130/sW2_sL2/target.spice b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW2_sL2/target.spice new file mode 100644 index 00000000..0c90432b --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW2_sL2/target.spice @@ -0,0 +1,8 @@ +.subckt C18_sky130_sW2_sL2 VDD VSS VIN1 VOUT1 VB1 +XM1 net13 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=4 l=0.6 nf=8 +XM2 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=8 l=0.6 nf=16 +XM3 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=16 l=0.6 nf=32 +XM4 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=32 l=0.6 nf=64 +XM5 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=32 l=0.6 nf=64 +XM6 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=64 l=0.6 nf=128 +.ends C18_sky130_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C18/sky130/sW2_sL2/target_lvs.spice b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW2_sL2/target_lvs.spice new file mode 100644 index 00000000..ea2a4ac4 --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW2_sL2/target_lvs.spice @@ -0,0 +1,314 @@ +.subckt C18_sky130_sW2_sL2 VDD VSS VIN1 VOUT1 VB1 +XM1_f0 net13 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f1 net13 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f2 net13 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f3 net13 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f4 net13 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f5 net13 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f6 net13 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM1_f7 net13 VIN1 VSS VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM2_f0 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f1 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f2 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f3 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f4 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f5 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f6 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f7 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f8 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f9 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f10 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f11 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f12 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f13 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f14 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM2_f15 net9 VB1 VDD VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM3_f0 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f1 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f2 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f3 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f4 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f5 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f6 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f7 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f8 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f9 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f10 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f11 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f12 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f13 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f14 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f15 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f16 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f17 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f18 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f19 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f20 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f21 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f22 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f23 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f24 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f25 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f26 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f27 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f28 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f29 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f30 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM3_f31 net9 net9 net22 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM4_f0 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f1 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f2 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f3 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f4 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f5 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f6 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f7 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f8 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f9 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f10 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f11 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f12 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f13 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f14 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f15 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f16 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f17 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f18 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f19 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f20 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f21 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f22 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f23 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f24 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f25 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f26 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f27 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f28 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f29 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f30 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f31 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f32 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f33 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f34 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f35 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f36 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f37 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f38 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f39 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f40 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f41 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f42 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f43 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f44 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f45 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f46 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f47 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f48 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f49 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f50 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f51 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f52 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f53 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f54 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f55 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f56 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f57 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f58 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f59 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f60 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f61 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f62 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM4_f63 net13 net13 net22 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM5_f0 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f1 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f2 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f3 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f4 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f5 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f6 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f7 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f8 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f9 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f10 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f11 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f12 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f13 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f14 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f15 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f16 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f17 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f18 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f19 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f20 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f21 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f22 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f23 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f24 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f25 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f26 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f27 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f28 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f29 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f30 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f31 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f32 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f33 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f34 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f35 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f36 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f37 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f38 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f39 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f40 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f41 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f42 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f43 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f44 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f45 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f46 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f47 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f48 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f49 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f50 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f51 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f52 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f53 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f54 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f55 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f56 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f57 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f58 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f59 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f60 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f61 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f62 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM5_f63 VDD net9 VOUT1 VSS sky130_fd_pr__nfet_01v8 w=0.5 l=0.6 +XM6_f0 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f1 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f2 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f3 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f4 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f5 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f6 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f7 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f8 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f9 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f10 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f11 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f12 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f13 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f14 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f15 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f16 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f17 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f18 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f19 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f20 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f21 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f22 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f23 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f24 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f25 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f26 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f27 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f28 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f29 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f30 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f31 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f32 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f33 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f34 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f35 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f36 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f37 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f38 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f39 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f40 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f41 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f42 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f43 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f44 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f45 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f46 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f47 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f48 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f49 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f50 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f51 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f52 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f53 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f54 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f55 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f56 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f57 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f58 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f59 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f60 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f61 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f62 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f63 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f64 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f65 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f66 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f67 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f68 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f69 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f70 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f71 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f72 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f73 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f74 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f75 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f76 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f77 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f78 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f79 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f80 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f81 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f82 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f83 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f84 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f85 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f86 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f87 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f88 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f89 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f90 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f91 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f92 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f93 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f94 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f95 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f96 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f97 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f98 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f99 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f100 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f101 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f102 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f103 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f104 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f105 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f106 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f107 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f108 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f109 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f110 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f111 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f112 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f113 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f114 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f115 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f116 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f117 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f118 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f119 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f120 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f121 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f122 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f123 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f124 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f125 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f126 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +XM6_f127 VSS net13 VOUT1 VDD sky130_fd_pr__pfet_01v8 w=0.5 l=0.6 +.ends C18_sky130_sW2_sL2 diff --git a/benchmarks/textbook_sharing/data/cases/C18/sky130/sW2_sL2/testbench.spice b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW2_sL2/testbench.spice new file mode 100644 index 00000000..94b24c1c --- /dev/null +++ b/benchmarks/textbook_sharing/data/cases/C18/sky130/sW2_sL2/testbench.spice @@ -0,0 +1,58 @@ +X1 VDD VSS VIN1 VOUT1 VB1 C18_sky130_sW2_sL2 +.include DUT_INCLUDE_PATH +VDD VDD 0 1.8 +VSS VSS 0 0 +VDDB VDDB 0 1.8 +XB_VB1 VB1 VB1 VDDB VDDB sky130_fd_pr__pfet_01v8 w=8 l=0.6 +IB_VB1 VB1 VSS 2e-05 +* DC servo (disclosed test auxiliary): VINT -> input DC level that makes V_out = VT; frozen at VHOLD when KSW = 1 +VT VT 0 0.9 +VMID VMID 0 0.9 +VKSW KSW 0 0 +VHOLD VHOLD 0 0 +BSRV VSRV 0 V = (1-v(KSW))*(0.54 + 0.5*tanh(200*(v(VOUT1)-v(VT)))) + v(KSW)*v(VHOLD) +RSRV VSRV VINT 1e3 +CSRV VINT 0 1e3 +EIN VIN1 VINT VAC 0 1 +VAC VAC 0 dc 0 ac 1 sin(0 1m 1meg) +RL VOUT1 VMID 20000 +CL VOUT1 VMID 5e-12 +.option method=gear reltol=1e-3 +.control +op +let vout0 = v(VOUT1) +let vin0 = v(VIN1) +let iq = -i(VDD) +print vout0 vin0 iq +set vin0_s = "$&vin0" +ac dec 20 10 10G +let gdb = db(v(VOUT1)) +meas ac gain_lf find gdb at=100 +set gain_s = "$&gain_lf" +let g3 = gdb - gain_lf + 3 +meas ac f3db when g3=0 cross=1 +* open-loop DC transfer around the operating point (servo frozen at the input level it found) +alter @VHOLD[dc] = $vin0_s +alter @VKSW[dc] = 1 +dc VAC -0.4 0.4 0.001 +let gin = abs(deriv(v(VOUT1))) +meas dc gmid find gin at=0 +let gn = gin/gmid +meas dc vo_a find v(VOUT1) when gn=0.5 cross=1 +meas dc vo_b find v(VOUT1) when gn=0.5 cross=last +let out_swing = abs(vo_b - vo_a) +print out_swing +* distortion at a fixed OUTPUT amplitude of 0.1 V (servo frozen, input amplitude = amplitude / |gain|) +alter @VKSW[dc] = 0 +let a_lin = 10^($gain_s/20) +let vamp2 = 0.1/a_lin +if vamp2 > 0.3 + let vamp2 = 0.3 +end +print vamp2 +alter @VAC[sin] = [ 0 $&vamp2 1meg ] +tran 2n 6u 3u +fourier 1meg v(VOUT1) +quit +.endc +.end diff --git a/benchmarks/textbook_sharing/data/frozen/fixed_order.json b/benchmarks/textbook_sharing/data/frozen/fixed_order.json new file mode 100644 index 00000000..b68a1eaf --- /dev/null +++ b/benchmarks/textbook_sharing/data/frozen/fixed_order.json @@ -0,0 +1,36 @@ +{ + "order": [ + "combined", + "gate_only", + "diffusion_only", + "independent" + ], + "per_mode": { + "diffusion_only": { + "applicable": 75, + "passed": 74, + "pass_rate": 0.9866666666666667, + "n_paired": 74, + "mean_rel_area": -0.024349224362344435 + }, + "gate_only": { + "applicable": 57, + "passed": 56, + "pass_rate": 0.9824561403508771, + "n_paired": 56, + "mean_rel_area": -0.04540359657543676 + }, + "combined": { + "applicable": 57, + "passed": 55, + "pass_rate": 0.9649122807017544, + "n_paired": 55, + "mean_rel_area": -0.05471477540677514 + } + }, + "sizes": [ + "sW1_sL1", + "sW1_sL1.5" + ], + "rule": "For each sharing mode m, over the development cases where both m and independent passed every automatic stage, take the mean of (A_m / A_independent - 1); order the modes by that mean ascending (ties: higher pass rate first); 'independent' is always last. Declared before the development results were read; computed from the development sizes only and frozen before any held-out size was measured." +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/nominal/C01/gf180.json b/benchmarks/textbook_sharing/data/nominal/C01/gf180.json new file mode 100644 index 00000000..6d5155a1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/nominal/C01/gf180.json @@ -0,0 +1,34 @@ +{ + "circuit_id": "C01", + "pdk": "gf180", + "sizing": { + "M1": { + "w": 2.0, + "l": 1.12, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 1.12, + "nf": 4 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 1.65, + "tol": 0.05 + }, + "notes": [ + "first-pass sizing v1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/nominal/C01/ihp130.json b/benchmarks/textbook_sharing/data/nominal/C01/ihp130.json new file mode 100644 index 00000000..946c1579 --- /dev/null +++ b/benchmarks/textbook_sharing/data/nominal/C01/ihp130.json @@ -0,0 +1,34 @@ +{ + "circuit_id": "C01", + "pdk": "ihp130", + "sizing": { + "M1": { + "w": 2.0, + "l": 1.04, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 1.04, + "nf": 4 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 0.6, + "tol": 0.05 + }, + "notes": [ + "first-pass sizing v1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/nominal/C01/sky130.json b/benchmarks/textbook_sharing/data/nominal/C01/sky130.json new file mode 100644 index 00000000..6451f62f --- /dev/null +++ b/benchmarks/textbook_sharing/data/nominal/C01/sky130.json @@ -0,0 +1,34 @@ +{ + "circuit_id": "C01", + "pdk": "sky130", + "sizing": { + "M1": { + "w": 2.0, + "l": 0.6, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 0.6, + "nf": 4 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 0.9, + "tol": 0.05 + }, + "notes": [ + "first-pass sizing v1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/nominal/C02/gf180.json b/benchmarks/textbook_sharing/data/nominal/C02/gf180.json new file mode 100644 index 00000000..100a9be7 --- /dev/null +++ b/benchmarks/textbook_sharing/data/nominal/C02/gf180.json @@ -0,0 +1,44 @@ +{ + "circuit_id": "C02", + "pdk": "gf180", + "sizing": { + "M1": { + "w": 2.0, + "l": 0.56, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 0.56, + "nf": 4 + }, + "M3": { + "w": 2.0, + "l": 0.56, + "nf": 4 + }, + "M4": { + "w": 2.0, + "l": 0.56, + "nf": 4 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 2.145, + "tol": 0.03 + }, + "notes": [ + "first-pass sizing v1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/nominal/C02/ihp130.json b/benchmarks/textbook_sharing/data/nominal/C02/ihp130.json new file mode 100644 index 00000000..f30f1baa --- /dev/null +++ b/benchmarks/textbook_sharing/data/nominal/C02/ihp130.json @@ -0,0 +1,44 @@ +{ + "circuit_id": "C02", + "pdk": "ihp130", + "sizing": { + "M1": { + "w": 2.0, + "l": 0.52, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 0.52, + "nf": 4 + }, + "M3": { + "w": 2.0, + "l": 0.52, + "nf": 4 + }, + "M4": { + "w": 2.0, + "l": 0.52, + "nf": 4 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 0.78, + "tol": 0.03 + }, + "notes": [ + "first-pass sizing v1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/nominal/C02/sky130.json b/benchmarks/textbook_sharing/data/nominal/C02/sky130.json new file mode 100644 index 00000000..42ad4efc --- /dev/null +++ b/benchmarks/textbook_sharing/data/nominal/C02/sky130.json @@ -0,0 +1,44 @@ +{ + "circuit_id": "C02", + "pdk": "sky130", + "sizing": { + "M1": { + "w": 2.0, + "l": 0.3, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 0.3, + "nf": 4 + }, + "M3": { + "w": 2.0, + "l": 0.3, + "nf": 4 + }, + "M4": { + "w": 2.0, + "l": 0.3, + "nf": 4 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 1.1700000000000002, + "tol": 0.03 + }, + "notes": [ + "first-pass sizing v1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/nominal/C03/gf180.json b/benchmarks/textbook_sharing/data/nominal/C03/gf180.json new file mode 100644 index 00000000..7f40fa41 --- /dev/null +++ b/benchmarks/textbook_sharing/data/nominal/C03/gf180.json @@ -0,0 +1,39 @@ +{ + "circuit_id": "C03", + "pdk": "gf180", + "sizing": { + "M1": { + "w": 4.0, + "l": 2.24, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 2.24, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 2.24, + "nf": 8 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 2.145, + "tol": 0.1 + }, + "notes": [ + "first-pass sizing v1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/nominal/C03/ihp130.json b/benchmarks/textbook_sharing/data/nominal/C03/ihp130.json new file mode 100644 index 00000000..1b1db194 --- /dev/null +++ b/benchmarks/textbook_sharing/data/nominal/C03/ihp130.json @@ -0,0 +1,39 @@ +{ + "circuit_id": "C03", + "pdk": "ihp130", + "sizing": { + "M1": { + "w": 4.0, + "l": 2.08, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 2.08, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 2.08, + "nf": 8 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 0.78, + "tol": 0.1 + }, + "notes": [ + "first-pass sizing v1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/nominal/C03/sky130.json b/benchmarks/textbook_sharing/data/nominal/C03/sky130.json new file mode 100644 index 00000000..1f14bac0 --- /dev/null +++ b/benchmarks/textbook_sharing/data/nominal/C03/sky130.json @@ -0,0 +1,39 @@ +{ + "circuit_id": "C03", + "pdk": "sky130", + "sizing": { + "M1": { + "w": 4.0, + "l": 1.2, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 1.2, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 1.2, + "nf": 8 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 1.1700000000000002, + "tol": 0.1 + }, + "notes": [ + "first-pass sizing v1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/nominal/C04/gf180.json b/benchmarks/textbook_sharing/data/nominal/C04/gf180.json new file mode 100644 index 00000000..d71ba661 --- /dev/null +++ b/benchmarks/textbook_sharing/data/nominal/C04/gf180.json @@ -0,0 +1,32 @@ +{ + "circuit_id": "C04", + "pdk": "gf180", + "sizing": { + "M1": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "M2": { + "w": 2.0, + "l": 0.56, + "nf": 4 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M1", + "current": 2e-05 + } + }, + "load": { + "CL": 1e-13 + }, + "notes": [ + "first-pass sizing v1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/nominal/C04/ihp130.json b/benchmarks/textbook_sharing/data/nominal/C04/ihp130.json new file mode 100644 index 00000000..8f90390c --- /dev/null +++ b/benchmarks/textbook_sharing/data/nominal/C04/ihp130.json @@ -0,0 +1,32 @@ +{ + "circuit_id": "C04", + "pdk": "ihp130", + "sizing": { + "M1": { + "w": 4.0, + "l": 0.26, + "nf": 8 + }, + "M2": { + "w": 2.0, + "l": 0.26, + "nf": 4 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M1", + "current": 2e-05 + } + }, + "load": { + "CL": 1e-13 + }, + "notes": [ + "first-pass sizing v1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/nominal/C04/sky130.json b/benchmarks/textbook_sharing/data/nominal/C04/sky130.json new file mode 100644 index 00000000..44068d8f --- /dev/null +++ b/benchmarks/textbook_sharing/data/nominal/C04/sky130.json @@ -0,0 +1,32 @@ +{ + "circuit_id": "C04", + "pdk": "sky130", + "sizing": { + "M1": { + "w": 4.0, + "l": 0.3, + "nf": 8 + }, + "M2": { + "w": 2.0, + "l": 0.3, + "nf": 4 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M1", + "current": 2e-05 + } + }, + "load": { + "CL": 1e-13 + }, + "notes": [ + "first-pass sizing v1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/nominal/C05/gf180.json b/benchmarks/textbook_sharing/data/nominal/C05/gf180.json new file mode 100644 index 00000000..3a70f543 --- /dev/null +++ b/benchmarks/textbook_sharing/data/nominal/C05/gf180.json @@ -0,0 +1,34 @@ +{ + "circuit_id": "C05", + "pdk": "gf180", + "sizing": { + "M1": { + "w": 2.0, + "l": 0.56, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.56, + "nf": 8 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M1", + "current": 2e-05 + } + }, + "load": { + "vin_nom": 2.145, + "RL": 20000.0, + "CL": 1e-12 + }, + "notes": [ + "first-pass sizing v1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/nominal/C05/ihp130.json b/benchmarks/textbook_sharing/data/nominal/C05/ihp130.json new file mode 100644 index 00000000..af3a5830 --- /dev/null +++ b/benchmarks/textbook_sharing/data/nominal/C05/ihp130.json @@ -0,0 +1,34 @@ +{ + "circuit_id": "C05", + "pdk": "ihp130", + "sizing": { + "M1": { + "w": 2.0, + "l": 0.26, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.26, + "nf": 8 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M1", + "current": 2e-05 + } + }, + "load": { + "vin_nom": 0.78, + "RL": 20000.0, + "CL": 1e-12 + }, + "notes": [ + "first-pass sizing v1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/nominal/C05/sky130.json b/benchmarks/textbook_sharing/data/nominal/C05/sky130.json new file mode 100644 index 00000000..07807ab3 --- /dev/null +++ b/benchmarks/textbook_sharing/data/nominal/C05/sky130.json @@ -0,0 +1,34 @@ +{ + "circuit_id": "C05", + "pdk": "sky130", + "sizing": { + "M1": { + "w": 2.0, + "l": 0.3, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.3, + "nf": 8 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M1", + "current": 2e-05 + } + }, + "load": { + "vin_nom": 1.1700000000000002, + "RL": 20000.0, + "CL": 1e-12 + }, + "notes": [ + "first-pass sizing v1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/nominal/C06/gf180.json b/benchmarks/textbook_sharing/data/nominal/C06/gf180.json new file mode 100644 index 00000000..8f9b2215 --- /dev/null +++ b/benchmarks/textbook_sharing/data/nominal/C06/gf180.json @@ -0,0 +1,52 @@ +{ + "circuit_id": "C06", + "pdk": "gf180", + "sizing": { + "M1": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "M3": { + "w": 2.0, + "l": 0.56, + "nf": 4 + }, + "M4": { + "w": 2.0, + "l": 0.56, + "nf": 4 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M4", + "current": 2e-05, + "kind": "cascode" + }, + "VB2": { + "replica": "M1", + "current": 2e-05, + "kind": "cascode" + }, + "VB3": { + "replica": "M2", + "current": 2e-05 + } + }, + "load": { + "CL": 1e-13 + }, + "notes": [ + "first-pass sizing v1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/nominal/C06/ihp130.json b/benchmarks/textbook_sharing/data/nominal/C06/ihp130.json new file mode 100644 index 00000000..cacedb1f --- /dev/null +++ b/benchmarks/textbook_sharing/data/nominal/C06/ihp130.json @@ -0,0 +1,52 @@ +{ + "circuit_id": "C06", + "pdk": "ihp130", + "sizing": { + "M1": { + "w": 4.0, + "l": 0.26, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 0.26, + "nf": 8 + }, + "M3": { + "w": 2.0, + "l": 0.26, + "nf": 4 + }, + "M4": { + "w": 2.0, + "l": 0.26, + "nf": 4 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M4", + "current": 2e-05, + "kind": "cascode" + }, + "VB2": { + "replica": "M1", + "current": 2e-05, + "kind": "cascode" + }, + "VB3": { + "replica": "M2", + "current": 2e-05 + } + }, + "load": { + "CL": 1e-13 + }, + "notes": [ + "first-pass sizing v1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/nominal/C06/sky130.json b/benchmarks/textbook_sharing/data/nominal/C06/sky130.json new file mode 100644 index 00000000..83959d0f --- /dev/null +++ b/benchmarks/textbook_sharing/data/nominal/C06/sky130.json @@ -0,0 +1,52 @@ +{ + "circuit_id": "C06", + "pdk": "sky130", + "sizing": { + "M1": { + "w": 4.0, + "l": 0.3, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 0.3, + "nf": 8 + }, + "M3": { + "w": 2.0, + "l": 0.3, + "nf": 4 + }, + "M4": { + "w": 2.0, + "l": 0.3, + "nf": 4 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M4", + "current": 2e-05, + "kind": "cascode" + }, + "VB2": { + "replica": "M1", + "current": 2e-05, + "kind": "cascode" + }, + "VB3": { + "replica": "M2", + "current": 2e-05 + } + }, + "load": { + "CL": 1e-13 + }, + "notes": [ + "first-pass sizing v1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/nominal/C07/gf180.json b/benchmarks/textbook_sharing/data/nominal/C07/gf180.json new file mode 100644 index 00000000..79338835 --- /dev/null +++ b/benchmarks/textbook_sharing/data/nominal/C07/gf180.json @@ -0,0 +1,48 @@ +{ + "circuit_id": "C07", + "pdk": "gf180", + "sizing": { + "M1": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "M4": { + "w": 4.0, + "l": 0.56, + "nf": 8 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 2e-05 + }, + "IB1": { + "i": 4e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 1.5, + "CL": 1e-13, + "vocm": 1.65 + }, + "notes": [ + "first-pass sizing v1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/nominal/C07/ihp130.json b/benchmarks/textbook_sharing/data/nominal/C07/ihp130.json new file mode 100644 index 00000000..36f37030 --- /dev/null +++ b/benchmarks/textbook_sharing/data/nominal/C07/ihp130.json @@ -0,0 +1,48 @@ +{ + "circuit_id": "C07", + "pdk": "ihp130", + "sizing": { + "M1": { + "w": 4.0, + "l": 0.26, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 0.26, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 0.26, + "nf": 8 + }, + "M4": { + "w": 4.0, + "l": 0.26, + "nf": 8 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 2e-05 + }, + "IB1": { + "i": 4e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 0.6, + "CL": 1e-13, + "vocm": 0.6 + }, + "notes": [ + "first-pass sizing v1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/nominal/C07/sky130.json b/benchmarks/textbook_sharing/data/nominal/C07/sky130.json new file mode 100644 index 00000000..199a4701 --- /dev/null +++ b/benchmarks/textbook_sharing/data/nominal/C07/sky130.json @@ -0,0 +1,48 @@ +{ + "circuit_id": "C07", + "pdk": "sky130", + "sizing": { + "M1": { + "w": 4.0, + "l": 0.3, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 0.3, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 0.3, + "nf": 8 + }, + "M4": { + "w": 4.0, + "l": 0.3, + "nf": 8 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 2e-05 + }, + "IB1": { + "i": 4e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 0.9, + "CL": 1e-13, + "vocm": 0.9 + }, + "notes": [ + "first-pass sizing v1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/nominal/C08/gf180.json b/benchmarks/textbook_sharing/data/nominal/C08/gf180.json new file mode 100644 index 00000000..e2d4e022 --- /dev/null +++ b/benchmarks/textbook_sharing/data/nominal/C08/gf180.json @@ -0,0 +1,49 @@ +{ + "circuit_id": "C08", + "pdk": "gf180", + "sizing": { + "M1": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "M4": { + "w": 2.0, + "l": 0.56, + "nf": 4 + }, + "M5": { + "w": 2.0, + "l": 0.56, + "nf": 4 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 4e-05 + } + }, + "load": { + "vcm": 1.5, + "CL": 1e-12, + "inv_input": "VIN2" + }, + "notes": [ + "first-pass sizing v1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/nominal/C08/ihp130.json b/benchmarks/textbook_sharing/data/nominal/C08/ihp130.json new file mode 100644 index 00000000..3289a678 --- /dev/null +++ b/benchmarks/textbook_sharing/data/nominal/C08/ihp130.json @@ -0,0 +1,49 @@ +{ + "circuit_id": "C08", + "pdk": "ihp130", + "sizing": { + "M1": { + "w": 4.0, + "l": 0.39, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 0.39, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 0.39, + "nf": 8 + }, + "M4": { + "w": 2.0, + "l": 0.39, + "nf": 4 + }, + "M5": { + "w": 2.0, + "l": 0.39, + "nf": 4 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 4e-05 + } + }, + "load": { + "vcm": 0.6, + "CL": 1e-12, + "inv_input": "VIN2" + }, + "notes": [ + "first-pass sizing v1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/nominal/C08/sky130.json b/benchmarks/textbook_sharing/data/nominal/C08/sky130.json new file mode 100644 index 00000000..fc6b3356 --- /dev/null +++ b/benchmarks/textbook_sharing/data/nominal/C08/sky130.json @@ -0,0 +1,49 @@ +{ + "circuit_id": "C08", + "pdk": "sky130", + "sizing": { + "M1": { + "w": 4.0, + "l": 0.3, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 0.3, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 0.3, + "nf": 8 + }, + "M4": { + "w": 2.0, + "l": 0.3, + "nf": 4 + }, + "M5": { + "w": 2.0, + "l": 0.3, + "nf": 4 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 4e-05 + } + }, + "load": { + "vcm": 0.9, + "CL": 1e-12, + "inv_input": "VIN2" + }, + "notes": [ + "first-pass sizing v1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/nominal/C09/gf180.json b/benchmarks/textbook_sharing/data/nominal/C09/gf180.json new file mode 100644 index 00000000..59b0934d --- /dev/null +++ b/benchmarks/textbook_sharing/data/nominal/C09/gf180.json @@ -0,0 +1,76 @@ +{ + "circuit_id": "C09", + "pdk": "gf180", + "sizing": { + "M1": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "M4": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "M5": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "M6": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "M7": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "M8": { + "w": 4.0, + "l": 0.56, + "nf": 8 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 2e-05, + "kind": "cascode" + }, + "IB1": { + "i": 4e-05, + "from": "VSS" + } + }, + "load": { + "vcm": { + "expr": "v(VB1) - gs(M3) + gs(M1) - 0.1", + "currents": { + "M3": 2e-05, + "M1": 2e-05 + } + }, + "CL": 1e-12, + "inv_input": "VIN2", + "vout_target": 1.4849999999999999 + }, + "notes": [ + "first-pass sizing v1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/nominal/C09/ihp130.json b/benchmarks/textbook_sharing/data/nominal/C09/ihp130.json new file mode 100644 index 00000000..e4f206e3 --- /dev/null +++ b/benchmarks/textbook_sharing/data/nominal/C09/ihp130.json @@ -0,0 +1,76 @@ +{ + "circuit_id": "C09", + "pdk": "ihp130", + "sizing": { + "M1": { + "w": 8.0, + "l": 0.26, + "nf": 16 + }, + "M2": { + "w": 8.0, + "l": 0.26, + "nf": 16 + }, + "M3": { + "w": 8.0, + "l": 0.26, + "nf": 16 + }, + "M4": { + "w": 8.0, + "l": 0.26, + "nf": 16 + }, + "M5": { + "w": 16.0, + "l": 0.26, + "nf": 32 + }, + "M6": { + "w": 16.0, + "l": 0.26, + "nf": 32 + }, + "M7": { + "w": 16.0, + "l": 0.26, + "nf": 32 + }, + "M8": { + "w": 16.0, + "l": 0.26, + "nf": 32 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 1e-05, + "kind": "cascode" + }, + "IB1": { + "i": 2e-05, + "from": "VSS" + } + }, + "load": { + "vcm": { + "expr": "v(VB1) - gs(M3) + gs(M1) - 0.1", + "currents": { + "M3": 1e-05, + "M1": 1e-05 + } + }, + "CL": 1e-12, + "inv_input": "VIN2", + "vout_target": 0.54 + }, + "notes": [ + "first-pass sizing v1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/nominal/C09/sky130.json b/benchmarks/textbook_sharing/data/nominal/C09/sky130.json new file mode 100644 index 00000000..7b4d3df2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/nominal/C09/sky130.json @@ -0,0 +1,76 @@ +{ + "circuit_id": "C09", + "pdk": "sky130", + "sizing": { + "M1": { + "w": 8.0, + "l": 0.3, + "nf": 16 + }, + "M2": { + "w": 8.0, + "l": 0.3, + "nf": 16 + }, + "M3": { + "w": 8.0, + "l": 0.3, + "nf": 16 + }, + "M4": { + "w": 8.0, + "l": 0.3, + "nf": 16 + }, + "M5": { + "w": 16.0, + "l": 0.3, + "nf": 32 + }, + "M6": { + "w": 16.0, + "l": 0.3, + "nf": 32 + }, + "M7": { + "w": 16.0, + "l": 0.3, + "nf": 32 + }, + "M8": { + "w": 16.0, + "l": 0.3, + "nf": 32 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 1e-05, + "kind": "cascode" + }, + "IB1": { + "i": 2e-05, + "from": "VSS" + } + }, + "load": { + "vcm": { + "expr": "v(VB1) - gs(M3) + gs(M1) - 0.1", + "currents": { + "M3": 1e-05, + "M1": 1e-05 + } + }, + "CL": 1e-12, + "inv_input": "VIN2", + "vout_target": 0.81 + }, + "notes": [ + "first-pass sizing v1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/nominal/C10/gf180.json b/benchmarks/textbook_sharing/data/nominal/C10/gf180.json new file mode 100644 index 00000000..44af3438 --- /dev/null +++ b/benchmarks/textbook_sharing/data/nominal/C10/gf180.json @@ -0,0 +1,93 @@ +{ + "circuit_id": "C10", + "pdk": "gf180", + "sizing": { + "M1": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "M4": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "M5": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "M6": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "M7": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "M8": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "M9": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "M10": { + "w": 4.0, + "l": 0.56, + "nf": 8 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M5", + "current": 2e-05, + "kind": "cascode3" + }, + "VB2": { + "replica": "M7", + "current": 2e-05, + "kind": "cascode3" + }, + "VB3": { + "replica": "M9", + "current": 2e-05 + }, + "VB4": { + "replica": "M3", + "current": 4e-05 + }, + "IB1": { + "i": 4e-05, + "from": "VDD" + } + }, + "load": { + "vcm": 1.5, + "CL": 5e-13, + "cmfb_gain": 20.0, + "vocm": 1.65 + }, + "notes": [ + "first-pass sizing v1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/nominal/C10/ihp130.json b/benchmarks/textbook_sharing/data/nominal/C10/ihp130.json new file mode 100644 index 00000000..542a0108 --- /dev/null +++ b/benchmarks/textbook_sharing/data/nominal/C10/ihp130.json @@ -0,0 +1,93 @@ +{ + "circuit_id": "C10", + "pdk": "ihp130", + "sizing": { + "M1": { + "w": 4.0, + "l": 0.52, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 0.52, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 0.52, + "nf": 8 + }, + "M4": { + "w": 4.0, + "l": 0.52, + "nf": 8 + }, + "M5": { + "w": 4.0, + "l": 0.52, + "nf": 8 + }, + "M6": { + "w": 4.0, + "l": 0.52, + "nf": 8 + }, + "M7": { + "w": 4.0, + "l": 0.52, + "nf": 8 + }, + "M8": { + "w": 4.0, + "l": 0.52, + "nf": 8 + }, + "M9": { + "w": 4.0, + "l": 0.52, + "nf": 8 + }, + "M10": { + "w": 4.0, + "l": 0.52, + "nf": 8 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M5", + "current": 2e-05, + "kind": "cascode3" + }, + "VB2": { + "replica": "M7", + "current": 2e-05, + "kind": "cascode3" + }, + "VB3": { + "replica": "M9", + "current": 2e-05 + }, + "VB4": { + "replica": "M3", + "current": 4e-05 + }, + "IB1": { + "i": 4e-05, + "from": "VDD" + } + }, + "load": { + "vcm": 0.6, + "CL": 5e-13, + "cmfb_gain": 20.0, + "vocm": 0.6 + }, + "notes": [ + "first-pass sizing v1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/nominal/C10/sky130.json b/benchmarks/textbook_sharing/data/nominal/C10/sky130.json new file mode 100644 index 00000000..3a3ba6f1 --- /dev/null +++ b/benchmarks/textbook_sharing/data/nominal/C10/sky130.json @@ -0,0 +1,93 @@ +{ + "circuit_id": "C10", + "pdk": "sky130", + "sizing": { + "M1": { + "w": 4.0, + "l": 0.6, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 0.6, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 0.6, + "nf": 8 + }, + "M4": { + "w": 4.0, + "l": 0.6, + "nf": 8 + }, + "M5": { + "w": 4.0, + "l": 0.6, + "nf": 8 + }, + "M6": { + "w": 4.0, + "l": 0.6, + "nf": 8 + }, + "M7": { + "w": 4.0, + "l": 0.6, + "nf": 8 + }, + "M8": { + "w": 4.0, + "l": 0.6, + "nf": 8 + }, + "M9": { + "w": 4.0, + "l": 0.6, + "nf": 8 + }, + "M10": { + "w": 4.0, + "l": 0.6, + "nf": 8 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M5", + "current": 2e-05, + "kind": "cascode3" + }, + "VB2": { + "replica": "M7", + "current": 2e-05, + "kind": "cascode3" + }, + "VB3": { + "replica": "M9", + "current": 2e-05 + }, + "VB4": { + "replica": "M3", + "current": 4e-05 + }, + "IB1": { + "i": 4e-05, + "from": "VDD" + } + }, + "load": { + "vcm": 0.9, + "CL": 5e-13, + "cmfb_gain": 20.0, + "vocm": 0.9 + }, + "notes": [ + "first-pass sizing v1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/nominal/C11/gf180.json b/benchmarks/textbook_sharing/data/nominal/C11/gf180.json new file mode 100644 index 00000000..289a68a2 --- /dev/null +++ b/benchmarks/textbook_sharing/data/nominal/C11/gf180.json @@ -0,0 +1,77 @@ +{ + "circuit_id": "C11", + "pdk": "gf180", + "sizing": { + "M1": { + "w": 2.0, + "l": 0.56, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "M4": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "M5": { + "w": 2.0, + "l": 0.56, + "nf": 4 + }, + "M6": { + "w": 2.0, + "l": 0.56, + "nf": 4 + }, + "M7": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "M8": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "R1": { + "r": 3000.0, + "body": "VSS", + "w": 1.0, + "l": 7.795 + }, + "C1": { + "c": 1e-12, + "w": 22.365, + "l": 22.365, + "model": "cap_mim_2f0fF" + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 1.32, + "CL": 1e-12, + "inv_input": "VIN1", + "vout_target": 1.65 + }, + "notes": [ + "first-pass sizing v1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/nominal/C11/ihp130.json b/benchmarks/textbook_sharing/data/nominal/C11/ihp130.json new file mode 100644 index 00000000..5d1c2d64 --- /dev/null +++ b/benchmarks/textbook_sharing/data/nominal/C11/ihp130.json @@ -0,0 +1,77 @@ +{ + "circuit_id": "C11", + "pdk": "ihp130", + "sizing": { + "M1": { + "w": 2.0, + "l": 0.26, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.26, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 0.26, + "nf": 8 + }, + "M4": { + "w": 4.0, + "l": 0.26, + "nf": 8 + }, + "M5": { + "w": 2.0, + "l": 0.26, + "nf": 4 + }, + "M6": { + "w": 2.0, + "l": 0.26, + "nf": 4 + }, + "M7": { + "w": 4.0, + "l": 0.26, + "nf": 8 + }, + "M8": { + "w": 4.0, + "l": 0.26, + "nf": 8 + }, + "R1": { + "r": 3000.0, + "body": "VSS", + "w": 1.0, + "l": 11.38 + }, + "C1": { + "c": 1e-12, + "w": 25.82, + "l": 25.82, + "model": "cap_cmim" + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 0.48, + "CL": 1e-12, + "inv_input": "VIN1", + "vout_target": 0.6 + }, + "notes": [ + "first-pass sizing v1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/nominal/C11/sky130.json b/benchmarks/textbook_sharing/data/nominal/C11/sky130.json new file mode 100644 index 00000000..972e79fa --- /dev/null +++ b/benchmarks/textbook_sharing/data/nominal/C11/sky130.json @@ -0,0 +1,77 @@ +{ + "circuit_id": "C11", + "pdk": "sky130", + "sizing": { + "M1": { + "w": 2.0, + "l": 0.3, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.3, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 0.3, + "nf": 8 + }, + "M4": { + "w": 4.0, + "l": 0.3, + "nf": 8 + }, + "M5": { + "w": 2.0, + "l": 0.3, + "nf": 4 + }, + "M6": { + "w": 2.0, + "l": 0.3, + "nf": 4 + }, + "M7": { + "w": 4.0, + "l": 0.3, + "nf": 8 + }, + "M8": { + "w": 4.0, + "l": 0.3, + "nf": 8 + }, + "R1": { + "r": 3000.0, + "body": "VSS", + "w": 0.35, + "l": 2.155 + }, + "C1": { + "c": 1e-12, + "w": 22.365, + "l": 22.365, + "model": "sky130_fd_pr__cap_mim_m3_1" + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 0.7200000000000001, + "CL": 1e-12, + "inv_input": "VIN1", + "vout_target": 0.9 + }, + "notes": [ + "first-pass sizing v1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/nominal/C12/gf180.json b/benchmarks/textbook_sharing/data/nominal/C12/gf180.json new file mode 100644 index 00000000..e854f149 --- /dev/null +++ b/benchmarks/textbook_sharing/data/nominal/C12/gf180.json @@ -0,0 +1,27 @@ +{ + "circuit_id": "C12", + "pdk": "gf180", + "sizing": { + "M1": { + "w": 2.0, + "l": 0.56, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.56, + "nf": 8 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": {}, + "load": { + "CL": 1e-13 + }, + "notes": [ + "first-pass sizing v1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/nominal/C12/ihp130.json b/benchmarks/textbook_sharing/data/nominal/C12/ihp130.json new file mode 100644 index 00000000..b56957fe --- /dev/null +++ b/benchmarks/textbook_sharing/data/nominal/C12/ihp130.json @@ -0,0 +1,27 @@ +{ + "circuit_id": "C12", + "pdk": "ihp130", + "sizing": { + "M1": { + "w": 2.0, + "l": 0.26, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.26, + "nf": 8 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": {}, + "load": { + "CL": 1e-13 + }, + "notes": [ + "first-pass sizing v1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/nominal/C12/sky130.json b/benchmarks/textbook_sharing/data/nominal/C12/sky130.json new file mode 100644 index 00000000..d615edb3 --- /dev/null +++ b/benchmarks/textbook_sharing/data/nominal/C12/sky130.json @@ -0,0 +1,27 @@ +{ + "circuit_id": "C12", + "pdk": "sky130", + "sizing": { + "M1": { + "w": 2.0, + "l": 0.3, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.3, + "nf": 8 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": {}, + "load": { + "CL": 1e-13 + }, + "notes": [ + "first-pass sizing v1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/nominal/C13/gf180.json b/benchmarks/textbook_sharing/data/nominal/C13/gf180.json new file mode 100644 index 00000000..1e68ad00 --- /dev/null +++ b/benchmarks/textbook_sharing/data/nominal/C13/gf180.json @@ -0,0 +1,53 @@ +{ + "circuit_id": "C13", + "pdk": "gf180", + "sizing": { + "M1": { + "w": 0.5, + "l": 0.56, + "nf": 1 + }, + "M2": { + "w": 2.0, + "l": 0.56, + "nf": 4 + }, + "M3": { + "w": 2.0, + "l": 0.56, + "nf": 4 + }, + "M4": { + "w": 2.0, + "l": 0.56, + "nf": 4 + }, + "M5": { + "w": 2.0, + "l": 0.56, + "nf": 4 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VDD" + }, + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 1.65, + "tol": 0.03 + }, + "notes": [ + "first-pass sizing v1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/nominal/C13/ihp130.json b/benchmarks/textbook_sharing/data/nominal/C13/ihp130.json new file mode 100644 index 00000000..3a972577 --- /dev/null +++ b/benchmarks/textbook_sharing/data/nominal/C13/ihp130.json @@ -0,0 +1,53 @@ +{ + "circuit_id": "C13", + "pdk": "ihp130", + "sizing": { + "M1": { + "w": 0.5, + "l": 0.52, + "nf": 1 + }, + "M2": { + "w": 2.0, + "l": 0.52, + "nf": 4 + }, + "M3": { + "w": 2.0, + "l": 0.52, + "nf": 4 + }, + "M4": { + "w": 2.0, + "l": 0.52, + "nf": 4 + }, + "M5": { + "w": 2.0, + "l": 0.52, + "nf": 4 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VDD" + }, + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 0.6, + "tol": 0.03 + }, + "notes": [ + "first-pass sizing v1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/nominal/C13/sky130.json b/benchmarks/textbook_sharing/data/nominal/C13/sky130.json new file mode 100644 index 00000000..cab9c1ca --- /dev/null +++ b/benchmarks/textbook_sharing/data/nominal/C13/sky130.json @@ -0,0 +1,53 @@ +{ + "circuit_id": "C13", + "pdk": "sky130", + "sizing": { + "M1": { + "w": 0.5, + "l": 0.3, + "nf": 1 + }, + "M2": { + "w": 2.0, + "l": 0.3, + "nf": 4 + }, + "M3": { + "w": 2.0, + "l": 0.3, + "nf": 4 + }, + "M4": { + "w": 2.0, + "l": 0.3, + "nf": 4 + }, + "M5": { + "w": 2.0, + "l": 0.3, + "nf": 4 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 2e-05, + "from": "VDD" + }, + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 0.9, + "tol": 0.03 + }, + "notes": [ + "first-pass sizing v1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/nominal/C14/gf180.json b/benchmarks/textbook_sharing/data/nominal/C14/gf180.json new file mode 100644 index 00000000..05b70870 --- /dev/null +++ b/benchmarks/textbook_sharing/data/nominal/C14/gf180.json @@ -0,0 +1,48 @@ +{ + "circuit_id": "C14", + "pdk": "gf180", + "sizing": { + "M1": { + "w": 2.0, + "l": 1.12, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 1.12, + "nf": 4 + }, + "M3": { + "w": 1.0, + "l": 1.12, + "nf": 2 + }, + "M4": { + "w": 2.0, + "l": 1.12, + "nf": 4 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF1": { + "i": 5e-06, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 2.145, + "tol": 0.03 + }, + "notes": [ + "first-pass sizing v1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/nominal/C14/ihp130.json b/benchmarks/textbook_sharing/data/nominal/C14/ihp130.json new file mode 100644 index 00000000..4ac1a17b --- /dev/null +++ b/benchmarks/textbook_sharing/data/nominal/C14/ihp130.json @@ -0,0 +1,48 @@ +{ + "circuit_id": "C14", + "pdk": "ihp130", + "sizing": { + "M1": { + "w": 2.0, + "l": 1.04, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 1.04, + "nf": 4 + }, + "M3": { + "w": 1.0, + "l": 1.04, + "nf": 2 + }, + "M4": { + "w": 2.0, + "l": 1.04, + "nf": 4 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF1": { + "i": 5e-06, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 0.78, + "tol": 0.03 + }, + "notes": [ + "first-pass sizing v1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/nominal/C14/sky130.json b/benchmarks/textbook_sharing/data/nominal/C14/sky130.json new file mode 100644 index 00000000..a7817d1b --- /dev/null +++ b/benchmarks/textbook_sharing/data/nominal/C14/sky130.json @@ -0,0 +1,48 @@ +{ + "circuit_id": "C14", + "pdk": "sky130", + "sizing": { + "M1": { + "w": 2.0, + "l": 0.6, + "nf": 4 + }, + "M2": { + "w": 2.0, + "l": 0.6, + "nf": 4 + }, + "M3": { + "w": 1.0, + "l": 0.6, + "nf": 2 + }, + "M4": { + "w": 2.0, + "l": 0.6, + "nf": 4 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "IIN1": { + "i": 2e-05, + "from": "VDD" + }, + "IREF1": { + "i": 5e-06, + "from": "VDD" + }, + "IREF": 2e-05 + }, + "load": { + "vout_nom": 1.1700000000000002, + "tol": 0.03 + }, + "notes": [ + "first-pass sizing v1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/nominal/C15/gf180.json b/benchmarks/textbook_sharing/data/nominal/C15/gf180.json new file mode 100644 index 00000000..654023ba --- /dev/null +++ b/benchmarks/textbook_sharing/data/nominal/C15/gf180.json @@ -0,0 +1,28 @@ +{ + "circuit_id": "C15", + "pdk": "gf180", + "sizing": { + "M1": { + "w": 2.0, + "l": 0.56, + "nf": 4 + }, + "R1": { + "r": 40000.0, + "body": "VSS", + "w": 1.0, + "l": 60.0 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": {}, + "load": { + "CL": 1e-13 + }, + "notes": [ + "first-pass sizing v1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/nominal/C15/ihp130.json b/benchmarks/textbook_sharing/data/nominal/C15/ihp130.json new file mode 100644 index 00000000..941a22f7 --- /dev/null +++ b/benchmarks/textbook_sharing/data/nominal/C15/ihp130.json @@ -0,0 +1,28 @@ +{ + "circuit_id": "C15", + "pdk": "ihp130", + "sizing": { + "M1": { + "w": 2.0, + "l": 0.26, + "nf": 4 + }, + "R1": { + "r": 12000.0, + "body": "VSS", + "w": 1.0, + "l": 46.385 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": {}, + "load": { + "CL": 1e-13 + }, + "notes": [ + "first-pass sizing v1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/nominal/C15/sky130.json b/benchmarks/textbook_sharing/data/nominal/C15/sky130.json new file mode 100644 index 00000000..a589da11 --- /dev/null +++ b/benchmarks/textbook_sharing/data/nominal/C15/sky130.json @@ -0,0 +1,28 @@ +{ + "circuit_id": "C15", + "pdk": "sky130", + "sizing": { + "M1": { + "w": 2.0, + "l": 0.3, + "nf": 4 + }, + "R1": { + "r": 20000.0, + "body": "VSS", + "w": 0.35, + "l": 17.55 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": {}, + "load": { + "CL": 1e-13 + }, + "notes": [ + "first-pass sizing v1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/nominal/C16/gf180.json b/benchmarks/textbook_sharing/data/nominal/C16/gf180.json new file mode 100644 index 00000000..5fcdcb7a --- /dev/null +++ b/benchmarks/textbook_sharing/data/nominal/C16/gf180.json @@ -0,0 +1,45 @@ +{ + "circuit_id": "C16", + "pdk": "gf180", + "sizing": { + "M1": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "R1": { + "r": 40000.0, + "body": "VSS", + "w": 1.0, + "l": 60.0 + }, + "R2": { + "r": 40000.0, + "body": "VSS", + "w": 1.0, + "l": 60.0 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 4e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 1.5, + "CL": 1e-13 + }, + "notes": [ + "first-pass sizing v1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/nominal/C16/ihp130.json b/benchmarks/textbook_sharing/data/nominal/C16/ihp130.json new file mode 100644 index 00000000..cae18621 --- /dev/null +++ b/benchmarks/textbook_sharing/data/nominal/C16/ihp130.json @@ -0,0 +1,45 @@ +{ + "circuit_id": "C16", + "pdk": "ihp130", + "sizing": { + "M1": { + "w": 4.0, + "l": 0.26, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 0.26, + "nf": 8 + }, + "R1": { + "r": 12000.0, + "body": "VSS", + "w": 1.0, + "l": 46.385 + }, + "R2": { + "r": 12000.0, + "body": "VSS", + "w": 1.0, + "l": 46.385 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 4e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 0.6, + "CL": 1e-13 + }, + "notes": [ + "first-pass sizing v1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/nominal/C16/sky130.json b/benchmarks/textbook_sharing/data/nominal/C16/sky130.json new file mode 100644 index 00000000..ebf46e76 --- /dev/null +++ b/benchmarks/textbook_sharing/data/nominal/C16/sky130.json @@ -0,0 +1,45 @@ +{ + "circuit_id": "C16", + "pdk": "sky130", + "sizing": { + "M1": { + "w": 4.0, + "l": 0.3, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 0.3, + "nf": 8 + }, + "R1": { + "r": 20000.0, + "body": "VSS", + "w": 0.35, + "l": 17.55 + }, + "R2": { + "r": 20000.0, + "body": "VSS", + "w": 0.35, + "l": 17.55 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "IB1": { + "i": 4e-05, + "from": "VSS" + } + }, + "load": { + "vcm": 0.9, + "CL": 1e-13 + }, + "notes": [ + "first-pass sizing v1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/nominal/C17/gf180.json b/benchmarks/textbook_sharing/data/nominal/C17/gf180.json new file mode 100644 index 00000000..12a4b296 --- /dev/null +++ b/benchmarks/textbook_sharing/data/nominal/C17/gf180.json @@ -0,0 +1,62 @@ +{ + "circuit_id": "C17", + "pdk": "gf180", + "sizing": { + "M1": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "R1": { + "r": 40000.0, + "body": "VSS", + "w": 1.0, + "l": 60.0 + }, + "R2": { + "r": 40000.0, + "body": "VSS", + "w": 1.0, + "l": 60.0 + }, + "R3": { + "r": 2000.0, + "body": "VSS", + "w": 1.0, + "l": 5.085 + }, + "R4": { + "r": 2000.0, + "body": "VSS", + "w": 1.0, + "l": 5.085 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 4e-05 + } + }, + "load": { + "vcm": 1.5, + "CL": 1e-13 + }, + "notes": [ + "first-pass sizing v1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/nominal/C17/ihp130.json b/benchmarks/textbook_sharing/data/nominal/C17/ihp130.json new file mode 100644 index 00000000..0bd11d88 --- /dev/null +++ b/benchmarks/textbook_sharing/data/nominal/C17/ihp130.json @@ -0,0 +1,62 @@ +{ + "circuit_id": "C17", + "pdk": "ihp130", + "sizing": { + "M1": { + "w": 4.0, + "l": 0.26, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 0.26, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 0.26, + "nf": 8 + }, + "R1": { + "r": 15000.0, + "body": "VSS", + "w": 1.0, + "l": 58.055 + }, + "R2": { + "r": 15000.0, + "body": "VSS", + "w": 1.0, + "l": 58.055 + }, + "R3": { + "r": 1000.0, + "body": "VSS", + "w": 1.0, + "l": 3.6 + }, + "R4": { + "r": 1000.0, + "body": "VSS", + "w": 1.0, + "l": 3.6 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 4e-05 + } + }, + "load": { + "vcm": 0.6, + "CL": 1e-13 + }, + "notes": [ + "first-pass sizing v1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/nominal/C17/sky130.json b/benchmarks/textbook_sharing/data/nominal/C17/sky130.json new file mode 100644 index 00000000..a46fb5f8 --- /dev/null +++ b/benchmarks/textbook_sharing/data/nominal/C17/sky130.json @@ -0,0 +1,62 @@ +{ + "circuit_id": "C17", + "pdk": "sky130", + "sizing": { + "M1": { + "w": 4.0, + "l": 0.3, + "nf": 8 + }, + "M2": { + "w": 4.0, + "l": 0.3, + "nf": 8 + }, + "M3": { + "w": 4.0, + "l": 0.3, + "nf": 8 + }, + "R1": { + "r": 20000.0, + "body": "VSS", + "w": 0.35, + "l": 17.55 + }, + "R2": { + "r": 20000.0, + "body": "VSS", + "w": 0.35, + "l": 17.55 + }, + "R3": { + "r": 2000.0, + "body": "VSS", + "w": 0.35, + "l": 1.25 + }, + "R4": { + "r": 2000.0, + "body": "VSS", + "w": 0.35, + "l": 1.25 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M3", + "current": 4e-05 + } + }, + "load": { + "vcm": 0.9, + "CL": 1e-13 + }, + "notes": [ + "first-pass sizing v1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/nominal/C18/gf180.json b/benchmarks/textbook_sharing/data/nominal/C18/gf180.json new file mode 100644 index 00000000..ad18d419 --- /dev/null +++ b/benchmarks/textbook_sharing/data/nominal/C18/gf180.json @@ -0,0 +1,58 @@ +{ + "circuit_id": "C18", + "pdk": "gf180", + "sizing": { + "M1": { + "w": 2.0, + "l": 0.56, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "M3": { + "w": 8.0, + "l": 0.56, + "nf": 16 + }, + "M4": { + "w": 16.0, + "l": 0.56, + "nf": 32 + }, + "M5": { + "w": 16.0, + "l": 0.56, + "nf": 32 + }, + "M6": { + "w": 32.0, + "l": 0.56, + "nf": 64 + } + }, + "supply": { + "VDD": 3.3, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 2e-05 + } + }, + "load": { + "RL": 20000.0, + "CL": 5e-12, + "vamp": 0.02, + "vout_target": 1.65, + "vin_center": 0.9899999999999999, + "servo_slope": 200.0, + "options": ".option method=gear reltol=1e-3" + }, + "notes": [ + "first-pass sizing v1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/nominal/C18/ihp130.json b/benchmarks/textbook_sharing/data/nominal/C18/ihp130.json new file mode 100644 index 00000000..214e3c65 --- /dev/null +++ b/benchmarks/textbook_sharing/data/nominal/C18/ihp130.json @@ -0,0 +1,58 @@ +{ + "circuit_id": "C18", + "pdk": "ihp130", + "sizing": { + "M1": { + "w": 2.0, + "l": 0.26, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.26, + "nf": 8 + }, + "M3": { + "w": 8.0, + "l": 0.26, + "nf": 16 + }, + "M4": { + "w": 16.0, + "l": 0.26, + "nf": 32 + }, + "M5": { + "w": 16.0, + "l": 0.26, + "nf": 32 + }, + "M6": { + "w": 32.0, + "l": 0.26, + "nf": 64 + } + }, + "supply": { + "VDD": 1.2, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 2e-05 + } + }, + "load": { + "RL": 20000.0, + "CL": 5e-12, + "vamp": 0.02, + "vout_target": 0.6, + "vin_center": 0.36, + "servo_slope": 200.0, + "options": ".option method=gear reltol=1e-3" + }, + "notes": [ + "first-pass sizing v1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/nominal/C18/sky130.json b/benchmarks/textbook_sharing/data/nominal/C18/sky130.json new file mode 100644 index 00000000..1f529530 --- /dev/null +++ b/benchmarks/textbook_sharing/data/nominal/C18/sky130.json @@ -0,0 +1,58 @@ +{ + "circuit_id": "C18", + "pdk": "sky130", + "sizing": { + "M1": { + "w": 2.0, + "l": 0.3, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.3, + "nf": 8 + }, + "M3": { + "w": 8.0, + "l": 0.3, + "nf": 16 + }, + "M4": { + "w": 16.0, + "l": 0.3, + "nf": 32 + }, + "M5": { + "w": 16.0, + "l": 0.3, + "nf": 32 + }, + "M6": { + "w": 32.0, + "l": 0.3, + "nf": 64 + } + }, + "supply": { + "VDD": 1.8, + "VSS": 0.0 + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 2e-05 + } + }, + "load": { + "RL": 20000.0, + "CL": 5e-12, + "vamp": 0.02, + "vout_target": 0.9, + "vin_center": 0.54, + "servo_slope": 200.0, + "options": ".option method=gear reltol=1e-3" + }, + "notes": [ + "first-pass sizing v1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/data/res_calibration.json b/benchmarks/textbook_sharing/data/res_calibration.json new file mode 100644 index 00000000..7f404805 --- /dev/null +++ b/benchmarks/textbook_sharing/data/res_calibration.json @@ -0,0 +1,50 @@ +{ + "sky130": { + "w": 0.35, + "points": [ + [ + 5.0, + 6144.664 + ], + [ + 20.0, + 22708.8 + ] + ], + "a_ohm_per_um": 1104.2757333333332, + "b_ohm": 623.2853333333342, + "rsh_nominal_table": 319.8 + }, + "gf180": { + "w": 1.0, + "points": [ + [ + 5.0, + 1969.782 + ], + [ + 20.0, + 7500.941 + ] + ], + "a_ohm_per_um": 368.7439333333333, + "b_ohm": 126.06233333333353, + "rsh_nominal_table": 315.0 + }, + "ihp130": { + "w": 1.0, + "points": [ + [ + 5.0, + 1360.14 + ], + [ + 20.0, + 5216.774 + ] + ], + "a_ohm_per_um": 257.1089333333333, + "b_ohm": 74.59533333333343, + "rsh_nominal_table": 260.0 + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/results/analysis/agent_session_audit.json b/benchmarks/textbook_sharing/results/analysis/agent_session_audit.json new file mode 100644 index 00000000..dee5ccb3 --- /dev/null +++ b/benchmarks/textbook_sharing/results/analysis/agent_session_audit.json @@ -0,0 +1,2297 @@ +{ + "what": "Tool-call audit of the 84 Anthropic model sessions (agent interface). Allowed: Read/Write/Edit of a file inside the session folder and `bash submit.sh ` run inside it. Any other call is flagged: 'in_folder_edit' = text processing of the session's own files (protocol deviation, no outside information); 'isolation_breach' = anything else (outside paths, listing/search, network); every automatically flagged session was reviewed by hand.", + "model_ids_in_transcripts": { + "claude-sonnet-5-5": 1900 + }, + "launch_texts": { + "A": "You are the model under test in a controlled analog-layout experiment. Your session folder is:\n\n\nRead README.md in that folder first and follow it exactly. Use only the files in that folder (README.md, interface.md, examples.md, task.md). Write each proposal with the Write tool as p_answer.md in that folder, then run exactly this Bash command (with k replaced by the proposal number) to submit it and read the tool report:\ncd && bash submit.sh k\nDo not open, list or search any other file or directory, and do not run any other command. You have at most 8 proposals. When you stop, reply with one line: the number of the proposal you consider best.", + "B": "You are the model under test in a controlled analog-layout experiment. Your session folder is:\n\n\nRead README.md in that folder first and follow it exactly. Use only the files in that folder (README.md, interface.md, examples.md, task.md). Write each proposal with the Write tool as p_answer.md in that folder, then run exactly this Bash command (with k replaced by the proposal number) to submit it and read the tool report:\ncd && bash submit.sh k\nDo not open, list or search any other file or directory, and do not run any other command. Run the submit command in the foreground and wait for its report. You have at most 8 proposals. When you stop, reply with one line: the number of the proposal you consider best." + }, + "launch_text_note": "Text B adds one sentence (run submit.sh in the foreground and wait for its report). The first 66 sessions launched received text A, the last 18 text B.", + "summary": { + "sessions": 84, + "clean": 44, + "in_folder_edit_sessions": 39, + "auto_flagged": 2, + "after_manual_review": { + "benign": 1, + "outside_folder_read_own_output": 1, + "foreign_information_access": 0 + }, + "launch_text_counts": { + "A": 66, + "B": 18 + } + }, + "token_usage_sum": { + "input_tokens": 3814, + "output_tokens": 1140686, + "cache_read_input_tokens": 111474062, + "cache_creation_input_tokens": 6557167 + }, + "sessions": [ + { + "task_id": "C02_gf180_sW2_sL1", + "rep": 1, + "tool_calls": 16, + "tools": [ + "Bash", + "Read", + "Write" + ], + "launch_text": "A", + "clean": true, + "in_folder_edits": 0, + "auto_flagged": false, + "manual_review": null, + "flagged_calls": [] + }, + { + "task_id": "C02_gf180_sW2_sL1", + "rep": 2, + "tool_calls": 17, + "tools": [ + "Bash", + "Edit", + "Read", + "Write" + ], + "launch_text": "A", + "clean": false, + "in_folder_edits": 1, + "auto_flagged": false, + "manual_review": null, + "flagged_calls": [ + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "cd && sed -i 's/\\[T" + } + } + ] + }, + { + "task_id": "C02_gf180_sW2_sL1", + "rep": 3, + "tool_calls": 18, + "tools": [ + "Bash", + "Read", + "Write" + ], + "launch_text": "A", + "clean": true, + "in_folder_edits": 0, + "auto_flagged": false, + "manual_review": null, + "flagged_calls": [] + }, + { + "task_id": "C02_gf180_sW2_sL2", + "rep": 1, + "tool_calls": 11, + "tools": [ + "Bash", + "Read", + "Write" + ], + "launch_text": "A", + "clean": true, + "in_folder_edits": 0, + "auto_flagged": false, + "manual_review": null, + "flagged_calls": [] + }, + { + "task_id": "C02_gf180_sW2_sL2", + "rep": 2, + "tool_calls": 17, + "tools": [ + "Bash", + "Read", + "Write" + ], + "launch_text": "A", + "clean": true, + "in_folder_edits": 0, + "auto_flagged": false, + "manual_review": null, + "flagged_calls": [] + }, + { + "task_id": "C02_gf180_sW2_sL2", + "rep": 3, + "tool_calls": 21, + "tools": [ + "Bash", + "Read", + "Write" + ], + "launch_text": "A", + "clean": true, + "in_folder_edits": 0, + "auto_flagged": false, + "manual_review": null, + "flagged_calls": [] + }, + { + "task_id": "C02_ihp130_sW2_sL1", + "rep": 1, + "tool_calls": 12, + "tools": [ + "Bash", + "Read", + "Write" + ], + "launch_text": "A", + "clean": false, + "in_folder_edits": 4, + "auto_flagged": false, + "manual_review": null, + "flagged_calls": [ + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "cd && sed 's/pad_e" + } + }, + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "cd && python3 - <<" + } + }, + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "cd && sed 's/side=" + } + }, + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "cd && python3 - <<" + } + } + ] + }, + { + "task_id": "C02_ihp130_sW2_sL1", + "rep": 2, + "tool_calls": 20, + "tools": [ + "Bash", + "Read", + "Write" + ], + "launch_text": "A", + "clean": true, + "in_folder_edits": 0, + "auto_flagged": false, + "manual_review": null, + "flagged_calls": [] + }, + { + "task_id": "C02_ihp130_sW2_sL1", + "rep": 3, + "tool_calls": 13, + "tools": [ + "Bash", + "Read", + "Write" + ], + "launch_text": "A", + "clean": false, + "in_folder_edits": 1, + "auto_flagged": false, + "manual_review": null, + "flagged_calls": [ + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "cd && sed 's/side=" + } + } + ] + }, + { + "task_id": "C02_ihp130_sW2_sL2", + "rep": 1, + "tool_calls": 11, + "tools": [ + "Bash", + "Read", + "Write" + ], + "launch_text": "A", + "clean": true, + "in_folder_edits": 0, + "auto_flagged": false, + "manual_review": null, + "flagged_calls": [] + }, + { + "task_id": "C02_ihp130_sW2_sL2", + "rep": 2, + "tool_calls": 17, + "tools": [ + "Bash", + "Read", + "Write" + ], + "launch_text": "A", + "clean": true, + "in_folder_edits": 0, + "auto_flagged": false, + "manual_review": null, + "flagged_calls": [] + }, + { + "task_id": "C02_ihp130_sW2_sL2", + "rep": 3, + "tool_calls": 16, + "tools": [ + "Bash", + "Read", + "Write" + ], + "launch_text": "A", + "clean": true, + "in_folder_edits": 0, + "auto_flagged": false, + "manual_review": null, + "flagged_calls": [] + }, + { + "task_id": "C02_sky130_sW2_sL1", + "rep": 1, + "tool_calls": 20, + "tools": [ + "Bash", + "Read", + "Write" + ], + "launch_text": "A", + "clean": false, + "in_folder_edits": 1, + "auto_flagged": false, + "manual_review": null, + "flagged_calls": [ + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "cd && sed 's/side=" + } + } + ] + }, + { + "task_id": "C02_sky130_sW2_sL1", + "rep": 2, + "tool_calls": 16, + "tools": [ + "Bash", + "Read", + "Write" + ], + "launch_text": "A", + "clean": true, + "in_folder_edits": 0, + "auto_flagged": false, + "manual_review": null, + "flagged_calls": [] + }, + { + "task_id": "C02_sky130_sW2_sL1", + "rep": 3, + "tool_calls": 18, + "tools": [ + "Bash", + "Read", + "Write" + ], + "launch_text": "A", + "clean": false, + "in_folder_edits": 3, + "auto_flagged": false, + "manual_review": null, + "flagged_calls": [ + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "cd && python3 - <<" + } + }, + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "cd && sed 's/side=" + } + }, + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "cd && sed 's/side=" + } + } + ] + }, + { + "task_id": "C02_sky130_sW2_sL2", + "rep": 1, + "tool_calls": 18, + "tools": [ + "Bash", + "Read", + "Write" + ], + "launch_text": "A", + "clean": true, + "in_folder_edits": 0, + "auto_flagged": false, + "manual_review": null, + "flagged_calls": [] + }, + { + "task_id": "C02_sky130_sW2_sL2", + "rep": 2, + "tool_calls": 11, + "tools": [ + "Bash", + "Read", + "Write" + ], + "launch_text": "A", + "clean": false, + "in_folder_edits": 5, + "auto_flagged": false, + "manual_review": null, + "flagged_calls": [ + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "cd && sed -e 's/si" + } + }, + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "cd && cat > p3_ans" + } + }, + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "cd && cat > p4_ans" + } + }, + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "cd && sed -e 's/si" + } + }, + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "cd && sed -e 's/si" + } + } + ] + }, + { + "task_id": "C02_sky130_sW2_sL2", + "rep": 3, + "tool_calls": 18, + "tools": [ + "Bash", + "Read", + "Write" + ], + "launch_text": "A", + "clean": true, + "in_folder_edits": 0, + "auto_flagged": false, + "manual_review": null, + "flagged_calls": [] + }, + { + "task_id": "C08_gf180_sW2_sL1", + "rep": 1, + "tool_calls": 15, + "tools": [ + "Bash", + "Read", + "Write" + ], + "launch_text": "A", + "clean": true, + "in_folder_edits": 0, + "auto_flagged": false, + "manual_review": null, + "flagged_calls": [] + }, + { + "task_id": "C08_gf180_sW2_sL1", + "rep": 2, + "tool_calls": 16, + "tools": [ + "Bash", + "Read", + "Write" + ], + "launch_text": "A", + "clean": true, + "in_folder_edits": 0, + "auto_flagged": false, + "manual_review": null, + "flagged_calls": [] + }, + { + "task_id": "C08_gf180_sW2_sL1", + "rep": 3, + "tool_calls": 8, + "tools": [ + "Bash", + "Read", + "Write" + ], + "launch_text": "A", + "clean": false, + "in_folder_edits": 1, + "auto_flagged": false, + "manual_review": null, + "flagged_calls": [ + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "cd && sed 's/GateGr" + } + } + ] + }, + { + "task_id": "C08_gf180_sW2_sL2", + "rep": 1, + "tool_calls": 10, + "tools": [ + "Bash", + "Read", + "Write" + ], + "launch_text": "A", + "clean": false, + "in_folder_edits": 1, + "auto_flagged": false, + "manual_review": null, + "flagged_calls": [ + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "cd && sed -e 's/Gat" + } + } + ] + }, + { + "task_id": "C08_gf180_sW2_sL2", + "rep": 2, + "tool_calls": 8, + "tools": [ + "Bash", + "Read", + "Write" + ], + "launch_text": "A", + "clean": true, + "in_folder_edits": 0, + "auto_flagged": false, + "manual_review": null, + "flagged_calls": [] + }, + { + "task_id": "C08_gf180_sW2_sL2", + "rep": 3, + "tool_calls": 14, + "tools": [ + "Bash", + "Read", + "Write" + ], + "launch_text": "A", + "clean": true, + "in_folder_edits": 0, + "auto_flagged": false, + "manual_review": null, + "flagged_calls": [] + }, + { + "task_id": "C08_ihp130_sW2_sL2", + "rep": 1, + "tool_calls": 6, + "tools": [ + "Bash", + "Read", + "Write" + ], + "launch_text": "A", + "clean": true, + "in_folder_edits": 0, + "auto_flagged": false, + "manual_review": null, + "flagged_calls": [] + }, + { + "task_id": "C08_ihp130_sW2_sL2", + "rep": 2, + "tool_calls": 15, + "tools": [ + "Bash", + "Read", + "Write" + ], + "launch_text": "A", + "clean": true, + "in_folder_edits": 0, + "auto_flagged": false, + "manual_review": null, + "flagged_calls": [] + }, + { + "task_id": "C08_ihp130_sW2_sL2", + "rep": 3, + "tool_calls": 11, + "tools": [ + "Bash", + "Read", + "Write" + ], + "launch_text": "B", + "clean": true, + "in_folder_edits": 0, + "auto_flagged": false, + "manual_review": null, + "flagged_calls": [] + }, + { + "task_id": "C08_sky130_sW2_sL1", + "rep": 1, + "tool_calls": 13, + "tools": [ + "Bash", + "Read", + "Write" + ], + "launch_text": "A", + "clean": true, + "in_folder_edits": 0, + "auto_flagged": false, + "manual_review": null, + "flagged_calls": [] + }, + { + "task_id": "C08_sky130_sW2_sL1", + "rep": 2, + "tool_calls": 14, + "tools": [ + "Bash", + "Read", + "Write" + ], + "launch_text": "A", + "clean": true, + "in_folder_edits": 0, + "auto_flagged": false, + "manual_review": null, + "flagged_calls": [] + }, + { + "task_id": "C08_sky130_sW2_sL1", + "rep": 3, + "tool_calls": 20, + "tools": [ + "Bash", + "Read", + "Write" + ], + "launch_text": "A", + "clean": false, + "in_folder_edits": 1, + "auto_flagged": false, + "manual_review": null, + "flagged_calls": [ + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "cd && sed -e 's/Ga" + } + } + ] + }, + { + "task_id": "C08_sky130_sW2_sL2", + "rep": 1, + "tool_calls": 11, + "tools": [ + "Bash", + "Read", + "Write" + ], + "launch_text": "A", + "clean": false, + "in_folder_edits": 4, + "auto_flagged": false, + "manual_review": null, + "flagged_calls": [ + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "cd && sed -e 's/Ga" + } + }, + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "cd && sed -e 's/Ga" + } + }, + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "cd && sed -e 's/Ga" + } + }, + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "cd && python3 - <<" + } + } + ] + }, + { + "task_id": "C08_sky130_sW2_sL2", + "rep": 2, + "tool_calls": 13, + "tools": [ + "Bash", + "Read", + "Write" + ], + "launch_text": "A", + "clean": true, + "in_folder_edits": 0, + "auto_flagged": false, + "manual_review": null, + "flagged_calls": [] + }, + { + "task_id": "C08_sky130_sW2_sL2", + "rep": 3, + "tool_calls": 26, + "tools": [ + "Bash", + "Monitor", + "Read", + "Write" + ], + "launch_text": "A", + "clean": false, + "in_folder_edits": 0, + "auto_flagged": true, + "manual_review": "outside-folder read of its own output: the agent ran submit.sh in the background and then read the background job's output file, which contains only its own tool report; no other file was read", + "flagged_calls": [ + { + "tool": "Monitor", + "class": "isolation_breach", + "input": { + "command": "until [ -s ]; do sleep 5; done; cat ", + "description": "Wait for proposal 2 report", + "timeout_ms": "600000", + "persistent": "false" + } + }, + { + "tool": "Monitor", + "class": "isolation_breach", + "input": { + "command": "sleep 1; echo waiting", + "description": "noop", + "timeout_ms": "5000", + "persistent": "false" + } + }, + { + "tool": "Bash", + "class": "isolation_breach", + "input": { + "command": "cat " + } + }, + { + "tool": "Monitor", + "class": "isolation_breach", + "input": { + "command": "until [ -s ]; do sleep 10; done; cat ", + "description": "Wait for proposal 2 report", + "timeout_ms": "600000", + "persistent": "false" + } + }, + { + "tool": "Monitor", + "class": "isolation_breach", + "input": { + "command": "sleep 300; echo done", + "description": "Idle wait", + "timeout_ms": "320000", + "persistent": "false" + } + }, + { + "tool": "Bash", + "class": "isolation_breach", + "input": { + "command": "cat " + } + }, + { + "tool": "Monitor", + "class": "isolation_breach", + "input": { + "command": "until [ -s ]; do sleep 10; done; cat ", + "description": "Wait for proposal 2 report", + "timeout_ms": "600000", + "persistent": "false" + } + }, + { + "tool": "Monitor", + "class": "isolation_breach", + "input": { + "command": "sleep 540; echo done", + "description": "Idle wait", + "timeout_ms": "580000", + "persistent": "false" + } + }, + { + "tool": "Bash", + "class": "isolation_breach", + "input": { + "command": "cat " + } + }, + { + "tool": "Monitor", + "class": "isolation_breach", + "input": { + "command": "sleep 580; echo done", + "description": "Idle wait", + "timeout_ms": "590000", + "persistent": "false" + } + }, + { + "tool": "Bash", + "class": "isolation_breach", + "input": { + "command": "cat " + } + }, + { + "tool": "Monitor", + "class": "isolation_breach", + "input": { + "command": "until [ -s ]; do sleep 10; done; cat ", + "description": "Wait for proposal 2 report", + "timeout_ms": "600000", + "persistent": "false" + } + }, + { + "tool": "Monitor", + "class": "isolation_breach", + "input": { + "command": "sleep 590; echo done", + "description": "Idle wait", + "timeout_ms": "595000", + "persistent": "false" + } + }, + { + "tool": "Bash", + "class": "isolation_breach", + "input": { + "command": "cat " + } + } + ] + }, + { + "task_id": "C09_gf180_sW2_sL1", + "rep": 1, + "tool_calls": 17, + "tools": [ + "Bash", + "Read", + "Write" + ], + "launch_text": "A", + "clean": false, + "in_folder_edits": 3, + "auto_flagged": false, + "manual_review": null, + "flagged_calls": [ + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "cd && python3 - <<'" + } + }, + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "cd && python3 - <<'" + } + }, + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "cd && python3 - <<'" + } + } + ] + }, + { + "task_id": "C09_gf180_sW2_sL1", + "rep": 2, + "tool_calls": 17, + "tools": [ + "Bash", + "Read", + "Write" + ], + "launch_text": "A", + "clean": false, + "in_folder_edits": 3, + "auto_flagged": false, + "manual_review": null, + "flagged_calls": [ + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "cd && python3 - <<'" + } + }, + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "cd && sed -e '1,/^ " + } + }, + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "cd && python3 - <<'" + } + } + ] + }, + { + "task_id": "C09_gf180_sW2_sL1", + "rep": 3, + "tool_calls": 17, + "tools": [ + "Bash", + "Read", + "Write" + ], + "launch_text": "B", + "clean": false, + "in_folder_edits": 1, + "auto_flagged": false, + "manual_review": null, + "flagged_calls": [ + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "cd && sed -e 's/Gat" + } + } + ] + }, + { + "task_id": "C09_gf180_sW2_sL2", + "rep": 1, + "tool_calls": 16, + "tools": [ + "Bash", + "Read", + "Write" + ], + "launch_text": "A", + "clean": false, + "in_folder_edits": 5, + "auto_flagged": false, + "manual_review": null, + "flagged_calls": [ + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "cd && sed 's/orient" + } + }, + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "cd && sed 's/gate_g" + } + }, + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "cd && sed 's/gate_g" + } + }, + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "cd && python3 - <<'" + } + }, + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "cd && python3 - <<'" + } + } + ] + }, + { + "task_id": "C09_gf180_sW2_sL2", + "rep": 2, + "tool_calls": 13, + "tools": [ + "Bash", + "Read", + "Write" + ], + "launch_text": "A", + "clean": false, + "in_folder_edits": 7, + "auto_flagged": false, + "manual_review": null, + "flagged_calls": [ + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "python3 - <<'E'\ndef fo(d): return \", \".join('(\"%s\", %d)'%(d,k) for k in range(16))\ndef pl(order,ors,joins,gg):\n fing=\", \".join(fo(d) for d in order)\n return \"SharingPlan(finger_order=[%s], orien" + } + }, + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "python3 - <<'E'\ndef fo(d): return \", \".join('(\"%s\", %d)'%(d,k) for k in range(16))\ndef pl(order,ors,joins,gg):\n fing=\", \".join(fo(d) for d in order)\n return \"SharingPlan(finger_order=[%s], orien" + } + }, + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "python3 - <<'E'\ndef fo(d): return \", \".join('(\"%s\", %d)'%(d,k) for k in range(16))\ndef pl(order,ors,joins,gg):\n fing=\", \".join(fo(d) for d in order)\n return \"SharingPlan(finger_order=[%s], orien" + } + }, + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "python3 - <<'E'\ndef fo(d): return \", \".join('(\"%s\", %d)'%(d,k) for k in range(16))\ndef pl(order,ors,joins,gg):\n fing=\", \".join(fo(d) for d in order)\n return \"SharingPlan(finger_order=[%s], orien" + } + }, + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "python3 - <<'E'\ndef fo(d): return \", \".join('(\"%s\", %d)'%(d,k) for k in range(16))\ndef pl(order,ors,joins,gg):\n fing=\", \".join(fo(d) for d in order)\n return \"SharingPlan(finger_order=[%s], orien" + } + }, + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "python3 - <<'E'\ndef fo(d): return \", \".join('(\"%s\", %d)'%(d,k) for k in range(16))\ndef pl(order,ors,joins,gg):\n fing=\", \".join(fo(d) for d in order)\n return \"SharingPlan(finger_order=[%s], orien" + } + }, + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "python3 - <<'E'\ndef fo(d): return \", \".join('(\"%s\", %d)'%(d,k) for k in range(16))\ndef pl(order,ors,joins,gg):\n fing=\", \".join(fo(d) for d in order)\n return \"SharingPlan(finger_order=[%s], orien" + } + } + ] + }, + { + "task_id": "C09_gf180_sW2_sL2", + "rep": 3, + "tool_calls": 19, + "tools": [ + "Bash", + "Read", + "Write" + ], + "launch_text": "B", + "clean": false, + "in_folder_edits": 2, + "auto_flagged": false, + "manual_review": null, + "flagged_calls": [ + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "cd && python3 - <<'" + } + }, + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "cd && grep -n \"gate" + } + } + ] + }, + { + "task_id": "C09_ihp130_sW2_sL1", + "rep": 1, + "tool_calls": 10, + "tools": [ + "Bash", + "Read", + "Write" + ], + "launch_text": "A", + "clean": true, + "in_folder_edits": 0, + "auto_flagged": false, + "manual_review": null, + "flagged_calls": [] + }, + { + "task_id": "C09_ihp130_sW2_sL1", + "rep": 2, + "tool_calls": 18, + "tools": [ + "Bash", + "Read", + "Write" + ], + "launch_text": "A", + "clean": false, + "in_folder_edits": 1, + "auto_flagged": false, + "manual_review": null, + "flagged_calls": [ + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "cd && sed 's/strap", + "dangerouslyDisableSandbox": "False" + } + } + ] + }, + { + "task_id": "C09_ihp130_sW2_sL1", + "rep": 3, + "tool_calls": 12, + "tools": [ + "Bash", + "Read", + "Write" + ], + "launch_text": "B", + "clean": true, + "in_folder_edits": 0, + "auto_flagged": false, + "manual_review": null, + "flagged_calls": [] + }, + { + "task_id": "C09_ihp130_sW2_sL2", + "rep": 1, + "tool_calls": 19, + "tools": [ + "Bash", + "Read", + "Write" + ], + "launch_text": "A", + "clean": false, + "in_folder_edits": 1, + "auto_flagged": false, + "manual_review": null, + "flagged_calls": [ + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "cd && echo skip" + } + } + ] + }, + { + "task_id": "C09_ihp130_sW2_sL2", + "rep": 2, + "tool_calls": 9, + "tools": [ + "Bash", + "Read", + "Write" + ], + "launch_text": "A", + "clean": false, + "in_folder_edits": 1, + "auto_flagged": false, + "manual_review": null, + "flagged_calls": [ + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "cd && python3 - <<" + } + } + ] + }, + { + "task_id": "C09_ihp130_sW2_sL2", + "rep": 3, + "tool_calls": 23, + "tools": [ + "Bash", + "Read", + "Write" + ], + "launch_text": "B", + "clean": false, + "in_folder_edits": 1, + "auto_flagged": false, + "manual_review": null, + "flagged_calls": [ + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "cd && echo ok" + } + } + ] + }, + { + "task_id": "C09_sky130_sW2_sL1", + "rep": 1, + "tool_calls": 9, + "tools": [ + "Bash", + "Read", + "Write" + ], + "launch_text": "A", + "clean": false, + "in_folder_edits": 1, + "auto_flagged": false, + "manual_review": null, + "flagged_calls": [ + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "cd && python3 - <<" + } + } + ] + }, + { + "task_id": "C09_sky130_sW2_sL1", + "rep": 2, + "tool_calls": 17, + "tools": [ + "Bash", + "Read", + "Write" + ], + "launch_text": "A", + "clean": false, + "in_folder_edits": 1, + "auto_flagged": false, + "manual_review": null, + "flagged_calls": [ + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "cd && sed 's/GateG" + } + } + ] + }, + { + "task_id": "C09_sky130_sW2_sL1", + "rep": 3, + "tool_calls": 16, + "tools": [ + "Bash", + "Read", + "Write" + ], + "launch_text": "B", + "clean": true, + "in_folder_edits": 0, + "auto_flagged": false, + "manual_review": null, + "flagged_calls": [] + }, + { + "task_id": "C11_gf180_sW2_sL1", + "rep": 1, + "tool_calls": 15, + "tools": [ + "Bash", + "Read", + "Write" + ], + "launch_text": "A", + "clean": false, + "in_folder_edits": 5, + "auto_flagged": false, + "manual_review": null, + "flagged_calls": [ + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "cd && sed -e 's/Gat" + } + }, + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "cd && sed -e 's/str" + } + }, + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "cd && sed -e 's/Gat" + } + }, + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "cd && sed -e 's/dif" + } + }, + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "cd && sed -e 's/dif" + } + } + ] + }, + { + "task_id": "C11_gf180_sW2_sL1", + "rep": 2, + "tool_calls": 13, + "tools": [ + "Bash", + "Read", + "Write" + ], + "launch_text": "A", + "clean": false, + "in_folder_edits": 1, + "auto_flagged": false, + "manual_review": null, + "flagged_calls": [ + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "cd && sed 's/contac" + } + } + ] + }, + { + "task_id": "C11_gf180_sW2_sL1", + "rep": 3, + "tool_calls": 19, + "tools": [ + "Bash", + "Read", + "Write" + ], + "launch_text": "B", + "clean": false, + "in_folder_edits": 1, + "auto_flagged": false, + "manual_review": null, + "flagged_calls": [ + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "cd && sed 's/GateGr" + } + } + ] + }, + { + "task_id": "C11_gf180_sW2_sL2", + "rep": 1, + "tool_calls": 9, + "tools": [ + "Bash", + "Edit", + "Read", + "Write" + ], + "launch_text": "A", + "clean": true, + "in_folder_edits": 0, + "auto_flagged": false, + "manual_review": null, + "flagged_calls": [] + }, + { + "task_id": "C11_gf180_sW2_sL2", + "rep": 2, + "tool_calls": 17, + "tools": [ + "Bash", + "Read", + "Write" + ], + "launch_text": "A", + "clean": false, + "in_folder_edits": 1, + "auto_flagged": false, + "manual_review": null, + "flagged_calls": [ + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "cd && sed 's/side=\"" + } + } + ] + }, + { + "task_id": "C11_gf180_sW2_sL2", + "rep": 3, + "tool_calls": 12, + "tools": [ + "Bash", + "Read" + ], + "launch_text": "B", + "clean": false, + "in_folder_edits": 8, + "auto_flagged": false, + "manual_review": null, + "flagged_calls": [ + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "cd && python3 - <<'" + } + }, + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "cd && python3 - <<'" + } + }, + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "cd && sed 's/range(" + } + }, + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "cd && sed 's/range(" + } + }, + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "cd && sed -e 's/ran" + } + }, + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "cd && sed -e 's/ran" + } + }, + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "cd && sed -e 's/ran" + } + }, + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "cd && sed -e '/^ 1:" + } + } + ] + }, + { + "task_id": "C11_ihp130_sW2_sL1", + "rep": 1, + "tool_calls": 7, + "tools": [ + "Bash", + "Read", + "Write" + ], + "launch_text": "A", + "clean": false, + "in_folder_edits": 1, + "auto_flagged": false, + "manual_review": null, + "flagged_calls": [ + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "cd && sed 's/pad_e" + } + } + ] + }, + { + "task_id": "C11_ihp130_sW2_sL1", + "rep": 2, + "tool_calls": 12, + "tools": [ + "Bash", + "Read" + ], + "launch_text": "A", + "clean": false, + "in_folder_edits": 8, + "auto_flagged": false, + "manual_review": null, + "flagged_calls": [ + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "cd && python3 - <<" + } + }, + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "cd && python3 - <<" + } + }, + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "cd && sed -e 's/Ga" + } + }, + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "cd && python3 - <<" + } + }, + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "cd && python3 - <<" + } + }, + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "cd && grep -n \"Gat" + } + }, + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "cd && python3 - <<" + } + }, + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "cd && sed -e 's/ra" + } + } + ] + }, + { + "task_id": "C11_ihp130_sW2_sL1", + "rep": 3, + "tool_calls": 22, + "tools": [ + "Bash", + "Edit", + "Read", + "Write" + ], + "launch_text": "B", + "clean": false, + "in_folder_edits": 1, + "auto_flagged": false, + "manual_review": null, + "flagged_calls": [ + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "cd && sed -e 's/ga" + } + } + ] + }, + { + "task_id": "C11_ihp130_sW2_sL2", + "rep": 1, + "tool_calls": 13, + "tools": [ + "Bash", + "Read", + "Write" + ], + "launch_text": "A", + "clean": false, + "in_folder_edits": 6, + "auto_flagged": false, + "manual_review": null, + "flagged_calls": [ + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "cd && sed 's/GateG" + } + }, + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "cd && python3 - <<" + } + }, + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "cd && python3 - <<" + } + }, + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "cd && python3 - <<" + } + }, + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "cd && python3 - <<" + } + }, + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "cd && sed 's/pad_e" + } + } + ] + }, + { + "task_id": "C11_ihp130_sW2_sL2", + "rep": 2, + "tool_calls": 24, + "tools": [ + "Bash", + "Edit", + "Read", + "Write" + ], + "launch_text": "A", + "clean": false, + "in_folder_edits": 1, + "auto_flagged": false, + "manual_review": null, + "flagged_calls": [ + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "cd && sed -i 's/or" + } + } + ] + }, + { + "task_id": "C11_ihp130_sW2_sL2", + "rep": 3, + "tool_calls": 12, + "tools": [ + "Bash", + "Read", + "Write" + ], + "launch_text": "B", + "clean": false, + "in_folder_edits": 2, + "auto_flagged": false, + "manual_review": null, + "flagged_calls": [ + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "cd && sed 's/GateG" + } + }, + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "cd && sed 's/range" + } + } + ] + }, + { + "task_id": "C11_sky130_sW2_sL1", + "rep": 1, + "tool_calls": 12, + "tools": [ + "Bash", + "Read", + "Write" + ], + "launch_text": "A", + "clean": false, + "in_folder_edits": 2, + "auto_flagged": false, + "manual_review": null, + "flagged_calls": [ + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "cd && sed 's/conta" + } + }, + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "cd && python3 - <<" + } + } + ] + }, + { + "task_id": "C11_sky130_sW2_sL1", + "rep": 2, + "tool_calls": 20, + "tools": [ + "Bash", + "Read", + "Write" + ], + "launch_text": "A", + "clean": false, + "in_folder_edits": 4, + "auto_flagged": false, + "manual_review": null, + "flagged_calls": [ + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "python3 - <<'E'\nfo=[(\"M1\",k) for k in range(8)]+[(\"M2\",k) for k in range(7)]+[(\"M3\",k) for k in range(16)]+[(\"M4\",k) for k in range(16)]+[(\"M2\",k) for k in range(7,16)]+[(\"M7\",k) for k in range(16)]\np" + } + }, + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "python3 - <<'E'\nfo=[(\"M2\",0)]+[(\"M1\",k) for k in range(8)]+[(\"M7\",k) for k in range(16)]+[(\"M2\",k) for k in range(1,16)]+[(\"M3\",k) for k in range(16)]+[(\"M4\",k) for k in range(16)]\nprint(str(fo).repla" + } + }, + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "python3 - <<'E'\nfo=[(\"M1\",k) for k in range(8)]+[(\"M7\",k) for k in range(16)]+[(\"M2\",k) for k in range(16)]+[(\"M3\",k) for k in range(16)]+[(\"M4\",k) for k in range(16)]\nprint(str(fo).replace(\"'\",'\"'), " + } + }, + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "cd && sed -e 's/ra" + } + } + ] + }, + { + "task_id": "C11_sky130_sW2_sL1", + "rep": 3, + "tool_calls": 14, + "tools": [ + "Bash", + "Read", + "Write" + ], + "launch_text": "B", + "clean": false, + "in_folder_edits": 6, + "auto_flagged": false, + "manual_review": null, + "flagged_calls": [ + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "cd && sed -e 's/si" + } + }, + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "cd && sed -e 's/ra" + } + }, + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "cd && sed -e 's/ra" + } + }, + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "cd && sed -e '/^ " + } + }, + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "cd && sed -e 's/ra" + } + }, + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "cd && sed -e 's/ra" + } + } + ] + }, + { + "task_id": "C11_sky130_sW2_sL2", + "rep": 1, + "tool_calls": 10, + "tools": [ + "Bash", + "Read", + "Write" + ], + "launch_text": "A", + "clean": false, + "in_folder_edits": 1, + "auto_flagged": true, + "manual_review": "benign: the only command outside the protocol was `cat /dev/null` (no file read)", + "flagged_calls": [ + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "cd && sed -e 's/Ga" + } + }, + { + "tool": "Bash", + "class": "isolation_breach", + "input": { + "command": "cat /dev/null", + "description": "no-op" + } + } + ] + }, + { + "task_id": "C11_sky130_sW2_sL2", + "rep": 2, + "tool_calls": 16, + "tools": [ + "Bash", + "Read", + "Write" + ], + "launch_text": "A", + "clean": false, + "in_folder_edits": 4, + "auto_flagged": false, + "manual_review": null, + "flagged_calls": [ + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "cd && python3 - <<" + } + }, + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "cd && python3 - <<" + } + }, + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "cd && python3 - <<" + } + }, + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "cd && python3 - <<" + } + } + ] + }, + { + "task_id": "C11_sky130_sW2_sL2", + "rep": 3, + "tool_calls": 11, + "tools": [ + "Bash", + "Read", + "Write" + ], + "launch_text": "B", + "clean": false, + "in_folder_edits": 5, + "auto_flagged": false, + "manual_review": null, + "flagged_calls": [ + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "cd && sed -e 's/Ga" + } + }, + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "cd && cat > p3_ans" + } + }, + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "cd && python3 - <<" + } + }, + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "cd && sed -e 's/ra" + } + }, + { + "tool": "Bash", + "class": "in_folder_edit", + "input": { + "command": "cd && python3 - <<" + } + } + ] + }, + { + "task_id": "C16_gf180_sW2_sL1", + "rep": 1, + "tool_calls": 13, + "tools": [ + "Bash", + "Read", + "Write" + ], + "launch_text": "A", + "clean": true, + "in_folder_edits": 0, + "auto_flagged": false, + "manual_review": null, + "flagged_calls": [] + }, + { + "task_id": "C16_gf180_sW2_sL1", + "rep": 2, + "tool_calls": 18, + "tools": [ + "Bash", + "Read", + "Write" + ], + "launch_text": "A", + "clean": true, + "in_folder_edits": 0, + "auto_flagged": false, + "manual_review": null, + "flagged_calls": [] + }, + { + "task_id": "C16_gf180_sW2_sL1", + "rep": 3, + "tool_calls": 14, + "tools": [ + "Bash", + "Read", + "Write" + ], + "launch_text": "B", + "clean": true, + "in_folder_edits": 0, + "auto_flagged": false, + "manual_review": null, + "flagged_calls": [] + }, + { + "task_id": "C16_gf180_sW2_sL2", + "rep": 1, + "tool_calls": 9, + "tools": [ + "Bash", + "Read", + "Write" + ], + "launch_text": "A", + "clean": true, + "in_folder_edits": 0, + "auto_flagged": false, + "manual_review": null, + "flagged_calls": [] + }, + { + "task_id": "C16_gf180_sW2_sL2", + "rep": 2, + "tool_calls": 12, + "tools": [ + "Bash", + "Read", + "Write" + ], + "launch_text": "A", + "clean": true, + "in_folder_edits": 0, + "auto_flagged": false, + "manual_review": null, + "flagged_calls": [] + }, + { + "task_id": "C16_gf180_sW2_sL2", + "rep": 3, + "tool_calls": 19, + "tools": [ + "Bash", + "Read", + "Write" + ], + "launch_text": "B", + "clean": true, + "in_folder_edits": 0, + "auto_flagged": false, + "manual_review": null, + "flagged_calls": [] + }, + { + "task_id": "C16_ihp130_sW2_sL1", + "rep": 1, + "tool_calls": 16, + "tools": [ + "Bash", + "Read", + "Write" + ], + "launch_text": "A", + "clean": true, + "in_folder_edits": 0, + "auto_flagged": false, + "manual_review": null, + "flagged_calls": [] + }, + { + "task_id": "C16_ihp130_sW2_sL1", + "rep": 2, + "tool_calls": 15, + "tools": [ + "Bash", + "Read", + "Write" + ], + "launch_text": "A", + "clean": true, + "in_folder_edits": 0, + "auto_flagged": false, + "manual_review": null, + "flagged_calls": [] + }, + { + "task_id": "C16_ihp130_sW2_sL1", + "rep": 3, + "tool_calls": 11, + "tools": [ + "Bash", + "Read", + "Write" + ], + "launch_text": "B", + "clean": true, + "in_folder_edits": 0, + "auto_flagged": false, + "manual_review": null, + "flagged_calls": [] + }, + { + "task_id": "C16_ihp130_sW2_sL2", + "rep": 1, + "tool_calls": 14, + "tools": [ + "Bash", + "Read", + "Write" + ], + "launch_text": "A", + "clean": true, + "in_folder_edits": 0, + "auto_flagged": false, + "manual_review": null, + "flagged_calls": [] + }, + { + "task_id": "C16_ihp130_sW2_sL2", + "rep": 2, + "tool_calls": 10, + "tools": [ + "Bash", + "Read", + "Write" + ], + "launch_text": "A", + "clean": true, + "in_folder_edits": 0, + "auto_flagged": false, + "manual_review": null, + "flagged_calls": [] + }, + { + "task_id": "C16_ihp130_sW2_sL2", + "rep": 3, + "tool_calls": 14, + "tools": [ + "Bash", + "Read", + "Write" + ], + "launch_text": "B", + "clean": true, + "in_folder_edits": 0, + "auto_flagged": false, + "manual_review": null, + "flagged_calls": [] + }, + { + "task_id": "C16_sky130_sW2_sL1", + "rep": 1, + "tool_calls": 11, + "tools": [ + "Bash", + "Read", + "Write" + ], + "launch_text": "A", + "clean": true, + "in_folder_edits": 0, + "auto_flagged": false, + "manual_review": null, + "flagged_calls": [] + }, + { + "task_id": "C16_sky130_sW2_sL1", + "rep": 2, + "tool_calls": 13, + "tools": [ + "Bash", + "Read", + "Write" + ], + "launch_text": "A", + "clean": true, + "in_folder_edits": 0, + "auto_flagged": false, + "manual_review": null, + "flagged_calls": [] + }, + { + "task_id": "C16_sky130_sW2_sL1", + "rep": 3, + "tool_calls": 15, + "tools": [ + "Bash", + "Read", + "Write" + ], + "launch_text": "B", + "clean": true, + "in_folder_edits": 0, + "auto_flagged": false, + "manual_review": null, + "flagged_calls": [] + }, + { + "task_id": "C16_sky130_sW2_sL2", + "rep": 1, + "tool_calls": 14, + "tools": [ + "Bash", + "Read", + "Write" + ], + "launch_text": "A", + "clean": true, + "in_folder_edits": 0, + "auto_flagged": false, + "manual_review": null, + "flagged_calls": [] + }, + { + "task_id": "C16_sky130_sW2_sL2", + "rep": 2, + "tool_calls": 15, + "tools": [ + "Bash", + "Read", + "Write" + ], + "launch_text": "A", + "clean": true, + "in_folder_edits": 0, + "auto_flagged": false, + "manual_review": null, + "flagged_calls": [] + }, + { + "task_id": "C16_sky130_sW2_sL2", + "rep": 3, + "tool_calls": 15, + "tools": [ + "Bash", + "Read", + "Write" + ], + "launch_text": "B", + "clean": true, + "in_folder_edits": 0, + "auto_flagged": false, + "manual_review": null, + "flagged_calls": [] + } + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/results/analysis/arrangement_bandwidth_C16.json b/benchmarks/textbook_sharing/results/analysis/arrangement_bandwidth_C16.json new file mode 100644 index 00000000..aa434e34 --- /dev/null +++ b/benchmarks/textbook_sharing/results/analysis/arrangement_bandwidth_C16.json @@ -0,0 +1,1104 @@ +{ + "C16_gf180_sW1_sL1": { + "group0.arrangement=abba": { + "status": { + "auto_passed": 12 + }, + "mean_f3db_MHz": 56.66641833333333, + "mean_gain_dB": 11.627238333333334, + "mean_area_um2": 1757.4442666666666 + }, + "group0.arrangement=block": { + "status": { + "auto_passed": 9 + }, + "mean_f3db_MHz": 62.81503222222222, + "mean_gain_dB": 11.622273333333332, + "mean_area_um2": 1634.940711111111 + }, + "group0.arrangement=interleave": { + "status": { + "auto_passed": 16 + }, + "mean_f3db_MHz": 51.95348375, + "mean_gain_dB": 11.629190000000001, + "mean_area_um2": 1773.9616 + }, + "group0.arrangement=mirror": { + "status": { + "auto_passed": 12 + }, + "mean_f3db_MHz": 59.83345416666666, + "mean_gain_dB": 11.623853333333333, + "mean_area_um2": 1775.6133333333332 + }, + "group0.diffusion=all_legal": { + "status": { + "auto_passed": 19 + }, + "mean_f3db_MHz": 57.3924352631579, + "mean_gain_dB": 11.628118421052632, + "mean_area_um2": 1750.62 + }, + "group0.diffusion=none": { + "status": { + "auto_passed": 30 + }, + "mean_f3db_MHz": 56.804441, + "mean_gain_dB": 11.624878333333333, + "mean_area_um2": 1741.0921066666667 + }, + "group0.gate=per_device": { + "status": { + "auto_passed": 49 + }, + "mean_f3db_MHz": 57.03243877551021, + "mean_gain_dB": 11.626134693877551, + "mean_area_um2": 1744.7865959183673 + }, + "group0.orientation=alt_DS": { + "status": { + "auto_passed": 23 + }, + "mean_f3db_MHz": 57.05605173913044, + "mean_gain_dB": 11.627099130434782, + "mean_area_um2": 1707.281843478261 + }, + "group0.orientation=alt_SD": { + "status": { + "auto_passed": 26 + }, + "mean_f3db_MHz": 57.01155038461538, + "mean_gain_dB": 11.625281538461538, + "mean_area_um2": 1777.963876923077 + }, + "group0.strap_start=bottom": { + "status": { + "auto_passed": 26 + }, + "mean_f3db_MHz": 57.406654230769234, + "mean_gain_dB": 11.625922692307693, + "mean_area_um2": 1763.6700307692308 + }, + "group0.strap_start=top": { + "status": { + "auto_passed": 23 + }, + "mean_f3db_MHz": 56.60941260869565, + "mean_gain_dB": 11.626374347826086, + "mean_area_um2": 1723.440104347826 + } + }, + "C16_gf180_sW1_sL2": { + "group0.arrangement=abba": { + "status": { + "auto_passed": 12 + }, + "mean_f3db_MHz": 55.6187875, + "mean_gain_dB": 8.744841833333332, + "mean_area_um2": 1757.4442666666666 + }, + "group0.arrangement=block": { + "status": { + "auto_passed": 9 + }, + "mean_f3db_MHz": 62.86121111111111, + "mean_gain_dB": 8.740999555555556, + "mean_area_um2": 1634.940711111111 + }, + "group0.arrangement=interleave": { + "status": { + "auto_passed": 16 + }, + "mean_f3db_MHz": 51.245615625, + "mean_gain_dB": 8.74636325, + "mean_area_um2": 1773.9616 + }, + "group0.arrangement=mirror": { + "status": { + "auto_passed": 12 + }, + "mean_f3db_MHz": 59.29501416666666, + "mean_gain_dB": 8.742314583333334, + "mean_area_um2": 1775.6133333333332 + }, + "group0.diffusion=all_legal": { + "status": { + "auto_passed": 19 + }, + "mean_f3db_MHz": 56.75517105263158, + "mean_gain_dB": 8.745535315789473, + "mean_area_um2": 1750.62 + }, + "group0.diffusion=none": { + "status": { + "auto_passed": 30 + }, + "mean_f3db_MHz": 56.209937333333336, + "mean_gain_dB": 8.743050466666666, + "mean_area_um2": 1741.0921066666667 + }, + "group0.gate=per_device": { + "status": { + "auto_passed": 49 + }, + "mean_f3db_MHz": 56.42135448979592, + "mean_gain_dB": 8.744013979591836, + "mean_area_um2": 1744.7865959183673 + }, + "group0.orientation=alt_DS": { + "status": { + "auto_passed": 23 + }, + "mean_f3db_MHz": 56.27131782608695, + "mean_gain_dB": 8.744737652173914, + "mean_area_um2": 1707.281843478261 + }, + "group0.orientation=alt_SD": { + "status": { + "auto_passed": 26 + }, + "mean_f3db_MHz": 56.55407923076923, + "mean_gain_dB": 8.743373807692308, + "mean_area_um2": 1777.963876923077 + }, + "group0.strap_start=bottom": { + "status": { + "auto_passed": 26 + }, + "mean_f3db_MHz": 56.848539230769234, + "mean_gain_dB": 8.743848230769231, + "mean_area_um2": 1763.6700307692308 + }, + "group0.strap_start=top": { + "status": { + "auto_passed": 23 + }, + "mean_f3db_MHz": 55.93845, + "mean_gain_dB": 8.744201347826086, + "mean_area_um2": 1723.440104347826 + } + }, + "C16_gf180_sW2_sL1": { + "group0.arrangement=abba": { + "status": { + "auto_passed": 12 + }, + "mean_f3db_MHz": 48.06038083333333, + "mean_gain_dB": 14.040808333333334, + "mean_area_um2": 1757.4442666666666 + }, + "group0.arrangement=block": { + "status": { + "auto_passed": 9 + }, + "mean_f3db_MHz": 58.157072222222226, + "mean_gain_dB": 14.034895555555556, + "mean_area_um2": 1634.940711111111 + }, + "group0.arrangement=interleave": { + "status": { + "auto_passed": 16 + }, + "mean_f3db_MHz": 41.105843125, + "mean_gain_dB": 14.04221875, + "mean_area_um2": 1773.9616 + }, + "group0.arrangement=mirror": { + "status": { + "auto_passed": 12 + }, + "mean_f3db_MHz": 53.021406666666664, + "mean_gain_dB": 14.037433333333333, + "mean_area_um2": 1775.6133333333332 + }, + "group0.diffusion=all_legal": { + "status": { + "auto_passed": 19 + }, + "mean_f3db_MHz": 49.03455263157895, + "mean_gain_dB": 14.040685263157895, + "mean_area_um2": 1750.62 + }, + "group0.diffusion=none": { + "status": { + "auto_passed": 30 + }, + "mean_f3db_MHz": 48.747736333333336, + "mean_gain_dB": 14.038514666666666, + "mean_area_um2": 1741.0921066666667 + }, + "group0.gate=per_device": { + "status": { + "auto_passed": 49 + }, + "mean_f3db_MHz": 48.85895081632653, + "mean_gain_dB": 14.039356326530612, + "mean_area_um2": 1744.7865959183673 + }, + "group0.orientation=alt_DS": { + "status": { + "auto_passed": 23 + }, + "mean_f3db_MHz": 49.00809913043478, + "mean_gain_dB": 14.040333913043478, + "mean_area_um2": 1707.281843478261 + }, + "group0.orientation=alt_SD": { + "status": { + "auto_passed": 26 + }, + "mean_f3db_MHz": 48.72701192307692, + "mean_gain_dB": 14.038491538461539, + "mean_area_um2": 1777.963876923077 + }, + "group0.strap_start=bottom": { + "status": { + "auto_passed": 26 + }, + "mean_f3db_MHz": 49.462859615384616, + "mean_gain_dB": 14.03911, + "mean_area_um2": 1763.6700307692308 + }, + "group0.strap_start=top": { + "status": { + "auto_passed": 23 + }, + "mean_f3db_MHz": 48.17627130434783, + "mean_gain_dB": 14.039634782608696, + "mean_area_um2": 1723.440104347826 + } + }, + "C16_gf180_sW2_sL2": { + "group0.arrangement=abba": { + "status": { + "auto_passed": 12 + }, + "mean_f3db_MHz": 46.172665, + "mean_gain_dB": 11.572836666666667, + "mean_area_um2": 1757.4442666666666 + }, + "group0.arrangement=block": { + "status": { + "auto_passed": 9 + }, + "mean_f3db_MHz": 57.913833333333336, + "mean_gain_dB": 11.56741, + "mean_area_um2": 1634.940711111111 + }, + "group0.arrangement=interleave": { + "status": { + "spec_failed": 4, + "auto_passed": 12 + }, + "mean_f3db_MHz": 39.86196875, + "mean_gain_dB": 11.573970000000001, + "mean_area_um2": 1773.9616 + }, + "group0.arrangement=mirror": { + "status": { + "auto_passed": 12 + }, + "mean_f3db_MHz": 51.4937, + "mean_gain_dB": 11.57001, + "mean_area_um2": 1775.6133333333332 + }, + "group0.diffusion=all_legal": { + "status": { + "auto_passed": 19 + }, + "mean_f3db_MHz": 47.7006747368421, + "mean_gain_dB": 11.572637368421052, + "mean_area_um2": 1750.62 + }, + "group0.diffusion=none": { + "status": { + "auto_passed": 26, + "spec_failed": 4 + }, + "mean_f3db_MHz": 47.48998533333334, + "mean_gain_dB": 11.570808666666666, + "mean_area_um2": 1741.0921066666667 + }, + "group0.gate=per_device": { + "status": { + "auto_passed": 45, + "spec_failed": 4 + }, + "mean_f3db_MHz": 47.571681224489794, + "mean_gain_dB": 11.571517755102041, + "mean_area_um2": 1744.7865959183673 + }, + "group0.orientation=alt_DS": { + "status": { + "auto_passed": 23 + }, + "mean_f3db_MHz": 47.48538913043478, + "mean_gain_dB": 11.572341739130435, + "mean_area_um2": 1707.281843478261 + }, + "group0.orientation=alt_SD": { + "status": { + "auto_passed": 22, + "spec_failed": 4 + }, + "mean_f3db_MHz": 47.64801653846153, + "mean_gain_dB": 11.570788846153846, + "mean_area_um2": 1777.963876923077 + }, + "group0.strap_start=bottom": { + "status": { + "auto_passed": 24, + "spec_failed": 2 + }, + "mean_f3db_MHz": 48.2197676923077, + "mean_gain_dB": 11.57129, + "mean_area_um2": 1763.6700307692308 + }, + "group0.strap_start=top": { + "status": { + "auto_passed": 21, + "spec_failed": 2 + }, + "mean_f3db_MHz": 46.839061739130436, + "mean_gain_dB": 11.571775217391304, + "mean_area_um2": 1723.440104347826 + } + }, + "C16_ihp130_sW1_sL1": { + "group0.arrangement=abba": { + "status": { + "auto_passed": 12 + }, + "mean_f3db_MHz": 111.47145, + "mean_gain_dB": 9.849413666666667, + "mean_area_um2": 1062.1824 + }, + "group0.arrangement=block": { + "status": { + "auto_passed": 9 + }, + "mean_f3db_MHz": 127.9383, + "mean_gain_dB": 9.83764188888889, + "mean_area_um2": 965.2296 + }, + "group0.arrangement=interleave": { + "status": { + "auto_passed": 16 + }, + "mean_f3db_MHz": 101.1320975, + "mean_gain_dB": 9.8556225, + "mean_area_um2": 1062.1824 + }, + "group0.arrangement=mirror": { + "status": { + "auto_passed": 12 + }, + "mean_f3db_MHz": 119.66853333333333, + "mean_gain_dB": 9.841321333333333, + "mean_area_um2": 1053.5855999999999 + }, + "group0.diffusion=all_legal": { + "status": { + "auto_passed": 19 + }, + "mean_f3db_MHz": 113.86195789473685, + "mean_gain_dB": 9.85417447368421, + "mean_area_um2": 1045.0642105263157 + }, + "group0.diffusion=none": { + "status": { + "auto_passed": 30 + }, + "mean_f3db_MHz": 112.66202866666667, + "mean_gain_dB": 9.8429414, + "mean_area_um2": 1040.49936 + }, + "group0.gate=per_device": { + "status": { + "auto_passed": 49 + }, + "mean_f3db_MHz": 113.12730734693878, + "mean_gain_dB": 9.847297081632654, + "mean_area_um2": 1042.2694040816325 + }, + "group0.orientation=alt_DS": { + "status": { + "auto_passed": 23 + }, + "mean_f3db_MHz": 112.37798260869566, + "mean_gain_dB": 9.849646565217391, + "mean_area_um2": 1048.0412869565216 + }, + "group0.orientation=alt_SD": { + "status": { + "auto_passed": 26 + }, + "mean_f3db_MHz": 113.79017153846154, + "mean_gain_dB": 9.845218692307693, + "mean_area_um2": 1037.1635076923076 + }, + "group0.strap_start=bottom": { + "status": { + "auto_passed": 26 + }, + "mean_f3db_MHz": 114.09812, + "mean_gain_dB": 9.846754692307693, + "mean_area_um2": 1049.6178461538461 + }, + "group0.strap_start=top": { + "status": { + "auto_passed": 23 + }, + "mean_f3db_MHz": 112.02986695652173, + "mean_gain_dB": 9.847910217391304, + "mean_area_um2": 1033.9624695652174 + } + }, + "C16_ihp130_sW1_sL2": { + "group0.arrangement=abba": { + "status": { + "auto_passed": 12 + }, + "mean_f3db_MHz": 107.6037875, + "mean_gain_dB": 8.822742166666666, + "mean_area_um2": 1024.6112 + }, + "group0.arrangement=block": { + "status": { + "auto_passed": 9 + }, + "mean_f3db_MHz": 125.74165555555555, + "mean_gain_dB": 8.812154999999999, + "mean_area_um2": 958.9677333333333 + }, + "group0.arrangement=interleave": { + "status": { + "auto_passed": 16 + }, + "mean_f3db_MHz": 97.880524375, + "mean_gain_dB": 8.82809575, + "mean_area_um2": 1034.004 + }, + "group0.arrangement=mirror": { + "status": { + "auto_passed": 12 + }, + "mean_f3db_MHz": 115.01888333333333, + "mean_gain_dB": 8.8153915, + "mean_area_um2": 1034.8 + }, + "group0.diffusion=all_legal": { + "status": { + "auto_passed": 19 + }, + "mean_f3db_MHz": 110.3831752631579, + "mean_gain_dB": 8.826658631578947, + "mean_area_um2": 1021.3350315789473 + }, + "group0.diffusion=none": { + "status": { + "auto_passed": 30 + }, + "mean_f3db_MHz": 109.065167, + "mean_gain_dB": 8.817000566666666, + "mean_area_um2": 1016.07808 + }, + "group0.gate=per_device": { + "status": { + "auto_passed": 49 + }, + "mean_f3db_MHz": 109.57623142857143, + "mean_gain_dB": 8.820745530612244, + "mean_area_um2": 1018.1164897959184 + }, + "group0.orientation=alt_DS": { + "status": { + "auto_passed": 23 + }, + "mean_f3db_MHz": 109.70239347826087, + "mean_gain_dB": 8.822706826086955, + "mean_area_um2": 996.5850782608695 + }, + "group0.orientation=alt_SD": { + "status": { + "auto_passed": 26 + }, + "mean_f3db_MHz": 109.46462653846153, + "mean_gain_dB": 8.819010538461539, + "mean_area_um2": 1037.1635076923076 + }, + "group0.strap_start=bottom": { + "status": { + "auto_passed": 26 + }, + "mean_f3db_MHz": 110.61962346153847, + "mean_gain_dB": 8.820258846153846, + "mean_area_um2": 1027.9421538461538 + }, + "group0.strap_start=top": { + "status": { + "auto_passed": 23 + }, + "mean_f3db_MHz": 108.3967447826087, + "mean_gain_dB": 8.821295695652173, + "mean_area_um2": 1007.0092173913043 + } + }, + "C16_ihp130_sW2_sL1": { + "group0.arrangement=abba": { + "status": { + "spec_failed": 4, + "auto_passed": 8 + }, + "mean_f3db_MHz": 94.05235, + "mean_gain_dB": 11.504653333333334, + "mean_area_um2": 1062.1824 + }, + "group0.arrangement=block": { + "status": { + "auto_passed": 9 + }, + "mean_f3db_MHz": 120.8516, + "mean_gain_dB": 11.494696666666666, + "mean_area_um2": 965.2296 + }, + "group0.arrangement=interleave": { + "status": { + "spec_failed": 16 + }, + "mean_f3db_MHz": 79.12615625, + "mean_gain_dB": 11.50900375, + "mean_area_um2": 1062.1824 + }, + "group0.arrangement=mirror": { + "status": { + "auto_passed": 12 + }, + "mean_f3db_MHz": 106.54441666666668, + "mean_gain_dB": 11.498175, + "mean_area_um2": 1053.5855999999999 + }, + "group0.diffusion=all_legal": { + "status": { + "auto_passed": 11, + "spec_failed": 8 + }, + "mean_f3db_MHz": 97.53856684210527, + "mean_gain_dB": 11.506738421052631, + "mean_area_um2": 1045.0642105263157 + }, + "group0.diffusion=none": { + "status": { + "auto_passed": 18, + "spec_failed": 12 + }, + "mean_f3db_MHz": 96.92037766666667, + "mean_gain_dB": 11.500074666666666, + "mean_area_um2": 1040.49936 + }, + "group0.gate=per_device": { + "status": { + "auto_passed": 29, + "spec_failed": 20 + }, + "mean_f3db_MHz": 97.1600836734694, + "mean_gain_dB": 11.502658571428572, + "mean_area_um2": 1042.2694040816325 + }, + "group0.orientation=alt_DS": { + "status": { + "auto_passed": 15, + "spec_failed": 8 + }, + "mean_f3db_MHz": 96.36530043478261, + "mean_gain_dB": 11.504637826086956, + "mean_area_um2": 1048.0412869565216 + }, + "group0.orientation=alt_SD": { + "status": { + "auto_passed": 14, + "spec_failed": 12 + }, + "mean_f3db_MHz": 97.86316115384616, + "mean_gain_dB": 11.500907692307692, + "mean_area_um2": 1037.1635076923076 + }, + "group0.strap_start=bottom": { + "status": { + "auto_passed": 16, + "spec_failed": 10 + }, + "mean_f3db_MHz": 98.72138653846153, + "mean_gain_dB": 11.502208461538462, + "mean_area_um2": 1049.6178461538461 + }, + "group0.strap_start=top": { + "status": { + "auto_passed": 13, + "spec_failed": 10 + }, + "mean_f3db_MHz": 95.39513260869566, + "mean_gain_dB": 11.503167391304348, + "mean_area_um2": 1033.9624695652174 + } + }, + "C16_ihp130_sW2_sL2": { + "group0.arrangement=abba": { + "status": { + "spec_failed": 4, + "auto_passed": 8 + }, + "mean_f3db_MHz": 89.40364083333333, + "mean_gain_dB": 10.673631666666667, + "mean_area_um2": 1024.6112 + }, + "group0.arrangement=block": { + "status": { + "auto_passed": 9 + }, + "mean_f3db_MHz": 118.80096666666667, + "mean_gain_dB": 10.663844444444445, + "mean_area_um2": 958.9677333333333 + }, + "group0.arrangement=interleave": { + "status": { + "spec_failed": 16 + }, + "mean_f3db_MHz": 76.14926125, + "mean_gain_dB": 10.677389999999999, + "mean_area_um2": 1034.004 + }, + "group0.arrangement=mirror": { + "status": { + "auto_passed": 12 + }, + "mean_f3db_MHz": 101.86895583333333, + "mean_gain_dB": 10.667366666666666, + "mean_area_um2": 1034.8 + }, + "group0.diffusion=all_legal": { + "status": { + "auto_passed": 11, + "spec_failed": 8 + }, + "mean_f3db_MHz": 93.88594842105263, + "mean_gain_dB": 10.675098421052631, + "mean_area_um2": 1021.3350315789473 + }, + "group0.diffusion=none": { + "status": { + "auto_passed": 18, + "spec_failed": 12 + }, + "mean_f3db_MHz": 93.30116733333332, + "mean_gain_dB": 10.669265, + "mean_area_um2": 1016.07808 + }, + "group0.gate=per_device": { + "status": { + "auto_passed": 29, + "spec_failed": 20 + }, + "mean_f3db_MHz": 93.52791918367348, + "mean_gain_dB": 10.67152693877551, + "mean_area_um2": 1018.1164897959184 + }, + "group0.orientation=alt_DS": { + "status": { + "auto_passed": 15, + "spec_failed": 8 + }, + "mean_f3db_MHz": 93.14804086956522, + "mean_gain_dB": 10.673255652173912, + "mean_area_um2": 996.5850782608695 + }, + "group0.orientation=alt_SD": { + "status": { + "auto_passed": 14, + "spec_failed": 12 + }, + "mean_f3db_MHz": 93.8639653846154, + "mean_gain_dB": 10.669997692307692, + "mean_area_um2": 1037.1635076923076 + }, + "group0.strap_start=bottom": { + "status": { + "auto_passed": 16, + "spec_failed": 10 + }, + "mean_f3db_MHz": 95.08371076923076, + "mean_gain_dB": 10.671089615384615, + "mean_area_um2": 1027.9421538461538 + }, + "group0.strap_start=top": { + "status": { + "auto_passed": 13, + "spec_failed": 10 + }, + "mean_f3db_MHz": 91.76919826086956, + "mean_gain_dB": 10.672021304347826, + "mean_area_um2": 1007.0092173913043 + } + }, + "C16_sky130_sW1_sL1": { + "group0.arrangement=abba": { + "status": { + "auto_passed": 12 + }, + "mean_f3db_MHz": 70.6300225, + "mean_gain_dB": 14.452476666666668, + "mean_area_um2": 400.9397 + }, + "group0.arrangement=block": { + "status": { + "auto_passed": 9 + }, + "mean_f3db_MHz": 76.13699777777778, + "mean_gain_dB": 14.387423333333334, + "mean_area_um2": 358.2393333333333 + }, + "group0.arrangement=interleave": { + "status": { + "auto_passed": 16 + }, + "mean_f3db_MHz": 65.980014375, + "mean_gain_dB": 14.49038875, + "mean_area_um2": 400.939675 + }, + "group0.arrangement=mirror": { + "status": { + "auto_passed": 12 + }, + "mean_f3db_MHz": 73.26714333333332, + "mean_gain_dB": 14.392038333333334, + "mean_area_um2": 397.05783333333335 + }, + "group0.diffusion=all_legal": { + "status": { + "auto_passed": 19 + }, + "mean_f3db_MHz": 70.96802421052632, + "mean_gain_dB": 14.487954210526317, + "mean_area_um2": 393.38028947368423 + }, + "group0.diffusion=none": { + "status": { + "auto_passed": 30 + }, + "mean_f3db_MHz": 70.64289133333332, + "mean_gain_dB": 14.406536, + "mean_area_um2": 391.3644566666667 + }, + "group0.gate=per_device": { + "status": { + "auto_passed": 49 + }, + "mean_f3db_MHz": 70.76896326530611, + "mean_gain_dB": 14.438106326530612, + "mean_area_um2": 392.146106122449 + }, + "group0.orientation=alt_DS": { + "status": { + "auto_passed": 23 + }, + "mean_f3db_MHz": 70.77563956521739, + "mean_gain_dB": 14.453703913043478, + "mean_area_um2": 394.6949826086957 + }, + "group0.orientation=alt_SD": { + "status": { + "auto_passed": 26 + }, + "mean_f3db_MHz": 70.7630573076923, + "mean_gain_dB": 14.42430846153846, + "mean_area_um2": 389.89133076923076 + }, + "group0.strap_start=bottom": { + "status": { + "auto_passed": 26 + }, + "mean_f3db_MHz": 71.17209653846153, + "mean_gain_dB": 14.435486153846155, + "mean_area_um2": 395.47950000000003 + }, + "group0.strap_start=top": { + "status": { + "auto_passed": 23 + }, + "mean_f3db_MHz": 70.31324739130434, + "mean_gain_dB": 14.441068260869566, + "mean_area_um2": 388.37792173913044 + } + }, + "C16_sky130_sW1_sL2": { + "group0.arrangement=abba": { + "status": { + "auto_passed": 12 + }, + "mean_f3db_MHz": 68.0914675, + "mean_gain_dB": 12.91035, + "mean_area_um2": 385.90521666666666 + }, + "group0.arrangement=block": { + "status": { + "auto_passed": 9 + }, + "mean_f3db_MHz": 73.88840666666667, + "mean_gain_dB": 12.856526666666667, + "mean_area_um2": 355.7335888888889 + }, + "group0.arrangement=interleave": { + "status": { + "auto_passed": 16 + }, + "mean_f3db_MHz": 63.750933125, + "mean_gain_dB": 12.94126, + "mean_area_um2": 389.6638375 + }, + "group0.arrangement=mirror": { + "status": { + "auto_passed": 12 + }, + "mean_f3db_MHz": 70.76168, + "mean_gain_dB": 12.860803333333333, + "mean_area_um2": 389.5406 + }, + "group0.diffusion=all_legal": { + "status": { + "auto_passed": 19 + }, + "mean_f3db_MHz": 68.59150473684211, + "mean_gain_dB": 12.939194736842106, + "mean_area_um2": 383.88483684210524 + }, + "group0.diffusion=none": { + "status": { + "auto_passed": 30 + }, + "mean_f3db_MHz": 68.26699233333333, + "mean_gain_dB": 12.872601333333334, + "mean_area_um2": 381.59205333333335 + }, + "group0.gate=per_device": { + "status": { + "auto_passed": 49 + }, + "mean_f3db_MHz": 68.3928236734694, + "mean_gain_dB": 12.898423265306123, + "mean_area_um2": 382.48109183673466 + }, + "group0.orientation=alt_DS": { + "status": { + "auto_passed": 23 + }, + "mean_f3db_MHz": 68.60092260869565, + "mean_gain_dB": 12.911292173913044, + "mean_area_um2": 374.10429999999997 + }, + "group0.orientation=alt_SD": { + "status": { + "auto_passed": 26 + }, + "mean_f3db_MHz": 68.20873615384616, + "mean_gain_dB": 12.887039230769231, + "mean_area_um2": 389.89133076923076 + }, + "group0.strap_start=bottom": { + "status": { + "auto_passed": 26 + }, + "mean_f3db_MHz": 68.73758884615384, + "mean_gain_dB": 12.896246153846153, + "mean_area_um2": 386.8057692307692 + }, + "group0.strap_start=top": { + "status": { + "auto_passed": 23 + }, + "mean_f3db_MHz": 68.00308913043479, + "mean_gain_dB": 12.900884347826088, + "mean_area_um2": 377.5923260869565 + } + }, + "C16_sky130_sW2_sL1": { + "group0.arrangement=abba": { + "status": { + "auto_passed": 12 + }, + "mean_f3db_MHz": 62.056311666666666, + "mean_gain_dB": 15.833961666666667, + "mean_area_um2": 400.9397 + }, + "group0.arrangement=block": { + "status": { + "auto_passed": 9 + }, + "mean_f3db_MHz": 71.85414222222222, + "mean_gain_dB": 15.788927777777777, + "mean_area_um2": 358.2393333333333 + }, + "group0.arrangement=interleave": { + "status": { + "auto_passed": 16 + }, + "mean_f3db_MHz": 55.3480575, + "mean_gain_dB": 15.85798125, + "mean_area_um2": 411.9473375 + }, + "group0.arrangement=mirror": { + "status": { + "auto_passed": 12 + }, + "mean_f3db_MHz": 67.47640666666668, + "mean_gain_dB": 15.790548333333334, + "mean_area_um2": 397.05783333333335 + }, + "group0.diffusion=all_legal": { + "status": { + "auto_passed": 19 + }, + "mean_f3db_MHz": 63.19503789473684, + "mean_gain_dB": 15.851183157894736, + "mean_area_um2": 393.38028947368423 + }, + "group0.diffusion=none": { + "status": { + "auto_passed": 30 + }, + "mean_f3db_MHz": 62.86477, + "mean_gain_dB": 15.804989666666668, + "mean_area_um2": 397.23521 + }, + "group0.gate=per_device": { + "status": { + "auto_passed": 49 + }, + "mean_f3db_MHz": 62.99283306122449, + "mean_gain_dB": 15.822901428571429, + "mean_area_um2": 395.7404448979592 + }, + "group0.orientation=alt_DS": { + "status": { + "auto_passed": 23 + }, + "mean_f3db_MHz": 62.64667130434783, + "mean_gain_dB": 15.835120434782608, + "mean_area_um2": 398.52373043478264 + }, + "group0.orientation=alt_SD": { + "status": { + "auto_passed": 26 + }, + "mean_f3db_MHz": 63.29905307692308, + "mean_gain_dB": 15.812092307692307, + "mean_area_um2": 393.2783076923077 + }, + "group0.strap_start=bottom": { + "status": { + "auto_passed": 26 + }, + "mean_f3db_MHz": 63.55862653846154, + "mean_gain_dB": 15.821129615384615, + "mean_area_um2": 398.86647307692306 + }, + "group0.strap_start=top": { + "status": { + "auto_passed": 23 + }, + "mean_f3db_MHz": 62.353240434782606, + "mean_gain_dB": 15.824904347826086, + "mean_area_um2": 392.20667391304346 + } + }, + "C16_sky130_sW2_sL2": { + "group0.arrangement=abba": { + "status": { + "auto_passed": 12 + }, + "mean_f3db_MHz": 58.61381166666666, + "mean_gain_dB": 15.050093333333333, + "mean_area_um2": 408.60133333333334 + }, + "group0.arrangement=block": { + "status": { + "auto_passed": 9 + }, + "mean_f3db_MHz": 68.72768333333333, + "mean_gain_dB": 15.008325555555555, + "mean_area_um2": 355.7335888888889 + }, + "group0.arrangement=interleave": { + "status": { + "auto_passed": 16 + }, + "mean_f3db_MHz": 52.5605475, + "mean_gain_dB": 15.07124375, + "mean_area_um2": 466.5431 + }, + "group0.arrangement=mirror": { + "status": { + "auto_passed": 12 + }, + "mean_f3db_MHz": 63.136115833333335, + "mean_gain_dB": 15.011066666666666, + "mean_area_um2": 389.5406 + }, + "group0.diffusion=all_legal": { + "status": { + "auto_passed": 19 + }, + "mean_f3db_MHz": 59.786985263157895, + "mean_gain_dB": 15.064937894736842, + "mean_area_um2": 397.0125736842105 + }, + "group0.diffusion=none": { + "status": { + "auto_passed": 30 + }, + "mean_f3db_MHz": 59.485477333333336, + "mean_gain_dB": 15.023831, + "mean_area_um2": 423.35854 + }, + "group0.gate=per_device": { + "status": { + "auto_passed": 49 + }, + "mean_f3db_MHz": 59.60238857142858, + "mean_gain_dB": 15.039770408163266, + "mean_area_um2": 413.14275714285714 + }, + "group0.orientation=alt_DS": { + "status": { + "auto_passed": 23 + }, + "mean_f3db_MHz": 59.716908260869566, + "mean_gain_dB": 15.05081652173913, + "mean_area_um2": 405.30767391304346 + }, + "group0.orientation=alt_SD": { + "status": { + "auto_passed": 26 + }, + "mean_f3db_MHz": 59.5010826923077, + "mean_gain_dB": 15.029998846153847, + "mean_area_um2": 420.0737923076923 + }, + "group0.strap_start=bottom": { + "status": { + "auto_passed": 26 + }, + "mean_f3db_MHz": 60.136595769230766, + "mean_gain_dB": 15.038118846153846, + "mean_area_um2": 415.69849230769233 + }, + "group0.strap_start=top": { + "status": { + "auto_passed": 23 + }, + "mean_f3db_MHz": 58.998502173913046, + "mean_gain_dB": 15.041637391304349, + "mean_area_um2": 410.2536652173913 + } + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/results/analysis/benchmark_table.json b/benchmarks/textbook_sharing/results/analysis/benchmark_table.json new file mode 100644 index 00000000..20800c50 --- /dev/null +++ b/benchmarks/textbook_sharing/results/analysis/benchmark_table.json @@ -0,0 +1,854 @@ +{ + "rows": [ + { + "topology": "C01", + "name": "basic_current_mirror", + "category": "mirror", + "mos": 2, + "res": 0, + "cap": 0, + "groups_nominal_sky130": [ + { + "devices": [ + "M1", + "M2" + ], + "fingers": 8, + "unique_plans": 101, + "raw": 256, + "static_illegal": 8, + "equivalent_duplicate": 147 + } + ], + "plan_space_nominal_sky130": 101, + "requests": 36, + "outcomes": { + "formal": 31, + "schematic_not_qualified": 5 + }, + "formal_by_pdk": { + "sky130": 12, + "gf180": 12, + "ihp130": 7 + }, + "modes_applicable_in_formal": { + "diffusion_only": 31, + "gate_only": 31, + "combined": 31 + }, + "selection_tasks": 0, + "model_tasks": 0 + }, + { + "topology": "C02", + "name": "cascode_current_mirror", + "category": "mirror", + "mos": 4, + "res": 0, + "cap": 0, + "groups_nominal_sky130": [ + { + "devices": [ + "M1", + "M2", + "M3", + "M4" + ], + "fingers": 16, + "unique_plans": 64, + "raw": 256, + "static_illegal": 144, + "equivalent_duplicate": 48 + } + ], + "plan_space_nominal_sky130": 64, + "requests": 36, + "outcomes": { + "formal": 36 + }, + "formal_by_pdk": { + "sky130": 12, + "gf180": 12, + "ihp130": 12 + }, + "modes_applicable_in_formal": { + "diffusion_only": 36, + "gate_only": 36, + "combined": 36 + }, + "selection_tasks": 12, + "model_tasks": 6 + }, + { + "topology": "C03", + "name": "wilson_current_mirror", + "category": "mirror", + "mos": 3, + "res": 0, + "cap": 0, + "groups_nominal_sky130": [ + { + "devices": [ + "M1", + "M2", + "M3" + ], + "fingers": 24, + "unique_plans": 85, + "raw": 256, + "static_illegal": 152, + "equivalent_duplicate": 19 + } + ], + "plan_space_nominal_sky130": 85, + "requests": 36, + "outcomes": { + "formal": 35, + "schematic_not_qualified": 1 + }, + "formal_by_pdk": { + "sky130": 12, + "gf180": 12, + "ihp130": 11 + }, + "modes_applicable_in_formal": { + "diffusion_only": 35, + "gate_only": 35, + "combined": 35 + }, + "selection_tasks": 0, + "model_tasks": 0 + }, + { + "topology": "C04", + "name": "cs_amplifier_current_source_load", + "category": "single", + "mos": 2, + "res": 0, + "cap": 0, + "groups_nominal_sky130": [ + { + "devices": [ + "M1" + ], + "fingers": 8, + "unique_plans": 8, + "raw": 256, + "static_illegal": 64, + "equivalent_duplicate": 184 + }, + { + "devices": [ + "M2" + ], + "fingers": 4, + "unique_plans": 8, + "raw": 256, + "static_illegal": 64, + "equivalent_duplicate": 184 + } + ], + "plan_space_nominal_sky130": 64, + "requests": 36, + "outcomes": { + "formal": 32, + "schematic_not_qualified": 1, + "reference_spec_failed": 3 + }, + "formal_by_pdk": { + "sky130": 12, + "gf180": 8, + "ihp130": 12 + }, + "modes_applicable_in_formal": {}, + "selection_tasks": 0, + "model_tasks": 0 + }, + { + "topology": "C05", + "name": "source_follower_mos_current_source", + "category": "follower", + "mos": 2, + "res": 0, + "cap": 0, + "groups_nominal_sky130": [ + { + "devices": [ + "M1", + "M2" + ], + "fingers": 12, + "unique_plans": 76, + "raw": 256, + "static_illegal": 16, + "equivalent_duplicate": 164 + } + ], + "plan_space_nominal_sky130": 76, + "requests": 36, + "outcomes": { + "formal": 35, + "schematic_not_qualified": 1 + }, + "formal_by_pdk": { + "sky130": 12, + "gf180": 11, + "ihp130": 12 + }, + "modes_applicable_in_formal": { + "diffusion_only": 35 + }, + "selection_tasks": 0, + "model_tasks": 0 + }, + { + "topology": "C06", + "name": "cascode_amplifier_cascode_load", + "category": "single", + "mos": 4, + "res": 0, + "cap": 0, + "groups_nominal_sky130": [ + { + "devices": [ + "M1", + "M2" + ], + "fingers": 16, + "unique_plans": 76, + "raw": 256, + "static_illegal": 16, + "equivalent_duplicate": 164 + }, + { + "devices": [ + "M3", + "M4" + ], + "fingers": 8, + "unique_plans": 76, + "raw": 256, + "static_illegal": 16, + "equivalent_duplicate": 164 + } + ], + "plan_space_nominal_sky130": 5776, + "requests": 36, + "outcomes": { + "formal": 31, + "schematic_not_qualified": 5 + }, + "formal_by_pdk": { + "sky130": 7, + "gf180": 12, + "ihp130": 12 + }, + "modes_applicable_in_formal": { + "diffusion_only": 31 + }, + "selection_tasks": 0, + "model_tasks": 0 + }, + { + "topology": "C07", + "name": "diff_pair_current_source_loads", + "category": "diff_cs", + "mos": 4, + "res": 0, + "cap": 0, + "groups_nominal_sky130": [ + { + "devices": [ + "M1", + "M2" + ], + "fingers": 16, + "unique_plans": 49, + "raw": 256, + "static_illegal": 16, + "equivalent_duplicate": 191 + }, + { + "devices": [ + "M3", + "M4" + ], + "fingers": 16, + "unique_plans": 101, + "raw": 256, + "static_illegal": 8, + "equivalent_duplicate": 147 + } + ], + "plan_space_nominal_sky130": 4949, + "requests": 36, + "outcomes": { + "formal": 36 + }, + "formal_by_pdk": { + "sky130": 12, + "gf180": 12, + "ihp130": 12 + }, + "modes_applicable_in_formal": { + "diffusion_only": 36, + "gate_only": 36, + "combined": 36 + }, + "selection_tasks": 0, + "model_tasks": 0 + }, + { + "topology": "C08", + "name": "five_transistor_ota", + "category": "ota", + "mos": 5, + "res": 0, + "cap": 0, + "groups_nominal_sky130": [ + { + "devices": [ + "M1", + "M2", + "M3" + ], + "fingers": 24, + "unique_plans": 10, + "raw": 256, + "static_illegal": 224, + "equivalent_duplicate": 22 + }, + { + "devices": [ + "M4", + "M5" + ], + "fingers": 8, + "unique_plans": 101, + "raw": 256, + "static_illegal": 8, + "equivalent_duplicate": 147 + } + ], + "plan_space_nominal_sky130": 1010, + "requests": 36, + "outcomes": { + "formal": 34, + "schematic_not_qualified": 2 + }, + "formal_by_pdk": { + "sky130": 12, + "gf180": 12, + "ihp130": 10 + }, + "modes_applicable_in_formal": { + "diffusion_only": 34, + "gate_only": 34, + "combined": 34 + }, + "selection_tasks": 11, + "model_tasks": 5 + }, + { + "topology": "C09", + "name": "telescopic_ota_single_ended", + "category": "ota", + "mos": 8, + "res": 0, + "cap": 0, + "groups_nominal_sky130": [ + { + "devices": [ + "M1", + "M2", + "M3", + "M4" + ], + "fingers": 64, + "unique_plans": 12, + "raw": 256, + "static_illegal": 224, + "equivalent_duplicate": 20 + }, + { + "devices": [ + "M5", + "M6", + "M7", + "M8" + ], + "fingers": 128, + "unique_plans": 39, + "raw": 256, + "static_illegal": 152, + "equivalent_duplicate": 65 + } + ], + "plan_space_nominal_sky130": 468, + "requests": 36, + "outcomes": { + "schematic_not_qualified": 13, + "formal": 23 + }, + "formal_by_pdk": { + "sky130": 3, + "gf180": 8, + "ihp130": 12 + }, + "modes_applicable_in_formal": { + "diffusion_only": 23, + "gate_only": 23, + "combined": 23 + }, + "selection_tasks": 9, + "model_tasks": 5 + }, + { + "topology": "C10", + "name": "folded_cascode_ota_fully_differential", + "category": "ota_fd", + "mos": 10, + "res": 0, + "cap": 0, + "groups_nominal_sky130": [ + { + "devices": [ + "M1", + "M2" + ], + "fingers": 16, + "unique_plans": 49, + "raw": 256, + "static_illegal": 16, + "equivalent_duplicate": 191 + }, + { + "devices": [ + "M3", + "M4", + "M5", + "M6" + ], + "fingers": 32, + "unique_plans": 39, + "raw": 256, + "static_illegal": 152, + "equivalent_duplicate": 65 + }, + { + "devices": [ + "M7", + "M8", + "M9", + "M10" + ], + "fingers": 32, + "unique_plans": 39, + "raw": 256, + "static_illegal": 152, + "equivalent_duplicate": 65 + } + ], + "plan_space_nominal_sky130": 74529, + "requests": 36, + "outcomes": { + "schematic_not_qualified": 9, + "formal": 27 + }, + "formal_by_pdk": { + "sky130": 8, + "gf180": 12, + "ihp130": 7 + }, + "modes_applicable_in_formal": { + "diffusion_only": 27, + "gate_only": 27, + "combined": 27 + }, + "selection_tasks": 0, + "model_tasks": 0 + }, + { + "topology": "C11", + "name": "two_stage_miller_opamp", + "category": "twostage", + "mos": 8, + "res": 1, + "cap": 1, + "groups_nominal_sky130": [ + { + "devices": [ + "M1", + "M2", + "M3", + "M4", + "M7" + ], + "fingers": 36, + "unique_plans": 25, + "raw": 256, + "static_illegal": 216, + "equivalent_duplicate": 15 + }, + { + "devices": [ + "M5", + "M6", + "M8" + ], + "fingers": 16, + "unique_plans": 43, + "raw": 256, + "static_illegal": 152, + "equivalent_duplicate": 61 + } + ], + "plan_space_nominal_sky130": 1075, + "requests": 36, + "outcomes": { + "formal": 36 + }, + "formal_by_pdk": { + "sky130": 12, + "gf180": 12, + "ihp130": 12 + }, + "modes_applicable_in_formal": { + "diffusion_only": 36, + "gate_only": 36, + "combined": 36 + }, + "selection_tasks": 12, + "model_tasks": 6 + }, + { + "topology": "C12", + "name": "cmos_inverter_amplifier", + "category": "single", + "mos": 2, + "res": 0, + "cap": 0, + "groups_nominal_sky130": [ + { + "devices": [ + "M1" + ], + "fingers": 4, + "unique_plans": 8, + "raw": 256, + "static_illegal": 64, + "equivalent_duplicate": 184 + }, + { + "devices": [ + "M2" + ], + "fingers": 8, + "unique_plans": 8, + "raw": 256, + "static_illegal": 64, + "equivalent_duplicate": 184 + } + ], + "plan_space_nominal_sky130": 64, + "requests": 36, + "outcomes": { + "formal": 35, + "schematic_not_qualified": 1 + }, + "formal_by_pdk": { + "sky130": 11, + "gf180": 12, + "ihp130": 12 + }, + "modes_applicable_in_formal": {}, + "selection_tasks": 0, + "model_tasks": 0 + }, + { + "topology": "C13", + "name": "wide_swing_cascode_current_mirror", + "category": "mirror", + "mos": 5, + "res": 0, + "cap": 0, + "groups_nominal_sky130": [ + { + "devices": [ + "M1", + "M2", + "M3", + "M4", + "M5" + ], + "fingers": 17, + "unique_plans": 40, + "raw": 256, + "static_illegal": 176, + "equivalent_duplicate": 40 + } + ], + "plan_space_nominal_sky130": 40, + "requests": 36, + "outcomes": { + "parameter_illegal": 9, + "formal": 27 + }, + "formal_by_pdk": { + "sky130": 9, + "gf180": 9, + "ihp130": 9 + }, + "modes_applicable_in_formal": { + "diffusion_only": 27, + "gate_only": 27, + "combined": 27 + }, + "selection_tasks": 0, + "model_tasks": 0 + }, + { + "topology": "C14", + "name": "regulated_cascode_current_mirror", + "category": "mirror", + "mos": 4, + "res": 0, + "cap": 0, + "groups_nominal_sky130": [ + { + "devices": [ + "M1", + "M2", + "M3", + "M4" + ], + "fingers": 14, + "unique_plans": 12, + "raw": 256, + "static_illegal": 224, + "equivalent_duplicate": 20 + } + ], + "plan_space_nominal_sky130": 12, + "requests": 36, + "outcomes": { + "formal": 36 + }, + "formal_by_pdk": { + "sky130": 12, + "gf180": 12, + "ihp130": 12 + }, + "modes_applicable_in_formal": { + "diffusion_only": 36, + "gate_only": 36, + "combined": 36 + }, + "selection_tasks": 0, + "model_tasks": 0 + }, + { + "topology": "C15", + "name": "cs_amplifier_resistor_load", + "category": "single", + "mos": 1, + "res": 1, + "cap": 0, + "groups_nominal_sky130": [ + { + "devices": [ + "M1" + ], + "fingers": 4, + "unique_plans": 8, + "raw": 256, + "static_illegal": 64, + "equivalent_duplicate": 184 + } + ], + "plan_space_nominal_sky130": 8, + "requests": 36, + "outcomes": { + "formal": 33, + "schematic_not_qualified": 3 + }, + "formal_by_pdk": { + "sky130": 12, + "gf180": 10, + "ihp130": 11 + }, + "modes_applicable_in_formal": {}, + "selection_tasks": 0, + "model_tasks": 0 + }, + { + "topology": "C16", + "name": "diff_pair_resistor_loads", + "category": "diff_r", + "mos": 2, + "res": 2, + "cap": 0, + "groups_nominal_sky130": [ + { + "devices": [ + "M1", + "M2" + ], + "fingers": 16, + "unique_plans": 49, + "raw": 256, + "static_illegal": 16, + "equivalent_duplicate": 191 + } + ], + "plan_space_nominal_sky130": 49, + "requests": 36, + "outcomes": { + "formal": 32, + "schematic_not_qualified": 4 + }, + "formal_by_pdk": { + "sky130": 12, + "gf180": 10, + "ihp130": 10 + }, + "modes_applicable_in_formal": { + "diffusion_only": 32 + }, + "selection_tasks": 12, + "model_tasks": 6 + }, + { + "topology": "C17", + "name": "degenerated_diff_pair", + "category": "diff_r", + "mos": 3, + "res": 4, + "cap": 0, + "groups_nominal_sky130": [ + { + "devices": [ + "M1" + ], + "fingers": 8, + "unique_plans": 8, + "raw": 256, + "static_illegal": 64, + "equivalent_duplicate": 184 + }, + { + "devices": [ + "M2" + ], + "fingers": 8, + "unique_plans": 8, + "raw": 256, + "static_illegal": 64, + "equivalent_duplicate": 184 + }, + { + "devices": [ + "M3" + ], + "fingers": 8, + "unique_plans": 8, + "raw": 256, + "static_illegal": 64, + "equivalent_duplicate": 184 + } + ], + "plan_space_nominal_sky130": 512, + "requests": 36, + "outcomes": { + "formal": 28, + "schematic_not_qualified": 7, + "reference_spec_failed": 1 + }, + "formal_by_pdk": { + "sky130": 10, + "gf180": 9, + "ihp130": 9 + }, + "modes_applicable_in_formal": {}, + "selection_tasks": 0, + "model_tasks": 0 + }, + { + "topology": "C18", + "name": "class_ab_output_buffer", + "category": "buffer_ab", + "mos": 6, + "res": 0, + "cap": 0, + "groups_nominal_sky130": [ + { + "devices": [ + "M1" + ], + "fingers": 4, + "unique_plans": 8, + "raw": 256, + "static_illegal": 64, + "equivalent_duplicate": 184 + }, + { + "devices": [ + "M2" + ], + "fingers": 8, + "unique_plans": 8, + "raw": 256, + "static_illegal": 64, + "equivalent_duplicate": 184 + }, + { + "devices": [ + "M3", + "M5" + ], + "fingers": 48, + "unique_plans": 62, + "raw": 256, + "static_illegal": 8, + "equivalent_duplicate": 186 + }, + { + "devices": [ + "M4", + "M6" + ], + "fingers": 96, + "unique_plans": 62, + "raw": 256, + "static_illegal": 8, + "equivalent_duplicate": 186 + } + ], + "plan_space_nominal_sky130": 246016, + "requests": 36, + "outcomes": { + "schematic_not_qualified": 36 + }, + "formal_by_pdk": { + "sky130": 0, + "gf180": 0, + "ihp130": 0 + }, + "modes_applicable_in_formal": {}, + "selection_tasks": 0, + "model_tasks": 0 + } + ], + "totals": { + "requests": 648, + "outcomes": { + "formal": 547, + "schematic_not_qualified": 88, + "reference_spec_failed": 4, + "parameter_illegal": 9 + }, + "topologies_with_formal_entries": 17, + "selection_tasks": 56, + "model_tasks": 28 + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/results/analysis/cost_decomposition.json b/benchmarks/textbook_sharing/results/analysis/cost_decomposition.json new file mode 100644 index 00000000..ac998c76 --- /dev/null +++ b/benchmarks/textbook_sharing/results/analysis/cost_decomposition.json @@ -0,0 +1,50756 @@ +{ + "n_pairs_all": 1061, + "n_pairs_both_auto_passed": 1061, + "by_mode": { + "diffusion_only": { + "n": 419, + "classes": { + "positive": 341, + "neutral": 70, + "negative": 8 + }, + "mean_rel": -0.02256613365155131, + "median_rel": -0.02013, + "min_rel": -0.09051, + "max_rel": 0.04551, + "passive_dominated": 47, + "geometry_identical_to_ref": 0 + }, + "gate_only": { + "n": 321, + "classes": { + "positive": 183, + "neutral": 136, + "negative": 2 + }, + "mean_rel": -0.044049065420560744, + "median_rel": -0.03835, + "min_rel": -0.14293, + "max_rel": 0.00816, + "passive_dominated": 13, + "geometry_identical_to_ref": 0 + }, + "combined": { + "n": 321, + "classes": { + "positive": 279, + "neutral": 31, + "negative": 11 + }, + "mean_rel": -0.05547672897196262, + "median_rel": -0.03835, + "min_rel": -0.18375, + "max_rel": 0.18224, + "passive_dominated": 15, + "geometry_identical_to_ref": 0 + } + }, + "by_topology": { + "C01": { + "diffusion_only": { + "n": 31, + "classes": { + "positive": 31 + }, + "mean_rel": -0.03659096774193548, + "median_rel": -0.03185, + "min_rel": -0.07522, + "max_rel": -0.01193, + "passive_dominated": 0, + "geometry_identical_to_ref": 0 + }, + "gate_only": { + "n": 31, + "classes": { + "positive": 31 + }, + "mean_rel": -0.07938322580645162, + "median_rel": -0.07611, + "min_rel": -0.08547, + "max_rel": -0.07456, + "passive_dominated": 0, + "geometry_identical_to_ref": 0 + }, + "combined": { + "n": 31, + "classes": { + "positive": 31 + }, + "mean_rel": -0.1130716129032258, + "median_rel": -0.11025, + "min_rel": -0.14811, + "max_rel": -0.0856, + "passive_dominated": 0, + "geometry_identical_to_ref": 0 + } + }, + "C02": { + "diffusion_only": { + "n": 36, + "classes": { + "positive": 36 + }, + "mean_rel": -0.026584166666666666, + "median_rel": -0.02336, + "min_rel": -0.0544, + "max_rel": -0.01013, + "passive_dominated": 0, + "geometry_identical_to_ref": 0 + }, + "gate_only": { + "n": 36, + "classes": { + "positive": 36 + }, + "mean_rel": -0.13967666666666667, + "median_rel": -0.14035, + "min_rel": -0.14293, + "max_rel": -0.13537, + "passive_dominated": 0, + "geometry_identical_to_ref": 0 + }, + "combined": { + "n": 36, + "classes": { + "positive": 36 + }, + "mean_rel": -0.15533472222222222, + "median_rel": -0.1571, + "min_rel": -0.18375, + "max_rel": -0.08946, + "passive_dominated": 0, + "geometry_identical_to_ref": 0 + } + }, + "C03": { + "diffusion_only": { + "n": 35, + "classes": { + "positive": 25, + "neutral": 10 + }, + "mean_rel": -0.008486857142857143, + "median_rel": -0.00698, + "min_rel": -0.02446, + "max_rel": -0.00229, + "passive_dominated": 0, + "geometry_identical_to_ref": 0 + }, + "gate_only": { + "n": 35, + "classes": { + "neutral": 35 + }, + "mean_rel": 0.0, + "median_rel": 0.0, + "min_rel": 0.0, + "max_rel": 0.0, + "passive_dominated": 0, + "geometry_identical_to_ref": 0 + }, + "combined": { + "n": 35, + "classes": { + "positive": 25, + "neutral": 10 + }, + "mean_rel": -0.008486857142857143, + "median_rel": -0.00698, + "min_rel": -0.02446, + "max_rel": -0.00229, + "passive_dominated": 0, + "geometry_identical_to_ref": 0 + } + }, + "C05": { + "diffusion_only": { + "n": 35, + "classes": { + "positive": 35 + }, + "mean_rel": -0.04073, + "median_rel": -0.03467, + "min_rel": -0.08057, + "max_rel": -0.00949, + "passive_dominated": 0, + "geometry_identical_to_ref": 0 + }, + "gate_only": { + "n": 0, + "classes": {}, + "mean_rel": null, + "median_rel": null, + "min_rel": null, + "max_rel": null, + "passive_dominated": 0, + "geometry_identical_to_ref": 0 + }, + "combined": { + "n": 0, + "classes": {}, + "mean_rel": null, + "median_rel": null, + "min_rel": null, + "max_rel": null, + "passive_dominated": 0, + "geometry_identical_to_ref": 0 + } + }, + "C06": { + "diffusion_only": { + "n": 31, + "classes": { + "positive": 31 + }, + "mean_rel": -0.033095806451612905, + "median_rel": -0.02926, + "min_rel": -0.06258, + "max_rel": -0.01387, + "passive_dominated": 0, + "geometry_identical_to_ref": 0 + }, + "gate_only": { + "n": 0, + "classes": {}, + "mean_rel": null, + "median_rel": null, + "min_rel": null, + "max_rel": null, + "passive_dominated": 0, + "geometry_identical_to_ref": 0 + }, + "combined": { + "n": 0, + "classes": {}, + "mean_rel": null, + "median_rel": null, + "min_rel": null, + "max_rel": null, + "passive_dominated": 0, + "geometry_identical_to_ref": 0 + } + }, + "C07": { + "diffusion_only": { + "n": 36, + "classes": { + "positive": 30, + "negative": 5, + "neutral": 1 + }, + "mean_rel": -0.023973055555555556, + "median_rel": -0.023335, + "min_rel": -0.06257, + "max_rel": 0.02372, + "passive_dominated": 0, + "geometry_identical_to_ref": 0 + }, + "gate_only": { + "n": 36, + "classes": { + "positive": 36 + }, + "mean_rel": -0.04237, + "median_rel": -0.04106, + "min_rel": -0.04592, + "max_rel": -0.04013, + "passive_dominated": 0, + "geometry_identical_to_ref": 0 + }, + "combined": { + "n": 36, + "classes": { + "positive": 25, + "negative": 8, + "neutral": 3 + }, + "mean_rel": -0.011820555555555555, + "median_rel": -0.044825000000000004, + "min_rel": -0.06076, + "max_rel": 0.18224, + "passive_dominated": 0, + "geometry_identical_to_ref": 0 + } + }, + "C08": { + "diffusion_only": { + "n": 34, + "classes": { + "positive": 34 + }, + "mean_rel": -0.021437058823529413, + "median_rel": -0.01769, + "min_rel": -0.04859, + "max_rel": -0.00856, + "passive_dominated": 0, + "geometry_identical_to_ref": 0 + }, + "gate_only": { + "n": 34, + "classes": { + "positive": 34 + }, + "mean_rel": -0.04062647058823529, + "median_rel": -0.03924, + "min_rel": -0.04391, + "max_rel": -0.03835, + "passive_dominated": 0, + "geometry_identical_to_ref": 0 + }, + "combined": { + "n": 34, + "classes": { + "positive": 34 + }, + "mean_rel": -0.04062647058823529, + "median_rel": -0.03924, + "min_rel": -0.04391, + "max_rel": -0.03835, + "passive_dominated": 0, + "geometry_identical_to_ref": 0 + } + }, + "C09": { + "diffusion_only": { + "n": 23, + "classes": { + "positive": 13, + "neutral": 10 + }, + "mean_rel": -0.0072969565217391305, + "median_rel": -0.00689, + "min_rel": -0.01835, + "max_rel": -0.00216, + "passive_dominated": 0, + "geometry_identical_to_ref": 0 + }, + "gate_only": { + "n": 23, + "classes": { + "neutral": 23 + }, + "mean_rel": 0.0, + "median_rel": 0.0, + "min_rel": 0.0, + "max_rel": 0.0, + "passive_dominated": 0, + "geometry_identical_to_ref": 0 + }, + "combined": { + "n": 23, + "classes": { + "positive": 13, + "neutral": 10 + }, + "mean_rel": -0.0072969565217391305, + "median_rel": -0.00689, + "min_rel": -0.01835, + "max_rel": -0.00216, + "passive_dominated": 0, + "geometry_identical_to_ref": 0 + } + }, + "C10": { + "diffusion_only": { + "n": 27, + "classes": { + "positive": 25, + "neutral": 2 + }, + "mean_rel": -0.02113925925925926, + "median_rel": -0.01227, + "min_rel": -0.08286, + "max_rel": -0.00298, + "passive_dominated": 0, + "geometry_identical_to_ref": 0 + }, + "gate_only": { + "n": 27, + "classes": { + "neutral": 27 + }, + "mean_rel": 0.0, + "median_rel": 0.0, + "min_rel": 0.0, + "max_rel": 0.0, + "passive_dominated": 0, + "geometry_identical_to_ref": 0 + }, + "combined": { + "n": 27, + "classes": { + "positive": 16, + "negative": 3, + "neutral": 8 + }, + "mean_rel": -0.009617407407407408, + "median_rel": -0.00612, + "min_rel": -0.04913, + "max_rel": 0.01404, + "passive_dominated": 0, + "geometry_identical_to_ref": 0 + } + }, + "C11": { + "diffusion_only": { + "n": 36, + "classes": { + "neutral": 15, + "positive": 21 + }, + "mean_rel": -0.011949722222222223, + "median_rel": -0.015040000000000001, + "min_rel": -0.0317, + "max_rel": 0.0, + "passive_dominated": 15, + "geometry_identical_to_ref": 0 + }, + "gate_only": { + "n": 36, + "classes": { + "positive": 19, + "neutral": 15, + "negative": 2 + }, + "mean_rel": -0.0060258333333333336, + "median_rel": -0.005690000000000001, + "min_rel": -0.01738, + "max_rel": 0.00816, + "passive_dominated": 13, + "geometry_identical_to_ref": 0 + }, + "combined": { + "n": 36, + "classes": { + "positive": 36 + }, + "mean_rel": -0.01874722222222222, + "median_rel": -0.018430000000000002, + "min_rel": -0.02711, + "max_rel": -0.01349, + "passive_dominated": 15, + "geometry_identical_to_ref": 0 + } + }, + "C13": { + "diffusion_only": { + "n": 27, + "classes": { + "positive": 24, + "negative": 3 + }, + "mean_rel": -0.014634074074074074, + "median_rel": -0.02029, + "min_rel": -0.02992, + "max_rel": 0.04551, + "passive_dominated": 0, + "geometry_identical_to_ref": 0 + }, + "gate_only": { + "n": 27, + "classes": { + "positive": 27 + }, + "mean_rel": -0.13062814814814816, + "median_rel": -0.13763, + "min_rel": -0.14145, + "max_rel": -0.06784, + "passive_dominated": 0, + "geometry_identical_to_ref": 0 + }, + "combined": { + "n": 27, + "classes": { + "positive": 27 + }, + "mean_rel": -0.1498137037037037, + "median_rel": -0.15568, + "min_rel": -0.16603, + "max_rel": -0.08783, + "passive_dominated": 0, + "geometry_identical_to_ref": 0 + } + }, + "C14": { + "diffusion_only": { + "n": 36, + "classes": { + "positive": 36 + }, + "mean_rel": -0.04054194444444444, + "median_rel": -0.03601, + "min_rel": -0.09051, + "max_rel": -0.01373, + "passive_dominated": 0, + "geometry_identical_to_ref": 0 + }, + "gate_only": { + "n": 36, + "classes": { + "neutral": 36 + }, + "mean_rel": 0.0, + "median_rel": 0.0, + "min_rel": 0.0, + "max_rel": 0.0, + "passive_dominated": 0, + "geometry_identical_to_ref": 0 + }, + "combined": { + "n": 36, + "classes": { + "positive": 36 + }, + "mean_rel": -0.04054194444444444, + "median_rel": -0.03601, + "min_rel": -0.09051, + "max_rel": -0.01373, + "passive_dominated": 0, + "geometry_identical_to_ref": 0 + } + }, + "C16": { + "diffusion_only": { + "n": 32, + "classes": { + "neutral": 32 + }, + "mean_rel": 0.0, + "median_rel": 0.0, + "min_rel": 0.0, + "max_rel": 0.0, + "passive_dominated": 32, + "geometry_identical_to_ref": 0 + }, + "gate_only": { + "n": 0, + "classes": {}, + "mean_rel": null, + "median_rel": null, + "min_rel": null, + "max_rel": null, + "passive_dominated": 0, + "geometry_identical_to_ref": 0 + }, + "combined": { + "n": 0, + "classes": {}, + "mean_rel": null, + "median_rel": null, + "min_rel": null, + "max_rel": null, + "passive_dominated": 0, + "geometry_identical_to_ref": 0 + } + } + }, + "by_pdk": { + "sky130": { + "diffusion_only": { + "n": 135, + "classes": { + "positive": 109, + "neutral": 21, + "negative": 5 + }, + "mean_rel": -0.023952814814814816, + "median_rel": -0.02306, + "min_rel": -0.09051, + "max_rel": 0.04551, + "passive_dominated": 17, + "geometry_identical_to_ref": 0 + }, + "gate_only": { + "n": 104, + "classes": { + "positive": 61, + "neutral": 41, + "negative": 2 + }, + "mean_rel": -0.04396461538461539, + "median_rel": -0.03924, + "min_rel": -0.14007, + "max_rel": 0.00816, + "passive_dominated": 4, + "geometry_identical_to_ref": 0 + }, + "combined": { + "n": 104, + "classes": { + "positive": 95, + "neutral": 9 + }, + "mean_rel": -0.05914913461538462, + "median_rel": -0.03924, + "min_rel": -0.18159, + "max_rel": 0.00073, + "passive_dominated": 5, + "geometry_identical_to_ref": 0 + } + }, + "gf180": { + "diffusion_only": { + "n": 146, + "classes": { + "positive": 130, + "neutral": 16 + }, + "mean_rel": -0.02480417808219178, + "median_rel": -0.0213, + "min_rel": -0.08286, + "max_rel": 0.0, + "passive_dominated": 13, + "geometry_identical_to_ref": 0 + }, + "gate_only": { + "n": 113, + "classes": { + "positive": 63, + "neutral": 50 + }, + "mean_rel": -0.045215398230088494, + "median_rel": -0.04391, + "min_rel": -0.14156, + "max_rel": 0.0044, + "passive_dominated": 2, + "geometry_identical_to_ref": 0 + }, + "combined": { + "n": 113, + "classes": { + "positive": 105, + "neutral": 5, + "negative": 3 + }, + "mean_rel": -0.061580796460176994, + "median_rel": -0.04391, + "min_rel": -0.18375, + "max_rel": 0.01404, + "passive_dominated": 3, + "geometry_identical_to_ref": 0 + } + }, + "ihp130": { + "diffusion_only": { + "n": 138, + "classes": { + "positive": 102, + "neutral": 33, + "negative": 3 + }, + "mean_rel": -0.0188418115942029, + "median_rel": -0.0161, + "min_rel": -0.08057, + "max_rel": 0.02372, + "passive_dominated": 17, + "geometry_identical_to_ref": 0 + }, + "gate_only": { + "n": 104, + "classes": { + "positive": 59, + "neutral": 45 + }, + "mean_rel": -0.04286625, + "median_rel": -0.01349, + "min_rel": -0.14293, + "max_rel": 0.0, + "passive_dominated": 7, + "geometry_identical_to_ref": 0 + }, + "combined": { + "n": 104, + "classes": { + "positive": 79, + "neutral": 17, + "negative": 8 + }, + "mean_rel": -0.04517201923076923, + "median_rel": -0.02502, + "min_rel": -0.17919, + "max_rel": 0.18224, + "passive_dominated": 7, + "geometry_identical_to_ref": 0 + } + } + }, + "increase_mechanisms": { + "n": 21, + "by_primary": { + "stub_separation": 5, + "routing_tracks": 14, + "wider_row": 2 + }, + "with_term": { + "routing_tracks": 16, + "stub_separation": 11, + "wider_row": 2, + "taller_mos_rows": 2, + "other_height": 0 + }, + "tracks_and_stub_separation": 8, + "assembly_only": 19, + "pairs": [ + { + "case": "C07_ihp130_sW0.5_sL1", + "mode": "combined", + "rel": 0.18224, + "dW": -1.425, + "dH": 0.08, + "area_terms": { + "wider_row": -6.523, + "stub_separation": 24.749, + "taller_mos_rows": -4.157, + "routing_tracks": 4.808, + "other_height": -0.0 + }, + "increase_terms": [ + "stub_separation", + "routing_tracks" + ], + "primary_mechanism": "stub_separation", + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "row_span_saving": { + "n": 0.0, + "p": 0.51 + } + }, + { + "case": "C07_ihp130_sW1_sL1", + "mode": "combined", + "rel": 0.18072, + "dW": -0.985, + "dH": 1.26, + "area_terms": { + "wider_row": -7.125, + "stub_separation": 20.885, + "taller_mos_rows": -6.768, + "routing_tracks": 23.488, + "other_height": -0.0 + }, + "increase_terms": [ + "routing_tracks", + "stub_separation" + ], + "primary_mechanism": "routing_tracks", + "channel_strategy_ref": "shared", + "channel_strategy_mode": "split", + "row_span_saving": { + "n": 0.0, + "p": 0.51 + } + }, + { + "case": "C07_ihp130_sW1.5_sL1", + "mode": "combined", + "rel": 0.15801, + "dW": -0.985, + "dH": 1.26, + "area_terms": { + "wider_row": -7.125, + "stub_separation": 20.885, + "taller_mos_rows": -9.379, + "routing_tracks": 32.55, + "other_height": -0.0 + }, + "increase_terms": [ + "routing_tracks", + "stub_separation" + ], + "primary_mechanism": "routing_tracks", + "channel_strategy_ref": "shared", + "channel_strategy_mode": "split", + "row_span_saving": { + "n": 0.0, + "p": 0.51 + } + }, + { + "case": "C07_ihp130_sW2_sL1", + "mode": "combined", + "rel": 0.14519, + "dW": -0.985, + "dH": 1.26, + "area_terms": { + "wider_row": -7.125, + "stub_separation": 20.885, + "taller_mos_rows": -11.99, + "routing_tracks": 41.613, + "other_height": -0.0 + }, + "increase_terms": [ + "routing_tracks", + "stub_separation" + ], + "primary_mechanism": "routing_tracks", + "channel_strategy_ref": "shared", + "channel_strategy_mode": "split", + "row_span_saving": { + "n": 0.0, + "p": 0.51 + } + }, + { + "case": "C13_sky130_sW2_sL1", + "mode": "diffusion_only", + "rel": 0.04551, + "dW": 0.56, + "dH": 0.61, + "area_terms": { + "wider_row": -5.34, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 15.979, + "other_height": 0.0 + }, + "increase_terms": [ + "routing_tracks" + ], + "primary_mechanism": "routing_tracks", + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "row_span_saving": { + "n": 0.56 + } + }, + { + "case": "C13_sky130_sW1_sL1", + "mode": "diffusion_only", + "rel": 0.03134, + "dW": 0.56, + "dH": 0.61, + "area_terms": { + "wider_row": -5.34, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 9.861, + "other_height": 0.0 + }, + "increase_terms": [ + "routing_tracks" + ], + "primary_mechanism": "routing_tracks", + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "row_span_saving": { + "n": 0.56 + } + }, + { + "case": "C13_sky130_sW1.5_sL1", + "mode": "diffusion_only", + "rel": 0.02954, + "dW": 0.56, + "dH": 0.61, + "area_terms": { + "wider_row": -5.48, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 9.861, + "other_height": 0.0 + }, + "increase_terms": [ + "routing_tracks" + ], + "primary_mechanism": "routing_tracks", + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "row_span_saving": { + "n": 0.56 + } + }, + { + "case": "C07_ihp130_sW2_sL1", + "mode": "diffusion_only", + "rel": 0.02372, + "dW": 0.51, + "dH": 0.59, + "area_terms": { + "wider_row": -6.783, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 13.871, + "other_height": -0.0 + }, + "increase_terms": [ + "routing_tracks" + ], + "primary_mechanism": "routing_tracks", + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "row_span_saving": { + "n": 0.51, + "p": 0.51 + } + }, + { + "case": "C07_ihp130_sW0.5_sL1.5", + "mode": "combined", + "rel": 0.02217, + "dW": -0.145, + "dH": 0.08, + "area_terms": { + "wider_row": -6.523, + "stub_separation": 8.377, + "taller_mos_rows": -4.687, + "routing_tracks": 5.422, + "other_height": -0.0 + }, + "increase_terms": [ + "stub_separation", + "routing_tracks" + ], + "primary_mechanism": "stub_separation", + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "row_span_saving": { + "n": 0.0, + "p": 0.51 + } + }, + { + "case": "C07_sky130_sW2_sL1", + "mode": "diffusion_only", + "rel": 0.01964, + "dW": 0.56, + "dH": 0.61, + "area_terms": { + "wider_row": -7.706, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 13.365, + "other_height": -0.0 + }, + "increase_terms": [ + "routing_tracks" + ], + "primary_mechanism": "routing_tracks", + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "row_span_saving": { + "n": 0.56, + "p": 0.56 + } + }, + { + "case": "C07_ihp130_sW1.5_sL1", + "mode": "diffusion_only", + "rel": 0.0174, + "dW": 0.51, + "dH": 0.59, + "area_terms": { + "wider_row": -6.783, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 10.85, + "other_height": -0.0 + }, + "increase_terms": [ + "routing_tracks" + ], + "primary_mechanism": "routing_tracks", + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "row_span_saving": { + "n": 0.51, + "p": 0.51 + } + }, + { + "case": "C07_ihp130_sW1_sL1.5", + "mode": "combined", + "rel": 0.0158, + "dW": -0.145, + "dH": 0.08, + "area_terms": { + "wider_row": -6.523, + "stub_separation": 8.377, + "taller_mos_rows": -7.829, + "routing_tracks": 9.056, + "other_height": -0.0 + }, + "increase_terms": [ + "routing_tracks", + "stub_separation" + ], + "primary_mechanism": "routing_tracks", + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "row_span_saving": { + "n": 0.0, + "p": 0.51 + } + }, + { + "case": "C10_gf180_sW0.5_sL1", + "mode": "combined", + "rel": 0.01404, + "dW": -0.49, + "dH": 0.0, + "area_terms": { + "wider_row": -16.496, + "stub_separation": 26.6, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "increase_terms": [ + "stub_separation" + ], + "primary_mechanism": "stub_separation", + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "row_span_saving": { + "n": 0.8, + "p": 0.8 + } + }, + { + "case": "C07_ihp130_sW1.5_sL1.5", + "mode": "combined", + "rel": 0.01308, + "dW": -0.145, + "dH": 0.08, + "area_terms": { + "wider_row": -6.523, + "stub_separation": 8.377, + "taller_mos_rows": -10.97, + "routing_tracks": 12.691, + "other_height": -0.0 + }, + "increase_terms": [ + "routing_tracks", + "stub_separation" + ], + "primary_mechanism": "routing_tracks", + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "row_span_saving": { + "n": 0.0, + "p": 0.51 + } + }, + { + "case": "C07_sky130_sW1.5_sL1", + "mode": "diffusion_only", + "rel": 0.0123, + "dW": 0.56, + "dH": 0.61, + "area_terms": { + "wider_row": -7.706, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 10.486, + "other_height": -0.0 + }, + "increase_terms": [ + "routing_tracks" + ], + "primary_mechanism": "routing_tracks", + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "row_span_saving": { + "n": 0.56, + "p": 0.56 + } + }, + { + "case": "C07_ihp130_sW2_sL1.5", + "mode": "combined", + "rel": 0.01157, + "dW": -0.145, + "dH": 0.08, + "area_terms": { + "wider_row": -6.523, + "stub_separation": 8.377, + "taller_mos_rows": -14.112, + "routing_tracks": 16.325, + "other_height": -0.0 + }, + "increase_terms": [ + "routing_tracks", + "stub_separation" + ], + "primary_mechanism": "routing_tracks", + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "row_span_saving": { + "n": 0.0, + "p": 0.51 + } + }, + { + "case": "C11_sky130_sW1.5_sL1", + "mode": "gate_only", + "rel": 0.00816, + "dW": -0.88, + "dH": -0.58, + "area_terms": { + "wider_row": 36.142, + "stub_separation": 0.0, + "taller_mos_rows": 1.179, + "routing_tracks": -23.964, + "other_height": 0.0 + }, + "increase_terms": [ + "wider_row", + "taller_mos_rows" + ], + "primary_mechanism": "wider_row", + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "row_span_saving": { + "n": 0.0, + "p": -0.88 + } + }, + { + "case": "C11_sky130_sW1_sL2", + "mode": "gate_only", + "rel": 0.00806, + "dW": -0.88, + "dH": -0.58, + "area_terms": { + "wider_row": 36.142, + "stub_separation": -0.0, + "taller_mos_rows": 1.184, + "routing_tracks": -24.074, + "other_height": 0.0 + }, + "increase_terms": [ + "wider_row", + "taller_mos_rows" + ], + "primary_mechanism": "wider_row", + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "row_span_saving": { + "n": 0.0, + "p": -0.88 + } + }, + { + "case": "C10_gf180_sW1_sL1", + "mode": "combined", + "rel": 0.00793, + "dW": -0.49, + "dH": 0.0, + "area_terms": { + "wider_row": -16.496, + "stub_separation": 26.6, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "increase_terms": [ + "stub_separation" + ], + "primary_mechanism": "stub_separation", + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "row_span_saving": { + "n": 0.8, + "p": 0.8 + } + }, + { + "case": "C07_ihp130_sW1_sL1", + "mode": "diffusion_only", + "rel": 0.0062, + "dW": 0.51, + "dH": 0.59, + "area_terms": { + "wider_row": -6.783, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 7.829, + "other_height": -0.0 + }, + "increase_terms": [ + "routing_tracks" + ], + "primary_mechanism": "routing_tracks", + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "row_span_saving": { + "n": 0.51, + "p": 0.51 + } + }, + { + "case": "C10_gf180_sW1.5_sL1", + "mode": "combined", + "rel": 0.00553, + "dW": -0.49, + "dH": 0.0, + "area_terms": { + "wider_row": -16.496, + "stub_separation": 26.6, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "increase_terms": [ + "stub_separation" + ], + "primary_mechanism": "stub_separation", + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "row_span_saving": { + "n": 0.8, + "p": 0.8 + } + } + ] + }, + "examples": { + "positive": { + "case": "C02_gf180_sW0.5_sL1", + "topology": "C02", + "pdk": "gf180", + "size": "sW0.5_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 191.923, + "A1": 156.658, + "rel": -0.18375, + "class": "positive", + "W0": 16.32, + "H0": 11.76, + "W1": 15.48, + "H1": 10.12, + "dW": 0.84, + "dH": -1.64, + "condition_lhs_H0dW": 9.8784, + "condition_rhs_W1dH": -25.3872, + "dH_mos_rows": -0.04, + "dH_channels": -1.6, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.06 + }, + "max_mos_row_span_saving": 0.06, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -0.607, + "stub_separation": -7.894, + "taller_mos_rows": -0.653, + "routing_tracks": -26.112, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/gf180/sW0.5_sL1/independent/C02_gf180_sW0p5_sL1_independent.gds", + "gds_mode": "runs/grid/C02/gf180/sW0.5_sL1/combined/C02_gf180_sW0p5_sL1_combined.gds", + "geometry_hash_ref": "aa94e3e9ffef4036", + "geometry_hash_mode": "8824cf944fdec142", + "geometry_identical": false + }, + "negative": { + "case": "C07_ihp130_sW0.5_sL1", + "topology": "C07", + "pdk": "ihp130", + "size": "sW0.5_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 103.587, + "A1": 122.464, + "rel": 0.18224, + "class": "negative", + "W0": 8.15, + "H0": 12.71, + "W1": 9.575, + "H1": 12.79, + "dW": -1.425, + "dH": 0.08, + "condition_lhs_H0dW": -18.1117, + "condition_rhs_W1dH": 0.766, + "dH_mos_rows": -0.51, + "dH_channels": 0.59, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -6.523, + "stub_separation": 24.749, + "taller_mos_rows": -4.157, + "routing_tracks": 4.808, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/ihp130/sW0.5_sL1/independent/C07_ihp130_sW0p5_sL1_independent.gds", + "gds_mode": "runs/grid/C07/ihp130/sW0.5_sL1/combined/C07_ihp130_sW0p5_sL1_combined.gds", + "geometry_hash_ref": "9302266738a5c5c8", + "geometry_hash_mode": "86f46646b4fab490", + "geometry_identical": false, + "increase_terms": [ + "stub_separation", + "routing_tracks" + ], + "primary_mechanism": "stub_separation" + }, + "passive_dominated": { + "case": "C11_gf180_sW0.5_sL1.5", + "topology": "C11", + "pdk": "gf180", + "size": "sW0.5_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1962.401, + "A1": 1962.401, + "rel": 0.0, + "class": "neutral", + "W0": 40.6, + "H0": 48.335, + "W1": 40.6, + "H1": 48.335, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.6, + "p": 1.6 + }, + "max_mos_row_span_saving": 1.6, + "widest_row_ref": "passive", + "widest_row_mode": "passive", + "passive_dominated": true, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/gf180/sW0.5_sL1.5/independent/C11_gf180_sW0p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C11/gf180/sW0.5_sL1.5/diffusion_only/C11_gf180_sW0p5_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "ae4ae1e1fe0bb5d2", + "geometry_hash_mode": "aeff2b33f8704738", + "geometry_identical": false + } + }, + "rows": [ + { + "case": "C01_gf180_sW0.5_sL1.5", + "topology": "C01", + "pdk": "gf180", + "size": "sW0.5_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 130.291, + "A1": 122.803, + "rel": -0.05747, + "class": "positive", + "W0": 13.92, + "H0": 9.36, + "W1": 13.12, + "H1": 9.36, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 7.488, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -7.488, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C01/gf180/sW0.5_sL1.5/independent/C01_gf180_sW0p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C01/gf180/sW0.5_sL1.5/diffusion_only/C01_gf180_sW0p5_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "d3664319779530c1", + "geometry_hash_mode": "21549b8e0b019b11", + "geometry_identical": false + }, + { + "case": "C01_gf180_sW0.5_sL1.5", + "topology": "C01", + "pdk": "gf180", + "size": "sW0.5_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 130.291, + "A1": 119.155, + "rel": -0.08547, + "class": "positive", + "W0": 13.92, + "H0": 9.36, + "W1": 13.92, + "H1": 8.56, + "dW": 0.0, + "dH": -0.8, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -11.136, + "dH_mos_rows": -0.8, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -11.136, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C01/gf180/sW0.5_sL1.5/independent/C01_gf180_sW0p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C01/gf180/sW0.5_sL1.5/gate_only/C01_gf180_sW0p5_sL1p5_gate_only.gds", + "geometry_hash_ref": "d3664319779530c1", + "geometry_hash_mode": "22f52cb6de6db4a6", + "geometry_identical": false + }, + { + "case": "C01_gf180_sW0.5_sL1.5", + "topology": "C01", + "pdk": "gf180", + "size": "sW0.5_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 130.291, + "A1": 112.307, + "rel": -0.13803, + "class": "positive", + "W0": 13.92, + "H0": 9.36, + "W1": 13.12, + "H1": 8.56, + "dW": 0.8, + "dH": -0.8, + "condition_lhs_H0dW": 7.488, + "condition_rhs_W1dH": -10.496, + "dH_mos_rows": -0.8, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -6.848, + "stub_separation": -0.0, + "taller_mos_rows": -11.136, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C01/gf180/sW0.5_sL1.5/independent/C01_gf180_sW0p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C01/gf180/sW0.5_sL1.5/combined/C01_gf180_sW0p5_sL1p5_combined.gds", + "geometry_hash_ref": "d3664319779530c1", + "geometry_hash_mode": "3d147bc8e123dbbc", + "geometry_identical": false + }, + { + "case": "C01_gf180_sW0.5_sL1", + "topology": "C01", + "pdk": "gf180", + "size": "sW0.5_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 109.325, + "A1": 101.837, + "rel": -0.06849, + "class": "positive", + "W0": 11.68, + "H0": 9.36, + "W1": 10.88, + "H1": 9.36, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 7.488, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -7.488, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C01/gf180/sW0.5_sL1/independent/C01_gf180_sW0p5_sL1_independent.gds", + "gds_mode": "runs/grid/C01/gf180/sW0.5_sL1/diffusion_only/C01_gf180_sW0p5_sL1_diffusion_only.gds", + "geometry_hash_ref": "2b4ab8ecd102fac8", + "geometry_hash_mode": "f80bf0064e3f7159", + "geometry_identical": false + }, + { + "case": "C01_gf180_sW0.5_sL1", + "topology": "C01", + "pdk": "gf180", + "size": "sW0.5_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 109.325, + "A1": 99.981, + "rel": -0.08547, + "class": "positive", + "W0": 11.68, + "H0": 9.36, + "W1": 11.68, + "H1": 8.56, + "dW": 0.0, + "dH": -0.8, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -9.344, + "dH_mos_rows": -0.8, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -9.344, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C01/gf180/sW0.5_sL1/independent/C01_gf180_sW0p5_sL1_independent.gds", + "gds_mode": "runs/grid/C01/gf180/sW0.5_sL1/gate_only/C01_gf180_sW0p5_sL1_gate_only.gds", + "geometry_hash_ref": "2b4ab8ecd102fac8", + "geometry_hash_mode": "f3c0228b8afbb438", + "geometry_identical": false + }, + { + "case": "C01_gf180_sW0.5_sL1", + "topology": "C01", + "pdk": "gf180", + "size": "sW0.5_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 109.325, + "A1": 93.133, + "rel": -0.14811, + "class": "positive", + "W0": 11.68, + "H0": 9.36, + "W1": 10.88, + "H1": 8.56, + "dW": 0.8, + "dH": -0.8, + "condition_lhs_H0dW": 7.488, + "condition_rhs_W1dH": -8.704, + "dH_mos_rows": -0.8, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -6.848, + "stub_separation": 0.0, + "taller_mos_rows": -9.344, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C01/gf180/sW0.5_sL1/independent/C01_gf180_sW0p5_sL1_independent.gds", + "gds_mode": "runs/grid/C01/gf180/sW0.5_sL1/combined/C01_gf180_sW0p5_sL1_combined.gds", + "geometry_hash_ref": "2b4ab8ecd102fac8", + "geometry_hash_mode": "a470c16fd9d1edbc", + "geometry_identical": false + }, + { + "case": "C01_gf180_sW0.5_sL2", + "topology": "C01", + "pdk": "gf180", + "size": "sW0.5_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 151.258, + "A1": 143.77, + "rel": -0.0495, + "class": "positive", + "W0": 16.16, + "H0": 9.36, + "W1": 15.36, + "H1": 9.36, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 7.488, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -7.488, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C01/gf180/sW0.5_sL2/independent/C01_gf180_sW0p5_sL2_independent.gds", + "gds_mode": "runs/grid/C01/gf180/sW0.5_sL2/diffusion_only/C01_gf180_sW0p5_sL2_diffusion_only.gds", + "geometry_hash_ref": "c71d3e7efab2f4a7", + "geometry_hash_mode": "bd1c26ef897faf6b", + "geometry_identical": false + }, + { + "case": "C01_gf180_sW0.5_sL2", + "topology": "C01", + "pdk": "gf180", + "size": "sW0.5_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 151.258, + "A1": 138.33, + "rel": -0.08547, + "class": "positive", + "W0": 16.16, + "H0": 9.36, + "W1": 16.16, + "H1": 8.56, + "dW": 0.0, + "dH": -0.8, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -12.928, + "dH_mos_rows": -0.8, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -12.928, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C01/gf180/sW0.5_sL2/independent/C01_gf180_sW0p5_sL2_independent.gds", + "gds_mode": "runs/grid/C01/gf180/sW0.5_sL2/gate_only/C01_gf180_sW0p5_sL2_gate_only.gds", + "geometry_hash_ref": "c71d3e7efab2f4a7", + "geometry_hash_mode": "d9719cbb4b75b29a", + "geometry_identical": false + }, + { + "case": "C01_gf180_sW0.5_sL2", + "topology": "C01", + "pdk": "gf180", + "size": "sW0.5_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 151.258, + "A1": 131.482, + "rel": -0.13074, + "class": "positive", + "W0": 16.16, + "H0": 9.36, + "W1": 15.36, + "H1": 8.56, + "dW": 0.8, + "dH": -0.8, + "condition_lhs_H0dW": 7.488, + "condition_rhs_W1dH": -12.288, + "dH_mos_rows": -0.8, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -6.848, + "stub_separation": -0.0, + "taller_mos_rows": -12.928, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C01/gf180/sW0.5_sL2/independent/C01_gf180_sW0p5_sL2_independent.gds", + "gds_mode": "runs/grid/C01/gf180/sW0.5_sL2/combined/C01_gf180_sW0p5_sL2_combined.gds", + "geometry_hash_ref": "c71d3e7efab2f4a7", + "geometry_hash_mode": "1d60fe2cf6e1e921", + "geometry_identical": false + }, + { + "case": "C01_gf180_sW1.5_sL1.5", + "topology": "C01", + "pdk": "gf180", + "size": "sW1.5_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 298.022, + "A1": 290.534, + "rel": -0.02513, + "class": "positive", + "W0": 31.84, + "H0": 9.36, + "W1": 31.04, + "H1": 9.36, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 7.488, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -7.488, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C01/gf180/sW1.5_sL1.5/independent/C01_gf180_sW1p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C01/gf180/sW1.5_sL1.5/diffusion_only/C01_gf180_sW1p5_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "9ea32e01540b7d93", + "geometry_hash_mode": "98cfb442cd595f91", + "geometry_identical": false + }, + { + "case": "C01_gf180_sW1.5_sL1.5", + "topology": "C01", + "pdk": "gf180", + "size": "sW1.5_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 298.022, + "A1": 272.55, + "rel": -0.08547, + "class": "positive", + "W0": 31.84, + "H0": 9.36, + "W1": 31.84, + "H1": 8.56, + "dW": 0.0, + "dH": -0.8, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -25.472, + "dH_mos_rows": -0.8, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -25.472, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C01/gf180/sW1.5_sL1.5/independent/C01_gf180_sW1p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C01/gf180/sW1.5_sL1.5/gate_only/C01_gf180_sW1p5_sL1p5_gate_only.gds", + "geometry_hash_ref": "9ea32e01540b7d93", + "geometry_hash_mode": "8310457413d1932c", + "geometry_identical": false + }, + { + "case": "C01_gf180_sW1.5_sL1.5", + "topology": "C01", + "pdk": "gf180", + "size": "sW1.5_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 298.022, + "A1": 265.702, + "rel": -0.10845, + "class": "positive", + "W0": 31.84, + "H0": 9.36, + "W1": 31.04, + "H1": 8.56, + "dW": 0.8, + "dH": -0.8, + "condition_lhs_H0dW": 7.488, + "condition_rhs_W1dH": -24.832, + "dH_mos_rows": -0.8, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -6.848, + "stub_separation": -0.0, + "taller_mos_rows": -25.472, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C01/gf180/sW1.5_sL1.5/independent/C01_gf180_sW1p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C01/gf180/sW1.5_sL1.5/combined/C01_gf180_sW1p5_sL1p5_combined.gds", + "geometry_hash_ref": "9ea32e01540b7d93", + "geometry_hash_mode": "ac7d6b00d62059eb", + "geometry_identical": false + }, + { + "case": "C01_gf180_sW1.5_sL1", + "topology": "C01", + "pdk": "gf180", + "size": "sW1.5_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 235.123, + "A1": 227.635, + "rel": -0.03185, + "class": "positive", + "W0": 25.12, + "H0": 9.36, + "W1": 24.32, + "H1": 9.36, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 7.488, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -7.488, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C01/gf180/sW1.5_sL1/independent/C01_gf180_sW1p5_sL1_independent.gds", + "gds_mode": "runs/grid/C01/gf180/sW1.5_sL1/diffusion_only/C01_gf180_sW1p5_sL1_diffusion_only.gds", + "geometry_hash_ref": "d7e50297dae8afd8", + "geometry_hash_mode": "3a07d079328de872", + "geometry_identical": false + }, + { + "case": "C01_gf180_sW1.5_sL1", + "topology": "C01", + "pdk": "gf180", + "size": "sW1.5_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 235.123, + "A1": 215.027, + "rel": -0.08547, + "class": "positive", + "W0": 25.12, + "H0": 9.36, + "W1": 25.12, + "H1": 8.56, + "dW": 0.0, + "dH": -0.8, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -20.096, + "dH_mos_rows": -0.8, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -20.096, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C01/gf180/sW1.5_sL1/independent/C01_gf180_sW1p5_sL1_independent.gds", + "gds_mode": "runs/grid/C01/gf180/sW1.5_sL1/gate_only/C01_gf180_sW1p5_sL1_gate_only.gds", + "geometry_hash_ref": "d7e50297dae8afd8", + "geometry_hash_mode": "67a71fc57d015911", + "geometry_identical": false + }, + { + "case": "C01_gf180_sW1.5_sL1", + "topology": "C01", + "pdk": "gf180", + "size": "sW1.5_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 235.123, + "A1": 208.179, + "rel": -0.1146, + "class": "positive", + "W0": 25.12, + "H0": 9.36, + "W1": 24.32, + "H1": 8.56, + "dW": 0.8, + "dH": -0.8, + "condition_lhs_H0dW": 7.488, + "condition_rhs_W1dH": -19.456, + "dH_mos_rows": -0.8, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -6.848, + "stub_separation": -0.0, + "taller_mos_rows": -20.096, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C01/gf180/sW1.5_sL1/independent/C01_gf180_sW1p5_sL1_independent.gds", + "gds_mode": "runs/grid/C01/gf180/sW1.5_sL1/combined/C01_gf180_sW1p5_sL1_combined.gds", + "geometry_hash_ref": "d7e50297dae8afd8", + "geometry_hash_mode": "a5bcb6a5c043a5da", + "geometry_identical": false + }, + { + "case": "C01_gf180_sW1.5_sL2", + "topology": "C01", + "pdk": "gf180", + "size": "sW1.5_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 360.922, + "A1": 353.434, + "rel": -0.02075, + "class": "positive", + "W0": 38.56, + "H0": 9.36, + "W1": 37.76, + "H1": 9.36, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 7.488, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -7.488, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C01/gf180/sW1.5_sL2/independent/C01_gf180_sW1p5_sL2_independent.gds", + "gds_mode": "runs/grid/C01/gf180/sW1.5_sL2/diffusion_only/C01_gf180_sW1p5_sL2_diffusion_only.gds", + "geometry_hash_ref": "78634670cf59242e", + "geometry_hash_mode": "5450c708b6d48876", + "geometry_identical": false + }, + { + "case": "C01_gf180_sW1.5_sL2", + "topology": "C01", + "pdk": "gf180", + "size": "sW1.5_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 360.922, + "A1": 330.074, + "rel": -0.08547, + "class": "positive", + "W0": 38.56, + "H0": 9.36, + "W1": 38.56, + "H1": 8.56, + "dW": 0.0, + "dH": -0.8, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -30.848, + "dH_mos_rows": -0.8, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -30.848, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C01/gf180/sW1.5_sL2/independent/C01_gf180_sW1p5_sL2_independent.gds", + "gds_mode": "runs/grid/C01/gf180/sW1.5_sL2/gate_only/C01_gf180_sW1p5_sL2_gate_only.gds", + "geometry_hash_ref": "78634670cf59242e", + "geometry_hash_mode": "fe4df26310b5d163", + "geometry_identical": false + }, + { + "case": "C01_gf180_sW1.5_sL2", + "topology": "C01", + "pdk": "gf180", + "size": "sW1.5_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 360.922, + "A1": 323.226, + "rel": -0.10444, + "class": "positive", + "W0": 38.56, + "H0": 9.36, + "W1": 37.76, + "H1": 8.56, + "dW": 0.8, + "dH": -0.8, + "condition_lhs_H0dW": 7.488, + "condition_rhs_W1dH": -30.208, + "dH_mos_rows": -0.8, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -6.848, + "stub_separation": -0.0, + "taller_mos_rows": -30.848, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C01/gf180/sW1.5_sL2/independent/C01_gf180_sW1p5_sL2_independent.gds", + "gds_mode": "runs/grid/C01/gf180/sW1.5_sL2/combined/C01_gf180_sW1p5_sL2_combined.gds", + "geometry_hash_ref": "78634670cf59242e", + "geometry_hash_mode": "7eba4f96cfa10d39", + "geometry_identical": false + }, + { + "case": "C01_gf180_sW1_sL1.5", + "topology": "C01", + "pdk": "gf180", + "size": "sW1_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 214.157, + "A1": 206.669, + "rel": -0.03497, + "class": "positive", + "W0": 22.88, + "H0": 9.36, + "W1": 22.08, + "H1": 9.36, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 7.488, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -7.488, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C01/gf180/sW1_sL1.5/independent/C01_gf180_sW1_sL1p5_independent.gds", + "gds_mode": "runs/grid/C01/gf180/sW1_sL1.5/diffusion_only/C01_gf180_sW1_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "fc796c32262c7ed6", + "geometry_hash_mode": "c7e5e0d5a24e9270", + "geometry_identical": false + }, + { + "case": "C01_gf180_sW1_sL1.5", + "topology": "C01", + "pdk": "gf180", + "size": "sW1_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 214.157, + "A1": 195.853, + "rel": -0.08547, + "class": "positive", + "W0": 22.88, + "H0": 9.36, + "W1": 22.88, + "H1": 8.56, + "dW": 0.0, + "dH": -0.8, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -18.304, + "dH_mos_rows": -0.8, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -18.304, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C01/gf180/sW1_sL1.5/independent/C01_gf180_sW1_sL1p5_independent.gds", + "gds_mode": "runs/grid/C01/gf180/sW1_sL1.5/gate_only/C01_gf180_sW1_sL1p5_gate_only.gds", + "geometry_hash_ref": "fc796c32262c7ed6", + "geometry_hash_mode": "de98d65314b62981", + "geometry_identical": false + }, + { + "case": "C01_gf180_sW1_sL1.5", + "topology": "C01", + "pdk": "gf180", + "size": "sW1_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 214.157, + "A1": 189.005, + "rel": -0.11745, + "class": "positive", + "W0": 22.88, + "H0": 9.36, + "W1": 22.08, + "H1": 8.56, + "dW": 0.8, + "dH": -0.8, + "condition_lhs_H0dW": 7.488, + "condition_rhs_W1dH": -17.664, + "dH_mos_rows": -0.8, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -6.848, + "stub_separation": -0.0, + "taller_mos_rows": -18.304, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C01/gf180/sW1_sL1.5/independent/C01_gf180_sW1_sL1p5_independent.gds", + "gds_mode": "runs/grid/C01/gf180/sW1_sL1.5/combined/C01_gf180_sW1_sL1p5_combined.gds", + "geometry_hash_ref": "fc796c32262c7ed6", + "geometry_hash_mode": "65d7971939e9090e", + "geometry_identical": false + }, + { + "case": "C01_gf180_sW1_sL1", + "topology": "C01", + "pdk": "gf180", + "size": "sW1_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 172.224, + "A1": 164.736, + "rel": -0.04348, + "class": "positive", + "W0": 18.4, + "H0": 9.36, + "W1": 17.6, + "H1": 9.36, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 7.488, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -7.488, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C01/gf180/sW1_sL1/independent/C01_gf180_sW1_sL1_independent.gds", + "gds_mode": "runs/grid/C01/gf180/sW1_sL1/diffusion_only/C01_gf180_sW1_sL1_diffusion_only.gds", + "geometry_hash_ref": "491228c9c4c55123", + "geometry_hash_mode": "442b5090df26e817", + "geometry_identical": false + }, + { + "case": "C01_gf180_sW1_sL1", + "topology": "C01", + "pdk": "gf180", + "size": "sW1_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 172.224, + "A1": 157.504, + "rel": -0.08547, + "class": "positive", + "W0": 18.4, + "H0": 9.36, + "W1": 18.4, + "H1": 8.56, + "dW": 0.0, + "dH": -0.8, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -14.72, + "dH_mos_rows": -0.8, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -14.72, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C01/gf180/sW1_sL1/independent/C01_gf180_sW1_sL1_independent.gds", + "gds_mode": "runs/grid/C01/gf180/sW1_sL1/gate_only/C01_gf180_sW1_sL1_gate_only.gds", + "geometry_hash_ref": "491228c9c4c55123", + "geometry_hash_mode": "531c7ec8cfe2e0db", + "geometry_identical": false + }, + { + "case": "C01_gf180_sW1_sL1", + "topology": "C01", + "pdk": "gf180", + "size": "sW1_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 172.224, + "A1": 150.656, + "rel": -0.12523, + "class": "positive", + "W0": 18.4, + "H0": 9.36, + "W1": 17.6, + "H1": 8.56, + "dW": 0.8, + "dH": -0.8, + "condition_lhs_H0dW": 7.488, + "condition_rhs_W1dH": -14.08, + "dH_mos_rows": -0.8, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -6.848, + "stub_separation": 0.0, + "taller_mos_rows": -14.72, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C01/gf180/sW1_sL1/independent/C01_gf180_sW1_sL1_independent.gds", + "gds_mode": "runs/grid/C01/gf180/sW1_sL1/combined/C01_gf180_sW1_sL1_combined.gds", + "geometry_hash_ref": "491228c9c4c55123", + "geometry_hash_mode": "d85cba42a09adffb", + "geometry_identical": false + }, + { + "case": "C01_gf180_sW1_sL2", + "topology": "C01", + "pdk": "gf180", + "size": "sW1_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 256.09, + "A1": 248.602, + "rel": -0.02924, + "class": "positive", + "W0": 27.36, + "H0": 9.36, + "W1": 26.56, + "H1": 9.36, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 7.488, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -7.488, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C01/gf180/sW1_sL2/independent/C01_gf180_sW1_sL2_independent.gds", + "gds_mode": "runs/grid/C01/gf180/sW1_sL2/diffusion_only/C01_gf180_sW1_sL2_diffusion_only.gds", + "geometry_hash_ref": "296b8c5fd15228e8", + "geometry_hash_mode": "2f2bffd32001e334", + "geometry_identical": false + }, + { + "case": "C01_gf180_sW1_sL2", + "topology": "C01", + "pdk": "gf180", + "size": "sW1_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 256.09, + "A1": 234.202, + "rel": -0.08547, + "class": "positive", + "W0": 27.36, + "H0": 9.36, + "W1": 27.36, + "H1": 8.56, + "dW": 0.0, + "dH": -0.8, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -21.888, + "dH_mos_rows": -0.8, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -21.888, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C01/gf180/sW1_sL2/independent/C01_gf180_sW1_sL2_independent.gds", + "gds_mode": "runs/grid/C01/gf180/sW1_sL2/gate_only/C01_gf180_sW1_sL2_gate_only.gds", + "geometry_hash_ref": "296b8c5fd15228e8", + "geometry_hash_mode": "c78ef3a642450b9d", + "geometry_identical": false + }, + { + "case": "C01_gf180_sW1_sL2", + "topology": "C01", + "pdk": "gf180", + "size": "sW1_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 256.09, + "A1": 227.354, + "rel": -0.11221, + "class": "positive", + "W0": 27.36, + "H0": 9.36, + "W1": 26.56, + "H1": 8.56, + "dW": 0.8, + "dH": -0.8, + "condition_lhs_H0dW": 7.488, + "condition_rhs_W1dH": -21.248, + "dH_mos_rows": -0.8, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -6.848, + "stub_separation": -0.0, + "taller_mos_rows": -21.888, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C01/gf180/sW1_sL2/independent/C01_gf180_sW1_sL2_independent.gds", + "gds_mode": "runs/grid/C01/gf180/sW1_sL2/combined/C01_gf180_sW1_sL2_combined.gds", + "geometry_hash_ref": "296b8c5fd15228e8", + "geometry_hash_mode": "46521460bbc01f8c", + "geometry_identical": false + }, + { + "case": "C01_gf180_sW2_sL1.5", + "topology": "C01", + "pdk": "gf180", + "size": "sW2_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 381.888, + "A1": 374.4, + "rel": -0.01961, + "class": "positive", + "W0": 40.8, + "H0": 9.36, + "W1": 40.0, + "H1": 9.36, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 7.488, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -7.488, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C01/gf180/sW2_sL1.5/independent/C01_gf180_sW2_sL1p5_independent.gds", + "gds_mode": "runs/grid/C01/gf180/sW2_sL1.5/diffusion_only/C01_gf180_sW2_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "9d945ec974e54c9e", + "geometry_hash_mode": "aba0beeaed184df1", + "geometry_identical": false + }, + { + "case": "C01_gf180_sW2_sL1.5", + "topology": "C01", + "pdk": "gf180", + "size": "sW2_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 381.888, + "A1": 349.248, + "rel": -0.08547, + "class": "positive", + "W0": 40.8, + "H0": 9.36, + "W1": 40.8, + "H1": 8.56, + "dW": 0.0, + "dH": -0.8, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -32.64, + "dH_mos_rows": -0.8, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -32.64, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C01/gf180/sW2_sL1.5/independent/C01_gf180_sW2_sL1p5_independent.gds", + "gds_mode": "runs/grid/C01/gf180/sW2_sL1.5/gate_only/C01_gf180_sW2_sL1p5_gate_only.gds", + "geometry_hash_ref": "9d945ec974e54c9e", + "geometry_hash_mode": "e776b518cd5750df", + "geometry_identical": false + }, + { + "case": "C01_gf180_sW2_sL1.5", + "topology": "C01", + "pdk": "gf180", + "size": "sW2_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 381.888, + "A1": 342.4, + "rel": -0.1034, + "class": "positive", + "W0": 40.8, + "H0": 9.36, + "W1": 40.0, + "H1": 8.56, + "dW": 0.8, + "dH": -0.8, + "condition_lhs_H0dW": 7.488, + "condition_rhs_W1dH": -32.0, + "dH_mos_rows": -0.8, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -6.848, + "stub_separation": 0.0, + "taller_mos_rows": -32.64, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C01/gf180/sW2_sL1.5/independent/C01_gf180_sW2_sL1p5_independent.gds", + "gds_mode": "runs/grid/C01/gf180/sW2_sL1.5/combined/C01_gf180_sW2_sL1p5_combined.gds", + "geometry_hash_ref": "9d945ec974e54c9e", + "geometry_hash_mode": "812faf3f9f262e25", + "geometry_identical": false + }, + { + "case": "C01_gf180_sW2_sL1", + "topology": "C01", + "pdk": "gf180", + "size": "sW2_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 298.022, + "A1": 290.534, + "rel": -0.02513, + "class": "positive", + "W0": 31.84, + "H0": 9.36, + "W1": 31.04, + "H1": 9.36, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 7.488, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -7.488, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C01/gf180/sW2_sL1/independent/C01_gf180_sW2_sL1_independent.gds", + "gds_mode": "runs/grid/C01/gf180/sW2_sL1/diffusion_only/C01_gf180_sW2_sL1_diffusion_only.gds", + "geometry_hash_ref": "5e2633f3adb01019", + "geometry_hash_mode": "ede973c3a730b5d5", + "geometry_identical": false + }, + { + "case": "C01_gf180_sW2_sL1", + "topology": "C01", + "pdk": "gf180", + "size": "sW2_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 298.022, + "A1": 272.55, + "rel": -0.08547, + "class": "positive", + "W0": 31.84, + "H0": 9.36, + "W1": 31.84, + "H1": 8.56, + "dW": 0.0, + "dH": -0.8, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -25.472, + "dH_mos_rows": -0.8, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -25.472, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C01/gf180/sW2_sL1/independent/C01_gf180_sW2_sL1_independent.gds", + "gds_mode": "runs/grid/C01/gf180/sW2_sL1/gate_only/C01_gf180_sW2_sL1_gate_only.gds", + "geometry_hash_ref": "5e2633f3adb01019", + "geometry_hash_mode": "aef150c41bb3a8e8", + "geometry_identical": false + }, + { + "case": "C01_gf180_sW2_sL1", + "topology": "C01", + "pdk": "gf180", + "size": "sW2_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 298.022, + "A1": 265.702, + "rel": -0.10845, + "class": "positive", + "W0": 31.84, + "H0": 9.36, + "W1": 31.04, + "H1": 8.56, + "dW": 0.8, + "dH": -0.8, + "condition_lhs_H0dW": 7.488, + "condition_rhs_W1dH": -24.832, + "dH_mos_rows": -0.8, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -6.848, + "stub_separation": -0.0, + "taller_mos_rows": -25.472, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C01/gf180/sW2_sL1/independent/C01_gf180_sW2_sL1_independent.gds", + "gds_mode": "runs/grid/C01/gf180/sW2_sL1/combined/C01_gf180_sW2_sL1_combined.gds", + "geometry_hash_ref": "5e2633f3adb01019", + "geometry_hash_mode": "10618e78927286f1", + "geometry_identical": false + }, + { + "case": "C01_gf180_sW2_sL2", + "topology": "C01", + "pdk": "gf180", + "size": "sW2_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 465.754, + "A1": 458.266, + "rel": -0.01608, + "class": "positive", + "W0": 49.76, + "H0": 9.36, + "W1": 48.96, + "H1": 9.36, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 7.488, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -7.488, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C01/gf180/sW2_sL2/independent/C01_gf180_sW2_sL2_independent.gds", + "gds_mode": "runs/grid/C01/gf180/sW2_sL2/diffusion_only/C01_gf180_sW2_sL2_diffusion_only.gds", + "geometry_hash_ref": "4399df1edb54c3e5", + "geometry_hash_mode": "b997cfbf3cf4ada9", + "geometry_identical": false + }, + { + "case": "C01_gf180_sW2_sL2", + "topology": "C01", + "pdk": "gf180", + "size": "sW2_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 465.754, + "A1": 425.946, + "rel": -0.08547, + "class": "positive", + "W0": 49.76, + "H0": 9.36, + "W1": 49.76, + "H1": 8.56, + "dW": 0.0, + "dH": -0.8, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -39.808, + "dH_mos_rows": -0.8, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -39.808, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C01/gf180/sW2_sL2/independent/C01_gf180_sW2_sL2_independent.gds", + "gds_mode": "runs/grid/C01/gf180/sW2_sL2/gate_only/C01_gf180_sW2_sL2_gate_only.gds", + "geometry_hash_ref": "4399df1edb54c3e5", + "geometry_hash_mode": "4c66245c37496ad3", + "geometry_identical": false + }, + { + "case": "C01_gf180_sW2_sL2", + "topology": "C01", + "pdk": "gf180", + "size": "sW2_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 465.754, + "A1": 419.098, + "rel": -0.10017, + "class": "positive", + "W0": 49.76, + "H0": 9.36, + "W1": 48.96, + "H1": 8.56, + "dW": 0.8, + "dH": -0.8, + "condition_lhs_H0dW": 7.488, + "condition_rhs_W1dH": -39.168, + "dH_mos_rows": -0.8, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -6.848, + "stub_separation": 0.0, + "taller_mos_rows": -39.808, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C01/gf180/sW2_sL2/independent/C01_gf180_sW2_sL2_independent.gds", + "gds_mode": "runs/grid/C01/gf180/sW2_sL2/combined/C01_gf180_sW2_sL2_combined.gds", + "geometry_hash_ref": "4399df1edb54c3e5", + "geometry_hash_mode": "07a35a2d955e1273", + "geometry_identical": false + }, + { + "case": "C01_ihp130_sW0.5_sL1.5", + "topology": "C01", + "pdk": "ihp130", + "size": "sW0.5_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 76.232, + "A1": 72.743, + "rel": -0.04576, + "class": "positive", + "W0": 11.145, + "H0": 6.84, + "W1": 10.635, + "H1": 6.84, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 3.4884, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -3.488, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C01/ihp130/sW0.5_sL1.5/independent/C01_ihp130_sW0p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C01/ihp130/sW0.5_sL1.5/diffusion_only/C01_ihp130_sW0p5_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "f77f3c33bd39710a", + "geometry_hash_mode": "0a6a5d200d1a7854", + "geometry_identical": false + }, + { + "case": "C01_ihp130_sW0.5_sL1.5", + "topology": "C01", + "pdk": "ihp130", + "size": "sW0.5_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 76.232, + "A1": 70.548, + "rel": -0.07456, + "class": "positive", + "W0": 11.145, + "H0": 6.84, + "W1": 11.145, + "H1": 6.33, + "dW": 0.0, + "dH": -0.51, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -5.6839, + "dH_mos_rows": -0.51, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -5.684, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C01/ihp130/sW0.5_sL1.5/independent/C01_ihp130_sW0p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C01/ihp130/sW0.5_sL1.5/gate_only/C01_ihp130_sW0p5_sL1p5_gate_only.gds", + "geometry_hash_ref": "f77f3c33bd39710a", + "geometry_hash_mode": "4745e425d66d9f8f", + "geometry_identical": false + }, + { + "case": "C01_ihp130_sW0.5_sL1.5", + "topology": "C01", + "pdk": "ihp130", + "size": "sW0.5_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 76.232, + "A1": 67.32, + "rel": -0.11691, + "class": "positive", + "W0": 11.145, + "H0": 6.84, + "W1": 10.635, + "H1": 6.33, + "dW": 0.51, + "dH": -0.51, + "condition_lhs_H0dW": 3.4884, + "condition_rhs_W1dH": -5.4238, + "dH_mos_rows": -0.51, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -3.228, + "stub_separation": 0.0, + "taller_mos_rows": -5.684, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C01/ihp130/sW0.5_sL1.5/independent/C01_ihp130_sW0p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C01/ihp130/sW0.5_sL1.5/combined/C01_ihp130_sW0p5_sL1p5_combined.gds", + "geometry_hash_ref": "f77f3c33bd39710a", + "geometry_hash_mode": "d12cc68d99ae6c70", + "geometry_identical": false + }, + { + "case": "C01_ihp130_sW0.5_sL1", + "topology": "C01", + "pdk": "ihp130", + "size": "sW0.5_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 62.005, + "A1": 58.516, + "rel": -0.05626, + "class": "positive", + "W0": 9.065, + "H0": 6.84, + "W1": 8.555, + "H1": 6.84, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 3.4884, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -3.488, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C01/ihp130/sW0.5_sL1/independent/C01_ihp130_sW0p5_sL1_independent.gds", + "gds_mode": "runs/grid/C01/ihp130/sW0.5_sL1/diffusion_only/C01_ihp130_sW0p5_sL1_diffusion_only.gds", + "geometry_hash_ref": "e93bc40f81d75862", + "geometry_hash_mode": "4876e191039e364c", + "geometry_identical": false + }, + { + "case": "C01_ihp130_sW0.5_sL1", + "topology": "C01", + "pdk": "ihp130", + "size": "sW0.5_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 62.005, + "A1": 57.381, + "rel": -0.07456, + "class": "positive", + "W0": 9.065, + "H0": 6.84, + "W1": 9.065, + "H1": 6.33, + "dW": 0.0, + "dH": -0.51, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -4.6231, + "dH_mos_rows": -0.51, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -4.623, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C01/ihp130/sW0.5_sL1/independent/C01_ihp130_sW0p5_sL1_independent.gds", + "gds_mode": "runs/grid/C01/ihp130/sW0.5_sL1/gate_only/C01_ihp130_sW0p5_sL1_gate_only.gds", + "geometry_hash_ref": "e93bc40f81d75862", + "geometry_hash_mode": "485f7c894eab4e37", + "geometry_identical": false + }, + { + "case": "C01_ihp130_sW0.5_sL1", + "topology": "C01", + "pdk": "ihp130", + "size": "sW0.5_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 62.005, + "A1": 54.153, + "rel": -0.12663, + "class": "positive", + "W0": 9.065, + "H0": 6.84, + "W1": 8.555, + "H1": 6.33, + "dW": 0.51, + "dH": -0.51, + "condition_lhs_H0dW": 3.4884, + "condition_rhs_W1dH": -4.363, + "dH_mos_rows": -0.51, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -3.228, + "stub_separation": 0.0, + "taller_mos_rows": -4.623, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C01/ihp130/sW0.5_sL1/independent/C01_ihp130_sW0p5_sL1_independent.gds", + "gds_mode": "runs/grid/C01/ihp130/sW0.5_sL1/combined/C01_ihp130_sW0p5_sL1_combined.gds", + "geometry_hash_ref": "e93bc40f81d75862", + "geometry_hash_mode": "21723a6e7b90e0ab", + "geometry_identical": false + }, + { + "case": "C01_ihp130_sW0.5_sL2", + "topology": "C01", + "pdk": "ihp130", + "size": "sW0.5_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 90.459, + "A1": 86.971, + "rel": -0.03856, + "class": "positive", + "W0": 13.225, + "H0": 6.84, + "W1": 12.715, + "H1": 6.84, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 3.4884, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -3.488, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C01/ihp130/sW0.5_sL2/independent/C01_ihp130_sW0p5_sL2_independent.gds", + "gds_mode": "runs/grid/C01/ihp130/sW0.5_sL2/diffusion_only/C01_ihp130_sW0p5_sL2_diffusion_only.gds", + "geometry_hash_ref": "82b84cdd1bb227b2", + "geometry_hash_mode": "bd250cb790b445cf", + "geometry_identical": false + }, + { + "case": "C01_ihp130_sW0.5_sL2", + "topology": "C01", + "pdk": "ihp130", + "size": "sW0.5_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 90.459, + "A1": 83.714, + "rel": -0.07456, + "class": "positive", + "W0": 13.225, + "H0": 6.84, + "W1": 13.225, + "H1": 6.33, + "dW": 0.0, + "dH": -0.51, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -6.7447, + "dH_mos_rows": -0.51, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -6.745, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C01/ihp130/sW0.5_sL2/independent/C01_ihp130_sW0p5_sL2_independent.gds", + "gds_mode": "runs/grid/C01/ihp130/sW0.5_sL2/gate_only/C01_ihp130_sW0p5_sL2_gate_only.gds", + "geometry_hash_ref": "82b84cdd1bb227b2", + "geometry_hash_mode": "d1de76c1deb57c25", + "geometry_identical": false + }, + { + "case": "C01_ihp130_sW0.5_sL2", + "topology": "C01", + "pdk": "ihp130", + "size": "sW0.5_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 90.459, + "A1": 80.486, + "rel": -0.11025, + "class": "positive", + "W0": 13.225, + "H0": 6.84, + "W1": 12.715, + "H1": 6.33, + "dW": 0.51, + "dH": -0.51, + "condition_lhs_H0dW": 3.4884, + "condition_rhs_W1dH": -6.4846, + "dH_mos_rows": -0.51, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -3.228, + "stub_separation": 0.0, + "taller_mos_rows": -6.745, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C01/ihp130/sW0.5_sL2/independent/C01_ihp130_sW0p5_sL2_independent.gds", + "gds_mode": "runs/grid/C01/ihp130/sW0.5_sL2/combined/C01_ihp130_sW0p5_sL2_combined.gds", + "geometry_hash_ref": "82b84cdd1bb227b2", + "geometry_hash_mode": "7f404ca25800fe00", + "geometry_identical": false + }, + { + "case": "C01_ihp130_sW1.5_sL2", + "topology": "C01", + "pdk": "ihp130", + "size": "sW1.5_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 225.07, + "A1": 221.582, + "rel": -0.0155, + "class": "positive", + "W0": 32.905, + "H0": 6.84, + "W1": 32.395, + "H1": 6.84, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 3.4884, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -3.488, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C01/ihp130/sW1.5_sL2/independent/C01_ihp130_sW1p5_sL2_independent.gds", + "gds_mode": "runs/grid/C01/ihp130/sW1.5_sL2/diffusion_only/C01_ihp130_sW1p5_sL2_diffusion_only.gds", + "geometry_hash_ref": "14ade664cd7a2647", + "geometry_hash_mode": "d1f1c12fe0c214bb", + "geometry_identical": false + }, + { + "case": "C01_ihp130_sW1.5_sL2", + "topology": "C01", + "pdk": "ihp130", + "size": "sW1.5_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 225.07, + "A1": 208.289, + "rel": -0.07456, + "class": "positive", + "W0": 32.905, + "H0": 6.84, + "W1": 32.905, + "H1": 6.33, + "dW": 0.0, + "dH": -0.51, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -16.7815, + "dH_mos_rows": -0.51, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -16.782, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C01/ihp130/sW1.5_sL2/independent/C01_ihp130_sW1p5_sL2_independent.gds", + "gds_mode": "runs/grid/C01/ihp130/sW1.5_sL2/gate_only/C01_ihp130_sW1p5_sL2_gate_only.gds", + "geometry_hash_ref": "14ade664cd7a2647", + "geometry_hash_mode": "60bcfaf05051a04e", + "geometry_identical": false + }, + { + "case": "C01_ihp130_sW1.5_sL2", + "topology": "C01", + "pdk": "ihp130", + "size": "sW1.5_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 225.07, + "A1": 205.06, + "rel": -0.0889, + "class": "positive", + "W0": 32.905, + "H0": 6.84, + "W1": 32.395, + "H1": 6.33, + "dW": 0.51, + "dH": -0.51, + "condition_lhs_H0dW": 3.4884, + "condition_rhs_W1dH": -16.5214, + "dH_mos_rows": -0.51, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -3.228, + "stub_separation": 0.0, + "taller_mos_rows": -16.782, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C01/ihp130/sW1.5_sL2/independent/C01_ihp130_sW1p5_sL2_independent.gds", + "gds_mode": "runs/grid/C01/ihp130/sW1.5_sL2/combined/C01_ihp130_sW1p5_sL2_combined.gds", + "geometry_hash_ref": "14ade664cd7a2647", + "geometry_hash_mode": "42280c5b3cff134c", + "geometry_identical": false + }, + { + "case": "C01_ihp130_sW1_sL1.5", + "topology": "C01", + "pdk": "ihp130", + "size": "sW1_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 129.31, + "A1": 125.822, + "rel": -0.02698, + "class": "positive", + "W0": 18.905, + "H0": 6.84, + "W1": 18.395, + "H1": 6.84, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 3.4884, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -3.488, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C01/ihp130/sW1_sL1.5/independent/C01_ihp130_sW1_sL1p5_independent.gds", + "gds_mode": "runs/grid/C01/ihp130/sW1_sL1.5/diffusion_only/C01_ihp130_sW1_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "f213217a92db0976", + "geometry_hash_mode": "66837070735590f2", + "geometry_identical": false + }, + { + "case": "C01_ihp130_sW1_sL1.5", + "topology": "C01", + "pdk": "ihp130", + "size": "sW1_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 129.31, + "A1": 119.669, + "rel": -0.07456, + "class": "positive", + "W0": 18.905, + "H0": 6.84, + "W1": 18.905, + "H1": 6.33, + "dW": 0.0, + "dH": -0.51, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -9.6415, + "dH_mos_rows": -0.51, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -9.642, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C01/ihp130/sW1_sL1.5/independent/C01_ihp130_sW1_sL1p5_independent.gds", + "gds_mode": "runs/grid/C01/ihp130/sW1_sL1.5/gate_only/C01_ihp130_sW1_sL1p5_gate_only.gds", + "geometry_hash_ref": "f213217a92db0976", + "geometry_hash_mode": "8d18d0d1b401c3a5", + "geometry_identical": false + }, + { + "case": "C01_ihp130_sW1_sL1.5", + "topology": "C01", + "pdk": "ihp130", + "size": "sW1_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 129.31, + "A1": 116.44, + "rel": -0.09953, + "class": "positive", + "W0": 18.905, + "H0": 6.84, + "W1": 18.395, + "H1": 6.33, + "dW": 0.51, + "dH": -0.51, + "condition_lhs_H0dW": 3.4884, + "condition_rhs_W1dH": -9.3814, + "dH_mos_rows": -0.51, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -3.228, + "stub_separation": -0.0, + "taller_mos_rows": -9.642, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C01/ihp130/sW1_sL1.5/independent/C01_ihp130_sW1_sL1p5_independent.gds", + "gds_mode": "runs/grid/C01/ihp130/sW1_sL1.5/combined/C01_ihp130_sW1_sL1p5_combined.gds", + "geometry_hash_ref": "f213217a92db0976", + "geometry_hash_mode": "6fbcb42678f34b10", + "geometry_identical": false + }, + { + "case": "C01_ihp130_sW1_sL2", + "topology": "C01", + "pdk": "ihp130", + "size": "sW1_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 157.765, + "A1": 154.276, + "rel": -0.02211, + "class": "positive", + "W0": 23.065, + "H0": 6.84, + "W1": 22.555, + "H1": 6.84, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 3.4884, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -3.488, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C01/ihp130/sW1_sL2/independent/C01_ihp130_sW1_sL2_independent.gds", + "gds_mode": "runs/grid/C01/ihp130/sW1_sL2/diffusion_only/C01_ihp130_sW1_sL2_diffusion_only.gds", + "geometry_hash_ref": "4032ed85d8c204b3", + "geometry_hash_mode": "df80e4197dd143c5", + "geometry_identical": false + }, + { + "case": "C01_ihp130_sW1_sL2", + "topology": "C01", + "pdk": "ihp130", + "size": "sW1_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 157.765, + "A1": 146.001, + "rel": -0.07456, + "class": "positive", + "W0": 23.065, + "H0": 6.84, + "W1": 23.065, + "H1": 6.33, + "dW": 0.0, + "dH": -0.51, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -11.7631, + "dH_mos_rows": -0.51, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -11.763, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C01/ihp130/sW1_sL2/independent/C01_ihp130_sW1_sL2_independent.gds", + "gds_mode": "runs/grid/C01/ihp130/sW1_sL2/gate_only/C01_ihp130_sW1_sL2_gate_only.gds", + "geometry_hash_ref": "4032ed85d8c204b3", + "geometry_hash_mode": "c1d73996a69ad5b2", + "geometry_identical": false + }, + { + "case": "C01_ihp130_sW1_sL2", + "topology": "C01", + "pdk": "ihp130", + "size": "sW1_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 157.765, + "A1": 142.773, + "rel": -0.09502, + "class": "positive", + "W0": 23.065, + "H0": 6.84, + "W1": 22.555, + "H1": 6.33, + "dW": 0.51, + "dH": -0.51, + "condition_lhs_H0dW": 3.4884, + "condition_rhs_W1dH": -11.503, + "dH_mos_rows": -0.51, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -3.228, + "stub_separation": -0.0, + "taller_mos_rows": -11.763, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C01/ihp130/sW1_sL2/independent/C01_ihp130_sW1_sL2_independent.gds", + "gds_mode": "runs/grid/C01/ihp130/sW1_sL2/combined/C01_ihp130_sW1_sL2_combined.gds", + "geometry_hash_ref": "4032ed85d8c204b3", + "geometry_hash_mode": "3698dabfb22b00f1", + "geometry_identical": false + }, + { + "case": "C01_ihp130_sW2_sL2", + "topology": "C01", + "pdk": "ihp130", + "size": "sW2_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 292.376, + "A1": 288.887, + "rel": -0.01193, + "class": "positive", + "W0": 42.745, + "H0": 6.84, + "W1": 42.235, + "H1": 6.84, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 3.4884, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -3.488, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C01/ihp130/sW2_sL2/independent/C01_ihp130_sW2_sL2_independent.gds", + "gds_mode": "runs/grid/C01/ihp130/sW2_sL2/diffusion_only/C01_ihp130_sW2_sL2_diffusion_only.gds", + "geometry_hash_ref": "808c809947f580db", + "geometry_hash_mode": "04cee5b4c4aad123", + "geometry_identical": false + }, + { + "case": "C01_ihp130_sW2_sL2", + "topology": "C01", + "pdk": "ihp130", + "size": "sW2_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 292.376, + "A1": 270.576, + "rel": -0.07456, + "class": "positive", + "W0": 42.745, + "H0": 6.84, + "W1": 42.745, + "H1": 6.33, + "dW": 0.0, + "dH": -0.51, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -21.7999, + "dH_mos_rows": -0.51, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -21.8, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C01/ihp130/sW2_sL2/independent/C01_ihp130_sW2_sL2_independent.gds", + "gds_mode": "runs/grid/C01/ihp130/sW2_sL2/gate_only/C01_ihp130_sW2_sL2_gate_only.gds", + "geometry_hash_ref": "808c809947f580db", + "geometry_hash_mode": "d9c6bbb69740052c", + "geometry_identical": false + }, + { + "case": "C01_ihp130_sW2_sL2", + "topology": "C01", + "pdk": "ihp130", + "size": "sW2_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 292.376, + "A1": 267.348, + "rel": -0.0856, + "class": "positive", + "W0": 42.745, + "H0": 6.84, + "W1": 42.235, + "H1": 6.33, + "dW": 0.51, + "dH": -0.51, + "condition_lhs_H0dW": 3.4884, + "condition_rhs_W1dH": -21.5398, + "dH_mos_rows": -0.51, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -3.228, + "stub_separation": 0.0, + "taller_mos_rows": -21.8, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C01/ihp130/sW2_sL2/independent/C01_ihp130_sW2_sL2_independent.gds", + "gds_mode": "runs/grid/C01/ihp130/sW2_sL2/combined/C01_ihp130_sW2_sL2_combined.gds", + "geometry_hash_ref": "808c809947f580db", + "geometry_hash_mode": "25c1627296a2fc1d", + "geometry_identical": false + }, + { + "case": "C01_sky130_sW0.5_sL1.5", + "topology": "C01", + "pdk": "sky130", + "size": "sW0.5_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 61.336, + "A1": 57.363, + "rel": -0.06478, + "class": "positive", + "W0": 8.645, + "H0": 7.095, + "W1": 8.085, + "H1": 7.095, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 3.9732, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -3.973, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C01/sky130/sW0.5_sL1.5/independent/C01_sky130_sW0p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C01/sky130/sW0.5_sL1.5/diffusion_only/C01_sky130_sW0p5_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "399552e4eed629a0", + "geometry_hash_mode": "70e9493d53749a21", + "geometry_identical": false + }, + { + "case": "C01_sky130_sW0.5_sL1.5", + "topology": "C01", + "pdk": "sky130", + "size": "sW0.5_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 61.336, + "A1": 56.668, + "rel": -0.07611, + "class": "positive", + "W0": 8.645, + "H0": 7.095, + "W1": 8.645, + "H1": 6.555, + "dW": 0.0, + "dH": -0.54, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -4.6683, + "dH_mos_rows": -0.54, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -4.668, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C01/sky130/sW0.5_sL1.5/independent/C01_sky130_sW0p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C01/sky130/sW0.5_sL1.5/gate_only/C01_sky130_sW0p5_sL1p5_gate_only.gds", + "geometry_hash_ref": "399552e4eed629a0", + "geometry_hash_mode": "6343d04e8bea7080", + "geometry_identical": false + }, + { + "case": "C01_sky130_sW0.5_sL1.5", + "topology": "C01", + "pdk": "sky130", + "size": "sW0.5_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 61.336, + "A1": 52.997, + "rel": -0.13596, + "class": "positive", + "W0": 8.645, + "H0": 7.095, + "W1": 8.085, + "H1": 6.555, + "dW": 0.56, + "dH": -0.54, + "condition_lhs_H0dW": 3.9732, + "condition_rhs_W1dH": -4.3659, + "dH_mos_rows": -0.54, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -3.671, + "stub_separation": 0.0, + "taller_mos_rows": -4.668, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C01/sky130/sW0.5_sL1.5/independent/C01_sky130_sW0p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C01/sky130/sW0.5_sL1.5/combined/C01_sky130_sW0p5_sL1p5_combined.gds", + "geometry_hash_ref": "399552e4eed629a0", + "geometry_hash_mode": "e32ea43d3bf61671", + "geometry_identical": false + }, + { + "case": "C01_sky130_sW0.5_sL1", + "topology": "C01", + "pdk": "sky130", + "size": "sW0.5_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 52.822, + "A1": 48.849, + "rel": -0.07522, + "class": "positive", + "W0": 7.445, + "H0": 7.095, + "W1": 6.885, + "H1": 7.095, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 3.9732, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -3.973, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C01/sky130/sW0.5_sL1/independent/C01_sky130_sW0p5_sL1_independent.gds", + "gds_mode": "runs/grid/C01/sky130/sW0.5_sL1/diffusion_only/C01_sky130_sW0p5_sL1_diffusion_only.gds", + "geometry_hash_ref": "ca912dc94fd799d8", + "geometry_hash_mode": "daf7bb4b26de2cdd", + "geometry_identical": false + }, + { + "case": "C01_sky130_sW0.5_sL1", + "topology": "C01", + "pdk": "sky130", + "size": "sW0.5_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 52.822, + "A1": 48.802, + "rel": -0.07611, + "class": "positive", + "W0": 7.445, + "H0": 7.095, + "W1": 7.445, + "H1": 6.555, + "dW": 0.0, + "dH": -0.54, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -4.0203, + "dH_mos_rows": -0.54, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -4.02, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C01/sky130/sW0.5_sL1/independent/C01_sky130_sW0p5_sL1_independent.gds", + "gds_mode": "runs/grid/C01/sky130/sW0.5_sL1/gate_only/C01_sky130_sW0p5_sL1_gate_only.gds", + "geometry_hash_ref": "ca912dc94fd799d8", + "geometry_hash_mode": "52c2f9a5cad6e4d2", + "geometry_identical": false + }, + { + "case": "C01_sky130_sW0.5_sL1", + "topology": "C01", + "pdk": "sky130", + "size": "sW0.5_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 52.822, + "A1": 45.131, + "rel": -0.1456, + "class": "positive", + "W0": 7.445, + "H0": 7.095, + "W1": 6.885, + "H1": 6.555, + "dW": 0.56, + "dH": -0.54, + "condition_lhs_H0dW": 3.9732, + "condition_rhs_W1dH": -3.7179, + "dH_mos_rows": -0.54, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -3.671, + "stub_separation": -0.0, + "taller_mos_rows": -4.02, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C01/sky130/sW0.5_sL1/independent/C01_sky130_sW0p5_sL1_independent.gds", + "gds_mode": "runs/grid/C01/sky130/sW0.5_sL1/combined/C01_sky130_sW0p5_sL1_combined.gds", + "geometry_hash_ref": "ca912dc94fd799d8", + "geometry_hash_mode": "6c75630cb8ce278f", + "geometry_identical": false + }, + { + "case": "C01_sky130_sW0.5_sL2", + "topology": "C01", + "pdk": "sky130", + "size": "sW0.5_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 69.85, + "A1": 65.877, + "rel": -0.05688, + "class": "positive", + "W0": 9.845, + "H0": 7.095, + "W1": 9.285, + "H1": 7.095, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 3.9732, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -3.973, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C01/sky130/sW0.5_sL2/independent/C01_sky130_sW0p5_sL2_independent.gds", + "gds_mode": "runs/grid/C01/sky130/sW0.5_sL2/diffusion_only/C01_sky130_sW0p5_sL2_diffusion_only.gds", + "geometry_hash_ref": "7003eb950bcb15fe", + "geometry_hash_mode": "461966cf0febc061", + "geometry_identical": false + }, + { + "case": "C01_sky130_sW0.5_sL2", + "topology": "C01", + "pdk": "sky130", + "size": "sW0.5_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 69.85, + "A1": 64.534, + "rel": -0.07611, + "class": "positive", + "W0": 9.845, + "H0": 7.095, + "W1": 9.845, + "H1": 6.555, + "dW": 0.0, + "dH": -0.54, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -5.3163, + "dH_mos_rows": -0.54, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -5.316, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C01/sky130/sW0.5_sL2/independent/C01_sky130_sW0p5_sL2_independent.gds", + "gds_mode": "runs/grid/C01/sky130/sW0.5_sL2/gate_only/C01_sky130_sW0p5_sL2_gate_only.gds", + "geometry_hash_ref": "7003eb950bcb15fe", + "geometry_hash_mode": "1b2851a4e7db9bef", + "geometry_identical": false + }, + { + "case": "C01_sky130_sW0.5_sL2", + "topology": "C01", + "pdk": "sky130", + "size": "sW0.5_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 69.85, + "A1": 60.863, + "rel": -0.12866, + "class": "positive", + "W0": 9.845, + "H0": 7.095, + "W1": 9.285, + "H1": 6.555, + "dW": 0.56, + "dH": -0.54, + "condition_lhs_H0dW": 3.9732, + "condition_rhs_W1dH": -5.0139, + "dH_mos_rows": -0.54, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -3.671, + "stub_separation": -0.0, + "taller_mos_rows": -5.316, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C01/sky130/sW0.5_sL2/independent/C01_sky130_sW0p5_sL2_independent.gds", + "gds_mode": "runs/grid/C01/sky130/sW0.5_sL2/combined/C01_sky130_sW0p5_sL2_combined.gds", + "geometry_hash_ref": "7003eb950bcb15fe", + "geometry_hash_mode": "14fb1502b20d8a0d", + "geometry_identical": false + }, + { + "case": "C01_sky130_sW1.5_sL1.5", + "topology": "C01", + "pdk": "sky130", + "size": "sW1.5_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 128.881, + "A1": 124.907, + "rel": -0.03083, + "class": "positive", + "W0": 18.165, + "H0": 7.095, + "W1": 17.605, + "H1": 7.095, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 3.9732, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -3.973, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C01/sky130/sW1.5_sL1.5/independent/C01_sky130_sW1p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C01/sky130/sW1.5_sL1.5/diffusion_only/C01_sky130_sW1p5_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "d04c5096bdaf2a86", + "geometry_hash_mode": "8cfff88f2e21cf00", + "geometry_identical": false + }, + { + "case": "C01_sky130_sW1.5_sL1.5", + "topology": "C01", + "pdk": "sky130", + "size": "sW1.5_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 128.881, + "A1": 119.072, + "rel": -0.07611, + "class": "positive", + "W0": 18.165, + "H0": 7.095, + "W1": 18.165, + "H1": 6.555, + "dW": 0.0, + "dH": -0.54, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -9.8091, + "dH_mos_rows": -0.54, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -9.809, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C01/sky130/sW1.5_sL1.5/independent/C01_sky130_sW1p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C01/sky130/sW1.5_sL1.5/gate_only/C01_sky130_sW1p5_sL1p5_gate_only.gds", + "geometry_hash_ref": "d04c5096bdaf2a86", + "geometry_hash_mode": "3a1c7c64ed0f251c", + "geometry_identical": false + }, + { + "case": "C01_sky130_sW1.5_sL1.5", + "topology": "C01", + "pdk": "sky130", + "size": "sW1.5_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 128.881, + "A1": 115.401, + "rel": -0.10459, + "class": "positive", + "W0": 18.165, + "H0": 7.095, + "W1": 17.605, + "H1": 6.555, + "dW": 0.56, + "dH": -0.54, + "condition_lhs_H0dW": 3.9732, + "condition_rhs_W1dH": -9.5067, + "dH_mos_rows": -0.54, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -3.671, + "stub_separation": 0.0, + "taller_mos_rows": -9.809, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C01/sky130/sW1.5_sL1.5/independent/C01_sky130_sW1p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C01/sky130/sW1.5_sL1.5/combined/C01_sky130_sW1p5_sL1p5_combined.gds", + "geometry_hash_ref": "d04c5096bdaf2a86", + "geometry_hash_mode": "65520e84d4799daf", + "geometry_identical": false + }, + { + "case": "C01_sky130_sW1.5_sL1", + "topology": "C01", + "pdk": "sky130", + "size": "sW1.5_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 103.339, + "A1": 99.365, + "rel": -0.03845, + "class": "positive", + "W0": 14.565, + "H0": 7.095, + "W1": 14.005, + "H1": 7.095, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 3.9732, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -3.973, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C01/sky130/sW1.5_sL1/independent/C01_sky130_sW1p5_sL1_independent.gds", + "gds_mode": "runs/grid/C01/sky130/sW1.5_sL1/diffusion_only/C01_sky130_sW1p5_sL1_diffusion_only.gds", + "geometry_hash_ref": "5a4f5fc418088ea0", + "geometry_hash_mode": "d3c977598e332d42", + "geometry_identical": false + }, + { + "case": "C01_sky130_sW1.5_sL1", + "topology": "C01", + "pdk": "sky130", + "size": "sW1.5_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 103.339, + "A1": 95.474, + "rel": -0.07611, + "class": "positive", + "W0": 14.565, + "H0": 7.095, + "W1": 14.565, + "H1": 6.555, + "dW": 0.0, + "dH": -0.54, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -7.8651, + "dH_mos_rows": -0.54, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -7.865, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C01/sky130/sW1.5_sL1/independent/C01_sky130_sW1p5_sL1_independent.gds", + "gds_mode": "runs/grid/C01/sky130/sW1.5_sL1/gate_only/C01_sky130_sW1p5_sL1_gate_only.gds", + "geometry_hash_ref": "5a4f5fc418088ea0", + "geometry_hash_mode": "a3595d5478051bf9", + "geometry_identical": false + }, + { + "case": "C01_sky130_sW1.5_sL1", + "topology": "C01", + "pdk": "sky130", + "size": "sW1.5_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 103.339, + "A1": 91.803, + "rel": -0.11163, + "class": "positive", + "W0": 14.565, + "H0": 7.095, + "W1": 14.005, + "H1": 6.555, + "dW": 0.56, + "dH": -0.54, + "condition_lhs_H0dW": 3.9732, + "condition_rhs_W1dH": -7.5627, + "dH_mos_rows": -0.54, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -3.671, + "stub_separation": 0.0, + "taller_mos_rows": -7.865, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C01/sky130/sW1.5_sL1/independent/C01_sky130_sW1p5_sL1_independent.gds", + "gds_mode": "runs/grid/C01/sky130/sW1.5_sL1/combined/C01_sky130_sW1p5_sL1_combined.gds", + "geometry_hash_ref": "5a4f5fc418088ea0", + "geometry_hash_mode": "50f1f65439c58db1", + "geometry_identical": false + }, + { + "case": "C01_sky130_sW1.5_sL2", + "topology": "C01", + "pdk": "sky130", + "size": "sW1.5_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 154.423, + "A1": 150.449, + "rel": -0.02573, + "class": "positive", + "W0": 21.765, + "H0": 7.095, + "W1": 21.205, + "H1": 7.095, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 3.9732, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -3.973, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C01/sky130/sW1.5_sL2/independent/C01_sky130_sW1p5_sL2_independent.gds", + "gds_mode": "runs/grid/C01/sky130/sW1.5_sL2/diffusion_only/C01_sky130_sW1p5_sL2_diffusion_only.gds", + "geometry_hash_ref": "b869730a80a0b128", + "geometry_hash_mode": "e30f3c9d1bc43234", + "geometry_identical": false + }, + { + "case": "C01_sky130_sW1.5_sL2", + "topology": "C01", + "pdk": "sky130", + "size": "sW1.5_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 154.423, + "A1": 142.67, + "rel": -0.07611, + "class": "positive", + "W0": 21.765, + "H0": 7.095, + "W1": 21.765, + "H1": 6.555, + "dW": 0.0, + "dH": -0.54, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -11.7531, + "dH_mos_rows": -0.54, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -11.753, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C01/sky130/sW1.5_sL2/independent/C01_sky130_sW1p5_sL2_independent.gds", + "gds_mode": "runs/grid/C01/sky130/sW1.5_sL2/gate_only/C01_sky130_sW1p5_sL2_gate_only.gds", + "geometry_hash_ref": "b869730a80a0b128", + "geometry_hash_mode": "f87114904c256fc4", + "geometry_identical": false + }, + { + "case": "C01_sky130_sW1.5_sL2", + "topology": "C01", + "pdk": "sky130", + "size": "sW1.5_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 154.423, + "A1": 138.999, + "rel": -0.09988, + "class": "positive", + "W0": 21.765, + "H0": 7.095, + "W1": 21.205, + "H1": 6.555, + "dW": 0.56, + "dH": -0.54, + "condition_lhs_H0dW": 3.9732, + "condition_rhs_W1dH": -11.4507, + "dH_mos_rows": -0.54, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -3.671, + "stub_separation": -0.0, + "taller_mos_rows": -11.753, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C01/sky130/sW1.5_sL2/independent/C01_sky130_sW1p5_sL2_independent.gds", + "gds_mode": "runs/grid/C01/sky130/sW1.5_sL2/combined/C01_sky130_sW1p5_sL2_combined.gds", + "geometry_hash_ref": "b869730a80a0b128", + "geometry_hash_mode": "45fc822c1acaa9df", + "geometry_identical": false + }, + { + "case": "C01_sky130_sW1_sL1.5", + "topology": "C01", + "pdk": "sky130", + "size": "sW1_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 95.108, + "A1": 91.135, + "rel": -0.04178, + "class": "positive", + "W0": 13.405, + "H0": 7.095, + "W1": 12.845, + "H1": 7.095, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 3.9732, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -3.973, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C01/sky130/sW1_sL1.5/independent/C01_sky130_sW1_sL1p5_independent.gds", + "gds_mode": "runs/grid/C01/sky130/sW1_sL1.5/diffusion_only/C01_sky130_sW1_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "e050c3b099c81302", + "geometry_hash_mode": "6a1ed710bc5cccba", + "geometry_identical": false + }, + { + "case": "C01_sky130_sW1_sL1.5", + "topology": "C01", + "pdk": "sky130", + "size": "sW1_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 95.108, + "A1": 87.87, + "rel": -0.07611, + "class": "positive", + "W0": 13.405, + "H0": 7.095, + "W1": 13.405, + "H1": 6.555, + "dW": 0.0, + "dH": -0.54, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -7.2387, + "dH_mos_rows": -0.54, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -7.239, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C01/sky130/sW1_sL1.5/independent/C01_sky130_sW1_sL1p5_independent.gds", + "gds_mode": "runs/grid/C01/sky130/sW1_sL1.5/gate_only/C01_sky130_sW1_sL1p5_gate_only.gds", + "geometry_hash_ref": "e050c3b099c81302", + "geometry_hash_mode": "e94ccaed7fbec379", + "geometry_identical": false + }, + { + "case": "C01_sky130_sW1_sL1.5", + "topology": "C01", + "pdk": "sky130", + "size": "sW1_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 95.108, + "A1": 84.199, + "rel": -0.11471, + "class": "positive", + "W0": 13.405, + "H0": 7.095, + "W1": 12.845, + "H1": 6.555, + "dW": 0.56, + "dH": -0.54, + "condition_lhs_H0dW": 3.9732, + "condition_rhs_W1dH": -6.9363, + "dH_mos_rows": -0.54, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -3.671, + "stub_separation": 0.0, + "taller_mos_rows": -7.239, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C01/sky130/sW1_sL1.5/independent/C01_sky130_sW1_sL1p5_independent.gds", + "gds_mode": "runs/grid/C01/sky130/sW1_sL1.5/combined/C01_sky130_sW1_sL1p5_combined.gds", + "geometry_hash_ref": "e050c3b099c81302", + "geometry_hash_mode": "46d37161466fd750", + "geometry_identical": false + }, + { + "case": "C01_sky130_sW1_sL1", + "topology": "C01", + "pdk": "sky130", + "size": "sW1_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 78.08, + "A1": 74.107, + "rel": -0.05089, + "class": "positive", + "W0": 11.005, + "H0": 7.095, + "W1": 10.445, + "H1": 7.095, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 3.9732, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -3.973, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C01/sky130/sW1_sL1/independent/C01_sky130_sW1_sL1_independent.gds", + "gds_mode": "runs/grid/C01/sky130/sW1_sL1/diffusion_only/C01_sky130_sW1_sL1_diffusion_only.gds", + "geometry_hash_ref": "a25d7ca95e302a6a", + "geometry_hash_mode": "3fc28975e8111977", + "geometry_identical": false + }, + { + "case": "C01_sky130_sW1_sL1", + "topology": "C01", + "pdk": "sky130", + "size": "sW1_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 78.08, + "A1": 72.138, + "rel": -0.07611, + "class": "positive", + "W0": 11.005, + "H0": 7.095, + "W1": 11.005, + "H1": 6.555, + "dW": 0.0, + "dH": -0.54, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -5.9427, + "dH_mos_rows": -0.54, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -5.943, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C01/sky130/sW1_sL1/independent/C01_sky130_sW1_sL1_independent.gds", + "gds_mode": "runs/grid/C01/sky130/sW1_sL1/gate_only/C01_sky130_sW1_sL1_gate_only.gds", + "geometry_hash_ref": "a25d7ca95e302a6a", + "geometry_hash_mode": "00b1a0ea97f88dad", + "geometry_identical": false + }, + { + "case": "C01_sky130_sW1_sL1", + "topology": "C01", + "pdk": "sky130", + "size": "sW1_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 78.08, + "A1": 68.467, + "rel": -0.12312, + "class": "positive", + "W0": 11.005, + "H0": 7.095, + "W1": 10.445, + "H1": 6.555, + "dW": 0.56, + "dH": -0.54, + "condition_lhs_H0dW": 3.9732, + "condition_rhs_W1dH": -5.6403, + "dH_mos_rows": -0.54, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -3.671, + "stub_separation": -0.0, + "taller_mos_rows": -5.943, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C01/sky130/sW1_sL1/independent/C01_sky130_sW1_sL1_independent.gds", + "gds_mode": "runs/grid/C01/sky130/sW1_sL1/combined/C01_sky130_sW1_sL1_combined.gds", + "geometry_hash_ref": "a25d7ca95e302a6a", + "geometry_hash_mode": "6e2f627cba7475ab", + "geometry_identical": false + }, + { + "case": "C01_sky130_sW1_sL2", + "topology": "C01", + "pdk": "sky130", + "size": "sW1_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 112.136, + "A1": 108.163, + "rel": -0.03543, + "class": "positive", + "W0": 15.805, + "H0": 7.095, + "W1": 15.245, + "H1": 7.095, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 3.9732, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -3.973, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C01/sky130/sW1_sL2/independent/C01_sky130_sW1_sL2_independent.gds", + "gds_mode": "runs/grid/C01/sky130/sW1_sL2/diffusion_only/C01_sky130_sW1_sL2_diffusion_only.gds", + "geometry_hash_ref": "a51eab2e8b3e4ec4", + "geometry_hash_mode": "36e636574f192f4c", + "geometry_identical": false + }, + { + "case": "C01_sky130_sW1_sL2", + "topology": "C01", + "pdk": "sky130", + "size": "sW1_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 112.136, + "A1": 103.602, + "rel": -0.07611, + "class": "positive", + "W0": 15.805, + "H0": 7.095, + "W1": 15.805, + "H1": 6.555, + "dW": 0.0, + "dH": -0.54, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -8.5347, + "dH_mos_rows": -0.54, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -8.535, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C01/sky130/sW1_sL2/independent/C01_sky130_sW1_sL2_independent.gds", + "gds_mode": "runs/grid/C01/sky130/sW1_sL2/gate_only/C01_sky130_sW1_sL2_gate_only.gds", + "geometry_hash_ref": "a51eab2e8b3e4ec4", + "geometry_hash_mode": "b10f7f8f72fa521a", + "geometry_identical": false + }, + { + "case": "C01_sky130_sW1_sL2", + "topology": "C01", + "pdk": "sky130", + "size": "sW1_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 112.136, + "A1": 99.931, + "rel": -0.10885, + "class": "positive", + "W0": 15.805, + "H0": 7.095, + "W1": 15.245, + "H1": 6.555, + "dW": 0.56, + "dH": -0.54, + "condition_lhs_H0dW": 3.9732, + "condition_rhs_W1dH": -8.2323, + "dH_mos_rows": -0.54, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -3.671, + "stub_separation": -0.0, + "taller_mos_rows": -8.535, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C01/sky130/sW1_sL2/independent/C01_sky130_sW1_sL2_independent.gds", + "gds_mode": "runs/grid/C01/sky130/sW1_sL2/combined/C01_sky130_sW1_sL2_combined.gds", + "geometry_hash_ref": "a51eab2e8b3e4ec4", + "geometry_hash_mode": "dab0bb0e1f453f50", + "geometry_identical": false + }, + { + "case": "C01_sky130_sW2_sL1.5", + "topology": "C01", + "pdk": "sky130", + "size": "sW2_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 162.653, + "A1": 158.68, + "rel": -0.02443, + "class": "positive", + "W0": 22.925, + "H0": 7.095, + "W1": 22.365, + "H1": 7.095, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 3.9732, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -3.973, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C01/sky130/sW2_sL1.5/independent/C01_sky130_sW2_sL1p5_independent.gds", + "gds_mode": "runs/grid/C01/sky130/sW2_sL1.5/diffusion_only/C01_sky130_sW2_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "3a5f31952470742d", + "geometry_hash_mode": "222d9a844f299dad", + "geometry_identical": false + }, + { + "case": "C01_sky130_sW2_sL1.5", + "topology": "C01", + "pdk": "sky130", + "size": "sW2_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 162.653, + "A1": 150.273, + "rel": -0.07611, + "class": "positive", + "W0": 22.925, + "H0": 7.095, + "W1": 22.925, + "H1": 6.555, + "dW": 0.0, + "dH": -0.54, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -12.3795, + "dH_mos_rows": -0.54, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -12.38, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C01/sky130/sW2_sL1.5/independent/C01_sky130_sW2_sL1p5_independent.gds", + "gds_mode": "runs/grid/C01/sky130/sW2_sL1.5/gate_only/C01_sky130_sW2_sL1p5_gate_only.gds", + "geometry_hash_ref": "3a5f31952470742d", + "geometry_hash_mode": "c6d11cd47c306992", + "geometry_identical": false + }, + { + "case": "C01_sky130_sW2_sL1.5", + "topology": "C01", + "pdk": "sky130", + "size": "sW2_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 162.653, + "A1": 146.603, + "rel": -0.09868, + "class": "positive", + "W0": 22.925, + "H0": 7.095, + "W1": 22.365, + "H1": 6.555, + "dW": 0.56, + "dH": -0.54, + "condition_lhs_H0dW": 3.9732, + "condition_rhs_W1dH": -12.0771, + "dH_mos_rows": -0.54, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -3.671, + "stub_separation": -0.0, + "taller_mos_rows": -12.38, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C01/sky130/sW2_sL1.5/independent/C01_sky130_sW2_sL1p5_independent.gds", + "gds_mode": "runs/grid/C01/sky130/sW2_sL1.5/combined/C01_sky130_sW2_sL1p5_combined.gds", + "geometry_hash_ref": "3a5f31952470742d", + "geometry_hash_mode": "39d7cbd3b7c0d702", + "geometry_identical": false + }, + { + "case": "C01_sky130_sW2_sL1", + "topology": "C01", + "pdk": "sky130", + "size": "sW2_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 128.597, + "A1": 124.624, + "rel": -0.0309, + "class": "positive", + "W0": 18.125, + "H0": 7.095, + "W1": 17.565, + "H1": 7.095, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 3.9732, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -3.973, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C01/sky130/sW2_sL1/independent/C01_sky130_sW2_sL1_independent.gds", + "gds_mode": "runs/grid/C01/sky130/sW2_sL1/diffusion_only/C01_sky130_sW2_sL1_diffusion_only.gds", + "geometry_hash_ref": "a99d8d32d0bcc2f8", + "geometry_hash_mode": "a90db4bafc2b95b7", + "geometry_identical": false + }, + { + "case": "C01_sky130_sW2_sL1", + "topology": "C01", + "pdk": "sky130", + "size": "sW2_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 128.597, + "A1": 118.809, + "rel": -0.07611, + "class": "positive", + "W0": 18.125, + "H0": 7.095, + "W1": 18.125, + "H1": 6.555, + "dW": 0.0, + "dH": -0.54, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -9.7875, + "dH_mos_rows": -0.54, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -9.788, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C01/sky130/sW2_sL1/independent/C01_sky130_sW2_sL1_independent.gds", + "gds_mode": "runs/grid/C01/sky130/sW2_sL1/gate_only/C01_sky130_sW2_sL1_gate_only.gds", + "geometry_hash_ref": "a99d8d32d0bcc2f8", + "geometry_hash_mode": "11035a5749340b14", + "geometry_identical": false + }, + { + "case": "C01_sky130_sW2_sL1", + "topology": "C01", + "pdk": "sky130", + "size": "sW2_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 128.597, + "A1": 115.139, + "rel": -0.10465, + "class": "positive", + "W0": 18.125, + "H0": 7.095, + "W1": 17.565, + "H1": 6.555, + "dW": 0.56, + "dH": -0.54, + "condition_lhs_H0dW": 3.9732, + "condition_rhs_W1dH": -9.4851, + "dH_mos_rows": -0.54, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -3.671, + "stub_separation": 0.0, + "taller_mos_rows": -9.788, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C01/sky130/sW2_sL1/independent/C01_sky130_sW2_sL1_independent.gds", + "gds_mode": "runs/grid/C01/sky130/sW2_sL1/combined/C01_sky130_sW2_sL1_combined.gds", + "geometry_hash_ref": "a99d8d32d0bcc2f8", + "geometry_hash_mode": "743acbd2e0f2a265", + "geometry_identical": false + }, + { + "case": "C01_sky130_sW2_sL2", + "topology": "C01", + "pdk": "sky130", + "size": "sW2_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 196.709, + "A1": 192.736, + "rel": -0.0202, + "class": "positive", + "W0": 27.725, + "H0": 7.095, + "W1": 27.165, + "H1": 7.095, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 3.9732, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -3.973, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C01/sky130/sW2_sL2/independent/C01_sky130_sW2_sL2_independent.gds", + "gds_mode": "runs/grid/C01/sky130/sW2_sL2/diffusion_only/C01_sky130_sW2_sL2_diffusion_only.gds", + "geometry_hash_ref": "4569b40fbb6fdfeb", + "geometry_hash_mode": "f863f0bad7eac337", + "geometry_identical": false + }, + { + "case": "C01_sky130_sW2_sL2", + "topology": "C01", + "pdk": "sky130", + "size": "sW2_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 196.709, + "A1": 181.737, + "rel": -0.07611, + "class": "positive", + "W0": 27.725, + "H0": 7.095, + "W1": 27.725, + "H1": 6.555, + "dW": 0.0, + "dH": -0.54, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -14.9715, + "dH_mos_rows": -0.54, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -14.972, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C01/sky130/sW2_sL2/independent/C01_sky130_sW2_sL2_independent.gds", + "gds_mode": "runs/grid/C01/sky130/sW2_sL2/gate_only/C01_sky130_sW2_sL2_gate_only.gds", + "geometry_hash_ref": "4569b40fbb6fdfeb", + "geometry_hash_mode": "5f97571f29405da4", + "geometry_identical": false + }, + { + "case": "C01_sky130_sW2_sL2", + "topology": "C01", + "pdk": "sky130", + "size": "sW2_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 196.709, + "A1": 178.067, + "rel": -0.09477, + "class": "positive", + "W0": 27.725, + "H0": 7.095, + "W1": 27.165, + "H1": 6.555, + "dW": 0.56, + "dH": -0.54, + "condition_lhs_H0dW": 3.9732, + "condition_rhs_W1dH": -14.6691, + "dH_mos_rows": -0.54, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -3.671, + "stub_separation": -0.0, + "taller_mos_rows": -14.972, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C01/sky130/sW2_sL2/independent/C01_sky130_sW2_sL2_independent.gds", + "gds_mode": "runs/grid/C01/sky130/sW2_sL2/combined/C01_sky130_sW2_sL2_combined.gds", + "geometry_hash_ref": "4569b40fbb6fdfeb", + "geometry_hash_mode": "27b23daf553d0bca", + "geometry_identical": false + }, + { + "case": "C02_gf180_sW0.5_sL1.5", + "topology": "C02", + "pdk": "gf180", + "size": "sW0.5_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 218.266, + "A1": 208.858, + "rel": -0.0431, + "class": "positive", + "W0": 18.56, + "H0": 11.76, + "W1": 17.76, + "H1": 11.76, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 9.408, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -9.408, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/gf180/sW0.5_sL1.5/independent/C02_gf180_sW0p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C02/gf180/sW0.5_sL1.5/diffusion_only/C02_gf180_sW0p5_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "fa24fec9f40b19b6", + "geometry_hash_mode": "05ccd627a024d5ef", + "geometry_identical": false + }, + { + "case": "C02_gf180_sW0.5_sL1.5", + "topology": "C02", + "pdk": "gf180", + "size": "sW0.5_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 218.266, + "A1": 187.422, + "rel": -0.14131, + "class": "positive", + "W0": 18.56, + "H0": 11.76, + "W1": 18.52, + "H1": 10.12, + "dW": 0.04, + "dH": -1.64, + "condition_lhs_H0dW": 0.4704, + "condition_rhs_W1dH": -30.3728, + "dH_mos_rows": -0.04, + "dH_channels": -1.6, + "dH_other": -0.0, + "row_span_saving": { + "n": -0.74 + }, + "max_mos_row_span_saving": -0.74, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 7.489, + "stub_separation": -7.894, + "taller_mos_rows": -0.742, + "routing_tracks": -29.696, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/gf180/sW0.5_sL1.5/independent/C02_gf180_sW0p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C02/gf180/sW0.5_sL1.5/gate_only/C02_gf180_sW0p5_sL1p5_gate_only.gds", + "geometry_hash_ref": "fa24fec9f40b19b6", + "geometry_hash_mode": "6761975e82e2ea7a", + "geometry_identical": false + }, + { + "case": "C02_gf180_sW0.5_sL1.5", + "topology": "C02", + "pdk": "gf180", + "size": "sW0.5_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 218.266, + "A1": 179.326, + "rel": -0.1784, + "class": "positive", + "W0": 18.56, + "H0": 11.76, + "W1": 17.72, + "H1": 10.12, + "dW": 0.84, + "dH": -1.64, + "condition_lhs_H0dW": 9.8784, + "condition_rhs_W1dH": -29.0608, + "dH_mos_rows": -0.04, + "dH_channels": -1.6, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.06 + }, + "max_mos_row_span_saving": 0.06, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -0.607, + "stub_separation": -7.894, + "taller_mos_rows": -0.742, + "routing_tracks": -29.696, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/gf180/sW0.5_sL1.5/independent/C02_gf180_sW0p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C02/gf180/sW0.5_sL1.5/combined/C02_gf180_sW0p5_sL1p5_combined.gds", + "geometry_hash_ref": "fa24fec9f40b19b6", + "geometry_hash_mode": "13d9e4bffbd06022", + "geometry_identical": false + }, + { + "case": "C02_gf180_sW0.5_sL1", + "topology": "C02", + "pdk": "gf180", + "size": "sW0.5_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 191.923, + "A1": 182.515, + "rel": -0.04902, + "class": "positive", + "W0": 16.32, + "H0": 11.76, + "W1": 15.52, + "H1": 11.76, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 9.408, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -9.408, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/gf180/sW0.5_sL1/independent/C02_gf180_sW0p5_sL1_independent.gds", + "gds_mode": "runs/grid/C02/gf180/sW0.5_sL1/diffusion_only/C02_gf180_sW0p5_sL1_diffusion_only.gds", + "geometry_hash_ref": "aa94e3e9ffef4036", + "geometry_hash_mode": "21c3d85e1b7468c8", + "geometry_identical": false + }, + { + "case": "C02_gf180_sW0.5_sL1", + "topology": "C02", + "pdk": "gf180", + "size": "sW0.5_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 191.923, + "A1": 164.754, + "rel": -0.14156, + "class": "positive", + "W0": 16.32, + "H0": 11.76, + "W1": 16.28, + "H1": 10.12, + "dW": 0.04, + "dH": -1.64, + "condition_lhs_H0dW": 0.4704, + "condition_rhs_W1dH": -26.6992, + "dH_mos_rows": -0.04, + "dH_channels": -1.6, + "dH_other": -0.0, + "row_span_saving": { + "n": -0.74 + }, + "max_mos_row_span_saving": -0.74, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 7.489, + "stub_separation": -7.894, + "taller_mos_rows": -0.653, + "routing_tracks": -26.112, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/gf180/sW0.5_sL1/independent/C02_gf180_sW0p5_sL1_independent.gds", + "gds_mode": "runs/grid/C02/gf180/sW0.5_sL1/gate_only/C02_gf180_sW0p5_sL1_gate_only.gds", + "geometry_hash_ref": "aa94e3e9ffef4036", + "geometry_hash_mode": "3940176faa23fc64", + "geometry_identical": false + }, + { + "case": "C02_gf180_sW0.5_sL1", + "topology": "C02", + "pdk": "gf180", + "size": "sW0.5_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 191.923, + "A1": 156.658, + "rel": -0.18375, + "class": "positive", + "W0": 16.32, + "H0": 11.76, + "W1": 15.48, + "H1": 10.12, + "dW": 0.84, + "dH": -1.64, + "condition_lhs_H0dW": 9.8784, + "condition_rhs_W1dH": -25.3872, + "dH_mos_rows": -0.04, + "dH_channels": -1.6, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.06 + }, + "max_mos_row_span_saving": 0.06, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -0.607, + "stub_separation": -7.894, + "taller_mos_rows": -0.653, + "routing_tracks": -26.112, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/gf180/sW0.5_sL1/independent/C02_gf180_sW0p5_sL1_independent.gds", + "gds_mode": "runs/grid/C02/gf180/sW0.5_sL1/combined/C02_gf180_sW0p5_sL1_combined.gds", + "geometry_hash_ref": "aa94e3e9ffef4036", + "geometry_hash_mode": "8824cf944fdec142", + "geometry_identical": false + }, + { + "case": "C02_gf180_sW0.5_sL2", + "topology": "C02", + "pdk": "gf180", + "size": "sW0.5_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 244.608, + "A1": 235.2, + "rel": -0.03846, + "class": "positive", + "W0": 20.8, + "H0": 11.76, + "W1": 20.0, + "H1": 11.76, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 9.408, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -9.408, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/gf180/sW0.5_sL2/independent/C02_gf180_sW0p5_sL2_independent.gds", + "gds_mode": "runs/grid/C02/gf180/sW0.5_sL2/diffusion_only/C02_gf180_sW0p5_sL2_diffusion_only.gds", + "geometry_hash_ref": "5b061f7ab578aaf8", + "geometry_hash_mode": "965f0a6c6f187e7b", + "geometry_identical": false + }, + { + "case": "C02_gf180_sW0.5_sL2", + "topology": "C02", + "pdk": "gf180", + "size": "sW0.5_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 244.608, + "A1": 210.091, + "rel": -0.14111, + "class": "positive", + "W0": 20.8, + "H0": 11.76, + "W1": 20.76, + "H1": 10.12, + "dW": 0.04, + "dH": -1.64, + "condition_lhs_H0dW": 0.4704, + "condition_rhs_W1dH": -34.0464, + "dH_mos_rows": -0.04, + "dH_channels": -1.6, + "dH_other": -0.0, + "row_span_saving": { + "n": -0.74 + }, + "max_mos_row_span_saving": -0.74, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 7.489, + "stub_separation": -7.894, + "taller_mos_rows": -0.832, + "routing_tracks": -33.28, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/gf180/sW0.5_sL2/independent/C02_gf180_sW0p5_sL2_independent.gds", + "gds_mode": "runs/grid/C02/gf180/sW0.5_sL2/gate_only/C02_gf180_sW0p5_sL2_gate_only.gds", + "geometry_hash_ref": "5b061f7ab578aaf8", + "geometry_hash_mode": "a9197f1d6cccc8ba", + "geometry_identical": false + }, + { + "case": "C02_gf180_sW0.5_sL2", + "topology": "C02", + "pdk": "gf180", + "size": "sW0.5_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 244.608, + "A1": 201.995, + "rel": -0.17421, + "class": "positive", + "W0": 20.8, + "H0": 11.76, + "W1": 19.96, + "H1": 10.12, + "dW": 0.84, + "dH": -1.64, + "condition_lhs_H0dW": 9.8784, + "condition_rhs_W1dH": -32.7344, + "dH_mos_rows": -0.04, + "dH_channels": -1.6, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.06 + }, + "max_mos_row_span_saving": 0.06, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -0.607, + "stub_separation": -7.894, + "taller_mos_rows": -0.832, + "routing_tracks": -33.28, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/gf180/sW0.5_sL2/independent/C02_gf180_sW0p5_sL2_independent.gds", + "gds_mode": "runs/grid/C02/gf180/sW0.5_sL2/combined/C02_gf180_sW0p5_sL2_combined.gds", + "geometry_hash_ref": "5b061f7ab578aaf8", + "geometry_hash_mode": "8641dfdf04d6048b", + "geometry_identical": false + }, + { + "case": "C02_gf180_sW1.5_sL1.5", + "topology": "C02", + "pdk": "gf180", + "size": "sW1.5_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 481.69, + "A1": 472.282, + "rel": -0.01953, + "class": "positive", + "W0": 40.96, + "H0": 11.76, + "W1": 40.16, + "H1": 11.76, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 9.408, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -9.408, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/gf180/sW1.5_sL1.5/independent/C02_gf180_sW1p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C02/gf180/sW1.5_sL1.5/diffusion_only/C02_gf180_sW1p5_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "702ab70db8463365", + "geometry_hash_mode": "6167c19022eefab2", + "geometry_identical": false + }, + { + "case": "C02_gf180_sW1.5_sL1.5", + "topology": "C02", + "pdk": "gf180", + "size": "sW1.5_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 481.69, + "A1": 414.11, + "rel": -0.1403, + "class": "positive", + "W0": 40.96, + "H0": 11.76, + "W1": 40.92, + "H1": 10.12, + "dW": 0.04, + "dH": -1.64, + "condition_lhs_H0dW": 0.4704, + "condition_rhs_W1dH": -67.1088, + "dH_mos_rows": -0.04, + "dH_channels": -1.6, + "dH_other": -0.0, + "row_span_saving": { + "n": -0.74 + }, + "max_mos_row_span_saving": -0.74, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 7.489, + "stub_separation": -7.894, + "taller_mos_rows": -1.638, + "routing_tracks": -65.536, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/gf180/sW1.5_sL1.5/independent/C02_gf180_sW1p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C02/gf180/sW1.5_sL1.5/gate_only/C02_gf180_sW1p5_sL1p5_gate_only.gds", + "geometry_hash_ref": "702ab70db8463365", + "geometry_hash_mode": "c8d2ab80b7cbfc38", + "geometry_identical": false + }, + { + "case": "C02_gf180_sW1.5_sL1.5", + "topology": "C02", + "pdk": "gf180", + "size": "sW1.5_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 481.69, + "A1": 406.014, + "rel": -0.1571, + "class": "positive", + "W0": 40.96, + "H0": 11.76, + "W1": 40.12, + "H1": 10.12, + "dW": 0.84, + "dH": -1.64, + "condition_lhs_H0dW": 9.8784, + "condition_rhs_W1dH": -65.7968, + "dH_mos_rows": -0.04, + "dH_channels": -1.6, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.06 + }, + "max_mos_row_span_saving": 0.06, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -0.607, + "stub_separation": -7.894, + "taller_mos_rows": -1.638, + "routing_tracks": -65.536, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/gf180/sW1.5_sL1.5/independent/C02_gf180_sW1p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C02/gf180/sW1.5_sL1.5/combined/C02_gf180_sW1p5_sL1p5_combined.gds", + "geometry_hash_ref": "702ab70db8463365", + "geometry_hash_mode": "5f516242c07d4037", + "geometry_identical": false + }, + { + "case": "C02_gf180_sW1.5_sL1", + "topology": "C02", + "pdk": "gf180", + "size": "sW1.5_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 402.662, + "A1": 393.254, + "rel": -0.02336, + "class": "positive", + "W0": 34.24, + "H0": 11.76, + "W1": 33.44, + "H1": 11.76, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 9.408, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -9.408, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/gf180/sW1.5_sL1/independent/C02_gf180_sW1p5_sL1_independent.gds", + "gds_mode": "runs/grid/C02/gf180/sW1.5_sL1/diffusion_only/C02_gf180_sW1p5_sL1_diffusion_only.gds", + "geometry_hash_ref": "f294a9819258adec", + "geometry_hash_mode": "8a73755dfdedbc69", + "geometry_identical": false + }, + { + "case": "C02_gf180_sW1.5_sL1", + "topology": "C02", + "pdk": "gf180", + "size": "sW1.5_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 402.662, + "A1": 346.104, + "rel": -0.14046, + "class": "positive", + "W0": 34.24, + "H0": 11.76, + "W1": 34.2, + "H1": 10.12, + "dW": 0.04, + "dH": -1.64, + "condition_lhs_H0dW": 0.4704, + "condition_rhs_W1dH": -56.088, + "dH_mos_rows": -0.04, + "dH_channels": -1.6, + "dH_other": -0.0, + "row_span_saving": { + "n": -0.74 + }, + "max_mos_row_span_saving": -0.74, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 7.489, + "stub_separation": -7.894, + "taller_mos_rows": -1.37, + "routing_tracks": -54.784, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/gf180/sW1.5_sL1/independent/C02_gf180_sW1p5_sL1_independent.gds", + "gds_mode": "runs/grid/C02/gf180/sW1.5_sL1/gate_only/C02_gf180_sW1p5_sL1_gate_only.gds", + "geometry_hash_ref": "f294a9819258adec", + "geometry_hash_mode": "431239bb8b526e1b", + "geometry_identical": false + }, + { + "case": "C02_gf180_sW1.5_sL1", + "topology": "C02", + "pdk": "gf180", + "size": "sW1.5_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 402.662, + "A1": 338.008, + "rel": -0.16057, + "class": "positive", + "W0": 34.24, + "H0": 11.76, + "W1": 33.4, + "H1": 10.12, + "dW": 0.84, + "dH": -1.64, + "condition_lhs_H0dW": 9.8784, + "condition_rhs_W1dH": -54.776, + "dH_mos_rows": -0.04, + "dH_channels": -1.6, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.06 + }, + "max_mos_row_span_saving": 0.06, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -0.607, + "stub_separation": -7.894, + "taller_mos_rows": -1.37, + "routing_tracks": -54.784, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/gf180/sW1.5_sL1/independent/C02_gf180_sW1p5_sL1_independent.gds", + "gds_mode": "runs/grid/C02/gf180/sW1.5_sL1/combined/C02_gf180_sW1p5_sL1_combined.gds", + "geometry_hash_ref": "f294a9819258adec", + "geometry_hash_mode": "7f50f0e22d415aae", + "geometry_identical": false + }, + { + "case": "C02_gf180_sW1.5_sL2", + "topology": "C02", + "pdk": "gf180", + "size": "sW1.5_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 560.717, + "A1": 551.309, + "rel": -0.01678, + "class": "positive", + "W0": 47.68, + "H0": 11.76, + "W1": 46.88, + "H1": 11.76, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 9.408, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -9.408, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/gf180/sW1.5_sL2/independent/C02_gf180_sW1p5_sL2_independent.gds", + "gds_mode": "runs/grid/C02/gf180/sW1.5_sL2/diffusion_only/C02_gf180_sW1p5_sL2_diffusion_only.gds", + "geometry_hash_ref": "ce43f0415726bc5e", + "geometry_hash_mode": "06f0a5241ba8104d", + "geometry_identical": false + }, + { + "case": "C02_gf180_sW1.5_sL2", + "topology": "C02", + "pdk": "gf180", + "size": "sW1.5_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 560.717, + "A1": 482.117, + "rel": -0.14018, + "class": "positive", + "W0": 47.68, + "H0": 11.76, + "W1": 47.64, + "H1": 10.12, + "dW": 0.04, + "dH": -1.64, + "condition_lhs_H0dW": 0.4704, + "condition_rhs_W1dH": -78.1296, + "dH_mos_rows": -0.04, + "dH_channels": -1.6, + "dH_other": -0.0, + "row_span_saving": { + "n": -0.74 + }, + "max_mos_row_span_saving": -0.74, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 7.489, + "stub_separation": -7.894, + "taller_mos_rows": -1.907, + "routing_tracks": -76.288, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/gf180/sW1.5_sL2/independent/C02_gf180_sW1p5_sL2_independent.gds", + "gds_mode": "runs/grid/C02/gf180/sW1.5_sL2/gate_only/C02_gf180_sW1p5_sL2_gate_only.gds", + "geometry_hash_ref": "ce43f0415726bc5e", + "geometry_hash_mode": "8cf67201b2a6903f", + "geometry_identical": false + }, + { + "case": "C02_gf180_sW1.5_sL2", + "topology": "C02", + "pdk": "gf180", + "size": "sW1.5_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 560.717, + "A1": 474.021, + "rel": -0.15462, + "class": "positive", + "W0": 47.68, + "H0": 11.76, + "W1": 46.84, + "H1": 10.12, + "dW": 0.84, + "dH": -1.64, + "condition_lhs_H0dW": 9.8784, + "condition_rhs_W1dH": -76.8176, + "dH_mos_rows": -0.04, + "dH_channels": -1.6, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.06 + }, + "max_mos_row_span_saving": 0.06, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -0.607, + "stub_separation": -7.894, + "taller_mos_rows": -1.907, + "routing_tracks": -76.288, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/gf180/sW1.5_sL2/independent/C02_gf180_sW1p5_sL2_independent.gds", + "gds_mode": "runs/grid/C02/gf180/sW1.5_sL2/combined/C02_gf180_sW1p5_sL2_combined.gds", + "geometry_hash_ref": "ce43f0415726bc5e", + "geometry_hash_mode": "4ff74e3a2247a730", + "geometry_identical": false + }, + { + "case": "C02_gf180_sW1_sL1.5", + "topology": "C02", + "pdk": "gf180", + "size": "sW1_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 349.978, + "A1": 340.57, + "rel": -0.02688, + "class": "positive", + "W0": 29.76, + "H0": 11.76, + "W1": 28.96, + "H1": 11.76, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 9.408, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -9.408, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/gf180/sW1_sL1.5/independent/C02_gf180_sW1_sL1p5_independent.gds", + "gds_mode": "runs/grid/C02/gf180/sW1_sL1.5/diffusion_only/C02_gf180_sW1_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "2d06fc989a1e7095", + "geometry_hash_mode": "25f4f02e9e76aeeb", + "geometry_identical": false + }, + { + "case": "C02_gf180_sW1_sL1.5", + "topology": "C02", + "pdk": "gf180", + "size": "sW1_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 349.978, + "A1": 300.766, + "rel": -0.14061, + "class": "positive", + "W0": 29.76, + "H0": 11.76, + "W1": 29.72, + "H1": 10.12, + "dW": 0.04, + "dH": -1.64, + "condition_lhs_H0dW": 0.4704, + "condition_rhs_W1dH": -48.7408, + "dH_mos_rows": -0.04, + "dH_channels": -1.6, + "dH_other": -0.0, + "row_span_saving": { + "n": -0.74 + }, + "max_mos_row_span_saving": -0.74, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 7.489, + "stub_separation": -7.894, + "taller_mos_rows": -1.19, + "routing_tracks": -47.616, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/gf180/sW1_sL1.5/independent/C02_gf180_sW1_sL1p5_independent.gds", + "gds_mode": "runs/grid/C02/gf180/sW1_sL1.5/gate_only/C02_gf180_sW1_sL1p5_gate_only.gds", + "geometry_hash_ref": "2d06fc989a1e7095", + "geometry_hash_mode": "699bc821504f9dd2", + "geometry_identical": false + }, + { + "case": "C02_gf180_sW1_sL1.5", + "topology": "C02", + "pdk": "gf180", + "size": "sW1_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 349.978, + "A1": 292.67, + "rel": -0.16375, + "class": "positive", + "W0": 29.76, + "H0": 11.76, + "W1": 28.92, + "H1": 10.12, + "dW": 0.84, + "dH": -1.64, + "condition_lhs_H0dW": 9.8784, + "condition_rhs_W1dH": -47.4288, + "dH_mos_rows": -0.04, + "dH_channels": -1.6, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.06 + }, + "max_mos_row_span_saving": 0.06, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -0.607, + "stub_separation": -7.894, + "taller_mos_rows": -1.19, + "routing_tracks": -47.616, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/gf180/sW1_sL1.5/independent/C02_gf180_sW1_sL1p5_independent.gds", + "gds_mode": "runs/grid/C02/gf180/sW1_sL1.5/combined/C02_gf180_sW1_sL1p5_combined.gds", + "geometry_hash_ref": "2d06fc989a1e7095", + "geometry_hash_mode": "071ec62a1ad95fb4", + "geometry_identical": false + }, + { + "case": "C02_gf180_sW1_sL1", + "topology": "C02", + "pdk": "gf180", + "size": "sW1_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 297.293, + "A1": 287.885, + "rel": -0.03165, + "class": "positive", + "W0": 25.28, + "H0": 11.76, + "W1": 24.48, + "H1": 11.76, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 9.408, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -9.408, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/gf180/sW1_sL1/independent/C02_gf180_sW1_sL1_independent.gds", + "gds_mode": "runs/grid/C02/gf180/sW1_sL1/diffusion_only/C02_gf180_sW1_sL1_diffusion_only.gds", + "geometry_hash_ref": "1adc78654fdfccf7", + "geometry_hash_mode": "80fc78fc2fc99618", + "geometry_identical": false + }, + { + "case": "C02_gf180_sW1_sL1", + "topology": "C02", + "pdk": "gf180", + "size": "sW1_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 297.293, + "A1": 255.429, + "rel": -0.14082, + "class": "positive", + "W0": 25.28, + "H0": 11.76, + "W1": 25.24, + "H1": 10.12, + "dW": 0.04, + "dH": -1.64, + "condition_lhs_H0dW": 0.4704, + "condition_rhs_W1dH": -41.3936, + "dH_mos_rows": -0.04, + "dH_channels": -1.6, + "dH_other": -0.0, + "row_span_saving": { + "n": -0.74 + }, + "max_mos_row_span_saving": -0.74, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 7.489, + "stub_separation": -7.894, + "taller_mos_rows": -1.011, + "routing_tracks": -40.448, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/gf180/sW1_sL1/independent/C02_gf180_sW1_sL1_independent.gds", + "gds_mode": "runs/grid/C02/gf180/sW1_sL1/gate_only/C02_gf180_sW1_sL1_gate_only.gds", + "geometry_hash_ref": "1adc78654fdfccf7", + "geometry_hash_mode": "7cdde7d15a1346a9", + "geometry_identical": false + }, + { + "case": "C02_gf180_sW1_sL1", + "topology": "C02", + "pdk": "gf180", + "size": "sW1_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 297.293, + "A1": 247.333, + "rel": -0.16805, + "class": "positive", + "W0": 25.28, + "H0": 11.76, + "W1": 24.44, + "H1": 10.12, + "dW": 0.84, + "dH": -1.64, + "condition_lhs_H0dW": 9.8784, + "condition_rhs_W1dH": -40.0816, + "dH_mos_rows": -0.04, + "dH_channels": -1.6, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.06 + }, + "max_mos_row_span_saving": 0.06, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -0.607, + "stub_separation": -7.894, + "taller_mos_rows": -1.011, + "routing_tracks": -40.448, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/gf180/sW1_sL1/independent/C02_gf180_sW1_sL1_independent.gds", + "gds_mode": "runs/grid/C02/gf180/sW1_sL1/combined/C02_gf180_sW1_sL1_combined.gds", + "geometry_hash_ref": "1adc78654fdfccf7", + "geometry_hash_mode": "eeacc8fa81b7a354", + "geometry_identical": false + }, + { + "case": "C02_gf180_sW1_sL2", + "topology": "C02", + "pdk": "gf180", + "size": "sW1_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 402.662, + "A1": 393.254, + "rel": -0.02336, + "class": "positive", + "W0": 34.24, + "H0": 11.76, + "W1": 33.44, + "H1": 11.76, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 9.408, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -9.408, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/gf180/sW1_sL2/independent/C02_gf180_sW1_sL2_independent.gds", + "gds_mode": "runs/grid/C02/gf180/sW1_sL2/diffusion_only/C02_gf180_sW1_sL2_diffusion_only.gds", + "geometry_hash_ref": "b3df4576c794f74a", + "geometry_hash_mode": "07d0a0abf65b5074", + "geometry_identical": false + }, + { + "case": "C02_gf180_sW1_sL2", + "topology": "C02", + "pdk": "gf180", + "size": "sW1_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 402.662, + "A1": 346.104, + "rel": -0.14046, + "class": "positive", + "W0": 34.24, + "H0": 11.76, + "W1": 34.2, + "H1": 10.12, + "dW": 0.04, + "dH": -1.64, + "condition_lhs_H0dW": 0.4704, + "condition_rhs_W1dH": -56.088, + "dH_mos_rows": -0.04, + "dH_channels": -1.6, + "dH_other": -0.0, + "row_span_saving": { + "n": -0.74 + }, + "max_mos_row_span_saving": -0.74, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 7.489, + "stub_separation": -7.894, + "taller_mos_rows": -1.37, + "routing_tracks": -54.784, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/gf180/sW1_sL2/independent/C02_gf180_sW1_sL2_independent.gds", + "gds_mode": "runs/grid/C02/gf180/sW1_sL2/gate_only/C02_gf180_sW1_sL2_gate_only.gds", + "geometry_hash_ref": "b3df4576c794f74a", + "geometry_hash_mode": "524ee3c5899e6cf9", + "geometry_identical": false + }, + { + "case": "C02_gf180_sW1_sL2", + "topology": "C02", + "pdk": "gf180", + "size": "sW1_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 402.662, + "A1": 338.008, + "rel": -0.16057, + "class": "positive", + "W0": 34.24, + "H0": 11.76, + "W1": 33.4, + "H1": 10.12, + "dW": 0.84, + "dH": -1.64, + "condition_lhs_H0dW": 9.8784, + "condition_rhs_W1dH": -54.776, + "dH_mos_rows": -0.04, + "dH_channels": -1.6, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.06 + }, + "max_mos_row_span_saving": 0.06, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -0.607, + "stub_separation": -7.894, + "taller_mos_rows": -1.37, + "routing_tracks": -54.784, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/gf180/sW1_sL2/independent/C02_gf180_sW1_sL2_independent.gds", + "gds_mode": "runs/grid/C02/gf180/sW1_sL2/combined/C02_gf180_sW1_sL2_combined.gds", + "geometry_hash_ref": "b3df4576c794f74a", + "geometry_hash_mode": "bdd2bed1dc2fd9d9", + "geometry_identical": false + }, + { + "case": "C02_gf180_sW2_sL1.5", + "topology": "C02", + "pdk": "gf180", + "size": "sW2_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 613.402, + "A1": 603.994, + "rel": -0.01534, + "class": "positive", + "W0": 52.16, + "H0": 11.76, + "W1": 51.36, + "H1": 11.76, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 9.408, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -9.408, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/gf180/sW2_sL1.5/independent/C02_gf180_sW2_sL1p5_independent.gds", + "gds_mode": "runs/grid/C02/gf180/sW2_sL1.5/diffusion_only/C02_gf180_sW2_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "0d45ad8aa9eadf32", + "geometry_hash_mode": "9ac7c562e4009f05", + "geometry_identical": false + }, + { + "case": "C02_gf180_sW2_sL1.5", + "topology": "C02", + "pdk": "gf180", + "size": "sW2_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 613.402, + "A1": 527.454, + "rel": -0.14012, + "class": "positive", + "W0": 52.16, + "H0": 11.76, + "W1": 52.12, + "H1": 10.12, + "dW": 0.04, + "dH": -1.64, + "condition_lhs_H0dW": 0.4704, + "condition_rhs_W1dH": -85.4768, + "dH_mos_rows": -0.04, + "dH_channels": -1.6, + "dH_other": -0.0, + "row_span_saving": { + "n": -0.74 + }, + "max_mos_row_span_saving": -0.74, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 7.489, + "stub_separation": -7.894, + "taller_mos_rows": -2.086, + "routing_tracks": -83.456, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/gf180/sW2_sL1.5/independent/C02_gf180_sW2_sL1p5_independent.gds", + "gds_mode": "runs/grid/C02/gf180/sW2_sL1.5/gate_only/C02_gf180_sW2_sL1p5_gate_only.gds", + "geometry_hash_ref": "0d45ad8aa9eadf32", + "geometry_hash_mode": "69257cd591732984", + "geometry_identical": false + }, + { + "case": "C02_gf180_sW2_sL1.5", + "topology": "C02", + "pdk": "gf180", + "size": "sW2_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 613.402, + "A1": 519.358, + "rel": -0.15331, + "class": "positive", + "W0": 52.16, + "H0": 11.76, + "W1": 51.32, + "H1": 10.12, + "dW": 0.84, + "dH": -1.64, + "condition_lhs_H0dW": 9.8784, + "condition_rhs_W1dH": -84.1648, + "dH_mos_rows": -0.04, + "dH_channels": -1.6, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.06 + }, + "max_mos_row_span_saving": 0.06, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -0.607, + "stub_separation": -7.894, + "taller_mos_rows": -2.086, + "routing_tracks": -83.456, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/gf180/sW2_sL1.5/independent/C02_gf180_sW2_sL1p5_independent.gds", + "gds_mode": "runs/grid/C02/gf180/sW2_sL1.5/combined/C02_gf180_sW2_sL1p5_combined.gds", + "geometry_hash_ref": "0d45ad8aa9eadf32", + "geometry_hash_mode": "7cbeb430b12c09b3", + "geometry_identical": false + }, + { + "case": "C02_gf180_sW2_sL1", + "topology": "C02", + "pdk": "gf180", + "size": "sW2_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 508.032, + "A1": 498.624, + "rel": -0.01852, + "class": "positive", + "W0": 43.2, + "H0": 11.76, + "W1": 42.4, + "H1": 11.76, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 9.408, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -9.408, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/gf180/sW2_sL1/independent/C02_gf180_sW2_sL1_independent.gds", + "gds_mode": "runs/grid/C02/gf180/sW2_sL1/diffusion_only/C02_gf180_sW2_sL1_diffusion_only.gds", + "geometry_hash_ref": "1912ab4b18892a3d", + "geometry_hash_mode": "1d13a7aa418279a7", + "geometry_identical": false + }, + { + "case": "C02_gf180_sW2_sL1", + "topology": "C02", + "pdk": "gf180", + "size": "sW2_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 508.032, + "A1": 436.779, + "rel": -0.14025, + "class": "positive", + "W0": 43.2, + "H0": 11.76, + "W1": 43.16, + "H1": 10.12, + "dW": 0.04, + "dH": -1.64, + "condition_lhs_H0dW": 0.4704, + "condition_rhs_W1dH": -70.7824, + "dH_mos_rows": -0.04, + "dH_channels": -1.6, + "dH_other": -0.0, + "row_span_saving": { + "n": -0.74 + }, + "max_mos_row_span_saving": -0.74, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 7.489, + "stub_separation": -7.894, + "taller_mos_rows": -1.728, + "routing_tracks": -69.12, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/gf180/sW2_sL1/independent/C02_gf180_sW2_sL1_independent.gds", + "gds_mode": "runs/grid/C02/gf180/sW2_sL1/gate_only/C02_gf180_sW2_sL1_gate_only.gds", + "geometry_hash_ref": "1912ab4b18892a3d", + "geometry_hash_mode": "0af15b6d95f7c2d2", + "geometry_identical": false + }, + { + "case": "C02_gf180_sW2_sL1", + "topology": "C02", + "pdk": "gf180", + "size": "sW2_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 508.032, + "A1": 428.683, + "rel": -0.15619, + "class": "positive", + "W0": 43.2, + "H0": 11.76, + "W1": 42.36, + "H1": 10.12, + "dW": 0.84, + "dH": -1.64, + "condition_lhs_H0dW": 9.8784, + "condition_rhs_W1dH": -69.4704, + "dH_mos_rows": -0.04, + "dH_channels": -1.6, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.06 + }, + "max_mos_row_span_saving": 0.06, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -0.607, + "stub_separation": -7.894, + "taller_mos_rows": -1.728, + "routing_tracks": -69.12, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/gf180/sW2_sL1/independent/C02_gf180_sW2_sL1_independent.gds", + "gds_mode": "runs/grid/C02/gf180/sW2_sL1/combined/C02_gf180_sW2_sL1_combined.gds", + "geometry_hash_ref": "1912ab4b18892a3d", + "geometry_hash_mode": "62536474f5974dd0", + "geometry_identical": false + }, + { + "case": "C02_gf180_sW2_sL2", + "topology": "C02", + "pdk": "gf180", + "size": "sW2_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 718.771, + "A1": 709.363, + "rel": -0.01309, + "class": "positive", + "W0": 61.12, + "H0": 11.76, + "W1": 60.32, + "H1": 11.76, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 9.408, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -9.408, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/gf180/sW2_sL2/independent/C02_gf180_sW2_sL2_independent.gds", + "gds_mode": "runs/grid/C02/gf180/sW2_sL2/diffusion_only/C02_gf180_sW2_sL2_diffusion_only.gds", + "geometry_hash_ref": "7da09e6eed124fb4", + "geometry_hash_mode": "abd2acbf1a857043", + "geometry_identical": false + }, + { + "case": "C02_gf180_sW2_sL2", + "topology": "C02", + "pdk": "gf180", + "size": "sW2_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 718.771, + "A1": 618.13, + "rel": -0.14002, + "class": "positive", + "W0": 61.12, + "H0": 11.76, + "W1": 61.08, + "H1": 10.12, + "dW": 0.04, + "dH": -1.64, + "condition_lhs_H0dW": 0.4704, + "condition_rhs_W1dH": -100.1712, + "dH_mos_rows": -0.04, + "dH_channels": -1.6, + "dH_other": -0.0, + "row_span_saving": { + "n": -0.74 + }, + "max_mos_row_span_saving": -0.74, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 7.489, + "stub_separation": -7.894, + "taller_mos_rows": -2.445, + "routing_tracks": -97.792, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/gf180/sW2_sL2/independent/C02_gf180_sW2_sL2_independent.gds", + "gds_mode": "runs/grid/C02/gf180/sW2_sL2/gate_only/C02_gf180_sW2_sL2_gate_only.gds", + "geometry_hash_ref": "7da09e6eed124fb4", + "geometry_hash_mode": "cc36778bb94af92d", + "geometry_identical": false + }, + { + "case": "C02_gf180_sW2_sL2", + "topology": "C02", + "pdk": "gf180", + "size": "sW2_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 718.771, + "A1": 610.034, + "rel": -0.15128, + "class": "positive", + "W0": 61.12, + "H0": 11.76, + "W1": 60.28, + "H1": 10.12, + "dW": 0.84, + "dH": -1.64, + "condition_lhs_H0dW": 9.8784, + "condition_rhs_W1dH": -98.8592, + "dH_mos_rows": -0.04, + "dH_channels": -1.6, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.06 + }, + "max_mos_row_span_saving": 0.06, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -0.607, + "stub_separation": -7.894, + "taller_mos_rows": -2.445, + "routing_tracks": -97.792, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/gf180/sW2_sL2/independent/C02_gf180_sW2_sL2_independent.gds", + "gds_mode": "runs/grid/C02/gf180/sW2_sL2/combined/C02_gf180_sW2_sL2_combined.gds", + "geometry_hash_ref": "7da09e6eed124fb4", + "geometry_hash_mode": "52d9e4d322a2477b", + "geometry_identical": false + }, + { + "case": "C02_ihp130_sW0.5_sL1.5", + "topology": "C02", + "pdk": "ihp130", + "size": "sW0.5_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 122.133, + "A1": 117.742, + "rel": -0.03595, + "class": "positive", + "W0": 14.185, + "H0": 8.61, + "W1": 13.675, + "H1": 8.61, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 4.3911, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -4.391, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/ihp130/sW0.5_sL1.5/independent/C02_ihp130_sW0p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C02/ihp130/sW0.5_sL1.5/diffusion_only/C02_ihp130_sW0p5_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "2b096824b5e064ec", + "geometry_hash_mode": "5bef6b8868bad2c8", + "geometry_identical": false + }, + { + "case": "C02_ihp130_sW0.5_sL1.5", + "topology": "C02", + "pdk": "ihp130", + "size": "sW0.5_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 122.133, + "A1": 104.74, + "rel": -0.14241, + "class": "positive", + "W0": 14.185, + "H0": 8.61, + "W1": 14.135, + "H1": 7.41, + "dW": 0.05, + "dH": -1.2, + "condition_lhs_H0dW": 0.4305, + "condition_rhs_W1dH": -16.962, + "dH_mos_rows": -0.02, + "dH_channels": -1.18, + "dH_other": 0.0, + "row_span_saving": { + "n": -0.51 + }, + "max_mos_row_span_saving": -0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 3.779, + "stub_separation": -4.15, + "taller_mos_rows": -0.284, + "routing_tracks": -16.738, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/ihp130/sW0.5_sL1.5/independent/C02_ihp130_sW0p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C02/ihp130/sW0.5_sL1.5/gate_only/C02_ihp130_sW0p5_sL1p5_gate_only.gds", + "geometry_hash_ref": "2b096824b5e064ec", + "geometry_hash_mode": "bbaf0a3de54f5535", + "geometry_identical": false + }, + { + "case": "C02_ihp130_sW0.5_sL1.5", + "topology": "C02", + "pdk": "ihp130", + "size": "sW0.5_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 122.133, + "A1": 100.961, + "rel": -0.17335, + "class": "positive", + "W0": 14.185, + "H0": 8.61, + "W1": 13.625, + "H1": 7.41, + "dW": 0.56, + "dH": -1.2, + "condition_lhs_H0dW": 4.8216, + "condition_rhs_W1dH": -16.35, + "dH_mos_rows": -0.02, + "dH_channels": -1.18, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": -4.15, + "taller_mos_rows": -0.284, + "routing_tracks": -16.738, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/ihp130/sW0.5_sL1.5/independent/C02_ihp130_sW0p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C02/ihp130/sW0.5_sL1.5/combined/C02_ihp130_sW0p5_sL1p5_combined.gds", + "geometry_hash_ref": "2b096824b5e064ec", + "geometry_hash_mode": "7a87b026ce03cf17", + "geometry_identical": false + }, + { + "case": "C02_ihp130_sW0.5_sL1", + "topology": "C02", + "pdk": "ihp130", + "size": "sW0.5_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 104.224, + "A1": 99.833, + "rel": -0.04213, + "class": "positive", + "W0": 12.105, + "H0": 8.61, + "W1": 11.595, + "H1": 8.61, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 4.3911, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -4.391, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/ihp130/sW0.5_sL1/independent/C02_ihp130_sW0p5_sL1_independent.gds", + "gds_mode": "runs/grid/C02/ihp130/sW0.5_sL1/diffusion_only/C02_ihp130_sW0p5_sL1_diffusion_only.gds", + "geometry_hash_ref": "889646eb112c5a7c", + "geometry_hash_mode": "dfd35aec5ec7d1f9", + "geometry_identical": false + }, + { + "case": "C02_ihp130_sW0.5_sL1", + "topology": "C02", + "pdk": "ihp130", + "size": "sW0.5_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 104.224, + "A1": 89.328, + "rel": -0.14293, + "class": "positive", + "W0": 12.105, + "H0": 8.61, + "W1": 12.055, + "H1": 7.41, + "dW": 0.05, + "dH": -1.2, + "condition_lhs_H0dW": 0.4305, + "condition_rhs_W1dH": -14.466, + "dH_mos_rows": -0.02, + "dH_channels": -1.18, + "dH_other": 0.0, + "row_span_saving": { + "n": -0.51 + }, + "max_mos_row_span_saving": -0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 3.779, + "stub_separation": -4.15, + "taller_mos_rows": -0.242, + "routing_tracks": -14.284, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/ihp130/sW0.5_sL1/independent/C02_ihp130_sW0p5_sL1_independent.gds", + "gds_mode": "runs/grid/C02/ihp130/sW0.5_sL1/gate_only/C02_ihp130_sW0p5_sL1_gate_only.gds", + "geometry_hash_ref": "889646eb112c5a7c", + "geometry_hash_mode": "98954861332abb28", + "geometry_identical": false + }, + { + "case": "C02_ihp130_sW0.5_sL1", + "topology": "C02", + "pdk": "ihp130", + "size": "sW0.5_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 104.224, + "A1": 85.548, + "rel": -0.17919, + "class": "positive", + "W0": 12.105, + "H0": 8.61, + "W1": 11.545, + "H1": 7.41, + "dW": 0.56, + "dH": -1.2, + "condition_lhs_H0dW": 4.8216, + "condition_rhs_W1dH": -13.854, + "dH_mos_rows": -0.02, + "dH_channels": -1.18, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": -4.15, + "taller_mos_rows": -0.242, + "routing_tracks": -14.284, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/ihp130/sW0.5_sL1/independent/C02_ihp130_sW0p5_sL1_independent.gds", + "gds_mode": "runs/grid/C02/ihp130/sW0.5_sL1/combined/C02_ihp130_sW0p5_sL1_combined.gds", + "geometry_hash_ref": "889646eb112c5a7c", + "geometry_hash_mode": "04d20257370acfc6", + "geometry_identical": false + }, + { + "case": "C02_ihp130_sW0.5_sL2", + "topology": "C02", + "pdk": "ihp130", + "size": "sW0.5_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 140.042, + "A1": 135.651, + "rel": -0.03136, + "class": "positive", + "W0": 16.265, + "H0": 8.61, + "W1": 15.755, + "H1": 8.61, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 4.3911, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -4.391, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/ihp130/sW0.5_sL2/independent/C02_ihp130_sW0p5_sL2_independent.gds", + "gds_mode": "runs/grid/C02/ihp130/sW0.5_sL2/diffusion_only/C02_ihp130_sW0p5_sL2_diffusion_only.gds", + "geometry_hash_ref": "e2fb855961e3e323", + "geometry_hash_mode": "9c58d621bff9ef56", + "geometry_identical": false + }, + { + "case": "C02_ihp130_sW0.5_sL2", + "topology": "C02", + "pdk": "ihp130", + "size": "sW0.5_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 140.042, + "A1": 120.153, + "rel": -0.14202, + "class": "positive", + "W0": 16.265, + "H0": 8.61, + "W1": 16.215, + "H1": 7.41, + "dW": 0.05, + "dH": -1.2, + "condition_lhs_H0dW": 0.4305, + "condition_rhs_W1dH": -19.458, + "dH_mos_rows": -0.02, + "dH_channels": -1.18, + "dH_other": 0.0, + "row_span_saving": { + "n": -0.51 + }, + "max_mos_row_span_saving": -0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 3.779, + "stub_separation": -4.15, + "taller_mos_rows": -0.325, + "routing_tracks": -19.193, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/ihp130/sW0.5_sL2/independent/C02_ihp130_sW0p5_sL2_independent.gds", + "gds_mode": "runs/grid/C02/ihp130/sW0.5_sL2/gate_only/C02_ihp130_sW0p5_sL2_gate_only.gds", + "geometry_hash_ref": "e2fb855961e3e323", + "geometry_hash_mode": "ae8250254b50af8d", + "geometry_identical": false + }, + { + "case": "C02_ihp130_sW0.5_sL2", + "topology": "C02", + "pdk": "ihp130", + "size": "sW0.5_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 140.042, + "A1": 116.374, + "rel": -0.169, + "class": "positive", + "W0": 16.265, + "H0": 8.61, + "W1": 15.705, + "H1": 7.41, + "dW": 0.56, + "dH": -1.2, + "condition_lhs_H0dW": 4.8216, + "condition_rhs_W1dH": -18.846, + "dH_mos_rows": -0.02, + "dH_channels": -1.18, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": -4.15, + "taller_mos_rows": -0.325, + "routing_tracks": -19.193, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/ihp130/sW0.5_sL2/independent/C02_ihp130_sW0p5_sL2_independent.gds", + "gds_mode": "runs/grid/C02/ihp130/sW0.5_sL2/combined/C02_ihp130_sW0p5_sL2_combined.gds", + "geometry_hash_ref": "e2fb855961e3e323", + "geometry_hash_mode": "6a69269a59a744e9", + "geometry_identical": false + }, + { + "case": "C02_ihp130_sW1.5_sL1.5", + "topology": "C02", + "pdk": "ihp130", + "size": "sW1.5_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 281.934, + "A1": 277.543, + "rel": -0.01557, + "class": "positive", + "W0": 32.745, + "H0": 8.61, + "W1": 32.235, + "H1": 8.61, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 4.3911, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -4.391, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/ihp130/sW1.5_sL1.5/independent/C02_ihp130_sW1p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C02/ihp130/sW1.5_sL1.5/diffusion_only/C02_ihp130_sW1p5_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "942362b9d03cce83", + "geometry_hash_mode": "3f8ebfe8d289e049", + "geometry_identical": false + }, + { + "case": "C02_ihp130_sW1.5_sL1.5", + "topology": "C02", + "pdk": "ihp130", + "size": "sW1.5_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 281.934, + "A1": 242.27, + "rel": -0.14069, + "class": "positive", + "W0": 32.745, + "H0": 8.61, + "W1": 32.695, + "H1": 7.41, + "dW": 0.05, + "dH": -1.2, + "condition_lhs_H0dW": 0.4305, + "condition_rhs_W1dH": -39.234, + "dH_mos_rows": -0.02, + "dH_channels": -1.18, + "dH_other": 0.0, + "row_span_saving": { + "n": -0.51 + }, + "max_mos_row_span_saving": -0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 3.779, + "stub_separation": -4.15, + "taller_mos_rows": -0.655, + "routing_tracks": -38.639, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/ihp130/sW1.5_sL1.5/independent/C02_ihp130_sW1p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C02/ihp130/sW1.5_sL1.5/gate_only/C02_ihp130_sW1p5_sL1p5_gate_only.gds", + "geometry_hash_ref": "942362b9d03cce83", + "geometry_hash_mode": "a3b02982d9df8061", + "geometry_identical": false + }, + { + "case": "C02_ihp130_sW1.5_sL1.5", + "topology": "C02", + "pdk": "ihp130", + "size": "sW1.5_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 281.934, + "A1": 238.491, + "rel": -0.15409, + "class": "positive", + "W0": 32.745, + "H0": 8.61, + "W1": 32.185, + "H1": 7.41, + "dW": 0.56, + "dH": -1.2, + "condition_lhs_H0dW": 4.8216, + "condition_rhs_W1dH": -38.622, + "dH_mos_rows": -0.02, + "dH_channels": -1.18, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": -4.15, + "taller_mos_rows": -0.655, + "routing_tracks": -38.639, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/ihp130/sW1.5_sL1.5/independent/C02_ihp130_sW1p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C02/ihp130/sW1.5_sL1.5/combined/C02_ihp130_sW1p5_sL1p5_combined.gds", + "geometry_hash_ref": "942362b9d03cce83", + "geometry_hash_mode": "8a6d4818e3672c9d", + "geometry_identical": false + }, + { + "case": "C02_ihp130_sW1.5_sL1", + "topology": "C02", + "pdk": "ihp130", + "size": "sW1.5_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 228.208, + "A1": 223.817, + "rel": -0.01924, + "class": "positive", + "W0": 26.505, + "H0": 8.61, + "W1": 25.995, + "H1": 8.61, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 4.3911, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -4.391, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/ihp130/sW1.5_sL1/independent/C02_ihp130_sW1p5_sL1_independent.gds", + "gds_mode": "runs/grid/C02/ihp130/sW1.5_sL1/diffusion_only/C02_ihp130_sW1p5_sL1_diffusion_only.gds", + "geometry_hash_ref": "e1a9f75300b0b651", + "geometry_hash_mode": "4e72458ad2464bae", + "geometry_identical": false + }, + { + "case": "C02_ihp130_sW1.5_sL1", + "topology": "C02", + "pdk": "ihp130", + "size": "sW1.5_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 228.208, + "A1": 196.032, + "rel": -0.141, + "class": "positive", + "W0": 26.505, + "H0": 8.61, + "W1": 26.455, + "H1": 7.41, + "dW": 0.05, + "dH": -1.2, + "condition_lhs_H0dW": 0.4305, + "condition_rhs_W1dH": -31.746, + "dH_mos_rows": -0.02, + "dH_channels": -1.18, + "dH_other": 0.0, + "row_span_saving": { + "n": -0.51 + }, + "max_mos_row_span_saving": -0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 3.779, + "stub_separation": -4.15, + "taller_mos_rows": -0.53, + "routing_tracks": -31.276, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/ihp130/sW1.5_sL1/independent/C02_ihp130_sW1p5_sL1_independent.gds", + "gds_mode": "runs/grid/C02/ihp130/sW1.5_sL1/gate_only/C02_ihp130_sW1p5_sL1_gate_only.gds", + "geometry_hash_ref": "e1a9f75300b0b651", + "geometry_hash_mode": "b2076edb7d814a9b", + "geometry_identical": false + }, + { + "case": "C02_ihp130_sW1.5_sL1", + "topology": "C02", + "pdk": "ihp130", + "size": "sW1.5_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 228.208, + "A1": 192.252, + "rel": -0.15756, + "class": "positive", + "W0": 26.505, + "H0": 8.61, + "W1": 25.945, + "H1": 7.41, + "dW": 0.56, + "dH": -1.2, + "condition_lhs_H0dW": 4.8216, + "condition_rhs_W1dH": -31.134, + "dH_mos_rows": -0.02, + "dH_channels": -1.18, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": -4.15, + "taller_mos_rows": -0.53, + "routing_tracks": -31.276, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/ihp130/sW1.5_sL1/independent/C02_ihp130_sW1p5_sL1_independent.gds", + "gds_mode": "runs/grid/C02/ihp130/sW1.5_sL1/combined/C02_ihp130_sW1p5_sL1_combined.gds", + "geometry_hash_ref": "e1a9f75300b0b651", + "geometry_hash_mode": "8945d582f8714c59", + "geometry_identical": false + }, + { + "case": "C02_ihp130_sW1.5_sL2", + "topology": "C02", + "pdk": "ihp130", + "size": "sW1.5_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 335.661, + "A1": 331.27, + "rel": -0.01308, + "class": "positive", + "W0": 38.985, + "H0": 8.61, + "W1": 38.475, + "H1": 8.61, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 4.3911, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -4.391, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/ihp130/sW1.5_sL2/independent/C02_ihp130_sW1p5_sL2_independent.gds", + "gds_mode": "runs/grid/C02/ihp130/sW1.5_sL2/diffusion_only/C02_ihp130_sW1p5_sL2_diffusion_only.gds", + "geometry_hash_ref": "eceae0f5b1f03f43", + "geometry_hash_mode": "00503cb9415b5590", + "geometry_identical": false + }, + { + "case": "C02_ihp130_sW1.5_sL2", + "topology": "C02", + "pdk": "ihp130", + "size": "sW1.5_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 335.661, + "A1": 288.508, + "rel": -0.14048, + "class": "positive", + "W0": 38.985, + "H0": 8.61, + "W1": 38.935, + "H1": 7.41, + "dW": 0.05, + "dH": -1.2, + "condition_lhs_H0dW": 0.4305, + "condition_rhs_W1dH": -46.722, + "dH_mos_rows": -0.02, + "dH_channels": -1.18, + "dH_other": 0.0, + "row_span_saving": { + "n": -0.51 + }, + "max_mos_row_span_saving": -0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 3.779, + "stub_separation": -4.15, + "taller_mos_rows": -0.78, + "routing_tracks": -46.002, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/ihp130/sW1.5_sL2/independent/C02_ihp130_sW1p5_sL2_independent.gds", + "gds_mode": "runs/grid/C02/ihp130/sW1.5_sL2/gate_only/C02_ihp130_sW1p5_sL2_gate_only.gds", + "geometry_hash_ref": "eceae0f5b1f03f43", + "geometry_hash_mode": "6de51fbe0becb2a0", + "geometry_identical": false + }, + { + "case": "C02_ihp130_sW1.5_sL2", + "topology": "C02", + "pdk": "ihp130", + "size": "sW1.5_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 335.661, + "A1": 284.729, + "rel": -0.15174, + "class": "positive", + "W0": 38.985, + "H0": 8.61, + "W1": 38.425, + "H1": 7.41, + "dW": 0.56, + "dH": -1.2, + "condition_lhs_H0dW": 4.8216, + "condition_rhs_W1dH": -46.11, + "dH_mos_rows": -0.02, + "dH_channels": -1.18, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": -4.15, + "taller_mos_rows": -0.78, + "routing_tracks": -46.002, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/ihp130/sW1.5_sL2/independent/C02_ihp130_sW1p5_sL2_independent.gds", + "gds_mode": "runs/grid/C02/ihp130/sW1.5_sL2/combined/C02_ihp130_sW1p5_sL2_combined.gds", + "geometry_hash_ref": "eceae0f5b1f03f43", + "geometry_hash_mode": "6a378ddacf40a110", + "geometry_identical": false + }, + { + "case": "C02_ihp130_sW1_sL1.5", + "topology": "C02", + "pdk": "ihp130", + "size": "sW1_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 202.034, + "A1": 197.643, + "rel": -0.02173, + "class": "positive", + "W0": 23.465, + "H0": 8.61, + "W1": 22.955, + "H1": 8.61, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 4.3911, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -4.391, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/ihp130/sW1_sL1.5/independent/C02_ihp130_sW1_sL1p5_independent.gds", + "gds_mode": "runs/grid/C02/ihp130/sW1_sL1.5/diffusion_only/C02_ihp130_sW1_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "c46f5f7ddc3a7407", + "geometry_hash_mode": "772e2e57aaa28f2f", + "geometry_identical": false + }, + { + "case": "C02_ihp130_sW1_sL1.5", + "topology": "C02", + "pdk": "ihp130", + "size": "sW1_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 202.034, + "A1": 173.505, + "rel": -0.14121, + "class": "positive", + "W0": 23.465, + "H0": 8.61, + "W1": 23.415, + "H1": 7.41, + "dW": 0.05, + "dH": -1.2, + "condition_lhs_H0dW": 0.4305, + "condition_rhs_W1dH": -28.098, + "dH_mos_rows": -0.02, + "dH_channels": -1.18, + "dH_other": 0.0, + "row_span_saving": { + "n": -0.51 + }, + "max_mos_row_span_saving": -0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 3.779, + "stub_separation": -4.15, + "taller_mos_rows": -0.469, + "routing_tracks": -27.689, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/ihp130/sW1_sL1.5/independent/C02_ihp130_sW1_sL1p5_independent.gds", + "gds_mode": "runs/grid/C02/ihp130/sW1_sL1.5/gate_only/C02_ihp130_sW1_sL1p5_gate_only.gds", + "geometry_hash_ref": "c46f5f7ddc3a7407", + "geometry_hash_mode": "ffdc6f9b0c24e25b", + "geometry_identical": false + }, + { + "case": "C02_ihp130_sW1_sL1.5", + "topology": "C02", + "pdk": "ihp130", + "size": "sW1_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 202.034, + "A1": 169.726, + "rel": -0.15991, + "class": "positive", + "W0": 23.465, + "H0": 8.61, + "W1": 22.905, + "H1": 7.41, + "dW": 0.56, + "dH": -1.2, + "condition_lhs_H0dW": 4.8216, + "condition_rhs_W1dH": -27.486, + "dH_mos_rows": -0.02, + "dH_channels": -1.18, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": -4.15, + "taller_mos_rows": -0.469, + "routing_tracks": -27.689, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/ihp130/sW1_sL1.5/independent/C02_ihp130_sW1_sL1p5_independent.gds", + "gds_mode": "runs/grid/C02/ihp130/sW1_sL1.5/combined/C02_ihp130_sW1_sL1p5_combined.gds", + "geometry_hash_ref": "c46f5f7ddc3a7407", + "geometry_hash_mode": "f9a24a232f698892", + "geometry_identical": false + }, + { + "case": "C02_ihp130_sW1_sL1", + "topology": "C02", + "pdk": "ihp130", + "size": "sW1_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 166.216, + "A1": 161.825, + "rel": -0.02642, + "class": "positive", + "W0": 19.305, + "H0": 8.61, + "W1": 18.795, + "H1": 8.61, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 4.3911, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -4.391, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/ihp130/sW1_sL1/independent/C02_ihp130_sW1_sL1_independent.gds", + "gds_mode": "runs/grid/C02/ihp130/sW1_sL1/diffusion_only/C02_ihp130_sW1_sL1_diffusion_only.gds", + "geometry_hash_ref": "30e61546ff19413d", + "geometry_hash_mode": "5d6e873e948cdf34", + "geometry_identical": false + }, + { + "case": "C02_ihp130_sW1_sL1", + "topology": "C02", + "pdk": "ihp130", + "size": "sW1_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 166.216, + "A1": 142.68, + "rel": -0.1416, + "class": "positive", + "W0": 19.305, + "H0": 8.61, + "W1": 19.255, + "H1": 7.41, + "dW": 0.05, + "dH": -1.2, + "condition_lhs_H0dW": 0.4305, + "condition_rhs_W1dH": -23.106, + "dH_mos_rows": -0.02, + "dH_channels": -1.18, + "dH_other": 0.0, + "row_span_saving": { + "n": -0.51 + }, + "max_mos_row_span_saving": -0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 3.779, + "stub_separation": -4.15, + "taller_mos_rows": -0.386, + "routing_tracks": -22.78, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/ihp130/sW1_sL1/independent/C02_ihp130_sW1_sL1_independent.gds", + "gds_mode": "runs/grid/C02/ihp130/sW1_sL1/gate_only/C02_ihp130_sW1_sL1_gate_only.gds", + "geometry_hash_ref": "30e61546ff19413d", + "geometry_hash_mode": "b853b0075328f8af", + "geometry_identical": false + }, + { + "case": "C02_ihp130_sW1_sL1", + "topology": "C02", + "pdk": "ihp130", + "size": "sW1_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 166.216, + "A1": 138.9, + "rel": -0.16434, + "class": "positive", + "W0": 19.305, + "H0": 8.61, + "W1": 18.745, + "H1": 7.41, + "dW": 0.56, + "dH": -1.2, + "condition_lhs_H0dW": 4.8216, + "condition_rhs_W1dH": -22.494, + "dH_mos_rows": -0.02, + "dH_channels": -1.18, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": -4.15, + "taller_mos_rows": -0.386, + "routing_tracks": -22.78, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/ihp130/sW1_sL1/independent/C02_ihp130_sW1_sL1_independent.gds", + "gds_mode": "runs/grid/C02/ihp130/sW1_sL1/combined/C02_ihp130_sW1_sL1_combined.gds", + "geometry_hash_ref": "30e61546ff19413d", + "geometry_hash_mode": "80022663ae6427dd", + "geometry_identical": false + }, + { + "case": "C02_ihp130_sW1_sL2", + "topology": "C02", + "pdk": "ihp130", + "size": "sW1_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 237.851, + "A1": 233.46, + "rel": -0.01846, + "class": "positive", + "W0": 27.625, + "H0": 8.61, + "W1": 27.115, + "H1": 8.61, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 4.3911, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -4.391, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/ihp130/sW1_sL2/independent/C02_ihp130_sW1_sL2_independent.gds", + "gds_mode": "runs/grid/C02/ihp130/sW1_sL2/diffusion_only/C02_ihp130_sW1_sL2_diffusion_only.gds", + "geometry_hash_ref": "3456e170b5191f10", + "geometry_hash_mode": "d347fa8edf0b2ab4", + "geometry_identical": false + }, + { + "case": "C02_ihp130_sW1_sL2", + "topology": "C02", + "pdk": "ihp130", + "size": "sW1_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 237.851, + "A1": 204.331, + "rel": -0.14093, + "class": "positive", + "W0": 27.625, + "H0": 8.61, + "W1": 27.575, + "H1": 7.41, + "dW": 0.05, + "dH": -1.2, + "condition_lhs_H0dW": 0.4305, + "condition_rhs_W1dH": -33.09, + "dH_mos_rows": -0.02, + "dH_channels": -1.18, + "dH_other": 0.0, + "row_span_saving": { + "n": -0.51 + }, + "max_mos_row_span_saving": -0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 3.779, + "stub_separation": -4.15, + "taller_mos_rows": -0.552, + "routing_tracks": -32.597, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/ihp130/sW1_sL2/independent/C02_ihp130_sW1_sL2_independent.gds", + "gds_mode": "runs/grid/C02/ihp130/sW1_sL2/gate_only/C02_ihp130_sW1_sL2_gate_only.gds", + "geometry_hash_ref": "3456e170b5191f10", + "geometry_hash_mode": "2ae8cd47e48d2790", + "geometry_identical": false + }, + { + "case": "C02_ihp130_sW1_sL2", + "topology": "C02", + "pdk": "ihp130", + "size": "sW1_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 237.851, + "A1": 200.552, + "rel": -0.15682, + "class": "positive", + "W0": 27.625, + "H0": 8.61, + "W1": 27.065, + "H1": 7.41, + "dW": 0.56, + "dH": -1.2, + "condition_lhs_H0dW": 4.8216, + "condition_rhs_W1dH": -32.478, + "dH_mos_rows": -0.02, + "dH_channels": -1.18, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": -4.15, + "taller_mos_rows": -0.552, + "routing_tracks": -32.597, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/ihp130/sW1_sL2/independent/C02_ihp130_sW1_sL2_independent.gds", + "gds_mode": "runs/grid/C02/ihp130/sW1_sL2/combined/C02_ihp130_sW1_sL2_combined.gds", + "geometry_hash_ref": "3456e170b5191f10", + "geometry_hash_mode": "f819c3342e6b7dde", + "geometry_identical": false + }, + { + "case": "C02_ihp130_sW2_sL1.5", + "topology": "C02", + "pdk": "ihp130", + "size": "sW2_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 361.835, + "A1": 357.444, + "rel": -0.01214, + "class": "positive", + "W0": 42.025, + "H0": 8.61, + "W1": 41.515, + "H1": 8.61, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 4.3911, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -4.391, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/ihp130/sW2_sL1.5/independent/C02_ihp130_sW2_sL1p5_independent.gds", + "gds_mode": "runs/grid/C02/ihp130/sW2_sL1.5/diffusion_only/C02_ihp130_sW2_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "ec22eb73a2e62d4b", + "geometry_hash_mode": "c2d806b3b31c6dda", + "geometry_identical": false + }, + { + "case": "C02_ihp130_sW2_sL1.5", + "topology": "C02", + "pdk": "ihp130", + "size": "sW2_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 361.835, + "A1": 311.035, + "rel": -0.1404, + "class": "positive", + "W0": 42.025, + "H0": 8.61, + "W1": 41.975, + "H1": 7.41, + "dW": 0.05, + "dH": -1.2, + "condition_lhs_H0dW": 0.4305, + "condition_rhs_W1dH": -50.37, + "dH_mos_rows": -0.02, + "dH_channels": -1.18, + "dH_other": 0.0, + "row_span_saving": { + "n": -0.51 + }, + "max_mos_row_span_saving": -0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 3.779, + "stub_separation": -4.15, + "taller_mos_rows": -0.841, + "routing_tracks": -49.589, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/ihp130/sW2_sL1.5/independent/C02_ihp130_sW2_sL1p5_independent.gds", + "gds_mode": "runs/grid/C02/ihp130/sW2_sL1.5/gate_only/C02_ihp130_sW2_sL1p5_gate_only.gds", + "geometry_hash_ref": "ec22eb73a2e62d4b", + "geometry_hash_mode": "aec3d6218de38283", + "geometry_identical": false + }, + { + "case": "C02_ihp130_sW2_sL1.5", + "topology": "C02", + "pdk": "ihp130", + "size": "sW2_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 361.835, + "A1": 307.256, + "rel": -0.15084, + "class": "positive", + "W0": 42.025, + "H0": 8.61, + "W1": 41.465, + "H1": 7.41, + "dW": 0.56, + "dH": -1.2, + "condition_lhs_H0dW": 4.8216, + "condition_rhs_W1dH": -49.758, + "dH_mos_rows": -0.02, + "dH_channels": -1.18, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": -4.15, + "taller_mos_rows": -0.841, + "routing_tracks": -49.589, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/ihp130/sW2_sL1.5/independent/C02_ihp130_sW2_sL1p5_independent.gds", + "gds_mode": "runs/grid/C02/ihp130/sW2_sL1.5/combined/C02_ihp130_sW2_sL1p5_combined.gds", + "geometry_hash_ref": "ec22eb73a2e62d4b", + "geometry_hash_mode": "dea5c98e69221885", + "geometry_identical": false + }, + { + "case": "C02_ihp130_sW2_sL1", + "topology": "C02", + "pdk": "ihp130", + "size": "sW2_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 290.2, + "A1": 285.809, + "rel": -0.01513, + "class": "positive", + "W0": 33.705, + "H0": 8.61, + "W1": 33.195, + "H1": 8.61, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 4.3911, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -4.391, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/ihp130/sW2_sL1/independent/C02_ihp130_sW2_sL1_independent.gds", + "gds_mode": "runs/grid/C02/ihp130/sW2_sL1/diffusion_only/C02_ihp130_sW2_sL1_diffusion_only.gds", + "geometry_hash_ref": "3174a8507d23bbda", + "geometry_hash_mode": "949022b3fb41e332", + "geometry_identical": false + }, + { + "case": "C02_ihp130_sW2_sL1", + "topology": "C02", + "pdk": "ihp130", + "size": "sW2_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 290.2, + "A1": 249.384, + "rel": -0.14065, + "class": "positive", + "W0": 33.705, + "H0": 8.61, + "W1": 33.655, + "H1": 7.41, + "dW": 0.05, + "dH": -1.2, + "condition_lhs_H0dW": 0.4305, + "condition_rhs_W1dH": -40.386, + "dH_mos_rows": -0.02, + "dH_channels": -1.18, + "dH_other": 0.0, + "row_span_saving": { + "n": -0.51 + }, + "max_mos_row_span_saving": -0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 3.779, + "stub_separation": -4.15, + "taller_mos_rows": -0.674, + "routing_tracks": -39.772, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/ihp130/sW2_sL1/independent/C02_ihp130_sW2_sL1_independent.gds", + "gds_mode": "runs/grid/C02/ihp130/sW2_sL1/gate_only/C02_ihp130_sW2_sL1_gate_only.gds", + "geometry_hash_ref": "3174a8507d23bbda", + "geometry_hash_mode": "83ca7a22142be3fa", + "geometry_identical": false + }, + { + "case": "C02_ihp130_sW2_sL1", + "topology": "C02", + "pdk": "ihp130", + "size": "sW2_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 290.2, + "A1": 245.604, + "rel": -0.15367, + "class": "positive", + "W0": 33.705, + "H0": 8.61, + "W1": 33.145, + "H1": 7.41, + "dW": 0.56, + "dH": -1.2, + "condition_lhs_H0dW": 4.8216, + "condition_rhs_W1dH": -39.774, + "dH_mos_rows": -0.02, + "dH_channels": -1.18, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": -4.15, + "taller_mos_rows": -0.674, + "routing_tracks": -39.772, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/ihp130/sW2_sL1/independent/C02_ihp130_sW2_sL1_independent.gds", + "gds_mode": "runs/grid/C02/ihp130/sW2_sL1/combined/C02_ihp130_sW2_sL1_combined.gds", + "geometry_hash_ref": "3174a8507d23bbda", + "geometry_hash_mode": "514bba968c2ae7d2", + "geometry_identical": false + }, + { + "case": "C02_ihp130_sW2_sL2", + "topology": "C02", + "pdk": "ihp130", + "size": "sW2_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 433.47, + "A1": 429.079, + "rel": -0.01013, + "class": "positive", + "W0": 50.345, + "H0": 8.61, + "W1": 49.835, + "H1": 8.61, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 4.3911, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -4.391, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/ihp130/sW2_sL2/independent/C02_ihp130_sW2_sL2_independent.gds", + "gds_mode": "runs/grid/C02/ihp130/sW2_sL2/diffusion_only/C02_ihp130_sW2_sL2_diffusion_only.gds", + "geometry_hash_ref": "82de2a002e0911f7", + "geometry_hash_mode": "a17f3d25e37eeca8", + "geometry_identical": false + }, + { + "case": "C02_ihp130_sW2_sL2", + "topology": "C02", + "pdk": "ihp130", + "size": "sW2_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 433.47, + "A1": 372.686, + "rel": -0.14023, + "class": "positive", + "W0": 50.345, + "H0": 8.61, + "W1": 50.295, + "H1": 7.41, + "dW": 0.05, + "dH": -1.2, + "condition_lhs_H0dW": 0.4305, + "condition_rhs_W1dH": -60.354, + "dH_mos_rows": -0.02, + "dH_channels": -1.18, + "dH_other": 0.0, + "row_span_saving": { + "n": -0.51 + }, + "max_mos_row_span_saving": -0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 3.779, + "stub_separation": -4.15, + "taller_mos_rows": -1.007, + "routing_tracks": -59.407, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/ihp130/sW2_sL2/independent/C02_ihp130_sW2_sL2_independent.gds", + "gds_mode": "runs/grid/C02/ihp130/sW2_sL2/gate_only/C02_ihp130_sW2_sL2_gate_only.gds", + "geometry_hash_ref": "82de2a002e0911f7", + "geometry_hash_mode": "480720f1222929e3", + "geometry_identical": false + }, + { + "case": "C02_ihp130_sW2_sL2", + "topology": "C02", + "pdk": "ihp130", + "size": "sW2_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 433.47, + "A1": 368.907, + "rel": -0.14895, + "class": "positive", + "W0": 50.345, + "H0": 8.61, + "W1": 49.785, + "H1": 7.41, + "dW": 0.56, + "dH": -1.2, + "condition_lhs_H0dW": 4.8216, + "condition_rhs_W1dH": -59.742, + "dH_mos_rows": -0.02, + "dH_channels": -1.18, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": -4.15, + "taller_mos_rows": -1.007, + "routing_tracks": -59.407, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/ihp130/sW2_sL2/independent/C02_ihp130_sW2_sL2_independent.gds", + "gds_mode": "runs/grid/C02/ihp130/sW2_sL2/combined/C02_ihp130_sW2_sL2_combined.gds", + "geometry_hash_ref": "82de2a002e0911f7", + "geometry_hash_mode": "ed4641753340a067", + "geometry_identical": false + }, + { + "case": "C02_sky130_sW0.5_sL1.5", + "topology": "C02", + "pdk": "sky130", + "size": "sW0.5_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 102.593, + "A1": 97.595, + "rel": -0.04872, + "class": "positive", + "W0": 11.495, + "H0": 8.925, + "W1": 10.935, + "H1": 8.925, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 4.998, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -4.998, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/sky130/sW0.5_sL1.5/independent/C02_sky130_sW0p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C02/sky130/sW0.5_sL1.5/diffusion_only/C02_sky130_sW0p5_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "421d5d4c1375725d", + "geometry_hash_mode": "1a4d7e4c400076a9", + "geometry_identical": false + }, + { + "case": "C02_sky130_sW0.5_sL1.5", + "topology": "C02", + "pdk": "sky130", + "size": "sW0.5_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 102.593, + "A1": 88.295, + "rel": -0.13936, + "class": "positive", + "W0": 11.495, + "H0": 8.925, + "W1": 11.415, + "H1": 7.735, + "dW": 0.08, + "dH": -1.19, + "condition_lhs_H0dW": 0.714, + "condition_rhs_W1dH": -13.5839, + "dH_mos_rows": 0.03, + "dH_channels": -1.22, + "dH_other": 0.0, + "row_span_saving": { + "n": -0.49 + }, + "max_mos_row_span_saving": -0.49, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 3.79, + "stub_separation": -4.409, + "taller_mos_rows": 0.345, + "routing_tracks": -14.024, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/sky130/sW0.5_sL1.5/independent/C02_sky130_sW0p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C02/sky130/sW0.5_sL1.5/gate_only/C02_sky130_sW0p5_sL1p5_gate_only.gds", + "geometry_hash_ref": "421d5d4c1375725d", + "geometry_hash_mode": "c2a3a8f60fd41f16", + "geometry_identical": false + }, + { + "case": "C02_sky130_sW0.5_sL1.5", + "topology": "C02", + "pdk": "sky130", + "size": "sW0.5_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 102.593, + "A1": 83.963, + "rel": -0.18159, + "class": "positive", + "W0": 11.495, + "H0": 8.925, + "W1": 10.855, + "H1": 7.735, + "dW": 0.64, + "dH": -1.19, + "condition_lhs_H0dW": 5.712, + "condition_rhs_W1dH": -12.9175, + "dH_mos_rows": 0.03, + "dH_channels": -1.22, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.07 + }, + "max_mos_row_span_saving": 0.07, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -0.541, + "stub_separation": -4.409, + "taller_mos_rows": 0.345, + "routing_tracks": -14.024, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/sky130/sW0.5_sL1.5/independent/C02_sky130_sW0p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C02/sky130/sW0.5_sL1.5/combined/C02_sky130_sW0p5_sL1p5_combined.gds", + "geometry_hash_ref": "421d5d4c1375725d", + "geometry_hash_mode": "cd13c23f9bef69e1", + "geometry_identical": false + }, + { + "case": "C02_sky130_sW0.5_sL1", + "topology": "C02", + "pdk": "sky130", + "size": "sW0.5_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 91.883, + "A1": 86.885, + "rel": -0.0544, + "class": "positive", + "W0": 10.295, + "H0": 8.925, + "W1": 9.735, + "H1": 8.925, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 4.998, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -4.998, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/sky130/sW0.5_sL1/independent/C02_sky130_sW0p5_sL1_independent.gds", + "gds_mode": "runs/grid/C02/sky130/sW0.5_sL1/diffusion_only/C02_sky130_sW0p5_sL1_diffusion_only.gds", + "geometry_hash_ref": "100b874058a99b27", + "geometry_hash_mode": "78445d6ac7c8b25e", + "geometry_identical": false + }, + { + "case": "C02_sky130_sW0.5_sL1", + "topology": "C02", + "pdk": "sky130", + "size": "sW0.5_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 91.883, + "A1": 79.013, + "rel": -0.14007, + "class": "positive", + "W0": 10.295, + "H0": 8.925, + "W1": 10.215, + "H1": 7.735, + "dW": 0.08, + "dH": -1.19, + "condition_lhs_H0dW": 0.714, + "condition_rhs_W1dH": -12.1559, + "dH_mos_rows": 0.03, + "dH_channels": -1.22, + "dH_other": 0.0, + "row_span_saving": { + "n": -0.49 + }, + "max_mos_row_span_saving": -0.49, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 3.79, + "stub_separation": -4.409, + "taller_mos_rows": 0.309, + "routing_tracks": -12.56, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/sky130/sW0.5_sL1/independent/C02_sky130_sW0p5_sL1_independent.gds", + "gds_mode": "runs/grid/C02/sky130/sW0.5_sL1/gate_only/C02_sky130_sW0p5_sL1_gate_only.gds", + "geometry_hash_ref": "100b874058a99b27", + "geometry_hash_mode": "f4f156ca13a4651a", + "geometry_identical": false + }, + { + "case": "C02_sky130_sW0.5_sL1", + "topology": "C02", + "pdk": "sky130", + "size": "sW0.5_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 91.883, + "A1": 80.571, + "rel": -0.12311, + "class": "positive", + "W0": 10.295, + "H0": 8.925, + "W1": 9.655, + "H1": 8.345, + "dW": 0.64, + "dH": -0.58, + "condition_lhs_H0dW": 5.712, + "condition_rhs_W1dH": -5.5999, + "dH_mos_rows": 0.03, + "dH_channels": -0.61, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.07 + }, + "max_mos_row_span_saving": 0.07, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -0.584, + "stub_separation": -4.757, + "taller_mos_rows": 0.309, + "routing_tracks": -6.28, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/sky130/sW0.5_sL1/independent/C02_sky130_sW0p5_sL1_independent.gds", + "gds_mode": "runs/grid/C02/sky130/sW0.5_sL1/combined/C02_sky130_sW0p5_sL1_combined.gds", + "geometry_hash_ref": "100b874058a99b27", + "geometry_hash_mode": "8bf3a2b968f53b6f", + "geometry_identical": false + }, + { + "case": "C02_sky130_sW0.5_sL2", + "topology": "C02", + "pdk": "sky130", + "size": "sW0.5_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 113.303, + "A1": 108.305, + "rel": -0.04411, + "class": "positive", + "W0": 12.695, + "H0": 8.925, + "W1": 12.135, + "H1": 8.925, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 4.998, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -4.998, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/sky130/sW0.5_sL2/independent/C02_sky130_sW0p5_sL2_independent.gds", + "gds_mode": "runs/grid/C02/sky130/sW0.5_sL2/diffusion_only/C02_sky130_sW0p5_sL2_diffusion_only.gds", + "geometry_hash_ref": "fab9c8db987c5867", + "geometry_hash_mode": "3fa38153b854562f", + "geometry_identical": false + }, + { + "case": "C02_sky130_sW0.5_sL2", + "topology": "C02", + "pdk": "sky130", + "size": "sW0.5_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 113.303, + "A1": 97.577, + "rel": -0.13879, + "class": "positive", + "W0": 12.695, + "H0": 8.925, + "W1": 12.615, + "H1": 7.735, + "dW": 0.08, + "dH": -1.19, + "condition_lhs_H0dW": 0.714, + "condition_rhs_W1dH": -15.0119, + "dH_mos_rows": 0.03, + "dH_channels": -1.22, + "dH_other": 0.0, + "row_span_saving": { + "n": -0.49 + }, + "max_mos_row_span_saving": -0.49, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 3.79, + "stub_separation": -4.409, + "taller_mos_rows": 0.381, + "routing_tracks": -15.488, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/sky130/sW0.5_sL2/independent/C02_sky130_sW0p5_sL2_independent.gds", + "gds_mode": "runs/grid/C02/sky130/sW0.5_sL2/gate_only/C02_sky130_sW0p5_sL2_gate_only.gds", + "geometry_hash_ref": "fab9c8db987c5867", + "geometry_hash_mode": "10756c224820cb73", + "geometry_identical": false + }, + { + "case": "C02_sky130_sW0.5_sL2", + "topology": "C02", + "pdk": "sky130", + "size": "sW0.5_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 113.303, + "A1": 93.245, + "rel": -0.17703, + "class": "positive", + "W0": 12.695, + "H0": 8.925, + "W1": 12.055, + "H1": 7.735, + "dW": 0.64, + "dH": -1.19, + "condition_lhs_H0dW": 5.712, + "condition_rhs_W1dH": -14.3455, + "dH_mos_rows": 0.03, + "dH_channels": -1.22, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.07 + }, + "max_mos_row_span_saving": 0.07, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -0.541, + "stub_separation": -4.409, + "taller_mos_rows": 0.381, + "routing_tracks": -15.488, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/sky130/sW0.5_sL2/independent/C02_sky130_sW0p5_sL2_independent.gds", + "gds_mode": "runs/grid/C02/sky130/sW0.5_sL2/combined/C02_sky130_sW0p5_sL2_combined.gds", + "geometry_hash_ref": "fab9c8db987c5867", + "geometry_hash_mode": "b75ee636eb198d56", + "geometry_identical": false + }, + { + "case": "C02_sky130_sW1.5_sL1.5", + "topology": "C02", + "pdk": "sky130", + "size": "sW1.5_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 208.265, + "A1": 203.267, + "rel": -0.024, + "class": "positive", + "W0": 23.335, + "H0": 8.925, + "W1": 22.775, + "H1": 8.925, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 4.998, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -4.998, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/sky130/sW1.5_sL1.5/independent/C02_sky130_sW1p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C02/sky130/sW1.5_sL1.5/diffusion_only/C02_sky130_sW1p5_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "a1eb85f25f1ae088", + "geometry_hash_mode": "985650514b42abc2", + "geometry_identical": false + }, + { + "case": "C02_sky130_sW1.5_sL1.5", + "topology": "C02", + "pdk": "sky130", + "size": "sW1.5_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 208.265, + "A1": 179.877, + "rel": -0.1363, + "class": "positive", + "W0": 23.335, + "H0": 8.925, + "W1": 23.255, + "H1": 7.735, + "dW": 0.08, + "dH": -1.19, + "condition_lhs_H0dW": 0.714, + "condition_rhs_W1dH": -27.6735, + "dH_mos_rows": 0.03, + "dH_channels": -1.22, + "dH_other": 0.0, + "row_span_saving": { + "n": -0.49 + }, + "max_mos_row_span_saving": -0.49, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 3.79, + "stub_separation": -4.409, + "taller_mos_rows": 0.7, + "routing_tracks": -28.469, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/sky130/sW1.5_sL1.5/independent/C02_sky130_sW1p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C02/sky130/sW1.5_sL1.5/gate_only/C02_sky130_sW1p5_sL1p5_gate_only.gds", + "geometry_hash_ref": "a1eb85f25f1ae088", + "geometry_hash_mode": "9041a25faf214056", + "geometry_identical": false + }, + { + "case": "C02_sky130_sW1.5_sL1.5", + "topology": "C02", + "pdk": "sky130", + "size": "sW1.5_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 208.265, + "A1": 175.546, + "rel": -0.1571, + "class": "positive", + "W0": 23.335, + "H0": 8.925, + "W1": 22.695, + "H1": 7.735, + "dW": 0.64, + "dH": -1.19, + "condition_lhs_H0dW": 5.712, + "condition_rhs_W1dH": -27.0071, + "dH_mos_rows": 0.03, + "dH_channels": -1.22, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.07 + }, + "max_mos_row_span_saving": 0.07, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -0.541, + "stub_separation": -4.409, + "taller_mos_rows": 0.7, + "routing_tracks": -28.469, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/sky130/sW1.5_sL1.5/independent/C02_sky130_sW1p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C02/sky130/sW1.5_sL1.5/combined/C02_sky130_sW1p5_sL1p5_combined.gds", + "geometry_hash_ref": "a1eb85f25f1ae088", + "geometry_hash_mode": "d66a648db111420e", + "geometry_identical": false + }, + { + "case": "C02_sky130_sW1.5_sL1", + "topology": "C02", + "pdk": "sky130", + "size": "sW1.5_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 176.135, + "A1": 171.137, + "rel": -0.02838, + "class": "positive", + "W0": 19.735, + "H0": 8.925, + "W1": 19.175, + "H1": 8.925, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 4.998, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -4.998, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/sky130/sW1.5_sL1/independent/C02_sky130_sW1p5_sL1_independent.gds", + "gds_mode": "runs/grid/C02/sky130/sW1.5_sL1/diffusion_only/C02_sky130_sW1p5_sL1_diffusion_only.gds", + "geometry_hash_ref": "3c1e5f76c4478a61", + "geometry_hash_mode": "12ab71a9c5820edd", + "geometry_identical": false + }, + { + "case": "C02_sky130_sW1.5_sL1", + "topology": "C02", + "pdk": "sky130", + "size": "sW1.5_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 176.135, + "A1": 152.031, + "rel": -0.13685, + "class": "positive", + "W0": 19.735, + "H0": 8.925, + "W1": 19.655, + "H1": 7.735, + "dW": 0.08, + "dH": -1.19, + "condition_lhs_H0dW": 0.714, + "condition_rhs_W1dH": -23.3895, + "dH_mos_rows": 0.03, + "dH_channels": -1.22, + "dH_other": 0.0, + "row_span_saving": { + "n": -0.49 + }, + "max_mos_row_span_saving": -0.49, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 3.79, + "stub_separation": -4.409, + "taller_mos_rows": 0.592, + "routing_tracks": -24.077, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/sky130/sW1.5_sL1/independent/C02_sky130_sW1p5_sL1_independent.gds", + "gds_mode": "runs/grid/C02/sky130/sW1.5_sL1/gate_only/C02_sky130_sW1p5_sL1_gate_only.gds", + "geometry_hash_ref": "3c1e5f76c4478a61", + "geometry_hash_mode": "e41ce84bd839078c", + "geometry_identical": false + }, + { + "case": "C02_sky130_sW1.5_sL1", + "topology": "C02", + "pdk": "sky130", + "size": "sW1.5_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 176.135, + "A1": 159.348, + "rel": -0.09531, + "class": "positive", + "W0": 19.735, + "H0": 8.925, + "W1": 19.095, + "H1": 8.345, + "dW": 0.64, + "dH": -0.58, + "condition_lhs_H0dW": 5.712, + "condition_rhs_W1dH": -11.0751, + "dH_mos_rows": 0.03, + "dH_channels": -0.61, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.07 + }, + "max_mos_row_span_saving": 0.07, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -0.584, + "stub_separation": -4.757, + "taller_mos_rows": 0.592, + "routing_tracks": -12.038, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/sky130/sW1.5_sL1/independent/C02_sky130_sW1p5_sL1_independent.gds", + "gds_mode": "runs/grid/C02/sky130/sW1.5_sL1/combined/C02_sky130_sW1p5_sL1_combined.gds", + "geometry_hash_ref": "3c1e5f76c4478a61", + "geometry_hash_mode": "160aa4ff90a05df0", + "geometry_identical": false + }, + { + "case": "C02_sky130_sW1.5_sL2", + "topology": "C02", + "pdk": "sky130", + "size": "sW1.5_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 240.395, + "A1": 235.397, + "rel": -0.02079, + "class": "positive", + "W0": 26.935, + "H0": 8.925, + "W1": 26.375, + "H1": 8.925, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 4.998, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -4.998, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/sky130/sW1.5_sL2/independent/C02_sky130_sW1p5_sL2_independent.gds", + "gds_mode": "runs/grid/C02/sky130/sW1.5_sL2/diffusion_only/C02_sky130_sW1p5_sL2_diffusion_only.gds", + "geometry_hash_ref": "6c2f1a3c38306b04", + "geometry_hash_mode": "220663aea2069e23", + "geometry_identical": false + }, + { + "case": "C02_sky130_sW1.5_sL2", + "topology": "C02", + "pdk": "sky130", + "size": "sW1.5_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 240.395, + "A1": 207.723, + "rel": -0.13591, + "class": "positive", + "W0": 26.935, + "H0": 8.925, + "W1": 26.855, + "H1": 7.735, + "dW": 0.08, + "dH": -1.19, + "condition_lhs_H0dW": 0.714, + "condition_rhs_W1dH": -31.9575, + "dH_mos_rows": 0.03, + "dH_channels": -1.22, + "dH_other": 0.0, + "row_span_saving": { + "n": -0.49 + }, + "max_mos_row_span_saving": -0.49, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 3.79, + "stub_separation": -4.409, + "taller_mos_rows": 0.808, + "routing_tracks": -32.861, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/sky130/sW1.5_sL2/independent/C02_sky130_sW1p5_sL2_independent.gds", + "gds_mode": "runs/grid/C02/sky130/sW1.5_sL2/gate_only/C02_sky130_sW1p5_sL2_gate_only.gds", + "geometry_hash_ref": "6c2f1a3c38306b04", + "geometry_hash_mode": "3808b3ba83748509", + "geometry_identical": false + }, + { + "case": "C02_sky130_sW1.5_sL2", + "topology": "C02", + "pdk": "sky130", + "size": "sW1.5_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 240.395, + "A1": 203.392, + "rel": -0.15393, + "class": "positive", + "W0": 26.935, + "H0": 8.925, + "W1": 26.295, + "H1": 7.735, + "dW": 0.64, + "dH": -1.19, + "condition_lhs_H0dW": 5.712, + "condition_rhs_W1dH": -31.2911, + "dH_mos_rows": 0.03, + "dH_channels": -1.22, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.07 + }, + "max_mos_row_span_saving": 0.07, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -0.541, + "stub_separation": -4.409, + "taller_mos_rows": 0.808, + "routing_tracks": -32.861, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/sky130/sW1.5_sL2/independent/C02_sky130_sW1p5_sL2_independent.gds", + "gds_mode": "runs/grid/C02/sky130/sW1.5_sL2/combined/C02_sky130_sW1p5_sL2_combined.gds", + "geometry_hash_ref": "6c2f1a3c38306b04", + "geometry_hash_mode": "5db44767af4e6352", + "geometry_identical": false + }, + { + "case": "C02_sky130_sW1_sL1.5", + "topology": "C02", + "pdk": "sky130", + "size": "sW1_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 155.429, + "A1": 150.431, + "rel": -0.03216, + "class": "positive", + "W0": 17.415, + "H0": 8.925, + "W1": 16.855, + "H1": 8.925, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 4.998, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -4.998, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/sky130/sW1_sL1.5/independent/C02_sky130_sW1_sL1p5_independent.gds", + "gds_mode": "runs/grid/C02/sky130/sW1_sL1.5/diffusion_only/C02_sky130_sW1_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "f50f48a18dd8d593", + "geometry_hash_mode": "a0361d054fd3b446", + "geometry_identical": false + }, + { + "case": "C02_sky130_sW1_sL1.5", + "topology": "C02", + "pdk": "sky130", + "size": "sW1_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 155.429, + "A1": 134.086, + "rel": -0.13731, + "class": "positive", + "W0": 17.415, + "H0": 8.925, + "W1": 17.335, + "H1": 7.735, + "dW": 0.08, + "dH": -1.19, + "condition_lhs_H0dW": 0.714, + "condition_rhs_W1dH": -20.6287, + "dH_mos_rows": 0.03, + "dH_channels": -1.22, + "dH_other": 0.0, + "row_span_saving": { + "n": -0.49 + }, + "max_mos_row_span_saving": -0.49, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 3.79, + "stub_separation": -4.409, + "taller_mos_rows": 0.522, + "routing_tracks": -21.246, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/sky130/sW1_sL1.5/independent/C02_sky130_sW1_sL1p5_independent.gds", + "gds_mode": "runs/grid/C02/sky130/sW1_sL1.5/gate_only/C02_sky130_sW1_sL1p5_gate_only.gds", + "geometry_hash_ref": "f50f48a18dd8d593", + "geometry_hash_mode": "57156c9cd1f9d4e6", + "geometry_identical": false + }, + { + "case": "C02_sky130_sW1_sL1.5", + "topology": "C02", + "pdk": "sky130", + "size": "sW1_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 155.429, + "A1": 129.755, + "rel": -0.16518, + "class": "positive", + "W0": 17.415, + "H0": 8.925, + "W1": 16.775, + "H1": 7.735, + "dW": 0.64, + "dH": -1.19, + "condition_lhs_H0dW": 5.712, + "condition_rhs_W1dH": -19.9623, + "dH_mos_rows": 0.03, + "dH_channels": -1.22, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.07 + }, + "max_mos_row_span_saving": 0.07, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -0.541, + "stub_separation": -4.409, + "taller_mos_rows": 0.522, + "routing_tracks": -21.246, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/sky130/sW1_sL1.5/independent/C02_sky130_sW1_sL1p5_independent.gds", + "gds_mode": "runs/grid/C02/sky130/sW1_sL1.5/combined/C02_sky130_sW1_sL1p5_combined.gds", + "geometry_hash_ref": "f50f48a18dd8d593", + "geometry_hash_mode": "faa9edb3ecaa2597", + "geometry_identical": false + }, + { + "case": "C02_sky130_sW1_sL1", + "topology": "C02", + "pdk": "sky130", + "size": "sW1_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 134.009, + "A1": 129.011, + "rel": -0.0373, + "class": "positive", + "W0": 15.015, + "H0": 8.925, + "W1": 14.455, + "H1": 8.925, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 4.998, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -4.998, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/sky130/sW1_sL1/independent/C02_sky130_sW1_sL1_independent.gds", + "gds_mode": "runs/grid/C02/sky130/sW1_sL1/diffusion_only/C02_sky130_sW1_sL1_diffusion_only.gds", + "geometry_hash_ref": "9a9bcb6396aab6c6", + "geometry_hash_mode": "6addb83d5f66ec63", + "geometry_identical": false + }, + { + "case": "C02_sky130_sW1_sL1", + "topology": "C02", + "pdk": "sky130", + "size": "sW1_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 134.009, + "A1": 115.522, + "rel": -0.13795, + "class": "positive", + "W0": 15.015, + "H0": 8.925, + "W1": 14.935, + "H1": 7.735, + "dW": 0.08, + "dH": -1.19, + "condition_lhs_H0dW": 0.714, + "condition_rhs_W1dH": -17.7727, + "dH_mos_rows": 0.03, + "dH_channels": -1.22, + "dH_other": 0.0, + "row_span_saving": { + "n": -0.49 + }, + "max_mos_row_span_saving": -0.49, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 3.79, + "stub_separation": -4.409, + "taller_mos_rows": 0.45, + "routing_tracks": -18.318, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/sky130/sW1_sL1/independent/C02_sky130_sW1_sL1_independent.gds", + "gds_mode": "runs/grid/C02/sky130/sW1_sL1/gate_only/C02_sky130_sW1_sL1_gate_only.gds", + "geometry_hash_ref": "9a9bcb6396aab6c6", + "geometry_hash_mode": "faac543868d62846", + "geometry_identical": false + }, + { + "case": "C02_sky130_sW1_sL1", + "topology": "C02", + "pdk": "sky130", + "size": "sW1_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 134.009, + "A1": 119.959, + "rel": -0.10484, + "class": "positive", + "W0": 15.015, + "H0": 8.925, + "W1": 14.375, + "H1": 8.345, + "dW": 0.64, + "dH": -0.58, + "condition_lhs_H0dW": 5.712, + "condition_rhs_W1dH": -8.3375, + "dH_mos_rows": 0.03, + "dH_channels": -0.61, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.07 + }, + "max_mos_row_span_saving": 0.07, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -0.584, + "stub_separation": -4.757, + "taller_mos_rows": 0.45, + "routing_tracks": -9.159, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/sky130/sW1_sL1/independent/C02_sky130_sW1_sL1_independent.gds", + "gds_mode": "runs/grid/C02/sky130/sW1_sL1/combined/C02_sky130_sW1_sL1_combined.gds", + "geometry_hash_ref": "9a9bcb6396aab6c6", + "geometry_hash_mode": "7e64cc2498b0680d", + "geometry_identical": false + }, + { + "case": "C02_sky130_sW1_sL2", + "topology": "C02", + "pdk": "sky130", + "size": "sW1_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 176.849, + "A1": 171.851, + "rel": -0.02826, + "class": "positive", + "W0": 19.815, + "H0": 8.925, + "W1": 19.255, + "H1": 8.925, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 4.998, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -4.998, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/sky130/sW1_sL2/independent/C02_sky130_sW1_sL2_independent.gds", + "gds_mode": "runs/grid/C02/sky130/sW1_sL2/diffusion_only/C02_sky130_sW1_sL2_diffusion_only.gds", + "geometry_hash_ref": "0f1313de97a0c2b4", + "geometry_hash_mode": "e3d88a71d063bc57", + "geometry_identical": false + }, + { + "case": "C02_sky130_sW1_sL2", + "topology": "C02", + "pdk": "sky130", + "size": "sW1_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 176.849, + "A1": 152.65, + "rel": -0.13683, + "class": "positive", + "W0": 19.815, + "H0": 8.925, + "W1": 19.735, + "H1": 7.735, + "dW": 0.08, + "dH": -1.19, + "condition_lhs_H0dW": 0.714, + "condition_rhs_W1dH": -23.4847, + "dH_mos_rows": 0.03, + "dH_channels": -1.22, + "dH_other": 0.0, + "row_span_saving": { + "n": -0.49 + }, + "max_mos_row_span_saving": -0.49, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 3.79, + "stub_separation": -4.409, + "taller_mos_rows": 0.594, + "routing_tracks": -24.174, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/sky130/sW1_sL2/independent/C02_sky130_sW1_sL2_independent.gds", + "gds_mode": "runs/grid/C02/sky130/sW1_sL2/gate_only/C02_sky130_sW1_sL2_gate_only.gds", + "geometry_hash_ref": "0f1313de97a0c2b4", + "geometry_hash_mode": "271cf9417d9366fb", + "geometry_identical": false + }, + { + "case": "C02_sky130_sW1_sL2", + "topology": "C02", + "pdk": "sky130", + "size": "sW1_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 176.849, + "A1": 148.319, + "rel": -0.16133, + "class": "positive", + "W0": 19.815, + "H0": 8.925, + "W1": 19.175, + "H1": 7.735, + "dW": 0.64, + "dH": -1.19, + "condition_lhs_H0dW": 5.712, + "condition_rhs_W1dH": -22.8183, + "dH_mos_rows": 0.03, + "dH_channels": -1.22, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.07 + }, + "max_mos_row_span_saving": 0.07, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -0.541, + "stub_separation": -4.409, + "taller_mos_rows": 0.594, + "routing_tracks": -24.174, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/sky130/sW1_sL2/independent/C02_sky130_sW1_sL2_independent.gds", + "gds_mode": "runs/grid/C02/sky130/sW1_sL2/combined/C02_sky130_sW1_sL2_combined.gds", + "geometry_hash_ref": "0f1313de97a0c2b4", + "geometry_hash_mode": "f15a3d18cfaa85b8", + "geometry_identical": false + }, + { + "case": "C02_sky130_sW2_sL1.5", + "topology": "C02", + "pdk": "sky130", + "size": "sW2_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 261.101, + "A1": 256.103, + "rel": -0.01914, + "class": "positive", + "W0": 29.255, + "H0": 8.925, + "W1": 28.695, + "H1": 8.925, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 4.998, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -4.998, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/sky130/sW2_sL1.5/independent/C02_sky130_sW2_sL1p5_independent.gds", + "gds_mode": "runs/grid/C02/sky130/sW2_sL1.5/diffusion_only/C02_sky130_sW2_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "95103644f970379e", + "geometry_hash_mode": "35dd920344264e0c", + "geometry_identical": false + }, + { + "case": "C02_sky130_sW2_sL1.5", + "topology": "C02", + "pdk": "sky130", + "size": "sW2_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 261.101, + "A1": 225.669, + "rel": -0.1357, + "class": "positive", + "W0": 29.255, + "H0": 8.925, + "W1": 29.175, + "H1": 7.735, + "dW": 0.08, + "dH": -1.19, + "condition_lhs_H0dW": 0.714, + "condition_rhs_W1dH": -34.7183, + "dH_mos_rows": 0.03, + "dH_channels": -1.22, + "dH_other": 0.0, + "row_span_saving": { + "n": -0.49 + }, + "max_mos_row_span_saving": -0.49, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 3.79, + "stub_separation": -4.409, + "taller_mos_rows": 0.878, + "routing_tracks": -35.691, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/sky130/sW2_sL1.5/independent/C02_sky130_sW2_sL1p5_independent.gds", + "gds_mode": "runs/grid/C02/sky130/sW2_sL1.5/gate_only/C02_sky130_sW2_sL1p5_gate_only.gds", + "geometry_hash_ref": "95103644f970379e", + "geometry_hash_mode": "d0f94f1a3c42e1f4", + "geometry_identical": false + }, + { + "case": "C02_sky130_sW2_sL1.5", + "topology": "C02", + "pdk": "sky130", + "size": "sW2_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 261.101, + "A1": 221.337, + "rel": -0.15229, + "class": "positive", + "W0": 29.255, + "H0": 8.925, + "W1": 28.615, + "H1": 7.735, + "dW": 0.64, + "dH": -1.19, + "condition_lhs_H0dW": 5.712, + "condition_rhs_W1dH": -34.0519, + "dH_mos_rows": 0.03, + "dH_channels": -1.22, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.07 + }, + "max_mos_row_span_saving": 0.07, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -0.541, + "stub_separation": -4.409, + "taller_mos_rows": 0.878, + "routing_tracks": -35.691, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/sky130/sW2_sL1.5/independent/C02_sky130_sW2_sL1p5_independent.gds", + "gds_mode": "runs/grid/C02/sky130/sW2_sL1.5/combined/C02_sky130_sW2_sL1p5_combined.gds", + "geometry_hash_ref": "95103644f970379e", + "geometry_hash_mode": "477fb517ba13996d", + "geometry_identical": false + }, + { + "case": "C02_sky130_sW2_sL1", + "topology": "C02", + "pdk": "sky130", + "size": "sW2_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 218.261, + "A1": 213.263, + "rel": -0.0229, + "class": "positive", + "W0": 24.455, + "H0": 8.925, + "W1": 23.895, + "H1": 8.925, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 4.998, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -4.998, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/sky130/sW2_sL1/independent/C02_sky130_sW2_sL1_independent.gds", + "gds_mode": "runs/grid/C02/sky130/sW2_sL1/diffusion_only/C02_sky130_sW2_sL1_diffusion_only.gds", + "geometry_hash_ref": "aec6244f83735ef2", + "geometry_hash_mode": "ca3302687ad46684", + "geometry_identical": false + }, + { + "case": "C02_sky130_sW2_sL1", + "topology": "C02", + "pdk": "sky130", + "size": "sW2_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 218.261, + "A1": 188.541, + "rel": -0.13617, + "class": "positive", + "W0": 24.455, + "H0": 8.925, + "W1": 24.375, + "H1": 7.735, + "dW": 0.08, + "dH": -1.19, + "condition_lhs_H0dW": 0.714, + "condition_rhs_W1dH": -29.0063, + "dH_mos_rows": 0.03, + "dH_channels": -1.22, + "dH_other": 0.0, + "row_span_saving": { + "n": -0.49 + }, + "max_mos_row_span_saving": -0.49, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 3.79, + "stub_separation": -4.409, + "taller_mos_rows": 0.734, + "routing_tracks": -29.835, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/sky130/sW2_sL1/independent/C02_sky130_sW2_sL1_independent.gds", + "gds_mode": "runs/grid/C02/sky130/sW2_sL1/gate_only/C02_sky130_sW2_sL1_gate_only.gds", + "geometry_hash_ref": "aec6244f83735ef2", + "geometry_hash_mode": "ba4250478b2a0a26", + "geometry_identical": false + }, + { + "case": "C02_sky130_sW2_sL1", + "topology": "C02", + "pdk": "sky130", + "size": "sW2_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 218.261, + "A1": 198.736, + "rel": -0.08946, + "class": "positive", + "W0": 24.455, + "H0": 8.925, + "W1": 23.815, + "H1": 8.345, + "dW": 0.64, + "dH": -0.58, + "condition_lhs_H0dW": 5.712, + "condition_rhs_W1dH": -13.8127, + "dH_mos_rows": 0.03, + "dH_channels": -0.61, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.07 + }, + "max_mos_row_span_saving": 0.07, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -0.584, + "stub_separation": -4.757, + "taller_mos_rows": 0.734, + "routing_tracks": -14.918, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/sky130/sW2_sL1/independent/C02_sky130_sW2_sL1_independent.gds", + "gds_mode": "runs/grid/C02/sky130/sW2_sL1/combined/C02_sky130_sW2_sL1_combined.gds", + "geometry_hash_ref": "aec6244f83735ef2", + "geometry_hash_mode": "f5e872499bf20ffd", + "geometry_identical": false + }, + { + "case": "C02_sky130_sW2_sL2", + "topology": "C02", + "pdk": "sky130", + "size": "sW2_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 303.941, + "A1": 298.943, + "rel": -0.01644, + "class": "positive", + "W0": 34.055, + "H0": 8.925, + "W1": 33.495, + "H1": 8.925, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 4.998, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -4.998, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/sky130/sW2_sL2/independent/C02_sky130_sW2_sL2_independent.gds", + "gds_mode": "runs/grid/C02/sky130/sW2_sL2/diffusion_only/C02_sky130_sW2_sL2_diffusion_only.gds", + "geometry_hash_ref": "ab3f2f0c36cc4b2e", + "geometry_hash_mode": "8674da1ed62f39ef", + "geometry_identical": false + }, + { + "case": "C02_sky130_sW2_sL2", + "topology": "C02", + "pdk": "sky130", + "size": "sW2_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 303.941, + "A1": 262.797, + "rel": -0.13537, + "class": "positive", + "W0": 34.055, + "H0": 8.925, + "W1": 33.975, + "H1": 7.735, + "dW": 0.08, + "dH": -1.19, + "condition_lhs_H0dW": 0.714, + "condition_rhs_W1dH": -40.4303, + "dH_mos_rows": 0.03, + "dH_channels": -1.22, + "dH_other": 0.0, + "row_span_saving": { + "n": -0.49 + }, + "max_mos_row_span_saving": -0.49, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 3.79, + "stub_separation": -4.409, + "taller_mos_rows": 1.022, + "routing_tracks": -41.547, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/sky130/sW2_sL2/independent/C02_sky130_sW2_sL2_independent.gds", + "gds_mode": "runs/grid/C02/sky130/sW2_sL2/gate_only/C02_sky130_sW2_sL2_gate_only.gds", + "geometry_hash_ref": "ab3f2f0c36cc4b2e", + "geometry_hash_mode": "c7f4560a0faeac5f", + "geometry_identical": false + }, + { + "case": "C02_sky130_sW2_sL2", + "topology": "C02", + "pdk": "sky130", + "size": "sW2_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 303.941, + "A1": 258.465, + "rel": -0.14962, + "class": "positive", + "W0": 34.055, + "H0": 8.925, + "W1": 33.415, + "H1": 7.735, + "dW": 0.64, + "dH": -1.19, + "condition_lhs_H0dW": 5.712, + "condition_rhs_W1dH": -39.7639, + "dH_mos_rows": 0.03, + "dH_channels": -1.22, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.07 + }, + "max_mos_row_span_saving": 0.07, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -0.541, + "stub_separation": -4.409, + "taller_mos_rows": 1.022, + "routing_tracks": -41.547, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C02/sky130/sW2_sL2/independent/C02_sky130_sW2_sL2_independent.gds", + "gds_mode": "runs/grid/C02/sky130/sW2_sL2/combined/C02_sky130_sW2_sL2_combined.gds", + "geometry_hash_ref": "ab3f2f0c36cc4b2e", + "geometry_hash_mode": "f012bff10ffcb9b7", + "geometry_identical": false + }, + { + "case": "C03_gf180_sW0.5_sL1.5", + "topology": "C03", + "pdk": "gf180", + "size": "sW0.5_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 587.456, + "A1": 578.688, + "rel": -0.01493, + "class": "positive", + "W0": 53.6, + "H0": 10.96, + "W1": 52.8, + "H1": 10.96, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 8.768, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -8.768, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/gf180/sW0.5_sL1.5/independent/C03_gf180_sW0p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C03/gf180/sW0.5_sL1.5/diffusion_only/C03_gf180_sW0p5_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "0d492543077e125f", + "geometry_hash_mode": "e61353a7fabb45a3", + "geometry_identical": false + }, + { + "case": "C03_gf180_sW0.5_sL1.5", + "topology": "C03", + "pdk": "gf180", + "size": "sW0.5_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 587.456, + "A1": 587.456, + "rel": 0.0, + "class": "neutral", + "W0": 53.6, + "H0": 10.96, + "W1": 53.6, + "H1": 10.96, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/gf180/sW0.5_sL1.5/independent/C03_gf180_sW0p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C03/gf180/sW0.5_sL1.5/gate_only/C03_gf180_sW0p5_sL1p5_gate_only.gds", + "geometry_hash_ref": "0d492543077e125f", + "geometry_hash_mode": "8ff7710e5c261df9", + "geometry_identical": false + }, + { + "case": "C03_gf180_sW0.5_sL1.5", + "topology": "C03", + "pdk": "gf180", + "size": "sW0.5_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 587.456, + "A1": 578.688, + "rel": -0.01493, + "class": "positive", + "W0": 53.6, + "H0": 10.96, + "W1": 52.8, + "H1": 10.96, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 8.768, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -8.768, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/gf180/sW0.5_sL1.5/independent/C03_gf180_sW0p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C03/gf180/sW0.5_sL1.5/combined/C03_gf180_sW0p5_sL1p5_combined.gds", + "geometry_hash_ref": "0d492543077e125f", + "geometry_hash_mode": "468779c066004cbf", + "geometry_identical": false + }, + { + "case": "C03_gf180_sW0.5_sL1", + "topology": "C03", + "pdk": "gf180", + "size": "sW0.5_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 440.154, + "A1": 431.386, + "rel": -0.01992, + "class": "positive", + "W0": 40.16, + "H0": 10.96, + "W1": 39.36, + "H1": 10.96, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 8.768, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -8.768, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/gf180/sW0.5_sL1/independent/C03_gf180_sW0p5_sL1_independent.gds", + "gds_mode": "runs/grid/C03/gf180/sW0.5_sL1/diffusion_only/C03_gf180_sW0p5_sL1_diffusion_only.gds", + "geometry_hash_ref": "7aa535a7df0999fb", + "geometry_hash_mode": "2608a7847d54dfe2", + "geometry_identical": false + }, + { + "case": "C03_gf180_sW0.5_sL1", + "topology": "C03", + "pdk": "gf180", + "size": "sW0.5_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 440.154, + "A1": 440.154, + "rel": 0.0, + "class": "neutral", + "W0": 40.16, + "H0": 10.96, + "W1": 40.16, + "H1": 10.96, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/gf180/sW0.5_sL1/independent/C03_gf180_sW0p5_sL1_independent.gds", + "gds_mode": "runs/grid/C03/gf180/sW0.5_sL1/gate_only/C03_gf180_sW0p5_sL1_gate_only.gds", + "geometry_hash_ref": "7aa535a7df0999fb", + "geometry_hash_mode": "00d09bfaebce8406", + "geometry_identical": false + }, + { + "case": "C03_gf180_sW0.5_sL1", + "topology": "C03", + "pdk": "gf180", + "size": "sW0.5_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 440.154, + "A1": 431.386, + "rel": -0.01992, + "class": "positive", + "W0": 40.16, + "H0": 10.96, + "W1": 39.36, + "H1": 10.96, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 8.768, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -8.768, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/gf180/sW0.5_sL1/independent/C03_gf180_sW0p5_sL1_independent.gds", + "gds_mode": "runs/grid/C03/gf180/sW0.5_sL1/combined/C03_gf180_sW0p5_sL1_combined.gds", + "geometry_hash_ref": "7aa535a7df0999fb", + "geometry_hash_mode": "b464a11c2398c593", + "geometry_identical": false + }, + { + "case": "C03_gf180_sW0.5_sL2", + "topology": "C03", + "pdk": "gf180", + "size": "sW0.5_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 734.758, + "A1": 725.99, + "rel": -0.01193, + "class": "positive", + "W0": 67.04, + "H0": 10.96, + "W1": 66.24, + "H1": 10.96, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 8.768, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -8.768, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/gf180/sW0.5_sL2/independent/C03_gf180_sW0p5_sL2_independent.gds", + "gds_mode": "runs/grid/C03/gf180/sW0.5_sL2/diffusion_only/C03_gf180_sW0p5_sL2_diffusion_only.gds", + "geometry_hash_ref": "67ce879569eb14bf", + "geometry_hash_mode": "fc41c44b1a914df8", + "geometry_identical": false + }, + { + "case": "C03_gf180_sW0.5_sL2", + "topology": "C03", + "pdk": "gf180", + "size": "sW0.5_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 734.758, + "A1": 734.758, + "rel": 0.0, + "class": "neutral", + "W0": 67.04, + "H0": 10.96, + "W1": 67.04, + "H1": 10.96, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/gf180/sW0.5_sL2/independent/C03_gf180_sW0p5_sL2_independent.gds", + "gds_mode": "runs/grid/C03/gf180/sW0.5_sL2/gate_only/C03_gf180_sW0p5_sL2_gate_only.gds", + "geometry_hash_ref": "67ce879569eb14bf", + "geometry_hash_mode": "411a03c91ef06171", + "geometry_identical": false + }, + { + "case": "C03_gf180_sW0.5_sL2", + "topology": "C03", + "pdk": "gf180", + "size": "sW0.5_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 734.758, + "A1": 725.99, + "rel": -0.01193, + "class": "positive", + "W0": 67.04, + "H0": 10.96, + "W1": 66.24, + "H1": 10.96, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 8.768, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -8.768, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/gf180/sW0.5_sL2/independent/C03_gf180_sW0p5_sL2_independent.gds", + "gds_mode": "runs/grid/C03/gf180/sW0.5_sL2/combined/C03_gf180_sW0p5_sL2_combined.gds", + "geometry_hash_ref": "67ce879569eb14bf", + "geometry_hash_mode": "03ebb2f916d5795a", + "geometry_identical": false + }, + { + "case": "C03_gf180_sW1.5_sL1.5", + "topology": "C03", + "pdk": "gf180", + "size": "sW1.5_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1618.573, + "A1": 1609.805, + "rel": -0.00542, + "class": "positive", + "W0": 147.68, + "H0": 10.96, + "W1": 146.88, + "H1": 10.96, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 8.768, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -8.768, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/gf180/sW1.5_sL1.5/independent/C03_gf180_sW1p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C03/gf180/sW1.5_sL1.5/diffusion_only/C03_gf180_sW1p5_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "b7113c2140db636e", + "geometry_hash_mode": "dd48aa5bb28ea533", + "geometry_identical": false + }, + { + "case": "C03_gf180_sW1.5_sL1.5", + "topology": "C03", + "pdk": "gf180", + "size": "sW1.5_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1618.573, + "A1": 1618.573, + "rel": 0.0, + "class": "neutral", + "W0": 147.68, + "H0": 10.96, + "W1": 147.68, + "H1": 10.96, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/gf180/sW1.5_sL1.5/independent/C03_gf180_sW1p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C03/gf180/sW1.5_sL1.5/gate_only/C03_gf180_sW1p5_sL1p5_gate_only.gds", + "geometry_hash_ref": "b7113c2140db636e", + "geometry_hash_mode": "d93b203082eee5e0", + "geometry_identical": false + }, + { + "case": "C03_gf180_sW1.5_sL1.5", + "topology": "C03", + "pdk": "gf180", + "size": "sW1.5_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1618.573, + "A1": 1609.805, + "rel": -0.00542, + "class": "positive", + "W0": 147.68, + "H0": 10.96, + "W1": 146.88, + "H1": 10.96, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 8.768, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -8.768, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/gf180/sW1.5_sL1.5/independent/C03_gf180_sW1p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C03/gf180/sW1.5_sL1.5/combined/C03_gf180_sW1p5_sL1p5_combined.gds", + "geometry_hash_ref": "b7113c2140db636e", + "geometry_hash_mode": "8aff36b95631c771", + "geometry_identical": false + }, + { + "case": "C03_gf180_sW1.5_sL1", + "topology": "C03", + "pdk": "gf180", + "size": "sW1.5_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1176.666, + "A1": 1167.898, + "rel": -0.00745, + "class": "positive", + "W0": 107.36, + "H0": 10.96, + "W1": 106.56, + "H1": 10.96, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 8.768, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -8.768, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/gf180/sW1.5_sL1/independent/C03_gf180_sW1p5_sL1_independent.gds", + "gds_mode": "runs/grid/C03/gf180/sW1.5_sL1/diffusion_only/C03_gf180_sW1p5_sL1_diffusion_only.gds", + "geometry_hash_ref": "e863972d8c81a45c", + "geometry_hash_mode": "ee357f2eb38e771c", + "geometry_identical": false + }, + { + "case": "C03_gf180_sW1.5_sL1", + "topology": "C03", + "pdk": "gf180", + "size": "sW1.5_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1176.666, + "A1": 1176.666, + "rel": 0.0, + "class": "neutral", + "W0": 107.36, + "H0": 10.96, + "W1": 107.36, + "H1": 10.96, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/gf180/sW1.5_sL1/independent/C03_gf180_sW1p5_sL1_independent.gds", + "gds_mode": "runs/grid/C03/gf180/sW1.5_sL1/gate_only/C03_gf180_sW1p5_sL1_gate_only.gds", + "geometry_hash_ref": "e863972d8c81a45c", + "geometry_hash_mode": "2c975ebe5c1c8dc8", + "geometry_identical": false + }, + { + "case": "C03_gf180_sW1.5_sL1", + "topology": "C03", + "pdk": "gf180", + "size": "sW1.5_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1176.666, + "A1": 1167.898, + "rel": -0.00745, + "class": "positive", + "W0": 107.36, + "H0": 10.96, + "W1": 106.56, + "H1": 10.96, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 8.768, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -8.768, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/gf180/sW1.5_sL1/independent/C03_gf180_sW1p5_sL1_independent.gds", + "gds_mode": "runs/grid/C03/gf180/sW1.5_sL1/combined/C03_gf180_sW1p5_sL1_combined.gds", + "geometry_hash_ref": "e863972d8c81a45c", + "geometry_hash_mode": "4064a86355c1d1ec", + "geometry_identical": false + }, + { + "case": "C03_gf180_sW1.5_sL2", + "topology": "C03", + "pdk": "gf180", + "size": "sW1.5_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2060.48, + "A1": 2051.712, + "rel": -0.00426, + "class": "neutral", + "W0": 188.0, + "H0": 10.96, + "W1": 187.2, + "H1": 10.96, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 8.768, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -8.768, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/gf180/sW1.5_sL2/independent/C03_gf180_sW1p5_sL2_independent.gds", + "gds_mode": "runs/grid/C03/gf180/sW1.5_sL2/diffusion_only/C03_gf180_sW1p5_sL2_diffusion_only.gds", + "geometry_hash_ref": "6dc99ef9d7df1a2f", + "geometry_hash_mode": "4a23d6f278ade632", + "geometry_identical": false + }, + { + "case": "C03_gf180_sW1.5_sL2", + "topology": "C03", + "pdk": "gf180", + "size": "sW1.5_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2060.48, + "A1": 2060.48, + "rel": 0.0, + "class": "neutral", + "W0": 188.0, + "H0": 10.96, + "W1": 188.0, + "H1": 10.96, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/gf180/sW1.5_sL2/independent/C03_gf180_sW1p5_sL2_independent.gds", + "gds_mode": "runs/grid/C03/gf180/sW1.5_sL2/gate_only/C03_gf180_sW1p5_sL2_gate_only.gds", + "geometry_hash_ref": "6dc99ef9d7df1a2f", + "geometry_hash_mode": "1990d1fcea4bb5c6", + "geometry_identical": false + }, + { + "case": "C03_gf180_sW1.5_sL2", + "topology": "C03", + "pdk": "gf180", + "size": "sW1.5_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2060.48, + "A1": 2051.712, + "rel": -0.00426, + "class": "neutral", + "W0": 188.0, + "H0": 10.96, + "W1": 187.2, + "H1": 10.96, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 8.768, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -8.768, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/gf180/sW1.5_sL2/independent/C03_gf180_sW1p5_sL2_independent.gds", + "gds_mode": "runs/grid/C03/gf180/sW1.5_sL2/combined/C03_gf180_sW1p5_sL2_combined.gds", + "geometry_hash_ref": "6dc99ef9d7df1a2f", + "geometry_hash_mode": "87427bab2a9480e4", + "geometry_identical": false + }, + { + "case": "C03_gf180_sW1_sL1.5", + "topology": "C03", + "pdk": "gf180", + "size": "sW1_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1103.014, + "A1": 1094.246, + "rel": -0.00795, + "class": "positive", + "W0": 100.64, + "H0": 10.96, + "W1": 99.84, + "H1": 10.96, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 8.768, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -8.768, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/gf180/sW1_sL1.5/independent/C03_gf180_sW1_sL1p5_independent.gds", + "gds_mode": "runs/grid/C03/gf180/sW1_sL1.5/diffusion_only/C03_gf180_sW1_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "bf7687b0e5554ac6", + "geometry_hash_mode": "27a99e732cd757d2", + "geometry_identical": false + }, + { + "case": "C03_gf180_sW1_sL1.5", + "topology": "C03", + "pdk": "gf180", + "size": "sW1_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1103.014, + "A1": 1103.014, + "rel": 0.0, + "class": "neutral", + "W0": 100.64, + "H0": 10.96, + "W1": 100.64, + "H1": 10.96, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/gf180/sW1_sL1.5/independent/C03_gf180_sW1_sL1p5_independent.gds", + "gds_mode": "runs/grid/C03/gf180/sW1_sL1.5/gate_only/C03_gf180_sW1_sL1p5_gate_only.gds", + "geometry_hash_ref": "bf7687b0e5554ac6", + "geometry_hash_mode": "a2bc6b89d719b078", + "geometry_identical": false + }, + { + "case": "C03_gf180_sW1_sL1.5", + "topology": "C03", + "pdk": "gf180", + "size": "sW1_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1103.014, + "A1": 1094.246, + "rel": -0.00795, + "class": "positive", + "W0": 100.64, + "H0": 10.96, + "W1": 99.84, + "H1": 10.96, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 8.768, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -8.768, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/gf180/sW1_sL1.5/independent/C03_gf180_sW1_sL1p5_independent.gds", + "gds_mode": "runs/grid/C03/gf180/sW1_sL1.5/combined/C03_gf180_sW1_sL1p5_combined.gds", + "geometry_hash_ref": "bf7687b0e5554ac6", + "geometry_hash_mode": "afc6d8e4c625c314", + "geometry_identical": false + }, + { + "case": "C03_gf180_sW1_sL1", + "topology": "C03", + "pdk": "gf180", + "size": "sW1_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 808.41, + "A1": 799.642, + "rel": -0.01085, + "class": "positive", + "W0": 73.76, + "H0": 10.96, + "W1": 72.96, + "H1": 10.96, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 8.768, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -8.768, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/gf180/sW1_sL1/independent/C03_gf180_sW1_sL1_independent.gds", + "gds_mode": "runs/grid/C03/gf180/sW1_sL1/diffusion_only/C03_gf180_sW1_sL1_diffusion_only.gds", + "geometry_hash_ref": "64c72a21ffb17882", + "geometry_hash_mode": "35e1b4aadbcd8bce", + "geometry_identical": false + }, + { + "case": "C03_gf180_sW1_sL1", + "topology": "C03", + "pdk": "gf180", + "size": "sW1_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 808.41, + "A1": 808.41, + "rel": 0.0, + "class": "neutral", + "W0": 73.76, + "H0": 10.96, + "W1": 73.76, + "H1": 10.96, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/gf180/sW1_sL1/independent/C03_gf180_sW1_sL1_independent.gds", + "gds_mode": "runs/grid/C03/gf180/sW1_sL1/gate_only/C03_gf180_sW1_sL1_gate_only.gds", + "geometry_hash_ref": "64c72a21ffb17882", + "geometry_hash_mode": "ec00b7538c8a689e", + "geometry_identical": false + }, + { + "case": "C03_gf180_sW1_sL1", + "topology": "C03", + "pdk": "gf180", + "size": "sW1_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 808.41, + "A1": 799.642, + "rel": -0.01085, + "class": "positive", + "W0": 73.76, + "H0": 10.96, + "W1": 72.96, + "H1": 10.96, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 8.768, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -8.768, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/gf180/sW1_sL1/independent/C03_gf180_sW1_sL1_independent.gds", + "gds_mode": "runs/grid/C03/gf180/sW1_sL1/combined/C03_gf180_sW1_sL1_combined.gds", + "geometry_hash_ref": "64c72a21ffb17882", + "geometry_hash_mode": "cf2bfb595e051f00", + "geometry_identical": false + }, + { + "case": "C03_gf180_sW1_sL2", + "topology": "C03", + "pdk": "gf180", + "size": "sW1_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1397.619, + "A1": 1388.851, + "rel": -0.00627, + "class": "positive", + "W0": 127.52, + "H0": 10.96, + "W1": 126.72, + "H1": 10.96, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 8.768, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -8.768, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/gf180/sW1_sL2/independent/C03_gf180_sW1_sL2_independent.gds", + "gds_mode": "runs/grid/C03/gf180/sW1_sL2/diffusion_only/C03_gf180_sW1_sL2_diffusion_only.gds", + "geometry_hash_ref": "0f08c7d912bc1e52", + "geometry_hash_mode": "4eaeff6ae285d048", + "geometry_identical": false + }, + { + "case": "C03_gf180_sW1_sL2", + "topology": "C03", + "pdk": "gf180", + "size": "sW1_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1397.619, + "A1": 1397.619, + "rel": 0.0, + "class": "neutral", + "W0": 127.52, + "H0": 10.96, + "W1": 127.52, + "H1": 10.96, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/gf180/sW1_sL2/independent/C03_gf180_sW1_sL2_independent.gds", + "gds_mode": "runs/grid/C03/gf180/sW1_sL2/gate_only/C03_gf180_sW1_sL2_gate_only.gds", + "geometry_hash_ref": "0f08c7d912bc1e52", + "geometry_hash_mode": "8667dd830a57f46e", + "geometry_identical": false + }, + { + "case": "C03_gf180_sW1_sL2", + "topology": "C03", + "pdk": "gf180", + "size": "sW1_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1397.619, + "A1": 1388.851, + "rel": -0.00627, + "class": "positive", + "W0": 127.52, + "H0": 10.96, + "W1": 126.72, + "H1": 10.96, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 8.768, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -8.768, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/gf180/sW1_sL2/independent/C03_gf180_sW1_sL2_independent.gds", + "gds_mode": "runs/grid/C03/gf180/sW1_sL2/combined/C03_gf180_sW1_sL2_combined.gds", + "geometry_hash_ref": "0f08c7d912bc1e52", + "geometry_hash_mode": "dca3a4a423e4ee72", + "geometry_identical": false + }, + { + "case": "C03_gf180_sW2_sL1.5", + "topology": "C03", + "pdk": "gf180", + "size": "sW2_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2134.131, + "A1": 2125.363, + "rel": -0.00411, + "class": "neutral", + "W0": 194.72, + "H0": 10.96, + "W1": 193.92, + "H1": 10.96, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 8.768, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -8.768, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/gf180/sW2_sL1.5/independent/C03_gf180_sW2_sL1p5_independent.gds", + "gds_mode": "runs/grid/C03/gf180/sW2_sL1.5/diffusion_only/C03_gf180_sW2_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "511d1816a00cd532", + "geometry_hash_mode": "4f2c29747011f587", + "geometry_identical": false + }, + { + "case": "C03_gf180_sW2_sL1.5", + "topology": "C03", + "pdk": "gf180", + "size": "sW2_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2134.131, + "A1": 2134.131, + "rel": 0.0, + "class": "neutral", + "W0": 194.72, + "H0": 10.96, + "W1": 194.72, + "H1": 10.96, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/gf180/sW2_sL1.5/independent/C03_gf180_sW2_sL1p5_independent.gds", + "gds_mode": "runs/grid/C03/gf180/sW2_sL1.5/gate_only/C03_gf180_sW2_sL1p5_gate_only.gds", + "geometry_hash_ref": "511d1816a00cd532", + "geometry_hash_mode": "0a2899fe86330794", + "geometry_identical": false + }, + { + "case": "C03_gf180_sW2_sL1.5", + "topology": "C03", + "pdk": "gf180", + "size": "sW2_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2134.131, + "A1": 2125.363, + "rel": -0.00411, + "class": "neutral", + "W0": 194.72, + "H0": 10.96, + "W1": 193.92, + "H1": 10.96, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 8.768, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -8.768, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/gf180/sW2_sL1.5/independent/C03_gf180_sW2_sL1p5_independent.gds", + "gds_mode": "runs/grid/C03/gf180/sW2_sL1.5/combined/C03_gf180_sW2_sL1p5_combined.gds", + "geometry_hash_ref": "511d1816a00cd532", + "geometry_hash_mode": "8bdecb040015372c", + "geometry_identical": false + }, + { + "case": "C03_gf180_sW2_sL1", + "topology": "C03", + "pdk": "gf180", + "size": "sW2_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1544.922, + "A1": 1536.154, + "rel": -0.00568, + "class": "positive", + "W0": 140.96, + "H0": 10.96, + "W1": 140.16, + "H1": 10.96, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 8.768, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -8.768, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/gf180/sW2_sL1/independent/C03_gf180_sW2_sL1_independent.gds", + "gds_mode": "runs/grid/C03/gf180/sW2_sL1/diffusion_only/C03_gf180_sW2_sL1_diffusion_only.gds", + "geometry_hash_ref": "d2ab4662e9e62bc1", + "geometry_hash_mode": "76b9a5011ecb8559", + "geometry_identical": false + }, + { + "case": "C03_gf180_sW2_sL1", + "topology": "C03", + "pdk": "gf180", + "size": "sW2_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1544.922, + "A1": 1544.922, + "rel": 0.0, + "class": "neutral", + "W0": 140.96, + "H0": 10.96, + "W1": 140.96, + "H1": 10.96, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/gf180/sW2_sL1/independent/C03_gf180_sW2_sL1_independent.gds", + "gds_mode": "runs/grid/C03/gf180/sW2_sL1/gate_only/C03_gf180_sW2_sL1_gate_only.gds", + "geometry_hash_ref": "d2ab4662e9e62bc1", + "geometry_hash_mode": "4f493e633a1d4d23", + "geometry_identical": false + }, + { + "case": "C03_gf180_sW2_sL1", + "topology": "C03", + "pdk": "gf180", + "size": "sW2_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1544.922, + "A1": 1536.154, + "rel": -0.00568, + "class": "positive", + "W0": 140.96, + "H0": 10.96, + "W1": 140.16, + "H1": 10.96, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 8.768, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -8.768, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/gf180/sW2_sL1/independent/C03_gf180_sW2_sL1_independent.gds", + "gds_mode": "runs/grid/C03/gf180/sW2_sL1/combined/C03_gf180_sW2_sL1_combined.gds", + "geometry_hash_ref": "d2ab4662e9e62bc1", + "geometry_hash_mode": "ff8f91df5d505246", + "geometry_identical": false + }, + { + "case": "C03_gf180_sW2_sL2", + "topology": "C03", + "pdk": "gf180", + "size": "sW2_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2723.341, + "A1": 2714.573, + "rel": -0.00322, + "class": "neutral", + "W0": 248.48, + "H0": 10.96, + "W1": 247.68, + "H1": 10.96, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 8.768, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -8.768, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/gf180/sW2_sL2/independent/C03_gf180_sW2_sL2_independent.gds", + "gds_mode": "runs/grid/C03/gf180/sW2_sL2/diffusion_only/C03_gf180_sW2_sL2_diffusion_only.gds", + "geometry_hash_ref": "d22b6d1518556cb2", + "geometry_hash_mode": "beff64e14b6894e1", + "geometry_identical": false + }, + { + "case": "C03_gf180_sW2_sL2", + "topology": "C03", + "pdk": "gf180", + "size": "sW2_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2723.341, + "A1": 2723.341, + "rel": 0.0, + "class": "neutral", + "W0": 248.48, + "H0": 10.96, + "W1": 248.48, + "H1": 10.96, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/gf180/sW2_sL2/independent/C03_gf180_sW2_sL2_independent.gds", + "gds_mode": "runs/grid/C03/gf180/sW2_sL2/gate_only/C03_gf180_sW2_sL2_gate_only.gds", + "geometry_hash_ref": "d22b6d1518556cb2", + "geometry_hash_mode": "1082ca5d9e2d425d", + "geometry_identical": false + }, + { + "case": "C03_gf180_sW2_sL2", + "topology": "C03", + "pdk": "gf180", + "size": "sW2_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2723.341, + "A1": 2714.573, + "rel": -0.00322, + "class": "neutral", + "W0": 248.48, + "H0": 10.96, + "W1": 247.68, + "H1": 10.96, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 8.768, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -8.768, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/gf180/sW2_sL2/independent/C03_gf180_sW2_sL2_independent.gds", + "gds_mode": "runs/grid/C03/gf180/sW2_sL2/combined/C03_gf180_sW2_sL2_combined.gds", + "geometry_hash_ref": "d22b6d1518556cb2", + "geometry_hash_mode": "e642f8df994fad7f", + "geometry_identical": false + }, + { + "case": "C03_ihp130_sW0.5_sL1.5", + "topology": "C03", + "pdk": "ihp130", + "size": "sW0.5_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 372.088, + "A1": 367.998, + "rel": -0.01099, + "class": "positive", + "W0": 46.395, + "H0": 8.02, + "W1": 45.885, + "H1": 8.02, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 4.0902, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -4.09, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/ihp130/sW0.5_sL1.5/independent/C03_ihp130_sW0p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C03/ihp130/sW0.5_sL1.5/diffusion_only/C03_ihp130_sW0p5_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "0792b1b4ac392fb7", + "geometry_hash_mode": "180fa4b506ce4685", + "geometry_identical": false + }, + { + "case": "C03_ihp130_sW0.5_sL1.5", + "topology": "C03", + "pdk": "ihp130", + "size": "sW0.5_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 372.088, + "A1": 372.088, + "rel": 0.0, + "class": "neutral", + "W0": 46.395, + "H0": 8.02, + "W1": 46.395, + "H1": 8.02, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/ihp130/sW0.5_sL1.5/independent/C03_ihp130_sW0p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C03/ihp130/sW0.5_sL1.5/gate_only/C03_ihp130_sW0p5_sL1p5_gate_only.gds", + "geometry_hash_ref": "0792b1b4ac392fb7", + "geometry_hash_mode": "63a7f0cb906d2aaa", + "geometry_identical": false + }, + { + "case": "C03_ihp130_sW0.5_sL1.5", + "topology": "C03", + "pdk": "ihp130", + "size": "sW0.5_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 372.088, + "A1": 367.998, + "rel": -0.01099, + "class": "positive", + "W0": 46.395, + "H0": 8.02, + "W1": 45.885, + "H1": 8.02, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 4.0902, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -4.09, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/ihp130/sW0.5_sL1.5/independent/C03_ihp130_sW0p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C03/ihp130/sW0.5_sL1.5/combined/C03_ihp130_sW0p5_sL1p5_combined.gds", + "geometry_hash_ref": "0792b1b4ac392fb7", + "geometry_hash_mode": "41fc1604e442786e", + "geometry_identical": false + }, + { + "case": "C03_ihp130_sW0.5_sL1", + "topology": "C03", + "pdk": "ihp130", + "size": "sW0.5_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 271.998, + "A1": 267.908, + "rel": -0.01504, + "class": "positive", + "W0": 33.915, + "H0": 8.02, + "W1": 33.405, + "H1": 8.02, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 4.0902, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -4.09, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/ihp130/sW0.5_sL1/independent/C03_ihp130_sW0p5_sL1_independent.gds", + "gds_mode": "runs/grid/C03/ihp130/sW0.5_sL1/diffusion_only/C03_ihp130_sW0p5_sL1_diffusion_only.gds", + "geometry_hash_ref": "c250e76c465297e3", + "geometry_hash_mode": "8965f739542d3ef1", + "geometry_identical": false + }, + { + "case": "C03_ihp130_sW0.5_sL1", + "topology": "C03", + "pdk": "ihp130", + "size": "sW0.5_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 271.998, + "A1": 271.998, + "rel": 0.0, + "class": "neutral", + "W0": 33.915, + "H0": 8.02, + "W1": 33.915, + "H1": 8.02, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/ihp130/sW0.5_sL1/independent/C03_ihp130_sW0p5_sL1_independent.gds", + "gds_mode": "runs/grid/C03/ihp130/sW0.5_sL1/gate_only/C03_ihp130_sW0p5_sL1_gate_only.gds", + "geometry_hash_ref": "c250e76c465297e3", + "geometry_hash_mode": "ba8db82fc42fe7a6", + "geometry_identical": false + }, + { + "case": "C03_ihp130_sW0.5_sL1", + "topology": "C03", + "pdk": "ihp130", + "size": "sW0.5_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 271.998, + "A1": 267.908, + "rel": -0.01504, + "class": "positive", + "W0": 33.915, + "H0": 8.02, + "W1": 33.405, + "H1": 8.02, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 4.0902, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -4.09, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/ihp130/sW0.5_sL1/independent/C03_ihp130_sW0p5_sL1_independent.gds", + "gds_mode": "runs/grid/C03/ihp130/sW0.5_sL1/combined/C03_ihp130_sW0p5_sL1_combined.gds", + "geometry_hash_ref": "c250e76c465297e3", + "geometry_hash_mode": "dde2b9613d89e9c2", + "geometry_identical": false + }, + { + "case": "C03_ihp130_sW1.5_sL1.5", + "topology": "C03", + "pdk": "ihp130", + "size": "sW1.5_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1045.768, + "A1": 1041.678, + "rel": -0.00391, + "class": "neutral", + "W0": 130.395, + "H0": 8.02, + "W1": 129.885, + "H1": 8.02, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 4.0902, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -4.09, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/ihp130/sW1.5_sL1.5/independent/C03_ihp130_sW1p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C03/ihp130/sW1.5_sL1.5/diffusion_only/C03_ihp130_sW1p5_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "caf9005131f4fb82", + "geometry_hash_mode": "37c7fdd58d84eeef", + "geometry_identical": false + }, + { + "case": "C03_ihp130_sW1.5_sL1.5", + "topology": "C03", + "pdk": "ihp130", + "size": "sW1.5_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1045.768, + "A1": 1045.768, + "rel": 0.0, + "class": "neutral", + "W0": 130.395, + "H0": 8.02, + "W1": 130.395, + "H1": 8.02, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/ihp130/sW1.5_sL1.5/independent/C03_ihp130_sW1p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C03/ihp130/sW1.5_sL1.5/gate_only/C03_ihp130_sW1p5_sL1p5_gate_only.gds", + "geometry_hash_ref": "caf9005131f4fb82", + "geometry_hash_mode": "37b654ebcde453e4", + "geometry_identical": false + }, + { + "case": "C03_ihp130_sW1.5_sL1.5", + "topology": "C03", + "pdk": "ihp130", + "size": "sW1.5_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1045.768, + "A1": 1041.678, + "rel": -0.00391, + "class": "neutral", + "W0": 130.395, + "H0": 8.02, + "W1": 129.885, + "H1": 8.02, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 4.0902, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -4.09, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/ihp130/sW1.5_sL1.5/independent/C03_ihp130_sW1p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C03/ihp130/sW1.5_sL1.5/combined/C03_ihp130_sW1p5_sL1p5_combined.gds", + "geometry_hash_ref": "caf9005131f4fb82", + "geometry_hash_mode": "c83cf42830f83837", + "geometry_identical": false + }, + { + "case": "C03_ihp130_sW1.5_sL1", + "topology": "C03", + "pdk": "ihp130", + "size": "sW1.5_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 745.499, + "A1": 741.409, + "rel": -0.00549, + "class": "positive", + "W0": 92.955, + "H0": 8.02, + "W1": 92.445, + "H1": 8.02, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 4.0902, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -4.09, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/ihp130/sW1.5_sL1/independent/C03_ihp130_sW1p5_sL1_independent.gds", + "gds_mode": "runs/grid/C03/ihp130/sW1.5_sL1/diffusion_only/C03_ihp130_sW1p5_sL1_diffusion_only.gds", + "geometry_hash_ref": "3cdea5a475bafba9", + "geometry_hash_mode": "67427dc11db613f8", + "geometry_identical": false + }, + { + "case": "C03_ihp130_sW1.5_sL1", + "topology": "C03", + "pdk": "ihp130", + "size": "sW1.5_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 745.499, + "A1": 745.499, + "rel": 0.0, + "class": "neutral", + "W0": 92.955, + "H0": 8.02, + "W1": 92.955, + "H1": 8.02, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/ihp130/sW1.5_sL1/independent/C03_ihp130_sW1p5_sL1_independent.gds", + "gds_mode": "runs/grid/C03/ihp130/sW1.5_sL1/gate_only/C03_ihp130_sW1p5_sL1_gate_only.gds", + "geometry_hash_ref": "3cdea5a475bafba9", + "geometry_hash_mode": "223c8d3720d15d72", + "geometry_identical": false + }, + { + "case": "C03_ihp130_sW1.5_sL1", + "topology": "C03", + "pdk": "ihp130", + "size": "sW1.5_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 745.499, + "A1": 741.409, + "rel": -0.00549, + "class": "positive", + "W0": 92.955, + "H0": 8.02, + "W1": 92.445, + "H1": 8.02, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 4.0902, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -4.09, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/ihp130/sW1.5_sL1/independent/C03_ihp130_sW1p5_sL1_independent.gds", + "gds_mode": "runs/grid/C03/ihp130/sW1.5_sL1/combined/C03_ihp130_sW1p5_sL1_combined.gds", + "geometry_hash_ref": "3cdea5a475bafba9", + "geometry_hash_mode": "14e9721e1645295a", + "geometry_identical": false + }, + { + "case": "C03_ihp130_sW1.5_sL2", + "topology": "C03", + "pdk": "ihp130", + "size": "sW1.5_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1346.037, + "A1": 1341.946, + "rel": -0.00304, + "class": "neutral", + "W0": 167.835, + "H0": 8.02, + "W1": 167.325, + "H1": 8.02, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 4.0902, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -4.09, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/ihp130/sW1.5_sL2/independent/C03_ihp130_sW1p5_sL2_independent.gds", + "gds_mode": "runs/grid/C03/ihp130/sW1.5_sL2/diffusion_only/C03_ihp130_sW1p5_sL2_diffusion_only.gds", + "geometry_hash_ref": "337f2cd0cbcffc86", + "geometry_hash_mode": "81d151b130fc7e70", + "geometry_identical": false + }, + { + "case": "C03_ihp130_sW1.5_sL2", + "topology": "C03", + "pdk": "ihp130", + "size": "sW1.5_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1346.037, + "A1": 1346.037, + "rel": 0.0, + "class": "neutral", + "W0": 167.835, + "H0": 8.02, + "W1": 167.835, + "H1": 8.02, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/ihp130/sW1.5_sL2/independent/C03_ihp130_sW1p5_sL2_independent.gds", + "gds_mode": "runs/grid/C03/ihp130/sW1.5_sL2/gate_only/C03_ihp130_sW1p5_sL2_gate_only.gds", + "geometry_hash_ref": "337f2cd0cbcffc86", + "geometry_hash_mode": "62e161f7172ddd2c", + "geometry_identical": false + }, + { + "case": "C03_ihp130_sW1.5_sL2", + "topology": "C03", + "pdk": "ihp130", + "size": "sW1.5_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1346.037, + "A1": 1341.946, + "rel": -0.00304, + "class": "neutral", + "W0": 167.835, + "H0": 8.02, + "W1": 167.325, + "H1": 8.02, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 4.0902, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -4.09, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/ihp130/sW1.5_sL2/independent/C03_ihp130_sW1p5_sL2_independent.gds", + "gds_mode": "runs/grid/C03/ihp130/sW1.5_sL2/combined/C03_ihp130_sW1p5_sL2_combined.gds", + "geometry_hash_ref": "337f2cd0cbcffc86", + "geometry_hash_mode": "bcb1bc15d4348661", + "geometry_identical": false + }, + { + "case": "C03_ihp130_sW1_sL1.5", + "topology": "C03", + "pdk": "ihp130", + "size": "sW1_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 708.928, + "A1": 704.838, + "rel": -0.00577, + "class": "positive", + "W0": 88.395, + "H0": 8.02, + "W1": 87.885, + "H1": 8.02, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 4.0902, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -4.09, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/ihp130/sW1_sL1.5/independent/C03_ihp130_sW1_sL1p5_independent.gds", + "gds_mode": "runs/grid/C03/ihp130/sW1_sL1.5/diffusion_only/C03_ihp130_sW1_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "3c84c435c26499d1", + "geometry_hash_mode": "2662c7a3c0f52261", + "geometry_identical": false + }, + { + "case": "C03_ihp130_sW1_sL1.5", + "topology": "C03", + "pdk": "ihp130", + "size": "sW1_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 708.928, + "A1": 708.928, + "rel": 0.0, + "class": "neutral", + "W0": 88.395, + "H0": 8.02, + "W1": 88.395, + "H1": 8.02, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/ihp130/sW1_sL1.5/independent/C03_ihp130_sW1_sL1p5_independent.gds", + "gds_mode": "runs/grid/C03/ihp130/sW1_sL1.5/gate_only/C03_ihp130_sW1_sL1p5_gate_only.gds", + "geometry_hash_ref": "3c84c435c26499d1", + "geometry_hash_mode": "b8ad6c891a4c5a44", + "geometry_identical": false + }, + { + "case": "C03_ihp130_sW1_sL1.5", + "topology": "C03", + "pdk": "ihp130", + "size": "sW1_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 708.928, + "A1": 704.838, + "rel": -0.00577, + "class": "positive", + "W0": 88.395, + "H0": 8.02, + "W1": 87.885, + "H1": 8.02, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 4.0902, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -4.09, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/ihp130/sW1_sL1.5/independent/C03_ihp130_sW1_sL1p5_independent.gds", + "gds_mode": "runs/grid/C03/ihp130/sW1_sL1.5/combined/C03_ihp130_sW1_sL1p5_combined.gds", + "geometry_hash_ref": "3c84c435c26499d1", + "geometry_hash_mode": "7243c0b817583cf4", + "geometry_identical": false + }, + { + "case": "C03_ihp130_sW1_sL1", + "topology": "C03", + "pdk": "ihp130", + "size": "sW1_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 508.749, + "A1": 504.658, + "rel": -0.00804, + "class": "positive", + "W0": 63.435, + "H0": 8.02, + "W1": 62.925, + "H1": 8.02, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 4.0902, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -4.09, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/ihp130/sW1_sL1/independent/C03_ihp130_sW1_sL1_independent.gds", + "gds_mode": "runs/grid/C03/ihp130/sW1_sL1/diffusion_only/C03_ihp130_sW1_sL1_diffusion_only.gds", + "geometry_hash_ref": "d0ef47d6900ea1b8", + "geometry_hash_mode": "6cd9d9d409d2f7e6", + "geometry_identical": false + }, + { + "case": "C03_ihp130_sW1_sL1", + "topology": "C03", + "pdk": "ihp130", + "size": "sW1_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 508.749, + "A1": 508.749, + "rel": 0.0, + "class": "neutral", + "W0": 63.435, + "H0": 8.02, + "W1": 63.435, + "H1": 8.02, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/ihp130/sW1_sL1/independent/C03_ihp130_sW1_sL1_independent.gds", + "gds_mode": "runs/grid/C03/ihp130/sW1_sL1/gate_only/C03_ihp130_sW1_sL1_gate_only.gds", + "geometry_hash_ref": "d0ef47d6900ea1b8", + "geometry_hash_mode": "73284febc810dec9", + "geometry_identical": false + }, + { + "case": "C03_ihp130_sW1_sL1", + "topology": "C03", + "pdk": "ihp130", + "size": "sW1_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 508.749, + "A1": 504.658, + "rel": -0.00804, + "class": "positive", + "W0": 63.435, + "H0": 8.02, + "W1": 62.925, + "H1": 8.02, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 4.0902, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -4.09, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/ihp130/sW1_sL1/independent/C03_ihp130_sW1_sL1_independent.gds", + "gds_mode": "runs/grid/C03/ihp130/sW1_sL1/combined/C03_ihp130_sW1_sL1_combined.gds", + "geometry_hash_ref": "d0ef47d6900ea1b8", + "geometry_hash_mode": "50c85f3527e65fd6", + "geometry_identical": false + }, + { + "case": "C03_ihp130_sW1_sL2", + "topology": "C03", + "pdk": "ihp130", + "size": "sW1_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 909.107, + "A1": 905.017, + "rel": -0.0045, + "class": "neutral", + "W0": 113.355, + "H0": 8.02, + "W1": 112.845, + "H1": 8.02, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 4.0902, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -4.09, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/ihp130/sW1_sL2/independent/C03_ihp130_sW1_sL2_independent.gds", + "gds_mode": "runs/grid/C03/ihp130/sW1_sL2/diffusion_only/C03_ihp130_sW1_sL2_diffusion_only.gds", + "geometry_hash_ref": "9b34d74c676523a8", + "geometry_hash_mode": "f7ec1c56c2639b33", + "geometry_identical": false + }, + { + "case": "C03_ihp130_sW1_sL2", + "topology": "C03", + "pdk": "ihp130", + "size": "sW1_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 909.107, + "A1": 909.107, + "rel": 0.0, + "class": "neutral", + "W0": 113.355, + "H0": 8.02, + "W1": 113.355, + "H1": 8.02, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/ihp130/sW1_sL2/independent/C03_ihp130_sW1_sL2_independent.gds", + "gds_mode": "runs/grid/C03/ihp130/sW1_sL2/gate_only/C03_ihp130_sW1_sL2_gate_only.gds", + "geometry_hash_ref": "9b34d74c676523a8", + "geometry_hash_mode": "e4c9324ddf323d5d", + "geometry_identical": false + }, + { + "case": "C03_ihp130_sW1_sL2", + "topology": "C03", + "pdk": "ihp130", + "size": "sW1_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 909.107, + "A1": 905.017, + "rel": -0.0045, + "class": "neutral", + "W0": 113.355, + "H0": 8.02, + "W1": 112.845, + "H1": 8.02, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 4.0902, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -4.09, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/ihp130/sW1_sL2/independent/C03_ihp130_sW1_sL2_independent.gds", + "gds_mode": "runs/grid/C03/ihp130/sW1_sL2/combined/C03_ihp130_sW1_sL2_combined.gds", + "geometry_hash_ref": "9b34d74c676523a8", + "geometry_hash_mode": "90549d11d48f9c68", + "geometry_identical": false + }, + { + "case": "C03_ihp130_sW2_sL1.5", + "topology": "C03", + "pdk": "ihp130", + "size": "sW2_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1382.608, + "A1": 1378.518, + "rel": -0.00296, + "class": "neutral", + "W0": 172.395, + "H0": 8.02, + "W1": 171.885, + "H1": 8.02, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 4.0902, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -4.09, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/ihp130/sW2_sL1.5/independent/C03_ihp130_sW2_sL1p5_independent.gds", + "gds_mode": "runs/grid/C03/ihp130/sW2_sL1.5/diffusion_only/C03_ihp130_sW2_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "7e1217fd761da43b", + "geometry_hash_mode": "e92a6660ad85205a", + "geometry_identical": false + }, + { + "case": "C03_ihp130_sW2_sL1.5", + "topology": "C03", + "pdk": "ihp130", + "size": "sW2_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1382.608, + "A1": 1382.608, + "rel": 0.0, + "class": "neutral", + "W0": 172.395, + "H0": 8.02, + "W1": 172.395, + "H1": 8.02, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/ihp130/sW2_sL1.5/independent/C03_ihp130_sW2_sL1p5_independent.gds", + "gds_mode": "runs/grid/C03/ihp130/sW2_sL1.5/gate_only/C03_ihp130_sW2_sL1p5_gate_only.gds", + "geometry_hash_ref": "7e1217fd761da43b", + "geometry_hash_mode": "0d2f55a074b6ceee", + "geometry_identical": false + }, + { + "case": "C03_ihp130_sW2_sL1.5", + "topology": "C03", + "pdk": "ihp130", + "size": "sW2_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1382.608, + "A1": 1378.518, + "rel": -0.00296, + "class": "neutral", + "W0": 172.395, + "H0": 8.02, + "W1": 171.885, + "H1": 8.02, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 4.0902, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -4.09, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/ihp130/sW2_sL1.5/independent/C03_ihp130_sW2_sL1p5_independent.gds", + "gds_mode": "runs/grid/C03/ihp130/sW2_sL1.5/combined/C03_ihp130_sW2_sL1p5_combined.gds", + "geometry_hash_ref": "7e1217fd761da43b", + "geometry_hash_mode": "c116cb0c1729319e", + "geometry_identical": false + }, + { + "case": "C03_ihp130_sW2_sL1", + "topology": "C03", + "pdk": "ihp130", + "size": "sW2_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 982.249, + "A1": 978.159, + "rel": -0.00416, + "class": "neutral", + "W0": 122.475, + "H0": 8.02, + "W1": 121.965, + "H1": 8.02, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 4.0902, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -4.09, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/ihp130/sW2_sL1/independent/C03_ihp130_sW2_sL1_independent.gds", + "gds_mode": "runs/grid/C03/ihp130/sW2_sL1/diffusion_only/C03_ihp130_sW2_sL1_diffusion_only.gds", + "geometry_hash_ref": "71a29b37e672ec0c", + "geometry_hash_mode": "904cdd3c73ea01c4", + "geometry_identical": false + }, + { + "case": "C03_ihp130_sW2_sL1", + "topology": "C03", + "pdk": "ihp130", + "size": "sW2_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 982.249, + "A1": 982.249, + "rel": 0.0, + "class": "neutral", + "W0": 122.475, + "H0": 8.02, + "W1": 122.475, + "H1": 8.02, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/ihp130/sW2_sL1/independent/C03_ihp130_sW2_sL1_independent.gds", + "gds_mode": "runs/grid/C03/ihp130/sW2_sL1/gate_only/C03_ihp130_sW2_sL1_gate_only.gds", + "geometry_hash_ref": "71a29b37e672ec0c", + "geometry_hash_mode": "9fd6505507fad826", + "geometry_identical": false + }, + { + "case": "C03_ihp130_sW2_sL1", + "topology": "C03", + "pdk": "ihp130", + "size": "sW2_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 982.249, + "A1": 978.159, + "rel": -0.00416, + "class": "neutral", + "W0": 122.475, + "H0": 8.02, + "W1": 121.965, + "H1": 8.02, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 4.0902, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -4.09, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/ihp130/sW2_sL1/independent/C03_ihp130_sW2_sL1_independent.gds", + "gds_mode": "runs/grid/C03/ihp130/sW2_sL1/combined/C03_ihp130_sW2_sL1_combined.gds", + "geometry_hash_ref": "71a29b37e672ec0c", + "geometry_hash_mode": "b944a6c1ce80e87e", + "geometry_identical": false + }, + { + "case": "C03_ihp130_sW2_sL2", + "topology": "C03", + "pdk": "ihp130", + "size": "sW2_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1782.966, + "A1": 1778.876, + "rel": -0.00229, + "class": "neutral", + "W0": 222.315, + "H0": 8.02, + "W1": 221.805, + "H1": 8.02, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 4.0902, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -4.09, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/ihp130/sW2_sL2/independent/C03_ihp130_sW2_sL2_independent.gds", + "gds_mode": "runs/grid/C03/ihp130/sW2_sL2/diffusion_only/C03_ihp130_sW2_sL2_diffusion_only.gds", + "geometry_hash_ref": "a3ad0bf456000f6e", + "geometry_hash_mode": "809ee6e9360b927e", + "geometry_identical": false + }, + { + "case": "C03_ihp130_sW2_sL2", + "topology": "C03", + "pdk": "ihp130", + "size": "sW2_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1782.966, + "A1": 1782.966, + "rel": 0.0, + "class": "neutral", + "W0": 222.315, + "H0": 8.02, + "W1": 222.315, + "H1": 8.02, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/ihp130/sW2_sL2/independent/C03_ihp130_sW2_sL2_independent.gds", + "gds_mode": "runs/grid/C03/ihp130/sW2_sL2/gate_only/C03_ihp130_sW2_sL2_gate_only.gds", + "geometry_hash_ref": "a3ad0bf456000f6e", + "geometry_hash_mode": "e85bc64545226b83", + "geometry_identical": false + }, + { + "case": "C03_ihp130_sW2_sL2", + "topology": "C03", + "pdk": "ihp130", + "size": "sW2_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1782.966, + "A1": 1778.876, + "rel": -0.00229, + "class": "neutral", + "W0": 222.315, + "H0": 8.02, + "W1": 221.805, + "H1": 8.02, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 4.0902, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -4.09, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/ihp130/sW2_sL2/independent/C03_ihp130_sW2_sL2_independent.gds", + "gds_mode": "runs/grid/C03/ihp130/sW2_sL2/combined/C03_ihp130_sW2_sL2_combined.gds", + "geometry_hash_ref": "a3ad0bf456000f6e", + "geometry_hash_mode": "755d61a934f4a1ef", + "geometry_identical": false + }, + { + "case": "C03_sky130_sW0.5_sL1.5", + "topology": "C03", + "pdk": "sky130", + "size": "sW0.5_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 250.24, + "A1": 245.584, + "rel": -0.01861, + "class": "positive", + "W0": 30.095, + "H0": 8.315, + "W1": 29.535, + "H1": 8.315, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 4.6564, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -4.656, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/sky130/sW0.5_sL1.5/independent/C03_sky130_sW0p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C03/sky130/sW0.5_sL1.5/diffusion_only/C03_sky130_sW0p5_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "6de1194afb6ff3ab", + "geometry_hash_mode": "88c5336f7f449bea", + "geometry_identical": false + }, + { + "case": "C03_sky130_sW0.5_sL1.5", + "topology": "C03", + "pdk": "sky130", + "size": "sW0.5_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 250.24, + "A1": 250.24, + "rel": 0.0, + "class": "neutral", + "W0": 30.095, + "H0": 8.315, + "W1": 30.095, + "H1": 8.315, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/sky130/sW0.5_sL1.5/independent/C03_sky130_sW0p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C03/sky130/sW0.5_sL1.5/gate_only/C03_sky130_sW0p5_sL1p5_gate_only.gds", + "geometry_hash_ref": "6de1194afb6ff3ab", + "geometry_hash_mode": "0e0d41ec53f809e6", + "geometry_identical": false + }, + { + "case": "C03_sky130_sW0.5_sL1.5", + "topology": "C03", + "pdk": "sky130", + "size": "sW0.5_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 250.24, + "A1": 245.584, + "rel": -0.01861, + "class": "positive", + "W0": 30.095, + "H0": 8.315, + "W1": 29.535, + "H1": 8.315, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 4.6564, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -4.656, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/sky130/sW0.5_sL1.5/independent/C03_sky130_sW0p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C03/sky130/sW0.5_sL1.5/combined/C03_sky130_sW0p5_sL1p5_combined.gds", + "geometry_hash_ref": "6de1194afb6ff3ab", + "geometry_hash_mode": "9c3eb50b69c9414a", + "geometry_identical": false + }, + { + "case": "C03_sky130_sW0.5_sL1", + "topology": "C03", + "pdk": "sky130", + "size": "sW0.5_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 190.372, + "A1": 185.716, + "rel": -0.02446, + "class": "positive", + "W0": 22.895, + "H0": 8.315, + "W1": 22.335, + "H1": 8.315, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 4.6564, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -4.656, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/sky130/sW0.5_sL1/independent/C03_sky130_sW0p5_sL1_independent.gds", + "gds_mode": "runs/grid/C03/sky130/sW0.5_sL1/diffusion_only/C03_sky130_sW0p5_sL1_diffusion_only.gds", + "geometry_hash_ref": "7077e90c51d4c7ac", + "geometry_hash_mode": "7d3aaef09ce46d8c", + "geometry_identical": false + }, + { + "case": "C03_sky130_sW0.5_sL1", + "topology": "C03", + "pdk": "sky130", + "size": "sW0.5_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 190.372, + "A1": 190.372, + "rel": 0.0, + "class": "neutral", + "W0": 22.895, + "H0": 8.315, + "W1": 22.895, + "H1": 8.315, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/sky130/sW0.5_sL1/independent/C03_sky130_sW0p5_sL1_independent.gds", + "gds_mode": "runs/grid/C03/sky130/sW0.5_sL1/gate_only/C03_sky130_sW0p5_sL1_gate_only.gds", + "geometry_hash_ref": "7077e90c51d4c7ac", + "geometry_hash_mode": "95480c502acf0d1c", + "geometry_identical": false + }, + { + "case": "C03_sky130_sW0.5_sL1", + "topology": "C03", + "pdk": "sky130", + "size": "sW0.5_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 190.372, + "A1": 185.716, + "rel": -0.02446, + "class": "positive", + "W0": 22.895, + "H0": 8.315, + "W1": 22.335, + "H1": 8.315, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 4.6564, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -4.656, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/sky130/sW0.5_sL1/independent/C03_sky130_sW0p5_sL1_independent.gds", + "gds_mode": "runs/grid/C03/sky130/sW0.5_sL1/combined/C03_sky130_sW0p5_sL1_combined.gds", + "geometry_hash_ref": "7077e90c51d4c7ac", + "geometry_hash_mode": "7477b4af19ca870b", + "geometry_identical": false + }, + { + "case": "C03_sky130_sW0.5_sL2", + "topology": "C03", + "pdk": "sky130", + "size": "sW0.5_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 310.108, + "A1": 305.452, + "rel": -0.01502, + "class": "positive", + "W0": 37.295, + "H0": 8.315, + "W1": 36.735, + "H1": 8.315, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 4.6564, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -4.656, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/sky130/sW0.5_sL2/independent/C03_sky130_sW0p5_sL2_independent.gds", + "gds_mode": "runs/grid/C03/sky130/sW0.5_sL2/diffusion_only/C03_sky130_sW0p5_sL2_diffusion_only.gds", + "geometry_hash_ref": "0d911fb3072a5b45", + "geometry_hash_mode": "ca1a62073b23bfd8", + "geometry_identical": false + }, + { + "case": "C03_sky130_sW0.5_sL2", + "topology": "C03", + "pdk": "sky130", + "size": "sW0.5_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 310.108, + "A1": 310.108, + "rel": 0.0, + "class": "neutral", + "W0": 37.295, + "H0": 8.315, + "W1": 37.295, + "H1": 8.315, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/sky130/sW0.5_sL2/independent/C03_sky130_sW0p5_sL2_independent.gds", + "gds_mode": "runs/grid/C03/sky130/sW0.5_sL2/gate_only/C03_sky130_sW0p5_sL2_gate_only.gds", + "geometry_hash_ref": "0d911fb3072a5b45", + "geometry_hash_mode": "c71c94fe92263abc", + "geometry_identical": false + }, + { + "case": "C03_sky130_sW0.5_sL2", + "topology": "C03", + "pdk": "sky130", + "size": "sW0.5_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 310.108, + "A1": 305.452, + "rel": -0.01502, + "class": "positive", + "W0": 37.295, + "H0": 8.315, + "W1": 36.735, + "H1": 8.315, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 4.6564, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -4.656, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/sky130/sW0.5_sL2/independent/C03_sky130_sW0p5_sL2_independent.gds", + "gds_mode": "runs/grid/C03/sky130/sW0.5_sL2/combined/C03_sky130_sW0p5_sL2_combined.gds", + "geometry_hash_ref": "0d911fb3072a5b45", + "geometry_hash_mode": "97053ef99b2716e9", + "geometry_identical": false + }, + { + "case": "C03_sky130_sW1.5_sL1.5", + "topology": "C03", + "pdk": "sky130", + "size": "sW1.5_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 667.32, + "A1": 662.664, + "rel": -0.00698, + "class": "positive", + "W0": 80.255, + "H0": 8.315, + "W1": 79.695, + "H1": 8.315, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 4.6564, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -4.656, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/sky130/sW1.5_sL1.5/independent/C03_sky130_sW1p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C03/sky130/sW1.5_sL1.5/diffusion_only/C03_sky130_sW1p5_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "f5414aa8e2272c4f", + "geometry_hash_mode": "456e9b2d2412bd3d", + "geometry_identical": false + }, + { + "case": "C03_sky130_sW1.5_sL1.5", + "topology": "C03", + "pdk": "sky130", + "size": "sW1.5_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 667.32, + "A1": 667.32, + "rel": 0.0, + "class": "neutral", + "W0": 80.255, + "H0": 8.315, + "W1": 80.255, + "H1": 8.315, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/sky130/sW1.5_sL1.5/independent/C03_sky130_sW1p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C03/sky130/sW1.5_sL1.5/gate_only/C03_sky130_sW1p5_sL1p5_gate_only.gds", + "geometry_hash_ref": "f5414aa8e2272c4f", + "geometry_hash_mode": "4596b12012b0fad8", + "geometry_identical": false + }, + { + "case": "C03_sky130_sW1.5_sL1.5", + "topology": "C03", + "pdk": "sky130", + "size": "sW1.5_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 667.32, + "A1": 662.664, + "rel": -0.00698, + "class": "positive", + "W0": 80.255, + "H0": 8.315, + "W1": 79.695, + "H1": 8.315, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 4.6564, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -4.656, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/sky130/sW1.5_sL1.5/independent/C03_sky130_sW1p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C03/sky130/sW1.5_sL1.5/combined/C03_sky130_sW1p5_sL1p5_combined.gds", + "geometry_hash_ref": "f5414aa8e2272c4f", + "geometry_hash_mode": "9a874f7f390e61ff", + "geometry_identical": false + }, + { + "case": "C03_sky130_sW1.5_sL1", + "topology": "C03", + "pdk": "sky130", + "size": "sW1.5_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 487.716, + "A1": 483.06, + "rel": -0.00955, + "class": "positive", + "W0": 58.655, + "H0": 8.315, + "W1": 58.095, + "H1": 8.315, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 4.6564, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -4.656, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/sky130/sW1.5_sL1/independent/C03_sky130_sW1p5_sL1_independent.gds", + "gds_mode": "runs/grid/C03/sky130/sW1.5_sL1/diffusion_only/C03_sky130_sW1p5_sL1_diffusion_only.gds", + "geometry_hash_ref": "8dfdc660be86d9ef", + "geometry_hash_mode": "3fad7064bb0f32f1", + "geometry_identical": false + }, + { + "case": "C03_sky130_sW1.5_sL1", + "topology": "C03", + "pdk": "sky130", + "size": "sW1.5_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 487.716, + "A1": 487.716, + "rel": 0.0, + "class": "neutral", + "W0": 58.655, + "H0": 8.315, + "W1": 58.655, + "H1": 8.315, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/sky130/sW1.5_sL1/independent/C03_sky130_sW1p5_sL1_independent.gds", + "gds_mode": "runs/grid/C03/sky130/sW1.5_sL1/gate_only/C03_sky130_sW1p5_sL1_gate_only.gds", + "geometry_hash_ref": "8dfdc660be86d9ef", + "geometry_hash_mode": "cebdbf11f6db1daa", + "geometry_identical": false + }, + { + "case": "C03_sky130_sW1.5_sL1", + "topology": "C03", + "pdk": "sky130", + "size": "sW1.5_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 487.716, + "A1": 483.06, + "rel": -0.00955, + "class": "positive", + "W0": 58.655, + "H0": 8.315, + "W1": 58.095, + "H1": 8.315, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 4.6564, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -4.656, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/sky130/sW1.5_sL1/independent/C03_sky130_sW1p5_sL1_independent.gds", + "gds_mode": "runs/grid/C03/sky130/sW1.5_sL1/combined/C03_sky130_sW1p5_sL1_combined.gds", + "geometry_hash_ref": "8dfdc660be86d9ef", + "geometry_hash_mode": "9a3b4552b9d57e5d", + "geometry_identical": false + }, + { + "case": "C03_sky130_sW1.5_sL2", + "topology": "C03", + "pdk": "sky130", + "size": "sW1.5_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 846.924, + "A1": 842.268, + "rel": -0.0055, + "class": "positive", + "W0": 101.855, + "H0": 8.315, + "W1": 101.295, + "H1": 8.315, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 4.6564, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -4.656, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/sky130/sW1.5_sL2/independent/C03_sky130_sW1p5_sL2_independent.gds", + "gds_mode": "runs/grid/C03/sky130/sW1.5_sL2/diffusion_only/C03_sky130_sW1p5_sL2_diffusion_only.gds", + "geometry_hash_ref": "19b80c91b33371d7", + "geometry_hash_mode": "0b01578b723179d0", + "geometry_identical": false + }, + { + "case": "C03_sky130_sW1.5_sL2", + "topology": "C03", + "pdk": "sky130", + "size": "sW1.5_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 846.924, + "A1": 846.924, + "rel": 0.0, + "class": "neutral", + "W0": 101.855, + "H0": 8.315, + "W1": 101.855, + "H1": 8.315, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/sky130/sW1.5_sL2/independent/C03_sky130_sW1p5_sL2_independent.gds", + "gds_mode": "runs/grid/C03/sky130/sW1.5_sL2/gate_only/C03_sky130_sW1p5_sL2_gate_only.gds", + "geometry_hash_ref": "19b80c91b33371d7", + "geometry_hash_mode": "483f6d47732c4caa", + "geometry_identical": false + }, + { + "case": "C03_sky130_sW1.5_sL2", + "topology": "C03", + "pdk": "sky130", + "size": "sW1.5_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 846.924, + "A1": 842.268, + "rel": -0.0055, + "class": "positive", + "W0": 101.855, + "H0": 8.315, + "W1": 101.295, + "H1": 8.315, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 4.6564, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -4.656, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/sky130/sW1.5_sL2/independent/C03_sky130_sW1p5_sL2_independent.gds", + "gds_mode": "runs/grid/C03/sky130/sW1.5_sL2/combined/C03_sky130_sW1p5_sL2_combined.gds", + "geometry_hash_ref": "19b80c91b33371d7", + "geometry_hash_mode": "2ebfda10e7fd1d1b", + "geometry_identical": false + }, + { + "case": "C03_sky130_sW1_sL1.5", + "topology": "C03", + "pdk": "sky130", + "size": "sW1_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 458.78, + "A1": 454.124, + "rel": -0.01015, + "class": "positive", + "W0": 55.175, + "H0": 8.315, + "W1": 54.615, + "H1": 8.315, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 4.6564, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -4.656, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/sky130/sW1_sL1.5/independent/C03_sky130_sW1_sL1p5_independent.gds", + "gds_mode": "runs/grid/C03/sky130/sW1_sL1.5/diffusion_only/C03_sky130_sW1_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "4f99556a1c96f0d9", + "geometry_hash_mode": "634f479a6e15bf70", + "geometry_identical": false + }, + { + "case": "C03_sky130_sW1_sL1.5", + "topology": "C03", + "pdk": "sky130", + "size": "sW1_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 458.78, + "A1": 458.78, + "rel": 0.0, + "class": "neutral", + "W0": 55.175, + "H0": 8.315, + "W1": 55.175, + "H1": 8.315, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/sky130/sW1_sL1.5/independent/C03_sky130_sW1_sL1p5_independent.gds", + "gds_mode": "runs/grid/C03/sky130/sW1_sL1.5/gate_only/C03_sky130_sW1_sL1p5_gate_only.gds", + "geometry_hash_ref": "4f99556a1c96f0d9", + "geometry_hash_mode": "3f06f111e3a9688d", + "geometry_identical": false + }, + { + "case": "C03_sky130_sW1_sL1.5", + "topology": "C03", + "pdk": "sky130", + "size": "sW1_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 458.78, + "A1": 454.124, + "rel": -0.01015, + "class": "positive", + "W0": 55.175, + "H0": 8.315, + "W1": 54.615, + "H1": 8.315, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 4.6564, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -4.656, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/sky130/sW1_sL1.5/independent/C03_sky130_sW1_sL1p5_independent.gds", + "gds_mode": "runs/grid/C03/sky130/sW1_sL1.5/combined/C03_sky130_sW1_sL1p5_combined.gds", + "geometry_hash_ref": "4f99556a1c96f0d9", + "geometry_hash_mode": "fadc063e0babcdda", + "geometry_identical": false + }, + { + "case": "C03_sky130_sW1_sL1", + "topology": "C03", + "pdk": "sky130", + "size": "sW1_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 339.044, + "A1": 334.388, + "rel": -0.01373, + "class": "positive", + "W0": 40.775, + "H0": 8.315, + "W1": 40.215, + "H1": 8.315, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 4.6564, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -4.656, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/sky130/sW1_sL1/independent/C03_sky130_sW1_sL1_independent.gds", + "gds_mode": "runs/grid/C03/sky130/sW1_sL1/diffusion_only/C03_sky130_sW1_sL1_diffusion_only.gds", + "geometry_hash_ref": "03832ab207593d3d", + "geometry_hash_mode": "7000974260e98be4", + "geometry_identical": false + }, + { + "case": "C03_sky130_sW1_sL1", + "topology": "C03", + "pdk": "sky130", + "size": "sW1_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 339.044, + "A1": 339.044, + "rel": 0.0, + "class": "neutral", + "W0": 40.775, + "H0": 8.315, + "W1": 40.775, + "H1": 8.315, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/sky130/sW1_sL1/independent/C03_sky130_sW1_sL1_independent.gds", + "gds_mode": "runs/grid/C03/sky130/sW1_sL1/gate_only/C03_sky130_sW1_sL1_gate_only.gds", + "geometry_hash_ref": "03832ab207593d3d", + "geometry_hash_mode": "d26578bfd38ef2db", + "geometry_identical": false + }, + { + "case": "C03_sky130_sW1_sL1", + "topology": "C03", + "pdk": "sky130", + "size": "sW1_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 339.044, + "A1": 334.388, + "rel": -0.01373, + "class": "positive", + "W0": 40.775, + "H0": 8.315, + "W1": 40.215, + "H1": 8.315, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 4.6564, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -4.656, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/sky130/sW1_sL1/independent/C03_sky130_sW1_sL1_independent.gds", + "gds_mode": "runs/grid/C03/sky130/sW1_sL1/combined/C03_sky130_sW1_sL1_combined.gds", + "geometry_hash_ref": "03832ab207593d3d", + "geometry_hash_mode": "bb232f2042121a1b", + "geometry_identical": false + }, + { + "case": "C03_sky130_sW1_sL2", + "topology": "C03", + "pdk": "sky130", + "size": "sW1_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 578.516, + "A1": 573.86, + "rel": -0.00805, + "class": "positive", + "W0": 69.575, + "H0": 8.315, + "W1": 69.015, + "H1": 8.315, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 4.6564, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -4.656, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/sky130/sW1_sL2/independent/C03_sky130_sW1_sL2_independent.gds", + "gds_mode": "runs/grid/C03/sky130/sW1_sL2/diffusion_only/C03_sky130_sW1_sL2_diffusion_only.gds", + "geometry_hash_ref": "f04d4eba2e112cba", + "geometry_hash_mode": "bb7918adf8f464bf", + "geometry_identical": false + }, + { + "case": "C03_sky130_sW1_sL2", + "topology": "C03", + "pdk": "sky130", + "size": "sW1_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 578.516, + "A1": 578.516, + "rel": 0.0, + "class": "neutral", + "W0": 69.575, + "H0": 8.315, + "W1": 69.575, + "H1": 8.315, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/sky130/sW1_sL2/independent/C03_sky130_sW1_sL2_independent.gds", + "gds_mode": "runs/grid/C03/sky130/sW1_sL2/gate_only/C03_sky130_sW1_sL2_gate_only.gds", + "geometry_hash_ref": "f04d4eba2e112cba", + "geometry_hash_mode": "fa7c2b2a223cd61c", + "geometry_identical": false + }, + { + "case": "C03_sky130_sW1_sL2", + "topology": "C03", + "pdk": "sky130", + "size": "sW1_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 578.516, + "A1": 573.86, + "rel": -0.00805, + "class": "positive", + "W0": 69.575, + "H0": 8.315, + "W1": 69.015, + "H1": 8.315, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 4.6564, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -4.656, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/sky130/sW1_sL2/independent/C03_sky130_sW1_sL2_independent.gds", + "gds_mode": "runs/grid/C03/sky130/sW1_sL2/combined/C03_sky130_sW1_sL2_combined.gds", + "geometry_hash_ref": "f04d4eba2e112cba", + "geometry_hash_mode": "fd05c8cb07c619fa", + "geometry_identical": false + }, + { + "case": "C03_sky130_sW2_sL1.5", + "topology": "C03", + "pdk": "sky130", + "size": "sW2_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 875.861, + "A1": 871.204, + "rel": -0.00532, + "class": "positive", + "W0": 105.335, + "H0": 8.315, + "W1": 104.775, + "H1": 8.315, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 4.6564, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -4.656, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/sky130/sW2_sL1.5/independent/C03_sky130_sW2_sL1p5_independent.gds", + "gds_mode": "runs/grid/C03/sky130/sW2_sL1.5/diffusion_only/C03_sky130_sW2_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "849798dd82a1639c", + "geometry_hash_mode": "4f8af1f0a851dd1a", + "geometry_identical": false + }, + { + "case": "C03_sky130_sW2_sL1.5", + "topology": "C03", + "pdk": "sky130", + "size": "sW2_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 875.861, + "A1": 875.861, + "rel": 0.0, + "class": "neutral", + "W0": 105.335, + "H0": 8.315, + "W1": 105.335, + "H1": 8.315, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/sky130/sW2_sL1.5/independent/C03_sky130_sW2_sL1p5_independent.gds", + "gds_mode": "runs/grid/C03/sky130/sW2_sL1.5/gate_only/C03_sky130_sW2_sL1p5_gate_only.gds", + "geometry_hash_ref": "849798dd82a1639c", + "geometry_hash_mode": "eb5b4a9142711d77", + "geometry_identical": false + }, + { + "case": "C03_sky130_sW2_sL1.5", + "topology": "C03", + "pdk": "sky130", + "size": "sW2_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 875.861, + "A1": 871.204, + "rel": -0.00532, + "class": "positive", + "W0": 105.335, + "H0": 8.315, + "W1": 104.775, + "H1": 8.315, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 4.6564, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -4.656, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/sky130/sW2_sL1.5/independent/C03_sky130_sW2_sL1p5_independent.gds", + "gds_mode": "runs/grid/C03/sky130/sW2_sL1.5/combined/C03_sky130_sW2_sL1p5_combined.gds", + "geometry_hash_ref": "849798dd82a1639c", + "geometry_hash_mode": "98413e3e54d64e2d", + "geometry_identical": false + }, + { + "case": "C03_sky130_sW2_sL1", + "topology": "C03", + "pdk": "sky130", + "size": "sW2_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 636.389, + "A1": 631.732, + "rel": -0.00732, + "class": "positive", + "W0": 76.535, + "H0": 8.315, + "W1": 75.975, + "H1": 8.315, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 4.6564, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -4.656, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/sky130/sW2_sL1/independent/C03_sky130_sW2_sL1_independent.gds", + "gds_mode": "runs/grid/C03/sky130/sW2_sL1/diffusion_only/C03_sky130_sW2_sL1_diffusion_only.gds", + "geometry_hash_ref": "e88086d2dc9dc81e", + "geometry_hash_mode": "94264dece1b259b1", + "geometry_identical": false + }, + { + "case": "C03_sky130_sW2_sL1", + "topology": "C03", + "pdk": "sky130", + "size": "sW2_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 636.389, + "A1": 636.389, + "rel": 0.0, + "class": "neutral", + "W0": 76.535, + "H0": 8.315, + "W1": 76.535, + "H1": 8.315, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/sky130/sW2_sL1/independent/C03_sky130_sW2_sL1_independent.gds", + "gds_mode": "runs/grid/C03/sky130/sW2_sL1/gate_only/C03_sky130_sW2_sL1_gate_only.gds", + "geometry_hash_ref": "e88086d2dc9dc81e", + "geometry_hash_mode": "deb92be408717187", + "geometry_identical": false + }, + { + "case": "C03_sky130_sW2_sL1", + "topology": "C03", + "pdk": "sky130", + "size": "sW2_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 636.389, + "A1": 631.732, + "rel": -0.00732, + "class": "positive", + "W0": 76.535, + "H0": 8.315, + "W1": 75.975, + "H1": 8.315, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 4.6564, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -4.656, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/sky130/sW2_sL1/independent/C03_sky130_sW2_sL1_independent.gds", + "gds_mode": "runs/grid/C03/sky130/sW2_sL1/combined/C03_sky130_sW2_sL1_combined.gds", + "geometry_hash_ref": "e88086d2dc9dc81e", + "geometry_hash_mode": "c40ae68a35ad3465", + "geometry_identical": false + }, + { + "case": "C03_sky130_sW2_sL2", + "topology": "C03", + "pdk": "sky130", + "size": "sW2_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1115.333, + "A1": 1110.676, + "rel": -0.00417, + "class": "neutral", + "W0": 134.135, + "H0": 8.315, + "W1": 133.575, + "H1": 8.315, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 4.6564, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -4.656, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/sky130/sW2_sL2/independent/C03_sky130_sW2_sL2_independent.gds", + "gds_mode": "runs/grid/C03/sky130/sW2_sL2/diffusion_only/C03_sky130_sW2_sL2_diffusion_only.gds", + "geometry_hash_ref": "d78c8973e6a81b3b", + "geometry_hash_mode": "f99784062e9310c7", + "geometry_identical": false + }, + { + "case": "C03_sky130_sW2_sL2", + "topology": "C03", + "pdk": "sky130", + "size": "sW2_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1115.333, + "A1": 1115.333, + "rel": 0.0, + "class": "neutral", + "W0": 134.135, + "H0": 8.315, + "W1": 134.135, + "H1": 8.315, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/sky130/sW2_sL2/independent/C03_sky130_sW2_sL2_independent.gds", + "gds_mode": "runs/grid/C03/sky130/sW2_sL2/gate_only/C03_sky130_sW2_sL2_gate_only.gds", + "geometry_hash_ref": "d78c8973e6a81b3b", + "geometry_hash_mode": "685740bb6079cddb", + "geometry_identical": false + }, + { + "case": "C03_sky130_sW2_sL2", + "topology": "C03", + "pdk": "sky130", + "size": "sW2_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1115.333, + "A1": 1110.676, + "rel": -0.00417, + "class": "neutral", + "W0": 134.135, + "H0": 8.315, + "W1": 133.575, + "H1": 8.315, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 4.6564, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -4.656, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C03/sky130/sW2_sL2/independent/C03_sky130_sW2_sL2_independent.gds", + "gds_mode": "runs/grid/C03/sky130/sW2_sL2/combined/C03_sky130_sW2_sL2_combined.gds", + "geometry_hash_ref": "d78c8973e6a81b3b", + "geometry_hash_mode": "6bb22452b8b32b5b", + "geometry_identical": false + }, + { + "case": "C05_gf180_sW0.5_sL1.5", + "topology": "C05", + "pdk": "gf180", + "size": "sW0.5_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 111.384, + "A1": 103.896, + "rel": -0.06723, + "class": "positive", + "W0": 11.9, + "H0": 9.36, + "W1": 11.1, + "H1": 9.36, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 7.488, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -7.488, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C05/gf180/sW0.5_sL1.5/independent/C05_gf180_sW0p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C05/gf180/sW0.5_sL1.5/diffusion_only/C05_gf180_sW0p5_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "ff9f6b25d0c5bb49", + "geometry_hash_mode": "8c0ad5f56c13cb48", + "geometry_identical": false + }, + { + "case": "C05_gf180_sW0.5_sL1", + "topology": "C05", + "pdk": "gf180", + "size": "sW0.5_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 95.659, + "A1": 88.171, + "rel": -0.07828, + "class": "positive", + "W0": 10.22, + "H0": 9.36, + "W1": 9.42, + "H1": 9.36, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 7.488, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -7.488, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C05/gf180/sW0.5_sL1/independent/C05_gf180_sW0p5_sL1_independent.gds", + "gds_mode": "runs/grid/C05/gf180/sW0.5_sL1/diffusion_only/C05_gf180_sW0p5_sL1_diffusion_only.gds", + "geometry_hash_ref": "765bc7277424ea30", + "geometry_hash_mode": "14a03a1c51a4a9c0", + "geometry_identical": false + }, + { + "case": "C05_gf180_sW1.5_sL1.5", + "topology": "C05", + "pdk": "gf180", + "size": "sW1.5_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 268.632, + "A1": 261.144, + "rel": -0.02787, + "class": "positive", + "W0": 28.7, + "H0": 9.36, + "W1": 27.9, + "H1": 9.36, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 7.488, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -7.488, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C05/gf180/sW1.5_sL1.5/independent/C05_gf180_sW1p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C05/gf180/sW1.5_sL1.5/diffusion_only/C05_gf180_sW1p5_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "f9932cc87880b552", + "geometry_hash_mode": "9305bcdb808ee857", + "geometry_identical": false + }, + { + "case": "C05_gf180_sW1.5_sL1", + "topology": "C05", + "pdk": "gf180", + "size": "sW1.5_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 221.458, + "A1": 213.97, + "rel": -0.03381, + "class": "positive", + "W0": 23.66, + "H0": 9.36, + "W1": 22.86, + "H1": 9.36, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 7.488, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -7.488, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C05/gf180/sW1.5_sL1/independent/C05_gf180_sW1p5_sL1_independent.gds", + "gds_mode": "runs/grid/C05/gf180/sW1.5_sL1/diffusion_only/C05_gf180_sW1p5_sL1_diffusion_only.gds", + "geometry_hash_ref": "96ad61963427bb33", + "geometry_hash_mode": "e29b426f0caa5566", + "geometry_identical": false + }, + { + "case": "C05_gf180_sW1.5_sL2", + "topology": "C05", + "pdk": "gf180", + "size": "sW1.5_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 315.806, + "A1": 308.318, + "rel": -0.02371, + "class": "positive", + "W0": 33.74, + "H0": 9.36, + "W1": 32.94, + "H1": 9.36, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 7.488, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -7.488, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C05/gf180/sW1.5_sL2/independent/C05_gf180_sW1p5_sL2_independent.gds", + "gds_mode": "runs/grid/C05/gf180/sW1.5_sL2/diffusion_only/C05_gf180_sW1p5_sL2_diffusion_only.gds", + "geometry_hash_ref": "c55851cfe89a2f97", + "geometry_hash_mode": "cc5336b2bbb3f916", + "geometry_identical": false + }, + { + "case": "C05_gf180_sW1_sL1.5", + "topology": "C05", + "pdk": "gf180", + "size": "sW1_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 190.008, + "A1": 182.52, + "rel": -0.03941, + "class": "positive", + "W0": 20.3, + "H0": 9.36, + "W1": 19.5, + "H1": 9.36, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 7.488, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -7.488, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C05/gf180/sW1_sL1.5/independent/C05_gf180_sW1_sL1p5_independent.gds", + "gds_mode": "runs/grid/C05/gf180/sW1_sL1.5/diffusion_only/C05_gf180_sW1_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "5373efd4a4e23998", + "geometry_hash_mode": "f8f0c8fafec5d2a0", + "geometry_identical": false + }, + { + "case": "C05_gf180_sW1_sL1", + "topology": "C05", + "pdk": "gf180", + "size": "sW1_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 158.558, + "A1": 151.07, + "rel": -0.04723, + "class": "positive", + "W0": 16.94, + "H0": 9.36, + "W1": 16.14, + "H1": 9.36, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 7.488, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -7.488, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C05/gf180/sW1_sL1/independent/C05_gf180_sW1_sL1_independent.gds", + "gds_mode": "runs/grid/C05/gf180/sW1_sL1/diffusion_only/C05_gf180_sW1_sL1_diffusion_only.gds", + "geometry_hash_ref": "02f95cce6a186994", + "geometry_hash_mode": "5e9bc465fb455004", + "geometry_identical": false + }, + { + "case": "C05_gf180_sW1_sL2", + "topology": "C05", + "pdk": "gf180", + "size": "sW1_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 221.458, + "A1": 213.97, + "rel": -0.03381, + "class": "positive", + "W0": 23.66, + "H0": 9.36, + "W1": 22.86, + "H1": 9.36, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 7.488, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -7.488, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C05/gf180/sW1_sL2/independent/C05_gf180_sW1_sL2_independent.gds", + "gds_mode": "runs/grid/C05/gf180/sW1_sL2/diffusion_only/C05_gf180_sW1_sL2_diffusion_only.gds", + "geometry_hash_ref": "b1f0066ef8ab08fd", + "geometry_hash_mode": "9863bdc9e018cc6e", + "geometry_identical": false + }, + { + "case": "C05_gf180_sW2_sL1.5", + "topology": "C05", + "pdk": "gf180", + "size": "sW2_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 347.256, + "A1": 339.768, + "rel": -0.02156, + "class": "positive", + "W0": 37.1, + "H0": 9.36, + "W1": 36.3, + "H1": 9.36, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 7.488, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -7.488, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C05/gf180/sW2_sL1.5/independent/C05_gf180_sW2_sL1p5_independent.gds", + "gds_mode": "runs/grid/C05/gf180/sW2_sL1.5/diffusion_only/C05_gf180_sW2_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "fbde6f734f2de19f", + "geometry_hash_mode": "4022e64957fb94fc", + "geometry_identical": false + }, + { + "case": "C05_gf180_sW2_sL1", + "topology": "C05", + "pdk": "gf180", + "size": "sW2_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 284.357, + "A1": 276.869, + "rel": -0.02633, + "class": "positive", + "W0": 30.38, + "H0": 9.36, + "W1": 29.58, + "H1": 9.36, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 7.488, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -7.488, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C05/gf180/sW2_sL1/independent/C05_gf180_sW2_sL1_independent.gds", + "gds_mode": "runs/grid/C05/gf180/sW2_sL1/diffusion_only/C05_gf180_sW2_sL1_diffusion_only.gds", + "geometry_hash_ref": "fda9f612aa72316c", + "geometry_hash_mode": "25efe545515897b8", + "geometry_identical": false + }, + { + "case": "C05_gf180_sW2_sL2", + "topology": "C05", + "pdk": "gf180", + "size": "sW2_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 410.155, + "A1": 402.667, + "rel": -0.01826, + "class": "positive", + "W0": 43.82, + "H0": 9.36, + "W1": 43.02, + "H1": 9.36, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 7.488, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -7.488, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C05/gf180/sW2_sL2/independent/C05_gf180_sW2_sL2_independent.gds", + "gds_mode": "runs/grid/C05/gf180/sW2_sL2/diffusion_only/C05_gf180_sW2_sL2_diffusion_only.gds", + "geometry_hash_ref": "e1b2cd94541593fc", + "geometry_hash_mode": "9b0c65f5decd87a1", + "geometry_identical": false + }, + { + "case": "C05_ihp130_sW0.5_sL1.5", + "topology": "C05", + "pdk": "ihp130", + "size": "sW0.5_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 48.632, + "A1": 45.144, + "rel": -0.07173, + "class": "positive", + "W0": 7.11, + "H0": 6.84, + "W1": 6.6, + "H1": 6.84, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 3.4884, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -3.488, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C05/ihp130/sW0.5_sL1.5/independent/C05_ihp130_sW0p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C05/ihp130/sW0.5_sL1.5/diffusion_only/C05_ihp130_sW0p5_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "8b2562e1c8a866cc", + "geometry_hash_mode": "005846f4ccee15a8", + "geometry_identical": false + }, + { + "case": "C05_ihp130_sW0.5_sL1", + "topology": "C05", + "pdk": "ihp130", + "size": "sW0.5_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 43.297, + "A1": 39.809, + "rel": -0.08057, + "class": "positive", + "W0": 6.33, + "H0": 6.84, + "W1": 5.82, + "H1": 6.84, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 3.4884, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -3.488, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C05/ihp130/sW0.5_sL1/independent/C05_ihp130_sW0p5_sL1_independent.gds", + "gds_mode": "runs/grid/C05/ihp130/sW0.5_sL1/diffusion_only/C05_ihp130_sW0p5_sL1_diffusion_only.gds", + "geometry_hash_ref": "6952e822d4b3ae9a", + "geometry_hash_mode": "951216336700e813", + "geometry_identical": false + }, + { + "case": "C05_ihp130_sW0.5_sL2", + "topology": "C05", + "pdk": "ihp130", + "size": "sW0.5_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 53.968, + "A1": 50.479, + "rel": -0.06464, + "class": "positive", + "W0": 7.89, + "H0": 6.84, + "W1": 7.38, + "H1": 6.84, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 3.4884, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -3.488, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C05/ihp130/sW0.5_sL2/independent/C05_ihp130_sW0p5_sL2_independent.gds", + "gds_mode": "runs/grid/C05/ihp130/sW0.5_sL2/diffusion_only/C05_ihp130_sW0p5_sL2_diffusion_only.gds", + "geometry_hash_ref": "9bfc8fb6c208af21", + "geometry_hash_mode": "2a0215cd056e15ac", + "geometry_identical": false + }, + { + "case": "C05_ihp130_sW1.5_sL1.5", + "topology": "C05", + "pdk": "ihp130", + "size": "sW1.5_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 111.834, + "A1": 108.346, + "rel": -0.03119, + "class": "positive", + "W0": 16.35, + "H0": 6.84, + "W1": 15.84, + "H1": 6.84, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 3.4884, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -3.488, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C05/ihp130/sW1.5_sL1.5/independent/C05_ihp130_sW1p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C05/ihp130/sW1.5_sL1.5/diffusion_only/C05_ihp130_sW1p5_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "ffd6120dfd6128e6", + "geometry_hash_mode": "f44b81911e81c380", + "geometry_identical": false + }, + { + "case": "C05_ihp130_sW1.5_sL1", + "topology": "C05", + "pdk": "ihp130", + "size": "sW1.5_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 95.828, + "A1": 92.34, + "rel": -0.0364, + "class": "positive", + "W0": 14.01, + "H0": 6.84, + "W1": 13.5, + "H1": 6.84, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 3.4884, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -3.488, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C05/ihp130/sW1.5_sL1/independent/C05_ihp130_sW1p5_sL1_independent.gds", + "gds_mode": "runs/grid/C05/ihp130/sW1.5_sL1/diffusion_only/C05_ihp130_sW1p5_sL1_diffusion_only.gds", + "geometry_hash_ref": "bc150a6904e7e7cc", + "geometry_hash_mode": "6368baf629f42c92", + "geometry_identical": false + }, + { + "case": "C05_ihp130_sW1.5_sL2", + "topology": "C05", + "pdk": "ihp130", + "size": "sW1.5_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 127.84, + "A1": 124.351, + "rel": -0.02729, + "class": "positive", + "W0": 18.69, + "H0": 6.84, + "W1": 18.18, + "H1": 6.84, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 3.4884, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -3.488, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C05/ihp130/sW1.5_sL2/independent/C05_ihp130_sW1p5_sL2_independent.gds", + "gds_mode": "runs/grid/C05/ihp130/sW1.5_sL2/diffusion_only/C05_ihp130_sW1p5_sL2_diffusion_only.gds", + "geometry_hash_ref": "177f529c8cfacb37", + "geometry_hash_mode": "03878e727a13b2bd", + "geometry_identical": false + }, + { + "case": "C05_ihp130_sW1_sL1.5", + "topology": "C05", + "pdk": "ihp130", + "size": "sW1_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 80.233, + "A1": 76.745, + "rel": -0.04348, + "class": "positive", + "W0": 11.73, + "H0": 6.84, + "W1": 11.22, + "H1": 6.84, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 3.4884, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -3.488, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C05/ihp130/sW1_sL1.5/independent/C05_ihp130_sW1_sL1p5_independent.gds", + "gds_mode": "runs/grid/C05/ihp130/sW1_sL1.5/diffusion_only/C05_ihp130_sW1_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "bcb3a38df773c435", + "geometry_hash_mode": "0078a877fd2c7f9c", + "geometry_identical": false + }, + { + "case": "C05_ihp130_sW1_sL1", + "topology": "C05", + "pdk": "ihp130", + "size": "sW1_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 69.563, + "A1": 66.074, + "rel": -0.05015, + "class": "positive", + "W0": 10.17, + "H0": 6.84, + "W1": 9.66, + "H1": 6.84, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 3.4884, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -3.488, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C05/ihp130/sW1_sL1/independent/C05_ihp130_sW1_sL1_independent.gds", + "gds_mode": "runs/grid/C05/ihp130/sW1_sL1/diffusion_only/C05_ihp130_sW1_sL1_diffusion_only.gds", + "geometry_hash_ref": "df21a6a0df5062c1", + "geometry_hash_mode": "70f5aa3f3cecd0a1", + "geometry_identical": false + }, + { + "case": "C05_ihp130_sW1_sL2", + "topology": "C05", + "pdk": "ihp130", + "size": "sW1_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 90.904, + "A1": 87.415, + "rel": -0.03837, + "class": "positive", + "W0": 13.29, + "H0": 6.84, + "W1": 12.78, + "H1": 6.84, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 3.4884, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -3.488, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C05/ihp130/sW1_sL2/independent/C05_ihp130_sW1_sL2_independent.gds", + "gds_mode": "runs/grid/C05/ihp130/sW1_sL2/diffusion_only/C05_ihp130_sW1_sL2_diffusion_only.gds", + "geometry_hash_ref": "58bc743d52455ed7", + "geometry_hash_mode": "08382fa1750f9035", + "geometry_identical": false + }, + { + "case": "C05_ihp130_sW2_sL1.5", + "topology": "C05", + "pdk": "ihp130", + "size": "sW2_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 143.435, + "A1": 139.946, + "rel": -0.02432, + "class": "positive", + "W0": 20.97, + "H0": 6.84, + "W1": 20.46, + "H1": 6.84, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 3.4884, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -3.488, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C05/ihp130/sW2_sL1.5/independent/C05_ihp130_sW2_sL1p5_independent.gds", + "gds_mode": "runs/grid/C05/ihp130/sW2_sL1.5/diffusion_only/C05_ihp130_sW2_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "373afddf34abae74", + "geometry_hash_mode": "e41a6773048aa431", + "geometry_identical": false + }, + { + "case": "C05_ihp130_sW2_sL1", + "topology": "C05", + "pdk": "ihp130", + "size": "sW2_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 122.094, + "A1": 118.606, + "rel": -0.02857, + "class": "positive", + "W0": 17.85, + "H0": 6.84, + "W1": 17.34, + "H1": 6.84, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 3.4884, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -3.488, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C05/ihp130/sW2_sL1/independent/C05_ihp130_sW2_sL1_independent.gds", + "gds_mode": "runs/grid/C05/ihp130/sW2_sL1/diffusion_only/C05_ihp130_sW2_sL1_diffusion_only.gds", + "geometry_hash_ref": "ed3d8b8ab6ab592f", + "geometry_hash_mode": "9f08935023bb1e0c", + "geometry_identical": false + }, + { + "case": "C05_ihp130_sW2_sL2", + "topology": "C05", + "pdk": "ihp130", + "size": "sW2_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 164.776, + "A1": 161.287, + "rel": -0.02117, + "class": "positive", + "W0": 24.09, + "H0": 6.84, + "W1": 23.58, + "H1": 6.84, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 3.4884, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -3.488, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C05/ihp130/sW2_sL2/independent/C05_ihp130_sW2_sL2_independent.gds", + "gds_mode": "runs/grid/C05/ihp130/sW2_sL2/diffusion_only/C05_ihp130_sW2_sL2_diffusion_only.gds", + "geometry_hash_ref": "2cbb72afdef59e48", + "geometry_hash_mode": "df96f5cc5100a8f5", + "geometry_identical": false + }, + { + "case": "C05_sky130_sW0.5_sL1.5", + "topology": "C05", + "pdk": "sky130", + "size": "sW0.5_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 51.581, + "A1": 47.607, + "rel": -0.07703, + "class": "positive", + "W0": 7.27, + "H0": 7.095, + "W1": 6.71, + "H1": 7.095, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 3.9732, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -3.973, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C05/sky130/sW0.5_sL1.5/independent/C05_sky130_sW0p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C05/sky130/sW0.5_sL1.5/diffusion_only/C05_sky130_sW0p5_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "2442fd2e9ba16955", + "geometry_hash_mode": "6c9f215fe63e3d28", + "geometry_identical": false + }, + { + "case": "C05_sky130_sW0.5_sL1", + "topology": "C05", + "pdk": "sky130", + "size": "sW0.5_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 45.195, + "A1": 44.766, + "rel": -0.00949, + "class": "positive", + "W0": 6.37, + "H0": 7.095, + "W1": 5.81, + "H1": 7.705, + "dW": 0.56, + "dH": 0.61, + "condition_lhs_H0dW": 3.9732, + "condition_rhs_W1dH": 3.5441, + "dH_mos_rows": 0.0, + "dH_channels": 0.61, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -4.315, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 3.886, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C05/sky130/sW0.5_sL1/independent/C05_sky130_sW0p5_sL1_independent.gds", + "gds_mode": "runs/grid/C05/sky130/sW0.5_sL1/diffusion_only/C05_sky130_sW0p5_sL1_diffusion_only.gds", + "geometry_hash_ref": "aabaa027db03c659", + "geometry_hash_mode": "94ab7b31d1f18b6c", + "geometry_identical": false + }, + { + "case": "C05_sky130_sW0.5_sL2", + "topology": "C05", + "pdk": "sky130", + "size": "sW0.5_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 57.966, + "A1": 53.993, + "rel": -0.06854, + "class": "positive", + "W0": 8.17, + "H0": 7.095, + "W1": 7.61, + "H1": 7.095, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 3.9732, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -3.973, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C05/sky130/sW0.5_sL2/independent/C05_sky130_sW0p5_sL2_independent.gds", + "gds_mode": "runs/grid/C05/sky130/sW0.5_sL2/diffusion_only/C05_sky130_sW0p5_sL2_diffusion_only.gds", + "geometry_hash_ref": "9fd7b52d4c649718", + "geometry_hash_mode": "38db9c6349267972", + "geometry_identical": false + }, + { + "case": "C05_sky130_sW1.5_sL1.5", + "topology": "C05", + "pdk": "sky130", + "size": "sW1.5_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 114.584, + "A1": 110.611, + "rel": -0.03467, + "class": "positive", + "W0": 16.15, + "H0": 7.095, + "W1": 15.59, + "H1": 7.095, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 3.9732, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -3.973, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C05/sky130/sW1.5_sL1.5/independent/C05_sky130_sW1p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C05/sky130/sW1.5_sL1.5/diffusion_only/C05_sky130_sW1p5_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "413cdd4ba206a876", + "geometry_hash_mode": "d3b57c5424d9940e", + "geometry_identical": false + }, + { + "case": "C05_sky130_sW1.5_sL1", + "topology": "C05", + "pdk": "sky130", + "size": "sW1.5_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 95.428, + "A1": 91.455, + "rel": -0.04164, + "class": "positive", + "W0": 13.45, + "H0": 7.095, + "W1": 12.89, + "H1": 7.095, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 3.9732, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -3.973, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C05/sky130/sW1.5_sL1/independent/C05_sky130_sW1p5_sL1_independent.gds", + "gds_mode": "runs/grid/C05/sky130/sW1.5_sL1/diffusion_only/C05_sky130_sW1p5_sL1_diffusion_only.gds", + "geometry_hash_ref": "642429c731b3dfe9", + "geometry_hash_mode": "425b780648a6d396", + "geometry_identical": false + }, + { + "case": "C05_sky130_sW1.5_sL2", + "topology": "C05", + "pdk": "sky130", + "size": "sW1.5_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 133.741, + "A1": 129.768, + "rel": -0.02971, + "class": "positive", + "W0": 18.85, + "H0": 7.095, + "W1": 18.29, + "H1": 7.095, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 3.9732, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -3.973, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C05/sky130/sW1.5_sL2/independent/C05_sky130_sW1p5_sL2_independent.gds", + "gds_mode": "runs/grid/C05/sky130/sW1.5_sL2/diffusion_only/C05_sky130_sW1p5_sL2_diffusion_only.gds", + "geometry_hash_ref": "5120702cb0edb966", + "geometry_hash_mode": "0fcd14bbc367e40e", + "geometry_identical": false + }, + { + "case": "C05_sky130_sW1_sL1.5", + "topology": "C05", + "pdk": "sky130", + "size": "sW1_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 83.082, + "A1": 79.109, + "rel": -0.04782, + "class": "positive", + "W0": 11.71, + "H0": 7.095, + "W1": 11.15, + "H1": 7.095, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 3.9732, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -3.973, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C05/sky130/sW1_sL1.5/independent/C05_sky130_sW1_sL1p5_independent.gds", + "gds_mode": "runs/grid/C05/sky130/sW1_sL1.5/diffusion_only/C05_sky130_sW1_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "37c5fca4081be77f", + "geometry_hash_mode": "4fae1dcd61cd009b", + "geometry_identical": false + }, + { + "case": "C05_sky130_sW1_sL1", + "topology": "C05", + "pdk": "sky130", + "size": "sW1_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 70.311, + "A1": 66.338, + "rel": -0.05651, + "class": "positive", + "W0": 9.91, + "H0": 7.095, + "W1": 9.35, + "H1": 7.095, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 3.9732, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -3.973, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C05/sky130/sW1_sL1/independent/C05_sky130_sW1_sL1_independent.gds", + "gds_mode": "runs/grid/C05/sky130/sW1_sL1/diffusion_only/C05_sky130_sW1_sL1_diffusion_only.gds", + "geometry_hash_ref": "149b4a24041c558b", + "geometry_hash_mode": "a9c77bae7e96648b", + "geometry_identical": false + }, + { + "case": "C05_sky130_sW1_sL2", + "topology": "C05", + "pdk": "sky130", + "size": "sW1_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 95.853, + "A1": 91.88, + "rel": -0.04145, + "class": "positive", + "W0": 13.51, + "H0": 7.095, + "W1": 12.95, + "H1": 7.095, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 3.9732, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -3.973, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C05/sky130/sW1_sL2/independent/C05_sky130_sW1_sL2_independent.gds", + "gds_mode": "runs/grid/C05/sky130/sW1_sL2/diffusion_only/C05_sky130_sW1_sL2_diffusion_only.gds", + "geometry_hash_ref": "453886d480fc203c", + "geometry_hash_mode": "95125903c81f0429", + "geometry_identical": false + }, + { + "case": "C05_sky130_sW2_sL1.5", + "topology": "C05", + "pdk": "sky130", + "size": "sW2_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 146.086, + "A1": 142.113, + "rel": -0.0272, + "class": "positive", + "W0": 20.59, + "H0": 7.095, + "W1": 20.03, + "H1": 7.095, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 3.9732, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -3.973, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C05/sky130/sW2_sL1.5/independent/C05_sky130_sW2_sL1p5_independent.gds", + "gds_mode": "runs/grid/C05/sky130/sW2_sL1.5/diffusion_only/C05_sky130_sW2_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "87d4c2adbd9a41a0", + "geometry_hash_mode": "0ff68ff3573471d0", + "geometry_identical": false + }, + { + "case": "C05_sky130_sW2_sL1", + "topology": "C05", + "pdk": "sky130", + "size": "sW2_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 120.544, + "A1": 116.571, + "rel": -0.03296, + "class": "positive", + "W0": 16.99, + "H0": 7.095, + "W1": 16.43, + "H1": 7.095, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 3.9732, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -3.973, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C05/sky130/sW2_sL1/independent/C05_sky130_sW2_sL1_independent.gds", + "gds_mode": "runs/grid/C05/sky130/sW2_sL1/diffusion_only/C05_sky130_sW2_sL1_diffusion_only.gds", + "geometry_hash_ref": "3734adaa34696022", + "geometry_hash_mode": "c0edf73af41326ee", + "geometry_identical": false + }, + { + "case": "C05_sky130_sW2_sL2", + "topology": "C05", + "pdk": "sky130", + "size": "sW2_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 171.628, + "A1": 167.655, + "rel": -0.02315, + "class": "positive", + "W0": 24.19, + "H0": 7.095, + "W1": 23.63, + "H1": 7.095, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 3.9732, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -3.973, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C05/sky130/sW2_sL2/independent/C05_sky130_sW2_sL2_independent.gds", + "gds_mode": "runs/grid/C05/sky130/sW2_sL2/diffusion_only/C05_sky130_sW2_sL2_diffusion_only.gds", + "geometry_hash_ref": "4c9df618cc9a6da9", + "geometry_hash_mode": "1bf9ee89ae1db8d7", + "geometry_identical": false + }, + { + "case": "C06_gf180_sW0.5_sL1.5", + "topology": "C06", + "pdk": "gf180", + "size": "sW0.5_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 275.122, + "A1": 260.546, + "rel": -0.05298, + "class": "positive", + "W0": 15.1, + "H0": 18.22, + "W1": 14.3, + "H1": 18.22, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 14.576, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8, + "p": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -14.576, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C06/gf180/sW0.5_sL1.5/independent/C06_gf180_sW0p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C06/gf180/sW0.5_sL1.5/diffusion_only/C06_gf180_sW0p5_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "24bc7548606ed76c", + "geometry_hash_mode": "2d8e14b90af6c891", + "geometry_identical": false + }, + { + "case": "C06_gf180_sW0.5_sL1", + "topology": "C06", + "pdk": "gf180", + "size": "sW0.5_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 234.309, + "A1": 219.733, + "rel": -0.06221, + "class": "positive", + "W0": 12.86, + "H0": 18.22, + "W1": 12.06, + "H1": 18.22, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 14.576, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8, + "p": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -14.576, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C06/gf180/sW0.5_sL1/independent/C06_gf180_sW0p5_sL1_independent.gds", + "gds_mode": "runs/grid/C06/gf180/sW0.5_sL1/diffusion_only/C06_gf180_sW0p5_sL1_diffusion_only.gds", + "geometry_hash_ref": "8b5d693839ad2267", + "geometry_hash_mode": "60e57d15e78255b7", + "geometry_identical": false + }, + { + "case": "C06_gf180_sW0.5_sL2", + "topology": "C06", + "pdk": "gf180", + "size": "sW0.5_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 315.935, + "A1": 301.359, + "rel": -0.04614, + "class": "positive", + "W0": 17.34, + "H0": 18.22, + "W1": 16.54, + "H1": 18.22, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 14.576, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8, + "p": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -14.576, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C06/gf180/sW0.5_sL2/independent/C06_gf180_sW0p5_sL2_independent.gds", + "gds_mode": "runs/grid/C06/gf180/sW0.5_sL2/diffusion_only/C06_gf180_sW0p5_sL2_diffusion_only.gds", + "geometry_hash_ref": "13a76e1792e5d402", + "geometry_hash_mode": "be56fd88793ecfb7", + "geometry_identical": false + }, + { + "case": "C06_gf180_sW1.5_sL1.5", + "topology": "C06", + "pdk": "gf180", + "size": "sW1.5_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 683.25, + "A1": 668.674, + "rel": -0.02133, + "class": "positive", + "W0": 37.5, + "H0": 18.22, + "W1": 36.7, + "H1": 18.22, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 14.576, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8, + "p": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -14.576, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C06/gf180/sW1.5_sL1.5/independent/C06_gf180_sW1p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C06/gf180/sW1.5_sL1.5/diffusion_only/C06_gf180_sW1p5_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "8d34fdb3c9698710", + "geometry_hash_mode": "cdbec562008ef1a1", + "geometry_identical": false + }, + { + "case": "C06_gf180_sW1.5_sL1", + "topology": "C06", + "pdk": "gf180", + "size": "sW1.5_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 560.812, + "A1": 546.236, + "rel": -0.02599, + "class": "positive", + "W0": 30.78, + "H0": 18.22, + "W1": 29.98, + "H1": 18.22, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 14.576, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8, + "p": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -14.576, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C06/gf180/sW1.5_sL1/independent/C06_gf180_sW1p5_sL1_independent.gds", + "gds_mode": "runs/grid/C06/gf180/sW1.5_sL1/diffusion_only/C06_gf180_sW1p5_sL1_diffusion_only.gds", + "geometry_hash_ref": "9cf218179702bbd4", + "geometry_hash_mode": "e1576c147d2e9041", + "geometry_identical": false + }, + { + "case": "C06_gf180_sW1.5_sL2", + "topology": "C06", + "pdk": "gf180", + "size": "sW1.5_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 805.688, + "A1": 791.112, + "rel": -0.01809, + "class": "positive", + "W0": 44.22, + "H0": 18.22, + "W1": 43.42, + "H1": 18.22, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 14.576, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8, + "p": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -14.576, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C06/gf180/sW1.5_sL2/independent/C06_gf180_sW1p5_sL2_independent.gds", + "gds_mode": "runs/grid/C06/gf180/sW1.5_sL2/diffusion_only/C06_gf180_sW1p5_sL2_diffusion_only.gds", + "geometry_hash_ref": "e7e15aa682549094", + "geometry_hash_mode": "41de08b59609d50e", + "geometry_identical": false + }, + { + "case": "C06_gf180_sW1_sL1.5", + "topology": "C06", + "pdk": "gf180", + "size": "sW1_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 479.186, + "A1": 464.61, + "rel": -0.03042, + "class": "positive", + "W0": 26.3, + "H0": 18.22, + "W1": 25.5, + "H1": 18.22, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 14.576, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8, + "p": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -14.576, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C06/gf180/sW1_sL1.5/independent/C06_gf180_sW1_sL1p5_independent.gds", + "gds_mode": "runs/grid/C06/gf180/sW1_sL1.5/diffusion_only/C06_gf180_sW1_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "8bb15f98153ea504", + "geometry_hash_mode": "00963181cc95e029", + "geometry_identical": false + }, + { + "case": "C06_gf180_sW1_sL1", + "topology": "C06", + "pdk": "gf180", + "size": "sW1_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 397.56, + "A1": 382.984, + "rel": -0.03666, + "class": "positive", + "W0": 21.82, + "H0": 18.22, + "W1": 21.02, + "H1": 18.22, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 14.576, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8, + "p": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -14.576, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C06/gf180/sW1_sL1/independent/C06_gf180_sW1_sL1_independent.gds", + "gds_mode": "runs/grid/C06/gf180/sW1_sL1/diffusion_only/C06_gf180_sW1_sL1_diffusion_only.gds", + "geometry_hash_ref": "e00e4b4d25707410", + "geometry_hash_mode": "20e2791a888275ac", + "geometry_identical": false + }, + { + "case": "C06_gf180_sW1_sL2", + "topology": "C06", + "pdk": "gf180", + "size": "sW1_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 560.812, + "A1": 546.236, + "rel": -0.02599, + "class": "positive", + "W0": 30.78, + "H0": 18.22, + "W1": 29.98, + "H1": 18.22, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 14.576, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8, + "p": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -14.576, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C06/gf180/sW1_sL2/independent/C06_gf180_sW1_sL2_independent.gds", + "gds_mode": "runs/grid/C06/gf180/sW1_sL2/diffusion_only/C06_gf180_sW1_sL2_diffusion_only.gds", + "geometry_hash_ref": "e9cd14514201cd1f", + "geometry_hash_mode": "3d2e91d3818fb3b7", + "geometry_identical": false + }, + { + "case": "C06_gf180_sW2_sL1.5", + "topology": "C06", + "pdk": "gf180", + "size": "sW2_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 887.314, + "A1": 872.738, + "rel": -0.01643, + "class": "positive", + "W0": 48.7, + "H0": 18.22, + "W1": 47.9, + "H1": 18.22, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 14.576, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8, + "p": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -14.576, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C06/gf180/sW2_sL1.5/independent/C06_gf180_sW2_sL1p5_independent.gds", + "gds_mode": "runs/grid/C06/gf180/sW2_sL1.5/diffusion_only/C06_gf180_sW2_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "570e595f7abf7048", + "geometry_hash_mode": "b985704f116f7eeb", + "geometry_identical": false + }, + { + "case": "C06_gf180_sW2_sL1", + "topology": "C06", + "pdk": "gf180", + "size": "sW2_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 724.063, + "A1": 709.487, + "rel": -0.02013, + "class": "positive", + "W0": 39.74, + "H0": 18.22, + "W1": 38.94, + "H1": 18.22, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 14.576, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8, + "p": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -14.576, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C06/gf180/sW2_sL1/independent/C06_gf180_sW2_sL1_independent.gds", + "gds_mode": "runs/grid/C06/gf180/sW2_sL1/diffusion_only/C06_gf180_sW2_sL1_diffusion_only.gds", + "geometry_hash_ref": "389fd867afe327d3", + "geometry_hash_mode": "3a2707edaf6f8f72", + "geometry_identical": false + }, + { + "case": "C06_gf180_sW2_sL2", + "topology": "C06", + "pdk": "gf180", + "size": "sW2_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1050.565, + "A1": 1035.989, + "rel": -0.01387, + "class": "positive", + "W0": 57.66, + "H0": 18.22, + "W1": 56.86, + "H1": 18.22, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 14.576, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8, + "p": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -14.576, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C06/gf180/sW2_sL2/independent/C06_gf180_sW2_sL2_independent.gds", + "gds_mode": "runs/grid/C06/gf180/sW2_sL2/diffusion_only/C06_gf180_sW2_sL2_diffusion_only.gds", + "geometry_hash_ref": "a8250472aff75735", + "geometry_hash_mode": "1090e327caf9dd59", + "geometry_identical": false + }, + { + "case": "C06_ihp130_sW0.5_sL1.5", + "topology": "C06", + "pdk": "ihp130", + "size": "sW0.5_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 122.227, + "A1": 115.444, + "rel": -0.0555, + "class": "positive", + "W0": 9.19, + "H0": 13.3, + "W1": 8.68, + "H1": 13.3, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 6.783, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51, + "p": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -6.783, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C06/ihp130/sW0.5_sL1.5/independent/C06_ihp130_sW0p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C06/ihp130/sW0.5_sL1.5/diffusion_only/C06_ihp130_sW0p5_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "26dba30da7c41ccf", + "geometry_hash_mode": "f19b4176c70145eb", + "geometry_identical": false + }, + { + "case": "C06_ihp130_sW0.5_sL1", + "topology": "C06", + "pdk": "ihp130", + "size": "sW0.5_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 108.395, + "A1": 101.612, + "rel": -0.06258, + "class": "positive", + "W0": 8.15, + "H0": 13.3, + "W1": 7.64, + "H1": 13.3, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 6.783, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51, + "p": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -6.783, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C06/ihp130/sW0.5_sL1/independent/C06_ihp130_sW0p5_sL1_independent.gds", + "gds_mode": "runs/grid/C06/ihp130/sW0.5_sL1/diffusion_only/C06_ihp130_sW0p5_sL1_diffusion_only.gds", + "geometry_hash_ref": "0576a27a24ecf180", + "geometry_hash_mode": "9bcc27af04d30b1b", + "geometry_identical": false + }, + { + "case": "C06_ihp130_sW0.5_sL2", + "topology": "C06", + "pdk": "ihp130", + "size": "sW0.5_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 136.059, + "A1": 129.276, + "rel": -0.04985, + "class": "positive", + "W0": 10.23, + "H0": 13.3, + "W1": 9.72, + "H1": 13.3, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 6.783, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51, + "p": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -6.783, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C06/ihp130/sW0.5_sL2/independent/C06_ihp130_sW0p5_sL2_independent.gds", + "gds_mode": "runs/grid/C06/ihp130/sW0.5_sL2/diffusion_only/C06_ihp130_sW0p5_sL2_diffusion_only.gds", + "geometry_hash_ref": "4c00a1091a506fb6", + "geometry_hash_mode": "529a0cafd8fceeba", + "geometry_identical": false + }, + { + "case": "C06_ihp130_sW1.5_sL1.5", + "topology": "C06", + "pdk": "ihp130", + "size": "sW1.5_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 286.083, + "A1": 279.3, + "rel": -0.02371, + "class": "positive", + "W0": 21.51, + "H0": 13.3, + "W1": 21.0, + "H1": 13.3, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 6.783, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51, + "p": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -6.783, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C06/ihp130/sW1.5_sL1.5/independent/C06_ihp130_sW1p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C06/ihp130/sW1.5_sL1.5/diffusion_only/C06_ihp130_sW1p5_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "85dbe68af5a79524", + "geometry_hash_mode": "0e669792c8965162", + "geometry_identical": false + }, + { + "case": "C06_ihp130_sW1.5_sL1", + "topology": "C06", + "pdk": "ihp130", + "size": "sW1.5_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 244.587, + "A1": 237.804, + "rel": -0.02773, + "class": "positive", + "W0": 18.39, + "H0": 13.3, + "W1": 17.88, + "H1": 13.3, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 6.783, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51, + "p": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -6.783, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C06/ihp130/sW1.5_sL1/independent/C06_ihp130_sW1p5_sL1_independent.gds", + "gds_mode": "runs/grid/C06/ihp130/sW1.5_sL1/diffusion_only/C06_ihp130_sW1p5_sL1_diffusion_only.gds", + "geometry_hash_ref": "387e502e5063c6a0", + "geometry_hash_mode": "bd2ea11f2ef27a77", + "geometry_identical": false + }, + { + "case": "C06_ihp130_sW1.5_sL2", + "topology": "C06", + "pdk": "ihp130", + "size": "sW1.5_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 327.579, + "A1": 320.796, + "rel": -0.02071, + "class": "positive", + "W0": 24.63, + "H0": 13.3, + "W1": 24.12, + "H1": 13.3, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 6.783, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51, + "p": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -6.783, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C06/ihp130/sW1.5_sL2/independent/C06_ihp130_sW1p5_sL2_independent.gds", + "gds_mode": "runs/grid/C06/ihp130/sW1.5_sL2/diffusion_only/C06_ihp130_sW1p5_sL2_diffusion_only.gds", + "geometry_hash_ref": "b74e21c3f7544c21", + "geometry_hash_mode": "d597f07aed147b99", + "geometry_identical": false + }, + { + "case": "C06_ihp130_sW1_sL1.5", + "topology": "C06", + "pdk": "ihp130", + "size": "sW1_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 204.155, + "A1": 197.372, + "rel": -0.03322, + "class": "positive", + "W0": 15.35, + "H0": 13.3, + "W1": 14.84, + "H1": 13.3, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 6.783, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51, + "p": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -6.783, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C06/ihp130/sW1_sL1.5/independent/C06_ihp130_sW1_sL1p5_independent.gds", + "gds_mode": "runs/grid/C06/ihp130/sW1_sL1.5/diffusion_only/C06_ihp130_sW1_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "300a32061eda378e", + "geometry_hash_mode": "2792d18eec61b4b1", + "geometry_identical": false + }, + { + "case": "C06_ihp130_sW1_sL1", + "topology": "C06", + "pdk": "ihp130", + "size": "sW1_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 176.491, + "A1": 169.708, + "rel": -0.03843, + "class": "positive", + "W0": 13.27, + "H0": 13.3, + "W1": 12.76, + "H1": 13.3, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 6.783, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51, + "p": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -6.783, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C06/ihp130/sW1_sL1/independent/C06_ihp130_sW1_sL1_independent.gds", + "gds_mode": "runs/grid/C06/ihp130/sW1_sL1/diffusion_only/C06_ihp130_sW1_sL1_diffusion_only.gds", + "geometry_hash_ref": "99a9898ed7596d50", + "geometry_hash_mode": "7440ab784fea1d4f", + "geometry_identical": false + }, + { + "case": "C06_ihp130_sW1_sL2", + "topology": "C06", + "pdk": "ihp130", + "size": "sW1_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 231.819, + "A1": 225.036, + "rel": -0.02926, + "class": "positive", + "W0": 17.43, + "H0": 13.3, + "W1": 16.92, + "H1": 13.3, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 6.783, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51, + "p": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -6.783, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C06/ihp130/sW1_sL2/independent/C06_ihp130_sW1_sL2_independent.gds", + "gds_mode": "runs/grid/C06/ihp130/sW1_sL2/diffusion_only/C06_ihp130_sW1_sL2_diffusion_only.gds", + "geometry_hash_ref": "ee678c6784a2e76c", + "geometry_hash_mode": "7e927c2dd2e7c674", + "geometry_identical": false + }, + { + "case": "C06_ihp130_sW2_sL1.5", + "topology": "C06", + "pdk": "ihp130", + "size": "sW2_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 368.011, + "A1": 361.228, + "rel": -0.01843, + "class": "positive", + "W0": 27.67, + "H0": 13.3, + "W1": 27.16, + "H1": 13.3, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 6.783, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51, + "p": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -6.783, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C06/ihp130/sW2_sL1.5/independent/C06_ihp130_sW2_sL1p5_independent.gds", + "gds_mode": "runs/grid/C06/ihp130/sW2_sL1.5/diffusion_only/C06_ihp130_sW2_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "dce93425792915df", + "geometry_hash_mode": "3d26ef3ddb39c3e8", + "geometry_identical": false + }, + { + "case": "C06_ihp130_sW2_sL1", + "topology": "C06", + "pdk": "ihp130", + "size": "sW2_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 312.683, + "A1": 305.9, + "rel": -0.02169, + "class": "positive", + "W0": 23.51, + "H0": 13.3, + "W1": 23.0, + "H1": 13.3, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 6.783, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51, + "p": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -6.783, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C06/ihp130/sW2_sL1/independent/C06_ihp130_sW2_sL1_independent.gds", + "gds_mode": "runs/grid/C06/ihp130/sW2_sL1/diffusion_only/C06_ihp130_sW2_sL1_diffusion_only.gds", + "geometry_hash_ref": "99971ae6075e8f41", + "geometry_hash_mode": "c769cd1092329d47", + "geometry_identical": false + }, + { + "case": "C06_ihp130_sW2_sL2", + "topology": "C06", + "pdk": "ihp130", + "size": "sW2_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 423.339, + "A1": 416.556, + "rel": -0.01602, + "class": "positive", + "W0": 31.83, + "H0": 13.3, + "W1": 31.32, + "H1": 13.3, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 6.783, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51, + "p": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -6.783, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C06/ihp130/sW2_sL2/independent/C06_ihp130_sW2_sL2_independent.gds", + "gds_mode": "runs/grid/C06/ihp130/sW2_sL2/diffusion_only/C06_ihp130_sW2_sL2_diffusion_only.gds", + "geometry_hash_ref": "48f8a8235361b680", + "geometry_hash_mode": "f798618d05cc3678", + "geometry_identical": false + }, + { + "case": "C06_sky130_sW0.5_sL1.5", + "topology": "C06", + "pdk": "sky130", + "size": "sW0.5_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 123.152, + "A1": 115.446, + "rel": -0.06257, + "class": "positive", + "W0": 8.95, + "H0": 13.76, + "W1": 8.39, + "H1": 13.76, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 7.7056, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56, + "p": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -7.706, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C06/sky130/sW0.5_sL1.5/independent/C06_sky130_sW0p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C06/sky130/sW0.5_sL1.5/diffusion_only/C06_sky130_sW0p5_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "2bcee8c161411caa", + "geometry_hash_mode": "b3a35c15490f00b3", + "geometry_identical": false + }, + { + "case": "C06_sky130_sW0.5_sL1", + "topology": "C06", + "pdk": "sky130", + "size": "sW0.5_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 106.64, + "A1": 103.32, + "rel": -0.03113, + "class": "positive", + "W0": 7.75, + "H0": 13.76, + "W1": 7.19, + "H1": 14.37, + "dW": 0.56, + "dH": 0.61, + "condition_lhs_H0dW": 7.7056, + "condition_rhs_W1dH": 4.3859, + "dH_mos_rows": 0.0, + "dH_channels": 0.61, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.56, + "p": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -8.047, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 4.728, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C06/sky130/sW0.5_sL1/independent/C06_sky130_sW0p5_sL1_independent.gds", + "gds_mode": "runs/grid/C06/sky130/sW0.5_sL1/diffusion_only/C06_sky130_sW0p5_sL1_diffusion_only.gds", + "geometry_hash_ref": "2619a100614f6316", + "geometry_hash_mode": "4ccf85d80a4cc132", + "geometry_identical": false + }, + { + "case": "C06_sky130_sW1.5_sL1.5", + "topology": "C06", + "pdk": "sky130", + "size": "sW1.5_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 286.07, + "A1": 278.365, + "rel": -0.02694, + "class": "positive", + "W0": 20.79, + "H0": 13.76, + "W1": 20.23, + "H1": 13.76, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 7.7056, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56, + "p": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -7.706, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C06/sky130/sW1.5_sL1.5/independent/C06_sky130_sW1p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C06/sky130/sW1.5_sL1.5/diffusion_only/C06_sky130_sW1p5_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "8376fc276afd4d79", + "geometry_hash_mode": "817feb66078589b7", + "geometry_identical": false + }, + { + "case": "C06_sky130_sW1.5_sL2", + "topology": "C06", + "pdk": "sky130", + "size": "sW1.5_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 335.606, + "A1": 327.901, + "rel": -0.02296, + "class": "positive", + "W0": 24.39, + "H0": 13.76, + "W1": 23.83, + "H1": 13.76, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 7.7056, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56, + "p": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -7.706, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C06/sky130/sW1.5_sL2/independent/C06_sky130_sW1p5_sL2_independent.gds", + "gds_mode": "runs/grid/C06/sky130/sW1.5_sL2/diffusion_only/C06_sky130_sW1p5_sL2_diffusion_only.gds", + "geometry_hash_ref": "6d761a023fda4447", + "geometry_hash_mode": "8bac28d646af7872", + "geometry_identical": false + }, + { + "case": "C06_sky130_sW1_sL1.5", + "topology": "C06", + "pdk": "sky130", + "size": "sW1_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 204.611, + "A1": 196.906, + "rel": -0.03766, + "class": "positive", + "W0": 14.87, + "H0": 13.76, + "W1": 14.31, + "H1": 13.76, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 7.7056, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56, + "p": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -7.706, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C06/sky130/sW1_sL1.5/independent/C06_sky130_sW1_sL1p5_independent.gds", + "gds_mode": "runs/grid/C06/sky130/sW1_sL1.5/diffusion_only/C06_sky130_sW1_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "22d8a201db2005f8", + "geometry_hash_mode": "b8feaeaedf102b6a", + "geometry_identical": false + }, + { + "case": "C06_sky130_sW1_sL1", + "topology": "C06", + "pdk": "sky130", + "size": "sW1_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 171.587, + "A1": 163.882, + "rel": -0.04491, + "class": "positive", + "W0": 12.47, + "H0": 13.76, + "W1": 11.91, + "H1": 13.76, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 7.7056, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56, + "p": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -7.706, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C06/sky130/sW1_sL1/independent/C06_sky130_sW1_sL1_independent.gds", + "gds_mode": "runs/grid/C06/sky130/sW1_sL1/diffusion_only/C06_sky130_sW1_sL1_diffusion_only.gds", + "geometry_hash_ref": "b8d2670255e78131", + "geometry_hash_mode": "8112e5bce5078e85", + "geometry_identical": false + }, + { + "case": "C06_sky130_sW1_sL2", + "topology": "C06", + "pdk": "sky130", + "size": "sW1_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 237.635, + "A1": 229.93, + "rel": -0.03243, + "class": "positive", + "W0": 17.27, + "H0": 13.76, + "W1": 16.71, + "H1": 13.76, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 7.7056, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56, + "p": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -7.706, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C06/sky130/sW1_sL2/independent/C06_sky130_sW1_sL2_independent.gds", + "gds_mode": "runs/grid/C06/sky130/sW1_sL2/diffusion_only/C06_sky130_sW1_sL2_diffusion_only.gds", + "geometry_hash_ref": "21ffaad62f514b9e", + "geometry_hash_mode": "38de4bc220667043", + "geometry_identical": false + }, + { + "case": "C07_gf180_sW0.5_sL1.5", + "topology": "C07", + "pdk": "gf180", + "size": "sW0.5_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 263.042, + "A1": 249.106, + "rel": -0.05298, + "class": "positive", + "W0": 15.1, + "H0": 17.42, + "W1": 14.3, + "H1": 17.42, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 13.936, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8, + "p": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -13.936, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/gf180/sW0.5_sL1.5/independent/C07_gf180_sW0p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C07/gf180/sW0.5_sL1.5/diffusion_only/C07_gf180_sW0p5_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "e2a823eb4e4b0457", + "geometry_hash_mode": "6305cbdfafa6c0a1", + "geometry_identical": false + }, + { + "case": "C07_gf180_sW0.5_sL1.5", + "topology": "C07", + "pdk": "gf180", + "size": "sW0.5_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 263.042, + "A1": 250.962, + "rel": -0.04592, + "class": "positive", + "W0": 15.1, + "H0": 17.42, + "W1": 15.1, + "H1": 16.62, + "dW": 0.0, + "dH": -0.8, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -12.08, + "dH_mos_rows": -0.8, + "dH_channels": 0.0, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -12.08, + "routing_tracks": 0.0, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/gf180/sW0.5_sL1.5/independent/C07_gf180_sW0p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C07/gf180/sW0.5_sL1.5/gate_only/C07_gf180_sW0p5_sL1p5_gate_only.gds", + "geometry_hash_ref": "e2a823eb4e4b0457", + "geometry_hash_mode": "7da5099702482e8a", + "geometry_identical": false + }, + { + "case": "C07_gf180_sW0.5_sL1.5", + "topology": "C07", + "pdk": "gf180", + "size": "sW0.5_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 263.042, + "A1": 247.638, + "rel": -0.05856, + "class": "positive", + "W0": 15.1, + "H0": 17.42, + "W1": 14.9, + "H1": 16.62, + "dW": 0.2, + "dH": -0.8, + "condition_lhs_H0dW": 3.484, + "condition_rhs_W1dH": -11.92, + "dH_mos_rows": -0.8, + "dH_channels": 0.0, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "p", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -6.648, + "stub_separation": 3.324, + "taller_mos_rows": -12.08, + "routing_tracks": 0.0, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/gf180/sW0.5_sL1.5/independent/C07_gf180_sW0p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C07/gf180/sW0.5_sL1.5/combined/C07_gf180_sW0p5_sL1p5_combined.gds", + "geometry_hash_ref": "e2a823eb4e4b0457", + "geometry_hash_mode": "7b9f8fdb847f984c", + "geometry_identical": false + }, + { + "case": "C07_gf180_sW0.5_sL1", + "topology": "C07", + "pdk": "gf180", + "size": "sW0.5_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 224.021, + "A1": 210.085, + "rel": -0.06221, + "class": "positive", + "W0": 12.86, + "H0": 17.42, + "W1": 12.06, + "H1": 17.42, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 13.936, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8, + "p": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -13.936, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/gf180/sW0.5_sL1/independent/C07_gf180_sW0p5_sL1_independent.gds", + "gds_mode": "runs/grid/C07/gf180/sW0.5_sL1/diffusion_only/C07_gf180_sW0p5_sL1_diffusion_only.gds", + "geometry_hash_ref": "83b29ca4fd112e3c", + "geometry_hash_mode": "ca265c040c4faa89", + "geometry_identical": false + }, + { + "case": "C07_gf180_sW0.5_sL1", + "topology": "C07", + "pdk": "gf180", + "size": "sW0.5_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 224.021, + "A1": 213.733, + "rel": -0.04592, + "class": "positive", + "W0": 12.86, + "H0": 17.42, + "W1": 12.86, + "H1": 16.62, + "dW": 0.0, + "dH": -0.8, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -10.288, + "dH_mos_rows": -0.8, + "dH_channels": 0.0, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -10.288, + "routing_tracks": 0.0, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/gf180/sW0.5_sL1/independent/C07_gf180_sW0p5_sL1_independent.gds", + "gds_mode": "runs/grid/C07/gf180/sW0.5_sL1/gate_only/C07_gf180_sW0p5_sL1_gate_only.gds", + "geometry_hash_ref": "83b29ca4fd112e3c", + "geometry_hash_mode": "87b54ff6dd7bdc4d", + "geometry_identical": false + }, + { + "case": "C07_gf180_sW0.5_sL1", + "topology": "C07", + "pdk": "gf180", + "size": "sW0.5_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 224.021, + "A1": 210.409, + "rel": -0.06076, + "class": "positive", + "W0": 12.86, + "H0": 17.42, + "W1": 12.66, + "H1": 16.62, + "dW": 0.2, + "dH": -0.8, + "condition_lhs_H0dW": 3.484, + "condition_rhs_W1dH": -10.128, + "dH_mos_rows": -0.8, + "dH_channels": 0.0, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "p", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -6.648, + "stub_separation": 3.324, + "taller_mos_rows": -10.288, + "routing_tracks": 0.0, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/gf180/sW0.5_sL1/independent/C07_gf180_sW0p5_sL1_independent.gds", + "gds_mode": "runs/grid/C07/gf180/sW0.5_sL1/combined/C07_gf180_sW0p5_sL1_combined.gds", + "geometry_hash_ref": "83b29ca4fd112e3c", + "geometry_hash_mode": "20536b1eaacbcbf4", + "geometry_identical": false + }, + { + "case": "C07_gf180_sW0.5_sL2", + "topology": "C07", + "pdk": "gf180", + "size": "sW0.5_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 302.063, + "A1": 288.127, + "rel": -0.04614, + "class": "positive", + "W0": 17.34, + "H0": 17.42, + "W1": 16.54, + "H1": 17.42, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 13.936, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8, + "p": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -13.936, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/gf180/sW0.5_sL2/independent/C07_gf180_sW0p5_sL2_independent.gds", + "gds_mode": "runs/grid/C07/gf180/sW0.5_sL2/diffusion_only/C07_gf180_sW0p5_sL2_diffusion_only.gds", + "geometry_hash_ref": "5dc813d2631af4e7", + "geometry_hash_mode": "a239242b0877ed97", + "geometry_identical": false + }, + { + "case": "C07_gf180_sW0.5_sL2", + "topology": "C07", + "pdk": "gf180", + "size": "sW0.5_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 302.063, + "A1": 288.191, + "rel": -0.04592, + "class": "positive", + "W0": 17.34, + "H0": 17.42, + "W1": 17.34, + "H1": 16.62, + "dW": 0.0, + "dH": -0.8, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -13.872, + "dH_mos_rows": -0.8, + "dH_channels": 0.0, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -13.872, + "routing_tracks": 0.0, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/gf180/sW0.5_sL2/independent/C07_gf180_sW0p5_sL2_independent.gds", + "gds_mode": "runs/grid/C07/gf180/sW0.5_sL2/gate_only/C07_gf180_sW0p5_sL2_gate_only.gds", + "geometry_hash_ref": "5dc813d2631af4e7", + "geometry_hash_mode": "dc2202eb081b8060", + "geometry_identical": false + }, + { + "case": "C07_gf180_sW0.5_sL2", + "topology": "C07", + "pdk": "gf180", + "size": "sW0.5_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 302.063, + "A1": 284.867, + "rel": -0.05693, + "class": "positive", + "W0": 17.34, + "H0": 17.42, + "W1": 17.14, + "H1": 16.62, + "dW": 0.2, + "dH": -0.8, + "condition_lhs_H0dW": 3.484, + "condition_rhs_W1dH": -13.712, + "dH_mos_rows": -0.8, + "dH_channels": 0.0, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "p", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -6.648, + "stub_separation": 3.324, + "taller_mos_rows": -13.872, + "routing_tracks": 0.0, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/gf180/sW0.5_sL2/independent/C07_gf180_sW0p5_sL2_independent.gds", + "gds_mode": "runs/grid/C07/gf180/sW0.5_sL2/combined/C07_gf180_sW0p5_sL2_combined.gds", + "geometry_hash_ref": "5dc813d2631af4e7", + "geometry_hash_mode": "78f9585433123ffa", + "geometry_identical": false + }, + { + "case": "C07_gf180_sW1.5_sL1.5", + "topology": "C07", + "pdk": "gf180", + "size": "sW1.5_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 653.25, + "A1": 639.314, + "rel": -0.02133, + "class": "positive", + "W0": 37.5, + "H0": 17.42, + "W1": 36.7, + "H1": 17.42, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 13.936, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8, + "p": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -13.936, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/gf180/sW1.5_sL1.5/independent/C07_gf180_sW1p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C07/gf180/sW1.5_sL1.5/diffusion_only/C07_gf180_sW1p5_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "69e3e0418be703c5", + "geometry_hash_mode": "fb146e86d4e7ef4a", + "geometry_identical": false + }, + { + "case": "C07_gf180_sW1.5_sL1.5", + "topology": "C07", + "pdk": "gf180", + "size": "sW1.5_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 653.25, + "A1": 623.25, + "rel": -0.04592, + "class": "positive", + "W0": 37.5, + "H0": 17.42, + "W1": 37.5, + "H1": 16.62, + "dW": 0.0, + "dH": -0.8, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -30.0, + "dH_mos_rows": -0.8, + "dH_channels": 0.0, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -30.0, + "routing_tracks": 0.0, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/gf180/sW1.5_sL1.5/independent/C07_gf180_sW1p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C07/gf180/sW1.5_sL1.5/gate_only/C07_gf180_sW1p5_sL1p5_gate_only.gds", + "geometry_hash_ref": "69e3e0418be703c5", + "geometry_hash_mode": "481616f785648ae9", + "geometry_identical": false + }, + { + "case": "C07_gf180_sW1.5_sL1.5", + "topology": "C07", + "pdk": "gf180", + "size": "sW1.5_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 653.25, + "A1": 619.926, + "rel": -0.05101, + "class": "positive", + "W0": 37.5, + "H0": 17.42, + "W1": 37.3, + "H1": 16.62, + "dW": 0.2, + "dH": -0.8, + "condition_lhs_H0dW": 3.484, + "condition_rhs_W1dH": -29.84, + "dH_mos_rows": -0.8, + "dH_channels": 0.0, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "p", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -6.648, + "stub_separation": 3.324, + "taller_mos_rows": -30.0, + "routing_tracks": 0.0, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/gf180/sW1.5_sL1.5/independent/C07_gf180_sW1p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C07/gf180/sW1.5_sL1.5/combined/C07_gf180_sW1p5_sL1p5_combined.gds", + "geometry_hash_ref": "69e3e0418be703c5", + "geometry_hash_mode": "c06fb346ab23b30e", + "geometry_identical": false + }, + { + "case": "C07_gf180_sW1.5_sL1", + "topology": "C07", + "pdk": "gf180", + "size": "sW1.5_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 536.188, + "A1": 522.252, + "rel": -0.02599, + "class": "positive", + "W0": 30.78, + "H0": 17.42, + "W1": 29.98, + "H1": 17.42, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 13.936, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8, + "p": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -13.936, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/gf180/sW1.5_sL1/independent/C07_gf180_sW1p5_sL1_independent.gds", + "gds_mode": "runs/grid/C07/gf180/sW1.5_sL1/diffusion_only/C07_gf180_sW1p5_sL1_diffusion_only.gds", + "geometry_hash_ref": "6c1b891ceb2d9a9f", + "geometry_hash_mode": "24415ca84befe58c", + "geometry_identical": false + }, + { + "case": "C07_gf180_sW1.5_sL1", + "topology": "C07", + "pdk": "gf180", + "size": "sW1.5_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 536.188, + "A1": 511.564, + "rel": -0.04592, + "class": "positive", + "W0": 30.78, + "H0": 17.42, + "W1": 30.78, + "H1": 16.62, + "dW": 0.0, + "dH": -0.8, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -24.624, + "dH_mos_rows": -0.8, + "dH_channels": 0.0, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -24.624, + "routing_tracks": 0.0, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/gf180/sW1.5_sL1/independent/C07_gf180_sW1p5_sL1_independent.gds", + "gds_mode": "runs/grid/C07/gf180/sW1.5_sL1/gate_only/C07_gf180_sW1p5_sL1_gate_only.gds", + "geometry_hash_ref": "6c1b891ceb2d9a9f", + "geometry_hash_mode": "bf7abb12e803321a", + "geometry_identical": false + }, + { + "case": "C07_gf180_sW1.5_sL1", + "topology": "C07", + "pdk": "gf180", + "size": "sW1.5_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 536.188, + "A1": 508.24, + "rel": -0.05212, + "class": "positive", + "W0": 30.78, + "H0": 17.42, + "W1": 30.58, + "H1": 16.62, + "dW": 0.2, + "dH": -0.8, + "condition_lhs_H0dW": 3.484, + "condition_rhs_W1dH": -24.464, + "dH_mos_rows": -0.8, + "dH_channels": 0.0, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "p", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -6.648, + "stub_separation": 3.324, + "taller_mos_rows": -24.624, + "routing_tracks": 0.0, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/gf180/sW1.5_sL1/independent/C07_gf180_sW1p5_sL1_independent.gds", + "gds_mode": "runs/grid/C07/gf180/sW1.5_sL1/combined/C07_gf180_sW1p5_sL1_combined.gds", + "geometry_hash_ref": "6c1b891ceb2d9a9f", + "geometry_hash_mode": "22382b5a44d2c13b", + "geometry_identical": false + }, + { + "case": "C07_gf180_sW1.5_sL2", + "topology": "C07", + "pdk": "gf180", + "size": "sW1.5_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 770.312, + "A1": 756.376, + "rel": -0.01809, + "class": "positive", + "W0": 44.22, + "H0": 17.42, + "W1": 43.42, + "H1": 17.42, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 13.936, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8, + "p": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -13.936, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/gf180/sW1.5_sL2/independent/C07_gf180_sW1p5_sL2_independent.gds", + "gds_mode": "runs/grid/C07/gf180/sW1.5_sL2/diffusion_only/C07_gf180_sW1p5_sL2_diffusion_only.gds", + "geometry_hash_ref": "79e18e82365d9c7a", + "geometry_hash_mode": "3193505c885c8ed5", + "geometry_identical": false + }, + { + "case": "C07_gf180_sW1.5_sL2", + "topology": "C07", + "pdk": "gf180", + "size": "sW1.5_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 770.312, + "A1": 734.936, + "rel": -0.04592, + "class": "positive", + "W0": 44.22, + "H0": 17.42, + "W1": 44.22, + "H1": 16.62, + "dW": 0.0, + "dH": -0.8, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -35.376, + "dH_mos_rows": -0.8, + "dH_channels": 0.0, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -35.376, + "routing_tracks": 0.0, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/gf180/sW1.5_sL2/independent/C07_gf180_sW1p5_sL2_independent.gds", + "gds_mode": "runs/grid/C07/gf180/sW1.5_sL2/gate_only/C07_gf180_sW1p5_sL2_gate_only.gds", + "geometry_hash_ref": "79e18e82365d9c7a", + "geometry_hash_mode": "bec38cccdeb87709", + "geometry_identical": false + }, + { + "case": "C07_gf180_sW1.5_sL2", + "topology": "C07", + "pdk": "gf180", + "size": "sW1.5_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 770.312, + "A1": 731.612, + "rel": -0.05024, + "class": "positive", + "W0": 44.22, + "H0": 17.42, + "W1": 44.02, + "H1": 16.62, + "dW": 0.2, + "dH": -0.8, + "condition_lhs_H0dW": 3.484, + "condition_rhs_W1dH": -35.216, + "dH_mos_rows": -0.8, + "dH_channels": 0.0, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "p", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -6.648, + "stub_separation": 3.324, + "taller_mos_rows": -35.376, + "routing_tracks": 0.0, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/gf180/sW1.5_sL2/independent/C07_gf180_sW1p5_sL2_independent.gds", + "gds_mode": "runs/grid/C07/gf180/sW1.5_sL2/combined/C07_gf180_sW1p5_sL2_combined.gds", + "geometry_hash_ref": "79e18e82365d9c7a", + "geometry_hash_mode": "e7be77fbfc8f9363", + "geometry_identical": false + }, + { + "case": "C07_gf180_sW1_sL1.5", + "topology": "C07", + "pdk": "gf180", + "size": "sW1_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 458.146, + "A1": 444.21, + "rel": -0.03042, + "class": "positive", + "W0": 26.3, + "H0": 17.42, + "W1": 25.5, + "H1": 17.42, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 13.936, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8, + "p": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -13.936, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/gf180/sW1_sL1.5/independent/C07_gf180_sW1_sL1p5_independent.gds", + "gds_mode": "runs/grid/C07/gf180/sW1_sL1.5/diffusion_only/C07_gf180_sW1_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "cb744ada2f100afb", + "geometry_hash_mode": "d9b712d481201265", + "geometry_identical": false + }, + { + "case": "C07_gf180_sW1_sL1.5", + "topology": "C07", + "pdk": "gf180", + "size": "sW1_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 458.146, + "A1": 437.106, + "rel": -0.04592, + "class": "positive", + "W0": 26.3, + "H0": 17.42, + "W1": 26.3, + "H1": 16.62, + "dW": 0.0, + "dH": -0.8, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -21.04, + "dH_mos_rows": -0.8, + "dH_channels": 0.0, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -21.04, + "routing_tracks": 0.0, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/gf180/sW1_sL1.5/independent/C07_gf180_sW1_sL1p5_independent.gds", + "gds_mode": "runs/grid/C07/gf180/sW1_sL1.5/gate_only/C07_gf180_sW1_sL1p5_gate_only.gds", + "geometry_hash_ref": "cb744ada2f100afb", + "geometry_hash_mode": "d93c6cc25ee609dd", + "geometry_identical": false + }, + { + "case": "C07_gf180_sW1_sL1.5", + "topology": "C07", + "pdk": "gf180", + "size": "sW1_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 458.146, + "A1": 433.782, + "rel": -0.05318, + "class": "positive", + "W0": 26.3, + "H0": 17.42, + "W1": 26.1, + "H1": 16.62, + "dW": 0.2, + "dH": -0.8, + "condition_lhs_H0dW": 3.484, + "condition_rhs_W1dH": -20.88, + "dH_mos_rows": -0.8, + "dH_channels": 0.0, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "p", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -6.648, + "stub_separation": 3.324, + "taller_mos_rows": -21.04, + "routing_tracks": 0.0, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/gf180/sW1_sL1.5/independent/C07_gf180_sW1_sL1p5_independent.gds", + "gds_mode": "runs/grid/C07/gf180/sW1_sL1.5/combined/C07_gf180_sW1_sL1p5_combined.gds", + "geometry_hash_ref": "cb744ada2f100afb", + "geometry_hash_mode": "7f5bed1d96952bc0", + "geometry_identical": false + }, + { + "case": "C07_gf180_sW1_sL1", + "topology": "C07", + "pdk": "gf180", + "size": "sW1_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 380.104, + "A1": 366.168, + "rel": -0.03666, + "class": "positive", + "W0": 21.82, + "H0": 17.42, + "W1": 21.02, + "H1": 17.42, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 13.936, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8, + "p": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -13.936, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/gf180/sW1_sL1/independent/C07_gf180_sW1_sL1_independent.gds", + "gds_mode": "runs/grid/C07/gf180/sW1_sL1/diffusion_only/C07_gf180_sW1_sL1_diffusion_only.gds", + "geometry_hash_ref": "11a1f12de3540c0a", + "geometry_hash_mode": "efa93d91157c8a1e", + "geometry_identical": false + }, + { + "case": "C07_gf180_sW1_sL1", + "topology": "C07", + "pdk": "gf180", + "size": "sW1_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 380.104, + "A1": 362.648, + "rel": -0.04592, + "class": "positive", + "W0": 21.82, + "H0": 17.42, + "W1": 21.82, + "H1": 16.62, + "dW": 0.0, + "dH": -0.8, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -17.456, + "dH_mos_rows": -0.8, + "dH_channels": 0.0, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -17.456, + "routing_tracks": 0.0, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/gf180/sW1_sL1/independent/C07_gf180_sW1_sL1_independent.gds", + "gds_mode": "runs/grid/C07/gf180/sW1_sL1/gate_only/C07_gf180_sW1_sL1_gate_only.gds", + "geometry_hash_ref": "11a1f12de3540c0a", + "geometry_hash_mode": "eefa7652251c21dc", + "geometry_identical": false + }, + { + "case": "C07_gf180_sW1_sL1", + "topology": "C07", + "pdk": "gf180", + "size": "sW1_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 380.104, + "A1": 359.324, + "rel": -0.05467, + "class": "positive", + "W0": 21.82, + "H0": 17.42, + "W1": 21.62, + "H1": 16.62, + "dW": 0.2, + "dH": -0.8, + "condition_lhs_H0dW": 3.484, + "condition_rhs_W1dH": -17.296, + "dH_mos_rows": -0.8, + "dH_channels": 0.0, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "p", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -6.648, + "stub_separation": 3.324, + "taller_mos_rows": -17.456, + "routing_tracks": 0.0, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/gf180/sW1_sL1/independent/C07_gf180_sW1_sL1_independent.gds", + "gds_mode": "runs/grid/C07/gf180/sW1_sL1/combined/C07_gf180_sW1_sL1_combined.gds", + "geometry_hash_ref": "11a1f12de3540c0a", + "geometry_hash_mode": "20095884911fc0fa", + "geometry_identical": false + }, + { + "case": "C07_gf180_sW1_sL2", + "topology": "C07", + "pdk": "gf180", + "size": "sW1_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 536.188, + "A1": 522.252, + "rel": -0.02599, + "class": "positive", + "W0": 30.78, + "H0": 17.42, + "W1": 29.98, + "H1": 17.42, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 13.936, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8, + "p": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -13.936, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/gf180/sW1_sL2/independent/C07_gf180_sW1_sL2_independent.gds", + "gds_mode": "runs/grid/C07/gf180/sW1_sL2/diffusion_only/C07_gf180_sW1_sL2_diffusion_only.gds", + "geometry_hash_ref": "9a9ec9e5412bb34d", + "geometry_hash_mode": "09bcdc5fc89e0b65", + "geometry_identical": false + }, + { + "case": "C07_gf180_sW1_sL2", + "topology": "C07", + "pdk": "gf180", + "size": "sW1_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 536.188, + "A1": 511.564, + "rel": -0.04592, + "class": "positive", + "W0": 30.78, + "H0": 17.42, + "W1": 30.78, + "H1": 16.62, + "dW": 0.0, + "dH": -0.8, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -24.624, + "dH_mos_rows": -0.8, + "dH_channels": 0.0, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -24.624, + "routing_tracks": 0.0, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/gf180/sW1_sL2/independent/C07_gf180_sW1_sL2_independent.gds", + "gds_mode": "runs/grid/C07/gf180/sW1_sL2/gate_only/C07_gf180_sW1_sL2_gate_only.gds", + "geometry_hash_ref": "9a9ec9e5412bb34d", + "geometry_hash_mode": "d516ed02830ae48a", + "geometry_identical": false + }, + { + "case": "C07_gf180_sW1_sL2", + "topology": "C07", + "pdk": "gf180", + "size": "sW1_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 536.188, + "A1": 508.24, + "rel": -0.05212, + "class": "positive", + "W0": 30.78, + "H0": 17.42, + "W1": 30.58, + "H1": 16.62, + "dW": 0.2, + "dH": -0.8, + "condition_lhs_H0dW": 3.484, + "condition_rhs_W1dH": -24.464, + "dH_mos_rows": -0.8, + "dH_channels": 0.0, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "p", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -6.648, + "stub_separation": 3.324, + "taller_mos_rows": -24.624, + "routing_tracks": 0.0, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/gf180/sW1_sL2/independent/C07_gf180_sW1_sL2_independent.gds", + "gds_mode": "runs/grid/C07/gf180/sW1_sL2/combined/C07_gf180_sW1_sL2_combined.gds", + "geometry_hash_ref": "9a9ec9e5412bb34d", + "geometry_hash_mode": "81ebc225e3e1395d", + "geometry_identical": false + }, + { + "case": "C07_gf180_sW2_sL1.5", + "topology": "C07", + "pdk": "gf180", + "size": "sW2_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 848.354, + "A1": 834.418, + "rel": -0.01643, + "class": "positive", + "W0": 48.7, + "H0": 17.42, + "W1": 47.9, + "H1": 17.42, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 13.936, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8, + "p": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -13.936, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/gf180/sW2_sL1.5/independent/C07_gf180_sW2_sL1p5_independent.gds", + "gds_mode": "runs/grid/C07/gf180/sW2_sL1.5/diffusion_only/C07_gf180_sW2_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "ee814b3e5951db5d", + "geometry_hash_mode": "892b31025c1d490d", + "geometry_identical": false + }, + { + "case": "C07_gf180_sW2_sL1.5", + "topology": "C07", + "pdk": "gf180", + "size": "sW2_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 848.354, + "A1": 809.394, + "rel": -0.04592, + "class": "positive", + "W0": 48.7, + "H0": 17.42, + "W1": 48.7, + "H1": 16.62, + "dW": 0.0, + "dH": -0.8, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -38.96, + "dH_mos_rows": -0.8, + "dH_channels": 0.0, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -38.96, + "routing_tracks": 0.0, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/gf180/sW2_sL1.5/independent/C07_gf180_sW2_sL1p5_independent.gds", + "gds_mode": "runs/grid/C07/gf180/sW2_sL1.5/gate_only/C07_gf180_sW2_sL1p5_gate_only.gds", + "geometry_hash_ref": "ee814b3e5951db5d", + "geometry_hash_mode": "2fd9d9024dd82e71", + "geometry_identical": false + }, + { + "case": "C07_gf180_sW2_sL1.5", + "topology": "C07", + "pdk": "gf180", + "size": "sW2_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 848.354, + "A1": 806.07, + "rel": -0.04984, + "class": "positive", + "W0": 48.7, + "H0": 17.42, + "W1": 48.5, + "H1": 16.62, + "dW": 0.2, + "dH": -0.8, + "condition_lhs_H0dW": 3.484, + "condition_rhs_W1dH": -38.8, + "dH_mos_rows": -0.8, + "dH_channels": 0.0, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "p", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -6.648, + "stub_separation": 3.324, + "taller_mos_rows": -38.96, + "routing_tracks": 0.0, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/gf180/sW2_sL1.5/independent/C07_gf180_sW2_sL1p5_independent.gds", + "gds_mode": "runs/grid/C07/gf180/sW2_sL1.5/combined/C07_gf180_sW2_sL1p5_combined.gds", + "geometry_hash_ref": "ee814b3e5951db5d", + "geometry_hash_mode": "a85439ee1b2a7552", + "geometry_identical": false + }, + { + "case": "C07_gf180_sW2_sL1", + "topology": "C07", + "pdk": "gf180", + "size": "sW2_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 692.271, + "A1": 678.335, + "rel": -0.02013, + "class": "positive", + "W0": 39.74, + "H0": 17.42, + "W1": 38.94, + "H1": 17.42, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 13.936, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8, + "p": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -13.936, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/gf180/sW2_sL1/independent/C07_gf180_sW2_sL1_independent.gds", + "gds_mode": "runs/grid/C07/gf180/sW2_sL1/diffusion_only/C07_gf180_sW2_sL1_diffusion_only.gds", + "geometry_hash_ref": "ec63da1acce0a1cd", + "geometry_hash_mode": "d8f5d4f917538116", + "geometry_identical": false + }, + { + "case": "C07_gf180_sW2_sL1", + "topology": "C07", + "pdk": "gf180", + "size": "sW2_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 692.271, + "A1": 660.479, + "rel": -0.04592, + "class": "positive", + "W0": 39.74, + "H0": 17.42, + "W1": 39.74, + "H1": 16.62, + "dW": 0.0, + "dH": -0.8, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -31.792, + "dH_mos_rows": -0.8, + "dH_channels": 0.0, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -31.792, + "routing_tracks": 0.0, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/gf180/sW2_sL1/independent/C07_gf180_sW2_sL1_independent.gds", + "gds_mode": "runs/grid/C07/gf180/sW2_sL1/gate_only/C07_gf180_sW2_sL1_gate_only.gds", + "geometry_hash_ref": "ec63da1acce0a1cd", + "geometry_hash_mode": "34207e3a5e214b4f", + "geometry_identical": false + }, + { + "case": "C07_gf180_sW2_sL1", + "topology": "C07", + "pdk": "gf180", + "size": "sW2_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 692.271, + "A1": 657.155, + "rel": -0.05073, + "class": "positive", + "W0": 39.74, + "H0": 17.42, + "W1": 39.54, + "H1": 16.62, + "dW": 0.2, + "dH": -0.8, + "condition_lhs_H0dW": 3.484, + "condition_rhs_W1dH": -31.632, + "dH_mos_rows": -0.8, + "dH_channels": 0.0, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "p", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -6.648, + "stub_separation": 3.324, + "taller_mos_rows": -31.792, + "routing_tracks": 0.0, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/gf180/sW2_sL1/independent/C07_gf180_sW2_sL1_independent.gds", + "gds_mode": "runs/grid/C07/gf180/sW2_sL1/combined/C07_gf180_sW2_sL1_combined.gds", + "geometry_hash_ref": "ec63da1acce0a1cd", + "geometry_hash_mode": "befafe5a7140935b", + "geometry_identical": false + }, + { + "case": "C07_gf180_sW2_sL2", + "topology": "C07", + "pdk": "gf180", + "size": "sW2_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1004.437, + "A1": 990.501, + "rel": -0.01387, + "class": "positive", + "W0": 57.66, + "H0": 17.42, + "W1": 56.86, + "H1": 17.42, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 13.936, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8, + "p": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -13.936, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/gf180/sW2_sL2/independent/C07_gf180_sW2_sL2_independent.gds", + "gds_mode": "runs/grid/C07/gf180/sW2_sL2/diffusion_only/C07_gf180_sW2_sL2_diffusion_only.gds", + "geometry_hash_ref": "c7bb83fe49d946a9", + "geometry_hash_mode": "c599f1ef4bfc3b96", + "geometry_identical": false + }, + { + "case": "C07_gf180_sW2_sL2", + "topology": "C07", + "pdk": "gf180", + "size": "sW2_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1004.437, + "A1": 958.309, + "rel": -0.04592, + "class": "positive", + "W0": 57.66, + "H0": 17.42, + "W1": 57.66, + "H1": 16.62, + "dW": 0.0, + "dH": -0.8, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -46.128, + "dH_mos_rows": -0.8, + "dH_channels": 0.0, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -46.128, + "routing_tracks": 0.0, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/gf180/sW2_sL2/independent/C07_gf180_sW2_sL2_independent.gds", + "gds_mode": "runs/grid/C07/gf180/sW2_sL2/gate_only/C07_gf180_sW2_sL2_gate_only.gds", + "geometry_hash_ref": "c7bb83fe49d946a9", + "geometry_hash_mode": "cacc739cf3e31346", + "geometry_identical": false + }, + { + "case": "C07_gf180_sW2_sL2", + "topology": "C07", + "pdk": "gf180", + "size": "sW2_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1004.437, + "A1": 954.985, + "rel": -0.04923, + "class": "positive", + "W0": 57.66, + "H0": 17.42, + "W1": 57.46, + "H1": 16.62, + "dW": 0.2, + "dH": -0.8, + "condition_lhs_H0dW": 3.484, + "condition_rhs_W1dH": -45.968, + "dH_mos_rows": -0.8, + "dH_channels": 0.0, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "p", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -6.648, + "stub_separation": 3.324, + "taller_mos_rows": -46.128, + "routing_tracks": 0.0, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/gf180/sW2_sL2/independent/C07_gf180_sW2_sL2_independent.gds", + "gds_mode": "runs/grid/C07/gf180/sW2_sL2/combined/C07_gf180_sW2_sL2_combined.gds", + "geometry_hash_ref": "c7bb83fe49d946a9", + "geometry_hash_mode": "5cce695da4b09450", + "geometry_identical": false + }, + { + "case": "C07_ihp130_sW0.5_sL1.5", + "topology": "C07", + "pdk": "ihp130", + "size": "sW0.5_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 116.805, + "A1": 110.323, + "rel": -0.0555, + "class": "positive", + "W0": 9.19, + "H0": 12.71, + "W1": 8.68, + "H1": 12.71, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 6.4821, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51, + "p": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -6.482, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/ihp130/sW0.5_sL1.5/independent/C07_ihp130_sW0p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C07/ihp130/sW0.5_sL1.5/diffusion_only/C07_ihp130_sW0p5_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "f204293cef2100a1", + "geometry_hash_mode": "5fca469ce4190143", + "geometry_identical": false + }, + { + "case": "C07_ihp130_sW0.5_sL1.5", + "topology": "C07", + "pdk": "ihp130", + "size": "sW0.5_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 116.805, + "A1": 112.118, + "rel": -0.04013, + "class": "positive", + "W0": 9.19, + "H0": 12.71, + "W1": 9.19, + "H1": 12.2, + "dW": 0.0, + "dH": -0.51, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -4.6869, + "dH_mos_rows": -0.51, + "dH_channels": 0.0, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -4.687, + "routing_tracks": 0.0, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/ihp130/sW0.5_sL1.5/independent/C07_ihp130_sW0p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C07/ihp130/sW0.5_sL1.5/gate_only/C07_ihp130_sW0p5_sL1p5_gate_only.gds", + "geometry_hash_ref": "f204293cef2100a1", + "geometry_hash_mode": "f72642b0e32e1177", + "geometry_identical": false + }, + { + "case": "C07_ihp130_sW0.5_sL1.5", + "topology": "C07", + "pdk": "ihp130", + "size": "sW0.5_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 116.805, + "A1": 119.395, + "rel": 0.02217, + "class": "negative", + "W0": 9.19, + "H0": 12.71, + "W1": 9.335, + "H1": 12.79, + "dW": -0.145, + "dH": 0.08, + "condition_lhs_H0dW": -1.843, + "condition_rhs_W1dH": 0.7468, + "dH_mos_rows": -0.51, + "dH_channels": 0.59, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -6.523, + "stub_separation": 8.377, + "taller_mos_rows": -4.687, + "routing_tracks": 5.422, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/ihp130/sW0.5_sL1.5/independent/C07_ihp130_sW0p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C07/ihp130/sW0.5_sL1.5/combined/C07_ihp130_sW0p5_sL1p5_combined.gds", + "geometry_hash_ref": "f204293cef2100a1", + "geometry_hash_mode": "fd839e8dc471196c", + "geometry_identical": false, + "increase_terms": [ + "stub_separation", + "routing_tracks" + ], + "primary_mechanism": "stub_separation" + }, + { + "case": "C07_ihp130_sW0.5_sL1", + "topology": "C07", + "pdk": "ihp130", + "size": "sW0.5_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 103.587, + "A1": 101.612, + "rel": -0.01906, + "class": "positive", + "W0": 8.15, + "H0": 12.71, + "W1": 7.64, + "H1": 13.3, + "dW": 0.51, + "dH": 0.59, + "condition_lhs_H0dW": 6.4821, + "condition_rhs_W1dH": 4.5076, + "dH_mos_rows": 0.0, + "dH_channels": 0.59, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.51, + "p": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -6.783, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 4.808, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/ihp130/sW0.5_sL1/independent/C07_ihp130_sW0p5_sL1_independent.gds", + "gds_mode": "runs/grid/C07/ihp130/sW0.5_sL1/diffusion_only/C07_ihp130_sW0p5_sL1_diffusion_only.gds", + "geometry_hash_ref": "9302266738a5c5c8", + "geometry_hash_mode": "9aae3a0b21d277d2", + "geometry_identical": false + }, + { + "case": "C07_ihp130_sW0.5_sL1", + "topology": "C07", + "pdk": "ihp130", + "size": "sW0.5_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 103.587, + "A1": 99.43, + "rel": -0.04013, + "class": "positive", + "W0": 8.15, + "H0": 12.71, + "W1": 8.15, + "H1": 12.2, + "dW": 0.0, + "dH": -0.51, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -4.1565, + "dH_mos_rows": -0.51, + "dH_channels": 0.0, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -4.157, + "routing_tracks": 0.0, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/ihp130/sW0.5_sL1/independent/C07_ihp130_sW0p5_sL1_independent.gds", + "gds_mode": "runs/grid/C07/ihp130/sW0.5_sL1/gate_only/C07_ihp130_sW0p5_sL1_gate_only.gds", + "geometry_hash_ref": "9302266738a5c5c8", + "geometry_hash_mode": "aef3648019fc8b11", + "geometry_identical": false + }, + { + "case": "C07_ihp130_sW0.5_sL1", + "topology": "C07", + "pdk": "ihp130", + "size": "sW0.5_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 103.587, + "A1": 122.464, + "rel": 0.18224, + "class": "negative", + "W0": 8.15, + "H0": 12.71, + "W1": 9.575, + "H1": 12.79, + "dW": -1.425, + "dH": 0.08, + "condition_lhs_H0dW": -18.1117, + "condition_rhs_W1dH": 0.766, + "dH_mos_rows": -0.51, + "dH_channels": 0.59, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -6.523, + "stub_separation": 24.749, + "taller_mos_rows": -4.157, + "routing_tracks": 4.808, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/ihp130/sW0.5_sL1/independent/C07_ihp130_sW0p5_sL1_independent.gds", + "gds_mode": "runs/grid/C07/ihp130/sW0.5_sL1/combined/C07_ihp130_sW0p5_sL1_combined.gds", + "geometry_hash_ref": "9302266738a5c5c8", + "geometry_hash_mode": "86f46646b4fab490", + "geometry_identical": false, + "increase_terms": [ + "stub_separation", + "routing_tracks" + ], + "primary_mechanism": "stub_separation" + }, + { + "case": "C07_ihp130_sW0.5_sL2", + "topology": "C07", + "pdk": "ihp130", + "size": "sW0.5_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 130.023, + "A1": 123.541, + "rel": -0.04985, + "class": "positive", + "W0": 10.23, + "H0": 12.71, + "W1": 9.72, + "H1": 12.71, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 6.4821, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51, + "p": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -6.482, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/ihp130/sW0.5_sL2/independent/C07_ihp130_sW0p5_sL2_independent.gds", + "gds_mode": "runs/grid/C07/ihp130/sW0.5_sL2/diffusion_only/C07_ihp130_sW0p5_sL2_diffusion_only.gds", + "geometry_hash_ref": "9fb734058ccfa7ac", + "geometry_hash_mode": "280a73f18505545d", + "geometry_identical": false + }, + { + "case": "C07_ihp130_sW0.5_sL2", + "topology": "C07", + "pdk": "ihp130", + "size": "sW0.5_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 130.023, + "A1": 124.806, + "rel": -0.04013, + "class": "positive", + "W0": 10.23, + "H0": 12.71, + "W1": 10.23, + "H1": 12.2, + "dW": 0.0, + "dH": -0.51, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -5.2173, + "dH_mos_rows": -0.51, + "dH_channels": 0.0, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -5.217, + "routing_tracks": 0.0, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/ihp130/sW0.5_sL2/independent/C07_ihp130_sW0p5_sL2_independent.gds", + "gds_mode": "runs/grid/C07/ihp130/sW0.5_sL2/gate_only/C07_ihp130_sW0p5_sL2_gate_only.gds", + "geometry_hash_ref": "9fb734058ccfa7ac", + "geometry_hash_mode": "e4e1e0cc71588841", + "geometry_identical": false + }, + { + "case": "C07_ihp130_sW0.5_sL2", + "topology": "C07", + "pdk": "ihp130", + "size": "sW0.5_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 130.023, + "A1": 126.575, + "rel": -0.02652, + "class": "positive", + "W0": 10.23, + "H0": 12.71, + "W1": 10.375, + "H1": 12.2, + "dW": -0.145, + "dH": -0.51, + "condition_lhs_H0dW": -1.8429, + "condition_rhs_W1dH": -5.2913, + "dH_mos_rows": -0.51, + "dH_channels": 0.0, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -6.222, + "stub_separation": 7.991, + "taller_mos_rows": -5.217, + "routing_tracks": 0.0, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/ihp130/sW0.5_sL2/independent/C07_ihp130_sW0p5_sL2_independent.gds", + "gds_mode": "runs/grid/C07/ihp130/sW0.5_sL2/combined/C07_ihp130_sW0p5_sL2_combined.gds", + "geometry_hash_ref": "9fb734058ccfa7ac", + "geometry_hash_mode": "d7ec49d66df0e2ef", + "geometry_identical": false + }, + { + "case": "C07_ihp130_sW1.5_sL1.5", + "topology": "C07", + "pdk": "ihp130", + "size": "sW1.5_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 273.392, + "A1": 266.91, + "rel": -0.02371, + "class": "positive", + "W0": 21.51, + "H0": 12.71, + "W1": 21.0, + "H1": 12.71, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 6.4821, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51, + "p": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -6.482, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/ihp130/sW1.5_sL1.5/independent/C07_ihp130_sW1p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C07/ihp130/sW1.5_sL1.5/diffusion_only/C07_ihp130_sW1p5_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "41125f16713cc633", + "geometry_hash_mode": "fb3d51945bbb1c84", + "geometry_identical": false + }, + { + "case": "C07_ihp130_sW1.5_sL1.5", + "topology": "C07", + "pdk": "ihp130", + "size": "sW1.5_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 273.392, + "A1": 262.422, + "rel": -0.04013, + "class": "positive", + "W0": 21.51, + "H0": 12.71, + "W1": 21.51, + "H1": 12.2, + "dW": 0.0, + "dH": -0.51, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -10.9701, + "dH_mos_rows": -0.51, + "dH_channels": 0.0, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -10.97, + "routing_tracks": 0.0, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/ihp130/sW1.5_sL1.5/independent/C07_ihp130_sW1p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C07/ihp130/sW1.5_sL1.5/gate_only/C07_ihp130_sW1p5_sL1p5_gate_only.gds", + "geometry_hash_ref": "41125f16713cc633", + "geometry_hash_mode": "a0aec7667359c396", + "geometry_identical": false + }, + { + "case": "C07_ihp130_sW1.5_sL1.5", + "topology": "C07", + "pdk": "ihp130", + "size": "sW1.5_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 273.392, + "A1": 276.967, + "rel": 0.01308, + "class": "negative", + "W0": 21.51, + "H0": 12.71, + "W1": 21.655, + "H1": 12.79, + "dW": -0.145, + "dH": 0.08, + "condition_lhs_H0dW": -1.8429, + "condition_rhs_W1dH": 1.7324, + "dH_mos_rows": -0.51, + "dH_channels": 0.59, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -6.523, + "stub_separation": 8.377, + "taller_mos_rows": -10.97, + "routing_tracks": 12.691, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/ihp130/sW1.5_sL1.5/independent/C07_ihp130_sW1p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C07/ihp130/sW1.5_sL1.5/combined/C07_ihp130_sW1p5_sL1p5_combined.gds", + "geometry_hash_ref": "41125f16713cc633", + "geometry_hash_mode": "3188c92ececd2c0d", + "geometry_identical": false, + "increase_terms": [ + "routing_tracks", + "stub_separation" + ], + "primary_mechanism": "routing_tracks" + }, + { + "case": "C07_ihp130_sW1.5_sL1", + "topology": "C07", + "pdk": "ihp130", + "size": "sW1.5_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 233.737, + "A1": 237.804, + "rel": 0.0174, + "class": "negative", + "W0": 18.39, + "H0": 12.71, + "W1": 17.88, + "H1": 13.3, + "dW": 0.51, + "dH": 0.59, + "condition_lhs_H0dW": 6.4821, + "condition_rhs_W1dH": 10.5492, + "dH_mos_rows": 0.0, + "dH_channels": 0.59, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.51, + "p": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -6.783, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 10.85, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/ihp130/sW1.5_sL1/independent/C07_ihp130_sW1p5_sL1_independent.gds", + "gds_mode": "runs/grid/C07/ihp130/sW1.5_sL1/diffusion_only/C07_ihp130_sW1p5_sL1_diffusion_only.gds", + "geometry_hash_ref": "5538fe21fac753b9", + "geometry_hash_mode": "dcb8dd97f2c7dc1c", + "geometry_identical": false, + "increase_terms": [ + "routing_tracks" + ], + "primary_mechanism": "routing_tracks" + }, + { + "case": "C07_ihp130_sW1.5_sL1", + "topology": "C07", + "pdk": "ihp130", + "size": "sW1.5_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 233.737, + "A1": 224.358, + "rel": -0.04013, + "class": "positive", + "W0": 18.39, + "H0": 12.71, + "W1": 18.39, + "H1": 12.2, + "dW": 0.0, + "dH": -0.51, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -9.3789, + "dH_mos_rows": -0.51, + "dH_channels": 0.0, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -9.379, + "routing_tracks": 0.0, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/ihp130/sW1.5_sL1/independent/C07_ihp130_sW1p5_sL1_independent.gds", + "gds_mode": "runs/grid/C07/ihp130/sW1.5_sL1/gate_only/C07_ihp130_sW1p5_sL1_gate_only.gds", + "geometry_hash_ref": "5538fe21fac753b9", + "geometry_hash_mode": "0be004211abf7d43", + "geometry_identical": false + }, + { + "case": "C07_ihp130_sW1.5_sL1", + "topology": "C07", + "pdk": "ihp130", + "size": "sW1.5_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 233.737, + "A1": 270.669, + "rel": 0.15801, + "class": "negative", + "W0": 18.39, + "H0": 12.71, + "W1": 19.375, + "H1": 13.97, + "dW": -0.985, + "dH": 1.26, + "condition_lhs_H0dW": -12.5193, + "condition_rhs_W1dH": 24.4125, + "dH_mos_rows": -0.51, + "dH_channels": 1.77, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -7.125, + "stub_separation": 20.885, + "taller_mos_rows": -9.379, + "routing_tracks": 32.55, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "split", + "gds_ref": "runs/grid/C07/ihp130/sW1.5_sL1/independent/C07_ihp130_sW1p5_sL1_independent.gds", + "gds_mode": "runs/grid/C07/ihp130/sW1.5_sL1/combined/C07_ihp130_sW1p5_sL1_combined.gds", + "geometry_hash_ref": "5538fe21fac753b9", + "geometry_hash_mode": "d5ddb53cdf560b55", + "geometry_identical": false, + "increase_terms": [ + "routing_tracks", + "stub_separation" + ], + "primary_mechanism": "routing_tracks" + }, + { + "case": "C07_ihp130_sW1.5_sL2", + "topology": "C07", + "pdk": "ihp130", + "size": "sW1.5_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 313.047, + "A1": 306.565, + "rel": -0.02071, + "class": "positive", + "W0": 24.63, + "H0": 12.71, + "W1": 24.12, + "H1": 12.71, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 6.4821, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51, + "p": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -6.482, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/ihp130/sW1.5_sL2/independent/C07_ihp130_sW1p5_sL2_independent.gds", + "gds_mode": "runs/grid/C07/ihp130/sW1.5_sL2/diffusion_only/C07_ihp130_sW1p5_sL2_diffusion_only.gds", + "geometry_hash_ref": "53b07940ddf50f52", + "geometry_hash_mode": "9ac17656a8bb08fc", + "geometry_identical": false + }, + { + "case": "C07_ihp130_sW1.5_sL2", + "topology": "C07", + "pdk": "ihp130", + "size": "sW1.5_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 313.047, + "A1": 300.486, + "rel": -0.04013, + "class": "positive", + "W0": 24.63, + "H0": 12.71, + "W1": 24.63, + "H1": 12.2, + "dW": 0.0, + "dH": -0.51, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -12.5613, + "dH_mos_rows": -0.51, + "dH_channels": 0.0, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -12.561, + "routing_tracks": 0.0, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/ihp130/sW1.5_sL2/independent/C07_ihp130_sW1p5_sL2_independent.gds", + "gds_mode": "runs/grid/C07/ihp130/sW1.5_sL2/gate_only/C07_ihp130_sW1p5_sL2_gate_only.gds", + "geometry_hash_ref": "53b07940ddf50f52", + "geometry_hash_mode": "71a83b30dda5827f", + "geometry_identical": false + }, + { + "case": "C07_ihp130_sW1.5_sL2", + "topology": "C07", + "pdk": "ihp130", + "size": "sW1.5_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 313.047, + "A1": 302.255, + "rel": -0.03447, + "class": "positive", + "W0": 24.63, + "H0": 12.71, + "W1": 24.775, + "H1": 12.2, + "dW": -0.145, + "dH": -0.51, + "condition_lhs_H0dW": -1.8429, + "condition_rhs_W1dH": -12.6353, + "dH_mos_rows": -0.51, + "dH_channels": 0.0, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -6.222, + "stub_separation": 7.991, + "taller_mos_rows": -12.561, + "routing_tracks": 0.0, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/ihp130/sW1.5_sL2/independent/C07_ihp130_sW1p5_sL2_independent.gds", + "gds_mode": "runs/grid/C07/ihp130/sW1.5_sL2/combined/C07_ihp130_sW1p5_sL2_combined.gds", + "geometry_hash_ref": "53b07940ddf50f52", + "geometry_hash_mode": "00af264b296ce046", + "geometry_identical": false + }, + { + "case": "C07_ihp130_sW1_sL1.5", + "topology": "C07", + "pdk": "ihp130", + "size": "sW1_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 195.099, + "A1": 188.616, + "rel": -0.03322, + "class": "positive", + "W0": 15.35, + "H0": 12.71, + "W1": 14.84, + "H1": 12.71, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 6.4821, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51, + "p": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -6.482, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/ihp130/sW1_sL1.5/independent/C07_ihp130_sW1_sL1p5_independent.gds", + "gds_mode": "runs/grid/C07/ihp130/sW1_sL1.5/diffusion_only/C07_ihp130_sW1_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "630c2efe122032cb", + "geometry_hash_mode": "37dcd59e609a7cb0", + "geometry_identical": false + }, + { + "case": "C07_ihp130_sW1_sL1.5", + "topology": "C07", + "pdk": "ihp130", + "size": "sW1_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 195.099, + "A1": 187.27, + "rel": -0.04013, + "class": "positive", + "W0": 15.35, + "H0": 12.71, + "W1": 15.35, + "H1": 12.2, + "dW": 0.0, + "dH": -0.51, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -7.8285, + "dH_mos_rows": -0.51, + "dH_channels": 0.0, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -7.829, + "routing_tracks": 0.0, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/ihp130/sW1_sL1.5/independent/C07_ihp130_sW1_sL1p5_independent.gds", + "gds_mode": "runs/grid/C07/ihp130/sW1_sL1.5/gate_only/C07_ihp130_sW1_sL1p5_gate_only.gds", + "geometry_hash_ref": "630c2efe122032cb", + "geometry_hash_mode": "92051ea5a2309e73", + "geometry_identical": false + }, + { + "case": "C07_ihp130_sW1_sL1.5", + "topology": "C07", + "pdk": "ihp130", + "size": "sW1_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 195.099, + "A1": 198.181, + "rel": 0.0158, + "class": "negative", + "W0": 15.35, + "H0": 12.71, + "W1": 15.495, + "H1": 12.79, + "dW": -0.145, + "dH": 0.08, + "condition_lhs_H0dW": -1.8429, + "condition_rhs_W1dH": 1.2396, + "dH_mos_rows": -0.51, + "dH_channels": 0.59, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -6.523, + "stub_separation": 8.377, + "taller_mos_rows": -7.829, + "routing_tracks": 9.056, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/ihp130/sW1_sL1.5/independent/C07_ihp130_sW1_sL1p5_independent.gds", + "gds_mode": "runs/grid/C07/ihp130/sW1_sL1.5/combined/C07_ihp130_sW1_sL1p5_combined.gds", + "geometry_hash_ref": "630c2efe122032cb", + "geometry_hash_mode": "b91afbb4252c26c8", + "geometry_identical": false, + "increase_terms": [ + "routing_tracks", + "stub_separation" + ], + "primary_mechanism": "routing_tracks" + }, + { + "case": "C07_ihp130_sW1_sL1", + "topology": "C07", + "pdk": "ihp130", + "size": "sW1_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 168.662, + "A1": 169.708, + "rel": 0.0062, + "class": "negative", + "W0": 13.27, + "H0": 12.71, + "W1": 12.76, + "H1": 13.3, + "dW": 0.51, + "dH": 0.59, + "condition_lhs_H0dW": 6.4821, + "condition_rhs_W1dH": 7.5284, + "dH_mos_rows": 0.0, + "dH_channels": 0.59, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.51, + "p": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -6.783, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 7.829, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/ihp130/sW1_sL1/independent/C07_ihp130_sW1_sL1_independent.gds", + "gds_mode": "runs/grid/C07/ihp130/sW1_sL1/diffusion_only/C07_ihp130_sW1_sL1_diffusion_only.gds", + "geometry_hash_ref": "70769f4a73ed5d03", + "geometry_hash_mode": "c4d476a823905b6d", + "geometry_identical": false, + "increase_terms": [ + "routing_tracks" + ], + "primary_mechanism": "routing_tracks" + }, + { + "case": "C07_ihp130_sW1_sL1", + "topology": "C07", + "pdk": "ihp130", + "size": "sW1_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 168.662, + "A1": 161.894, + "rel": -0.04013, + "class": "positive", + "W0": 13.27, + "H0": 12.71, + "W1": 13.27, + "H1": 12.2, + "dW": 0.0, + "dH": -0.51, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -6.7677, + "dH_mos_rows": -0.51, + "dH_channels": 0.0, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -6.768, + "routing_tracks": 0.0, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/ihp130/sW1_sL1/independent/C07_ihp130_sW1_sL1_independent.gds", + "gds_mode": "runs/grid/C07/ihp130/sW1_sL1/gate_only/C07_ihp130_sW1_sL1_gate_only.gds", + "geometry_hash_ref": "70769f4a73ed5d03", + "geometry_hash_mode": "2c06b013852901e1", + "geometry_identical": false + }, + { + "case": "C07_ihp130_sW1_sL1", + "topology": "C07", + "pdk": "ihp130", + "size": "sW1_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 168.662, + "A1": 199.142, + "rel": 0.18072, + "class": "negative", + "W0": 13.27, + "H0": 12.71, + "W1": 14.255, + "H1": 13.97, + "dW": -0.985, + "dH": 1.26, + "condition_lhs_H0dW": -12.5194, + "condition_rhs_W1dH": 17.9613, + "dH_mos_rows": -0.51, + "dH_channels": 1.77, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -7.125, + "stub_separation": 20.885, + "taller_mos_rows": -6.768, + "routing_tracks": 23.488, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "split", + "gds_ref": "runs/grid/C07/ihp130/sW1_sL1/independent/C07_ihp130_sW1_sL1_independent.gds", + "gds_mode": "runs/grid/C07/ihp130/sW1_sL1/combined/C07_ihp130_sW1_sL1_combined.gds", + "geometry_hash_ref": "70769f4a73ed5d03", + "geometry_hash_mode": "a0a16553464bbec4", + "geometry_identical": false, + "increase_terms": [ + "routing_tracks", + "stub_separation" + ], + "primary_mechanism": "routing_tracks" + }, + { + "case": "C07_ihp130_sW1_sL2", + "topology": "C07", + "pdk": "ihp130", + "size": "sW1_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 221.535, + "A1": 215.053, + "rel": -0.02926, + "class": "positive", + "W0": 17.43, + "H0": 12.71, + "W1": 16.92, + "H1": 12.71, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 6.4821, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51, + "p": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -6.482, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/ihp130/sW1_sL2/independent/C07_ihp130_sW1_sL2_independent.gds", + "gds_mode": "runs/grid/C07/ihp130/sW1_sL2/diffusion_only/C07_ihp130_sW1_sL2_diffusion_only.gds", + "geometry_hash_ref": "a59ceb188c1f31ee", + "geometry_hash_mode": "921a46e240481192", + "geometry_identical": false + }, + { + "case": "C07_ihp130_sW1_sL2", + "topology": "C07", + "pdk": "ihp130", + "size": "sW1_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 221.535, + "A1": 212.646, + "rel": -0.04013, + "class": "positive", + "W0": 17.43, + "H0": 12.71, + "W1": 17.43, + "H1": 12.2, + "dW": 0.0, + "dH": -0.51, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -8.8893, + "dH_mos_rows": -0.51, + "dH_channels": 0.0, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -8.889, + "routing_tracks": 0.0, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/ihp130/sW1_sL2/independent/C07_ihp130_sW1_sL2_independent.gds", + "gds_mode": "runs/grid/C07/ihp130/sW1_sL2/gate_only/C07_ihp130_sW1_sL2_gate_only.gds", + "geometry_hash_ref": "a59ceb188c1f31ee", + "geometry_hash_mode": "6c34a098daa69058", + "geometry_identical": false + }, + { + "case": "C07_ihp130_sW1_sL2", + "topology": "C07", + "pdk": "ihp130", + "size": "sW1_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 221.535, + "A1": 214.415, + "rel": -0.03214, + "class": "positive", + "W0": 17.43, + "H0": 12.71, + "W1": 17.575, + "H1": 12.2, + "dW": -0.145, + "dH": -0.51, + "condition_lhs_H0dW": -1.8429, + "condition_rhs_W1dH": -8.9633, + "dH_mos_rows": -0.51, + "dH_channels": 0.0, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -6.222, + "stub_separation": 7.991, + "taller_mos_rows": -8.889, + "routing_tracks": 0.0, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/ihp130/sW1_sL2/independent/C07_ihp130_sW1_sL2_independent.gds", + "gds_mode": "runs/grid/C07/ihp130/sW1_sL2/combined/C07_ihp130_sW1_sL2_combined.gds", + "geometry_hash_ref": "a59ceb188c1f31ee", + "geometry_hash_mode": "82df44259818f7c7", + "geometry_identical": false + }, + { + "case": "C07_ihp130_sW2_sL1.5", + "topology": "C07", + "pdk": "ihp130", + "size": "sW2_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 351.686, + "A1": 345.204, + "rel": -0.01843, + "class": "positive", + "W0": 27.67, + "H0": 12.71, + "W1": 27.16, + "H1": 12.71, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 6.4821, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51, + "p": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -6.482, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/ihp130/sW2_sL1.5/independent/C07_ihp130_sW2_sL1p5_independent.gds", + "gds_mode": "runs/grid/C07/ihp130/sW2_sL1.5/diffusion_only/C07_ihp130_sW2_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "9e02ee95ddc426b7", + "geometry_hash_mode": "97cb4de54a4d8822", + "geometry_identical": false + }, + { + "case": "C07_ihp130_sW2_sL1.5", + "topology": "C07", + "pdk": "ihp130", + "size": "sW2_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 351.686, + "A1": 337.574, + "rel": -0.04013, + "class": "positive", + "W0": 27.67, + "H0": 12.71, + "W1": 27.67, + "H1": 12.2, + "dW": 0.0, + "dH": -0.51, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -14.1117, + "dH_mos_rows": -0.51, + "dH_channels": 0.0, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -14.112, + "routing_tracks": 0.0, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/ihp130/sW2_sL1.5/independent/C07_ihp130_sW2_sL1p5_independent.gds", + "gds_mode": "runs/grid/C07/ihp130/sW2_sL1.5/gate_only/C07_ihp130_sW2_sL1p5_gate_only.gds", + "geometry_hash_ref": "9e02ee95ddc426b7", + "geometry_hash_mode": "371f7b3e91f5b3e1", + "geometry_identical": false + }, + { + "case": "C07_ihp130_sW2_sL1.5", + "topology": "C07", + "pdk": "ihp130", + "size": "sW2_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 351.686, + "A1": 355.754, + "rel": 0.01157, + "class": "negative", + "W0": 27.67, + "H0": 12.71, + "W1": 27.815, + "H1": 12.79, + "dW": -0.145, + "dH": 0.08, + "condition_lhs_H0dW": -1.8429, + "condition_rhs_W1dH": 2.2252, + "dH_mos_rows": -0.51, + "dH_channels": 0.59, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -6.523, + "stub_separation": 8.377, + "taller_mos_rows": -14.112, + "routing_tracks": 16.325, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/ihp130/sW2_sL1.5/independent/C07_ihp130_sW2_sL1p5_independent.gds", + "gds_mode": "runs/grid/C07/ihp130/sW2_sL1.5/combined/C07_ihp130_sW2_sL1p5_combined.gds", + "geometry_hash_ref": "9e02ee95ddc426b7", + "geometry_hash_mode": "f4a1711c127bd2ca", + "geometry_identical": false, + "increase_terms": [ + "routing_tracks", + "stub_separation" + ], + "primary_mechanism": "routing_tracks" + }, + { + "case": "C07_ihp130_sW2_sL1", + "topology": "C07", + "pdk": "ihp130", + "size": "sW2_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 298.812, + "A1": 305.9, + "rel": 0.02372, + "class": "negative", + "W0": 23.51, + "H0": 12.71, + "W1": 23.0, + "H1": 13.3, + "dW": 0.51, + "dH": 0.59, + "condition_lhs_H0dW": 6.4821, + "condition_rhs_W1dH": 13.57, + "dH_mos_rows": 0.0, + "dH_channels": 0.59, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.51, + "p": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -6.783, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 13.871, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/ihp130/sW2_sL1/independent/C07_ihp130_sW2_sL1_independent.gds", + "gds_mode": "runs/grid/C07/ihp130/sW2_sL1/diffusion_only/C07_ihp130_sW2_sL1_diffusion_only.gds", + "geometry_hash_ref": "8ade7afd9e3703ea", + "geometry_hash_mode": "02107a7375a03fd3", + "geometry_identical": false, + "increase_terms": [ + "routing_tracks" + ], + "primary_mechanism": "routing_tracks" + }, + { + "case": "C07_ihp130_sW2_sL1", + "topology": "C07", + "pdk": "ihp130", + "size": "sW2_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 298.812, + "A1": 286.822, + "rel": -0.04013, + "class": "positive", + "W0": 23.51, + "H0": 12.71, + "W1": 23.51, + "H1": 12.2, + "dW": 0.0, + "dH": -0.51, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -11.9901, + "dH_mos_rows": -0.51, + "dH_channels": 0.0, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -11.99, + "routing_tracks": 0.0, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/ihp130/sW2_sL1/independent/C07_ihp130_sW2_sL1_independent.gds", + "gds_mode": "runs/grid/C07/ihp130/sW2_sL1/gate_only/C07_ihp130_sW2_sL1_gate_only.gds", + "geometry_hash_ref": "8ade7afd9e3703ea", + "geometry_hash_mode": "48df45a6d745cd31", + "geometry_identical": false + }, + { + "case": "C07_ihp130_sW2_sL1", + "topology": "C07", + "pdk": "ihp130", + "size": "sW2_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 298.812, + "A1": 342.195, + "rel": 0.14519, + "class": "negative", + "W0": 23.51, + "H0": 12.71, + "W1": 24.495, + "H1": 13.97, + "dW": -0.985, + "dH": 1.26, + "condition_lhs_H0dW": -12.5193, + "condition_rhs_W1dH": 30.8637, + "dH_mos_rows": -0.51, + "dH_channels": 1.77, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -7.125, + "stub_separation": 20.885, + "taller_mos_rows": -11.99, + "routing_tracks": 41.613, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "split", + "gds_ref": "runs/grid/C07/ihp130/sW2_sL1/independent/C07_ihp130_sW2_sL1_independent.gds", + "gds_mode": "runs/grid/C07/ihp130/sW2_sL1/combined/C07_ihp130_sW2_sL1_combined.gds", + "geometry_hash_ref": "8ade7afd9e3703ea", + "geometry_hash_mode": "ef2233bb145a8169", + "geometry_identical": false, + "increase_terms": [ + "routing_tracks", + "stub_separation" + ], + "primary_mechanism": "routing_tracks" + }, + { + "case": "C07_ihp130_sW2_sL2", + "topology": "C07", + "pdk": "ihp130", + "size": "sW2_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 404.559, + "A1": 398.077, + "rel": -0.01602, + "class": "positive", + "W0": 31.83, + "H0": 12.71, + "W1": 31.32, + "H1": 12.71, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 6.4821, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51, + "p": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -6.482, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/ihp130/sW2_sL2/independent/C07_ihp130_sW2_sL2_independent.gds", + "gds_mode": "runs/grid/C07/ihp130/sW2_sL2/diffusion_only/C07_ihp130_sW2_sL2_diffusion_only.gds", + "geometry_hash_ref": "7ef056bc8aa74e36", + "geometry_hash_mode": "870b7863df0f772f", + "geometry_identical": false + }, + { + "case": "C07_ihp130_sW2_sL2", + "topology": "C07", + "pdk": "ihp130", + "size": "sW2_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 404.559, + "A1": 388.326, + "rel": -0.04013, + "class": "positive", + "W0": 31.83, + "H0": 12.71, + "W1": 31.83, + "H1": 12.2, + "dW": 0.0, + "dH": -0.51, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -16.2333, + "dH_mos_rows": -0.51, + "dH_channels": 0.0, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -16.233, + "routing_tracks": 0.0, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/ihp130/sW2_sL2/independent/C07_ihp130_sW2_sL2_independent.gds", + "gds_mode": "runs/grid/C07/ihp130/sW2_sL2/gate_only/C07_ihp130_sW2_sL2_gate_only.gds", + "geometry_hash_ref": "7ef056bc8aa74e36", + "geometry_hash_mode": "e84cf44c64dba39f", + "geometry_identical": false + }, + { + "case": "C07_ihp130_sW2_sL2", + "topology": "C07", + "pdk": "ihp130", + "size": "sW2_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 404.559, + "A1": 390.095, + "rel": -0.03575, + "class": "positive", + "W0": 31.83, + "H0": 12.71, + "W1": 31.975, + "H1": 12.2, + "dW": -0.145, + "dH": -0.51, + "condition_lhs_H0dW": -1.843, + "condition_rhs_W1dH": -16.3073, + "dH_mos_rows": -0.51, + "dH_channels": 0.0, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -6.222, + "stub_separation": 7.991, + "taller_mos_rows": -16.233, + "routing_tracks": 0.0, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/ihp130/sW2_sL2/independent/C07_ihp130_sW2_sL2_independent.gds", + "gds_mode": "runs/grid/C07/ihp130/sW2_sL2/combined/C07_ihp130_sW2_sL2_combined.gds", + "geometry_hash_ref": "7ef056bc8aa74e36", + "geometry_hash_mode": "4a1e60ace6800663", + "geometry_identical": false + }, + { + "case": "C07_sky130_sW0.5_sL1.5", + "topology": "C07", + "pdk": "sky130", + "size": "sW0.5_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 117.692, + "A1": 110.329, + "rel": -0.06257, + "class": "positive", + "W0": 8.95, + "H0": 13.15, + "W1": 8.39, + "H1": 13.15, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 7.364, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56, + "p": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -7.364, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/sky130/sW0.5_sL1.5/independent/C07_sky130_sW0p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C07/sky130/sW0.5_sL1.5/diffusion_only/C07_sky130_sW0p5_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "a6a39d677032b815", + "geometry_hash_mode": "ed8f31b5a52a5095", + "geometry_identical": false + }, + { + "case": "C07_sky130_sW0.5_sL1.5", + "topology": "C07", + "pdk": "sky130", + "size": "sW0.5_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 117.692, + "A1": 112.859, + "rel": -0.04106, + "class": "positive", + "W0": 8.95, + "H0": 13.15, + "W1": 8.95, + "H1": 12.61, + "dW": 0.0, + "dH": -0.54, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -4.833, + "dH_mos_rows": -0.54, + "dH_channels": 0.0, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -4.833, + "routing_tracks": 0.0, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/sky130/sW0.5_sL1.5/independent/C07_sky130_sW0p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C07/sky130/sW0.5_sL1.5/gate_only/C07_sky130_sW0p5_sL1p5_gate_only.gds", + "geometry_hash_ref": "a6a39d677032b815", + "geometry_hash_mode": "e44c09fffbf3fb37", + "geometry_identical": false + }, + { + "case": "C07_sky130_sW0.5_sL1.5", + "topology": "C07", + "pdk": "sky130", + "size": "sW0.5_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 117.692, + "A1": 111.598, + "rel": -0.05178, + "class": "positive", + "W0": 8.95, + "H0": 13.15, + "W1": 8.85, + "H1": 12.61, + "dW": 0.1, + "dH": -0.54, + "condition_lhs_H0dW": 1.315, + "condition_rhs_W1dH": -4.779, + "dH_mos_rows": -0.54, + "dH_channels": 0.0, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "p", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -1.261, + "stub_separation": 0.0, + "taller_mos_rows": -4.833, + "routing_tracks": 0.0, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/sky130/sW0.5_sL1.5/independent/C07_sky130_sW0p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C07/sky130/sW0.5_sL1.5/combined/C07_sky130_sW0p5_sL1p5_combined.gds", + "geometry_hash_ref": "a6a39d677032b815", + "geometry_hash_mode": "ad0e80dda2237ec6", + "geometry_identical": false + }, + { + "case": "C07_sky130_sW0.5_sL1", + "topology": "C07", + "pdk": "sky130", + "size": "sW0.5_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 101.913, + "A1": 98.934, + "rel": -0.02922, + "class": "positive", + "W0": 7.75, + "H0": 13.15, + "W1": 7.19, + "H1": 13.76, + "dW": 0.56, + "dH": 0.61, + "condition_lhs_H0dW": 7.364, + "condition_rhs_W1dH": 4.3859, + "dH_mos_rows": 0.0, + "dH_channels": 0.61, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.56, + "p": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -7.706, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 4.728, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/sky130/sW0.5_sL1/independent/C07_sky130_sW0p5_sL1_independent.gds", + "gds_mode": "runs/grid/C07/sky130/sW0.5_sL1/diffusion_only/C07_sky130_sW0p5_sL1_diffusion_only.gds", + "geometry_hash_ref": "7dcaed7e136e3a12", + "geometry_hash_mode": "07e56551cd63baa0", + "geometry_identical": false + }, + { + "case": "C07_sky130_sW0.5_sL1", + "topology": "C07", + "pdk": "sky130", + "size": "sW0.5_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 101.913, + "A1": 97.727, + "rel": -0.04106, + "class": "positive", + "W0": 7.75, + "H0": 13.15, + "W1": 7.75, + "H1": 12.61, + "dW": 0.0, + "dH": -0.54, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -4.185, + "dH_mos_rows": -0.54, + "dH_channels": 0.0, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -4.185, + "routing_tracks": 0.0, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/sky130/sW0.5_sL1/independent/C07_sky130_sW0p5_sL1_independent.gds", + "gds_mode": "runs/grid/C07/sky130/sW0.5_sL1/gate_only/C07_sky130_sW0p5_sL1_gate_only.gds", + "geometry_hash_ref": "7dcaed7e136e3a12", + "geometry_hash_mode": "360613a455292a33", + "geometry_identical": false + }, + { + "case": "C07_sky130_sW0.5_sL1", + "topology": "C07", + "pdk": "sky130", + "size": "sW0.5_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 101.913, + "A1": 101.133, + "rel": -0.00765, + "class": "positive", + "W0": 7.75, + "H0": 13.15, + "W1": 7.65, + "H1": 13.22, + "dW": 0.1, + "dH": 0.07, + "condition_lhs_H0dW": 1.315, + "condition_rhs_W1dH": 0.5355, + "dH_mos_rows": -0.54, + "dH_channels": 0.61, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "p", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -1.322, + "stub_separation": 0.0, + "taller_mos_rows": -4.185, + "routing_tracks": 4.728, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/sky130/sW0.5_sL1/independent/C07_sky130_sW0p5_sL1_independent.gds", + "gds_mode": "runs/grid/C07/sky130/sW0.5_sL1/combined/C07_sky130_sW0p5_sL1_combined.gds", + "geometry_hash_ref": "7dcaed7e136e3a12", + "geometry_hash_mode": "70c6ba06c7aee41b", + "geometry_identical": false + }, + { + "case": "C07_sky130_sW0.5_sL2", + "topology": "C07", + "pdk": "sky130", + "size": "sW0.5_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 133.472, + "A1": 126.109, + "rel": -0.05517, + "class": "positive", + "W0": 10.15, + "H0": 13.15, + "W1": 9.59, + "H1": 13.15, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 7.364, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56, + "p": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -7.364, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/sky130/sW0.5_sL2/independent/C07_sky130_sW0p5_sL2_independent.gds", + "gds_mode": "runs/grid/C07/sky130/sW0.5_sL2/diffusion_only/C07_sky130_sW0p5_sL2_diffusion_only.gds", + "geometry_hash_ref": "58b7cd78d683d2b6", + "geometry_hash_mode": "a9b386f74a3c8df7", + "geometry_identical": false + }, + { + "case": "C07_sky130_sW0.5_sL2", + "topology": "C07", + "pdk": "sky130", + "size": "sW0.5_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 133.472, + "A1": 127.992, + "rel": -0.04106, + "class": "positive", + "W0": 10.15, + "H0": 13.15, + "W1": 10.15, + "H1": 12.61, + "dW": 0.0, + "dH": -0.54, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -5.481, + "dH_mos_rows": -0.54, + "dH_channels": 0.0, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -5.481, + "routing_tracks": 0.0, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/sky130/sW0.5_sL2/independent/C07_sky130_sW0p5_sL2_independent.gds", + "gds_mode": "runs/grid/C07/sky130/sW0.5_sL2/gate_only/C07_sky130_sW0p5_sL2_gate_only.gds", + "geometry_hash_ref": "58b7cd78d683d2b6", + "geometry_hash_mode": "4148ee874604979b", + "geometry_identical": false + }, + { + "case": "C07_sky130_sW0.5_sL2", + "topology": "C07", + "pdk": "sky130", + "size": "sW0.5_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 133.472, + "A1": 126.731, + "rel": -0.05051, + "class": "positive", + "W0": 10.15, + "H0": 13.15, + "W1": 10.05, + "H1": 12.61, + "dW": 0.1, + "dH": -0.54, + "condition_lhs_H0dW": 1.315, + "condition_rhs_W1dH": -5.427, + "dH_mos_rows": -0.54, + "dH_channels": 0.0, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "p", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -1.261, + "stub_separation": 0.0, + "taller_mos_rows": -5.481, + "routing_tracks": 0.0, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/sky130/sW0.5_sL2/independent/C07_sky130_sW0p5_sL2_independent.gds", + "gds_mode": "runs/grid/C07/sky130/sW0.5_sL2/combined/C07_sky130_sW0p5_sL2_combined.gds", + "geometry_hash_ref": "58b7cd78d683d2b6", + "geometry_hash_mode": "397e2fee2fc05509", + "geometry_identical": false + }, + { + "case": "C07_sky130_sW1.5_sL1.5", + "topology": "C07", + "pdk": "sky130", + "size": "sW1.5_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 273.389, + "A1": 266.024, + "rel": -0.02694, + "class": "positive", + "W0": 20.79, + "H0": 13.15, + "W1": 20.23, + "H1": 13.15, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 7.364, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56, + "p": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -7.364, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/sky130/sW1.5_sL1.5/independent/C07_sky130_sW1p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C07/sky130/sW1.5_sL1.5/diffusion_only/C07_sky130_sW1p5_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "a7cea9e16c78c532", + "geometry_hash_mode": "ab25b4fcf9cfffff", + "geometry_identical": false + }, + { + "case": "C07_sky130_sW1.5_sL1.5", + "topology": "C07", + "pdk": "sky130", + "size": "sW1.5_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 273.389, + "A1": 262.162, + "rel": -0.04106, + "class": "positive", + "W0": 20.79, + "H0": 13.15, + "W1": 20.79, + "H1": 12.61, + "dW": 0.0, + "dH": -0.54, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -11.2266, + "dH_mos_rows": -0.54, + "dH_channels": 0.0, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -11.227, + "routing_tracks": 0.0, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/sky130/sW1.5_sL1.5/independent/C07_sky130_sW1p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C07/sky130/sW1.5_sL1.5/gate_only/C07_sky130_sW1p5_sL1p5_gate_only.gds", + "geometry_hash_ref": "a7cea9e16c78c532", + "geometry_hash_mode": "b3d3bc0a43d5a571", + "geometry_identical": false + }, + { + "case": "C07_sky130_sW1.5_sL1.5", + "topology": "C07", + "pdk": "sky130", + "size": "sW1.5_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 273.389, + "A1": 260.901, + "rel": -0.04568, + "class": "positive", + "W0": 20.79, + "H0": 13.15, + "W1": 20.69, + "H1": 12.61, + "dW": 0.1, + "dH": -0.54, + "condition_lhs_H0dW": 1.315, + "condition_rhs_W1dH": -11.1726, + "dH_mos_rows": -0.54, + "dH_channels": 0.0, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "p", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -1.261, + "stub_separation": 0.0, + "taller_mos_rows": -11.227, + "routing_tracks": 0.0, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/sky130/sW1.5_sL1.5/independent/C07_sky130_sW1p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C07/sky130/sW1.5_sL1.5/combined/C07_sky130_sW1p5_sL1p5_combined.gds", + "geometry_hash_ref": "a7cea9e16c78c532", + "geometry_hash_mode": "5521ceade9c74a82", + "geometry_identical": false + }, + { + "case": "C07_sky130_sW1.5_sL1", + "topology": "C07", + "pdk": "sky130", + "size": "sW1.5_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 226.049, + "A1": 228.829, + "rel": 0.0123, + "class": "negative", + "W0": 17.19, + "H0": 13.15, + "W1": 16.63, + "H1": 13.76, + "dW": 0.56, + "dH": 0.61, + "condition_lhs_H0dW": 7.364, + "condition_rhs_W1dH": 10.1443, + "dH_mos_rows": 0.0, + "dH_channels": 0.61, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.56, + "p": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -7.706, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 10.486, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/sky130/sW1.5_sL1/independent/C07_sky130_sW1p5_sL1_independent.gds", + "gds_mode": "runs/grid/C07/sky130/sW1.5_sL1/diffusion_only/C07_sky130_sW1p5_sL1_diffusion_only.gds", + "geometry_hash_ref": "3d0f592435e99ca6", + "geometry_hash_mode": "0cfbca203ab08645", + "geometry_identical": false, + "increase_terms": [ + "routing_tracks" + ], + "primary_mechanism": "routing_tracks" + }, + { + "case": "C07_sky130_sW1.5_sL1", + "topology": "C07", + "pdk": "sky130", + "size": "sW1.5_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 226.049, + "A1": 216.766, + "rel": -0.04106, + "class": "positive", + "W0": 17.19, + "H0": 13.15, + "W1": 17.19, + "H1": 12.61, + "dW": 0.0, + "dH": -0.54, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -9.2826, + "dH_mos_rows": -0.54, + "dH_channels": 0.0, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -9.283, + "routing_tracks": 0.0, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/sky130/sW1.5_sL1/independent/C07_sky130_sW1p5_sL1_independent.gds", + "gds_mode": "runs/grid/C07/sky130/sW1.5_sL1/gate_only/C07_sky130_sW1p5_sL1_gate_only.gds", + "geometry_hash_ref": "3d0f592435e99ca6", + "geometry_hash_mode": "2dedb7e88f85ac86", + "geometry_identical": false + }, + { + "case": "C07_sky130_sW1.5_sL1", + "topology": "C07", + "pdk": "sky130", + "size": "sW1.5_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 226.049, + "A1": 225.93, + "rel": -0.00053, + "class": "neutral", + "W0": 17.19, + "H0": 13.15, + "W1": 17.09, + "H1": 13.22, + "dW": 0.1, + "dH": 0.07, + "condition_lhs_H0dW": 1.315, + "condition_rhs_W1dH": 1.1963, + "dH_mos_rows": -0.54, + "dH_channels": 0.61, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "p", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -1.322, + "stub_separation": -0.0, + "taller_mos_rows": -9.283, + "routing_tracks": 10.486, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/sky130/sW1.5_sL1/independent/C07_sky130_sW1p5_sL1_independent.gds", + "gds_mode": "runs/grid/C07/sky130/sW1.5_sL1/combined/C07_sky130_sW1p5_sL1_combined.gds", + "geometry_hash_ref": "3d0f592435e99ca6", + "geometry_hash_mode": "4f9529d84a9dc2e2", + "geometry_identical": false + }, + { + "case": "C07_sky130_sW1.5_sL2", + "topology": "C07", + "pdk": "sky130", + "size": "sW1.5_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 320.728, + "A1": 313.364, + "rel": -0.02296, + "class": "positive", + "W0": 24.39, + "H0": 13.15, + "W1": 23.83, + "H1": 13.15, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 7.364, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56, + "p": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -7.364, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/sky130/sW1.5_sL2/independent/C07_sky130_sW1p5_sL2_independent.gds", + "gds_mode": "runs/grid/C07/sky130/sW1.5_sL2/diffusion_only/C07_sky130_sW1p5_sL2_diffusion_only.gds", + "geometry_hash_ref": "55ffebbf37099e24", + "geometry_hash_mode": "5bcfbea1e2581a22", + "geometry_identical": false + }, + { + "case": "C07_sky130_sW1.5_sL2", + "topology": "C07", + "pdk": "sky130", + "size": "sW1.5_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 320.728, + "A1": 307.558, + "rel": -0.04106, + "class": "positive", + "W0": 24.39, + "H0": 13.15, + "W1": 24.39, + "H1": 12.61, + "dW": 0.0, + "dH": -0.54, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -13.1706, + "dH_mos_rows": -0.54, + "dH_channels": 0.0, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -13.171, + "routing_tracks": 0.0, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/sky130/sW1.5_sL2/independent/C07_sky130_sW1p5_sL2_independent.gds", + "gds_mode": "runs/grid/C07/sky130/sW1.5_sL2/gate_only/C07_sky130_sW1p5_sL2_gate_only.gds", + "geometry_hash_ref": "55ffebbf37099e24", + "geometry_hash_mode": "4af23bb6d9631093", + "geometry_identical": false + }, + { + "case": "C07_sky130_sW1.5_sL2", + "topology": "C07", + "pdk": "sky130", + "size": "sW1.5_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 320.728, + "A1": 306.297, + "rel": -0.045, + "class": "positive", + "W0": 24.39, + "H0": 13.15, + "W1": 24.29, + "H1": 12.61, + "dW": 0.1, + "dH": -0.54, + "condition_lhs_H0dW": 1.315, + "condition_rhs_W1dH": -13.1166, + "dH_mos_rows": -0.54, + "dH_channels": 0.0, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "p", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -1.261, + "stub_separation": -0.0, + "taller_mos_rows": -13.171, + "routing_tracks": 0.0, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/sky130/sW1.5_sL2/independent/C07_sky130_sW1p5_sL2_independent.gds", + "gds_mode": "runs/grid/C07/sky130/sW1.5_sL2/combined/C07_sky130_sW1p5_sL2_combined.gds", + "geometry_hash_ref": "55ffebbf37099e24", + "geometry_hash_mode": "793e9c60352797fb", + "geometry_identical": false + }, + { + "case": "C07_sky130_sW1_sL1.5", + "topology": "C07", + "pdk": "sky130", + "size": "sW1_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 195.541, + "A1": 188.177, + "rel": -0.03766, + "class": "positive", + "W0": 14.87, + "H0": 13.15, + "W1": 14.31, + "H1": 13.15, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 7.364, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56, + "p": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -7.364, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/sky130/sW1_sL1.5/independent/C07_sky130_sW1_sL1p5_independent.gds", + "gds_mode": "runs/grid/C07/sky130/sW1_sL1.5/diffusion_only/C07_sky130_sW1_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "7ea2e9142db74dcf", + "geometry_hash_mode": "cf480ca5ed3d45bc", + "geometry_identical": false + }, + { + "case": "C07_sky130_sW1_sL1.5", + "topology": "C07", + "pdk": "sky130", + "size": "sW1_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 195.541, + "A1": 187.511, + "rel": -0.04106, + "class": "positive", + "W0": 14.87, + "H0": 13.15, + "W1": 14.87, + "H1": 12.61, + "dW": 0.0, + "dH": -0.54, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -8.0298, + "dH_mos_rows": -0.54, + "dH_channels": 0.0, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -8.03, + "routing_tracks": 0.0, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/sky130/sW1_sL1.5/independent/C07_sky130_sW1_sL1p5_independent.gds", + "gds_mode": "runs/grid/C07/sky130/sW1_sL1.5/gate_only/C07_sky130_sW1_sL1p5_gate_only.gds", + "geometry_hash_ref": "7ea2e9142db74dcf", + "geometry_hash_mode": "6448c83933960ae9", + "geometry_identical": false + }, + { + "case": "C07_sky130_sW1_sL1.5", + "topology": "C07", + "pdk": "sky130", + "size": "sW1_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 195.541, + "A1": 186.25, + "rel": -0.04751, + "class": "positive", + "W0": 14.87, + "H0": 13.15, + "W1": 14.77, + "H1": 12.61, + "dW": 0.1, + "dH": -0.54, + "condition_lhs_H0dW": 1.315, + "condition_rhs_W1dH": -7.9758, + "dH_mos_rows": -0.54, + "dH_channels": 0.0, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "p", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -1.261, + "stub_separation": 0.0, + "taller_mos_rows": -8.03, + "routing_tracks": 0.0, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/sky130/sW1_sL1.5/independent/C07_sky130_sW1_sL1p5_independent.gds", + "gds_mode": "runs/grid/C07/sky130/sW1_sL1.5/combined/C07_sky130_sW1_sL1p5_combined.gds", + "geometry_hash_ref": "7ea2e9142db74dcf", + "geometry_hash_mode": "f82e2e091ef3926f", + "geometry_identical": false + }, + { + "case": "C07_sky130_sW1_sL1", + "topology": "C07", + "pdk": "sky130", + "size": "sW1_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 163.981, + "A1": 163.882, + "rel": -0.0006, + "class": "neutral", + "W0": 12.47, + "H0": 13.15, + "W1": 11.91, + "H1": 13.76, + "dW": 0.56, + "dH": 0.61, + "condition_lhs_H0dW": 7.364, + "condition_rhs_W1dH": 7.2651, + "dH_mos_rows": 0.0, + "dH_channels": 0.61, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.56, + "p": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -7.706, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 7.607, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/sky130/sW1_sL1/independent/C07_sky130_sW1_sL1_independent.gds", + "gds_mode": "runs/grid/C07/sky130/sW1_sL1/diffusion_only/C07_sky130_sW1_sL1_diffusion_only.gds", + "geometry_hash_ref": "3afb65aea9f04395", + "geometry_hash_mode": "39e4c0a3a7445538", + "geometry_identical": false + }, + { + "case": "C07_sky130_sW1_sL1", + "topology": "C07", + "pdk": "sky130", + "size": "sW1_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 163.981, + "A1": 157.247, + "rel": -0.04106, + "class": "positive", + "W0": 12.47, + "H0": 13.15, + "W1": 12.47, + "H1": 12.61, + "dW": 0.0, + "dH": -0.54, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -6.7338, + "dH_mos_rows": -0.54, + "dH_channels": 0.0, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -6.734, + "routing_tracks": 0.0, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/sky130/sW1_sL1/independent/C07_sky130_sW1_sL1_independent.gds", + "gds_mode": "runs/grid/C07/sky130/sW1_sL1/gate_only/C07_sky130_sW1_sL1_gate_only.gds", + "geometry_hash_ref": "3afb65aea9f04395", + "geometry_hash_mode": "ee62e7c9d5f0b206", + "geometry_identical": false + }, + { + "case": "C07_sky130_sW1_sL1", + "topology": "C07", + "pdk": "sky130", + "size": "sW1_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 163.981, + "A1": 163.531, + "rel": -0.00274, + "class": "neutral", + "W0": 12.47, + "H0": 13.15, + "W1": 12.37, + "H1": 13.22, + "dW": 0.1, + "dH": 0.07, + "condition_lhs_H0dW": 1.315, + "condition_rhs_W1dH": 0.8659, + "dH_mos_rows": -0.54, + "dH_channels": 0.61, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "p", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -1.322, + "stub_separation": -0.0, + "taller_mos_rows": -6.734, + "routing_tracks": 7.607, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/sky130/sW1_sL1/independent/C07_sky130_sW1_sL1_independent.gds", + "gds_mode": "runs/grid/C07/sky130/sW1_sL1/combined/C07_sky130_sW1_sL1_combined.gds", + "geometry_hash_ref": "3afb65aea9f04395", + "geometry_hash_mode": "4b2a552cef9067d8", + "geometry_identical": false + }, + { + "case": "C07_sky130_sW1_sL2", + "topology": "C07", + "pdk": "sky130", + "size": "sW1_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 227.101, + "A1": 219.737, + "rel": -0.03243, + "class": "positive", + "W0": 17.27, + "H0": 13.15, + "W1": 16.71, + "H1": 13.15, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 7.364, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56, + "p": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -7.364, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/sky130/sW1_sL2/independent/C07_sky130_sW1_sL2_independent.gds", + "gds_mode": "runs/grid/C07/sky130/sW1_sL2/diffusion_only/C07_sky130_sW1_sL2_diffusion_only.gds", + "geometry_hash_ref": "b8f68f2b65ea1ce8", + "geometry_hash_mode": "96fe10eeb1f29668", + "geometry_identical": false + }, + { + "case": "C07_sky130_sW1_sL2", + "topology": "C07", + "pdk": "sky130", + "size": "sW1_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 227.101, + "A1": 217.775, + "rel": -0.04106, + "class": "positive", + "W0": 17.27, + "H0": 13.15, + "W1": 17.27, + "H1": 12.61, + "dW": 0.0, + "dH": -0.54, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -9.3258, + "dH_mos_rows": -0.54, + "dH_channels": 0.0, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -9.326, + "routing_tracks": 0.0, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/sky130/sW1_sL2/independent/C07_sky130_sW1_sL2_independent.gds", + "gds_mode": "runs/grid/C07/sky130/sW1_sL2/gate_only/C07_sky130_sW1_sL2_gate_only.gds", + "geometry_hash_ref": "b8f68f2b65ea1ce8", + "geometry_hash_mode": "598ce0e37db4c5c6", + "geometry_identical": false + }, + { + "case": "C07_sky130_sW1_sL2", + "topology": "C07", + "pdk": "sky130", + "size": "sW1_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 227.101, + "A1": 216.514, + "rel": -0.04662, + "class": "positive", + "W0": 17.27, + "H0": 13.15, + "W1": 17.17, + "H1": 12.61, + "dW": 0.1, + "dH": -0.54, + "condition_lhs_H0dW": 1.315, + "condition_rhs_W1dH": -9.2718, + "dH_mos_rows": -0.54, + "dH_channels": 0.0, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "p", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -1.261, + "stub_separation": 0.0, + "taller_mos_rows": -9.326, + "routing_tracks": 0.0, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/sky130/sW1_sL2/independent/C07_sky130_sW1_sL2_independent.gds", + "gds_mode": "runs/grid/C07/sky130/sW1_sL2/combined/C07_sky130_sW1_sL2_combined.gds", + "geometry_hash_ref": "b8f68f2b65ea1ce8", + "geometry_hash_mode": "f30be2c47d1bb435", + "geometry_identical": false + }, + { + "case": "C07_sky130_sW2_sL1.5", + "topology": "C07", + "pdk": "sky130", + "size": "sW2_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 351.237, + "A1": 343.873, + "rel": -0.02097, + "class": "positive", + "W0": 26.71, + "H0": 13.15, + "W1": 26.15, + "H1": 13.15, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 7.364, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56, + "p": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -7.364, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/sky130/sW2_sL1.5/independent/C07_sky130_sW2_sL1p5_independent.gds", + "gds_mode": "runs/grid/C07/sky130/sW2_sL1.5/diffusion_only/C07_sky130_sW2_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "c910cbdb26ef08d0", + "geometry_hash_mode": "5ac52de322e6c899", + "geometry_identical": false + }, + { + "case": "C07_sky130_sW2_sL1.5", + "topology": "C07", + "pdk": "sky130", + "size": "sW2_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 351.237, + "A1": 336.813, + "rel": -0.04106, + "class": "positive", + "W0": 26.71, + "H0": 13.15, + "W1": 26.71, + "H1": 12.61, + "dW": 0.0, + "dH": -0.54, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -14.4234, + "dH_mos_rows": -0.54, + "dH_channels": 0.0, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -14.423, + "routing_tracks": 0.0, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/sky130/sW2_sL1.5/independent/C07_sky130_sW2_sL1p5_independent.gds", + "gds_mode": "runs/grid/C07/sky130/sW2_sL1.5/gate_only/C07_sky130_sW2_sL1p5_gate_only.gds", + "geometry_hash_ref": "c910cbdb26ef08d0", + "geometry_hash_mode": "e3b3890e18c446c0", + "geometry_identical": false + }, + { + "case": "C07_sky130_sW2_sL1.5", + "topology": "C07", + "pdk": "sky130", + "size": "sW2_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 351.237, + "A1": 335.552, + "rel": -0.04465, + "class": "positive", + "W0": 26.71, + "H0": 13.15, + "W1": 26.61, + "H1": 12.61, + "dW": 0.1, + "dH": -0.54, + "condition_lhs_H0dW": 1.315, + "condition_rhs_W1dH": -14.3694, + "dH_mos_rows": -0.54, + "dH_channels": 0.0, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "p", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -1.261, + "stub_separation": -0.0, + "taller_mos_rows": -14.423, + "routing_tracks": 0.0, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/sky130/sW2_sL1.5/independent/C07_sky130_sW2_sL1p5_independent.gds", + "gds_mode": "runs/grid/C07/sky130/sW2_sL1.5/combined/C07_sky130_sW2_sL1p5_combined.gds", + "geometry_hash_ref": "c910cbdb26ef08d0", + "geometry_hash_mode": "3843ec283802c835", + "geometry_identical": false + }, + { + "case": "C07_sky130_sW2_sL1", + "topology": "C07", + "pdk": "sky130", + "size": "sW2_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 288.117, + "A1": 293.776, + "rel": 0.01964, + "class": "negative", + "W0": 21.91, + "H0": 13.15, + "W1": 21.35, + "H1": 13.76, + "dW": 0.56, + "dH": 0.61, + "condition_lhs_H0dW": 7.364, + "condition_rhs_W1dH": 13.0235, + "dH_mos_rows": 0.0, + "dH_channels": 0.61, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.56, + "p": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -7.706, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 13.365, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/sky130/sW2_sL1/independent/C07_sky130_sW2_sL1_independent.gds", + "gds_mode": "runs/grid/C07/sky130/sW2_sL1/diffusion_only/C07_sky130_sW2_sL1_diffusion_only.gds", + "geometry_hash_ref": "d156b3a17dff43b5", + "geometry_hash_mode": "b9581be89c66b1a0", + "geometry_identical": false, + "increase_terms": [ + "routing_tracks" + ], + "primary_mechanism": "routing_tracks" + }, + { + "case": "C07_sky130_sW2_sL1", + "topology": "C07", + "pdk": "sky130", + "size": "sW2_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 288.117, + "A1": 276.285, + "rel": -0.04106, + "class": "positive", + "W0": 21.91, + "H0": 13.15, + "W1": 21.91, + "H1": 12.61, + "dW": 0.0, + "dH": -0.54, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -11.8314, + "dH_mos_rows": -0.54, + "dH_channels": 0.0, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -11.831, + "routing_tracks": 0.0, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/sky130/sW2_sL1/independent/C07_sky130_sW2_sL1_independent.gds", + "gds_mode": "runs/grid/C07/sky130/sW2_sL1/gate_only/C07_sky130_sW2_sL1_gate_only.gds", + "geometry_hash_ref": "d156b3a17dff43b5", + "geometry_hash_mode": "6aaebedeb860493a", + "geometry_identical": false + }, + { + "case": "C07_sky130_sW2_sL1", + "topology": "C07", + "pdk": "sky130", + "size": "sW2_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 288.117, + "A1": 288.328, + "rel": 0.00073, + "class": "neutral", + "W0": 21.91, + "H0": 13.15, + "W1": 21.81, + "H1": 13.22, + "dW": 0.1, + "dH": 0.07, + "condition_lhs_H0dW": 1.315, + "condition_rhs_W1dH": 1.5267, + "dH_mos_rows": -0.54, + "dH_channels": 0.61, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "p", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -1.322, + "stub_separation": -0.0, + "taller_mos_rows": -11.831, + "routing_tracks": 13.365, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/sky130/sW2_sL1/independent/C07_sky130_sW2_sL1_independent.gds", + "gds_mode": "runs/grid/C07/sky130/sW2_sL1/combined/C07_sky130_sW2_sL1_combined.gds", + "geometry_hash_ref": "d156b3a17dff43b5", + "geometry_hash_mode": "2b3f98a268f3c91f", + "geometry_identical": false + }, + { + "case": "C07_sky130_sW2_sL2", + "topology": "C07", + "pdk": "sky130", + "size": "sW2_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 414.357, + "A1": 406.993, + "rel": -0.01777, + "class": "positive", + "W0": 31.51, + "H0": 13.15, + "W1": 30.95, + "H1": 13.15, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 7.364, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56, + "p": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -7.364, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/sky130/sW2_sL2/independent/C07_sky130_sW2_sL2_independent.gds", + "gds_mode": "runs/grid/C07/sky130/sW2_sL2/diffusion_only/C07_sky130_sW2_sL2_diffusion_only.gds", + "geometry_hash_ref": "b3f18900b4f2b840", + "geometry_hash_mode": "287b4d0af9cab14a", + "geometry_identical": false + }, + { + "case": "C07_sky130_sW2_sL2", + "topology": "C07", + "pdk": "sky130", + "size": "sW2_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 414.357, + "A1": 397.341, + "rel": -0.04106, + "class": "positive", + "W0": 31.51, + "H0": 13.15, + "W1": 31.51, + "H1": 12.61, + "dW": 0.0, + "dH": -0.54, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -17.0154, + "dH_mos_rows": -0.54, + "dH_channels": 0.0, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -17.015, + "routing_tracks": 0.0, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/sky130/sW2_sL2/independent/C07_sky130_sW2_sL2_independent.gds", + "gds_mode": "runs/grid/C07/sky130/sW2_sL2/gate_only/C07_sky130_sW2_sL2_gate_only.gds", + "geometry_hash_ref": "b3f18900b4f2b840", + "geometry_hash_mode": "40b34aeebf61d083", + "geometry_identical": false + }, + { + "case": "C07_sky130_sW2_sL2", + "topology": "C07", + "pdk": "sky130", + "size": "sW2_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 414.357, + "A1": 396.08, + "rel": -0.04411, + "class": "positive", + "W0": 31.51, + "H0": 13.15, + "W1": 31.41, + "H1": 12.61, + "dW": 0.1, + "dH": -0.54, + "condition_lhs_H0dW": 1.315, + "condition_rhs_W1dH": -16.9614, + "dH_mos_rows": -0.54, + "dH_channels": 0.0, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "p", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -1.261, + "stub_separation": -0.0, + "taller_mos_rows": -17.015, + "routing_tracks": 0.0, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C07/sky130/sW2_sL2/independent/C07_sky130_sW2_sL2_independent.gds", + "gds_mode": "runs/grid/C07/sky130/sW2_sL2/combined/C07_sky130_sW2_sL2_combined.gds", + "geometry_hash_ref": "b3f18900b4f2b840", + "geometry_hash_mode": "b5b6fa719b7929c6", + "geometry_identical": false + }, + { + "case": "C08_gf180_sW0.5_sL1.5", + "topology": "C08", + "pdk": "gf180", + "size": "sW0.5_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 411.043, + "A1": 396.467, + "rel": -0.03546, + "class": "positive", + "W0": 22.56, + "H0": 18.22, + "W1": 21.76, + "H1": 18.22, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 14.576, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8, + "p": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -14.576, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/gf180/sW0.5_sL1.5/independent/C08_gf180_sW0p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C08/gf180/sW0.5_sL1.5/diffusion_only/C08_gf180_sW0p5_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "207d1e5348d1a46a", + "geometry_hash_mode": "a6547da0d9fc5dab", + "geometry_identical": false + }, + { + "case": "C08_gf180_sW0.5_sL1.5", + "topology": "C08", + "pdk": "gf180", + "size": "sW0.5_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 411.043, + "A1": 392.995, + "rel": -0.04391, + "class": "positive", + "W0": 22.56, + "H0": 18.22, + "W1": 22.56, + "H1": 17.42, + "dW": 0.0, + "dH": -0.8, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -18.048, + "dH_mos_rows": -0.8, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -18.048, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/gf180/sW0.5_sL1.5/independent/C08_gf180_sW0p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C08/gf180/sW0.5_sL1.5/gate_only/C08_gf180_sW0p5_sL1p5_gate_only.gds", + "geometry_hash_ref": "207d1e5348d1a46a", + "geometry_hash_mode": "98357a3c83f7b6d7", + "geometry_identical": false + }, + { + "case": "C08_gf180_sW0.5_sL1.5", + "topology": "C08", + "pdk": "gf180", + "size": "sW0.5_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 411.043, + "A1": 392.995, + "rel": -0.04391, + "class": "positive", + "W0": 22.56, + "H0": 18.22, + "W1": 22.56, + "H1": 17.42, + "dW": 0.0, + "dH": -0.8, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -18.048, + "dH_mos_rows": -0.8, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -18.048, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/gf180/sW0.5_sL1.5/independent/C08_gf180_sW0p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C08/gf180/sW0.5_sL1.5/combined/C08_gf180_sW0p5_sL1p5_combined.gds", + "geometry_hash_ref": "207d1e5348d1a46a", + "geometry_hash_mode": "6d01bb7ce5c1fee7", + "geometry_identical": false + }, + { + "case": "C08_gf180_sW0.5_sL1", + "topology": "C08", + "pdk": "gf180", + "size": "sW0.5_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 349.824, + "A1": 335.248, + "rel": -0.04167, + "class": "positive", + "W0": 19.2, + "H0": 18.22, + "W1": 18.4, + "H1": 18.22, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 14.576, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8, + "p": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -14.576, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/gf180/sW0.5_sL1/independent/C08_gf180_sW0p5_sL1_independent.gds", + "gds_mode": "runs/grid/C08/gf180/sW0.5_sL1/diffusion_only/C08_gf180_sW0p5_sL1_diffusion_only.gds", + "geometry_hash_ref": "63d5f130cd6c96e1", + "geometry_hash_mode": "9331b11903bfed54", + "geometry_identical": false + }, + { + "case": "C08_gf180_sW0.5_sL1", + "topology": "C08", + "pdk": "gf180", + "size": "sW0.5_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 349.824, + "A1": 334.464, + "rel": -0.04391, + "class": "positive", + "W0": 19.2, + "H0": 18.22, + "W1": 19.2, + "H1": 17.42, + "dW": 0.0, + "dH": -0.8, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -15.36, + "dH_mos_rows": -0.8, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -15.36, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/gf180/sW0.5_sL1/independent/C08_gf180_sW0p5_sL1_independent.gds", + "gds_mode": "runs/grid/C08/gf180/sW0.5_sL1/gate_only/C08_gf180_sW0p5_sL1_gate_only.gds", + "geometry_hash_ref": "63d5f130cd6c96e1", + "geometry_hash_mode": "eddb4068648fd7d5", + "geometry_identical": false + }, + { + "case": "C08_gf180_sW0.5_sL1", + "topology": "C08", + "pdk": "gf180", + "size": "sW0.5_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 349.824, + "A1": 334.464, + "rel": -0.04391, + "class": "positive", + "W0": 19.2, + "H0": 18.22, + "W1": 19.2, + "H1": 17.42, + "dW": 0.0, + "dH": -0.8, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -15.36, + "dH_mos_rows": -0.8, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -15.36, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/gf180/sW0.5_sL1/independent/C08_gf180_sW0p5_sL1_independent.gds", + "gds_mode": "runs/grid/C08/gf180/sW0.5_sL1/combined/C08_gf180_sW0p5_sL1_combined.gds", + "geometry_hash_ref": "63d5f130cd6c96e1", + "geometry_hash_mode": "108f0535cec63d58", + "geometry_identical": false + }, + { + "case": "C08_gf180_sW0.5_sL2", + "topology": "C08", + "pdk": "gf180", + "size": "sW0.5_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 472.262, + "A1": 457.686, + "rel": -0.03086, + "class": "positive", + "W0": 25.92, + "H0": 18.22, + "W1": 25.12, + "H1": 18.22, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 14.576, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8, + "p": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -14.576, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/gf180/sW0.5_sL2/independent/C08_gf180_sW0p5_sL2_independent.gds", + "gds_mode": "runs/grid/C08/gf180/sW0.5_sL2/diffusion_only/C08_gf180_sW0p5_sL2_diffusion_only.gds", + "geometry_hash_ref": "93bc01f2937ab2b4", + "geometry_hash_mode": "880ea8ead709ef85", + "geometry_identical": false + }, + { + "case": "C08_gf180_sW0.5_sL2", + "topology": "C08", + "pdk": "gf180", + "size": "sW0.5_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 472.262, + "A1": 451.526, + "rel": -0.04391, + "class": "positive", + "W0": 25.92, + "H0": 18.22, + "W1": 25.92, + "H1": 17.42, + "dW": 0.0, + "dH": -0.8, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -20.736, + "dH_mos_rows": -0.8, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -20.736, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/gf180/sW0.5_sL2/independent/C08_gf180_sW0p5_sL2_independent.gds", + "gds_mode": "runs/grid/C08/gf180/sW0.5_sL2/gate_only/C08_gf180_sW0p5_sL2_gate_only.gds", + "geometry_hash_ref": "93bc01f2937ab2b4", + "geometry_hash_mode": "e1e2e4845dd6090d", + "geometry_identical": false + }, + { + "case": "C08_gf180_sW0.5_sL2", + "topology": "C08", + "pdk": "gf180", + "size": "sW0.5_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 472.262, + "A1": 451.526, + "rel": -0.04391, + "class": "positive", + "W0": 25.92, + "H0": 18.22, + "W1": 25.92, + "H1": 17.42, + "dW": 0.0, + "dH": -0.8, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -20.736, + "dH_mos_rows": -0.8, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -20.736, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/gf180/sW0.5_sL2/independent/C08_gf180_sW0p5_sL2_independent.gds", + "gds_mode": "runs/grid/C08/gf180/sW0.5_sL2/combined/C08_gf180_sW0p5_sL2_combined.gds", + "geometry_hash_ref": "93bc01f2937ab2b4", + "geometry_hash_mode": "fe56244e300cabdc", + "geometry_identical": false + }, + { + "case": "C08_gf180_sW1.5_sL1.5", + "topology": "C08", + "pdk": "gf180", + "size": "sW1.5_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1023.235, + "A1": 1008.659, + "rel": -0.01425, + "class": "positive", + "W0": 56.16, + "H0": 18.22, + "W1": 55.36, + "H1": 18.22, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 14.576, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8, + "p": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -14.576, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/gf180/sW1.5_sL1.5/independent/C08_gf180_sW1p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C08/gf180/sW1.5_sL1.5/diffusion_only/C08_gf180_sW1p5_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "03eef42786184656", + "geometry_hash_mode": "b493d4d14fc1d45b", + "geometry_identical": false + }, + { + "case": "C08_gf180_sW1.5_sL1.5", + "topology": "C08", + "pdk": "gf180", + "size": "sW1.5_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1023.235, + "A1": 978.307, + "rel": -0.04391, + "class": "positive", + "W0": 56.16, + "H0": 18.22, + "W1": 56.16, + "H1": 17.42, + "dW": 0.0, + "dH": -0.8, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -44.928, + "dH_mos_rows": -0.8, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -44.928, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/gf180/sW1.5_sL1.5/independent/C08_gf180_sW1p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C08/gf180/sW1.5_sL1.5/gate_only/C08_gf180_sW1p5_sL1p5_gate_only.gds", + "geometry_hash_ref": "03eef42786184656", + "geometry_hash_mode": "010412683bb10e9a", + "geometry_identical": false + }, + { + "case": "C08_gf180_sW1.5_sL1.5", + "topology": "C08", + "pdk": "gf180", + "size": "sW1.5_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1023.235, + "A1": 978.307, + "rel": -0.04391, + "class": "positive", + "W0": 56.16, + "H0": 18.22, + "W1": 56.16, + "H1": 17.42, + "dW": 0.0, + "dH": -0.8, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -44.928, + "dH_mos_rows": -0.8, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -44.928, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/gf180/sW1.5_sL1.5/independent/C08_gf180_sW1p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C08/gf180/sW1.5_sL1.5/combined/C08_gf180_sW1p5_sL1p5_combined.gds", + "geometry_hash_ref": "03eef42786184656", + "geometry_hash_mode": "0c3b7da1fec1131e", + "geometry_identical": false + }, + { + "case": "C08_gf180_sW1.5_sL1", + "topology": "C08", + "pdk": "gf180", + "size": "sW1.5_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 839.578, + "A1": 825.002, + "rel": -0.01736, + "class": "positive", + "W0": 46.08, + "H0": 18.22, + "W1": 45.28, + "H1": 18.22, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 14.576, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8, + "p": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -14.576, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/gf180/sW1.5_sL1/independent/C08_gf180_sW1p5_sL1_independent.gds", + "gds_mode": "runs/grid/C08/gf180/sW1.5_sL1/diffusion_only/C08_gf180_sW1p5_sL1_diffusion_only.gds", + "geometry_hash_ref": "c87180ef626c9b94", + "geometry_hash_mode": "e925bf338a9ca4cd", + "geometry_identical": false + }, + { + "case": "C08_gf180_sW1.5_sL1", + "topology": "C08", + "pdk": "gf180", + "size": "sW1.5_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 839.578, + "A1": 802.714, + "rel": -0.04391, + "class": "positive", + "W0": 46.08, + "H0": 18.22, + "W1": 46.08, + "H1": 17.42, + "dW": 0.0, + "dH": -0.8, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -36.864, + "dH_mos_rows": -0.8, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -36.864, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/gf180/sW1.5_sL1/independent/C08_gf180_sW1p5_sL1_independent.gds", + "gds_mode": "runs/grid/C08/gf180/sW1.5_sL1/gate_only/C08_gf180_sW1p5_sL1_gate_only.gds", + "geometry_hash_ref": "c87180ef626c9b94", + "geometry_hash_mode": "0e8cb95cb52a9a4c", + "geometry_identical": false + }, + { + "case": "C08_gf180_sW1.5_sL1", + "topology": "C08", + "pdk": "gf180", + "size": "sW1.5_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 839.578, + "A1": 802.714, + "rel": -0.04391, + "class": "positive", + "W0": 46.08, + "H0": 18.22, + "W1": 46.08, + "H1": 17.42, + "dW": 0.0, + "dH": -0.8, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -36.864, + "dH_mos_rows": -0.8, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -36.864, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/gf180/sW1.5_sL1/independent/C08_gf180_sW1p5_sL1_independent.gds", + "gds_mode": "runs/grid/C08/gf180/sW1.5_sL1/combined/C08_gf180_sW1p5_sL1_combined.gds", + "geometry_hash_ref": "c87180ef626c9b94", + "geometry_hash_mode": "4261a72b3b4f8731", + "geometry_identical": false + }, + { + "case": "C08_gf180_sW1.5_sL2", + "topology": "C08", + "pdk": "gf180", + "size": "sW1.5_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1206.893, + "A1": 1192.317, + "rel": -0.01208, + "class": "positive", + "W0": 66.24, + "H0": 18.22, + "W1": 65.44, + "H1": 18.22, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 14.576, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8, + "p": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -14.576, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/gf180/sW1.5_sL2/independent/C08_gf180_sW1p5_sL2_independent.gds", + "gds_mode": "runs/grid/C08/gf180/sW1.5_sL2/diffusion_only/C08_gf180_sW1p5_sL2_diffusion_only.gds", + "geometry_hash_ref": "790df02cfb73b1fe", + "geometry_hash_mode": "ba5025b844ec342c", + "geometry_identical": false + }, + { + "case": "C08_gf180_sW1.5_sL2", + "topology": "C08", + "pdk": "gf180", + "size": "sW1.5_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1206.893, + "A1": 1153.901, + "rel": -0.04391, + "class": "positive", + "W0": 66.24, + "H0": 18.22, + "W1": 66.24, + "H1": 17.42, + "dW": 0.0, + "dH": -0.8, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -52.992, + "dH_mos_rows": -0.8, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -52.992, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/gf180/sW1.5_sL2/independent/C08_gf180_sW1p5_sL2_independent.gds", + "gds_mode": "runs/grid/C08/gf180/sW1.5_sL2/gate_only/C08_gf180_sW1p5_sL2_gate_only.gds", + "geometry_hash_ref": "790df02cfb73b1fe", + "geometry_hash_mode": "26e5f27030fca8fc", + "geometry_identical": false + }, + { + "case": "C08_gf180_sW1.5_sL2", + "topology": "C08", + "pdk": "gf180", + "size": "sW1.5_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1206.893, + "A1": 1153.901, + "rel": -0.04391, + "class": "positive", + "W0": 66.24, + "H0": 18.22, + "W1": 66.24, + "H1": 17.42, + "dW": 0.0, + "dH": -0.8, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -52.992, + "dH_mos_rows": -0.8, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -52.992, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/gf180/sW1.5_sL2/independent/C08_gf180_sW1p5_sL2_independent.gds", + "gds_mode": "runs/grid/C08/gf180/sW1.5_sL2/combined/C08_gf180_sW1p5_sL2_combined.gds", + "geometry_hash_ref": "790df02cfb73b1fe", + "geometry_hash_mode": "1e972267e45562dc", + "geometry_identical": false + }, + { + "case": "C08_gf180_sW1_sL1.5", + "topology": "C08", + "pdk": "gf180", + "size": "sW1_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 717.139, + "A1": 702.563, + "rel": -0.02033, + "class": "positive", + "W0": 39.36, + "H0": 18.22, + "W1": 38.56, + "H1": 18.22, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 14.576, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8, + "p": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -14.576, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/gf180/sW1_sL1.5/independent/C08_gf180_sW1_sL1p5_independent.gds", + "gds_mode": "runs/grid/C08/gf180/sW1_sL1.5/diffusion_only/C08_gf180_sW1_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "3116707778f3c4ca", + "geometry_hash_mode": "20f2a083a83e642b", + "geometry_identical": false + }, + { + "case": "C08_gf180_sW1_sL1.5", + "topology": "C08", + "pdk": "gf180", + "size": "sW1_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 717.139, + "A1": 685.651, + "rel": -0.04391, + "class": "positive", + "W0": 39.36, + "H0": 18.22, + "W1": 39.36, + "H1": 17.42, + "dW": 0.0, + "dH": -0.8, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -31.488, + "dH_mos_rows": -0.8, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -31.488, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/gf180/sW1_sL1.5/independent/C08_gf180_sW1_sL1p5_independent.gds", + "gds_mode": "runs/grid/C08/gf180/sW1_sL1.5/gate_only/C08_gf180_sW1_sL1p5_gate_only.gds", + "geometry_hash_ref": "3116707778f3c4ca", + "geometry_hash_mode": "c6c7cb11d3c04e63", + "geometry_identical": false + }, + { + "case": "C08_gf180_sW1_sL1.5", + "topology": "C08", + "pdk": "gf180", + "size": "sW1_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 717.139, + "A1": 685.651, + "rel": -0.04391, + "class": "positive", + "W0": 39.36, + "H0": 18.22, + "W1": 39.36, + "H1": 17.42, + "dW": 0.0, + "dH": -0.8, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -31.488, + "dH_mos_rows": -0.8, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -31.488, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/gf180/sW1_sL1.5/independent/C08_gf180_sW1_sL1p5_independent.gds", + "gds_mode": "runs/grid/C08/gf180/sW1_sL1.5/combined/C08_gf180_sW1_sL1p5_combined.gds", + "geometry_hash_ref": "3116707778f3c4ca", + "geometry_hash_mode": "cbe20352b7271b8a", + "geometry_identical": false + }, + { + "case": "C08_gf180_sW1_sL1", + "topology": "C08", + "pdk": "gf180", + "size": "sW1_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 594.701, + "A1": 580.125, + "rel": -0.02451, + "class": "positive", + "W0": 32.64, + "H0": 18.22, + "W1": 31.84, + "H1": 18.22, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 14.576, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8, + "p": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -14.576, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/gf180/sW1_sL1/independent/C08_gf180_sW1_sL1_independent.gds", + "gds_mode": "runs/grid/C08/gf180/sW1_sL1/diffusion_only/C08_gf180_sW1_sL1_diffusion_only.gds", + "geometry_hash_ref": "0826b3df49ee5e45", + "geometry_hash_mode": "212669b0a61b1079", + "geometry_identical": false + }, + { + "case": "C08_gf180_sW1_sL1", + "topology": "C08", + "pdk": "gf180", + "size": "sW1_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 594.701, + "A1": 568.589, + "rel": -0.04391, + "class": "positive", + "W0": 32.64, + "H0": 18.22, + "W1": 32.64, + "H1": 17.42, + "dW": 0.0, + "dH": -0.8, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -26.112, + "dH_mos_rows": -0.8, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -26.112, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/gf180/sW1_sL1/independent/C08_gf180_sW1_sL1_independent.gds", + "gds_mode": "runs/grid/C08/gf180/sW1_sL1/gate_only/C08_gf180_sW1_sL1_gate_only.gds", + "geometry_hash_ref": "0826b3df49ee5e45", + "geometry_hash_mode": "f6fd8afde3563d40", + "geometry_identical": false + }, + { + "case": "C08_gf180_sW1_sL1", + "topology": "C08", + "pdk": "gf180", + "size": "sW1_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 594.701, + "A1": 568.589, + "rel": -0.04391, + "class": "positive", + "W0": 32.64, + "H0": 18.22, + "W1": 32.64, + "H1": 17.42, + "dW": 0.0, + "dH": -0.8, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -26.112, + "dH_mos_rows": -0.8, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -26.112, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/gf180/sW1_sL1/independent/C08_gf180_sW1_sL1_independent.gds", + "gds_mode": "runs/grid/C08/gf180/sW1_sL1/combined/C08_gf180_sW1_sL1_combined.gds", + "geometry_hash_ref": "0826b3df49ee5e45", + "geometry_hash_mode": "cf4e7fd6863e8f67", + "geometry_identical": false + }, + { + "case": "C08_gf180_sW1_sL2", + "topology": "C08", + "pdk": "gf180", + "size": "sW1_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 839.578, + "A1": 825.002, + "rel": -0.01736, + "class": "positive", + "W0": 46.08, + "H0": 18.22, + "W1": 45.28, + "H1": 18.22, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 14.576, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8, + "p": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -14.576, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/gf180/sW1_sL2/independent/C08_gf180_sW1_sL2_independent.gds", + "gds_mode": "runs/grid/C08/gf180/sW1_sL2/diffusion_only/C08_gf180_sW1_sL2_diffusion_only.gds", + "geometry_hash_ref": "84e6a9dc55944981", + "geometry_hash_mode": "8ebf6db0a0169f45", + "geometry_identical": false + }, + { + "case": "C08_gf180_sW1_sL2", + "topology": "C08", + "pdk": "gf180", + "size": "sW1_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 839.578, + "A1": 802.714, + "rel": -0.04391, + "class": "positive", + "W0": 46.08, + "H0": 18.22, + "W1": 46.08, + "H1": 17.42, + "dW": 0.0, + "dH": -0.8, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -36.864, + "dH_mos_rows": -0.8, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -36.864, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/gf180/sW1_sL2/independent/C08_gf180_sW1_sL2_independent.gds", + "gds_mode": "runs/grid/C08/gf180/sW1_sL2/gate_only/C08_gf180_sW1_sL2_gate_only.gds", + "geometry_hash_ref": "84e6a9dc55944981", + "geometry_hash_mode": "87e7cef89ae40d74", + "geometry_identical": false + }, + { + "case": "C08_gf180_sW1_sL2", + "topology": "C08", + "pdk": "gf180", + "size": "sW1_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 839.578, + "A1": 802.714, + "rel": -0.04391, + "class": "positive", + "W0": 46.08, + "H0": 18.22, + "W1": 46.08, + "H1": 17.42, + "dW": 0.0, + "dH": -0.8, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -36.864, + "dH_mos_rows": -0.8, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -36.864, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/gf180/sW1_sL2/independent/C08_gf180_sW1_sL2_independent.gds", + "gds_mode": "runs/grid/C08/gf180/sW1_sL2/combined/C08_gf180_sW1_sL2_combined.gds", + "geometry_hash_ref": "84e6a9dc55944981", + "geometry_hash_mode": "a2e727f00a26b7e9", + "geometry_identical": false + }, + { + "case": "C08_gf180_sW2_sL1.5", + "topology": "C08", + "pdk": "gf180", + "size": "sW2_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1329.331, + "A1": 1314.755, + "rel": -0.01096, + "class": "positive", + "W0": 72.96, + "H0": 18.22, + "W1": 72.16, + "H1": 18.22, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 14.576, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8, + "p": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -14.576, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/gf180/sW2_sL1.5/independent/C08_gf180_sW2_sL1p5_independent.gds", + "gds_mode": "runs/grid/C08/gf180/sW2_sL1.5/diffusion_only/C08_gf180_sW2_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "99d6629284cabbe9", + "geometry_hash_mode": "bb68825ccea90b48", + "geometry_identical": false + }, + { + "case": "C08_gf180_sW2_sL1.5", + "topology": "C08", + "pdk": "gf180", + "size": "sW2_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1329.331, + "A1": 1270.963, + "rel": -0.04391, + "class": "positive", + "W0": 72.96, + "H0": 18.22, + "W1": 72.96, + "H1": 17.42, + "dW": 0.0, + "dH": -0.8, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -58.368, + "dH_mos_rows": -0.8, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -58.368, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/gf180/sW2_sL1.5/independent/C08_gf180_sW2_sL1p5_independent.gds", + "gds_mode": "runs/grid/C08/gf180/sW2_sL1.5/gate_only/C08_gf180_sW2_sL1p5_gate_only.gds", + "geometry_hash_ref": "99d6629284cabbe9", + "geometry_hash_mode": "728ff958d2ca2c13", + "geometry_identical": false + }, + { + "case": "C08_gf180_sW2_sL1.5", + "topology": "C08", + "pdk": "gf180", + "size": "sW2_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1329.331, + "A1": 1270.963, + "rel": -0.04391, + "class": "positive", + "W0": 72.96, + "H0": 18.22, + "W1": 72.96, + "H1": 17.42, + "dW": 0.0, + "dH": -0.8, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -58.368, + "dH_mos_rows": -0.8, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -58.368, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/gf180/sW2_sL1.5/independent/C08_gf180_sW2_sL1p5_independent.gds", + "gds_mode": "runs/grid/C08/gf180/sW2_sL1.5/combined/C08_gf180_sW2_sL1p5_combined.gds", + "geometry_hash_ref": "99d6629284cabbe9", + "geometry_hash_mode": "823430f375a6e981", + "geometry_identical": false + }, + { + "case": "C08_gf180_sW2_sL1", + "topology": "C08", + "pdk": "gf180", + "size": "sW2_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1084.454, + "A1": 1069.878, + "rel": -0.01344, + "class": "positive", + "W0": 59.52, + "H0": 18.22, + "W1": 58.72, + "H1": 18.22, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 14.576, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8, + "p": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -14.576, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/gf180/sW2_sL1/independent/C08_gf180_sW2_sL1_independent.gds", + "gds_mode": "runs/grid/C08/gf180/sW2_sL1/diffusion_only/C08_gf180_sW2_sL1_diffusion_only.gds", + "geometry_hash_ref": "1ddcf58fd51e084b", + "geometry_hash_mode": "f74764e1bb4803a4", + "geometry_identical": false + }, + { + "case": "C08_gf180_sW2_sL1", + "topology": "C08", + "pdk": "gf180", + "size": "sW2_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1084.454, + "A1": 1036.838, + "rel": -0.04391, + "class": "positive", + "W0": 59.52, + "H0": 18.22, + "W1": 59.52, + "H1": 17.42, + "dW": 0.0, + "dH": -0.8, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -47.616, + "dH_mos_rows": -0.8, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -47.616, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/gf180/sW2_sL1/independent/C08_gf180_sW2_sL1_independent.gds", + "gds_mode": "runs/grid/C08/gf180/sW2_sL1/gate_only/C08_gf180_sW2_sL1_gate_only.gds", + "geometry_hash_ref": "1ddcf58fd51e084b", + "geometry_hash_mode": "8ed9918a3c793ea7", + "geometry_identical": false + }, + { + "case": "C08_gf180_sW2_sL1", + "topology": "C08", + "pdk": "gf180", + "size": "sW2_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1084.454, + "A1": 1036.838, + "rel": -0.04391, + "class": "positive", + "W0": 59.52, + "H0": 18.22, + "W1": 59.52, + "H1": 17.42, + "dW": 0.0, + "dH": -0.8, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -47.616, + "dH_mos_rows": -0.8, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -47.616, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/gf180/sW2_sL1/independent/C08_gf180_sW2_sL1_independent.gds", + "gds_mode": "runs/grid/C08/gf180/sW2_sL1/combined/C08_gf180_sW2_sL1_combined.gds", + "geometry_hash_ref": "1ddcf58fd51e084b", + "geometry_hash_mode": "9c297a9aa76d9a71", + "geometry_identical": false + }, + { + "case": "C08_gf180_sW2_sL2", + "topology": "C08", + "pdk": "gf180", + "size": "sW2_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1574.208, + "A1": 1559.632, + "rel": -0.00926, + "class": "positive", + "W0": 86.4, + "H0": 18.22, + "W1": 85.6, + "H1": 18.22, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 14.576, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8, + "p": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -14.576, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/gf180/sW2_sL2/independent/C08_gf180_sW2_sL2_independent.gds", + "gds_mode": "runs/grid/C08/gf180/sW2_sL2/diffusion_only/C08_gf180_sW2_sL2_diffusion_only.gds", + "geometry_hash_ref": "f65aca2ff4e833c5", + "geometry_hash_mode": "b7f81e23bc31a14a", + "geometry_identical": false + }, + { + "case": "C08_gf180_sW2_sL2", + "topology": "C08", + "pdk": "gf180", + "size": "sW2_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1574.208, + "A1": 1505.088, + "rel": -0.04391, + "class": "positive", + "W0": 86.4, + "H0": 18.22, + "W1": 86.4, + "H1": 17.42, + "dW": 0.0, + "dH": -0.8, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -69.12, + "dH_mos_rows": -0.8, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -69.12, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/gf180/sW2_sL2/independent/C08_gf180_sW2_sL2_independent.gds", + "gds_mode": "runs/grid/C08/gf180/sW2_sL2/gate_only/C08_gf180_sW2_sL2_gate_only.gds", + "geometry_hash_ref": "f65aca2ff4e833c5", + "geometry_hash_mode": "4bf4709ea6070b42", + "geometry_identical": false + }, + { + "case": "C08_gf180_sW2_sL2", + "topology": "C08", + "pdk": "gf180", + "size": "sW2_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1574.208, + "A1": 1505.088, + "rel": -0.04391, + "class": "positive", + "W0": 86.4, + "H0": 18.22, + "W1": 86.4, + "H1": 17.42, + "dW": 0.0, + "dH": -0.8, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -69.12, + "dH_mos_rows": -0.8, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -69.12, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/gf180/sW2_sL2/independent/C08_gf180_sW2_sL2_independent.gds", + "gds_mode": "runs/grid/C08/gf180/sW2_sL2/combined/C08_gf180_sW2_sL2_combined.gds", + "geometry_hash_ref": "f65aca2ff4e833c5", + "geometry_hash_mode": "61f7bd2534518302", + "geometry_identical": false + }, + { + "case": "C08_ihp130_sW0.5_sL1.5", + "topology": "C08", + "pdk": "ihp130", + "size": "sW0.5_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 205.817, + "A1": 199.035, + "rel": -0.03296, + "class": "positive", + "W0": 15.475, + "H0": 13.3, + "W1": 14.965, + "H1": 13.3, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 6.783, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51, + "p": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -6.783, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/ihp130/sW0.5_sL1.5/independent/C08_ihp130_sW0p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C08/ihp130/sW0.5_sL1.5/diffusion_only/C08_ihp130_sW0p5_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "d22764373f207f8d", + "geometry_hash_mode": "b0c1ffe1439e6be9", + "geometry_identical": false + }, + { + "case": "C08_ihp130_sW0.5_sL1.5", + "topology": "C08", + "pdk": "ihp130", + "size": "sW0.5_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 205.817, + "A1": 197.925, + "rel": -0.03835, + "class": "positive", + "W0": 15.475, + "H0": 13.3, + "W1": 15.475, + "H1": 12.79, + "dW": 0.0, + "dH": -0.51, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -7.8923, + "dH_mos_rows": -0.51, + "dH_channels": 0.0, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -7.892, + "routing_tracks": 0.0, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/ihp130/sW0.5_sL1.5/independent/C08_ihp130_sW0p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C08/ihp130/sW0.5_sL1.5/gate_only/C08_ihp130_sW0p5_sL1p5_gate_only.gds", + "geometry_hash_ref": "d22764373f207f8d", + "geometry_hash_mode": "199b247eb2c6e393", + "geometry_identical": false + }, + { + "case": "C08_ihp130_sW0.5_sL1.5", + "topology": "C08", + "pdk": "ihp130", + "size": "sW0.5_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 205.817, + "A1": 197.925, + "rel": -0.03835, + "class": "positive", + "W0": 15.475, + "H0": 13.3, + "W1": 15.475, + "H1": 12.79, + "dW": 0.0, + "dH": -0.51, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -7.8923, + "dH_mos_rows": -0.51, + "dH_channels": 0.0, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -7.892, + "routing_tracks": 0.0, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/ihp130/sW0.5_sL1.5/independent/C08_ihp130_sW0p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C08/ihp130/sW0.5_sL1.5/combined/C08_ihp130_sW0p5_sL1p5_combined.gds", + "geometry_hash_ref": "d22764373f207f8d", + "geometry_hash_mode": "194df28952ccee5f", + "geometry_identical": false + }, + { + "case": "C08_ihp130_sW0.5_sL2", + "topology": "C08", + "pdk": "ihp130", + "size": "sW0.5_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 236.94, + "A1": 230.157, + "rel": -0.02863, + "class": "positive", + "W0": 17.815, + "H0": 13.3, + "W1": 17.305, + "H1": 13.3, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 6.783, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51, + "p": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -6.783, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/ihp130/sW0.5_sL2/independent/C08_ihp130_sW0p5_sL2_independent.gds", + "gds_mode": "runs/grid/C08/ihp130/sW0.5_sL2/diffusion_only/C08_ihp130_sW0p5_sL2_diffusion_only.gds", + "geometry_hash_ref": "ad23be13a95101ff", + "geometry_hash_mode": "17b4c9f6db421b2d", + "geometry_identical": false + }, + { + "case": "C08_ihp130_sW0.5_sL2", + "topology": "C08", + "pdk": "ihp130", + "size": "sW0.5_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 236.94, + "A1": 227.854, + "rel": -0.03835, + "class": "positive", + "W0": 17.815, + "H0": 13.3, + "W1": 17.815, + "H1": 12.79, + "dW": 0.0, + "dH": -0.51, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -9.0857, + "dH_mos_rows": -0.51, + "dH_channels": 0.0, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -9.086, + "routing_tracks": 0.0, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/ihp130/sW0.5_sL2/independent/C08_ihp130_sW0p5_sL2_independent.gds", + "gds_mode": "runs/grid/C08/ihp130/sW0.5_sL2/gate_only/C08_ihp130_sW0p5_sL2_gate_only.gds", + "geometry_hash_ref": "ad23be13a95101ff", + "geometry_hash_mode": "ef015e002d825c51", + "geometry_identical": false + }, + { + "case": "C08_ihp130_sW0.5_sL2", + "topology": "C08", + "pdk": "ihp130", + "size": "sW0.5_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 236.94, + "A1": 227.854, + "rel": -0.03835, + "class": "positive", + "W0": 17.815, + "H0": 13.3, + "W1": 17.815, + "H1": 12.79, + "dW": 0.0, + "dH": -0.51, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -9.0857, + "dH_mos_rows": -0.51, + "dH_channels": 0.0, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -9.086, + "routing_tracks": 0.0, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/ihp130/sW0.5_sL2/independent/C08_ihp130_sW0p5_sL2_independent.gds", + "gds_mode": "runs/grid/C08/ihp130/sW0.5_sL2/combined/C08_ihp130_sW0p5_sL2_combined.gds", + "geometry_hash_ref": "ad23be13a95101ff", + "geometry_hash_mode": "6695180fd2c3a334", + "geometry_identical": false + }, + { + "case": "C08_ihp130_sW1.5_sL1.5", + "topology": "C08", + "pdk": "ihp130", + "size": "sW1.5_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 513.846, + "A1": 507.062, + "rel": -0.0132, + "class": "positive", + "W0": 38.635, + "H0": 13.3, + "W1": 38.125, + "H1": 13.3, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 6.783, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51, + "p": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -6.783, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/ihp130/sW1.5_sL1.5/independent/C08_ihp130_sW1p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C08/ihp130/sW1.5_sL1.5/diffusion_only/C08_ihp130_sW1p5_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "7466831db119eb67", + "geometry_hash_mode": "b2c14c3c7f453031", + "geometry_identical": false + }, + { + "case": "C08_ihp130_sW1.5_sL1.5", + "topology": "C08", + "pdk": "ihp130", + "size": "sW1.5_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 513.846, + "A1": 494.142, + "rel": -0.03835, + "class": "positive", + "W0": 38.635, + "H0": 13.3, + "W1": 38.635, + "H1": 12.79, + "dW": 0.0, + "dH": -0.51, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -19.7039, + "dH_mos_rows": -0.51, + "dH_channels": 0.0, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -19.704, + "routing_tracks": 0.0, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/ihp130/sW1.5_sL1.5/independent/C08_ihp130_sW1p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C08/ihp130/sW1.5_sL1.5/gate_only/C08_ihp130_sW1p5_sL1p5_gate_only.gds", + "geometry_hash_ref": "7466831db119eb67", + "geometry_hash_mode": "56512b3c894ae18a", + "geometry_identical": false + }, + { + "case": "C08_ihp130_sW1.5_sL1.5", + "topology": "C08", + "pdk": "ihp130", + "size": "sW1.5_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 513.846, + "A1": 494.142, + "rel": -0.03835, + "class": "positive", + "W0": 38.635, + "H0": 13.3, + "W1": 38.635, + "H1": 12.79, + "dW": 0.0, + "dH": -0.51, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -19.7039, + "dH_mos_rows": -0.51, + "dH_channels": 0.0, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -19.704, + "routing_tracks": 0.0, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/ihp130/sW1.5_sL1.5/independent/C08_ihp130_sW1p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C08/ihp130/sW1.5_sL1.5/combined/C08_ihp130_sW1p5_sL1p5_combined.gds", + "geometry_hash_ref": "7466831db119eb67", + "geometry_hash_mode": "40e89b036be17d25", + "geometry_identical": false + }, + { + "case": "C08_ihp130_sW1.5_sL1", + "topology": "C08", + "pdk": "ihp130", + "size": "sW1.5_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 420.48, + "A1": 413.697, + "rel": -0.01613, + "class": "positive", + "W0": 31.615, + "H0": 13.3, + "W1": 31.105, + "H1": 13.3, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 6.783, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51, + "p": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -6.783, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/ihp130/sW1.5_sL1/independent/C08_ihp130_sW1p5_sL1_independent.gds", + "gds_mode": "runs/grid/C08/ihp130/sW1.5_sL1/diffusion_only/C08_ihp130_sW1p5_sL1_diffusion_only.gds", + "geometry_hash_ref": "cb1df5c3e0ecaa50", + "geometry_hash_mode": "5ecf23c6778b5082", + "geometry_identical": false + }, + { + "case": "C08_ihp130_sW1.5_sL1", + "topology": "C08", + "pdk": "ihp130", + "size": "sW1.5_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 420.48, + "A1": 404.356, + "rel": -0.03835, + "class": "positive", + "W0": 31.615, + "H0": 13.3, + "W1": 31.615, + "H1": 12.79, + "dW": 0.0, + "dH": -0.51, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -16.1237, + "dH_mos_rows": -0.51, + "dH_channels": 0.0, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -16.124, + "routing_tracks": 0.0, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/ihp130/sW1.5_sL1/independent/C08_ihp130_sW1p5_sL1_independent.gds", + "gds_mode": "runs/grid/C08/ihp130/sW1.5_sL1/gate_only/C08_ihp130_sW1p5_sL1_gate_only.gds", + "geometry_hash_ref": "cb1df5c3e0ecaa50", + "geometry_hash_mode": "4a0e122e58402469", + "geometry_identical": false + }, + { + "case": "C08_ihp130_sW1.5_sL1", + "topology": "C08", + "pdk": "ihp130", + "size": "sW1.5_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 420.48, + "A1": 404.356, + "rel": -0.03835, + "class": "positive", + "W0": 31.615, + "H0": 13.3, + "W1": 31.615, + "H1": 12.79, + "dW": 0.0, + "dH": -0.51, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -16.1237, + "dH_mos_rows": -0.51, + "dH_channels": 0.0, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -16.124, + "routing_tracks": 0.0, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/ihp130/sW1.5_sL1/independent/C08_ihp130_sW1p5_sL1_independent.gds", + "gds_mode": "runs/grid/C08/ihp130/sW1.5_sL1/combined/C08_ihp130_sW1p5_sL1_combined.gds", + "geometry_hash_ref": "cb1df5c3e0ecaa50", + "geometry_hash_mode": "75a9f0f371c80285", + "geometry_identical": false + }, + { + "case": "C08_ihp130_sW1.5_sL2", + "topology": "C08", + "pdk": "ihp130", + "size": "sW1.5_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 607.212, + "A1": 600.429, + "rel": -0.01117, + "class": "positive", + "W0": 45.655, + "H0": 13.3, + "W1": 45.145, + "H1": 13.3, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 6.783, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51, + "p": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -6.783, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/ihp130/sW1.5_sL2/independent/C08_ihp130_sW1p5_sL2_independent.gds", + "gds_mode": "runs/grid/C08/ihp130/sW1.5_sL2/diffusion_only/C08_ihp130_sW1p5_sL2_diffusion_only.gds", + "geometry_hash_ref": "0959848199ad0b01", + "geometry_hash_mode": "0afe0cd38595761b", + "geometry_identical": false + }, + { + "case": "C08_ihp130_sW1.5_sL2", + "topology": "C08", + "pdk": "ihp130", + "size": "sW1.5_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 607.212, + "A1": 583.927, + "rel": -0.03835, + "class": "positive", + "W0": 45.655, + "H0": 13.3, + "W1": 45.655, + "H1": 12.79, + "dW": 0.0, + "dH": -0.51, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -23.2841, + "dH_mos_rows": -0.51, + "dH_channels": 0.0, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -23.284, + "routing_tracks": 0.0, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/ihp130/sW1.5_sL2/independent/C08_ihp130_sW1p5_sL2_independent.gds", + "gds_mode": "runs/grid/C08/ihp130/sW1.5_sL2/gate_only/C08_ihp130_sW1p5_sL2_gate_only.gds", + "geometry_hash_ref": "0959848199ad0b01", + "geometry_hash_mode": "21871cc9bab34b3e", + "geometry_identical": false + }, + { + "case": "C08_ihp130_sW1.5_sL2", + "topology": "C08", + "pdk": "ihp130", + "size": "sW1.5_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 607.212, + "A1": 583.927, + "rel": -0.03835, + "class": "positive", + "W0": 45.655, + "H0": 13.3, + "W1": 45.655, + "H1": 12.79, + "dW": 0.0, + "dH": -0.51, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -23.2841, + "dH_mos_rows": -0.51, + "dH_channels": 0.0, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -23.284, + "routing_tracks": 0.0, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/ihp130/sW1.5_sL2/independent/C08_ihp130_sW1p5_sL2_independent.gds", + "gds_mode": "runs/grid/C08/ihp130/sW1.5_sL2/combined/C08_ihp130_sW1p5_sL2_combined.gds", + "geometry_hash_ref": "0959848199ad0b01", + "geometry_hash_mode": "61c1ce7811486ff3", + "geometry_identical": false + }, + { + "case": "C08_ihp130_sW1_sL1.5", + "topology": "C08", + "pdk": "ihp130", + "size": "sW1_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 359.832, + "A1": 353.049, + "rel": -0.01885, + "class": "positive", + "W0": 27.055, + "H0": 13.3, + "W1": 26.545, + "H1": 13.3, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 6.783, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51, + "p": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -6.783, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/ihp130/sW1_sL1.5/independent/C08_ihp130_sW1_sL1p5_independent.gds", + "gds_mode": "runs/grid/C08/ihp130/sW1_sL1.5/diffusion_only/C08_ihp130_sW1_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "714103b4f6bf640a", + "geometry_hash_mode": "b53dc9d4945bb9a4", + "geometry_identical": false + }, + { + "case": "C08_ihp130_sW1_sL1.5", + "topology": "C08", + "pdk": "ihp130", + "size": "sW1_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 359.832, + "A1": 346.033, + "rel": -0.03835, + "class": "positive", + "W0": 27.055, + "H0": 13.3, + "W1": 27.055, + "H1": 12.79, + "dW": 0.0, + "dH": -0.51, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -13.7981, + "dH_mos_rows": -0.51, + "dH_channels": 0.0, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -13.798, + "routing_tracks": 0.0, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/ihp130/sW1_sL1.5/independent/C08_ihp130_sW1_sL1p5_independent.gds", + "gds_mode": "runs/grid/C08/ihp130/sW1_sL1.5/gate_only/C08_ihp130_sW1_sL1p5_gate_only.gds", + "geometry_hash_ref": "714103b4f6bf640a", + "geometry_hash_mode": "1b90ee9989e98fe5", + "geometry_identical": false + }, + { + "case": "C08_ihp130_sW1_sL1.5", + "topology": "C08", + "pdk": "ihp130", + "size": "sW1_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 359.832, + "A1": 346.033, + "rel": -0.03835, + "class": "positive", + "W0": 27.055, + "H0": 13.3, + "W1": 27.055, + "H1": 12.79, + "dW": 0.0, + "dH": -0.51, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -13.7981, + "dH_mos_rows": -0.51, + "dH_channels": 0.0, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -13.798, + "routing_tracks": 0.0, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/ihp130/sW1_sL1.5/independent/C08_ihp130_sW1_sL1p5_independent.gds", + "gds_mode": "runs/grid/C08/ihp130/sW1_sL1.5/combined/C08_ihp130_sW1_sL1p5_combined.gds", + "geometry_hash_ref": "714103b4f6bf640a", + "geometry_hash_mode": "2d106b00ab983acb", + "geometry_identical": false + }, + { + "case": "C08_ihp130_sW1_sL1", + "topology": "C08", + "pdk": "ihp130", + "size": "sW1_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 297.588, + "A1": 290.805, + "rel": -0.02279, + "class": "positive", + "W0": 22.375, + "H0": 13.3, + "W1": 21.865, + "H1": 13.3, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 6.783, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51, + "p": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -6.783, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/ihp130/sW1_sL1/independent/C08_ihp130_sW1_sL1_independent.gds", + "gds_mode": "runs/grid/C08/ihp130/sW1_sL1/diffusion_only/C08_ihp130_sW1_sL1_diffusion_only.gds", + "geometry_hash_ref": "48d0ec7dda539200", + "geometry_hash_mode": "dc6a059d0fb09ad2", + "geometry_identical": false + }, + { + "case": "C08_ihp130_sW1_sL1", + "topology": "C08", + "pdk": "ihp130", + "size": "sW1_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 297.588, + "A1": 286.176, + "rel": -0.03835, + "class": "positive", + "W0": 22.375, + "H0": 13.3, + "W1": 22.375, + "H1": 12.79, + "dW": 0.0, + "dH": -0.51, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -11.4113, + "dH_mos_rows": -0.51, + "dH_channels": 0.0, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -11.411, + "routing_tracks": 0.0, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/ihp130/sW1_sL1/independent/C08_ihp130_sW1_sL1_independent.gds", + "gds_mode": "runs/grid/C08/ihp130/sW1_sL1/gate_only/C08_ihp130_sW1_sL1_gate_only.gds", + "geometry_hash_ref": "48d0ec7dda539200", + "geometry_hash_mode": "bb61587053b85fbf", + "geometry_identical": false + }, + { + "case": "C08_ihp130_sW1_sL1", + "topology": "C08", + "pdk": "ihp130", + "size": "sW1_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 297.588, + "A1": 286.176, + "rel": -0.03835, + "class": "positive", + "W0": 22.375, + "H0": 13.3, + "W1": 22.375, + "H1": 12.79, + "dW": 0.0, + "dH": -0.51, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -11.4113, + "dH_mos_rows": -0.51, + "dH_channels": 0.0, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -11.411, + "routing_tracks": 0.0, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/ihp130/sW1_sL1/independent/C08_ihp130_sW1_sL1_independent.gds", + "gds_mode": "runs/grid/C08/ihp130/sW1_sL1/combined/C08_ihp130_sW1_sL1_combined.gds", + "geometry_hash_ref": "48d0ec7dda539200", + "geometry_hash_mode": "299105d1394054b0", + "geometry_identical": false + }, + { + "case": "C08_ihp130_sW1_sL2", + "topology": "C08", + "pdk": "ihp130", + "size": "sW1_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 422.076, + "A1": 415.293, + "rel": -0.01607, + "class": "positive", + "W0": 31.735, + "H0": 13.3, + "W1": 31.225, + "H1": 13.3, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 6.783, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51, + "p": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -6.783, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/ihp130/sW1_sL2/independent/C08_ihp130_sW1_sL2_independent.gds", + "gds_mode": "runs/grid/C08/ihp130/sW1_sL2/diffusion_only/C08_ihp130_sW1_sL2_diffusion_only.gds", + "geometry_hash_ref": "58e44841a101aafe", + "geometry_hash_mode": "cb62267a81ccdc58", + "geometry_identical": false + }, + { + "case": "C08_ihp130_sW1_sL2", + "topology": "C08", + "pdk": "ihp130", + "size": "sW1_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 422.076, + "A1": 405.891, + "rel": -0.03835, + "class": "positive", + "W0": 31.735, + "H0": 13.3, + "W1": 31.735, + "H1": 12.79, + "dW": 0.0, + "dH": -0.51, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -16.1849, + "dH_mos_rows": -0.51, + "dH_channels": 0.0, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -16.185, + "routing_tracks": 0.0, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/ihp130/sW1_sL2/independent/C08_ihp130_sW1_sL2_independent.gds", + "gds_mode": "runs/grid/C08/ihp130/sW1_sL2/gate_only/C08_ihp130_sW1_sL2_gate_only.gds", + "geometry_hash_ref": "58e44841a101aafe", + "geometry_hash_mode": "3e5f1ec05a1c8d59", + "geometry_identical": false + }, + { + "case": "C08_ihp130_sW1_sL2", + "topology": "C08", + "pdk": "ihp130", + "size": "sW1_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 422.076, + "A1": 405.891, + "rel": -0.03835, + "class": "positive", + "W0": 31.735, + "H0": 13.3, + "W1": 31.735, + "H1": 12.79, + "dW": 0.0, + "dH": -0.51, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -16.1849, + "dH_mos_rows": -0.51, + "dH_channels": 0.0, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -16.185, + "routing_tracks": 0.0, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/ihp130/sW1_sL2/independent/C08_ihp130_sW1_sL2_independent.gds", + "gds_mode": "runs/grid/C08/ihp130/sW1_sL2/combined/C08_ihp130_sW1_sL2_combined.gds", + "geometry_hash_ref": "58e44841a101aafe", + "geometry_hash_mode": "6c8bcb0a19f7517d", + "geometry_identical": false + }, + { + "case": "C08_ihp130_sW2_sL1.5", + "topology": "C08", + "pdk": "ihp130", + "size": "sW2_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 667.86, + "A1": 661.077, + "rel": -0.01016, + "class": "positive", + "W0": 50.215, + "H0": 13.3, + "W1": 49.705, + "H1": 13.3, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 6.783, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51, + "p": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -6.783, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/ihp130/sW2_sL1.5/independent/C08_ihp130_sW2_sL1p5_independent.gds", + "gds_mode": "runs/grid/C08/ihp130/sW2_sL1.5/diffusion_only/C08_ihp130_sW2_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "429ee5ae418f89b5", + "geometry_hash_mode": "fae2d5d34885a725", + "geometry_identical": false + }, + { + "case": "C08_ihp130_sW2_sL1.5", + "topology": "C08", + "pdk": "ihp130", + "size": "sW2_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 667.86, + "A1": 642.25, + "rel": -0.03835, + "class": "positive", + "W0": 50.215, + "H0": 13.3, + "W1": 50.215, + "H1": 12.79, + "dW": 0.0, + "dH": -0.51, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -25.6097, + "dH_mos_rows": -0.51, + "dH_channels": 0.0, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -25.61, + "routing_tracks": 0.0, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/ihp130/sW2_sL1.5/independent/C08_ihp130_sW2_sL1p5_independent.gds", + "gds_mode": "runs/grid/C08/ihp130/sW2_sL1.5/gate_only/C08_ihp130_sW2_sL1p5_gate_only.gds", + "geometry_hash_ref": "429ee5ae418f89b5", + "geometry_hash_mode": "240c4504eb31024e", + "geometry_identical": false + }, + { + "case": "C08_ihp130_sW2_sL1.5", + "topology": "C08", + "pdk": "ihp130", + "size": "sW2_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 667.86, + "A1": 642.25, + "rel": -0.03835, + "class": "positive", + "W0": 50.215, + "H0": 13.3, + "W1": 50.215, + "H1": 12.79, + "dW": 0.0, + "dH": -0.51, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -25.6097, + "dH_mos_rows": -0.51, + "dH_channels": 0.0, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -25.61, + "routing_tracks": 0.0, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/ihp130/sW2_sL1.5/independent/C08_ihp130_sW2_sL1p5_independent.gds", + "gds_mode": "runs/grid/C08/ihp130/sW2_sL1.5/combined/C08_ihp130_sW2_sL1p5_combined.gds", + "geometry_hash_ref": "429ee5ae418f89b5", + "geometry_hash_mode": "d4a97d7bcd4f330c", + "geometry_identical": false + }, + { + "case": "C08_ihp130_sW2_sL2", + "topology": "C08", + "pdk": "ihp130", + "size": "sW2_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 792.348, + "A1": 785.565, + "rel": -0.00856, + "class": "positive", + "W0": 59.575, + "H0": 13.3, + "W1": 59.065, + "H1": 13.3, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 6.783, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51, + "p": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -6.783, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/ihp130/sW2_sL2/independent/C08_ihp130_sW2_sL2_independent.gds", + "gds_mode": "runs/grid/C08/ihp130/sW2_sL2/diffusion_only/C08_ihp130_sW2_sL2_diffusion_only.gds", + "geometry_hash_ref": "ea6750fcb30310be", + "geometry_hash_mode": "82112e9320a8bcfa", + "geometry_identical": false + }, + { + "case": "C08_ihp130_sW2_sL2", + "topology": "C08", + "pdk": "ihp130", + "size": "sW2_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 792.348, + "A1": 761.964, + "rel": -0.03835, + "class": "positive", + "W0": 59.575, + "H0": 13.3, + "W1": 59.575, + "H1": 12.79, + "dW": 0.0, + "dH": -0.51, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -30.3833, + "dH_mos_rows": -0.51, + "dH_channels": 0.0, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -30.383, + "routing_tracks": 0.0, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/ihp130/sW2_sL2/independent/C08_ihp130_sW2_sL2_independent.gds", + "gds_mode": "runs/grid/C08/ihp130/sW2_sL2/gate_only/C08_ihp130_sW2_sL2_gate_only.gds", + "geometry_hash_ref": "ea6750fcb30310be", + "geometry_hash_mode": "bbcabace7ac1cfbb", + "geometry_identical": false + }, + { + "case": "C08_ihp130_sW2_sL2", + "topology": "C08", + "pdk": "ihp130", + "size": "sW2_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 792.348, + "A1": 761.964, + "rel": -0.03835, + "class": "positive", + "W0": 59.575, + "H0": 13.3, + "W1": 59.575, + "H1": 12.79, + "dW": 0.0, + "dH": -0.51, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -30.3833, + "dH_mos_rows": -0.51, + "dH_channels": 0.0, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -30.383, + "routing_tracks": 0.0, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/ihp130/sW2_sL2/independent/C08_ihp130_sW2_sL2_independent.gds", + "gds_mode": "runs/grid/C08/ihp130/sW2_sL2/combined/C08_ihp130_sW2_sL2_combined.gds", + "geometry_hash_ref": "ea6750fcb30310be", + "geometry_hash_mode": "b698ef423758d566", + "geometry_identical": false + }, + { + "case": "C08_sky130_sW0.5_sL1.5", + "topology": "C08", + "pdk": "sky130", + "size": "sW0.5_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 183.352, + "A1": 175.646, + "rel": -0.04203, + "class": "positive", + "W0": 13.325, + "H0": 13.76, + "W1": 12.765, + "H1": 13.76, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 7.7056, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56, + "p": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -7.706, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/sky130/sW0.5_sL1.5/independent/C08_sky130_sW0p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C08/sky130/sW0.5_sL1.5/diffusion_only/C08_sky130_sW0p5_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "b3cffc07be5b6370", + "geometry_hash_mode": "c7c375784216aada", + "geometry_identical": false + }, + { + "case": "C08_sky130_sW0.5_sL1.5", + "topology": "C08", + "pdk": "sky130", + "size": "sW0.5_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 183.352, + "A1": 176.156, + "rel": -0.03924, + "class": "positive", + "W0": 13.325, + "H0": 13.76, + "W1": 13.325, + "H1": 13.22, + "dW": 0.0, + "dH": -0.54, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -7.1955, + "dH_mos_rows": -0.54, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -7.196, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/sky130/sW0.5_sL1.5/independent/C08_sky130_sW0p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C08/sky130/sW0.5_sL1.5/gate_only/C08_sky130_sW0p5_sL1p5_gate_only.gds", + "geometry_hash_ref": "b3cffc07be5b6370", + "geometry_hash_mode": "2cad774892a22b44", + "geometry_identical": false + }, + { + "case": "C08_sky130_sW0.5_sL1.5", + "topology": "C08", + "pdk": "sky130", + "size": "sW0.5_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 183.352, + "A1": 176.156, + "rel": -0.03924, + "class": "positive", + "W0": 13.325, + "H0": 13.76, + "W1": 13.325, + "H1": 13.22, + "dW": 0.0, + "dH": -0.54, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -7.1955, + "dH_mos_rows": -0.54, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -7.196, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/sky130/sW0.5_sL1.5/independent/C08_sky130_sW0p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C08/sky130/sW0.5_sL1.5/combined/C08_sky130_sW0p5_sL1p5_combined.gds", + "geometry_hash_ref": "b3cffc07be5b6370", + "geometry_hash_mode": "87ad735f4919d03f", + "geometry_identical": false + }, + { + "case": "C08_sky130_sW0.5_sL1", + "topology": "C08", + "pdk": "sky130", + "size": "sW0.5_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 158.584, + "A1": 150.878, + "rel": -0.04859, + "class": "positive", + "W0": 11.525, + "H0": 13.76, + "W1": 10.965, + "H1": 13.76, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 7.7056, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56, + "p": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -7.706, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/sky130/sW0.5_sL1/independent/C08_sky130_sW0p5_sL1_independent.gds", + "gds_mode": "runs/grid/C08/sky130/sW0.5_sL1/diffusion_only/C08_sky130_sW0p5_sL1_diffusion_only.gds", + "geometry_hash_ref": "221d157130e2ccf2", + "geometry_hash_mode": "422c8836f85a2ba0", + "geometry_identical": false + }, + { + "case": "C08_sky130_sW0.5_sL1", + "topology": "C08", + "pdk": "sky130", + "size": "sW0.5_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 158.584, + "A1": 152.361, + "rel": -0.03924, + "class": "positive", + "W0": 11.525, + "H0": 13.76, + "W1": 11.525, + "H1": 13.22, + "dW": 0.0, + "dH": -0.54, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -6.2235, + "dH_mos_rows": -0.54, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -6.224, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/sky130/sW0.5_sL1/independent/C08_sky130_sW0p5_sL1_independent.gds", + "gds_mode": "runs/grid/C08/sky130/sW0.5_sL1/gate_only/C08_sky130_sW0p5_sL1_gate_only.gds", + "geometry_hash_ref": "221d157130e2ccf2", + "geometry_hash_mode": "7e67590a38d0aee5", + "geometry_identical": false + }, + { + "case": "C08_sky130_sW0.5_sL1", + "topology": "C08", + "pdk": "sky130", + "size": "sW0.5_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 158.584, + "A1": 152.361, + "rel": -0.03924, + "class": "positive", + "W0": 11.525, + "H0": 13.76, + "W1": 11.525, + "H1": 13.22, + "dW": 0.0, + "dH": -0.54, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -6.2235, + "dH_mos_rows": -0.54, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -6.224, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/sky130/sW0.5_sL1/independent/C08_sky130_sW0p5_sL1_independent.gds", + "gds_mode": "runs/grid/C08/sky130/sW0.5_sL1/combined/C08_sky130_sW0p5_sL1_combined.gds", + "geometry_hash_ref": "221d157130e2ccf2", + "geometry_hash_mode": "6876b344e8f3719b", + "geometry_identical": false + }, + { + "case": "C08_sky130_sW0.5_sL2", + "topology": "C08", + "pdk": "sky130", + "size": "sW0.5_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 208.12, + "A1": 200.414, + "rel": -0.03702, + "class": "positive", + "W0": 15.125, + "H0": 13.76, + "W1": 14.565, + "H1": 13.76, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 7.7056, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56, + "p": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -7.706, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/sky130/sW0.5_sL2/independent/C08_sky130_sW0p5_sL2_independent.gds", + "gds_mode": "runs/grid/C08/sky130/sW0.5_sL2/diffusion_only/C08_sky130_sW0p5_sL2_diffusion_only.gds", + "geometry_hash_ref": "9b0b054d39496c0b", + "geometry_hash_mode": "cd87225618b89355", + "geometry_identical": false + }, + { + "case": "C08_sky130_sW0.5_sL2", + "topology": "C08", + "pdk": "sky130", + "size": "sW0.5_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 208.12, + "A1": 199.953, + "rel": -0.03924, + "class": "positive", + "W0": 15.125, + "H0": 13.76, + "W1": 15.125, + "H1": 13.22, + "dW": 0.0, + "dH": -0.54, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -8.1675, + "dH_mos_rows": -0.54, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -8.168, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/sky130/sW0.5_sL2/independent/C08_sky130_sW0p5_sL2_independent.gds", + "gds_mode": "runs/grid/C08/sky130/sW0.5_sL2/gate_only/C08_sky130_sW0p5_sL2_gate_only.gds", + "geometry_hash_ref": "9b0b054d39496c0b", + "geometry_hash_mode": "848bdf22f2db767e", + "geometry_identical": false + }, + { + "case": "C08_sky130_sW0.5_sL2", + "topology": "C08", + "pdk": "sky130", + "size": "sW0.5_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 208.12, + "A1": 199.953, + "rel": -0.03924, + "class": "positive", + "W0": 15.125, + "H0": 13.76, + "W1": 15.125, + "H1": 13.22, + "dW": 0.0, + "dH": -0.54, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -8.1675, + "dH_mos_rows": -0.54, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -8.168, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/sky130/sW0.5_sL2/independent/C08_sky130_sW0p5_sL2_independent.gds", + "gds_mode": "runs/grid/C08/sky130/sW0.5_sL2/combined/C08_sky130_sW0p5_sL2_combined.gds", + "geometry_hash_ref": "9b0b054d39496c0b", + "geometry_hash_mode": "3863e4cf421cd255", + "geometry_identical": false + }, + { + "case": "C08_sky130_sW1.5_sL1.5", + "topology": "C08", + "pdk": "sky130", + "size": "sW1.5_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 427.73, + "A1": 420.024, + "rel": -0.01802, + "class": "positive", + "W0": 31.085, + "H0": 13.76, + "W1": 30.525, + "H1": 13.76, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 7.7056, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56, + "p": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -7.706, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/sky130/sW1.5_sL1.5/independent/C08_sky130_sW1p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C08/sky130/sW1.5_sL1.5/diffusion_only/C08_sky130_sW1p5_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "949ce464b793438b", + "geometry_hash_mode": "4ed785fe91806654", + "geometry_identical": false + }, + { + "case": "C08_sky130_sW1.5_sL1.5", + "topology": "C08", + "pdk": "sky130", + "size": "sW1.5_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 427.73, + "A1": 410.944, + "rel": -0.03924, + "class": "positive", + "W0": 31.085, + "H0": 13.76, + "W1": 31.085, + "H1": 13.22, + "dW": 0.0, + "dH": -0.54, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -16.7859, + "dH_mos_rows": -0.54, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -16.786, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/sky130/sW1.5_sL1.5/independent/C08_sky130_sW1p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C08/sky130/sW1.5_sL1.5/gate_only/C08_sky130_sW1p5_sL1p5_gate_only.gds", + "geometry_hash_ref": "949ce464b793438b", + "geometry_hash_mode": "f82784ac45e5442d", + "geometry_identical": false + }, + { + "case": "C08_sky130_sW1.5_sL1.5", + "topology": "C08", + "pdk": "sky130", + "size": "sW1.5_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 427.73, + "A1": 410.944, + "rel": -0.03924, + "class": "positive", + "W0": 31.085, + "H0": 13.76, + "W1": 31.085, + "H1": 13.22, + "dW": 0.0, + "dH": -0.54, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -16.7859, + "dH_mos_rows": -0.54, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -16.786, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/sky130/sW1.5_sL1.5/independent/C08_sky130_sW1p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C08/sky130/sW1.5_sL1.5/combined/C08_sky130_sW1p5_sL1p5_combined.gds", + "geometry_hash_ref": "949ce464b793438b", + "geometry_hash_mode": "967cc2a48eb97d07", + "geometry_identical": false + }, + { + "case": "C08_sky130_sW1.5_sL1", + "topology": "C08", + "pdk": "sky130", + "size": "sW1.5_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 353.426, + "A1": 345.72, + "rel": -0.0218, + "class": "positive", + "W0": 25.685, + "H0": 13.76, + "W1": 25.125, + "H1": 13.76, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 7.7056, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56, + "p": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -7.706, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/sky130/sW1.5_sL1/independent/C08_sky130_sW1p5_sL1_independent.gds", + "gds_mode": "runs/grid/C08/sky130/sW1.5_sL1/diffusion_only/C08_sky130_sW1p5_sL1_diffusion_only.gds", + "geometry_hash_ref": "650f63df8bffc746", + "geometry_hash_mode": "7f8675e1f5b3e1b2", + "geometry_identical": false + }, + { + "case": "C08_sky130_sW1.5_sL1", + "topology": "C08", + "pdk": "sky130", + "size": "sW1.5_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 353.426, + "A1": 339.556, + "rel": -0.03924, + "class": "positive", + "W0": 25.685, + "H0": 13.76, + "W1": 25.685, + "H1": 13.22, + "dW": 0.0, + "dH": -0.54, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -13.8699, + "dH_mos_rows": -0.54, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -13.87, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/sky130/sW1.5_sL1/independent/C08_sky130_sW1p5_sL1_independent.gds", + "gds_mode": "runs/grid/C08/sky130/sW1.5_sL1/gate_only/C08_sky130_sW1p5_sL1_gate_only.gds", + "geometry_hash_ref": "650f63df8bffc746", + "geometry_hash_mode": "6f746893c2031a91", + "geometry_identical": false + }, + { + "case": "C08_sky130_sW1.5_sL1", + "topology": "C08", + "pdk": "sky130", + "size": "sW1.5_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 353.426, + "A1": 339.556, + "rel": -0.03924, + "class": "positive", + "W0": 25.685, + "H0": 13.76, + "W1": 25.685, + "H1": 13.22, + "dW": 0.0, + "dH": -0.54, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -13.8699, + "dH_mos_rows": -0.54, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -13.87, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/sky130/sW1.5_sL1/independent/C08_sky130_sW1p5_sL1_independent.gds", + "gds_mode": "runs/grid/C08/sky130/sW1.5_sL1/combined/C08_sky130_sW1p5_sL1_combined.gds", + "geometry_hash_ref": "650f63df8bffc746", + "geometry_hash_mode": "c932f3eb6cce0fb4", + "geometry_identical": false + }, + { + "case": "C08_sky130_sW1.5_sL2", + "topology": "C08", + "pdk": "sky130", + "size": "sW1.5_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 502.034, + "A1": 494.328, + "rel": -0.01535, + "class": "positive", + "W0": 36.485, + "H0": 13.76, + "W1": 35.925, + "H1": 13.76, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 7.7056, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56, + "p": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -7.706, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/sky130/sW1.5_sL2/independent/C08_sky130_sW1p5_sL2_independent.gds", + "gds_mode": "runs/grid/C08/sky130/sW1.5_sL2/diffusion_only/C08_sky130_sW1p5_sL2_diffusion_only.gds", + "geometry_hash_ref": "5884d3ad17bf9911", + "geometry_hash_mode": "05f475f4aaf55f6a", + "geometry_identical": false + }, + { + "case": "C08_sky130_sW1.5_sL2", + "topology": "C08", + "pdk": "sky130", + "size": "sW1.5_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 502.034, + "A1": 482.332, + "rel": -0.03924, + "class": "positive", + "W0": 36.485, + "H0": 13.76, + "W1": 36.485, + "H1": 13.22, + "dW": 0.0, + "dH": -0.54, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -19.7019, + "dH_mos_rows": -0.54, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -19.702, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/sky130/sW1.5_sL2/independent/C08_sky130_sW1p5_sL2_independent.gds", + "gds_mode": "runs/grid/C08/sky130/sW1.5_sL2/gate_only/C08_sky130_sW1p5_sL2_gate_only.gds", + "geometry_hash_ref": "5884d3ad17bf9911", + "geometry_hash_mode": "6450c09edaf0f785", + "geometry_identical": false + }, + { + "case": "C08_sky130_sW1.5_sL2", + "topology": "C08", + "pdk": "sky130", + "size": "sW1.5_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 502.034, + "A1": 482.332, + "rel": -0.03924, + "class": "positive", + "W0": 36.485, + "H0": 13.76, + "W1": 36.485, + "H1": 13.22, + "dW": 0.0, + "dH": -0.54, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -19.7019, + "dH_mos_rows": -0.54, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -19.702, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/sky130/sW1.5_sL2/independent/C08_sky130_sW1p5_sL2_independent.gds", + "gds_mode": "runs/grid/C08/sky130/sW1.5_sL2/combined/C08_sky130_sW1p5_sL2_combined.gds", + "geometry_hash_ref": "5884d3ad17bf9911", + "geometry_hash_mode": "86d9b71f242b3696", + "geometry_identical": false + }, + { + "case": "C08_sky130_sW1_sL1.5", + "topology": "C08", + "pdk": "sky130", + "size": "sW1_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 305.541, + "A1": 297.835, + "rel": -0.02522, + "class": "positive", + "W0": 22.205, + "H0": 13.76, + "W1": 21.645, + "H1": 13.76, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 7.7056, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56, + "p": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -7.706, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/sky130/sW1_sL1.5/independent/C08_sky130_sW1_sL1p5_independent.gds", + "gds_mode": "runs/grid/C08/sky130/sW1_sL1.5/diffusion_only/C08_sky130_sW1_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "d9ca4f5f73e8ad96", + "geometry_hash_mode": "7601a9ffc11ce000", + "geometry_identical": false + }, + { + "case": "C08_sky130_sW1_sL1.5", + "topology": "C08", + "pdk": "sky130", + "size": "sW1_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 305.541, + "A1": 293.55, + "rel": -0.03924, + "class": "positive", + "W0": 22.205, + "H0": 13.76, + "W1": 22.205, + "H1": 13.22, + "dW": 0.0, + "dH": -0.54, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -11.9907, + "dH_mos_rows": -0.54, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -11.991, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/sky130/sW1_sL1.5/independent/C08_sky130_sW1_sL1p5_independent.gds", + "gds_mode": "runs/grid/C08/sky130/sW1_sL1.5/gate_only/C08_sky130_sW1_sL1p5_gate_only.gds", + "geometry_hash_ref": "d9ca4f5f73e8ad96", + "geometry_hash_mode": "7bec626362c9f264", + "geometry_identical": false + }, + { + "case": "C08_sky130_sW1_sL1.5", + "topology": "C08", + "pdk": "sky130", + "size": "sW1_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 305.541, + "A1": 293.55, + "rel": -0.03924, + "class": "positive", + "W0": 22.205, + "H0": 13.76, + "W1": 22.205, + "H1": 13.22, + "dW": 0.0, + "dH": -0.54, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -11.9907, + "dH_mos_rows": -0.54, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -11.991, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/sky130/sW1_sL1.5/independent/C08_sky130_sW1_sL1p5_independent.gds", + "gds_mode": "runs/grid/C08/sky130/sW1_sL1.5/combined/C08_sky130_sW1_sL1p5_combined.gds", + "geometry_hash_ref": "d9ca4f5f73e8ad96", + "geometry_hash_mode": "aa496d2188354026", + "geometry_identical": false + }, + { + "case": "C08_sky130_sW1_sL1", + "topology": "C08", + "pdk": "sky130", + "size": "sW1_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 256.005, + "A1": 248.299, + "rel": -0.0301, + "class": "positive", + "W0": 18.605, + "H0": 13.76, + "W1": 18.045, + "H1": 13.76, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 7.7056, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56, + "p": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -7.706, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/sky130/sW1_sL1/independent/C08_sky130_sW1_sL1_independent.gds", + "gds_mode": "runs/grid/C08/sky130/sW1_sL1/diffusion_only/C08_sky130_sW1_sL1_diffusion_only.gds", + "geometry_hash_ref": "0e251a0982397f27", + "geometry_hash_mode": "ccc025a3b368cdab", + "geometry_identical": false + }, + { + "case": "C08_sky130_sW1_sL1", + "topology": "C08", + "pdk": "sky130", + "size": "sW1_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 256.005, + "A1": 245.958, + "rel": -0.03924, + "class": "positive", + "W0": 18.605, + "H0": 13.76, + "W1": 18.605, + "H1": 13.22, + "dW": 0.0, + "dH": -0.54, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -10.0467, + "dH_mos_rows": -0.54, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -10.047, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/sky130/sW1_sL1/independent/C08_sky130_sW1_sL1_independent.gds", + "gds_mode": "runs/grid/C08/sky130/sW1_sL1/gate_only/C08_sky130_sW1_sL1_gate_only.gds", + "geometry_hash_ref": "0e251a0982397f27", + "geometry_hash_mode": "63ba6e47aeb2717e", + "geometry_identical": false + }, + { + "case": "C08_sky130_sW1_sL1", + "topology": "C08", + "pdk": "sky130", + "size": "sW1_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 256.005, + "A1": 245.958, + "rel": -0.03924, + "class": "positive", + "W0": 18.605, + "H0": 13.76, + "W1": 18.605, + "H1": 13.22, + "dW": 0.0, + "dH": -0.54, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -10.0467, + "dH_mos_rows": -0.54, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -10.047, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/sky130/sW1_sL1/independent/C08_sky130_sW1_sL1_independent.gds", + "gds_mode": "runs/grid/C08/sky130/sW1_sL1/combined/C08_sky130_sW1_sL1_combined.gds", + "geometry_hash_ref": "0e251a0982397f27", + "geometry_hash_mode": "b86fe99b14db63b1", + "geometry_identical": false + }, + { + "case": "C08_sky130_sW1_sL2", + "topology": "C08", + "pdk": "sky130", + "size": "sW1_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 355.077, + "A1": 347.371, + "rel": -0.0217, + "class": "positive", + "W0": 25.805, + "H0": 13.76, + "W1": 25.245, + "H1": 13.76, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 7.7056, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56, + "p": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -7.706, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/sky130/sW1_sL2/independent/C08_sky130_sW1_sL2_independent.gds", + "gds_mode": "runs/grid/C08/sky130/sW1_sL2/diffusion_only/C08_sky130_sW1_sL2_diffusion_only.gds", + "geometry_hash_ref": "118be096db77acab", + "geometry_hash_mode": "f2240b5dc29650c9", + "geometry_identical": false + }, + { + "case": "C08_sky130_sW1_sL2", + "topology": "C08", + "pdk": "sky130", + "size": "sW1_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 355.077, + "A1": 341.142, + "rel": -0.03924, + "class": "positive", + "W0": 25.805, + "H0": 13.76, + "W1": 25.805, + "H1": 13.22, + "dW": 0.0, + "dH": -0.54, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -13.9347, + "dH_mos_rows": -0.54, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -13.935, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/sky130/sW1_sL2/independent/C08_sky130_sW1_sL2_independent.gds", + "gds_mode": "runs/grid/C08/sky130/sW1_sL2/gate_only/C08_sky130_sW1_sL2_gate_only.gds", + "geometry_hash_ref": "118be096db77acab", + "geometry_hash_mode": "7cdd834ac2547551", + "geometry_identical": false + }, + { + "case": "C08_sky130_sW1_sL2", + "topology": "C08", + "pdk": "sky130", + "size": "sW1_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 355.077, + "A1": 341.142, + "rel": -0.03924, + "class": "positive", + "W0": 25.805, + "H0": 13.76, + "W1": 25.805, + "H1": 13.22, + "dW": 0.0, + "dH": -0.54, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -13.9347, + "dH_mos_rows": -0.54, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -13.935, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/sky130/sW1_sL2/independent/C08_sky130_sW1_sL2_independent.gds", + "gds_mode": "runs/grid/C08/sky130/sW1_sL2/combined/C08_sky130_sW1_sL2_combined.gds", + "geometry_hash_ref": "118be096db77acab", + "geometry_hash_mode": "d424fc9790b25dc4", + "geometry_identical": false + }, + { + "case": "C08_sky130_sW2_sL1.5", + "topology": "C08", + "pdk": "sky130", + "size": "sW2_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 549.918, + "A1": 542.213, + "rel": -0.01401, + "class": "positive", + "W0": 39.965, + "H0": 13.76, + "W1": 39.405, + "H1": 13.76, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 7.7056, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56, + "p": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -7.706, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/sky130/sW2_sL1.5/independent/C08_sky130_sW2_sL1p5_independent.gds", + "gds_mode": "runs/grid/C08/sky130/sW2_sL1.5/diffusion_only/C08_sky130_sW2_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "281fb70c1b78fabc", + "geometry_hash_mode": "8d0af3050b4aedb3", + "geometry_identical": false + }, + { + "case": "C08_sky130_sW2_sL1.5", + "topology": "C08", + "pdk": "sky130", + "size": "sW2_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 549.918, + "A1": 528.337, + "rel": -0.03924, + "class": "positive", + "W0": 39.965, + "H0": 13.76, + "W1": 39.965, + "H1": 13.22, + "dW": 0.0, + "dH": -0.54, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -21.5811, + "dH_mos_rows": -0.54, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -21.581, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/sky130/sW2_sL1.5/independent/C08_sky130_sW2_sL1p5_independent.gds", + "gds_mode": "runs/grid/C08/sky130/sW2_sL1.5/gate_only/C08_sky130_sW2_sL1p5_gate_only.gds", + "geometry_hash_ref": "281fb70c1b78fabc", + "geometry_hash_mode": "eb973002feeaba0c", + "geometry_identical": false + }, + { + "case": "C08_sky130_sW2_sL1.5", + "topology": "C08", + "pdk": "sky130", + "size": "sW2_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 549.918, + "A1": 528.337, + "rel": -0.03924, + "class": "positive", + "W0": 39.965, + "H0": 13.76, + "W1": 39.965, + "H1": 13.22, + "dW": 0.0, + "dH": -0.54, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -21.5811, + "dH_mos_rows": -0.54, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -21.581, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/sky130/sW2_sL1.5/independent/C08_sky130_sW2_sL1p5_independent.gds", + "gds_mode": "runs/grid/C08/sky130/sW2_sL1.5/combined/C08_sky130_sW2_sL1p5_combined.gds", + "geometry_hash_ref": "281fb70c1b78fabc", + "geometry_hash_mode": "c6d4d316b7451f17", + "geometry_identical": false + }, + { + "case": "C08_sky130_sW2_sL1", + "topology": "C08", + "pdk": "sky130", + "size": "sW2_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 450.846, + "A1": 443.141, + "rel": -0.01709, + "class": "positive", + "W0": 32.765, + "H0": 13.76, + "W1": 32.205, + "H1": 13.76, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 7.7056, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56, + "p": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -7.706, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/sky130/sW2_sL1/independent/C08_sky130_sW2_sL1_independent.gds", + "gds_mode": "runs/grid/C08/sky130/sW2_sL1/diffusion_only/C08_sky130_sW2_sL1_diffusion_only.gds", + "geometry_hash_ref": "6aa28ad7cec65587", + "geometry_hash_mode": "462431a8af938c95", + "geometry_identical": false + }, + { + "case": "C08_sky130_sW2_sL1", + "topology": "C08", + "pdk": "sky130", + "size": "sW2_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 450.846, + "A1": 433.153, + "rel": -0.03924, + "class": "positive", + "W0": 32.765, + "H0": 13.76, + "W1": 32.765, + "H1": 13.22, + "dW": 0.0, + "dH": -0.54, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -17.6931, + "dH_mos_rows": -0.54, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -17.693, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/sky130/sW2_sL1/independent/C08_sky130_sW2_sL1_independent.gds", + "gds_mode": "runs/grid/C08/sky130/sW2_sL1/gate_only/C08_sky130_sW2_sL1_gate_only.gds", + "geometry_hash_ref": "6aa28ad7cec65587", + "geometry_hash_mode": "37d0c263b2e5edfd", + "geometry_identical": false + }, + { + "case": "C08_sky130_sW2_sL1", + "topology": "C08", + "pdk": "sky130", + "size": "sW2_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 450.846, + "A1": 433.153, + "rel": -0.03924, + "class": "positive", + "W0": 32.765, + "H0": 13.76, + "W1": 32.765, + "H1": 13.22, + "dW": 0.0, + "dH": -0.54, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -17.6931, + "dH_mos_rows": -0.54, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -17.693, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/sky130/sW2_sL1/independent/C08_sky130_sW2_sL1_independent.gds", + "gds_mode": "runs/grid/C08/sky130/sW2_sL1/combined/C08_sky130_sW2_sL1_combined.gds", + "geometry_hash_ref": "6aa28ad7cec65587", + "geometry_hash_mode": "916677ae456ed1f7", + "geometry_identical": false + }, + { + "case": "C08_sky130_sW2_sL2", + "topology": "C08", + "pdk": "sky130", + "size": "sW2_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 648.99, + "A1": 641.285, + "rel": -0.01187, + "class": "positive", + "W0": 47.165, + "H0": 13.76, + "W1": 46.605, + "H1": 13.76, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 7.7056, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56, + "p": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -7.706, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/sky130/sW2_sL2/independent/C08_sky130_sW2_sL2_independent.gds", + "gds_mode": "runs/grid/C08/sky130/sW2_sL2/diffusion_only/C08_sky130_sW2_sL2_diffusion_only.gds", + "geometry_hash_ref": "b0df40ea59648291", + "geometry_hash_mode": "03d6db1a0d5dfe67", + "geometry_identical": false + }, + { + "case": "C08_sky130_sW2_sL2", + "topology": "C08", + "pdk": "sky130", + "size": "sW2_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 648.99, + "A1": 623.521, + "rel": -0.03924, + "class": "positive", + "W0": 47.165, + "H0": 13.76, + "W1": 47.165, + "H1": 13.22, + "dW": 0.0, + "dH": -0.54, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -25.4691, + "dH_mos_rows": -0.54, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -25.469, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/sky130/sW2_sL2/independent/C08_sky130_sW2_sL2_independent.gds", + "gds_mode": "runs/grid/C08/sky130/sW2_sL2/gate_only/C08_sky130_sW2_sL2_gate_only.gds", + "geometry_hash_ref": "b0df40ea59648291", + "geometry_hash_mode": "4d0271f9cf16908e", + "geometry_identical": false + }, + { + "case": "C08_sky130_sW2_sL2", + "topology": "C08", + "pdk": "sky130", + "size": "sW2_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 648.99, + "A1": 623.521, + "rel": -0.03924, + "class": "positive", + "W0": 47.165, + "H0": 13.76, + "W1": 47.165, + "H1": 13.22, + "dW": 0.0, + "dH": -0.54, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -25.4691, + "dH_mos_rows": -0.54, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -25.469, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C08/sky130/sW2_sL2/independent/C08_sky130_sW2_sL2_independent.gds", + "gds_mode": "runs/grid/C08/sky130/sW2_sL2/combined/C08_sky130_sW2_sL2_combined.gds", + "geometry_hash_ref": "b0df40ea59648291", + "geometry_hash_mode": "e6f5d83f95bea290", + "geometry_identical": false + }, + { + "case": "C09_gf180_sW1.5_sL1.5", + "topology": "C09", + "pdk": "gf180", + "size": "sW1.5_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1665.611, + "A1": 1647.835, + "rel": -0.01067, + "class": "positive", + "W0": 74.96, + "H0": 22.22, + "W1": 74.16, + "H1": 22.22, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 17.776, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8, + "p": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -17.776, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C09/gf180/sW1.5_sL1.5/independent/C09_gf180_sW1p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C09/gf180/sW1.5_sL1.5/diffusion_only/C09_gf180_sW1p5_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "b00e813f15f7fb3e", + "geometry_hash_mode": "c24f5b0de86577b7", + "geometry_identical": false + }, + { + "case": "C09_gf180_sW1.5_sL1.5", + "topology": "C09", + "pdk": "gf180", + "size": "sW1.5_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1665.611, + "A1": 1665.611, + "rel": 0.0, + "class": "neutral", + "W0": 74.96, + "H0": 22.22, + "W1": 74.96, + "H1": 22.22, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C09/gf180/sW1.5_sL1.5/independent/C09_gf180_sW1p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C09/gf180/sW1.5_sL1.5/gate_only/C09_gf180_sW1p5_sL1p5_gate_only.gds", + "geometry_hash_ref": "b00e813f15f7fb3e", + "geometry_hash_mode": "b44078de8a143db1", + "geometry_identical": false + }, + { + "case": "C09_gf180_sW1.5_sL1.5", + "topology": "C09", + "pdk": "gf180", + "size": "sW1.5_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1665.611, + "A1": 1647.835, + "rel": -0.01067, + "class": "positive", + "W0": 74.96, + "H0": 22.22, + "W1": 74.16, + "H1": 22.22, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 17.776, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8, + "p": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -17.776, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C09/gf180/sW1.5_sL1.5/independent/C09_gf180_sW1p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C09/gf180/sW1.5_sL1.5/combined/C09_gf180_sW1p5_sL1p5_combined.gds", + "geometry_hash_ref": "b00e813f15f7fb3e", + "geometry_hash_mode": "c5beb0d694956c76", + "geometry_identical": false + }, + { + "case": "C09_gf180_sW1.5_sL1", + "topology": "C09", + "pdk": "gf180", + "size": "sW1.5_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1366.974, + "A1": 1349.198, + "rel": -0.013, + "class": "positive", + "W0": 61.52, + "H0": 22.22, + "W1": 60.72, + "H1": 22.22, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 17.776, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8, + "p": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -17.776, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C09/gf180/sW1.5_sL1/independent/C09_gf180_sW1p5_sL1_independent.gds", + "gds_mode": "runs/grid/C09/gf180/sW1.5_sL1/diffusion_only/C09_gf180_sW1p5_sL1_diffusion_only.gds", + "geometry_hash_ref": "e59b8e7e1ea54ec1", + "geometry_hash_mode": "e9a44b36a07daa49", + "geometry_identical": false + }, + { + "case": "C09_gf180_sW1.5_sL1", + "topology": "C09", + "pdk": "gf180", + "size": "sW1.5_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1366.974, + "A1": 1366.974, + "rel": 0.0, + "class": "neutral", + "W0": 61.52, + "H0": 22.22, + "W1": 61.52, + "H1": 22.22, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C09/gf180/sW1.5_sL1/independent/C09_gf180_sW1p5_sL1_independent.gds", + "gds_mode": "runs/grid/C09/gf180/sW1.5_sL1/gate_only/C09_gf180_sW1p5_sL1_gate_only.gds", + "geometry_hash_ref": "e59b8e7e1ea54ec1", + "geometry_hash_mode": "034776b564a4b81e", + "geometry_identical": false + }, + { + "case": "C09_gf180_sW1.5_sL1", + "topology": "C09", + "pdk": "gf180", + "size": "sW1.5_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1366.974, + "A1": 1349.198, + "rel": -0.013, + "class": "positive", + "W0": 61.52, + "H0": 22.22, + "W1": 60.72, + "H1": 22.22, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 17.776, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8, + "p": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -17.776, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C09/gf180/sW1.5_sL1/independent/C09_gf180_sW1p5_sL1_independent.gds", + "gds_mode": "runs/grid/C09/gf180/sW1.5_sL1/combined/C09_gf180_sW1p5_sL1_combined.gds", + "geometry_hash_ref": "e59b8e7e1ea54ec1", + "geometry_hash_mode": "e948daf54b1d487a", + "geometry_identical": false + }, + { + "case": "C09_gf180_sW1.5_sL2", + "topology": "C09", + "pdk": "gf180", + "size": "sW1.5_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1964.248, + "A1": 1946.472, + "rel": -0.00905, + "class": "positive", + "W0": 88.4, + "H0": 22.22, + "W1": 87.6, + "H1": 22.22, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 17.776, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8, + "p": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -17.776, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C09/gf180/sW1.5_sL2/independent/C09_gf180_sW1p5_sL2_independent.gds", + "gds_mode": "runs/grid/C09/gf180/sW1.5_sL2/diffusion_only/C09_gf180_sW1p5_sL2_diffusion_only.gds", + "geometry_hash_ref": "f23bfa8fb9f88369", + "geometry_hash_mode": "f25802d7bce249a8", + "geometry_identical": false + }, + { + "case": "C09_gf180_sW1.5_sL2", + "topology": "C09", + "pdk": "gf180", + "size": "sW1.5_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1964.248, + "A1": 1964.248, + "rel": 0.0, + "class": "neutral", + "W0": 88.4, + "H0": 22.22, + "W1": 88.4, + "H1": 22.22, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C09/gf180/sW1.5_sL2/independent/C09_gf180_sW1p5_sL2_independent.gds", + "gds_mode": "runs/grid/C09/gf180/sW1.5_sL2/gate_only/C09_gf180_sW1p5_sL2_gate_only.gds", + "geometry_hash_ref": "f23bfa8fb9f88369", + "geometry_hash_mode": "1c38149e5a4cf3f8", + "geometry_identical": false + }, + { + "case": "C09_gf180_sW1.5_sL2", + "topology": "C09", + "pdk": "gf180", + "size": "sW1.5_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1964.248, + "A1": 1946.472, + "rel": -0.00905, + "class": "positive", + "W0": 88.4, + "H0": 22.22, + "W1": 87.6, + "H1": 22.22, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 17.776, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8, + "p": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -17.776, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C09/gf180/sW1.5_sL2/independent/C09_gf180_sW1p5_sL2_independent.gds", + "gds_mode": "runs/grid/C09/gf180/sW1.5_sL2/combined/C09_gf180_sW1p5_sL2_combined.gds", + "geometry_hash_ref": "f23bfa8fb9f88369", + "geometry_hash_mode": "36f2ee1064573530", + "geometry_identical": false + }, + { + "case": "C09_gf180_sW1_sL1.5", + "topology": "C09", + "pdk": "gf180", + "size": "sW1_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1167.883, + "A1": 1150.107, + "rel": -0.01522, + "class": "positive", + "W0": 52.56, + "H0": 22.22, + "W1": 51.76, + "H1": 22.22, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 17.776, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8, + "p": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -17.776, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C09/gf180/sW1_sL1.5/independent/C09_gf180_sW1_sL1p5_independent.gds", + "gds_mode": "runs/grid/C09/gf180/sW1_sL1.5/diffusion_only/C09_gf180_sW1_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "98acb67563f1b133", + "geometry_hash_mode": "2da858c1169ea307", + "geometry_identical": false + }, + { + "case": "C09_gf180_sW1_sL1.5", + "topology": "C09", + "pdk": "gf180", + "size": "sW1_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1167.883, + "A1": 1167.883, + "rel": 0.0, + "class": "neutral", + "W0": 52.56, + "H0": 22.22, + "W1": 52.56, + "H1": 22.22, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C09/gf180/sW1_sL1.5/independent/C09_gf180_sW1_sL1p5_independent.gds", + "gds_mode": "runs/grid/C09/gf180/sW1_sL1.5/gate_only/C09_gf180_sW1_sL1p5_gate_only.gds", + "geometry_hash_ref": "98acb67563f1b133", + "geometry_hash_mode": "bac939476d66f451", + "geometry_identical": false + }, + { + "case": "C09_gf180_sW1_sL1.5", + "topology": "C09", + "pdk": "gf180", + "size": "sW1_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1167.883, + "A1": 1150.107, + "rel": -0.01522, + "class": "positive", + "W0": 52.56, + "H0": 22.22, + "W1": 51.76, + "H1": 22.22, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 17.776, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8, + "p": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -17.776, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C09/gf180/sW1_sL1.5/independent/C09_gf180_sW1_sL1p5_independent.gds", + "gds_mode": "runs/grid/C09/gf180/sW1_sL1.5/combined/C09_gf180_sW1_sL1p5_combined.gds", + "geometry_hash_ref": "98acb67563f1b133", + "geometry_hash_mode": "fff500d1721c5c71", + "geometry_identical": false + }, + { + "case": "C09_gf180_sW1_sL1", + "topology": "C09", + "pdk": "gf180", + "size": "sW1_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 968.792, + "A1": 951.016, + "rel": -0.01835, + "class": "positive", + "W0": 43.6, + "H0": 22.22, + "W1": 42.8, + "H1": 22.22, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 17.776, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8, + "p": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -17.776, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C09/gf180/sW1_sL1/independent/C09_gf180_sW1_sL1_independent.gds", + "gds_mode": "runs/grid/C09/gf180/sW1_sL1/diffusion_only/C09_gf180_sW1_sL1_diffusion_only.gds", + "geometry_hash_ref": "ef2adf2a7e3eb073", + "geometry_hash_mode": "d4180d3ea65617a5", + "geometry_identical": false + }, + { + "case": "C09_gf180_sW1_sL1", + "topology": "C09", + "pdk": "gf180", + "size": "sW1_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 968.792, + "A1": 968.792, + "rel": 0.0, + "class": "neutral", + "W0": 43.6, + "H0": 22.22, + "W1": 43.6, + "H1": 22.22, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C09/gf180/sW1_sL1/independent/C09_gf180_sW1_sL1_independent.gds", + "gds_mode": "runs/grid/C09/gf180/sW1_sL1/gate_only/C09_gf180_sW1_sL1_gate_only.gds", + "geometry_hash_ref": "ef2adf2a7e3eb073", + "geometry_hash_mode": "165e81b5ac52b963", + "geometry_identical": false + }, + { + "case": "C09_gf180_sW1_sL1", + "topology": "C09", + "pdk": "gf180", + "size": "sW1_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 968.792, + "A1": 951.016, + "rel": -0.01835, + "class": "positive", + "W0": 43.6, + "H0": 22.22, + "W1": 42.8, + "H1": 22.22, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 17.776, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8, + "p": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -17.776, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C09/gf180/sW1_sL1/independent/C09_gf180_sW1_sL1_independent.gds", + "gds_mode": "runs/grid/C09/gf180/sW1_sL1/combined/C09_gf180_sW1_sL1_combined.gds", + "geometry_hash_ref": "ef2adf2a7e3eb073", + "geometry_hash_mode": "277cb534b8acb653", + "geometry_identical": false + }, + { + "case": "C09_gf180_sW2_sL1.5", + "topology": "C09", + "pdk": "gf180", + "size": "sW2_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2163.339, + "A1": 2145.563, + "rel": -0.00822, + "class": "positive", + "W0": 97.36, + "H0": 22.22, + "W1": 96.56, + "H1": 22.22, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 17.776, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8, + "p": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -17.776, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C09/gf180/sW2_sL1.5/independent/C09_gf180_sW2_sL1p5_independent.gds", + "gds_mode": "runs/grid/C09/gf180/sW2_sL1.5/diffusion_only/C09_gf180_sW2_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "1a8244b7d2a64b37", + "geometry_hash_mode": "141b02e9c0fb85fc", + "geometry_identical": false + }, + { + "case": "C09_gf180_sW2_sL1.5", + "topology": "C09", + "pdk": "gf180", + "size": "sW2_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2163.339, + "A1": 2163.339, + "rel": 0.0, + "class": "neutral", + "W0": 97.36, + "H0": 22.22, + "W1": 97.36, + "H1": 22.22, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C09/gf180/sW2_sL1.5/independent/C09_gf180_sW2_sL1p5_independent.gds", + "gds_mode": "runs/grid/C09/gf180/sW2_sL1.5/gate_only/C09_gf180_sW2_sL1p5_gate_only.gds", + "geometry_hash_ref": "1a8244b7d2a64b37", + "geometry_hash_mode": "6cd738e94c0c3209", + "geometry_identical": false + }, + { + "case": "C09_gf180_sW2_sL1.5", + "topology": "C09", + "pdk": "gf180", + "size": "sW2_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2163.339, + "A1": 2145.563, + "rel": -0.00822, + "class": "positive", + "W0": 97.36, + "H0": 22.22, + "W1": 96.56, + "H1": 22.22, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 17.776, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8, + "p": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -17.776, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C09/gf180/sW2_sL1.5/independent/C09_gf180_sW2_sL1p5_independent.gds", + "gds_mode": "runs/grid/C09/gf180/sW2_sL1.5/combined/C09_gf180_sW2_sL1p5_combined.gds", + "geometry_hash_ref": "1a8244b7d2a64b37", + "geometry_hash_mode": "5149c17346a23ffb", + "geometry_identical": false + }, + { + "case": "C09_gf180_sW2_sL1", + "topology": "C09", + "pdk": "gf180", + "size": "sW2_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1765.157, + "A1": 1747.381, + "rel": -0.01007, + "class": "positive", + "W0": 79.44, + "H0": 22.22, + "W1": 78.64, + "H1": 22.22, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 17.776, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8, + "p": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -17.776, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C09/gf180/sW2_sL1/independent/C09_gf180_sW2_sL1_independent.gds", + "gds_mode": "runs/grid/C09/gf180/sW2_sL1/diffusion_only/C09_gf180_sW2_sL1_diffusion_only.gds", + "geometry_hash_ref": "ea598627c830bd23", + "geometry_hash_mode": "268ca3398651482c", + "geometry_identical": false + }, + { + "case": "C09_gf180_sW2_sL1", + "topology": "C09", + "pdk": "gf180", + "size": "sW2_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1765.157, + "A1": 1765.157, + "rel": 0.0, + "class": "neutral", + "W0": 79.44, + "H0": 22.22, + "W1": 79.44, + "H1": 22.22, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C09/gf180/sW2_sL1/independent/C09_gf180_sW2_sL1_independent.gds", + "gds_mode": "runs/grid/C09/gf180/sW2_sL1/gate_only/C09_gf180_sW2_sL1_gate_only.gds", + "geometry_hash_ref": "ea598627c830bd23", + "geometry_hash_mode": "eaa7d21bb30b46e3", + "geometry_identical": false + }, + { + "case": "C09_gf180_sW2_sL1", + "topology": "C09", + "pdk": "gf180", + "size": "sW2_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1765.157, + "A1": 1747.381, + "rel": -0.01007, + "class": "positive", + "W0": 79.44, + "H0": 22.22, + "W1": 78.64, + "H1": 22.22, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 17.776, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8, + "p": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -17.776, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C09/gf180/sW2_sL1/independent/C09_gf180_sW2_sL1_independent.gds", + "gds_mode": "runs/grid/C09/gf180/sW2_sL1/combined/C09_gf180_sW2_sL1_combined.gds", + "geometry_hash_ref": "ea598627c830bd23", + "geometry_hash_mode": "d622ef650eb0a066", + "geometry_identical": false + }, + { + "case": "C09_gf180_sW2_sL2", + "topology": "C09", + "pdk": "gf180", + "size": "sW2_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2561.522, + "A1": 2543.746, + "rel": -0.00694, + "class": "positive", + "W0": 115.28, + "H0": 22.22, + "W1": 114.48, + "H1": 22.22, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 17.776, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8, + "p": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -17.776, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C09/gf180/sW2_sL2/independent/C09_gf180_sW2_sL2_independent.gds", + "gds_mode": "runs/grid/C09/gf180/sW2_sL2/diffusion_only/C09_gf180_sW2_sL2_diffusion_only.gds", + "geometry_hash_ref": "8df520a4519bd447", + "geometry_hash_mode": "02f6e86d107e5cff", + "geometry_identical": false + }, + { + "case": "C09_gf180_sW2_sL2", + "topology": "C09", + "pdk": "gf180", + "size": "sW2_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2561.522, + "A1": 2561.522, + "rel": 0.0, + "class": "neutral", + "W0": 115.28, + "H0": 22.22, + "W1": 115.28, + "H1": 22.22, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C09/gf180/sW2_sL2/independent/C09_gf180_sW2_sL2_independent.gds", + "gds_mode": "runs/grid/C09/gf180/sW2_sL2/gate_only/C09_gf180_sW2_sL2_gate_only.gds", + "geometry_hash_ref": "8df520a4519bd447", + "geometry_hash_mode": "c40802232a5385ea", + "geometry_identical": false + }, + { + "case": "C09_gf180_sW2_sL2", + "topology": "C09", + "pdk": "gf180", + "size": "sW2_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2561.522, + "A1": 2543.746, + "rel": -0.00694, + "class": "positive", + "W0": 115.28, + "H0": 22.22, + "W1": 114.48, + "H1": 22.22, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 17.776, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8, + "p": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -17.776, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C09/gf180/sW2_sL2/independent/C09_gf180_sW2_sL2_independent.gds", + "gds_mode": "runs/grid/C09/gf180/sW2_sL2/combined/C09_gf180_sW2_sL2_combined.gds", + "geometry_hash_ref": "8df520a4519bd447", + "geometry_hash_mode": "312d81cefc4aada2", + "geometry_identical": false + }, + { + "case": "C09_ihp130_sW0.5_sL1.5", + "topology": "C09", + "pdk": "ihp130", + "size": "sW0.5_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 890.906, + "A1": 882.619, + "rel": -0.0093, + "class": "positive", + "W0": 54.825, + "H0": 16.25, + "W1": 54.315, + "H1": 16.25, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 8.2875, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51, + "p": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -8.287, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C09/ihp130/sW0.5_sL1.5/independent/C09_ihp130_sW0p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C09/ihp130/sW0.5_sL1.5/diffusion_only/C09_ihp130_sW0p5_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "0409de2650b1fa6c", + "geometry_hash_mode": "5e25f81f0b4fb1a3", + "geometry_identical": false + }, + { + "case": "C09_ihp130_sW0.5_sL1.5", + "topology": "C09", + "pdk": "ihp130", + "size": "sW0.5_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 890.906, + "A1": 890.906, + "rel": 0.0, + "class": "neutral", + "W0": 54.825, + "H0": 16.25, + "W1": 54.825, + "H1": 16.25, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C09/ihp130/sW0.5_sL1.5/independent/C09_ihp130_sW0p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C09/ihp130/sW0.5_sL1.5/gate_only/C09_ihp130_sW0p5_sL1p5_gate_only.gds", + "geometry_hash_ref": "0409de2650b1fa6c", + "geometry_hash_mode": "57f7125ec5b1be73", + "geometry_identical": false + }, + { + "case": "C09_ihp130_sW0.5_sL1.5", + "topology": "C09", + "pdk": "ihp130", + "size": "sW0.5_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 890.906, + "A1": 882.619, + "rel": -0.0093, + "class": "positive", + "W0": 54.825, + "H0": 16.25, + "W1": 54.315, + "H1": 16.25, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 8.2875, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51, + "p": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -8.287, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C09/ihp130/sW0.5_sL1.5/independent/C09_ihp130_sW0p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C09/ihp130/sW0.5_sL1.5/combined/C09_ihp130_sW0p5_sL1p5_combined.gds", + "geometry_hash_ref": "0409de2650b1fa6c", + "geometry_hash_mode": "73c40ba606a98cda", + "geometry_identical": false + }, + { + "case": "C09_ihp130_sW0.5_sL1", + "topology": "C09", + "pdk": "ihp130", + "size": "sW0.5_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 755.706, + "A1": 747.419, + "rel": -0.01097, + "class": "positive", + "W0": 46.505, + "H0": 16.25, + "W1": 45.995, + "H1": 16.25, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 8.2875, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51, + "p": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -8.287, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C09/ihp130/sW0.5_sL1/independent/C09_ihp130_sW0p5_sL1_independent.gds", + "gds_mode": "runs/grid/C09/ihp130/sW0.5_sL1/diffusion_only/C09_ihp130_sW0p5_sL1_diffusion_only.gds", + "geometry_hash_ref": "7c26b7269b261f2c", + "geometry_hash_mode": "1aca43747dc590a9", + "geometry_identical": false + }, + { + "case": "C09_ihp130_sW0.5_sL1", + "topology": "C09", + "pdk": "ihp130", + "size": "sW0.5_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 755.706, + "A1": 755.706, + "rel": 0.0, + "class": "neutral", + "W0": 46.505, + "H0": 16.25, + "W1": 46.505, + "H1": 16.25, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C09/ihp130/sW0.5_sL1/independent/C09_ihp130_sW0p5_sL1_independent.gds", + "gds_mode": "runs/grid/C09/ihp130/sW0.5_sL1/gate_only/C09_ihp130_sW0p5_sL1_gate_only.gds", + "geometry_hash_ref": "7c26b7269b261f2c", + "geometry_hash_mode": "700a41e48cb3abfb", + "geometry_identical": false + }, + { + "case": "C09_ihp130_sW0.5_sL1", + "topology": "C09", + "pdk": "ihp130", + "size": "sW0.5_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 755.706, + "A1": 747.419, + "rel": -0.01097, + "class": "positive", + "W0": 46.505, + "H0": 16.25, + "W1": 45.995, + "H1": 16.25, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 8.2875, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51, + "p": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -8.287, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C09/ihp130/sW0.5_sL1/independent/C09_ihp130_sW0p5_sL1_independent.gds", + "gds_mode": "runs/grid/C09/ihp130/sW0.5_sL1/combined/C09_ihp130_sW0p5_sL1_combined.gds", + "geometry_hash_ref": "7c26b7269b261f2c", + "geometry_hash_mode": "9ce54f9df9a3b3bb", + "geometry_identical": false + }, + { + "case": "C09_ihp130_sW0.5_sL2", + "topology": "C09", + "pdk": "ihp130", + "size": "sW0.5_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1026.106, + "A1": 1017.819, + "rel": -0.00808, + "class": "positive", + "W0": 63.145, + "H0": 16.25, + "W1": 62.635, + "H1": 16.25, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 8.2875, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51, + "p": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -8.287, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C09/ihp130/sW0.5_sL2/independent/C09_ihp130_sW0p5_sL2_independent.gds", + "gds_mode": "runs/grid/C09/ihp130/sW0.5_sL2/diffusion_only/C09_ihp130_sW0p5_sL2_diffusion_only.gds", + "geometry_hash_ref": "9610b2b0d5b8a765", + "geometry_hash_mode": "ea5713a3cae9ade0", + "geometry_identical": false + }, + { + "case": "C09_ihp130_sW0.5_sL2", + "topology": "C09", + "pdk": "ihp130", + "size": "sW0.5_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1026.106, + "A1": 1026.106, + "rel": 0.0, + "class": "neutral", + "W0": 63.145, + "H0": 16.25, + "W1": 63.145, + "H1": 16.25, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C09/ihp130/sW0.5_sL2/independent/C09_ihp130_sW0p5_sL2_independent.gds", + "gds_mode": "runs/grid/C09/ihp130/sW0.5_sL2/gate_only/C09_ihp130_sW0p5_sL2_gate_only.gds", + "geometry_hash_ref": "9610b2b0d5b8a765", + "geometry_hash_mode": "e445d9ef9707da0a", + "geometry_identical": false + }, + { + "case": "C09_ihp130_sW0.5_sL2", + "topology": "C09", + "pdk": "ihp130", + "size": "sW0.5_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1026.106, + "A1": 1017.819, + "rel": -0.00808, + "class": "positive", + "W0": 63.145, + "H0": 16.25, + "W1": 62.635, + "H1": 16.25, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 8.2875, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51, + "p": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -8.287, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C09/ihp130/sW0.5_sL2/independent/C09_ihp130_sW0p5_sL2_independent.gds", + "gds_mode": "runs/grid/C09/ihp130/sW0.5_sL2/combined/C09_ihp130_sW0p5_sL2_combined.gds", + "geometry_hash_ref": "9610b2b0d5b8a765", + "geometry_hash_mode": "026cdf0fb418e52f", + "geometry_identical": false + }, + { + "case": "C09_ihp130_sW1.5_sL1.5", + "topology": "C09", + "pdk": "ihp130", + "size": "sW1.5_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2492.506, + "A1": 2484.219, + "rel": -0.00332, + "class": "neutral", + "W0": 153.385, + "H0": 16.25, + "W1": 152.875, + "H1": 16.25, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 8.2875, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51, + "p": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -8.287, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C09/ihp130/sW1.5_sL1.5/independent/C09_ihp130_sW1p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C09/ihp130/sW1.5_sL1.5/diffusion_only/C09_ihp130_sW1p5_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "497c909a34c3f082", + "geometry_hash_mode": "40c3b093b964d2e7", + "geometry_identical": false + }, + { + "case": "C09_ihp130_sW1.5_sL1.5", + "topology": "C09", + "pdk": "ihp130", + "size": "sW1.5_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2492.506, + "A1": 2492.506, + "rel": 0.0, + "class": "neutral", + "W0": 153.385, + "H0": 16.25, + "W1": 153.385, + "H1": 16.25, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C09/ihp130/sW1.5_sL1.5/independent/C09_ihp130_sW1p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C09/ihp130/sW1.5_sL1.5/gate_only/C09_ihp130_sW1p5_sL1p5_gate_only.gds", + "geometry_hash_ref": "497c909a34c3f082", + "geometry_hash_mode": "f47435978b777724", + "geometry_identical": false + }, + { + "case": "C09_ihp130_sW1.5_sL1.5", + "topology": "C09", + "pdk": "ihp130", + "size": "sW1.5_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2492.506, + "A1": 2484.219, + "rel": -0.00332, + "class": "neutral", + "W0": 153.385, + "H0": 16.25, + "W1": 152.875, + "H1": 16.25, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 8.2875, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51, + "p": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -8.287, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C09/ihp130/sW1.5_sL1.5/independent/C09_ihp130_sW1p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C09/ihp130/sW1.5_sL1.5/combined/C09_ihp130_sW1p5_sL1p5_combined.gds", + "geometry_hash_ref": "497c909a34c3f082", + "geometry_hash_mode": "14f93c1cc61a7aa9", + "geometry_identical": false + }, + { + "case": "C09_ihp130_sW1.5_sL1", + "topology": "C09", + "pdk": "ihp130", + "size": "sW1.5_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2086.906, + "A1": 2078.619, + "rel": -0.00397, + "class": "neutral", + "W0": 128.425, + "H0": 16.25, + "W1": 127.915, + "H1": 16.25, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 8.2875, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51, + "p": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -8.287, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C09/ihp130/sW1.5_sL1/independent/C09_ihp130_sW1p5_sL1_independent.gds", + "gds_mode": "runs/grid/C09/ihp130/sW1.5_sL1/diffusion_only/C09_ihp130_sW1p5_sL1_diffusion_only.gds", + "geometry_hash_ref": "b1e1ed6b22bc617f", + "geometry_hash_mode": "572f287d7538e5f2", + "geometry_identical": false + }, + { + "case": "C09_ihp130_sW1.5_sL1", + "topology": "C09", + "pdk": "ihp130", + "size": "sW1.5_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2086.906, + "A1": 2086.906, + "rel": 0.0, + "class": "neutral", + "W0": 128.425, + "H0": 16.25, + "W1": 128.425, + "H1": 16.25, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C09/ihp130/sW1.5_sL1/independent/C09_ihp130_sW1p5_sL1_independent.gds", + "gds_mode": "runs/grid/C09/ihp130/sW1.5_sL1/gate_only/C09_ihp130_sW1p5_sL1_gate_only.gds", + "geometry_hash_ref": "b1e1ed6b22bc617f", + "geometry_hash_mode": "974c2d1b3037c33d", + "geometry_identical": false + }, + { + "case": "C09_ihp130_sW1.5_sL1", + "topology": "C09", + "pdk": "ihp130", + "size": "sW1.5_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2086.906, + "A1": 2078.619, + "rel": -0.00397, + "class": "neutral", + "W0": 128.425, + "H0": 16.25, + "W1": 127.915, + "H1": 16.25, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 8.2875, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51, + "p": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -8.287, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C09/ihp130/sW1.5_sL1/independent/C09_ihp130_sW1p5_sL1_independent.gds", + "gds_mode": "runs/grid/C09/ihp130/sW1.5_sL1/combined/C09_ihp130_sW1p5_sL1_combined.gds", + "geometry_hash_ref": "b1e1ed6b22bc617f", + "geometry_hash_mode": "ce733730332232f1", + "geometry_identical": false + }, + { + "case": "C09_ihp130_sW1.5_sL2", + "topology": "C09", + "pdk": "ihp130", + "size": "sW1.5_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2898.106, + "A1": 2889.819, + "rel": -0.00286, + "class": "neutral", + "W0": 178.345, + "H0": 16.25, + "W1": 177.835, + "H1": 16.25, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 8.2875, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51, + "p": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -8.287, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C09/ihp130/sW1.5_sL2/independent/C09_ihp130_sW1p5_sL2_independent.gds", + "gds_mode": "runs/grid/C09/ihp130/sW1.5_sL2/diffusion_only/C09_ihp130_sW1p5_sL2_diffusion_only.gds", + "geometry_hash_ref": "bc1bb407ef27b253", + "geometry_hash_mode": "5c74a84d5389dce8", + "geometry_identical": false + }, + { + "case": "C09_ihp130_sW1.5_sL2", + "topology": "C09", + "pdk": "ihp130", + "size": "sW1.5_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2898.106, + "A1": 2898.106, + "rel": 0.0, + "class": "neutral", + "W0": 178.345, + "H0": 16.25, + "W1": 178.345, + "H1": 16.25, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C09/ihp130/sW1.5_sL2/independent/C09_ihp130_sW1p5_sL2_independent.gds", + "gds_mode": "runs/grid/C09/ihp130/sW1.5_sL2/gate_only/C09_ihp130_sW1p5_sL2_gate_only.gds", + "geometry_hash_ref": "bc1bb407ef27b253", + "geometry_hash_mode": "ef7b0d7263d8f560", + "geometry_identical": false + }, + { + "case": "C09_ihp130_sW1.5_sL2", + "topology": "C09", + "pdk": "ihp130", + "size": "sW1.5_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2898.106, + "A1": 2889.819, + "rel": -0.00286, + "class": "neutral", + "W0": 178.345, + "H0": 16.25, + "W1": 177.835, + "H1": 16.25, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 8.2875, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51, + "p": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -8.287, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C09/ihp130/sW1.5_sL2/independent/C09_ihp130_sW1p5_sL2_independent.gds", + "gds_mode": "runs/grid/C09/ihp130/sW1.5_sL2/combined/C09_ihp130_sW1p5_sL2_combined.gds", + "geometry_hash_ref": "bc1bb407ef27b253", + "geometry_hash_mode": "779bcbc4c3944aa0", + "geometry_identical": false + }, + { + "case": "C09_ihp130_sW1_sL1.5", + "topology": "C09", + "pdk": "ihp130", + "size": "sW1_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1691.706, + "A1": 1683.419, + "rel": -0.0049, + "class": "neutral", + "W0": 104.105, + "H0": 16.25, + "W1": 103.595, + "H1": 16.25, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 8.2875, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51, + "p": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -8.287, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C09/ihp130/sW1_sL1.5/independent/C09_ihp130_sW1_sL1p5_independent.gds", + "gds_mode": "runs/grid/C09/ihp130/sW1_sL1.5/diffusion_only/C09_ihp130_sW1_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "fb44f68cf1663906", + "geometry_hash_mode": "a77d4322f9899eba", + "geometry_identical": false + }, + { + "case": "C09_ihp130_sW1_sL1.5", + "topology": "C09", + "pdk": "ihp130", + "size": "sW1_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1691.706, + "A1": 1691.706, + "rel": 0.0, + "class": "neutral", + "W0": 104.105, + "H0": 16.25, + "W1": 104.105, + "H1": 16.25, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C09/ihp130/sW1_sL1.5/independent/C09_ihp130_sW1_sL1p5_independent.gds", + "gds_mode": "runs/grid/C09/ihp130/sW1_sL1.5/gate_only/C09_ihp130_sW1_sL1p5_gate_only.gds", + "geometry_hash_ref": "fb44f68cf1663906", + "geometry_hash_mode": "6d569e655a3d541e", + "geometry_identical": false + }, + { + "case": "C09_ihp130_sW1_sL1.5", + "topology": "C09", + "pdk": "ihp130", + "size": "sW1_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1691.706, + "A1": 1683.419, + "rel": -0.0049, + "class": "neutral", + "W0": 104.105, + "H0": 16.25, + "W1": 103.595, + "H1": 16.25, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 8.2875, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51, + "p": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -8.287, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C09/ihp130/sW1_sL1.5/independent/C09_ihp130_sW1_sL1p5_independent.gds", + "gds_mode": "runs/grid/C09/ihp130/sW1_sL1.5/combined/C09_ihp130_sW1_sL1p5_combined.gds", + "geometry_hash_ref": "fb44f68cf1663906", + "geometry_hash_mode": "6aeff3249266cb43", + "geometry_identical": false + }, + { + "case": "C09_ihp130_sW1_sL1", + "topology": "C09", + "pdk": "ihp130", + "size": "sW1_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1421.306, + "A1": 1413.019, + "rel": -0.00583, + "class": "positive", + "W0": 87.465, + "H0": 16.25, + "W1": 86.955, + "H1": 16.25, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 8.2875, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51, + "p": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -8.287, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C09/ihp130/sW1_sL1/independent/C09_ihp130_sW1_sL1_independent.gds", + "gds_mode": "runs/grid/C09/ihp130/sW1_sL1/diffusion_only/C09_ihp130_sW1_sL1_diffusion_only.gds", + "geometry_hash_ref": "141ee9dbb44a536d", + "geometry_hash_mode": "4e8b772b96006976", + "geometry_identical": false + }, + { + "case": "C09_ihp130_sW1_sL1", + "topology": "C09", + "pdk": "ihp130", + "size": "sW1_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1421.306, + "A1": 1421.306, + "rel": 0.0, + "class": "neutral", + "W0": 87.465, + "H0": 16.25, + "W1": 87.465, + "H1": 16.25, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C09/ihp130/sW1_sL1/independent/C09_ihp130_sW1_sL1_independent.gds", + "gds_mode": "runs/grid/C09/ihp130/sW1_sL1/gate_only/C09_ihp130_sW1_sL1_gate_only.gds", + "geometry_hash_ref": "141ee9dbb44a536d", + "geometry_hash_mode": "24a1fc31fb1e71b0", + "geometry_identical": false + }, + { + "case": "C09_ihp130_sW1_sL1", + "topology": "C09", + "pdk": "ihp130", + "size": "sW1_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1421.306, + "A1": 1413.019, + "rel": -0.00583, + "class": "positive", + "W0": 87.465, + "H0": 16.25, + "W1": 86.955, + "H1": 16.25, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 8.2875, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51, + "p": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -8.287, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C09/ihp130/sW1_sL1/independent/C09_ihp130_sW1_sL1_independent.gds", + "gds_mode": "runs/grid/C09/ihp130/sW1_sL1/combined/C09_ihp130_sW1_sL1_combined.gds", + "geometry_hash_ref": "141ee9dbb44a536d", + "geometry_hash_mode": "62286a66ccf12337", + "geometry_identical": false + }, + { + "case": "C09_ihp130_sW1_sL2", + "topology": "C09", + "pdk": "ihp130", + "size": "sW1_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1962.106, + "A1": 1953.819, + "rel": -0.00422, + "class": "neutral", + "W0": 120.745, + "H0": 16.25, + "W1": 120.235, + "H1": 16.25, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 8.2875, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51, + "p": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -8.287, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C09/ihp130/sW1_sL2/independent/C09_ihp130_sW1_sL2_independent.gds", + "gds_mode": "runs/grid/C09/ihp130/sW1_sL2/diffusion_only/C09_ihp130_sW1_sL2_diffusion_only.gds", + "geometry_hash_ref": "4912aac2f8ca0b0b", + "geometry_hash_mode": "d4a389dac148f832", + "geometry_identical": false + }, + { + "case": "C09_ihp130_sW1_sL2", + "topology": "C09", + "pdk": "ihp130", + "size": "sW1_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1962.106, + "A1": 1962.106, + "rel": 0.0, + "class": "neutral", + "W0": 120.745, + "H0": 16.25, + "W1": 120.745, + "H1": 16.25, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C09/ihp130/sW1_sL2/independent/C09_ihp130_sW1_sL2_independent.gds", + "gds_mode": "runs/grid/C09/ihp130/sW1_sL2/gate_only/C09_ihp130_sW1_sL2_gate_only.gds", + "geometry_hash_ref": "4912aac2f8ca0b0b", + "geometry_hash_mode": "1a62ecce2e9bab4f", + "geometry_identical": false + }, + { + "case": "C09_ihp130_sW1_sL2", + "topology": "C09", + "pdk": "ihp130", + "size": "sW1_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1962.106, + "A1": 1953.819, + "rel": -0.00422, + "class": "neutral", + "W0": 120.745, + "H0": 16.25, + "W1": 120.235, + "H1": 16.25, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 8.2875, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51, + "p": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -8.287, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C09/ihp130/sW1_sL2/independent/C09_ihp130_sW1_sL2_independent.gds", + "gds_mode": "runs/grid/C09/ihp130/sW1_sL2/combined/C09_ihp130_sW1_sL2_combined.gds", + "geometry_hash_ref": "4912aac2f8ca0b0b", + "geometry_hash_mode": "8bf51b2c423a2c33", + "geometry_identical": false + }, + { + "case": "C09_ihp130_sW2_sL1.5", + "topology": "C09", + "pdk": "ihp130", + "size": "sW2_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 3293.306, + "A1": 3285.019, + "rel": -0.00252, + "class": "neutral", + "W0": 202.665, + "H0": 16.25, + "W1": 202.155, + "H1": 16.25, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 8.2875, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51, + "p": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -8.287, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C09/ihp130/sW2_sL1.5/independent/C09_ihp130_sW2_sL1p5_independent.gds", + "gds_mode": "runs/grid/C09/ihp130/sW2_sL1.5/diffusion_only/C09_ihp130_sW2_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "2498e04792f3f413", + "geometry_hash_mode": "965ee6e9536a9649", + "geometry_identical": false + }, + { + "case": "C09_ihp130_sW2_sL1.5", + "topology": "C09", + "pdk": "ihp130", + "size": "sW2_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 3293.306, + "A1": 3293.306, + "rel": 0.0, + "class": "neutral", + "W0": 202.665, + "H0": 16.25, + "W1": 202.665, + "H1": 16.25, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C09/ihp130/sW2_sL1.5/independent/C09_ihp130_sW2_sL1p5_independent.gds", + "gds_mode": "runs/grid/C09/ihp130/sW2_sL1.5/gate_only/C09_ihp130_sW2_sL1p5_gate_only.gds", + "geometry_hash_ref": "2498e04792f3f413", + "geometry_hash_mode": "b371aab9dd8627ec", + "geometry_identical": false + }, + { + "case": "C09_ihp130_sW2_sL1.5", + "topology": "C09", + "pdk": "ihp130", + "size": "sW2_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 3293.306, + "A1": 3285.019, + "rel": -0.00252, + "class": "neutral", + "W0": 202.665, + "H0": 16.25, + "W1": 202.155, + "H1": 16.25, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 8.2875, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51, + "p": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -8.287, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C09/ihp130/sW2_sL1.5/independent/C09_ihp130_sW2_sL1p5_independent.gds", + "gds_mode": "runs/grid/C09/ihp130/sW2_sL1.5/combined/C09_ihp130_sW2_sL1p5_combined.gds", + "geometry_hash_ref": "2498e04792f3f413", + "geometry_hash_mode": "0a9c0f8bdd95a896", + "geometry_identical": false + }, + { + "case": "C09_ihp130_sW2_sL1", + "topology": "C09", + "pdk": "ihp130", + "size": "sW2_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2752.506, + "A1": 2744.219, + "rel": -0.00301, + "class": "neutral", + "W0": 169.385, + "H0": 16.25, + "W1": 168.875, + "H1": 16.25, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 8.2875, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51, + "p": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -8.287, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C09/ihp130/sW2_sL1/independent/C09_ihp130_sW2_sL1_independent.gds", + "gds_mode": "runs/grid/C09/ihp130/sW2_sL1/diffusion_only/C09_ihp130_sW2_sL1_diffusion_only.gds", + "geometry_hash_ref": "abd0ed8c92eda388", + "geometry_hash_mode": "229329d84985ad96", + "geometry_identical": false + }, + { + "case": "C09_ihp130_sW2_sL1", + "topology": "C09", + "pdk": "ihp130", + "size": "sW2_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2752.506, + "A1": 2752.506, + "rel": 0.0, + "class": "neutral", + "W0": 169.385, + "H0": 16.25, + "W1": 169.385, + "H1": 16.25, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C09/ihp130/sW2_sL1/independent/C09_ihp130_sW2_sL1_independent.gds", + "gds_mode": "runs/grid/C09/ihp130/sW2_sL1/gate_only/C09_ihp130_sW2_sL1_gate_only.gds", + "geometry_hash_ref": "abd0ed8c92eda388", + "geometry_hash_mode": "122f0c4a4325cff5", + "geometry_identical": false + }, + { + "case": "C09_ihp130_sW2_sL1", + "topology": "C09", + "pdk": "ihp130", + "size": "sW2_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2752.506, + "A1": 2744.219, + "rel": -0.00301, + "class": "neutral", + "W0": 169.385, + "H0": 16.25, + "W1": 168.875, + "H1": 16.25, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 8.2875, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51, + "p": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -8.287, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C09/ihp130/sW2_sL1/independent/C09_ihp130_sW2_sL1_independent.gds", + "gds_mode": "runs/grid/C09/ihp130/sW2_sL1/combined/C09_ihp130_sW2_sL1_combined.gds", + "geometry_hash_ref": "abd0ed8c92eda388", + "geometry_hash_mode": "27c10906cb78552b", + "geometry_identical": false + }, + { + "case": "C09_ihp130_sW2_sL2", + "topology": "C09", + "pdk": "ihp130", + "size": "sW2_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 3834.106, + "A1": 3825.819, + "rel": -0.00216, + "class": "neutral", + "W0": 235.945, + "H0": 16.25, + "W1": 235.435, + "H1": 16.25, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 8.2875, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51, + "p": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -8.287, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C09/ihp130/sW2_sL2/independent/C09_ihp130_sW2_sL2_independent.gds", + "gds_mode": "runs/grid/C09/ihp130/sW2_sL2/diffusion_only/C09_ihp130_sW2_sL2_diffusion_only.gds", + "geometry_hash_ref": "c619f4db1e2184a3", + "geometry_hash_mode": "5763af977a9f7c64", + "geometry_identical": false + }, + { + "case": "C09_ihp130_sW2_sL2", + "topology": "C09", + "pdk": "ihp130", + "size": "sW2_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 3834.106, + "A1": 3834.106, + "rel": 0.0, + "class": "neutral", + "W0": 235.945, + "H0": 16.25, + "W1": 235.945, + "H1": 16.25, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C09/ihp130/sW2_sL2/independent/C09_ihp130_sW2_sL2_independent.gds", + "gds_mode": "runs/grid/C09/ihp130/sW2_sL2/gate_only/C09_ihp130_sW2_sL2_gate_only.gds", + "geometry_hash_ref": "c619f4db1e2184a3", + "geometry_hash_mode": "5095e167b59594df", + "geometry_identical": false + }, + { + "case": "C09_ihp130_sW2_sL2", + "topology": "C09", + "pdk": "ihp130", + "size": "sW2_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 3834.106, + "A1": 3825.819, + "rel": -0.00216, + "class": "neutral", + "W0": 235.945, + "H0": 16.25, + "W1": 235.435, + "H1": 16.25, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 8.2875, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51, + "p": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -8.287, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C09/ihp130/sW2_sL2/independent/C09_ihp130_sW2_sL2_independent.gds", + "gds_mode": "runs/grid/C09/ihp130/sW2_sL2/combined/C09_ihp130_sW2_sL2_combined.gds", + "geometry_hash_ref": "c619f4db1e2184a3", + "geometry_hash_mode": "9c214ef94446831b", + "geometry_identical": false + }, + { + "case": "C09_sky130_sW1.5_sL1", + "topology": "C09", + "pdk": "sky130", + "size": "sW1.5_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2000.474, + "A1": 1991.06, + "rel": -0.00471, + "class": "neutral", + "W0": 119.005, + "H0": 16.81, + "W1": 118.445, + "H1": 16.81, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 9.4136, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56, + "p": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -9.414, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C09/sky130/sW1.5_sL1/independent/C09_sky130_sW1p5_sL1_independent.gds", + "gds_mode": "runs/grid/C09/sky130/sW1.5_sL1/diffusion_only/C09_sky130_sW1p5_sL1_diffusion_only.gds", + "geometry_hash_ref": "aad086a687e7d010", + "geometry_hash_mode": "105b7426c01ec024", + "geometry_identical": false + }, + { + "case": "C09_sky130_sW1.5_sL1", + "topology": "C09", + "pdk": "sky130", + "size": "sW1.5_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2000.474, + "A1": 2000.474, + "rel": 0.0, + "class": "neutral", + "W0": 119.005, + "H0": 16.81, + "W1": 119.005, + "H1": 16.81, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C09/sky130/sW1.5_sL1/independent/C09_sky130_sW1p5_sL1_independent.gds", + "gds_mode": "runs/grid/C09/sky130/sW1.5_sL1/gate_only/C09_sky130_sW1p5_sL1_gate_only.gds", + "geometry_hash_ref": "aad086a687e7d010", + "geometry_hash_mode": "f21c0901e2a827f2", + "geometry_identical": false + }, + { + "case": "C09_sky130_sW1.5_sL1", + "topology": "C09", + "pdk": "sky130", + "size": "sW1.5_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2000.474, + "A1": 1991.06, + "rel": -0.00471, + "class": "neutral", + "W0": 119.005, + "H0": 16.81, + "W1": 118.445, + "H1": 16.81, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 9.4136, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56, + "p": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -9.414, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C09/sky130/sW1.5_sL1/independent/C09_sky130_sW1p5_sL1_independent.gds", + "gds_mode": "runs/grid/C09/sky130/sW1.5_sL1/combined/C09_sky130_sW1p5_sL1_combined.gds", + "geometry_hash_ref": "aad086a687e7d010", + "geometry_hash_mode": "e64a02baf6b92f37", + "geometry_identical": false + }, + { + "case": "C09_sky130_sW1_sL1", + "topology": "C09", + "pdk": "sky130", + "size": "sW1_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1365.728, + "A1": 1356.315, + "rel": -0.00689, + "class": "positive", + "W0": 81.245, + "H0": 16.81, + "W1": 80.685, + "H1": 16.81, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 9.4136, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56, + "p": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -9.414, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C09/sky130/sW1_sL1/independent/C09_sky130_sW1_sL1_independent.gds", + "gds_mode": "runs/grid/C09/sky130/sW1_sL1/diffusion_only/C09_sky130_sW1_sL1_diffusion_only.gds", + "geometry_hash_ref": "acdbfac074bee967", + "geometry_hash_mode": "32431f88a606dd1d", + "geometry_identical": false + }, + { + "case": "C09_sky130_sW1_sL1", + "topology": "C09", + "pdk": "sky130", + "size": "sW1_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1365.728, + "A1": 1365.728, + "rel": 0.0, + "class": "neutral", + "W0": 81.245, + "H0": 16.81, + "W1": 81.245, + "H1": 16.81, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C09/sky130/sW1_sL1/independent/C09_sky130_sW1_sL1_independent.gds", + "gds_mode": "runs/grid/C09/sky130/sW1_sL1/gate_only/C09_sky130_sW1_sL1_gate_only.gds", + "geometry_hash_ref": "acdbfac074bee967", + "geometry_hash_mode": "4b9c2c7caf897037", + "geometry_identical": false + }, + { + "case": "C09_sky130_sW1_sL1", + "topology": "C09", + "pdk": "sky130", + "size": "sW1_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1365.728, + "A1": 1356.315, + "rel": -0.00689, + "class": "positive", + "W0": 81.245, + "H0": 16.81, + "W1": 80.685, + "H1": 16.81, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 9.4136, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56, + "p": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -9.414, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C09/sky130/sW1_sL1/independent/C09_sky130_sW1_sL1_independent.gds", + "gds_mode": "runs/grid/C09/sky130/sW1_sL1/combined/C09_sky130_sW1_sL1_combined.gds", + "geometry_hash_ref": "acdbfac074bee967", + "geometry_hash_mode": "249dfb6fb978bb13", + "geometry_identical": false + }, + { + "case": "C09_sky130_sW2_sL1", + "topology": "C09", + "pdk": "sky130", + "size": "sW2_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2635.22, + "A1": 2625.806, + "rel": -0.00357, + "class": "neutral", + "W0": 156.765, + "H0": 16.81, + "W1": 156.205, + "H1": 16.81, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 9.4136, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56, + "p": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -9.414, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C09/sky130/sW2_sL1/independent/C09_sky130_sW2_sL1_independent.gds", + "gds_mode": "runs/grid/C09/sky130/sW2_sL1/diffusion_only/C09_sky130_sW2_sL1_diffusion_only.gds", + "geometry_hash_ref": "fcadce05d5eb0fc8", + "geometry_hash_mode": "d32420afe4b48e62", + "geometry_identical": false + }, + { + "case": "C09_sky130_sW2_sL1", + "topology": "C09", + "pdk": "sky130", + "size": "sW2_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2635.22, + "A1": 2635.22, + "rel": 0.0, + "class": "neutral", + "W0": 156.765, + "H0": 16.81, + "W1": 156.765, + "H1": 16.81, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C09/sky130/sW2_sL1/independent/C09_sky130_sW2_sL1_independent.gds", + "gds_mode": "runs/grid/C09/sky130/sW2_sL1/gate_only/C09_sky130_sW2_sL1_gate_only.gds", + "geometry_hash_ref": "fcadce05d5eb0fc8", + "geometry_hash_mode": "9a5ffe414bf59b96", + "geometry_identical": false + }, + { + "case": "C09_sky130_sW2_sL1", + "topology": "C09", + "pdk": "sky130", + "size": "sW2_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2635.22, + "A1": 2625.806, + "rel": -0.00357, + "class": "neutral", + "W0": 156.765, + "H0": 16.81, + "W1": 156.205, + "H1": 16.81, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 9.4136, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56, + "p": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -9.414, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C09/sky130/sW2_sL1/independent/C09_sky130_sW2_sL1_independent.gds", + "gds_mode": "runs/grid/C09/sky130/sW2_sL1/combined/C09_sky130_sW2_sL1_combined.gds", + "geometry_hash_ref": "fcadce05d5eb0fc8", + "geometry_hash_mode": "ed5c4e2f9500fdc4", + "geometry_identical": false + }, + { + "case": "C10_gf180_sW0.5_sL1.5", + "topology": "C10", + "pdk": "gf180", + "size": "sW0.5_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 858.204, + "A1": 825.212, + "rel": -0.03844, + "class": "positive", + "W0": 41.62, + "H0": 20.62, + "W1": 40.02, + "H1": 20.62, + "dW": 1.6, + "dH": 0.0, + "condition_lhs_H0dW": 32.992, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8, + "p": 1.6 + }, + "max_mos_row_span_saving": 1.6, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -32.992, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C10/gf180/sW0.5_sL1.5/independent/C10_gf180_sW0p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C10/gf180/sW0.5_sL1.5/diffusion_only/C10_gf180_sW0p5_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "b6a554cea39a1030", + "geometry_hash_mode": "bedfe7b36f44e65f", + "geometry_identical": false + }, + { + "case": "C10_gf180_sW0.5_sL1.5", + "topology": "C10", + "pdk": "gf180", + "size": "sW0.5_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 858.204, + "A1": 858.204, + "rel": 0.0, + "class": "neutral", + "W0": 41.62, + "H0": 20.62, + "W1": 41.62, + "H1": 20.62, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C10/gf180/sW0.5_sL1.5/independent/C10_gf180_sW0p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C10/gf180/sW0.5_sL1.5/gate_only/C10_gf180_sW0p5_sL1p5_gate_only.gds", + "geometry_hash_ref": "b6a554cea39a1030", + "geometry_hash_mode": "900abbfc024a8e54", + "geometry_identical": false + }, + { + "case": "C10_gf180_sW0.5_sL1.5", + "topology": "C10", + "pdk": "gf180", + "size": "sW0.5_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 858.204, + "A1": 841.708, + "rel": -0.01922, + "class": "positive", + "W0": 41.62, + "H0": 20.62, + "W1": 40.82, + "H1": 20.62, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 16.496, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8, + "p": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -16.496, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C10/gf180/sW0.5_sL1.5/independent/C10_gf180_sW0p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C10/gf180/sW0.5_sL1.5/combined/C10_gf180_sW0p5_sL1p5_combined.gds", + "geometry_hash_ref": "b6a554cea39a1030", + "geometry_hash_mode": "dcdabebb09a2adb7", + "geometry_identical": false + }, + { + "case": "C10_gf180_sW0.5_sL1", + "topology": "C10", + "pdk": "gf180", + "size": "sW0.5_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 719.638, + "A1": 660.006, + "rel": -0.08286, + "class": "positive", + "W0": 34.9, + "H0": 20.62, + "W1": 33.3, + "H1": 19.82, + "dW": 1.6, + "dH": -0.8, + "condition_lhs_H0dW": 32.992, + "condition_rhs_W1dH": -26.64, + "dH_mos_rows": 0.0, + "dH_channels": -0.8, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.8, + "p": 1.6 + }, + "max_mos_row_span_saving": 1.6, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -31.712, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": -27.92, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C10/gf180/sW0.5_sL1/independent/C10_gf180_sW0p5_sL1_independent.gds", + "gds_mode": "runs/grid/C10/gf180/sW0.5_sL1/diffusion_only/C10_gf180_sW0p5_sL1_diffusion_only.gds", + "geometry_hash_ref": "7d6a0b9d9a1f3230", + "geometry_hash_mode": "5e708b01942c2ff1", + "geometry_identical": false + }, + { + "case": "C10_gf180_sW0.5_sL1", + "topology": "C10", + "pdk": "gf180", + "size": "sW0.5_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 719.638, + "A1": 719.638, + "rel": 0.0, + "class": "neutral", + "W0": 34.9, + "H0": 20.62, + "W1": 34.9, + "H1": 20.62, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C10/gf180/sW0.5_sL1/independent/C10_gf180_sW0p5_sL1_independent.gds", + "gds_mode": "runs/grid/C10/gf180/sW0.5_sL1/gate_only/C10_gf180_sW0p5_sL1_gate_only.gds", + "geometry_hash_ref": "7d6a0b9d9a1f3230", + "geometry_hash_mode": "51ccadc9b0741371", + "geometry_identical": false + }, + { + "case": "C10_gf180_sW0.5_sL1", + "topology": "C10", + "pdk": "gf180", + "size": "sW0.5_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 719.638, + "A1": 729.742, + "rel": 0.01404, + "class": "negative", + "W0": 34.9, + "H0": 20.62, + "W1": 35.39, + "H1": 20.62, + "dW": -0.49, + "dH": 0.0, + "condition_lhs_H0dW": -10.1038, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8, + "p": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -16.496, + "stub_separation": 26.6, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C10/gf180/sW0.5_sL1/independent/C10_gf180_sW0p5_sL1_independent.gds", + "gds_mode": "runs/grid/C10/gf180/sW0.5_sL1/combined/C10_gf180_sW0p5_sL1_combined.gds", + "geometry_hash_ref": "7d6a0b9d9a1f3230", + "geometry_hash_mode": "d52120c8f7bd0896", + "geometry_identical": false, + "increase_terms": [ + "stub_separation" + ], + "primary_mechanism": "stub_separation" + }, + { + "case": "C10_gf180_sW0.5_sL2", + "topology": "C10", + "pdk": "gf180", + "size": "sW0.5_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 996.771, + "A1": 963.779, + "rel": -0.0331, + "class": "positive", + "W0": 48.34, + "H0": 20.62, + "W1": 46.74, + "H1": 20.62, + "dW": 1.6, + "dH": 0.0, + "condition_lhs_H0dW": 32.992, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8, + "p": 1.6 + }, + "max_mos_row_span_saving": 1.6, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -32.992, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C10/gf180/sW0.5_sL2/independent/C10_gf180_sW0p5_sL2_independent.gds", + "gds_mode": "runs/grid/C10/gf180/sW0.5_sL2/diffusion_only/C10_gf180_sW0p5_sL2_diffusion_only.gds", + "geometry_hash_ref": "a0ee3de5af8b2a32", + "geometry_hash_mode": "bec4f19059a55fb4", + "geometry_identical": false + }, + { + "case": "C10_gf180_sW0.5_sL2", + "topology": "C10", + "pdk": "gf180", + "size": "sW0.5_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 996.771, + "A1": 996.771, + "rel": 0.0, + "class": "neutral", + "W0": 48.34, + "H0": 20.62, + "W1": 48.34, + "H1": 20.62, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C10/gf180/sW0.5_sL2/independent/C10_gf180_sW0p5_sL2_independent.gds", + "gds_mode": "runs/grid/C10/gf180/sW0.5_sL2/gate_only/C10_gf180_sW0p5_sL2_gate_only.gds", + "geometry_hash_ref": "a0ee3de5af8b2a32", + "geometry_hash_mode": "cec8dd6f36a1a793", + "geometry_identical": false + }, + { + "case": "C10_gf180_sW0.5_sL2", + "topology": "C10", + "pdk": "gf180", + "size": "sW0.5_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 996.771, + "A1": 980.275, + "rel": -0.01655, + "class": "positive", + "W0": 48.34, + "H0": 20.62, + "W1": 47.54, + "H1": 20.62, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 16.496, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8, + "p": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -16.496, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C10/gf180/sW0.5_sL2/independent/C10_gf180_sW0p5_sL2_independent.gds", + "gds_mode": "runs/grid/C10/gf180/sW0.5_sL2/combined/C10_gf180_sW0p5_sL2_combined.gds", + "geometry_hash_ref": "a0ee3de5af8b2a32", + "geometry_hash_mode": "61db34d425606432", + "geometry_identical": false + }, + { + "case": "C10_gf180_sW1.5_sL1.5", + "topology": "C10", + "pdk": "gf180", + "size": "sW1.5_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2243.868, + "A1": 2210.876, + "rel": -0.0147, + "class": "positive", + "W0": 108.82, + "H0": 20.62, + "W1": 107.22, + "H1": 20.62, + "dW": 1.6, + "dH": 0.0, + "condition_lhs_H0dW": 32.992, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8, + "p": 1.6 + }, + "max_mos_row_span_saving": 1.6, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -32.992, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C10/gf180/sW1.5_sL1.5/independent/C10_gf180_sW1p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C10/gf180/sW1.5_sL1.5/diffusion_only/C10_gf180_sW1p5_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "ee55ea698e4e5f97", + "geometry_hash_mode": "a177bf2e516b0a06", + "geometry_identical": false + }, + { + "case": "C10_gf180_sW1.5_sL1.5", + "topology": "C10", + "pdk": "gf180", + "size": "sW1.5_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2243.868, + "A1": 2243.868, + "rel": 0.0, + "class": "neutral", + "W0": 108.82, + "H0": 20.62, + "W1": 108.82, + "H1": 20.62, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C10/gf180/sW1.5_sL1.5/independent/C10_gf180_sW1p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C10/gf180/sW1.5_sL1.5/gate_only/C10_gf180_sW1p5_sL1p5_gate_only.gds", + "geometry_hash_ref": "ee55ea698e4e5f97", + "geometry_hash_mode": "afdfe2cbf02be074", + "geometry_identical": false + }, + { + "case": "C10_gf180_sW1.5_sL1.5", + "topology": "C10", + "pdk": "gf180", + "size": "sW1.5_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2243.868, + "A1": 2227.372, + "rel": -0.00735, + "class": "positive", + "W0": 108.82, + "H0": 20.62, + "W1": 108.02, + "H1": 20.62, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 16.496, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8, + "p": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -16.496, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C10/gf180/sW1.5_sL1.5/independent/C10_gf180_sW1p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C10/gf180/sW1.5_sL1.5/combined/C10_gf180_sW1p5_sL1p5_combined.gds", + "geometry_hash_ref": "ee55ea698e4e5f97", + "geometry_hash_mode": "d44b86d8fb81e59d", + "geometry_identical": false + }, + { + "case": "C10_gf180_sW1.5_sL1", + "topology": "C10", + "pdk": "gf180", + "size": "sW1.5_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1828.169, + "A1": 1725.529, + "rel": -0.05614, + "class": "positive", + "W0": 88.66, + "H0": 20.62, + "W1": 87.06, + "H1": 19.82, + "dW": 1.6, + "dH": -0.8, + "condition_lhs_H0dW": 32.992, + "condition_rhs_W1dH": -69.648, + "dH_mos_rows": 0.0, + "dH_channels": -0.8, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.8, + "p": 1.6 + }, + "max_mos_row_span_saving": 1.6, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -31.712, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": -70.928, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C10/gf180/sW1.5_sL1/independent/C10_gf180_sW1p5_sL1_independent.gds", + "gds_mode": "runs/grid/C10/gf180/sW1.5_sL1/diffusion_only/C10_gf180_sW1p5_sL1_diffusion_only.gds", + "geometry_hash_ref": "0bc2b6c077261ee9", + "geometry_hash_mode": "dac5a00c61e1d933", + "geometry_identical": false + }, + { + "case": "C10_gf180_sW1.5_sL1", + "topology": "C10", + "pdk": "gf180", + "size": "sW1.5_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1828.169, + "A1": 1828.169, + "rel": 0.0, + "class": "neutral", + "W0": 88.66, + "H0": 20.62, + "W1": 88.66, + "H1": 20.62, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C10/gf180/sW1.5_sL1/independent/C10_gf180_sW1p5_sL1_independent.gds", + "gds_mode": "runs/grid/C10/gf180/sW1.5_sL1/gate_only/C10_gf180_sW1p5_sL1_gate_only.gds", + "geometry_hash_ref": "0bc2b6c077261ee9", + "geometry_hash_mode": "d0753041e26ef103", + "geometry_identical": false + }, + { + "case": "C10_gf180_sW1.5_sL1", + "topology": "C10", + "pdk": "gf180", + "size": "sW1.5_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1828.169, + "A1": 1838.273, + "rel": 0.00553, + "class": "negative", + "W0": 88.66, + "H0": 20.62, + "W1": 89.15, + "H1": 20.62, + "dW": -0.49, + "dH": 0.0, + "condition_lhs_H0dW": -10.1038, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8, + "p": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -16.496, + "stub_separation": 26.6, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C10/gf180/sW1.5_sL1/independent/C10_gf180_sW1p5_sL1_independent.gds", + "gds_mode": "runs/grid/C10/gf180/sW1.5_sL1/combined/C10_gf180_sW1p5_sL1_combined.gds", + "geometry_hash_ref": "0bc2b6c077261ee9", + "geometry_hash_mode": "a07675f49d6ac723", + "geometry_identical": false, + "increase_terms": [ + "stub_separation" + ], + "primary_mechanism": "stub_separation" + }, + { + "case": "C10_gf180_sW1.5_sL2", + "topology": "C10", + "pdk": "gf180", + "size": "sW1.5_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2659.568, + "A1": 2626.576, + "rel": -0.01241, + "class": "positive", + "W0": 128.98, + "H0": 20.62, + "W1": 127.38, + "H1": 20.62, + "dW": 1.6, + "dH": 0.0, + "condition_lhs_H0dW": 32.992, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8, + "p": 1.6 + }, + "max_mos_row_span_saving": 1.6, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -32.992, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C10/gf180/sW1.5_sL2/independent/C10_gf180_sW1p5_sL2_independent.gds", + "gds_mode": "runs/grid/C10/gf180/sW1.5_sL2/diffusion_only/C10_gf180_sW1p5_sL2_diffusion_only.gds", + "geometry_hash_ref": "91590ebdc2b0be9f", + "geometry_hash_mode": "62ae2c1e3d04beeb", + "geometry_identical": false + }, + { + "case": "C10_gf180_sW1.5_sL2", + "topology": "C10", + "pdk": "gf180", + "size": "sW1.5_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2659.568, + "A1": 2659.568, + "rel": 0.0, + "class": "neutral", + "W0": 128.98, + "H0": 20.62, + "W1": 128.98, + "H1": 20.62, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C10/gf180/sW1.5_sL2/independent/C10_gf180_sW1p5_sL2_independent.gds", + "gds_mode": "runs/grid/C10/gf180/sW1.5_sL2/gate_only/C10_gf180_sW1p5_sL2_gate_only.gds", + "geometry_hash_ref": "91590ebdc2b0be9f", + "geometry_hash_mode": "faea7dcb1528e47d", + "geometry_identical": false + }, + { + "case": "C10_gf180_sW1.5_sL2", + "topology": "C10", + "pdk": "gf180", + "size": "sW1.5_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2659.568, + "A1": 2643.072, + "rel": -0.0062, + "class": "positive", + "W0": 128.98, + "H0": 20.62, + "W1": 128.18, + "H1": 20.62, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 16.496, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8, + "p": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -16.496, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C10/gf180/sW1.5_sL2/independent/C10_gf180_sW1p5_sL2_independent.gds", + "gds_mode": "runs/grid/C10/gf180/sW1.5_sL2/combined/C10_gf180_sW1p5_sL2_combined.gds", + "geometry_hash_ref": "91590ebdc2b0be9f", + "geometry_hash_mode": "8388b1d1b9aded5c", + "geometry_identical": false + }, + { + "case": "C10_gf180_sW1_sL1.5", + "topology": "C10", + "pdk": "gf180", + "size": "sW1_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1551.036, + "A1": 1518.044, + "rel": -0.02127, + "class": "positive", + "W0": 75.22, + "H0": 20.62, + "W1": 73.62, + "H1": 20.62, + "dW": 1.6, + "dH": 0.0, + "condition_lhs_H0dW": 32.992, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8, + "p": 1.6 + }, + "max_mos_row_span_saving": 1.6, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -32.992, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C10/gf180/sW1_sL1.5/independent/C10_gf180_sW1_sL1p5_independent.gds", + "gds_mode": "runs/grid/C10/gf180/sW1_sL1.5/diffusion_only/C10_gf180_sW1_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "2606399d8eb9166a", + "geometry_hash_mode": "5c09bcde75f9975a", + "geometry_identical": false + }, + { + "case": "C10_gf180_sW1_sL1.5", + "topology": "C10", + "pdk": "gf180", + "size": "sW1_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1551.036, + "A1": 1551.036, + "rel": 0.0, + "class": "neutral", + "W0": 75.22, + "H0": 20.62, + "W1": 75.22, + "H1": 20.62, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C10/gf180/sW1_sL1.5/independent/C10_gf180_sW1_sL1p5_independent.gds", + "gds_mode": "runs/grid/C10/gf180/sW1_sL1.5/gate_only/C10_gf180_sW1_sL1p5_gate_only.gds", + "geometry_hash_ref": "2606399d8eb9166a", + "geometry_hash_mode": "58aaae4f1bca2af2", + "geometry_identical": false + }, + { + "case": "C10_gf180_sW1_sL1.5", + "topology": "C10", + "pdk": "gf180", + "size": "sW1_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1551.036, + "A1": 1534.54, + "rel": -0.01064, + "class": "positive", + "W0": 75.22, + "H0": 20.62, + "W1": 74.42, + "H1": 20.62, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 16.496, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8, + "p": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -16.496, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C10/gf180/sW1_sL1.5/independent/C10_gf180_sW1_sL1p5_independent.gds", + "gds_mode": "runs/grid/C10/gf180/sW1_sL1.5/combined/C10_gf180_sW1_sL1p5_combined.gds", + "geometry_hash_ref": "2606399d8eb9166a", + "geometry_hash_mode": "ab461afac56c3be6", + "geometry_identical": false + }, + { + "case": "C10_gf180_sW1_sL1", + "topology": "C10", + "pdk": "gf180", + "size": "sW1_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1273.904, + "A1": 1192.768, + "rel": -0.06369, + "class": "positive", + "W0": 61.78, + "H0": 20.62, + "W1": 60.18, + "H1": 19.82, + "dW": 1.6, + "dH": -0.8, + "condition_lhs_H0dW": 32.992, + "condition_rhs_W1dH": -48.144, + "dH_mos_rows": 0.0, + "dH_channels": -0.8, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.8, + "p": 1.6 + }, + "max_mos_row_span_saving": 1.6, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -31.712, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": -49.424, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C10/gf180/sW1_sL1/independent/C10_gf180_sW1_sL1_independent.gds", + "gds_mode": "runs/grid/C10/gf180/sW1_sL1/diffusion_only/C10_gf180_sW1_sL1_diffusion_only.gds", + "geometry_hash_ref": "80f2fa9a6fae45eb", + "geometry_hash_mode": "58a62ec05d138eca", + "geometry_identical": false + }, + { + "case": "C10_gf180_sW1_sL1", + "topology": "C10", + "pdk": "gf180", + "size": "sW1_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1273.904, + "A1": 1273.904, + "rel": 0.0, + "class": "neutral", + "W0": 61.78, + "H0": 20.62, + "W1": 61.78, + "H1": 20.62, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C10/gf180/sW1_sL1/independent/C10_gf180_sW1_sL1_independent.gds", + "gds_mode": "runs/grid/C10/gf180/sW1_sL1/gate_only/C10_gf180_sW1_sL1_gate_only.gds", + "geometry_hash_ref": "80f2fa9a6fae45eb", + "geometry_hash_mode": "c59bceccde8838aa", + "geometry_identical": false + }, + { + "case": "C10_gf180_sW1_sL1", + "topology": "C10", + "pdk": "gf180", + "size": "sW1_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1273.904, + "A1": 1284.007, + "rel": 0.00793, + "class": "negative", + "W0": 61.78, + "H0": 20.62, + "W1": 62.27, + "H1": 20.62, + "dW": -0.49, + "dH": 0.0, + "condition_lhs_H0dW": -10.1038, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8, + "p": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -16.496, + "stub_separation": 26.6, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C10/gf180/sW1_sL1/independent/C10_gf180_sW1_sL1_independent.gds", + "gds_mode": "runs/grid/C10/gf180/sW1_sL1/combined/C10_gf180_sW1_sL1_combined.gds", + "geometry_hash_ref": "80f2fa9a6fae45eb", + "geometry_hash_mode": "57e4d8440605756e", + "geometry_identical": false, + "increase_terms": [ + "stub_separation" + ], + "primary_mechanism": "stub_separation" + }, + { + "case": "C10_gf180_sW1_sL2", + "topology": "C10", + "pdk": "gf180", + "size": "sW1_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1828.169, + "A1": 1795.177, + "rel": -0.01805, + "class": "positive", + "W0": 88.66, + "H0": 20.62, + "W1": 87.06, + "H1": 20.62, + "dW": 1.6, + "dH": 0.0, + "condition_lhs_H0dW": 32.992, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8, + "p": 1.6 + }, + "max_mos_row_span_saving": 1.6, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -32.992, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C10/gf180/sW1_sL2/independent/C10_gf180_sW1_sL2_independent.gds", + "gds_mode": "runs/grid/C10/gf180/sW1_sL2/diffusion_only/C10_gf180_sW1_sL2_diffusion_only.gds", + "geometry_hash_ref": "c446e347c7829618", + "geometry_hash_mode": "4b33656388e8d7c7", + "geometry_identical": false + }, + { + "case": "C10_gf180_sW1_sL2", + "topology": "C10", + "pdk": "gf180", + "size": "sW1_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1828.169, + "A1": 1828.169, + "rel": 0.0, + "class": "neutral", + "W0": 88.66, + "H0": 20.62, + "W1": 88.66, + "H1": 20.62, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C10/gf180/sW1_sL2/independent/C10_gf180_sW1_sL2_independent.gds", + "gds_mode": "runs/grid/C10/gf180/sW1_sL2/gate_only/C10_gf180_sW1_sL2_gate_only.gds", + "geometry_hash_ref": "c446e347c7829618", + "geometry_hash_mode": "963a5c390d37d5da", + "geometry_identical": false + }, + { + "case": "C10_gf180_sW1_sL2", + "topology": "C10", + "pdk": "gf180", + "size": "sW1_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1828.169, + "A1": 1811.673, + "rel": -0.00902, + "class": "positive", + "W0": 88.66, + "H0": 20.62, + "W1": 87.86, + "H1": 20.62, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 16.496, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8, + "p": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -16.496, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C10/gf180/sW1_sL2/independent/C10_gf180_sW1_sL2_independent.gds", + "gds_mode": "runs/grid/C10/gf180/sW1_sL2/combined/C10_gf180_sW1_sL2_combined.gds", + "geometry_hash_ref": "c446e347c7829618", + "geometry_hash_mode": "aebc35447f22eec4", + "geometry_identical": false + }, + { + "case": "C10_gf180_sW2_sL1.5", + "topology": "C10", + "pdk": "gf180", + "size": "sW2_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2936.7, + "A1": 2903.708, + "rel": -0.01123, + "class": "positive", + "W0": 142.42, + "H0": 20.62, + "W1": 140.82, + "H1": 20.62, + "dW": 1.6, + "dH": 0.0, + "condition_lhs_H0dW": 32.992, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8, + "p": 1.6 + }, + "max_mos_row_span_saving": 1.6, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -32.992, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C10/gf180/sW2_sL1.5/independent/C10_gf180_sW2_sL1p5_independent.gds", + "gds_mode": "runs/grid/C10/gf180/sW2_sL1.5/diffusion_only/C10_gf180_sW2_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "d893e42c8d6e1534", + "geometry_hash_mode": "b998e39a2870025b", + "geometry_identical": false + }, + { + "case": "C10_gf180_sW2_sL1.5", + "topology": "C10", + "pdk": "gf180", + "size": "sW2_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2936.7, + "A1": 2936.7, + "rel": 0.0, + "class": "neutral", + "W0": 142.42, + "H0": 20.62, + "W1": 142.42, + "H1": 20.62, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C10/gf180/sW2_sL1.5/independent/C10_gf180_sW2_sL1p5_independent.gds", + "gds_mode": "runs/grid/C10/gf180/sW2_sL1.5/gate_only/C10_gf180_sW2_sL1p5_gate_only.gds", + "geometry_hash_ref": "d893e42c8d6e1534", + "geometry_hash_mode": "c4cf063714555778", + "geometry_identical": false + }, + { + "case": "C10_gf180_sW2_sL1.5", + "topology": "C10", + "pdk": "gf180", + "size": "sW2_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2936.7, + "A1": 2920.204, + "rel": -0.00562, + "class": "positive", + "W0": 142.42, + "H0": 20.62, + "W1": 141.62, + "H1": 20.62, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 16.496, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8, + "p": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -16.496, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C10/gf180/sW2_sL1.5/independent/C10_gf180_sW2_sL1p5_independent.gds", + "gds_mode": "runs/grid/C10/gf180/sW2_sL1.5/combined/C10_gf180_sW2_sL1p5_combined.gds", + "geometry_hash_ref": "d893e42c8d6e1534", + "geometry_hash_mode": "dd65144ae710db61", + "geometry_identical": false + }, + { + "case": "C10_gf180_sW2_sL1", + "topology": "C10", + "pdk": "gf180", + "size": "sW2_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2382.435, + "A1": 2258.291, + "rel": -0.05211, + "class": "positive", + "W0": 115.54, + "H0": 20.62, + "W1": 113.94, + "H1": 19.82, + "dW": 1.6, + "dH": -0.8, + "condition_lhs_H0dW": 32.992, + "condition_rhs_W1dH": -91.152, + "dH_mos_rows": 0.0, + "dH_channels": -0.8, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.8, + "p": 1.6 + }, + "max_mos_row_span_saving": 1.6, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -31.712, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": -92.432, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C10/gf180/sW2_sL1/independent/C10_gf180_sW2_sL1_independent.gds", + "gds_mode": "runs/grid/C10/gf180/sW2_sL1/diffusion_only/C10_gf180_sW2_sL1_diffusion_only.gds", + "geometry_hash_ref": "21eee127cf4854ae", + "geometry_hash_mode": "86d2d3725daf5fc0", + "geometry_identical": false + }, + { + "case": "C10_gf180_sW2_sL1", + "topology": "C10", + "pdk": "gf180", + "size": "sW2_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2382.435, + "A1": 2382.435, + "rel": 0.0, + "class": "neutral", + "W0": 115.54, + "H0": 20.62, + "W1": 115.54, + "H1": 20.62, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C10/gf180/sW2_sL1/independent/C10_gf180_sW2_sL1_independent.gds", + "gds_mode": "runs/grid/C10/gf180/sW2_sL1/gate_only/C10_gf180_sW2_sL1_gate_only.gds", + "geometry_hash_ref": "21eee127cf4854ae", + "geometry_hash_mode": "0e32eb764dad1c97", + "geometry_identical": false + }, + { + "case": "C10_gf180_sW2_sL1", + "topology": "C10", + "pdk": "gf180", + "size": "sW2_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2382.435, + "A1": 2392.539, + "rel": 0.00424, + "class": "neutral", + "W0": 115.54, + "H0": 20.62, + "W1": 116.03, + "H1": 20.62, + "dW": -0.49, + "dH": 0.0, + "condition_lhs_H0dW": -10.1038, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8, + "p": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -16.496, + "stub_separation": 26.6, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C10/gf180/sW2_sL1/independent/C10_gf180_sW2_sL1_independent.gds", + "gds_mode": "runs/grid/C10/gf180/sW2_sL1/combined/C10_gf180_sW2_sL1_combined.gds", + "geometry_hash_ref": "21eee127cf4854ae", + "geometry_hash_mode": "fa56e5df3bafe1fa", + "geometry_identical": false + }, + { + "case": "C10_gf180_sW2_sL2", + "topology": "C10", + "pdk": "gf180", + "size": "sW2_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 3490.966, + "A1": 3457.974, + "rel": -0.00945, + "class": "positive", + "W0": 169.3, + "H0": 20.62, + "W1": 167.7, + "H1": 20.62, + "dW": 1.6, + "dH": 0.0, + "condition_lhs_H0dW": 32.992, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8, + "p": 1.6 + }, + "max_mos_row_span_saving": 1.6, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -32.992, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C10/gf180/sW2_sL2/independent/C10_gf180_sW2_sL2_independent.gds", + "gds_mode": "runs/grid/C10/gf180/sW2_sL2/diffusion_only/C10_gf180_sW2_sL2_diffusion_only.gds", + "geometry_hash_ref": "64b8c24048e378cd", + "geometry_hash_mode": "55942edb34533ba1", + "geometry_identical": false + }, + { + "case": "C10_gf180_sW2_sL2", + "topology": "C10", + "pdk": "gf180", + "size": "sW2_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 3490.966, + "A1": 3490.966, + "rel": 0.0, + "class": "neutral", + "W0": 169.3, + "H0": 20.62, + "W1": 169.3, + "H1": 20.62, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C10/gf180/sW2_sL2/independent/C10_gf180_sW2_sL2_independent.gds", + "gds_mode": "runs/grid/C10/gf180/sW2_sL2/gate_only/C10_gf180_sW2_sL2_gate_only.gds", + "geometry_hash_ref": "64b8c24048e378cd", + "geometry_hash_mode": "a49f4857d5e8d9eb", + "geometry_identical": false + }, + { + "case": "C10_gf180_sW2_sL2", + "topology": "C10", + "pdk": "gf180", + "size": "sW2_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 3490.966, + "A1": 3474.47, + "rel": -0.00473, + "class": "neutral", + "W0": 169.3, + "H0": 20.62, + "W1": 168.5, + "H1": 20.62, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 16.496, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8, + "p": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -16.496, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C10/gf180/sW2_sL2/independent/C10_gf180_sW2_sL2_independent.gds", + "gds_mode": "runs/grid/C10/gf180/sW2_sL2/combined/C10_gf180_sW2_sL2_combined.gds", + "geometry_hash_ref": "64b8c24048e378cd", + "geometry_hash_mode": "56c9c74af4644071", + "geometry_identical": false + }, + { + "case": "C10_ihp130_sW1.5_sL1.5", + "topology": "C10", + "pdk": "ihp130", + "size": "sW1.5_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1347.409, + "A1": 1332.037, + "rel": -0.01141, + "class": "positive", + "W0": 89.41, + "H0": 15.07, + "W1": 88.39, + "H1": 15.07, + "dW": 1.02, + "dH": 0.0, + "condition_lhs_H0dW": 15.3714, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51, + "p": 1.02 + }, + "max_mos_row_span_saving": 1.02, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -15.371, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C10/ihp130/sW1.5_sL1.5/independent/C10_ihp130_sW1p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C10/ihp130/sW1.5_sL1.5/diffusion_only/C10_ihp130_sW1p5_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "96b36662db069ce6", + "geometry_hash_mode": "cfd8da697e32d72b", + "geometry_identical": false + }, + { + "case": "C10_ihp130_sW1.5_sL1.5", + "topology": "C10", + "pdk": "ihp130", + "size": "sW1.5_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1347.409, + "A1": 1347.409, + "rel": 0.0, + "class": "neutral", + "W0": 89.41, + "H0": 15.07, + "W1": 89.41, + "H1": 15.07, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C10/ihp130/sW1.5_sL1.5/independent/C10_ihp130_sW1p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C10/ihp130/sW1.5_sL1.5/gate_only/C10_ihp130_sW1p5_sL1p5_gate_only.gds", + "geometry_hash_ref": "96b36662db069ce6", + "geometry_hash_mode": "f581ca17bca0e7de", + "geometry_identical": false + }, + { + "case": "C10_ihp130_sW1.5_sL1.5", + "topology": "C10", + "pdk": "ihp130", + "size": "sW1.5_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1347.409, + "A1": 1339.723, + "rel": -0.0057, + "class": "positive", + "W0": 89.41, + "H0": 15.07, + "W1": 88.9, + "H1": 15.07, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 7.6857, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51, + "p": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -7.686, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C10/ihp130/sW1.5_sL1.5/independent/C10_ihp130_sW1p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C10/ihp130/sW1.5_sL1.5/combined/C10_ihp130_sW1p5_sL1p5_combined.gds", + "geometry_hash_ref": "96b36662db069ce6", + "geometry_hash_mode": "cb08d3db8702ae6f", + "geometry_identical": false + }, + { + "case": "C10_ihp130_sW1.5_sL1", + "topology": "C10", + "pdk": "ihp130", + "size": "sW1.5_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1065.298, + "A1": 1061.154, + "rel": -0.00389, + "class": "neutral", + "W0": 70.69, + "H0": 15.07, + "W1": 70.415, + "H1": 15.07, + "dW": 0.275, + "dH": 0.0, + "condition_lhs_H0dW": 4.1442, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51, + "p": 1.02 + }, + "max_mos_row_span_saving": 1.02, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -15.371, + "stub_separation": 11.227, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C10/ihp130/sW1.5_sL1/independent/C10_ihp130_sW1p5_sL1_independent.gds", + "gds_mode": "runs/grid/C10/ihp130/sW1.5_sL1/diffusion_only/C10_ihp130_sW1p5_sL1_diffusion_only.gds", + "geometry_hash_ref": "2aa0088ad01e0915", + "geometry_hash_mode": "575fb1debf6db7ba", + "geometry_identical": false + }, + { + "case": "C10_ihp130_sW1.5_sL1", + "topology": "C10", + "pdk": "ihp130", + "size": "sW1.5_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1065.298, + "A1": 1065.298, + "rel": 0.0, + "class": "neutral", + "W0": 70.69, + "H0": 15.07, + "W1": 70.69, + "H1": 15.07, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C10/ihp130/sW1.5_sL1/independent/C10_ihp130_sW1p5_sL1_independent.gds", + "gds_mode": "runs/grid/C10/ihp130/sW1.5_sL1/gate_only/C10_ihp130_sW1p5_sL1_gate_only.gds", + "geometry_hash_ref": "2aa0088ad01e0915", + "geometry_hash_mode": "12ae483bd72e067c", + "geometry_identical": false + }, + { + "case": "C10_ihp130_sW1.5_sL1", + "topology": "C10", + "pdk": "ihp130", + "size": "sW1.5_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1065.298, + "A1": 1016.206, + "rel": -0.04608, + "class": "positive", + "W0": 70.69, + "H0": 15.07, + "W1": 70.18, + "H1": 14.48, + "dW": 0.51, + "dH": -0.59, + "condition_lhs_H0dW": 7.6857, + "condition_rhs_W1dH": -41.4062, + "dH_mos_rows": 0.0, + "dH_channels": -0.59, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51, + "p": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -7.385, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": -41.707, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C10/ihp130/sW1.5_sL1/independent/C10_ihp130_sW1p5_sL1_independent.gds", + "gds_mode": "runs/grid/C10/ihp130/sW1.5_sL1/combined/C10_ihp130_sW1p5_sL1_combined.gds", + "geometry_hash_ref": "2aa0088ad01e0915", + "geometry_hash_mode": "d03569e44e4fdd0f", + "geometry_identical": false + }, + { + "case": "C10_ihp130_sW1.5_sL2", + "topology": "C10", + "pdk": "ihp130", + "size": "sW1.5_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1629.519, + "A1": 1614.148, + "rel": -0.00943, + "class": "positive", + "W0": 108.13, + "H0": 15.07, + "W1": 107.11, + "H1": 15.07, + "dW": 1.02, + "dH": 0.0, + "condition_lhs_H0dW": 15.3714, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51, + "p": 1.02 + }, + "max_mos_row_span_saving": 1.02, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -15.371, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C10/ihp130/sW1.5_sL2/independent/C10_ihp130_sW1p5_sL2_independent.gds", + "gds_mode": "runs/grid/C10/ihp130/sW1.5_sL2/diffusion_only/C10_ihp130_sW1p5_sL2_diffusion_only.gds", + "geometry_hash_ref": "c609679cf947a8df", + "geometry_hash_mode": "b7aa87608878b7fc", + "geometry_identical": false + }, + { + "case": "C10_ihp130_sW1.5_sL2", + "topology": "C10", + "pdk": "ihp130", + "size": "sW1.5_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1629.519, + "A1": 1629.519, + "rel": 0.0, + "class": "neutral", + "W0": 108.13, + "H0": 15.07, + "W1": 108.13, + "H1": 15.07, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C10/ihp130/sW1.5_sL2/independent/C10_ihp130_sW1p5_sL2_independent.gds", + "gds_mode": "runs/grid/C10/ihp130/sW1.5_sL2/gate_only/C10_ihp130_sW1p5_sL2_gate_only.gds", + "geometry_hash_ref": "c609679cf947a8df", + "geometry_hash_mode": "b338fca5b98bc2b8", + "geometry_identical": false + }, + { + "case": "C10_ihp130_sW1.5_sL2", + "topology": "C10", + "pdk": "ihp130", + "size": "sW1.5_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1629.519, + "A1": 1621.833, + "rel": -0.00472, + "class": "neutral", + "W0": 108.13, + "H0": 15.07, + "W1": 107.62, + "H1": 15.07, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 7.6857, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51, + "p": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -7.686, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C10/ihp130/sW1.5_sL2/independent/C10_ihp130_sW1p5_sL2_independent.gds", + "gds_mode": "runs/grid/C10/ihp130/sW1.5_sL2/combined/C10_ihp130_sW1p5_sL2_combined.gds", + "geometry_hash_ref": "c609679cf947a8df", + "geometry_hash_mode": "8b27a0e3d1e3ff4c", + "geometry_identical": false + }, + { + "case": "C10_ihp130_sW1_sL1", + "topology": "C10", + "pdk": "ihp130", + "size": "sW1_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 739.786, + "A1": 735.642, + "rel": -0.0056, + "class": "positive", + "W0": 49.09, + "H0": 15.07, + "W1": 48.815, + "H1": 15.07, + "dW": 0.275, + "dH": 0.0, + "condition_lhs_H0dW": 4.1443, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51, + "p": 1.02 + }, + "max_mos_row_span_saving": 1.02, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -15.371, + "stub_separation": 11.227, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C10/ihp130/sW1_sL1/independent/C10_ihp130_sW1_sL1_independent.gds", + "gds_mode": "runs/grid/C10/ihp130/sW1_sL1/diffusion_only/C10_ihp130_sW1_sL1_diffusion_only.gds", + "geometry_hash_ref": "e4a4adcd8d3ecf17", + "geometry_hash_mode": "81b7ec89c39e363b", + "geometry_identical": false + }, + { + "case": "C10_ihp130_sW1_sL1", + "topology": "C10", + "pdk": "ihp130", + "size": "sW1_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 739.786, + "A1": 739.786, + "rel": 0.0, + "class": "neutral", + "W0": 49.09, + "H0": 15.07, + "W1": 49.09, + "H1": 15.07, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C10/ihp130/sW1_sL1/independent/C10_ihp130_sW1_sL1_independent.gds", + "gds_mode": "runs/grid/C10/ihp130/sW1_sL1/gate_only/C10_ihp130_sW1_sL1_gate_only.gds", + "geometry_hash_ref": "e4a4adcd8d3ecf17", + "geometry_hash_mode": "4c595a183560370c", + "geometry_identical": false + }, + { + "case": "C10_ihp130_sW1_sL1", + "topology": "C10", + "pdk": "ihp130", + "size": "sW1_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 739.786, + "A1": 703.438, + "rel": -0.04913, + "class": "positive", + "W0": 49.09, + "H0": 15.07, + "W1": 48.58, + "H1": 14.48, + "dW": 0.51, + "dH": -0.59, + "condition_lhs_H0dW": 7.6857, + "condition_rhs_W1dH": -28.6622, + "dH_mos_rows": 0.0, + "dH_channels": -0.59, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51, + "p": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -7.385, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": -28.963, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C10/ihp130/sW1_sL1/independent/C10_ihp130_sW1_sL1_independent.gds", + "gds_mode": "runs/grid/C10/ihp130/sW1_sL1/combined/C10_ihp130_sW1_sL1_combined.gds", + "geometry_hash_ref": "e4a4adcd8d3ecf17", + "geometry_hash_mode": "3daed0e8b7cdda33", + "geometry_identical": false + }, + { + "case": "C10_ihp130_sW2_sL1.5", + "topology": "C10", + "pdk": "ihp130", + "size": "sW2_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1766.957, + "A1": 1751.586, + "rel": -0.0087, + "class": "positive", + "W0": 117.25, + "H0": 15.07, + "W1": 116.23, + "H1": 15.07, + "dW": 1.02, + "dH": 0.0, + "condition_lhs_H0dW": 15.3714, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51, + "p": 1.02 + }, + "max_mos_row_span_saving": 1.02, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -15.371, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C10/ihp130/sW2_sL1.5/independent/C10_ihp130_sW2_sL1p5_independent.gds", + "gds_mode": "runs/grid/C10/ihp130/sW2_sL1.5/diffusion_only/C10_ihp130_sW2_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "3f88b334b10a1ed5", + "geometry_hash_mode": "4f90ea9e120017b3", + "geometry_identical": false + }, + { + "case": "C10_ihp130_sW2_sL1.5", + "topology": "C10", + "pdk": "ihp130", + "size": "sW2_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1766.957, + "A1": 1766.957, + "rel": 0.0, + "class": "neutral", + "W0": 117.25, + "H0": 15.07, + "W1": 117.25, + "H1": 15.07, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C10/ihp130/sW2_sL1.5/independent/C10_ihp130_sW2_sL1p5_independent.gds", + "gds_mode": "runs/grid/C10/ihp130/sW2_sL1.5/gate_only/C10_ihp130_sW2_sL1p5_gate_only.gds", + "geometry_hash_ref": "3f88b334b10a1ed5", + "geometry_hash_mode": "0f815ca81af4a81b", + "geometry_identical": false + }, + { + "case": "C10_ihp130_sW2_sL1.5", + "topology": "C10", + "pdk": "ihp130", + "size": "sW2_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1766.957, + "A1": 1759.272, + "rel": -0.00435, + "class": "neutral", + "W0": 117.25, + "H0": 15.07, + "W1": 116.74, + "H1": 15.07, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 7.6857, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51, + "p": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -7.686, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C10/ihp130/sW2_sL1.5/independent/C10_ihp130_sW2_sL1p5_independent.gds", + "gds_mode": "runs/grid/C10/ihp130/sW2_sL1.5/combined/C10_ihp130_sW2_sL1p5_combined.gds", + "geometry_hash_ref": "3f88b334b10a1ed5", + "geometry_hash_mode": "ad16deeb448c68f2", + "geometry_identical": false + }, + { + "case": "C10_ihp130_sW2_sL1", + "topology": "C10", + "pdk": "ihp130", + "size": "sW2_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1390.81, + "A1": 1386.666, + "rel": -0.00298, + "class": "neutral", + "W0": 92.29, + "H0": 15.07, + "W1": 92.015, + "H1": 15.07, + "dW": 0.275, + "dH": 0.0, + "condition_lhs_H0dW": 4.1443, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51, + "p": 1.02 + }, + "max_mos_row_span_saving": 1.02, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -15.371, + "stub_separation": 11.227, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C10/ihp130/sW2_sL1/independent/C10_ihp130_sW2_sL1_independent.gds", + "gds_mode": "runs/grid/C10/ihp130/sW2_sL1/diffusion_only/C10_ihp130_sW2_sL1_diffusion_only.gds", + "geometry_hash_ref": "1969861f9022e49c", + "geometry_hash_mode": "f11206ed78d846ce", + "geometry_identical": false + }, + { + "case": "C10_ihp130_sW2_sL1", + "topology": "C10", + "pdk": "ihp130", + "size": "sW2_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1390.81, + "A1": 1390.81, + "rel": 0.0, + "class": "neutral", + "W0": 92.29, + "H0": 15.07, + "W1": 92.29, + "H1": 15.07, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C10/ihp130/sW2_sL1/independent/C10_ihp130_sW2_sL1_independent.gds", + "gds_mode": "runs/grid/C10/ihp130/sW2_sL1/gate_only/C10_ihp130_sW2_sL1_gate_only.gds", + "geometry_hash_ref": "1969861f9022e49c", + "geometry_hash_mode": "f1d745227323da1c", + "geometry_identical": false + }, + { + "case": "C10_ihp130_sW2_sL1", + "topology": "C10", + "pdk": "ihp130", + "size": "sW2_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1390.81, + "A1": 1328.974, + "rel": -0.04446, + "class": "positive", + "W0": 92.29, + "H0": 15.07, + "W1": 91.78, + "H1": 14.48, + "dW": 0.51, + "dH": -0.59, + "condition_lhs_H0dW": 7.6857, + "condition_rhs_W1dH": -54.1502, + "dH_mos_rows": 0.0, + "dH_channels": -0.59, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51, + "p": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -7.385, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": -54.451, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C10/ihp130/sW2_sL1/independent/C10_ihp130_sW2_sL1_independent.gds", + "gds_mode": "runs/grid/C10/ihp130/sW2_sL1/combined/C10_ihp130_sW2_sL1_combined.gds", + "geometry_hash_ref": "1969861f9022e49c", + "geometry_hash_mode": "cc00112bfb2252b7", + "geometry_identical": false + }, + { + "case": "C10_ihp130_sW2_sL2", + "topology": "C10", + "pdk": "ihp130", + "size": "sW2_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2143.105, + "A1": 2127.733, + "rel": -0.00717, + "class": "positive", + "W0": 142.21, + "H0": 15.07, + "W1": 141.19, + "H1": 15.07, + "dW": 1.02, + "dH": 0.0, + "condition_lhs_H0dW": 15.3714, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51, + "p": 1.02 + }, + "max_mos_row_span_saving": 1.02, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -15.371, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C10/ihp130/sW2_sL2/independent/C10_ihp130_sW2_sL2_independent.gds", + "gds_mode": "runs/grid/C10/ihp130/sW2_sL2/diffusion_only/C10_ihp130_sW2_sL2_diffusion_only.gds", + "geometry_hash_ref": "e8fced111e63b780", + "geometry_hash_mode": "c9d278d8d2575050", + "geometry_identical": false + }, + { + "case": "C10_ihp130_sW2_sL2", + "topology": "C10", + "pdk": "ihp130", + "size": "sW2_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2143.105, + "A1": 2143.105, + "rel": 0.0, + "class": "neutral", + "W0": 142.21, + "H0": 15.07, + "W1": 142.21, + "H1": 15.07, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C10/ihp130/sW2_sL2/independent/C10_ihp130_sW2_sL2_independent.gds", + "gds_mode": "runs/grid/C10/ihp130/sW2_sL2/gate_only/C10_ihp130_sW2_sL2_gate_only.gds", + "geometry_hash_ref": "e8fced111e63b780", + "geometry_hash_mode": "c84b702742fda717", + "geometry_identical": false + }, + { + "case": "C10_ihp130_sW2_sL2", + "topology": "C10", + "pdk": "ihp130", + "size": "sW2_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2143.105, + "A1": 2135.419, + "rel": -0.00359, + "class": "neutral", + "W0": 142.21, + "H0": 15.07, + "W1": 141.7, + "H1": 15.07, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 7.6857, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51, + "p": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -7.686, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C10/ihp130/sW2_sL2/independent/C10_ihp130_sW2_sL2_independent.gds", + "gds_mode": "runs/grid/C10/ihp130/sW2_sL2/combined/C10_ihp130_sW2_sL2_combined.gds", + "geometry_hash_ref": "e8fced111e63b780", + "geometry_hash_mode": "287d5fb5a1dfa447", + "geometry_identical": false + }, + { + "case": "C10_sky130_sW1.5_sL1.5", + "topology": "C10", + "pdk": "sky130", + "size": "sW1.5_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1426.797, + "A1": 1409.336, + "rel": -0.01224, + "class": "positive", + "W0": 91.52, + "H0": 15.59, + "W1": 90.4, + "H1": 15.59, + "dW": 1.12, + "dH": 0.0, + "condition_lhs_H0dW": 17.4608, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56, + "p": 1.12 + }, + "max_mos_row_span_saving": 1.12, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -17.461, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C10/sky130/sW1.5_sL1.5/independent/C10_sky130_sW1p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C10/sky130/sW1.5_sL1.5/diffusion_only/C10_sky130_sW1p5_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "5a3d56cc20d60879", + "geometry_hash_mode": "bb88e5464490e521", + "geometry_identical": false + }, + { + "case": "C10_sky130_sW1.5_sL1.5", + "topology": "C10", + "pdk": "sky130", + "size": "sW1.5_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1426.797, + "A1": 1426.797, + "rel": 0.0, + "class": "neutral", + "W0": 91.52, + "H0": 15.59, + "W1": 91.52, + "H1": 15.59, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C10/sky130/sW1.5_sL1.5/independent/C10_sky130_sW1p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C10/sky130/sW1.5_sL1.5/gate_only/C10_sky130_sW1p5_sL1p5_gate_only.gds", + "geometry_hash_ref": "5a3d56cc20d60879", + "geometry_hash_mode": "82a6f298d3e4587c", + "geometry_identical": false + }, + { + "case": "C10_sky130_sW1.5_sL1.5", + "topology": "C10", + "pdk": "sky130", + "size": "sW1.5_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1426.797, + "A1": 1418.066, + "rel": -0.00612, + "class": "positive", + "W0": 91.52, + "H0": 15.59, + "W1": 90.96, + "H1": 15.59, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 8.7304, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56, + "p": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -8.73, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C10/sky130/sW1.5_sL1.5/independent/C10_sky130_sW1p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C10/sky130/sW1.5_sL1.5/combined/C10_sky130_sW1p5_sL1p5_combined.gds", + "geometry_hash_ref": "5a3d56cc20d60879", + "geometry_hash_mode": "a5678109e867ae2a", + "geometry_identical": false + }, + { + "case": "C10_sky130_sW1.5_sL1", + "topology": "C10", + "pdk": "sky130", + "size": "sW1.5_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1090.053, + "A1": 1072.592, + "rel": -0.01602, + "class": "positive", + "W0": 69.92, + "H0": 15.59, + "W1": 68.8, + "H1": 15.59, + "dW": 1.12, + "dH": 0.0, + "condition_lhs_H0dW": 17.4608, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56, + "p": 1.12 + }, + "max_mos_row_span_saving": 1.12, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -17.461, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C10/sky130/sW1.5_sL1/independent/C10_sky130_sW1p5_sL1_independent.gds", + "gds_mode": "runs/grid/C10/sky130/sW1.5_sL1/diffusion_only/C10_sky130_sW1p5_sL1_diffusion_only.gds", + "geometry_hash_ref": "9c748dcb2ddfebcd", + "geometry_hash_mode": "e063e5b010afa6cc", + "geometry_identical": false + }, + { + "case": "C10_sky130_sW1.5_sL1", + "topology": "C10", + "pdk": "sky130", + "size": "sW1.5_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1090.053, + "A1": 1090.053, + "rel": 0.0, + "class": "neutral", + "W0": 69.92, + "H0": 15.59, + "W1": 69.92, + "H1": 15.59, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C10/sky130/sW1.5_sL1/independent/C10_sky130_sW1p5_sL1_independent.gds", + "gds_mode": "runs/grid/C10/sky130/sW1.5_sL1/gate_only/C10_sky130_sW1p5_sL1_gate_only.gds", + "geometry_hash_ref": "9c748dcb2ddfebcd", + "geometry_hash_mode": "86bb08454abae7f9", + "geometry_identical": false + }, + { + "case": "C10_sky130_sW1.5_sL1", + "topology": "C10", + "pdk": "sky130", + "size": "sW1.5_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1090.053, + "A1": 1081.322, + "rel": -0.00801, + "class": "positive", + "W0": 69.92, + "H0": 15.59, + "W1": 69.36, + "H1": 15.59, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 8.7304, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56, + "p": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -8.73, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C10/sky130/sW1.5_sL1/independent/C10_sky130_sW1p5_sL1_independent.gds", + "gds_mode": "runs/grid/C10/sky130/sW1.5_sL1/combined/C10_sky130_sW1p5_sL1_combined.gds", + "geometry_hash_ref": "9c748dcb2ddfebcd", + "geometry_hash_mode": "e9bf5b0a8c17724e", + "geometry_identical": false + }, + { + "case": "C10_sky130_sW1.5_sL2", + "topology": "C10", + "pdk": "sky130", + "size": "sW1.5_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1763.541, + "A1": 1746.08, + "rel": -0.0099, + "class": "positive", + "W0": 113.12, + "H0": 15.59, + "W1": 112.0, + "H1": 15.59, + "dW": 1.12, + "dH": 0.0, + "condition_lhs_H0dW": 17.4608, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56, + "p": 1.12 + }, + "max_mos_row_span_saving": 1.12, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -17.461, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C10/sky130/sW1.5_sL2/independent/C10_sky130_sW1p5_sL2_independent.gds", + "gds_mode": "runs/grid/C10/sky130/sW1.5_sL2/diffusion_only/C10_sky130_sW1p5_sL2_diffusion_only.gds", + "geometry_hash_ref": "77a6aa2820709750", + "geometry_hash_mode": "40776e16b936c80b", + "geometry_identical": false + }, + { + "case": "C10_sky130_sW1.5_sL2", + "topology": "C10", + "pdk": "sky130", + "size": "sW1.5_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1763.541, + "A1": 1763.541, + "rel": 0.0, + "class": "neutral", + "W0": 113.12, + "H0": 15.59, + "W1": 113.12, + "H1": 15.59, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C10/sky130/sW1.5_sL2/independent/C10_sky130_sW1p5_sL2_independent.gds", + "gds_mode": "runs/grid/C10/sky130/sW1.5_sL2/gate_only/C10_sky130_sW1p5_sL2_gate_only.gds", + "geometry_hash_ref": "77a6aa2820709750", + "geometry_hash_mode": "1f2257c0dd8804b2", + "geometry_identical": false + }, + { + "case": "C10_sky130_sW1.5_sL2", + "topology": "C10", + "pdk": "sky130", + "size": "sW1.5_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1763.541, + "A1": 1754.81, + "rel": -0.00495, + "class": "neutral", + "W0": 113.12, + "H0": 15.59, + "W1": 112.56, + "H1": 15.59, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 8.7304, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56, + "p": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -8.73, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C10/sky130/sW1.5_sL2/independent/C10_sky130_sW1p5_sL2_independent.gds", + "gds_mode": "runs/grid/C10/sky130/sW1.5_sL2/combined/C10_sky130_sW1p5_sL2_combined.gds", + "geometry_hash_ref": "77a6aa2820709750", + "geometry_hash_mode": "fa995e22e7d6d0c2", + "geometry_identical": false + }, + { + "case": "C10_sky130_sW1_sL1.5", + "topology": "C10", + "pdk": "sky130", + "size": "sW1_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 981.546, + "A1": 964.086, + "rel": -0.01779, + "class": "positive", + "W0": 62.96, + "H0": 15.59, + "W1": 61.84, + "H1": 15.59, + "dW": 1.12, + "dH": 0.0, + "condition_lhs_H0dW": 17.4608, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56, + "p": 1.12 + }, + "max_mos_row_span_saving": 1.12, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -17.461, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C10/sky130/sW1_sL1.5/independent/C10_sky130_sW1_sL1p5_independent.gds", + "gds_mode": "runs/grid/C10/sky130/sW1_sL1.5/diffusion_only/C10_sky130_sW1_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "1b2a7da851c2e394", + "geometry_hash_mode": "00f9f82bb1ec983d", + "geometry_identical": false + }, + { + "case": "C10_sky130_sW1_sL1.5", + "topology": "C10", + "pdk": "sky130", + "size": "sW1_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 981.546, + "A1": 981.546, + "rel": 0.0, + "class": "neutral", + "W0": 62.96, + "H0": 15.59, + "W1": 62.96, + "H1": 15.59, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C10/sky130/sW1_sL1.5/independent/C10_sky130_sW1_sL1p5_independent.gds", + "gds_mode": "runs/grid/C10/sky130/sW1_sL1.5/gate_only/C10_sky130_sW1_sL1p5_gate_only.gds", + "geometry_hash_ref": "1b2a7da851c2e394", + "geometry_hash_mode": "fcf81b542f9f2da6", + "geometry_identical": false + }, + { + "case": "C10_sky130_sW1_sL1.5", + "topology": "C10", + "pdk": "sky130", + "size": "sW1_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 981.546, + "A1": 972.816, + "rel": -0.00889, + "class": "positive", + "W0": 62.96, + "H0": 15.59, + "W1": 62.4, + "H1": 15.59, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 8.7304, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56, + "p": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -8.73, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C10/sky130/sW1_sL1.5/independent/C10_sky130_sW1_sL1p5_independent.gds", + "gds_mode": "runs/grid/C10/sky130/sW1_sL1.5/combined/C10_sky130_sW1_sL1p5_combined.gds", + "geometry_hash_ref": "1b2a7da851c2e394", + "geometry_hash_mode": "4b511c252d869226", + "geometry_identical": false + }, + { + "case": "C10_sky130_sW1_sL1", + "topology": "C10", + "pdk": "sky130", + "size": "sW1_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 757.05, + "A1": 739.59, + "rel": -0.02306, + "class": "positive", + "W0": 48.56, + "H0": 15.59, + "W1": 47.44, + "H1": 15.59, + "dW": 1.12, + "dH": 0.0, + "condition_lhs_H0dW": 17.4608, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56, + "p": 1.12 + }, + "max_mos_row_span_saving": 1.12, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -17.461, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C10/sky130/sW1_sL1/independent/C10_sky130_sW1_sL1_independent.gds", + "gds_mode": "runs/grid/C10/sky130/sW1_sL1/diffusion_only/C10_sky130_sW1_sL1_diffusion_only.gds", + "geometry_hash_ref": "998c53713617ba64", + "geometry_hash_mode": "c70705faaf908239", + "geometry_identical": false + }, + { + "case": "C10_sky130_sW1_sL1", + "topology": "C10", + "pdk": "sky130", + "size": "sW1_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 757.05, + "A1": 757.05, + "rel": 0.0, + "class": "neutral", + "W0": 48.56, + "H0": 15.59, + "W1": 48.56, + "H1": 15.59, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C10/sky130/sW1_sL1/independent/C10_sky130_sW1_sL1_independent.gds", + "gds_mode": "runs/grid/C10/sky130/sW1_sL1/gate_only/C10_sky130_sW1_sL1_gate_only.gds", + "geometry_hash_ref": "998c53713617ba64", + "geometry_hash_mode": "cb5f94a0bd81b583", + "geometry_identical": false + }, + { + "case": "C10_sky130_sW1_sL1", + "topology": "C10", + "pdk": "sky130", + "size": "sW1_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 757.05, + "A1": 748.32, + "rel": -0.01153, + "class": "positive", + "W0": 48.56, + "H0": 15.59, + "W1": 48.0, + "H1": 15.59, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 8.7304, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56, + "p": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -8.73, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C10/sky130/sW1_sL1/independent/C10_sky130_sW1_sL1_independent.gds", + "gds_mode": "runs/grid/C10/sky130/sW1_sL1/combined/C10_sky130_sW1_sL1_combined.gds", + "geometry_hash_ref": "998c53713617ba64", + "geometry_hash_mode": "cf4e1140c9b07726", + "geometry_identical": false + }, + { + "case": "C10_sky130_sW2_sL1.5", + "topology": "C10", + "pdk": "sky130", + "size": "sW2_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1872.047, + "A1": 1854.586, + "rel": -0.00933, + "class": "positive", + "W0": 120.08, + "H0": 15.59, + "W1": 118.96, + "H1": 15.59, + "dW": 1.12, + "dH": 0.0, + "condition_lhs_H0dW": 17.4608, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56, + "p": 1.12 + }, + "max_mos_row_span_saving": 1.12, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -17.461, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C10/sky130/sW2_sL1.5/independent/C10_sky130_sW2_sL1p5_independent.gds", + "gds_mode": "runs/grid/C10/sky130/sW2_sL1.5/diffusion_only/C10_sky130_sW2_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "ecfa1f5b04c3aad6", + "geometry_hash_mode": "9d84578dd96c1ee0", + "geometry_identical": false + }, + { + "case": "C10_sky130_sW2_sL1.5", + "topology": "C10", + "pdk": "sky130", + "size": "sW2_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1872.047, + "A1": 1872.047, + "rel": 0.0, + "class": "neutral", + "W0": 120.08, + "H0": 15.59, + "W1": 120.08, + "H1": 15.59, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C10/sky130/sW2_sL1.5/independent/C10_sky130_sW2_sL1p5_independent.gds", + "gds_mode": "runs/grid/C10/sky130/sW2_sL1.5/gate_only/C10_sky130_sW2_sL1p5_gate_only.gds", + "geometry_hash_ref": "ecfa1f5b04c3aad6", + "geometry_hash_mode": "263cb00f4e1267e7", + "geometry_identical": false + }, + { + "case": "C10_sky130_sW2_sL1.5", + "topology": "C10", + "pdk": "sky130", + "size": "sW2_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1872.047, + "A1": 1863.317, + "rel": -0.00466, + "class": "neutral", + "W0": 120.08, + "H0": 15.59, + "W1": 119.52, + "H1": 15.59, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 8.7304, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56, + "p": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -8.73, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C10/sky130/sW2_sL1.5/independent/C10_sky130_sW2_sL1p5_independent.gds", + "gds_mode": "runs/grid/C10/sky130/sW2_sL1.5/combined/C10_sky130_sW2_sL1p5_combined.gds", + "geometry_hash_ref": "ecfa1f5b04c3aad6", + "geometry_hash_mode": "22efce4803bc0b36", + "geometry_identical": false + }, + { + "case": "C10_sky130_sW2_sL1", + "topology": "C10", + "pdk": "sky130", + "size": "sW2_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1423.055, + "A1": 1405.594, + "rel": -0.01227, + "class": "positive", + "W0": 91.28, + "H0": 15.59, + "W1": 90.16, + "H1": 15.59, + "dW": 1.12, + "dH": 0.0, + "condition_lhs_H0dW": 17.4608, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56, + "p": 1.12 + }, + "max_mos_row_span_saving": 1.12, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -17.461, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C10/sky130/sW2_sL1/independent/C10_sky130_sW2_sL1_independent.gds", + "gds_mode": "runs/grid/C10/sky130/sW2_sL1/diffusion_only/C10_sky130_sW2_sL1_diffusion_only.gds", + "geometry_hash_ref": "67cbfc05780fef0f", + "geometry_hash_mode": "bf711cf156555c24", + "geometry_identical": false + }, + { + "case": "C10_sky130_sW2_sL1", + "topology": "C10", + "pdk": "sky130", + "size": "sW2_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1423.055, + "A1": 1423.055, + "rel": 0.0, + "class": "neutral", + "W0": 91.28, + "H0": 15.59, + "W1": 91.28, + "H1": 15.59, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C10/sky130/sW2_sL1/independent/C10_sky130_sW2_sL1_independent.gds", + "gds_mode": "runs/grid/C10/sky130/sW2_sL1/gate_only/C10_sky130_sW2_sL1_gate_only.gds", + "geometry_hash_ref": "67cbfc05780fef0f", + "geometry_hash_mode": "02d8fc58ed452e64", + "geometry_identical": false + }, + { + "case": "C10_sky130_sW2_sL1", + "topology": "C10", + "pdk": "sky130", + "size": "sW2_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1423.055, + "A1": 1414.325, + "rel": -0.00613, + "class": "positive", + "W0": 91.28, + "H0": 15.59, + "W1": 90.72, + "H1": 15.59, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 8.7304, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56, + "p": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -8.73, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C10/sky130/sW2_sL1/independent/C10_sky130_sW2_sL1_independent.gds", + "gds_mode": "runs/grid/C10/sky130/sW2_sL1/combined/C10_sky130_sW2_sL1_combined.gds", + "geometry_hash_ref": "67cbfc05780fef0f", + "geometry_hash_mode": "3ab3b4efdb88c6a9", + "geometry_identical": false + }, + { + "case": "C10_sky130_sW2_sL2", + "topology": "C10", + "pdk": "sky130", + "size": "sW2_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2321.039, + "A1": 2303.578, + "rel": -0.00752, + "class": "positive", + "W0": 148.88, + "H0": 15.59, + "W1": 147.76, + "H1": 15.59, + "dW": 1.12, + "dH": 0.0, + "condition_lhs_H0dW": 17.4608, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56, + "p": 1.12 + }, + "max_mos_row_span_saving": 1.12, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -17.461, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C10/sky130/sW2_sL2/independent/C10_sky130_sW2_sL2_independent.gds", + "gds_mode": "runs/grid/C10/sky130/sW2_sL2/diffusion_only/C10_sky130_sW2_sL2_diffusion_only.gds", + "geometry_hash_ref": "4a1a42ed9f9efaf7", + "geometry_hash_mode": "06671d647f2ceb47", + "geometry_identical": false + }, + { + "case": "C10_sky130_sW2_sL2", + "topology": "C10", + "pdk": "sky130", + "size": "sW2_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2321.039, + "A1": 2321.039, + "rel": 0.0, + "class": "neutral", + "W0": 148.88, + "H0": 15.59, + "W1": 148.88, + "H1": 15.59, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C10/sky130/sW2_sL2/independent/C10_sky130_sW2_sL2_independent.gds", + "gds_mode": "runs/grid/C10/sky130/sW2_sL2/gate_only/C10_sky130_sW2_sL2_gate_only.gds", + "geometry_hash_ref": "4a1a42ed9f9efaf7", + "geometry_hash_mode": "64e1574f4592aeef", + "geometry_identical": false + }, + { + "case": "C10_sky130_sW2_sL2", + "topology": "C10", + "pdk": "sky130", + "size": "sW2_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2321.039, + "A1": 2312.309, + "rel": -0.00376, + "class": "neutral", + "W0": 148.88, + "H0": 15.59, + "W1": 148.32, + "H1": 15.59, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 8.7304, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56, + "p": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -8.73, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C10/sky130/sW2_sL2/independent/C10_sky130_sW2_sL2_independent.gds", + "gds_mode": "runs/grid/C10/sky130/sW2_sL2/combined/C10_sky130_sW2_sL2_combined.gds", + "geometry_hash_ref": "4a1a42ed9f9efaf7", + "geometry_hash_mode": "cb2d5fc7bae4ebb8", + "geometry_identical": false + }, + { + "case": "C11_gf180_sW0.5_sL1.5", + "topology": "C11", + "pdk": "gf180", + "size": "sW0.5_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1962.401, + "A1": 1962.401, + "rel": 0.0, + "class": "neutral", + "W0": 40.6, + "H0": 48.335, + "W1": 40.6, + "H1": 48.335, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.6, + "p": 1.6 + }, + "max_mos_row_span_saving": 1.6, + "widest_row_ref": "passive", + "widest_row_mode": "passive", + "passive_dominated": true, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/gf180/sW0.5_sL1.5/independent/C11_gf180_sW0p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C11/gf180/sW0.5_sL1.5/diffusion_only/C11_gf180_sW0p5_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "ae4ae1e1fe0bb5d2", + "geometry_hash_mode": "aeff2b33f8704738", + "geometry_identical": false + }, + { + "case": "C11_gf180_sW0.5_sL1.5", + "topology": "C11", + "pdk": "gf180", + "size": "sW0.5_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1962.401, + "A1": 1928.297, + "rel": -0.01738, + "class": "positive", + "W0": 40.6, + "H0": 48.335, + "W1": 40.6, + "H1": 47.495, + "dW": 0.0, + "dH": -0.84, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -34.104, + "dH_mos_rows": -0.04, + "dH_channels": -0.8, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": -1.08 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "passive", + "widest_row_mode": "passive", + "passive_dominated": true, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -1.624, + "routing_tracks": -32.48, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/gf180/sW0.5_sL1.5/independent/C11_gf180_sW0p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C11/gf180/sW0.5_sL1.5/gate_only/C11_gf180_sW0p5_sL1p5_gate_only.gds", + "geometry_hash_ref": "ae4ae1e1fe0bb5d2", + "geometry_hash_mode": "1c8b8faf3082f322", + "geometry_identical": false + }, + { + "case": "C11_gf180_sW0.5_sL1.5", + "topology": "C11", + "pdk": "gf180", + "size": "sW0.5_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1962.401, + "A1": 1928.297, + "rel": -0.01738, + "class": "positive", + "W0": 40.6, + "H0": 48.335, + "W1": 40.6, + "H1": 47.495, + "dW": 0.0, + "dH": -0.84, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -34.104, + "dH_mos_rows": -0.04, + "dH_channels": -0.8, + "dH_other": -0.0, + "row_span_saving": { + "n": 1.6, + "p": 0.52 + }, + "max_mos_row_span_saving": 1.6, + "widest_row_ref": "passive", + "widest_row_mode": "passive", + "passive_dominated": true, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -1.624, + "routing_tracks": -32.48, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/gf180/sW0.5_sL1.5/independent/C11_gf180_sW0p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C11/gf180/sW0.5_sL1.5/combined/C11_gf180_sW0p5_sL1p5_combined.gds", + "geometry_hash_ref": "ae4ae1e1fe0bb5d2", + "geometry_hash_mode": "f8bde059632afb24", + "geometry_identical": false + }, + { + "case": "C11_gf180_sW0.5_sL1", + "topology": "C11", + "pdk": "gf180", + "size": "sW0.5_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1962.401, + "A1": 1962.401, + "rel": 0.0, + "class": "neutral", + "W0": 40.6, + "H0": 48.335, + "W1": 40.6, + "H1": 48.335, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.6, + "p": 1.6 + }, + "max_mos_row_span_saving": 1.6, + "widest_row_ref": "passive", + "widest_row_mode": "passive", + "passive_dominated": true, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/gf180/sW0.5_sL1/independent/C11_gf180_sW0p5_sL1_independent.gds", + "gds_mode": "runs/grid/C11/gf180/sW0.5_sL1/diffusion_only/C11_gf180_sW0p5_sL1_diffusion_only.gds", + "geometry_hash_ref": "c223ece19e372c88", + "geometry_hash_mode": "bb9962adffcc979f", + "geometry_identical": false + }, + { + "case": "C11_gf180_sW0.5_sL1", + "topology": "C11", + "pdk": "gf180", + "size": "sW0.5_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1962.401, + "A1": 1928.297, + "rel": -0.01738, + "class": "positive", + "W0": 40.6, + "H0": 48.335, + "W1": 40.6, + "H1": 47.495, + "dW": 0.0, + "dH": -0.84, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -34.104, + "dH_mos_rows": -0.04, + "dH_channels": -0.8, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": -1.08 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "passive", + "widest_row_mode": "passive", + "passive_dominated": true, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -1.624, + "routing_tracks": -32.48, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/gf180/sW0.5_sL1/independent/C11_gf180_sW0p5_sL1_independent.gds", + "gds_mode": "runs/grid/C11/gf180/sW0.5_sL1/gate_only/C11_gf180_sW0p5_sL1_gate_only.gds", + "geometry_hash_ref": "c223ece19e372c88", + "geometry_hash_mode": "c64e9091ed807c02", + "geometry_identical": false + }, + { + "case": "C11_gf180_sW0.5_sL1", + "topology": "C11", + "pdk": "gf180", + "size": "sW0.5_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1962.401, + "A1": 1928.297, + "rel": -0.01738, + "class": "positive", + "W0": 40.6, + "H0": 48.335, + "W1": 40.6, + "H1": 47.495, + "dW": 0.0, + "dH": -0.84, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -34.104, + "dH_mos_rows": -0.04, + "dH_channels": -0.8, + "dH_other": -0.0, + "row_span_saving": { + "n": 1.6, + "p": 0.52 + }, + "max_mos_row_span_saving": 1.6, + "widest_row_ref": "passive", + "widest_row_mode": "passive", + "passive_dominated": true, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -1.624, + "routing_tracks": -32.48, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/gf180/sW0.5_sL1/independent/C11_gf180_sW0p5_sL1_independent.gds", + "gds_mode": "runs/grid/C11/gf180/sW0.5_sL1/combined/C11_gf180_sW0p5_sL1_combined.gds", + "geometry_hash_ref": "c223ece19e372c88", + "geometry_hash_mode": "9f292e79bd0a9cd7", + "geometry_identical": false + }, + { + "case": "C11_gf180_sW0.5_sL2", + "topology": "C11", + "pdk": "gf180", + "size": "sW0.5_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1962.401, + "A1": 1962.401, + "rel": 0.0, + "class": "neutral", + "W0": 40.6, + "H0": 48.335, + "W1": 40.6, + "H1": 48.335, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.6, + "p": 1.6 + }, + "max_mos_row_span_saving": 1.6, + "widest_row_ref": "passive", + "widest_row_mode": "passive", + "passive_dominated": true, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/gf180/sW0.5_sL2/independent/C11_gf180_sW0p5_sL2_independent.gds", + "gds_mode": "runs/grid/C11/gf180/sW0.5_sL2/diffusion_only/C11_gf180_sW0p5_sL2_diffusion_only.gds", + "geometry_hash_ref": "1ba3512cbf6cbcf3", + "geometry_hash_mode": "86109f70d4fa8377", + "geometry_identical": false + }, + { + "case": "C11_gf180_sW0.5_sL2", + "topology": "C11", + "pdk": "gf180", + "size": "sW0.5_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1962.401, + "A1": 1971.042, + "rel": 0.0044, + "class": "neutral", + "W0": 40.6, + "H0": 48.335, + "W1": 41.5, + "H1": 47.495, + "dW": -0.9, + "dH": -0.84, + "condition_lhs_H0dW": -43.5015, + "condition_rhs_W1dH": -34.86, + "dH_mos_rows": -0.04, + "dH_channels": -0.8, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": -1.08 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "passive", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 47.02, + "stub_separation": -4.275, + "taller_mos_rows": -1.624, + "routing_tracks": -32.48, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/gf180/sW0.5_sL2/independent/C11_gf180_sW0p5_sL2_independent.gds", + "gds_mode": "runs/grid/C11/gf180/sW0.5_sL2/gate_only/C11_gf180_sW0p5_sL2_gate_only.gds", + "geometry_hash_ref": "1ba3512cbf6cbcf3", + "geometry_hash_mode": "a4c7064462b3995e", + "geometry_identical": false + }, + { + "case": "C11_gf180_sW0.5_sL2", + "topology": "C11", + "pdk": "gf180", + "size": "sW0.5_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1962.401, + "A1": 1928.297, + "rel": -0.01738, + "class": "positive", + "W0": 40.6, + "H0": 48.335, + "W1": 40.6, + "H1": 47.495, + "dW": 0.0, + "dH": -0.84, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -34.104, + "dH_mos_rows": -0.04, + "dH_channels": -0.8, + "dH_other": -0.0, + "row_span_saving": { + "n": 1.6, + "p": 0.52 + }, + "max_mos_row_span_saving": 1.6, + "widest_row_ref": "passive", + "widest_row_mode": "passive", + "passive_dominated": true, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -1.624, + "routing_tracks": -32.48, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/gf180/sW0.5_sL2/independent/C11_gf180_sW0p5_sL2_independent.gds", + "gds_mode": "runs/grid/C11/gf180/sW0.5_sL2/combined/C11_gf180_sW0p5_sL2_combined.gds", + "geometry_hash_ref": "1ba3512cbf6cbcf3", + "geometry_hash_mode": "f425808462bec19b", + "geometry_identical": false + }, + { + "case": "C11_gf180_sW1.5_sL1.5", + "topology": "C11", + "pdk": "gf180", + "size": "sW1.5_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 4145.21, + "A1": 4067.874, + "rel": -0.01866, + "class": "positive", + "W0": 85.76, + "H0": 48.335, + "W1": 84.16, + "H1": 48.335, + "dW": 1.6, + "dH": 0.0, + "condition_lhs_H0dW": 77.336, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.6, + "p": 1.6 + }, + "max_mos_row_span_saving": 1.6, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -77.336, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/gf180/sW1.5_sL1.5/independent/C11_gf180_sW1p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C11/gf180/sW1.5_sL1.5/diffusion_only/C11_gf180_sW1p5_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "3cd72566c5855740", + "geometry_hash_mode": "39095d274748b42a", + "geometry_identical": false + }, + { + "case": "C11_gf180_sW1.5_sL1.5", + "topology": "C11", + "pdk": "gf180", + "size": "sW1.5_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 4145.21, + "A1": 4125.416, + "rel": -0.00478, + "class": "neutral", + "W0": 85.76, + "H0": 48.335, + "W1": 86.86, + "H1": 47.495, + "dW": -1.1, + "dH": -0.84, + "condition_lhs_H0dW": -53.1685, + "condition_rhs_W1dH": -72.9624, + "dH_mos_rows": -0.04, + "dH_channels": -0.8, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": -1.08 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 51.295, + "stub_separation": 0.95, + "taller_mos_rows": -3.43, + "routing_tracks": -68.608, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/gf180/sW1.5_sL1.5/independent/C11_gf180_sW1p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C11/gf180/sW1.5_sL1.5/gate_only/C11_gf180_sW1p5_sL1p5_gate_only.gds", + "geometry_hash_ref": "3cd72566c5855740", + "geometry_hash_mode": "c36384c97ee21eb8", + "geometry_identical": false + }, + { + "case": "C11_gf180_sW1.5_sL1.5", + "topology": "C11", + "pdk": "gf180", + "size": "sW1.5_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 4145.21, + "A1": 4049.424, + "rel": -0.02311, + "class": "positive", + "W0": 85.76, + "H0": 48.335, + "W1": 85.26, + "H1": 47.495, + "dW": 0.5, + "dH": -0.84, + "condition_lhs_H0dW": 24.1675, + "condition_rhs_W1dH": -71.6184, + "dH_mos_rows": -0.04, + "dH_channels": -0.8, + "dH_other": -0.0, + "row_span_saving": { + "n": 1.6, + "p": 0.52 + }, + "max_mos_row_span_saving": 1.6, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -24.697, + "stub_separation": 0.95, + "taller_mos_rows": -3.43, + "routing_tracks": -68.608, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/gf180/sW1.5_sL1.5/independent/C11_gf180_sW1p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C11/gf180/sW1.5_sL1.5/combined/C11_gf180_sW1p5_sL1p5_combined.gds", + "geometry_hash_ref": "3cd72566c5855740", + "geometry_hash_mode": "f9a752e1c1566858", + "geometry_identical": false + }, + { + "case": "C11_gf180_sW1.5_sL1", + "topology": "C11", + "pdk": "gf180", + "size": "sW1.5_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 3414.384, + "A1": 3337.048, + "rel": -0.02265, + "class": "positive", + "W0": 70.64, + "H0": 48.335, + "W1": 69.04, + "H1": 48.335, + "dW": 1.6, + "dH": 0.0, + "condition_lhs_H0dW": 77.336, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.6, + "p": 1.6 + }, + "max_mos_row_span_saving": 1.6, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -77.336, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/gf180/sW1.5_sL1/independent/C11_gf180_sW1p5_sL1_independent.gds", + "gds_mode": "runs/grid/C11/gf180/sW1.5_sL1/diffusion_only/C11_gf180_sW1p5_sL1_diffusion_only.gds", + "geometry_hash_ref": "537cbcbc5aac3415", + "geometry_hash_mode": "4f072de0f75ce9ef", + "geometry_identical": false + }, + { + "case": "C11_gf180_sW1.5_sL1", + "topology": "C11", + "pdk": "gf180", + "size": "sW1.5_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 3414.384, + "A1": 3407.291, + "rel": -0.00208, + "class": "neutral", + "W0": 70.64, + "H0": 48.335, + "W1": 71.74, + "H1": 47.495, + "dW": -1.1, + "dH": -0.84, + "condition_lhs_H0dW": -53.1685, + "condition_rhs_W1dH": -60.2616, + "dH_mos_rows": -0.04, + "dH_channels": -0.8, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": -1.08 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 51.295, + "stub_separation": 0.95, + "taller_mos_rows": -2.826, + "routing_tracks": -56.512, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/gf180/sW1.5_sL1/independent/C11_gf180_sW1p5_sL1_independent.gds", + "gds_mode": "runs/grid/C11/gf180/sW1.5_sL1/gate_only/C11_gf180_sW1p5_sL1_gate_only.gds", + "geometry_hash_ref": "537cbcbc5aac3415", + "geometry_hash_mode": "9d1f215cc301f0e4", + "geometry_identical": false + }, + { + "case": "C11_gf180_sW1.5_sL1", + "topology": "C11", + "pdk": "gf180", + "size": "sW1.5_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 3414.384, + "A1": 3331.299, + "rel": -0.02433, + "class": "positive", + "W0": 70.64, + "H0": 48.335, + "W1": 70.14, + "H1": 47.495, + "dW": 0.5, + "dH": -0.84, + "condition_lhs_H0dW": 24.1675, + "condition_rhs_W1dH": -58.9176, + "dH_mos_rows": -0.04, + "dH_channels": -0.8, + "dH_other": -0.0, + "row_span_saving": { + "n": 1.6, + "p": 0.52 + }, + "max_mos_row_span_saving": 1.6, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -24.697, + "stub_separation": 0.95, + "taller_mos_rows": -2.826, + "routing_tracks": -56.512, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/gf180/sW1.5_sL1/independent/C11_gf180_sW1p5_sL1_independent.gds", + "gds_mode": "runs/grid/C11/gf180/sW1.5_sL1/combined/C11_gf180_sW1p5_sL1_combined.gds", + "geometry_hash_ref": "537cbcbc5aac3415", + "geometry_hash_mode": "39f8e5369850f977", + "geometry_identical": false + }, + { + "case": "C11_gf180_sW1.5_sL2", + "topology": "C11", + "pdk": "gf180", + "size": "sW1.5_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 4876.035, + "A1": 4798.699, + "rel": -0.01586, + "class": "positive", + "W0": 100.88, + "H0": 48.335, + "W1": 99.28, + "H1": 48.335, + "dW": 1.6, + "dH": 0.0, + "condition_lhs_H0dW": 77.336, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.6, + "p": 1.6 + }, + "max_mos_row_span_saving": 1.6, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -77.336, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/gf180/sW1.5_sL2/independent/C11_gf180_sW1p5_sL2_independent.gds", + "gds_mode": "runs/grid/C11/gf180/sW1.5_sL2/diffusion_only/C11_gf180_sW1p5_sL2_diffusion_only.gds", + "geometry_hash_ref": "b8460911b4c83f53", + "geometry_hash_mode": "1185dc3b02beac50", + "geometry_identical": false + }, + { + "case": "C11_gf180_sW1.5_sL2", + "topology": "C11", + "pdk": "gf180", + "size": "sW1.5_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 4876.035, + "A1": 4843.54, + "rel": -0.00666, + "class": "positive", + "W0": 100.88, + "H0": 48.335, + "W1": 101.98, + "H1": 47.495, + "dW": -1.1, + "dH": -0.84, + "condition_lhs_H0dW": -53.1685, + "condition_rhs_W1dH": -85.6632, + "dH_mos_rows": -0.04, + "dH_channels": -0.8, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": -1.08 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 51.295, + "stub_separation": 0.95, + "taller_mos_rows": -4.035, + "routing_tracks": -80.704, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/gf180/sW1.5_sL2/independent/C11_gf180_sW1p5_sL2_independent.gds", + "gds_mode": "runs/grid/C11/gf180/sW1.5_sL2/gate_only/C11_gf180_sW1p5_sL2_gate_only.gds", + "geometry_hash_ref": "b8460911b4c83f53", + "geometry_hash_mode": "46bbba7efc6e2f12", + "geometry_identical": false + }, + { + "case": "C11_gf180_sW1.5_sL2", + "topology": "C11", + "pdk": "gf180", + "size": "sW1.5_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 4876.035, + "A1": 4767.548, + "rel": -0.02225, + "class": "positive", + "W0": 100.88, + "H0": 48.335, + "W1": 100.38, + "H1": 47.495, + "dW": 0.5, + "dH": -0.84, + "condition_lhs_H0dW": 24.1675, + "condition_rhs_W1dH": -84.3192, + "dH_mos_rows": -0.04, + "dH_channels": -0.8, + "dH_other": -0.0, + "row_span_saving": { + "n": 1.6, + "p": 0.52 + }, + "max_mos_row_span_saving": 1.6, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -24.697, + "stub_separation": 0.95, + "taller_mos_rows": -4.035, + "routing_tracks": -80.704, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/gf180/sW1.5_sL2/independent/C11_gf180_sW1p5_sL2_independent.gds", + "gds_mode": "runs/grid/C11/gf180/sW1.5_sL2/combined/C11_gf180_sW1p5_sL2_combined.gds", + "geometry_hash_ref": "b8460911b4c83f53", + "geometry_hash_mode": "e478a1904c60f088", + "geometry_identical": false + }, + { + "case": "C11_gf180_sW1_sL1.5", + "topology": "C11", + "pdk": "gf180", + "size": "sW1_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2927.168, + "A1": 2849.832, + "rel": -0.02642, + "class": "positive", + "W0": 60.56, + "H0": 48.335, + "W1": 58.96, + "H1": 48.335, + "dW": 1.6, + "dH": 0.0, + "condition_lhs_H0dW": 77.336, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.6, + "p": 1.6 + }, + "max_mos_row_span_saving": 1.6, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -77.336, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/gf180/sW1_sL1.5/independent/C11_gf180_sW1_sL1p5_independent.gds", + "gds_mode": "runs/grid/C11/gf180/sW1_sL1.5/diffusion_only/C11_gf180_sW1_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "bd78dd1d3b359909", + "geometry_hash_mode": "db3fc4e0cb5096c2", + "geometry_identical": false + }, + { + "case": "C11_gf180_sW1_sL1.5", + "topology": "C11", + "pdk": "gf180", + "size": "sW1_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2927.168, + "A1": 2928.542, + "rel": 0.00047, + "class": "neutral", + "W0": 60.56, + "H0": 48.335, + "W1": 61.66, + "H1": 47.495, + "dW": -1.1, + "dH": -0.84, + "condition_lhs_H0dW": -53.1685, + "condition_rhs_W1dH": -51.7944, + "dH_mos_rows": -0.04, + "dH_channels": -0.8, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": -1.08 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 51.295, + "stub_separation": 0.95, + "taller_mos_rows": -2.422, + "routing_tracks": -48.448, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/gf180/sW1_sL1.5/independent/C11_gf180_sW1_sL1p5_independent.gds", + "gds_mode": "runs/grid/C11/gf180/sW1_sL1.5/gate_only/C11_gf180_sW1_sL1p5_gate_only.gds", + "geometry_hash_ref": "bd78dd1d3b359909", + "geometry_hash_mode": "82adefd50ce61068", + "geometry_identical": false + }, + { + "case": "C11_gf180_sW1_sL1.5", + "topology": "C11", + "pdk": "gf180", + "size": "sW1_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2927.168, + "A1": 2852.55, + "rel": -0.02549, + "class": "positive", + "W0": 60.56, + "H0": 48.335, + "W1": 60.06, + "H1": 47.495, + "dW": 0.5, + "dH": -0.84, + "condition_lhs_H0dW": 24.1675, + "condition_rhs_W1dH": -50.4504, + "dH_mos_rows": -0.04, + "dH_channels": -0.8, + "dH_other": -0.0, + "row_span_saving": { + "n": 1.6, + "p": 0.52 + }, + "max_mos_row_span_saving": 1.6, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -24.697, + "stub_separation": 0.95, + "taller_mos_rows": -2.422, + "routing_tracks": -48.448, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/gf180/sW1_sL1.5/independent/C11_gf180_sW1_sL1p5_independent.gds", + "gds_mode": "runs/grid/C11/gf180/sW1_sL1.5/combined/C11_gf180_sW1_sL1p5_combined.gds", + "geometry_hash_ref": "bd78dd1d3b359909", + "geometry_hash_mode": "a870852b819430cf", + "geometry_identical": false + }, + { + "case": "C11_gf180_sW1_sL1", + "topology": "C11", + "pdk": "gf180", + "size": "sW1_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2439.951, + "A1": 2362.615, + "rel": -0.0317, + "class": "positive", + "W0": 50.48, + "H0": 48.335, + "W1": 48.88, + "H1": 48.335, + "dW": 1.6, + "dH": 0.0, + "condition_lhs_H0dW": 77.336, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.6, + "p": 1.6 + }, + "max_mos_row_span_saving": 1.6, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -77.336, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/gf180/sW1_sL1/independent/C11_gf180_sW1_sL1_independent.gds", + "gds_mode": "runs/grid/C11/gf180/sW1_sL1/diffusion_only/C11_gf180_sW1_sL1_diffusion_only.gds", + "geometry_hash_ref": "94233513ac528fd9", + "geometry_hash_mode": "9f866b565d024ed4", + "geometry_identical": false + }, + { + "case": "C11_gf180_sW1_sL1", + "topology": "C11", + "pdk": "gf180", + "size": "sW1_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2439.951, + "A1": 2449.792, + "rel": 0.00403, + "class": "neutral", + "W0": 50.48, + "H0": 48.335, + "W1": 51.58, + "H1": 47.495, + "dW": -1.1, + "dH": -0.84, + "condition_lhs_H0dW": -53.1685, + "condition_rhs_W1dH": -43.3272, + "dH_mos_rows": -0.04, + "dH_channels": -0.8, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": -1.08 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 51.295, + "stub_separation": 0.95, + "taller_mos_rows": -2.019, + "routing_tracks": -40.384, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/gf180/sW1_sL1/independent/C11_gf180_sW1_sL1_independent.gds", + "gds_mode": "runs/grid/C11/gf180/sW1_sL1/gate_only/C11_gf180_sW1_sL1_gate_only.gds", + "geometry_hash_ref": "94233513ac528fd9", + "geometry_hash_mode": "532712310cd6cf67", + "geometry_identical": false + }, + { + "case": "C11_gf180_sW1_sL1", + "topology": "C11", + "pdk": "gf180", + "size": "sW1_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2439.951, + "A1": 2373.8, + "rel": -0.02711, + "class": "positive", + "W0": 50.48, + "H0": 48.335, + "W1": 49.98, + "H1": 47.495, + "dW": 0.5, + "dH": -0.84, + "condition_lhs_H0dW": 24.1675, + "condition_rhs_W1dH": -41.9832, + "dH_mos_rows": -0.04, + "dH_channels": -0.8, + "dH_other": -0.0, + "row_span_saving": { + "n": 1.6, + "p": 0.52 + }, + "max_mos_row_span_saving": 1.6, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -24.697, + "stub_separation": 0.95, + "taller_mos_rows": -2.019, + "routing_tracks": -40.384, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/gf180/sW1_sL1/independent/C11_gf180_sW1_sL1_independent.gds", + "gds_mode": "runs/grid/C11/gf180/sW1_sL1/combined/C11_gf180_sW1_sL1_combined.gds", + "geometry_hash_ref": "94233513ac528fd9", + "geometry_hash_mode": "28288888966ff819", + "geometry_identical": false + }, + { + "case": "C11_gf180_sW1_sL2", + "topology": "C11", + "pdk": "gf180", + "size": "sW1_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 3414.384, + "A1": 3337.048, + "rel": -0.02265, + "class": "positive", + "W0": 70.64, + "H0": 48.335, + "W1": 69.04, + "H1": 48.335, + "dW": 1.6, + "dH": 0.0, + "condition_lhs_H0dW": 77.336, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.6, + "p": 1.6 + }, + "max_mos_row_span_saving": 1.6, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -77.336, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/gf180/sW1_sL2/independent/C11_gf180_sW1_sL2_independent.gds", + "gds_mode": "runs/grid/C11/gf180/sW1_sL2/diffusion_only/C11_gf180_sW1_sL2_diffusion_only.gds", + "geometry_hash_ref": "10b724e633bc3c00", + "geometry_hash_mode": "7ef6992e38467663", + "geometry_identical": false + }, + { + "case": "C11_gf180_sW1_sL2", + "topology": "C11", + "pdk": "gf180", + "size": "sW1_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 3414.384, + "A1": 3407.291, + "rel": -0.00208, + "class": "neutral", + "W0": 70.64, + "H0": 48.335, + "W1": 71.74, + "H1": 47.495, + "dW": -1.1, + "dH": -0.84, + "condition_lhs_H0dW": -53.1685, + "condition_rhs_W1dH": -60.2616, + "dH_mos_rows": -0.04, + "dH_channels": -0.8, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": -1.08 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 51.295, + "stub_separation": 0.95, + "taller_mos_rows": -2.826, + "routing_tracks": -56.512, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/gf180/sW1_sL2/independent/C11_gf180_sW1_sL2_independent.gds", + "gds_mode": "runs/grid/C11/gf180/sW1_sL2/gate_only/C11_gf180_sW1_sL2_gate_only.gds", + "geometry_hash_ref": "10b724e633bc3c00", + "geometry_hash_mode": "169a03a5b4690d74", + "geometry_identical": false + }, + { + "case": "C11_gf180_sW1_sL2", + "topology": "C11", + "pdk": "gf180", + "size": "sW1_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 3414.384, + "A1": 3331.299, + "rel": -0.02433, + "class": "positive", + "W0": 70.64, + "H0": 48.335, + "W1": 70.14, + "H1": 47.495, + "dW": 0.5, + "dH": -0.84, + "condition_lhs_H0dW": 24.1675, + "condition_rhs_W1dH": -58.9176, + "dH_mos_rows": -0.04, + "dH_channels": -0.8, + "dH_other": -0.0, + "row_span_saving": { + "n": 1.6, + "p": 0.52 + }, + "max_mos_row_span_saving": 1.6, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -24.697, + "stub_separation": 0.95, + "taller_mos_rows": -2.826, + "routing_tracks": -56.512, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/gf180/sW1_sL2/independent/C11_gf180_sW1_sL2_independent.gds", + "gds_mode": "runs/grid/C11/gf180/sW1_sL2/combined/C11_gf180_sW1_sL2_combined.gds", + "geometry_hash_ref": "10b724e633bc3c00", + "geometry_hash_mode": "a55ba5ded6e419e3", + "geometry_identical": false + }, + { + "case": "C11_gf180_sW2_sL1.5", + "topology": "C11", + "pdk": "gf180", + "size": "sW2_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 5363.252, + "A1": 5285.916, + "rel": -0.01442, + "class": "positive", + "W0": 110.96, + "H0": 48.335, + "W1": 109.36, + "H1": 48.335, + "dW": 1.6, + "dH": 0.0, + "condition_lhs_H0dW": 77.336, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.6, + "p": 1.6 + }, + "max_mos_row_span_saving": 1.6, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -77.336, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/gf180/sW2_sL1.5/independent/C11_gf180_sW2_sL1p5_independent.gds", + "gds_mode": "runs/grid/C11/gf180/sW2_sL1.5/diffusion_only/C11_gf180_sW2_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "3ad6e8ad7a8616ed", + "geometry_hash_mode": "dc7368a4bb405084", + "geometry_identical": false + }, + { + "case": "C11_gf180_sW2_sL1.5", + "topology": "C11", + "pdk": "gf180", + "size": "sW2_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 5363.252, + "A1": 5322.29, + "rel": -0.00764, + "class": "positive", + "W0": 110.96, + "H0": 48.335, + "W1": 112.06, + "H1": 47.495, + "dW": -1.1, + "dH": -0.84, + "condition_lhs_H0dW": -53.1685, + "condition_rhs_W1dH": -94.1304, + "dH_mos_rows": -0.04, + "dH_channels": -0.8, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": -1.08 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 51.295, + "stub_separation": 0.95, + "taller_mos_rows": -4.438, + "routing_tracks": -88.768, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/gf180/sW2_sL1.5/independent/C11_gf180_sW2_sL1p5_independent.gds", + "gds_mode": "runs/grid/C11/gf180/sW2_sL1.5/gate_only/C11_gf180_sW2_sL1p5_gate_only.gds", + "geometry_hash_ref": "3ad6e8ad7a8616ed", + "geometry_hash_mode": "a20520b64da17271", + "geometry_identical": false + }, + { + "case": "C11_gf180_sW2_sL1.5", + "topology": "C11", + "pdk": "gf180", + "size": "sW2_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 5363.252, + "A1": 5246.298, + "rel": -0.02181, + "class": "positive", + "W0": 110.96, + "H0": 48.335, + "W1": 110.46, + "H1": 47.495, + "dW": 0.5, + "dH": -0.84, + "condition_lhs_H0dW": 24.1675, + "condition_rhs_W1dH": -92.7864, + "dH_mos_rows": -0.04, + "dH_channels": -0.8, + "dH_other": -0.0, + "row_span_saving": { + "n": 1.6, + "p": 0.52 + }, + "max_mos_row_span_saving": 1.6, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -24.697, + "stub_separation": 0.95, + "taller_mos_rows": -4.438, + "routing_tracks": -88.768, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/gf180/sW2_sL1.5/independent/C11_gf180_sW2_sL1p5_independent.gds", + "gds_mode": "runs/grid/C11/gf180/sW2_sL1.5/combined/C11_gf180_sW2_sL1p5_combined.gds", + "geometry_hash_ref": "3ad6e8ad7a8616ed", + "geometry_hash_mode": "c0ad38f3c590875a", + "geometry_identical": false + }, + { + "case": "C11_gf180_sW2_sL1", + "topology": "C11", + "pdk": "gf180", + "size": "sW2_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 4388.818, + "A1": 4311.482, + "rel": -0.01762, + "class": "positive", + "W0": 90.8, + "H0": 48.335, + "W1": 89.2, + "H1": 48.335, + "dW": 1.6, + "dH": 0.0, + "condition_lhs_H0dW": 77.336, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.6, + "p": 1.6 + }, + "max_mos_row_span_saving": 1.6, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -77.336, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/gf180/sW2_sL1/independent/C11_gf180_sW2_sL1_independent.gds", + "gds_mode": "runs/grid/C11/gf180/sW2_sL1/diffusion_only/C11_gf180_sW2_sL1_diffusion_only.gds", + "geometry_hash_ref": "d297027cc9c7b9d0", + "geometry_hash_mode": "cc205703711bc9b4", + "geometry_identical": false + }, + { + "case": "C11_gf180_sW2_sL1", + "topology": "C11", + "pdk": "gf180", + "size": "sW2_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 4388.818, + "A1": 4364.791, + "rel": -0.00547, + "class": "positive", + "W0": 90.8, + "H0": 48.335, + "W1": 91.9, + "H1": 47.495, + "dW": -1.1, + "dH": -0.84, + "condition_lhs_H0dW": -53.1685, + "condition_rhs_W1dH": -77.196, + "dH_mos_rows": -0.04, + "dH_channels": -0.8, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": -1.08 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 51.295, + "stub_separation": 0.95, + "taller_mos_rows": -3.632, + "routing_tracks": -72.64, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/gf180/sW2_sL1/independent/C11_gf180_sW2_sL1_independent.gds", + "gds_mode": "runs/grid/C11/gf180/sW2_sL1/gate_only/C11_gf180_sW2_sL1_gate_only.gds", + "geometry_hash_ref": "d297027cc9c7b9d0", + "geometry_hash_mode": "2469bcfab605d803", + "geometry_identical": false + }, + { + "case": "C11_gf180_sW2_sL1", + "topology": "C11", + "pdk": "gf180", + "size": "sW2_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 4388.818, + "A1": 4288.798, + "rel": -0.02279, + "class": "positive", + "W0": 90.8, + "H0": 48.335, + "W1": 90.3, + "H1": 47.495, + "dW": 0.5, + "dH": -0.84, + "condition_lhs_H0dW": 24.1675, + "condition_rhs_W1dH": -75.852, + "dH_mos_rows": -0.04, + "dH_channels": -0.8, + "dH_other": -0.0, + "row_span_saving": { + "n": 1.6, + "p": 0.52 + }, + "max_mos_row_span_saving": 1.6, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -24.697, + "stub_separation": 0.95, + "taller_mos_rows": -3.632, + "routing_tracks": -72.64, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/gf180/sW2_sL1/independent/C11_gf180_sW2_sL1_independent.gds", + "gds_mode": "runs/grid/C11/gf180/sW2_sL1/combined/C11_gf180_sW2_sL1_combined.gds", + "geometry_hash_ref": "d297027cc9c7b9d0", + "geometry_hash_mode": "c9fc3aeee7af7bb1", + "geometry_identical": false + }, + { + "case": "C11_gf180_sW2_sL2", + "topology": "C11", + "pdk": "gf180", + "size": "sW2_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 6337.685, + "A1": 6260.349, + "rel": -0.0122, + "class": "positive", + "W0": 131.12, + "H0": 48.335, + "W1": 129.52, + "H1": 48.335, + "dW": 1.6, + "dH": 0.0, + "condition_lhs_H0dW": 77.336, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.6, + "p": 1.6 + }, + "max_mos_row_span_saving": 1.6, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -77.336, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/gf180/sW2_sL2/independent/C11_gf180_sW2_sL2_independent.gds", + "gds_mode": "runs/grid/C11/gf180/sW2_sL2/diffusion_only/C11_gf180_sW2_sL2_diffusion_only.gds", + "geometry_hash_ref": "13912040b1c0f64c", + "geometry_hash_mode": "829c4d859c67d26a", + "geometry_identical": false + }, + { + "case": "C11_gf180_sW2_sL2", + "topology": "C11", + "pdk": "gf180", + "size": "sW2_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 6337.685, + "A1": 6279.789, + "rel": -0.00914, + "class": "positive", + "W0": 131.12, + "H0": 48.335, + "W1": 132.22, + "H1": 47.495, + "dW": -1.1, + "dH": -0.84, + "condition_lhs_H0dW": -53.1685, + "condition_rhs_W1dH": -111.0648, + "dH_mos_rows": -0.04, + "dH_channels": -0.8, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.0, + "p": -1.08 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 51.295, + "stub_separation": 0.95, + "taller_mos_rows": -5.245, + "routing_tracks": -104.896, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/gf180/sW2_sL2/independent/C11_gf180_sW2_sL2_independent.gds", + "gds_mode": "runs/grid/C11/gf180/sW2_sL2/gate_only/C11_gf180_sW2_sL2_gate_only.gds", + "geometry_hash_ref": "13912040b1c0f64c", + "geometry_hash_mode": "3392d3afd84d259e", + "geometry_identical": false + }, + { + "case": "C11_gf180_sW2_sL2", + "topology": "C11", + "pdk": "gf180", + "size": "sW2_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 6337.685, + "A1": 6203.797, + "rel": -0.02113, + "class": "positive", + "W0": 131.12, + "H0": 48.335, + "W1": 130.62, + "H1": 47.495, + "dW": 0.5, + "dH": -0.84, + "condition_lhs_H0dW": 24.1675, + "condition_rhs_W1dH": -109.7208, + "dH_mos_rows": -0.04, + "dH_channels": -0.8, + "dH_other": -0.0, + "row_span_saving": { + "n": 1.6, + "p": 0.52 + }, + "max_mos_row_span_saving": 1.6, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -24.697, + "stub_separation": 0.95, + "taller_mos_rows": -5.245, + "routing_tracks": -104.896, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/gf180/sW2_sL2/independent/C11_gf180_sW2_sL2_independent.gds", + "gds_mode": "runs/grid/C11/gf180/sW2_sL2/combined/C11_gf180_sW2_sL2_combined.gds", + "geometry_hash_ref": "13912040b1c0f64c", + "geometry_hash_mode": "8f967790b4663f8e", + "geometry_identical": false + }, + { + "case": "C11_ihp130_sW0.5_sL1.5", + "topology": "C11", + "pdk": "ihp130", + "size": "sW0.5_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2092.797, + "A1": 2092.797, + "rel": 0.0, + "class": "neutral", + "W0": 46.265, + "H0": 45.235, + "W1": 46.265, + "H1": 45.235, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.02, + "p": 1.02 + }, + "max_mos_row_span_saving": 1.02, + "widest_row_ref": "passive", + "widest_row_mode": "passive", + "passive_dominated": true, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/ihp130/sW0.5_sL1.5/independent/C11_ihp130_sW0p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C11/ihp130/sW0.5_sL1.5/diffusion_only/C11_ihp130_sW0p5_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "f55bc7059318a6c9", + "geometry_hash_mode": "4768fc7af3eee7da", + "geometry_identical": false + }, + { + "case": "C11_ihp130_sW0.5_sL1.5", + "topology": "C11", + "pdk": "ihp130", + "size": "sW0.5_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2092.797, + "A1": 2064.576, + "rel": -0.01349, + "class": "positive", + "W0": 46.265, + "H0": 45.235, + "W1": 46.265, + "H1": 44.625, + "dW": 0.0, + "dH": -0.61, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -28.2216, + "dH_mos_rows": -0.02, + "dH_channels": -0.59, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": -0.48 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "passive", + "widest_row_mode": "passive", + "passive_dominated": true, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -0.925, + "routing_tracks": -27.296, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/ihp130/sW0.5_sL1.5/independent/C11_ihp130_sW0p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C11/ihp130/sW0.5_sL1.5/gate_only/C11_ihp130_sW0p5_sL1p5_gate_only.gds", + "geometry_hash_ref": "f55bc7059318a6c9", + "geometry_hash_mode": "c27d28316248de2a", + "geometry_identical": false + }, + { + "case": "C11_ihp130_sW0.5_sL1.5", + "topology": "C11", + "pdk": "ihp130", + "size": "sW0.5_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2092.797, + "A1": 2064.576, + "rel": -0.01349, + "class": "positive", + "W0": 46.265, + "H0": 45.235, + "W1": 46.265, + "H1": 44.625, + "dW": 0.0, + "dH": -0.61, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -28.2216, + "dH_mos_rows": -0.02, + "dH_channels": -0.59, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.02, + "p": 0.54 + }, + "max_mos_row_span_saving": 1.02, + "widest_row_ref": "passive", + "widest_row_mode": "passive", + "passive_dominated": true, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -0.925, + "routing_tracks": -27.296, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/ihp130/sW0.5_sL1.5/independent/C11_ihp130_sW0p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C11/ihp130/sW0.5_sL1.5/combined/C11_ihp130_sW0p5_sL1p5_combined.gds", + "geometry_hash_ref": "f55bc7059318a6c9", + "geometry_hash_mode": "05032d587d3b64e4", + "geometry_identical": false + }, + { + "case": "C11_ihp130_sW0.5_sL1", + "topology": "C11", + "pdk": "ihp130", + "size": "sW0.5_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2092.797, + "A1": 2092.797, + "rel": 0.0, + "class": "neutral", + "W0": 46.265, + "H0": 45.235, + "W1": 46.265, + "H1": 45.235, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.02, + "p": 1.02 + }, + "max_mos_row_span_saving": 1.02, + "widest_row_ref": "passive", + "widest_row_mode": "passive", + "passive_dominated": true, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/ihp130/sW0.5_sL1/independent/C11_ihp130_sW0p5_sL1_independent.gds", + "gds_mode": "runs/grid/C11/ihp130/sW0.5_sL1/diffusion_only/C11_ihp130_sW0p5_sL1_diffusion_only.gds", + "geometry_hash_ref": "fce96aabc7c5f3d5", + "geometry_hash_mode": "058d3eadbfaa719f", + "geometry_identical": false + }, + { + "case": "C11_ihp130_sW0.5_sL1", + "topology": "C11", + "pdk": "ihp130", + "size": "sW0.5_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2092.797, + "A1": 2064.576, + "rel": -0.01349, + "class": "positive", + "W0": 46.265, + "H0": 45.235, + "W1": 46.265, + "H1": 44.625, + "dW": 0.0, + "dH": -0.61, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -28.2216, + "dH_mos_rows": -0.02, + "dH_channels": -0.59, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": -0.48 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "passive", + "widest_row_mode": "passive", + "passive_dominated": true, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -0.925, + "routing_tracks": -27.296, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/ihp130/sW0.5_sL1/independent/C11_ihp130_sW0p5_sL1_independent.gds", + "gds_mode": "runs/grid/C11/ihp130/sW0.5_sL1/gate_only/C11_ihp130_sW0p5_sL1_gate_only.gds", + "geometry_hash_ref": "fce96aabc7c5f3d5", + "geometry_hash_mode": "d0c924d13b1977f9", + "geometry_identical": false + }, + { + "case": "C11_ihp130_sW0.5_sL1", + "topology": "C11", + "pdk": "ihp130", + "size": "sW0.5_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2092.797, + "A1": 2064.576, + "rel": -0.01349, + "class": "positive", + "W0": 46.265, + "H0": 45.235, + "W1": 46.265, + "H1": 44.625, + "dW": 0.0, + "dH": -0.61, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -28.2216, + "dH_mos_rows": -0.02, + "dH_channels": -0.59, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.02, + "p": 0.54 + }, + "max_mos_row_span_saving": 1.02, + "widest_row_ref": "passive", + "widest_row_mode": "passive", + "passive_dominated": true, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -0.925, + "routing_tracks": -27.296, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/ihp130/sW0.5_sL1/independent/C11_ihp130_sW0p5_sL1_independent.gds", + "gds_mode": "runs/grid/C11/ihp130/sW0.5_sL1/combined/C11_ihp130_sW0p5_sL1_combined.gds", + "geometry_hash_ref": "fce96aabc7c5f3d5", + "geometry_hash_mode": "68028827c1d6a8a1", + "geometry_identical": false + }, + { + "case": "C11_ihp130_sW0.5_sL2", + "topology": "C11", + "pdk": "ihp130", + "size": "sW0.5_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2092.797, + "A1": 2092.797, + "rel": 0.0, + "class": "neutral", + "W0": 46.265, + "H0": 45.235, + "W1": 46.265, + "H1": 45.235, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.02, + "p": 1.02 + }, + "max_mos_row_span_saving": 1.02, + "widest_row_ref": "passive", + "widest_row_mode": "passive", + "passive_dominated": true, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/ihp130/sW0.5_sL2/independent/C11_ihp130_sW0p5_sL2_independent.gds", + "gds_mode": "runs/grid/C11/ihp130/sW0.5_sL2/diffusion_only/C11_ihp130_sW0p5_sL2_diffusion_only.gds", + "geometry_hash_ref": "158ff9fdf8d6f22b", + "geometry_hash_mode": "ca009e461db706eb", + "geometry_identical": false + }, + { + "case": "C11_ihp130_sW0.5_sL2", + "topology": "C11", + "pdk": "ihp130", + "size": "sW0.5_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2092.797, + "A1": 2064.576, + "rel": -0.01349, + "class": "positive", + "W0": 46.265, + "H0": 45.235, + "W1": 46.265, + "H1": 44.625, + "dW": 0.0, + "dH": -0.61, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -28.2216, + "dH_mos_rows": -0.02, + "dH_channels": -0.59, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": -0.48 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "passive", + "widest_row_mode": "passive", + "passive_dominated": true, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -0.925, + "routing_tracks": -27.296, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/ihp130/sW0.5_sL2/independent/C11_ihp130_sW0p5_sL2_independent.gds", + "gds_mode": "runs/grid/C11/ihp130/sW0.5_sL2/gate_only/C11_ihp130_sW0p5_sL2_gate_only.gds", + "geometry_hash_ref": "158ff9fdf8d6f22b", + "geometry_hash_mode": "45c829c46b2fd165", + "geometry_identical": false + }, + { + "case": "C11_ihp130_sW0.5_sL2", + "topology": "C11", + "pdk": "ihp130", + "size": "sW0.5_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2092.797, + "A1": 2064.576, + "rel": -0.01349, + "class": "positive", + "W0": 46.265, + "H0": 45.235, + "W1": 46.265, + "H1": 44.625, + "dW": 0.0, + "dH": -0.61, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -28.2216, + "dH_mos_rows": -0.02, + "dH_channels": -0.59, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.02, + "p": 0.54 + }, + "max_mos_row_span_saving": 1.02, + "widest_row_ref": "passive", + "widest_row_mode": "passive", + "passive_dominated": true, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -0.925, + "routing_tracks": -27.296, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/ihp130/sW0.5_sL2/independent/C11_ihp130_sW0p5_sL2_independent.gds", + "gds_mode": "runs/grid/C11/ihp130/sW0.5_sL2/combined/C11_ihp130_sW0p5_sL2_combined.gds", + "geometry_hash_ref": "158ff9fdf8d6f22b", + "geometry_hash_mode": "3406ad1e3a7c316f", + "geometry_identical": false + }, + { + "case": "C11_ihp130_sW1.5_sL1.5", + "topology": "C11", + "pdk": "ihp130", + "size": "sW1.5_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2200.004, + "A1": 2153.865, + "rel": -0.02097, + "class": "positive", + "W0": 48.635, + "H0": 45.235, + "W1": 47.615, + "H1": 45.235, + "dW": 1.02, + "dH": 0.0, + "condition_lhs_H0dW": 46.1397, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.02, + "p": 1.02 + }, + "max_mos_row_span_saving": 1.02, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -46.14, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/ihp130/sW1.5_sL1.5/independent/C11_ihp130_sW1p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C11/ihp130/sW1.5_sL1.5/diffusion_only/C11_ihp130_sW1p5_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "328f1382d0694218", + "geometry_hash_mode": "bc4b0e39b229b3af", + "geometry_identical": false + }, + { + "case": "C11_ihp130_sW1.5_sL1.5", + "topology": "C11", + "pdk": "ihp130", + "size": "sW1.5_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2200.004, + "A1": 2191.757, + "rel": -0.00375, + "class": "neutral", + "W0": 48.635, + "H0": 45.235, + "W1": 49.115, + "H1": 44.625, + "dW": -0.48, + "dH": -0.61, + "condition_lhs_H0dW": -21.7128, + "condition_rhs_W1dH": -29.9601, + "dH_mos_rows": -0.02, + "dH_channels": -0.59, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": -0.48 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 21.42, + "stub_separation": 0.0, + "taller_mos_rows": -0.973, + "routing_tracks": -28.695, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/ihp130/sW1.5_sL1.5/independent/C11_ihp130_sW1p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C11/ihp130/sW1.5_sL1.5/gate_only/C11_ihp130_sW1p5_sL1p5_gate_only.gds", + "geometry_hash_ref": "328f1382d0694218", + "geometry_hash_mode": "338b05ef807fb7e2", + "geometry_identical": false + }, + { + "case": "C11_ihp130_sW1.5_sL1.5", + "topology": "C11", + "pdk": "ihp130", + "size": "sW1.5_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2200.004, + "A1": 2146.239, + "rel": -0.02444, + "class": "positive", + "W0": 48.635, + "H0": 45.235, + "W1": 48.095, + "H1": 44.625, + "dW": 0.54, + "dH": -0.61, + "condition_lhs_H0dW": 24.4269, + "condition_rhs_W1dH": -29.3379, + "dH_mos_rows": -0.02, + "dH_channels": -0.59, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.02, + "p": 0.54 + }, + "max_mos_row_span_saving": 1.02, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -24.098, + "stub_separation": 0.0, + "taller_mos_rows": -0.973, + "routing_tracks": -28.695, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/ihp130/sW1.5_sL1.5/independent/C11_ihp130_sW1p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C11/ihp130/sW1.5_sL1.5/combined/C11_ihp130_sW1p5_sL1p5_combined.gds", + "geometry_hash_ref": "328f1382d0694218", + "geometry_hash_mode": "7ccd42585863680f", + "geometry_identical": false + }, + { + "case": "C11_ihp130_sW1.5_sL1", + "topology": "C11", + "pdk": "ihp130", + "size": "sW1.5_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2092.797, + "A1": 2092.797, + "rel": 0.0, + "class": "neutral", + "W0": 46.265, + "H0": 45.235, + "W1": 46.265, + "H1": 45.235, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.02, + "p": 1.02 + }, + "max_mos_row_span_saving": 1.02, + "widest_row_ref": "passive", + "widest_row_mode": "passive", + "passive_dominated": true, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/ihp130/sW1.5_sL1/independent/C11_ihp130_sW1p5_sL1_independent.gds", + "gds_mode": "runs/grid/C11/ihp130/sW1.5_sL1/diffusion_only/C11_ihp130_sW1p5_sL1_diffusion_only.gds", + "geometry_hash_ref": "b436dcc1af0f77ad", + "geometry_hash_mode": "be66fbed1e727384", + "geometry_identical": false + }, + { + "case": "C11_ihp130_sW1.5_sL1", + "topology": "C11", + "pdk": "ihp130", + "size": "sW1.5_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2092.797, + "A1": 2064.576, + "rel": -0.01349, + "class": "positive", + "W0": 46.265, + "H0": 45.235, + "W1": 46.265, + "H1": 44.625, + "dW": 0.0, + "dH": -0.61, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -28.2216, + "dH_mos_rows": -0.02, + "dH_channels": -0.59, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": -0.48 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "passive", + "widest_row_mode": "passive", + "passive_dominated": true, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -0.925, + "routing_tracks": -27.296, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/ihp130/sW1.5_sL1/independent/C11_ihp130_sW1p5_sL1_independent.gds", + "gds_mode": "runs/grid/C11/ihp130/sW1.5_sL1/gate_only/C11_ihp130_sW1p5_sL1_gate_only.gds", + "geometry_hash_ref": "b436dcc1af0f77ad", + "geometry_hash_mode": "249f6a7aa09ac5f4", + "geometry_identical": false + }, + { + "case": "C11_ihp130_sW1.5_sL1", + "topology": "C11", + "pdk": "ihp130", + "size": "sW1.5_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2092.797, + "A1": 2064.576, + "rel": -0.01349, + "class": "positive", + "W0": 46.265, + "H0": 45.235, + "W1": 46.265, + "H1": 44.625, + "dW": 0.0, + "dH": -0.61, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -28.2216, + "dH_mos_rows": -0.02, + "dH_channels": -0.59, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.02, + "p": 0.54 + }, + "max_mos_row_span_saving": 1.02, + "widest_row_ref": "passive", + "widest_row_mode": "passive", + "passive_dominated": true, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -0.925, + "routing_tracks": -27.296, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/ihp130/sW1.5_sL1/independent/C11_ihp130_sW1p5_sL1_independent.gds", + "gds_mode": "runs/grid/C11/ihp130/sW1.5_sL1/combined/C11_ihp130_sW1p5_sL1_combined.gds", + "geometry_hash_ref": "b436dcc1af0f77ad", + "geometry_hash_mode": "a458674bebd190da", + "geometry_identical": false + }, + { + "case": "C11_ihp130_sW1.5_sL2", + "topology": "C11", + "pdk": "ihp130", + "size": "sW1.5_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2517.554, + "A1": 2471.414, + "rel": -0.01833, + "class": "positive", + "W0": 55.655, + "H0": 45.235, + "W1": 54.635, + "H1": 45.235, + "dW": 1.02, + "dH": 0.0, + "condition_lhs_H0dW": 46.1397, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.02, + "p": 1.02 + }, + "max_mos_row_span_saving": 1.02, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -46.14, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/ihp130/sW1.5_sL2/independent/C11_ihp130_sW1p5_sL2_independent.gds", + "gds_mode": "runs/grid/C11/ihp130/sW1.5_sL2/diffusion_only/C11_ihp130_sW1p5_sL2_diffusion_only.gds", + "geometry_hash_ref": "54e9b2e3ff7e6412", + "geometry_hash_mode": "fcbb34fc5d9b47e6", + "geometry_identical": false + }, + { + "case": "C11_ihp130_sW1.5_sL2", + "topology": "C11", + "pdk": "ihp130", + "size": "sW1.5_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2517.554, + "A1": 2505.024, + "rel": -0.00498, + "class": "neutral", + "W0": 55.655, + "H0": 45.235, + "W1": 56.135, + "H1": 44.625, + "dW": -0.48, + "dH": -0.61, + "condition_lhs_H0dW": -21.7128, + "condition_rhs_W1dH": -34.2423, + "dH_mos_rows": -0.02, + "dH_channels": -0.59, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": -0.48 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 21.42, + "stub_separation": -0.0, + "taller_mos_rows": -1.113, + "routing_tracks": -32.836, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/ihp130/sW1.5_sL2/independent/C11_ihp130_sW1p5_sL2_independent.gds", + "gds_mode": "runs/grid/C11/ihp130/sW1.5_sL2/gate_only/C11_ihp130_sW1p5_sL2_gate_only.gds", + "geometry_hash_ref": "54e9b2e3ff7e6412", + "geometry_hash_mode": "23e9cc1501b7ef1a", + "geometry_identical": false + }, + { + "case": "C11_ihp130_sW1.5_sL2", + "topology": "C11", + "pdk": "ihp130", + "size": "sW1.5_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2517.554, + "A1": 2459.507, + "rel": -0.02306, + "class": "positive", + "W0": 55.655, + "H0": 45.235, + "W1": 55.115, + "H1": 44.625, + "dW": 0.54, + "dH": -0.61, + "condition_lhs_H0dW": 24.4269, + "condition_rhs_W1dH": -33.6201, + "dH_mos_rows": -0.02, + "dH_channels": -0.59, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.02, + "p": 0.54 + }, + "max_mos_row_span_saving": 1.02, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -24.098, + "stub_separation": 0.0, + "taller_mos_rows": -1.113, + "routing_tracks": -32.836, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/ihp130/sW1.5_sL2/independent/C11_ihp130_sW1p5_sL2_independent.gds", + "gds_mode": "runs/grid/C11/ihp130/sW1.5_sL2/combined/C11_ihp130_sW1p5_sL2_combined.gds", + "geometry_hash_ref": "54e9b2e3ff7e6412", + "geometry_hash_mode": "f27d3af0d82c26ad", + "geometry_identical": false + }, + { + "case": "C11_ihp130_sW1_sL1.5", + "topology": "C11", + "pdk": "ihp130", + "size": "sW1_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2092.797, + "A1": 2092.797, + "rel": 0.0, + "class": "neutral", + "W0": 46.265, + "H0": 45.235, + "W1": 46.265, + "H1": 45.235, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.02, + "p": 1.02 + }, + "max_mos_row_span_saving": 1.02, + "widest_row_ref": "passive", + "widest_row_mode": "passive", + "passive_dominated": true, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/ihp130/sW1_sL1.5/independent/C11_ihp130_sW1_sL1p5_independent.gds", + "gds_mode": "runs/grid/C11/ihp130/sW1_sL1.5/diffusion_only/C11_ihp130_sW1_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "e20add4632157828", + "geometry_hash_mode": "f27f564883b70fb5", + "geometry_identical": false + }, + { + "case": "C11_ihp130_sW1_sL1.5", + "topology": "C11", + "pdk": "ihp130", + "size": "sW1_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2092.797, + "A1": 2064.576, + "rel": -0.01349, + "class": "positive", + "W0": 46.265, + "H0": 45.235, + "W1": 46.265, + "H1": 44.625, + "dW": 0.0, + "dH": -0.61, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -28.2216, + "dH_mos_rows": -0.02, + "dH_channels": -0.59, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": -0.48 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "passive", + "widest_row_mode": "passive", + "passive_dominated": true, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -0.925, + "routing_tracks": -27.296, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/ihp130/sW1_sL1.5/independent/C11_ihp130_sW1_sL1p5_independent.gds", + "gds_mode": "runs/grid/C11/ihp130/sW1_sL1.5/gate_only/C11_ihp130_sW1_sL1p5_gate_only.gds", + "geometry_hash_ref": "e20add4632157828", + "geometry_hash_mode": "ad8d57560790f06e", + "geometry_identical": false + }, + { + "case": "C11_ihp130_sW1_sL1.5", + "topology": "C11", + "pdk": "ihp130", + "size": "sW1_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2092.797, + "A1": 2064.576, + "rel": -0.01349, + "class": "positive", + "W0": 46.265, + "H0": 45.235, + "W1": 46.265, + "H1": 44.625, + "dW": 0.0, + "dH": -0.61, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -28.2216, + "dH_mos_rows": -0.02, + "dH_channels": -0.59, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.02, + "p": 0.54 + }, + "max_mos_row_span_saving": 1.02, + "widest_row_ref": "passive", + "widest_row_mode": "passive", + "passive_dominated": true, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -0.925, + "routing_tracks": -27.296, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/ihp130/sW1_sL1.5/independent/C11_ihp130_sW1_sL1p5_independent.gds", + "gds_mode": "runs/grid/C11/ihp130/sW1_sL1.5/combined/C11_ihp130_sW1_sL1p5_combined.gds", + "geometry_hash_ref": "e20add4632157828", + "geometry_hash_mode": "d04449c49a11aadc", + "geometry_identical": false + }, + { + "case": "C11_ihp130_sW1_sL1", + "topology": "C11", + "pdk": "ihp130", + "size": "sW1_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2092.797, + "A1": 2092.797, + "rel": 0.0, + "class": "neutral", + "W0": 46.265, + "H0": 45.235, + "W1": 46.265, + "H1": 45.235, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.02, + "p": 1.02 + }, + "max_mos_row_span_saving": 1.02, + "widest_row_ref": "passive", + "widest_row_mode": "passive", + "passive_dominated": true, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/ihp130/sW1_sL1/independent/C11_ihp130_sW1_sL1_independent.gds", + "gds_mode": "runs/grid/C11/ihp130/sW1_sL1/diffusion_only/C11_ihp130_sW1_sL1_diffusion_only.gds", + "geometry_hash_ref": "45f8091108fbbac8", + "geometry_hash_mode": "e0032d3da4f1ddc7", + "geometry_identical": false + }, + { + "case": "C11_ihp130_sW1_sL1", + "topology": "C11", + "pdk": "ihp130", + "size": "sW1_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2092.797, + "A1": 2064.576, + "rel": -0.01349, + "class": "positive", + "W0": 46.265, + "H0": 45.235, + "W1": 46.265, + "H1": 44.625, + "dW": 0.0, + "dH": -0.61, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -28.2216, + "dH_mos_rows": -0.02, + "dH_channels": -0.59, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": -0.48 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "passive", + "widest_row_mode": "passive", + "passive_dominated": true, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -0.925, + "routing_tracks": -27.296, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/ihp130/sW1_sL1/independent/C11_ihp130_sW1_sL1_independent.gds", + "gds_mode": "runs/grid/C11/ihp130/sW1_sL1/gate_only/C11_ihp130_sW1_sL1_gate_only.gds", + "geometry_hash_ref": "45f8091108fbbac8", + "geometry_hash_mode": "9c9997cf43b9e67f", + "geometry_identical": false + }, + { + "case": "C11_ihp130_sW1_sL1", + "topology": "C11", + "pdk": "ihp130", + "size": "sW1_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2092.797, + "A1": 2064.576, + "rel": -0.01349, + "class": "positive", + "W0": 46.265, + "H0": 45.235, + "W1": 46.265, + "H1": 44.625, + "dW": 0.0, + "dH": -0.61, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -28.2216, + "dH_mos_rows": -0.02, + "dH_channels": -0.59, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.02, + "p": 0.54 + }, + "max_mos_row_span_saving": 1.02, + "widest_row_ref": "passive", + "widest_row_mode": "passive", + "passive_dominated": true, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -0.925, + "routing_tracks": -27.296, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/ihp130/sW1_sL1/independent/C11_ihp130_sW1_sL1_independent.gds", + "gds_mode": "runs/grid/C11/ihp130/sW1_sL1/combined/C11_ihp130_sW1_sL1_combined.gds", + "geometry_hash_ref": "45f8091108fbbac8", + "geometry_hash_mode": "116834701c006e60", + "geometry_identical": false + }, + { + "case": "C11_ihp130_sW1_sL2", + "topology": "C11", + "pdk": "ihp130", + "size": "sW1_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2092.797, + "A1": 2092.797, + "rel": 0.0, + "class": "neutral", + "W0": 46.265, + "H0": 45.235, + "W1": 46.265, + "H1": 45.235, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.02, + "p": 1.02 + }, + "max_mos_row_span_saving": 1.02, + "widest_row_ref": "passive", + "widest_row_mode": "passive", + "passive_dominated": true, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/ihp130/sW1_sL2/independent/C11_ihp130_sW1_sL2_independent.gds", + "gds_mode": "runs/grid/C11/ihp130/sW1_sL2/diffusion_only/C11_ihp130_sW1_sL2_diffusion_only.gds", + "geometry_hash_ref": "f283c537e3b62531", + "geometry_hash_mode": "2fca3bec90293f50", + "geometry_identical": false + }, + { + "case": "C11_ihp130_sW1_sL2", + "topology": "C11", + "pdk": "ihp130", + "size": "sW1_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2092.797, + "A1": 2064.576, + "rel": -0.01349, + "class": "positive", + "W0": 46.265, + "H0": 45.235, + "W1": 46.265, + "H1": 44.625, + "dW": 0.0, + "dH": -0.61, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -28.2216, + "dH_mos_rows": -0.02, + "dH_channels": -0.59, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": -0.48 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "passive", + "widest_row_mode": "passive", + "passive_dominated": true, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -0.925, + "routing_tracks": -27.296, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/ihp130/sW1_sL2/independent/C11_ihp130_sW1_sL2_independent.gds", + "gds_mode": "runs/grid/C11/ihp130/sW1_sL2/gate_only/C11_ihp130_sW1_sL2_gate_only.gds", + "geometry_hash_ref": "f283c537e3b62531", + "geometry_hash_mode": "7b85072ee4cf8fe2", + "geometry_identical": false + }, + { + "case": "C11_ihp130_sW1_sL2", + "topology": "C11", + "pdk": "ihp130", + "size": "sW1_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2092.797, + "A1": 2064.576, + "rel": -0.01349, + "class": "positive", + "W0": 46.265, + "H0": 45.235, + "W1": 46.265, + "H1": 44.625, + "dW": 0.0, + "dH": -0.61, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -28.2216, + "dH_mos_rows": -0.02, + "dH_channels": -0.59, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.02, + "p": 0.54 + }, + "max_mos_row_span_saving": 1.02, + "widest_row_ref": "passive", + "widest_row_mode": "passive", + "passive_dominated": true, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": -0.925, + "routing_tracks": -27.296, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/ihp130/sW1_sL2/independent/C11_ihp130_sW1_sL2_independent.gds", + "gds_mode": "runs/grid/C11/ihp130/sW1_sL2/combined/C11_ihp130_sW1_sL2_combined.gds", + "geometry_hash_ref": "f283c537e3b62531", + "geometry_hash_mode": "99c29c33ecca7a3e", + "geometry_identical": false + }, + { + "case": "C11_ihp130_sW2_sL1.5", + "topology": "C11", + "pdk": "ihp130", + "size": "sW2_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2826.961, + "A1": 2780.822, + "rel": -0.01632, + "class": "positive", + "W0": 62.495, + "H0": 45.235, + "W1": 61.475, + "H1": 45.235, + "dW": 1.02, + "dH": 0.0, + "condition_lhs_H0dW": 46.1397, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.02, + "p": 1.02 + }, + "max_mos_row_span_saving": 1.02, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -46.14, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/ihp130/sW2_sL1.5/independent/C11_ihp130_sW2_sL1p5_independent.gds", + "gds_mode": "runs/grid/C11/ihp130/sW2_sL1.5/diffusion_only/C11_ihp130_sW2_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "06a55b524ab1c29c", + "geometry_hash_mode": "090d9df71fc5e69e", + "geometry_identical": false + }, + { + "case": "C11_ihp130_sW2_sL1.5", + "topology": "C11", + "pdk": "ihp130", + "size": "sW2_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2826.961, + "A1": 2810.259, + "rel": -0.00591, + "class": "positive", + "W0": 62.495, + "H0": 45.235, + "W1": 62.975, + "H1": 44.625, + "dW": -0.48, + "dH": -0.61, + "condition_lhs_H0dW": -21.7128, + "condition_rhs_W1dH": -38.4147, + "dH_mos_rows": -0.02, + "dH_channels": -0.59, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": -0.48 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 21.42, + "stub_separation": 0.0, + "taller_mos_rows": -1.25, + "routing_tracks": -36.872, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/ihp130/sW2_sL1.5/independent/C11_ihp130_sW2_sL1p5_independent.gds", + "gds_mode": "runs/grid/C11/ihp130/sW2_sL1.5/gate_only/C11_ihp130_sW2_sL1p5_gate_only.gds", + "geometry_hash_ref": "06a55b524ab1c29c", + "geometry_hash_mode": "7aae943deb4e7687", + "geometry_identical": false + }, + { + "case": "C11_ihp130_sW2_sL1.5", + "topology": "C11", + "pdk": "ihp130", + "size": "sW2_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2826.961, + "A1": 2764.742, + "rel": -0.02201, + "class": "positive", + "W0": 62.495, + "H0": 45.235, + "W1": 61.955, + "H1": 44.625, + "dW": 0.54, + "dH": -0.61, + "condition_lhs_H0dW": 24.4269, + "condition_rhs_W1dH": -37.7925, + "dH_mos_rows": -0.02, + "dH_channels": -0.59, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.02, + "p": 0.54 + }, + "max_mos_row_span_saving": 1.02, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -24.098, + "stub_separation": 0.0, + "taller_mos_rows": -1.25, + "routing_tracks": -36.872, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/ihp130/sW2_sL1.5/independent/C11_ihp130_sW2_sL1p5_independent.gds", + "gds_mode": "runs/grid/C11/ihp130/sW2_sL1.5/combined/C11_ihp130_sW2_sL1p5_combined.gds", + "geometry_hash_ref": "06a55b524ab1c29c", + "geometry_hash_mode": "7e02720aa54abe75", + "geometry_identical": false + }, + { + "case": "C11_ihp130_sW2_sL1", + "topology": "C11", + "pdk": "ihp130", + "size": "sW2_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2403.562, + "A1": 2357.422, + "rel": -0.0192, + "class": "positive", + "W0": 53.135, + "H0": 45.235, + "W1": 52.115, + "H1": 45.235, + "dW": 1.02, + "dH": 0.0, + "condition_lhs_H0dW": 46.1397, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.02, + "p": 1.02 + }, + "max_mos_row_span_saving": 1.02, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -46.14, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/ihp130/sW2_sL1/independent/C11_ihp130_sW2_sL1_independent.gds", + "gds_mode": "runs/grid/C11/ihp130/sW2_sL1/diffusion_only/C11_ihp130_sW2_sL1_diffusion_only.gds", + "geometry_hash_ref": "81d320caa9da9a21", + "geometry_hash_mode": "a7d057f2c8d4580f", + "geometry_identical": false + }, + { + "case": "C11_ihp130_sW2_sL1", + "topology": "C11", + "pdk": "ihp130", + "size": "sW2_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2403.562, + "A1": 2392.569, + "rel": -0.00457, + "class": "neutral", + "W0": 53.135, + "H0": 45.235, + "W1": 53.615, + "H1": 44.625, + "dW": -0.48, + "dH": -0.61, + "condition_lhs_H0dW": -21.7128, + "condition_rhs_W1dH": -32.7051, + "dH_mos_rows": -0.02, + "dH_channels": -0.59, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": -0.48 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 21.42, + "stub_separation": 0.0, + "taller_mos_rows": -1.063, + "routing_tracks": -31.35, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/ihp130/sW2_sL1/independent/C11_ihp130_sW2_sL1_independent.gds", + "gds_mode": "runs/grid/C11/ihp130/sW2_sL1/gate_only/C11_ihp130_sW2_sL1_gate_only.gds", + "geometry_hash_ref": "81d320caa9da9a21", + "geometry_hash_mode": "5f1aeb5fc8866b17", + "geometry_identical": false + }, + { + "case": "C11_ihp130_sW2_sL1", + "topology": "C11", + "pdk": "ihp130", + "size": "sW2_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2403.562, + "A1": 2347.052, + "rel": -0.02351, + "class": "positive", + "W0": 53.135, + "H0": 45.235, + "W1": 52.595, + "H1": 44.625, + "dW": 0.54, + "dH": -0.61, + "condition_lhs_H0dW": 24.4269, + "condition_rhs_W1dH": -32.0829, + "dH_mos_rows": -0.02, + "dH_channels": -0.59, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.02, + "p": 0.54 + }, + "max_mos_row_span_saving": 1.02, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -24.098, + "stub_separation": 0.0, + "taller_mos_rows": -1.063, + "routing_tracks": -31.35, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/ihp130/sW2_sL1/independent/C11_ihp130_sW2_sL1_independent.gds", + "gds_mode": "runs/grid/C11/ihp130/sW2_sL1/combined/C11_ihp130_sW2_sL1_combined.gds", + "geometry_hash_ref": "81d320caa9da9a21", + "geometry_hash_mode": "51c507dea41e1b46", + "geometry_identical": false + }, + { + "case": "C11_ihp130_sW2_sL2", + "topology": "C11", + "pdk": "ihp130", + "size": "sW2_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 3250.361, + "A1": 3204.221, + "rel": -0.0142, + "class": "positive", + "W0": 71.855, + "H0": 45.235, + "W1": 70.835, + "H1": 45.235, + "dW": 1.02, + "dH": 0.0, + "condition_lhs_H0dW": 46.1397, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.02, + "p": 1.02 + }, + "max_mos_row_span_saving": 1.02, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -46.14, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/ihp130/sW2_sL2/independent/C11_ihp130_sW2_sL2_independent.gds", + "gds_mode": "runs/grid/C11/ihp130/sW2_sL2/diffusion_only/C11_ihp130_sW2_sL2_diffusion_only.gds", + "geometry_hash_ref": "a338d4e194a8d642", + "geometry_hash_mode": "4d4ce13e2ed1442f", + "geometry_identical": false + }, + { + "case": "C11_ihp130_sW2_sL2", + "topology": "C11", + "pdk": "ihp130", + "size": "sW2_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 3250.361, + "A1": 3227.949, + "rel": -0.0069, + "class": "positive", + "W0": 71.855, + "H0": 45.235, + "W1": 72.335, + "H1": 44.625, + "dW": -0.48, + "dH": -0.61, + "condition_lhs_H0dW": -21.7128, + "condition_rhs_W1dH": -44.1243, + "dH_mos_rows": -0.02, + "dH_channels": -0.59, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": -0.48 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 21.42, + "stub_separation": -0.0, + "taller_mos_rows": -1.437, + "routing_tracks": -42.394, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/ihp130/sW2_sL2/independent/C11_ihp130_sW2_sL2_independent.gds", + "gds_mode": "runs/grid/C11/ihp130/sW2_sL2/gate_only/C11_ihp130_sW2_sL2_gate_only.gds", + "geometry_hash_ref": "a338d4e194a8d642", + "geometry_hash_mode": "a142dab827235e50", + "geometry_identical": false + }, + { + "case": "C11_ihp130_sW2_sL2", + "topology": "C11", + "pdk": "ihp130", + "size": "sW2_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 3250.361, + "A1": 3182.432, + "rel": -0.0209, + "class": "positive", + "W0": 71.855, + "H0": 45.235, + "W1": 71.315, + "H1": 44.625, + "dW": 0.54, + "dH": -0.61, + "condition_lhs_H0dW": 24.4269, + "condition_rhs_W1dH": -43.5021, + "dH_mos_rows": -0.02, + "dH_channels": -0.59, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.02, + "p": 0.54 + }, + "max_mos_row_span_saving": 1.02, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -24.098, + "stub_separation": -0.0, + "taller_mos_rows": -1.437, + "routing_tracks": -42.394, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/ihp130/sW2_sL2/independent/C11_ihp130_sW2_sL2_independent.gds", + "gds_mode": "runs/grid/C11/ihp130/sW2_sL2/combined/C11_ihp130_sW2_sL2_combined.gds", + "geometry_hash_ref": "a338d4e194a8d642", + "geometry_hash_mode": "d1eb06889cc473a1", + "geometry_identical": false + }, + { + "case": "C11_sky130_sW0.5_sL1.5", + "topology": "C11", + "pdk": "sky130", + "size": "sW0.5_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1446.921, + "A1": 1446.921, + "rel": 0.0, + "class": "neutral", + "W0": 34.74, + "H0": 41.65, + "W1": 34.74, + "H1": 41.65, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.12, + "p": 1.12 + }, + "max_mos_row_span_saving": 1.12, + "widest_row_ref": "passive", + "widest_row_mode": "passive", + "passive_dominated": true, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/sky130/sW0.5_sL1.5/independent/C11_sky130_sW0p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C11/sky130/sW0.5_sL1.5/diffusion_only/C11_sky130_sW0p5_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "a3c823db469c19c0", + "geometry_hash_mode": "0922259a212621b5", + "geometry_identical": false + }, + { + "case": "C11_sky130_sW0.5_sL1.5", + "topology": "C11", + "pdk": "sky130", + "size": "sW0.5_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1446.921, + "A1": 1426.772, + "rel": -0.01393, + "class": "positive", + "W0": 34.74, + "H0": 41.65, + "W1": 34.74, + "H1": 41.07, + "dW": 0.0, + "dH": -0.58, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -20.1492, + "dH_mos_rows": 0.03, + "dH_channels": -0.61, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": -0.88 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "passive", + "widest_row_mode": "passive", + "passive_dominated": true, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 1.042, + "routing_tracks": -21.191, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/sky130/sW0.5_sL1.5/independent/C11_sky130_sW0p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C11/sky130/sW0.5_sL1.5/gate_only/C11_sky130_sW0p5_sL1p5_gate_only.gds", + "geometry_hash_ref": "a3c823db469c19c0", + "geometry_hash_mode": "c51764b1ac91f2b0", + "geometry_identical": false + }, + { + "case": "C11_sky130_sW0.5_sL1.5", + "topology": "C11", + "pdk": "sky130", + "size": "sW0.5_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1446.921, + "A1": 1426.772, + "rel": -0.01393, + "class": "positive", + "W0": 34.74, + "H0": 41.65, + "W1": 34.74, + "H1": 41.07, + "dW": 0.0, + "dH": -0.58, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -20.1492, + "dH_mos_rows": 0.03, + "dH_channels": -0.61, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.12, + "p": 0.24 + }, + "max_mos_row_span_saving": 1.12, + "widest_row_ref": "passive", + "widest_row_mode": "passive", + "passive_dominated": true, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 1.042, + "routing_tracks": -21.191, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/sky130/sW0.5_sL1.5/independent/C11_sky130_sW0p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C11/sky130/sW0.5_sL1.5/combined/C11_sky130_sW0p5_sL1p5_combined.gds", + "geometry_hash_ref": "a3c823db469c19c0", + "geometry_hash_mode": "94e3ae229fa01018", + "geometry_identical": false + }, + { + "case": "C11_sky130_sW0.5_sL1", + "topology": "C11", + "pdk": "sky130", + "size": "sW0.5_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1446.921, + "A1": 1446.921, + "rel": 0.0, + "class": "neutral", + "W0": 34.74, + "H0": 41.65, + "W1": 34.74, + "H1": 41.65, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.12, + "p": 1.12 + }, + "max_mos_row_span_saving": 1.12, + "widest_row_ref": "passive", + "widest_row_mode": "passive", + "passive_dominated": true, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/sky130/sW0.5_sL1/independent/C11_sky130_sW0p5_sL1_independent.gds", + "gds_mode": "runs/grid/C11/sky130/sW0.5_sL1/diffusion_only/C11_sky130_sW0p5_sL1_diffusion_only.gds", + "geometry_hash_ref": "dd1791ccf0f5f0a2", + "geometry_hash_mode": "06fa99721ff00887", + "geometry_identical": false + }, + { + "case": "C11_sky130_sW0.5_sL1", + "topology": "C11", + "pdk": "sky130", + "size": "sW0.5_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1446.921, + "A1": 1426.772, + "rel": -0.01393, + "class": "positive", + "W0": 34.74, + "H0": 41.65, + "W1": 34.74, + "H1": 41.07, + "dW": 0.0, + "dH": -0.58, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -20.1492, + "dH_mos_rows": 0.03, + "dH_channels": -0.61, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": -0.88 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "passive", + "widest_row_mode": "passive", + "passive_dominated": true, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 1.042, + "routing_tracks": -21.191, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/sky130/sW0.5_sL1/independent/C11_sky130_sW0p5_sL1_independent.gds", + "gds_mode": "runs/grid/C11/sky130/sW0.5_sL1/gate_only/C11_sky130_sW0p5_sL1_gate_only.gds", + "geometry_hash_ref": "dd1791ccf0f5f0a2", + "geometry_hash_mode": "e4a8d4a3001ba4e4", + "geometry_identical": false + }, + { + "case": "C11_sky130_sW0.5_sL1", + "topology": "C11", + "pdk": "sky130", + "size": "sW0.5_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1446.921, + "A1": 1426.772, + "rel": -0.01393, + "class": "positive", + "W0": 34.74, + "H0": 41.65, + "W1": 34.74, + "H1": 41.07, + "dW": 0.0, + "dH": -0.58, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -20.1492, + "dH_mos_rows": 0.03, + "dH_channels": -0.61, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.12, + "p": 0.24 + }, + "max_mos_row_span_saving": 1.12, + "widest_row_ref": "passive", + "widest_row_mode": "passive", + "passive_dominated": true, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 1.042, + "routing_tracks": -21.191, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/sky130/sW0.5_sL1/independent/C11_sky130_sW0p5_sL1_independent.gds", + "gds_mode": "runs/grid/C11/sky130/sW0.5_sL1/combined/C11_sky130_sW0p5_sL1_combined.gds", + "geometry_hash_ref": "dd1791ccf0f5f0a2", + "geometry_hash_mode": "9372b73f3175caa6", + "geometry_identical": false + }, + { + "case": "C11_sky130_sW0.5_sL2", + "topology": "C11", + "pdk": "sky130", + "size": "sW0.5_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1446.921, + "A1": 1446.921, + "rel": 0.0, + "class": "neutral", + "W0": 34.74, + "H0": 41.65, + "W1": 34.74, + "H1": 41.65, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.12, + "p": 1.12 + }, + "max_mos_row_span_saving": 1.12, + "widest_row_ref": "passive", + "widest_row_mode": "passive", + "passive_dominated": true, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/sky130/sW0.5_sL2/independent/C11_sky130_sW0p5_sL2_independent.gds", + "gds_mode": "runs/grid/C11/sky130/sW0.5_sL2/diffusion_only/C11_sky130_sW0p5_sL2_diffusion_only.gds", + "geometry_hash_ref": "300ae29b60346444", + "geometry_hash_mode": "659b23a0b6e19b93", + "geometry_identical": false + }, + { + "case": "C11_sky130_sW0.5_sL2", + "topology": "C11", + "pdk": "sky130", + "size": "sW0.5_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1446.921, + "A1": 1426.772, + "rel": -0.01393, + "class": "positive", + "W0": 34.74, + "H0": 41.65, + "W1": 34.74, + "H1": 41.07, + "dW": 0.0, + "dH": -0.58, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -20.1492, + "dH_mos_rows": 0.03, + "dH_channels": -0.61, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": -0.88 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "passive", + "widest_row_mode": "passive", + "passive_dominated": true, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 1.042, + "routing_tracks": -21.191, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/sky130/sW0.5_sL2/independent/C11_sky130_sW0p5_sL2_independent.gds", + "gds_mode": "runs/grid/C11/sky130/sW0.5_sL2/gate_only/C11_sky130_sW0p5_sL2_gate_only.gds", + "geometry_hash_ref": "300ae29b60346444", + "geometry_hash_mode": "6030a35e0c906331", + "geometry_identical": false + }, + { + "case": "C11_sky130_sW0.5_sL2", + "topology": "C11", + "pdk": "sky130", + "size": "sW0.5_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1446.921, + "A1": 1426.772, + "rel": -0.01393, + "class": "positive", + "W0": 34.74, + "H0": 41.65, + "W1": 34.74, + "H1": 41.07, + "dW": 0.0, + "dH": -0.58, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -20.1492, + "dH_mos_rows": 0.03, + "dH_channels": -0.61, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.12, + "p": 0.24 + }, + "max_mos_row_span_saving": 1.12, + "widest_row_ref": "passive", + "widest_row_mode": "passive", + "passive_dominated": true, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 1.042, + "routing_tracks": -21.191, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/sky130/sW0.5_sL2/independent/C11_sky130_sW0p5_sL2_independent.gds", + "gds_mode": "runs/grid/C11/sky130/sW0.5_sL2/combined/C11_sky130_sW0p5_sL2_combined.gds", + "geometry_hash_ref": "300ae29b60346444", + "geometry_hash_mode": "506efcbfc97f4d7e", + "geometry_identical": false + }, + { + "case": "C11_sky130_sW1.5_sL1.5", + "topology": "C11", + "pdk": "sky130", + "size": "sW1.5_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1973.585, + "A1": 1926.937, + "rel": -0.02364, + "class": "positive", + "W0": 47.385, + "H0": 41.65, + "W1": 46.265, + "H1": 41.65, + "dW": 1.12, + "dH": 0.0, + "condition_lhs_H0dW": 46.648, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.12, + "p": 1.12 + }, + "max_mos_row_span_saving": 1.12, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -46.648, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/sky130/sW1.5_sL1.5/independent/C11_sky130_sW1p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C11/sky130/sW1.5_sL1.5/diffusion_only/C11_sky130_sW1p5_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "31c2eae0cd7325a1", + "geometry_hash_mode": "b75e9741f25cc2a4", + "geometry_identical": false + }, + { + "case": "C11_sky130_sW1.5_sL1.5", + "topology": "C11", + "pdk": "sky130", + "size": "sW1.5_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1973.585, + "A1": 1982.244, + "rel": 0.00439, + "class": "neutral", + "W0": 47.385, + "H0": 41.65, + "W1": 48.265, + "H1": 41.07, + "dW": -0.88, + "dH": -0.58, + "condition_lhs_H0dW": -36.652, + "condition_rhs_W1dH": -27.9937, + "dH_mos_rows": 0.03, + "dH_channels": -0.61, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": -0.88 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 36.142, + "stub_separation": 0.0, + "taller_mos_rows": 1.422, + "routing_tracks": -28.905, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/sky130/sW1.5_sL1.5/independent/C11_sky130_sW1p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C11/sky130/sW1.5_sL1.5/gate_only/C11_sky130_sW1p5_sL1p5_gate_only.gds", + "geometry_hash_ref": "31c2eae0cd7325a1", + "geometry_hash_mode": "2ed23405d54f27d1", + "geometry_identical": false + }, + { + "case": "C11_sky130_sW1.5_sL1.5", + "topology": "C11", + "pdk": "sky130", + "size": "sW1.5_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1973.585, + "A1": 1936.245, + "rel": -0.01892, + "class": "positive", + "W0": 47.385, + "H0": 41.65, + "W1": 47.145, + "H1": 41.07, + "dW": 0.24, + "dH": -0.58, + "condition_lhs_H0dW": 9.996, + "condition_rhs_W1dH": -27.3441, + "dH_mos_rows": 0.03, + "dH_channels": -0.61, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.12, + "p": 0.24 + }, + "max_mos_row_span_saving": 1.12, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -9.857, + "stub_separation": 0.0, + "taller_mos_rows": 1.422, + "routing_tracks": -28.905, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/sky130/sW1.5_sL1.5/independent/C11_sky130_sW1p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C11/sky130/sW1.5_sL1.5/combined/C11_sky130_sW1p5_sL1p5_combined.gds", + "geometry_hash_ref": "31c2eae0cd7325a1", + "geometry_hash_mode": "9750f704ac9184d1", + "geometry_identical": false + }, + { + "case": "C11_sky130_sW1.5_sL1", + "topology": "C11", + "pdk": "sky130", + "size": "sW1.5_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1636.22, + "A1": 1589.572, + "rel": -0.02851, + "class": "positive", + "W0": 39.285, + "H0": 41.65, + "W1": 38.165, + "H1": 41.65, + "dW": 1.12, + "dH": 0.0, + "condition_lhs_H0dW": 46.648, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.12, + "p": 1.12 + }, + "max_mos_row_span_saving": 1.12, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -46.648, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/sky130/sW1.5_sL1/independent/C11_sky130_sW1p5_sL1_independent.gds", + "gds_mode": "runs/grid/C11/sky130/sW1.5_sL1/diffusion_only/C11_sky130_sW1p5_sL1_diffusion_only.gds", + "geometry_hash_ref": "529197c93d331cbf", + "geometry_hash_mode": "8fc474338a7426c9", + "geometry_identical": false + }, + { + "case": "C11_sky130_sW1.5_sL1", + "topology": "C11", + "pdk": "sky130", + "size": "sW1.5_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1636.22, + "A1": 1649.577, + "rel": 0.00816, + "class": "negative", + "W0": 39.285, + "H0": 41.65, + "W1": 40.165, + "H1": 41.07, + "dW": -0.88, + "dH": -0.58, + "condition_lhs_H0dW": -36.652, + "condition_rhs_W1dH": -23.2957, + "dH_mos_rows": 0.03, + "dH_channels": -0.61, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": -0.88 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 36.142, + "stub_separation": 0.0, + "taller_mos_rows": 1.179, + "routing_tracks": -23.964, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/sky130/sW1.5_sL1/independent/C11_sky130_sW1p5_sL1_independent.gds", + "gds_mode": "runs/grid/C11/sky130/sW1.5_sL1/gate_only/C11_sky130_sW1p5_sL1_gate_only.gds", + "geometry_hash_ref": "529197c93d331cbf", + "geometry_hash_mode": "c642bd0f3d049917", + "geometry_identical": false, + "increase_terms": [ + "wider_row", + "taller_mos_rows" + ], + "primary_mechanism": "wider_row" + }, + { + "case": "C11_sky130_sW1.5_sL1", + "topology": "C11", + "pdk": "sky130", + "size": "sW1.5_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1636.22, + "A1": 1603.578, + "rel": -0.01995, + "class": "positive", + "W0": 39.285, + "H0": 41.65, + "W1": 39.045, + "H1": 41.07, + "dW": 0.24, + "dH": -0.58, + "condition_lhs_H0dW": 9.996, + "condition_rhs_W1dH": -22.6461, + "dH_mos_rows": 0.03, + "dH_channels": -0.61, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.12, + "p": 0.24 + }, + "max_mos_row_span_saving": 1.12, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -9.857, + "stub_separation": 0.0, + "taller_mos_rows": 1.179, + "routing_tracks": -23.964, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/sky130/sW1.5_sL1/independent/C11_sky130_sW1p5_sL1_independent.gds", + "gds_mode": "runs/grid/C11/sky130/sW1.5_sL1/combined/C11_sky130_sW1p5_sL1_combined.gds", + "geometry_hash_ref": "529197c93d331cbf", + "geometry_hash_mode": "2940896fae888481", + "geometry_identical": false + }, + { + "case": "C11_sky130_sW1.5_sL2", + "topology": "C11", + "pdk": "sky130", + "size": "sW1.5_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2310.95, + "A1": 2264.302, + "rel": -0.02019, + "class": "positive", + "W0": 55.485, + "H0": 41.65, + "W1": 54.365, + "H1": 41.65, + "dW": 1.12, + "dH": 0.0, + "condition_lhs_H0dW": 46.648, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.12, + "p": 1.12 + }, + "max_mos_row_span_saving": 1.12, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -46.648, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/sky130/sW1.5_sL2/independent/C11_sky130_sW1p5_sL2_independent.gds", + "gds_mode": "runs/grid/C11/sky130/sW1.5_sL2/diffusion_only/C11_sky130_sW1p5_sL2_diffusion_only.gds", + "geometry_hash_ref": "a796e3dca69268e7", + "geometry_hash_mode": "c76571c9cad8c6f8", + "geometry_identical": false + }, + { + "case": "C11_sky130_sW1.5_sL2", + "topology": "C11", + "pdk": "sky130", + "size": "sW1.5_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2310.95, + "A1": 2314.911, + "rel": 0.00171, + "class": "neutral", + "W0": 55.485, + "H0": 41.65, + "W1": 56.365, + "H1": 41.07, + "dW": -0.88, + "dH": -0.58, + "condition_lhs_H0dW": -36.652, + "condition_rhs_W1dH": -32.6917, + "dH_mos_rows": 0.03, + "dH_channels": -0.61, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": -0.88 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 36.142, + "stub_separation": 0.0, + "taller_mos_rows": 1.665, + "routing_tracks": -33.846, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/sky130/sW1.5_sL2/independent/C11_sky130_sW1p5_sL2_independent.gds", + "gds_mode": "runs/grid/C11/sky130/sW1.5_sL2/gate_only/C11_sky130_sW1p5_sL2_gate_only.gds", + "geometry_hash_ref": "a796e3dca69268e7", + "geometry_hash_mode": "3d70d8f467f4f333", + "geometry_identical": false + }, + { + "case": "C11_sky130_sW1.5_sL2", + "topology": "C11", + "pdk": "sky130", + "size": "sW1.5_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2310.95, + "A1": 2268.912, + "rel": -0.01819, + "class": "positive", + "W0": 55.485, + "H0": 41.65, + "W1": 55.245, + "H1": 41.07, + "dW": 0.24, + "dH": -0.58, + "condition_lhs_H0dW": 9.996, + "condition_rhs_W1dH": -32.0421, + "dH_mos_rows": 0.03, + "dH_channels": -0.61, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.12, + "p": 0.24 + }, + "max_mos_row_span_saving": 1.12, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -9.857, + "stub_separation": -0.0, + "taller_mos_rows": 1.665, + "routing_tracks": -33.846, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/sky130/sW1.5_sL2/independent/C11_sky130_sW1p5_sL2_independent.gds", + "gds_mode": "runs/grid/C11/sky130/sW1.5_sL2/combined/C11_sky130_sW1p5_sL2_combined.gds", + "geometry_hash_ref": "a796e3dca69268e7", + "geometry_hash_mode": "1e810a5fc634f3f3", + "geometry_identical": false + }, + { + "case": "C11_sky130_sW1_sL1.5", + "topology": "C11", + "pdk": "sky130", + "size": "sW1_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1449.42, + "A1": 1446.921, + "rel": -0.00172, + "class": "neutral", + "W0": 34.8, + "H0": 41.65, + "W1": 34.74, + "H1": 41.65, + "dW": 0.06, + "dH": 0.0, + "condition_lhs_H0dW": 2.499, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.12, + "p": 1.12 + }, + "max_mos_row_span_saving": 1.12, + "widest_row_ref": "passive", + "widest_row_mode": "passive", + "passive_dominated": true, + "area_terms": { + "wider_row": 0.0, + "stub_separation": -2.499, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/sky130/sW1_sL1.5/independent/C11_sky130_sW1_sL1p5_independent.gds", + "gds_mode": "runs/grid/C11/sky130/sW1_sL1.5/diffusion_only/C11_sky130_sW1_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "bcc57bffeda905f7", + "geometry_hash_mode": "ac6cb894d565e1d9", + "geometry_identical": false + }, + { + "case": "C11_sky130_sW1_sL1.5", + "topology": "C11", + "pdk": "sky130", + "size": "sW1_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1449.42, + "A1": 1447.512, + "rel": -0.00132, + "class": "neutral", + "W0": 34.8, + "H0": 41.65, + "W1": 35.245, + "H1": 41.07, + "dW": -0.445, + "dH": -0.58, + "condition_lhs_H0dW": -18.5343, + "condition_rhs_W1dH": -20.4421, + "dH_mos_rows": 0.03, + "dH_channels": -0.61, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": -0.88 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "passive", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 5.955, + "stub_separation": 12.321, + "taller_mos_rows": 1.044, + "routing_tracks": -21.228, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/sky130/sW1_sL1.5/independent/C11_sky130_sW1_sL1p5_independent.gds", + "gds_mode": "runs/grid/C11/sky130/sW1_sL1.5/gate_only/C11_sky130_sW1_sL1p5_gate_only.gds", + "geometry_hash_ref": "bcc57bffeda905f7", + "geometry_hash_mode": "6c403574620cdbe1", + "geometry_identical": false + }, + { + "case": "C11_sky130_sW1_sL1.5", + "topology": "C11", + "pdk": "sky130", + "size": "sW1_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1449.42, + "A1": 1426.772, + "rel": -0.01563, + "class": "positive", + "W0": 34.8, + "H0": 41.65, + "W1": 34.74, + "H1": 41.07, + "dW": 0.06, + "dH": -0.58, + "condition_lhs_H0dW": 2.499, + "condition_rhs_W1dH": -20.1492, + "dH_mos_rows": 0.03, + "dH_channels": -0.61, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.12, + "p": 0.24 + }, + "max_mos_row_span_saving": 1.12, + "widest_row_ref": "passive", + "widest_row_mode": "passive", + "passive_dominated": true, + "area_terms": { + "wider_row": 0.0, + "stub_separation": -2.464, + "taller_mos_rows": 1.044, + "routing_tracks": -21.228, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/sky130/sW1_sL1.5/independent/C11_sky130_sW1_sL1p5_independent.gds", + "gds_mode": "runs/grid/C11/sky130/sW1_sL1.5/combined/C11_sky130_sW1_sL1p5_combined.gds", + "geometry_hash_ref": "bcc57bffeda905f7", + "geometry_hash_mode": "33ca0459f0ba1b89", + "geometry_identical": false + }, + { + "case": "C11_sky130_sW1_sL1", + "topology": "C11", + "pdk": "sky130", + "size": "sW1_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1446.921, + "A1": 1446.921, + "rel": 0.0, + "class": "neutral", + "W0": 34.74, + "H0": 41.65, + "W1": 34.74, + "H1": 41.65, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.12, + "p": 1.12 + }, + "max_mos_row_span_saving": 1.12, + "widest_row_ref": "passive", + "widest_row_mode": "passive", + "passive_dominated": true, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/sky130/sW1_sL1/independent/C11_sky130_sW1_sL1_independent.gds", + "gds_mode": "runs/grid/C11/sky130/sW1_sL1/diffusion_only/C11_sky130_sW1_sL1_diffusion_only.gds", + "geometry_hash_ref": "24dc98a229f1c957", + "geometry_hash_mode": "e6087cb655cf8d1b", + "geometry_identical": false + }, + { + "case": "C11_sky130_sW1_sL1", + "topology": "C11", + "pdk": "sky130", + "size": "sW1_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1446.921, + "A1": 1426.772, + "rel": -0.01393, + "class": "positive", + "W0": 34.74, + "H0": 41.65, + "W1": 34.74, + "H1": 41.07, + "dW": 0.0, + "dH": -0.58, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -20.1492, + "dH_mos_rows": 0.03, + "dH_channels": -0.61, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": -0.88 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "passive", + "widest_row_mode": "passive", + "passive_dominated": true, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 1.042, + "routing_tracks": -21.191, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/sky130/sW1_sL1/independent/C11_sky130_sW1_sL1_independent.gds", + "gds_mode": "runs/grid/C11/sky130/sW1_sL1/gate_only/C11_sky130_sW1_sL1_gate_only.gds", + "geometry_hash_ref": "24dc98a229f1c957", + "geometry_hash_mode": "7ea7800412049152", + "geometry_identical": false + }, + { + "case": "C11_sky130_sW1_sL1", + "topology": "C11", + "pdk": "sky130", + "size": "sW1_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1446.921, + "A1": 1426.772, + "rel": -0.01393, + "class": "positive", + "W0": 34.74, + "H0": 41.65, + "W1": 34.74, + "H1": 41.07, + "dW": 0.0, + "dH": -0.58, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": -20.1492, + "dH_mos_rows": 0.03, + "dH_channels": -0.61, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.12, + "p": 0.24 + }, + "max_mos_row_span_saving": 1.12, + "widest_row_ref": "passive", + "widest_row_mode": "passive", + "passive_dominated": true, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 1.042, + "routing_tracks": -21.191, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/sky130/sW1_sL1/independent/C11_sky130_sW1_sL1_independent.gds", + "gds_mode": "runs/grid/C11/sky130/sW1_sL1/combined/C11_sky130_sW1_sL1_combined.gds", + "geometry_hash_ref": "24dc98a229f1c957", + "geometry_hash_mode": "555212f012941696", + "geometry_identical": false + }, + { + "case": "C11_sky130_sW1_sL2", + "topology": "C11", + "pdk": "sky130", + "size": "sW1_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1643.717, + "A1": 1597.069, + "rel": -0.02838, + "class": "positive", + "W0": 39.465, + "H0": 41.65, + "W1": 38.345, + "H1": 41.65, + "dW": 1.12, + "dH": 0.0, + "condition_lhs_H0dW": 46.648, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.12, + "p": 1.12 + }, + "max_mos_row_span_saving": 1.12, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -46.648, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/sky130/sW1_sL2/independent/C11_sky130_sW1_sL2_independent.gds", + "gds_mode": "runs/grid/C11/sky130/sW1_sL2/diffusion_only/C11_sky130_sW1_sL2_diffusion_only.gds", + "geometry_hash_ref": "95e70af277560f00", + "geometry_hash_mode": "aa32360fd7cb9d1a", + "geometry_identical": false + }, + { + "case": "C11_sky130_sW1_sL2", + "topology": "C11", + "pdk": "sky130", + "size": "sW1_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1643.717, + "A1": 1656.969, + "rel": 0.00806, + "class": "negative", + "W0": 39.465, + "H0": 41.65, + "W1": 40.345, + "H1": 41.07, + "dW": -0.88, + "dH": -0.58, + "condition_lhs_H0dW": -36.652, + "condition_rhs_W1dH": -23.4001, + "dH_mos_rows": 0.03, + "dH_channels": -0.61, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": -0.88 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 36.142, + "stub_separation": -0.0, + "taller_mos_rows": 1.184, + "routing_tracks": -24.074, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/sky130/sW1_sL2/independent/C11_sky130_sW1_sL2_independent.gds", + "gds_mode": "runs/grid/C11/sky130/sW1_sL2/gate_only/C11_sky130_sW1_sL2_gate_only.gds", + "geometry_hash_ref": "95e70af277560f00", + "geometry_hash_mode": "cbe9ffc419b94333", + "geometry_identical": false, + "increase_terms": [ + "wider_row", + "taller_mos_rows" + ], + "primary_mechanism": "wider_row" + }, + { + "case": "C11_sky130_sW1_sL2", + "topology": "C11", + "pdk": "sky130", + "size": "sW1_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1643.717, + "A1": 1610.971, + "rel": -0.01992, + "class": "positive", + "W0": 39.465, + "H0": 41.65, + "W1": 39.225, + "H1": 41.07, + "dW": 0.24, + "dH": -0.58, + "condition_lhs_H0dW": 9.996, + "condition_rhs_W1dH": -22.7505, + "dH_mos_rows": 0.03, + "dH_channels": -0.61, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.12, + "p": 0.24 + }, + "max_mos_row_span_saving": 1.12, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -9.857, + "stub_separation": -0.0, + "taller_mos_rows": 1.184, + "routing_tracks": -24.074, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/sky130/sW1_sL2/independent/C11_sky130_sW1_sL2_independent.gds", + "gds_mode": "runs/grid/C11/sky130/sW1_sL2/combined/C11_sky130_sW1_sL2_combined.gds", + "geometry_hash_ref": "95e70af277560f00", + "geometry_hash_mode": "adebea20f9a1dc96", + "geometry_identical": false + }, + { + "case": "C11_sky130_sW2_sL1.5", + "topology": "C11", + "pdk": "sky130", + "size": "sW2_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2528.363, + "A1": 2481.715, + "rel": -0.01845, + "class": "positive", + "W0": 60.705, + "H0": 41.65, + "W1": 59.585, + "H1": 41.65, + "dW": 1.12, + "dH": 0.0, + "condition_lhs_H0dW": 46.648, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.12, + "p": 1.12 + }, + "max_mos_row_span_saving": 1.12, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -46.648, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/sky130/sW2_sL1.5/independent/C11_sky130_sW2_sL1p5_independent.gds", + "gds_mode": "runs/grid/C11/sky130/sW2_sL1.5/diffusion_only/C11_sky130_sW2_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "9c9b3238e4785e90", + "geometry_hash_mode": "ba5216a6c8fa169e", + "geometry_identical": false + }, + { + "case": "C11_sky130_sW2_sL1.5", + "topology": "C11", + "pdk": "sky130", + "size": "sW2_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2528.363, + "A1": 2529.296, + "rel": 0.00037, + "class": "neutral", + "W0": 60.705, + "H0": 41.65, + "W1": 61.585, + "H1": 41.07, + "dW": -0.88, + "dH": -0.58, + "condition_lhs_H0dW": -36.652, + "condition_rhs_W1dH": -35.7193, + "dH_mos_rows": 0.03, + "dH_channels": -0.61, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": -0.88 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 36.142, + "stub_separation": 0.0, + "taller_mos_rows": 1.821, + "routing_tracks": -37.03, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/sky130/sW2_sL1.5/independent/C11_sky130_sW2_sL1p5_independent.gds", + "gds_mode": "runs/grid/C11/sky130/sW2_sL1.5/gate_only/C11_sky130_sW2_sL1p5_gate_only.gds", + "geometry_hash_ref": "9c9b3238e4785e90", + "geometry_hash_mode": "4293151c04861754", + "geometry_identical": false + }, + { + "case": "C11_sky130_sW2_sL1.5", + "topology": "C11", + "pdk": "sky130", + "size": "sW2_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2528.363, + "A1": 2483.298, + "rel": -0.01782, + "class": "positive", + "W0": 60.705, + "H0": 41.65, + "W1": 60.465, + "H1": 41.07, + "dW": 0.24, + "dH": -0.58, + "condition_lhs_H0dW": 9.996, + "condition_rhs_W1dH": -35.0697, + "dH_mos_rows": 0.03, + "dH_channels": -0.61, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.12, + "p": 0.24 + }, + "max_mos_row_span_saving": 1.12, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -9.857, + "stub_separation": 0.0, + "taller_mos_rows": 1.821, + "routing_tracks": -37.03, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/sky130/sW2_sL1.5/independent/C11_sky130_sW2_sL1p5_independent.gds", + "gds_mode": "runs/grid/C11/sky130/sW2_sL1.5/combined/C11_sky130_sW2_sL1p5_combined.gds", + "geometry_hash_ref": "9c9b3238e4785e90", + "geometry_hash_mode": "ca302c3112fb54ad", + "geometry_identical": false + }, + { + "case": "C11_sky130_sW2_sL1", + "topology": "C11", + "pdk": "sky130", + "size": "sW2_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2078.543, + "A1": 2031.895, + "rel": -0.02244, + "class": "positive", + "W0": 49.905, + "H0": 41.65, + "W1": 48.785, + "H1": 41.65, + "dW": 1.12, + "dH": 0.0, + "condition_lhs_H0dW": 46.648, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.12, + "p": 1.12 + }, + "max_mos_row_span_saving": 1.12, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -46.648, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/sky130/sW2_sL1/independent/C11_sky130_sW2_sL1_independent.gds", + "gds_mode": "runs/grid/C11/sky130/sW2_sL1/diffusion_only/C11_sky130_sW2_sL1_diffusion_only.gds", + "geometry_hash_ref": "fbda62909f84d326", + "geometry_hash_mode": "2c55ea46ca5c9c0f", + "geometry_identical": false + }, + { + "case": "C11_sky130_sW2_sL1", + "topology": "C11", + "pdk": "sky130", + "size": "sW2_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2078.543, + "A1": 2085.74, + "rel": 0.00346, + "class": "neutral", + "W0": 49.905, + "H0": 41.65, + "W1": 50.785, + "H1": 41.07, + "dW": -0.88, + "dH": -0.58, + "condition_lhs_H0dW": -36.652, + "condition_rhs_W1dH": -29.4553, + "dH_mos_rows": 0.03, + "dH_channels": -0.61, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": -0.88 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 36.142, + "stub_separation": -0.0, + "taller_mos_rows": 1.497, + "routing_tracks": -30.442, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/sky130/sW2_sL1/independent/C11_sky130_sW2_sL1_independent.gds", + "gds_mode": "runs/grid/C11/sky130/sW2_sL1/gate_only/C11_sky130_sW2_sL1_gate_only.gds", + "geometry_hash_ref": "fbda62909f84d326", + "geometry_hash_mode": "285e48d80ef8af3e", + "geometry_identical": false + }, + { + "case": "C11_sky130_sW2_sL1", + "topology": "C11", + "pdk": "sky130", + "size": "sW2_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2078.543, + "A1": 2039.742, + "rel": -0.01867, + "class": "positive", + "W0": 49.905, + "H0": 41.65, + "W1": 49.665, + "H1": 41.07, + "dW": 0.24, + "dH": -0.58, + "condition_lhs_H0dW": 9.996, + "condition_rhs_W1dH": -28.8057, + "dH_mos_rows": 0.03, + "dH_channels": -0.61, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.12, + "p": 0.24 + }, + "max_mos_row_span_saving": 1.12, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -9.857, + "stub_separation": -0.0, + "taller_mos_rows": 1.497, + "routing_tracks": -30.442, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/sky130/sW2_sL1/independent/C11_sky130_sW2_sL1_independent.gds", + "gds_mode": "runs/grid/C11/sky130/sW2_sL1/combined/C11_sky130_sW2_sL1_combined.gds", + "geometry_hash_ref": "fbda62909f84d326", + "geometry_hash_mode": "eef0f55667d7761f", + "geometry_identical": false + }, + { + "case": "C11_sky130_sW2_sL2", + "topology": "C11", + "pdk": "sky130", + "size": "sW2_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2978.183, + "A1": 2931.535, + "rel": -0.01566, + "class": "positive", + "W0": 71.505, + "H0": 41.65, + "W1": 70.385, + "H1": 41.65, + "dW": 1.12, + "dH": 0.0, + "condition_lhs_H0dW": 46.648, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.12, + "p": 1.12 + }, + "max_mos_row_span_saving": 1.12, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -46.648, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/sky130/sW2_sL2/independent/C11_sky130_sW2_sL2_independent.gds", + "gds_mode": "runs/grid/C11/sky130/sW2_sL2/diffusion_only/C11_sky130_sW2_sL2_diffusion_only.gds", + "geometry_hash_ref": "097ff670e47e90df", + "geometry_hash_mode": "83bcffb1bff4b1e8", + "geometry_identical": false + }, + { + "case": "C11_sky130_sW2_sL2", + "topology": "C11", + "pdk": "sky130", + "size": "sW2_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2978.183, + "A1": 2972.852, + "rel": -0.00179, + "class": "neutral", + "W0": 71.505, + "H0": 41.65, + "W1": 72.385, + "H1": 41.07, + "dW": -0.88, + "dH": -0.58, + "condition_lhs_H0dW": -36.652, + "condition_rhs_W1dH": -41.9833, + "dH_mos_rows": 0.03, + "dH_channels": -0.61, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0, + "p": -0.88 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": 36.142, + "stub_separation": 0.0, + "taller_mos_rows": 2.145, + "routing_tracks": -43.618, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/sky130/sW2_sL2/independent/C11_sky130_sW2_sL2_independent.gds", + "gds_mode": "runs/grid/C11/sky130/sW2_sL2/gate_only/C11_sky130_sW2_sL2_gate_only.gds", + "geometry_hash_ref": "097ff670e47e90df", + "geometry_hash_mode": "24fa210e67112797", + "geometry_identical": false + }, + { + "case": "C11_sky130_sW2_sL2", + "topology": "C11", + "pdk": "sky130", + "size": "sW2_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 2978.183, + "A1": 2926.854, + "rel": -0.01724, + "class": "positive", + "W0": 71.505, + "H0": 41.65, + "W1": 71.265, + "H1": 41.07, + "dW": 0.24, + "dH": -0.58, + "condition_lhs_H0dW": 9.996, + "condition_rhs_W1dH": -41.3337, + "dH_mos_rows": 0.03, + "dH_channels": -0.61, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.12, + "p": 0.24 + }, + "max_mos_row_span_saving": 1.12, + "widest_row_ref": "p", + "widest_row_mode": "p", + "passive_dominated": false, + "area_terms": { + "wider_row": -9.857, + "stub_separation": 0.0, + "taller_mos_rows": 2.145, + "routing_tracks": -43.618, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C11/sky130/sW2_sL2/independent/C11_sky130_sW2_sL2_independent.gds", + "gds_mode": "runs/grid/C11/sky130/sW2_sL2/combined/C11_sky130_sW2_sL2_combined.gds", + "geometry_hash_ref": "097ff670e47e90df", + "geometry_hash_mode": "f28ae2d827e14456", + "geometry_identical": false + }, + { + "case": "C13_gf180_sW1.5_sL1.5", + "topology": "C13", + "pdk": "gf180", + "size": "sW1.5_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 383.84, + "A1": 374.232, + "rel": -0.02503, + "class": "positive", + "W0": 31.96, + "H0": 12.01, + "W1": 31.16, + "H1": 12.01, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 9.608, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -9.608, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C13/gf180/sW1.5_sL1.5/independent/C13_gf180_sW1p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C13/gf180/sW1.5_sL1.5/diffusion_only/C13_gf180_sW1p5_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "26069cd25ec2ce07", + "geometry_hash_mode": "ce8224191de4e4eb", + "geometry_identical": false + }, + { + "case": "C13_gf180_sW1.5_sL1.5", + "topology": "C13", + "pdk": "gf180", + "size": "sW1.5_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 383.84, + "A1": 331.01, + "rel": -0.13763, + "class": "positive", + "W0": 31.96, + "H0": 12.01, + "W1": 31.92, + "H1": 10.37, + "dW": 0.04, + "dH": -1.64, + "condition_lhs_H0dW": 0.4804, + "condition_rhs_W1dH": -52.3488, + "dH_mos_rows": -0.04, + "dH_channels": -1.6, + "dH_other": -0.0, + "row_span_saving": { + "n": -0.74 + }, + "max_mos_row_span_saving": -0.74, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 7.674, + "stub_separation": -8.089, + "taller_mos_rows": -1.278, + "routing_tracks": -51.136, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C13/gf180/sW1.5_sL1.5/independent/C13_gf180_sW1p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C13/gf180/sW1.5_sL1.5/gate_only/C13_gf180_sW1p5_sL1p5_gate_only.gds", + "geometry_hash_ref": "26069cd25ec2ce07", + "geometry_hash_mode": "e8da86cd23ccbdd2", + "geometry_identical": false + }, + { + "case": "C13_gf180_sW1.5_sL1.5", + "topology": "C13", + "pdk": "gf180", + "size": "sW1.5_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 383.84, + "A1": 322.714, + "rel": -0.15925, + "class": "positive", + "W0": 31.96, + "H0": 12.01, + "W1": 31.12, + "H1": 10.37, + "dW": 0.84, + "dH": -1.64, + "condition_lhs_H0dW": 10.0884, + "condition_rhs_W1dH": -51.0368, + "dH_mos_rows": -0.04, + "dH_channels": -1.6, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.06 + }, + "max_mos_row_span_saving": 0.06, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -0.622, + "stub_separation": -8.089, + "taller_mos_rows": -1.278, + "routing_tracks": -51.136, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C13/gf180/sW1.5_sL1.5/independent/C13_gf180_sW1p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C13/gf180/sW1.5_sL1.5/combined/C13_gf180_sW1p5_sL1p5_combined.gds", + "geometry_hash_ref": "26069cd25ec2ce07", + "geometry_hash_mode": "2d37f92f3a1bde56", + "geometry_identical": false + }, + { + "case": "C13_gf180_sW1.5_sL1", + "topology": "C13", + "pdk": "gf180", + "size": "sW1.5_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 326.672, + "A1": 317.064, + "rel": -0.02941, + "class": "positive", + "W0": 27.2, + "H0": 12.01, + "W1": 26.4, + "H1": 12.01, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 9.608, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -9.608, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C13/gf180/sW1.5_sL1/independent/C13_gf180_sW1p5_sL1_independent.gds", + "gds_mode": "runs/grid/C13/gf180/sW1.5_sL1/diffusion_only/C13_gf180_sW1p5_sL1_diffusion_only.gds", + "geometry_hash_ref": "53fb1ca9bc56c5c3", + "geometry_hash_mode": "60c88d4092f900fe", + "geometry_identical": false + }, + { + "case": "C13_gf180_sW1.5_sL1", + "topology": "C13", + "pdk": "gf180", + "size": "sW1.5_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 326.672, + "A1": 281.649, + "rel": -0.13782, + "class": "positive", + "W0": 27.2, + "H0": 12.01, + "W1": 27.16, + "H1": 10.37, + "dW": 0.04, + "dH": -1.64, + "condition_lhs_H0dW": 0.4804, + "condition_rhs_W1dH": -44.5424, + "dH_mos_rows": -0.04, + "dH_channels": -1.6, + "dH_other": -0.0, + "row_span_saving": { + "n": -0.74 + }, + "max_mos_row_span_saving": -0.74, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 7.674, + "stub_separation": -8.089, + "taller_mos_rows": -1.088, + "routing_tracks": -43.52, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C13/gf180/sW1.5_sL1/independent/C13_gf180_sW1p5_sL1_independent.gds", + "gds_mode": "runs/grid/C13/gf180/sW1.5_sL1/gate_only/C13_gf180_sW1p5_sL1_gate_only.gds", + "geometry_hash_ref": "53fb1ca9bc56c5c3", + "geometry_hash_mode": "571c5b62b3e39cff", + "geometry_identical": false + }, + { + "case": "C13_gf180_sW1.5_sL1", + "topology": "C13", + "pdk": "gf180", + "size": "sW1.5_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 326.672, + "A1": 273.353, + "rel": -0.16322, + "class": "positive", + "W0": 27.2, + "H0": 12.01, + "W1": 26.36, + "H1": 10.37, + "dW": 0.84, + "dH": -1.64, + "condition_lhs_H0dW": 10.0884, + "condition_rhs_W1dH": -43.2304, + "dH_mos_rows": -0.04, + "dH_channels": -1.6, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.06 + }, + "max_mos_row_span_saving": 0.06, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -0.622, + "stub_separation": -8.089, + "taller_mos_rows": -1.088, + "routing_tracks": -43.52, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C13/gf180/sW1.5_sL1/independent/C13_gf180_sW1p5_sL1_independent.gds", + "gds_mode": "runs/grid/C13/gf180/sW1.5_sL1/combined/C13_gf180_sW1p5_sL1_combined.gds", + "geometry_hash_ref": "53fb1ca9bc56c5c3", + "geometry_hash_mode": "0d7743a3f4095f2e", + "geometry_identical": false + }, + { + "case": "C13_gf180_sW1.5_sL2", + "topology": "C13", + "pdk": "gf180", + "size": "sW1.5_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 441.007, + "A1": 431.399, + "rel": -0.02179, + "class": "positive", + "W0": 36.72, + "H0": 12.01, + "W1": 35.92, + "H1": 12.01, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 9.608, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -9.608, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C13/gf180/sW1.5_sL2/independent/C13_gf180_sW1p5_sL2_independent.gds", + "gds_mode": "runs/grid/C13/gf180/sW1.5_sL2/diffusion_only/C13_gf180_sW1p5_sL2_diffusion_only.gds", + "geometry_hash_ref": "38cc38a46d209e60", + "geometry_hash_mode": "d8fa9e05a58e736d", + "geometry_identical": false + }, + { + "case": "C13_gf180_sW1.5_sL2", + "topology": "C13", + "pdk": "gf180", + "size": "sW1.5_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 441.007, + "A1": 380.372, + "rel": -0.13749, + "class": "positive", + "W0": 36.72, + "H0": 12.01, + "W1": 36.68, + "H1": 10.37, + "dW": 0.04, + "dH": -1.64, + "condition_lhs_H0dW": 0.4804, + "condition_rhs_W1dH": -60.1552, + "dH_mos_rows": -0.04, + "dH_channels": -1.6, + "dH_other": -0.0, + "row_span_saving": { + "n": -0.74 + }, + "max_mos_row_span_saving": -0.74, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 7.674, + "stub_separation": -8.089, + "taller_mos_rows": -1.469, + "routing_tracks": -58.752, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C13/gf180/sW1.5_sL2/independent/C13_gf180_sW1p5_sL2_independent.gds", + "gds_mode": "runs/grid/C13/gf180/sW1.5_sL2/gate_only/C13_gf180_sW1p5_sL2_gate_only.gds", + "geometry_hash_ref": "38cc38a46d209e60", + "geometry_hash_mode": "3f06873bdb3bd485", + "geometry_identical": false + }, + { + "case": "C13_gf180_sW1.5_sL2", + "topology": "C13", + "pdk": "gf180", + "size": "sW1.5_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 441.007, + "A1": 372.076, + "rel": -0.1563, + "class": "positive", + "W0": 36.72, + "H0": 12.01, + "W1": 35.88, + "H1": 10.37, + "dW": 0.84, + "dH": -1.64, + "condition_lhs_H0dW": 10.0884, + "condition_rhs_W1dH": -58.8432, + "dH_mos_rows": -0.04, + "dH_channels": -1.6, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.06 + }, + "max_mos_row_span_saving": 0.06, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -0.622, + "stub_separation": -8.089, + "taller_mos_rows": -1.469, + "routing_tracks": -58.752, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C13/gf180/sW1.5_sL2/independent/C13_gf180_sW1p5_sL2_independent.gds", + "gds_mode": "runs/grid/C13/gf180/sW1.5_sL2/combined/C13_gf180_sW1p5_sL2_combined.gds", + "geometry_hash_ref": "38cc38a46d209e60", + "geometry_hash_mode": "da0547c452a4bd19", + "geometry_identical": false + }, + { + "case": "C13_gf180_sW1_sL1.5", + "topology": "C13", + "pdk": "gf180", + "size": "sW1_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 375.85, + "A1": 366.442, + "rel": -0.02503, + "class": "positive", + "W0": 31.96, + "H0": 11.76, + "W1": 31.16, + "H1": 11.76, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 9.408, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -9.408, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C13/gf180/sW1_sL1.5/independent/C13_gf180_sW1_sL1p5_independent.gds", + "gds_mode": "runs/grid/C13/gf180/sW1_sL1.5/diffusion_only/C13_gf180_sW1_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "d560bb8437cbfacc", + "geometry_hash_mode": "ca5e1af579e6feb1", + "geometry_identical": false + }, + { + "case": "C13_gf180_sW1_sL1.5", + "topology": "C13", + "pdk": "gf180", + "size": "sW1_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 375.85, + "A1": 323.03, + "rel": -0.14053, + "class": "positive", + "W0": 31.96, + "H0": 11.76, + "W1": 31.92, + "H1": 10.12, + "dW": 0.04, + "dH": -1.64, + "condition_lhs_H0dW": 0.4704, + "condition_rhs_W1dH": -52.3488, + "dH_mos_rows": -0.04, + "dH_channels": -1.6, + "dH_other": -0.0, + "row_span_saving": { + "n": -0.74 + }, + "max_mos_row_span_saving": -0.74, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 7.489, + "stub_separation": -7.894, + "taller_mos_rows": -1.278, + "routing_tracks": -51.136, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C13/gf180/sW1_sL1.5/independent/C13_gf180_sW1_sL1p5_independent.gds", + "gds_mode": "runs/grid/C13/gf180/sW1_sL1.5/gate_only/C13_gf180_sW1_sL1p5_gate_only.gds", + "geometry_hash_ref": "d560bb8437cbfacc", + "geometry_hash_mode": "93886237de249661", + "geometry_identical": false + }, + { + "case": "C13_gf180_sW1_sL1.5", + "topology": "C13", + "pdk": "gf180", + "size": "sW1_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 375.85, + "A1": 314.934, + "rel": -0.16207, + "class": "positive", + "W0": 31.96, + "H0": 11.76, + "W1": 31.12, + "H1": 10.12, + "dW": 0.84, + "dH": -1.64, + "condition_lhs_H0dW": 9.8784, + "condition_rhs_W1dH": -51.0368, + "dH_mos_rows": -0.04, + "dH_channels": -1.6, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.06 + }, + "max_mos_row_span_saving": 0.06, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -0.607, + "stub_separation": -7.894, + "taller_mos_rows": -1.278, + "routing_tracks": -51.136, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C13/gf180/sW1_sL1.5/independent/C13_gf180_sW1_sL1p5_independent.gds", + "gds_mode": "runs/grid/C13/gf180/sW1_sL1.5/combined/C13_gf180_sW1_sL1p5_combined.gds", + "geometry_hash_ref": "d560bb8437cbfacc", + "geometry_hash_mode": "fdc4509f4028b828", + "geometry_identical": false + }, + { + "case": "C13_gf180_sW1_sL1", + "topology": "C13", + "pdk": "gf180", + "size": "sW1_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 319.872, + "A1": 310.464, + "rel": -0.02941, + "class": "positive", + "W0": 27.2, + "H0": 11.76, + "W1": 26.4, + "H1": 11.76, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 9.408, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -9.408, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C13/gf180/sW1_sL1/independent/C13_gf180_sW1_sL1_independent.gds", + "gds_mode": "runs/grid/C13/gf180/sW1_sL1/diffusion_only/C13_gf180_sW1_sL1_diffusion_only.gds", + "geometry_hash_ref": "df0b0321da44f772", + "geometry_hash_mode": "a0e013ec415bed00", + "geometry_identical": false + }, + { + "case": "C13_gf180_sW1_sL1", + "topology": "C13", + "pdk": "gf180", + "size": "sW1_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 319.872, + "A1": 274.859, + "rel": -0.14072, + "class": "positive", + "W0": 27.2, + "H0": 11.76, + "W1": 27.16, + "H1": 10.12, + "dW": 0.04, + "dH": -1.64, + "condition_lhs_H0dW": 0.4704, + "condition_rhs_W1dH": -44.5424, + "dH_mos_rows": -0.04, + "dH_channels": -1.6, + "dH_other": -0.0, + "row_span_saving": { + "n": -0.74 + }, + "max_mos_row_span_saving": -0.74, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 7.489, + "stub_separation": -7.894, + "taller_mos_rows": -1.088, + "routing_tracks": -43.52, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C13/gf180/sW1_sL1/independent/C13_gf180_sW1_sL1_independent.gds", + "gds_mode": "runs/grid/C13/gf180/sW1_sL1/gate_only/C13_gf180_sW1_sL1_gate_only.gds", + "geometry_hash_ref": "df0b0321da44f772", + "geometry_hash_mode": "51eabe8cd0eacc5b", + "geometry_identical": false + }, + { + "case": "C13_gf180_sW1_sL1", + "topology": "C13", + "pdk": "gf180", + "size": "sW1_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 319.872, + "A1": 266.763, + "rel": -0.16603, + "class": "positive", + "W0": 27.2, + "H0": 11.76, + "W1": 26.36, + "H1": 10.12, + "dW": 0.84, + "dH": -1.64, + "condition_lhs_H0dW": 9.8784, + "condition_rhs_W1dH": -43.2304, + "dH_mos_rows": -0.04, + "dH_channels": -1.6, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.06 + }, + "max_mos_row_span_saving": 0.06, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -0.607, + "stub_separation": -7.894, + "taller_mos_rows": -1.088, + "routing_tracks": -43.52, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C13/gf180/sW1_sL1/independent/C13_gf180_sW1_sL1_independent.gds", + "gds_mode": "runs/grid/C13/gf180/sW1_sL1/combined/C13_gf180_sW1_sL1_combined.gds", + "geometry_hash_ref": "df0b0321da44f772", + "geometry_hash_mode": "cbf90298ad8fb430", + "geometry_identical": false + }, + { + "case": "C13_gf180_sW1_sL2", + "topology": "C13", + "pdk": "gf180", + "size": "sW1_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 431.827, + "A1": 422.419, + "rel": -0.02179, + "class": "positive", + "W0": 36.72, + "H0": 11.76, + "W1": 35.92, + "H1": 11.76, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 9.408, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -9.408, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C13/gf180/sW1_sL2/independent/C13_gf180_sW1_sL2_independent.gds", + "gds_mode": "runs/grid/C13/gf180/sW1_sL2/diffusion_only/C13_gf180_sW1_sL2_diffusion_only.gds", + "geometry_hash_ref": "58c7a306e2a86234", + "geometry_hash_mode": "572d8ebb3fd5e15b", + "geometry_identical": false + }, + { + "case": "C13_gf180_sW1_sL2", + "topology": "C13", + "pdk": "gf180", + "size": "sW1_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 431.827, + "A1": 371.202, + "rel": -0.14039, + "class": "positive", + "W0": 36.72, + "H0": 11.76, + "W1": 36.68, + "H1": 10.12, + "dW": 0.04, + "dH": -1.64, + "condition_lhs_H0dW": 0.4704, + "condition_rhs_W1dH": -60.1552, + "dH_mos_rows": -0.04, + "dH_channels": -1.6, + "dH_other": -0.0, + "row_span_saving": { + "n": -0.74 + }, + "max_mos_row_span_saving": -0.74, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 7.489, + "stub_separation": -7.894, + "taller_mos_rows": -1.469, + "routing_tracks": -58.752, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C13/gf180/sW1_sL2/independent/C13_gf180_sW1_sL2_independent.gds", + "gds_mode": "runs/grid/C13/gf180/sW1_sL2/gate_only/C13_gf180_sW1_sL2_gate_only.gds", + "geometry_hash_ref": "58c7a306e2a86234", + "geometry_hash_mode": "e039140a46ec3991", + "geometry_identical": false + }, + { + "case": "C13_gf180_sW1_sL2", + "topology": "C13", + "pdk": "gf180", + "size": "sW1_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 431.827, + "A1": 363.106, + "rel": -0.15914, + "class": "positive", + "W0": 36.72, + "H0": 11.76, + "W1": 35.88, + "H1": 10.12, + "dW": 0.84, + "dH": -1.64, + "condition_lhs_H0dW": 9.8784, + "condition_rhs_W1dH": -58.8432, + "dH_mos_rows": -0.04, + "dH_channels": -1.6, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.06 + }, + "max_mos_row_span_saving": 0.06, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -0.607, + "stub_separation": -7.894, + "taller_mos_rows": -1.469, + "routing_tracks": -58.752, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C13/gf180/sW1_sL2/independent/C13_gf180_sW1_sL2_independent.gds", + "gds_mode": "runs/grid/C13/gf180/sW1_sL2/combined/C13_gf180_sW1_sL2_combined.gds", + "geometry_hash_ref": "58c7a306e2a86234", + "geometry_hash_mode": "1abfb6c4d3db91ac", + "geometry_identical": false + }, + { + "case": "C13_gf180_sW2_sL1.5", + "topology": "C13", + "pdk": "gf180", + "size": "sW2_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 655.738, + "A1": 646.33, + "rel": -0.01435, + "class": "positive", + "W0": 55.76, + "H0": 11.76, + "W1": 54.96, + "H1": 11.76, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 9.408, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -9.408, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C13/gf180/sW2_sL1.5/independent/C13_gf180_sW2_sL1p5_independent.gds", + "gds_mode": "runs/grid/C13/gf180/sW2_sL1.5/diffusion_only/C13_gf180_sW2_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "3432ac800a0bba2d", + "geometry_hash_mode": "424aae658ee64562", + "geometry_identical": false + }, + { + "case": "C13_gf180_sW2_sL1.5", + "topology": "C13", + "pdk": "gf180", + "size": "sW2_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 655.738, + "A1": 563.886, + "rel": -0.14007, + "class": "positive", + "W0": 55.76, + "H0": 11.76, + "W1": 55.72, + "H1": 10.12, + "dW": 0.04, + "dH": -1.64, + "condition_lhs_H0dW": 0.4704, + "condition_rhs_W1dH": -91.3808, + "dH_mos_rows": -0.04, + "dH_channels": -1.6, + "dH_other": -0.0, + "row_span_saving": { + "n": -0.74 + }, + "max_mos_row_span_saving": -0.74, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 7.489, + "stub_separation": -7.894, + "taller_mos_rows": -2.23, + "routing_tracks": -89.216, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C13/gf180/sW2_sL1.5/independent/C13_gf180_sW2_sL1p5_independent.gds", + "gds_mode": "runs/grid/C13/gf180/sW2_sL1.5/gate_only/C13_gf180_sW2_sL1p5_gate_only.gds", + "geometry_hash_ref": "3432ac800a0bba2d", + "geometry_hash_mode": "3bda2af2789503ea", + "geometry_identical": false + }, + { + "case": "C13_gf180_sW2_sL1.5", + "topology": "C13", + "pdk": "gf180", + "size": "sW2_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 655.738, + "A1": 555.79, + "rel": -0.15242, + "class": "positive", + "W0": 55.76, + "H0": 11.76, + "W1": 54.92, + "H1": 10.12, + "dW": 0.84, + "dH": -1.64, + "condition_lhs_H0dW": 9.8784, + "condition_rhs_W1dH": -90.0688, + "dH_mos_rows": -0.04, + "dH_channels": -1.6, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.06 + }, + "max_mos_row_span_saving": 0.06, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -0.607, + "stub_separation": -7.894, + "taller_mos_rows": -2.23, + "routing_tracks": -89.216, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C13/gf180/sW2_sL1.5/independent/C13_gf180_sW2_sL1p5_independent.gds", + "gds_mode": "runs/grid/C13/gf180/sW2_sL1.5/combined/C13_gf180_sW2_sL1p5_combined.gds", + "geometry_hash_ref": "3432ac800a0bba2d", + "geometry_hash_mode": "8c6db26eb2304dbd", + "geometry_identical": false + }, + { + "case": "C13_gf180_sW2_sL1", + "topology": "C13", + "pdk": "gf180", + "size": "sW2_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 543.782, + "A1": 534.374, + "rel": -0.0173, + "class": "positive", + "W0": 46.24, + "H0": 11.76, + "W1": 45.44, + "H1": 11.76, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 9.408, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -9.408, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C13/gf180/sW2_sL1/independent/C13_gf180_sW2_sL1_independent.gds", + "gds_mode": "runs/grid/C13/gf180/sW2_sL1/diffusion_only/C13_gf180_sW2_sL1_diffusion_only.gds", + "geometry_hash_ref": "9fb2f051793dffee", + "geometry_hash_mode": "c16bc5cb093ba029", + "geometry_identical": false + }, + { + "case": "C13_gf180_sW2_sL1", + "topology": "C13", + "pdk": "gf180", + "size": "sW2_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 543.782, + "A1": 467.544, + "rel": -0.1402, + "class": "positive", + "W0": 46.24, + "H0": 11.76, + "W1": 46.2, + "H1": 10.12, + "dW": 0.04, + "dH": -1.64, + "condition_lhs_H0dW": 0.4704, + "condition_rhs_W1dH": -75.768, + "dH_mos_rows": -0.04, + "dH_channels": -1.6, + "dH_other": -0.0, + "row_span_saving": { + "n": -0.74 + }, + "max_mos_row_span_saving": -0.74, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 7.489, + "stub_separation": -7.894, + "taller_mos_rows": -1.85, + "routing_tracks": -73.984, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C13/gf180/sW2_sL1/independent/C13_gf180_sW2_sL1_independent.gds", + "gds_mode": "runs/grid/C13/gf180/sW2_sL1/gate_only/C13_gf180_sW2_sL1_gate_only.gds", + "geometry_hash_ref": "9fb2f051793dffee", + "geometry_hash_mode": "ef38801aa1a69d3d", + "geometry_identical": false + }, + { + "case": "C13_gf180_sW2_sL1", + "topology": "C13", + "pdk": "gf180", + "size": "sW2_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 543.782, + "A1": 459.448, + "rel": -0.15509, + "class": "positive", + "W0": 46.24, + "H0": 11.76, + "W1": 45.4, + "H1": 10.12, + "dW": 0.84, + "dH": -1.64, + "condition_lhs_H0dW": 9.8784, + "condition_rhs_W1dH": -74.456, + "dH_mos_rows": -0.04, + "dH_channels": -1.6, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.06 + }, + "max_mos_row_span_saving": 0.06, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -0.607, + "stub_separation": -7.894, + "taller_mos_rows": -1.85, + "routing_tracks": -73.984, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C13/gf180/sW2_sL1/independent/C13_gf180_sW2_sL1_independent.gds", + "gds_mode": "runs/grid/C13/gf180/sW2_sL1/combined/C13_gf180_sW2_sL1_combined.gds", + "geometry_hash_ref": "9fb2f051793dffee", + "geometry_hash_mode": "2049380884813a63", + "geometry_identical": false + }, + { + "case": "C13_gf180_sW2_sL2", + "topology": "C13", + "pdk": "gf180", + "size": "sW2_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 767.693, + "A1": 758.285, + "rel": -0.01225, + "class": "positive", + "W0": 65.28, + "H0": 11.76, + "W1": 64.48, + "H1": 11.76, + "dW": 0.8, + "dH": 0.0, + "condition_lhs_H0dW": 9.408, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -9.408, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C13/gf180/sW2_sL2/independent/C13_gf180_sW2_sL2_independent.gds", + "gds_mode": "runs/grid/C13/gf180/sW2_sL2/diffusion_only/C13_gf180_sW2_sL2_diffusion_only.gds", + "geometry_hash_ref": "afd013560bce95d9", + "geometry_hash_mode": "7eed66e5041be6ec", + "geometry_identical": false + }, + { + "case": "C13_gf180_sW2_sL2", + "topology": "C13", + "pdk": "gf180", + "size": "sW2_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 767.693, + "A1": 660.229, + "rel": -0.13998, + "class": "positive", + "W0": 65.28, + "H0": 11.76, + "W1": 65.24, + "H1": 10.12, + "dW": 0.04, + "dH": -1.64, + "condition_lhs_H0dW": 0.4704, + "condition_rhs_W1dH": -106.9936, + "dH_mos_rows": -0.04, + "dH_channels": -1.6, + "dH_other": -0.0, + "row_span_saving": { + "n": -0.74 + }, + "max_mos_row_span_saving": -0.74, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 7.489, + "stub_separation": -7.894, + "taller_mos_rows": -2.611, + "routing_tracks": -104.448, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C13/gf180/sW2_sL2/independent/C13_gf180_sW2_sL2_independent.gds", + "gds_mode": "runs/grid/C13/gf180/sW2_sL2/gate_only/C13_gf180_sW2_sL2_gate_only.gds", + "geometry_hash_ref": "afd013560bce95d9", + "geometry_hash_mode": "8e71ef6f6f9c570a", + "geometry_identical": false + }, + { + "case": "C13_gf180_sW2_sL2", + "topology": "C13", + "pdk": "gf180", + "size": "sW2_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 767.693, + "A1": 652.133, + "rel": -0.15053, + "class": "positive", + "W0": 65.28, + "H0": 11.76, + "W1": 64.44, + "H1": 10.12, + "dW": 0.84, + "dH": -1.64, + "condition_lhs_H0dW": 9.8784, + "condition_rhs_W1dH": -105.6816, + "dH_mos_rows": -0.04, + "dH_channels": -1.6, + "dH_other": -0.0, + "row_span_saving": { + "n": 0.06 + }, + "max_mos_row_span_saving": 0.06, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -0.607, + "stub_separation": -7.894, + "taller_mos_rows": -2.611, + "routing_tracks": -104.448, + "other_height": -0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C13/gf180/sW2_sL2/independent/C13_gf180_sW2_sL2_independent.gds", + "gds_mode": "runs/grid/C13/gf180/sW2_sL2/combined/C13_gf180_sW2_sL2_combined.gds", + "geometry_hash_ref": "afd013560bce95d9", + "geometry_hash_mode": "2e03aae9e06d53bf", + "geometry_identical": false + }, + { + "case": "C13_ihp130_sW1.5_sL1.5", + "topology": "C13", + "pdk": "ihp130", + "size": "sW1.5_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 222.696, + "A1": 218.177, + "rel": -0.02029, + "class": "positive", + "W0": 25.135, + "H0": 8.86, + "W1": 24.625, + "H1": 8.86, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 4.5186, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -4.519, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C13/ihp130/sW1.5_sL1.5/independent/C13_ihp130_sW1p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C13/ihp130/sW1.5_sL1.5/diffusion_only/C13_ihp130_sW1p5_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "921e97391dc4e6ef", + "geometry_hash_mode": "2c700ae2dfa145cc", + "geometry_identical": false + }, + { + "case": "C13_ihp130_sW1.5_sL1.5", + "topology": "C13", + "pdk": "ihp130", + "size": "sW1.5_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 222.696, + "A1": 192.151, + "rel": -0.13716, + "class": "positive", + "W0": 25.135, + "H0": 8.86, + "W1": 25.085, + "H1": 7.66, + "dW": 0.05, + "dH": -1.2, + "condition_lhs_H0dW": 0.443, + "condition_rhs_W1dH": -30.102, + "dH_mos_rows": -0.02, + "dH_channels": -1.18, + "dH_other": 0.0, + "row_span_saving": { + "n": -0.51 + }, + "max_mos_row_span_saving": -0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 3.907, + "stub_separation": -4.29, + "taller_mos_rows": -0.503, + "routing_tracks": -29.659, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C13/ihp130/sW1.5_sL1.5/independent/C13_ihp130_sW1p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C13/ihp130/sW1.5_sL1.5/gate_only/C13_ihp130_sW1p5_sL1p5_gate_only.gds", + "geometry_hash_ref": "921e97391dc4e6ef", + "geometry_hash_mode": "03c267b138663b39", + "geometry_identical": false + }, + { + "case": "C13_ihp130_sW1.5_sL1.5", + "topology": "C13", + "pdk": "ihp130", + "size": "sW1.5_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 222.696, + "A1": 188.244, + "rel": -0.1547, + "class": "positive", + "W0": 25.135, + "H0": 8.86, + "W1": 24.575, + "H1": 7.66, + "dW": 0.56, + "dH": -1.2, + "condition_lhs_H0dW": 4.9616, + "condition_rhs_W1dH": -29.49, + "dH_mos_rows": -0.02, + "dH_channels": -1.18, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": -4.29, + "taller_mos_rows": -0.503, + "routing_tracks": -29.659, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C13/ihp130/sW1.5_sL1.5/independent/C13_ihp130_sW1p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C13/ihp130/sW1.5_sL1.5/combined/C13_ihp130_sW1p5_sL1p5_combined.gds", + "geometry_hash_ref": "921e97391dc4e6ef", + "geometry_hash_mode": "d9005b596d10dc9c", + "geometry_identical": false + }, + { + "case": "C13_ihp130_sW1.5_sL1", + "topology": "C13", + "pdk": "ihp130", + "size": "sW1.5_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 183.535, + "A1": 179.016, + "rel": -0.02462, + "class": "positive", + "W0": 20.715, + "H0": 8.86, + "W1": 20.205, + "H1": 8.86, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 4.5186, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -4.519, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C13/ihp130/sW1.5_sL1/independent/C13_ihp130_sW1p5_sL1_independent.gds", + "gds_mode": "runs/grid/C13/ihp130/sW1.5_sL1/diffusion_only/C13_ihp130_sW1p5_sL1_diffusion_only.gds", + "geometry_hash_ref": "44365d36ac483920", + "geometry_hash_mode": "8b089d44a42b8793", + "geometry_identical": false + }, + { + "case": "C13_ihp130_sW1.5_sL1", + "topology": "C13", + "pdk": "ihp130", + "size": "sW1.5_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 183.535, + "A1": 158.294, + "rel": -0.13753, + "class": "positive", + "W0": 20.715, + "H0": 8.86, + "W1": 20.665, + "H1": 7.66, + "dW": 0.05, + "dH": -1.2, + "condition_lhs_H0dW": 0.443, + "condition_rhs_W1dH": -24.798, + "dH_mos_rows": -0.02, + "dH_channels": -1.18, + "dH_other": 0.0, + "row_span_saving": { + "n": -0.51 + }, + "max_mos_row_span_saving": -0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 3.907, + "stub_separation": -4.29, + "taller_mos_rows": -0.414, + "routing_tracks": -24.444, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C13/ihp130/sW1.5_sL1/independent/C13_ihp130_sW1p5_sL1_independent.gds", + "gds_mode": "runs/grid/C13/ihp130/sW1.5_sL1/gate_only/C13_ihp130_sW1p5_sL1_gate_only.gds", + "geometry_hash_ref": "44365d36ac483920", + "geometry_hash_mode": "d7f54c2dc83e60b7", + "geometry_identical": false + }, + { + "case": "C13_ihp130_sW1.5_sL1", + "topology": "C13", + "pdk": "ihp130", + "size": "sW1.5_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 183.535, + "A1": 154.387, + "rel": -0.15881, + "class": "positive", + "W0": 20.715, + "H0": 8.86, + "W1": 20.155, + "H1": 7.66, + "dW": 0.56, + "dH": -1.2, + "condition_lhs_H0dW": 4.9616, + "condition_rhs_W1dH": -24.186, + "dH_mos_rows": -0.02, + "dH_channels": -1.18, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": -4.29, + "taller_mos_rows": -0.414, + "routing_tracks": -24.444, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C13/ihp130/sW1.5_sL1/independent/C13_ihp130_sW1p5_sL1_independent.gds", + "gds_mode": "runs/grid/C13/ihp130/sW1.5_sL1/combined/C13_ihp130_sW1p5_sL1_combined.gds", + "geometry_hash_ref": "44365d36ac483920", + "geometry_hash_mode": "da9e0b7a42cadb29", + "geometry_identical": false + }, + { + "case": "C13_ihp130_sW1.5_sL2", + "topology": "C13", + "pdk": "ihp130", + "size": "sW1.5_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 261.857, + "A1": 257.339, + "rel": -0.01726, + "class": "positive", + "W0": 29.555, + "H0": 8.86, + "W1": 29.045, + "H1": 8.86, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 4.5186, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -4.519, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C13/ihp130/sW1.5_sL2/independent/C13_ihp130_sW1p5_sL2_independent.gds", + "gds_mode": "runs/grid/C13/ihp130/sW1.5_sL2/diffusion_only/C13_ihp130_sW1p5_sL2_diffusion_only.gds", + "geometry_hash_ref": "dc92636712613449", + "geometry_hash_mode": "e545ff6980396e3a", + "geometry_identical": false + }, + { + "case": "C13_ihp130_sW1.5_sL2", + "topology": "C13", + "pdk": "ihp130", + "size": "sW1.5_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 261.857, + "A1": 226.008, + "rel": -0.1369, + "class": "positive", + "W0": 29.555, + "H0": 8.86, + "W1": 29.505, + "H1": 7.66, + "dW": 0.05, + "dH": -1.2, + "condition_lhs_H0dW": 0.443, + "condition_rhs_W1dH": -35.406, + "dH_mos_rows": -0.02, + "dH_channels": -1.18, + "dH_other": 0.0, + "row_span_saving": { + "n": -0.51 + }, + "max_mos_row_span_saving": -0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 3.907, + "stub_separation": -4.29, + "taller_mos_rows": -0.591, + "routing_tracks": -34.875, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C13/ihp130/sW1.5_sL2/independent/C13_ihp130_sW1p5_sL2_independent.gds", + "gds_mode": "runs/grid/C13/ihp130/sW1.5_sL2/gate_only/C13_ihp130_sW1p5_sL2_gate_only.gds", + "geometry_hash_ref": "dc92636712613449", + "geometry_hash_mode": "59829dea59104502", + "geometry_identical": false + }, + { + "case": "C13_ihp130_sW1.5_sL2", + "topology": "C13", + "pdk": "ihp130", + "size": "sW1.5_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 261.857, + "A1": 222.102, + "rel": -0.15182, + "class": "positive", + "W0": 29.555, + "H0": 8.86, + "W1": 28.995, + "H1": 7.66, + "dW": 0.56, + "dH": -1.2, + "condition_lhs_H0dW": 4.9616, + "condition_rhs_W1dH": -34.794, + "dH_mos_rows": -0.02, + "dH_channels": -1.18, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": -4.29, + "taller_mos_rows": -0.591, + "routing_tracks": -34.875, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C13/ihp130/sW1.5_sL2/independent/C13_ihp130_sW1p5_sL2_independent.gds", + "gds_mode": "runs/grid/C13/ihp130/sW1.5_sL2/combined/C13_ihp130_sW1p5_sL2_combined.gds", + "geometry_hash_ref": "dc92636712613449", + "geometry_hash_mode": "c0cde38240644f90", + "geometry_identical": false + }, + { + "case": "C13_ihp130_sW1_sL1.5", + "topology": "C13", + "pdk": "ihp130", + "size": "sW1_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 216.412, + "A1": 212.021, + "rel": -0.02029, + "class": "positive", + "W0": 25.135, + "H0": 8.61, + "W1": 24.625, + "H1": 8.61, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 4.3911, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -4.391, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C13/ihp130/sW1_sL1.5/independent/C13_ihp130_sW1_sL1p5_independent.gds", + "gds_mode": "runs/grid/C13/ihp130/sW1_sL1.5/diffusion_only/C13_ihp130_sW1_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "2dd27f65c4941c20", + "geometry_hash_mode": "657adf872ed1f331", + "geometry_identical": false + }, + { + "case": "C13_ihp130_sW1_sL1.5", + "topology": "C13", + "pdk": "ihp130", + "size": "sW1_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 216.412, + "A1": 185.88, + "rel": -0.14108, + "class": "positive", + "W0": 25.135, + "H0": 8.61, + "W1": 25.085, + "H1": 7.41, + "dW": 0.05, + "dH": -1.2, + "condition_lhs_H0dW": 0.4305, + "condition_rhs_W1dH": -30.102, + "dH_mos_rows": -0.02, + "dH_channels": -1.18, + "dH_other": 0.0, + "row_span_saving": { + "n": -0.51 + }, + "max_mos_row_span_saving": -0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 3.779, + "stub_separation": -4.15, + "taller_mos_rows": -0.503, + "routing_tracks": -29.659, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C13/ihp130/sW1_sL1.5/independent/C13_ihp130_sW1_sL1p5_independent.gds", + "gds_mode": "runs/grid/C13/ihp130/sW1_sL1.5/gate_only/C13_ihp130_sW1_sL1p5_gate_only.gds", + "geometry_hash_ref": "2dd27f65c4941c20", + "geometry_hash_mode": "9d77088eef441da2", + "geometry_identical": false + }, + { + "case": "C13_ihp130_sW1_sL1.5", + "topology": "C13", + "pdk": "ihp130", + "size": "sW1_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 216.412, + "A1": 182.101, + "rel": -0.15855, + "class": "positive", + "W0": 25.135, + "H0": 8.61, + "W1": 24.575, + "H1": 7.41, + "dW": 0.56, + "dH": -1.2, + "condition_lhs_H0dW": 4.8216, + "condition_rhs_W1dH": -29.49, + "dH_mos_rows": -0.02, + "dH_channels": -1.18, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": -4.15, + "taller_mos_rows": -0.503, + "routing_tracks": -29.659, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C13/ihp130/sW1_sL1.5/independent/C13_ihp130_sW1_sL1p5_independent.gds", + "gds_mode": "runs/grid/C13/ihp130/sW1_sL1.5/combined/C13_ihp130_sW1_sL1p5_combined.gds", + "geometry_hash_ref": "2dd27f65c4941c20", + "geometry_hash_mode": "30f30477039b44af", + "geometry_identical": false + }, + { + "case": "C13_ihp130_sW1_sL1", + "topology": "C13", + "pdk": "ihp130", + "size": "sW1_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 178.356, + "A1": 173.965, + "rel": -0.02462, + "class": "positive", + "W0": 20.715, + "H0": 8.61, + "W1": 20.205, + "H1": 8.61, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 4.3911, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -4.391, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C13/ihp130/sW1_sL1/independent/C13_ihp130_sW1_sL1_independent.gds", + "gds_mode": "runs/grid/C13/ihp130/sW1_sL1/diffusion_only/C13_ihp130_sW1_sL1_diffusion_only.gds", + "geometry_hash_ref": "d2c91b50a6aabd21", + "geometry_hash_mode": "1ad7d5d4d9fc2fea", + "geometry_identical": false + }, + { + "case": "C13_ihp130_sW1_sL1", + "topology": "C13", + "pdk": "ihp130", + "size": "sW1_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 178.356, + "A1": 153.128, + "rel": -0.14145, + "class": "positive", + "W0": 20.715, + "H0": 8.61, + "W1": 20.665, + "H1": 7.41, + "dW": 0.05, + "dH": -1.2, + "condition_lhs_H0dW": 0.4305, + "condition_rhs_W1dH": -24.798, + "dH_mos_rows": -0.02, + "dH_channels": -1.18, + "dH_other": 0.0, + "row_span_saving": { + "n": -0.51 + }, + "max_mos_row_span_saving": -0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 3.779, + "stub_separation": -4.15, + "taller_mos_rows": -0.414, + "routing_tracks": -24.444, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C13/ihp130/sW1_sL1/independent/C13_ihp130_sW1_sL1_independent.gds", + "gds_mode": "runs/grid/C13/ihp130/sW1_sL1/gate_only/C13_ihp130_sW1_sL1_gate_only.gds", + "geometry_hash_ref": "d2c91b50a6aabd21", + "geometry_hash_mode": "3c26bf6f35970c97", + "geometry_identical": false + }, + { + "case": "C13_ihp130_sW1_sL1", + "topology": "C13", + "pdk": "ihp130", + "size": "sW1_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 178.356, + "A1": 149.349, + "rel": -0.16264, + "class": "positive", + "W0": 20.715, + "H0": 8.61, + "W1": 20.155, + "H1": 7.41, + "dW": 0.56, + "dH": -1.2, + "condition_lhs_H0dW": 4.8216, + "condition_rhs_W1dH": -24.186, + "dH_mos_rows": -0.02, + "dH_channels": -1.18, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": -4.15, + "taller_mos_rows": -0.414, + "routing_tracks": -24.444, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C13/ihp130/sW1_sL1/independent/C13_ihp130_sW1_sL1_independent.gds", + "gds_mode": "runs/grid/C13/ihp130/sW1_sL1/combined/C13_ihp130_sW1_sL1_combined.gds", + "geometry_hash_ref": "d2c91b50a6aabd21", + "geometry_hash_mode": "3c4c4a82a6b99318", + "geometry_identical": false + }, + { + "case": "C13_ihp130_sW1_sL2", + "topology": "C13", + "pdk": "ihp130", + "size": "sW1_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 254.469, + "A1": 250.077, + "rel": -0.01726, + "class": "positive", + "W0": 29.555, + "H0": 8.61, + "W1": 29.045, + "H1": 8.61, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 4.3911, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -4.391, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C13/ihp130/sW1_sL2/independent/C13_ihp130_sW1_sL2_independent.gds", + "gds_mode": "runs/grid/C13/ihp130/sW1_sL2/diffusion_only/C13_ihp130_sW1_sL2_diffusion_only.gds", + "geometry_hash_ref": "073ae7481fcb1103", + "geometry_hash_mode": "34750b7db56d7dcd", + "geometry_identical": false + }, + { + "case": "C13_ihp130_sW1_sL2", + "topology": "C13", + "pdk": "ihp130", + "size": "sW1_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 254.469, + "A1": 218.632, + "rel": -0.14083, + "class": "positive", + "W0": 29.555, + "H0": 8.61, + "W1": 29.505, + "H1": 7.41, + "dW": 0.05, + "dH": -1.2, + "condition_lhs_H0dW": 0.4305, + "condition_rhs_W1dH": -35.406, + "dH_mos_rows": -0.02, + "dH_channels": -1.18, + "dH_other": 0.0, + "row_span_saving": { + "n": -0.51 + }, + "max_mos_row_span_saving": -0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 3.779, + "stub_separation": -4.15, + "taller_mos_rows": -0.591, + "routing_tracks": -34.875, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C13/ihp130/sW1_sL2/independent/C13_ihp130_sW1_sL2_independent.gds", + "gds_mode": "runs/grid/C13/ihp130/sW1_sL2/gate_only/C13_ihp130_sW1_sL2_gate_only.gds", + "geometry_hash_ref": "073ae7481fcb1103", + "geometry_hash_mode": "2282e1d7d1323a6b", + "geometry_identical": false + }, + { + "case": "C13_ihp130_sW1_sL2", + "topology": "C13", + "pdk": "ihp130", + "size": "sW1_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 254.469, + "A1": 214.853, + "rel": -0.15568, + "class": "positive", + "W0": 29.555, + "H0": 8.61, + "W1": 28.995, + "H1": 7.41, + "dW": 0.56, + "dH": -1.2, + "condition_lhs_H0dW": 4.8216, + "condition_rhs_W1dH": -34.794, + "dH_mos_rows": -0.02, + "dH_channels": -1.18, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": -4.15, + "taller_mos_rows": -0.591, + "routing_tracks": -34.875, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C13/ihp130/sW1_sL2/independent/C13_ihp130_sW1_sL2_independent.gds", + "gds_mode": "runs/grid/C13/ihp130/sW1_sL2/combined/C13_ihp130_sW1_sL2_combined.gds", + "geometry_hash_ref": "073ae7481fcb1103", + "geometry_hash_mode": "1373b75a606d5f2f", + "geometry_identical": false + }, + { + "case": "C13_ihp130_sW2_sL1.5", + "topology": "C13", + "pdk": "ihp130", + "size": "sW2_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 386.202, + "A1": 381.81, + "rel": -0.01137, + "class": "positive", + "W0": 44.855, + "H0": 8.61, + "W1": 44.345, + "H1": 8.61, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 4.3911, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -4.391, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C13/ihp130/sW2_sL1.5/independent/C13_ihp130_sW2_sL1p5_independent.gds", + "gds_mode": "runs/grid/C13/ihp130/sW2_sL1.5/diffusion_only/C13_ihp130_sW2_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "4fa3d9d66c38003f", + "geometry_hash_mode": "d1f667b3132c72a0", + "geometry_identical": false + }, + { + "case": "C13_ihp130_sW2_sL1.5", + "topology": "C13", + "pdk": "ihp130", + "size": "sW2_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 386.202, + "A1": 332.005, + "rel": -0.14033, + "class": "positive", + "W0": 44.855, + "H0": 8.61, + "W1": 44.805, + "H1": 7.41, + "dW": 0.05, + "dH": -1.2, + "condition_lhs_H0dW": 0.4305, + "condition_rhs_W1dH": -53.766, + "dH_mos_rows": -0.02, + "dH_channels": -1.18, + "dH_other": 0.0, + "row_span_saving": { + "n": -0.51 + }, + "max_mos_row_span_saving": -0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 3.779, + "stub_separation": -4.15, + "taller_mos_rows": -0.897, + "routing_tracks": -52.929, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C13/ihp130/sW2_sL1.5/independent/C13_ihp130_sW2_sL1p5_independent.gds", + "gds_mode": "runs/grid/C13/ihp130/sW2_sL1.5/gate_only/C13_ihp130_sW2_sL1p5_gate_only.gds", + "geometry_hash_ref": "4fa3d9d66c38003f", + "geometry_hash_mode": "f11345ee98c164c1", + "geometry_identical": false + }, + { + "case": "C13_ihp130_sW2_sL1.5", + "topology": "C13", + "pdk": "ihp130", + "size": "sW2_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 386.202, + "A1": 328.226, + "rel": -0.15012, + "class": "positive", + "W0": 44.855, + "H0": 8.61, + "W1": 44.295, + "H1": 7.41, + "dW": 0.56, + "dH": -1.2, + "condition_lhs_H0dW": 4.8216, + "condition_rhs_W1dH": -53.154, + "dH_mos_rows": -0.02, + "dH_channels": -1.18, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": -4.15, + "taller_mos_rows": -0.897, + "routing_tracks": -52.929, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C13/ihp130/sW2_sL1.5/independent/C13_ihp130_sW2_sL1p5_independent.gds", + "gds_mode": "runs/grid/C13/ihp130/sW2_sL1.5/combined/C13_ihp130_sW2_sL1p5_combined.gds", + "geometry_hash_ref": "4fa3d9d66c38003f", + "geometry_hash_mode": "769cd1d0682bdde6", + "geometry_identical": false + }, + { + "case": "C13_ihp130_sW2_sL1", + "topology": "C13", + "pdk": "ihp130", + "size": "sW2_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 310.089, + "A1": 305.698, + "rel": -0.01416, + "class": "positive", + "W0": 36.015, + "H0": 8.61, + "W1": 35.505, + "H1": 8.61, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 4.3911, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -4.391, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C13/ihp130/sW2_sL1/independent/C13_ihp130_sW2_sL1_independent.gds", + "gds_mode": "runs/grid/C13/ihp130/sW2_sL1/diffusion_only/C13_ihp130_sW2_sL1_diffusion_only.gds", + "geometry_hash_ref": "7031074f049d7dad", + "geometry_hash_mode": "e3ef0849162b54c3", + "geometry_identical": false + }, + { + "case": "C13_ihp130_sW2_sL1", + "topology": "C13", + "pdk": "ihp130", + "size": "sW2_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 310.089, + "A1": 266.501, + "rel": -0.14057, + "class": "positive", + "W0": 36.015, + "H0": 8.61, + "W1": 35.965, + "H1": 7.41, + "dW": 0.05, + "dH": -1.2, + "condition_lhs_H0dW": 0.4305, + "condition_rhs_W1dH": -43.158, + "dH_mos_rows": -0.02, + "dH_channels": -1.18, + "dH_other": 0.0, + "row_span_saving": { + "n": -0.51 + }, + "max_mos_row_span_saving": -0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 3.779, + "stub_separation": -4.15, + "taller_mos_rows": -0.72, + "routing_tracks": -42.498, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C13/ihp130/sW2_sL1/independent/C13_ihp130_sW2_sL1_independent.gds", + "gds_mode": "runs/grid/C13/ihp130/sW2_sL1/gate_only/C13_ihp130_sW2_sL1_gate_only.gds", + "geometry_hash_ref": "7031074f049d7dad", + "geometry_hash_mode": "30410ccda601e591", + "geometry_identical": false + }, + { + "case": "C13_ihp130_sW2_sL1", + "topology": "C13", + "pdk": "ihp130", + "size": "sW2_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 310.089, + "A1": 262.722, + "rel": -0.15275, + "class": "positive", + "W0": 36.015, + "H0": 8.61, + "W1": 35.455, + "H1": 7.41, + "dW": 0.56, + "dH": -1.2, + "condition_lhs_H0dW": 4.8216, + "condition_rhs_W1dH": -42.546, + "dH_mos_rows": -0.02, + "dH_channels": -1.18, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": -4.15, + "taller_mos_rows": -0.72, + "routing_tracks": -42.498, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C13/ihp130/sW2_sL1/independent/C13_ihp130_sW2_sL1_independent.gds", + "gds_mode": "runs/grid/C13/ihp130/sW2_sL1/combined/C13_ihp130_sW2_sL1_combined.gds", + "geometry_hash_ref": "7031074f049d7dad", + "geometry_hash_mode": "816f33bd2c72fde5", + "geometry_identical": false + }, + { + "case": "C13_ihp130_sW2_sL2", + "topology": "C13", + "pdk": "ihp130", + "size": "sW2_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 462.314, + "A1": 457.923, + "rel": -0.0095, + "class": "positive", + "W0": 53.695, + "H0": 8.61, + "W1": 53.185, + "H1": 8.61, + "dW": 0.51, + "dH": 0.0, + "condition_lhs_H0dW": 4.3911, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -4.391, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C13/ihp130/sW2_sL2/independent/C13_ihp130_sW2_sL2_independent.gds", + "gds_mode": "runs/grid/C13/ihp130/sW2_sL2/diffusion_only/C13_ihp130_sW2_sL2_diffusion_only.gds", + "geometry_hash_ref": "e6291c77c644922f", + "geometry_hash_mode": "ad2654eb7071112d", + "geometry_identical": false + }, + { + "case": "C13_ihp130_sW2_sL2", + "topology": "C13", + "pdk": "ihp130", + "size": "sW2_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 462.314, + "A1": 397.509, + "rel": -0.14017, + "class": "positive", + "W0": 53.695, + "H0": 8.61, + "W1": 53.645, + "H1": 7.41, + "dW": 0.05, + "dH": -1.2, + "condition_lhs_H0dW": 0.4305, + "condition_rhs_W1dH": -64.374, + "dH_mos_rows": -0.02, + "dH_channels": -1.18, + "dH_other": 0.0, + "row_span_saving": { + "n": -0.51 + }, + "max_mos_row_span_saving": -0.51, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 3.779, + "stub_separation": -4.15, + "taller_mos_rows": -1.074, + "routing_tracks": -63.36, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C13/ihp130/sW2_sL2/independent/C13_ihp130_sW2_sL2_independent.gds", + "gds_mode": "runs/grid/C13/ihp130/sW2_sL2/gate_only/C13_ihp130_sW2_sL2_gate_only.gds", + "geometry_hash_ref": "e6291c77c644922f", + "geometry_hash_mode": "2d8a8c9699c8cefe", + "geometry_identical": false + }, + { + "case": "C13_ihp130_sW2_sL2", + "topology": "C13", + "pdk": "ihp130", + "size": "sW2_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 462.314, + "A1": 393.73, + "rel": -0.14835, + "class": "positive", + "W0": 53.695, + "H0": 8.61, + "W1": 53.135, + "H1": 7.41, + "dW": 0.56, + "dH": -1.2, + "condition_lhs_H0dW": 4.8216, + "condition_rhs_W1dH": -63.762, + "dH_mos_rows": -0.02, + "dH_channels": -1.18, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": -4.15, + "taller_mos_rows": -1.074, + "routing_tracks": -63.36, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C13/ihp130/sW2_sL2/independent/C13_ihp130_sW2_sL2_independent.gds", + "gds_mode": "runs/grid/C13/ihp130/sW2_sL2/combined/C13_ihp130_sW2_sL2_combined.gds", + "geometry_hash_ref": "e6291c77c644922f", + "geometry_hash_mode": "a505408a3fd831e5", + "geometry_identical": false + }, + { + "case": "C13_sky130_sW1.5_sL1.5", + "topology": "C13", + "pdk": "sky130", + "size": "sW1.5_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 171.71, + "A1": 166.572, + "rel": -0.02992, + "class": "positive", + "W0": 18.715, + "H0": 9.175, + "W1": 18.155, + "H1": 9.175, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 5.138, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -5.138, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C13/sky130/sW1.5_sL1.5/independent/C13_sky130_sW1p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C13/sky130/sW1.5_sL1.5/diffusion_only/C13_sky130_sW1p5_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "f0cf11bacfc2e4af", + "geometry_hash_mode": "ac3f49bcd288a2a2", + "geometry_identical": false + }, + { + "case": "C13_sky130_sW1.5_sL1.5", + "topology": "C13", + "pdk": "sky130", + "size": "sW1.5_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 171.71, + "A1": 148.8, + "rel": -0.13342, + "class": "positive", + "W0": 18.715, + "H0": 9.175, + "W1": 18.635, + "H1": 7.985, + "dW": 0.08, + "dH": -1.19, + "condition_lhs_H0dW": 0.734, + "condition_rhs_W1dH": -22.1757, + "dH_mos_rows": 0.03, + "dH_channels": -1.22, + "dH_other": 0.0, + "row_span_saving": { + "n": -0.49 + }, + "max_mos_row_span_saving": -0.49, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 3.913, + "stub_separation": -4.551, + "taller_mos_rows": 0.561, + "routing_tracks": -22.832, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C13/sky130/sW1.5_sL1.5/independent/C13_sky130_sW1p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C13/sky130/sW1.5_sL1.5/gate_only/C13_sky130_sW1p5_sL1p5_gate_only.gds", + "geometry_hash_ref": "f0cf11bacfc2e4af", + "geometry_hash_mode": "1491279ad7ffb288", + "geometry_identical": false + }, + { + "case": "C13_sky130_sW1.5_sL1.5", + "topology": "C13", + "pdk": "sky130", + "size": "sW1.5_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 171.71, + "A1": 144.329, + "rel": -0.15946, + "class": "positive", + "W0": 18.715, + "H0": 9.175, + "W1": 18.075, + "H1": 7.985, + "dW": 0.64, + "dH": -1.19, + "condition_lhs_H0dW": 5.872, + "condition_rhs_W1dH": -21.5093, + "dH_mos_rows": 0.03, + "dH_channels": -1.22, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.07 + }, + "max_mos_row_span_saving": 0.07, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -0.559, + "stub_separation": -4.551, + "taller_mos_rows": 0.561, + "routing_tracks": -22.832, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C13/sky130/sW1.5_sL1.5/independent/C13_sky130_sW1p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C13/sky130/sW1.5_sL1.5/combined/C13_sky130_sW1p5_sL1p5_combined.gds", + "geometry_hash_ref": "f0cf11bacfc2e4af", + "geometry_hash_mode": "3e34e9a5bb894df2", + "geometry_identical": false + }, + { + "case": "C13_sky130_sW1.5_sL1", + "topology": "C13", + "pdk": "sky130", + "size": "sW1.5_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 148.314, + "A1": 152.695, + "rel": 0.02954, + "class": "negative", + "W0": 16.165, + "H0": 9.175, + "W1": 15.605, + "H1": 9.785, + "dW": 0.56, + "dH": 0.61, + "condition_lhs_H0dW": 5.138, + "condition_rhs_W1dH": 9.519, + "dH_mos_rows": 0.0, + "dH_channels": 0.61, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -5.48, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 9.861, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C13/sky130/sW1.5_sL1/independent/C13_sky130_sW1p5_sL1_independent.gds", + "gds_mode": "runs/grid/C13/sky130/sW1.5_sL1/diffusion_only/C13_sky130_sW1p5_sL1_diffusion_only.gds", + "geometry_hash_ref": "1d2ef38c136a8649", + "geometry_hash_mode": "0952ea159b6318c4", + "geometry_identical": false, + "increase_terms": [ + "routing_tracks" + ], + "primary_mechanism": "routing_tracks" + }, + { + "case": "C13_sky130_sW1.5_sL1", + "topology": "C13", + "pdk": "sky130", + "size": "sW1.5_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 148.314, + "A1": 138.251, + "rel": -0.06785, + "class": "positive", + "W0": 16.165, + "H0": 9.175, + "W1": 16.085, + "H1": 8.595, + "dW": 0.08, + "dH": -0.58, + "condition_lhs_H0dW": 0.734, + "condition_rhs_W1dH": -9.3293, + "dH_mos_rows": 0.03, + "dH_channels": -0.61, + "dH_other": 0.0, + "row_span_saving": { + "n": -0.49 + }, + "max_mos_row_span_saving": -0.49, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 4.212, + "stub_separation": -4.899, + "taller_mos_rows": 0.485, + "routing_tracks": -9.861, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C13/sky130/sW1.5_sL1/independent/C13_sky130_sW1p5_sL1_independent.gds", + "gds_mode": "runs/grid/C13/sky130/sW1.5_sL1/gate_only/C13_sky130_sW1p5_sL1_gate_only.gds", + "geometry_hash_ref": "1d2ef38c136a8649", + "geometry_hash_mode": "879430a772849162", + "geometry_identical": false + }, + { + "case": "C13_sky130_sW1.5_sL1", + "topology": "C13", + "pdk": "sky130", + "size": "sW1.5_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 148.314, + "A1": 133.437, + "rel": -0.1003, + "class": "positive", + "W0": 16.165, + "H0": 9.175, + "W1": 15.525, + "H1": 8.595, + "dW": 0.64, + "dH": -0.58, + "condition_lhs_H0dW": 5.872, + "condition_rhs_W1dH": -9.0045, + "dH_mos_rows": 0.03, + "dH_channels": -0.61, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.07 + }, + "max_mos_row_span_saving": 0.07, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -0.602, + "stub_separation": -4.899, + "taller_mos_rows": 0.485, + "routing_tracks": -9.861, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C13/sky130/sW1.5_sL1/independent/C13_sky130_sW1p5_sL1_independent.gds", + "gds_mode": "runs/grid/C13/sky130/sW1.5_sL1/combined/C13_sky130_sW1p5_sL1_combined.gds", + "geometry_hash_ref": "1d2ef38c136a8649", + "geometry_hash_mode": "c59f2d4e0f0c53ca", + "geometry_identical": false + }, + { + "case": "C13_sky130_sW1.5_sL2", + "topology": "C13", + "pdk": "sky130", + "size": "sW1.5_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 195.106, + "A1": 189.968, + "rel": -0.02633, + "class": "positive", + "W0": 21.265, + "H0": 9.175, + "W1": 20.705, + "H1": 9.175, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 5.138, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -5.138, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C13/sky130/sW1.5_sL2/independent/C13_sky130_sW1p5_sL2_independent.gds", + "gds_mode": "runs/grid/C13/sky130/sW1.5_sL2/diffusion_only/C13_sky130_sW1p5_sL2_diffusion_only.gds", + "geometry_hash_ref": "e84b9a219313eaa1", + "geometry_hash_mode": "9ce516692db63437", + "geometry_identical": false + }, + { + "case": "C13_sky130_sW1.5_sL2", + "topology": "C13", + "pdk": "sky130", + "size": "sW1.5_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 195.106, + "A1": 169.162, + "rel": -0.13297, + "class": "positive", + "W0": 21.265, + "H0": 9.175, + "W1": 21.185, + "H1": 7.985, + "dW": 0.08, + "dH": -1.19, + "condition_lhs_H0dW": 0.734, + "condition_rhs_W1dH": -25.2102, + "dH_mos_rows": 0.03, + "dH_channels": -1.22, + "dH_other": 0.0, + "row_span_saving": { + "n": -0.49 + }, + "max_mos_row_span_saving": -0.49, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 3.913, + "stub_separation": -4.551, + "taller_mos_rows": 0.638, + "routing_tracks": -25.943, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C13/sky130/sW1.5_sL2/independent/C13_sky130_sW1p5_sL2_independent.gds", + "gds_mode": "runs/grid/C13/sky130/sW1.5_sL2/gate_only/C13_sky130_sW1p5_sL2_gate_only.gds", + "geometry_hash_ref": "e84b9a219313eaa1", + "geometry_hash_mode": "f9c57c53a8337dd1", + "geometry_identical": false + }, + { + "case": "C13_sky130_sW1.5_sL2", + "topology": "C13", + "pdk": "sky130", + "size": "sW1.5_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 195.106, + "A1": 164.691, + "rel": -0.15589, + "class": "positive", + "W0": 21.265, + "H0": 9.175, + "W1": 20.625, + "H1": 7.985, + "dW": 0.64, + "dH": -1.19, + "condition_lhs_H0dW": 5.872, + "condition_rhs_W1dH": -24.5438, + "dH_mos_rows": 0.03, + "dH_channels": -1.22, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.07 + }, + "max_mos_row_span_saving": 0.07, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -0.559, + "stub_separation": -4.551, + "taller_mos_rows": 0.638, + "routing_tracks": -25.943, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C13/sky130/sW1.5_sL2/independent/C13_sky130_sW1p5_sL2_independent.gds", + "gds_mode": "runs/grid/C13/sky130/sW1.5_sL2/combined/C13_sky130_sW1p5_sL2_combined.gds", + "geometry_hash_ref": "e84b9a219313eaa1", + "geometry_hash_mode": "0d70b01a130b1b50", + "geometry_identical": false + }, + { + "case": "C13_sky130_sW1_sL1.5", + "topology": "C13", + "pdk": "sky130", + "size": "sW1_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 167.031, + "A1": 162.033, + "rel": -0.02992, + "class": "positive", + "W0": 18.715, + "H0": 8.925, + "W1": 18.155, + "H1": 8.925, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 4.998, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -4.998, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C13/sky130/sW1_sL1.5/independent/C13_sky130_sW1_sL1p5_independent.gds", + "gds_mode": "runs/grid/C13/sky130/sW1_sL1.5/diffusion_only/C13_sky130_sW1_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "412da5e2dc7903bd", + "geometry_hash_mode": "ed31b74813d51172", + "geometry_identical": false + }, + { + "case": "C13_sky130_sW1_sL1.5", + "topology": "C13", + "pdk": "sky130", + "size": "sW1_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 167.031, + "A1": 144.142, + "rel": -0.13704, + "class": "positive", + "W0": 18.715, + "H0": 8.925, + "W1": 18.635, + "H1": 7.735, + "dW": 0.08, + "dH": -1.19, + "condition_lhs_H0dW": 0.714, + "condition_rhs_W1dH": -22.1757, + "dH_mos_rows": 0.03, + "dH_channels": -1.22, + "dH_other": 0.0, + "row_span_saving": { + "n": -0.49 + }, + "max_mos_row_span_saving": -0.49, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 3.79, + "stub_separation": -4.409, + "taller_mos_rows": 0.561, + "routing_tracks": -22.832, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C13/sky130/sW1_sL1.5/independent/C13_sky130_sW1_sL1p5_independent.gds", + "gds_mode": "runs/grid/C13/sky130/sW1_sL1.5/gate_only/C13_sky130_sW1_sL1p5_gate_only.gds", + "geometry_hash_ref": "412da5e2dc7903bd", + "geometry_hash_mode": "65f1459aaa8a3832", + "geometry_identical": false + }, + { + "case": "C13_sky130_sW1_sL1.5", + "topology": "C13", + "pdk": "sky130", + "size": "sW1_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 167.031, + "A1": 139.81, + "rel": -0.16297, + "class": "positive", + "W0": 18.715, + "H0": 8.925, + "W1": 18.075, + "H1": 7.735, + "dW": 0.64, + "dH": -1.19, + "condition_lhs_H0dW": 5.712, + "condition_rhs_W1dH": -21.5093, + "dH_mos_rows": 0.03, + "dH_channels": -1.22, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.07 + }, + "max_mos_row_span_saving": 0.07, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -0.541, + "stub_separation": -4.409, + "taller_mos_rows": 0.561, + "routing_tracks": -22.832, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C13/sky130/sW1_sL1.5/independent/C13_sky130_sW1_sL1p5_independent.gds", + "gds_mode": "runs/grid/C13/sky130/sW1_sL1.5/combined/C13_sky130_sW1_sL1p5_combined.gds", + "geometry_hash_ref": "412da5e2dc7903bd", + "geometry_hash_mode": "3191ef901f85d180", + "geometry_identical": false + }, + { + "case": "C13_sky130_sW1_sL1", + "topology": "C13", + "pdk": "sky130", + "size": "sW1_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 144.273, + "A1": 148.794, + "rel": 0.03134, + "class": "negative", + "W0": 16.165, + "H0": 8.925, + "W1": 15.605, + "H1": 9.535, + "dW": 0.56, + "dH": 0.61, + "condition_lhs_H0dW": 4.998, + "condition_rhs_W1dH": 9.519, + "dH_mos_rows": 0.0, + "dH_channels": 0.61, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -5.34, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 9.861, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C13/sky130/sW1_sL1/independent/C13_sky130_sW1_sL1_independent.gds", + "gds_mode": "runs/grid/C13/sky130/sW1_sL1/diffusion_only/C13_sky130_sW1_sL1_diffusion_only.gds", + "geometry_hash_ref": "7d23a4926cc2f6fb", + "geometry_hash_mode": "68c8b18a60b78a0e", + "geometry_identical": false, + "increase_terms": [ + "routing_tracks" + ], + "primary_mechanism": "routing_tracks" + }, + { + "case": "C13_sky130_sW1_sL1", + "topology": "C13", + "pdk": "sky130", + "size": "sW1_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 144.273, + "A1": 134.229, + "rel": -0.06961, + "class": "positive", + "W0": 16.165, + "H0": 8.925, + "W1": 16.085, + "H1": 8.345, + "dW": 0.08, + "dH": -0.58, + "condition_lhs_H0dW": 0.714, + "condition_rhs_W1dH": -9.3293, + "dH_mos_rows": 0.03, + "dH_channels": -0.61, + "dH_other": 0.0, + "row_span_saving": { + "n": -0.49 + }, + "max_mos_row_span_saving": -0.49, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 4.089, + "stub_separation": -4.757, + "taller_mos_rows": 0.485, + "routing_tracks": -9.861, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C13/sky130/sW1_sL1/independent/C13_sky130_sW1_sL1_independent.gds", + "gds_mode": "runs/grid/C13/sky130/sW1_sL1/gate_only/C13_sky130_sW1_sL1_gate_only.gds", + "geometry_hash_ref": "7d23a4926cc2f6fb", + "geometry_hash_mode": "6e68d111847a22c9", + "geometry_identical": false + }, + { + "case": "C13_sky130_sW1_sL1", + "topology": "C13", + "pdk": "sky130", + "size": "sW1_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 144.273, + "A1": 129.556, + "rel": -0.102, + "class": "positive", + "W0": 16.165, + "H0": 8.925, + "W1": 15.525, + "H1": 8.345, + "dW": 0.64, + "dH": -0.58, + "condition_lhs_H0dW": 5.712, + "condition_rhs_W1dH": -9.0045, + "dH_mos_rows": 0.03, + "dH_channels": -0.61, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.07 + }, + "max_mos_row_span_saving": 0.07, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -0.584, + "stub_separation": -4.757, + "taller_mos_rows": 0.485, + "routing_tracks": -9.861, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C13/sky130/sW1_sL1/independent/C13_sky130_sW1_sL1_independent.gds", + "gds_mode": "runs/grid/C13/sky130/sW1_sL1/combined/C13_sky130_sW1_sL1_combined.gds", + "geometry_hash_ref": "7d23a4926cc2f6fb", + "geometry_hash_mode": "391bb3af71cb62e1", + "geometry_identical": false + }, + { + "case": "C13_sky130_sW1_sL2", + "topology": "C13", + "pdk": "sky130", + "size": "sW1_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 189.79, + "A1": 184.792, + "rel": -0.02633, + "class": "positive", + "W0": 21.265, + "H0": 8.925, + "W1": 20.705, + "H1": 8.925, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 4.998, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -4.998, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C13/sky130/sW1_sL2/independent/C13_sky130_sW1_sL2_independent.gds", + "gds_mode": "runs/grid/C13/sky130/sW1_sL2/diffusion_only/C13_sky130_sW1_sL2_diffusion_only.gds", + "geometry_hash_ref": "97ef81017b088d4a", + "geometry_hash_mode": "2ea83e735d1174c8", + "geometry_identical": false + }, + { + "case": "C13_sky130_sW1_sL2", + "topology": "C13", + "pdk": "sky130", + "size": "sW1_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 189.79, + "A1": 163.866, + "rel": -0.13659, + "class": "positive", + "W0": 21.265, + "H0": 8.925, + "W1": 21.185, + "H1": 7.735, + "dW": 0.08, + "dH": -1.19, + "condition_lhs_H0dW": 0.714, + "condition_rhs_W1dH": -25.2102, + "dH_mos_rows": 0.03, + "dH_channels": -1.22, + "dH_other": 0.0, + "row_span_saving": { + "n": -0.49 + }, + "max_mos_row_span_saving": -0.49, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 3.79, + "stub_separation": -4.409, + "taller_mos_rows": 0.638, + "routing_tracks": -25.943, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C13/sky130/sW1_sL2/independent/C13_sky130_sW1_sL2_independent.gds", + "gds_mode": "runs/grid/C13/sky130/sW1_sL2/gate_only/C13_sky130_sW1_sL2_gate_only.gds", + "geometry_hash_ref": "97ef81017b088d4a", + "geometry_hash_mode": "f344c91917be175a", + "geometry_identical": false + }, + { + "case": "C13_sky130_sW1_sL2", + "topology": "C13", + "pdk": "sky130", + "size": "sW1_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 189.79, + "A1": 159.534, + "rel": -0.15942, + "class": "positive", + "W0": 21.265, + "H0": 8.925, + "W1": 20.625, + "H1": 7.735, + "dW": 0.64, + "dH": -1.19, + "condition_lhs_H0dW": 5.712, + "condition_rhs_W1dH": -24.5438, + "dH_mos_rows": 0.03, + "dH_channels": -1.22, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.07 + }, + "max_mos_row_span_saving": 0.07, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -0.541, + "stub_separation": -4.409, + "taller_mos_rows": 0.638, + "routing_tracks": -25.943, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C13/sky130/sW1_sL2/independent/C13_sky130_sW1_sL2_independent.gds", + "gds_mode": "runs/grid/C13/sky130/sW1_sL2/combined/C13_sky130_sW1_sL2_combined.gds", + "geometry_hash_ref": "97ef81017b088d4a", + "geometry_hash_mode": "91664f9934578abf", + "geometry_identical": false + }, + { + "case": "C13_sky130_sW2_sL1.5", + "topology": "C13", + "pdk": "sky130", + "size": "sW2_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 279.308, + "A1": 274.31, + "rel": -0.01789, + "class": "positive", + "W0": 31.295, + "H0": 8.925, + "W1": 30.735, + "H1": 8.925, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 4.998, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -4.998, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C13/sky130/sW2_sL1.5/independent/C13_sky130_sW2_sL1p5_independent.gds", + "gds_mode": "runs/grid/C13/sky130/sW2_sL1.5/diffusion_only/C13_sky130_sW2_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "9caea4f3cc19f612", + "geometry_hash_mode": "8bde71c4f99c2b75", + "geometry_identical": false + }, + { + "case": "C13_sky130_sW2_sL1.5", + "topology": "C13", + "pdk": "sky130", + "size": "sW2_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 279.308, + "A1": 241.448, + "rel": -0.13555, + "class": "positive", + "W0": 31.295, + "H0": 8.925, + "W1": 31.215, + "H1": 7.735, + "dW": 0.08, + "dH": -1.19, + "condition_lhs_H0dW": 0.714, + "condition_rhs_W1dH": -37.1459, + "dH_mos_rows": 0.03, + "dH_channels": -1.22, + "dH_other": 0.0, + "row_span_saving": { + "n": -0.49 + }, + "max_mos_row_span_saving": -0.49, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 3.79, + "stub_separation": -4.409, + "taller_mos_rows": 0.939, + "routing_tracks": -38.18, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C13/sky130/sW2_sL1.5/independent/C13_sky130_sW2_sL1p5_independent.gds", + "gds_mode": "runs/grid/C13/sky130/sW2_sL1.5/gate_only/C13_sky130_sW2_sL1p5_gate_only.gds", + "geometry_hash_ref": "9caea4f3cc19f612", + "geometry_hash_mode": "c58ada543cbf06a4", + "geometry_identical": false + }, + { + "case": "C13_sky130_sW2_sL1.5", + "topology": "C13", + "pdk": "sky130", + "size": "sW2_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 279.308, + "A1": 237.116, + "rel": -0.15106, + "class": "positive", + "W0": 31.295, + "H0": 8.925, + "W1": 30.655, + "H1": 7.735, + "dW": 0.64, + "dH": -1.19, + "condition_lhs_H0dW": 5.712, + "condition_rhs_W1dH": -36.4795, + "dH_mos_rows": 0.03, + "dH_channels": -1.22, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.07 + }, + "max_mos_row_span_saving": 0.07, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -0.541, + "stub_separation": -4.409, + "taller_mos_rows": 0.939, + "routing_tracks": -38.18, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C13/sky130/sW2_sL1.5/independent/C13_sky130_sW2_sL1p5_independent.gds", + "gds_mode": "runs/grid/C13/sky130/sW2_sL1.5/combined/C13_sky130_sW2_sL1p5_combined.gds", + "geometry_hash_ref": "9caea4f3cc19f612", + "geometry_hash_mode": "abecc67c3be6bfbd", + "geometry_identical": false + }, + { + "case": "C13_sky130_sW2_sL1", + "topology": "C13", + "pdk": "sky130", + "size": "sW2_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 233.79, + "A1": 244.43, + "rel": 0.04551, + "class": "negative", + "W0": 26.195, + "H0": 8.925, + "W1": 25.635, + "H1": 9.535, + "dW": 0.56, + "dH": 0.61, + "condition_lhs_H0dW": 4.998, + "condition_rhs_W1dH": 15.6373, + "dH_mos_rows": 0.0, + "dH_channels": 0.61, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -5.34, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 15.979, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C13/sky130/sW2_sL1/independent/C13_sky130_sW2_sL1_independent.gds", + "gds_mode": "runs/grid/C13/sky130/sW2_sL1/diffusion_only/C13_sky130_sW2_sL1_diffusion_only.gds", + "geometry_hash_ref": "55a626e9f6c7ce1e", + "geometry_hash_mode": "935978888f20e587", + "geometry_identical": false, + "increase_terms": [ + "routing_tracks" + ], + "primary_mechanism": "routing_tracks" + }, + { + "case": "C13_sky130_sW2_sL1", + "topology": "C13", + "pdk": "sky130", + "size": "sW2_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 233.79, + "A1": 217.93, + "rel": -0.06784, + "class": "positive", + "W0": 26.195, + "H0": 8.925, + "W1": 26.115, + "H1": 8.345, + "dW": 0.08, + "dH": -0.58, + "condition_lhs_H0dW": 0.714, + "condition_rhs_W1dH": -15.1467, + "dH_mos_rows": 0.03, + "dH_channels": -0.61, + "dH_other": 0.0, + "row_span_saving": { + "n": -0.49 + }, + "max_mos_row_span_saving": -0.49, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 4.089, + "stub_separation": -4.757, + "taller_mos_rows": 0.786, + "routing_tracks": -15.979, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C13/sky130/sW2_sL1/independent/C13_sky130_sW2_sL1_independent.gds", + "gds_mode": "runs/grid/C13/sky130/sW2_sL1/gate_only/C13_sky130_sW2_sL1_gate_only.gds", + "geometry_hash_ref": "55a626e9f6c7ce1e", + "geometry_hash_mode": "56b142a4cc05e3ce", + "geometry_identical": false + }, + { + "case": "C13_sky130_sW2_sL1", + "topology": "C13", + "pdk": "sky130", + "size": "sW2_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 233.79, + "A1": 213.256, + "rel": -0.08783, + "class": "positive", + "W0": 26.195, + "H0": 8.925, + "W1": 25.555, + "H1": 8.345, + "dW": 0.64, + "dH": -0.58, + "condition_lhs_H0dW": 5.712, + "condition_rhs_W1dH": -14.8219, + "dH_mos_rows": 0.03, + "dH_channels": -0.61, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.07 + }, + "max_mos_row_span_saving": 0.07, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -0.584, + "stub_separation": -4.757, + "taller_mos_rows": 0.786, + "routing_tracks": -15.979, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C13/sky130/sW2_sL1/independent/C13_sky130_sW2_sL1_independent.gds", + "gds_mode": "runs/grid/C13/sky130/sW2_sL1/combined/C13_sky130_sW2_sL1_combined.gds", + "geometry_hash_ref": "55a626e9f6c7ce1e", + "geometry_hash_mode": "8af4e567da98f3af", + "geometry_identical": false + }, + { + "case": "C13_sky130_sW2_sL2", + "topology": "C13", + "pdk": "sky130", + "size": "sW2_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 324.825, + "A1": 319.827, + "rel": -0.01539, + "class": "positive", + "W0": 36.395, + "H0": 8.925, + "W1": 35.835, + "H1": 8.925, + "dW": 0.56, + "dH": 0.0, + "condition_lhs_H0dW": 4.998, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -4.998, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C13/sky130/sW2_sL2/independent/C13_sky130_sW2_sL2_independent.gds", + "gds_mode": "runs/grid/C13/sky130/sW2_sL2/diffusion_only/C13_sky130_sW2_sL2_diffusion_only.gds", + "geometry_hash_ref": "7b5286b622374866", + "geometry_hash_mode": "7007c056ab89bfb8", + "geometry_identical": false + }, + { + "case": "C13_sky130_sW2_sL2", + "topology": "C13", + "pdk": "sky130", + "size": "sW2_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 324.825, + "A1": 280.897, + "rel": -0.13524, + "class": "positive", + "W0": 36.395, + "H0": 8.925, + "W1": 36.315, + "H1": 7.735, + "dW": 0.08, + "dH": -1.19, + "condition_lhs_H0dW": 0.714, + "condition_rhs_W1dH": -43.2149, + "dH_mos_rows": 0.03, + "dH_channels": -1.22, + "dH_other": 0.0, + "row_span_saving": { + "n": -0.49 + }, + "max_mos_row_span_saving": -0.49, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 3.79, + "stub_separation": -4.409, + "taller_mos_rows": 1.092, + "routing_tracks": -44.402, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C13/sky130/sW2_sL2/independent/C13_sky130_sW2_sL2_independent.gds", + "gds_mode": "runs/grid/C13/sky130/sW2_sL2/gate_only/C13_sky130_sW2_sL2_gate_only.gds", + "geometry_hash_ref": "7b5286b622374866", + "geometry_hash_mode": "3a596f663b923956", + "geometry_identical": false + }, + { + "case": "C13_sky130_sW2_sL2", + "topology": "C13", + "pdk": "sky130", + "size": "sW2_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 324.825, + "A1": 276.565, + "rel": -0.14857, + "class": "positive", + "W0": 36.395, + "H0": 8.925, + "W1": 35.755, + "H1": 7.735, + "dW": 0.64, + "dH": -1.19, + "condition_lhs_H0dW": 5.712, + "condition_rhs_W1dH": -42.5485, + "dH_mos_rows": 0.03, + "dH_channels": -1.22, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.07 + }, + "max_mos_row_span_saving": 0.07, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -0.541, + "stub_separation": -4.409, + "taller_mos_rows": 1.092, + "routing_tracks": -44.402, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C13/sky130/sW2_sL2/independent/C13_sky130_sW2_sL2_independent.gds", + "gds_mode": "runs/grid/C13/sky130/sW2_sL2/combined/C13_sky130_sW2_sL2_combined.gds", + "geometry_hash_ref": "7b5286b622374866", + "geometry_hash_mode": "78cc7e6bbc58c6a1", + "geometry_identical": false + }, + { + "case": "C14_gf180_sW0.5_sL1.5", + "topology": "C14", + "pdk": "gf180", + "size": "sW0.5_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 299.43, + "A1": 279.334, + "rel": -0.06711, + "class": "positive", + "W0": 23.84, + "H0": 12.56, + "W1": 22.24, + "H1": 12.56, + "dW": 1.6, + "dH": 0.0, + "condition_lhs_H0dW": 20.096, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.6 + }, + "max_mos_row_span_saving": 1.6, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -20.096, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/gf180/sW0.5_sL1.5/independent/C14_gf180_sW0p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C14/gf180/sW0.5_sL1.5/diffusion_only/C14_gf180_sW0p5_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "f9e0a0d93b637de1", + "geometry_hash_mode": "16f929f5bd266625", + "geometry_identical": false + }, + { + "case": "C14_gf180_sW0.5_sL1.5", + "topology": "C14", + "pdk": "gf180", + "size": "sW0.5_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 299.43, + "A1": 299.43, + "rel": 0.0, + "class": "neutral", + "W0": 23.84, + "H0": 12.56, + "W1": 23.84, + "H1": 12.56, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/gf180/sW0.5_sL1.5/independent/C14_gf180_sW0p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C14/gf180/sW0.5_sL1.5/gate_only/C14_gf180_sW0p5_sL1p5_gate_only.gds", + "geometry_hash_ref": "f9e0a0d93b637de1", + "geometry_hash_mode": "1b6da85ca9b9b581", + "geometry_identical": false + }, + { + "case": "C14_gf180_sW0.5_sL1.5", + "topology": "C14", + "pdk": "gf180", + "size": "sW0.5_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 299.43, + "A1": 279.334, + "rel": -0.06711, + "class": "positive", + "W0": 23.84, + "H0": 12.56, + "W1": 22.24, + "H1": 12.56, + "dW": 1.6, + "dH": 0.0, + "condition_lhs_H0dW": 20.096, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.6 + }, + "max_mos_row_span_saving": 1.6, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -20.096, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/gf180/sW0.5_sL1.5/independent/C14_gf180_sW0p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C14/gf180/sW0.5_sL1.5/combined/C14_gf180_sW0p5_sL1p5_combined.gds", + "geometry_hash_ref": "f9e0a0d93b637de1", + "geometry_hash_mode": "da6ec6704559bf53", + "geometry_identical": false + }, + { + "case": "C14_gf180_sW0.5_sL1", + "topology": "C14", + "pdk": "gf180", + "size": "sW0.5_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 250.195, + "A1": 230.099, + "rel": -0.08032, + "class": "positive", + "W0": 19.92, + "H0": 12.56, + "W1": 18.32, + "H1": 12.56, + "dW": 1.6, + "dH": 0.0, + "condition_lhs_H0dW": 20.096, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.6 + }, + "max_mos_row_span_saving": 1.6, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -20.096, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/gf180/sW0.5_sL1/independent/C14_gf180_sW0p5_sL1_independent.gds", + "gds_mode": "runs/grid/C14/gf180/sW0.5_sL1/diffusion_only/C14_gf180_sW0p5_sL1_diffusion_only.gds", + "geometry_hash_ref": "32c34fb2e0e9c2ea", + "geometry_hash_mode": "e2cba12cd3f95e81", + "geometry_identical": false + }, + { + "case": "C14_gf180_sW0.5_sL1", + "topology": "C14", + "pdk": "gf180", + "size": "sW0.5_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 250.195, + "A1": 250.195, + "rel": 0.0, + "class": "neutral", + "W0": 19.92, + "H0": 12.56, + "W1": 19.92, + "H1": 12.56, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/gf180/sW0.5_sL1/independent/C14_gf180_sW0p5_sL1_independent.gds", + "gds_mode": "runs/grid/C14/gf180/sW0.5_sL1/gate_only/C14_gf180_sW0p5_sL1_gate_only.gds", + "geometry_hash_ref": "32c34fb2e0e9c2ea", + "geometry_hash_mode": "1ac945d1137e639e", + "geometry_identical": false + }, + { + "case": "C14_gf180_sW0.5_sL1", + "topology": "C14", + "pdk": "gf180", + "size": "sW0.5_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 250.195, + "A1": 230.099, + "rel": -0.08032, + "class": "positive", + "W0": 19.92, + "H0": 12.56, + "W1": 18.32, + "H1": 12.56, + "dW": 1.6, + "dH": 0.0, + "condition_lhs_H0dW": 20.096, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.6 + }, + "max_mos_row_span_saving": 1.6, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -20.096, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/gf180/sW0.5_sL1/independent/C14_gf180_sW0p5_sL1_independent.gds", + "gds_mode": "runs/grid/C14/gf180/sW0.5_sL1/combined/C14_gf180_sW0p5_sL1_combined.gds", + "geometry_hash_ref": "32c34fb2e0e9c2ea", + "geometry_hash_mode": "22bcf3a5ba1978c8", + "geometry_identical": false + }, + { + "case": "C14_gf180_sW0.5_sL2", + "topology": "C14", + "pdk": "gf180", + "size": "sW0.5_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 348.666, + "A1": 328.57, + "rel": -0.05764, + "class": "positive", + "W0": 27.76, + "H0": 12.56, + "W1": 26.16, + "H1": 12.56, + "dW": 1.6, + "dH": 0.0, + "condition_lhs_H0dW": 20.096, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.6 + }, + "max_mos_row_span_saving": 1.6, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -20.096, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/gf180/sW0.5_sL2/independent/C14_gf180_sW0p5_sL2_independent.gds", + "gds_mode": "runs/grid/C14/gf180/sW0.5_sL2/diffusion_only/C14_gf180_sW0p5_sL2_diffusion_only.gds", + "geometry_hash_ref": "27c45742e60df236", + "geometry_hash_mode": "b881ec47f8bc4b97", + "geometry_identical": false + }, + { + "case": "C14_gf180_sW0.5_sL2", + "topology": "C14", + "pdk": "gf180", + "size": "sW0.5_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 348.666, + "A1": 348.666, + "rel": 0.0, + "class": "neutral", + "W0": 27.76, + "H0": 12.56, + "W1": 27.76, + "H1": 12.56, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/gf180/sW0.5_sL2/independent/C14_gf180_sW0p5_sL2_independent.gds", + "gds_mode": "runs/grid/C14/gf180/sW0.5_sL2/gate_only/C14_gf180_sW0p5_sL2_gate_only.gds", + "geometry_hash_ref": "27c45742e60df236", + "geometry_hash_mode": "24534dcbd25bbba0", + "geometry_identical": false + }, + { + "case": "C14_gf180_sW0.5_sL2", + "topology": "C14", + "pdk": "gf180", + "size": "sW0.5_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 348.666, + "A1": 328.57, + "rel": -0.05764, + "class": "positive", + "W0": 27.76, + "H0": 12.56, + "W1": 26.16, + "H1": 12.56, + "dW": 1.6, + "dH": 0.0, + "condition_lhs_H0dW": 20.096, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.6 + }, + "max_mos_row_span_saving": 1.6, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -20.096, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/gf180/sW0.5_sL2/independent/C14_gf180_sW0p5_sL2_independent.gds", + "gds_mode": "runs/grid/C14/gf180/sW0.5_sL2/combined/C14_gf180_sW0p5_sL2_combined.gds", + "geometry_hash_ref": "27c45742e60df236", + "geometry_hash_mode": "7d83217596e20952", + "geometry_identical": false + }, + { + "case": "C14_gf180_sW1.5_sL1.5", + "topology": "C14", + "pdk": "gf180", + "size": "sW1.5_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 693.312, + "A1": 673.216, + "rel": -0.02899, + "class": "positive", + "W0": 55.2, + "H0": 12.56, + "W1": 53.6, + "H1": 12.56, + "dW": 1.6, + "dH": 0.0, + "condition_lhs_H0dW": 20.096, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.6 + }, + "max_mos_row_span_saving": 1.6, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -20.096, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/gf180/sW1.5_sL1.5/independent/C14_gf180_sW1p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C14/gf180/sW1.5_sL1.5/diffusion_only/C14_gf180_sW1p5_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "bf4b697f40f3d013", + "geometry_hash_mode": "f35f6dbfec04dbcb", + "geometry_identical": false + }, + { + "case": "C14_gf180_sW1.5_sL1.5", + "topology": "C14", + "pdk": "gf180", + "size": "sW1.5_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 693.312, + "A1": 693.312, + "rel": 0.0, + "class": "neutral", + "W0": 55.2, + "H0": 12.56, + "W1": 55.2, + "H1": 12.56, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/gf180/sW1.5_sL1.5/independent/C14_gf180_sW1p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C14/gf180/sW1.5_sL1.5/gate_only/C14_gf180_sW1p5_sL1p5_gate_only.gds", + "geometry_hash_ref": "bf4b697f40f3d013", + "geometry_hash_mode": "01452932d0a71c32", + "geometry_identical": false + }, + { + "case": "C14_gf180_sW1.5_sL1.5", + "topology": "C14", + "pdk": "gf180", + "size": "sW1.5_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 693.312, + "A1": 673.216, + "rel": -0.02899, + "class": "positive", + "W0": 55.2, + "H0": 12.56, + "W1": 53.6, + "H1": 12.56, + "dW": 1.6, + "dH": 0.0, + "condition_lhs_H0dW": 20.096, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.6 + }, + "max_mos_row_span_saving": 1.6, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -20.096, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/gf180/sW1.5_sL1.5/independent/C14_gf180_sW1p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C14/gf180/sW1.5_sL1.5/combined/C14_gf180_sW1p5_sL1p5_combined.gds", + "geometry_hash_ref": "bf4b697f40f3d013", + "geometry_hash_mode": "2d875d2860d65fe4", + "geometry_identical": false + }, + { + "case": "C14_gf180_sW1.5_sL1", + "topology": "C14", + "pdk": "gf180", + "size": "sW1.5_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 545.606, + "A1": 525.51, + "rel": -0.03683, + "class": "positive", + "W0": 43.44, + "H0": 12.56, + "W1": 41.84, + "H1": 12.56, + "dW": 1.6, + "dH": 0.0, + "condition_lhs_H0dW": 20.096, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.6 + }, + "max_mos_row_span_saving": 1.6, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -20.096, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/gf180/sW1.5_sL1/independent/C14_gf180_sW1p5_sL1_independent.gds", + "gds_mode": "runs/grid/C14/gf180/sW1.5_sL1/diffusion_only/C14_gf180_sW1p5_sL1_diffusion_only.gds", + "geometry_hash_ref": "4bf082fea4ea5f86", + "geometry_hash_mode": "65c02c2f4e96787a", + "geometry_identical": false + }, + { + "case": "C14_gf180_sW1.5_sL1", + "topology": "C14", + "pdk": "gf180", + "size": "sW1.5_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 545.606, + "A1": 545.606, + "rel": 0.0, + "class": "neutral", + "W0": 43.44, + "H0": 12.56, + "W1": 43.44, + "H1": 12.56, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/gf180/sW1.5_sL1/independent/C14_gf180_sW1p5_sL1_independent.gds", + "gds_mode": "runs/grid/C14/gf180/sW1.5_sL1/gate_only/C14_gf180_sW1p5_sL1_gate_only.gds", + "geometry_hash_ref": "4bf082fea4ea5f86", + "geometry_hash_mode": "81f93e4525ed54c7", + "geometry_identical": false + }, + { + "case": "C14_gf180_sW1.5_sL1", + "topology": "C14", + "pdk": "gf180", + "size": "sW1.5_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 545.606, + "A1": 525.51, + "rel": -0.03683, + "class": "positive", + "W0": 43.44, + "H0": 12.56, + "W1": 41.84, + "H1": 12.56, + "dW": 1.6, + "dH": 0.0, + "condition_lhs_H0dW": 20.096, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.6 + }, + "max_mos_row_span_saving": 1.6, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -20.096, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/gf180/sW1.5_sL1/independent/C14_gf180_sW1p5_sL1_independent.gds", + "gds_mode": "runs/grid/C14/gf180/sW1.5_sL1/combined/C14_gf180_sW1p5_sL1_combined.gds", + "geometry_hash_ref": "4bf082fea4ea5f86", + "geometry_hash_mode": "484e70f2e06aec51", + "geometry_identical": false + }, + { + "case": "C14_gf180_sW1.5_sL2", + "topology": "C14", + "pdk": "gf180", + "size": "sW1.5_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 841.018, + "A1": 820.922, + "rel": -0.02389, + "class": "positive", + "W0": 66.96, + "H0": 12.56, + "W1": 65.36, + "H1": 12.56, + "dW": 1.6, + "dH": 0.0, + "condition_lhs_H0dW": 20.096, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.6 + }, + "max_mos_row_span_saving": 1.6, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -20.096, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/gf180/sW1.5_sL2/independent/C14_gf180_sW1p5_sL2_independent.gds", + "gds_mode": "runs/grid/C14/gf180/sW1.5_sL2/diffusion_only/C14_gf180_sW1p5_sL2_diffusion_only.gds", + "geometry_hash_ref": "9fdbf1e6ffa940be", + "geometry_hash_mode": "29bf56c8a1b2d512", + "geometry_identical": false + }, + { + "case": "C14_gf180_sW1.5_sL2", + "topology": "C14", + "pdk": "gf180", + "size": "sW1.5_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 841.018, + "A1": 841.018, + "rel": 0.0, + "class": "neutral", + "W0": 66.96, + "H0": 12.56, + "W1": 66.96, + "H1": 12.56, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/gf180/sW1.5_sL2/independent/C14_gf180_sW1p5_sL2_independent.gds", + "gds_mode": "runs/grid/C14/gf180/sW1.5_sL2/gate_only/C14_gf180_sW1p5_sL2_gate_only.gds", + "geometry_hash_ref": "9fdbf1e6ffa940be", + "geometry_hash_mode": "6dff05f412332258", + "geometry_identical": false + }, + { + "case": "C14_gf180_sW1.5_sL2", + "topology": "C14", + "pdk": "gf180", + "size": "sW1.5_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 841.018, + "A1": 820.922, + "rel": -0.02389, + "class": "positive", + "W0": 66.96, + "H0": 12.56, + "W1": 65.36, + "H1": 12.56, + "dW": 1.6, + "dH": 0.0, + "condition_lhs_H0dW": 20.096, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.6 + }, + "max_mos_row_span_saving": 1.6, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -20.096, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/gf180/sW1.5_sL2/independent/C14_gf180_sW1p5_sL2_independent.gds", + "gds_mode": "runs/grid/C14/gf180/sW1.5_sL2/combined/C14_gf180_sW1p5_sL2_combined.gds", + "geometry_hash_ref": "9fdbf1e6ffa940be", + "geometry_hash_mode": "bb2730be14db1a8d", + "geometry_identical": false + }, + { + "case": "C14_gf180_sW1_sL1.5", + "topology": "C14", + "pdk": "gf180", + "size": "sW1_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 496.371, + "A1": 476.275, + "rel": -0.04049, + "class": "positive", + "W0": 39.52, + "H0": 12.56, + "W1": 37.92, + "H1": 12.56, + "dW": 1.6, + "dH": 0.0, + "condition_lhs_H0dW": 20.096, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.6 + }, + "max_mos_row_span_saving": 1.6, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -20.096, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/gf180/sW1_sL1.5/independent/C14_gf180_sW1_sL1p5_independent.gds", + "gds_mode": "runs/grid/C14/gf180/sW1_sL1.5/diffusion_only/C14_gf180_sW1_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "39caf34e6706f781", + "geometry_hash_mode": "d3f08400cfeac194", + "geometry_identical": false + }, + { + "case": "C14_gf180_sW1_sL1.5", + "topology": "C14", + "pdk": "gf180", + "size": "sW1_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 496.371, + "A1": 496.371, + "rel": 0.0, + "class": "neutral", + "W0": 39.52, + "H0": 12.56, + "W1": 39.52, + "H1": 12.56, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/gf180/sW1_sL1.5/independent/C14_gf180_sW1_sL1p5_independent.gds", + "gds_mode": "runs/grid/C14/gf180/sW1_sL1.5/gate_only/C14_gf180_sW1_sL1p5_gate_only.gds", + "geometry_hash_ref": "39caf34e6706f781", + "geometry_hash_mode": "793b7f70665481e0", + "geometry_identical": false + }, + { + "case": "C14_gf180_sW1_sL1.5", + "topology": "C14", + "pdk": "gf180", + "size": "sW1_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 496.371, + "A1": 476.275, + "rel": -0.04049, + "class": "positive", + "W0": 39.52, + "H0": 12.56, + "W1": 37.92, + "H1": 12.56, + "dW": 1.6, + "dH": 0.0, + "condition_lhs_H0dW": 20.096, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.6 + }, + "max_mos_row_span_saving": 1.6, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -20.096, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/gf180/sW1_sL1.5/independent/C14_gf180_sW1_sL1p5_independent.gds", + "gds_mode": "runs/grid/C14/gf180/sW1_sL1.5/combined/C14_gf180_sW1_sL1p5_combined.gds", + "geometry_hash_ref": "39caf34e6706f781", + "geometry_hash_mode": "b85c6f3929a1ce6f", + "geometry_identical": false + }, + { + "case": "C14_gf180_sW1_sL1", + "topology": "C14", + "pdk": "gf180", + "size": "sW1_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 397.901, + "A1": 377.805, + "rel": -0.05051, + "class": "positive", + "W0": 31.68, + "H0": 12.56, + "W1": 30.08, + "H1": 12.56, + "dW": 1.6, + "dH": 0.0, + "condition_lhs_H0dW": 20.096, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.6 + }, + "max_mos_row_span_saving": 1.6, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -20.096, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/gf180/sW1_sL1/independent/C14_gf180_sW1_sL1_independent.gds", + "gds_mode": "runs/grid/C14/gf180/sW1_sL1/diffusion_only/C14_gf180_sW1_sL1_diffusion_only.gds", + "geometry_hash_ref": "1dc9efbf24e534de", + "geometry_hash_mode": "191f1090152d3caa", + "geometry_identical": false + }, + { + "case": "C14_gf180_sW1_sL1", + "topology": "C14", + "pdk": "gf180", + "size": "sW1_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 397.901, + "A1": 397.901, + "rel": 0.0, + "class": "neutral", + "W0": 31.68, + "H0": 12.56, + "W1": 31.68, + "H1": 12.56, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/gf180/sW1_sL1/independent/C14_gf180_sW1_sL1_independent.gds", + "gds_mode": "runs/grid/C14/gf180/sW1_sL1/gate_only/C14_gf180_sW1_sL1_gate_only.gds", + "geometry_hash_ref": "1dc9efbf24e534de", + "geometry_hash_mode": "134210cde37c68e1", + "geometry_identical": false + }, + { + "case": "C14_gf180_sW1_sL1", + "topology": "C14", + "pdk": "gf180", + "size": "sW1_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 397.901, + "A1": 377.805, + "rel": -0.05051, + "class": "positive", + "W0": 31.68, + "H0": 12.56, + "W1": 30.08, + "H1": 12.56, + "dW": 1.6, + "dH": 0.0, + "condition_lhs_H0dW": 20.096, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.6 + }, + "max_mos_row_span_saving": 1.6, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -20.096, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/gf180/sW1_sL1/independent/C14_gf180_sW1_sL1_independent.gds", + "gds_mode": "runs/grid/C14/gf180/sW1_sL1/combined/C14_gf180_sW1_sL1_combined.gds", + "geometry_hash_ref": "1dc9efbf24e534de", + "geometry_hash_mode": "f6f35c5ad4f6d977", + "geometry_identical": false + }, + { + "case": "C14_gf180_sW1_sL2", + "topology": "C14", + "pdk": "gf180", + "size": "sW1_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 594.842, + "A1": 574.746, + "rel": -0.03378, + "class": "positive", + "W0": 47.36, + "H0": 12.56, + "W1": 45.76, + "H1": 12.56, + "dW": 1.6, + "dH": 0.0, + "condition_lhs_H0dW": 20.096, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.6 + }, + "max_mos_row_span_saving": 1.6, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -20.096, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/gf180/sW1_sL2/independent/C14_gf180_sW1_sL2_independent.gds", + "gds_mode": "runs/grid/C14/gf180/sW1_sL2/diffusion_only/C14_gf180_sW1_sL2_diffusion_only.gds", + "geometry_hash_ref": "47209999401e7725", + "geometry_hash_mode": "c79f4cdba76f66a4", + "geometry_identical": false + }, + { + "case": "C14_gf180_sW1_sL2", + "topology": "C14", + "pdk": "gf180", + "size": "sW1_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 594.842, + "A1": 594.842, + "rel": 0.0, + "class": "neutral", + "W0": 47.36, + "H0": 12.56, + "W1": 47.36, + "H1": 12.56, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/gf180/sW1_sL2/independent/C14_gf180_sW1_sL2_independent.gds", + "gds_mode": "runs/grid/C14/gf180/sW1_sL2/gate_only/C14_gf180_sW1_sL2_gate_only.gds", + "geometry_hash_ref": "47209999401e7725", + "geometry_hash_mode": "924321489b2c9970", + "geometry_identical": false + }, + { + "case": "C14_gf180_sW1_sL2", + "topology": "C14", + "pdk": "gf180", + "size": "sW1_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 594.842, + "A1": 574.746, + "rel": -0.03378, + "class": "positive", + "W0": 47.36, + "H0": 12.56, + "W1": 45.76, + "H1": 12.56, + "dW": 1.6, + "dH": 0.0, + "condition_lhs_H0dW": 20.096, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.6 + }, + "max_mos_row_span_saving": 1.6, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -20.096, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/gf180/sW1_sL2/independent/C14_gf180_sW1_sL2_independent.gds", + "gds_mode": "runs/grid/C14/gf180/sW1_sL2/combined/C14_gf180_sW1_sL2_combined.gds", + "geometry_hash_ref": "47209999401e7725", + "geometry_hash_mode": "feb435c6fc870441", + "geometry_identical": false + }, + { + "case": "C14_gf180_sW2_sL1.5", + "topology": "C14", + "pdk": "gf180", + "size": "sW2_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 890.253, + "A1": 870.157, + "rel": -0.02257, + "class": "positive", + "W0": 70.88, + "H0": 12.56, + "W1": 69.28, + "H1": 12.56, + "dW": 1.6, + "dH": 0.0, + "condition_lhs_H0dW": 20.096, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.6 + }, + "max_mos_row_span_saving": 1.6, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -20.096, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/gf180/sW2_sL1.5/independent/C14_gf180_sW2_sL1p5_independent.gds", + "gds_mode": "runs/grid/C14/gf180/sW2_sL1.5/diffusion_only/C14_gf180_sW2_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "28548db5763cd9a4", + "geometry_hash_mode": "5fa57c741fca231f", + "geometry_identical": false + }, + { + "case": "C14_gf180_sW2_sL1.5", + "topology": "C14", + "pdk": "gf180", + "size": "sW2_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 890.253, + "A1": 890.253, + "rel": 0.0, + "class": "neutral", + "W0": 70.88, + "H0": 12.56, + "W1": 70.88, + "H1": 12.56, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/gf180/sW2_sL1.5/independent/C14_gf180_sW2_sL1p5_independent.gds", + "gds_mode": "runs/grid/C14/gf180/sW2_sL1.5/gate_only/C14_gf180_sW2_sL1p5_gate_only.gds", + "geometry_hash_ref": "28548db5763cd9a4", + "geometry_hash_mode": "92a634e50a19228e", + "geometry_identical": false + }, + { + "case": "C14_gf180_sW2_sL1.5", + "topology": "C14", + "pdk": "gf180", + "size": "sW2_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 890.253, + "A1": 870.157, + "rel": -0.02257, + "class": "positive", + "W0": 70.88, + "H0": 12.56, + "W1": 69.28, + "H1": 12.56, + "dW": 1.6, + "dH": 0.0, + "condition_lhs_H0dW": 20.096, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.6 + }, + "max_mos_row_span_saving": 1.6, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -20.096, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/gf180/sW2_sL1.5/independent/C14_gf180_sW2_sL1p5_independent.gds", + "gds_mode": "runs/grid/C14/gf180/sW2_sL1.5/combined/C14_gf180_sW2_sL1p5_combined.gds", + "geometry_hash_ref": "28548db5763cd9a4", + "geometry_hash_mode": "7d02fff9400a6821", + "geometry_identical": false + }, + { + "case": "C14_gf180_sW2_sL1", + "topology": "C14", + "pdk": "gf180", + "size": "sW2_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 693.312, + "A1": 673.216, + "rel": -0.02899, + "class": "positive", + "W0": 55.2, + "H0": 12.56, + "W1": 53.6, + "H1": 12.56, + "dW": 1.6, + "dH": 0.0, + "condition_lhs_H0dW": 20.096, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.6 + }, + "max_mos_row_span_saving": 1.6, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -20.096, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/gf180/sW2_sL1/independent/C14_gf180_sW2_sL1_independent.gds", + "gds_mode": "runs/grid/C14/gf180/sW2_sL1/diffusion_only/C14_gf180_sW2_sL1_diffusion_only.gds", + "geometry_hash_ref": "245fc63b8d2fc8a4", + "geometry_hash_mode": "419f5905b0ffa9c0", + "geometry_identical": false + }, + { + "case": "C14_gf180_sW2_sL1", + "topology": "C14", + "pdk": "gf180", + "size": "sW2_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 693.312, + "A1": 693.312, + "rel": 0.0, + "class": "neutral", + "W0": 55.2, + "H0": 12.56, + "W1": 55.2, + "H1": 12.56, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/gf180/sW2_sL1/independent/C14_gf180_sW2_sL1_independent.gds", + "gds_mode": "runs/grid/C14/gf180/sW2_sL1/gate_only/C14_gf180_sW2_sL1_gate_only.gds", + "geometry_hash_ref": "245fc63b8d2fc8a4", + "geometry_hash_mode": "93f104cb2162a2ac", + "geometry_identical": false + }, + { + "case": "C14_gf180_sW2_sL1", + "topology": "C14", + "pdk": "gf180", + "size": "sW2_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 693.312, + "A1": 673.216, + "rel": -0.02899, + "class": "positive", + "W0": 55.2, + "H0": 12.56, + "W1": 53.6, + "H1": 12.56, + "dW": 1.6, + "dH": 0.0, + "condition_lhs_H0dW": 20.096, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.6 + }, + "max_mos_row_span_saving": 1.6, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -20.096, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/gf180/sW2_sL1/independent/C14_gf180_sW2_sL1_independent.gds", + "gds_mode": "runs/grid/C14/gf180/sW2_sL1/combined/C14_gf180_sW2_sL1_combined.gds", + "geometry_hash_ref": "245fc63b8d2fc8a4", + "geometry_hash_mode": "f93ac9520c0292ea", + "geometry_identical": false + }, + { + "case": "C14_gf180_sW2_sL2", + "topology": "C14", + "pdk": "gf180", + "size": "sW2_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1087.194, + "A1": 1067.098, + "rel": -0.01848, + "class": "positive", + "W0": 86.56, + "H0": 12.56, + "W1": 84.96, + "H1": 12.56, + "dW": 1.6, + "dH": 0.0, + "condition_lhs_H0dW": 20.096, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.6 + }, + "max_mos_row_span_saving": 1.6, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -20.096, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/gf180/sW2_sL2/independent/C14_gf180_sW2_sL2_independent.gds", + "gds_mode": "runs/grid/C14/gf180/sW2_sL2/diffusion_only/C14_gf180_sW2_sL2_diffusion_only.gds", + "geometry_hash_ref": "fe0c03675a6b70d3", + "geometry_hash_mode": "cec5bc3f3132fe47", + "geometry_identical": false + }, + { + "case": "C14_gf180_sW2_sL2", + "topology": "C14", + "pdk": "gf180", + "size": "sW2_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1087.194, + "A1": 1087.194, + "rel": 0.0, + "class": "neutral", + "W0": 86.56, + "H0": 12.56, + "W1": 86.56, + "H1": 12.56, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/gf180/sW2_sL2/independent/C14_gf180_sW2_sL2_independent.gds", + "gds_mode": "runs/grid/C14/gf180/sW2_sL2/gate_only/C14_gf180_sW2_sL2_gate_only.gds", + "geometry_hash_ref": "fe0c03675a6b70d3", + "geometry_hash_mode": "dcd6f54fe0bafaee", + "geometry_identical": false + }, + { + "case": "C14_gf180_sW2_sL2", + "topology": "C14", + "pdk": "gf180", + "size": "sW2_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1087.194, + "A1": 1067.098, + "rel": -0.01848, + "class": "positive", + "W0": 86.56, + "H0": 12.56, + "W1": 84.96, + "H1": 12.56, + "dW": 1.6, + "dH": 0.0, + "condition_lhs_H0dW": 20.096, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.6 + }, + "max_mos_row_span_saving": 1.6, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -20.096, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/gf180/sW2_sL2/independent/C14_gf180_sW2_sL2_independent.gds", + "gds_mode": "runs/grid/C14/gf180/sW2_sL2/combined/C14_gf180_sW2_sL2_combined.gds", + "geometry_hash_ref": "fe0c03675a6b70d3", + "geometry_hash_mode": "98384197059b2e38", + "geometry_identical": false + }, + { + "case": "C14_ihp130_sW0.5_sL1.5", + "topology": "C14", + "pdk": "ihp130", + "size": "sW0.5_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 174.662, + "A1": 165.278, + "rel": -0.05373, + "class": "positive", + "W0": 18.985, + "H0": 9.2, + "W1": 17.965, + "H1": 9.2, + "dW": 1.02, + "dH": 0.0, + "condition_lhs_H0dW": 9.384, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.02 + }, + "max_mos_row_span_saving": 1.02, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -9.384, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/ihp130/sW0.5_sL1.5/independent/C14_ihp130_sW0p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C14/ihp130/sW0.5_sL1.5/diffusion_only/C14_ihp130_sW0p5_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "1837b0453e03c7ac", + "geometry_hash_mode": "8d612e8cb4fd7e01", + "geometry_identical": false + }, + { + "case": "C14_ihp130_sW0.5_sL1.5", + "topology": "C14", + "pdk": "ihp130", + "size": "sW0.5_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 174.662, + "A1": 174.662, + "rel": 0.0, + "class": "neutral", + "W0": 18.985, + "H0": 9.2, + "W1": 18.985, + "H1": 9.2, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/ihp130/sW0.5_sL1.5/independent/C14_ihp130_sW0p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C14/ihp130/sW0.5_sL1.5/gate_only/C14_ihp130_sW0p5_sL1p5_gate_only.gds", + "geometry_hash_ref": "1837b0453e03c7ac", + "geometry_hash_mode": "18d7ab874554c3fd", + "geometry_identical": false + }, + { + "case": "C14_ihp130_sW0.5_sL1.5", + "topology": "C14", + "pdk": "ihp130", + "size": "sW0.5_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 174.662, + "A1": 165.278, + "rel": -0.05373, + "class": "positive", + "W0": 18.985, + "H0": 9.2, + "W1": 17.965, + "H1": 9.2, + "dW": 1.02, + "dH": 0.0, + "condition_lhs_H0dW": 9.384, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.02 + }, + "max_mos_row_span_saving": 1.02, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -9.384, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/ihp130/sW0.5_sL1.5/independent/C14_ihp130_sW0p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C14/ihp130/sW0.5_sL1.5/combined/C14_ihp130_sW0p5_sL1p5_combined.gds", + "geometry_hash_ref": "1837b0453e03c7ac", + "geometry_hash_mode": "ac5de5553cebd33b", + "geometry_identical": false + }, + { + "case": "C14_ihp130_sW0.5_sL1", + "topology": "C14", + "pdk": "ihp130", + "size": "sW0.5_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 141.174, + "A1": 131.79, + "rel": -0.06647, + "class": "positive", + "W0": 15.345, + "H0": 9.2, + "W1": 14.325, + "H1": 9.2, + "dW": 1.02, + "dH": 0.0, + "condition_lhs_H0dW": 9.384, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.02 + }, + "max_mos_row_span_saving": 1.02, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -9.384, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/ihp130/sW0.5_sL1/independent/C14_ihp130_sW0p5_sL1_independent.gds", + "gds_mode": "runs/grid/C14/ihp130/sW0.5_sL1/diffusion_only/C14_ihp130_sW0p5_sL1_diffusion_only.gds", + "geometry_hash_ref": "3d1fca433709ebe1", + "geometry_hash_mode": "e1f00dd02afaeede", + "geometry_identical": false + }, + { + "case": "C14_ihp130_sW0.5_sL1", + "topology": "C14", + "pdk": "ihp130", + "size": "sW0.5_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 141.174, + "A1": 141.174, + "rel": 0.0, + "class": "neutral", + "W0": 15.345, + "H0": 9.2, + "W1": 15.345, + "H1": 9.2, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/ihp130/sW0.5_sL1/independent/C14_ihp130_sW0p5_sL1_independent.gds", + "gds_mode": "runs/grid/C14/ihp130/sW0.5_sL1/gate_only/C14_ihp130_sW0p5_sL1_gate_only.gds", + "geometry_hash_ref": "3d1fca433709ebe1", + "geometry_hash_mode": "5726f40a7d5c21a6", + "geometry_identical": false + }, + { + "case": "C14_ihp130_sW0.5_sL1", + "topology": "C14", + "pdk": "ihp130", + "size": "sW0.5_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 141.174, + "A1": 131.79, + "rel": -0.06647, + "class": "positive", + "W0": 15.345, + "H0": 9.2, + "W1": 14.325, + "H1": 9.2, + "dW": 1.02, + "dH": 0.0, + "condition_lhs_H0dW": 9.384, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.02 + }, + "max_mos_row_span_saving": 1.02, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -9.384, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/ihp130/sW0.5_sL1/independent/C14_ihp130_sW0p5_sL1_independent.gds", + "gds_mode": "runs/grid/C14/ihp130/sW0.5_sL1/combined/C14_ihp130_sW0p5_sL1_combined.gds", + "geometry_hash_ref": "3d1fca433709ebe1", + "geometry_hash_mode": "47600cbcf7b1a2b8", + "geometry_identical": false + }, + { + "case": "C14_ihp130_sW0.5_sL2", + "topology": "C14", + "pdk": "ihp130", + "size": "sW0.5_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 208.15, + "A1": 198.766, + "rel": -0.04508, + "class": "positive", + "W0": 22.625, + "H0": 9.2, + "W1": 21.605, + "H1": 9.2, + "dW": 1.02, + "dH": 0.0, + "condition_lhs_H0dW": 9.384, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.02 + }, + "max_mos_row_span_saving": 1.02, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -9.384, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/ihp130/sW0.5_sL2/independent/C14_ihp130_sW0p5_sL2_independent.gds", + "gds_mode": "runs/grid/C14/ihp130/sW0.5_sL2/diffusion_only/C14_ihp130_sW0p5_sL2_diffusion_only.gds", + "geometry_hash_ref": "0c2b950960c11bd2", + "geometry_hash_mode": "3295ec37474fbc97", + "geometry_identical": false + }, + { + "case": "C14_ihp130_sW0.5_sL2", + "topology": "C14", + "pdk": "ihp130", + "size": "sW0.5_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 208.15, + "A1": 208.15, + "rel": 0.0, + "class": "neutral", + "W0": 22.625, + "H0": 9.2, + "W1": 22.625, + "H1": 9.2, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/ihp130/sW0.5_sL2/independent/C14_ihp130_sW0p5_sL2_independent.gds", + "gds_mode": "runs/grid/C14/ihp130/sW0.5_sL2/gate_only/C14_ihp130_sW0p5_sL2_gate_only.gds", + "geometry_hash_ref": "0c2b950960c11bd2", + "geometry_hash_mode": "8a5614d8c8da1fd9", + "geometry_identical": false + }, + { + "case": "C14_ihp130_sW0.5_sL2", + "topology": "C14", + "pdk": "ihp130", + "size": "sW0.5_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 208.15, + "A1": 198.766, + "rel": -0.04508, + "class": "positive", + "W0": 22.625, + "H0": 9.2, + "W1": 21.605, + "H1": 9.2, + "dW": 1.02, + "dH": 0.0, + "condition_lhs_H0dW": 9.384, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.02 + }, + "max_mos_row_span_saving": 1.02, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -9.384, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/ihp130/sW0.5_sL2/independent/C14_ihp130_sW0p5_sL2_independent.gds", + "gds_mode": "runs/grid/C14/ihp130/sW0.5_sL2/combined/C14_ihp130_sW0p5_sL2_combined.gds", + "geometry_hash_ref": "0c2b950960c11bd2", + "geometry_hash_mode": "85acdbf197af210a", + "geometry_identical": false + }, + { + "case": "C14_ihp130_sW1.5_sL1.5", + "topology": "C14", + "pdk": "ihp130", + "size": "sW1.5_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 424.534, + "A1": 415.15, + "rel": -0.0221, + "class": "positive", + "W0": 46.145, + "H0": 9.2, + "W1": 45.125, + "H1": 9.2, + "dW": 1.02, + "dH": 0.0, + "condition_lhs_H0dW": 9.384, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.02 + }, + "max_mos_row_span_saving": 1.02, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -9.384, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/ihp130/sW1.5_sL1.5/independent/C14_ihp130_sW1p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C14/ihp130/sW1.5_sL1.5/diffusion_only/C14_ihp130_sW1p5_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "4e0f6bd0b6e31312", + "geometry_hash_mode": "7812334a1c05859f", + "geometry_identical": false + }, + { + "case": "C14_ihp130_sW1.5_sL1.5", + "topology": "C14", + "pdk": "ihp130", + "size": "sW1.5_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 424.534, + "A1": 424.534, + "rel": 0.0, + "class": "neutral", + "W0": 46.145, + "H0": 9.2, + "W1": 46.145, + "H1": 9.2, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/ihp130/sW1.5_sL1.5/independent/C14_ihp130_sW1p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C14/ihp130/sW1.5_sL1.5/gate_only/C14_ihp130_sW1p5_sL1p5_gate_only.gds", + "geometry_hash_ref": "4e0f6bd0b6e31312", + "geometry_hash_mode": "62cb540f075d3d9f", + "geometry_identical": false + }, + { + "case": "C14_ihp130_sW1.5_sL1.5", + "topology": "C14", + "pdk": "ihp130", + "size": "sW1.5_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 424.534, + "A1": 415.15, + "rel": -0.0221, + "class": "positive", + "W0": 46.145, + "H0": 9.2, + "W1": 45.125, + "H1": 9.2, + "dW": 1.02, + "dH": 0.0, + "condition_lhs_H0dW": 9.384, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.02 + }, + "max_mos_row_span_saving": 1.02, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -9.384, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/ihp130/sW1.5_sL1.5/independent/C14_ihp130_sW1p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C14/ihp130/sW1.5_sL1.5/combined/C14_ihp130_sW1p5_sL1p5_combined.gds", + "geometry_hash_ref": "4e0f6bd0b6e31312", + "geometry_hash_mode": "df600b4dcf0f0b06", + "geometry_identical": false + }, + { + "case": "C14_ihp130_sW1.5_sL1", + "topology": "C14", + "pdk": "ihp130", + "size": "sW1.5_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 324.07, + "A1": 314.686, + "rel": -0.02896, + "class": "positive", + "W0": 35.225, + "H0": 9.2, + "W1": 34.205, + "H1": 9.2, + "dW": 1.02, + "dH": 0.0, + "condition_lhs_H0dW": 9.384, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.02 + }, + "max_mos_row_span_saving": 1.02, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -9.384, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/ihp130/sW1.5_sL1/independent/C14_ihp130_sW1p5_sL1_independent.gds", + "gds_mode": "runs/grid/C14/ihp130/sW1.5_sL1/diffusion_only/C14_ihp130_sW1p5_sL1_diffusion_only.gds", + "geometry_hash_ref": "0943e9a91b98af5c", + "geometry_hash_mode": "db212028ae2db716", + "geometry_identical": false + }, + { + "case": "C14_ihp130_sW1.5_sL1", + "topology": "C14", + "pdk": "ihp130", + "size": "sW1.5_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 324.07, + "A1": 324.07, + "rel": 0.0, + "class": "neutral", + "W0": 35.225, + "H0": 9.2, + "W1": 35.225, + "H1": 9.2, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/ihp130/sW1.5_sL1/independent/C14_ihp130_sW1p5_sL1_independent.gds", + "gds_mode": "runs/grid/C14/ihp130/sW1.5_sL1/gate_only/C14_ihp130_sW1p5_sL1_gate_only.gds", + "geometry_hash_ref": "0943e9a91b98af5c", + "geometry_hash_mode": "45d8f97ce0de891f", + "geometry_identical": false + }, + { + "case": "C14_ihp130_sW1.5_sL1", + "topology": "C14", + "pdk": "ihp130", + "size": "sW1.5_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 324.07, + "A1": 314.686, + "rel": -0.02896, + "class": "positive", + "W0": 35.225, + "H0": 9.2, + "W1": 34.205, + "H1": 9.2, + "dW": 1.02, + "dH": 0.0, + "condition_lhs_H0dW": 9.384, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.02 + }, + "max_mos_row_span_saving": 1.02, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -9.384, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/ihp130/sW1.5_sL1/independent/C14_ihp130_sW1p5_sL1_independent.gds", + "gds_mode": "runs/grid/C14/ihp130/sW1.5_sL1/combined/C14_ihp130_sW1p5_sL1_combined.gds", + "geometry_hash_ref": "0943e9a91b98af5c", + "geometry_hash_mode": "3e5e67d58fdec3e0", + "geometry_identical": false + }, + { + "case": "C14_ihp130_sW1.5_sL2", + "topology": "C14", + "pdk": "ihp130", + "size": "sW1.5_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 524.998, + "A1": 515.614, + "rel": -0.01787, + "class": "positive", + "W0": 57.065, + "H0": 9.2, + "W1": 56.045, + "H1": 9.2, + "dW": 1.02, + "dH": 0.0, + "condition_lhs_H0dW": 9.384, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.02 + }, + "max_mos_row_span_saving": 1.02, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -9.384, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/ihp130/sW1.5_sL2/independent/C14_ihp130_sW1p5_sL2_independent.gds", + "gds_mode": "runs/grid/C14/ihp130/sW1.5_sL2/diffusion_only/C14_ihp130_sW1p5_sL2_diffusion_only.gds", + "geometry_hash_ref": "516f34a19b0ebd8a", + "geometry_hash_mode": "6bdcddf2bdc77445", + "geometry_identical": false + }, + { + "case": "C14_ihp130_sW1.5_sL2", + "topology": "C14", + "pdk": "ihp130", + "size": "sW1.5_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 524.998, + "A1": 524.998, + "rel": 0.0, + "class": "neutral", + "W0": 57.065, + "H0": 9.2, + "W1": 57.065, + "H1": 9.2, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/ihp130/sW1.5_sL2/independent/C14_ihp130_sW1p5_sL2_independent.gds", + "gds_mode": "runs/grid/C14/ihp130/sW1.5_sL2/gate_only/C14_ihp130_sW1p5_sL2_gate_only.gds", + "geometry_hash_ref": "516f34a19b0ebd8a", + "geometry_hash_mode": "7ac61f8f1453fe88", + "geometry_identical": false + }, + { + "case": "C14_ihp130_sW1.5_sL2", + "topology": "C14", + "pdk": "ihp130", + "size": "sW1.5_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 524.998, + "A1": 515.614, + "rel": -0.01787, + "class": "positive", + "W0": 57.065, + "H0": 9.2, + "W1": 56.045, + "H1": 9.2, + "dW": 1.02, + "dH": 0.0, + "condition_lhs_H0dW": 9.384, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.02 + }, + "max_mos_row_span_saving": 1.02, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -9.384, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/ihp130/sW1.5_sL2/independent/C14_ihp130_sW1p5_sL2_independent.gds", + "gds_mode": "runs/grid/C14/ihp130/sW1.5_sL2/combined/C14_ihp130_sW1p5_sL2_combined.gds", + "geometry_hash_ref": "516f34a19b0ebd8a", + "geometry_hash_mode": "d40dc5589d2123f2", + "geometry_identical": false + }, + { + "case": "C14_ihp130_sW1_sL1.5", + "topology": "C14", + "pdk": "ihp130", + "size": "sW1_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 299.598, + "A1": 290.214, + "rel": -0.03132, + "class": "positive", + "W0": 32.565, + "H0": 9.2, + "W1": 31.545, + "H1": 9.2, + "dW": 1.02, + "dH": 0.0, + "condition_lhs_H0dW": 9.384, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.02 + }, + "max_mos_row_span_saving": 1.02, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -9.384, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/ihp130/sW1_sL1.5/independent/C14_ihp130_sW1_sL1p5_independent.gds", + "gds_mode": "runs/grid/C14/ihp130/sW1_sL1.5/diffusion_only/C14_ihp130_sW1_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "ba5e9e8f9ae485bc", + "geometry_hash_mode": "daa262f5f7fd20d3", + "geometry_identical": false + }, + { + "case": "C14_ihp130_sW1_sL1.5", + "topology": "C14", + "pdk": "ihp130", + "size": "sW1_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 299.598, + "A1": 299.598, + "rel": 0.0, + "class": "neutral", + "W0": 32.565, + "H0": 9.2, + "W1": 32.565, + "H1": 9.2, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/ihp130/sW1_sL1.5/independent/C14_ihp130_sW1_sL1p5_independent.gds", + "gds_mode": "runs/grid/C14/ihp130/sW1_sL1.5/gate_only/C14_ihp130_sW1_sL1p5_gate_only.gds", + "geometry_hash_ref": "ba5e9e8f9ae485bc", + "geometry_hash_mode": "9c70f4b8bb1fe19e", + "geometry_identical": false + }, + { + "case": "C14_ihp130_sW1_sL1.5", + "topology": "C14", + "pdk": "ihp130", + "size": "sW1_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 299.598, + "A1": 290.214, + "rel": -0.03132, + "class": "positive", + "W0": 32.565, + "H0": 9.2, + "W1": 31.545, + "H1": 9.2, + "dW": 1.02, + "dH": 0.0, + "condition_lhs_H0dW": 9.384, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.02 + }, + "max_mos_row_span_saving": 1.02, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -9.384, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/ihp130/sW1_sL1.5/independent/C14_ihp130_sW1_sL1p5_independent.gds", + "gds_mode": "runs/grid/C14/ihp130/sW1_sL1.5/combined/C14_ihp130_sW1_sL1p5_combined.gds", + "geometry_hash_ref": "ba5e9e8f9ae485bc", + "geometry_hash_mode": "8da0daba1c068e4a", + "geometry_identical": false + }, + { + "case": "C14_ihp130_sW1_sL1", + "topology": "C14", + "pdk": "ihp130", + "size": "sW1_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 232.622, + "A1": 223.238, + "rel": -0.04034, + "class": "positive", + "W0": 25.285, + "H0": 9.2, + "W1": 24.265, + "H1": 9.2, + "dW": 1.02, + "dH": 0.0, + "condition_lhs_H0dW": 9.384, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.02 + }, + "max_mos_row_span_saving": 1.02, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -9.384, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/ihp130/sW1_sL1/independent/C14_ihp130_sW1_sL1_independent.gds", + "gds_mode": "runs/grid/C14/ihp130/sW1_sL1/diffusion_only/C14_ihp130_sW1_sL1_diffusion_only.gds", + "geometry_hash_ref": "462dbea10ccc36f0", + "geometry_hash_mode": "49b05fa642ca1465", + "geometry_identical": false + }, + { + "case": "C14_ihp130_sW1_sL1", + "topology": "C14", + "pdk": "ihp130", + "size": "sW1_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 232.622, + "A1": 232.622, + "rel": 0.0, + "class": "neutral", + "W0": 25.285, + "H0": 9.2, + "W1": 25.285, + "H1": 9.2, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/ihp130/sW1_sL1/independent/C14_ihp130_sW1_sL1_independent.gds", + "gds_mode": "runs/grid/C14/ihp130/sW1_sL1/gate_only/C14_ihp130_sW1_sL1_gate_only.gds", + "geometry_hash_ref": "462dbea10ccc36f0", + "geometry_hash_mode": "cb65395b029c3e90", + "geometry_identical": false + }, + { + "case": "C14_ihp130_sW1_sL1", + "topology": "C14", + "pdk": "ihp130", + "size": "sW1_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 232.622, + "A1": 223.238, + "rel": -0.04034, + "class": "positive", + "W0": 25.285, + "H0": 9.2, + "W1": 24.265, + "H1": 9.2, + "dW": 1.02, + "dH": 0.0, + "condition_lhs_H0dW": 9.384, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.02 + }, + "max_mos_row_span_saving": 1.02, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -9.384, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/ihp130/sW1_sL1/independent/C14_ihp130_sW1_sL1_independent.gds", + "gds_mode": "runs/grid/C14/ihp130/sW1_sL1/combined/C14_ihp130_sW1_sL1_combined.gds", + "geometry_hash_ref": "462dbea10ccc36f0", + "geometry_hash_mode": "3ae82249e2de7503", + "geometry_identical": false + }, + { + "case": "C14_ihp130_sW1_sL2", + "topology": "C14", + "pdk": "ihp130", + "size": "sW1_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 366.574, + "A1": 357.19, + "rel": -0.0256, + "class": "positive", + "W0": 39.845, + "H0": 9.2, + "W1": 38.825, + "H1": 9.2, + "dW": 1.02, + "dH": 0.0, + "condition_lhs_H0dW": 9.384, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.02 + }, + "max_mos_row_span_saving": 1.02, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -9.384, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/ihp130/sW1_sL2/independent/C14_ihp130_sW1_sL2_independent.gds", + "gds_mode": "runs/grid/C14/ihp130/sW1_sL2/diffusion_only/C14_ihp130_sW1_sL2_diffusion_only.gds", + "geometry_hash_ref": "00d4c9b2e720db97", + "geometry_hash_mode": "07e498df76b243f8", + "geometry_identical": false + }, + { + "case": "C14_ihp130_sW1_sL2", + "topology": "C14", + "pdk": "ihp130", + "size": "sW1_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 366.574, + "A1": 366.574, + "rel": 0.0, + "class": "neutral", + "W0": 39.845, + "H0": 9.2, + "W1": 39.845, + "H1": 9.2, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/ihp130/sW1_sL2/independent/C14_ihp130_sW1_sL2_independent.gds", + "gds_mode": "runs/grid/C14/ihp130/sW1_sL2/gate_only/C14_ihp130_sW1_sL2_gate_only.gds", + "geometry_hash_ref": "00d4c9b2e720db97", + "geometry_hash_mode": "667aeaa072b5e375", + "geometry_identical": false + }, + { + "case": "C14_ihp130_sW1_sL2", + "topology": "C14", + "pdk": "ihp130", + "size": "sW1_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 366.574, + "A1": 357.19, + "rel": -0.0256, + "class": "positive", + "W0": 39.845, + "H0": 9.2, + "W1": 38.825, + "H1": 9.2, + "dW": 1.02, + "dH": 0.0, + "condition_lhs_H0dW": 9.384, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.02 + }, + "max_mos_row_span_saving": 1.02, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -9.384, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/ihp130/sW1_sL2/independent/C14_ihp130_sW1_sL2_independent.gds", + "gds_mode": "runs/grid/C14/ihp130/sW1_sL2/combined/C14_ihp130_sW1_sL2_combined.gds", + "geometry_hash_ref": "00d4c9b2e720db97", + "geometry_hash_mode": "bcad83255f0ae4c0", + "geometry_identical": false + }, + { + "case": "C14_ihp130_sW2_sL1.5", + "topology": "C14", + "pdk": "ihp130", + "size": "sW2_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 549.47, + "A1": 540.086, + "rel": -0.01708, + "class": "positive", + "W0": 59.725, + "H0": 9.2, + "W1": 58.705, + "H1": 9.2, + "dW": 1.02, + "dH": 0.0, + "condition_lhs_H0dW": 9.384, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.02 + }, + "max_mos_row_span_saving": 1.02, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -9.384, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/ihp130/sW2_sL1.5/independent/C14_ihp130_sW2_sL1p5_independent.gds", + "gds_mode": "runs/grid/C14/ihp130/sW2_sL1.5/diffusion_only/C14_ihp130_sW2_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "44f096f6e90b58b4", + "geometry_hash_mode": "e3cc6e9e30a10dde", + "geometry_identical": false + }, + { + "case": "C14_ihp130_sW2_sL1.5", + "topology": "C14", + "pdk": "ihp130", + "size": "sW2_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 549.47, + "A1": 549.47, + "rel": 0.0, + "class": "neutral", + "W0": 59.725, + "H0": 9.2, + "W1": 59.725, + "H1": 9.2, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/ihp130/sW2_sL1.5/independent/C14_ihp130_sW2_sL1p5_independent.gds", + "gds_mode": "runs/grid/C14/ihp130/sW2_sL1.5/gate_only/C14_ihp130_sW2_sL1p5_gate_only.gds", + "geometry_hash_ref": "44f096f6e90b58b4", + "geometry_hash_mode": "303383736e3bca8a", + "geometry_identical": false + }, + { + "case": "C14_ihp130_sW2_sL1.5", + "topology": "C14", + "pdk": "ihp130", + "size": "sW2_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 549.47, + "A1": 540.086, + "rel": -0.01708, + "class": "positive", + "W0": 59.725, + "H0": 9.2, + "W1": 58.705, + "H1": 9.2, + "dW": 1.02, + "dH": 0.0, + "condition_lhs_H0dW": 9.384, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.02 + }, + "max_mos_row_span_saving": 1.02, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -9.384, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/ihp130/sW2_sL1.5/independent/C14_ihp130_sW2_sL1p5_independent.gds", + "gds_mode": "runs/grid/C14/ihp130/sW2_sL1.5/combined/C14_ihp130_sW2_sL1p5_combined.gds", + "geometry_hash_ref": "44f096f6e90b58b4", + "geometry_hash_mode": "edaf027960f11628", + "geometry_identical": false + }, + { + "case": "C14_ihp130_sW2_sL1", + "topology": "C14", + "pdk": "ihp130", + "size": "sW2_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 415.518, + "A1": 406.134, + "rel": -0.02258, + "class": "positive", + "W0": 45.165, + "H0": 9.2, + "W1": 44.145, + "H1": 9.2, + "dW": 1.02, + "dH": 0.0, + "condition_lhs_H0dW": 9.384, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.02 + }, + "max_mos_row_span_saving": 1.02, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -9.384, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/ihp130/sW2_sL1/independent/C14_ihp130_sW2_sL1_independent.gds", + "gds_mode": "runs/grid/C14/ihp130/sW2_sL1/diffusion_only/C14_ihp130_sW2_sL1_diffusion_only.gds", + "geometry_hash_ref": "cd8cff8c4caa369f", + "geometry_hash_mode": "6093fd88ec326615", + "geometry_identical": false + }, + { + "case": "C14_ihp130_sW2_sL1", + "topology": "C14", + "pdk": "ihp130", + "size": "sW2_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 415.518, + "A1": 415.518, + "rel": 0.0, + "class": "neutral", + "W0": 45.165, + "H0": 9.2, + "W1": 45.165, + "H1": 9.2, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/ihp130/sW2_sL1/independent/C14_ihp130_sW2_sL1_independent.gds", + "gds_mode": "runs/grid/C14/ihp130/sW2_sL1/gate_only/C14_ihp130_sW2_sL1_gate_only.gds", + "geometry_hash_ref": "cd8cff8c4caa369f", + "geometry_hash_mode": "bdc017f925b31bac", + "geometry_identical": false + }, + { + "case": "C14_ihp130_sW2_sL1", + "topology": "C14", + "pdk": "ihp130", + "size": "sW2_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 415.518, + "A1": 406.134, + "rel": -0.02258, + "class": "positive", + "W0": 45.165, + "H0": 9.2, + "W1": 44.145, + "H1": 9.2, + "dW": 1.02, + "dH": 0.0, + "condition_lhs_H0dW": 9.384, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.02 + }, + "max_mos_row_span_saving": 1.02, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -9.384, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/ihp130/sW2_sL1/independent/C14_ihp130_sW2_sL1_independent.gds", + "gds_mode": "runs/grid/C14/ihp130/sW2_sL1/combined/C14_ihp130_sW2_sL1_combined.gds", + "geometry_hash_ref": "cd8cff8c4caa369f", + "geometry_hash_mode": "e44d54e7e10c9014", + "geometry_identical": false + }, + { + "case": "C14_ihp130_sW2_sL2", + "topology": "C14", + "pdk": "ihp130", + "size": "sW2_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 683.422, + "A1": 674.038, + "rel": -0.01373, + "class": "positive", + "W0": 74.285, + "H0": 9.2, + "W1": 73.265, + "H1": 9.2, + "dW": 1.02, + "dH": 0.0, + "condition_lhs_H0dW": 9.384, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.02 + }, + "max_mos_row_span_saving": 1.02, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -9.384, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/ihp130/sW2_sL2/independent/C14_ihp130_sW2_sL2_independent.gds", + "gds_mode": "runs/grid/C14/ihp130/sW2_sL2/diffusion_only/C14_ihp130_sW2_sL2_diffusion_only.gds", + "geometry_hash_ref": "322ddf41830a4a19", + "geometry_hash_mode": "a03685803325079a", + "geometry_identical": false + }, + { + "case": "C14_ihp130_sW2_sL2", + "topology": "C14", + "pdk": "ihp130", + "size": "sW2_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 683.422, + "A1": 683.422, + "rel": 0.0, + "class": "neutral", + "W0": 74.285, + "H0": 9.2, + "W1": 74.285, + "H1": 9.2, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/ihp130/sW2_sL2/independent/C14_ihp130_sW2_sL2_independent.gds", + "gds_mode": "runs/grid/C14/ihp130/sW2_sL2/gate_only/C14_ihp130_sW2_sL2_gate_only.gds", + "geometry_hash_ref": "322ddf41830a4a19", + "geometry_hash_mode": "04b613f25ed1d77b", + "geometry_identical": false + }, + { + "case": "C14_ihp130_sW2_sL2", + "topology": "C14", + "pdk": "ihp130", + "size": "sW2_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 683.422, + "A1": 674.038, + "rel": -0.01373, + "class": "positive", + "W0": 74.285, + "H0": 9.2, + "W1": 73.265, + "H1": 9.2, + "dW": 1.02, + "dH": 0.0, + "condition_lhs_H0dW": 9.384, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.02 + }, + "max_mos_row_span_saving": 1.02, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -9.384, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/ihp130/sW2_sL2/independent/C14_ihp130_sW2_sL2_independent.gds", + "gds_mode": "runs/grid/C14/ihp130/sW2_sL2/combined/C14_ihp130_sW2_sL2_combined.gds", + "geometry_hash_ref": "322ddf41830a4a19", + "geometry_hash_mode": "10a0942c410f43d1", + "geometry_identical": false + }, + { + "case": "C14_sky130_sW0.5_sL1.5", + "topology": "C14", + "pdk": "sky130", + "size": "sW0.5_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 138.019, + "A1": 127.34, + "rel": -0.07737, + "class": "positive", + "W0": 14.475, + "H0": 9.535, + "W1": 13.355, + "H1": 9.535, + "dW": 1.12, + "dH": 0.0, + "condition_lhs_H0dW": 10.6792, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.12 + }, + "max_mos_row_span_saving": 1.12, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -10.679, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/sky130/sW0.5_sL1.5/independent/C14_sky130_sW0p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C14/sky130/sW0.5_sL1.5/diffusion_only/C14_sky130_sW0p5_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "46f654d8f1c5823b", + "geometry_hash_mode": "67e5ce0bc970c317", + "geometry_identical": false + }, + { + "case": "C14_sky130_sW0.5_sL1.5", + "topology": "C14", + "pdk": "sky130", + "size": "sW0.5_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 138.019, + "A1": 138.019, + "rel": 0.0, + "class": "neutral", + "W0": 14.475, + "H0": 9.535, + "W1": 14.475, + "H1": 9.535, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/sky130/sW0.5_sL1.5/independent/C14_sky130_sW0p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C14/sky130/sW0.5_sL1.5/gate_only/C14_sky130_sW0p5_sL1p5_gate_only.gds", + "geometry_hash_ref": "46f654d8f1c5823b", + "geometry_hash_mode": "f3dd347ca4e90b4d", + "geometry_identical": false + }, + { + "case": "C14_sky130_sW0.5_sL1.5", + "topology": "C14", + "pdk": "sky130", + "size": "sW0.5_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 138.019, + "A1": 127.34, + "rel": -0.07737, + "class": "positive", + "W0": 14.475, + "H0": 9.535, + "W1": 13.355, + "H1": 9.535, + "dW": 1.12, + "dH": 0.0, + "condition_lhs_H0dW": 10.6792, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.12 + }, + "max_mos_row_span_saving": 1.12, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -10.679, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/sky130/sW0.5_sL1.5/independent/C14_sky130_sW0p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C14/sky130/sW0.5_sL1.5/combined/C14_sky130_sW0p5_sL1p5_combined.gds", + "geometry_hash_ref": "46f654d8f1c5823b", + "geometry_hash_mode": "2028ec83383fee32", + "geometry_identical": false + }, + { + "case": "C14_sky130_sW0.5_sL1", + "topology": "C14", + "pdk": "sky130", + "size": "sW0.5_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 117.996, + "A1": 107.316, + "rel": -0.09051, + "class": "positive", + "W0": 12.375, + "H0": 9.535, + "W1": 11.255, + "H1": 9.535, + "dW": 1.12, + "dH": 0.0, + "condition_lhs_H0dW": 10.6792, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.12 + }, + "max_mos_row_span_saving": 1.12, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -10.679, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/sky130/sW0.5_sL1/independent/C14_sky130_sW0p5_sL1_independent.gds", + "gds_mode": "runs/grid/C14/sky130/sW0.5_sL1/diffusion_only/C14_sky130_sW0p5_sL1_diffusion_only.gds", + "geometry_hash_ref": "396d31a11e7f8564", + "geometry_hash_mode": "01825f218dafebb8", + "geometry_identical": false + }, + { + "case": "C14_sky130_sW0.5_sL1", + "topology": "C14", + "pdk": "sky130", + "size": "sW0.5_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 117.996, + "A1": 117.996, + "rel": 0.0, + "class": "neutral", + "W0": 12.375, + "H0": 9.535, + "W1": 12.375, + "H1": 9.535, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/sky130/sW0.5_sL1/independent/C14_sky130_sW0p5_sL1_independent.gds", + "gds_mode": "runs/grid/C14/sky130/sW0.5_sL1/gate_only/C14_sky130_sW0p5_sL1_gate_only.gds", + "geometry_hash_ref": "396d31a11e7f8564", + "geometry_hash_mode": "ef7303dcd1b84efd", + "geometry_identical": false + }, + { + "case": "C14_sky130_sW0.5_sL1", + "topology": "C14", + "pdk": "sky130", + "size": "sW0.5_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 117.996, + "A1": 107.316, + "rel": -0.09051, + "class": "positive", + "W0": 12.375, + "H0": 9.535, + "W1": 11.255, + "H1": 9.535, + "dW": 1.12, + "dH": 0.0, + "condition_lhs_H0dW": 10.6792, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.12 + }, + "max_mos_row_span_saving": 1.12, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -10.679, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/sky130/sW0.5_sL1/independent/C14_sky130_sW0p5_sL1_independent.gds", + "gds_mode": "runs/grid/C14/sky130/sW0.5_sL1/combined/C14_sky130_sW0p5_sL1_combined.gds", + "geometry_hash_ref": "396d31a11e7f8564", + "geometry_hash_mode": "55efff00c62a5292", + "geometry_identical": false + }, + { + "case": "C14_sky130_sW0.5_sL2", + "topology": "C14", + "pdk": "sky130", + "size": "sW0.5_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 158.043, + "A1": 147.363, + "rel": -0.06757, + "class": "positive", + "W0": 16.575, + "H0": 9.535, + "W1": 15.455, + "H1": 9.535, + "dW": 1.12, + "dH": 0.0, + "condition_lhs_H0dW": 10.6792, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.12 + }, + "max_mos_row_span_saving": 1.12, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -10.679, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/sky130/sW0.5_sL2/independent/C14_sky130_sW0p5_sL2_independent.gds", + "gds_mode": "runs/grid/C14/sky130/sW0.5_sL2/diffusion_only/C14_sky130_sW0p5_sL2_diffusion_only.gds", + "geometry_hash_ref": "1564b8303dc7e4bc", + "geometry_hash_mode": "348d8c0f11971240", + "geometry_identical": false + }, + { + "case": "C14_sky130_sW0.5_sL2", + "topology": "C14", + "pdk": "sky130", + "size": "sW0.5_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 158.043, + "A1": 158.043, + "rel": 0.0, + "class": "neutral", + "W0": 16.575, + "H0": 9.535, + "W1": 16.575, + "H1": 9.535, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/sky130/sW0.5_sL2/independent/C14_sky130_sW0p5_sL2_independent.gds", + "gds_mode": "runs/grid/C14/sky130/sW0.5_sL2/gate_only/C14_sky130_sW0p5_sL2_gate_only.gds", + "geometry_hash_ref": "1564b8303dc7e4bc", + "geometry_hash_mode": "4a142a27135ca4b4", + "geometry_identical": false + }, + { + "case": "C14_sky130_sW0.5_sL2", + "topology": "C14", + "pdk": "sky130", + "size": "sW0.5_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 158.043, + "A1": 147.363, + "rel": -0.06757, + "class": "positive", + "W0": 16.575, + "H0": 9.535, + "W1": 15.455, + "H1": 9.535, + "dW": 1.12, + "dH": 0.0, + "condition_lhs_H0dW": 10.6792, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.12 + }, + "max_mos_row_span_saving": 1.12, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -10.679, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/sky130/sW0.5_sL2/independent/C14_sky130_sW0p5_sL2_independent.gds", + "gds_mode": "runs/grid/C14/sky130/sW0.5_sL2/combined/C14_sky130_sW0p5_sL2_combined.gds", + "geometry_hash_ref": "1564b8303dc7e4bc", + "geometry_hash_mode": "8bcd9402b5330037", + "geometry_identical": false + }, + { + "case": "C14_sky130_sW1.5_sL1.5", + "topology": "C14", + "pdk": "sky130", + "size": "sW1.5_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 296.872, + "A1": 286.193, + "rel": -0.03597, + "class": "positive", + "W0": 31.135, + "H0": 9.535, + "W1": 30.015, + "H1": 9.535, + "dW": 1.12, + "dH": 0.0, + "condition_lhs_H0dW": 10.6792, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.12 + }, + "max_mos_row_span_saving": 1.12, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -10.679, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/sky130/sW1.5_sL1.5/independent/C14_sky130_sW1p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C14/sky130/sW1.5_sL1.5/diffusion_only/C14_sky130_sW1p5_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "dd6506ce09d50d15", + "geometry_hash_mode": "0ff0f914effc9b29", + "geometry_identical": false + }, + { + "case": "C14_sky130_sW1.5_sL1.5", + "topology": "C14", + "pdk": "sky130", + "size": "sW1.5_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 296.872, + "A1": 296.872, + "rel": 0.0, + "class": "neutral", + "W0": 31.135, + "H0": 9.535, + "W1": 31.135, + "H1": 9.535, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/sky130/sW1.5_sL1.5/independent/C14_sky130_sW1p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C14/sky130/sW1.5_sL1.5/gate_only/C14_sky130_sW1p5_sL1p5_gate_only.gds", + "geometry_hash_ref": "dd6506ce09d50d15", + "geometry_hash_mode": "2658b6e3c19bfbe8", + "geometry_identical": false + }, + { + "case": "C14_sky130_sW1.5_sL1.5", + "topology": "C14", + "pdk": "sky130", + "size": "sW1.5_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 296.872, + "A1": 286.193, + "rel": -0.03597, + "class": "positive", + "W0": 31.135, + "H0": 9.535, + "W1": 30.015, + "H1": 9.535, + "dW": 1.12, + "dH": 0.0, + "condition_lhs_H0dW": 10.6792, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.12 + }, + "max_mos_row_span_saving": 1.12, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -10.679, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/sky130/sW1.5_sL1.5/independent/C14_sky130_sW1p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C14/sky130/sW1.5_sL1.5/combined/C14_sky130_sW1p5_sL1p5_combined.gds", + "geometry_hash_ref": "dd6506ce09d50d15", + "geometry_hash_mode": "4aabe277c016069b", + "geometry_identical": false + }, + { + "case": "C14_sky130_sW1.5_sL1", + "topology": "C14", + "pdk": "sky130", + "size": "sW1.5_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 236.802, + "A1": 226.123, + "rel": -0.0451, + "class": "positive", + "W0": 24.835, + "H0": 9.535, + "W1": 23.715, + "H1": 9.535, + "dW": 1.12, + "dH": 0.0, + "condition_lhs_H0dW": 10.6792, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.12 + }, + "max_mos_row_span_saving": 1.12, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -10.679, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/sky130/sW1.5_sL1/independent/C14_sky130_sW1p5_sL1_independent.gds", + "gds_mode": "runs/grid/C14/sky130/sW1.5_sL1/diffusion_only/C14_sky130_sW1p5_sL1_diffusion_only.gds", + "geometry_hash_ref": "82ce99d927c3f294", + "geometry_hash_mode": "230ca74283e0aa3d", + "geometry_identical": false + }, + { + "case": "C14_sky130_sW1.5_sL1", + "topology": "C14", + "pdk": "sky130", + "size": "sW1.5_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 236.802, + "A1": 236.802, + "rel": 0.0, + "class": "neutral", + "W0": 24.835, + "H0": 9.535, + "W1": 24.835, + "H1": 9.535, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/sky130/sW1.5_sL1/independent/C14_sky130_sW1p5_sL1_independent.gds", + "gds_mode": "runs/grid/C14/sky130/sW1.5_sL1/gate_only/C14_sky130_sW1p5_sL1_gate_only.gds", + "geometry_hash_ref": "82ce99d927c3f294", + "geometry_hash_mode": "ff75d01ddb55762b", + "geometry_identical": false + }, + { + "case": "C14_sky130_sW1.5_sL1", + "topology": "C14", + "pdk": "sky130", + "size": "sW1.5_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 236.802, + "A1": 226.123, + "rel": -0.0451, + "class": "positive", + "W0": 24.835, + "H0": 9.535, + "W1": 23.715, + "H1": 9.535, + "dW": 1.12, + "dH": 0.0, + "condition_lhs_H0dW": 10.6792, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.12 + }, + "max_mos_row_span_saving": 1.12, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -10.679, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/sky130/sW1.5_sL1/independent/C14_sky130_sW1p5_sL1_independent.gds", + "gds_mode": "runs/grid/C14/sky130/sW1.5_sL1/combined/C14_sky130_sW1p5_sL1_combined.gds", + "geometry_hash_ref": "82ce99d927c3f294", + "geometry_hash_mode": "5d596ec81f927964", + "geometry_identical": false + }, + { + "case": "C14_sky130_sW1.5_sL2", + "topology": "C14", + "pdk": "sky130", + "size": "sW1.5_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 356.943, + "A1": 346.264, + "rel": -0.02992, + "class": "positive", + "W0": 37.435, + "H0": 9.535, + "W1": 36.315, + "H1": 9.535, + "dW": 1.12, + "dH": 0.0, + "condition_lhs_H0dW": 10.6792, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.12 + }, + "max_mos_row_span_saving": 1.12, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -10.679, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/sky130/sW1.5_sL2/independent/C14_sky130_sW1p5_sL2_independent.gds", + "gds_mode": "runs/grid/C14/sky130/sW1.5_sL2/diffusion_only/C14_sky130_sW1p5_sL2_diffusion_only.gds", + "geometry_hash_ref": "8542d7a5e9f34ebc", + "geometry_hash_mode": "ee5661dc087c44d8", + "geometry_identical": false + }, + { + "case": "C14_sky130_sW1.5_sL2", + "topology": "C14", + "pdk": "sky130", + "size": "sW1.5_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 356.943, + "A1": 356.943, + "rel": 0.0, + "class": "neutral", + "W0": 37.435, + "H0": 9.535, + "W1": 37.435, + "H1": 9.535, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/sky130/sW1.5_sL2/independent/C14_sky130_sW1p5_sL2_independent.gds", + "gds_mode": "runs/grid/C14/sky130/sW1.5_sL2/gate_only/C14_sky130_sW1p5_sL2_gate_only.gds", + "geometry_hash_ref": "8542d7a5e9f34ebc", + "geometry_hash_mode": "1a3d8527ce7bb8f9", + "geometry_identical": false + }, + { + "case": "C14_sky130_sW1.5_sL2", + "topology": "C14", + "pdk": "sky130", + "size": "sW1.5_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 356.943, + "A1": 346.264, + "rel": -0.02992, + "class": "positive", + "W0": 37.435, + "H0": 9.535, + "W1": 36.315, + "H1": 9.535, + "dW": 1.12, + "dH": 0.0, + "condition_lhs_H0dW": 10.6792, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.12 + }, + "max_mos_row_span_saving": 1.12, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -10.679, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/sky130/sW1.5_sL2/independent/C14_sky130_sW1p5_sL2_independent.gds", + "gds_mode": "runs/grid/C14/sky130/sW1.5_sL2/combined/C14_sky130_sW1p5_sL2_combined.gds", + "geometry_hash_ref": "8542d7a5e9f34ebc", + "geometry_hash_mode": "18596f2a242f6375", + "geometry_identical": false + }, + { + "case": "C14_sky130_sW1_sL1.5", + "topology": "C14", + "pdk": "sky130", + "size": "sW1_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 217.446, + "A1": 206.766, + "rel": -0.04911, + "class": "positive", + "W0": 22.805, + "H0": 9.535, + "W1": 21.685, + "H1": 9.535, + "dW": 1.12, + "dH": 0.0, + "condition_lhs_H0dW": 10.6792, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.12 + }, + "max_mos_row_span_saving": 1.12, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -10.679, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/sky130/sW1_sL1.5/independent/C14_sky130_sW1_sL1p5_independent.gds", + "gds_mode": "runs/grid/C14/sky130/sW1_sL1.5/diffusion_only/C14_sky130_sW1_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "300f09ed8dea6870", + "geometry_hash_mode": "1b6f73f0fe642947", + "geometry_identical": false + }, + { + "case": "C14_sky130_sW1_sL1.5", + "topology": "C14", + "pdk": "sky130", + "size": "sW1_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 217.446, + "A1": 217.446, + "rel": 0.0, + "class": "neutral", + "W0": 22.805, + "H0": 9.535, + "W1": 22.805, + "H1": 9.535, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/sky130/sW1_sL1.5/independent/C14_sky130_sW1_sL1p5_independent.gds", + "gds_mode": "runs/grid/C14/sky130/sW1_sL1.5/gate_only/C14_sky130_sW1_sL1p5_gate_only.gds", + "geometry_hash_ref": "300f09ed8dea6870", + "geometry_hash_mode": "5b401648c901b833", + "geometry_identical": false + }, + { + "case": "C14_sky130_sW1_sL1.5", + "topology": "C14", + "pdk": "sky130", + "size": "sW1_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 217.446, + "A1": 206.766, + "rel": -0.04911, + "class": "positive", + "W0": 22.805, + "H0": 9.535, + "W1": 21.685, + "H1": 9.535, + "dW": 1.12, + "dH": 0.0, + "condition_lhs_H0dW": 10.6792, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.12 + }, + "max_mos_row_span_saving": 1.12, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -10.679, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/sky130/sW1_sL1.5/independent/C14_sky130_sW1_sL1p5_independent.gds", + "gds_mode": "runs/grid/C14/sky130/sW1_sL1.5/combined/C14_sky130_sW1_sL1p5_combined.gds", + "geometry_hash_ref": "300f09ed8dea6870", + "geometry_hash_mode": "4234a17b5dfeb70d", + "geometry_identical": false + }, + { + "case": "C14_sky130_sW1_sL1", + "topology": "C14", + "pdk": "sky130", + "size": "sW1_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 177.399, + "A1": 166.719, + "rel": -0.0602, + "class": "positive", + "W0": 18.605, + "H0": 9.535, + "W1": 17.485, + "H1": 9.535, + "dW": 1.12, + "dH": 0.0, + "condition_lhs_H0dW": 10.6792, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.12 + }, + "max_mos_row_span_saving": 1.12, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -10.679, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/sky130/sW1_sL1/independent/C14_sky130_sW1_sL1_independent.gds", + "gds_mode": "runs/grid/C14/sky130/sW1_sL1/diffusion_only/C14_sky130_sW1_sL1_diffusion_only.gds", + "geometry_hash_ref": "1d3e1ce861e16e62", + "geometry_hash_mode": "cff4fe07796953d9", + "geometry_identical": false + }, + { + "case": "C14_sky130_sW1_sL1", + "topology": "C14", + "pdk": "sky130", + "size": "sW1_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 177.399, + "A1": 177.399, + "rel": 0.0, + "class": "neutral", + "W0": 18.605, + "H0": 9.535, + "W1": 18.605, + "H1": 9.535, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/sky130/sW1_sL1/independent/C14_sky130_sW1_sL1_independent.gds", + "gds_mode": "runs/grid/C14/sky130/sW1_sL1/gate_only/C14_sky130_sW1_sL1_gate_only.gds", + "geometry_hash_ref": "1d3e1ce861e16e62", + "geometry_hash_mode": "8620a902576c6aa2", + "geometry_identical": false + }, + { + "case": "C14_sky130_sW1_sL1", + "topology": "C14", + "pdk": "sky130", + "size": "sW1_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 177.399, + "A1": 166.719, + "rel": -0.0602, + "class": "positive", + "W0": 18.605, + "H0": 9.535, + "W1": 17.485, + "H1": 9.535, + "dW": 1.12, + "dH": 0.0, + "condition_lhs_H0dW": 10.6792, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.12 + }, + "max_mos_row_span_saving": 1.12, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -10.679, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/sky130/sW1_sL1/independent/C14_sky130_sW1_sL1_independent.gds", + "gds_mode": "runs/grid/C14/sky130/sW1_sL1/combined/C14_sky130_sW1_sL1_combined.gds", + "geometry_hash_ref": "1d3e1ce861e16e62", + "geometry_hash_mode": "42d7c34fe088c971", + "geometry_identical": false + }, + { + "case": "C14_sky130_sW1_sL2", + "topology": "C14", + "pdk": "sky130", + "size": "sW1_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 257.493, + "A1": 246.813, + "rel": -0.04147, + "class": "positive", + "W0": 27.005, + "H0": 9.535, + "W1": 25.885, + "H1": 9.535, + "dW": 1.12, + "dH": 0.0, + "condition_lhs_H0dW": 10.6792, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.12 + }, + "max_mos_row_span_saving": 1.12, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -10.679, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/sky130/sW1_sL2/independent/C14_sky130_sW1_sL2_independent.gds", + "gds_mode": "runs/grid/C14/sky130/sW1_sL2/diffusion_only/C14_sky130_sW1_sL2_diffusion_only.gds", + "geometry_hash_ref": "b5dcb4b6b410dd46", + "geometry_hash_mode": "b81d56105e5bfe56", + "geometry_identical": false + }, + { + "case": "C14_sky130_sW1_sL2", + "topology": "C14", + "pdk": "sky130", + "size": "sW1_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 257.493, + "A1": 257.493, + "rel": 0.0, + "class": "neutral", + "W0": 27.005, + "H0": 9.535, + "W1": 27.005, + "H1": 9.535, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/sky130/sW1_sL2/independent/C14_sky130_sW1_sL2_independent.gds", + "gds_mode": "runs/grid/C14/sky130/sW1_sL2/gate_only/C14_sky130_sW1_sL2_gate_only.gds", + "geometry_hash_ref": "b5dcb4b6b410dd46", + "geometry_hash_mode": "6cc65dab963ecd85", + "geometry_identical": false + }, + { + "case": "C14_sky130_sW1_sL2", + "topology": "C14", + "pdk": "sky130", + "size": "sW1_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 257.493, + "A1": 246.813, + "rel": -0.04147, + "class": "positive", + "W0": 27.005, + "H0": 9.535, + "W1": 25.885, + "H1": 9.535, + "dW": 1.12, + "dH": 0.0, + "condition_lhs_H0dW": 10.6792, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.12 + }, + "max_mos_row_span_saving": 1.12, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -10.679, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/sky130/sW1_sL2/independent/C14_sky130_sW1_sL2_independent.gds", + "gds_mode": "runs/grid/C14/sky130/sW1_sL2/combined/C14_sky130_sW1_sL2_combined.gds", + "geometry_hash_ref": "b5dcb4b6b410dd46", + "geometry_hash_mode": "312da110dd9182db", + "geometry_identical": false + }, + { + "case": "C14_sky130_sW2_sL1.5", + "topology": "C14", + "pdk": "sky130", + "size": "sW2_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 376.299, + "A1": 365.62, + "rel": -0.02838, + "class": "positive", + "W0": 39.465, + "H0": 9.535, + "W1": 38.345, + "H1": 9.535, + "dW": 1.12, + "dH": 0.0, + "condition_lhs_H0dW": 10.6792, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.12 + }, + "max_mos_row_span_saving": 1.12, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -10.679, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/sky130/sW2_sL1.5/independent/C14_sky130_sW2_sL1p5_independent.gds", + "gds_mode": "runs/grid/C14/sky130/sW2_sL1.5/diffusion_only/C14_sky130_sW2_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "d38faa88a6767fc4", + "geometry_hash_mode": "0db80ca21b333d24", + "geometry_identical": false + }, + { + "case": "C14_sky130_sW2_sL1.5", + "topology": "C14", + "pdk": "sky130", + "size": "sW2_sL1.5", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 376.299, + "A1": 376.299, + "rel": 0.0, + "class": "neutral", + "W0": 39.465, + "H0": 9.535, + "W1": 39.465, + "H1": 9.535, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/sky130/sW2_sL1.5/independent/C14_sky130_sW2_sL1p5_independent.gds", + "gds_mode": "runs/grid/C14/sky130/sW2_sL1.5/gate_only/C14_sky130_sW2_sL1p5_gate_only.gds", + "geometry_hash_ref": "d38faa88a6767fc4", + "geometry_hash_mode": "ebbd30e5a8e34502", + "geometry_identical": false + }, + { + "case": "C14_sky130_sW2_sL1.5", + "topology": "C14", + "pdk": "sky130", + "size": "sW2_sL1.5", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 376.299, + "A1": 365.62, + "rel": -0.02838, + "class": "positive", + "W0": 39.465, + "H0": 9.535, + "W1": 38.345, + "H1": 9.535, + "dW": 1.12, + "dH": 0.0, + "condition_lhs_H0dW": 10.6792, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.12 + }, + "max_mos_row_span_saving": 1.12, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -10.679, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/sky130/sW2_sL1.5/independent/C14_sky130_sW2_sL1p5_independent.gds", + "gds_mode": "runs/grid/C14/sky130/sW2_sL1.5/combined/C14_sky130_sW2_sL1p5_combined.gds", + "geometry_hash_ref": "d38faa88a6767fc4", + "geometry_hash_mode": "2a4d98085216ad08", + "geometry_identical": false + }, + { + "case": "C14_sky130_sW2_sL1", + "topology": "C14", + "pdk": "sky130", + "size": "sW2_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 296.205, + "A1": 285.526, + "rel": -0.03605, + "class": "positive", + "W0": 31.065, + "H0": 9.535, + "W1": 29.945, + "H1": 9.535, + "dW": 1.12, + "dH": 0.0, + "condition_lhs_H0dW": 10.6792, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.12 + }, + "max_mos_row_span_saving": 1.12, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -10.679, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/sky130/sW2_sL1/independent/C14_sky130_sW2_sL1_independent.gds", + "gds_mode": "runs/grid/C14/sky130/sW2_sL1/diffusion_only/C14_sky130_sW2_sL1_diffusion_only.gds", + "geometry_hash_ref": "3534332b3a1b41d5", + "geometry_hash_mode": "ea8d89472debfd88", + "geometry_identical": false + }, + { + "case": "C14_sky130_sW2_sL1", + "topology": "C14", + "pdk": "sky130", + "size": "sW2_sL1", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 296.205, + "A1": 296.205, + "rel": 0.0, + "class": "neutral", + "W0": 31.065, + "H0": 9.535, + "W1": 31.065, + "H1": 9.535, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/sky130/sW2_sL1/independent/C14_sky130_sW2_sL1_independent.gds", + "gds_mode": "runs/grid/C14/sky130/sW2_sL1/gate_only/C14_sky130_sW2_sL1_gate_only.gds", + "geometry_hash_ref": "3534332b3a1b41d5", + "geometry_hash_mode": "3dd2c2d900491e20", + "geometry_identical": false + }, + { + "case": "C14_sky130_sW2_sL1", + "topology": "C14", + "pdk": "sky130", + "size": "sW2_sL1", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 296.205, + "A1": 285.526, + "rel": -0.03605, + "class": "positive", + "W0": 31.065, + "H0": 9.535, + "W1": 29.945, + "H1": 9.535, + "dW": 1.12, + "dH": 0.0, + "condition_lhs_H0dW": 10.6792, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.12 + }, + "max_mos_row_span_saving": 1.12, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -10.679, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/sky130/sW2_sL1/independent/C14_sky130_sW2_sL1_independent.gds", + "gds_mode": "runs/grid/C14/sky130/sW2_sL1/combined/C14_sky130_sW2_sL1_combined.gds", + "geometry_hash_ref": "3534332b3a1b41d5", + "geometry_hash_mode": "87a50961fe9bf375", + "geometry_identical": false + }, + { + "case": "C14_sky130_sW2_sL2", + "topology": "C14", + "pdk": "sky130", + "size": "sW2_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 456.393, + "A1": 445.714, + "rel": -0.0234, + "class": "positive", + "W0": 47.865, + "H0": 9.535, + "W1": 46.745, + "H1": 9.535, + "dW": 1.12, + "dH": 0.0, + "condition_lhs_H0dW": 10.6792, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.12 + }, + "max_mos_row_span_saving": 1.12, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -10.679, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/sky130/sW2_sL2/independent/C14_sky130_sW2_sL2_independent.gds", + "gds_mode": "runs/grid/C14/sky130/sW2_sL2/diffusion_only/C14_sky130_sW2_sL2_diffusion_only.gds", + "geometry_hash_ref": "bed8048f08c4406b", + "geometry_hash_mode": "886470ce09f611be", + "geometry_identical": false + }, + { + "case": "C14_sky130_sW2_sL2", + "topology": "C14", + "pdk": "sky130", + "size": "sW2_sL2", + "mode": "gate_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 456.393, + "A1": 456.393, + "rel": 0.0, + "class": "neutral", + "W0": 47.865, + "H0": 9.535, + "W1": 47.865, + "H1": 9.535, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.0 + }, + "max_mos_row_span_saving": 0.0, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/sky130/sW2_sL2/independent/C14_sky130_sW2_sL2_independent.gds", + "gds_mode": "runs/grid/C14/sky130/sW2_sL2/gate_only/C14_sky130_sW2_sL2_gate_only.gds", + "geometry_hash_ref": "bed8048f08c4406b", + "geometry_hash_mode": "394b568986acfc89", + "geometry_identical": false + }, + { + "case": "C14_sky130_sW2_sL2", + "topology": "C14", + "pdk": "sky130", + "size": "sW2_sL2", + "mode": "combined", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 456.393, + "A1": 445.714, + "rel": -0.0234, + "class": "positive", + "W0": 47.865, + "H0": 9.535, + "W1": 46.745, + "H1": 9.535, + "dW": 1.12, + "dH": 0.0, + "condition_lhs_H0dW": 10.6792, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 1.12 + }, + "max_mos_row_span_saving": 1.12, + "widest_row_ref": "n", + "widest_row_mode": "n", + "passive_dominated": false, + "area_terms": { + "wider_row": -10.679, + "stub_separation": -0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C14/sky130/sW2_sL2/independent/C14_sky130_sW2_sL2_independent.gds", + "gds_mode": "runs/grid/C14/sky130/sW2_sL2/combined/C14_sky130_sW2_sL2_combined.gds", + "geometry_hash_ref": "bed8048f08c4406b", + "geometry_hash_mode": "024bcdeb68f02dd0", + "geometry_identical": false + }, + { + "case": "C16_gf180_sW0.5_sL1", + "topology": "C16", + "pdk": "gf180", + "size": "sW0.5_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1729.365, + "A1": 1729.365, + "rel": 0.0, + "class": "neutral", + "W0": 123.88, + "H0": 13.96, + "W1": 123.88, + "H1": 13.96, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "passive", + "widest_row_mode": "passive", + "passive_dominated": true, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C16/gf180/sW0.5_sL1/independent/C16_gf180_sW0p5_sL1_independent.gds", + "gds_mode": "runs/grid/C16/gf180/sW0.5_sL1/diffusion_only/C16_gf180_sW0p5_sL1_diffusion_only.gds", + "geometry_hash_ref": "5e91466305547d7e", + "geometry_hash_mode": "8f12c4b02141af82", + "geometry_identical": false + }, + { + "case": "C16_gf180_sW1.5_sL1.5", + "topology": "C16", + "pdk": "gf180", + "size": "sW1.5_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1729.365, + "A1": 1729.365, + "rel": 0.0, + "class": "neutral", + "W0": 123.88, + "H0": 13.96, + "W1": 123.88, + "H1": 13.96, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "passive", + "widest_row_mode": "passive", + "passive_dominated": true, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C16/gf180/sW1.5_sL1.5/independent/C16_gf180_sW1p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C16/gf180/sW1.5_sL1.5/diffusion_only/C16_gf180_sW1p5_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "5dbe5a6c9a8a39f4", + "geometry_hash_mode": "4a76ee07c036ffdf", + "geometry_identical": false + }, + { + "case": "C16_gf180_sW1.5_sL1", + "topology": "C16", + "pdk": "gf180", + "size": "sW1.5_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1729.365, + "A1": 1729.365, + "rel": 0.0, + "class": "neutral", + "W0": 123.88, + "H0": 13.96, + "W1": 123.88, + "H1": 13.96, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "passive", + "widest_row_mode": "passive", + "passive_dominated": true, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C16/gf180/sW1.5_sL1/independent/C16_gf180_sW1p5_sL1_independent.gds", + "gds_mode": "runs/grid/C16/gf180/sW1.5_sL1/diffusion_only/C16_gf180_sW1p5_sL1_diffusion_only.gds", + "geometry_hash_ref": "ceda7956fa909e95", + "geometry_hash_mode": "db3ea8835fb7a314", + "geometry_identical": false + }, + { + "case": "C16_gf180_sW1.5_sL2", + "topology": "C16", + "pdk": "gf180", + "size": "sW1.5_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1729.365, + "A1": 1729.365, + "rel": 0.0, + "class": "neutral", + "W0": 123.88, + "H0": 13.96, + "W1": 123.88, + "H1": 13.96, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "passive", + "widest_row_mode": "passive", + "passive_dominated": true, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C16/gf180/sW1.5_sL2/independent/C16_gf180_sW1p5_sL2_independent.gds", + "gds_mode": "runs/grid/C16/gf180/sW1.5_sL2/diffusion_only/C16_gf180_sW1p5_sL2_diffusion_only.gds", + "geometry_hash_ref": "56a7f51680e86f46", + "geometry_hash_mode": "b29fcb3b19cd9e46", + "geometry_identical": false + }, + { + "case": "C16_gf180_sW1_sL1.5", + "topology": "C16", + "pdk": "gf180", + "size": "sW1_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1729.365, + "A1": 1729.365, + "rel": 0.0, + "class": "neutral", + "W0": 123.88, + "H0": 13.96, + "W1": 123.88, + "H1": 13.96, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "passive", + "widest_row_mode": "passive", + "passive_dominated": true, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C16/gf180/sW1_sL1.5/independent/C16_gf180_sW1_sL1p5_independent.gds", + "gds_mode": "runs/grid/C16/gf180/sW1_sL1.5/diffusion_only/C16_gf180_sW1_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "42a11ff72029bf80", + "geometry_hash_mode": "a46fa231526106af", + "geometry_identical": false + }, + { + "case": "C16_gf180_sW1_sL1", + "topology": "C16", + "pdk": "gf180", + "size": "sW1_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1729.365, + "A1": 1729.365, + "rel": 0.0, + "class": "neutral", + "W0": 123.88, + "H0": 13.96, + "W1": 123.88, + "H1": 13.96, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "passive", + "widest_row_mode": "passive", + "passive_dominated": true, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C16/gf180/sW1_sL1/independent/C16_gf180_sW1_sL1_independent.gds", + "gds_mode": "runs/grid/C16/gf180/sW1_sL1/diffusion_only/C16_gf180_sW1_sL1_diffusion_only.gds", + "geometry_hash_ref": "a5ada0153f64f8ad", + "geometry_hash_mode": "abddb39ba7b4fcfe", + "geometry_identical": false + }, + { + "case": "C16_gf180_sW1_sL2", + "topology": "C16", + "pdk": "gf180", + "size": "sW1_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1729.365, + "A1": 1729.365, + "rel": 0.0, + "class": "neutral", + "W0": 123.88, + "H0": 13.96, + "W1": 123.88, + "H1": 13.96, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "passive", + "widest_row_mode": "passive", + "passive_dominated": true, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C16/gf180/sW1_sL2/independent/C16_gf180_sW1_sL2_independent.gds", + "gds_mode": "runs/grid/C16/gf180/sW1_sL2/diffusion_only/C16_gf180_sW1_sL2_diffusion_only.gds", + "geometry_hash_ref": "881380c5a1403d72", + "geometry_hash_mode": "693c5b50c6e5981e", + "geometry_identical": false + }, + { + "case": "C16_gf180_sW2_sL1.5", + "topology": "C16", + "pdk": "gf180", + "size": "sW2_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1729.365, + "A1": 1729.365, + "rel": 0.0, + "class": "neutral", + "W0": 123.88, + "H0": 13.96, + "W1": 123.88, + "H1": 13.96, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "passive", + "widest_row_mode": "passive", + "passive_dominated": true, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C16/gf180/sW2_sL1.5/independent/C16_gf180_sW2_sL1p5_independent.gds", + "gds_mode": "runs/grid/C16/gf180/sW2_sL1.5/diffusion_only/C16_gf180_sW2_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "e9633518338a7a39", + "geometry_hash_mode": "5e3b882e24c932ea", + "geometry_identical": false + }, + { + "case": "C16_gf180_sW2_sL1", + "topology": "C16", + "pdk": "gf180", + "size": "sW2_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1729.365, + "A1": 1729.365, + "rel": 0.0, + "class": "neutral", + "W0": 123.88, + "H0": 13.96, + "W1": 123.88, + "H1": 13.96, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "passive", + "widest_row_mode": "passive", + "passive_dominated": true, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C16/gf180/sW2_sL1/independent/C16_gf180_sW2_sL1_independent.gds", + "gds_mode": "runs/grid/C16/gf180/sW2_sL1/diffusion_only/C16_gf180_sW2_sL1_diffusion_only.gds", + "geometry_hash_ref": "ba0d27f05e7a93de", + "geometry_hash_mode": "cd049c9a28ec8a0f", + "geometry_identical": false + }, + { + "case": "C16_gf180_sW2_sL2", + "topology": "C16", + "pdk": "gf180", + "size": "sW2_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1729.365, + "A1": 1729.365, + "rel": 0.0, + "class": "neutral", + "W0": 123.88, + "H0": 13.96, + "W1": 123.88, + "H1": 13.96, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.8 + }, + "max_mos_row_span_saving": 0.8, + "widest_row_ref": "passive", + "widest_row_mode": "passive", + "passive_dominated": true, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C16/gf180/sW2_sL2/independent/C16_gf180_sW2_sL2_independent.gds", + "gds_mode": "runs/grid/C16/gf180/sW2_sL2/diffusion_only/C16_gf180_sW2_sL2_diffusion_only.gds", + "geometry_hash_ref": "9a04b955983e278c", + "geometry_hash_mode": "3e43b9bb26da4a4a", + "geometry_identical": false + }, + { + "case": "C16_ihp130_sW0.5_sL1", + "topology": "C16", + "pdk": "ihp130", + "size": "sW0.5_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1007.736, + "A1": 1007.736, + "rel": 0.0, + "class": "neutral", + "W0": 95.52, + "H0": 10.55, + "W1": 95.52, + "H1": 10.55, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "passive", + "widest_row_mode": "passive", + "passive_dominated": true, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C16/ihp130/sW0.5_sL1/independent/C16_ihp130_sW0p5_sL1_independent.gds", + "gds_mode": "runs/grid/C16/ihp130/sW0.5_sL1/diffusion_only/C16_ihp130_sW0p5_sL1_diffusion_only.gds", + "geometry_hash_ref": "fcf29bc04721e864", + "geometry_hash_mode": "54f93cb9f142e62b", + "geometry_identical": false + }, + { + "case": "C16_ihp130_sW1.5_sL1.5", + "topology": "C16", + "pdk": "ihp130", + "size": "sW1.5_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1007.736, + "A1": 1007.736, + "rel": 0.0, + "class": "neutral", + "W0": 95.52, + "H0": 10.55, + "W1": 95.52, + "H1": 10.55, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "passive", + "widest_row_mode": "passive", + "passive_dominated": true, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C16/ihp130/sW1.5_sL1.5/independent/C16_ihp130_sW1p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C16/ihp130/sW1.5_sL1.5/diffusion_only/C16_ihp130_sW1p5_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "d13799ed002da4ad", + "geometry_hash_mode": "5af2f40ddba09c0b", + "geometry_identical": false + }, + { + "case": "C16_ihp130_sW1.5_sL1", + "topology": "C16", + "pdk": "ihp130", + "size": "sW1.5_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1007.736, + "A1": 1007.736, + "rel": 0.0, + "class": "neutral", + "W0": 95.52, + "H0": 10.55, + "W1": 95.52, + "H1": 10.55, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "passive", + "widest_row_mode": "passive", + "passive_dominated": true, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C16/ihp130/sW1.5_sL1/independent/C16_ihp130_sW1p5_sL1_independent.gds", + "gds_mode": "runs/grid/C16/ihp130/sW1.5_sL1/diffusion_only/C16_ihp130_sW1p5_sL1_diffusion_only.gds", + "geometry_hash_ref": "683052a0bd232ae0", + "geometry_hash_mode": "b1623d5fa5c70e2c", + "geometry_identical": false + }, + { + "case": "C16_ihp130_sW1.5_sL2", + "topology": "C16", + "pdk": "ihp130", + "size": "sW1.5_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1007.736, + "A1": 1007.736, + "rel": 0.0, + "class": "neutral", + "W0": 95.52, + "H0": 10.55, + "W1": 95.52, + "H1": 10.55, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "passive", + "widest_row_mode": "passive", + "passive_dominated": true, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C16/ihp130/sW1.5_sL2/independent/C16_ihp130_sW1p5_sL2_independent.gds", + "gds_mode": "runs/grid/C16/ihp130/sW1.5_sL2/diffusion_only/C16_ihp130_sW1p5_sL2_diffusion_only.gds", + "geometry_hash_ref": "5cea6398459e4d66", + "geometry_hash_mode": "e3b28be2e26fadca", + "geometry_identical": false + }, + { + "case": "C16_ihp130_sW1_sL1.5", + "topology": "C16", + "pdk": "ihp130", + "size": "sW1_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1007.736, + "A1": 1007.736, + "rel": 0.0, + "class": "neutral", + "W0": 95.52, + "H0": 10.55, + "W1": 95.52, + "H1": 10.55, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "passive", + "widest_row_mode": "passive", + "passive_dominated": true, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C16/ihp130/sW1_sL1.5/independent/C16_ihp130_sW1_sL1p5_independent.gds", + "gds_mode": "runs/grid/C16/ihp130/sW1_sL1.5/diffusion_only/C16_ihp130_sW1_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "4a2f7cd328622619", + "geometry_hash_mode": "cf2f0c5dd29b5337", + "geometry_identical": false + }, + { + "case": "C16_ihp130_sW1_sL1", + "topology": "C16", + "pdk": "ihp130", + "size": "sW1_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1007.736, + "A1": 1007.736, + "rel": 0.0, + "class": "neutral", + "W0": 95.52, + "H0": 10.55, + "W1": 95.52, + "H1": 10.55, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "passive", + "widest_row_mode": "passive", + "passive_dominated": true, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C16/ihp130/sW1_sL1/independent/C16_ihp130_sW1_sL1_independent.gds", + "gds_mode": "runs/grid/C16/ihp130/sW1_sL1/diffusion_only/C16_ihp130_sW1_sL1_diffusion_only.gds", + "geometry_hash_ref": "a3358a6d5ec65e54", + "geometry_hash_mode": "b4f371bca457bd12", + "geometry_identical": false + }, + { + "case": "C16_ihp130_sW1_sL2", + "topology": "C16", + "pdk": "ihp130", + "size": "sW1_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1007.736, + "A1": 1007.736, + "rel": 0.0, + "class": "neutral", + "W0": 95.52, + "H0": 10.55, + "W1": 95.52, + "H1": 10.55, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "passive", + "widest_row_mode": "passive", + "passive_dominated": true, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C16/ihp130/sW1_sL2/independent/C16_ihp130_sW1_sL2_independent.gds", + "gds_mode": "runs/grid/C16/ihp130/sW1_sL2/diffusion_only/C16_ihp130_sW1_sL2_diffusion_only.gds", + "geometry_hash_ref": "d59e29662816ba20", + "geometry_hash_mode": "d75eec067a5fa0a6", + "geometry_identical": false + }, + { + "case": "C16_ihp130_sW2_sL1.5", + "topology": "C16", + "pdk": "ihp130", + "size": "sW2_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1007.736, + "A1": 1007.736, + "rel": 0.0, + "class": "neutral", + "W0": 95.52, + "H0": 10.55, + "W1": 95.52, + "H1": 10.55, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "passive", + "widest_row_mode": "passive", + "passive_dominated": true, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C16/ihp130/sW2_sL1.5/independent/C16_ihp130_sW2_sL1p5_independent.gds", + "gds_mode": "runs/grid/C16/ihp130/sW2_sL1.5/diffusion_only/C16_ihp130_sW2_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "5920c446c0da885a", + "geometry_hash_mode": "7a75902b1bdc1dc5", + "geometry_identical": false + }, + { + "case": "C16_ihp130_sW2_sL1", + "topology": "C16", + "pdk": "ihp130", + "size": "sW2_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1007.736, + "A1": 1007.736, + "rel": 0.0, + "class": "neutral", + "W0": 95.52, + "H0": 10.55, + "W1": 95.52, + "H1": 10.55, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "passive", + "widest_row_mode": "passive", + "passive_dominated": true, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C16/ihp130/sW2_sL1/independent/C16_ihp130_sW2_sL1_independent.gds", + "gds_mode": "runs/grid/C16/ihp130/sW2_sL1/diffusion_only/C16_ihp130_sW2_sL1_diffusion_only.gds", + "geometry_hash_ref": "6616a48b24ba0647", + "geometry_hash_mode": "5ace873d26db2332", + "geometry_identical": false + }, + { + "case": "C16_ihp130_sW2_sL2", + "topology": "C16", + "pdk": "ihp130", + "size": "sW2_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 1007.736, + "A1": 1007.736, + "rel": 0.0, + "class": "neutral", + "W0": 95.52, + "H0": 10.55, + "W1": 95.52, + "H1": 10.55, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.51 + }, + "max_mos_row_span_saving": 0.51, + "widest_row_ref": "passive", + "widest_row_mode": "passive", + "passive_dominated": true, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C16/ihp130/sW2_sL2/independent/C16_ihp130_sW2_sL2_independent.gds", + "gds_mode": "runs/grid/C16/ihp130/sW2_sL2/diffusion_only/C16_ihp130_sW2_sL2_diffusion_only.gds", + "geometry_hash_ref": "d7da4243dd8b75ea", + "geometry_hash_mode": "8318430dd18e78d2", + "geometry_identical": false + }, + { + "case": "C16_sky130_sW0.5_sL1.5", + "topology": "C16", + "pdk": "sky130", + "size": "sW0.5_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 377.279, + "A1": 377.279, + "rel": 0.0, + "class": "neutral", + "W0": 36.97, + "H0": 10.205, + "W1": 36.97, + "H1": 10.205, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "passive", + "widest_row_mode": "passive", + "passive_dominated": true, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C16/sky130/sW0.5_sL1.5/independent/C16_sky130_sW0p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C16/sky130/sW0.5_sL1.5/diffusion_only/C16_sky130_sW0p5_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "2168bc1c00278aa0", + "geometry_hash_mode": "d75396fb0a298713", + "geometry_identical": false + }, + { + "case": "C16_sky130_sW0.5_sL1", + "topology": "C16", + "pdk": "sky130", + "size": "sW0.5_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 377.279, + "A1": 377.279, + "rel": 0.0, + "class": "neutral", + "W0": 36.97, + "H0": 10.205, + "W1": 36.97, + "H1": 10.205, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "passive", + "widest_row_mode": "passive", + "passive_dominated": true, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C16/sky130/sW0.5_sL1/independent/C16_sky130_sW0p5_sL1_independent.gds", + "gds_mode": "runs/grid/C16/sky130/sW0.5_sL1/diffusion_only/C16_sky130_sW0p5_sL1_diffusion_only.gds", + "geometry_hash_ref": "74454c77e27dd8f3", + "geometry_hash_mode": "805ceb41515dda4d", + "geometry_identical": false + }, + { + "case": "C16_sky130_sW0.5_sL2", + "topology": "C16", + "pdk": "sky130", + "size": "sW0.5_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 377.279, + "A1": 377.279, + "rel": 0.0, + "class": "neutral", + "W0": 36.97, + "H0": 10.205, + "W1": 36.97, + "H1": 10.205, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "passive", + "widest_row_mode": "passive", + "passive_dominated": true, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C16/sky130/sW0.5_sL2/independent/C16_sky130_sW0p5_sL2_independent.gds", + "gds_mode": "runs/grid/C16/sky130/sW0.5_sL2/diffusion_only/C16_sky130_sW0p5_sL2_diffusion_only.gds", + "geometry_hash_ref": "65ef750a1b50e012", + "geometry_hash_mode": "c765c79bfad9289c", + "geometry_identical": false + }, + { + "case": "C16_sky130_sW1.5_sL1.5", + "topology": "C16", + "pdk": "sky130", + "size": "sW1.5_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 377.279, + "A1": 377.279, + "rel": 0.0, + "class": "neutral", + "W0": 36.97, + "H0": 10.205, + "W1": 36.97, + "H1": 10.205, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "passive", + "widest_row_mode": "passive", + "passive_dominated": true, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C16/sky130/sW1.5_sL1.5/independent/C16_sky130_sW1p5_sL1p5_independent.gds", + "gds_mode": "runs/grid/C16/sky130/sW1.5_sL1.5/diffusion_only/C16_sky130_sW1p5_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "da60e4e4f563fb69", + "geometry_hash_mode": "2ac97b85c23ef0dd", + "geometry_identical": false + }, + { + "case": "C16_sky130_sW1.5_sL1", + "topology": "C16", + "pdk": "sky130", + "size": "sW1.5_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 377.279, + "A1": 377.279, + "rel": 0.0, + "class": "neutral", + "W0": 36.97, + "H0": 10.205, + "W1": 36.97, + "H1": 10.205, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "passive", + "widest_row_mode": "passive", + "passive_dominated": true, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C16/sky130/sW1.5_sL1/independent/C16_sky130_sW1p5_sL1_independent.gds", + "gds_mode": "runs/grid/C16/sky130/sW1.5_sL1/diffusion_only/C16_sky130_sW1p5_sL1_diffusion_only.gds", + "geometry_hash_ref": "5f953448d73047f4", + "geometry_hash_mode": "d8ec58616f06fe36", + "geometry_identical": false + }, + { + "case": "C16_sky130_sW1.5_sL2", + "topology": "C16", + "pdk": "sky130", + "size": "sW1.5_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 377.279, + "A1": 377.279, + "rel": 0.0, + "class": "neutral", + "W0": 36.97, + "H0": 10.205, + "W1": 36.97, + "H1": 10.205, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "passive", + "widest_row_mode": "passive", + "passive_dominated": true, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C16/sky130/sW1.5_sL2/independent/C16_sky130_sW1p5_sL2_independent.gds", + "gds_mode": "runs/grid/C16/sky130/sW1.5_sL2/diffusion_only/C16_sky130_sW1p5_sL2_diffusion_only.gds", + "geometry_hash_ref": "43f61254e6aa09c6", + "geometry_hash_mode": "d6ac6a30619ead42", + "geometry_identical": false + }, + { + "case": "C16_sky130_sW1_sL1.5", + "topology": "C16", + "pdk": "sky130", + "size": "sW1_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 377.279, + "A1": 377.279, + "rel": 0.0, + "class": "neutral", + "W0": 36.97, + "H0": 10.205, + "W1": 36.97, + "H1": 10.205, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "passive", + "widest_row_mode": "passive", + "passive_dominated": true, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C16/sky130/sW1_sL1.5/independent/C16_sky130_sW1_sL1p5_independent.gds", + "gds_mode": "runs/grid/C16/sky130/sW1_sL1.5/diffusion_only/C16_sky130_sW1_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "6cd1b10a3f2551d2", + "geometry_hash_mode": "541d6a72daebafd8", + "geometry_identical": false + }, + { + "case": "C16_sky130_sW1_sL1", + "topology": "C16", + "pdk": "sky130", + "size": "sW1_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 377.279, + "A1": 377.279, + "rel": 0.0, + "class": "neutral", + "W0": 36.97, + "H0": 10.205, + "W1": 36.97, + "H1": 10.205, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "passive", + "widest_row_mode": "passive", + "passive_dominated": true, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C16/sky130/sW1_sL1/independent/C16_sky130_sW1_sL1_independent.gds", + "gds_mode": "runs/grid/C16/sky130/sW1_sL1/diffusion_only/C16_sky130_sW1_sL1_diffusion_only.gds", + "geometry_hash_ref": "bc1634c8eabc044f", + "geometry_hash_mode": "2c06e18158dabfb0", + "geometry_identical": false + }, + { + "case": "C16_sky130_sW1_sL2", + "topology": "C16", + "pdk": "sky130", + "size": "sW1_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 377.279, + "A1": 377.279, + "rel": 0.0, + "class": "neutral", + "W0": 36.97, + "H0": 10.205, + "W1": 36.97, + "H1": 10.205, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "passive", + "widest_row_mode": "passive", + "passive_dominated": true, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C16/sky130/sW1_sL2/independent/C16_sky130_sW1_sL2_independent.gds", + "gds_mode": "runs/grid/C16/sky130/sW1_sL2/diffusion_only/C16_sky130_sW1_sL2_diffusion_only.gds", + "geometry_hash_ref": "977a54c387a8be03", + "geometry_hash_mode": "68ac28279fdae6cd", + "geometry_identical": false + }, + { + "case": "C16_sky130_sW2_sL1.5", + "topology": "C16", + "pdk": "sky130", + "size": "sW2_sL1.5", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 377.279, + "A1": 377.279, + "rel": 0.0, + "class": "neutral", + "W0": 36.97, + "H0": 10.205, + "W1": 36.97, + "H1": 10.205, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "passive", + "widest_row_mode": "passive", + "passive_dominated": true, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C16/sky130/sW2_sL1.5/independent/C16_sky130_sW2_sL1p5_independent.gds", + "gds_mode": "runs/grid/C16/sky130/sW2_sL1.5/diffusion_only/C16_sky130_sW2_sL1p5_diffusion_only.gds", + "geometry_hash_ref": "a2f1f01f3b2c0862", + "geometry_hash_mode": "a91daa0f8408a905", + "geometry_identical": false + }, + { + "case": "C16_sky130_sW2_sL1", + "topology": "C16", + "pdk": "sky130", + "size": "sW2_sL1", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 377.279, + "A1": 377.279, + "rel": 0.0, + "class": "neutral", + "W0": 36.97, + "H0": 10.205, + "W1": 36.97, + "H1": 10.205, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "passive", + "widest_row_mode": "passive", + "passive_dominated": true, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C16/sky130/sW2_sL1/independent/C16_sky130_sW2_sL1_independent.gds", + "gds_mode": "runs/grid/C16/sky130/sW2_sL1/diffusion_only/C16_sky130_sW2_sL1_diffusion_only.gds", + "geometry_hash_ref": "301bf460c4eaa2e7", + "geometry_hash_mode": "6a89f169b6e0efd4", + "geometry_identical": false + }, + { + "case": "C16_sky130_sW2_sL2", + "topology": "C16", + "pdk": "sky130", + "size": "sW2_sL2", + "mode": "diffusion_only", + "both_auto_passed": true, + "status_ref": "auto_passed", + "status_mode": "auto_passed", + "A0": 377.279, + "A1": 377.279, + "rel": 0.0, + "class": "neutral", + "W0": 36.97, + "H0": 10.205, + "W1": 36.97, + "H1": 10.205, + "dW": 0.0, + "dH": 0.0, + "condition_lhs_H0dW": 0.0, + "condition_rhs_W1dH": 0.0, + "dH_mos_rows": 0.0, + "dH_channels": 0.0, + "dH_other": 0.0, + "row_span_saving": { + "n": 0.56 + }, + "max_mos_row_span_saving": 0.56, + "widest_row_ref": "passive", + "widest_row_mode": "passive", + "passive_dominated": true, + "area_terms": { + "wider_row": 0.0, + "stub_separation": 0.0, + "taller_mos_rows": 0.0, + "routing_tracks": 0.0, + "other_height": 0.0 + }, + "channel_strategy_ref": "shared", + "channel_strategy_mode": "shared", + "gds_ref": "runs/grid/C16/sky130/sW2_sL2/independent/C16_sky130_sW2_sL2_independent.gds", + "gds_mode": "runs/grid/C16/sky130/sW2_sL2/diffusion_only/C16_sky130_sW2_sL2_diffusion_only.gds", + "geometry_hash_ref": "1dd150f2eb035524", + "geometry_hash_mode": "2cba99d3fe44ba6c", + "geometry_identical": false + } + ], + "dead_band": 0.005 +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/results/analysis/cost_validation_dev.json b/benchmarks/textbook_sharing/results/analysis/cost_validation_dev.json new file mode 100644 index 00000000..4d168c17 --- /dev/null +++ b/benchmarks/textbook_sharing/results/analysis/cost_validation_dev.json @@ -0,0 +1,6004 @@ +{ + "summary": { + "by": { + "pdk": { + "gf180": { + "correct": 61, + "n": 66 + }, + "ihp130": { + "correct": 53, + "n": 60 + }, + "sky130": { + "correct": 56, + "n": 63 + } + }, + "topology": { + "C01": { + "correct": 15, + "n": 15 + }, + "C02": { + "correct": 18, + "n": 18 + }, + "C03": { + "correct": 18, + "n": 18 + }, + "C05": { + "correct": 6, + "n": 6 + }, + "C06": { + "correct": 6, + "n": 6 + }, + "C07": { + "correct": 13, + "n": 18 + }, + "C08": { + "correct": 18, + "n": 18 + }, + "C09": { + "correct": 15, + "n": 15 + }, + "C10": { + "correct": 14, + "n": 15 + }, + "C11": { + "correct": 6, + "n": 18 + }, + "C13": { + "correct": 17, + "n": 18 + }, + "C14": { + "correct": 18, + "n": 18 + }, + "C16": { + "correct": 6, + "n": 6 + } + }, + "mode": { + "combined": { + "correct": 47, + "n": 57 + }, + "diffusion_only": { + "correct": 72, + "n": 75 + }, + "gate_only": { + "correct": 51, + "n": 57 + } + } + }, + "n_pairs": 189, + "sign_correct": 170, + "confusion(true,hat)": { + "-1,-1": 136, + "0,0": 34, + "1,-1": 5, + "0,-1": 2, + "0,1": 3, + "-1,0": 8, + "-1,1": 1 + }, + "error_types": { + "routing channel height mis-predicted + row x-shift changed": 12, + "routing channel height mis-predicted": 6, + "row x-shift changed (cross-row via conflict, not modelled)": 1 + }, + "median_abs_error_rel": 0.0, + "p90_abs_error_rel": 0.09056, + "dead_band": 0.005, + "pin_model_mismatch_cases": [], + "rule": "textbook_sharing.selection.cost v2", + "channel_rule": "nets" + }, + "rows": [ + { + "case": "C01_gf180_sW1_sL1.5", + "mode": "diffusion_only", + "A0": 214.1568, + "A_true": 206.6688, + "A_hat": 206.6688, + "d_true": -0.03497, + "d_hat": -0.03497, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.1000000000000005 + ], + "channel_base": [ + 2.5, + 4.1000000000000005 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C01_gf180_sW1_sL1.5", + "mode": "gate_only", + "A0": 214.1568, + "A_true": 195.8528, + "A_hat": 195.8528, + "d_true": -0.08547, + "d_hat": -0.08547, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.1000000000000005 + ], + "channel_base": [ + 2.5, + 4.1000000000000005 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C01_gf180_sW1_sL1.5", + "mode": "combined", + "A0": 214.1568, + "A_true": 189.0048, + "A_hat": 189.0048, + "d_true": -0.11745, + "d_hat": -0.11745, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.1000000000000005 + ], + "channel_base": [ + 2.5, + 4.1000000000000005 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C01_gf180_sW1_sL1", + "mode": "diffusion_only", + "A0": 172.224, + "A_true": 164.736, + "A_hat": 164.736, + "d_true": -0.04348, + "d_hat": -0.04348, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.1000000000000005 + ], + "channel_base": [ + 2.5, + 4.1000000000000005 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C01_gf180_sW1_sL1", + "mode": "gate_only", + "A0": 172.224, + "A_true": 157.504, + "A_hat": 157.504, + "d_true": -0.08547, + "d_hat": -0.08547, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.1000000000000005 + ], + "channel_base": [ + 2.5, + 4.1000000000000005 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C01_gf180_sW1_sL1", + "mode": "combined", + "A0": 172.224, + "A_true": 150.656, + "A_hat": 150.656, + "d_true": -0.12523, + "d_hat": -0.12523, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.1000000000000005 + ], + "channel_base": [ + 2.5, + 4.1000000000000005 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C01_ihp130_sW1_sL1.5", + "mode": "diffusion_only", + "A0": 129.3102, + "A_true": 125.8218, + "A_hat": 125.8218, + "d_true": -0.02698, + "d_hat": -0.02698, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.7199999999999998, + 2.9 + ], + "channel_base": [ + 1.7199999999999998, + 2.9 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C01_ihp130_sW1_sL1.5", + "mode": "gate_only", + "A0": 129.3102, + "A_true": 119.6686, + "A_hat": 119.6687, + "d_true": -0.07456, + "d_hat": -0.07456, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.7199999999999998, + 2.9 + ], + "channel_base": [ + 1.7199999999999998, + 2.9 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C01_ihp130_sW1_sL1.5", + "mode": "combined", + "A0": 129.3102, + "A_true": 116.4403, + "A_hat": 116.4404, + "d_true": -0.09953, + "d_hat": -0.09953, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.7199999999999998, + 2.9 + ], + "channel_base": [ + 1.7199999999999998, + 2.9 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C01_sky130_sW1_sL1.5", + "mode": "diffusion_only", + "A0": 95.1085, + "A_true": 91.1353, + "A_hat": 91.1353, + "d_true": -0.04178, + "d_hat": -0.04178, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 3.1 + ], + "channel_base": [ + 1.88, + 3.1 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C01_sky130_sW1_sL1.5", + "mode": "gate_only", + "A0": 95.1085, + "A_true": 87.8698, + "A_hat": 87.8698, + "d_true": -0.07611, + "d_hat": -0.07611, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 3.1 + ], + "channel_base": [ + 1.88, + 3.1 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C01_sky130_sW1_sL1.5", + "mode": "combined", + "A0": 95.1085, + "A_true": 84.199, + "A_hat": 84.199, + "d_true": -0.11471, + "d_hat": -0.11471, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 3.1 + ], + "channel_base": [ + 1.88, + 3.1 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C01_sky130_sW1_sL1", + "mode": "diffusion_only", + "A0": 78.0805, + "A_true": 74.1073, + "A_hat": 74.1073, + "d_true": -0.05089, + "d_hat": -0.05089, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 3.1 + ], + "channel_base": [ + 1.88, + 3.1 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C01_sky130_sW1_sL1", + "mode": "gate_only", + "A0": 78.0805, + "A_true": 72.1378, + "A_hat": 72.1378, + "d_true": -0.07611, + "d_hat": -0.07611, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 3.1 + ], + "channel_base": [ + 1.88, + 3.1 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C01_sky130_sW1_sL1", + "mode": "combined", + "A0": 78.0805, + "A_true": 68.467, + "A_hat": 68.467, + "d_true": -0.12312, + "d_hat": -0.12312, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 3.1 + ], + "channel_base": [ + 1.88, + 3.1 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C02_gf180_sW1_sL1.5", + "mode": "diffusion_only", + "A0": 349.9776, + "A_true": 340.5696, + "A_hat": 340.5696, + "d_true": -0.02688, + "d_hat": -0.02688, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 3.3, + 5.7 + ], + "channel_base": [ + 3.3, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C02_gf180_sW1_sL1.5", + "mode": "gate_only", + "A0": 349.9776, + "A_true": 300.7664, + "A_hat": 335.5716, + "d_true": -0.14061, + "d_hat": -0.04116, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.9 + ], + "channel_base": [ + 3.3, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.8, + 0.0 + ] + }, + { + "case": "C02_gf180_sW1_sL1.5", + "mode": "combined", + "A0": 349.9776, + "A_true": 292.6704, + "A_hat": 326.8356, + "d_true": -0.16375, + "d_hat": -0.06612, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.9 + ], + "channel_base": [ + 3.3, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.8, + 0.0 + ] + }, + { + "case": "C02_gf180_sW1_sL1", + "mode": "diffusion_only", + "A0": 297.2928, + "A_true": 287.8848, + "A_hat": 287.8848, + "d_true": -0.03165, + "d_hat": -0.03165, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 3.3, + 5.7 + ], + "channel_base": [ + 3.3, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C02_gf180_sW1_sL1", + "mode": "gate_only", + "A0": 297.2928, + "A_true": 255.4288, + "A_hat": 286.65, + "d_true": -0.14082, + "d_hat": -0.0358, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.9 + ], + "channel_base": [ + 3.3, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.8, + 0.0 + ] + }, + { + "case": "C02_gf180_sW1_sL1", + "mode": "combined", + "A0": 297.2928, + "A_true": 247.3328, + "A_hat": 277.914, + "d_true": -0.16805, + "d_hat": -0.06518, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.9 + ], + "channel_base": [ + 3.3, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.8, + 0.0 + ] + }, + { + "case": "C02_ihp130_sW1_sL1.5", + "mode": "diffusion_only", + "A0": 202.0337, + "A_true": 197.6425, + "A_hat": 197.6425, + "d_true": -0.02173, + "d_hat": -0.02173, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.3099999999999996, + 4.08 + ], + "channel_base": [ + 2.3099999999999996, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C02_ihp130_sW1_sL1.5", + "mode": "gate_only", + "A0": 202.0337, + "A_true": 173.5051, + "A_hat": 191.8, + "d_true": -0.14121, + "d_hat": -0.05065, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.84 + ], + "channel_true": [ + 1.7199999999999998, + 3.4899999999999998 + ], + "channel_base": [ + 2.3099999999999996, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.59, + 0.0 + ] + }, + { + "case": "C02_ihp130_sW1_sL1.5", + "mode": "combined", + "A0": 202.0337, + "A_true": 169.726, + "A_hat": 187.72, + "d_true": -0.15991, + "d_hat": -0.07085, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.84 + ], + "channel_true": [ + 1.7199999999999998, + 3.4899999999999998 + ], + "channel_base": [ + 2.3099999999999996, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.59, + 0.0 + ] + }, + { + "case": "C02_ihp130_sW1_sL1", + "mode": "diffusion_only", + "A0": 166.2161, + "A_true": 161.825, + "A_hat": 161.8249, + "d_true": -0.02642, + "d_hat": -0.02642, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.3099999999999996, + 4.08 + ], + "channel_base": [ + 2.3099999999999996, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C02_ihp130_sW1_sL1", + "mode": "gate_only", + "A0": 166.2161, + "A_true": 142.6796, + "A_hat": 158.52, + "d_true": -0.1416, + "d_hat": -0.0463, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.84 + ], + "channel_true": [ + 1.7199999999999998, + 3.4899999999999998 + ], + "channel_base": [ + 2.3099999999999996, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.59, + 0.0 + ] + }, + { + "case": "C02_ihp130_sW1_sL1", + "mode": "combined", + "A0": 166.2161, + "A_true": 138.9004, + "A_hat": 154.44, + "d_true": -0.16434, + "d_hat": -0.07085, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.84 + ], + "channel_true": [ + 1.7199999999999998, + 3.4899999999999998 + ], + "channel_base": [ + 2.3099999999999996, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.59, + 0.0 + ] + }, + { + "case": "C02_sky130_sW1_sL1.5", + "mode": "diffusion_only", + "A0": 155.4289, + "A_true": 150.4309, + "A_hat": 150.4309, + "d_true": -0.03216, + "d_hat": -0.03216, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.49, + 4.32 + ], + "channel_base": [ + 2.49, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C02_sky130_sW1_sL1.5", + "mode": "gate_only", + "A0": 155.4289, + "A_true": 134.0862, + "A_hat": 150.3352, + "d_true": -0.13731, + "d_hat": -0.03277, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 3.71 + ], + "channel_base": [ + 2.49, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.61, + 0.0 + ] + }, + { + "case": "C02_sky130_sW1_sL1.5", + "mode": "combined", + "A0": 155.4289, + "A_true": 129.7546, + "A_hat": 145.662, + "d_true": -0.16518, + "d_hat": -0.06284, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 3.71 + ], + "channel_base": [ + 2.49, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.61, + 0.0 + ] + }, + { + "case": "C02_sky130_sW1_sL1", + "mode": "diffusion_only", + "A0": 134.0089, + "A_true": 129.0109, + "A_hat": 129.0109, + "d_true": -0.0373, + "d_hat": -0.0373, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.49, + 4.32 + ], + "channel_base": [ + 2.49, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C02_sky130_sW1_sL1", + "mode": "gate_only", + "A0": 134.0089, + "A_true": 115.5222, + "A_hat": 130.3072, + "d_true": -0.13795, + "d_hat": -0.02762, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 3.71 + ], + "channel_base": [ + 2.49, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.61, + 0.0 + ] + }, + { + "case": "C02_sky130_sW1_sL1", + "mode": "combined", + "A0": 134.0089, + "A_true": 119.9594, + "A_hat": 125.634, + "d_true": -0.10484, + "d_hat": -0.0625, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 4.32 + ], + "channel_base": [ + 2.49, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.61, + 0.0 + ] + }, + { + "case": "C03_gf180_sW1_sL1.5", + "mode": "diffusion_only", + "A0": 1103.0144, + "A_true": 1094.2464, + "A_hat": 1094.2464, + "d_true": -0.00795, + "d_hat": -0.00795, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 3.3, + 4.9 + ], + "channel_base": [ + 3.3, + 4.9 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_gf180_sW1_sL1.5", + "mode": "gate_only", + "A0": 1103.0144, + "A_true": 1103.0144, + "A_hat": 1103.0144, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 3.3, + 4.9 + ], + "channel_base": [ + 3.3, + 4.9 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_gf180_sW1_sL1.5", + "mode": "combined", + "A0": 1103.0144, + "A_true": 1094.2464, + "A_hat": 1094.2464, + "d_true": -0.00795, + "d_hat": -0.00795, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 3.3, + 4.9 + ], + "channel_base": [ + 3.3, + 4.9 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_gf180_sW1_sL1", + "mode": "diffusion_only", + "A0": 808.4096, + "A_true": 799.6416, + "A_hat": 799.6416, + "d_true": -0.01085, + "d_hat": -0.01085, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 3.3, + 4.9 + ], + "channel_base": [ + 3.3, + 4.9 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_gf180_sW1_sL1", + "mode": "gate_only", + "A0": 808.4096, + "A_true": 808.4096, + "A_hat": 808.4096, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 3.3, + 4.9 + ], + "channel_base": [ + 3.3, + 4.9 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_gf180_sW1_sL1", + "mode": "combined", + "A0": 808.4096, + "A_true": 799.6416, + "A_hat": 799.6416, + "d_true": -0.01085, + "d_hat": -0.01085, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 3.3, + 4.9 + ], + "channel_base": [ + 3.3, + 4.9 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_ihp130_sW1_sL1.5", + "mode": "diffusion_only", + "A0": 708.9279, + "A_true": 704.8377, + "A_hat": 704.8377, + "d_true": -0.00577, + "d_hat": -0.00577, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.3099999999999996, + 3.4899999999999998 + ], + "channel_base": [ + 2.3099999999999996, + 3.4899999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_ihp130_sW1_sL1.5", + "mode": "gate_only", + "A0": 708.9279, + "A_true": 708.9279, + "A_hat": 708.9279, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.3099999999999996, + 3.4899999999999998 + ], + "channel_base": [ + 2.3099999999999996, + 3.4899999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_ihp130_sW1_sL1.5", + "mode": "combined", + "A0": 708.9279, + "A_true": 704.8377, + "A_hat": 704.8377, + "d_true": -0.00577, + "d_hat": -0.00577, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.3099999999999996, + 3.4899999999999998 + ], + "channel_base": [ + 2.3099999999999996, + 3.4899999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_ihp130_sW1_sL1", + "mode": "diffusion_only", + "A0": 508.7487, + "A_true": 504.6585, + "A_hat": 504.6585, + "d_true": -0.00804, + "d_hat": -0.00804, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.3099999999999996, + 3.4899999999999998 + ], + "channel_base": [ + 2.3099999999999996, + 3.4899999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_ihp130_sW1_sL1", + "mode": "gate_only", + "A0": 508.7487, + "A_true": 508.7487, + "A_hat": 508.7487, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.3099999999999996, + 3.4899999999999998 + ], + "channel_base": [ + 2.3099999999999996, + 3.4899999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_ihp130_sW1_sL1", + "mode": "combined", + "A0": 508.7487, + "A_true": 504.6585, + "A_hat": 504.6585, + "d_true": -0.00804, + "d_hat": -0.00804, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.3099999999999996, + 3.4899999999999998 + ], + "channel_base": [ + 2.3099999999999996, + 3.4899999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_sky130_sW1_sL1.5", + "mode": "diffusion_only", + "A0": 458.7801, + "A_true": 454.1237, + "A_hat": 454.1237, + "d_true": -0.01015, + "d_hat": -0.01015, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.49, + 3.71 + ], + "channel_base": [ + 2.49, + 3.71 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_sky130_sW1_sL1.5", + "mode": "gate_only", + "A0": 458.7801, + "A_true": 458.7801, + "A_hat": 458.7801, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.49, + 3.71 + ], + "channel_base": [ + 2.49, + 3.71 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_sky130_sW1_sL1.5", + "mode": "combined", + "A0": 458.7801, + "A_true": 454.1237, + "A_hat": 454.1237, + "d_true": -0.01015, + "d_hat": -0.01015, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.49, + 3.71 + ], + "channel_base": [ + 2.49, + 3.71 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_sky130_sW1_sL1", + "mode": "diffusion_only", + "A0": 339.0441, + "A_true": 334.3877, + "A_hat": 334.3877, + "d_true": -0.01373, + "d_hat": -0.01373, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.49, + 3.71 + ], + "channel_base": [ + 2.49, + 3.71 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_sky130_sW1_sL1", + "mode": "gate_only", + "A0": 339.0441, + "A_true": 339.0441, + "A_hat": 339.0441, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.49, + 3.71 + ], + "channel_base": [ + 2.49, + 3.71 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_sky130_sW1_sL1", + "mode": "combined", + "A0": 339.0441, + "A_true": 334.3877, + "A_hat": 334.3877, + "d_true": -0.01373, + "d_hat": -0.01373, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.49, + 3.71 + ], + "channel_base": [ + 2.49, + 3.71 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C05_gf180_sW1_sL1.5", + "mode": "diffusion_only", + "A0": 190.008, + "A_true": 182.52, + "A_hat": 182.52, + "d_true": -0.03941, + "d_hat": -0.03941, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.1000000000000005 + ], + "channel_base": [ + 2.5, + 4.1000000000000005 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C05_gf180_sW1_sL1", + "mode": "diffusion_only", + "A0": 158.5584, + "A_true": 151.0704, + "A_hat": 151.0704, + "d_true": -0.04723, + "d_hat": -0.04723, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.1000000000000005 + ], + "channel_base": [ + 2.5, + 4.1000000000000005 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C05_ihp130_sW1_sL1.5", + "mode": "diffusion_only", + "A0": 80.2332, + "A_true": 76.7448, + "A_hat": 76.7448, + "d_true": -0.04348, + "d_hat": -0.04348, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.7199999999999998, + 2.9 + ], + "channel_base": [ + 1.7199999999999998, + 2.9 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C05_ihp130_sW1_sL1", + "mode": "diffusion_only", + "A0": 69.5628, + "A_true": 66.0744, + "A_hat": 66.0744, + "d_true": -0.05015, + "d_hat": -0.05015, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.7199999999999998, + 2.9 + ], + "channel_base": [ + 1.7199999999999998, + 2.9 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C05_sky130_sW1_sL1.5", + "mode": "diffusion_only", + "A0": 83.0824, + "A_true": 79.1093, + "A_hat": 79.1093, + "d_true": -0.04782, + "d_hat": -0.04782, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 3.1 + ], + "channel_base": [ + 1.88, + 3.1 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C05_sky130_sW1_sL1", + "mode": "diffusion_only", + "A0": 70.3114, + "A_true": 66.3383, + "A_hat": 66.3383, + "d_true": -0.05651, + "d_hat": -0.05651, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 3.1 + ], + "channel_base": [ + 1.88, + 3.1 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C06_gf180_sW1_sL1.5", + "mode": "diffusion_only", + "A0": 479.186, + "A_true": 464.61, + "A_hat": 464.61, + "d_true": -0.03042, + "d_hat": -0.03042, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 6.85, + 1.05 + ], + "channel_true": [ + 2.5, + 5.7, + 2.5 + ], + "channel_base": [ + 2.5, + 5.7, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C06_gf180_sW1_sL1", + "mode": "diffusion_only", + "A0": 397.5604, + "A_true": 382.9844, + "A_hat": 382.9844, + "d_true": -0.03666, + "d_hat": -0.03666, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 5.73, + 1.05 + ], + "channel_true": [ + 2.5, + 5.7, + 2.5 + ], + "channel_base": [ + 2.5, + 5.7, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C06_ihp130_sW1_sL1.5", + "mode": "diffusion_only", + "A0": 204.155, + "A_true": 197.372, + "A_hat": 197.372, + "d_true": -0.03322, + "d_hat": -0.03322, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 4.29, + 0.94 + ], + "channel_true": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C06_ihp130_sW1_sL1", + "mode": "diffusion_only", + "A0": 176.491, + "A_true": 169.708, + "A_hat": 169.708, + "d_true": -0.03843, + "d_hat": -0.03843, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 3.77, + 0.94 + ], + "channel_true": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C06_sky130_sW1_sL1.5", + "mode": "diffusion_only", + "A0": 204.6112, + "A_true": 196.9056, + "A_hat": 196.9056, + "d_true": -0.03766, + "d_hat": -0.03766, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 3.86, + 0.85 + ], + "channel_true": [ + 1.88, + 4.32, + 1.88 + ], + "channel_base": [ + 1.88, + 4.32, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C06_sky130_sW1_sL1", + "mode": "diffusion_only", + "A0": 171.5872, + "A_true": 163.8816, + "A_hat": 163.8816, + "d_true": -0.04491, + "d_hat": -0.04491, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 3.26, + 0.85 + ], + "channel_true": [ + 1.88, + 4.32, + 1.88 + ], + "channel_base": [ + 1.88, + 4.32, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C07_gf180_sW1_sL1.5", + "mode": "diffusion_only", + "A0": 458.146, + "A_true": 444.21, + "A_hat": 444.21, + "d_true": -0.03042, + "d_hat": -0.03042, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.25, + 1.05 + ], + "channel_true": [ + 2.5, + 4.9, + 2.5 + ], + "channel_base": [ + 2.5, + 4.9, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C07_gf180_sW1_sL1.5", + "mode": "gate_only", + "A0": 458.146, + "A_true": 437.106, + "A_hat": 437.106, + "d_true": -0.04592, + "d_hat": -0.04592, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.25, + 1.05 + ], + "channel_true": [ + 2.5, + 4.9, + 2.5 + ], + "channel_base": [ + 2.5, + 4.9, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C07_gf180_sW1_sL1.5", + "mode": "combined", + "A0": 458.146, + "A_true": 433.782, + "A_hat": 430.458, + "d_true": -0.05318, + "d_hat": -0.06043, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05, + 1.65 + ], + "channel_true": [ + 2.5, + 4.9, + 2.5 + ], + "channel_base": [ + 2.5, + 4.9, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C07_gf180_sW1_sL1", + "mode": "diffusion_only", + "A0": 380.1044, + "A_true": 366.1684, + "A_hat": 366.1684, + "d_true": -0.03666, + "d_hat": -0.03666, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.25, + 1.05 + ], + "channel_true": [ + 2.5, + 4.9, + 2.5 + ], + "channel_base": [ + 2.5, + 4.9, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C07_gf180_sW1_sL1", + "mode": "gate_only", + "A0": 380.1044, + "A_true": 362.6484, + "A_hat": 362.6484, + "d_true": -0.04592, + "d_hat": -0.04592, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.25, + 1.05 + ], + "channel_true": [ + 2.5, + 4.9, + 2.5 + ], + "channel_base": [ + 2.5, + 4.9, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C07_gf180_sW1_sL1", + "mode": "combined", + "A0": 380.1044, + "A_true": 359.3244, + "A_hat": 356.0004, + "d_true": -0.05467, + "d_hat": -0.06341, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05, + 1.65 + ], + "channel_true": [ + 2.5, + 4.9, + 2.5 + ], + "channel_base": [ + 2.5, + 4.9, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C07_ihp130_sW1_sL1.5", + "mode": "diffusion_only", + "A0": 195.0985, + "A_true": 188.6164, + "A_hat": 188.6164, + "d_true": -0.03322, + "d_hat": -0.03322, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.21, + 0.94 + ], + "channel_true": [ + 1.7199999999999998, + 3.4899999999999998, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 3.4899999999999998, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C07_ihp130_sW1_sL1.5", + "mode": "gate_only", + "A0": 195.0985, + "A_true": 187.27, + "A_hat": 187.27, + "d_true": -0.04013, + "d_hat": -0.04013, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.21, + 0.94 + ], + "channel_true": [ + 1.7199999999999998, + 3.4899999999999998, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 3.4899999999999998, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C07_ihp130_sW1_sL1.5", + "mode": "combined", + "A0": 195.0985, + "A_true": 198.1811, + "A_hat": 181.048, + "d_true": 0.0158, + "d_hat": -0.07202, + "sign_true": 1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.955, + 1.61 + ], + "channel_true": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 3.4899999999999998, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ], + "row_shift_change_um": 0.67, + "error_type": "routing channel height mis-predicted + row x-shift changed", + "channel_change": [ + 0.0, + 0.59, + 0.0 + ] + }, + { + "case": "C07_ihp130_sW1_sL1", + "mode": "diffusion_only", + "A0": 168.6617, + "A_true": 169.708, + "A_hat": 162.1796, + "d_true": 0.0062, + "d_hat": -0.03843, + "sign_true": 1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.21, + 0.94 + ], + "channel_true": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 3.4899999999999998, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ], + "row_shift_change_um": 0.0, + "error_type": "routing channel height mis-predicted", + "channel_change": [ + 0.0, + 0.59, + 0.0 + ] + }, + { + "case": "C07_ihp130_sW1_sL1", + "mode": "gate_only", + "A0": 168.6617, + "A_true": 161.894, + "A_hat": 161.894, + "d_true": -0.04013, + "d_hat": -0.04013, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.21, + 0.94 + ], + "channel_true": [ + 1.7199999999999998, + 3.4899999999999998, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 3.4899999999999998, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C07_ihp130_sW1_sL1", + "mode": "combined", + "A0": 168.6617, + "A_true": 199.1423, + "A_hat": 155.672, + "d_true": 0.18072, + "d_hat": -0.07702, + "sign_true": 1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.955, + 0.94 + ], + "channel_true": [ + 1.7199999999999998, + 5.26, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 3.4899999999999998, + 1.7199999999999998 + ], + "strategy": "split", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ], + "row_shift_change_um": 0.255, + "error_type": "routing channel height mis-predicted", + "channel_change": [ + 0.0, + 1.77, + 0.0 + ] + }, + { + "case": "C07_sky130_sW1_sL1.5", + "mode": "diffusion_only", + "A0": 195.5405, + "A_true": 188.1765, + "A_hat": 188.1765, + "d_true": -0.03766, + "d_hat": -0.03766, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.9, + 0.85 + ], + "channel_true": [ + 1.88, + 3.71, + 1.88 + ], + "channel_base": [ + 1.88, + 3.71, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C07_sky130_sW1_sL1.5", + "mode": "gate_only", + "A0": 195.5405, + "A_true": 187.5107, + "A_hat": 187.5107, + "d_true": -0.04106, + "d_hat": -0.04106, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.9, + 0.85 + ], + "channel_true": [ + 1.88, + 3.71, + 1.88 + ], + "channel_base": [ + 1.88, + 3.71, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C07_sky130_sW1_sL1.5", + "mode": "combined", + "A0": 195.5405, + "A_true": 186.2497, + "A_hat": 186.2497, + "d_true": -0.04751, + "d_hat": -0.04751, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85, + 1.36 + ], + "channel_true": [ + 1.88, + 3.71, + 1.88 + ], + "channel_base": [ + 1.88, + 3.71, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C07_sky130_sW1_sL1", + "mode": "diffusion_only", + "A0": 163.9805, + "A_true": 163.8816, + "A_hat": 156.6165, + "d_true": -0.0006, + "d_hat": -0.04491, + "sign_true": 0, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.9, + 0.85 + ], + "channel_true": [ + 1.88, + 4.32, + 1.88 + ], + "channel_base": [ + 1.88, + 3.71, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ], + "row_shift_change_um": 0.0, + "error_type": "routing channel height mis-predicted", + "channel_change": [ + 0.0, + 0.61, + 0.0 + ] + }, + { + "case": "C07_sky130_sW1_sL1", + "mode": "gate_only", + "A0": 163.9805, + "A_true": 157.2467, + "A_hat": 157.2467, + "d_true": -0.04106, + "d_hat": -0.04106, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.9, + 0.85 + ], + "channel_true": [ + 1.88, + 3.71, + 1.88 + ], + "channel_base": [ + 1.88, + 3.71, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C07_sky130_sW1_sL1", + "mode": "combined", + "A0": 163.9805, + "A_true": 163.5314, + "A_hat": 155.9857, + "d_true": -0.00274, + "d_hat": -0.04875, + "sign_true": 0, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85, + 1.36 + ], + "channel_true": [ + 1.88, + 4.32, + 1.88 + ], + "channel_base": [ + 1.88, + 3.71, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ], + "row_shift_change_um": 0.51, + "error_type": "routing channel height mis-predicted + row x-shift changed", + "channel_change": [ + 0.0, + 0.61, + 0.0 + ] + }, + { + "case": "C08_gf180_sW1_sL1.5", + "mode": "diffusion_only", + "A0": 717.1392, + "A_true": 702.5632, + "A_hat": 702.5632, + "d_true": -0.02033, + "d_hat": -0.02033, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05, + 12.67 + ], + "channel_true": [ + 2.5, + 5.7, + 2.5 + ], + "channel_base": [ + 2.5, + 5.7, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_gf180_sW1_sL1.5", + "mode": "gate_only", + "A0": 717.1392, + "A_true": 685.6512, + "A_hat": 685.6512, + "d_true": -0.04391, + "d_hat": -0.04391, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05, + 12.67 + ], + "channel_true": [ + 2.5, + 5.7, + 2.5 + ], + "channel_base": [ + 2.5, + 5.7, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_gf180_sW1_sL1.5", + "mode": "combined", + "A0": 717.1392, + "A_true": 685.6512, + "A_hat": 685.6512, + "d_true": -0.04391, + "d_hat": -0.04391, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05, + 12.85 + ], + "channel_true": [ + 2.5, + 5.7, + 2.5 + ], + "channel_base": [ + 2.5, + 5.7, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_gf180_sW1_sL1", + "mode": "diffusion_only", + "A0": 594.7008, + "A_true": 580.1248, + "A_hat": 580.1248, + "d_true": -0.02451, + "d_hat": -0.02451, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05, + 10.43 + ], + "channel_true": [ + 2.5, + 5.7, + 2.5 + ], + "channel_base": [ + 2.5, + 5.7, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_gf180_sW1_sL1", + "mode": "gate_only", + "A0": 594.7008, + "A_true": 568.5888, + "A_hat": 568.5888, + "d_true": -0.04391, + "d_hat": -0.04391, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05, + 10.43 + ], + "channel_true": [ + 2.5, + 5.7, + 2.5 + ], + "channel_base": [ + 2.5, + 5.7, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_gf180_sW1_sL1", + "mode": "combined", + "A0": 594.7008, + "A_true": 568.5888, + "A_hat": 568.5888, + "d_true": -0.04391, + "d_hat": -0.04391, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05, + 10.61 + ], + "channel_true": [ + 2.5, + 5.7, + 2.5 + ], + "channel_base": [ + 2.5, + 5.7, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_ihp130_sW1_sL1.5", + "mode": "diffusion_only", + "A0": 359.8315, + "A_true": 353.0485, + "A_hat": 353.0485, + "d_true": -0.01885, + "d_hat": -0.01885, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85, + 8.715 + ], + "channel_true": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_ihp130_sW1_sL1.5", + "mode": "gate_only", + "A0": 359.8315, + "A_true": 346.0335, + "A_hat": 346.0335, + "d_true": -0.03835, + "d_hat": -0.03835, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85, + 8.715 + ], + "channel_true": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_ihp130_sW1_sL1.5", + "mode": "combined", + "A0": 359.8315, + "A_true": 346.0335, + "A_hat": 346.0335, + "d_true": -0.03835, + "d_hat": -0.03835, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85, + 8.81 + ], + "channel_true": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_ihp130_sW1_sL1", + "mode": "diffusion_only", + "A0": 297.5875, + "A_true": 290.8045, + "A_hat": 290.8045, + "d_true": -0.02279, + "d_hat": -0.02279, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85, + 7.155 + ], + "channel_true": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_ihp130_sW1_sL1", + "mode": "gate_only", + "A0": 297.5875, + "A_true": 286.1763, + "A_hat": 286.1763, + "d_true": -0.03835, + "d_hat": -0.03835, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85, + 7.155 + ], + "channel_true": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_ihp130_sW1_sL1", + "mode": "combined", + "A0": 297.5875, + "A_true": 286.1763, + "A_hat": 286.1763, + "d_true": -0.03835, + "d_hat": -0.03835, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85, + 7.25 + ], + "channel_true": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_sky130_sW1_sL1.5", + "mode": "diffusion_only", + "A0": 305.5408, + "A_true": 297.8352, + "A_hat": 297.8352, + "d_true": -0.02522, + "d_hat": -0.02522, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85, + 7.04 + ], + "channel_true": [ + 1.88, + 4.32, + 1.88 + ], + "channel_base": [ + 1.88, + 4.32, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_sky130_sW1_sL1.5", + "mode": "gate_only", + "A0": 305.5408, + "A_true": 293.5501, + "A_hat": 293.5501, + "d_true": -0.03924, + "d_hat": -0.03924, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85, + 7.04 + ], + "channel_true": [ + 1.88, + 4.32, + 1.88 + ], + "channel_base": [ + 1.88, + 4.32, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_sky130_sW1_sL1.5", + "mode": "combined", + "A0": 305.5408, + "A_true": 293.5501, + "A_hat": 293.5501, + "d_true": -0.03924, + "d_hat": -0.03924, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85, + 7.28 + ], + "channel_true": [ + 1.88, + 4.32, + 1.88 + ], + "channel_base": [ + 1.88, + 4.32, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_sky130_sW1_sL1", + "mode": "diffusion_only", + "A0": 256.0048, + "A_true": 248.2992, + "A_hat": 248.2992, + "d_true": -0.0301, + "d_hat": -0.0301, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85, + 5.84 + ], + "channel_true": [ + 1.88, + 4.32, + 1.88 + ], + "channel_base": [ + 1.88, + 4.32, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_sky130_sW1_sL1", + "mode": "gate_only", + "A0": 256.0048, + "A_true": 245.9581, + "A_hat": 245.9581, + "d_true": -0.03924, + "d_hat": -0.03924, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85, + 5.84 + ], + "channel_true": [ + 1.88, + 4.32, + 1.88 + ], + "channel_base": [ + 1.88, + 4.32, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_sky130_sW1_sL1", + "mode": "combined", + "A0": 256.0048, + "A_true": 245.9581, + "A_hat": 245.9581, + "d_true": -0.03924, + "d_hat": -0.03924, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85, + 6.08 + ], + "channel_true": [ + 1.88, + 4.32, + 1.88 + ], + "channel_base": [ + 1.88, + 4.32, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C09_gf180_sW1_sL1.5", + "mode": "diffusion_only", + "A0": 1167.8832, + "A_true": 1150.1072, + "A_hat": 1150.1072, + "d_true": -0.01522, + "d_hat": -0.01522, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.25, + 1.05 + ], + "channel_true": [ + 2.5, + 8.9, + 3.3 + ], + "channel_base": [ + 2.5, + 8.9, + 3.3 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C09_gf180_sW1_sL1.5", + "mode": "gate_only", + "A0": 1167.8832, + "A_true": 1167.8832, + "A_hat": 1167.8832, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 1.25, + 1.05 + ], + "channel_true": [ + 2.5, + 8.9, + 3.3 + ], + "channel_base": [ + 2.5, + 8.9, + 3.3 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C09_gf180_sW1_sL1.5", + "mode": "combined", + "A0": 1167.8832, + "A_true": 1150.1072, + "A_hat": 1150.1072, + "d_true": -0.01522, + "d_hat": -0.01522, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.25, + 1.05 + ], + "channel_true": [ + 2.5, + 8.9, + 3.3 + ], + "channel_base": [ + 2.5, + 8.9, + 3.3 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C09_gf180_sW1_sL1", + "mode": "diffusion_only", + "A0": 968.792, + "A_true": 951.016, + "A_hat": 951.016, + "d_true": -0.01835, + "d_hat": -0.01835, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.25, + 1.05 + ], + "channel_true": [ + 2.5, + 8.9, + 3.3 + ], + "channel_base": [ + 2.5, + 8.9, + 3.3 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C09_gf180_sW1_sL1", + "mode": "gate_only", + "A0": 968.792, + "A_true": 968.792, + "A_hat": 968.792, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 1.25, + 1.05 + ], + "channel_true": [ + 2.5, + 8.9, + 3.3 + ], + "channel_base": [ + 2.5, + 8.9, + 3.3 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C09_gf180_sW1_sL1", + "mode": "combined", + "A0": 968.792, + "A_true": 951.016, + "A_hat": 951.016, + "d_true": -0.01835, + "d_hat": -0.01835, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.25, + 1.05 + ], + "channel_true": [ + 2.5, + 8.9, + 3.3 + ], + "channel_base": [ + 2.5, + 8.9, + 3.3 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C09_ihp130_sW1_sL1.5", + "mode": "diffusion_only", + "A0": 1691.7062, + "A_true": 1683.4188, + "A_hat": 1683.4188, + "d_true": -0.0049, + "d_hat": -0.0049, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 25.85, + 0.94 + ], + "channel_true": [ + 1.7199999999999998, + 6.4399999999999995, + 2.3099999999999996 + ], + "channel_base": [ + 1.7199999999999998, + 6.4399999999999995, + 2.3099999999999996 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C09_ihp130_sW1_sL1.5", + "mode": "gate_only", + "A0": 1691.7062, + "A_true": 1691.7062, + "A_hat": 1691.7062, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 25.85, + 0.94 + ], + "channel_true": [ + 1.7199999999999998, + 6.4399999999999995, + 2.3099999999999996 + ], + "channel_base": [ + 1.7199999999999998, + 6.4399999999999995, + 2.3099999999999996 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C09_ihp130_sW1_sL1.5", + "mode": "combined", + "A0": 1691.7062, + "A_true": 1683.4188, + "A_hat": 1683.4188, + "d_true": -0.0049, + "d_hat": -0.0049, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 25.85, + 0.94 + ], + "channel_true": [ + 1.7199999999999998, + 6.4399999999999995, + 2.3099999999999996 + ], + "channel_base": [ + 1.7199999999999998, + 6.4399999999999995, + 2.3099999999999996 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C09_ihp130_sW1_sL1", + "mode": "diffusion_only", + "A0": 1421.3063, + "A_true": 1413.0187, + "A_hat": 1413.0187, + "d_true": -0.00583, + "d_hat": -0.00583, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 21.69, + 0.94 + ], + "channel_true": [ + 1.7199999999999998, + 6.4399999999999995, + 2.3099999999999996 + ], + "channel_base": [ + 1.7199999999999998, + 6.4399999999999995, + 2.3099999999999996 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C09_ihp130_sW1_sL1", + "mode": "gate_only", + "A0": 1421.3063, + "A_true": 1421.3063, + "A_hat": 1421.3063, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 21.69, + 0.94 + ], + "channel_true": [ + 1.7199999999999998, + 6.4399999999999995, + 2.3099999999999996 + ], + "channel_base": [ + 1.7199999999999998, + 6.4399999999999995, + 2.3099999999999996 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C09_ihp130_sW1_sL1", + "mode": "combined", + "A0": 1421.3063, + "A_true": 1413.0187, + "A_hat": 1413.0187, + "d_true": -0.00583, + "d_hat": -0.00583, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 21.69, + 0.94 + ], + "channel_true": [ + 1.7199999999999998, + 6.4399999999999995, + 2.3099999999999996 + ], + "channel_base": [ + 1.7199999999999998, + 6.4399999999999995, + 2.3099999999999996 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C09_sky130_sW1_sL1", + "mode": "diffusion_only", + "A0": 1365.7285, + "A_true": 1356.3148, + "A_hat": 1356.3149, + "d_true": -0.00689, + "d_hat": -0.00689, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 19.78, + 0.85 + ], + "channel_true": [ + 1.88, + 6.76, + 2.49 + ], + "channel_base": [ + 1.88, + 6.76, + 2.49 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C09_sky130_sW1_sL1", + "mode": "gate_only", + "A0": 1365.7285, + "A_true": 1365.7285, + "A_hat": 1365.7285, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 19.78, + 0.85 + ], + "channel_true": [ + 1.88, + 6.76, + 2.49 + ], + "channel_base": [ + 1.88, + 6.76, + 2.49 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C09_sky130_sW1_sL1", + "mode": "combined", + "A0": 1365.7285, + "A_true": 1356.3148, + "A_hat": 1356.3149, + "d_true": -0.00689, + "d_hat": -0.00689, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 19.78, + 0.85 + ], + "channel_true": [ + 1.88, + 6.76, + 2.49 + ], + "channel_base": [ + 1.88, + 6.76, + 2.49 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C10_gf180_sW1_sL1.5", + "mode": "diffusion_only", + "A0": 1551.0364, + "A_true": 1518.0444, + "A_hat": 1518.0444, + "d_true": -0.02127, + "d_hat": -0.02127, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 13.44, + 1.03 + ], + "channel_true": [ + 2.5, + 8.1, + 2.5 + ], + "channel_base": [ + 2.5, + 8.1, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C10_gf180_sW1_sL1.5", + "mode": "gate_only", + "A0": 1551.0364, + "A_true": 1551.0364, + "A_hat": 1551.0364, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 14.84, + 1.03 + ], + "channel_true": [ + 2.5, + 8.1, + 2.5 + ], + "channel_base": [ + 2.5, + 8.1, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C10_gf180_sW1_sL1.5", + "mode": "combined", + "A0": 1551.0364, + "A_true": 1534.5404, + "A_hat": 1534.5404, + "d_true": -0.01064, + "d_hat": -0.01064, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 14.24, + 1.03 + ], + "channel_true": [ + 2.5, + 8.1, + 2.5 + ], + "channel_base": [ + 2.5, + 8.1, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C10_gf180_sW1_sL1", + "mode": "diffusion_only", + "A0": 1273.9036, + "A_true": 1192.7676, + "A_hat": 1240.9116, + "d_true": -0.06369, + "d_hat": -0.0259, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 11.07, + 9.95 + ], + "channel_true": [ + 2.5, + 7.300000000000001, + 2.5 + ], + "channel_base": [ + 2.5, + 8.1, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C10_gf180_sW1_sL1", + "mode": "gate_only", + "A0": 1273.9036, + "A_true": 1273.9036, + "A_hat": 1273.9036, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 20.44, + 1.03 + ], + "channel_true": [ + 2.5, + 8.1, + 2.5 + ], + "channel_base": [ + 2.5, + 8.1, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C10_gf180_sW1_sL1", + "mode": "combined", + "A0": 1273.9036, + "A_true": 1284.0074, + "A_hat": 1257.4076, + "d_true": 0.00793, + "d_hat": -0.01295, + "sign_true": 1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 23.16, + 1.03 + ], + "channel_true": [ + 2.5, + 8.1, + 2.5 + ], + "channel_base": [ + 2.5, + 8.1, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ], + "row_shift_change_um": 2.72, + "error_type": "row x-shift changed (cross-row via conflict, not modelled)", + "channel_change": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C10_ihp130_sW1_sL1", + "mode": "diffusion_only", + "A0": 739.7863, + "A_true": 735.642, + "A_hat": 724.4149, + "d_true": -0.0056, + "d_hat": -0.02078, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 17.805, + 0.79 + ], + "channel_true": [ + 1.7199999999999998, + 5.85, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 5.85, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C10_ihp130_sW1_sL1", + "mode": "gate_only", + "A0": 739.7863, + "A_true": 739.7863, + "A_hat": 739.7863, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 16.39, + 0.79 + ], + "channel_true": [ + 1.7199999999999998, + 5.85, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 5.85, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C10_ihp130_sW1_sL1", + "mode": "combined", + "A0": 739.7863, + "A_true": 703.4384, + "A_hat": 732.1006, + "d_true": -0.04913, + "d_hat": -0.01039, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 9.33, + 7.73 + ], + "channel_true": [ + 1.7199999999999998, + 5.26, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 5.85, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C10_sky130_sW1_sL1.5", + "mode": "diffusion_only", + "A0": 981.5464, + "A_true": 964.0856, + "A_hat": 964.0856, + "d_true": -0.01779, + "d_hat": -0.01779, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 10.985, + 0.85 + ], + "channel_true": [ + 1.88, + 6.15, + 1.88 + ], + "channel_base": [ + 1.88, + 6.15, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C10_sky130_sW1_sL1.5", + "mode": "gate_only", + "A0": 981.5464, + "A_true": 981.5464, + "A_hat": 981.5464, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 11.94, + 0.815 + ], + "channel_true": [ + 1.88, + 6.15, + 1.88 + ], + "channel_base": [ + 1.88, + 6.15, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C10_sky130_sW1_sL1.5", + "mode": "combined", + "A0": 981.5464, + "A_true": 972.816, + "A_hat": 972.816, + "d_true": -0.00889, + "d_hat": -0.00889, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 11.37, + 0.815 + ], + "channel_true": [ + 1.88, + 6.15, + 1.88 + ], + "channel_base": [ + 1.88, + 6.15, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C10_sky130_sW1_sL1", + "mode": "diffusion_only", + "A0": 757.0504, + "A_true": 739.5896, + "A_hat": 739.5896, + "d_true": -0.02306, + "d_hat": -0.02306, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 8.65, + 0.815 + ], + "channel_true": [ + 1.88, + 6.15, + 1.88 + ], + "channel_base": [ + 1.88, + 6.15, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C10_sky130_sW1_sL1", + "mode": "gate_only", + "A0": 757.0504, + "A_true": 757.0504, + "A_hat": 757.0504, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 9.54, + 0.815 + ], + "channel_true": [ + 1.88, + 6.15, + 1.88 + ], + "channel_base": [ + 1.88, + 6.15, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C10_sky130_sW1_sL1", + "mode": "combined", + "A0": 757.0504, + "A_true": 748.32, + "A_hat": 748.32, + "d_true": -0.01153, + "d_hat": -0.01153, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 9.21, + 0.815 + ], + "channel_true": [ + 1.88, + 6.15, + 1.88 + ], + "channel_base": [ + 1.88, + 6.15, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C11_gf180_sW1_sL1.5", + "mode": "diffusion_only", + "A0": 2927.1676, + "A_true": 2849.8316, + "A_hat": 2849.8316, + "d_true": -0.02642, + "d_hat": -0.02642, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 16.05, + 1.74, + 9.235 + ], + "channel_true": [ + 3.3, + 7.300000000000001, + 4.9, + 0.0 + ], + "channel_base": [ + 3.3, + 7.300000000000001, + 4.9, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C11_gf180_sW1_sL1.5", + "mode": "gate_only", + "A0": 2927.1676, + "A_true": 2928.5417, + "A_hat": 3018.4375, + "d_true": 0.00047, + "d_hat": 0.03118, + "sign_true": 0, + "sign_hat": 1, + "passive_dominated": false, + "row_shift_true": [ + 16.59, + 1.74, + 10.575 + ], + "channel_true": [ + 3.3, + 7.300000000000001, + 4.1000000000000005, + 0.0 + ], + "channel_base": [ + 3.3, + 7.300000000000001, + 4.9, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 1.6, + -1.6, + 0.0 + ], + "row_shift_change_um": 0.54, + "error_type": "routing channel height mis-predicted + row x-shift changed", + "channel_change": [ + 0.0, + 0.0, + -0.8, + 0.0 + ] + }, + { + "case": "C11_gf180_sW1_sL1.5", + "mode": "combined", + "A0": 2927.1676, + "A_true": 2852.5497, + "A_hat": 2941.1655, + "d_true": -0.02549, + "d_hat": 0.00478, + "sign_true": -1, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 16.59, + 1.74, + 9.775 + ], + "channel_true": [ + 3.3, + 7.300000000000001, + 4.1000000000000005, + 0.0 + ], + "channel_base": [ + 3.3, + 7.300000000000001, + 4.9, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 1.6, + -1.6, + 0.0 + ], + "row_shift_change_um": 0.54, + "error_type": "routing channel height mis-predicted + row x-shift changed", + "channel_change": [ + 0.0, + 0.0, + -0.8, + 0.0 + ] + }, + { + "case": "C11_gf180_sW1_sL1", + "mode": "diffusion_only", + "A0": 2439.9508, + "A_true": 2362.6148, + "A_hat": 2362.6148, + "d_true": -0.0317, + "d_hat": -0.0317, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 13.25, + 1.74, + 4.195 + ], + "channel_true": [ + 3.3, + 7.300000000000001, + 4.9, + 0.0 + ], + "channel_base": [ + 3.3, + 7.300000000000001, + 4.9, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C11_gf180_sW1_sL1", + "mode": "gate_only", + "A0": 2439.9508, + "A_true": 2449.7921, + "A_hat": 2531.6239, + "d_true": 0.00403, + "d_hat": 0.03757, + "sign_true": 0, + "sign_hat": 1, + "passive_dominated": false, + "row_shift_true": [ + 13.79, + 1.74, + 5.535 + ], + "channel_true": [ + 3.3, + 7.300000000000001, + 4.1000000000000005, + 0.0 + ], + "channel_base": [ + 3.3, + 7.300000000000001, + 4.9, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 1.6, + -1.6, + 0.0 + ], + "row_shift_change_um": 0.54, + "error_type": "routing channel height mis-predicted + row x-shift changed", + "channel_change": [ + 0.0, + 0.0, + -0.8, + 0.0 + ] + }, + { + "case": "C11_gf180_sW1_sL1", + "mode": "combined", + "A0": 2439.9508, + "A_true": 2373.8001, + "A_hat": 2454.3519, + "d_true": -0.02711, + "d_hat": 0.0059, + "sign_true": -1, + "sign_hat": 1, + "passive_dominated": false, + "row_shift_true": [ + 13.79, + 1.74, + 4.735 + ], + "channel_true": [ + 3.3, + 7.300000000000001, + 4.1000000000000005, + 0.0 + ], + "channel_base": [ + 3.3, + 7.300000000000001, + 4.9, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 1.6, + -1.6, + 0.0 + ], + "row_shift_change_um": 0.54, + "error_type": "routing channel height mis-predicted + row x-shift changed", + "channel_change": [ + 0.0, + 0.0, + -0.8, + 0.0 + ] + }, + { + "case": "C11_ihp130_sW1_sL1.5", + "mode": "diffusion_only", + "A0": 2092.7973, + "A_true": 2092.7973, + "A_hat": 2092.7973, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": true, + "row_shift_true": [ + 15.605, + 7.625, + 0.0 + ], + "channel_true": [ + 2.3099999999999996, + 5.26, + 3.4899999999999998, + 0.0 + ], + "channel_base": [ + 2.3099999999999996, + 5.26, + 3.4899999999999998, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C11_ihp130_sW1_sL1.5", + "mode": "gate_only", + "A0": 2092.7973, + "A_true": 2064.5756, + "A_hat": 2091.872, + "d_true": -0.01349, + "d_hat": -0.00044, + "sign_true": -1, + "sign_hat": 0, + "passive_dominated": true, + "row_shift_true": [ + 15.095, + 6.875, + 0.0 + ], + "channel_true": [ + 2.3099999999999996, + 5.26, + 2.9, + 0.0 + ], + "channel_base": [ + 2.3099999999999996, + 5.26, + 3.4899999999999998, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 1.18, + -1.18, + 0.0 + ], + "row_shift_change_um": 0.24, + "error_type": "routing channel height mis-predicted", + "channel_change": [ + 0.0, + 0.0, + -0.59, + 0.0 + ] + }, + { + "case": "C11_ihp130_sW1_sL1.5", + "mode": "combined", + "A0": 2092.7973, + "A_true": 2064.5756, + "A_hat": 2091.872, + "d_true": -0.01349, + "d_hat": -0.00044, + "sign_true": -1, + "sign_hat": 0, + "passive_dominated": true, + "row_shift_true": [ + 15.605, + 7.385, + 0.0 + ], + "channel_true": [ + 2.3099999999999996, + 5.26, + 2.9, + 0.0 + ], + "channel_base": [ + 2.3099999999999996, + 5.26, + 3.4899999999999998, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 1.18, + -1.18, + 0.0 + ], + "row_shift_change_um": 0.51, + "error_type": "routing channel height mis-predicted + row x-shift changed", + "channel_change": [ + 0.0, + 0.0, + -0.59, + 0.0 + ] + }, + { + "case": "C11_ihp130_sW1_sL1", + "mode": "diffusion_only", + "A0": 2092.7973, + "A_true": 2092.7973, + "A_hat": 2092.7973, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": true, + "row_shift_true": [ + 16.645, + 9.965, + 0.0 + ], + "channel_true": [ + 2.3099999999999996, + 5.26, + 3.4899999999999998, + 0.0 + ], + "channel_base": [ + 2.3099999999999996, + 5.26, + 3.4899999999999998, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C11_ihp130_sW1_sL1", + "mode": "gate_only", + "A0": 2092.7973, + "A_true": 2064.5756, + "A_hat": 2091.872, + "d_true": -0.01349, + "d_hat": -0.00044, + "sign_true": -1, + "sign_hat": 0, + "passive_dominated": true, + "row_shift_true": [ + 16.135, + 9.215, + 0.0 + ], + "channel_true": [ + 2.3099999999999996, + 5.26, + 2.9, + 0.0 + ], + "channel_base": [ + 2.3099999999999996, + 5.26, + 3.4899999999999998, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 1.18, + -1.18, + 0.0 + ], + "row_shift_change_um": 0.24, + "error_type": "routing channel height mis-predicted", + "channel_change": [ + 0.0, + 0.0, + -0.59, + 0.0 + ] + }, + { + "case": "C11_ihp130_sW1_sL1", + "mode": "combined", + "A0": 2092.7973, + "A_true": 2064.5756, + "A_hat": 2091.872, + "d_true": -0.01349, + "d_hat": -0.00044, + "sign_true": -1, + "sign_hat": 0, + "passive_dominated": true, + "row_shift_true": [ + 16.645, + 9.725, + 0.0 + ], + "channel_true": [ + 2.3099999999999996, + 5.26, + 2.9, + 0.0 + ], + "channel_base": [ + 2.3099999999999996, + 5.26, + 3.4899999999999998, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 1.18, + -1.18, + 0.0 + ], + "row_shift_change_um": 0.51, + "error_type": "routing channel height mis-predicted + row x-shift changed", + "channel_change": [ + 0.0, + 0.0, + -0.59, + 0.0 + ] + }, + { + "case": "C11_sky130_sW1_sL1.5", + "mode": "diffusion_only", + "A0": 1449.42, + "A_true": 1446.921, + "A_hat": 1449.42, + "d_true": -0.00172, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": true, + "row_shift_true": [ + 9.8, + 2.22, + 0.01 + ], + "channel_true": [ + 2.49, + 5.539999999999999, + 3.71, + 0.0 + ], + "channel_base": [ + 2.49, + 5.539999999999999, + 3.71, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C11_sky130_sW1_sL1.5", + "mode": "gate_only", + "A0": 1449.42, + "A_true": 1447.5121, + "A_hat": 1469.8452, + "d_true": -0.00132, + "d_hat": 0.01409, + "sign_true": 0, + "sign_hat": 1, + "passive_dominated": false, + "row_shift_true": [ + 9.3, + 1.28, + 0.07 + ], + "channel_true": [ + 2.49, + 5.539999999999999, + 3.1, + 0.0 + ], + "channel_base": [ + 2.49, + 5.539999999999999, + 3.71, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 1.22, + -1.22, + 0.0 + ], + "row_shift_change_um": 0.375, + "error_type": "routing channel height mis-predicted + row x-shift changed", + "channel_change": [ + 0.0, + 0.0, + -0.61, + 0.0 + ] + }, + { + "case": "C11_sky130_sW1_sL1.5", + "mode": "combined", + "A0": 1449.42, + "A_true": 1426.7718, + "A_hat": 1450.464, + "d_true": -0.01563, + "d_hat": 0.00072, + "sign_true": -1, + "sign_hat": 0, + "passive_dominated": true, + "row_shift_true": [ + 9.8, + 1.78, + 0.01 + ], + "channel_true": [ + 2.49, + 5.539999999999999, + 3.1, + 0.0 + ], + "channel_base": [ + 2.49, + 5.539999999999999, + 3.71, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 1.22, + -1.22, + 0.0 + ], + "row_shift_change_um": 0.56, + "error_type": "routing channel height mis-predicted + row x-shift changed", + "channel_change": [ + 0.0, + 0.0, + -0.61, + 0.0 + ] + }, + { + "case": "C11_sky130_sW1_sL1", + "mode": "diffusion_only", + "A0": 1446.921, + "A_true": 1446.921, + "A_hat": 1446.921, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": true, + "row_shift_true": [ + 10.995, + 4.915, + 0.01 + ], + "channel_true": [ + 2.49, + 5.539999999999999, + 3.71, + 0.0 + ], + "channel_base": [ + 2.49, + 5.539999999999999, + 3.71, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C11_sky130_sW1_sL1", + "mode": "gate_only", + "A0": 1446.921, + "A_true": 1426.7718, + "A_hat": 1447.9632, + "d_true": -0.01393, + "d_hat": 0.00072, + "sign_true": -1, + "sign_hat": 0, + "passive_dominated": true, + "row_shift_true": [ + 10.44, + 3.915, + 0.01 + ], + "channel_true": [ + 2.49, + 5.539999999999999, + 3.1, + 0.0 + ], + "channel_base": [ + 2.49, + 5.539999999999999, + 3.71, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 1.22, + -1.22, + 0.0 + ], + "row_shift_change_um": 0.445, + "error_type": "routing channel height mis-predicted + row x-shift changed", + "channel_change": [ + 0.0, + 0.0, + -0.61, + 0.0 + ] + }, + { + "case": "C11_sky130_sW1_sL1", + "mode": "combined", + "A0": 1446.921, + "A_true": 1426.7718, + "A_hat": 1447.9632, + "d_true": -0.01393, + "d_hat": 0.00072, + "sign_true": -1, + "sign_hat": 0, + "passive_dominated": true, + "row_shift_true": [ + 10.995, + 4.475, + 0.01 + ], + "channel_true": [ + 2.49, + 5.539999999999999, + 3.1, + 0.0 + ], + "channel_base": [ + 2.49, + 5.539999999999999, + 3.71, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 1.22, + -1.22, + 0.0 + ], + "row_shift_change_um": 0.555, + "error_type": "routing channel height mis-predicted + row x-shift changed", + "channel_change": [ + 0.0, + 0.0, + -0.61, + 0.0 + ] + }, + { + "case": "C13_gf180_sW1_sL1.5", + "mode": "diffusion_only", + "A0": 375.8496, + "A_true": 366.4416, + "A_hat": 366.4416, + "d_true": -0.02503, + "d_hat": -0.02503, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 3.3, + 5.7 + ], + "channel_base": [ + 3.3, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C13_gf180_sW1_sL1.5", + "mode": "gate_only", + "A0": 375.8496, + "A_true": 323.0304, + "A_hat": 359.5956, + "d_true": -0.14053, + "d_hat": -0.04325, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.9 + ], + "channel_base": [ + 3.3, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.8, + 0.0 + ] + }, + { + "case": "C13_gf180_sW1_sL1.5", + "mode": "combined", + "A0": 375.8496, + "A_true": 314.9344, + "A_hat": 350.8596, + "d_true": -0.16207, + "d_hat": -0.06649, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.9 + ], + "channel_base": [ + 3.3, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.8, + 0.0 + ] + }, + { + "case": "C13_gf180_sW1_sL1", + "mode": "diffusion_only", + "A0": 319.872, + "A_true": 310.464, + "A_hat": 310.464, + "d_true": -0.02941, + "d_hat": -0.02941, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 3.3, + 5.7 + ], + "channel_base": [ + 3.3, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C13_gf180_sW1_sL1", + "mode": "gate_only", + "A0": 319.872, + "A_true": 274.8592, + "A_hat": 307.6164, + "d_true": -0.14072, + "d_hat": -0.03831, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.9 + ], + "channel_base": [ + 3.3, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.8, + 0.0 + ] + }, + { + "case": "C13_gf180_sW1_sL1", + "mode": "combined", + "A0": 319.872, + "A_true": 266.7632, + "A_hat": 298.8804, + "d_true": -0.16603, + "d_hat": -0.06563, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.9 + ], + "channel_base": [ + 3.3, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.8, + 0.0 + ] + }, + { + "case": "C13_ihp130_sW1_sL1.5", + "mode": "diffusion_only", + "A0": 216.4124, + "A_true": 212.0213, + "A_hat": 212.0213, + "d_true": -0.02029, + "d_hat": -0.02029, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.3099999999999996, + 4.08 + ], + "channel_base": [ + 2.3099999999999996, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C13_ihp130_sW1_sL1.5", + "mode": "gate_only", + "A0": 216.4124, + "A_true": 185.8798, + "A_hat": 205.16, + "d_true": -0.14109, + "d_hat": -0.052, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.84 + ], + "channel_true": [ + 1.7199999999999998, + 3.4899999999999998 + ], + "channel_base": [ + 2.3099999999999996, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.59, + 0.0 + ] + }, + { + "case": "C13_ihp130_sW1_sL1.5", + "mode": "combined", + "A0": 216.4124, + "A_true": 182.1008, + "A_hat": 201.08, + "d_true": -0.15855, + "d_hat": -0.07085, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.84 + ], + "channel_true": [ + 1.7199999999999998, + 3.4899999999999998 + ], + "channel_base": [ + 2.3099999999999996, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.59, + 0.0 + ] + }, + { + "case": "C13_ihp130_sW1_sL1", + "mode": "diffusion_only", + "A0": 178.3562, + "A_true": 173.9651, + "A_hat": 173.965, + "d_true": -0.02462, + "d_hat": -0.02462, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.3099999999999996, + 4.08 + ], + "channel_base": [ + 2.3099999999999996, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C13_ihp130_sW1_sL1", + "mode": "gate_only", + "A0": 178.3562, + "A_true": 153.1276, + "A_hat": 169.8, + "d_true": -0.14145, + "d_hat": -0.04797, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.84 + ], + "channel_true": [ + 1.7199999999999998, + 3.4899999999999998 + ], + "channel_base": [ + 2.3099999999999996, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.59, + 0.0 + ] + }, + { + "case": "C13_ihp130_sW1_sL1", + "mode": "combined", + "A0": 178.3562, + "A_true": 149.3485, + "A_hat": 165.72, + "d_true": -0.16264, + "d_hat": -0.07085, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.84 + ], + "channel_true": [ + 1.7199999999999998, + 3.4899999999999998 + ], + "channel_base": [ + 2.3099999999999996, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.59, + 0.0 + ] + }, + { + "case": "C13_sky130_sW1_sL1.5", + "mode": "diffusion_only", + "A0": 167.0314, + "A_true": 162.0334, + "A_hat": 162.0334, + "d_true": -0.02992, + "d_hat": -0.02992, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.49, + 4.32 + ], + "channel_base": [ + 2.49, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C13_sky130_sW1_sL1.5", + "mode": "gate_only", + "A0": 167.0314, + "A_true": 144.1417, + "A_hat": 161.1837, + "d_true": -0.13704, + "d_hat": -0.03501, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 3.71 + ], + "channel_base": [ + 2.49, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.61, + 0.0 + ] + }, + { + "case": "C13_sky130_sW1_sL1.5", + "mode": "combined", + "A0": 167.0314, + "A_true": 139.8101, + "A_hat": 156.5105, + "d_true": -0.16297, + "d_hat": -0.06299, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 3.71 + ], + "channel_base": [ + 2.49, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.61, + 0.0 + ] + }, + { + "case": "C13_sky130_sW1_sL1", + "mode": "diffusion_only", + "A0": 144.2726, + "A_true": 148.7937, + "A_hat": 139.2746, + "d_true": 0.03134, + "d_hat": -0.03464, + "sign_true": 1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.49, + 4.93 + ], + "channel_base": [ + 2.49, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ], + "row_shift_change_um": 0.0, + "error_type": "routing channel height mis-predicted", + "channel_change": [ + 0.0, + 0.61 + ] + }, + { + "case": "C13_sky130_sW1_sL1", + "mode": "gate_only", + "A0": 144.2726, + "A_true": 134.2293, + "A_hat": 139.9039, + "d_true": -0.06961, + "d_hat": -0.03028, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 4.32 + ], + "channel_base": [ + 2.49, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.61, + 0.0 + ] + }, + { + "case": "C13_sky130_sW1_sL1", + "mode": "combined", + "A0": 144.2726, + "A_true": 129.5561, + "A_hat": 135.2307, + "d_true": -0.102, + "d_hat": -0.06267, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 4.32 + ], + "channel_base": [ + 2.49, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.61, + 0.0 + ] + }, + { + "case": "C14_gf180_sW1_sL1.5", + "mode": "diffusion_only", + "A0": 496.3712, + "A_true": 476.2752, + "A_hat": 476.2752, + "d_true": -0.04049, + "d_hat": -0.04049, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 4.1000000000000005, + 5.7 + ], + "channel_base": [ + 4.1000000000000005, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_gf180_sW1_sL1.5", + "mode": "gate_only", + "A0": 496.3712, + "A_true": 496.3712, + "A_hat": 496.3712, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 4.1000000000000005, + 5.7 + ], + "channel_base": [ + 4.1000000000000005, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_gf180_sW1_sL1.5", + "mode": "combined", + "A0": 496.3712, + "A_true": 476.2752, + "A_hat": 476.2752, + "d_true": -0.04049, + "d_hat": -0.04049, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 4.1000000000000005, + 5.7 + ], + "channel_base": [ + 4.1000000000000005, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_gf180_sW1_sL1", + "mode": "diffusion_only", + "A0": 397.9008, + "A_true": 377.8048, + "A_hat": 377.8048, + "d_true": -0.05051, + "d_hat": -0.05051, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 4.1000000000000005, + 5.7 + ], + "channel_base": [ + 4.1000000000000005, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_gf180_sW1_sL1", + "mode": "gate_only", + "A0": 397.9008, + "A_true": 397.9008, + "A_hat": 397.9008, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 4.1000000000000005, + 5.7 + ], + "channel_base": [ + 4.1000000000000005, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_gf180_sW1_sL1", + "mode": "combined", + "A0": 397.9008, + "A_true": 377.8048, + "A_hat": 377.8048, + "d_true": -0.05051, + "d_hat": -0.05051, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 4.1000000000000005, + 5.7 + ], + "channel_base": [ + 4.1000000000000005, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_ihp130_sW1_sL1.5", + "mode": "diffusion_only", + "A0": 299.598, + "A_true": 290.214, + "A_hat": 290.214, + "d_true": -0.03132, + "d_hat": -0.03132, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.9, + 4.08 + ], + "channel_base": [ + 2.9, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_ihp130_sW1_sL1.5", + "mode": "gate_only", + "A0": 299.598, + "A_true": 299.598, + "A_hat": 299.598, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.9, + 4.08 + ], + "channel_base": [ + 2.9, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_ihp130_sW1_sL1.5", + "mode": "combined", + "A0": 299.598, + "A_true": 290.214, + "A_hat": 290.214, + "d_true": -0.03132, + "d_hat": -0.03132, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.9, + 4.08 + ], + "channel_base": [ + 2.9, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_ihp130_sW1_sL1", + "mode": "diffusion_only", + "A0": 232.622, + "A_true": 223.238, + "A_hat": 223.238, + "d_true": -0.04034, + "d_hat": -0.04034, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.9, + 4.08 + ], + "channel_base": [ + 2.9, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_ihp130_sW1_sL1", + "mode": "gate_only", + "A0": 232.622, + "A_true": 232.622, + "A_hat": 232.622, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.9, + 4.08 + ], + "channel_base": [ + 2.9, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_ihp130_sW1_sL1", + "mode": "combined", + "A0": 232.622, + "A_true": 223.238, + "A_hat": 223.238, + "d_true": -0.04034, + "d_hat": -0.04034, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.9, + 4.08 + ], + "channel_base": [ + 2.9, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_sky130_sW1_sL1.5", + "mode": "diffusion_only", + "A0": 217.4457, + "A_true": 206.7665, + "A_hat": 206.7665, + "d_true": -0.04911, + "d_hat": -0.04911, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 3.1, + 4.32 + ], + "channel_base": [ + 3.1, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_sky130_sW1_sL1.5", + "mode": "gate_only", + "A0": 217.4457, + "A_true": 217.4457, + "A_hat": 217.4457, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 3.1, + 4.32 + ], + "channel_base": [ + 3.1, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_sky130_sW1_sL1.5", + "mode": "combined", + "A0": 217.4457, + "A_true": 206.7665, + "A_hat": 206.7665, + "d_true": -0.04911, + "d_hat": -0.04911, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 3.1, + 4.32 + ], + "channel_base": [ + 3.1, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_sky130_sW1_sL1", + "mode": "diffusion_only", + "A0": 177.3987, + "A_true": 166.7195, + "A_hat": 166.7195, + "d_true": -0.0602, + "d_hat": -0.0602, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 3.1, + 4.32 + ], + "channel_base": [ + 3.1, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_sky130_sW1_sL1", + "mode": "gate_only", + "A0": 177.3987, + "A_true": 177.3987, + "A_hat": 177.3987, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 3.1, + 4.32 + ], + "channel_base": [ + 3.1, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_sky130_sW1_sL1", + "mode": "combined", + "A0": 177.3987, + "A_true": 166.7195, + "A_hat": 166.7195, + "d_true": -0.0602, + "d_hat": -0.0602, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 3.1, + 4.32 + ], + "channel_base": [ + 3.1, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C16_gf180_sW1_sL1.5", + "mode": "diffusion_only", + "A0": 1729.3648, + "A_true": 1729.3648, + "A_hat": 1729.3648, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": true, + "row_shift_true": [ + 50.35, + 0.02 + ], + "channel_true": [ + 2.5, + 5.7, + 0.0 + ], + "channel_base": [ + 2.5, + 5.7, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C16_gf180_sW1_sL1", + "mode": "diffusion_only", + "A0": 1729.3648, + "A_true": 1729.3648, + "A_hat": 1729.3648, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": true, + "row_shift_true": [ + 52.57, + 0.18 + ], + "channel_true": [ + 2.5, + 5.7, + 0.0 + ], + "channel_base": [ + 2.5, + 5.7, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C16_ihp130_sW1_sL1.5", + "mode": "diffusion_only", + "A0": 1007.736, + "A_true": 1007.736, + "A_hat": 1007.736, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": true, + "row_shift_true": [ + 41.41, + 0.13 + ], + "channel_true": [ + 1.7199999999999998, + 4.08, + 0.0 + ], + "channel_base": [ + 1.7199999999999998, + 4.08, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C16_ihp130_sW1_sL1", + "mode": "diffusion_only", + "A0": 1007.736, + "A_true": 1007.736, + "A_hat": 1007.736, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": true, + "row_shift_true": [ + 42.45, + 0.26 + ], + "channel_true": [ + 1.7199999999999998, + 4.08, + 0.0 + ], + "channel_base": [ + 1.7199999999999998, + 4.08, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C16_sky130_sW1_sL1.5", + "mode": "diffusion_only", + "A0": 377.2788, + "A_true": 377.2788, + "A_hat": 377.2788, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": true, + "row_shift_true": [ + 12.29, + 0.05 + ], + "channel_true": [ + 1.88, + 4.32, + 0.0 + ], + "channel_base": [ + 1.88, + 4.32, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C16_sky130_sW1_sL1", + "mode": "diffusion_only", + "A0": 377.2788, + "A_true": 377.2788, + "A_hat": 377.2788, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": true, + "row_shift_true": [ + 13.49, + 0.2 + ], + "channel_true": [ + 1.88, + 4.32, + 0.0 + ], + "channel_base": [ + 1.88, + 4.32, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + } + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/results/analysis/cost_validation_dev_no_channel.json b/benchmarks/textbook_sharing/results/analysis/cost_validation_dev_no_channel.json new file mode 100644 index 00000000..5627c123 --- /dev/null +++ b/benchmarks/textbook_sharing/results/analysis/cost_validation_dev_no_channel.json @@ -0,0 +1,5467 @@ +{ + "summary": { + "by": { + "pdk": { + "gf180": { + "correct": 53, + "n": 66 + }, + "ihp130": { + "correct": 45, + "n": 60 + }, + "sky130": { + "correct": 48, + "n": 63 + } + }, + "topology": { + "C01": { + "correct": 15, + "n": 15 + }, + "C02": { + "correct": 6, + "n": 18 + }, + "C03": { + "correct": 18, + "n": 18 + }, + "C05": { + "correct": 6, + "n": 6 + }, + "C06": { + "correct": 6, + "n": 6 + }, + "C07": { + "correct": 13, + "n": 18 + }, + "C08": { + "correct": 18, + "n": 18 + }, + "C09": { + "correct": 15, + "n": 15 + }, + "C10": { + "correct": 14, + "n": 15 + }, + "C11": { + "correct": 6, + "n": 18 + }, + "C13": { + "correct": 5, + "n": 18 + }, + "C14": { + "correct": 18, + "n": 18 + }, + "C16": { + "correct": 6, + "n": 6 + } + }, + "mode": { + "combined": { + "correct": 35, + "n": 57 + }, + "diffusion_only": { + "correct": 72, + "n": 75 + }, + "gate_only": { + "correct": 39, + "n": 57 + } + } + }, + "n_pairs": 189, + "sign_correct": 146, + "confusion(true,hat)": { + "-1,-1": 112, + "-1,1": 17, + "-1,0": 16, + "0,0": 34, + "1,-1": 5, + "0,-1": 2, + "0,1": 3 + }, + "error_types": { + "routing channel height mis-predicted": 30, + "routing channel height mis-predicted + row x-shift changed": 12, + "row x-shift changed (cross-row via conflict, not modelled)": 1 + }, + "median_abs_error_rel": 0.0, + "p90_abs_error_rel": 0.16032000000000002, + "dead_band": 0.005, + "pin_model_mismatch_cases": [], + "rule": "textbook_sharing.selection.cost v2", + "channel_rule": "none" + }, + "rows": [ + { + "case": "C01_gf180_sW1_sL1.5", + "mode": "diffusion_only", + "A0": 214.1568, + "A_true": 206.6688, + "A_hat": 206.6688, + "d_true": -0.03497, + "d_hat": -0.03497, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.1000000000000005 + ], + "channel_base": [ + 2.5, + 4.1000000000000005 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C01_gf180_sW1_sL1.5", + "mode": "gate_only", + "A0": 214.1568, + "A_true": 195.8528, + "A_hat": 195.8528, + "d_true": -0.08547, + "d_hat": -0.08547, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.1000000000000005 + ], + "channel_base": [ + 2.5, + 4.1000000000000005 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C01_gf180_sW1_sL1.5", + "mode": "combined", + "A0": 214.1568, + "A_true": 189.0048, + "A_hat": 189.0048, + "d_true": -0.11745, + "d_hat": -0.11745, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.1000000000000005 + ], + "channel_base": [ + 2.5, + 4.1000000000000005 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C01_gf180_sW1_sL1", + "mode": "diffusion_only", + "A0": 172.224, + "A_true": 164.736, + "A_hat": 164.736, + "d_true": -0.04348, + "d_hat": -0.04348, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.1000000000000005 + ], + "channel_base": [ + 2.5, + 4.1000000000000005 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C01_gf180_sW1_sL1", + "mode": "gate_only", + "A0": 172.224, + "A_true": 157.504, + "A_hat": 157.504, + "d_true": -0.08547, + "d_hat": -0.08547, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.1000000000000005 + ], + "channel_base": [ + 2.5, + 4.1000000000000005 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C01_gf180_sW1_sL1", + "mode": "combined", + "A0": 172.224, + "A_true": 150.656, + "A_hat": 150.656, + "d_true": -0.12523, + "d_hat": -0.12523, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.1000000000000005 + ], + "channel_base": [ + 2.5, + 4.1000000000000005 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C01_ihp130_sW1_sL1.5", + "mode": "diffusion_only", + "A0": 129.3102, + "A_true": 125.8218, + "A_hat": 125.8218, + "d_true": -0.02698, + "d_hat": -0.02698, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.7199999999999998, + 2.9 + ], + "channel_base": [ + 1.7199999999999998, + 2.9 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C01_ihp130_sW1_sL1.5", + "mode": "gate_only", + "A0": 129.3102, + "A_true": 119.6686, + "A_hat": 119.6687, + "d_true": -0.07456, + "d_hat": -0.07456, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.7199999999999998, + 2.9 + ], + "channel_base": [ + 1.7199999999999998, + 2.9 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C01_ihp130_sW1_sL1.5", + "mode": "combined", + "A0": 129.3102, + "A_true": 116.4403, + "A_hat": 116.4404, + "d_true": -0.09953, + "d_hat": -0.09953, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.7199999999999998, + 2.9 + ], + "channel_base": [ + 1.7199999999999998, + 2.9 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C01_sky130_sW1_sL1.5", + "mode": "diffusion_only", + "A0": 95.1085, + "A_true": 91.1353, + "A_hat": 91.1353, + "d_true": -0.04178, + "d_hat": -0.04178, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 3.1 + ], + "channel_base": [ + 1.88, + 3.1 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C01_sky130_sW1_sL1.5", + "mode": "gate_only", + "A0": 95.1085, + "A_true": 87.8698, + "A_hat": 87.8698, + "d_true": -0.07611, + "d_hat": -0.07611, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 3.1 + ], + "channel_base": [ + 1.88, + 3.1 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C01_sky130_sW1_sL1.5", + "mode": "combined", + "A0": 95.1085, + "A_true": 84.199, + "A_hat": 84.199, + "d_true": -0.11471, + "d_hat": -0.11471, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 3.1 + ], + "channel_base": [ + 1.88, + 3.1 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C01_sky130_sW1_sL1", + "mode": "diffusion_only", + "A0": 78.0805, + "A_true": 74.1073, + "A_hat": 74.1073, + "d_true": -0.05089, + "d_hat": -0.05089, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 3.1 + ], + "channel_base": [ + 1.88, + 3.1 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C01_sky130_sW1_sL1", + "mode": "gate_only", + "A0": 78.0805, + "A_true": 72.1378, + "A_hat": 72.1378, + "d_true": -0.07611, + "d_hat": -0.07611, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 3.1 + ], + "channel_base": [ + 1.88, + 3.1 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C01_sky130_sW1_sL1", + "mode": "combined", + "A0": 78.0805, + "A_true": 68.467, + "A_hat": 68.467, + "d_true": -0.12312, + "d_hat": -0.12312, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 3.1 + ], + "channel_base": [ + 1.88, + 3.1 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C02_gf180_sW1_sL1.5", + "mode": "diffusion_only", + "A0": 349.9776, + "A_true": 340.5696, + "A_hat": 340.5696, + "d_true": -0.02688, + "d_hat": -0.02688, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 3.3, + 5.7 + ], + "channel_base": [ + 3.3, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C02_gf180_sW1_sL1.5", + "mode": "gate_only", + "A0": 349.9776, + "A_true": 300.7664, + "A_hat": 360.1556, + "d_true": -0.14061, + "d_hat": 0.02908, + "sign_true": -1, + "sign_hat": 1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.9 + ], + "channel_base": [ + 3.3, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": null, + "row_shift_change_um": 0.0, + "error_type": "routing channel height mis-predicted", + "channel_change": [ + -0.8, + -0.8 + ] + }, + { + "case": "C02_gf180_sW1_sL1.5", + "mode": "combined", + "A0": 349.9776, + "A_true": 292.6704, + "A_hat": 350.7796, + "d_true": -0.16375, + "d_hat": 0.00229, + "sign_true": -1, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.9 + ], + "channel_base": [ + 3.3, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": null, + "row_shift_change_um": 0.0, + "error_type": "routing channel height mis-predicted", + "channel_change": [ + -0.8, + -0.8 + ] + }, + { + "case": "C02_gf180_sW1_sL1", + "mode": "diffusion_only", + "A0": 297.2928, + "A_true": 287.8848, + "A_hat": 287.8848, + "d_true": -0.03165, + "d_hat": -0.03165, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 3.3, + 5.7 + ], + "channel_base": [ + 3.3, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C02_gf180_sW1_sL1", + "mode": "gate_only", + "A0": 297.2928, + "A_true": 255.4288, + "A_hat": 307.65, + "d_true": -0.14082, + "d_hat": 0.03484, + "sign_true": -1, + "sign_hat": 1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.9 + ], + "channel_base": [ + 3.3, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": null, + "row_shift_change_um": 0.0, + "error_type": "routing channel height mis-predicted", + "channel_change": [ + -0.8, + -0.8 + ] + }, + { + "case": "C02_gf180_sW1_sL1", + "mode": "combined", + "A0": 297.2928, + "A_true": 247.3328, + "A_hat": 298.274, + "d_true": -0.16805, + "d_hat": 0.0033, + "sign_true": -1, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.9 + ], + "channel_base": [ + 3.3, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": null, + "row_shift_change_um": 0.0, + "error_type": "routing channel height mis-predicted", + "channel_change": [ + -0.8, + -0.8 + ] + }, + { + "case": "C02_ihp130_sW1_sL1.5", + "mode": "diffusion_only", + "A0": 202.0337, + "A_true": 197.6425, + "A_hat": 197.6425, + "d_true": -0.02173, + "d_hat": -0.02173, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.3099999999999996, + 4.08 + ], + "channel_base": [ + 2.3099999999999996, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C02_ihp130_sW1_sL1.5", + "mode": "gate_only", + "A0": 202.0337, + "A_true": 173.5051, + "A_hat": 205.9452, + "d_true": -0.14121, + "d_hat": 0.01936, + "sign_true": -1, + "sign_hat": 1, + "passive_dominated": false, + "row_shift_true": [ + 0.84 + ], + "channel_true": [ + 1.7199999999999998, + 3.4899999999999998 + ], + "channel_base": [ + 2.3099999999999996, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": null, + "row_shift_change_um": 0.01, + "error_type": "routing channel height mis-predicted", + "channel_change": [ + -0.59, + -0.59 + ] + }, + { + "case": "C02_ihp130_sW1_sL1.5", + "mode": "combined", + "A0": 202.0337, + "A_true": 169.726, + "A_hat": 201.5643, + "d_true": -0.15991, + "d_hat": -0.00232, + "sign_true": -1, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 0.84 + ], + "channel_true": [ + 1.7199999999999998, + 3.4899999999999998 + ], + "channel_base": [ + 2.3099999999999996, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": null, + "row_shift_change_um": 0.01, + "error_type": "routing channel height mis-predicted", + "channel_change": [ + -0.59, + -0.59 + ] + }, + { + "case": "C02_ihp130_sW1_sL1", + "mode": "diffusion_only", + "A0": 166.2161, + "A_true": 161.825, + "A_hat": 161.8249, + "d_true": -0.02642, + "d_hat": -0.02642, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.3099999999999996, + 4.08 + ], + "channel_base": [ + 2.3099999999999996, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C02_ihp130_sW1_sL1", + "mode": "gate_only", + "A0": 166.2161, + "A_true": 142.6796, + "A_hat": 170.2108, + "d_true": -0.1416, + "d_hat": 0.02403, + "sign_true": -1, + "sign_hat": 1, + "passive_dominated": false, + "row_shift_true": [ + 0.84 + ], + "channel_true": [ + 1.7199999999999998, + 3.4899999999999998 + ], + "channel_base": [ + 2.3099999999999996, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": null, + "row_shift_change_um": 0.01, + "error_type": "routing channel height mis-predicted", + "channel_change": [ + -0.59, + -0.59 + ] + }, + { + "case": "C02_ihp130_sW1_sL1", + "mode": "combined", + "A0": 166.2161, + "A_true": 138.9004, + "A_hat": 165.8299, + "d_true": -0.16434, + "d_hat": -0.00232, + "sign_true": -1, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 0.84 + ], + "channel_true": [ + 1.7199999999999998, + 3.4899999999999998 + ], + "channel_base": [ + 2.3099999999999996, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": null, + "row_shift_change_um": 0.01, + "error_type": "routing channel height mis-predicted", + "channel_change": [ + -0.59, + -0.59 + ] + }, + { + "case": "C02_sky130_sW1_sL1.5", + "mode": "diffusion_only", + "A0": 155.4289, + "A_true": 150.4309, + "A_hat": 150.4309, + "d_true": -0.03216, + "d_hat": -0.03216, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.49, + 4.32 + ], + "channel_base": [ + 2.49, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C02_sky130_sW1_sL1.5", + "mode": "gate_only", + "A0": 155.4289, + "A_true": 134.0862, + "A_hat": 161.3243, + "d_true": -0.13731, + "d_hat": 0.03793, + "sign_true": -1, + "sign_hat": 1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 3.71 + ], + "channel_base": [ + 2.49, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": null, + "row_shift_change_um": 0.0, + "error_type": "routing channel height mis-predicted", + "channel_change": [ + -0.61, + -0.61 + ] + }, + { + "case": "C02_sky130_sW1_sL1.5", + "mode": "combined", + "A0": 155.4289, + "A_true": 129.7546, + "A_hat": 156.3095, + "d_true": -0.16518, + "d_hat": 0.00567, + "sign_true": -1, + "sign_hat": 1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 3.71 + ], + "channel_base": [ + 2.49, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": null, + "row_shift_change_um": 0.0, + "error_type": "routing channel height mis-predicted", + "channel_change": [ + -0.61, + -0.61 + ] + }, + { + "case": "C02_sky130_sW1_sL1", + "mode": "diffusion_only", + "A0": 134.0089, + "A_true": 129.0109, + "A_hat": 129.0109, + "d_true": -0.0373, + "d_hat": -0.0373, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.49, + 4.32 + ], + "channel_base": [ + 2.49, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C02_sky130_sW1_sL1", + "mode": "gate_only", + "A0": 134.0089, + "A_true": 115.5222, + "A_hat": 139.8323, + "d_true": -0.13795, + "d_hat": 0.04346, + "sign_true": -1, + "sign_hat": 1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 3.71 + ], + "channel_base": [ + 2.49, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": null, + "row_shift_change_um": 0.0, + "error_type": "routing channel height mis-predicted", + "channel_change": [ + -0.61, + -0.61 + ] + }, + { + "case": "C02_sky130_sW1_sL1", + "mode": "combined", + "A0": 134.0089, + "A_true": 119.9594, + "A_hat": 134.8175, + "d_true": -0.10484, + "d_hat": 0.00603, + "sign_true": -1, + "sign_hat": 1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 4.32 + ], + "channel_base": [ + 2.49, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": null, + "row_shift_change_um": 0.0, + "error_type": "routing channel height mis-predicted", + "channel_change": [ + -0.61, + 0.0 + ] + }, + { + "case": "C03_gf180_sW1_sL1.5", + "mode": "diffusion_only", + "A0": 1103.0144, + "A_true": 1094.2464, + "A_hat": 1094.2464, + "d_true": -0.00795, + "d_hat": -0.00795, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 3.3, + 4.9 + ], + "channel_base": [ + 3.3, + 4.9 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C03_gf180_sW1_sL1.5", + "mode": "gate_only", + "A0": 1103.0144, + "A_true": 1103.0144, + "A_hat": 1103.0144, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 3.3, + 4.9 + ], + "channel_base": [ + 3.3, + 4.9 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C03_gf180_sW1_sL1.5", + "mode": "combined", + "A0": 1103.0144, + "A_true": 1094.2464, + "A_hat": 1094.2464, + "d_true": -0.00795, + "d_hat": -0.00795, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 3.3, + 4.9 + ], + "channel_base": [ + 3.3, + 4.9 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C03_gf180_sW1_sL1", + "mode": "diffusion_only", + "A0": 808.4096, + "A_true": 799.6416, + "A_hat": 799.6416, + "d_true": -0.01085, + "d_hat": -0.01085, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 3.3, + 4.9 + ], + "channel_base": [ + 3.3, + 4.9 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C03_gf180_sW1_sL1", + "mode": "gate_only", + "A0": 808.4096, + "A_true": 808.4096, + "A_hat": 808.4096, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 3.3, + 4.9 + ], + "channel_base": [ + 3.3, + 4.9 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C03_gf180_sW1_sL1", + "mode": "combined", + "A0": 808.4096, + "A_true": 799.6416, + "A_hat": 799.6416, + "d_true": -0.01085, + "d_hat": -0.01085, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 3.3, + 4.9 + ], + "channel_base": [ + 3.3, + 4.9 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C03_ihp130_sW1_sL1.5", + "mode": "diffusion_only", + "A0": 708.9279, + "A_true": 704.8377, + "A_hat": 704.8377, + "d_true": -0.00577, + "d_hat": -0.00577, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.3099999999999996, + 3.4899999999999998 + ], + "channel_base": [ + 2.3099999999999996, + 3.4899999999999998 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C03_ihp130_sW1_sL1.5", + "mode": "gate_only", + "A0": 708.9279, + "A_true": 708.9279, + "A_hat": 708.9279, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.3099999999999996, + 3.4899999999999998 + ], + "channel_base": [ + 2.3099999999999996, + 3.4899999999999998 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C03_ihp130_sW1_sL1.5", + "mode": "combined", + "A0": 708.9279, + "A_true": 704.8377, + "A_hat": 704.8377, + "d_true": -0.00577, + "d_hat": -0.00577, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.3099999999999996, + 3.4899999999999998 + ], + "channel_base": [ + 2.3099999999999996, + 3.4899999999999998 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C03_ihp130_sW1_sL1", + "mode": "diffusion_only", + "A0": 508.7487, + "A_true": 504.6585, + "A_hat": 504.6585, + "d_true": -0.00804, + "d_hat": -0.00804, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.3099999999999996, + 3.4899999999999998 + ], + "channel_base": [ + 2.3099999999999996, + 3.4899999999999998 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C03_ihp130_sW1_sL1", + "mode": "gate_only", + "A0": 508.7487, + "A_true": 508.7487, + "A_hat": 508.7487, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.3099999999999996, + 3.4899999999999998 + ], + "channel_base": [ + 2.3099999999999996, + 3.4899999999999998 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C03_ihp130_sW1_sL1", + "mode": "combined", + "A0": 508.7487, + "A_true": 504.6585, + "A_hat": 504.6585, + "d_true": -0.00804, + "d_hat": -0.00804, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.3099999999999996, + 3.4899999999999998 + ], + "channel_base": [ + 2.3099999999999996, + 3.4899999999999998 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C03_sky130_sW1_sL1.5", + "mode": "diffusion_only", + "A0": 458.7801, + "A_true": 454.1237, + "A_hat": 454.1237, + "d_true": -0.01015, + "d_hat": -0.01015, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.49, + 3.71 + ], + "channel_base": [ + 2.49, + 3.71 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C03_sky130_sW1_sL1.5", + "mode": "gate_only", + "A0": 458.7801, + "A_true": 458.7801, + "A_hat": 458.7801, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.49, + 3.71 + ], + "channel_base": [ + 2.49, + 3.71 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C03_sky130_sW1_sL1.5", + "mode": "combined", + "A0": 458.7801, + "A_true": 454.1237, + "A_hat": 454.1237, + "d_true": -0.01015, + "d_hat": -0.01015, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.49, + 3.71 + ], + "channel_base": [ + 2.49, + 3.71 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C03_sky130_sW1_sL1", + "mode": "diffusion_only", + "A0": 339.0441, + "A_true": 334.3877, + "A_hat": 334.3877, + "d_true": -0.01373, + "d_hat": -0.01373, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.49, + 3.71 + ], + "channel_base": [ + 2.49, + 3.71 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C03_sky130_sW1_sL1", + "mode": "gate_only", + "A0": 339.0441, + "A_true": 339.0441, + "A_hat": 339.0441, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.49, + 3.71 + ], + "channel_base": [ + 2.49, + 3.71 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C03_sky130_sW1_sL1", + "mode": "combined", + "A0": 339.0441, + "A_true": 334.3877, + "A_hat": 334.3877, + "d_true": -0.01373, + "d_hat": -0.01373, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.49, + 3.71 + ], + "channel_base": [ + 2.49, + 3.71 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C05_gf180_sW1_sL1.5", + "mode": "diffusion_only", + "A0": 190.008, + "A_true": 182.52, + "A_hat": 182.52, + "d_true": -0.03941, + "d_hat": -0.03941, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.1000000000000005 + ], + "channel_base": [ + 2.5, + 4.1000000000000005 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C05_gf180_sW1_sL1", + "mode": "diffusion_only", + "A0": 158.5584, + "A_true": 151.0704, + "A_hat": 151.0704, + "d_true": -0.04723, + "d_hat": -0.04723, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.1000000000000005 + ], + "channel_base": [ + 2.5, + 4.1000000000000005 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C05_ihp130_sW1_sL1.5", + "mode": "diffusion_only", + "A0": 80.2332, + "A_true": 76.7448, + "A_hat": 76.7448, + "d_true": -0.04348, + "d_hat": -0.04348, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.7199999999999998, + 2.9 + ], + "channel_base": [ + 1.7199999999999998, + 2.9 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C05_ihp130_sW1_sL1", + "mode": "diffusion_only", + "A0": 69.5628, + "A_true": 66.0744, + "A_hat": 66.0744, + "d_true": -0.05015, + "d_hat": -0.05015, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.7199999999999998, + 2.9 + ], + "channel_base": [ + 1.7199999999999998, + 2.9 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C05_sky130_sW1_sL1.5", + "mode": "diffusion_only", + "A0": 83.0824, + "A_true": 79.1093, + "A_hat": 79.1093, + "d_true": -0.04782, + "d_hat": -0.04782, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 3.1 + ], + "channel_base": [ + 1.88, + 3.1 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C05_sky130_sW1_sL1", + "mode": "diffusion_only", + "A0": 70.3114, + "A_true": 66.3383, + "A_hat": 66.3383, + "d_true": -0.05651, + "d_hat": -0.05651, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 3.1 + ], + "channel_base": [ + 1.88, + 3.1 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C06_gf180_sW1_sL1.5", + "mode": "diffusion_only", + "A0": 479.186, + "A_true": 464.61, + "A_hat": 464.61, + "d_true": -0.03042, + "d_hat": -0.03042, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 6.85, + 1.05 + ], + "channel_true": [ + 2.5, + 5.7, + 2.5 + ], + "channel_base": [ + 2.5, + 5.7, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C06_gf180_sW1_sL1", + "mode": "diffusion_only", + "A0": 397.5604, + "A_true": 382.9844, + "A_hat": 382.9844, + "d_true": -0.03666, + "d_hat": -0.03666, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 5.73, + 1.05 + ], + "channel_true": [ + 2.5, + 5.7, + 2.5 + ], + "channel_base": [ + 2.5, + 5.7, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C06_ihp130_sW1_sL1.5", + "mode": "diffusion_only", + "A0": 204.155, + "A_true": 197.372, + "A_hat": 197.372, + "d_true": -0.03322, + "d_hat": -0.03322, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 4.29, + 0.94 + ], + "channel_true": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C06_ihp130_sW1_sL1", + "mode": "diffusion_only", + "A0": 176.491, + "A_true": 169.708, + "A_hat": 169.708, + "d_true": -0.03843, + "d_hat": -0.03843, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 3.77, + 0.94 + ], + "channel_true": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C06_sky130_sW1_sL1.5", + "mode": "diffusion_only", + "A0": 204.6112, + "A_true": 196.9056, + "A_hat": 196.9056, + "d_true": -0.03766, + "d_hat": -0.03766, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 3.86, + 0.85 + ], + "channel_true": [ + 1.88, + 4.32, + 1.88 + ], + "channel_base": [ + 1.88, + 4.32, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C06_sky130_sW1_sL1", + "mode": "diffusion_only", + "A0": 171.5872, + "A_true": 163.8816, + "A_hat": 163.8816, + "d_true": -0.04491, + "d_hat": -0.04491, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 3.26, + 0.85 + ], + "channel_true": [ + 1.88, + 4.32, + 1.88 + ], + "channel_base": [ + 1.88, + 4.32, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C07_gf180_sW1_sL1.5", + "mode": "diffusion_only", + "A0": 458.146, + "A_true": 444.21, + "A_hat": 444.21, + "d_true": -0.03042, + "d_hat": -0.03042, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.25, + 1.05 + ], + "channel_true": [ + 2.5, + 4.9, + 2.5 + ], + "channel_base": [ + 2.5, + 4.9, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C07_gf180_sW1_sL1.5", + "mode": "gate_only", + "A0": 458.146, + "A_true": 437.106, + "A_hat": 437.106, + "d_true": -0.04592, + "d_hat": -0.04592, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.25, + 1.05 + ], + "channel_true": [ + 2.5, + 4.9, + 2.5 + ], + "channel_base": [ + 2.5, + 4.9, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C07_gf180_sW1_sL1.5", + "mode": "combined", + "A0": 458.146, + "A_true": 433.782, + "A_hat": 430.458, + "d_true": -0.05318, + "d_hat": -0.06043, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05, + 1.65 + ], + "channel_true": [ + 2.5, + 4.9, + 2.5 + ], + "channel_base": [ + 2.5, + 4.9, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C07_gf180_sW1_sL1", + "mode": "diffusion_only", + "A0": 380.1044, + "A_true": 366.1684, + "A_hat": 366.1684, + "d_true": -0.03666, + "d_hat": -0.03666, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.25, + 1.05 + ], + "channel_true": [ + 2.5, + 4.9, + 2.5 + ], + "channel_base": [ + 2.5, + 4.9, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C07_gf180_sW1_sL1", + "mode": "gate_only", + "A0": 380.1044, + "A_true": 362.6484, + "A_hat": 362.6484, + "d_true": -0.04592, + "d_hat": -0.04592, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.25, + 1.05 + ], + "channel_true": [ + 2.5, + 4.9, + 2.5 + ], + "channel_base": [ + 2.5, + 4.9, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C07_gf180_sW1_sL1", + "mode": "combined", + "A0": 380.1044, + "A_true": 359.3244, + "A_hat": 356.0004, + "d_true": -0.05467, + "d_hat": -0.06341, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05, + 1.65 + ], + "channel_true": [ + 2.5, + 4.9, + 2.5 + ], + "channel_base": [ + 2.5, + 4.9, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C07_ihp130_sW1_sL1.5", + "mode": "diffusion_only", + "A0": 195.0985, + "A_true": 188.6164, + "A_hat": 188.6164, + "d_true": -0.03322, + "d_hat": -0.03322, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.21, + 0.94 + ], + "channel_true": [ + 1.7199999999999998, + 3.4899999999999998, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 3.4899999999999998, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C07_ihp130_sW1_sL1.5", + "mode": "gate_only", + "A0": 195.0985, + "A_true": 187.27, + "A_hat": 187.27, + "d_true": -0.04013, + "d_hat": -0.04013, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.21, + 0.94 + ], + "channel_true": [ + 1.7199999999999998, + 3.4899999999999998, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 3.4899999999999998, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C07_ihp130_sW1_sL1.5", + "mode": "combined", + "A0": 195.0985, + "A_true": 198.1811, + "A_hat": 181.048, + "d_true": 0.0158, + "d_hat": -0.07202, + "sign_true": 1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.955, + 1.61 + ], + "channel_true": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 3.4899999999999998, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": null, + "row_shift_change_um": 0.67, + "error_type": "routing channel height mis-predicted + row x-shift changed", + "channel_change": [ + 0.0, + 0.59, + 0.0 + ] + }, + { + "case": "C07_ihp130_sW1_sL1", + "mode": "diffusion_only", + "A0": 168.6617, + "A_true": 169.708, + "A_hat": 162.1796, + "d_true": 0.0062, + "d_hat": -0.03843, + "sign_true": 1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.21, + 0.94 + ], + "channel_true": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 3.4899999999999998, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": null, + "row_shift_change_um": 0.0, + "error_type": "routing channel height mis-predicted", + "channel_change": [ + 0.0, + 0.59, + 0.0 + ] + }, + { + "case": "C07_ihp130_sW1_sL1", + "mode": "gate_only", + "A0": 168.6617, + "A_true": 161.894, + "A_hat": 161.894, + "d_true": -0.04013, + "d_hat": -0.04013, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.21, + 0.94 + ], + "channel_true": [ + 1.7199999999999998, + 3.4899999999999998, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 3.4899999999999998, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C07_ihp130_sW1_sL1", + "mode": "combined", + "A0": 168.6617, + "A_true": 199.1423, + "A_hat": 155.672, + "d_true": 0.18072, + "d_hat": -0.07702, + "sign_true": 1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.955, + 0.94 + ], + "channel_true": [ + 1.7199999999999998, + 5.26, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 3.4899999999999998, + 1.7199999999999998 + ], + "strategy": "split", + "channel_dh_hat": null, + "row_shift_change_um": 0.255, + "error_type": "routing channel height mis-predicted", + "channel_change": [ + 0.0, + 1.77, + 0.0 + ] + }, + { + "case": "C07_sky130_sW1_sL1.5", + "mode": "diffusion_only", + "A0": 195.5405, + "A_true": 188.1765, + "A_hat": 188.1765, + "d_true": -0.03766, + "d_hat": -0.03766, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.9, + 0.85 + ], + "channel_true": [ + 1.88, + 3.71, + 1.88 + ], + "channel_base": [ + 1.88, + 3.71, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C07_sky130_sW1_sL1.5", + "mode": "gate_only", + "A0": 195.5405, + "A_true": 187.5107, + "A_hat": 187.5107, + "d_true": -0.04106, + "d_hat": -0.04106, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.9, + 0.85 + ], + "channel_true": [ + 1.88, + 3.71, + 1.88 + ], + "channel_base": [ + 1.88, + 3.71, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C07_sky130_sW1_sL1.5", + "mode": "combined", + "A0": 195.5405, + "A_true": 186.2497, + "A_hat": 186.2497, + "d_true": -0.04751, + "d_hat": -0.04751, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85, + 1.36 + ], + "channel_true": [ + 1.88, + 3.71, + 1.88 + ], + "channel_base": [ + 1.88, + 3.71, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C07_sky130_sW1_sL1", + "mode": "diffusion_only", + "A0": 163.9805, + "A_true": 163.8816, + "A_hat": 156.6165, + "d_true": -0.0006, + "d_hat": -0.04491, + "sign_true": 0, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.9, + 0.85 + ], + "channel_true": [ + 1.88, + 4.32, + 1.88 + ], + "channel_base": [ + 1.88, + 3.71, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": null, + "row_shift_change_um": 0.0, + "error_type": "routing channel height mis-predicted", + "channel_change": [ + 0.0, + 0.61, + 0.0 + ] + }, + { + "case": "C07_sky130_sW1_sL1", + "mode": "gate_only", + "A0": 163.9805, + "A_true": 157.2467, + "A_hat": 157.2467, + "d_true": -0.04106, + "d_hat": -0.04106, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.9, + 0.85 + ], + "channel_true": [ + 1.88, + 3.71, + 1.88 + ], + "channel_base": [ + 1.88, + 3.71, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C07_sky130_sW1_sL1", + "mode": "combined", + "A0": 163.9805, + "A_true": 163.5314, + "A_hat": 155.9857, + "d_true": -0.00274, + "d_hat": -0.04875, + "sign_true": 0, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85, + 1.36 + ], + "channel_true": [ + 1.88, + 4.32, + 1.88 + ], + "channel_base": [ + 1.88, + 3.71, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": null, + "row_shift_change_um": 0.51, + "error_type": "routing channel height mis-predicted + row x-shift changed", + "channel_change": [ + 0.0, + 0.61, + 0.0 + ] + }, + { + "case": "C08_gf180_sW1_sL1.5", + "mode": "diffusion_only", + "A0": 717.1392, + "A_true": 702.5632, + "A_hat": 702.5632, + "d_true": -0.02033, + "d_hat": -0.02033, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05, + 12.67 + ], + "channel_true": [ + 2.5, + 5.7, + 2.5 + ], + "channel_base": [ + 2.5, + 5.7, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C08_gf180_sW1_sL1.5", + "mode": "gate_only", + "A0": 717.1392, + "A_true": 685.6512, + "A_hat": 685.6512, + "d_true": -0.04391, + "d_hat": -0.04391, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05, + 12.67 + ], + "channel_true": [ + 2.5, + 5.7, + 2.5 + ], + "channel_base": [ + 2.5, + 5.7, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C08_gf180_sW1_sL1.5", + "mode": "combined", + "A0": 717.1392, + "A_true": 685.6512, + "A_hat": 685.6512, + "d_true": -0.04391, + "d_hat": -0.04391, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05, + 12.85 + ], + "channel_true": [ + 2.5, + 5.7, + 2.5 + ], + "channel_base": [ + 2.5, + 5.7, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C08_gf180_sW1_sL1", + "mode": "diffusion_only", + "A0": 594.7008, + "A_true": 580.1248, + "A_hat": 580.1248, + "d_true": -0.02451, + "d_hat": -0.02451, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05, + 10.43 + ], + "channel_true": [ + 2.5, + 5.7, + 2.5 + ], + "channel_base": [ + 2.5, + 5.7, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C08_gf180_sW1_sL1", + "mode": "gate_only", + "A0": 594.7008, + "A_true": 568.5888, + "A_hat": 568.5888, + "d_true": -0.04391, + "d_hat": -0.04391, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05, + 10.43 + ], + "channel_true": [ + 2.5, + 5.7, + 2.5 + ], + "channel_base": [ + 2.5, + 5.7, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C08_gf180_sW1_sL1", + "mode": "combined", + "A0": 594.7008, + "A_true": 568.5888, + "A_hat": 568.5888, + "d_true": -0.04391, + "d_hat": -0.04391, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05, + 10.61 + ], + "channel_true": [ + 2.5, + 5.7, + 2.5 + ], + "channel_base": [ + 2.5, + 5.7, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C08_ihp130_sW1_sL1.5", + "mode": "diffusion_only", + "A0": 359.8315, + "A_true": 353.0485, + "A_hat": 353.0485, + "d_true": -0.01885, + "d_hat": -0.01885, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85, + 8.715 + ], + "channel_true": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C08_ihp130_sW1_sL1.5", + "mode": "gate_only", + "A0": 359.8315, + "A_true": 346.0335, + "A_hat": 346.0335, + "d_true": -0.03835, + "d_hat": -0.03835, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85, + 8.715 + ], + "channel_true": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C08_ihp130_sW1_sL1.5", + "mode": "combined", + "A0": 359.8315, + "A_true": 346.0335, + "A_hat": 346.0335, + "d_true": -0.03835, + "d_hat": -0.03835, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85, + 8.81 + ], + "channel_true": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C08_ihp130_sW1_sL1", + "mode": "diffusion_only", + "A0": 297.5875, + "A_true": 290.8045, + "A_hat": 290.8045, + "d_true": -0.02279, + "d_hat": -0.02279, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85, + 7.155 + ], + "channel_true": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C08_ihp130_sW1_sL1", + "mode": "gate_only", + "A0": 297.5875, + "A_true": 286.1763, + "A_hat": 286.1763, + "d_true": -0.03835, + "d_hat": -0.03835, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85, + 7.155 + ], + "channel_true": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C08_ihp130_sW1_sL1", + "mode": "combined", + "A0": 297.5875, + "A_true": 286.1763, + "A_hat": 286.1763, + "d_true": -0.03835, + "d_hat": -0.03835, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85, + 7.25 + ], + "channel_true": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C08_sky130_sW1_sL1.5", + "mode": "diffusion_only", + "A0": 305.5408, + "A_true": 297.8352, + "A_hat": 297.8352, + "d_true": -0.02522, + "d_hat": -0.02522, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85, + 7.04 + ], + "channel_true": [ + 1.88, + 4.32, + 1.88 + ], + "channel_base": [ + 1.88, + 4.32, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C08_sky130_sW1_sL1.5", + "mode": "gate_only", + "A0": 305.5408, + "A_true": 293.5501, + "A_hat": 293.5501, + "d_true": -0.03924, + "d_hat": -0.03924, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85, + 7.04 + ], + "channel_true": [ + 1.88, + 4.32, + 1.88 + ], + "channel_base": [ + 1.88, + 4.32, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C08_sky130_sW1_sL1.5", + "mode": "combined", + "A0": 305.5408, + "A_true": 293.5501, + "A_hat": 293.5501, + "d_true": -0.03924, + "d_hat": -0.03924, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85, + 7.28 + ], + "channel_true": [ + 1.88, + 4.32, + 1.88 + ], + "channel_base": [ + 1.88, + 4.32, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C08_sky130_sW1_sL1", + "mode": "diffusion_only", + "A0": 256.0048, + "A_true": 248.2992, + "A_hat": 248.2992, + "d_true": -0.0301, + "d_hat": -0.0301, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85, + 5.84 + ], + "channel_true": [ + 1.88, + 4.32, + 1.88 + ], + "channel_base": [ + 1.88, + 4.32, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C08_sky130_sW1_sL1", + "mode": "gate_only", + "A0": 256.0048, + "A_true": 245.9581, + "A_hat": 245.9581, + "d_true": -0.03924, + "d_hat": -0.03924, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85, + 5.84 + ], + "channel_true": [ + 1.88, + 4.32, + 1.88 + ], + "channel_base": [ + 1.88, + 4.32, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C08_sky130_sW1_sL1", + "mode": "combined", + "A0": 256.0048, + "A_true": 245.9581, + "A_hat": 245.9581, + "d_true": -0.03924, + "d_hat": -0.03924, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85, + 6.08 + ], + "channel_true": [ + 1.88, + 4.32, + 1.88 + ], + "channel_base": [ + 1.88, + 4.32, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C09_gf180_sW1_sL1.5", + "mode": "diffusion_only", + "A0": 1167.8832, + "A_true": 1150.1072, + "A_hat": 1150.1072, + "d_true": -0.01522, + "d_hat": -0.01522, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.25, + 1.05 + ], + "channel_true": [ + 2.5, + 8.9, + 3.3 + ], + "channel_base": [ + 2.5, + 8.9, + 3.3 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C09_gf180_sW1_sL1.5", + "mode": "gate_only", + "A0": 1167.8832, + "A_true": 1167.8832, + "A_hat": 1167.8832, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 1.25, + 1.05 + ], + "channel_true": [ + 2.5, + 8.9, + 3.3 + ], + "channel_base": [ + 2.5, + 8.9, + 3.3 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C09_gf180_sW1_sL1.5", + "mode": "combined", + "A0": 1167.8832, + "A_true": 1150.1072, + "A_hat": 1150.1072, + "d_true": -0.01522, + "d_hat": -0.01522, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.25, + 1.05 + ], + "channel_true": [ + 2.5, + 8.9, + 3.3 + ], + "channel_base": [ + 2.5, + 8.9, + 3.3 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C09_gf180_sW1_sL1", + "mode": "diffusion_only", + "A0": 968.792, + "A_true": 951.016, + "A_hat": 951.016, + "d_true": -0.01835, + "d_hat": -0.01835, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.25, + 1.05 + ], + "channel_true": [ + 2.5, + 8.9, + 3.3 + ], + "channel_base": [ + 2.5, + 8.9, + 3.3 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C09_gf180_sW1_sL1", + "mode": "gate_only", + "A0": 968.792, + "A_true": 968.792, + "A_hat": 968.792, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 1.25, + 1.05 + ], + "channel_true": [ + 2.5, + 8.9, + 3.3 + ], + "channel_base": [ + 2.5, + 8.9, + 3.3 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C09_gf180_sW1_sL1", + "mode": "combined", + "A0": 968.792, + "A_true": 951.016, + "A_hat": 951.016, + "d_true": -0.01835, + "d_hat": -0.01835, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.25, + 1.05 + ], + "channel_true": [ + 2.5, + 8.9, + 3.3 + ], + "channel_base": [ + 2.5, + 8.9, + 3.3 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C09_ihp130_sW1_sL1.5", + "mode": "diffusion_only", + "A0": 1691.7062, + "A_true": 1683.4188, + "A_hat": 1683.4188, + "d_true": -0.0049, + "d_hat": -0.0049, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 25.85, + 0.94 + ], + "channel_true": [ + 1.7199999999999998, + 6.4399999999999995, + 2.3099999999999996 + ], + "channel_base": [ + 1.7199999999999998, + 6.4399999999999995, + 2.3099999999999996 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C09_ihp130_sW1_sL1.5", + "mode": "gate_only", + "A0": 1691.7062, + "A_true": 1691.7062, + "A_hat": 1691.7062, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 25.85, + 0.94 + ], + "channel_true": [ + 1.7199999999999998, + 6.4399999999999995, + 2.3099999999999996 + ], + "channel_base": [ + 1.7199999999999998, + 6.4399999999999995, + 2.3099999999999996 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C09_ihp130_sW1_sL1.5", + "mode": "combined", + "A0": 1691.7062, + "A_true": 1683.4188, + "A_hat": 1683.4188, + "d_true": -0.0049, + "d_hat": -0.0049, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 25.85, + 0.94 + ], + "channel_true": [ + 1.7199999999999998, + 6.4399999999999995, + 2.3099999999999996 + ], + "channel_base": [ + 1.7199999999999998, + 6.4399999999999995, + 2.3099999999999996 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C09_ihp130_sW1_sL1", + "mode": "diffusion_only", + "A0": 1421.3063, + "A_true": 1413.0187, + "A_hat": 1413.0187, + "d_true": -0.00583, + "d_hat": -0.00583, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 21.69, + 0.94 + ], + "channel_true": [ + 1.7199999999999998, + 6.4399999999999995, + 2.3099999999999996 + ], + "channel_base": [ + 1.7199999999999998, + 6.4399999999999995, + 2.3099999999999996 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C09_ihp130_sW1_sL1", + "mode": "gate_only", + "A0": 1421.3063, + "A_true": 1421.3063, + "A_hat": 1421.3063, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 21.69, + 0.94 + ], + "channel_true": [ + 1.7199999999999998, + 6.4399999999999995, + 2.3099999999999996 + ], + "channel_base": [ + 1.7199999999999998, + 6.4399999999999995, + 2.3099999999999996 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C09_ihp130_sW1_sL1", + "mode": "combined", + "A0": 1421.3063, + "A_true": 1413.0187, + "A_hat": 1413.0187, + "d_true": -0.00583, + "d_hat": -0.00583, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 21.69, + 0.94 + ], + "channel_true": [ + 1.7199999999999998, + 6.4399999999999995, + 2.3099999999999996 + ], + "channel_base": [ + 1.7199999999999998, + 6.4399999999999995, + 2.3099999999999996 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C09_sky130_sW1_sL1", + "mode": "diffusion_only", + "A0": 1365.7285, + "A_true": 1356.3148, + "A_hat": 1356.3149, + "d_true": -0.00689, + "d_hat": -0.00689, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 19.78, + 0.85 + ], + "channel_true": [ + 1.88, + 6.76, + 2.49 + ], + "channel_base": [ + 1.88, + 6.76, + 2.49 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C09_sky130_sW1_sL1", + "mode": "gate_only", + "A0": 1365.7285, + "A_true": 1365.7285, + "A_hat": 1365.7285, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 19.78, + 0.85 + ], + "channel_true": [ + 1.88, + 6.76, + 2.49 + ], + "channel_base": [ + 1.88, + 6.76, + 2.49 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C09_sky130_sW1_sL1", + "mode": "combined", + "A0": 1365.7285, + "A_true": 1356.3148, + "A_hat": 1356.3149, + "d_true": -0.00689, + "d_hat": -0.00689, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 19.78, + 0.85 + ], + "channel_true": [ + 1.88, + 6.76, + 2.49 + ], + "channel_base": [ + 1.88, + 6.76, + 2.49 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C10_gf180_sW1_sL1.5", + "mode": "diffusion_only", + "A0": 1551.0364, + "A_true": 1518.0444, + "A_hat": 1518.0444, + "d_true": -0.02127, + "d_hat": -0.02127, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 13.44, + 1.03 + ], + "channel_true": [ + 2.5, + 8.1, + 2.5 + ], + "channel_base": [ + 2.5, + 8.1, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C10_gf180_sW1_sL1.5", + "mode": "gate_only", + "A0": 1551.0364, + "A_true": 1551.0364, + "A_hat": 1551.0364, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 14.84, + 1.03 + ], + "channel_true": [ + 2.5, + 8.1, + 2.5 + ], + "channel_base": [ + 2.5, + 8.1, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C10_gf180_sW1_sL1.5", + "mode": "combined", + "A0": 1551.0364, + "A_true": 1534.5404, + "A_hat": 1534.5404, + "d_true": -0.01064, + "d_hat": -0.01064, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 14.24, + 1.03 + ], + "channel_true": [ + 2.5, + 8.1, + 2.5 + ], + "channel_base": [ + 2.5, + 8.1, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C10_gf180_sW1_sL1", + "mode": "diffusion_only", + "A0": 1273.9036, + "A_true": 1192.7676, + "A_hat": 1240.9116, + "d_true": -0.06369, + "d_hat": -0.0259, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 11.07, + 9.95 + ], + "channel_true": [ + 2.5, + 7.300000000000001, + 2.5 + ], + "channel_base": [ + 2.5, + 8.1, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C10_gf180_sW1_sL1", + "mode": "gate_only", + "A0": 1273.9036, + "A_true": 1273.9036, + "A_hat": 1273.9036, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 20.44, + 1.03 + ], + "channel_true": [ + 2.5, + 8.1, + 2.5 + ], + "channel_base": [ + 2.5, + 8.1, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C10_gf180_sW1_sL1", + "mode": "combined", + "A0": 1273.9036, + "A_true": 1284.0074, + "A_hat": 1257.4076, + "d_true": 0.00793, + "d_hat": -0.01295, + "sign_true": 1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 23.16, + 1.03 + ], + "channel_true": [ + 2.5, + 8.1, + 2.5 + ], + "channel_base": [ + 2.5, + 8.1, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": null, + "row_shift_change_um": 2.72, + "error_type": "row x-shift changed (cross-row via conflict, not modelled)", + "channel_change": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C10_ihp130_sW1_sL1", + "mode": "diffusion_only", + "A0": 739.7863, + "A_true": 735.642, + "A_hat": 724.4149, + "d_true": -0.0056, + "d_hat": -0.02078, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 17.805, + 0.79 + ], + "channel_true": [ + 1.7199999999999998, + 5.85, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 5.85, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C10_ihp130_sW1_sL1", + "mode": "gate_only", + "A0": 739.7863, + "A_true": 739.7863, + "A_hat": 739.7863, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 16.39, + 0.79 + ], + "channel_true": [ + 1.7199999999999998, + 5.85, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 5.85, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C10_ihp130_sW1_sL1", + "mode": "combined", + "A0": 739.7863, + "A_true": 703.4384, + "A_hat": 732.1006, + "d_true": -0.04913, + "d_hat": -0.01039, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 9.33, + 7.73 + ], + "channel_true": [ + 1.7199999999999998, + 5.26, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 5.85, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C10_sky130_sW1_sL1.5", + "mode": "diffusion_only", + "A0": 981.5464, + "A_true": 964.0856, + "A_hat": 964.0856, + "d_true": -0.01779, + "d_hat": -0.01779, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 10.985, + 0.85 + ], + "channel_true": [ + 1.88, + 6.15, + 1.88 + ], + "channel_base": [ + 1.88, + 6.15, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C10_sky130_sW1_sL1.5", + "mode": "gate_only", + "A0": 981.5464, + "A_true": 981.5464, + "A_hat": 981.5464, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 11.94, + 0.815 + ], + "channel_true": [ + 1.88, + 6.15, + 1.88 + ], + "channel_base": [ + 1.88, + 6.15, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C10_sky130_sW1_sL1.5", + "mode": "combined", + "A0": 981.5464, + "A_true": 972.816, + "A_hat": 972.816, + "d_true": -0.00889, + "d_hat": -0.00889, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 11.37, + 0.815 + ], + "channel_true": [ + 1.88, + 6.15, + 1.88 + ], + "channel_base": [ + 1.88, + 6.15, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C10_sky130_sW1_sL1", + "mode": "diffusion_only", + "A0": 757.0504, + "A_true": 739.5896, + "A_hat": 739.5896, + "d_true": -0.02306, + "d_hat": -0.02306, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 8.65, + 0.815 + ], + "channel_true": [ + 1.88, + 6.15, + 1.88 + ], + "channel_base": [ + 1.88, + 6.15, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C10_sky130_sW1_sL1", + "mode": "gate_only", + "A0": 757.0504, + "A_true": 757.0504, + "A_hat": 757.0504, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 9.54, + 0.815 + ], + "channel_true": [ + 1.88, + 6.15, + 1.88 + ], + "channel_base": [ + 1.88, + 6.15, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C10_sky130_sW1_sL1", + "mode": "combined", + "A0": 757.0504, + "A_true": 748.32, + "A_hat": 748.32, + "d_true": -0.01153, + "d_hat": -0.01153, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 9.21, + 0.815 + ], + "channel_true": [ + 1.88, + 6.15, + 1.88 + ], + "channel_base": [ + 1.88, + 6.15, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C11_gf180_sW1_sL1.5", + "mode": "diffusion_only", + "A0": 2927.1676, + "A_true": 2849.8316, + "A_hat": 2849.8316, + "d_true": -0.02642, + "d_hat": -0.02642, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 16.05, + 1.74, + 9.235 + ], + "channel_true": [ + 3.3, + 7.300000000000001, + 4.9, + 0.0 + ], + "channel_base": [ + 3.3, + 7.300000000000001, + 4.9, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C11_gf180_sW1_sL1.5", + "mode": "gate_only", + "A0": 2927.1676, + "A_true": 2928.5417, + "A_hat": 3018.4375, + "d_true": 0.00047, + "d_hat": 0.03118, + "sign_true": 0, + "sign_hat": 1, + "passive_dominated": false, + "row_shift_true": [ + 16.59, + 1.74, + 10.575 + ], + "channel_true": [ + 3.3, + 7.300000000000001, + 4.1000000000000005, + 0.0 + ], + "channel_base": [ + 3.3, + 7.300000000000001, + 4.9, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": null, + "row_shift_change_um": 0.54, + "error_type": "routing channel height mis-predicted + row x-shift changed", + "channel_change": [ + 0.0, + 0.0, + -0.8, + 0.0 + ] + }, + { + "case": "C11_gf180_sW1_sL1.5", + "mode": "combined", + "A0": 2927.1676, + "A_true": 2852.5497, + "A_hat": 2941.1655, + "d_true": -0.02549, + "d_hat": 0.00478, + "sign_true": -1, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 16.59, + 1.74, + 9.775 + ], + "channel_true": [ + 3.3, + 7.300000000000001, + 4.1000000000000005, + 0.0 + ], + "channel_base": [ + 3.3, + 7.300000000000001, + 4.9, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": null, + "row_shift_change_um": 0.54, + "error_type": "routing channel height mis-predicted + row x-shift changed", + "channel_change": [ + 0.0, + 0.0, + -0.8, + 0.0 + ] + }, + { + "case": "C11_gf180_sW1_sL1", + "mode": "diffusion_only", + "A0": 2439.9508, + "A_true": 2362.6148, + "A_hat": 2362.6148, + "d_true": -0.0317, + "d_hat": -0.0317, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 13.25, + 1.74, + 4.195 + ], + "channel_true": [ + 3.3, + 7.300000000000001, + 4.9, + 0.0 + ], + "channel_base": [ + 3.3, + 7.300000000000001, + 4.9, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C11_gf180_sW1_sL1", + "mode": "gate_only", + "A0": 2439.9508, + "A_true": 2449.7921, + "A_hat": 2531.6239, + "d_true": 0.00403, + "d_hat": 0.03757, + "sign_true": 0, + "sign_hat": 1, + "passive_dominated": false, + "row_shift_true": [ + 13.79, + 1.74, + 5.535 + ], + "channel_true": [ + 3.3, + 7.300000000000001, + 4.1000000000000005, + 0.0 + ], + "channel_base": [ + 3.3, + 7.300000000000001, + 4.9, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": null, + "row_shift_change_um": 0.54, + "error_type": "routing channel height mis-predicted + row x-shift changed", + "channel_change": [ + 0.0, + 0.0, + -0.8, + 0.0 + ] + }, + { + "case": "C11_gf180_sW1_sL1", + "mode": "combined", + "A0": 2439.9508, + "A_true": 2373.8001, + "A_hat": 2454.3519, + "d_true": -0.02711, + "d_hat": 0.0059, + "sign_true": -1, + "sign_hat": 1, + "passive_dominated": false, + "row_shift_true": [ + 13.79, + 1.74, + 4.735 + ], + "channel_true": [ + 3.3, + 7.300000000000001, + 4.1000000000000005, + 0.0 + ], + "channel_base": [ + 3.3, + 7.300000000000001, + 4.9, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": null, + "row_shift_change_um": 0.54, + "error_type": "routing channel height mis-predicted + row x-shift changed", + "channel_change": [ + 0.0, + 0.0, + -0.8, + 0.0 + ] + }, + { + "case": "C11_ihp130_sW1_sL1.5", + "mode": "diffusion_only", + "A0": 2092.7973, + "A_true": 2092.7973, + "A_hat": 2092.7973, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": true, + "row_shift_true": [ + 15.605, + 7.625, + 0.0 + ], + "channel_true": [ + 2.3099999999999996, + 5.26, + 3.4899999999999998, + 0.0 + ], + "channel_base": [ + 2.3099999999999996, + 5.26, + 3.4899999999999998, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C11_ihp130_sW1_sL1.5", + "mode": "gate_only", + "A0": 2092.7973, + "A_true": 2064.5756, + "A_hat": 2091.872, + "d_true": -0.01349, + "d_hat": -0.00044, + "sign_true": -1, + "sign_hat": 0, + "passive_dominated": true, + "row_shift_true": [ + 15.095, + 6.875, + 0.0 + ], + "channel_true": [ + 2.3099999999999996, + 5.26, + 2.9, + 0.0 + ], + "channel_base": [ + 2.3099999999999996, + 5.26, + 3.4899999999999998, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": null, + "row_shift_change_um": 0.24, + "error_type": "routing channel height mis-predicted", + "channel_change": [ + 0.0, + 0.0, + -0.59, + 0.0 + ] + }, + { + "case": "C11_ihp130_sW1_sL1.5", + "mode": "combined", + "A0": 2092.7973, + "A_true": 2064.5756, + "A_hat": 2091.872, + "d_true": -0.01349, + "d_hat": -0.00044, + "sign_true": -1, + "sign_hat": 0, + "passive_dominated": true, + "row_shift_true": [ + 15.605, + 7.385, + 0.0 + ], + "channel_true": [ + 2.3099999999999996, + 5.26, + 2.9, + 0.0 + ], + "channel_base": [ + 2.3099999999999996, + 5.26, + 3.4899999999999998, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": null, + "row_shift_change_um": 0.51, + "error_type": "routing channel height mis-predicted + row x-shift changed", + "channel_change": [ + 0.0, + 0.0, + -0.59, + 0.0 + ] + }, + { + "case": "C11_ihp130_sW1_sL1", + "mode": "diffusion_only", + "A0": 2092.7973, + "A_true": 2092.7973, + "A_hat": 2092.7973, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": true, + "row_shift_true": [ + 16.645, + 9.965, + 0.0 + ], + "channel_true": [ + 2.3099999999999996, + 5.26, + 3.4899999999999998, + 0.0 + ], + "channel_base": [ + 2.3099999999999996, + 5.26, + 3.4899999999999998, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C11_ihp130_sW1_sL1", + "mode": "gate_only", + "A0": 2092.7973, + "A_true": 2064.5756, + "A_hat": 2091.872, + "d_true": -0.01349, + "d_hat": -0.00044, + "sign_true": -1, + "sign_hat": 0, + "passive_dominated": true, + "row_shift_true": [ + 16.135, + 9.215, + 0.0 + ], + "channel_true": [ + 2.3099999999999996, + 5.26, + 2.9, + 0.0 + ], + "channel_base": [ + 2.3099999999999996, + 5.26, + 3.4899999999999998, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": null, + "row_shift_change_um": 0.24, + "error_type": "routing channel height mis-predicted", + "channel_change": [ + 0.0, + 0.0, + -0.59, + 0.0 + ] + }, + { + "case": "C11_ihp130_sW1_sL1", + "mode": "combined", + "A0": 2092.7973, + "A_true": 2064.5756, + "A_hat": 2091.872, + "d_true": -0.01349, + "d_hat": -0.00044, + "sign_true": -1, + "sign_hat": 0, + "passive_dominated": true, + "row_shift_true": [ + 16.645, + 9.725, + 0.0 + ], + "channel_true": [ + 2.3099999999999996, + 5.26, + 2.9, + 0.0 + ], + "channel_base": [ + 2.3099999999999996, + 5.26, + 3.4899999999999998, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": null, + "row_shift_change_um": 0.51, + "error_type": "routing channel height mis-predicted + row x-shift changed", + "channel_change": [ + 0.0, + 0.0, + -0.59, + 0.0 + ] + }, + { + "case": "C11_sky130_sW1_sL1.5", + "mode": "diffusion_only", + "A0": 1449.42, + "A_true": 1446.921, + "A_hat": 1449.42, + "d_true": -0.00172, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": true, + "row_shift_true": [ + 9.8, + 2.22, + 0.01 + ], + "channel_true": [ + 2.49, + 5.539999999999999, + 3.71, + 0.0 + ], + "channel_base": [ + 2.49, + 5.539999999999999, + 3.71, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C11_sky130_sW1_sL1.5", + "mode": "gate_only", + "A0": 1449.42, + "A_true": 1447.5121, + "A_hat": 1469.8452, + "d_true": -0.00132, + "d_hat": 0.01409, + "sign_true": 0, + "sign_hat": 1, + "passive_dominated": false, + "row_shift_true": [ + 9.3, + 1.28, + 0.07 + ], + "channel_true": [ + 2.49, + 5.539999999999999, + 3.1, + 0.0 + ], + "channel_base": [ + 2.49, + 5.539999999999999, + 3.71, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": null, + "row_shift_change_um": 0.375, + "error_type": "routing channel height mis-predicted + row x-shift changed", + "channel_change": [ + 0.0, + 0.0, + -0.61, + 0.0 + ] + }, + { + "case": "C11_sky130_sW1_sL1.5", + "mode": "combined", + "A0": 1449.42, + "A_true": 1426.7718, + "A_hat": 1450.464, + "d_true": -0.01563, + "d_hat": 0.00072, + "sign_true": -1, + "sign_hat": 0, + "passive_dominated": true, + "row_shift_true": [ + 9.8, + 1.78, + 0.01 + ], + "channel_true": [ + 2.49, + 5.539999999999999, + 3.1, + 0.0 + ], + "channel_base": [ + 2.49, + 5.539999999999999, + 3.71, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": null, + "row_shift_change_um": 0.56, + "error_type": "routing channel height mis-predicted + row x-shift changed", + "channel_change": [ + 0.0, + 0.0, + -0.61, + 0.0 + ] + }, + { + "case": "C11_sky130_sW1_sL1", + "mode": "diffusion_only", + "A0": 1446.921, + "A_true": 1446.921, + "A_hat": 1446.921, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": true, + "row_shift_true": [ + 10.995, + 4.915, + 0.01 + ], + "channel_true": [ + 2.49, + 5.539999999999999, + 3.71, + 0.0 + ], + "channel_base": [ + 2.49, + 5.539999999999999, + 3.71, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C11_sky130_sW1_sL1", + "mode": "gate_only", + "A0": 1446.921, + "A_true": 1426.7718, + "A_hat": 1447.9632, + "d_true": -0.01393, + "d_hat": 0.00072, + "sign_true": -1, + "sign_hat": 0, + "passive_dominated": true, + "row_shift_true": [ + 10.44, + 3.915, + 0.01 + ], + "channel_true": [ + 2.49, + 5.539999999999999, + 3.1, + 0.0 + ], + "channel_base": [ + 2.49, + 5.539999999999999, + 3.71, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": null, + "row_shift_change_um": 0.445, + "error_type": "routing channel height mis-predicted + row x-shift changed", + "channel_change": [ + 0.0, + 0.0, + -0.61, + 0.0 + ] + }, + { + "case": "C11_sky130_sW1_sL1", + "mode": "combined", + "A0": 1446.921, + "A_true": 1426.7718, + "A_hat": 1447.9632, + "d_true": -0.01393, + "d_hat": 0.00072, + "sign_true": -1, + "sign_hat": 0, + "passive_dominated": true, + "row_shift_true": [ + 10.995, + 4.475, + 0.01 + ], + "channel_true": [ + 2.49, + 5.539999999999999, + 3.1, + 0.0 + ], + "channel_base": [ + 2.49, + 5.539999999999999, + 3.71, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": null, + "row_shift_change_um": 0.555, + "error_type": "routing channel height mis-predicted + row x-shift changed", + "channel_change": [ + 0.0, + 0.0, + -0.61, + 0.0 + ] + }, + { + "case": "C13_gf180_sW1_sL1.5", + "mode": "diffusion_only", + "A0": 375.8496, + "A_true": 366.4416, + "A_hat": 366.4416, + "d_true": -0.02503, + "d_hat": -0.02503, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 3.3, + 5.7 + ], + "channel_base": [ + 3.3, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C13_gf180_sW1_sL1.5", + "mode": "gate_only", + "A0": 375.8496, + "A_true": 323.0304, + "A_hat": 385.9396, + "d_true": -0.14053, + "d_hat": 0.02685, + "sign_true": -1, + "sign_hat": 1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.9 + ], + "channel_base": [ + 3.3, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": null, + "row_shift_change_um": 0.0, + "error_type": "routing channel height mis-predicted", + "channel_change": [ + -0.8, + -0.8 + ] + }, + { + "case": "C13_gf180_sW1_sL1.5", + "mode": "combined", + "A0": 375.8496, + "A_true": 314.9344, + "A_hat": 376.5636, + "d_true": -0.16207, + "d_hat": 0.0019, + "sign_true": -1, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.9 + ], + "channel_base": [ + 3.3, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": null, + "row_shift_change_um": 0.0, + "error_type": "routing channel height mis-predicted", + "channel_change": [ + -0.8, + -0.8 + ] + }, + { + "case": "C13_gf180_sW1_sL1", + "mode": "diffusion_only", + "A0": 319.872, + "A_true": 310.464, + "A_hat": 310.464, + "d_true": -0.02941, + "d_hat": -0.02941, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 3.3, + 5.7 + ], + "channel_base": [ + 3.3, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C13_gf180_sW1_sL1", + "mode": "gate_only", + "A0": 319.872, + "A_true": 274.8592, + "A_hat": 330.1524, + "d_true": -0.14072, + "d_hat": 0.03214, + "sign_true": -1, + "sign_hat": 1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.9 + ], + "channel_base": [ + 3.3, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": null, + "row_shift_change_um": 0.0, + "error_type": "routing channel height mis-predicted", + "channel_change": [ + -0.8, + -0.8 + ] + }, + { + "case": "C13_gf180_sW1_sL1", + "mode": "combined", + "A0": 319.872, + "A_true": 266.7632, + "A_hat": 320.7764, + "d_true": -0.16603, + "d_hat": 0.00283, + "sign_true": -1, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.9 + ], + "channel_base": [ + 3.3, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": null, + "row_shift_change_um": 0.0, + "error_type": "routing channel height mis-predicted", + "channel_change": [ + -0.8, + -0.8 + ] + }, + { + "case": "C13_ihp130_sW1_sL1.5", + "mode": "diffusion_only", + "A0": 216.4124, + "A_true": 212.0213, + "A_hat": 212.0213, + "d_true": -0.02029, + "d_hat": -0.02029, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.3099999999999996, + 4.08 + ], + "channel_base": [ + 2.3099999999999996, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C13_ihp130_sW1_sL1.5", + "mode": "gate_only", + "A0": 216.4124, + "A_true": 185.8798, + "A_hat": 220.2906, + "d_true": -0.14109, + "d_hat": 0.01792, + "sign_true": -1, + "sign_hat": 1, + "passive_dominated": false, + "row_shift_true": [ + 0.84 + ], + "channel_true": [ + 1.7199999999999998, + 3.4899999999999998 + ], + "channel_base": [ + 2.3099999999999996, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": null, + "row_shift_change_um": 0.01, + "error_type": "routing channel height mis-predicted", + "channel_change": [ + -0.59, + -0.59 + ] + }, + { + "case": "C13_ihp130_sW1_sL1.5", + "mode": "combined", + "A0": 216.4124, + "A_true": 182.1008, + "A_hat": 215.9096, + "d_true": -0.15855, + "d_hat": -0.00232, + "sign_true": -1, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 0.84 + ], + "channel_true": [ + 1.7199999999999998, + 3.4899999999999998 + ], + "channel_base": [ + 2.3099999999999996, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": null, + "row_shift_change_um": 0.01, + "error_type": "routing channel height mis-predicted", + "channel_change": [ + -0.59, + -0.59 + ] + }, + { + "case": "C13_ihp130_sW1_sL1", + "mode": "diffusion_only", + "A0": 178.3562, + "A_true": 173.9651, + "A_hat": 173.965, + "d_true": -0.02462, + "d_hat": -0.02462, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.3099999999999996, + 4.08 + ], + "channel_base": [ + 2.3099999999999996, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C13_ihp130_sW1_sL1", + "mode": "gate_only", + "A0": 178.3562, + "A_true": 153.1276, + "A_hat": 182.3227, + "d_true": -0.14145, + "d_hat": 0.02224, + "sign_true": -1, + "sign_hat": 1, + "passive_dominated": false, + "row_shift_true": [ + 0.84 + ], + "channel_true": [ + 1.7199999999999998, + 3.4899999999999998 + ], + "channel_base": [ + 2.3099999999999996, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": null, + "row_shift_change_um": 0.01, + "error_type": "routing channel height mis-predicted", + "channel_change": [ + -0.59, + -0.59 + ] + }, + { + "case": "C13_ihp130_sW1_sL1", + "mode": "combined", + "A0": 178.3562, + "A_true": 149.3485, + "A_hat": 177.9418, + "d_true": -0.16264, + "d_hat": -0.00232, + "sign_true": -1, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 0.84 + ], + "channel_true": [ + 1.7199999999999998, + 3.4899999999999998 + ], + "channel_base": [ + 2.3099999999999996, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": null, + "row_shift_change_um": 0.01, + "error_type": "routing channel height mis-predicted", + "channel_change": [ + -0.59, + -0.59 + ] + }, + { + "case": "C13_sky130_sW1_sL1.5", + "mode": "diffusion_only", + "A0": 167.0314, + "A_true": 162.0334, + "A_hat": 162.0334, + "d_true": -0.02992, + "d_hat": -0.02992, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.49, + 4.32 + ], + "channel_base": [ + 2.49, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C13_sky130_sW1_sL1.5", + "mode": "gate_only", + "A0": 167.0314, + "A_true": 144.1417, + "A_hat": 172.9658, + "d_true": -0.13704, + "d_hat": 0.03553, + "sign_true": -1, + "sign_hat": 1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 3.71 + ], + "channel_base": [ + 2.49, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": null, + "row_shift_change_um": 0.0, + "error_type": "routing channel height mis-predicted", + "channel_change": [ + -0.61, + -0.61 + ] + }, + { + "case": "C13_sky130_sW1_sL1.5", + "mode": "combined", + "A0": 167.0314, + "A_true": 139.8101, + "A_hat": 167.951, + "d_true": -0.16297, + "d_hat": 0.00551, + "sign_true": -1, + "sign_hat": 1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 3.71 + ], + "channel_base": [ + 2.49, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": null, + "row_shift_change_um": 0.0, + "error_type": "routing channel height mis-predicted", + "channel_change": [ + -0.61, + -0.61 + ] + }, + { + "case": "C13_sky130_sW1_sL1", + "mode": "diffusion_only", + "A0": 144.2726, + "A_true": 148.7937, + "A_hat": 139.2746, + "d_true": 0.03134, + "d_hat": -0.03464, + "sign_true": 1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.49, + 4.93 + ], + "channel_base": [ + 2.49, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": null, + "row_shift_change_um": 0.0, + "error_type": "routing channel height mis-predicted", + "channel_change": [ + 0.0, + 0.61 + ] + }, + { + "case": "C13_sky130_sW1_sL1", + "mode": "gate_only", + "A0": 144.2726, + "A_true": 134.2293, + "A_hat": 150.1306, + "d_true": -0.06961, + "d_hat": 0.0406, + "sign_true": -1, + "sign_hat": 1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 4.32 + ], + "channel_base": [ + 2.49, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": null, + "row_shift_change_um": 0.0, + "error_type": "routing channel height mis-predicted", + "channel_change": [ + -0.61, + 0.0 + ] + }, + { + "case": "C13_sky130_sW1_sL1", + "mode": "combined", + "A0": 144.2726, + "A_true": 129.5561, + "A_hat": 145.1158, + "d_true": -0.102, + "d_hat": 0.00584, + "sign_true": -1, + "sign_hat": 1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 4.32 + ], + "channel_base": [ + 2.49, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": null, + "row_shift_change_um": 0.0, + "error_type": "routing channel height mis-predicted", + "channel_change": [ + -0.61, + 0.0 + ] + }, + { + "case": "C14_gf180_sW1_sL1.5", + "mode": "diffusion_only", + "A0": 496.3712, + "A_true": 476.2752, + "A_hat": 476.2752, + "d_true": -0.04049, + "d_hat": -0.04049, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 4.1000000000000005, + 5.7 + ], + "channel_base": [ + 4.1000000000000005, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C14_gf180_sW1_sL1.5", + "mode": "gate_only", + "A0": 496.3712, + "A_true": 496.3712, + "A_hat": 496.3712, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 4.1000000000000005, + 5.7 + ], + "channel_base": [ + 4.1000000000000005, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C14_gf180_sW1_sL1.5", + "mode": "combined", + "A0": 496.3712, + "A_true": 476.2752, + "A_hat": 476.2752, + "d_true": -0.04049, + "d_hat": -0.04049, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 4.1000000000000005, + 5.7 + ], + "channel_base": [ + 4.1000000000000005, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C14_gf180_sW1_sL1", + "mode": "diffusion_only", + "A0": 397.9008, + "A_true": 377.8048, + "A_hat": 377.8048, + "d_true": -0.05051, + "d_hat": -0.05051, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 4.1000000000000005, + 5.7 + ], + "channel_base": [ + 4.1000000000000005, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C14_gf180_sW1_sL1", + "mode": "gate_only", + "A0": 397.9008, + "A_true": 397.9008, + "A_hat": 397.9008, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 4.1000000000000005, + 5.7 + ], + "channel_base": [ + 4.1000000000000005, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C14_gf180_sW1_sL1", + "mode": "combined", + "A0": 397.9008, + "A_true": 377.8048, + "A_hat": 377.8048, + "d_true": -0.05051, + "d_hat": -0.05051, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 4.1000000000000005, + 5.7 + ], + "channel_base": [ + 4.1000000000000005, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C14_ihp130_sW1_sL1.5", + "mode": "diffusion_only", + "A0": 299.598, + "A_true": 290.214, + "A_hat": 290.214, + "d_true": -0.03132, + "d_hat": -0.03132, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.9, + 4.08 + ], + "channel_base": [ + 2.9, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C14_ihp130_sW1_sL1.5", + "mode": "gate_only", + "A0": 299.598, + "A_true": 299.598, + "A_hat": 299.598, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.9, + 4.08 + ], + "channel_base": [ + 2.9, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C14_ihp130_sW1_sL1.5", + "mode": "combined", + "A0": 299.598, + "A_true": 290.214, + "A_hat": 290.214, + "d_true": -0.03132, + "d_hat": -0.03132, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.9, + 4.08 + ], + "channel_base": [ + 2.9, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C14_ihp130_sW1_sL1", + "mode": "diffusion_only", + "A0": 232.622, + "A_true": 223.238, + "A_hat": 223.238, + "d_true": -0.04034, + "d_hat": -0.04034, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.9, + 4.08 + ], + "channel_base": [ + 2.9, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C14_ihp130_sW1_sL1", + "mode": "gate_only", + "A0": 232.622, + "A_true": 232.622, + "A_hat": 232.622, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.9, + 4.08 + ], + "channel_base": [ + 2.9, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C14_ihp130_sW1_sL1", + "mode": "combined", + "A0": 232.622, + "A_true": 223.238, + "A_hat": 223.238, + "d_true": -0.04034, + "d_hat": -0.04034, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.9, + 4.08 + ], + "channel_base": [ + 2.9, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C14_sky130_sW1_sL1.5", + "mode": "diffusion_only", + "A0": 217.4457, + "A_true": 206.7665, + "A_hat": 206.7665, + "d_true": -0.04911, + "d_hat": -0.04911, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 3.1, + 4.32 + ], + "channel_base": [ + 3.1, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C14_sky130_sW1_sL1.5", + "mode": "gate_only", + "A0": 217.4457, + "A_true": 217.4457, + "A_hat": 217.4457, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 3.1, + 4.32 + ], + "channel_base": [ + 3.1, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C14_sky130_sW1_sL1.5", + "mode": "combined", + "A0": 217.4457, + "A_true": 206.7665, + "A_hat": 206.7665, + "d_true": -0.04911, + "d_hat": -0.04911, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 3.1, + 4.32 + ], + "channel_base": [ + 3.1, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C14_sky130_sW1_sL1", + "mode": "diffusion_only", + "A0": 177.3987, + "A_true": 166.7195, + "A_hat": 166.7195, + "d_true": -0.0602, + "d_hat": -0.0602, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 3.1, + 4.32 + ], + "channel_base": [ + 3.1, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C14_sky130_sW1_sL1", + "mode": "gate_only", + "A0": 177.3987, + "A_true": 177.3987, + "A_hat": 177.3987, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 3.1, + 4.32 + ], + "channel_base": [ + 3.1, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C14_sky130_sW1_sL1", + "mode": "combined", + "A0": 177.3987, + "A_true": 166.7195, + "A_hat": 166.7195, + "d_true": -0.0602, + "d_hat": -0.0602, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 3.1, + 4.32 + ], + "channel_base": [ + 3.1, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C16_gf180_sW1_sL1.5", + "mode": "diffusion_only", + "A0": 1729.3648, + "A_true": 1729.3648, + "A_hat": 1729.3648, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": true, + "row_shift_true": [ + 50.35, + 0.02 + ], + "channel_true": [ + 2.5, + 5.7, + 0.0 + ], + "channel_base": [ + 2.5, + 5.7, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C16_gf180_sW1_sL1", + "mode": "diffusion_only", + "A0": 1729.3648, + "A_true": 1729.3648, + "A_hat": 1729.3648, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": true, + "row_shift_true": [ + 52.57, + 0.18 + ], + "channel_true": [ + 2.5, + 5.7, + 0.0 + ], + "channel_base": [ + 2.5, + 5.7, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C16_ihp130_sW1_sL1.5", + "mode": "diffusion_only", + "A0": 1007.736, + "A_true": 1007.736, + "A_hat": 1007.736, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": true, + "row_shift_true": [ + 41.41, + 0.13 + ], + "channel_true": [ + 1.7199999999999998, + 4.08, + 0.0 + ], + "channel_base": [ + 1.7199999999999998, + 4.08, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C16_ihp130_sW1_sL1", + "mode": "diffusion_only", + "A0": 1007.736, + "A_true": 1007.736, + "A_hat": 1007.736, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": true, + "row_shift_true": [ + 42.45, + 0.26 + ], + "channel_true": [ + 1.7199999999999998, + 4.08, + 0.0 + ], + "channel_base": [ + 1.7199999999999998, + 4.08, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C16_sky130_sW1_sL1.5", + "mode": "diffusion_only", + "A0": 377.2788, + "A_true": 377.2788, + "A_hat": 377.2788, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": true, + "row_shift_true": [ + 12.29, + 0.05 + ], + "channel_true": [ + 1.88, + 4.32, + 0.0 + ], + "channel_base": [ + 1.88, + 4.32, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": null + }, + { + "case": "C16_sky130_sW1_sL1", + "mode": "diffusion_only", + "A0": 377.2788, + "A_true": 377.2788, + "A_hat": 377.2788, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": true, + "row_shift_true": [ + 13.49, + 0.2 + ], + "channel_true": [ + 1.88, + 4.32, + 0.0 + ], + "channel_base": [ + 1.88, + 4.32, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": null + } + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/results/analysis/cost_validation_heldout.json b/benchmarks/textbook_sharing/results/analysis/cost_validation_heldout.json new file mode 100644 index 00000000..9d2eaa2d --- /dev/null +++ b/benchmarks/textbook_sharing/results/analysis/cost_validation_heldout.json @@ -0,0 +1,27224 @@ +{ + "summary": { + "by": { + "pdk": { + "gf180": { + "correct": 283, + "n": 306 + }, + "ihp130": { + "correct": 256, + "n": 286 + }, + "sky130": { + "correct": 256, + "n": 280 + } + }, + "topology": { + "C01": { + "correct": 78, + "n": 78 + }, + "C02": { + "correct": 90, + "n": 90 + }, + "C03": { + "correct": 87, + "n": 87 + }, + "C05": { + "correct": 29, + "n": 29 + }, + "C06": { + "correct": 25, + "n": 25 + }, + "C07": { + "correct": 78, + "n": 90 + }, + "C08": { + "correct": 84, + "n": 84 + }, + "C09": { + "correct": 54, + "n": 54 + }, + "C10": { + "correct": 61, + "n": 66 + }, + "C11": { + "correct": 32, + "n": 90 + }, + "C13": { + "correct": 61, + "n": 63 + }, + "C14": { + "correct": 90, + "n": 90 + }, + "C16": { + "correct": 26, + "n": 26 + } + }, + "mode": { + "combined": { + "correct": 223, + "n": 264 + }, + "diffusion_only": { + "correct": 336, + "n": 344 + }, + "gate_only": { + "correct": 236, + "n": 264 + } + } + }, + "n_pairs": 872, + "sign_correct": 795, + "confusion(true,hat)": { + "-1,-1": 612, + "0,0": 181, + "1,-1": 14, + "0,-1": 5, + "-1,0": 39, + "0,1": 12, + "-1,1": 7, + "1,1": 2 + }, + "error_types": { + "routing channel height mis-predicted + row x-shift changed": 50, + "routing channel height mis-predicted": 22, + "row x-shift changed (cross-row via conflict, not modelled)": 5 + }, + "median_abs_error_rel": 0.0, + "p90_abs_error_rel": 0.08191000000000001, + "dead_band": 0.005, + "pin_model_mismatch_cases": [], + "rule": "textbook_sharing.selection.cost v2", + "channel_rule": "nets" + }, + "rows": [ + { + "case": "C01_gf180_sW0.5_sL1.5", + "mode": "diffusion_only", + "A0": 130.2912, + "A_true": 122.8032, + "A_hat": 122.8032, + "d_true": -0.05747, + "d_hat": -0.05747, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.1000000000000005 + ], + "channel_base": [ + 2.5, + 4.1000000000000005 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C01_gf180_sW0.5_sL1.5", + "mode": "gate_only", + "A0": 130.2912, + "A_true": 119.1552, + "A_hat": 119.1552, + "d_true": -0.08547, + "d_hat": -0.08547, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.1000000000000005 + ], + "channel_base": [ + 2.5, + 4.1000000000000005 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C01_gf180_sW0.5_sL1.5", + "mode": "combined", + "A0": 130.2912, + "A_true": 112.3072, + "A_hat": 112.3072, + "d_true": -0.13803, + "d_hat": -0.13803, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.1000000000000005 + ], + "channel_base": [ + 2.5, + 4.1000000000000005 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C01_gf180_sW0.5_sL1", + "mode": "diffusion_only", + "A0": 109.3248, + "A_true": 101.8368, + "A_hat": 101.8368, + "d_true": -0.06849, + "d_hat": -0.06849, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.1000000000000005 + ], + "channel_base": [ + 2.5, + 4.1000000000000005 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C01_gf180_sW0.5_sL1", + "mode": "gate_only", + "A0": 109.3248, + "A_true": 99.9808, + "A_hat": 99.9808, + "d_true": -0.08547, + "d_hat": -0.08547, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.1000000000000005 + ], + "channel_base": [ + 2.5, + 4.1000000000000005 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C01_gf180_sW0.5_sL1", + "mode": "combined", + "A0": 109.3248, + "A_true": 93.1328, + "A_hat": 93.1328, + "d_true": -0.14811, + "d_hat": -0.14811, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.1000000000000005 + ], + "channel_base": [ + 2.5, + 4.1000000000000005 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C01_gf180_sW0.5_sL2", + "mode": "diffusion_only", + "A0": 151.2576, + "A_true": 143.7696, + "A_hat": 143.7696, + "d_true": -0.0495, + "d_hat": -0.0495, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.1000000000000005 + ], + "channel_base": [ + 2.5, + 4.1000000000000005 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C01_gf180_sW0.5_sL2", + "mode": "gate_only", + "A0": 151.2576, + "A_true": 138.3296, + "A_hat": 138.3296, + "d_true": -0.08547, + "d_hat": -0.08547, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.1000000000000005 + ], + "channel_base": [ + 2.5, + 4.1000000000000005 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C01_gf180_sW0.5_sL2", + "mode": "combined", + "A0": 151.2576, + "A_true": 131.4816, + "A_hat": 131.4816, + "d_true": -0.13074, + "d_hat": -0.13074, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.1000000000000005 + ], + "channel_base": [ + 2.5, + 4.1000000000000005 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C01_gf180_sW1.5_sL1.5", + "mode": "diffusion_only", + "A0": 298.0224, + "A_true": 290.5344, + "A_hat": 290.5344, + "d_true": -0.02513, + "d_hat": -0.02513, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.1000000000000005 + ], + "channel_base": [ + 2.5, + 4.1000000000000005 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C01_gf180_sW1.5_sL1.5", + "mode": "gate_only", + "A0": 298.0224, + "A_true": 272.5504, + "A_hat": 272.5504, + "d_true": -0.08547, + "d_hat": -0.08547, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.1000000000000005 + ], + "channel_base": [ + 2.5, + 4.1000000000000005 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C01_gf180_sW1.5_sL1.5", + "mode": "combined", + "A0": 298.0224, + "A_true": 265.7024, + "A_hat": 265.7024, + "d_true": -0.10845, + "d_hat": -0.10845, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.1000000000000005 + ], + "channel_base": [ + 2.5, + 4.1000000000000005 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C01_gf180_sW1.5_sL1", + "mode": "diffusion_only", + "A0": 235.1232, + "A_true": 227.6352, + "A_hat": 227.6352, + "d_true": -0.03185, + "d_hat": -0.03185, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.1000000000000005 + ], + "channel_base": [ + 2.5, + 4.1000000000000005 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C01_gf180_sW1.5_sL1", + "mode": "gate_only", + "A0": 235.1232, + "A_true": 215.0272, + "A_hat": 215.0272, + "d_true": -0.08547, + "d_hat": -0.08547, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.1000000000000005 + ], + "channel_base": [ + 2.5, + 4.1000000000000005 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C01_gf180_sW1.5_sL1", + "mode": "combined", + "A0": 235.1232, + "A_true": 208.1792, + "A_hat": 208.1792, + "d_true": -0.1146, + "d_hat": -0.1146, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.1000000000000005 + ], + "channel_base": [ + 2.5, + 4.1000000000000005 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C01_gf180_sW1.5_sL2", + "mode": "diffusion_only", + "A0": 360.9216, + "A_true": 353.4336, + "A_hat": 353.4336, + "d_true": -0.02075, + "d_hat": -0.02075, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.1000000000000005 + ], + "channel_base": [ + 2.5, + 4.1000000000000005 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C01_gf180_sW1.5_sL2", + "mode": "gate_only", + "A0": 360.9216, + "A_true": 330.0736, + "A_hat": 330.0736, + "d_true": -0.08547, + "d_hat": -0.08547, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.1000000000000005 + ], + "channel_base": [ + 2.5, + 4.1000000000000005 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C01_gf180_sW1.5_sL2", + "mode": "combined", + "A0": 360.9216, + "A_true": 323.2256, + "A_hat": 323.2256, + "d_true": -0.10444, + "d_hat": -0.10444, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.1000000000000005 + ], + "channel_base": [ + 2.5, + 4.1000000000000005 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C01_gf180_sW1_sL2", + "mode": "diffusion_only", + "A0": 256.0896, + "A_true": 248.6016, + "A_hat": 248.6016, + "d_true": -0.02924, + "d_hat": -0.02924, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.1000000000000005 + ], + "channel_base": [ + 2.5, + 4.1000000000000005 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C01_gf180_sW1_sL2", + "mode": "gate_only", + "A0": 256.0896, + "A_true": 234.2016, + "A_hat": 234.2016, + "d_true": -0.08547, + "d_hat": -0.08547, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.1000000000000005 + ], + "channel_base": [ + 2.5, + 4.1000000000000005 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C01_gf180_sW1_sL2", + "mode": "combined", + "A0": 256.0896, + "A_true": 227.3536, + "A_hat": 227.3536, + "d_true": -0.11221, + "d_hat": -0.11221, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.1000000000000005 + ], + "channel_base": [ + 2.5, + 4.1000000000000005 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C01_gf180_sW2_sL1.5", + "mode": "diffusion_only", + "A0": 381.888, + "A_true": 374.4, + "A_hat": 374.4, + "d_true": -0.01961, + "d_hat": -0.01961, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.1000000000000005 + ], + "channel_base": [ + 2.5, + 4.1000000000000005 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C01_gf180_sW2_sL1.5", + "mode": "gate_only", + "A0": 381.888, + "A_true": 349.248, + "A_hat": 349.248, + "d_true": -0.08547, + "d_hat": -0.08547, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.1000000000000005 + ], + "channel_base": [ + 2.5, + 4.1000000000000005 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C01_gf180_sW2_sL1.5", + "mode": "combined", + "A0": 381.888, + "A_true": 342.4, + "A_hat": 342.4, + "d_true": -0.1034, + "d_hat": -0.1034, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.1000000000000005 + ], + "channel_base": [ + 2.5, + 4.1000000000000005 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C01_gf180_sW2_sL1", + "mode": "diffusion_only", + "A0": 298.0224, + "A_true": 290.5344, + "A_hat": 290.5344, + "d_true": -0.02513, + "d_hat": -0.02513, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.1000000000000005 + ], + "channel_base": [ + 2.5, + 4.1000000000000005 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C01_gf180_sW2_sL1", + "mode": "gate_only", + "A0": 298.0224, + "A_true": 272.5504, + "A_hat": 272.5504, + "d_true": -0.08547, + "d_hat": -0.08547, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.1000000000000005 + ], + "channel_base": [ + 2.5, + 4.1000000000000005 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C01_gf180_sW2_sL1", + "mode": "combined", + "A0": 298.0224, + "A_true": 265.7024, + "A_hat": 265.7024, + "d_true": -0.10845, + "d_hat": -0.10845, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.1000000000000005 + ], + "channel_base": [ + 2.5, + 4.1000000000000005 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C01_gf180_sW2_sL2", + "mode": "diffusion_only", + "A0": 465.7536, + "A_true": 458.2656, + "A_hat": 458.2656, + "d_true": -0.01608, + "d_hat": -0.01608, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.1000000000000005 + ], + "channel_base": [ + 2.5, + 4.1000000000000005 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C01_gf180_sW2_sL2", + "mode": "gate_only", + "A0": 465.7536, + "A_true": 425.9456, + "A_hat": 425.9456, + "d_true": -0.08547, + "d_hat": -0.08547, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.1000000000000005 + ], + "channel_base": [ + 2.5, + 4.1000000000000005 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C01_gf180_sW2_sL2", + "mode": "combined", + "A0": 465.7536, + "A_true": 419.0976, + "A_hat": 419.0976, + "d_true": -0.10017, + "d_hat": -0.10017, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.1000000000000005 + ], + "channel_base": [ + 2.5, + 4.1000000000000005 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C01_ihp130_sW0.5_sL1.5", + "mode": "diffusion_only", + "A0": 76.2318, + "A_true": 72.7434, + "A_hat": 72.7434, + "d_true": -0.04576, + "d_hat": -0.04576, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.7199999999999998, + 2.9 + ], + "channel_base": [ + 1.7199999999999998, + 2.9 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C01_ihp130_sW0.5_sL1.5", + "mode": "gate_only", + "A0": 76.2318, + "A_true": 70.5478, + "A_hat": 70.5478, + "d_true": -0.07456, + "d_hat": -0.07456, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.7199999999999998, + 2.9 + ], + "channel_base": [ + 1.7199999999999998, + 2.9 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C01_ihp130_sW0.5_sL1.5", + "mode": "combined", + "A0": 76.2318, + "A_true": 67.3195, + "A_hat": 67.3195, + "d_true": -0.11691, + "d_hat": -0.11691, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.7199999999999998, + 2.9 + ], + "channel_base": [ + 1.7199999999999998, + 2.9 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C01_ihp130_sW0.5_sL1", + "mode": "diffusion_only", + "A0": 62.0046, + "A_true": 58.5162, + "A_hat": 58.5162, + "d_true": -0.05626, + "d_hat": -0.05626, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.7199999999999998, + 2.9 + ], + "channel_base": [ + 1.7199999999999998, + 2.9 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C01_ihp130_sW0.5_sL1", + "mode": "gate_only", + "A0": 62.0046, + "A_true": 57.3815, + "A_hat": 57.3815, + "d_true": -0.07456, + "d_hat": -0.07456, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.7199999999999998, + 2.9 + ], + "channel_base": [ + 1.7199999999999998, + 2.9 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C01_ihp130_sW0.5_sL1", + "mode": "combined", + "A0": 62.0046, + "A_true": 54.1531, + "A_hat": 54.1531, + "d_true": -0.12663, + "d_hat": -0.12663, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.7199999999999998, + 2.9 + ], + "channel_base": [ + 1.7199999999999998, + 2.9 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C01_ihp130_sW0.5_sL2", + "mode": "diffusion_only", + "A0": 90.459, + "A_true": 86.9706, + "A_hat": 86.9706, + "d_true": -0.03856, + "d_hat": -0.03856, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.7199999999999998, + 2.9 + ], + "channel_base": [ + 1.7199999999999998, + 2.9 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C01_ihp130_sW0.5_sL2", + "mode": "gate_only", + "A0": 90.459, + "A_true": 83.7142, + "A_hat": 83.7142, + "d_true": -0.07456, + "d_hat": -0.07456, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.7199999999999998, + 2.9 + ], + "channel_base": [ + 1.7199999999999998, + 2.9 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C01_ihp130_sW0.5_sL2", + "mode": "combined", + "A0": 90.459, + "A_true": 80.486, + "A_hat": 80.486, + "d_true": -0.11025, + "d_hat": -0.11025, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.7199999999999998, + 2.9 + ], + "channel_base": [ + 1.7199999999999998, + 2.9 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C01_ihp130_sW1.5_sL2", + "mode": "diffusion_only", + "A0": 225.0702, + "A_true": 221.5818, + "A_hat": 221.5818, + "d_true": -0.0155, + "d_hat": -0.0155, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.7199999999999998, + 2.9 + ], + "channel_base": [ + 1.7199999999999998, + 2.9 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C01_ihp130_sW1.5_sL2", + "mode": "gate_only", + "A0": 225.0702, + "A_true": 208.2887, + "A_hat": 208.2887, + "d_true": -0.07456, + "d_hat": -0.07456, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.7199999999999998, + 2.9 + ], + "channel_base": [ + 1.7199999999999998, + 2.9 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C01_ihp130_sW1.5_sL2", + "mode": "combined", + "A0": 225.0702, + "A_true": 205.0604, + "A_hat": 205.0604, + "d_true": -0.0889, + "d_hat": -0.0889, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.7199999999999998, + 2.9 + ], + "channel_base": [ + 1.7199999999999998, + 2.9 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C01_ihp130_sW1_sL2", + "mode": "diffusion_only", + "A0": 157.7646, + "A_true": 154.2762, + "A_hat": 154.2762, + "d_true": -0.02211, + "d_hat": -0.02211, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.7199999999999998, + 2.9 + ], + "channel_base": [ + 1.7199999999999998, + 2.9 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C01_ihp130_sW1_sL2", + "mode": "gate_only", + "A0": 157.7646, + "A_true": 146.0014, + "A_hat": 146.0015, + "d_true": -0.07456, + "d_hat": -0.07456, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.7199999999999998, + 2.9 + ], + "channel_base": [ + 1.7199999999999998, + 2.9 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C01_ihp130_sW1_sL2", + "mode": "combined", + "A0": 157.7646, + "A_true": 142.7731, + "A_hat": 142.7732, + "d_true": -0.09502, + "d_hat": -0.09502, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.7199999999999998, + 2.9 + ], + "channel_base": [ + 1.7199999999999998, + 2.9 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C01_ihp130_sW2_sL2", + "mode": "diffusion_only", + "A0": 292.3758, + "A_true": 288.8874, + "A_hat": 288.8874, + "d_true": -0.01193, + "d_hat": -0.01193, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.7199999999999998, + 2.9 + ], + "channel_base": [ + 1.7199999999999998, + 2.9 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C01_ihp130_sW2_sL2", + "mode": "gate_only", + "A0": 292.3758, + "A_true": 270.5759, + "A_hat": 270.5759, + "d_true": -0.07456, + "d_hat": -0.07456, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.7199999999999998, + 2.9 + ], + "channel_base": [ + 1.7199999999999998, + 2.9 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C01_ihp130_sW2_sL2", + "mode": "combined", + "A0": 292.3758, + "A_true": 267.3476, + "A_hat": 267.3475, + "d_true": -0.0856, + "d_hat": -0.0856, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.7199999999999998, + 2.9 + ], + "channel_base": [ + 1.7199999999999998, + 2.9 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C01_sky130_sW0.5_sL1.5", + "mode": "diffusion_only", + "A0": 61.3363, + "A_true": 57.3631, + "A_hat": 57.3631, + "d_true": -0.06478, + "d_hat": -0.06478, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 3.1 + ], + "channel_base": [ + 1.88, + 3.1 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C01_sky130_sW0.5_sL1.5", + "mode": "gate_only", + "A0": 61.3363, + "A_true": 56.668, + "A_hat": 56.668, + "d_true": -0.07611, + "d_hat": -0.07611, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 3.1 + ], + "channel_base": [ + 1.88, + 3.1 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C01_sky130_sW0.5_sL1.5", + "mode": "combined", + "A0": 61.3363, + "A_true": 52.9972, + "A_hat": 52.9972, + "d_true": -0.13596, + "d_hat": -0.13596, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 3.1 + ], + "channel_base": [ + 1.88, + 3.1 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C01_sky130_sW0.5_sL1", + "mode": "diffusion_only", + "A0": 52.8223, + "A_true": 48.8491, + "A_hat": 48.8491, + "d_true": -0.07522, + "d_hat": -0.07522, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 3.1 + ], + "channel_base": [ + 1.88, + 3.1 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C01_sky130_sW0.5_sL1", + "mode": "gate_only", + "A0": 52.8223, + "A_true": 48.802, + "A_hat": 48.802, + "d_true": -0.07611, + "d_hat": -0.07611, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 3.1 + ], + "channel_base": [ + 1.88, + 3.1 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C01_sky130_sW0.5_sL1", + "mode": "combined", + "A0": 52.8223, + "A_true": 45.1312, + "A_hat": 45.1312, + "d_true": -0.1456, + "d_hat": -0.1456, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 3.1 + ], + "channel_base": [ + 1.88, + 3.1 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C01_sky130_sW0.5_sL2", + "mode": "diffusion_only", + "A0": 69.8503, + "A_true": 65.8771, + "A_hat": 65.8771, + "d_true": -0.05688, + "d_hat": -0.05688, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 3.1 + ], + "channel_base": [ + 1.88, + 3.1 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C01_sky130_sW0.5_sL2", + "mode": "gate_only", + "A0": 69.8503, + "A_true": 64.534, + "A_hat": 64.534, + "d_true": -0.07611, + "d_hat": -0.07611, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 3.1 + ], + "channel_base": [ + 1.88, + 3.1 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C01_sky130_sW0.5_sL2", + "mode": "combined", + "A0": 69.8503, + "A_true": 60.8632, + "A_hat": 60.8632, + "d_true": -0.12866, + "d_hat": -0.12866, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 3.1 + ], + "channel_base": [ + 1.88, + 3.1 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C01_sky130_sW1.5_sL1.5", + "mode": "diffusion_only", + "A0": 128.8807, + "A_true": 124.9075, + "A_hat": 124.9075, + "d_true": -0.03083, + "d_hat": -0.03083, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 3.1 + ], + "channel_base": [ + 1.88, + 3.1 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C01_sky130_sW1.5_sL1.5", + "mode": "gate_only", + "A0": 128.8807, + "A_true": 119.0716, + "A_hat": 119.0716, + "d_true": -0.07611, + "d_hat": -0.07611, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 3.1 + ], + "channel_base": [ + 1.88, + 3.1 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C01_sky130_sW1.5_sL1.5", + "mode": "combined", + "A0": 128.8807, + "A_true": 115.4008, + "A_hat": 115.4008, + "d_true": -0.10459, + "d_hat": -0.10459, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 3.1 + ], + "channel_base": [ + 1.88, + 3.1 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C01_sky130_sW1.5_sL1", + "mode": "diffusion_only", + "A0": 103.3387, + "A_true": 99.3655, + "A_hat": 99.3655, + "d_true": -0.03845, + "d_hat": -0.03845, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 3.1 + ], + "channel_base": [ + 1.88, + 3.1 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C01_sky130_sW1.5_sL1", + "mode": "gate_only", + "A0": 103.3387, + "A_true": 95.4736, + "A_hat": 95.4736, + "d_true": -0.07611, + "d_hat": -0.07611, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 3.1 + ], + "channel_base": [ + 1.88, + 3.1 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C01_sky130_sW1.5_sL1", + "mode": "combined", + "A0": 103.3387, + "A_true": 91.8028, + "A_hat": 91.8028, + "d_true": -0.11163, + "d_hat": -0.11163, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 3.1 + ], + "channel_base": [ + 1.88, + 3.1 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C01_sky130_sW1.5_sL2", + "mode": "diffusion_only", + "A0": 154.4227, + "A_true": 150.4495, + "A_hat": 150.4495, + "d_true": -0.02573, + "d_hat": -0.02573, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 3.1 + ], + "channel_base": [ + 1.88, + 3.1 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C01_sky130_sW1.5_sL2", + "mode": "gate_only", + "A0": 154.4227, + "A_true": 142.6696, + "A_hat": 142.6696, + "d_true": -0.07611, + "d_hat": -0.07611, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 3.1 + ], + "channel_base": [ + 1.88, + 3.1 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C01_sky130_sW1.5_sL2", + "mode": "combined", + "A0": 154.4227, + "A_true": 138.9988, + "A_hat": 138.9988, + "d_true": -0.09988, + "d_hat": -0.09988, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 3.1 + ], + "channel_base": [ + 1.88, + 3.1 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C01_sky130_sW1_sL2", + "mode": "diffusion_only", + "A0": 112.1365, + "A_true": 108.1633, + "A_hat": 108.1633, + "d_true": -0.03543, + "d_hat": -0.03543, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 3.1 + ], + "channel_base": [ + 1.88, + 3.1 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C01_sky130_sW1_sL2", + "mode": "gate_only", + "A0": 112.1365, + "A_true": 103.6018, + "A_hat": 103.6018, + "d_true": -0.07611, + "d_hat": -0.07611, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 3.1 + ], + "channel_base": [ + 1.88, + 3.1 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C01_sky130_sW1_sL2", + "mode": "combined", + "A0": 112.1365, + "A_true": 99.931, + "A_hat": 99.931, + "d_true": -0.10885, + "d_hat": -0.10885, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 3.1 + ], + "channel_base": [ + 1.88, + 3.1 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C01_sky130_sW2_sL1.5", + "mode": "diffusion_only", + "A0": 162.6529, + "A_true": 158.6797, + "A_hat": 158.6797, + "d_true": -0.02443, + "d_hat": -0.02443, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 3.1 + ], + "channel_base": [ + 1.88, + 3.1 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C01_sky130_sW2_sL1.5", + "mode": "gate_only", + "A0": 162.6529, + "A_true": 150.2734, + "A_hat": 150.2734, + "d_true": -0.07611, + "d_hat": -0.07611, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 3.1 + ], + "channel_base": [ + 1.88, + 3.1 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C01_sky130_sW2_sL1.5", + "mode": "combined", + "A0": 162.6529, + "A_true": 146.6026, + "A_hat": 146.6026, + "d_true": -0.09868, + "d_hat": -0.09868, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 3.1 + ], + "channel_base": [ + 1.88, + 3.1 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C01_sky130_sW2_sL1", + "mode": "diffusion_only", + "A0": 128.5969, + "A_true": 124.6237, + "A_hat": 124.6237, + "d_true": -0.0309, + "d_hat": -0.0309, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 3.1 + ], + "channel_base": [ + 1.88, + 3.1 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C01_sky130_sW2_sL1", + "mode": "gate_only", + "A0": 128.5969, + "A_true": 118.8094, + "A_hat": 118.8094, + "d_true": -0.07611, + "d_hat": -0.07611, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 3.1 + ], + "channel_base": [ + 1.88, + 3.1 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C01_sky130_sW2_sL1", + "mode": "combined", + "A0": 128.5969, + "A_true": 115.1386, + "A_hat": 115.1386, + "d_true": -0.10465, + "d_hat": -0.10465, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 3.1 + ], + "channel_base": [ + 1.88, + 3.1 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C01_sky130_sW2_sL2", + "mode": "diffusion_only", + "A0": 196.7089, + "A_true": 192.7357, + "A_hat": 192.7357, + "d_true": -0.0202, + "d_hat": -0.0202, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 3.1 + ], + "channel_base": [ + 1.88, + 3.1 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C01_sky130_sW2_sL2", + "mode": "gate_only", + "A0": 196.7089, + "A_true": 181.7374, + "A_hat": 181.7374, + "d_true": -0.07611, + "d_hat": -0.07611, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 3.1 + ], + "channel_base": [ + 1.88, + 3.1 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C01_sky130_sW2_sL2", + "mode": "combined", + "A0": 196.7089, + "A_true": 178.0666, + "A_hat": 178.0666, + "d_true": -0.09477, + "d_hat": -0.09477, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 3.1 + ], + "channel_base": [ + 1.88, + 3.1 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C02_gf180_sW0.5_sL1.5", + "mode": "diffusion_only", + "A0": 218.2656, + "A_true": 208.8576, + "A_hat": 208.8576, + "d_true": -0.0431, + "d_hat": -0.0431, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 3.3, + 5.7 + ], + "channel_base": [ + 3.3, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C02_gf180_sW0.5_sL1.5", + "mode": "gate_only", + "A0": 218.2656, + "A_true": 187.4224, + "A_hat": 213.2676, + "d_true": -0.14131, + "d_hat": -0.0229, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.9 + ], + "channel_base": [ + 3.3, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.8, + 0.0 + ] + }, + { + "case": "C02_gf180_sW0.5_sL1.5", + "mode": "combined", + "A0": 218.2656, + "A_true": 179.3264, + "A_hat": 204.5316, + "d_true": -0.1784, + "d_hat": -0.06292, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.9 + ], + "channel_base": [ + 3.3, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.8, + 0.0 + ] + }, + { + "case": "C02_gf180_sW0.5_sL1", + "mode": "diffusion_only", + "A0": 191.9232, + "A_true": 182.5152, + "A_hat": 182.5152, + "d_true": -0.04902, + "d_hat": -0.04902, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 3.3, + 5.7 + ], + "channel_base": [ + 3.3, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C02_gf180_sW0.5_sL1", + "mode": "gate_only", + "A0": 191.9232, + "A_true": 164.7536, + "A_hat": 188.8068, + "d_true": -0.14156, + "d_hat": -0.01624, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.9 + ], + "channel_base": [ + 3.3, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.8, + 0.0 + ] + }, + { + "case": "C02_gf180_sW0.5_sL1", + "mode": "combined", + "A0": 191.9232, + "A_true": 156.6576, + "A_hat": 180.0708, + "d_true": -0.18375, + "d_hat": -0.06176, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.9 + ], + "channel_base": [ + 3.3, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.8, + 0.0 + ] + }, + { + "case": "C02_gf180_sW0.5_sL2", + "mode": "diffusion_only", + "A0": 244.608, + "A_true": 235.2, + "A_hat": 235.2, + "d_true": -0.03846, + "d_hat": -0.03846, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 3.3, + 5.7 + ], + "channel_base": [ + 3.3, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C02_gf180_sW0.5_sL2", + "mode": "gate_only", + "A0": 244.608, + "A_true": 210.0912, + "A_hat": 237.7284, + "d_true": -0.14111, + "d_hat": -0.02813, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.9 + ], + "channel_base": [ + 3.3, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.8, + 0.0 + ] + }, + { + "case": "C02_gf180_sW0.5_sL2", + "mode": "combined", + "A0": 244.608, + "A_true": 201.9952, + "A_hat": 228.9924, + "d_true": -0.17421, + "d_hat": -0.06384, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.9 + ], + "channel_base": [ + 3.3, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.8, + 0.0 + ] + }, + { + "case": "C02_gf180_sW1.5_sL1.5", + "mode": "diffusion_only", + "A0": 481.6896, + "A_true": 472.2816, + "A_hat": 472.2816, + "d_true": -0.01953, + "d_hat": -0.01953, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 3.3, + 5.7 + ], + "channel_base": [ + 3.3, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C02_gf180_sW1.5_sL1.5", + "mode": "gate_only", + "A0": 481.6896, + "A_true": 414.1104, + "A_hat": 457.8756, + "d_true": -0.1403, + "d_hat": -0.04944, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.9 + ], + "channel_base": [ + 3.3, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.8, + 0.0 + ] + }, + { + "case": "C02_gf180_sW1.5_sL1.5", + "mode": "combined", + "A0": 481.6896, + "A_true": 406.0144, + "A_hat": 449.1396, + "d_true": -0.1571, + "d_hat": -0.06757, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.9 + ], + "channel_base": [ + 3.3, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.8, + 0.0 + ] + }, + { + "case": "C02_gf180_sW1.5_sL1", + "mode": "diffusion_only", + "A0": 402.6624, + "A_true": 393.2544, + "A_hat": 393.2544, + "d_true": -0.02336, + "d_hat": -0.02336, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 3.3, + 5.7 + ], + "channel_base": [ + 3.3, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C02_gf180_sW1.5_sL1", + "mode": "gate_only", + "A0": 402.6624, + "A_true": 346.104, + "A_hat": 384.4932, + "d_true": -0.14046, + "d_hat": -0.04512, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.9 + ], + "channel_base": [ + 3.3, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.8, + 0.0 + ] + }, + { + "case": "C02_gf180_sW1.5_sL1", + "mode": "combined", + "A0": 402.6624, + "A_true": 338.008, + "A_hat": 375.7572, + "d_true": -0.16057, + "d_hat": -0.06682, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.9 + ], + "channel_base": [ + 3.3, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.8, + 0.0 + ] + }, + { + "case": "C02_gf180_sW1.5_sL2", + "mode": "diffusion_only", + "A0": 560.7168, + "A_true": 551.3088, + "A_hat": 551.3088, + "d_true": -0.01678, + "d_hat": -0.01678, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 3.3, + 5.7 + ], + "channel_base": [ + 3.3, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C02_gf180_sW1.5_sL2", + "mode": "gate_only", + "A0": 560.7168, + "A_true": 482.1168, + "A_hat": 531.258, + "d_true": -0.14018, + "d_hat": -0.05254, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.9 + ], + "channel_base": [ + 3.3, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.8, + 0.0 + ] + }, + { + "case": "C02_gf180_sW1.5_sL2", + "mode": "combined", + "A0": 560.7168, + "A_true": 474.0208, + "A_hat": 522.522, + "d_true": -0.15462, + "d_hat": -0.06812, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.9 + ], + "channel_base": [ + 3.3, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.8, + 0.0 + ] + }, + { + "case": "C02_gf180_sW1_sL2", + "mode": "diffusion_only", + "A0": 402.6624, + "A_true": 393.2544, + "A_hat": 393.2544, + "d_true": -0.02336, + "d_hat": -0.02336, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 3.3, + 5.7 + ], + "channel_base": [ + 3.3, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C02_gf180_sW1_sL2", + "mode": "gate_only", + "A0": 402.6624, + "A_true": 346.104, + "A_hat": 384.4932, + "d_true": -0.14046, + "d_hat": -0.04512, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.9 + ], + "channel_base": [ + 3.3, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.8, + 0.0 + ] + }, + { + "case": "C02_gf180_sW1_sL2", + "mode": "combined", + "A0": 402.6624, + "A_true": 338.008, + "A_hat": 375.7572, + "d_true": -0.16057, + "d_hat": -0.06682, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.9 + ], + "channel_base": [ + 3.3, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.8, + 0.0 + ] + }, + { + "case": "C02_gf180_sW2_sL1.5", + "mode": "diffusion_only", + "A0": 613.4016, + "A_true": 603.9936, + "A_hat": 603.9936, + "d_true": -0.01534, + "d_hat": -0.01534, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 3.3, + 5.7 + ], + "channel_base": [ + 3.3, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C02_gf180_sW2_sL1.5", + "mode": "gate_only", + "A0": 613.4016, + "A_true": 527.4544, + "A_hat": 580.1796, + "d_true": -0.14012, + "d_hat": -0.05416, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.9 + ], + "channel_base": [ + 3.3, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.8, + 0.0 + ] + }, + { + "case": "C02_gf180_sW2_sL1.5", + "mode": "combined", + "A0": 613.4016, + "A_true": 519.3584, + "A_hat": 571.4436, + "d_true": -0.15331, + "d_hat": -0.0684, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.9 + ], + "channel_base": [ + 3.3, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.8, + 0.0 + ] + }, + { + "case": "C02_gf180_sW2_sL1", + "mode": "diffusion_only", + "A0": 508.032, + "A_true": 498.624, + "A_hat": 498.624, + "d_true": -0.01852, + "d_hat": -0.01852, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 3.3, + 5.7 + ], + "channel_base": [ + 3.3, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C02_gf180_sW2_sL1", + "mode": "gate_only", + "A0": 508.032, + "A_true": 436.7792, + "A_hat": 482.3364, + "d_true": -0.14025, + "d_hat": -0.05058, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.9 + ], + "channel_base": [ + 3.3, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.8, + 0.0 + ] + }, + { + "case": "C02_gf180_sW2_sL1", + "mode": "combined", + "A0": 508.032, + "A_true": 428.6832, + "A_hat": 473.6004, + "d_true": -0.15619, + "d_hat": -0.06777, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.9 + ], + "channel_base": [ + 3.3, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.8, + 0.0 + ] + }, + { + "case": "C02_gf180_sW2_sL2", + "mode": "diffusion_only", + "A0": 718.7712, + "A_true": 709.3632, + "A_hat": 709.3632, + "d_true": -0.01309, + "d_hat": -0.01309, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 3.3, + 5.7 + ], + "channel_base": [ + 3.3, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C02_gf180_sW2_sL2", + "mode": "gate_only", + "A0": 718.7712, + "A_true": 618.1296, + "A_hat": 678.0228, + "d_true": -0.14002, + "d_hat": -0.05669, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.9 + ], + "channel_base": [ + 3.3, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.8, + 0.0 + ] + }, + { + "case": "C02_gf180_sW2_sL2", + "mode": "combined", + "A0": 718.7712, + "A_true": 610.0336, + "A_hat": 669.2868, + "d_true": -0.15128, + "d_hat": -0.06885, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.9 + ], + "channel_base": [ + 3.3, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.8, + 0.0 + ] + }, + { + "case": "C02_ihp130_sW0.5_sL1.5", + "mode": "diffusion_only", + "A0": 122.1329, + "A_true": 117.7418, + "A_hat": 117.7417, + "d_true": -0.03595, + "d_hat": -0.03595, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.3099999999999996, + 4.08 + ], + "channel_base": [ + 2.3099999999999996, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C02_ihp130_sW0.5_sL1.5", + "mode": "gate_only", + "A0": 122.1329, + "A_true": 104.7404, + "A_hat": 117.56, + "d_true": -0.14241, + "d_hat": -0.03744, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.84 + ], + "channel_true": [ + 1.7199999999999998, + 3.4899999999999998 + ], + "channel_base": [ + 2.3099999999999996, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.59, + 0.0 + ] + }, + { + "case": "C02_ihp130_sW0.5_sL1.5", + "mode": "combined", + "A0": 122.1329, + "A_true": 100.9613, + "A_hat": 113.48, + "d_true": -0.17335, + "d_hat": -0.07085, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.84 + ], + "channel_true": [ + 1.7199999999999998, + 3.4899999999999998 + ], + "channel_base": [ + 2.3099999999999996, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.59, + 0.0 + ] + }, + { + "case": "C02_ihp130_sW0.5_sL1", + "mode": "diffusion_only", + "A0": 104.2241, + "A_true": 99.833, + "A_hat": 99.8329, + "d_true": -0.04213, + "d_hat": -0.04213, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.3099999999999996, + 4.08 + ], + "channel_base": [ + 2.3099999999999996, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C02_ihp130_sW0.5_sL1", + "mode": "gate_only", + "A0": 104.2241, + "A_true": 89.3276, + "A_hat": 100.92, + "d_true": -0.14293, + "d_hat": -0.0317, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.84 + ], + "channel_true": [ + 1.7199999999999998, + 3.4899999999999998 + ], + "channel_base": [ + 2.3099999999999996, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.59, + 0.0 + ] + }, + { + "case": "C02_ihp130_sW0.5_sL1", + "mode": "combined", + "A0": 104.2241, + "A_true": 85.5485, + "A_hat": 96.84, + "d_true": -0.17919, + "d_hat": -0.07085, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.84 + ], + "channel_true": [ + 1.7199999999999998, + 3.4899999999999998 + ], + "channel_base": [ + 2.3099999999999996, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.59, + 0.0 + ] + }, + { + "case": "C02_ihp130_sW0.5_sL2", + "mode": "diffusion_only", + "A0": 140.0417, + "A_true": 135.6506, + "A_hat": 135.6506, + "d_true": -0.03136, + "d_hat": -0.03136, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.3099999999999996, + 4.08 + ], + "channel_base": [ + 2.3099999999999996, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C02_ihp130_sW0.5_sL2", + "mode": "gate_only", + "A0": 140.0417, + "A_true": 120.1531, + "A_hat": 134.2, + "d_true": -0.14202, + "d_hat": -0.04171, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.84 + ], + "channel_true": [ + 1.7199999999999998, + 3.4899999999999998 + ], + "channel_base": [ + 2.3099999999999996, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.59, + 0.0 + ] + }, + { + "case": "C02_ihp130_sW0.5_sL2", + "mode": "combined", + "A0": 140.0417, + "A_true": 116.374, + "A_hat": 130.12, + "d_true": -0.169, + "d_hat": -0.07085, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.84 + ], + "channel_true": [ + 1.7199999999999998, + 3.4899999999999998 + ], + "channel_base": [ + 2.3099999999999996, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.59, + 0.0 + ] + }, + { + "case": "C02_ihp130_sW1.5_sL1.5", + "mode": "diffusion_only", + "A0": 281.9345, + "A_true": 277.5434, + "A_hat": 277.5433, + "d_true": -0.01557, + "d_hat": -0.01558, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.3099999999999996, + 4.08 + ], + "channel_base": [ + 2.3099999999999996, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C02_ihp130_sW1.5_sL1.5", + "mode": "gate_only", + "A0": 281.9345, + "A_true": 242.2699, + "A_hat": 266.04, + "d_true": -0.14069, + "d_hat": -0.05638, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.84 + ], + "channel_true": [ + 1.7199999999999998, + 3.4899999999999998 + ], + "channel_base": [ + 2.3099999999999996, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.59, + 0.0 + ] + }, + { + "case": "C02_ihp130_sW1.5_sL1.5", + "mode": "combined", + "A0": 281.9345, + "A_true": 238.4908, + "A_hat": 261.96, + "d_true": -0.15409, + "d_hat": -0.07085, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.84 + ], + "channel_true": [ + 1.7199999999999998, + 3.4899999999999998 + ], + "channel_base": [ + 2.3099999999999996, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.59, + 0.0 + ] + }, + { + "case": "C02_ihp130_sW1.5_sL1", + "mode": "diffusion_only", + "A0": 228.2081, + "A_true": 223.817, + "A_hat": 223.8169, + "d_true": -0.01924, + "d_hat": -0.01924, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.3099999999999996, + 4.08 + ], + "channel_base": [ + 2.3099999999999996, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C02_ihp130_sW1.5_sL1", + "mode": "gate_only", + "A0": 228.2081, + "A_true": 196.0315, + "A_hat": 216.12, + "d_true": -0.141, + "d_hat": -0.05297, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.84 + ], + "channel_true": [ + 1.7199999999999998, + 3.4899999999999998 + ], + "channel_base": [ + 2.3099999999999996, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.59, + 0.0 + ] + }, + { + "case": "C02_ihp130_sW1.5_sL1", + "mode": "combined", + "A0": 228.2081, + "A_true": 192.2525, + "A_hat": 212.04, + "d_true": -0.15756, + "d_hat": -0.07085, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.84 + ], + "channel_true": [ + 1.7199999999999998, + 3.4899999999999998 + ], + "channel_base": [ + 2.3099999999999996, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.59, + 0.0 + ] + }, + { + "case": "C02_ihp130_sW1.5_sL2", + "mode": "diffusion_only", + "A0": 335.6609, + "A_true": 331.2698, + "A_hat": 331.2697, + "d_true": -0.01308, + "d_hat": -0.01308, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.3099999999999996, + 4.08 + ], + "channel_base": [ + 2.3099999999999996, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C02_ihp130_sW1.5_sL2", + "mode": "gate_only", + "A0": 335.6609, + "A_true": 288.5083, + "A_hat": 315.96, + "d_true": -0.14048, + "d_hat": -0.05869, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.84 + ], + "channel_true": [ + 1.7199999999999998, + 3.4899999999999998 + ], + "channel_base": [ + 2.3099999999999996, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.59, + 0.0 + ] + }, + { + "case": "C02_ihp130_sW1.5_sL2", + "mode": "combined", + "A0": 335.6609, + "A_true": 284.7292, + "A_hat": 311.88, + "d_true": -0.15174, + "d_hat": -0.07085, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.84 + ], + "channel_true": [ + 1.7199999999999998, + 3.4899999999999998 + ], + "channel_base": [ + 2.3099999999999996, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.59, + 0.0 + ] + }, + { + "case": "C02_ihp130_sW1_sL2", + "mode": "diffusion_only", + "A0": 237.8513, + "A_true": 233.4602, + "A_hat": 233.4601, + "d_true": -0.01846, + "d_hat": -0.01846, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.3099999999999996, + 4.08 + ], + "channel_base": [ + 2.3099999999999996, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C02_ihp130_sW1_sL2", + "mode": "gate_only", + "A0": 237.8513, + "A_true": 204.3307, + "A_hat": 225.08, + "d_true": -0.14093, + "d_hat": -0.05369, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.84 + ], + "channel_true": [ + 1.7199999999999998, + 3.4899999999999998 + ], + "channel_base": [ + 2.3099999999999996, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.59, + 0.0 + ] + }, + { + "case": "C02_ihp130_sW1_sL2", + "mode": "combined", + "A0": 237.8513, + "A_true": 200.5516, + "A_hat": 221.0, + "d_true": -0.15682, + "d_hat": -0.07085, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.84 + ], + "channel_true": [ + 1.7199999999999998, + 3.4899999999999998 + ], + "channel_base": [ + 2.3099999999999996, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.59, + 0.0 + ] + }, + { + "case": "C02_ihp130_sW2_sL1.5", + "mode": "diffusion_only", + "A0": 361.8353, + "A_true": 357.4442, + "A_hat": 357.4441, + "d_true": -0.01214, + "d_hat": -0.01214, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.3099999999999996, + 4.08 + ], + "channel_base": [ + 2.3099999999999996, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C02_ihp130_sW2_sL1.5", + "mode": "gate_only", + "A0": 361.8353, + "A_true": 311.0348, + "A_hat": 340.28, + "d_true": -0.1404, + "d_hat": -0.05957, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.84 + ], + "channel_true": [ + 1.7199999999999998, + 3.4899999999999998 + ], + "channel_base": [ + 2.3099999999999996, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.59, + 0.0 + ] + }, + { + "case": "C02_ihp130_sW2_sL1.5", + "mode": "combined", + "A0": 361.8353, + "A_true": 307.2557, + "A_hat": 336.2, + "d_true": -0.15084, + "d_hat": -0.07085, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.84 + ], + "channel_true": [ + 1.7199999999999998, + 3.4899999999999998 + ], + "channel_base": [ + 2.3099999999999996, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.59, + 0.0 + ] + }, + { + "case": "C02_ihp130_sW2_sL1", + "mode": "diffusion_only", + "A0": 290.2001, + "A_true": 285.809, + "A_hat": 285.8089, + "d_true": -0.01513, + "d_hat": -0.01513, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.3099999999999996, + 4.08 + ], + "channel_base": [ + 2.3099999999999996, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C02_ihp130_sW2_sL1", + "mode": "gate_only", + "A0": 290.2001, + "A_true": 249.3836, + "A_hat": 273.72, + "d_true": -0.14065, + "d_hat": -0.05679, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.84 + ], + "channel_true": [ + 1.7199999999999998, + 3.4899999999999998 + ], + "channel_base": [ + 2.3099999999999996, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.59, + 0.0 + ] + }, + { + "case": "C02_ihp130_sW2_sL1", + "mode": "combined", + "A0": 290.2001, + "A_true": 245.6044, + "A_hat": 269.64, + "d_true": -0.15367, + "d_hat": -0.07085, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.84 + ], + "channel_true": [ + 1.7199999999999998, + 3.4899999999999998 + ], + "channel_base": [ + 2.3099999999999996, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.59, + 0.0 + ] + }, + { + "case": "C02_ihp130_sW2_sL2", + "mode": "diffusion_only", + "A0": 433.4705, + "A_true": 429.0794, + "A_hat": 429.0793, + "d_true": -0.01013, + "d_hat": -0.01013, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.3099999999999996, + 4.08 + ], + "channel_base": [ + 2.3099999999999996, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C02_ihp130_sW2_sL2", + "mode": "gate_only", + "A0": 433.4705, + "A_true": 372.686, + "A_hat": 406.84, + "d_true": -0.14023, + "d_hat": -0.06144, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.84 + ], + "channel_true": [ + 1.7199999999999998, + 3.4899999999999998 + ], + "channel_base": [ + 2.3099999999999996, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.59, + 0.0 + ] + }, + { + "case": "C02_ihp130_sW2_sL2", + "mode": "combined", + "A0": 433.4705, + "A_true": 368.9068, + "A_hat": 402.76, + "d_true": -0.14895, + "d_hat": -0.07085, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.84 + ], + "channel_true": [ + 1.7199999999999998, + 3.4899999999999998 + ], + "channel_base": [ + 2.3099999999999996, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.59, + 0.0 + ] + }, + { + "case": "C02_sky130_sW0.5_sL1.5", + "mode": "diffusion_only", + "A0": 102.5929, + "A_true": 97.5949, + "A_hat": 97.5949, + "d_true": -0.04872, + "d_hat": -0.04872, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.49, + 4.32 + ], + "channel_base": [ + 2.49, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C02_sky130_sW0.5_sL1.5", + "mode": "gate_only", + "A0": 102.5929, + "A_true": 88.295, + "A_hat": 100.9328, + "d_true": -0.13937, + "d_hat": -0.01618, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 3.71 + ], + "channel_base": [ + 2.49, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.61, + 0.0 + ] + }, + { + "case": "C02_sky130_sW0.5_sL1.5", + "mode": "combined", + "A0": 102.5929, + "A_true": 83.9634, + "A_hat": 96.2596, + "d_true": -0.18159, + "d_hat": -0.06173, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 3.71 + ], + "channel_base": [ + 2.49, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.61, + 0.0 + ] + }, + { + "case": "C02_sky130_sW0.5_sL1", + "mode": "diffusion_only", + "A0": 91.8829, + "A_true": 86.8849, + "A_hat": 86.8849, + "d_true": -0.0544, + "d_hat": -0.0544, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.49, + 4.32 + ], + "channel_base": [ + 2.49, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C02_sky130_sW0.5_sL1", + "mode": "gate_only", + "A0": 91.8829, + "A_true": 79.013, + "A_hat": 90.9188, + "d_true": -0.14007, + "d_hat": -0.01049, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 3.71 + ], + "channel_base": [ + 2.49, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.61, + 0.0 + ] + }, + { + "case": "C02_sky130_sW0.5_sL1", + "mode": "combined", + "A0": 91.8829, + "A_true": 80.571, + "A_hat": 86.2456, + "d_true": -0.12311, + "d_hat": -0.06135, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 4.32 + ], + "channel_base": [ + 2.49, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.61, + 0.0 + ] + }, + { + "case": "C02_sky130_sW0.5_sL2", + "mode": "diffusion_only", + "A0": 113.3029, + "A_true": 108.3049, + "A_hat": 108.3049, + "d_true": -0.04411, + "d_hat": -0.04411, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.49, + 4.32 + ], + "channel_base": [ + 2.49, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C02_sky130_sW0.5_sL2", + "mode": "gate_only", + "A0": 113.3029, + "A_true": 97.577, + "A_hat": 110.9468, + "d_true": -0.1388, + "d_hat": -0.02079, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 3.71 + ], + "channel_base": [ + 2.49, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.61, + 0.0 + ] + }, + { + "case": "C02_sky130_sW0.5_sL2", + "mode": "combined", + "A0": 113.3029, + "A_true": 93.2454, + "A_hat": 106.2736, + "d_true": -0.17703, + "d_hat": -0.06204, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 3.71 + ], + "channel_base": [ + 2.49, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.61, + 0.0 + ] + }, + { + "case": "C02_sky130_sW1.5_sL1.5", + "mode": "diffusion_only", + "A0": 208.2649, + "A_true": 203.2669, + "A_hat": 203.2669, + "d_true": -0.024, + "d_hat": -0.024, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.49, + 4.32 + ], + "channel_base": [ + 2.49, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C02_sky130_sW1.5_sL1.5", + "mode": "gate_only", + "A0": 208.2649, + "A_true": 179.8774, + "A_hat": 199.7376, + "d_true": -0.1363, + "d_hat": -0.04094, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 3.71 + ], + "channel_base": [ + 2.49, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.61, + 0.0 + ] + }, + { + "case": "C02_sky130_sW1.5_sL1.5", + "mode": "combined", + "A0": 208.2649, + "A_true": 175.5458, + "A_hat": 195.0644, + "d_true": -0.1571, + "d_hat": -0.06338, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 3.71 + ], + "channel_base": [ + 2.49, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.61, + 0.0 + ] + }, + { + "case": "C02_sky130_sW1.5_sL1", + "mode": "diffusion_only", + "A0": 176.1349, + "A_true": 171.1369, + "A_hat": 171.1369, + "d_true": -0.02838, + "d_hat": -0.02838, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.49, + 4.32 + ], + "channel_base": [ + 2.49, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C02_sky130_sW1.5_sL1", + "mode": "gate_only", + "A0": 176.1349, + "A_true": 152.0314, + "A_hat": 169.6956, + "d_true": -0.13685, + "d_hat": -0.03656, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 3.71 + ], + "channel_base": [ + 2.49, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.61, + 0.0 + ] + }, + { + "case": "C02_sky130_sW1.5_sL1", + "mode": "combined", + "A0": 176.1349, + "A_true": 159.3478, + "A_hat": 165.0224, + "d_true": -0.09531, + "d_hat": -0.06309, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 4.32 + ], + "channel_base": [ + 2.49, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.61, + 0.0 + ] + }, + { + "case": "C02_sky130_sW1.5_sL2", + "mode": "diffusion_only", + "A0": 240.3949, + "A_true": 235.3969, + "A_hat": 235.3969, + "d_true": -0.02079, + "d_hat": -0.02079, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.49, + 4.32 + ], + "channel_base": [ + 2.49, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C02_sky130_sW1.5_sL2", + "mode": "gate_only", + "A0": 240.3949, + "A_true": 207.7234, + "A_hat": 229.7796, + "d_true": -0.13591, + "d_hat": -0.04416, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 3.71 + ], + "channel_base": [ + 2.49, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.61, + 0.0 + ] + }, + { + "case": "C02_sky130_sW1.5_sL2", + "mode": "combined", + "A0": 240.3949, + "A_true": 203.3918, + "A_hat": 225.1064, + "d_true": -0.15393, + "d_hat": -0.0636, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 3.71 + ], + "channel_base": [ + 2.49, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.61, + 0.0 + ] + }, + { + "case": "C02_sky130_sW1_sL2", + "mode": "diffusion_only", + "A0": 176.8489, + "A_true": 171.8509, + "A_hat": 171.8509, + "d_true": -0.02826, + "d_hat": -0.02826, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.49, + 4.32 + ], + "channel_base": [ + 2.49, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C02_sky130_sW1_sL2", + "mode": "gate_only", + "A0": 176.8489, + "A_true": 152.6502, + "A_hat": 170.3632, + "d_true": -0.13683, + "d_hat": -0.03667, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 3.71 + ], + "channel_base": [ + 2.49, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.61, + 0.0 + ] + }, + { + "case": "C02_sky130_sW1_sL2", + "mode": "combined", + "A0": 176.8489, + "A_true": 148.3186, + "A_hat": 165.69, + "d_true": -0.16133, + "d_hat": -0.0631, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 3.71 + ], + "channel_base": [ + 2.49, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.61, + 0.0 + ] + }, + { + "case": "C02_sky130_sW2_sL1.5", + "mode": "diffusion_only", + "A0": 261.1009, + "A_true": 256.1029, + "A_hat": 256.1029, + "d_true": -0.01914, + "d_hat": -0.01914, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.49, + 4.32 + ], + "channel_base": [ + 2.49, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C02_sky130_sW2_sL1.5", + "mode": "gate_only", + "A0": 261.1009, + "A_true": 225.6686, + "A_hat": 249.14, + "d_true": -0.1357, + "d_hat": -0.04581, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 3.71 + ], + "channel_base": [ + 2.49, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.61, + 0.0 + ] + }, + { + "case": "C02_sky130_sW2_sL1.5", + "mode": "combined", + "A0": 261.1009, + "A_true": 221.337, + "A_hat": 244.4668, + "d_true": -0.15229, + "d_hat": -0.06371, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 3.71 + ], + "channel_base": [ + 2.49, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.61, + 0.0 + ] + }, + { + "case": "C02_sky130_sW2_sL1", + "mode": "diffusion_only", + "A0": 218.2609, + "A_true": 213.2629, + "A_hat": 213.2629, + "d_true": -0.0229, + "d_hat": -0.0229, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.49, + 4.32 + ], + "channel_base": [ + 2.49, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C02_sky130_sW2_sL1", + "mode": "gate_only", + "A0": 218.2609, + "A_true": 188.5406, + "A_hat": 209.084, + "d_true": -0.13617, + "d_hat": -0.04205, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 3.71 + ], + "channel_base": [ + 2.49, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.61, + 0.0 + ] + }, + { + "case": "C02_sky130_sW2_sL1", + "mode": "combined", + "A0": 218.2609, + "A_true": 198.7362, + "A_hat": 204.4108, + "d_true": -0.08946, + "d_hat": -0.06346, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 4.32 + ], + "channel_base": [ + 2.49, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.61, + 0.0 + ] + }, + { + "case": "C02_sky130_sW2_sL2", + "mode": "diffusion_only", + "A0": 303.9409, + "A_true": 298.9429, + "A_hat": 298.9429, + "d_true": -0.01644, + "d_hat": -0.01644, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.49, + 4.32 + ], + "channel_base": [ + 2.49, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C02_sky130_sW2_sL2", + "mode": "gate_only", + "A0": 303.9409, + "A_true": 262.7966, + "A_hat": 289.196, + "d_true": -0.13537, + "d_hat": -0.04851, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 3.71 + ], + "channel_base": [ + 2.49, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.61, + 0.0 + ] + }, + { + "case": "C02_sky130_sW2_sL2", + "mode": "combined", + "A0": 303.9409, + "A_true": 258.465, + "A_hat": 284.5228, + "d_true": -0.14962, + "d_hat": -0.06389, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 3.71 + ], + "channel_base": [ + 2.49, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.61, + 0.0 + ] + }, + { + "case": "C03_gf180_sW0.5_sL1.5", + "mode": "diffusion_only", + "A0": 587.456, + "A_true": 578.688, + "A_hat": 578.688, + "d_true": -0.01493, + "d_hat": -0.01493, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 3.3, + 4.9 + ], + "channel_base": [ + 3.3, + 4.9 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_gf180_sW0.5_sL1.5", + "mode": "gate_only", + "A0": 587.456, + "A_true": 587.456, + "A_hat": 587.456, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 3.3, + 4.9 + ], + "channel_base": [ + 3.3, + 4.9 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_gf180_sW0.5_sL1.5", + "mode": "combined", + "A0": 587.456, + "A_true": 578.688, + "A_hat": 578.688, + "d_true": -0.01493, + "d_hat": -0.01493, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 3.3, + 4.9 + ], + "channel_base": [ + 3.3, + 4.9 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_gf180_sW0.5_sL1", + "mode": "diffusion_only", + "A0": 440.1536, + "A_true": 431.3856, + "A_hat": 431.3856, + "d_true": -0.01992, + "d_hat": -0.01992, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 3.3, + 4.9 + ], + "channel_base": [ + 3.3, + 4.9 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_gf180_sW0.5_sL1", + "mode": "gate_only", + "A0": 440.1536, + "A_true": 440.1536, + "A_hat": 440.1536, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 3.3, + 4.9 + ], + "channel_base": [ + 3.3, + 4.9 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_gf180_sW0.5_sL1", + "mode": "combined", + "A0": 440.1536, + "A_true": 431.3856, + "A_hat": 431.3856, + "d_true": -0.01992, + "d_hat": -0.01992, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 3.3, + 4.9 + ], + "channel_base": [ + 3.3, + 4.9 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_gf180_sW0.5_sL2", + "mode": "diffusion_only", + "A0": 734.7584, + "A_true": 725.9904, + "A_hat": 725.9904, + "d_true": -0.01193, + "d_hat": -0.01193, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 3.3, + 4.9 + ], + "channel_base": [ + 3.3, + 4.9 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_gf180_sW0.5_sL2", + "mode": "gate_only", + "A0": 734.7584, + "A_true": 734.7584, + "A_hat": 734.7584, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 3.3, + 4.9 + ], + "channel_base": [ + 3.3, + 4.9 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_gf180_sW0.5_sL2", + "mode": "combined", + "A0": 734.7584, + "A_true": 725.9904, + "A_hat": 725.9904, + "d_true": -0.01193, + "d_hat": -0.01193, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 3.3, + 4.9 + ], + "channel_base": [ + 3.3, + 4.9 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_gf180_sW1.5_sL1.5", + "mode": "diffusion_only", + "A0": 1618.5728, + "A_true": 1609.8048, + "A_hat": 1609.8048, + "d_true": -0.00542, + "d_hat": -0.00542, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 3.3, + 4.9 + ], + "channel_base": [ + 3.3, + 4.9 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_gf180_sW1.5_sL1.5", + "mode": "gate_only", + "A0": 1618.5728, + "A_true": 1618.5728, + "A_hat": 1618.5728, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 3.3, + 4.9 + ], + "channel_base": [ + 3.3, + 4.9 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_gf180_sW1.5_sL1.5", + "mode": "combined", + "A0": 1618.5728, + "A_true": 1609.8048, + "A_hat": 1609.8048, + "d_true": -0.00542, + "d_hat": -0.00542, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 3.3, + 4.9 + ], + "channel_base": [ + 3.3, + 4.9 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_gf180_sW1.5_sL1", + "mode": "diffusion_only", + "A0": 1176.6656, + "A_true": 1167.8976, + "A_hat": 1167.8976, + "d_true": -0.00745, + "d_hat": -0.00745, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 3.3, + 4.9 + ], + "channel_base": [ + 3.3, + 4.9 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_gf180_sW1.5_sL1", + "mode": "gate_only", + "A0": 1176.6656, + "A_true": 1176.6656, + "A_hat": 1176.6656, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 3.3, + 4.9 + ], + "channel_base": [ + 3.3, + 4.9 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_gf180_sW1.5_sL1", + "mode": "combined", + "A0": 1176.6656, + "A_true": 1167.8976, + "A_hat": 1167.8976, + "d_true": -0.00745, + "d_hat": -0.00745, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 3.3, + 4.9 + ], + "channel_base": [ + 3.3, + 4.9 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_gf180_sW1.5_sL2", + "mode": "diffusion_only", + "A0": 2060.48, + "A_true": 2051.712, + "A_hat": 2051.712, + "d_true": -0.00426, + "d_hat": -0.00426, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 3.3, + 4.9 + ], + "channel_base": [ + 3.3, + 4.9 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_gf180_sW1.5_sL2", + "mode": "gate_only", + "A0": 2060.48, + "A_true": 2060.48, + "A_hat": 2060.48, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 3.3, + 4.9 + ], + "channel_base": [ + 3.3, + 4.9 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_gf180_sW1.5_sL2", + "mode": "combined", + "A0": 2060.48, + "A_true": 2051.712, + "A_hat": 2051.712, + "d_true": -0.00426, + "d_hat": -0.00426, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 3.3, + 4.9 + ], + "channel_base": [ + 3.3, + 4.9 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_gf180_sW1_sL2", + "mode": "diffusion_only", + "A0": 1397.6192, + "A_true": 1388.8512, + "A_hat": 1388.8512, + "d_true": -0.00627, + "d_hat": -0.00627, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 3.3, + 4.9 + ], + "channel_base": [ + 3.3, + 4.9 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_gf180_sW1_sL2", + "mode": "gate_only", + "A0": 1397.6192, + "A_true": 1397.6192, + "A_hat": 1397.6192, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 3.3, + 4.9 + ], + "channel_base": [ + 3.3, + 4.9 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_gf180_sW1_sL2", + "mode": "combined", + "A0": 1397.6192, + "A_true": 1388.8512, + "A_hat": 1388.8512, + "d_true": -0.00627, + "d_hat": -0.00627, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 3.3, + 4.9 + ], + "channel_base": [ + 3.3, + 4.9 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_gf180_sW2_sL1.5", + "mode": "diffusion_only", + "A0": 2134.1312, + "A_true": 2125.3632, + "A_hat": 2125.3632, + "d_true": -0.00411, + "d_hat": -0.00411, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 3.3, + 4.9 + ], + "channel_base": [ + 3.3, + 4.9 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_gf180_sW2_sL1.5", + "mode": "gate_only", + "A0": 2134.1312, + "A_true": 2134.1312, + "A_hat": 2134.1312, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 3.3, + 4.9 + ], + "channel_base": [ + 3.3, + 4.9 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_gf180_sW2_sL1.5", + "mode": "combined", + "A0": 2134.1312, + "A_true": 2125.3632, + "A_hat": 2125.3632, + "d_true": -0.00411, + "d_hat": -0.00411, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 3.3, + 4.9 + ], + "channel_base": [ + 3.3, + 4.9 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_gf180_sW2_sL1", + "mode": "diffusion_only", + "A0": 1544.9216, + "A_true": 1536.1536, + "A_hat": 1536.1536, + "d_true": -0.00568, + "d_hat": -0.00568, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 3.3, + 4.9 + ], + "channel_base": [ + 3.3, + 4.9 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_gf180_sW2_sL1", + "mode": "gate_only", + "A0": 1544.9216, + "A_true": 1544.9216, + "A_hat": 1544.9216, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 3.3, + 4.9 + ], + "channel_base": [ + 3.3, + 4.9 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_gf180_sW2_sL1", + "mode": "combined", + "A0": 1544.9216, + "A_true": 1536.1536, + "A_hat": 1536.1536, + "d_true": -0.00568, + "d_hat": -0.00568, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 3.3, + 4.9 + ], + "channel_base": [ + 3.3, + 4.9 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_gf180_sW2_sL2", + "mode": "diffusion_only", + "A0": 2723.3408, + "A_true": 2714.5728, + "A_hat": 2714.5728, + "d_true": -0.00322, + "d_hat": -0.00322, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 3.3, + 4.9 + ], + "channel_base": [ + 3.3, + 4.9 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_gf180_sW2_sL2", + "mode": "gate_only", + "A0": 2723.3408, + "A_true": 2723.3408, + "A_hat": 2723.3408, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 3.3, + 4.9 + ], + "channel_base": [ + 3.3, + 4.9 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_gf180_sW2_sL2", + "mode": "combined", + "A0": 2723.3408, + "A_true": 2714.5728, + "A_hat": 2714.5728, + "d_true": -0.00322, + "d_hat": -0.00322, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 3.3, + 4.9 + ], + "channel_base": [ + 3.3, + 4.9 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_ihp130_sW0.5_sL1.5", + "mode": "diffusion_only", + "A0": 372.0879, + "A_true": 367.9977, + "A_hat": 367.9977, + "d_true": -0.01099, + "d_hat": -0.01099, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.3099999999999996, + 3.4899999999999998 + ], + "channel_base": [ + 2.3099999999999996, + 3.4899999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_ihp130_sW0.5_sL1.5", + "mode": "gate_only", + "A0": 372.0879, + "A_true": 372.0879, + "A_hat": 372.0879, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.3099999999999996, + 3.4899999999999998 + ], + "channel_base": [ + 2.3099999999999996, + 3.4899999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_ihp130_sW0.5_sL1.5", + "mode": "combined", + "A0": 372.0879, + "A_true": 367.9977, + "A_hat": 367.9977, + "d_true": -0.01099, + "d_hat": -0.01099, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.3099999999999996, + 3.4899999999999998 + ], + "channel_base": [ + 2.3099999999999996, + 3.4899999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_ihp130_sW0.5_sL1", + "mode": "diffusion_only", + "A0": 271.9983, + "A_true": 267.9081, + "A_hat": 267.9081, + "d_true": -0.01504, + "d_hat": -0.01504, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.3099999999999996, + 3.4899999999999998 + ], + "channel_base": [ + 2.3099999999999996, + 3.4899999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_ihp130_sW0.5_sL1", + "mode": "gate_only", + "A0": 271.9983, + "A_true": 271.9983, + "A_hat": 271.9983, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.3099999999999996, + 3.4899999999999998 + ], + "channel_base": [ + 2.3099999999999996, + 3.4899999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_ihp130_sW0.5_sL1", + "mode": "combined", + "A0": 271.9983, + "A_true": 267.9081, + "A_hat": 267.9081, + "d_true": -0.01504, + "d_hat": -0.01504, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.3099999999999996, + 3.4899999999999998 + ], + "channel_base": [ + 2.3099999999999996, + 3.4899999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_ihp130_sW1.5_sL1.5", + "mode": "diffusion_only", + "A0": 1045.7679, + "A_true": 1041.6777, + "A_hat": 1041.6777, + "d_true": -0.00391, + "d_hat": -0.00391, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.3099999999999996, + 3.4899999999999998 + ], + "channel_base": [ + 2.3099999999999996, + 3.4899999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_ihp130_sW1.5_sL1.5", + "mode": "gate_only", + "A0": 1045.7679, + "A_true": 1045.7679, + "A_hat": 1045.7679, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.3099999999999996, + 3.4899999999999998 + ], + "channel_base": [ + 2.3099999999999996, + 3.4899999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_ihp130_sW1.5_sL1.5", + "mode": "combined", + "A0": 1045.7679, + "A_true": 1041.6777, + "A_hat": 1041.6777, + "d_true": -0.00391, + "d_hat": -0.00391, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.3099999999999996, + 3.4899999999999998 + ], + "channel_base": [ + 2.3099999999999996, + 3.4899999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_ihp130_sW1.5_sL1", + "mode": "diffusion_only", + "A0": 745.4991, + "A_true": 741.4089, + "A_hat": 741.4089, + "d_true": -0.00549, + "d_hat": -0.00549, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.3099999999999996, + 3.4899999999999998 + ], + "channel_base": [ + 2.3099999999999996, + 3.4899999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_ihp130_sW1.5_sL1", + "mode": "gate_only", + "A0": 745.4991, + "A_true": 745.4991, + "A_hat": 745.4991, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.3099999999999996, + 3.4899999999999998 + ], + "channel_base": [ + 2.3099999999999996, + 3.4899999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_ihp130_sW1.5_sL1", + "mode": "combined", + "A0": 745.4991, + "A_true": 741.4089, + "A_hat": 741.4089, + "d_true": -0.00549, + "d_hat": -0.00549, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.3099999999999996, + 3.4899999999999998 + ], + "channel_base": [ + 2.3099999999999996, + 3.4899999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_ihp130_sW1.5_sL2", + "mode": "diffusion_only", + "A0": 1346.0367, + "A_true": 1341.9465, + "A_hat": 1341.9465, + "d_true": -0.00304, + "d_hat": -0.00304, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.3099999999999996, + 3.4899999999999998 + ], + "channel_base": [ + 2.3099999999999996, + 3.4899999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_ihp130_sW1.5_sL2", + "mode": "gate_only", + "A0": 1346.0367, + "A_true": 1346.0367, + "A_hat": 1346.0367, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.3099999999999996, + 3.4899999999999998 + ], + "channel_base": [ + 2.3099999999999996, + 3.4899999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_ihp130_sW1.5_sL2", + "mode": "combined", + "A0": 1346.0367, + "A_true": 1341.9465, + "A_hat": 1341.9465, + "d_true": -0.00304, + "d_hat": -0.00304, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.3099999999999996, + 3.4899999999999998 + ], + "channel_base": [ + 2.3099999999999996, + 3.4899999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_ihp130_sW1_sL2", + "mode": "diffusion_only", + "A0": 909.1071, + "A_true": 905.0169, + "A_hat": 905.0169, + "d_true": -0.0045, + "d_hat": -0.0045, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.3099999999999996, + 3.4899999999999998 + ], + "channel_base": [ + 2.3099999999999996, + 3.4899999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_ihp130_sW1_sL2", + "mode": "gate_only", + "A0": 909.1071, + "A_true": 909.1071, + "A_hat": 909.1071, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.3099999999999996, + 3.4899999999999998 + ], + "channel_base": [ + 2.3099999999999996, + 3.4899999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_ihp130_sW1_sL2", + "mode": "combined", + "A0": 909.1071, + "A_true": 905.0169, + "A_hat": 905.0169, + "d_true": -0.0045, + "d_hat": -0.0045, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.3099999999999996, + 3.4899999999999998 + ], + "channel_base": [ + 2.3099999999999996, + 3.4899999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_ihp130_sW2_sL1.5", + "mode": "diffusion_only", + "A0": 1382.6079, + "A_true": 1378.5177, + "A_hat": 1378.5177, + "d_true": -0.00296, + "d_hat": -0.00296, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.3099999999999996, + 3.4899999999999998 + ], + "channel_base": [ + 2.3099999999999996, + 3.4899999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_ihp130_sW2_sL1.5", + "mode": "gate_only", + "A0": 1382.6079, + "A_true": 1382.6079, + "A_hat": 1382.6079, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.3099999999999996, + 3.4899999999999998 + ], + "channel_base": [ + 2.3099999999999996, + 3.4899999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_ihp130_sW2_sL1.5", + "mode": "combined", + "A0": 1382.6079, + "A_true": 1378.5177, + "A_hat": 1378.5177, + "d_true": -0.00296, + "d_hat": -0.00296, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.3099999999999996, + 3.4899999999999998 + ], + "channel_base": [ + 2.3099999999999996, + 3.4899999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_ihp130_sW2_sL1", + "mode": "diffusion_only", + "A0": 982.2495, + "A_true": 978.1593, + "A_hat": 978.1593, + "d_true": -0.00416, + "d_hat": -0.00416, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.3099999999999996, + 3.4899999999999998 + ], + "channel_base": [ + 2.3099999999999996, + 3.4899999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_ihp130_sW2_sL1", + "mode": "gate_only", + "A0": 982.2495, + "A_true": 982.2495, + "A_hat": 982.2495, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.3099999999999996, + 3.4899999999999998 + ], + "channel_base": [ + 2.3099999999999996, + 3.4899999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_ihp130_sW2_sL1", + "mode": "combined", + "A0": 982.2495, + "A_true": 978.1593, + "A_hat": 978.1593, + "d_true": -0.00416, + "d_hat": -0.00416, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.3099999999999996, + 3.4899999999999998 + ], + "channel_base": [ + 2.3099999999999996, + 3.4899999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_ihp130_sW2_sL2", + "mode": "diffusion_only", + "A0": 1782.9663, + "A_true": 1778.8761, + "A_hat": 1778.8761, + "d_true": -0.00229, + "d_hat": -0.00229, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.3099999999999996, + 3.4899999999999998 + ], + "channel_base": [ + 2.3099999999999996, + 3.4899999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_ihp130_sW2_sL2", + "mode": "gate_only", + "A0": 1782.9663, + "A_true": 1782.9663, + "A_hat": 1782.9663, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.3099999999999996, + 3.4899999999999998 + ], + "channel_base": [ + 2.3099999999999996, + 3.4899999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_ihp130_sW2_sL2", + "mode": "combined", + "A0": 1782.9663, + "A_true": 1778.8761, + "A_hat": 1778.8761, + "d_true": -0.00229, + "d_hat": -0.00229, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.3099999999999996, + 3.4899999999999998 + ], + "channel_base": [ + 2.3099999999999996, + 3.4899999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_sky130_sW0.5_sL1.5", + "mode": "diffusion_only", + "A0": 250.2399, + "A_true": 245.5835, + "A_hat": 245.5835, + "d_true": -0.01861, + "d_hat": -0.01861, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.49, + 3.71 + ], + "channel_base": [ + 2.49, + 3.71 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_sky130_sW0.5_sL1.5", + "mode": "gate_only", + "A0": 250.2399, + "A_true": 250.2399, + "A_hat": 250.2399, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.49, + 3.71 + ], + "channel_base": [ + 2.49, + 3.71 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_sky130_sW0.5_sL1.5", + "mode": "combined", + "A0": 250.2399, + "A_true": 245.5835, + "A_hat": 245.5835, + "d_true": -0.01861, + "d_hat": -0.01861, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.49, + 3.71 + ], + "channel_base": [ + 2.49, + 3.71 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_sky130_sW0.5_sL1", + "mode": "diffusion_only", + "A0": 190.3719, + "A_true": 185.7155, + "A_hat": 185.7155, + "d_true": -0.02446, + "d_hat": -0.02446, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.49, + 3.71 + ], + "channel_base": [ + 2.49, + 3.71 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_sky130_sW0.5_sL1", + "mode": "gate_only", + "A0": 190.3719, + "A_true": 190.3719, + "A_hat": 190.3719, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.49, + 3.71 + ], + "channel_base": [ + 2.49, + 3.71 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_sky130_sW0.5_sL1", + "mode": "combined", + "A0": 190.3719, + "A_true": 185.7155, + "A_hat": 185.7155, + "d_true": -0.02446, + "d_hat": -0.02446, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.49, + 3.71 + ], + "channel_base": [ + 2.49, + 3.71 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_sky130_sW0.5_sL2", + "mode": "diffusion_only", + "A0": 310.1079, + "A_true": 305.4515, + "A_hat": 305.4515, + "d_true": -0.01502, + "d_hat": -0.01502, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.49, + 3.71 + ], + "channel_base": [ + 2.49, + 3.71 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_sky130_sW0.5_sL2", + "mode": "gate_only", + "A0": 310.1079, + "A_true": 310.1079, + "A_hat": 310.1079, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.49, + 3.71 + ], + "channel_base": [ + 2.49, + 3.71 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_sky130_sW0.5_sL2", + "mode": "combined", + "A0": 310.1079, + "A_true": 305.4515, + "A_hat": 305.4515, + "d_true": -0.01502, + "d_hat": -0.01502, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.49, + 3.71 + ], + "channel_base": [ + 2.49, + 3.71 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_sky130_sW1.5_sL1.5", + "mode": "diffusion_only", + "A0": 667.3203, + "A_true": 662.6639, + "A_hat": 662.6639, + "d_true": -0.00698, + "d_hat": -0.00698, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.49, + 3.71 + ], + "channel_base": [ + 2.49, + 3.71 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_sky130_sW1.5_sL1.5", + "mode": "gate_only", + "A0": 667.3203, + "A_true": 667.3203, + "A_hat": 667.3203, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.49, + 3.71 + ], + "channel_base": [ + 2.49, + 3.71 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_sky130_sW1.5_sL1.5", + "mode": "combined", + "A0": 667.3203, + "A_true": 662.6639, + "A_hat": 662.6639, + "d_true": -0.00698, + "d_hat": -0.00698, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.49, + 3.71 + ], + "channel_base": [ + 2.49, + 3.71 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_sky130_sW1.5_sL1", + "mode": "diffusion_only", + "A0": 487.7163, + "A_true": 483.0599, + "A_hat": 483.0599, + "d_true": -0.00955, + "d_hat": -0.00955, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.49, + 3.71 + ], + "channel_base": [ + 2.49, + 3.71 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_sky130_sW1.5_sL1", + "mode": "gate_only", + "A0": 487.7163, + "A_true": 487.7163, + "A_hat": 487.7163, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.49, + 3.71 + ], + "channel_base": [ + 2.49, + 3.71 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_sky130_sW1.5_sL1", + "mode": "combined", + "A0": 487.7163, + "A_true": 483.0599, + "A_hat": 483.0599, + "d_true": -0.00955, + "d_hat": -0.00955, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.49, + 3.71 + ], + "channel_base": [ + 2.49, + 3.71 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_sky130_sW1.5_sL2", + "mode": "diffusion_only", + "A0": 846.9243, + "A_true": 842.2679, + "A_hat": 842.2679, + "d_true": -0.0055, + "d_hat": -0.0055, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.49, + 3.71 + ], + "channel_base": [ + 2.49, + 3.71 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_sky130_sW1.5_sL2", + "mode": "gate_only", + "A0": 846.9243, + "A_true": 846.9243, + "A_hat": 846.9243, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.49, + 3.71 + ], + "channel_base": [ + 2.49, + 3.71 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_sky130_sW1.5_sL2", + "mode": "combined", + "A0": 846.9243, + "A_true": 842.2679, + "A_hat": 842.2679, + "d_true": -0.0055, + "d_hat": -0.0055, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.49, + 3.71 + ], + "channel_base": [ + 2.49, + 3.71 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_sky130_sW1_sL2", + "mode": "diffusion_only", + "A0": 578.5161, + "A_true": 573.8597, + "A_hat": 573.8597, + "d_true": -0.00805, + "d_hat": -0.00805, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.49, + 3.71 + ], + "channel_base": [ + 2.49, + 3.71 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_sky130_sW1_sL2", + "mode": "gate_only", + "A0": 578.5161, + "A_true": 578.5161, + "A_hat": 578.5161, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.49, + 3.71 + ], + "channel_base": [ + 2.49, + 3.71 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_sky130_sW1_sL2", + "mode": "combined", + "A0": 578.5161, + "A_true": 573.8597, + "A_hat": 573.8597, + "d_true": -0.00805, + "d_hat": -0.00805, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.49, + 3.71 + ], + "channel_base": [ + 2.49, + 3.71 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_sky130_sW2_sL1.5", + "mode": "diffusion_only", + "A0": 875.8605, + "A_true": 871.2041, + "A_hat": 871.2041, + "d_true": -0.00532, + "d_hat": -0.00532, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.49, + 3.71 + ], + "channel_base": [ + 2.49, + 3.71 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_sky130_sW2_sL1.5", + "mode": "gate_only", + "A0": 875.8605, + "A_true": 875.8605, + "A_hat": 875.8605, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.49, + 3.71 + ], + "channel_base": [ + 2.49, + 3.71 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_sky130_sW2_sL1.5", + "mode": "combined", + "A0": 875.8605, + "A_true": 871.2041, + "A_hat": 871.2041, + "d_true": -0.00532, + "d_hat": -0.00532, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.49, + 3.71 + ], + "channel_base": [ + 2.49, + 3.71 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_sky130_sW2_sL1", + "mode": "diffusion_only", + "A0": 636.3885, + "A_true": 631.7321, + "A_hat": 631.7321, + "d_true": -0.00732, + "d_hat": -0.00732, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.49, + 3.71 + ], + "channel_base": [ + 2.49, + 3.71 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_sky130_sW2_sL1", + "mode": "gate_only", + "A0": 636.3885, + "A_true": 636.3885, + "A_hat": 636.3885, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.49, + 3.71 + ], + "channel_base": [ + 2.49, + 3.71 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_sky130_sW2_sL1", + "mode": "combined", + "A0": 636.3885, + "A_true": 631.7321, + "A_hat": 631.7321, + "d_true": -0.00732, + "d_hat": -0.00732, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.49, + 3.71 + ], + "channel_base": [ + 2.49, + 3.71 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_sky130_sW2_sL2", + "mode": "diffusion_only", + "A0": 1115.3325, + "A_true": 1110.6761, + "A_hat": 1110.6761, + "d_true": -0.00417, + "d_hat": -0.00417, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.49, + 3.71 + ], + "channel_base": [ + 2.49, + 3.71 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_sky130_sW2_sL2", + "mode": "gate_only", + "A0": 1115.3325, + "A_true": 1115.3325, + "A_hat": 1115.3325, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.49, + 3.71 + ], + "channel_base": [ + 2.49, + 3.71 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C03_sky130_sW2_sL2", + "mode": "combined", + "A0": 1115.3325, + "A_true": 1110.6761, + "A_hat": 1110.6761, + "d_true": -0.00417, + "d_hat": -0.00417, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.49, + 3.71 + ], + "channel_base": [ + 2.49, + 3.71 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C05_gf180_sW0.5_sL1.5", + "mode": "diffusion_only", + "A0": 111.384, + "A_true": 103.896, + "A_hat": 103.896, + "d_true": -0.06723, + "d_hat": -0.06723, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.1000000000000005 + ], + "channel_base": [ + 2.5, + 4.1000000000000005 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C05_gf180_sW0.5_sL1", + "mode": "diffusion_only", + "A0": 95.6592, + "A_true": 88.1712, + "A_hat": 88.1712, + "d_true": -0.07828, + "d_hat": -0.07828, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.1000000000000005 + ], + "channel_base": [ + 2.5, + 4.1000000000000005 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C05_gf180_sW1.5_sL1.5", + "mode": "diffusion_only", + "A0": 268.632, + "A_true": 261.144, + "A_hat": 261.144, + "d_true": -0.02787, + "d_hat": -0.02787, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.1000000000000005 + ], + "channel_base": [ + 2.5, + 4.1000000000000005 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C05_gf180_sW1.5_sL1", + "mode": "diffusion_only", + "A0": 221.4576, + "A_true": 213.9696, + "A_hat": 213.9696, + "d_true": -0.03381, + "d_hat": -0.03381, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.1000000000000005 + ], + "channel_base": [ + 2.5, + 4.1000000000000005 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C05_gf180_sW1.5_sL2", + "mode": "diffusion_only", + "A0": 315.8064, + "A_true": 308.3184, + "A_hat": 308.3184, + "d_true": -0.02371, + "d_hat": -0.02371, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.1000000000000005 + ], + "channel_base": [ + 2.5, + 4.1000000000000005 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C05_gf180_sW1_sL2", + "mode": "diffusion_only", + "A0": 221.4576, + "A_true": 213.9696, + "A_hat": 213.9696, + "d_true": -0.03381, + "d_hat": -0.03381, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.1000000000000005 + ], + "channel_base": [ + 2.5, + 4.1000000000000005 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C05_gf180_sW2_sL1.5", + "mode": "diffusion_only", + "A0": 347.256, + "A_true": 339.768, + "A_hat": 339.768, + "d_true": -0.02156, + "d_hat": -0.02156, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.1000000000000005 + ], + "channel_base": [ + 2.5, + 4.1000000000000005 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C05_gf180_sW2_sL1", + "mode": "diffusion_only", + "A0": 284.3568, + "A_true": 276.8688, + "A_hat": 276.8688, + "d_true": -0.02633, + "d_hat": -0.02633, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.1000000000000005 + ], + "channel_base": [ + 2.5, + 4.1000000000000005 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C05_gf180_sW2_sL2", + "mode": "diffusion_only", + "A0": 410.1552, + "A_true": 402.6672, + "A_hat": 402.6672, + "d_true": -0.01826, + "d_hat": -0.01826, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.1000000000000005 + ], + "channel_base": [ + 2.5, + 4.1000000000000005 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C05_ihp130_sW0.5_sL1.5", + "mode": "diffusion_only", + "A0": 48.6324, + "A_true": 45.144, + "A_hat": 45.144, + "d_true": -0.07173, + "d_hat": -0.07173, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.7199999999999998, + 2.9 + ], + "channel_base": [ + 1.7199999999999998, + 2.9 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C05_ihp130_sW0.5_sL1", + "mode": "diffusion_only", + "A0": 43.2972, + "A_true": 39.8088, + "A_hat": 39.8088, + "d_true": -0.08057, + "d_hat": -0.08057, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.7199999999999998, + 2.9 + ], + "channel_base": [ + 1.7199999999999998, + 2.9 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C05_ihp130_sW0.5_sL2", + "mode": "diffusion_only", + "A0": 53.9676, + "A_true": 50.4792, + "A_hat": 50.4792, + "d_true": -0.06464, + "d_hat": -0.06464, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.7199999999999998, + 2.9 + ], + "channel_base": [ + 1.7199999999999998, + 2.9 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C05_ihp130_sW1.5_sL1.5", + "mode": "diffusion_only", + "A0": 111.834, + "A_true": 108.3456, + "A_hat": 108.3456, + "d_true": -0.03119, + "d_hat": -0.03119, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.7199999999999998, + 2.9 + ], + "channel_base": [ + 1.7199999999999998, + 2.9 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C05_ihp130_sW1.5_sL1", + "mode": "diffusion_only", + "A0": 95.8284, + "A_true": 92.34, + "A_hat": 92.34, + "d_true": -0.0364, + "d_hat": -0.0364, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.7199999999999998, + 2.9 + ], + "channel_base": [ + 1.7199999999999998, + 2.9 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C05_ihp130_sW1.5_sL2", + "mode": "diffusion_only", + "A0": 127.8396, + "A_true": 124.3512, + "A_hat": 124.3512, + "d_true": -0.02729, + "d_hat": -0.02729, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.7199999999999998, + 2.9 + ], + "channel_base": [ + 1.7199999999999998, + 2.9 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C05_ihp130_sW1_sL2", + "mode": "diffusion_only", + "A0": 90.9036, + "A_true": 87.4152, + "A_hat": 87.4152, + "d_true": -0.03837, + "d_hat": -0.03837, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.7199999999999998, + 2.9 + ], + "channel_base": [ + 1.7199999999999998, + 2.9 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C05_ihp130_sW2_sL1.5", + "mode": "diffusion_only", + "A0": 143.4348, + "A_true": 139.9464, + "A_hat": 139.9464, + "d_true": -0.02432, + "d_hat": -0.02432, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.7199999999999998, + 2.9 + ], + "channel_base": [ + 1.7199999999999998, + 2.9 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C05_ihp130_sW2_sL1", + "mode": "diffusion_only", + "A0": 122.094, + "A_true": 118.6056, + "A_hat": 118.6056, + "d_true": -0.02857, + "d_hat": -0.02857, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.7199999999999998, + 2.9 + ], + "channel_base": [ + 1.7199999999999998, + 2.9 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C05_ihp130_sW2_sL2", + "mode": "diffusion_only", + "A0": 164.7756, + "A_true": 161.2872, + "A_hat": 161.2872, + "d_true": -0.02117, + "d_hat": -0.02117, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.7199999999999998, + 2.9 + ], + "channel_base": [ + 1.7199999999999998, + 2.9 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C05_sky130_sW0.5_sL1.5", + "mode": "diffusion_only", + "A0": 51.5806, + "A_true": 47.6075, + "A_hat": 47.6075, + "d_true": -0.07703, + "d_hat": -0.07703, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 3.1 + ], + "channel_base": [ + 1.88, + 3.1 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C05_sky130_sW0.5_sL1", + "mode": "diffusion_only", + "A0": 45.1951, + "A_true": 44.766, + "A_hat": 41.222, + "d_true": -0.00949, + "d_hat": -0.08791, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.49, + 3.1 + ], + "channel_base": [ + 1.88, + 3.1 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C05_sky130_sW0.5_sL2", + "mode": "diffusion_only", + "A0": 57.9661, + "A_true": 53.9929, + "A_hat": 53.993, + "d_true": -0.06854, + "d_hat": -0.06854, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 3.1 + ], + "channel_base": [ + 1.88, + 3.1 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C05_sky130_sW1.5_sL1.5", + "mode": "diffusion_only", + "A0": 114.5843, + "A_true": 110.611, + "A_hat": 110.611, + "d_true": -0.03468, + "d_hat": -0.03468, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 3.1 + ], + "channel_base": [ + 1.88, + 3.1 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C05_sky130_sW1.5_sL1", + "mode": "diffusion_only", + "A0": 95.4277, + "A_true": 91.4545, + "A_hat": 91.4545, + "d_true": -0.04164, + "d_hat": -0.04164, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 3.1 + ], + "channel_base": [ + 1.88, + 3.1 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C05_sky130_sW1.5_sL2", + "mode": "diffusion_only", + "A0": 133.7407, + "A_true": 129.7676, + "A_hat": 129.7675, + "d_true": -0.02971, + "d_hat": -0.02971, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 3.1 + ], + "channel_base": [ + 1.88, + 3.1 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C05_sky130_sW1_sL2", + "mode": "diffusion_only", + "A0": 95.8534, + "A_true": 91.8802, + "A_hat": 91.8803, + "d_true": -0.04145, + "d_hat": -0.04145, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 3.1 + ], + "channel_base": [ + 1.88, + 3.1 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C05_sky130_sW2_sL1.5", + "mode": "diffusion_only", + "A0": 146.0861, + "A_true": 142.1129, + "A_hat": 142.1129, + "d_true": -0.0272, + "d_hat": -0.0272, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 3.1 + ], + "channel_base": [ + 1.88, + 3.1 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C05_sky130_sW2_sL1", + "mode": "diffusion_only", + "A0": 120.5441, + "A_true": 116.5709, + "A_hat": 116.5708, + "d_true": -0.03296, + "d_hat": -0.03296, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 3.1 + ], + "channel_base": [ + 1.88, + 3.1 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C05_sky130_sW2_sL2", + "mode": "diffusion_only", + "A0": 171.6281, + "A_true": 167.6549, + "A_hat": 167.6549, + "d_true": -0.02315, + "d_hat": -0.02315, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 3.1 + ], + "channel_base": [ + 1.88, + 3.1 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C06_gf180_sW0.5_sL1.5", + "mode": "diffusion_only", + "A0": 275.122, + "A_true": 260.546, + "A_hat": 260.546, + "d_true": -0.05298, + "d_hat": -0.05298, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 4.05, + 1.05 + ], + "channel_true": [ + 2.5, + 5.7, + 2.5 + ], + "channel_base": [ + 2.5, + 5.7, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C06_gf180_sW0.5_sL1", + "mode": "diffusion_only", + "A0": 234.3092, + "A_true": 219.7332, + "A_hat": 219.7332, + "d_true": -0.06221, + "d_hat": -0.06221, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 3.49, + 1.05 + ], + "channel_true": [ + 2.5, + 5.7, + 2.5 + ], + "channel_base": [ + 2.5, + 5.7, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C06_gf180_sW0.5_sL2", + "mode": "diffusion_only", + "A0": 315.9348, + "A_true": 301.3588, + "A_hat": 301.3588, + "d_true": -0.04614, + "d_hat": -0.04614, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 4.61, + 1.05 + ], + "channel_true": [ + 2.5, + 5.7, + 2.5 + ], + "channel_base": [ + 2.5, + 5.7, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C06_gf180_sW1.5_sL1.5", + "mode": "diffusion_only", + "A0": 683.25, + "A_true": 668.674, + "A_hat": 668.674, + "d_true": -0.02133, + "d_hat": -0.02133, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 9.65, + 1.05 + ], + "channel_true": [ + 2.5, + 5.7, + 2.5 + ], + "channel_base": [ + 2.5, + 5.7, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C06_gf180_sW1.5_sL1", + "mode": "diffusion_only", + "A0": 560.8116, + "A_true": 546.2356, + "A_hat": 546.2356, + "d_true": -0.02599, + "d_hat": -0.02599, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 7.97, + 1.05 + ], + "channel_true": [ + 2.5, + 5.7, + 2.5 + ], + "channel_base": [ + 2.5, + 5.7, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C06_gf180_sW1.5_sL2", + "mode": "diffusion_only", + "A0": 805.6884, + "A_true": 791.1124, + "A_hat": 791.1124, + "d_true": -0.01809, + "d_hat": -0.01809, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 11.33, + 1.05 + ], + "channel_true": [ + 2.5, + 5.7, + 2.5 + ], + "channel_base": [ + 2.5, + 5.7, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C06_gf180_sW1_sL2", + "mode": "diffusion_only", + "A0": 560.8116, + "A_true": 546.2356, + "A_hat": 546.2356, + "d_true": -0.02599, + "d_hat": -0.02599, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 7.97, + 1.05 + ], + "channel_true": [ + 2.5, + 5.7, + 2.5 + ], + "channel_base": [ + 2.5, + 5.7, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C06_gf180_sW2_sL1.5", + "mode": "diffusion_only", + "A0": 887.314, + "A_true": 872.738, + "A_hat": 872.738, + "d_true": -0.01643, + "d_hat": -0.01643, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 12.45, + 1.05 + ], + "channel_true": [ + 2.5, + 5.7, + 2.5 + ], + "channel_base": [ + 2.5, + 5.7, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C06_gf180_sW2_sL1", + "mode": "diffusion_only", + "A0": 724.0628, + "A_true": 709.4868, + "A_hat": 709.4868, + "d_true": -0.02013, + "d_hat": -0.02013, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 10.21, + 1.05 + ], + "channel_true": [ + 2.5, + 5.7, + 2.5 + ], + "channel_base": [ + 2.5, + 5.7, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C06_gf180_sW2_sL2", + "mode": "diffusion_only", + "A0": 1050.5652, + "A_true": 1035.9892, + "A_hat": 1035.9892, + "d_true": -0.01387, + "d_hat": -0.01387, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 14.69, + 1.05 + ], + "channel_true": [ + 2.5, + 5.7, + 2.5 + ], + "channel_base": [ + 2.5, + 5.7, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C06_ihp130_sW0.5_sL1.5", + "mode": "diffusion_only", + "A0": 122.227, + "A_true": 115.444, + "A_hat": 115.444, + "d_true": -0.0555, + "d_hat": -0.0555, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 2.75, + 0.94 + ], + "channel_true": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C06_ihp130_sW0.5_sL1", + "mode": "diffusion_only", + "A0": 108.395, + "A_true": 101.612, + "A_hat": 101.612, + "d_true": -0.06258, + "d_hat": -0.06258, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 2.49, + 0.94 + ], + "channel_true": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C06_ihp130_sW0.5_sL2", + "mode": "diffusion_only", + "A0": 136.059, + "A_true": 129.276, + "A_hat": 129.276, + "d_true": -0.04985, + "d_hat": -0.04985, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 3.01, + 0.94 + ], + "channel_true": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C06_ihp130_sW1.5_sL1.5", + "mode": "diffusion_only", + "A0": 286.083, + "A_true": 279.3, + "A_hat": 279.3, + "d_true": -0.02371, + "d_hat": -0.02371, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 5.83, + 0.94 + ], + "channel_true": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C06_ihp130_sW1.5_sL1", + "mode": "diffusion_only", + "A0": 244.587, + "A_true": 237.804, + "A_hat": 237.804, + "d_true": -0.02773, + "d_hat": -0.02773, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 5.05, + 0.94 + ], + "channel_true": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C06_ihp130_sW1.5_sL2", + "mode": "diffusion_only", + "A0": 327.579, + "A_true": 320.796, + "A_hat": 320.796, + "d_true": -0.02071, + "d_hat": -0.02071, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 6.61, + 0.94 + ], + "channel_true": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C06_ihp130_sW1_sL2", + "mode": "diffusion_only", + "A0": 231.819, + "A_true": 225.036, + "A_hat": 225.036, + "d_true": -0.02926, + "d_hat": -0.02926, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 4.81, + 0.94 + ], + "channel_true": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C06_ihp130_sW2_sL1.5", + "mode": "diffusion_only", + "A0": 368.011, + "A_true": 361.228, + "A_hat": 361.228, + "d_true": -0.01843, + "d_hat": -0.01843, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 7.37, + 0.94 + ], + "channel_true": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C06_ihp130_sW2_sL1", + "mode": "diffusion_only", + "A0": 312.683, + "A_true": 305.9, + "A_hat": 305.9, + "d_true": -0.02169, + "d_hat": -0.02169, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 6.33, + 0.94 + ], + "channel_true": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C06_ihp130_sW2_sL2", + "mode": "diffusion_only", + "A0": 423.339, + "A_true": 416.556, + "A_hat": 416.556, + "d_true": -0.01602, + "d_hat": -0.01602, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 8.41, + 0.94 + ], + "channel_true": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C06_sky130_sW0.5_sL1.5", + "mode": "diffusion_only", + "A0": 123.152, + "A_true": 115.4464, + "A_hat": 115.4464, + "d_true": -0.06257, + "d_hat": -0.06257, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 2.38, + 0.85 + ], + "channel_true": [ + 1.88, + 4.32, + 1.88 + ], + "channel_base": [ + 1.88, + 4.32, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C06_sky130_sW0.5_sL1", + "mode": "diffusion_only", + "A0": 106.64, + "A_true": 103.3203, + "A_hat": 98.9344, + "d_true": -0.03113, + "d_hat": -0.07226, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 2.08, + 0.85 + ], + "channel_true": [ + 2.49, + 4.32, + 1.88 + ], + "channel_base": [ + 1.88, + 4.32, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C06_sky130_sW1.5_sL1.5", + "mode": "diffusion_only", + "A0": 286.0704, + "A_true": 278.3648, + "A_hat": 278.3648, + "d_true": -0.02694, + "d_hat": -0.02694, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 5.34, + 0.85 + ], + "channel_true": [ + 1.88, + 4.32, + 1.88 + ], + "channel_base": [ + 1.88, + 4.32, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C06_sky130_sW1.5_sL2", + "mode": "diffusion_only", + "A0": 335.6064, + "A_true": 327.9008, + "A_hat": 327.9008, + "d_true": -0.02296, + "d_hat": -0.02296, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 6.24, + 0.85 + ], + "channel_true": [ + 1.88, + 4.32, + 1.88 + ], + "channel_base": [ + 1.88, + 4.32, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C06_sky130_sW1_sL2", + "mode": "diffusion_only", + "A0": 237.6352, + "A_true": 229.9296, + "A_hat": 229.9296, + "d_true": -0.03243, + "d_hat": -0.03243, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 4.46, + 0.85 + ], + "channel_true": [ + 1.88, + 4.32, + 1.88 + ], + "channel_base": [ + 1.88, + 4.32, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C07_gf180_sW0.5_sL1.5", + "mode": "diffusion_only", + "A0": 263.042, + "A_true": 249.106, + "A_hat": 249.106, + "d_true": -0.05298, + "d_hat": -0.05298, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.25, + 1.05 + ], + "channel_true": [ + 2.5, + 4.9, + 2.5 + ], + "channel_base": [ + 2.5, + 4.9, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C07_gf180_sW0.5_sL1.5", + "mode": "gate_only", + "A0": 263.042, + "A_true": 250.962, + "A_hat": 250.962, + "d_true": -0.04592, + "d_hat": -0.04592, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.25, + 1.05 + ], + "channel_true": [ + 2.5, + 4.9, + 2.5 + ], + "channel_base": [ + 2.5, + 4.9, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C07_gf180_sW0.5_sL1.5", + "mode": "combined", + "A0": 263.042, + "A_true": 247.638, + "A_hat": 244.314, + "d_true": -0.05856, + "d_hat": -0.0712, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05, + 1.65 + ], + "channel_true": [ + 2.5, + 4.9, + 2.5 + ], + "channel_base": [ + 2.5, + 4.9, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C07_gf180_sW0.5_sL1", + "mode": "diffusion_only", + "A0": 224.0212, + "A_true": 210.0852, + "A_hat": 210.0852, + "d_true": -0.06221, + "d_hat": -0.06221, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.25, + 1.05 + ], + "channel_true": [ + 2.5, + 4.9, + 2.5 + ], + "channel_base": [ + 2.5, + 4.9, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C07_gf180_sW0.5_sL1", + "mode": "gate_only", + "A0": 224.0212, + "A_true": 213.7332, + "A_hat": 213.7332, + "d_true": -0.04592, + "d_hat": -0.04592, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.25, + 1.05 + ], + "channel_true": [ + 2.5, + 4.9, + 2.5 + ], + "channel_base": [ + 2.5, + 4.9, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C07_gf180_sW0.5_sL1", + "mode": "combined", + "A0": 224.0212, + "A_true": 210.4092, + "A_hat": 207.0852, + "d_true": -0.06076, + "d_hat": -0.0756, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05, + 1.65 + ], + "channel_true": [ + 2.5, + 4.9, + 2.5 + ], + "channel_base": [ + 2.5, + 4.9, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C07_gf180_sW0.5_sL2", + "mode": "diffusion_only", + "A0": 302.0628, + "A_true": 288.1268, + "A_hat": 288.1268, + "d_true": -0.04614, + "d_hat": -0.04614, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.25, + 1.05 + ], + "channel_true": [ + 2.5, + 4.9, + 2.5 + ], + "channel_base": [ + 2.5, + 4.9, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C07_gf180_sW0.5_sL2", + "mode": "gate_only", + "A0": 302.0628, + "A_true": 288.1908, + "A_hat": 288.1908, + "d_true": -0.04592, + "d_hat": -0.04592, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.25, + 1.05 + ], + "channel_true": [ + 2.5, + 4.9, + 2.5 + ], + "channel_base": [ + 2.5, + 4.9, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C07_gf180_sW0.5_sL2", + "mode": "combined", + "A0": 302.0628, + "A_true": 284.8668, + "A_hat": 281.5428, + "d_true": -0.05693, + "d_hat": -0.06793, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05, + 1.65 + ], + "channel_true": [ + 2.5, + 4.9, + 2.5 + ], + "channel_base": [ + 2.5, + 4.9, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C07_gf180_sW1.5_sL1.5", + "mode": "diffusion_only", + "A0": 653.25, + "A_true": 639.314, + "A_hat": 639.314, + "d_true": -0.02133, + "d_hat": -0.02133, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.25, + 1.05 + ], + "channel_true": [ + 2.5, + 4.9, + 2.5 + ], + "channel_base": [ + 2.5, + 4.9, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C07_gf180_sW1.5_sL1.5", + "mode": "gate_only", + "A0": 653.25, + "A_true": 623.25, + "A_hat": 623.25, + "d_true": -0.04592, + "d_hat": -0.04592, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.25, + 1.05 + ], + "channel_true": [ + 2.5, + 4.9, + 2.5 + ], + "channel_base": [ + 2.5, + 4.9, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C07_gf180_sW1.5_sL1.5", + "mode": "combined", + "A0": 653.25, + "A_true": 619.926, + "A_hat": 616.602, + "d_true": -0.05101, + "d_hat": -0.0561, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05, + 1.65 + ], + "channel_true": [ + 2.5, + 4.9, + 2.5 + ], + "channel_base": [ + 2.5, + 4.9, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C07_gf180_sW1.5_sL1", + "mode": "diffusion_only", + "A0": 536.1876, + "A_true": 522.2516, + "A_hat": 522.2516, + "d_true": -0.02599, + "d_hat": -0.02599, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.25, + 1.05 + ], + "channel_true": [ + 2.5, + 4.9, + 2.5 + ], + "channel_base": [ + 2.5, + 4.9, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C07_gf180_sW1.5_sL1", + "mode": "gate_only", + "A0": 536.1876, + "A_true": 511.5636, + "A_hat": 511.5636, + "d_true": -0.04592, + "d_hat": -0.04592, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.25, + 1.05 + ], + "channel_true": [ + 2.5, + 4.9, + 2.5 + ], + "channel_base": [ + 2.5, + 4.9, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C07_gf180_sW1.5_sL1", + "mode": "combined", + "A0": 536.1876, + "A_true": 508.2396, + "A_hat": 504.9156, + "d_true": -0.05212, + "d_hat": -0.05832, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05, + 1.65 + ], + "channel_true": [ + 2.5, + 4.9, + 2.5 + ], + "channel_base": [ + 2.5, + 4.9, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C07_gf180_sW1.5_sL2", + "mode": "diffusion_only", + "A0": 770.3124, + "A_true": 756.3764, + "A_hat": 756.3764, + "d_true": -0.01809, + "d_hat": -0.01809, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.25, + 1.05 + ], + "channel_true": [ + 2.5, + 4.9, + 2.5 + ], + "channel_base": [ + 2.5, + 4.9, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C07_gf180_sW1.5_sL2", + "mode": "gate_only", + "A0": 770.3124, + "A_true": 734.9364, + "A_hat": 734.9364, + "d_true": -0.04592, + "d_hat": -0.04592, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.25, + 1.05 + ], + "channel_true": [ + 2.5, + 4.9, + 2.5 + ], + "channel_base": [ + 2.5, + 4.9, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C07_gf180_sW1.5_sL2", + "mode": "combined", + "A0": 770.3124, + "A_true": 731.6124, + "A_hat": 728.2884, + "d_true": -0.05024, + "d_hat": -0.05455, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05, + 1.65 + ], + "channel_true": [ + 2.5, + 4.9, + 2.5 + ], + "channel_base": [ + 2.5, + 4.9, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C07_gf180_sW1_sL2", + "mode": "diffusion_only", + "A0": 536.1876, + "A_true": 522.2516, + "A_hat": 522.2516, + "d_true": -0.02599, + "d_hat": -0.02599, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.25, + 1.05 + ], + "channel_true": [ + 2.5, + 4.9, + 2.5 + ], + "channel_base": [ + 2.5, + 4.9, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C07_gf180_sW1_sL2", + "mode": "gate_only", + "A0": 536.1876, + "A_true": 511.5636, + "A_hat": 511.5636, + "d_true": -0.04592, + "d_hat": -0.04592, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.25, + 1.05 + ], + "channel_true": [ + 2.5, + 4.9, + 2.5 + ], + "channel_base": [ + 2.5, + 4.9, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C07_gf180_sW1_sL2", + "mode": "combined", + "A0": 536.1876, + "A_true": 508.2396, + "A_hat": 504.9156, + "d_true": -0.05212, + "d_hat": -0.05832, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05, + 1.65 + ], + "channel_true": [ + 2.5, + 4.9, + 2.5 + ], + "channel_base": [ + 2.5, + 4.9, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C07_gf180_sW2_sL1.5", + "mode": "diffusion_only", + "A0": 848.354, + "A_true": 834.418, + "A_hat": 834.418, + "d_true": -0.01643, + "d_hat": -0.01643, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.25, + 1.05 + ], + "channel_true": [ + 2.5, + 4.9, + 2.5 + ], + "channel_base": [ + 2.5, + 4.9, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C07_gf180_sW2_sL1.5", + "mode": "gate_only", + "A0": 848.354, + "A_true": 809.394, + "A_hat": 809.394, + "d_true": -0.04592, + "d_hat": -0.04592, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.25, + 1.05 + ], + "channel_true": [ + 2.5, + 4.9, + 2.5 + ], + "channel_base": [ + 2.5, + 4.9, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C07_gf180_sW2_sL1.5", + "mode": "combined", + "A0": 848.354, + "A_true": 806.07, + "A_hat": 802.746, + "d_true": -0.04984, + "d_hat": -0.05376, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05, + 1.65 + ], + "channel_true": [ + 2.5, + 4.9, + 2.5 + ], + "channel_base": [ + 2.5, + 4.9, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C07_gf180_sW2_sL1", + "mode": "diffusion_only", + "A0": 692.2708, + "A_true": 678.3348, + "A_hat": 678.3348, + "d_true": -0.02013, + "d_hat": -0.02013, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.25, + 1.05 + ], + "channel_true": [ + 2.5, + 4.9, + 2.5 + ], + "channel_base": [ + 2.5, + 4.9, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C07_gf180_sW2_sL1", + "mode": "gate_only", + "A0": 692.2708, + "A_true": 660.4788, + "A_hat": 660.4788, + "d_true": -0.04592, + "d_hat": -0.04592, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.25, + 1.05 + ], + "channel_true": [ + 2.5, + 4.9, + 2.5 + ], + "channel_base": [ + 2.5, + 4.9, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C07_gf180_sW2_sL1", + "mode": "combined", + "A0": 692.2708, + "A_true": 657.1548, + "A_hat": 653.8308, + "d_true": -0.05073, + "d_hat": -0.05553, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05, + 1.65 + ], + "channel_true": [ + 2.5, + 4.9, + 2.5 + ], + "channel_base": [ + 2.5, + 4.9, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C07_gf180_sW2_sL2", + "mode": "diffusion_only", + "A0": 1004.4372, + "A_true": 990.5012, + "A_hat": 990.5012, + "d_true": -0.01387, + "d_hat": -0.01387, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.25, + 1.05 + ], + "channel_true": [ + 2.5, + 4.9, + 2.5 + ], + "channel_base": [ + 2.5, + 4.9, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C07_gf180_sW2_sL2", + "mode": "gate_only", + "A0": 1004.4372, + "A_true": 958.3092, + "A_hat": 958.3092, + "d_true": -0.04592, + "d_hat": -0.04592, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.25, + 1.05 + ], + "channel_true": [ + 2.5, + 4.9, + 2.5 + ], + "channel_base": [ + 2.5, + 4.9, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C07_gf180_sW2_sL2", + "mode": "combined", + "A0": 1004.4372, + "A_true": 954.9852, + "A_hat": 951.6612, + "d_true": -0.04923, + "d_hat": -0.05254, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05, + 1.65 + ], + "channel_true": [ + 2.5, + 4.9, + 2.5 + ], + "channel_base": [ + 2.5, + 4.9, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C07_ihp130_sW0.5_sL1.5", + "mode": "diffusion_only", + "A0": 116.8049, + "A_true": 110.3228, + "A_hat": 110.3228, + "d_true": -0.0555, + "d_hat": -0.0555, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.21, + 0.94 + ], + "channel_true": [ + 1.7199999999999998, + 3.4899999999999998, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 3.4899999999999998, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C07_ihp130_sW0.5_sL1.5", + "mode": "gate_only", + "A0": 116.8049, + "A_true": 112.118, + "A_hat": 112.118, + "d_true": -0.04013, + "d_hat": -0.04013, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.21, + 0.94 + ], + "channel_true": [ + 1.7199999999999998, + 3.4899999999999998, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 3.4899999999999998, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C07_ihp130_sW0.5_sL1.5", + "mode": "combined", + "A0": 116.8049, + "A_true": 119.3947, + "A_hat": 105.896, + "d_true": 0.02217, + "d_hat": -0.09339, + "sign_true": 1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.955, + 1.61 + ], + "channel_true": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 3.4899999999999998, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ], + "row_shift_change_um": 0.67, + "error_type": "routing channel height mis-predicted + row x-shift changed", + "channel_change": [ + 0.0, + 0.59, + 0.0 + ] + }, + { + "case": "C07_ihp130_sW0.5_sL1", + "mode": "diffusion_only", + "A0": 103.5865, + "A_true": 101.612, + "A_hat": 97.1044, + "d_true": -0.01906, + "d_hat": -0.06258, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.21, + 0.94 + ], + "channel_true": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 3.4899999999999998, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C07_ihp130_sW0.5_sL1", + "mode": "gate_only", + "A0": 103.5865, + "A_true": 99.43, + "A_hat": 99.43, + "d_true": -0.04013, + "d_hat": -0.04013, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.21, + 0.94 + ], + "channel_true": [ + 1.7199999999999998, + 3.4899999999999998, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 3.4899999999999998, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C07_ihp130_sW0.5_sL1", + "mode": "combined", + "A0": 103.5865, + "A_true": 122.4642, + "A_hat": 93.208, + "d_true": 0.18224, + "d_hat": -0.10019, + "sign_true": 1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 2.755, + 0.79 + ], + "channel_true": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 3.4899999999999998, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ], + "row_shift_change_um": 1.545, + "error_type": "routing channel height mis-predicted + row x-shift changed", + "channel_change": [ + 0.0, + 0.59, + 0.0 + ] + }, + { + "case": "C07_ihp130_sW0.5_sL2", + "mode": "diffusion_only", + "A0": 130.0233, + "A_true": 123.5412, + "A_hat": 123.5412, + "d_true": -0.04985, + "d_hat": -0.04985, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.21, + 0.94 + ], + "channel_true": [ + 1.7199999999999998, + 3.4899999999999998, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 3.4899999999999998, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C07_ihp130_sW0.5_sL2", + "mode": "gate_only", + "A0": 130.0233, + "A_true": 124.806, + "A_hat": 124.806, + "d_true": -0.04013, + "d_hat": -0.04013, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.21, + 0.94 + ], + "channel_true": [ + 1.7199999999999998, + 3.4899999999999998, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 3.4899999999999998, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C07_ihp130_sW0.5_sL2", + "mode": "combined", + "A0": 130.0233, + "A_true": 126.575, + "A_hat": 118.584, + "d_true": -0.02652, + "d_hat": -0.08798, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.955, + 1.61 + ], + "channel_true": [ + 1.7199999999999998, + 3.4899999999999998, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 3.4899999999999998, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C07_ihp130_sW1.5_sL1.5", + "mode": "diffusion_only", + "A0": 273.3921, + "A_true": 266.91, + "A_hat": 266.91, + "d_true": -0.02371, + "d_hat": -0.02371, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.21, + 0.94 + ], + "channel_true": [ + 1.7199999999999998, + 3.4899999999999998, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 3.4899999999999998, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C07_ihp130_sW1.5_sL1.5", + "mode": "gate_only", + "A0": 273.3921, + "A_true": 262.422, + "A_hat": 262.422, + "d_true": -0.04013, + "d_hat": -0.04013, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.21, + 0.94 + ], + "channel_true": [ + 1.7199999999999998, + 3.4899999999999998, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 3.4899999999999998, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C07_ihp130_sW1.5_sL1.5", + "mode": "combined", + "A0": 273.3921, + "A_true": 276.9674, + "A_hat": 256.2, + "d_true": 0.01308, + "d_hat": -0.06288, + "sign_true": 1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.955, + 1.61 + ], + "channel_true": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 3.4899999999999998, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ], + "row_shift_change_um": 0.67, + "error_type": "routing channel height mis-predicted + row x-shift changed", + "channel_change": [ + 0.0, + 0.59, + 0.0 + ] + }, + { + "case": "C07_ihp130_sW1.5_sL1", + "mode": "diffusion_only", + "A0": 233.7369, + "A_true": 237.804, + "A_hat": 227.2548, + "d_true": 0.0174, + "d_hat": -0.02773, + "sign_true": 1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.21, + 0.94 + ], + "channel_true": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 3.4899999999999998, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ], + "row_shift_change_um": 0.0, + "error_type": "routing channel height mis-predicted", + "channel_change": [ + 0.0, + 0.59, + 0.0 + ] + }, + { + "case": "C07_ihp130_sW1.5_sL1", + "mode": "gate_only", + "A0": 233.7369, + "A_true": 224.358, + "A_hat": 224.358, + "d_true": -0.04013, + "d_hat": -0.04013, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.21, + 0.94 + ], + "channel_true": [ + 1.7199999999999998, + 3.4899999999999998, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 3.4899999999999998, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C07_ihp130_sW1.5_sL1", + "mode": "combined", + "A0": 233.7369, + "A_true": 270.6687, + "A_hat": 218.136, + "d_true": 0.15801, + "d_hat": -0.06675, + "sign_true": 1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.955, + 0.94 + ], + "channel_true": [ + 1.7199999999999998, + 5.26, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 3.4899999999999998, + 1.7199999999999998 + ], + "strategy": "split", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ], + "row_shift_change_um": 0.255, + "error_type": "routing channel height mis-predicted", + "channel_change": [ + 0.0, + 1.77, + 0.0 + ] + }, + { + "case": "C07_ihp130_sW1.5_sL2", + "mode": "diffusion_only", + "A0": 313.0473, + "A_true": 306.5652, + "A_hat": 306.5652, + "d_true": -0.02071, + "d_hat": -0.02071, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.21, + 0.94 + ], + "channel_true": [ + 1.7199999999999998, + 3.4899999999999998, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 3.4899999999999998, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C07_ihp130_sW1.5_sL2", + "mode": "gate_only", + "A0": 313.0473, + "A_true": 300.486, + "A_hat": 300.486, + "d_true": -0.04013, + "d_hat": -0.04013, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.21, + 0.94 + ], + "channel_true": [ + 1.7199999999999998, + 3.4899999999999998, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 3.4899999999999998, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C07_ihp130_sW1.5_sL2", + "mode": "combined", + "A0": 313.0473, + "A_true": 302.255, + "A_hat": 294.264, + "d_true": -0.03447, + "d_hat": -0.06, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.955, + 1.61 + ], + "channel_true": [ + 1.7199999999999998, + 3.4899999999999998, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 3.4899999999999998, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C07_ihp130_sW1_sL2", + "mode": "diffusion_only", + "A0": 221.5353, + "A_true": 215.0532, + "A_hat": 215.0532, + "d_true": -0.02926, + "d_hat": -0.02926, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.21, + 0.94 + ], + "channel_true": [ + 1.7199999999999998, + 3.4899999999999998, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 3.4899999999999998, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C07_ihp130_sW1_sL2", + "mode": "gate_only", + "A0": 221.5353, + "A_true": 212.646, + "A_hat": 212.646, + "d_true": -0.04013, + "d_hat": -0.04013, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.21, + 0.94 + ], + "channel_true": [ + 1.7199999999999998, + 3.4899999999999998, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 3.4899999999999998, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C07_ihp130_sW1_sL2", + "mode": "combined", + "A0": 221.5353, + "A_true": 214.415, + "A_hat": 206.424, + "d_true": -0.03214, + "d_hat": -0.06821, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.955, + 1.61 + ], + "channel_true": [ + 1.7199999999999998, + 3.4899999999999998, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 3.4899999999999998, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C07_ihp130_sW2_sL1.5", + "mode": "diffusion_only", + "A0": 351.6857, + "A_true": 345.2036, + "A_hat": 345.2036, + "d_true": -0.01843, + "d_hat": -0.01843, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.21, + 0.94 + ], + "channel_true": [ + 1.7199999999999998, + 3.4899999999999998, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 3.4899999999999998, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C07_ihp130_sW2_sL1.5", + "mode": "gate_only", + "A0": 351.6857, + "A_true": 337.574, + "A_hat": 337.574, + "d_true": -0.04013, + "d_hat": -0.04013, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.21, + 0.94 + ], + "channel_true": [ + 1.7199999999999998, + 3.4899999999999998, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 3.4899999999999998, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C07_ihp130_sW2_sL1.5", + "mode": "combined", + "A0": 351.6857, + "A_true": 355.7538, + "A_hat": 331.352, + "d_true": 0.01157, + "d_hat": -0.05782, + "sign_true": 1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.955, + 1.61 + ], + "channel_true": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 3.4899999999999998, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ], + "row_shift_change_um": 0.67, + "error_type": "routing channel height mis-predicted + row x-shift changed", + "channel_change": [ + 0.0, + 0.59, + 0.0 + ] + }, + { + "case": "C07_ihp130_sW2_sL1", + "mode": "diffusion_only", + "A0": 298.8121, + "A_true": 305.9, + "A_hat": 292.33, + "d_true": 0.02372, + "d_hat": -0.02169, + "sign_true": 1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.21, + 0.94 + ], + "channel_true": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 3.4899999999999998, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ], + "row_shift_change_um": 0.0, + "error_type": "routing channel height mis-predicted", + "channel_change": [ + 0.0, + 0.59, + 0.0 + ] + }, + { + "case": "C07_ihp130_sW2_sL1", + "mode": "gate_only", + "A0": 298.8121, + "A_true": 286.822, + "A_hat": 286.822, + "d_true": -0.04013, + "d_hat": -0.04013, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.21, + 0.94 + ], + "channel_true": [ + 1.7199999999999998, + 3.4899999999999998, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 3.4899999999999998, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C07_ihp130_sW2_sL1", + "mode": "combined", + "A0": 298.8121, + "A_true": 342.1952, + "A_hat": 280.6, + "d_true": 0.14519, + "d_hat": -0.06095, + "sign_true": 1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.955, + 0.94 + ], + "channel_true": [ + 1.7199999999999998, + 5.26, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 3.4899999999999998, + 1.7199999999999998 + ], + "strategy": "split", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ], + "row_shift_change_um": 0.255, + "error_type": "routing channel height mis-predicted", + "channel_change": [ + 0.0, + 1.77, + 0.0 + ] + }, + { + "case": "C07_ihp130_sW2_sL2", + "mode": "diffusion_only", + "A0": 404.5593, + "A_true": 398.0772, + "A_hat": 398.0772, + "d_true": -0.01602, + "d_hat": -0.01602, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.21, + 0.94 + ], + "channel_true": [ + 1.7199999999999998, + 3.4899999999999998, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 3.4899999999999998, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C07_ihp130_sW2_sL2", + "mode": "gate_only", + "A0": 404.5593, + "A_true": 388.326, + "A_hat": 388.326, + "d_true": -0.04013, + "d_hat": -0.04013, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.21, + 0.94 + ], + "channel_true": [ + 1.7199999999999998, + 3.4899999999999998, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 3.4899999999999998, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C07_ihp130_sW2_sL2", + "mode": "combined", + "A0": 404.5593, + "A_true": 390.095, + "A_hat": 382.104, + "d_true": -0.03575, + "d_hat": -0.05551, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.955, + 1.61 + ], + "channel_true": [ + 1.7199999999999998, + 3.4899999999999998, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 3.4899999999999998, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C07_sky130_sW0.5_sL1.5", + "mode": "diffusion_only", + "A0": 117.6925, + "A_true": 110.3285, + "A_hat": 110.3285, + "d_true": -0.06257, + "d_hat": -0.06257, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.9, + 0.85 + ], + "channel_true": [ + 1.88, + 3.71, + 1.88 + ], + "channel_base": [ + 1.88, + 3.71, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C07_sky130_sW0.5_sL1.5", + "mode": "gate_only", + "A0": 117.6925, + "A_true": 112.8595, + "A_hat": 112.8595, + "d_true": -0.04106, + "d_hat": -0.04106, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.9, + 0.85 + ], + "channel_true": [ + 1.88, + 3.71, + 1.88 + ], + "channel_base": [ + 1.88, + 3.71, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C07_sky130_sW0.5_sL1.5", + "mode": "combined", + "A0": 117.6925, + "A_true": 111.5985, + "A_hat": 111.5985, + "d_true": -0.05178, + "d_hat": -0.05178, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85, + 1.36 + ], + "channel_true": [ + 1.88, + 3.71, + 1.88 + ], + "channel_base": [ + 1.88, + 3.71, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C07_sky130_sW0.5_sL1", + "mode": "diffusion_only", + "A0": 101.9125, + "A_true": 98.9344, + "A_hat": 94.5485, + "d_true": -0.02922, + "d_hat": -0.07226, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.9, + 0.85 + ], + "channel_true": [ + 1.88, + 4.32, + 1.88 + ], + "channel_base": [ + 1.88, + 3.71, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C07_sky130_sW0.5_sL1", + "mode": "gate_only", + "A0": 101.9125, + "A_true": 97.7275, + "A_hat": 97.7275, + "d_true": -0.04106, + "d_hat": -0.04106, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.9, + 0.85 + ], + "channel_true": [ + 1.88, + 3.71, + 1.88 + ], + "channel_base": [ + 1.88, + 3.71, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C07_sky130_sW0.5_sL1", + "mode": "combined", + "A0": 101.9125, + "A_true": 101.133, + "A_hat": 96.4665, + "d_true": -0.00765, + "d_hat": -0.05344, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85, + 1.36 + ], + "channel_true": [ + 1.88, + 4.32, + 1.88 + ], + "channel_base": [ + 1.88, + 3.71, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C07_sky130_sW0.5_sL2", + "mode": "diffusion_only", + "A0": 133.4725, + "A_true": 126.1085, + "A_hat": 126.1085, + "d_true": -0.05517, + "d_hat": -0.05517, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.9, + 0.85 + ], + "channel_true": [ + 1.88, + 3.71, + 1.88 + ], + "channel_base": [ + 1.88, + 3.71, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C07_sky130_sW0.5_sL2", + "mode": "gate_only", + "A0": 133.4725, + "A_true": 127.9915, + "A_hat": 127.9915, + "d_true": -0.04106, + "d_hat": -0.04106, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.9, + 0.85 + ], + "channel_true": [ + 1.88, + 3.71, + 1.88 + ], + "channel_base": [ + 1.88, + 3.71, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C07_sky130_sW0.5_sL2", + "mode": "combined", + "A0": 133.4725, + "A_true": 126.7305, + "A_hat": 126.7305, + "d_true": -0.05051, + "d_hat": -0.05051, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85, + 1.36 + ], + "channel_true": [ + 1.88, + 3.71, + 1.88 + ], + "channel_base": [ + 1.88, + 3.71, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C07_sky130_sW1.5_sL1.5", + "mode": "diffusion_only", + "A0": 273.3885, + "A_true": 266.0245, + "A_hat": 266.0245, + "d_true": -0.02694, + "d_hat": -0.02694, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.9, + 0.85 + ], + "channel_true": [ + 1.88, + 3.71, + 1.88 + ], + "channel_base": [ + 1.88, + 3.71, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C07_sky130_sW1.5_sL1.5", + "mode": "gate_only", + "A0": 273.3885, + "A_true": 262.1619, + "A_hat": 262.1619, + "d_true": -0.04106, + "d_hat": -0.04106, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.9, + 0.85 + ], + "channel_true": [ + 1.88, + 3.71, + 1.88 + ], + "channel_base": [ + 1.88, + 3.71, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C07_sky130_sW1.5_sL1.5", + "mode": "combined", + "A0": 273.3885, + "A_true": 260.9009, + "A_hat": 260.9009, + "d_true": -0.04568, + "d_hat": -0.04568, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85, + 1.36 + ], + "channel_true": [ + 1.88, + 3.71, + 1.88 + ], + "channel_base": [ + 1.88, + 3.71, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C07_sky130_sW1.5_sL1", + "mode": "diffusion_only", + "A0": 226.0485, + "A_true": 228.8288, + "A_hat": 218.6845, + "d_true": 0.0123, + "d_hat": -0.03258, + "sign_true": 1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.9, + 0.85 + ], + "channel_true": [ + 1.88, + 4.32, + 1.88 + ], + "channel_base": [ + 1.88, + 3.71, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ], + "row_shift_change_um": 0.0, + "error_type": "routing channel height mis-predicted", + "channel_change": [ + 0.0, + 0.61, + 0.0 + ] + }, + { + "case": "C07_sky130_sW1.5_sL1", + "mode": "gate_only", + "A0": 226.0485, + "A_true": 216.7659, + "A_hat": 216.7659, + "d_true": -0.04106, + "d_hat": -0.04106, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.9, + 0.85 + ], + "channel_true": [ + 1.88, + 3.71, + 1.88 + ], + "channel_base": [ + 1.88, + 3.71, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C07_sky130_sW1.5_sL1", + "mode": "combined", + "A0": 226.0485, + "A_true": 225.9298, + "A_hat": 215.5049, + "d_true": -0.00053, + "d_hat": -0.04664, + "sign_true": 0, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85, + 1.36 + ], + "channel_true": [ + 1.88, + 4.32, + 1.88 + ], + "channel_base": [ + 1.88, + 3.71, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ], + "row_shift_change_um": 0.51, + "error_type": "routing channel height mis-predicted + row x-shift changed", + "channel_change": [ + 0.0, + 0.61, + 0.0 + ] + }, + { + "case": "C07_sky130_sW1.5_sL2", + "mode": "diffusion_only", + "A0": 320.7285, + "A_true": 313.3645, + "A_hat": 313.3645, + "d_true": -0.02296, + "d_hat": -0.02296, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.9, + 0.85 + ], + "channel_true": [ + 1.88, + 3.71, + 1.88 + ], + "channel_base": [ + 1.88, + 3.71, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C07_sky130_sW1.5_sL2", + "mode": "gate_only", + "A0": 320.7285, + "A_true": 307.5579, + "A_hat": 307.5579, + "d_true": -0.04106, + "d_hat": -0.04106, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.9, + 0.85 + ], + "channel_true": [ + 1.88, + 3.71, + 1.88 + ], + "channel_base": [ + 1.88, + 3.71, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C07_sky130_sW1.5_sL2", + "mode": "combined", + "A0": 320.7285, + "A_true": 306.2969, + "A_hat": 306.2969, + "d_true": -0.045, + "d_hat": -0.045, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85, + 1.36 + ], + "channel_true": [ + 1.88, + 3.71, + 1.88 + ], + "channel_base": [ + 1.88, + 3.71, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C07_sky130_sW1_sL2", + "mode": "diffusion_only", + "A0": 227.1005, + "A_true": 219.7365, + "A_hat": 219.7365, + "d_true": -0.03243, + "d_hat": -0.03243, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.9, + 0.85 + ], + "channel_true": [ + 1.88, + 3.71, + 1.88 + ], + "channel_base": [ + 1.88, + 3.71, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C07_sky130_sW1_sL2", + "mode": "gate_only", + "A0": 227.1005, + "A_true": 217.7747, + "A_hat": 217.7747, + "d_true": -0.04106, + "d_hat": -0.04106, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.9, + 0.85 + ], + "channel_true": [ + 1.88, + 3.71, + 1.88 + ], + "channel_base": [ + 1.88, + 3.71, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C07_sky130_sW1_sL2", + "mode": "combined", + "A0": 227.1005, + "A_true": 216.5137, + "A_hat": 216.5137, + "d_true": -0.04662, + "d_hat": -0.04662, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85, + 1.36 + ], + "channel_true": [ + 1.88, + 3.71, + 1.88 + ], + "channel_base": [ + 1.88, + 3.71, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C07_sky130_sW2_sL1.5", + "mode": "diffusion_only", + "A0": 351.2365, + "A_true": 343.8725, + "A_hat": 343.8725, + "d_true": -0.02097, + "d_hat": -0.02097, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.9, + 0.85 + ], + "channel_true": [ + 1.88, + 3.71, + 1.88 + ], + "channel_base": [ + 1.88, + 3.71, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C07_sky130_sW2_sL1.5", + "mode": "gate_only", + "A0": 351.2365, + "A_true": 336.8131, + "A_hat": 336.8131, + "d_true": -0.04106, + "d_hat": -0.04106, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.9, + 0.85 + ], + "channel_true": [ + 1.88, + 3.71, + 1.88 + ], + "channel_base": [ + 1.88, + 3.71, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C07_sky130_sW2_sL1.5", + "mode": "combined", + "A0": 351.2365, + "A_true": 335.5521, + "A_hat": 335.5521, + "d_true": -0.04465, + "d_hat": -0.04465, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85, + 1.36 + ], + "channel_true": [ + 1.88, + 3.71, + 1.88 + ], + "channel_base": [ + 1.88, + 3.71, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C07_sky130_sW2_sL1", + "mode": "diffusion_only", + "A0": 288.1165, + "A_true": 293.776, + "A_hat": 280.7525, + "d_true": 0.01964, + "d_hat": -0.02556, + "sign_true": 1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.9, + 0.85 + ], + "channel_true": [ + 1.88, + 4.32, + 1.88 + ], + "channel_base": [ + 1.88, + 3.71, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ], + "row_shift_change_um": 0.0, + "error_type": "routing channel height mis-predicted", + "channel_change": [ + 0.0, + 0.61, + 0.0 + ] + }, + { + "case": "C07_sky130_sW2_sL1", + "mode": "gate_only", + "A0": 288.1165, + "A_true": 276.2851, + "A_hat": 276.2851, + "d_true": -0.04106, + "d_hat": -0.04106, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.9, + 0.85 + ], + "channel_true": [ + 1.88, + 3.71, + 1.88 + ], + "channel_base": [ + 1.88, + 3.71, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C07_sky130_sW2_sL1", + "mode": "combined", + "A0": 288.1165, + "A_true": 288.3282, + "A_hat": 275.0241, + "d_true": 0.00073, + "d_hat": -0.04544, + "sign_true": 0, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85, + 1.36 + ], + "channel_true": [ + 1.88, + 4.32, + 1.88 + ], + "channel_base": [ + 1.88, + 3.71, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ], + "row_shift_change_um": 0.51, + "error_type": "routing channel height mis-predicted + row x-shift changed", + "channel_change": [ + 0.0, + 0.61, + 0.0 + ] + }, + { + "case": "C07_sky130_sW2_sL2", + "mode": "diffusion_only", + "A0": 414.3565, + "A_true": 406.9925, + "A_hat": 406.9925, + "d_true": -0.01777, + "d_hat": -0.01777, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.9, + 0.85 + ], + "channel_true": [ + 1.88, + 3.71, + 1.88 + ], + "channel_base": [ + 1.88, + 3.71, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C07_sky130_sW2_sL2", + "mode": "gate_only", + "A0": 414.3565, + "A_true": 397.3411, + "A_hat": 397.3411, + "d_true": -0.04106, + "d_hat": -0.04106, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.9, + 0.85 + ], + "channel_true": [ + 1.88, + 3.71, + 1.88 + ], + "channel_base": [ + 1.88, + 3.71, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C07_sky130_sW2_sL2", + "mode": "combined", + "A0": 414.3565, + "A_true": 396.0801, + "A_hat": 396.0801, + "d_true": -0.04411, + "d_hat": -0.04411, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85, + 1.36 + ], + "channel_true": [ + 1.88, + 3.71, + 1.88 + ], + "channel_base": [ + 1.88, + 3.71, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_gf180_sW0.5_sL1.5", + "mode": "diffusion_only", + "A0": 411.0432, + "A_true": 396.4672, + "A_hat": 396.4672, + "d_true": -0.03546, + "d_hat": -0.03546, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05, + 7.07 + ], + "channel_true": [ + 2.5, + 5.7, + 2.5 + ], + "channel_base": [ + 2.5, + 5.7, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_gf180_sW0.5_sL1.5", + "mode": "gate_only", + "A0": 411.0432, + "A_true": 392.9952, + "A_hat": 392.9952, + "d_true": -0.04391, + "d_hat": -0.04391, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05, + 7.07 + ], + "channel_true": [ + 2.5, + 5.7, + 2.5 + ], + "channel_base": [ + 2.5, + 5.7, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_gf180_sW0.5_sL1.5", + "mode": "combined", + "A0": 411.0432, + "A_true": 392.9952, + "A_hat": 392.9952, + "d_true": -0.04391, + "d_hat": -0.04391, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05, + 7.25 + ], + "channel_true": [ + 2.5, + 5.7, + 2.5 + ], + "channel_base": [ + 2.5, + 5.7, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_gf180_sW0.5_sL1", + "mode": "diffusion_only", + "A0": 349.824, + "A_true": 335.248, + "A_hat": 335.248, + "d_true": -0.04167, + "d_hat": -0.04167, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05, + 5.95 + ], + "channel_true": [ + 2.5, + 5.7, + 2.5 + ], + "channel_base": [ + 2.5, + 5.7, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_gf180_sW0.5_sL1", + "mode": "gate_only", + "A0": 349.824, + "A_true": 334.464, + "A_hat": 334.464, + "d_true": -0.04391, + "d_hat": -0.04391, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05, + 5.95 + ], + "channel_true": [ + 2.5, + 5.7, + 2.5 + ], + "channel_base": [ + 2.5, + 5.7, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_gf180_sW0.5_sL1", + "mode": "combined", + "A0": 349.824, + "A_true": 334.464, + "A_hat": 334.464, + "d_true": -0.04391, + "d_hat": -0.04391, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05, + 6.13 + ], + "channel_true": [ + 2.5, + 5.7, + 2.5 + ], + "channel_base": [ + 2.5, + 5.7, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_gf180_sW0.5_sL2", + "mode": "diffusion_only", + "A0": 472.2624, + "A_true": 457.6864, + "A_hat": 457.6864, + "d_true": -0.03086, + "d_hat": -0.03086, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05, + 8.19 + ], + "channel_true": [ + 2.5, + 5.7, + 2.5 + ], + "channel_base": [ + 2.5, + 5.7, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_gf180_sW0.5_sL2", + "mode": "gate_only", + "A0": 472.2624, + "A_true": 451.5264, + "A_hat": 451.5264, + "d_true": -0.04391, + "d_hat": -0.04391, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05, + 8.19 + ], + "channel_true": [ + 2.5, + 5.7, + 2.5 + ], + "channel_base": [ + 2.5, + 5.7, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_gf180_sW0.5_sL2", + "mode": "combined", + "A0": 472.2624, + "A_true": 451.5264, + "A_hat": 451.5264, + "d_true": -0.04391, + "d_hat": -0.04391, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05, + 8.37 + ], + "channel_true": [ + 2.5, + 5.7, + 2.5 + ], + "channel_base": [ + 2.5, + 5.7, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_gf180_sW1.5_sL1.5", + "mode": "diffusion_only", + "A0": 1023.2352, + "A_true": 1008.6592, + "A_hat": 1008.6592, + "d_true": -0.01425, + "d_hat": -0.01425, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05, + 18.27 + ], + "channel_true": [ + 2.5, + 5.7, + 2.5 + ], + "channel_base": [ + 2.5, + 5.7, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_gf180_sW1.5_sL1.5", + "mode": "gate_only", + "A0": 1023.2352, + "A_true": 978.3072, + "A_hat": 978.3072, + "d_true": -0.04391, + "d_hat": -0.04391, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05, + 18.27 + ], + "channel_true": [ + 2.5, + 5.7, + 2.5 + ], + "channel_base": [ + 2.5, + 5.7, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_gf180_sW1.5_sL1.5", + "mode": "combined", + "A0": 1023.2352, + "A_true": 978.3072, + "A_hat": 978.3072, + "d_true": -0.04391, + "d_hat": -0.04391, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05, + 18.45 + ], + "channel_true": [ + 2.5, + 5.7, + 2.5 + ], + "channel_base": [ + 2.5, + 5.7, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_gf180_sW1.5_sL1", + "mode": "diffusion_only", + "A0": 839.5776, + "A_true": 825.0016, + "A_hat": 825.0016, + "d_true": -0.01736, + "d_hat": -0.01736, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05, + 14.91 + ], + "channel_true": [ + 2.5, + 5.7, + 2.5 + ], + "channel_base": [ + 2.5, + 5.7, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_gf180_sW1.5_sL1", + "mode": "gate_only", + "A0": 839.5776, + "A_true": 802.7136, + "A_hat": 802.7136, + "d_true": -0.04391, + "d_hat": -0.04391, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05, + 14.91 + ], + "channel_true": [ + 2.5, + 5.7, + 2.5 + ], + "channel_base": [ + 2.5, + 5.7, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_gf180_sW1.5_sL1", + "mode": "combined", + "A0": 839.5776, + "A_true": 802.7136, + "A_hat": 802.7136, + "d_true": -0.04391, + "d_hat": -0.04391, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05, + 15.09 + ], + "channel_true": [ + 2.5, + 5.7, + 2.5 + ], + "channel_base": [ + 2.5, + 5.7, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_gf180_sW1.5_sL2", + "mode": "diffusion_only", + "A0": 1206.8928, + "A_true": 1192.3168, + "A_hat": 1192.3168, + "d_true": -0.01208, + "d_hat": -0.01208, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05, + 21.63 + ], + "channel_true": [ + 2.5, + 5.7, + 2.5 + ], + "channel_base": [ + 2.5, + 5.7, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_gf180_sW1.5_sL2", + "mode": "gate_only", + "A0": 1206.8928, + "A_true": 1153.9008, + "A_hat": 1153.9008, + "d_true": -0.04391, + "d_hat": -0.04391, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05, + 21.63 + ], + "channel_true": [ + 2.5, + 5.7, + 2.5 + ], + "channel_base": [ + 2.5, + 5.7, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_gf180_sW1.5_sL2", + "mode": "combined", + "A0": 1206.8928, + "A_true": 1153.9008, + "A_hat": 1153.9008, + "d_true": -0.04391, + "d_hat": -0.04391, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05, + 21.81 + ], + "channel_true": [ + 2.5, + 5.7, + 2.5 + ], + "channel_base": [ + 2.5, + 5.7, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_gf180_sW1_sL2", + "mode": "diffusion_only", + "A0": 839.5776, + "A_true": 825.0016, + "A_hat": 825.0016, + "d_true": -0.01736, + "d_hat": -0.01736, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05, + 14.91 + ], + "channel_true": [ + 2.5, + 5.7, + 2.5 + ], + "channel_base": [ + 2.5, + 5.7, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_gf180_sW1_sL2", + "mode": "gate_only", + "A0": 839.5776, + "A_true": 802.7136, + "A_hat": 802.7136, + "d_true": -0.04391, + "d_hat": -0.04391, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05, + 14.91 + ], + "channel_true": [ + 2.5, + 5.7, + 2.5 + ], + "channel_base": [ + 2.5, + 5.7, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_gf180_sW1_sL2", + "mode": "combined", + "A0": 839.5776, + "A_true": 802.7136, + "A_hat": 802.7136, + "d_true": -0.04391, + "d_hat": -0.04391, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05, + 15.09 + ], + "channel_true": [ + 2.5, + 5.7, + 2.5 + ], + "channel_base": [ + 2.5, + 5.7, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_gf180_sW2_sL1.5", + "mode": "diffusion_only", + "A0": 1329.3312, + "A_true": 1314.7552, + "A_hat": 1314.7552, + "d_true": -0.01096, + "d_hat": -0.01096, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05, + 23.87 + ], + "channel_true": [ + 2.5, + 5.7, + 2.5 + ], + "channel_base": [ + 2.5, + 5.7, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_gf180_sW2_sL1.5", + "mode": "gate_only", + "A0": 1329.3312, + "A_true": 1270.9632, + "A_hat": 1270.9632, + "d_true": -0.04391, + "d_hat": -0.04391, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05, + 23.87 + ], + "channel_true": [ + 2.5, + 5.7, + 2.5 + ], + "channel_base": [ + 2.5, + 5.7, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_gf180_sW2_sL1.5", + "mode": "combined", + "A0": 1329.3312, + "A_true": 1270.9632, + "A_hat": 1270.9632, + "d_true": -0.04391, + "d_hat": -0.04391, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05, + 24.05 + ], + "channel_true": [ + 2.5, + 5.7, + 2.5 + ], + "channel_base": [ + 2.5, + 5.7, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_gf180_sW2_sL1", + "mode": "diffusion_only", + "A0": 1084.4544, + "A_true": 1069.8784, + "A_hat": 1069.8784, + "d_true": -0.01344, + "d_hat": -0.01344, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05, + 19.39 + ], + "channel_true": [ + 2.5, + 5.7, + 2.5 + ], + "channel_base": [ + 2.5, + 5.7, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_gf180_sW2_sL1", + "mode": "gate_only", + "A0": 1084.4544, + "A_true": 1036.8384, + "A_hat": 1036.8384, + "d_true": -0.04391, + "d_hat": -0.04391, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05, + 19.39 + ], + "channel_true": [ + 2.5, + 5.7, + 2.5 + ], + "channel_base": [ + 2.5, + 5.7, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_gf180_sW2_sL1", + "mode": "combined", + "A0": 1084.4544, + "A_true": 1036.8384, + "A_hat": 1036.8384, + "d_true": -0.04391, + "d_hat": -0.04391, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05, + 19.57 + ], + "channel_true": [ + 2.5, + 5.7, + 2.5 + ], + "channel_base": [ + 2.5, + 5.7, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_gf180_sW2_sL2", + "mode": "diffusion_only", + "A0": 1574.208, + "A_true": 1559.632, + "A_hat": 1559.632, + "d_true": -0.00926, + "d_hat": -0.00926, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05, + 28.35 + ], + "channel_true": [ + 2.5, + 5.7, + 2.5 + ], + "channel_base": [ + 2.5, + 5.7, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_gf180_sW2_sL2", + "mode": "gate_only", + "A0": 1574.208, + "A_true": 1505.088, + "A_hat": 1505.088, + "d_true": -0.04391, + "d_hat": -0.04391, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05, + 28.35 + ], + "channel_true": [ + 2.5, + 5.7, + 2.5 + ], + "channel_base": [ + 2.5, + 5.7, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_gf180_sW2_sL2", + "mode": "combined", + "A0": 1574.208, + "A_true": 1505.088, + "A_hat": 1505.088, + "d_true": -0.04391, + "d_hat": -0.04391, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05, + 28.53 + ], + "channel_true": [ + 2.5, + 5.7, + 2.5 + ], + "channel_base": [ + 2.5, + 5.7, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_ihp130_sW0.5_sL1.5", + "mode": "diffusion_only", + "A0": 205.8175, + "A_true": 199.0345, + "A_hat": 199.0345, + "d_true": -0.03296, + "d_hat": -0.03296, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85, + 4.855 + ], + "channel_true": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_ihp130_sW0.5_sL1.5", + "mode": "gate_only", + "A0": 205.8175, + "A_true": 197.9253, + "A_hat": 197.9253, + "d_true": -0.03835, + "d_hat": -0.03835, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85, + 4.855 + ], + "channel_true": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_ihp130_sW0.5_sL1.5", + "mode": "combined", + "A0": 205.8175, + "A_true": 197.9253, + "A_hat": 197.9253, + "d_true": -0.03835, + "d_hat": -0.03835, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85, + 4.95 + ], + "channel_true": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_ihp130_sW0.5_sL2", + "mode": "diffusion_only", + "A0": 236.9395, + "A_true": 230.1565, + "A_hat": 230.1565, + "d_true": -0.02863, + "d_hat": -0.02863, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85, + 5.635 + ], + "channel_true": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_ihp130_sW0.5_sL2", + "mode": "gate_only", + "A0": 236.9395, + "A_true": 227.8538, + "A_hat": 227.8539, + "d_true": -0.03835, + "d_hat": -0.03835, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85, + 5.635 + ], + "channel_true": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_ihp130_sW0.5_sL2", + "mode": "combined", + "A0": 236.9395, + "A_true": 227.8538, + "A_hat": 227.8539, + "d_true": -0.03835, + "d_hat": -0.03835, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85, + 5.73 + ], + "channel_true": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_ihp130_sW1.5_sL1.5", + "mode": "diffusion_only", + "A0": 513.8455, + "A_true": 507.0625, + "A_hat": 507.0625, + "d_true": -0.0132, + "d_hat": -0.0132, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85, + 12.575 + ], + "channel_true": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_ihp130_sW1.5_sL1.5", + "mode": "gate_only", + "A0": 513.8455, + "A_true": 494.1417, + "A_hat": 494.1417, + "d_true": -0.03835, + "d_hat": -0.03835, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85, + 12.575 + ], + "channel_true": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_ihp130_sW1.5_sL1.5", + "mode": "combined", + "A0": 513.8455, + "A_true": 494.1417, + "A_hat": 494.1417, + "d_true": -0.03835, + "d_hat": -0.03835, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85, + 12.67 + ], + "channel_true": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_ihp130_sW1.5_sL1", + "mode": "diffusion_only", + "A0": 420.4795, + "A_true": 413.6965, + "A_hat": 413.6965, + "d_true": -0.01613, + "d_hat": -0.01613, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85, + 10.235 + ], + "channel_true": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_ihp130_sW1.5_sL1", + "mode": "gate_only", + "A0": 420.4795, + "A_true": 404.3559, + "A_hat": 404.3559, + "d_true": -0.03835, + "d_hat": -0.03835, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85, + 10.235 + ], + "channel_true": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_ihp130_sW1.5_sL1", + "mode": "combined", + "A0": 420.4795, + "A_true": 404.3559, + "A_hat": 404.3559, + "d_true": -0.03835, + "d_hat": -0.03835, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85, + 10.33 + ], + "channel_true": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_ihp130_sW1.5_sL2", + "mode": "diffusion_only", + "A0": 607.2115, + "A_true": 600.4285, + "A_hat": 600.4285, + "d_true": -0.01117, + "d_hat": -0.01117, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85, + 14.915 + ], + "channel_true": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_ihp130_sW1.5_sL2", + "mode": "gate_only", + "A0": 607.2115, + "A_true": 583.9275, + "A_hat": 583.9275, + "d_true": -0.03835, + "d_hat": -0.03835, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85, + 14.915 + ], + "channel_true": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_ihp130_sW1.5_sL2", + "mode": "combined", + "A0": 607.2115, + "A_true": 583.9275, + "A_hat": 583.9275, + "d_true": -0.03835, + "d_hat": -0.03835, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85, + 15.01 + ], + "channel_true": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_ihp130_sW1_sL2", + "mode": "diffusion_only", + "A0": 422.0755, + "A_true": 415.2925, + "A_hat": 415.2925, + "d_true": -0.01607, + "d_hat": -0.01607, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85, + 10.275 + ], + "channel_true": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_ihp130_sW1_sL2", + "mode": "gate_only", + "A0": 422.0755, + "A_true": 405.8906, + "A_hat": 405.8906, + "d_true": -0.03835, + "d_hat": -0.03835, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85, + 10.275 + ], + "channel_true": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_ihp130_sW1_sL2", + "mode": "combined", + "A0": 422.0755, + "A_true": 405.8906, + "A_hat": 405.8906, + "d_true": -0.03835, + "d_hat": -0.03835, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85, + 10.37 + ], + "channel_true": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_ihp130_sW2_sL1.5", + "mode": "diffusion_only", + "A0": 667.8595, + "A_true": 661.0765, + "A_hat": 661.0765, + "d_true": -0.01016, + "d_hat": -0.01016, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85, + 16.435 + ], + "channel_true": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_ihp130_sW2_sL1.5", + "mode": "gate_only", + "A0": 667.8595, + "A_true": 642.2499, + "A_hat": 642.2499, + "d_true": -0.03835, + "d_hat": -0.03835, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85, + 16.435 + ], + "channel_true": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_ihp130_sW2_sL1.5", + "mode": "combined", + "A0": 667.8595, + "A_true": 642.2499, + "A_hat": 642.2499, + "d_true": -0.03835, + "d_hat": -0.03835, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85, + 16.53 + ], + "channel_true": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_ihp130_sW2_sL2", + "mode": "diffusion_only", + "A0": 792.3475, + "A_true": 785.5645, + "A_hat": 785.5645, + "d_true": -0.00856, + "d_hat": -0.00856, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85, + 19.555 + ], + "channel_true": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_ihp130_sW2_sL2", + "mode": "gate_only", + "A0": 792.3475, + "A_true": 761.9643, + "A_hat": 761.9643, + "d_true": -0.03835, + "d_hat": -0.03835, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85, + 19.555 + ], + "channel_true": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_ihp130_sW2_sL2", + "mode": "combined", + "A0": 792.3475, + "A_true": 761.9643, + "A_hat": 761.9643, + "d_true": -0.03835, + "d_hat": -0.03835, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85, + 19.65 + ], + "channel_true": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 4.08, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_sky130_sW0.5_sL1.5", + "mode": "diffusion_only", + "A0": 183.352, + "A_true": 175.6464, + "A_hat": 175.6464, + "d_true": -0.04203, + "d_hat": -0.04203, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85, + 4.08 + ], + "channel_true": [ + 1.88, + 4.32, + 1.88 + ], + "channel_base": [ + 1.88, + 4.32, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_sky130_sW0.5_sL1.5", + "mode": "gate_only", + "A0": 183.352, + "A_true": 176.1565, + "A_hat": 176.1565, + "d_true": -0.03924, + "d_hat": -0.03924, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85, + 4.08 + ], + "channel_true": [ + 1.88, + 4.32, + 1.88 + ], + "channel_base": [ + 1.88, + 4.32, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_sky130_sW0.5_sL1.5", + "mode": "combined", + "A0": 183.352, + "A_true": 176.1565, + "A_hat": 176.1565, + "d_true": -0.03924, + "d_hat": -0.03924, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85, + 4.32 + ], + "channel_true": [ + 1.88, + 4.32, + 1.88 + ], + "channel_base": [ + 1.88, + 4.32, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_sky130_sW0.5_sL1", + "mode": "diffusion_only", + "A0": 158.584, + "A_true": 150.8784, + "A_hat": 150.8784, + "d_true": -0.04859, + "d_hat": -0.04859, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85, + 3.48 + ], + "channel_true": [ + 1.88, + 4.32, + 1.88 + ], + "channel_base": [ + 1.88, + 4.32, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_sky130_sW0.5_sL1", + "mode": "gate_only", + "A0": 158.584, + "A_true": 152.3605, + "A_hat": 152.3605, + "d_true": -0.03924, + "d_hat": -0.03924, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85, + 3.48 + ], + "channel_true": [ + 1.88, + 4.32, + 1.88 + ], + "channel_base": [ + 1.88, + 4.32, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_sky130_sW0.5_sL1", + "mode": "combined", + "A0": 158.584, + "A_true": 152.3605, + "A_hat": 152.3605, + "d_true": -0.03924, + "d_hat": -0.03924, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85, + 3.72 + ], + "channel_true": [ + 1.88, + 4.32, + 1.88 + ], + "channel_base": [ + 1.88, + 4.32, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_sky130_sW0.5_sL2", + "mode": "diffusion_only", + "A0": 208.12, + "A_true": 200.4144, + "A_hat": 200.4144, + "d_true": -0.03702, + "d_hat": -0.03702, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85, + 4.68 + ], + "channel_true": [ + 1.88, + 4.32, + 1.88 + ], + "channel_base": [ + 1.88, + 4.32, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_sky130_sW0.5_sL2", + "mode": "gate_only", + "A0": 208.12, + "A_true": 199.9525, + "A_hat": 199.9525, + "d_true": -0.03924, + "d_hat": -0.03924, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85, + 4.68 + ], + "channel_true": [ + 1.88, + 4.32, + 1.88 + ], + "channel_base": [ + 1.88, + 4.32, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_sky130_sW0.5_sL2", + "mode": "combined", + "A0": 208.12, + "A_true": 199.9525, + "A_hat": 199.9525, + "d_true": -0.03924, + "d_hat": -0.03924, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85, + 4.92 + ], + "channel_true": [ + 1.88, + 4.32, + 1.88 + ], + "channel_base": [ + 1.88, + 4.32, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_sky130_sW1.5_sL1.5", + "mode": "diffusion_only", + "A0": 427.7296, + "A_true": 420.024, + "A_hat": 420.024, + "d_true": -0.01802, + "d_hat": -0.01802, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85, + 10.0 + ], + "channel_true": [ + 1.88, + 4.32, + 1.88 + ], + "channel_base": [ + 1.88, + 4.32, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_sky130_sW1.5_sL1.5", + "mode": "gate_only", + "A0": 427.7296, + "A_true": 410.9437, + "A_hat": 410.9437, + "d_true": -0.03924, + "d_hat": -0.03924, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85, + 10.0 + ], + "channel_true": [ + 1.88, + 4.32, + 1.88 + ], + "channel_base": [ + 1.88, + 4.32, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_sky130_sW1.5_sL1.5", + "mode": "combined", + "A0": 427.7296, + "A_true": 410.9437, + "A_hat": 410.9437, + "d_true": -0.03924, + "d_hat": -0.03924, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85, + 10.24 + ], + "channel_true": [ + 1.88, + 4.32, + 1.88 + ], + "channel_base": [ + 1.88, + 4.32, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_sky130_sW1.5_sL1", + "mode": "diffusion_only", + "A0": 353.4256, + "A_true": 345.72, + "A_hat": 345.72, + "d_true": -0.0218, + "d_hat": -0.0218, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85, + 8.2 + ], + "channel_true": [ + 1.88, + 4.32, + 1.88 + ], + "channel_base": [ + 1.88, + 4.32, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_sky130_sW1.5_sL1", + "mode": "gate_only", + "A0": 353.4256, + "A_true": 339.5557, + "A_hat": 339.5557, + "d_true": -0.03924, + "d_hat": -0.03924, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85, + 8.2 + ], + "channel_true": [ + 1.88, + 4.32, + 1.88 + ], + "channel_base": [ + 1.88, + 4.32, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_sky130_sW1.5_sL1", + "mode": "combined", + "A0": 353.4256, + "A_true": 339.5557, + "A_hat": 339.5557, + "d_true": -0.03924, + "d_hat": -0.03924, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85, + 8.44 + ], + "channel_true": [ + 1.88, + 4.32, + 1.88 + ], + "channel_base": [ + 1.88, + 4.32, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_sky130_sW1.5_sL2", + "mode": "diffusion_only", + "A0": 502.0336, + "A_true": 494.328, + "A_hat": 494.328, + "d_true": -0.01535, + "d_hat": -0.01535, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85, + 11.8 + ], + "channel_true": [ + 1.88, + 4.32, + 1.88 + ], + "channel_base": [ + 1.88, + 4.32, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_sky130_sW1.5_sL2", + "mode": "gate_only", + "A0": 502.0336, + "A_true": 482.3317, + "A_hat": 482.3317, + "d_true": -0.03924, + "d_hat": -0.03924, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85, + 11.8 + ], + "channel_true": [ + 1.88, + 4.32, + 1.88 + ], + "channel_base": [ + 1.88, + 4.32, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_sky130_sW1.5_sL2", + "mode": "combined", + "A0": 502.0336, + "A_true": 482.3317, + "A_hat": 482.3317, + "d_true": -0.03924, + "d_hat": -0.03924, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85, + 12.04 + ], + "channel_true": [ + 1.88, + 4.32, + 1.88 + ], + "channel_base": [ + 1.88, + 4.32, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_sky130_sW1_sL2", + "mode": "diffusion_only", + "A0": 355.0768, + "A_true": 347.3712, + "A_hat": 347.3712, + "d_true": -0.0217, + "d_hat": -0.0217, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85, + 8.24 + ], + "channel_true": [ + 1.88, + 4.32, + 1.88 + ], + "channel_base": [ + 1.88, + 4.32, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_sky130_sW1_sL2", + "mode": "gate_only", + "A0": 355.0768, + "A_true": 341.1421, + "A_hat": 341.1421, + "d_true": -0.03924, + "d_hat": -0.03924, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85, + 8.24 + ], + "channel_true": [ + 1.88, + 4.32, + 1.88 + ], + "channel_base": [ + 1.88, + 4.32, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_sky130_sW1_sL2", + "mode": "combined", + "A0": 355.0768, + "A_true": 341.1421, + "A_hat": 341.1421, + "d_true": -0.03924, + "d_hat": -0.03924, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85, + 8.48 + ], + "channel_true": [ + 1.88, + 4.32, + 1.88 + ], + "channel_base": [ + 1.88, + 4.32, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_sky130_sW2_sL1.5", + "mode": "diffusion_only", + "A0": 549.9184, + "A_true": 542.2128, + "A_hat": 542.2128, + "d_true": -0.01401, + "d_hat": -0.01401, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85, + 12.96 + ], + "channel_true": [ + 1.88, + 4.32, + 1.88 + ], + "channel_base": [ + 1.88, + 4.32, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_sky130_sW2_sL1.5", + "mode": "gate_only", + "A0": 549.9184, + "A_true": 528.3373, + "A_hat": 528.3373, + "d_true": -0.03924, + "d_hat": -0.03924, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85, + 12.96 + ], + "channel_true": [ + 1.88, + 4.32, + 1.88 + ], + "channel_base": [ + 1.88, + 4.32, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_sky130_sW2_sL1.5", + "mode": "combined", + "A0": 549.9184, + "A_true": 528.3373, + "A_hat": 528.3373, + "d_true": -0.03924, + "d_hat": -0.03924, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85, + 13.2 + ], + "channel_true": [ + 1.88, + 4.32, + 1.88 + ], + "channel_base": [ + 1.88, + 4.32, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_sky130_sW2_sL1", + "mode": "diffusion_only", + "A0": 450.8464, + "A_true": 443.1408, + "A_hat": 443.1408, + "d_true": -0.01709, + "d_hat": -0.01709, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85, + 10.56 + ], + "channel_true": [ + 1.88, + 4.32, + 1.88 + ], + "channel_base": [ + 1.88, + 4.32, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_sky130_sW2_sL1", + "mode": "gate_only", + "A0": 450.8464, + "A_true": 433.1533, + "A_hat": 433.1533, + "d_true": -0.03924, + "d_hat": -0.03924, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85, + 10.56 + ], + "channel_true": [ + 1.88, + 4.32, + 1.88 + ], + "channel_base": [ + 1.88, + 4.32, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_sky130_sW2_sL1", + "mode": "combined", + "A0": 450.8464, + "A_true": 433.1533, + "A_hat": 433.1533, + "d_true": -0.03924, + "d_hat": -0.03924, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85, + 10.8 + ], + "channel_true": [ + 1.88, + 4.32, + 1.88 + ], + "channel_base": [ + 1.88, + 4.32, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_sky130_sW2_sL2", + "mode": "diffusion_only", + "A0": 648.9904, + "A_true": 641.2848, + "A_hat": 641.2848, + "d_true": -0.01187, + "d_hat": -0.01187, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85, + 15.36 + ], + "channel_true": [ + 1.88, + 4.32, + 1.88 + ], + "channel_base": [ + 1.88, + 4.32, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_sky130_sW2_sL2", + "mode": "gate_only", + "A0": 648.9904, + "A_true": 623.5213, + "A_hat": 623.5213, + "d_true": -0.03924, + "d_hat": -0.03924, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85, + 15.36 + ], + "channel_true": [ + 1.88, + 4.32, + 1.88 + ], + "channel_base": [ + 1.88, + 4.32, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C08_sky130_sW2_sL2", + "mode": "combined", + "A0": 648.9904, + "A_true": 623.5213, + "A_hat": 623.5213, + "d_true": -0.03924, + "d_hat": -0.03924, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85, + 15.6 + ], + "channel_true": [ + 1.88, + 4.32, + 1.88 + ], + "channel_base": [ + 1.88, + 4.32, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C09_gf180_sW1.5_sL1.5", + "mode": "diffusion_only", + "A0": 1665.6112, + "A_true": 1647.8352, + "A_hat": 1647.8352, + "d_true": -0.01067, + "d_hat": -0.01067, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.25, + 1.05 + ], + "channel_true": [ + 2.5, + 8.9, + 3.3 + ], + "channel_base": [ + 2.5, + 8.9, + 3.3 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C09_gf180_sW1.5_sL1.5", + "mode": "gate_only", + "A0": 1665.6112, + "A_true": 1665.6112, + "A_hat": 1665.6112, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 1.25, + 1.05 + ], + "channel_true": [ + 2.5, + 8.9, + 3.3 + ], + "channel_base": [ + 2.5, + 8.9, + 3.3 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C09_gf180_sW1.5_sL1.5", + "mode": "combined", + "A0": 1665.6112, + "A_true": 1647.8352, + "A_hat": 1647.8352, + "d_true": -0.01067, + "d_hat": -0.01067, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.25, + 1.05 + ], + "channel_true": [ + 2.5, + 8.9, + 3.3 + ], + "channel_base": [ + 2.5, + 8.9, + 3.3 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C09_gf180_sW1.5_sL1", + "mode": "diffusion_only", + "A0": 1366.9744, + "A_true": 1349.1984, + "A_hat": 1349.1984, + "d_true": -0.013, + "d_hat": -0.013, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.25, + 1.05 + ], + "channel_true": [ + 2.5, + 8.9, + 3.3 + ], + "channel_base": [ + 2.5, + 8.9, + 3.3 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C09_gf180_sW1.5_sL1", + "mode": "gate_only", + "A0": 1366.9744, + "A_true": 1366.9744, + "A_hat": 1366.9744, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 1.25, + 1.05 + ], + "channel_true": [ + 2.5, + 8.9, + 3.3 + ], + "channel_base": [ + 2.5, + 8.9, + 3.3 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C09_gf180_sW1.5_sL1", + "mode": "combined", + "A0": 1366.9744, + "A_true": 1349.1984, + "A_hat": 1349.1984, + "d_true": -0.013, + "d_hat": -0.013, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.25, + 1.05 + ], + "channel_true": [ + 2.5, + 8.9, + 3.3 + ], + "channel_base": [ + 2.5, + 8.9, + 3.3 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C09_gf180_sW1.5_sL2", + "mode": "diffusion_only", + "A0": 1964.248, + "A_true": 1946.472, + "A_hat": 1946.472, + "d_true": -0.00905, + "d_hat": -0.00905, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.25, + 1.05 + ], + "channel_true": [ + 2.5, + 8.9, + 3.3 + ], + "channel_base": [ + 2.5, + 8.9, + 3.3 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C09_gf180_sW1.5_sL2", + "mode": "gate_only", + "A0": 1964.248, + "A_true": 1964.248, + "A_hat": 1964.248, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 1.25, + 1.05 + ], + "channel_true": [ + 2.5, + 8.9, + 3.3 + ], + "channel_base": [ + 2.5, + 8.9, + 3.3 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C09_gf180_sW1.5_sL2", + "mode": "combined", + "A0": 1964.248, + "A_true": 1946.472, + "A_hat": 1946.472, + "d_true": -0.00905, + "d_hat": -0.00905, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.25, + 1.05 + ], + "channel_true": [ + 2.5, + 8.9, + 3.3 + ], + "channel_base": [ + 2.5, + 8.9, + 3.3 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C09_gf180_sW2_sL1.5", + "mode": "diffusion_only", + "A0": 2163.3392, + "A_true": 2145.5632, + "A_hat": 2145.5632, + "d_true": -0.00822, + "d_hat": -0.00822, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.25, + 1.05 + ], + "channel_true": [ + 2.5, + 8.9, + 3.3 + ], + "channel_base": [ + 2.5, + 8.9, + 3.3 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C09_gf180_sW2_sL1.5", + "mode": "gate_only", + "A0": 2163.3392, + "A_true": 2163.3392, + "A_hat": 2163.3392, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 1.25, + 1.05 + ], + "channel_true": [ + 2.5, + 8.9, + 3.3 + ], + "channel_base": [ + 2.5, + 8.9, + 3.3 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C09_gf180_sW2_sL1.5", + "mode": "combined", + "A0": 2163.3392, + "A_true": 2145.5632, + "A_hat": 2145.5632, + "d_true": -0.00822, + "d_hat": -0.00822, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.25, + 1.05 + ], + "channel_true": [ + 2.5, + 8.9, + 3.3 + ], + "channel_base": [ + 2.5, + 8.9, + 3.3 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C09_gf180_sW2_sL1", + "mode": "diffusion_only", + "A0": 1765.1568, + "A_true": 1747.3808, + "A_hat": 1747.3808, + "d_true": -0.01007, + "d_hat": -0.01007, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.25, + 1.05 + ], + "channel_true": [ + 2.5, + 8.9, + 3.3 + ], + "channel_base": [ + 2.5, + 8.9, + 3.3 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C09_gf180_sW2_sL1", + "mode": "gate_only", + "A0": 1765.1568, + "A_true": 1765.1568, + "A_hat": 1765.1568, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 1.25, + 1.05 + ], + "channel_true": [ + 2.5, + 8.9, + 3.3 + ], + "channel_base": [ + 2.5, + 8.9, + 3.3 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C09_gf180_sW2_sL1", + "mode": "combined", + "A0": 1765.1568, + "A_true": 1747.3808, + "A_hat": 1747.3808, + "d_true": -0.01007, + "d_hat": -0.01007, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.25, + 1.05 + ], + "channel_true": [ + 2.5, + 8.9, + 3.3 + ], + "channel_base": [ + 2.5, + 8.9, + 3.3 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C09_gf180_sW2_sL2", + "mode": "diffusion_only", + "A0": 2561.5216, + "A_true": 2543.7456, + "A_hat": 2543.7456, + "d_true": -0.00694, + "d_hat": -0.00694, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.25, + 1.05 + ], + "channel_true": [ + 2.5, + 8.9, + 3.3 + ], + "channel_base": [ + 2.5, + 8.9, + 3.3 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C09_gf180_sW2_sL2", + "mode": "gate_only", + "A0": 2561.5216, + "A_true": 2561.5216, + "A_hat": 2561.5216, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 1.25, + 1.05 + ], + "channel_true": [ + 2.5, + 8.9, + 3.3 + ], + "channel_base": [ + 2.5, + 8.9, + 3.3 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C09_gf180_sW2_sL2", + "mode": "combined", + "A0": 2561.5216, + "A_true": 2543.7456, + "A_hat": 2543.7456, + "d_true": -0.00694, + "d_hat": -0.00694, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.25, + 1.05 + ], + "channel_true": [ + 2.5, + 8.9, + 3.3 + ], + "channel_base": [ + 2.5, + 8.9, + 3.3 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C09_ihp130_sW0.5_sL1.5", + "mode": "diffusion_only", + "A0": 890.9062, + "A_true": 882.6187, + "A_hat": 882.6188, + "d_true": -0.0093, + "d_hat": -0.0093, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 13.53, + 0.94 + ], + "channel_true": [ + 1.7199999999999998, + 6.4399999999999995, + 2.3099999999999996 + ], + "channel_base": [ + 1.7199999999999998, + 6.4399999999999995, + 2.3099999999999996 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C09_ihp130_sW0.5_sL1.5", + "mode": "gate_only", + "A0": 890.9062, + "A_true": 890.9062, + "A_hat": 890.9062, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 13.53, + 0.94 + ], + "channel_true": [ + 1.7199999999999998, + 6.4399999999999995, + 2.3099999999999996 + ], + "channel_base": [ + 1.7199999999999998, + 6.4399999999999995, + 2.3099999999999996 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C09_ihp130_sW0.5_sL1.5", + "mode": "combined", + "A0": 890.9062, + "A_true": 882.6187, + "A_hat": 882.6188, + "d_true": -0.0093, + "d_hat": -0.0093, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 13.53, + 0.94 + ], + "channel_true": [ + 1.7199999999999998, + 6.4399999999999995, + 2.3099999999999996 + ], + "channel_base": [ + 1.7199999999999998, + 6.4399999999999995, + 2.3099999999999996 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C09_ihp130_sW0.5_sL1", + "mode": "diffusion_only", + "A0": 755.7063, + "A_true": 747.4187, + "A_hat": 747.4188, + "d_true": -0.01097, + "d_hat": -0.01097, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 11.45, + 0.94 + ], + "channel_true": [ + 1.7199999999999998, + 6.4399999999999995, + 2.3099999999999996 + ], + "channel_base": [ + 1.7199999999999998, + 6.4399999999999995, + 2.3099999999999996 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C09_ihp130_sW0.5_sL1", + "mode": "gate_only", + "A0": 755.7063, + "A_true": 755.7063, + "A_hat": 755.7063, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 11.45, + 0.94 + ], + "channel_true": [ + 1.7199999999999998, + 6.4399999999999995, + 2.3099999999999996 + ], + "channel_base": [ + 1.7199999999999998, + 6.4399999999999995, + 2.3099999999999996 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C09_ihp130_sW0.5_sL1", + "mode": "combined", + "A0": 755.7063, + "A_true": 747.4187, + "A_hat": 747.4188, + "d_true": -0.01097, + "d_hat": -0.01097, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 11.45, + 0.94 + ], + "channel_true": [ + 1.7199999999999998, + 6.4399999999999995, + 2.3099999999999996 + ], + "channel_base": [ + 1.7199999999999998, + 6.4399999999999995, + 2.3099999999999996 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C09_ihp130_sW0.5_sL2", + "mode": "diffusion_only", + "A0": 1026.1063, + "A_true": 1017.8188, + "A_hat": 1017.8188, + "d_true": -0.00808, + "d_hat": -0.00808, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 15.61, + 0.94 + ], + "channel_true": [ + 1.7199999999999998, + 6.4399999999999995, + 2.3099999999999996 + ], + "channel_base": [ + 1.7199999999999998, + 6.4399999999999995, + 2.3099999999999996 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C09_ihp130_sW0.5_sL2", + "mode": "gate_only", + "A0": 1026.1063, + "A_true": 1026.1063, + "A_hat": 1026.1063, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 15.61, + 0.94 + ], + "channel_true": [ + 1.7199999999999998, + 6.4399999999999995, + 2.3099999999999996 + ], + "channel_base": [ + 1.7199999999999998, + 6.4399999999999995, + 2.3099999999999996 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C09_ihp130_sW0.5_sL2", + "mode": "combined", + "A0": 1026.1063, + "A_true": 1017.8188, + "A_hat": 1017.8188, + "d_true": -0.00808, + "d_hat": -0.00808, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 15.61, + 0.94 + ], + "channel_true": [ + 1.7199999999999998, + 6.4399999999999995, + 2.3099999999999996 + ], + "channel_base": [ + 1.7199999999999998, + 6.4399999999999995, + 2.3099999999999996 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C09_ihp130_sW1.5_sL1.5", + "mode": "diffusion_only", + "A0": 2492.5063, + "A_true": 2484.2188, + "A_hat": 2484.2188, + "d_true": -0.00332, + "d_hat": -0.00332, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 38.17, + 0.94 + ], + "channel_true": [ + 1.7199999999999998, + 6.4399999999999995, + 2.3099999999999996 + ], + "channel_base": [ + 1.7199999999999998, + 6.4399999999999995, + 2.3099999999999996 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C09_ihp130_sW1.5_sL1.5", + "mode": "gate_only", + "A0": 2492.5063, + "A_true": 2492.5063, + "A_hat": 2492.5062, + "d_true": 0.0, + "d_hat": -0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 38.17, + 0.94 + ], + "channel_true": [ + 1.7199999999999998, + 6.4399999999999995, + 2.3099999999999996 + ], + "channel_base": [ + 1.7199999999999998, + 6.4399999999999995, + 2.3099999999999996 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C09_ihp130_sW1.5_sL1.5", + "mode": "combined", + "A0": 2492.5063, + "A_true": 2484.2188, + "A_hat": 2484.2188, + "d_true": -0.00332, + "d_hat": -0.00332, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 38.17, + 0.94 + ], + "channel_true": [ + 1.7199999999999998, + 6.4399999999999995, + 2.3099999999999996 + ], + "channel_base": [ + 1.7199999999999998, + 6.4399999999999995, + 2.3099999999999996 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C09_ihp130_sW1.5_sL1", + "mode": "diffusion_only", + "A0": 2086.9062, + "A_true": 2078.6188, + "A_hat": 2078.6188, + "d_true": -0.00397, + "d_hat": -0.00397, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 31.93, + 0.94 + ], + "channel_true": [ + 1.7199999999999998, + 6.4399999999999995, + 2.3099999999999996 + ], + "channel_base": [ + 1.7199999999999998, + 6.4399999999999995, + 2.3099999999999996 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C09_ihp130_sW1.5_sL1", + "mode": "gate_only", + "A0": 2086.9062, + "A_true": 2086.9062, + "A_hat": 2086.9062, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 31.93, + 0.94 + ], + "channel_true": [ + 1.7199999999999998, + 6.4399999999999995, + 2.3099999999999996 + ], + "channel_base": [ + 1.7199999999999998, + 6.4399999999999995, + 2.3099999999999996 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C09_ihp130_sW1.5_sL1", + "mode": "combined", + "A0": 2086.9062, + "A_true": 2078.6188, + "A_hat": 2078.6188, + "d_true": -0.00397, + "d_hat": -0.00397, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 31.93, + 0.94 + ], + "channel_true": [ + 1.7199999999999998, + 6.4399999999999995, + 2.3099999999999996 + ], + "channel_base": [ + 1.7199999999999998, + 6.4399999999999995, + 2.3099999999999996 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C09_ihp130_sW1.5_sL2", + "mode": "diffusion_only", + "A0": 2898.1063, + "A_true": 2889.8187, + "A_hat": 2889.8187, + "d_true": -0.00286, + "d_hat": -0.00286, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 44.41, + 0.94 + ], + "channel_true": [ + 1.7199999999999998, + 6.4399999999999995, + 2.3099999999999996 + ], + "channel_base": [ + 1.7199999999999998, + 6.4399999999999995, + 2.3099999999999996 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C09_ihp130_sW1.5_sL2", + "mode": "gate_only", + "A0": 2898.1063, + "A_true": 2898.1063, + "A_hat": 2898.1062, + "d_true": 0.0, + "d_hat": -0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 44.41, + 0.94 + ], + "channel_true": [ + 1.7199999999999998, + 6.4399999999999995, + 2.3099999999999996 + ], + "channel_base": [ + 1.7199999999999998, + 6.4399999999999995, + 2.3099999999999996 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C09_ihp130_sW1.5_sL2", + "mode": "combined", + "A0": 2898.1063, + "A_true": 2889.8187, + "A_hat": 2889.8187, + "d_true": -0.00286, + "d_hat": -0.00286, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 44.41, + 0.94 + ], + "channel_true": [ + 1.7199999999999998, + 6.4399999999999995, + 2.3099999999999996 + ], + "channel_base": [ + 1.7199999999999998, + 6.4399999999999995, + 2.3099999999999996 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C09_ihp130_sW1_sL2", + "mode": "diffusion_only", + "A0": 1962.1063, + "A_true": 1953.8187, + "A_hat": 1953.8187, + "d_true": -0.00422, + "d_hat": -0.00422, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 30.01, + 0.94 + ], + "channel_true": [ + 1.7199999999999998, + 6.4399999999999995, + 2.3099999999999996 + ], + "channel_base": [ + 1.7199999999999998, + 6.4399999999999995, + 2.3099999999999996 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C09_ihp130_sW1_sL2", + "mode": "gate_only", + "A0": 1962.1063, + "A_true": 1962.1063, + "A_hat": 1962.1063, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 30.01, + 0.94 + ], + "channel_true": [ + 1.7199999999999998, + 6.4399999999999995, + 2.3099999999999996 + ], + "channel_base": [ + 1.7199999999999998, + 6.4399999999999995, + 2.3099999999999996 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C09_ihp130_sW1_sL2", + "mode": "combined", + "A0": 1962.1063, + "A_true": 1953.8187, + "A_hat": 1953.8187, + "d_true": -0.00422, + "d_hat": -0.00422, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 30.01, + 0.94 + ], + "channel_true": [ + 1.7199999999999998, + 6.4399999999999995, + 2.3099999999999996 + ], + "channel_base": [ + 1.7199999999999998, + 6.4399999999999995, + 2.3099999999999996 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C09_ihp130_sW2_sL1.5", + "mode": "diffusion_only", + "A0": 3293.3063, + "A_true": 3285.0188, + "A_hat": 3285.0188, + "d_true": -0.00252, + "d_hat": -0.00252, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 50.49, + 0.94 + ], + "channel_true": [ + 1.7199999999999998, + 6.4399999999999995, + 2.3099999999999996 + ], + "channel_base": [ + 1.7199999999999998, + 6.4399999999999995, + 2.3099999999999996 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C09_ihp130_sW2_sL1.5", + "mode": "gate_only", + "A0": 3293.3063, + "A_true": 3293.3063, + "A_hat": 3293.3063, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 50.49, + 0.94 + ], + "channel_true": [ + 1.7199999999999998, + 6.4399999999999995, + 2.3099999999999996 + ], + "channel_base": [ + 1.7199999999999998, + 6.4399999999999995, + 2.3099999999999996 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C09_ihp130_sW2_sL1.5", + "mode": "combined", + "A0": 3293.3063, + "A_true": 3285.0188, + "A_hat": 3285.0188, + "d_true": -0.00252, + "d_hat": -0.00252, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 50.49, + 0.94 + ], + "channel_true": [ + 1.7199999999999998, + 6.4399999999999995, + 2.3099999999999996 + ], + "channel_base": [ + 1.7199999999999998, + 6.4399999999999995, + 2.3099999999999996 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C09_ihp130_sW2_sL1", + "mode": "diffusion_only", + "A0": 2752.5063, + "A_true": 2744.2188, + "A_hat": 2744.2188, + "d_true": -0.00301, + "d_hat": -0.00301, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 42.17, + 0.94 + ], + "channel_true": [ + 1.7199999999999998, + 6.4399999999999995, + 2.3099999999999996 + ], + "channel_base": [ + 1.7199999999999998, + 6.4399999999999995, + 2.3099999999999996 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C09_ihp130_sW2_sL1", + "mode": "gate_only", + "A0": 2752.5063, + "A_true": 2752.5063, + "A_hat": 2752.5062, + "d_true": 0.0, + "d_hat": -0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 42.17, + 0.94 + ], + "channel_true": [ + 1.7199999999999998, + 6.4399999999999995, + 2.3099999999999996 + ], + "channel_base": [ + 1.7199999999999998, + 6.4399999999999995, + 2.3099999999999996 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C09_ihp130_sW2_sL1", + "mode": "combined", + "A0": 2752.5063, + "A_true": 2744.2188, + "A_hat": 2744.2188, + "d_true": -0.00301, + "d_hat": -0.00301, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 42.17, + 0.94 + ], + "channel_true": [ + 1.7199999999999998, + 6.4399999999999995, + 2.3099999999999996 + ], + "channel_base": [ + 1.7199999999999998, + 6.4399999999999995, + 2.3099999999999996 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C09_ihp130_sW2_sL2", + "mode": "diffusion_only", + "A0": 3834.1063, + "A_true": 3825.8187, + "A_hat": 3825.8187, + "d_true": -0.00216, + "d_hat": -0.00216, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 58.81, + 0.94 + ], + "channel_true": [ + 1.7199999999999998, + 6.4399999999999995, + 2.3099999999999996 + ], + "channel_base": [ + 1.7199999999999998, + 6.4399999999999995, + 2.3099999999999996 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C09_ihp130_sW2_sL2", + "mode": "gate_only", + "A0": 3834.1063, + "A_true": 3834.1063, + "A_hat": 3834.1062, + "d_true": 0.0, + "d_hat": -0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 58.81, + 0.94 + ], + "channel_true": [ + 1.7199999999999998, + 6.4399999999999995, + 2.3099999999999996 + ], + "channel_base": [ + 1.7199999999999998, + 6.4399999999999995, + 2.3099999999999996 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C09_ihp130_sW2_sL2", + "mode": "combined", + "A0": 3834.1063, + "A_true": 3825.8187, + "A_hat": 3825.8187, + "d_true": -0.00216, + "d_hat": -0.00216, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 58.81, + 0.94 + ], + "channel_true": [ + 1.7199999999999998, + 6.4399999999999995, + 2.3099999999999996 + ], + "channel_base": [ + 1.7199999999999998, + 6.4399999999999995, + 2.3099999999999996 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C09_sky130_sW1.5_sL1", + "mode": "diffusion_only", + "A0": 2000.474, + "A_true": 1991.0604, + "A_hat": 1991.0604, + "d_true": -0.00471, + "d_hat": -0.00471, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 29.22, + 0.85 + ], + "channel_true": [ + 1.88, + 6.76, + 2.49 + ], + "channel_base": [ + 1.88, + 6.76, + 2.49 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C09_sky130_sW1.5_sL1", + "mode": "gate_only", + "A0": 2000.474, + "A_true": 2000.474, + "A_hat": 2000.474, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 29.22, + 0.85 + ], + "channel_true": [ + 1.88, + 6.76, + 2.49 + ], + "channel_base": [ + 1.88, + 6.76, + 2.49 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C09_sky130_sW1.5_sL1", + "mode": "combined", + "A0": 2000.474, + "A_true": 1991.0604, + "A_hat": 1991.0604, + "d_true": -0.00471, + "d_hat": -0.00471, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 29.22, + 0.85 + ], + "channel_true": [ + 1.88, + 6.76, + 2.49 + ], + "channel_base": [ + 1.88, + 6.76, + 2.49 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C09_sky130_sW2_sL1", + "mode": "diffusion_only", + "A0": 2635.2197, + "A_true": 2625.8061, + "A_hat": 2625.806, + "d_true": -0.00357, + "d_hat": -0.00357, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 38.66, + 0.85 + ], + "channel_true": [ + 1.88, + 6.76, + 2.49 + ], + "channel_base": [ + 1.88, + 6.76, + 2.49 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C09_sky130_sW2_sL1", + "mode": "gate_only", + "A0": 2635.2197, + "A_true": 2635.2197, + "A_hat": 2635.2196, + "d_true": 0.0, + "d_hat": -0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 38.66, + 0.85 + ], + "channel_true": [ + 1.88, + 6.76, + 2.49 + ], + "channel_base": [ + 1.88, + 6.76, + 2.49 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C09_sky130_sW2_sL1", + "mode": "combined", + "A0": 2635.2197, + "A_true": 2625.8061, + "A_hat": 2625.806, + "d_true": -0.00357, + "d_hat": -0.00357, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 38.66, + 0.85 + ], + "channel_true": [ + 1.88, + 6.76, + 2.49 + ], + "channel_base": [ + 1.88, + 6.76, + 2.49 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C10_gf180_sW0.5_sL1.5", + "mode": "diffusion_only", + "A0": 858.2044, + "A_true": 825.2124, + "A_hat": 825.2124, + "d_true": -0.03844, + "d_hat": -0.03844, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 7.84, + 1.03 + ], + "channel_true": [ + 2.5, + 8.1, + 2.5 + ], + "channel_base": [ + 2.5, + 8.1, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C10_gf180_sW0.5_sL1.5", + "mode": "gate_only", + "A0": 858.2044, + "A_true": 858.2044, + "A_hat": 858.2044, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 9.24, + 1.03 + ], + "channel_true": [ + 2.5, + 8.1, + 2.5 + ], + "channel_base": [ + 2.5, + 8.1, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C10_gf180_sW0.5_sL1.5", + "mode": "combined", + "A0": 858.2044, + "A_true": 841.7084, + "A_hat": 841.7084, + "d_true": -0.01922, + "d_hat": -0.01922, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 8.64, + 1.03 + ], + "channel_true": [ + 2.5, + 8.1, + 2.5 + ], + "channel_base": [ + 2.5, + 8.1, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C10_gf180_sW0.5_sL1", + "mode": "diffusion_only", + "A0": 719.638, + "A_true": 660.006, + "A_hat": 686.646, + "d_true": -0.08286, + "d_hat": -0.04585, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 6.59, + 5.47 + ], + "channel_true": [ + 2.5, + 7.300000000000001, + 2.5 + ], + "channel_base": [ + 2.5, + 8.1, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C10_gf180_sW0.5_sL1", + "mode": "gate_only", + "A0": 719.638, + "A_true": 719.638, + "A_hat": 719.638, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 11.48, + 1.03 + ], + "channel_true": [ + 2.5, + 8.1, + 2.5 + ], + "channel_base": [ + 2.5, + 8.1, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C10_gf180_sW0.5_sL1", + "mode": "combined", + "A0": 719.638, + "A_true": 729.7418, + "A_hat": 703.142, + "d_true": 0.01404, + "d_hat": -0.02292, + "sign_true": 1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 14.2, + 1.03 + ], + "channel_true": [ + 2.5, + 8.1, + 2.5 + ], + "channel_base": [ + 2.5, + 8.1, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ], + "row_shift_change_um": 2.72, + "error_type": "row x-shift changed (cross-row via conflict, not modelled)", + "channel_change": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C10_gf180_sW0.5_sL2", + "mode": "diffusion_only", + "A0": 996.7708, + "A_true": 963.7788, + "A_hat": 963.7788, + "d_true": -0.0331, + "d_hat": -0.0331, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 8.83, + 1.05 + ], + "channel_true": [ + 2.5, + 8.1, + 2.5 + ], + "channel_base": [ + 2.5, + 8.1, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C10_gf180_sW0.5_sL2", + "mode": "gate_only", + "A0": 996.7708, + "A_true": 996.7708, + "A_hat": 996.7708, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 10.36, + 1.03 + ], + "channel_true": [ + 2.5, + 8.1, + 2.5 + ], + "channel_base": [ + 2.5, + 8.1, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C10_gf180_sW0.5_sL2", + "mode": "combined", + "A0": 996.7708, + "A_true": 980.2748, + "A_hat": 980.2748, + "d_true": -0.01655, + "d_hat": -0.01655, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 9.48, + 1.03 + ], + "channel_true": [ + 2.5, + 8.1, + 2.5 + ], + "channel_base": [ + 2.5, + 8.1, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C10_gf180_sW1.5_sL1.5", + "mode": "diffusion_only", + "A0": 2243.8684, + "A_true": 2210.8764, + "A_hat": 2210.8764, + "d_true": -0.0147, + "d_hat": -0.0147, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 19.04, + 1.03 + ], + "channel_true": [ + 2.5, + 8.1, + 2.5 + ], + "channel_base": [ + 2.5, + 8.1, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C10_gf180_sW1.5_sL1.5", + "mode": "gate_only", + "A0": 2243.8684, + "A_true": 2243.8684, + "A_hat": 2243.8684, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 20.44, + 1.03 + ], + "channel_true": [ + 2.5, + 8.1, + 2.5 + ], + "channel_base": [ + 2.5, + 8.1, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C10_gf180_sW1.5_sL1.5", + "mode": "combined", + "A0": 2243.8684, + "A_true": 2227.3724, + "A_hat": 2227.3724, + "d_true": -0.00735, + "d_hat": -0.00735, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 19.84, + 1.03 + ], + "channel_true": [ + 2.5, + 8.1, + 2.5 + ], + "channel_base": [ + 2.5, + 8.1, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C10_gf180_sW1.5_sL1", + "mode": "diffusion_only", + "A0": 1828.1692, + "A_true": 1725.5292, + "A_hat": 1795.1772, + "d_true": -0.05614, + "d_hat": -0.01805, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 15.55, + 14.43 + ], + "channel_true": [ + 2.5, + 7.300000000000001, + 2.5 + ], + "channel_base": [ + 2.5, + 8.1, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C10_gf180_sW1.5_sL1", + "mode": "gate_only", + "A0": 1828.1692, + "A_true": 1828.1692, + "A_hat": 1828.1692, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 29.4, + 1.03 + ], + "channel_true": [ + 2.5, + 8.1, + 2.5 + ], + "channel_base": [ + 2.5, + 8.1, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C10_gf180_sW1.5_sL1", + "mode": "combined", + "A0": 1828.1692, + "A_true": 1838.273, + "A_hat": 1811.6732, + "d_true": 0.00553, + "d_hat": -0.00902, + "sign_true": 1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 32.12, + 1.03 + ], + "channel_true": [ + 2.5, + 8.1, + 2.5 + ], + "channel_base": [ + 2.5, + 8.1, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ], + "row_shift_change_um": 2.72, + "error_type": "row x-shift changed (cross-row via conflict, not modelled)", + "channel_change": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C10_gf180_sW1.5_sL2", + "mode": "diffusion_only", + "A0": 2659.5676, + "A_true": 2626.5756, + "A_hat": 2626.5756, + "d_true": -0.01241, + "d_hat": -0.01241, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 22.27, + 1.05 + ], + "channel_true": [ + 2.5, + 8.1, + 2.5 + ], + "channel_base": [ + 2.5, + 8.1, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C10_gf180_sW1.5_sL2", + "mode": "gate_only", + "A0": 2659.5676, + "A_true": 2659.5676, + "A_hat": 2659.5676, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 23.8, + 1.03 + ], + "channel_true": [ + 2.5, + 8.1, + 2.5 + ], + "channel_base": [ + 2.5, + 8.1, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C10_gf180_sW1.5_sL2", + "mode": "combined", + "A0": 2659.5676, + "A_true": 2643.0716, + "A_hat": 2643.0716, + "d_true": -0.0062, + "d_hat": -0.0062, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 22.92, + 1.03 + ], + "channel_true": [ + 2.5, + 8.1, + 2.5 + ], + "channel_base": [ + 2.5, + 8.1, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C10_gf180_sW1_sL2", + "mode": "diffusion_only", + "A0": 1828.1692, + "A_true": 1795.1772, + "A_hat": 1795.1772, + "d_true": -0.01805, + "d_hat": -0.01805, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 15.55, + 1.05 + ], + "channel_true": [ + 2.5, + 8.1, + 2.5 + ], + "channel_base": [ + 2.5, + 8.1, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C10_gf180_sW1_sL2", + "mode": "gate_only", + "A0": 1828.1692, + "A_true": 1828.1692, + "A_hat": 1828.1692, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 17.08, + 1.03 + ], + "channel_true": [ + 2.5, + 8.1, + 2.5 + ], + "channel_base": [ + 2.5, + 8.1, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C10_gf180_sW1_sL2", + "mode": "combined", + "A0": 1828.1692, + "A_true": 1811.6732, + "A_hat": 1811.6732, + "d_true": -0.00902, + "d_hat": -0.00902, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 16.2, + 1.03 + ], + "channel_true": [ + 2.5, + 8.1, + 2.5 + ], + "channel_base": [ + 2.5, + 8.1, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C10_gf180_sW2_sL1.5", + "mode": "diffusion_only", + "A0": 2936.7004, + "A_true": 2903.7084, + "A_hat": 2903.7084, + "d_true": -0.01123, + "d_hat": -0.01123, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 24.64, + 1.03 + ], + "channel_true": [ + 2.5, + 8.1, + 2.5 + ], + "channel_base": [ + 2.5, + 8.1, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C10_gf180_sW2_sL1.5", + "mode": "gate_only", + "A0": 2936.7004, + "A_true": 2936.7004, + "A_hat": 2936.7004, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 26.04, + 1.03 + ], + "channel_true": [ + 2.5, + 8.1, + 2.5 + ], + "channel_base": [ + 2.5, + 8.1, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C10_gf180_sW2_sL1.5", + "mode": "combined", + "A0": 2936.7004, + "A_true": 2920.2044, + "A_hat": 2920.2044, + "d_true": -0.00562, + "d_hat": -0.00562, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 25.44, + 1.03 + ], + "channel_true": [ + 2.5, + 8.1, + 2.5 + ], + "channel_base": [ + 2.5, + 8.1, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C10_gf180_sW2_sL1", + "mode": "diffusion_only", + "A0": 2382.4348, + "A_true": 2258.2908, + "A_hat": 2349.4428, + "d_true": -0.05211, + "d_hat": -0.01385, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 20.03, + 18.91 + ], + "channel_true": [ + 2.5, + 7.300000000000001, + 2.5 + ], + "channel_base": [ + 2.5, + 8.1, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C10_gf180_sW2_sL1", + "mode": "gate_only", + "A0": 2382.4348, + "A_true": 2382.4348, + "A_hat": 2382.4348, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 38.36, + 1.03 + ], + "channel_true": [ + 2.5, + 8.1, + 2.5 + ], + "channel_base": [ + 2.5, + 8.1, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C10_gf180_sW2_sL1", + "mode": "combined", + "A0": 2382.4348, + "A_true": 2392.5386, + "A_hat": 2365.9388, + "d_true": 0.00424, + "d_hat": -0.00692, + "sign_true": 0, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 41.08, + 1.03 + ], + "channel_true": [ + 2.5, + 8.1, + 2.5 + ], + "channel_base": [ + 2.5, + 8.1, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ], + "row_shift_change_um": 2.72, + "error_type": "row x-shift changed (cross-row via conflict, not modelled)", + "channel_change": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C10_gf180_sW2_sL2", + "mode": "diffusion_only", + "A0": 3490.966, + "A_true": 3457.974, + "A_hat": 3457.974, + "d_true": -0.00945, + "d_hat": -0.00945, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 28.99, + 1.05 + ], + "channel_true": [ + 2.5, + 8.1, + 2.5 + ], + "channel_base": [ + 2.5, + 8.1, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C10_gf180_sW2_sL2", + "mode": "gate_only", + "A0": 3490.966, + "A_true": 3490.966, + "A_hat": 3490.966, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 30.52, + 1.03 + ], + "channel_true": [ + 2.5, + 8.1, + 2.5 + ], + "channel_base": [ + 2.5, + 8.1, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C10_gf180_sW2_sL2", + "mode": "combined", + "A0": 3490.966, + "A_true": 3474.47, + "A_hat": 3474.47, + "d_true": -0.00473, + "d_hat": -0.00473, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 29.64, + 1.03 + ], + "channel_true": [ + 2.5, + 8.1, + 2.5 + ], + "channel_base": [ + 2.5, + 8.1, + 2.5 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C10_ihp130_sW1.5_sL1.5", + "mode": "diffusion_only", + "A0": 1347.4087, + "A_true": 1332.0373, + "A_hat": 1332.0373, + "d_true": -0.01141, + "d_hat": -0.01141, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 15.795, + 0.93 + ], + "channel_true": [ + 1.7199999999999998, + 5.85, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 5.85, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C10_ihp130_sW1.5_sL1.5", + "mode": "gate_only", + "A0": 1347.4087, + "A_true": 1347.4087, + "A_hat": 1347.4087, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 16.81, + 0.79 + ], + "channel_true": [ + 1.7199999999999998, + 5.85, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 5.85, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C10_ihp130_sW1.5_sL1.5", + "mode": "combined", + "A0": 1347.4087, + "A_true": 1339.723, + "A_hat": 1339.723, + "d_true": -0.0057, + "d_hat": -0.0057, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 16.16, + 0.79 + ], + "channel_true": [ + 1.7199999999999998, + 5.85, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 5.85, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C10_ihp130_sW1.5_sL1", + "mode": "diffusion_only", + "A0": 1065.2983, + "A_true": 1061.1541, + "A_hat": 1049.9269, + "d_true": -0.00389, + "d_hat": -0.01443, + "sign_true": 0, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 25.005, + 0.79 + ], + "channel_true": [ + 1.7199999999999998, + 5.85, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 5.85, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ], + "row_shift_change_um": 1.415, + "error_type": "row x-shift changed (cross-row via conflict, not modelled)", + "channel_change": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C10_ihp130_sW1.5_sL1", + "mode": "gate_only", + "A0": 1065.2983, + "A_true": 1065.2983, + "A_hat": 1065.2983, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 23.59, + 0.79 + ], + "channel_true": [ + 1.7199999999999998, + 5.85, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 5.85, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C10_ihp130_sW1.5_sL1", + "mode": "combined", + "A0": 1065.2983, + "A_true": 1016.2064, + "A_hat": 1057.6126, + "d_true": -0.04608, + "d_hat": -0.00721, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 12.93, + 11.33 + ], + "channel_true": [ + 1.7199999999999998, + 5.26, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 5.85, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C10_ihp130_sW1.5_sL2", + "mode": "diffusion_only", + "A0": 1629.5191, + "A_true": 1614.1477, + "A_hat": 1614.1477, + "d_true": -0.00943, + "d_hat": -0.00943, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 18.915, + 0.94 + ], + "channel_true": [ + 1.7199999999999998, + 5.85, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 5.85, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C10_ihp130_sW1.5_sL2", + "mode": "gate_only", + "A0": 1629.5191, + "A_true": 1629.5191, + "A_hat": 1629.5191, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 19.93, + 0.79 + ], + "channel_true": [ + 1.7199999999999998, + 5.85, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 5.85, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C10_ihp130_sW1.5_sL2", + "mode": "combined", + "A0": 1629.5191, + "A_true": 1621.8334, + "A_hat": 1621.8334, + "d_true": -0.00472, + "d_hat": -0.00472, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 19.17, + 0.85 + ], + "channel_true": [ + 1.7199999999999998, + 5.85, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 5.85, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C10_ihp130_sW2_sL1.5", + "mode": "diffusion_only", + "A0": 1766.9575, + "A_true": 1751.5861, + "A_hat": 1751.5861, + "d_true": -0.0087, + "d_hat": -0.0087, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 20.435, + 0.93 + ], + "channel_true": [ + 1.7199999999999998, + 5.85, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 5.85, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C10_ihp130_sW2_sL1.5", + "mode": "gate_only", + "A0": 1766.9575, + "A_true": 1766.9575, + "A_hat": 1766.9575, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 21.45, + 0.79 + ], + "channel_true": [ + 1.7199999999999998, + 5.85, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 5.85, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C10_ihp130_sW2_sL1.5", + "mode": "combined", + "A0": 1766.9575, + "A_true": 1759.2718, + "A_hat": 1759.2718, + "d_true": -0.00435, + "d_hat": -0.00435, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 20.8, + 0.79 + ], + "channel_true": [ + 1.7199999999999998, + 5.85, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 5.85, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C10_ihp130_sW2_sL1", + "mode": "diffusion_only", + "A0": 1390.8103, + "A_true": 1386.6661, + "A_hat": 1375.4389, + "d_true": -0.00298, + "d_hat": -0.01105, + "sign_true": 0, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 32.205, + 0.79 + ], + "channel_true": [ + 1.7199999999999998, + 5.85, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 5.85, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ], + "row_shift_change_um": 1.415, + "error_type": "row x-shift changed (cross-row via conflict, not modelled)", + "channel_change": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C10_ihp130_sW2_sL1", + "mode": "gate_only", + "A0": 1390.8103, + "A_true": 1390.8103, + "A_hat": 1390.8103, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 30.79, + 0.79 + ], + "channel_true": [ + 1.7199999999999998, + 5.85, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 5.85, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C10_ihp130_sW2_sL1", + "mode": "combined", + "A0": 1390.8103, + "A_true": 1328.9744, + "A_hat": 1383.1246, + "d_true": -0.04446, + "d_hat": -0.00553, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 16.53, + 14.93 + ], + "channel_true": [ + 1.7199999999999998, + 5.26, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 5.85, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C10_ihp130_sW2_sL2", + "mode": "diffusion_only", + "A0": 2143.1047, + "A_true": 2127.7333, + "A_hat": 2127.7333, + "d_true": -0.00717, + "d_hat": -0.00717, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 24.595, + 0.94 + ], + "channel_true": [ + 1.7199999999999998, + 5.85, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 5.85, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C10_ihp130_sW2_sL2", + "mode": "gate_only", + "A0": 2143.1047, + "A_true": 2143.1047, + "A_hat": 2143.1047, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 25.61, + 0.79 + ], + "channel_true": [ + 1.7199999999999998, + 5.85, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 5.85, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C10_ihp130_sW2_sL2", + "mode": "combined", + "A0": 2143.1047, + "A_true": 2135.419, + "A_hat": 2135.419, + "d_true": -0.00359, + "d_hat": -0.00359, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 24.85, + 0.85 + ], + "channel_true": [ + 1.7199999999999998, + 5.85, + 1.7199999999999998 + ], + "channel_base": [ + 1.7199999999999998, + 5.85, + 1.7199999999999998 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C10_sky130_sW1.5_sL1.5", + "mode": "diffusion_only", + "A0": 1426.7968, + "A_true": 1409.336, + "A_hat": 1409.336, + "d_true": -0.01224, + "d_hat": -0.01224, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 15.745, + 0.85 + ], + "channel_true": [ + 1.88, + 6.15, + 1.88 + ], + "channel_base": [ + 1.88, + 6.15, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C10_sky130_sW1.5_sL1.5", + "mode": "gate_only", + "A0": 1426.7968, + "A_true": 1426.7968, + "A_hat": 1426.7968, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 16.7, + 0.815 + ], + "channel_true": [ + 1.88, + 6.15, + 1.88 + ], + "channel_base": [ + 1.88, + 6.15, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C10_sky130_sW1.5_sL1.5", + "mode": "combined", + "A0": 1426.7968, + "A_true": 1418.0664, + "A_hat": 1418.0664, + "d_true": -0.00612, + "d_hat": -0.00612, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 16.13, + 0.815 + ], + "channel_true": [ + 1.88, + 6.15, + 1.88 + ], + "channel_base": [ + 1.88, + 6.15, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C10_sky130_sW1.5_sL1", + "mode": "diffusion_only", + "A0": 1090.0528, + "A_true": 1072.592, + "A_hat": 1072.592, + "d_true": -0.01602, + "d_hat": -0.01602, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 12.21, + 0.815 + ], + "channel_true": [ + 1.88, + 6.15, + 1.88 + ], + "channel_base": [ + 1.88, + 6.15, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C10_sky130_sW1.5_sL1", + "mode": "gate_only", + "A0": 1090.0528, + "A_true": 1090.0528, + "A_hat": 1090.0528, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 13.1, + 0.815 + ], + "channel_true": [ + 1.88, + 6.15, + 1.88 + ], + "channel_base": [ + 1.88, + 6.15, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C10_sky130_sW1.5_sL1", + "mode": "combined", + "A0": 1090.0528, + "A_true": 1081.3224, + "A_hat": 1081.3224, + "d_true": -0.00801, + "d_hat": -0.00801, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 12.77, + 0.815 + ], + "channel_true": [ + 1.88, + 6.15, + 1.88 + ], + "channel_base": [ + 1.88, + 6.15, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C10_sky130_sW1.5_sL2", + "mode": "diffusion_only", + "A0": 1763.5408, + "A_true": 1746.08, + "A_hat": 1746.08, + "d_true": -0.0099, + "d_hat": -0.0099, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 19.345, + 0.85 + ], + "channel_true": [ + 1.88, + 6.15, + 1.88 + ], + "channel_base": [ + 1.88, + 6.15, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C10_sky130_sW1.5_sL2", + "mode": "gate_only", + "A0": 1763.5408, + "A_true": 1763.5408, + "A_hat": 1763.5408, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 19.625, + 1.56 + ], + "channel_true": [ + 1.88, + 6.15, + 1.88 + ], + "channel_base": [ + 1.88, + 6.15, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C10_sky130_sW1.5_sL2", + "mode": "combined", + "A0": 1763.5408, + "A_true": 1754.8104, + "A_hat": 1754.8104, + "d_true": -0.00495, + "d_hat": -0.00495, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 19.73, + 0.815 + ], + "channel_true": [ + 1.88, + 6.15, + 1.88 + ], + "channel_base": [ + 1.88, + 6.15, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C10_sky130_sW2_sL1.5", + "mode": "diffusion_only", + "A0": 1872.0472, + "A_true": 1854.5864, + "A_hat": 1854.5864, + "d_true": -0.00933, + "d_hat": -0.00933, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 20.505, + 0.85 + ], + "channel_true": [ + 1.88, + 6.15, + 1.88 + ], + "channel_base": [ + 1.88, + 6.15, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C10_sky130_sW2_sL1.5", + "mode": "gate_only", + "A0": 1872.0472, + "A_true": 1872.0472, + "A_hat": 1872.0472, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 21.46, + 0.815 + ], + "channel_true": [ + 1.88, + 6.15, + 1.88 + ], + "channel_base": [ + 1.88, + 6.15, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C10_sky130_sW2_sL1.5", + "mode": "combined", + "A0": 1872.0472, + "A_true": 1863.3168, + "A_hat": 1863.3168, + "d_true": -0.00466, + "d_hat": -0.00466, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 20.89, + 0.815 + ], + "channel_true": [ + 1.88, + 6.15, + 1.88 + ], + "channel_base": [ + 1.88, + 6.15, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C10_sky130_sW2_sL1", + "mode": "diffusion_only", + "A0": 1423.0552, + "A_true": 1405.5944, + "A_hat": 1405.5944, + "d_true": -0.01227, + "d_hat": -0.01227, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 15.77, + 0.815 + ], + "channel_true": [ + 1.88, + 6.15, + 1.88 + ], + "channel_base": [ + 1.88, + 6.15, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C10_sky130_sW2_sL1", + "mode": "gate_only", + "A0": 1423.0552, + "A_true": 1423.0552, + "A_hat": 1423.0552, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 16.66, + 0.815 + ], + "channel_true": [ + 1.88, + 6.15, + 1.88 + ], + "channel_base": [ + 1.88, + 6.15, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C10_sky130_sW2_sL1", + "mode": "combined", + "A0": 1423.0552, + "A_true": 1414.3248, + "A_hat": 1414.3248, + "d_true": -0.00613, + "d_hat": -0.00613, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 16.33, + 0.815 + ], + "channel_true": [ + 1.88, + 6.15, + 1.88 + ], + "channel_base": [ + 1.88, + 6.15, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C10_sky130_sW2_sL2", + "mode": "diffusion_only", + "A0": 2321.0392, + "A_true": 2303.5784, + "A_hat": 2303.5784, + "d_true": -0.00752, + "d_hat": -0.00752, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 25.305, + 0.85 + ], + "channel_true": [ + 1.88, + 6.15, + 1.88 + ], + "channel_base": [ + 1.88, + 6.15, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C10_sky130_sW2_sL2", + "mode": "gate_only", + "A0": 2321.0392, + "A_true": 2321.0392, + "A_hat": 2321.0392, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 25.585, + 1.56 + ], + "channel_true": [ + 1.88, + 6.15, + 1.88 + ], + "channel_base": [ + 1.88, + 6.15, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C10_sky130_sW2_sL2", + "mode": "combined", + "A0": 2321.0392, + "A_true": 2312.3088, + "A_hat": 2312.3088, + "d_true": -0.00376, + "d_hat": -0.00376, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 25.69, + 0.815 + ], + "channel_true": [ + 1.88, + 6.15, + 1.88 + ], + "channel_base": [ + 1.88, + 6.15, + 1.88 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C11_gf180_sW0.5_sL1.5", + "mode": "diffusion_only", + "A0": 1962.401, + "A_true": 1962.401, + "A_hat": 1962.401, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": true, + "row_shift_true": [ + 12.435, + 4.435, + 0.02 + ], + "channel_true": [ + 3.3, + 7.300000000000001, + 4.9, + 0.0 + ], + "channel_base": [ + 3.3, + 7.300000000000001, + 4.9, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C11_gf180_sW0.5_sL1.5", + "mode": "gate_only", + "A0": 1962.401, + "A_true": 1928.297, + "A_hat": 1960.777, + "d_true": -0.01738, + "d_hat": -0.00083, + "sign_true": -1, + "sign_hat": 0, + "passive_dominated": true, + "row_shift_true": [ + 11.635, + 3.095, + 0.02 + ], + "channel_true": [ + 3.3, + 7.300000000000001, + 4.1000000000000005, + 0.0 + ], + "channel_base": [ + 3.3, + 7.300000000000001, + 4.9, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 1.6, + -1.6, + 0.0 + ], + "row_shift_change_um": 0.54, + "error_type": "routing channel height mis-predicted + row x-shift changed", + "channel_change": [ + 0.0, + 0.0, + -0.8, + 0.0 + ] + }, + { + "case": "C11_gf180_sW0.5_sL1.5", + "mode": "combined", + "A0": 1962.401, + "A_true": 1928.297, + "A_hat": 1960.777, + "d_true": -0.01738, + "d_hat": -0.00083, + "sign_true": -1, + "sign_hat": 0, + "passive_dominated": true, + "row_shift_true": [ + 12.435, + 3.895, + 0.02 + ], + "channel_true": [ + 3.3, + 7.300000000000001, + 4.1000000000000005, + 0.0 + ], + "channel_base": [ + 3.3, + 7.300000000000001, + 4.9, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 1.6, + -1.6, + 0.0 + ], + "row_shift_change_um": 0.8, + "error_type": "routing channel height mis-predicted + row x-shift changed", + "channel_change": [ + 0.0, + 0.0, + -0.8, + 0.0 + ] + }, + { + "case": "C11_gf180_sW0.5_sL1", + "mode": "diffusion_only", + "A0": 1962.401, + "A_true": 1962.401, + "A_hat": 1962.401, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": true, + "row_shift_true": [ + 13.555, + 6.955, + 0.02 + ], + "channel_true": [ + 3.3, + 7.300000000000001, + 4.9, + 0.0 + ], + "channel_base": [ + 3.3, + 7.300000000000001, + 4.9, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C11_gf180_sW0.5_sL1", + "mode": "gate_only", + "A0": 1962.401, + "A_true": 1928.297, + "A_hat": 1960.777, + "d_true": -0.01738, + "d_hat": -0.00083, + "sign_true": -1, + "sign_hat": 0, + "passive_dominated": true, + "row_shift_true": [ + 12.755, + 5.615, + 0.02 + ], + "channel_true": [ + 3.3, + 7.300000000000001, + 4.1000000000000005, + 0.0 + ], + "channel_base": [ + 3.3, + 7.300000000000001, + 4.9, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 1.6, + -1.6, + 0.0 + ], + "row_shift_change_um": 0.54, + "error_type": "routing channel height mis-predicted + row x-shift changed", + "channel_change": [ + 0.0, + 0.0, + -0.8, + 0.0 + ] + }, + { + "case": "C11_gf180_sW0.5_sL1", + "mode": "combined", + "A0": 1962.401, + "A_true": 1928.297, + "A_hat": 1960.777, + "d_true": -0.01738, + "d_hat": -0.00083, + "sign_true": -1, + "sign_hat": 0, + "passive_dominated": true, + "row_shift_true": [ + 13.555, + 6.415, + 0.02 + ], + "channel_true": [ + 3.3, + 7.300000000000001, + 4.1000000000000005, + 0.0 + ], + "channel_base": [ + 3.3, + 7.300000000000001, + 4.9, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 1.6, + -1.6, + 0.0 + ], + "row_shift_change_um": 0.8, + "error_type": "routing channel height mis-predicted + row x-shift changed", + "channel_change": [ + 0.0, + 0.0, + -0.8, + 0.0 + ] + }, + { + "case": "C11_gf180_sW0.5_sL2", + "mode": "diffusion_only", + "A0": 1962.401, + "A_true": 1962.401, + "A_hat": 1962.401, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": true, + "row_shift_true": [ + 11.315, + 1.915, + 0.02 + ], + "channel_true": [ + 3.3, + 7.300000000000001, + 4.9, + 0.0 + ], + "channel_base": [ + 3.3, + 7.300000000000001, + 4.9, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C11_gf180_sW0.5_sL2", + "mode": "gate_only", + "A0": 1962.401, + "A_true": 1971.0425, + "A_hat": 2050.1227, + "d_true": 0.0044, + "d_hat": 0.0447, + "sign_true": 0, + "sign_hat": 1, + "passive_dominated": false, + "row_shift_true": [ + 10.99, + 1.05, + 0.495 + ], + "channel_true": [ + 3.3, + 7.300000000000001, + 4.1000000000000005, + 0.0 + ], + "channel_base": [ + 3.3, + 7.300000000000001, + 4.9, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 1.6, + -1.6, + 0.0 + ], + "row_shift_change_um": 0.475, + "error_type": "routing channel height mis-predicted + row x-shift changed", + "channel_change": [ + 0.0, + 0.0, + -0.8, + 0.0 + ] + }, + { + "case": "C11_gf180_sW0.5_sL2", + "mode": "combined", + "A0": 1962.401, + "A_true": 1928.297, + "A_hat": 1972.8508, + "d_true": -0.01738, + "d_hat": 0.00533, + "sign_true": -1, + "sign_hat": 1, + "passive_dominated": false, + "row_shift_true": [ + 11.315, + 1.375, + 0.02 + ], + "channel_true": [ + 3.3, + 7.300000000000001, + 4.1000000000000005, + 0.0 + ], + "channel_base": [ + 3.3, + 7.300000000000001, + 4.9, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 1.6, + -1.6, + 0.0 + ], + "row_shift_change_um": 0.8, + "error_type": "routing channel height mis-predicted + row x-shift changed", + "channel_change": [ + 0.0, + 0.0, + -0.8, + 0.0 + ] + }, + { + "case": "C11_gf180_sW1.5_sL1.5", + "mode": "diffusion_only", + "A0": 4145.2096, + "A_true": 4067.8736, + "A_hat": 4067.8736, + "d_true": -0.01866, + "d_hat": -0.01866, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 23.05, + 1.05, + 21.835 + ], + "channel_true": [ + 3.3, + 7.300000000000001, + 4.9, + 0.0 + ], + "channel_base": [ + 3.3, + 7.300000000000001, + 4.9, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C11_gf180_sW1.5_sL1.5", + "mode": "gate_only", + "A0": 4145.2096, + "A_true": 4125.4157, + "A_hat": 4235.4715, + "d_true": -0.00478, + "d_hat": 0.02177, + "sign_true": 0, + "sign_hat": 1, + "passive_dominated": false, + "row_shift_true": [ + 23.61, + 1.05, + 23.195 + ], + "channel_true": [ + 3.3, + 7.300000000000001, + 4.1000000000000005, + 0.0 + ], + "channel_base": [ + 3.3, + 7.300000000000001, + 4.9, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 1.6, + -1.6, + 0.0 + ], + "row_shift_change_um": 0.56, + "error_type": "routing channel height mis-predicted + row x-shift changed", + "channel_change": [ + 0.0, + 0.0, + -0.8, + 0.0 + ] + }, + { + "case": "C11_gf180_sW1.5_sL1.5", + "mode": "combined", + "A0": 4145.2096, + "A_true": 4049.4237, + "A_hat": 4158.1995, + "d_true": -0.02311, + "d_hat": 0.00313, + "sign_true": -1, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 23.59, + 1.05, + 22.375 + ], + "channel_true": [ + 3.3, + 7.300000000000001, + 4.1000000000000005, + 0.0 + ], + "channel_base": [ + 3.3, + 7.300000000000001, + 4.9, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 1.6, + -1.6, + 0.0 + ], + "row_shift_change_um": 0.54, + "error_type": "routing channel height mis-predicted + row x-shift changed", + "channel_change": [ + 0.0, + 0.0, + -0.8, + 0.0 + ] + }, + { + "case": "C11_gf180_sW1.5_sL1", + "mode": "diffusion_only", + "A0": 3414.3844, + "A_true": 3337.0484, + "A_hat": 3337.0484, + "d_true": -0.02265, + "d_hat": -0.02265, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 18.85, + 1.05, + 14.275 + ], + "channel_true": [ + 3.3, + 7.300000000000001, + 4.9, + 0.0 + ], + "channel_base": [ + 3.3, + 7.300000000000001, + 4.9, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C11_gf180_sW1.5_sL1", + "mode": "gate_only", + "A0": 3414.3844, + "A_true": 3407.2913, + "A_hat": 3505.2511, + "d_true": -0.00208, + "d_hat": 0.02661, + "sign_true": 0, + "sign_hat": 1, + "passive_dominated": false, + "row_shift_true": [ + 19.69, + 1.05, + 15.915 + ], + "channel_true": [ + 3.3, + 7.300000000000001, + 4.1000000000000005, + 0.0 + ], + "channel_base": [ + 3.3, + 7.300000000000001, + 4.9, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 1.6, + -1.6, + 0.0 + ], + "row_shift_change_um": 0.56, + "error_type": "routing channel height mis-predicted + row x-shift changed", + "channel_change": [ + 0.0, + 0.0, + -0.8, + 0.0 + ] + }, + { + "case": "C11_gf180_sW1.5_sL1", + "mode": "combined", + "A0": 3414.3844, + "A_true": 3331.2993, + "A_hat": 3427.9791, + "d_true": -0.02433, + "d_hat": 0.00398, + "sign_true": -1, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 19.39, + 1.05, + 14.815 + ], + "channel_true": [ + 3.3, + 7.300000000000001, + 4.1000000000000005, + 0.0 + ], + "channel_base": [ + 3.3, + 7.300000000000001, + 4.9, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 1.6, + -1.6, + 0.0 + ], + "row_shift_change_um": 0.54, + "error_type": "routing channel height mis-predicted + row x-shift changed", + "channel_change": [ + 0.0, + 0.0, + -0.8, + 0.0 + ] + }, + { + "case": "C11_gf180_sW1.5_sL2", + "mode": "diffusion_only", + "A0": 4876.0348, + "A_true": 4798.6988, + "A_hat": 4798.6988, + "d_true": -0.01586, + "d_hat": -0.01586, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 27.25, + 1.05, + 29.395 + ], + "channel_true": [ + 3.3, + 7.300000000000001, + 4.9, + 0.0 + ], + "channel_base": [ + 3.3, + 7.300000000000001, + 4.9, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C11_gf180_sW1.5_sL2", + "mode": "gate_only", + "A0": 4876.0348, + "A_true": 4843.5401, + "A_hat": 4965.6919, + "d_true": -0.00666, + "d_hat": 0.01839, + "sign_true": -1, + "sign_hat": 1, + "passive_dominated": false, + "row_shift_true": [ + 27.79, + 1.05, + 30.735 + ], + "channel_true": [ + 3.3, + 7.300000000000001, + 4.1000000000000005, + 0.0 + ], + "channel_base": [ + 3.3, + 7.300000000000001, + 4.9, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 1.6, + -1.6, + 0.0 + ], + "row_shift_change_um": 0.54, + "error_type": "routing channel height mis-predicted + row x-shift changed", + "channel_change": [ + 0.0, + 0.0, + -0.8, + 0.0 + ] + }, + { + "case": "C11_gf180_sW1.5_sL2", + "mode": "combined", + "A0": 4876.0348, + "A_true": 4767.5481, + "A_hat": 4888.4199, + "d_true": -0.02225, + "d_hat": 0.00254, + "sign_true": -1, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 27.79, + 1.05, + 29.935 + ], + "channel_true": [ + 3.3, + 7.300000000000001, + 4.1000000000000005, + 0.0 + ], + "channel_base": [ + 3.3, + 7.300000000000001, + 4.9, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 1.6, + -1.6, + 0.0 + ], + "row_shift_change_um": 0.54, + "error_type": "routing channel height mis-predicted + row x-shift changed", + "channel_change": [ + 0.0, + 0.0, + -0.8, + 0.0 + ] + }, + { + "case": "C11_gf180_sW1_sL2", + "mode": "diffusion_only", + "A0": 3414.3844, + "A_true": 3337.0484, + "A_hat": 3337.0484, + "d_true": -0.02265, + "d_hat": -0.02265, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 18.85, + 1.74, + 14.275 + ], + "channel_true": [ + 3.3, + 7.300000000000001, + 4.9, + 0.0 + ], + "channel_base": [ + 3.3, + 7.300000000000001, + 4.9, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C11_gf180_sW1_sL2", + "mode": "gate_only", + "A0": 3414.3844, + "A_true": 3407.2913, + "A_hat": 3505.2511, + "d_true": -0.00208, + "d_hat": 0.02661, + "sign_true": 0, + "sign_hat": 1, + "passive_dominated": false, + "row_shift_true": [ + 19.39, + 1.74, + 15.615 + ], + "channel_true": [ + 3.3, + 7.300000000000001, + 4.1000000000000005, + 0.0 + ], + "channel_base": [ + 3.3, + 7.300000000000001, + 4.9, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 1.6, + -1.6, + 0.0 + ], + "row_shift_change_um": 0.54, + "error_type": "routing channel height mis-predicted + row x-shift changed", + "channel_change": [ + 0.0, + 0.0, + -0.8, + 0.0 + ] + }, + { + "case": "C11_gf180_sW1_sL2", + "mode": "combined", + "A0": 3414.3844, + "A_true": 3331.2993, + "A_hat": 3427.9791, + "d_true": -0.02433, + "d_hat": 0.00398, + "sign_true": -1, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 19.39, + 1.74, + 14.815 + ], + "channel_true": [ + 3.3, + 7.300000000000001, + 4.1000000000000005, + 0.0 + ], + "channel_base": [ + 3.3, + 7.300000000000001, + 4.9, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 1.6, + -1.6, + 0.0 + ], + "row_shift_change_um": 0.54, + "error_type": "routing channel height mis-predicted + row x-shift changed", + "channel_change": [ + 0.0, + 0.0, + -0.8, + 0.0 + ] + }, + { + "case": "C11_gf180_sW2_sL1.5", + "mode": "diffusion_only", + "A0": 5363.2516, + "A_true": 5285.9156, + "A_hat": 5285.9156, + "d_true": -0.01442, + "d_hat": -0.01442, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 30.05, + 1.74, + 34.435 + ], + "channel_true": [ + 3.3, + 7.300000000000001, + 4.9, + 0.0 + ], + "channel_base": [ + 3.3, + 7.300000000000001, + 4.9, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C11_gf180_sW2_sL1.5", + "mode": "gate_only", + "A0": 5363.2516, + "A_true": 5322.2897, + "A_hat": 5452.5055, + "d_true": -0.00764, + "d_hat": 0.01664, + "sign_true": -1, + "sign_hat": 1, + "passive_dominated": false, + "row_shift_true": [ + 30.59, + 1.74, + 35.775 + ], + "channel_true": [ + 3.3, + 7.300000000000001, + 4.1000000000000005, + 0.0 + ], + "channel_base": [ + 3.3, + 7.300000000000001, + 4.9, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 1.6, + -1.6, + 0.0 + ], + "row_shift_change_um": 0.54, + "error_type": "routing channel height mis-predicted + row x-shift changed", + "channel_change": [ + 0.0, + 0.0, + -0.8, + 0.0 + ] + }, + { + "case": "C11_gf180_sW2_sL1.5", + "mode": "combined", + "A0": 5363.2516, + "A_true": 5246.2977, + "A_hat": 5375.2335, + "d_true": -0.02181, + "d_hat": 0.00223, + "sign_true": -1, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 30.59, + 1.74, + 34.975 + ], + "channel_true": [ + 3.3, + 7.300000000000001, + 4.1000000000000005, + 0.0 + ], + "channel_base": [ + 3.3, + 7.300000000000001, + 4.9, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 1.6, + -1.6, + 0.0 + ], + "row_shift_change_um": 0.54, + "error_type": "routing channel height mis-predicted + row x-shift changed", + "channel_change": [ + 0.0, + 0.0, + -0.8, + 0.0 + ] + }, + { + "case": "C11_gf180_sW2_sL1", + "mode": "diffusion_only", + "A0": 4388.818, + "A_true": 4311.482, + "A_hat": 4311.482, + "d_true": -0.01762, + "d_hat": -0.01762, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 24.45, + 1.74, + 24.355 + ], + "channel_true": [ + 3.3, + 7.300000000000001, + 4.9, + 0.0 + ], + "channel_base": [ + 3.3, + 7.300000000000001, + 4.9, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C11_gf180_sW2_sL1", + "mode": "gate_only", + "A0": 4388.818, + "A_true": 4364.7905, + "A_hat": 4478.8783, + "d_true": -0.00547, + "d_hat": 0.02052, + "sign_true": -1, + "sign_hat": 1, + "passive_dominated": false, + "row_shift_true": [ + 24.99, + 1.74, + 25.695 + ], + "channel_true": [ + 3.3, + 7.300000000000001, + 4.1000000000000005, + 0.0 + ], + "channel_base": [ + 3.3, + 7.300000000000001, + 4.9, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 1.6, + -1.6, + 0.0 + ], + "row_shift_change_um": 0.54, + "error_type": "routing channel height mis-predicted + row x-shift changed", + "channel_change": [ + 0.0, + 0.0, + -0.8, + 0.0 + ] + }, + { + "case": "C11_gf180_sW2_sL1", + "mode": "combined", + "A0": 4388.818, + "A_true": 4288.7985, + "A_hat": 4401.6063, + "d_true": -0.02279, + "d_hat": 0.00291, + "sign_true": -1, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 24.99, + 1.74, + 24.895 + ], + "channel_true": [ + 3.3, + 7.300000000000001, + 4.1000000000000005, + 0.0 + ], + "channel_base": [ + 3.3, + 7.300000000000001, + 4.9, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 1.6, + -1.6, + 0.0 + ], + "row_shift_change_um": 0.54, + "error_type": "routing channel height mis-predicted + row x-shift changed", + "channel_change": [ + 0.0, + 0.0, + -0.8, + 0.0 + ] + }, + { + "case": "C11_gf180_sW2_sL2", + "mode": "diffusion_only", + "A0": 6337.6852, + "A_true": 6260.3492, + "A_hat": 6260.3492, + "d_true": -0.0122, + "d_hat": -0.0122, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 35.65, + 1.74, + 44.515 + ], + "channel_true": [ + 3.3, + 7.300000000000001, + 4.9, + 0.0 + ], + "channel_base": [ + 3.3, + 7.300000000000001, + 4.9, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C11_gf180_sW2_sL2", + "mode": "gate_only", + "A0": 6337.6852, + "A_true": 6279.7889, + "A_hat": 6426.1327, + "d_true": -0.00914, + "d_hat": 0.01396, + "sign_true": -1, + "sign_hat": 1, + "passive_dominated": false, + "row_shift_true": [ + 36.19, + 1.74, + 45.855 + ], + "channel_true": [ + 3.3, + 7.300000000000001, + 4.1000000000000005, + 0.0 + ], + "channel_base": [ + 3.3, + 7.300000000000001, + 4.9, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 1.6, + -1.6, + 0.0 + ], + "row_shift_change_um": 0.54, + "error_type": "routing channel height mis-predicted + row x-shift changed", + "channel_change": [ + 0.0, + 0.0, + -0.8, + 0.0 + ] + }, + { + "case": "C11_gf180_sW2_sL2", + "mode": "combined", + "A0": 6337.6852, + "A_true": 6203.7969, + "A_hat": 6348.8607, + "d_true": -0.02113, + "d_hat": 0.00176, + "sign_true": -1, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 36.19, + 1.74, + 45.055 + ], + "channel_true": [ + 3.3, + 7.300000000000001, + 4.1000000000000005, + 0.0 + ], + "channel_base": [ + 3.3, + 7.300000000000001, + 4.9, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 1.6, + -1.6, + 0.0 + ], + "row_shift_change_um": 0.54, + "error_type": "routing channel height mis-predicted + row x-shift changed", + "channel_change": [ + 0.0, + 0.0, + -0.8, + 0.0 + ] + }, + { + "case": "C11_ihp130_sW0.5_sL1.5", + "mode": "diffusion_only", + "A0": 2092.7973, + "A_true": 2092.7973, + "A_hat": 2092.7973, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": true, + "row_shift_true": [ + 18.685, + 14.055, + 0.0 + ], + "channel_true": [ + 2.3099999999999996, + 5.26, + 3.4899999999999998, + 0.0 + ], + "channel_base": [ + 2.3099999999999996, + 5.26, + 3.4899999999999998, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C11_ihp130_sW0.5_sL1.5", + "mode": "gate_only", + "A0": 2092.7973, + "A_true": 2064.5756, + "A_hat": 2091.872, + "d_true": -0.01349, + "d_hat": -0.00044, + "sign_true": -1, + "sign_hat": 0, + "passive_dominated": true, + "row_shift_true": [ + 18.175, + 13.305, + 0.0 + ], + "channel_true": [ + 2.3099999999999996, + 5.26, + 2.9, + 0.0 + ], + "channel_base": [ + 2.3099999999999996, + 5.26, + 3.4899999999999998, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 1.18, + -1.18, + 0.0 + ], + "row_shift_change_um": 0.24, + "error_type": "routing channel height mis-predicted", + "channel_change": [ + 0.0, + 0.0, + -0.59, + 0.0 + ] + }, + { + "case": "C11_ihp130_sW0.5_sL1.5", + "mode": "combined", + "A0": 2092.7973, + "A_true": 2064.5756, + "A_hat": 2091.872, + "d_true": -0.01349, + "d_hat": -0.00044, + "sign_true": -1, + "sign_hat": 0, + "passive_dominated": true, + "row_shift_true": [ + 18.685, + 13.815, + 0.0 + ], + "channel_true": [ + 2.3099999999999996, + 5.26, + 2.9, + 0.0 + ], + "channel_base": [ + 2.3099999999999996, + 5.26, + 3.4899999999999998, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 1.18, + -1.18, + 0.0 + ], + "row_shift_change_um": 0.51, + "error_type": "routing channel height mis-predicted + row x-shift changed", + "channel_change": [ + 0.0, + 0.0, + -0.59, + 0.0 + ] + }, + { + "case": "C11_ihp130_sW0.5_sL1", + "mode": "diffusion_only", + "A0": 2092.7973, + "A_true": 2092.7973, + "A_hat": 2092.7973, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": true, + "row_shift_true": [ + 19.205, + 15.225, + 0.0 + ], + "channel_true": [ + 2.3099999999999996, + 5.26, + 3.4899999999999998, + 0.0 + ], + "channel_base": [ + 2.3099999999999996, + 5.26, + 3.4899999999999998, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C11_ihp130_sW0.5_sL1", + "mode": "gate_only", + "A0": 2092.7973, + "A_true": 2064.5756, + "A_hat": 2091.872, + "d_true": -0.01349, + "d_hat": -0.00044, + "sign_true": -1, + "sign_hat": 0, + "passive_dominated": true, + "row_shift_true": [ + 18.695, + 14.475, + 0.0 + ], + "channel_true": [ + 2.3099999999999996, + 5.26, + 2.9, + 0.0 + ], + "channel_base": [ + 2.3099999999999996, + 5.26, + 3.4899999999999998, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 1.18, + -1.18, + 0.0 + ], + "row_shift_change_um": 0.24, + "error_type": "routing channel height mis-predicted", + "channel_change": [ + 0.0, + 0.0, + -0.59, + 0.0 + ] + }, + { + "case": "C11_ihp130_sW0.5_sL1", + "mode": "combined", + "A0": 2092.7973, + "A_true": 2064.5756, + "A_hat": 2091.872, + "d_true": -0.01349, + "d_hat": -0.00044, + "sign_true": -1, + "sign_hat": 0, + "passive_dominated": true, + "row_shift_true": [ + 19.205, + 14.985, + 0.0 + ], + "channel_true": [ + 2.3099999999999996, + 5.26, + 2.9, + 0.0 + ], + "channel_base": [ + 2.3099999999999996, + 5.26, + 3.4899999999999998, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 1.18, + -1.18, + 0.0 + ], + "row_shift_change_um": 0.51, + "error_type": "routing channel height mis-predicted + row x-shift changed", + "channel_change": [ + 0.0, + 0.0, + -0.59, + 0.0 + ] + }, + { + "case": "C11_ihp130_sW0.5_sL2", + "mode": "diffusion_only", + "A0": 2092.7973, + "A_true": 2092.7973, + "A_hat": 2092.7973, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": true, + "row_shift_true": [ + 18.165, + 12.885, + 0.0 + ], + "channel_true": [ + 2.3099999999999996, + 5.26, + 3.4899999999999998, + 0.0 + ], + "channel_base": [ + 2.3099999999999996, + 5.26, + 3.4899999999999998, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C11_ihp130_sW0.5_sL2", + "mode": "gate_only", + "A0": 2092.7973, + "A_true": 2064.5756, + "A_hat": 2091.872, + "d_true": -0.01349, + "d_hat": -0.00044, + "sign_true": -1, + "sign_hat": 0, + "passive_dominated": true, + "row_shift_true": [ + 17.655, + 12.135, + 0.0 + ], + "channel_true": [ + 2.3099999999999996, + 5.26, + 2.9, + 0.0 + ], + "channel_base": [ + 2.3099999999999996, + 5.26, + 3.4899999999999998, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 1.18, + -1.18, + 0.0 + ], + "row_shift_change_um": 0.24, + "error_type": "routing channel height mis-predicted", + "channel_change": [ + 0.0, + 0.0, + -0.59, + 0.0 + ] + }, + { + "case": "C11_ihp130_sW0.5_sL2", + "mode": "combined", + "A0": 2092.7973, + "A_true": 2064.5756, + "A_hat": 2091.872, + "d_true": -0.01349, + "d_hat": -0.00044, + "sign_true": -1, + "sign_hat": 0, + "passive_dominated": true, + "row_shift_true": [ + 18.165, + 12.645, + 0.0 + ], + "channel_true": [ + 2.3099999999999996, + 5.26, + 2.9, + 0.0 + ], + "channel_base": [ + 2.3099999999999996, + 5.26, + 3.4899999999999998, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 1.18, + -1.18, + 0.0 + ], + "row_shift_change_um": 0.51, + "error_type": "routing channel height mis-predicted + row x-shift changed", + "channel_change": [ + 0.0, + 0.0, + -0.59, + 0.0 + ] + }, + { + "case": "C11_ihp130_sW1.5_sL1.5", + "mode": "diffusion_only", + "A0": 2200.0042, + "A_true": 2153.8645, + "A_hat": 2153.8645, + "d_true": -0.02097, + "d_hat": -0.02097, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 13.27, + 0.94, + 0.745 + ], + "channel_true": [ + 2.3099999999999996, + 5.26, + 3.4899999999999998, + 0.0 + ], + "channel_base": [ + 2.3099999999999996, + 5.26, + 3.4899999999999998, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C11_ihp130_sW1.5_sL1.5", + "mode": "gate_only", + "A0": 2200.0042, + "A_true": 2191.7569, + "A_hat": 2245.1508, + "d_true": -0.00375, + "d_hat": 0.02052, + "sign_true": 0, + "sign_hat": 1, + "passive_dominated": false, + "row_shift_true": [ + 13.51, + 0.79, + 1.495 + ], + "channel_true": [ + 2.3099999999999996, + 5.26, + 2.9, + 0.0 + ], + "channel_base": [ + 2.3099999999999996, + 5.26, + 3.4899999999999998, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 1.18, + -1.18, + 0.0 + ], + "row_shift_change_um": 0.24, + "error_type": "routing channel height mis-predicted", + "channel_change": [ + 0.0, + 0.0, + -0.59, + 0.0 + ] + }, + { + "case": "C11_ihp130_sW1.5_sL1.5", + "mode": "combined", + "A0": 2200.0042, + "A_true": 2146.2394, + "A_hat": 2199.0315, + "d_true": -0.02444, + "d_hat": -0.00044, + "sign_true": -1, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 13.51, + 0.94, + 0.985 + ], + "channel_true": [ + 2.3099999999999996, + 5.26, + 2.9, + 0.0 + ], + "channel_base": [ + 2.3099999999999996, + 5.26, + 3.4899999999999998, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 1.18, + -1.18, + 0.0 + ], + "row_shift_change_um": 0.27, + "error_type": "routing channel height mis-predicted", + "channel_change": [ + 0.0, + 0.0, + -0.59, + 0.0 + ] + }, + { + "case": "C11_ihp130_sW1.5_sL1", + "mode": "diffusion_only", + "A0": 2092.7973, + "A_true": 2092.7973, + "A_hat": 2092.7973, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": true, + "row_shift_true": [ + 14.085, + 3.705, + 0.0 + ], + "channel_true": [ + 2.3099999999999996, + 5.26, + 3.4899999999999998, + 0.0 + ], + "channel_base": [ + 2.3099999999999996, + 5.26, + 3.4899999999999998, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C11_ihp130_sW1.5_sL1", + "mode": "gate_only", + "A0": 2092.7973, + "A_true": 2064.5756, + "A_hat": 2091.872, + "d_true": -0.01349, + "d_hat": -0.00044, + "sign_true": -1, + "sign_hat": 0, + "passive_dominated": true, + "row_shift_true": [ + 13.575, + 3.085, + 0.0 + ], + "channel_true": [ + 2.3099999999999996, + 5.26, + 2.9, + 0.0 + ], + "channel_base": [ + 2.3099999999999996, + 5.26, + 3.4899999999999998, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 1.18, + -1.18, + 0.0 + ], + "row_shift_change_um": 0.24, + "error_type": "routing channel height mis-predicted", + "channel_change": [ + 0.0, + 0.0, + -0.59, + 0.0 + ] + }, + { + "case": "C11_ihp130_sW1.5_sL1", + "mode": "combined", + "A0": 2092.7973, + "A_true": 2064.5756, + "A_hat": 2091.872, + "d_true": -0.01349, + "d_hat": -0.00044, + "sign_true": -1, + "sign_hat": 0, + "passive_dominated": true, + "row_shift_true": [ + 14.085, + 3.465, + 0.0 + ], + "channel_true": [ + 2.3099999999999996, + 5.26, + 2.9, + 0.0 + ], + "channel_base": [ + 2.3099999999999996, + 5.26, + 3.4899999999999998, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 1.18, + -1.18, + 0.0 + ], + "row_shift_change_um": 0.51, + "error_type": "routing channel height mis-predicted + row x-shift changed", + "channel_change": [ + 0.0, + 0.0, + -0.59, + 0.0 + ] + }, + { + "case": "C11_ihp130_sW1.5_sL2", + "mode": "diffusion_only", + "A0": 2517.5539, + "A_true": 2471.4142, + "A_hat": 2471.4142, + "d_true": -0.01833, + "d_hat": -0.01833, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 15.22, + 0.94, + 4.255 + ], + "channel_true": [ + 2.3099999999999996, + 5.26, + 3.4899999999999998, + 0.0 + ], + "channel_base": [ + 2.3099999999999996, + 5.26, + 3.4899999999999998, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C11_ihp130_sW1.5_sL2", + "mode": "gate_only", + "A0": 2517.5539, + "A_true": 2505.0244, + "A_hat": 2562.5601, + "d_true": -0.00498, + "d_hat": 0.01788, + "sign_true": 0, + "sign_hat": 1, + "passive_dominated": false, + "row_shift_true": [ + 15.46, + 0.92, + 5.005 + ], + "channel_true": [ + 2.3099999999999996, + 5.26, + 2.9, + 0.0 + ], + "channel_base": [ + 2.3099999999999996, + 5.26, + 3.4899999999999998, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 1.18, + -1.18, + 0.0 + ], + "row_shift_change_um": 0.24, + "error_type": "routing channel height mis-predicted", + "channel_change": [ + 0.0, + 0.0, + -0.59, + 0.0 + ] + }, + { + "case": "C11_ihp130_sW1.5_sL2", + "mode": "combined", + "A0": 2517.5539, + "A_true": 2459.5069, + "A_hat": 2516.4408, + "d_true": -0.02306, + "d_hat": -0.00044, + "sign_true": -1, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 15.46, + 0.94, + 4.495 + ], + "channel_true": [ + 2.3099999999999996, + 5.26, + 2.9, + 0.0 + ], + "channel_base": [ + 2.3099999999999996, + 5.26, + 3.4899999999999998, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 1.18, + -1.18, + 0.0 + ], + "row_shift_change_um": 0.27, + "error_type": "routing channel height mis-predicted", + "channel_change": [ + 0.0, + 0.0, + -0.59, + 0.0 + ] + }, + { + "case": "C11_ihp130_sW1_sL2", + "mode": "diffusion_only", + "A0": 2092.7973, + "A_true": 2092.7973, + "A_hat": 2092.7973, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": true, + "row_shift_true": [ + 14.565, + 5.285, + 0.0 + ], + "channel_true": [ + 2.3099999999999996, + 5.26, + 3.4899999999999998, + 0.0 + ], + "channel_base": [ + 2.3099999999999996, + 5.26, + 3.4899999999999998, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C11_ihp130_sW1_sL2", + "mode": "gate_only", + "A0": 2092.7973, + "A_true": 2064.5756, + "A_hat": 2091.872, + "d_true": -0.01349, + "d_hat": -0.00044, + "sign_true": -1, + "sign_hat": 0, + "passive_dominated": true, + "row_shift_true": [ + 14.055, + 4.535, + 0.0 + ], + "channel_true": [ + 2.3099999999999996, + 5.26, + 2.9, + 0.0 + ], + "channel_base": [ + 2.3099999999999996, + 5.26, + 3.4899999999999998, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 1.18, + -1.18, + 0.0 + ], + "row_shift_change_um": 0.24, + "error_type": "routing channel height mis-predicted", + "channel_change": [ + 0.0, + 0.0, + -0.59, + 0.0 + ] + }, + { + "case": "C11_ihp130_sW1_sL2", + "mode": "combined", + "A0": 2092.7973, + "A_true": 2064.5756, + "A_hat": 2091.872, + "d_true": -0.01349, + "d_hat": -0.00044, + "sign_true": -1, + "sign_hat": 0, + "passive_dominated": true, + "row_shift_true": [ + 14.565, + 5.045, + 0.0 + ], + "channel_true": [ + 2.3099999999999996, + 5.26, + 2.9, + 0.0 + ], + "channel_base": [ + 2.3099999999999996, + 5.26, + 3.4899999999999998, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 1.18, + -1.18, + 0.0 + ], + "row_shift_change_um": 0.51, + "error_type": "routing channel height mis-predicted + row x-shift changed", + "channel_change": [ + 0.0, + 0.0, + -0.59, + 0.0 + ] + }, + { + "case": "C11_ihp130_sW2_sL1.5", + "mode": "diffusion_only", + "A0": 2826.9613, + "A_true": 2780.8216, + "A_hat": 2780.8216, + "d_true": -0.01632, + "d_hat": -0.01632, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 17.12, + 1.44, + 7.675 + ], + "channel_true": [ + 2.3099999999999996, + 5.26, + 3.4899999999999998, + 0.0 + ], + "channel_base": [ + 2.3099999999999996, + 5.26, + 3.4899999999999998, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C11_ihp130_sW2_sL1.5", + "mode": "gate_only", + "A0": 2826.9613, + "A_true": 2810.2594, + "A_hat": 2871.8307, + "d_true": -0.00591, + "d_hat": 0.01587, + "sign_true": -1, + "sign_hat": 1, + "passive_dominated": false, + "row_shift_true": [ + 17.36, + 1.44, + 8.425 + ], + "channel_true": [ + 2.3099999999999996, + 5.26, + 2.9, + 0.0 + ], + "channel_base": [ + 2.3099999999999996, + 5.26, + 3.4899999999999998, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 1.18, + -1.18, + 0.0 + ], + "row_shift_change_um": 0.24, + "error_type": "routing channel height mis-predicted", + "channel_change": [ + 0.0, + 0.0, + -0.59, + 0.0 + ] + }, + { + "case": "C11_ihp130_sW2_sL1.5", + "mode": "combined", + "A0": 2826.9613, + "A_true": 2764.7419, + "A_hat": 2825.7114, + "d_true": -0.02201, + "d_hat": -0.00044, + "sign_true": -1, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 17.36, + 1.44, + 7.915 + ], + "channel_true": [ + 2.3099999999999996, + 5.26, + 2.9, + 0.0 + ], + "channel_base": [ + 2.3099999999999996, + 5.26, + 3.4899999999999998, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 1.18, + -1.18, + 0.0 + ], + "row_shift_change_um": 0.27, + "error_type": "routing channel height mis-predicted", + "channel_change": [ + 0.0, + 0.0, + -0.59, + 0.0 + ] + }, + { + "case": "C11_ihp130_sW2_sL1", + "mode": "diffusion_only", + "A0": 2403.5617, + "A_true": 2357.422, + "A_hat": 2357.422, + "d_true": -0.0192, + "d_hat": -0.0192, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 14.52, + 1.44, + 2.995 + ], + "channel_true": [ + 2.3099999999999996, + 5.26, + 3.4899999999999998, + 0.0 + ], + "channel_base": [ + 2.3099999999999996, + 5.26, + 3.4899999999999998, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C11_ihp130_sW2_sL1", + "mode": "gate_only", + "A0": 2403.5617, + "A_true": 2392.5694, + "A_hat": 2448.6183, + "d_true": -0.00457, + "d_hat": 0.01875, + "sign_true": 0, + "sign_hat": 1, + "passive_dominated": false, + "row_shift_true": [ + 15.12, + 0.79, + 4.105 + ], + "channel_true": [ + 2.3099999999999996, + 5.26, + 2.9, + 0.0 + ], + "channel_base": [ + 2.3099999999999996, + 5.26, + 3.4899999999999998, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 1.18, + -1.18, + 0.0 + ], + "row_shift_change_um": 0.24, + "error_type": "routing channel height mis-predicted", + "channel_change": [ + 0.0, + 0.0, + -0.59, + 0.0 + ] + }, + { + "case": "C11_ihp130_sW2_sL1", + "mode": "combined", + "A0": 2403.5617, + "A_true": 2347.0519, + "A_hat": 2402.499, + "d_true": -0.02351, + "d_hat": -0.00044, + "sign_true": -1, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 14.76, + 1.44, + 3.235 + ], + "channel_true": [ + 2.3099999999999996, + 5.26, + 2.9, + 0.0 + ], + "channel_base": [ + 2.3099999999999996, + 5.26, + 3.4899999999999998, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 1.18, + -1.18, + 0.0 + ], + "row_shift_change_um": 0.65, + "error_type": "routing channel height mis-predicted + row x-shift changed", + "channel_change": [ + 0.0, + 0.0, + -0.59, + 0.0 + ] + }, + { + "case": "C11_ihp130_sW2_sL2", + "mode": "diffusion_only", + "A0": 3250.3609, + "A_true": 3204.2212, + "A_hat": 3204.2212, + "d_true": -0.0142, + "d_hat": -0.0142, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 19.72, + 1.44, + 12.355 + ], + "channel_true": [ + 2.3099999999999996, + 5.26, + 3.4899999999999998, + 0.0 + ], + "channel_base": [ + 2.3099999999999996, + 5.26, + 3.4899999999999998, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C11_ihp130_sW2_sL2", + "mode": "gate_only", + "A0": 3250.3609, + "A_true": 3227.9494, + "A_hat": 3295.0431, + "d_true": -0.0069, + "d_hat": 0.01375, + "sign_true": -1, + "sign_hat": 1, + "passive_dominated": false, + "row_shift_true": [ + 19.96, + 1.44, + 13.105 + ], + "channel_true": [ + 2.3099999999999996, + 5.26, + 2.9, + 0.0 + ], + "channel_base": [ + 2.3099999999999996, + 5.26, + 3.4899999999999998, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 1.18, + -1.18, + 0.0 + ], + "row_shift_change_um": 0.24, + "error_type": "routing channel height mis-predicted", + "channel_change": [ + 0.0, + 0.0, + -0.59, + 0.0 + ] + }, + { + "case": "C11_ihp130_sW2_sL2", + "mode": "combined", + "A0": 3250.3609, + "A_true": 3182.4319, + "A_hat": 3248.9238, + "d_true": -0.0209, + "d_hat": -0.00044, + "sign_true": -1, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 19.96, + 1.44, + 12.595 + ], + "channel_true": [ + 2.3099999999999996, + 5.26, + 2.9, + 0.0 + ], + "channel_base": [ + 2.3099999999999996, + 5.26, + 3.4899999999999998, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 1.18, + -1.18, + 0.0 + ], + "row_shift_change_um": 0.27, + "error_type": "routing channel height mis-predicted", + "channel_change": [ + 0.0, + 0.0, + -0.59, + 0.0 + ] + }, + { + "case": "C11_sky130_sW0.5_sL1.5", + "mode": "diffusion_only", + "A0": 1446.921, + "A_true": 1446.921, + "A_hat": 1446.921, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": true, + "row_shift_true": [ + 12.76, + 8.45, + 0.01 + ], + "channel_true": [ + 2.49, + 5.539999999999999, + 3.71, + 0.0 + ], + "channel_base": [ + 2.49, + 5.539999999999999, + 3.71, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C11_sky130_sW0.5_sL1.5", + "mode": "gate_only", + "A0": 1446.921, + "A_true": 1426.7718, + "A_hat": 1447.9632, + "d_true": -0.01393, + "d_hat": 0.00072, + "sign_true": -1, + "sign_hat": 0, + "passive_dominated": true, + "row_shift_true": [ + 12.2, + 7.45, + 0.01 + ], + "channel_true": [ + 2.49, + 5.539999999999999, + 3.1, + 0.0 + ], + "channel_base": [ + 2.49, + 5.539999999999999, + 3.71, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 1.22, + -1.22, + 0.0 + ], + "row_shift_change_um": 0.435, + "error_type": "routing channel height mis-predicted + row x-shift changed", + "channel_change": [ + 0.0, + 0.0, + -0.61, + 0.0 + ] + }, + { + "case": "C11_sky130_sW0.5_sL1.5", + "mode": "combined", + "A0": 1446.921, + "A_true": 1426.7718, + "A_hat": 1447.9632, + "d_true": -0.01393, + "d_hat": 0.00072, + "sign_true": -1, + "sign_hat": 0, + "passive_dominated": true, + "row_shift_true": [ + 12.76, + 8.005, + 0.01 + ], + "channel_true": [ + 2.49, + 5.539999999999999, + 3.1, + 0.0 + ], + "channel_base": [ + 2.49, + 5.539999999999999, + 3.71, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 1.22, + -1.22, + 0.0 + ], + "row_shift_change_um": 0.56, + "error_type": "routing channel height mis-predicted + row x-shift changed", + "channel_change": [ + 0.0, + 0.0, + -0.61, + 0.0 + ] + }, + { + "case": "C11_sky130_sW0.5_sL1", + "mode": "diffusion_only", + "A0": 1446.921, + "A_true": 1446.921, + "A_hat": 1446.921, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": true, + "row_shift_true": [ + 13.36, + 9.8, + 0.01 + ], + "channel_true": [ + 2.49, + 5.539999999999999, + 3.71, + 0.0 + ], + "channel_base": [ + 2.49, + 5.539999999999999, + 3.71, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C11_sky130_sW0.5_sL1", + "mode": "gate_only", + "A0": 1446.921, + "A_true": 1426.7718, + "A_hat": 1447.9632, + "d_true": -0.01393, + "d_hat": 0.00072, + "sign_true": -1, + "sign_hat": 0, + "passive_dominated": true, + "row_shift_true": [ + 12.8, + 8.8, + 0.01 + ], + "channel_true": [ + 2.49, + 5.539999999999999, + 3.1, + 0.0 + ], + "channel_base": [ + 2.49, + 5.539999999999999, + 3.71, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 1.22, + -1.22, + 0.0 + ], + "row_shift_change_um": 0.44, + "error_type": "routing channel height mis-predicted + row x-shift changed", + "channel_change": [ + 0.0, + 0.0, + -0.61, + 0.0 + ] + }, + { + "case": "C11_sky130_sW0.5_sL1", + "mode": "combined", + "A0": 1446.921, + "A_true": 1426.7718, + "A_hat": 1447.9632, + "d_true": -0.01393, + "d_hat": 0.00072, + "sign_true": -1, + "sign_hat": 0, + "passive_dominated": true, + "row_shift_true": [ + 13.36, + 9.36, + 0.01 + ], + "channel_true": [ + 2.49, + 5.539999999999999, + 3.1, + 0.0 + ], + "channel_base": [ + 2.49, + 5.539999999999999, + 3.71, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 1.22, + -1.22, + 0.0 + ], + "row_shift_change_um": 0.56, + "error_type": "routing channel height mis-predicted + row x-shift changed", + "channel_change": [ + 0.0, + 0.0, + -0.61, + 0.0 + ] + }, + { + "case": "C11_sky130_sW0.5_sL2", + "mode": "diffusion_only", + "A0": 1446.921, + "A_true": 1446.921, + "A_hat": 1446.921, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": true, + "row_shift_true": [ + 12.155, + 7.1, + 0.01 + ], + "channel_true": [ + 2.49, + 5.539999999999999, + 3.71, + 0.0 + ], + "channel_base": [ + 2.49, + 5.539999999999999, + 3.71, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C11_sky130_sW0.5_sL2", + "mode": "gate_only", + "A0": 1446.921, + "A_true": 1426.7718, + "A_hat": 1447.9632, + "d_true": -0.01393, + "d_hat": 0.00072, + "sign_true": -1, + "sign_hat": 0, + "passive_dominated": true, + "row_shift_true": [ + 11.6, + 6.1, + 0.01 + ], + "channel_true": [ + 2.49, + 5.539999999999999, + 3.1, + 0.0 + ], + "channel_base": [ + 2.49, + 5.539999999999999, + 3.71, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 1.22, + -1.22, + 0.0 + ], + "row_shift_change_um": 0.44, + "error_type": "routing channel height mis-predicted + row x-shift changed", + "channel_change": [ + 0.0, + 0.0, + -0.61, + 0.0 + ] + }, + { + "case": "C11_sky130_sW0.5_sL2", + "mode": "combined", + "A0": 1446.921, + "A_true": 1426.7718, + "A_hat": 1447.9632, + "d_true": -0.01393, + "d_hat": 0.00072, + "sign_true": -1, + "sign_hat": 0, + "passive_dominated": true, + "row_shift_true": [ + 12.155, + 6.655, + 0.01 + ], + "channel_true": [ + 2.49, + 5.539999999999999, + 3.1, + 0.0 + ], + "channel_base": [ + 2.49, + 5.539999999999999, + 3.71, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 1.22, + -1.22, + 0.0 + ], + "row_shift_change_um": 0.555, + "error_type": "routing channel height mis-predicted + row x-shift changed", + "channel_change": [ + 0.0, + 0.0, + -0.61, + 0.0 + ] + }, + { + "case": "C11_sky130_sW1.5_sL1.5", + "mode": "diffusion_only", + "A0": 1973.5852, + "A_true": 1926.9372, + "A_hat": 1926.9372, + "d_true": -0.02364, + "d_hat": -0.02364, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 12.56, + 0.85, + 5.73 + ], + "channel_true": [ + 2.49, + 5.539999999999999, + 3.71, + 0.0 + ], + "channel_base": [ + 2.49, + 5.539999999999999, + 3.71, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C11_sky130_sW1.5_sL1.5", + "mode": "gate_only", + "A0": 1973.5852, + "A_true": 1982.2436, + "A_hat": 2025.0228, + "d_true": 0.00439, + "d_hat": 0.02606, + "sign_true": 0, + "sign_hat": 1, + "passive_dominated": false, + "row_shift_true": [ + 13.105, + 0.815, + 6.835 + ], + "channel_true": [ + 2.49, + 5.539999999999999, + 3.1, + 0.0 + ], + "channel_base": [ + 2.49, + 5.539999999999999, + 3.71, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 1.22, + -1.22, + 0.0 + ], + "row_shift_change_um": 0.44, + "error_type": "routing channel height mis-predicted + row x-shift changed", + "channel_change": [ + 0.0, + 0.0, + -0.61, + 0.0 + ] + }, + { + "case": "C11_sky130_sW1.5_sL1.5", + "mode": "combined", + "A0": 1973.5852, + "A_true": 1936.2452, + "A_hat": 1978.3412, + "d_true": -0.01892, + "d_hat": 0.00241, + "sign_true": -1, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 13.0, + 0.85, + 6.175 + ], + "channel_true": [ + 2.49, + 5.539999999999999, + 3.1, + 0.0 + ], + "channel_base": [ + 2.49, + 5.539999999999999, + 3.71, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 1.22, + -1.22, + 0.0 + ], + "row_shift_change_um": 0.335, + "error_type": "routing channel height mis-predicted + row x-shift changed", + "channel_change": [ + 0.0, + 0.0, + -0.61, + 0.0 + ] + }, + { + "case": "C11_sky130_sW1.5_sL1", + "mode": "diffusion_only", + "A0": 1636.2203, + "A_true": 1589.5722, + "A_hat": 1589.5722, + "d_true": -0.02851, + "d_hat": -0.02851, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 10.31, + 0.85, + 1.685 + ], + "channel_true": [ + 2.49, + 5.539999999999999, + 3.71, + 0.0 + ], + "channel_base": [ + 2.49, + 5.539999999999999, + 3.71, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C11_sky130_sW1.5_sL1", + "mode": "gate_only", + "A0": 1636.2203, + "A_true": 1649.5765, + "A_hat": 1687.4148, + "d_true": 0.00816, + "d_hat": 0.03129, + "sign_true": 1, + "sign_hat": 1, + "passive_dominated": false, + "row_shift_true": [ + 10.75, + 0.88, + 2.685 + ], + "channel_true": [ + 2.49, + 5.539999999999999, + 3.1, + 0.0 + ], + "channel_base": [ + 2.49, + 5.539999999999999, + 3.71, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 1.22, + -1.22, + 0.0 + ] + }, + { + "case": "C11_sky130_sW1.5_sL1", + "mode": "combined", + "A0": 1636.2203, + "A_true": 1603.5782, + "A_hat": 1640.7332, + "d_true": -0.01995, + "d_hat": 0.00276, + "sign_true": -1, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 10.75, + 0.85, + 2.125 + ], + "channel_true": [ + 2.49, + 5.539999999999999, + 3.1, + 0.0 + ], + "channel_base": [ + 2.49, + 5.539999999999999, + 3.71, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 1.22, + -1.22, + 0.0 + ], + "row_shift_change_um": 0.44, + "error_type": "routing channel height mis-predicted + row x-shift changed", + "channel_change": [ + 0.0, + 0.0, + -0.61, + 0.0 + ] + }, + { + "case": "C11_sky130_sW1.5_sL2", + "mode": "diffusion_only", + "A0": 2310.9502, + "A_true": 2264.3023, + "A_hat": 2264.3022, + "d_true": -0.02019, + "d_hat": -0.02019, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 14.81, + 0.85, + 9.78 + ], + "channel_true": [ + 2.49, + 5.539999999999999, + 3.71, + 0.0 + ], + "channel_base": [ + 2.49, + 5.539999999999999, + 3.71, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C11_sky130_sW1.5_sL2", + "mode": "gate_only", + "A0": 2310.9502, + "A_true": 2314.9106, + "A_hat": 2362.6308, + "d_true": 0.00171, + "d_hat": 0.02236, + "sign_true": 0, + "sign_hat": 1, + "passive_dominated": false, + "row_shift_true": [ + 15.25, + 0.85, + 10.78 + ], + "channel_true": [ + 2.49, + 5.539999999999999, + 3.1, + 0.0 + ], + "channel_base": [ + 2.49, + 5.539999999999999, + 3.71, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 1.22, + -1.22, + 0.0 + ], + "row_shift_change_um": 0.44, + "error_type": "routing channel height mis-predicted + row x-shift changed", + "channel_change": [ + 0.0, + 0.0, + -0.61, + 0.0 + ] + }, + { + "case": "C11_sky130_sW1.5_sL2", + "mode": "combined", + "A0": 2310.9502, + "A_true": 2268.9122, + "A_hat": 2315.9492, + "d_true": -0.01819, + "d_hat": 0.00216, + "sign_true": -1, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 15.25, + 0.85, + 10.225 + ], + "channel_true": [ + 2.49, + 5.539999999999999, + 3.1, + 0.0 + ], + "channel_base": [ + 2.49, + 5.539999999999999, + 3.71, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 1.22, + -1.22, + 0.0 + ], + "row_shift_change_um": 0.44, + "error_type": "routing channel height mis-predicted + row x-shift changed", + "channel_change": [ + 0.0, + 0.0, + -0.61, + 0.0 + ] + }, + { + "case": "C11_sky130_sW1_sL2", + "mode": "diffusion_only", + "A0": 1643.7173, + "A_true": 1597.0693, + "A_hat": 1597.0693, + "d_true": -0.02838, + "d_hat": -0.02838, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 10.36, + 1.28, + 1.775 + ], + "channel_true": [ + 2.49, + 5.539999999999999, + 3.71, + 0.0 + ], + "channel_base": [ + 2.49, + 5.539999999999999, + 3.71, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C11_sky130_sW1_sL2", + "mode": "gate_only", + "A0": 1643.7173, + "A_true": 1656.9692, + "A_hat": 1694.9172, + "d_true": 0.00806, + "d_hat": 0.03115, + "sign_true": 1, + "sign_hat": 1, + "passive_dominated": false, + "row_shift_true": [ + 10.8, + 1.28, + 2.775 + ], + "channel_true": [ + 2.49, + 5.539999999999999, + 3.1, + 0.0 + ], + "channel_base": [ + 2.49, + 5.539999999999999, + 3.71, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 1.22, + -1.22, + 0.0 + ] + }, + { + "case": "C11_sky130_sW1_sL2", + "mode": "combined", + "A0": 1643.7173, + "A_true": 1610.9708, + "A_hat": 1648.2356, + "d_true": -0.01992, + "d_hat": 0.00275, + "sign_true": -1, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 10.8, + 1.28, + 2.215 + ], + "channel_true": [ + 2.49, + 5.539999999999999, + 3.1, + 0.0 + ], + "channel_base": [ + 2.49, + 5.539999999999999, + 3.71, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 1.22, + -1.22, + 0.0 + ], + "row_shift_change_um": 0.44, + "error_type": "routing channel height mis-predicted + row x-shift changed", + "channel_change": [ + 0.0, + 0.0, + -0.61, + 0.0 + ] + }, + { + "case": "C11_sky130_sW2_sL1.5", + "mode": "diffusion_only", + "A0": 2528.3633, + "A_true": 2481.7152, + "A_hat": 2481.7152, + "d_true": -0.01845, + "d_hat": -0.01845, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 16.26, + 1.28, + 12.39 + ], + "channel_true": [ + 2.49, + 5.539999999999999, + 3.71, + 0.0 + ], + "channel_base": [ + 2.49, + 5.539999999999999, + 3.71, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C11_sky130_sW2_sL1.5", + "mode": "gate_only", + "A0": 2528.3633, + "A_true": 2529.296, + "A_hat": 2580.2004, + "d_true": 0.00037, + "d_hat": 0.0205, + "sign_true": 0, + "sign_hat": 1, + "passive_dominated": false, + "row_shift_true": [ + 16.7, + 1.28, + 13.39 + ], + "channel_true": [ + 2.49, + 5.539999999999999, + 3.1, + 0.0 + ], + "channel_base": [ + 2.49, + 5.539999999999999, + 3.71, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 1.22, + -1.22, + 0.0 + ], + "row_shift_change_um": 0.44, + "error_type": "routing channel height mis-predicted + row x-shift changed", + "channel_change": [ + 0.0, + 0.0, + -0.61, + 0.0 + ] + }, + { + "case": "C11_sky130_sW2_sL1.5", + "mode": "combined", + "A0": 2528.3633, + "A_true": 2483.2976, + "A_hat": 2533.5188, + "d_true": -0.01782, + "d_hat": 0.00204, + "sign_true": -1, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 16.7, + 1.28, + 12.83 + ], + "channel_true": [ + 2.49, + 5.539999999999999, + 3.1, + 0.0 + ], + "channel_base": [ + 2.49, + 5.539999999999999, + 3.71, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 1.22, + -1.22, + 0.0 + ], + "row_shift_change_um": 0.44, + "error_type": "routing channel height mis-predicted + row x-shift changed", + "channel_change": [ + 0.0, + 0.0, + -0.61, + 0.0 + ] + }, + { + "case": "C11_sky130_sW2_sL1", + "mode": "diffusion_only", + "A0": 2078.5433, + "A_true": 2031.8953, + "A_hat": 2031.8953, + "d_true": -0.02244, + "d_hat": -0.02244, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 13.26, + 1.28, + 6.995 + ], + "channel_true": [ + 2.49, + 5.539999999999999, + 3.71, + 0.0 + ], + "channel_base": [ + 2.49, + 5.539999999999999, + 3.71, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C11_sky130_sW2_sL1", + "mode": "gate_only", + "A0": 2078.5433, + "A_true": 2085.7399, + "A_hat": 2130.0564, + "d_true": 0.00346, + "d_hat": 0.02478, + "sign_true": 0, + "sign_hat": 1, + "passive_dominated": false, + "row_shift_true": [ + 14.225, + 0.815, + 8.52 + ], + "channel_true": [ + 2.49, + 5.539999999999999, + 3.1, + 0.0 + ], + "channel_base": [ + 2.49, + 5.539999999999999, + 3.71, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 1.22, + -1.22, + 0.0 + ], + "row_shift_change_um": 0.445, + "error_type": "routing channel height mis-predicted + row x-shift changed", + "channel_change": [ + 0.0, + 0.0, + -0.61, + 0.0 + ] + }, + { + "case": "C11_sky130_sW2_sL1", + "mode": "combined", + "A0": 2078.5433, + "A_true": 2039.7415, + "A_hat": 2083.3748, + "d_true": -0.01867, + "d_hat": 0.00232, + "sign_true": -1, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 13.7, + 1.28, + 7.435 + ], + "channel_true": [ + 2.49, + 5.539999999999999, + 3.1, + 0.0 + ], + "channel_base": [ + 2.49, + 5.539999999999999, + 3.71, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 1.22, + -1.22, + 0.0 + ], + "row_shift_change_um": 0.64, + "error_type": "routing channel height mis-predicted + row x-shift changed", + "channel_change": [ + 0.0, + 0.0, + -0.61, + 0.0 + ] + }, + { + "case": "C11_sky130_sW2_sL2", + "mode": "diffusion_only", + "A0": 2978.1832, + "A_true": 2931.5352, + "A_hat": 2931.5352, + "d_true": -0.01566, + "d_hat": -0.01566, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 19.26, + 1.28, + 17.79 + ], + "channel_true": [ + 2.49, + 5.539999999999999, + 3.71, + 0.0 + ], + "channel_base": [ + 2.49, + 5.539999999999999, + 3.71, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C11_sky130_sW2_sL2", + "mode": "gate_only", + "A0": 2978.1832, + "A_true": 2972.8519, + "A_hat": 3030.3444, + "d_true": -0.00179, + "d_hat": 0.01751, + "sign_true": 0, + "sign_hat": 1, + "passive_dominated": false, + "row_shift_true": [ + 19.7, + 1.28, + 18.79 + ], + "channel_true": [ + 2.49, + 5.539999999999999, + 3.1, + 0.0 + ], + "channel_base": [ + 2.49, + 5.539999999999999, + 3.71, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 1.22, + -1.22, + 0.0 + ], + "row_shift_change_um": 0.44, + "error_type": "routing channel height mis-predicted + row x-shift changed", + "channel_change": [ + 0.0, + 0.0, + -0.61, + 0.0 + ] + }, + { + "case": "C11_sky130_sW2_sL2", + "mode": "combined", + "A0": 2978.1832, + "A_true": 2926.8536, + "A_hat": 2983.6628, + "d_true": -0.01724, + "d_hat": 0.00184, + "sign_true": -1, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 19.7, + 1.28, + 18.235 + ], + "channel_true": [ + 2.49, + 5.539999999999999, + 3.1, + 0.0 + ], + "channel_base": [ + 2.49, + 5.539999999999999, + 3.71, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 1.22, + -1.22, + 0.0 + ], + "row_shift_change_um": 0.44, + "error_type": "routing channel height mis-predicted + row x-shift changed", + "channel_change": [ + 0.0, + 0.0, + -0.61, + 0.0 + ] + }, + { + "case": "C13_gf180_sW1.5_sL1.5", + "mode": "diffusion_only", + "A0": 383.8396, + "A_true": 374.2316, + "A_hat": 374.2316, + "d_true": -0.02503, + "d_hat": -0.02503, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 3.3, + 5.7 + ], + "channel_base": [ + 3.3, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C13_gf180_sW1.5_sL1.5", + "mode": "gate_only", + "A0": 383.8396, + "A_true": 331.0104, + "A_hat": 367.8281, + "d_true": -0.13763, + "d_hat": -0.04171, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.9 + ], + "channel_base": [ + 3.3, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.8, + 0.0 + ] + }, + { + "case": "C13_gf180_sW1.5_sL1.5", + "mode": "combined", + "A0": 383.8396, + "A_true": 322.7144, + "A_hat": 358.8921, + "d_true": -0.15925, + "d_hat": -0.06499, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.9 + ], + "channel_base": [ + 3.3, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.8, + 0.0 + ] + }, + { + "case": "C13_gf180_sW1.5_sL1", + "mode": "diffusion_only", + "A0": 326.672, + "A_true": 317.064, + "A_hat": 317.064, + "d_true": -0.02941, + "d_hat": -0.02941, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 3.3, + 5.7 + ], + "channel_base": [ + 3.3, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C13_gf180_sW1.5_sL1", + "mode": "gate_only", + "A0": 326.672, + "A_true": 281.6492, + "A_hat": 314.6589, + "d_true": -0.13782, + "d_hat": -0.03677, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.9 + ], + "channel_base": [ + 3.3, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.8, + 0.0 + ] + }, + { + "case": "C13_gf180_sW1.5_sL1", + "mode": "combined", + "A0": 326.672, + "A_true": 273.3532, + "A_hat": 305.7229, + "d_true": -0.16322, + "d_hat": -0.06413, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.9 + ], + "channel_base": [ + 3.3, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.8, + 0.0 + ] + }, + { + "case": "C13_gf180_sW1.5_sL2", + "mode": "diffusion_only", + "A0": 441.0072, + "A_true": 431.3992, + "A_hat": 431.3992, + "d_true": -0.02179, + "d_hat": -0.02179, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 3.3, + 5.7 + ], + "channel_base": [ + 3.3, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C13_gf180_sW1.5_sL2", + "mode": "gate_only", + "A0": 441.0072, + "A_true": 380.3716, + "A_hat": 420.9973, + "d_true": -0.13749, + "d_hat": -0.04537, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.9 + ], + "channel_base": [ + 3.3, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.8, + 0.0 + ] + }, + { + "case": "C13_gf180_sW1.5_sL2", + "mode": "combined", + "A0": 441.0072, + "A_true": 372.0756, + "A_hat": 412.0613, + "d_true": -0.1563, + "d_hat": -0.06564, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.9 + ], + "channel_base": [ + 3.3, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.8, + 0.0 + ] + }, + { + "case": "C13_gf180_sW1_sL2", + "mode": "diffusion_only", + "A0": 431.8272, + "A_true": 422.4192, + "A_hat": 422.4192, + "d_true": -0.02179, + "d_hat": -0.02179, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 3.3, + 5.7 + ], + "channel_base": [ + 3.3, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C13_gf180_sW1_sL2", + "mode": "gate_only", + "A0": 431.8272, + "A_true": 371.2016, + "A_hat": 411.5748, + "d_true": -0.14039, + "d_hat": -0.0469, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.9 + ], + "channel_base": [ + 3.3, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.8, + 0.0 + ] + }, + { + "case": "C13_gf180_sW1_sL2", + "mode": "combined", + "A0": 431.8272, + "A_true": 363.1056, + "A_hat": 402.8388, + "d_true": -0.15914, + "d_hat": -0.06713, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.9 + ], + "channel_base": [ + 3.3, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.8, + 0.0 + ] + }, + { + "case": "C13_gf180_sW2_sL1.5", + "mode": "diffusion_only", + "A0": 655.7376, + "A_true": 646.3296, + "A_hat": 646.3296, + "d_true": -0.01435, + "d_hat": -0.01435, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 3.3, + 5.7 + ], + "channel_base": [ + 3.3, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C13_gf180_sW2_sL1.5", + "mode": "gate_only", + "A0": 655.7376, + "A_true": 563.8864, + "A_hat": 619.4916, + "d_true": -0.14007, + "d_hat": -0.05528, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.9 + ], + "channel_base": [ + 3.3, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.8, + 0.0 + ] + }, + { + "case": "C13_gf180_sW2_sL1.5", + "mode": "combined", + "A0": 655.7376, + "A_true": 555.7904, + "A_hat": 610.7556, + "d_true": -0.15242, + "d_hat": -0.0686, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.9 + ], + "channel_base": [ + 3.3, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.8, + 0.0 + ] + }, + { + "case": "C13_gf180_sW2_sL1", + "mode": "diffusion_only", + "A0": 543.7824, + "A_true": 534.3744, + "A_hat": 534.3744, + "d_true": -0.0173, + "d_hat": -0.0173, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 3.3, + 5.7 + ], + "channel_base": [ + 3.3, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C13_gf180_sW2_sL1", + "mode": "gate_only", + "A0": 543.7824, + "A_true": 467.544, + "A_hat": 515.5332, + "d_true": -0.1402, + "d_hat": -0.05195, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.9 + ], + "channel_base": [ + 3.3, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.8, + 0.0 + ] + }, + { + "case": "C13_gf180_sW2_sL1", + "mode": "combined", + "A0": 543.7824, + "A_true": 459.448, + "A_hat": 506.7972, + "d_true": -0.15509, + "d_hat": -0.06801, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.9 + ], + "channel_base": [ + 3.3, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.8, + 0.0 + ] + }, + { + "case": "C13_gf180_sW2_sL2", + "mode": "diffusion_only", + "A0": 767.6928, + "A_true": 758.2848, + "A_hat": 758.2848, + "d_true": -0.01225, + "d_hat": -0.01225, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 3.3, + 5.7 + ], + "channel_base": [ + 3.3, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C13_gf180_sW2_sL2", + "mode": "gate_only", + "A0": 767.6928, + "A_true": 660.2288, + "A_hat": 723.45, + "d_true": -0.13998, + "d_hat": -0.05763, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.9 + ], + "channel_base": [ + 3.3, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.8, + 0.0 + ] + }, + { + "case": "C13_gf180_sW2_sL2", + "mode": "combined", + "A0": 767.6928, + "A_true": 652.1328, + "A_hat": 714.714, + "d_true": -0.15053, + "d_hat": -0.06901, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 2.5, + 4.9 + ], + "channel_base": [ + 3.3, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.8, + 0.0 + ] + }, + { + "case": "C13_ihp130_sW1.5_sL1.5", + "mode": "diffusion_only", + "A0": 222.6961, + "A_true": 218.1775, + "A_hat": 218.1775, + "d_true": -0.02029, + "d_hat": -0.02029, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.3099999999999996, + 4.08 + ], + "channel_base": [ + 2.3099999999999996, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C13_ihp130_sW1.5_sL1.5", + "mode": "gate_only", + "A0": 222.6961, + "A_true": 192.1511, + "A_hat": 211.5713, + "d_true": -0.13716, + "d_hat": -0.04996, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.84 + ], + "channel_true": [ + 1.7199999999999998, + 3.4899999999999998 + ], + "channel_base": [ + 2.3099999999999996, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.59, + 0.0 + ] + }, + { + "case": "C13_ihp130_sW1.5_sL1.5", + "mode": "combined", + "A0": 222.6961, + "A_true": 188.2445, + "A_hat": 207.3638, + "d_true": -0.1547, + "d_hat": -0.06885, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.84 + ], + "channel_true": [ + 1.7199999999999998, + 3.4899999999999998 + ], + "channel_base": [ + 2.3099999999999996, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.59, + 0.0 + ] + }, + { + "case": "C13_ihp130_sW1.5_sL1", + "mode": "diffusion_only", + "A0": 183.5349, + "A_true": 179.0163, + "A_hat": 179.0163, + "d_true": -0.02462, + "d_hat": -0.02462, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.3099999999999996, + 4.08 + ], + "channel_base": [ + 2.3099999999999996, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C13_ihp130_sW1.5_sL1", + "mode": "gate_only", + "A0": 183.5349, + "A_true": 158.2939, + "A_hat": 175.1062, + "d_true": -0.13753, + "d_hat": -0.04592, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.84 + ], + "channel_true": [ + 1.7199999999999998, + 3.4899999999999998 + ], + "channel_base": [ + 2.3099999999999996, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.59, + 0.0 + ] + }, + { + "case": "C13_ihp130_sW1.5_sL1", + "mode": "combined", + "A0": 183.5349, + "A_true": 154.3873, + "A_hat": 170.8988, + "d_true": -0.15881, + "d_hat": -0.06885, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.84 + ], + "channel_true": [ + 1.7199999999999998, + 3.4899999999999998 + ], + "channel_base": [ + 2.3099999999999996, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.59, + 0.0 + ] + }, + { + "case": "C13_ihp130_sW1.5_sL2", + "mode": "diffusion_only", + "A0": 261.8573, + "A_true": 257.3387, + "A_hat": 257.3387, + "d_true": -0.01726, + "d_hat": -0.01726, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.3099999999999996, + 4.08 + ], + "channel_base": [ + 2.3099999999999996, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C13_ihp130_sW1.5_sL2", + "mode": "gate_only", + "A0": 261.8573, + "A_true": 226.0083, + "A_hat": 248.0362, + "d_true": -0.1369, + "d_hat": -0.05278, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.84 + ], + "channel_true": [ + 1.7199999999999998, + 3.4899999999999998 + ], + "channel_base": [ + 2.3099999999999996, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.59, + 0.0 + ] + }, + { + "case": "C13_ihp130_sW1.5_sL2", + "mode": "combined", + "A0": 261.8573, + "A_true": 222.1017, + "A_hat": 243.8287, + "d_true": -0.15182, + "d_hat": -0.06885, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.84 + ], + "channel_true": [ + 1.7199999999999998, + 3.4899999999999998 + ], + "channel_base": [ + 2.3099999999999996, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.59, + 0.0 + ] + }, + { + "case": "C13_ihp130_sW1_sL2", + "mode": "diffusion_only", + "A0": 254.4686, + "A_true": 250.0775, + "A_hat": 250.0774, + "d_true": -0.01726, + "d_hat": -0.01726, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.3099999999999996, + 4.08 + ], + "channel_base": [ + 2.3099999999999996, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C13_ihp130_sW1_sL2", + "mode": "gate_only", + "A0": 254.4686, + "A_true": 218.632, + "A_hat": 240.52, + "d_true": -0.14083, + "d_hat": -0.05481, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.84 + ], + "channel_true": [ + 1.7199999999999998, + 3.4899999999999998 + ], + "channel_base": [ + 2.3099999999999996, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.59, + 0.0 + ] + }, + { + "case": "C13_ihp130_sW1_sL2", + "mode": "combined", + "A0": 254.4686, + "A_true": 214.8529, + "A_hat": 236.44, + "d_true": -0.15568, + "d_hat": -0.07085, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.84 + ], + "channel_true": [ + 1.7199999999999998, + 3.4899999999999998 + ], + "channel_base": [ + 2.3099999999999996, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.59, + 0.0 + ] + }, + { + "case": "C13_ihp130_sW2_sL1.5", + "mode": "diffusion_only", + "A0": 386.2016, + "A_true": 381.8105, + "A_hat": 381.8104, + "d_true": -0.01137, + "d_hat": -0.01137, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.3099999999999996, + 4.08 + ], + "channel_base": [ + 2.3099999999999996, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C13_ihp130_sW2_sL1.5", + "mode": "gate_only", + "A0": 386.2016, + "A_true": 332.005, + "A_hat": 362.92, + "d_true": -0.14033, + "d_hat": -0.06028, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.84 + ], + "channel_true": [ + 1.7199999999999998, + 3.4899999999999998 + ], + "channel_base": [ + 2.3099999999999996, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.59, + 0.0 + ] + }, + { + "case": "C13_ihp130_sW2_sL1.5", + "mode": "combined", + "A0": 386.2016, + "A_true": 328.226, + "A_hat": 358.84, + "d_true": -0.15012, + "d_hat": -0.07085, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.84 + ], + "channel_true": [ + 1.7199999999999998, + 3.4899999999999998 + ], + "channel_base": [ + 2.3099999999999996, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.59, + 0.0 + ] + }, + { + "case": "C13_ihp130_sW2_sL1", + "mode": "diffusion_only", + "A0": 310.0892, + "A_true": 305.6981, + "A_hat": 305.6981, + "d_true": -0.01416, + "d_hat": -0.01416, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.3099999999999996, + 4.08 + ], + "channel_base": [ + 2.3099999999999996, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C13_ihp130_sW2_sL1", + "mode": "gate_only", + "A0": 310.0892, + "A_true": 266.5006, + "A_hat": 292.2, + "d_true": -0.14057, + "d_hat": -0.05769, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.84 + ], + "channel_true": [ + 1.7199999999999998, + 3.4899999999999998 + ], + "channel_base": [ + 2.3099999999999996, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.59, + 0.0 + ] + }, + { + "case": "C13_ihp130_sW2_sL1", + "mode": "combined", + "A0": 310.0892, + "A_true": 262.7215, + "A_hat": 288.12, + "d_true": -0.15276, + "d_hat": -0.07085, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.84 + ], + "channel_true": [ + 1.7199999999999998, + 3.4899999999999998 + ], + "channel_base": [ + 2.3099999999999996, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.59, + 0.0 + ] + }, + { + "case": "C13_ihp130_sW2_sL2", + "mode": "diffusion_only", + "A0": 462.314, + "A_true": 457.9229, + "A_hat": 457.9228, + "d_true": -0.0095, + "d_hat": -0.0095, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.3099999999999996, + 4.08 + ], + "channel_base": [ + 2.3099999999999996, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C13_ihp130_sW2_sL2", + "mode": "gate_only", + "A0": 462.314, + "A_true": 397.5094, + "A_hat": 433.64, + "d_true": -0.14017, + "d_hat": -0.06202, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.84 + ], + "channel_true": [ + 1.7199999999999998, + 3.4899999999999998 + ], + "channel_base": [ + 2.3099999999999996, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.59, + 0.0 + ] + }, + { + "case": "C13_ihp130_sW2_sL2", + "mode": "combined", + "A0": 462.314, + "A_true": 393.7303, + "A_hat": 429.56, + "d_true": -0.14835, + "d_hat": -0.07085, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.84 + ], + "channel_true": [ + 1.7199999999999998, + 3.4899999999999998 + ], + "channel_base": [ + 2.3099999999999996, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.59, + 0.0 + ] + }, + { + "case": "C13_sky130_sW1.5_sL1.5", + "mode": "diffusion_only", + "A0": 171.7101, + "A_true": 166.5721, + "A_hat": 166.5721, + "d_true": -0.02992, + "d_hat": -0.02992, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.49, + 4.32 + ], + "channel_base": [ + 2.49, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C13_sky130_sW1.5_sL1.5", + "mode": "gate_only", + "A0": 171.7101, + "A_true": 148.8005, + "A_hat": 166.0124, + "d_true": -0.13342, + "d_hat": -0.03318, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 3.71 + ], + "channel_base": [ + 2.49, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.61, + 0.0 + ] + }, + { + "case": "C13_sky130_sW1.5_sL1.5", + "mode": "combined", + "A0": 171.7101, + "A_true": 144.3289, + "A_hat": 161.1992, + "d_true": -0.15946, + "d_hat": -0.06121, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 3.71 + ], + "channel_base": [ + 2.49, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.61, + 0.0 + ] + }, + { + "case": "C13_sky130_sW1.5_sL1", + "mode": "diffusion_only", + "A0": 148.3139, + "A_true": 152.6949, + "A_hat": 143.1759, + "d_true": 0.02954, + "d_hat": -0.03464, + "sign_true": 1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.49, + 4.93 + ], + "channel_base": [ + 2.49, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ], + "row_shift_change_um": 0.0, + "error_type": "routing channel height mis-predicted", + "channel_change": [ + 0.0, + 0.61 + ] + }, + { + "case": "C13_sky130_sW1.5_sL1", + "mode": "gate_only", + "A0": 148.3139, + "A_true": 138.2506, + "A_hat": 144.0952, + "d_true": -0.06785, + "d_hat": -0.02844, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 4.32 + ], + "channel_base": [ + 2.49, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.61, + 0.0 + ] + }, + { + "case": "C13_sky130_sW1.5_sL1", + "mode": "combined", + "A0": 148.3139, + "A_true": 133.4374, + "A_hat": 139.282, + "d_true": -0.1003, + "d_hat": -0.0609, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 4.32 + ], + "channel_base": [ + 2.49, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.61, + 0.0 + ] + }, + { + "case": "C13_sky130_sW1.5_sL2", + "mode": "diffusion_only", + "A0": 195.1064, + "A_true": 189.9684, + "A_hat": 189.9684, + "d_true": -0.02633, + "d_hat": -0.02633, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.49, + 4.32 + ], + "channel_base": [ + 2.49, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C13_sky130_sW1.5_sL2", + "mode": "gate_only", + "A0": 195.1064, + "A_true": 169.1622, + "A_hat": 187.9297, + "d_true": -0.13297, + "d_hat": -0.03678, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 3.71 + ], + "channel_base": [ + 2.49, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.61, + 0.0 + ] + }, + { + "case": "C13_sky130_sW1.5_sL2", + "mode": "combined", + "A0": 195.1064, + "A_true": 164.6906, + "A_hat": 183.1165, + "d_true": -0.15589, + "d_hat": -0.06145, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 3.71 + ], + "channel_base": [ + 2.49, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.61, + 0.0 + ] + }, + { + "case": "C13_sky130_sW1_sL2", + "mode": "diffusion_only", + "A0": 189.7901, + "A_true": 184.7921, + "A_hat": 184.7921, + "d_true": -0.02633, + "d_hat": -0.02633, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.49, + 4.32 + ], + "channel_base": [ + 2.49, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C13_sky130_sW1_sL2", + "mode": "gate_only", + "A0": 189.7901, + "A_true": 163.866, + "A_hat": 182.4634, + "d_true": -0.13659, + "d_hat": -0.0386, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 3.71 + ], + "channel_base": [ + 2.49, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.61, + 0.0 + ] + }, + { + "case": "C13_sky130_sW1_sL2", + "mode": "combined", + "A0": 189.7901, + "A_true": 159.5344, + "A_hat": 177.7902, + "d_true": -0.15942, + "d_hat": -0.06323, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 3.71 + ], + "channel_base": [ + 2.49, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.61, + 0.0 + ] + }, + { + "case": "C13_sky130_sW2_sL1.5", + "mode": "diffusion_only", + "A0": 279.3079, + "A_true": 274.3099, + "A_hat": 274.3099, + "d_true": -0.01789, + "d_hat": -0.01789, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.49, + 4.32 + ], + "channel_base": [ + 2.49, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C13_sky130_sW2_sL1.5", + "mode": "gate_only", + "A0": 279.3079, + "A_true": 241.448, + "A_hat": 266.1638, + "d_true": -0.13555, + "d_hat": -0.04706, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 3.71 + ], + "channel_base": [ + 2.49, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.61, + 0.0 + ] + }, + { + "case": "C13_sky130_sW2_sL1.5", + "mode": "combined", + "A0": 279.3079, + "A_true": 237.1164, + "A_hat": 261.4906, + "d_true": -0.15106, + "d_hat": -0.06379, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 3.71 + ], + "channel_base": [ + 2.49, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.61, + 0.0 + ] + }, + { + "case": "C13_sky130_sW2_sL1", + "mode": "diffusion_only", + "A0": 233.7904, + "A_true": 244.4297, + "A_hat": 228.7924, + "d_true": 0.04551, + "d_hat": -0.02138, + "sign_true": 1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.49, + 4.93 + ], + "channel_base": [ + 2.49, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ], + "row_shift_change_um": 0.0, + "error_type": "routing channel height mis-predicted", + "channel_change": [ + 0.0, + 0.61 + ] + }, + { + "case": "C13_sky130_sW2_sL1", + "mode": "gate_only", + "A0": 233.7904, + "A_true": 217.9297, + "A_hat": 223.6043, + "d_true": -0.06784, + "d_hat": -0.04357, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 4.32 + ], + "channel_base": [ + 2.49, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.61, + 0.0 + ] + }, + { + "case": "C13_sky130_sW2_sL1", + "mode": "combined", + "A0": 233.7904, + "A_true": 213.2565, + "A_hat": 218.9311, + "d_true": -0.08783, + "d_hat": -0.06356, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 4.32 + ], + "channel_base": [ + 2.49, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.61, + 0.0 + ] + }, + { + "case": "C13_sky130_sW2_sL2", + "mode": "diffusion_only", + "A0": 324.8254, + "A_true": 319.8274, + "A_hat": 319.8274, + "d_true": -0.01539, + "d_hat": -0.01539, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.49, + 4.32 + ], + "channel_base": [ + 2.49, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C13_sky130_sW2_sL2", + "mode": "gate_only", + "A0": 324.8254, + "A_true": 280.8965, + "A_hat": 308.7233, + "d_true": -0.13524, + "d_hat": -0.04957, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 3.71 + ], + "channel_base": [ + 2.49, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.61, + 0.0 + ] + }, + { + "case": "C13_sky130_sW2_sL2", + "mode": "combined", + "A0": 324.8254, + "A_true": 276.5649, + "A_hat": 304.0501, + "d_true": -0.14857, + "d_hat": -0.06396, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 1.88, + 3.71 + ], + "channel_base": [ + 2.49, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": [ + -0.61, + 0.0 + ] + }, + { + "case": "C14_gf180_sW0.5_sL1.5", + "mode": "diffusion_only", + "A0": 299.4304, + "A_true": 279.3344, + "A_hat": 279.3344, + "d_true": -0.06711, + "d_hat": -0.06711, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 4.1000000000000005, + 5.7 + ], + "channel_base": [ + 4.1000000000000005, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_gf180_sW0.5_sL1.5", + "mode": "gate_only", + "A0": 299.4304, + "A_true": 299.4304, + "A_hat": 299.4304, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 4.1000000000000005, + 5.7 + ], + "channel_base": [ + 4.1000000000000005, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_gf180_sW0.5_sL1.5", + "mode": "combined", + "A0": 299.4304, + "A_true": 279.3344, + "A_hat": 279.3344, + "d_true": -0.06711, + "d_hat": -0.06711, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 4.1000000000000005, + 5.7 + ], + "channel_base": [ + 4.1000000000000005, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_gf180_sW0.5_sL1", + "mode": "diffusion_only", + "A0": 250.1952, + "A_true": 230.0992, + "A_hat": 230.0992, + "d_true": -0.08032, + "d_hat": -0.08032, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 4.1000000000000005, + 5.7 + ], + "channel_base": [ + 4.1000000000000005, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_gf180_sW0.5_sL1", + "mode": "gate_only", + "A0": 250.1952, + "A_true": 250.1952, + "A_hat": 250.1952, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 4.1000000000000005, + 5.7 + ], + "channel_base": [ + 4.1000000000000005, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_gf180_sW0.5_sL1", + "mode": "combined", + "A0": 250.1952, + "A_true": 230.0992, + "A_hat": 230.0992, + "d_true": -0.08032, + "d_hat": -0.08032, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 4.1000000000000005, + 5.7 + ], + "channel_base": [ + 4.1000000000000005, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_gf180_sW0.5_sL2", + "mode": "diffusion_only", + "A0": 348.6656, + "A_true": 328.5696, + "A_hat": 328.5696, + "d_true": -0.05764, + "d_hat": -0.05764, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 4.1000000000000005, + 5.7 + ], + "channel_base": [ + 4.1000000000000005, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_gf180_sW0.5_sL2", + "mode": "gate_only", + "A0": 348.6656, + "A_true": 348.6656, + "A_hat": 348.6656, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 4.1000000000000005, + 5.7 + ], + "channel_base": [ + 4.1000000000000005, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_gf180_sW0.5_sL2", + "mode": "combined", + "A0": 348.6656, + "A_true": 328.5696, + "A_hat": 328.5696, + "d_true": -0.05764, + "d_hat": -0.05764, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 4.1000000000000005, + 5.7 + ], + "channel_base": [ + 4.1000000000000005, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_gf180_sW1.5_sL1.5", + "mode": "diffusion_only", + "A0": 693.312, + "A_true": 673.216, + "A_hat": 673.216, + "d_true": -0.02899, + "d_hat": -0.02899, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 4.1000000000000005, + 5.7 + ], + "channel_base": [ + 4.1000000000000005, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_gf180_sW1.5_sL1.5", + "mode": "gate_only", + "A0": 693.312, + "A_true": 693.312, + "A_hat": 693.312, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 4.1000000000000005, + 5.7 + ], + "channel_base": [ + 4.1000000000000005, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_gf180_sW1.5_sL1.5", + "mode": "combined", + "A0": 693.312, + "A_true": 673.216, + "A_hat": 673.216, + "d_true": -0.02899, + "d_hat": -0.02899, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 4.1000000000000005, + 5.7 + ], + "channel_base": [ + 4.1000000000000005, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_gf180_sW1.5_sL1", + "mode": "diffusion_only", + "A0": 545.6064, + "A_true": 525.5104, + "A_hat": 525.5104, + "d_true": -0.03683, + "d_hat": -0.03683, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 4.1000000000000005, + 5.7 + ], + "channel_base": [ + 4.1000000000000005, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_gf180_sW1.5_sL1", + "mode": "gate_only", + "A0": 545.6064, + "A_true": 545.6064, + "A_hat": 545.6064, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 4.1000000000000005, + 5.7 + ], + "channel_base": [ + 4.1000000000000005, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_gf180_sW1.5_sL1", + "mode": "combined", + "A0": 545.6064, + "A_true": 525.5104, + "A_hat": 525.5104, + "d_true": -0.03683, + "d_hat": -0.03683, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 4.1000000000000005, + 5.7 + ], + "channel_base": [ + 4.1000000000000005, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_gf180_sW1.5_sL2", + "mode": "diffusion_only", + "A0": 841.0176, + "A_true": 820.9216, + "A_hat": 820.9216, + "d_true": -0.02389, + "d_hat": -0.02389, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 4.1000000000000005, + 5.7 + ], + "channel_base": [ + 4.1000000000000005, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_gf180_sW1.5_sL2", + "mode": "gate_only", + "A0": 841.0176, + "A_true": 841.0176, + "A_hat": 841.0176, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 4.1000000000000005, + 5.7 + ], + "channel_base": [ + 4.1000000000000005, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_gf180_sW1.5_sL2", + "mode": "combined", + "A0": 841.0176, + "A_true": 820.9216, + "A_hat": 820.9216, + "d_true": -0.02389, + "d_hat": -0.02389, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 4.1000000000000005, + 5.7 + ], + "channel_base": [ + 4.1000000000000005, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_gf180_sW1_sL2", + "mode": "diffusion_only", + "A0": 594.8416, + "A_true": 574.7456, + "A_hat": 574.7456, + "d_true": -0.03378, + "d_hat": -0.03378, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 4.1000000000000005, + 5.7 + ], + "channel_base": [ + 4.1000000000000005, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_gf180_sW1_sL2", + "mode": "gate_only", + "A0": 594.8416, + "A_true": 594.8416, + "A_hat": 594.8416, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 4.1000000000000005, + 5.7 + ], + "channel_base": [ + 4.1000000000000005, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_gf180_sW1_sL2", + "mode": "combined", + "A0": 594.8416, + "A_true": 574.7456, + "A_hat": 574.7456, + "d_true": -0.03378, + "d_hat": -0.03378, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 4.1000000000000005, + 5.7 + ], + "channel_base": [ + 4.1000000000000005, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_gf180_sW2_sL1.5", + "mode": "diffusion_only", + "A0": 890.2528, + "A_true": 870.1568, + "A_hat": 870.1568, + "d_true": -0.02257, + "d_hat": -0.02257, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 4.1000000000000005, + 5.7 + ], + "channel_base": [ + 4.1000000000000005, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_gf180_sW2_sL1.5", + "mode": "gate_only", + "A0": 890.2528, + "A_true": 890.2528, + "A_hat": 890.2528, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 4.1000000000000005, + 5.7 + ], + "channel_base": [ + 4.1000000000000005, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_gf180_sW2_sL1.5", + "mode": "combined", + "A0": 890.2528, + "A_true": 870.1568, + "A_hat": 870.1568, + "d_true": -0.02257, + "d_hat": -0.02257, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 4.1000000000000005, + 5.7 + ], + "channel_base": [ + 4.1000000000000005, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_gf180_sW2_sL1", + "mode": "diffusion_only", + "A0": 693.312, + "A_true": 673.216, + "A_hat": 673.216, + "d_true": -0.02899, + "d_hat": -0.02899, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 4.1000000000000005, + 5.7 + ], + "channel_base": [ + 4.1000000000000005, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_gf180_sW2_sL1", + "mode": "gate_only", + "A0": 693.312, + "A_true": 693.312, + "A_hat": 693.312, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 4.1000000000000005, + 5.7 + ], + "channel_base": [ + 4.1000000000000005, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_gf180_sW2_sL1", + "mode": "combined", + "A0": 693.312, + "A_true": 673.216, + "A_hat": 673.216, + "d_true": -0.02899, + "d_hat": -0.02899, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 4.1000000000000005, + 5.7 + ], + "channel_base": [ + 4.1000000000000005, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_gf180_sW2_sL2", + "mode": "diffusion_only", + "A0": 1087.1936, + "A_true": 1067.0976, + "A_hat": 1067.0976, + "d_true": -0.01848, + "d_hat": -0.01848, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 4.1000000000000005, + 5.7 + ], + "channel_base": [ + 4.1000000000000005, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_gf180_sW2_sL2", + "mode": "gate_only", + "A0": 1087.1936, + "A_true": 1087.1936, + "A_hat": 1087.1936, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 4.1000000000000005, + 5.7 + ], + "channel_base": [ + 4.1000000000000005, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_gf180_sW2_sL2", + "mode": "combined", + "A0": 1087.1936, + "A_true": 1067.0976, + "A_hat": 1067.0976, + "d_true": -0.01848, + "d_hat": -0.01848, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 1.05 + ], + "channel_true": [ + 4.1000000000000005, + 5.7 + ], + "channel_base": [ + 4.1000000000000005, + 5.7 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_ihp130_sW0.5_sL1.5", + "mode": "diffusion_only", + "A0": 174.662, + "A_true": 165.278, + "A_hat": 165.278, + "d_true": -0.05373, + "d_hat": -0.05373, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.9, + 4.08 + ], + "channel_base": [ + 2.9, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_ihp130_sW0.5_sL1.5", + "mode": "gate_only", + "A0": 174.662, + "A_true": 174.662, + "A_hat": 174.662, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.9, + 4.08 + ], + "channel_base": [ + 2.9, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_ihp130_sW0.5_sL1.5", + "mode": "combined", + "A0": 174.662, + "A_true": 165.278, + "A_hat": 165.278, + "d_true": -0.05373, + "d_hat": -0.05373, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.9, + 4.08 + ], + "channel_base": [ + 2.9, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_ihp130_sW0.5_sL1", + "mode": "diffusion_only", + "A0": 141.174, + "A_true": 131.79, + "A_hat": 131.79, + "d_true": -0.06647, + "d_hat": -0.06647, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.9, + 4.08 + ], + "channel_base": [ + 2.9, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_ihp130_sW0.5_sL1", + "mode": "gate_only", + "A0": 141.174, + "A_true": 141.174, + "A_hat": 141.174, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.9, + 4.08 + ], + "channel_base": [ + 2.9, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_ihp130_sW0.5_sL1", + "mode": "combined", + "A0": 141.174, + "A_true": 131.79, + "A_hat": 131.79, + "d_true": -0.06647, + "d_hat": -0.06647, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.9, + 4.08 + ], + "channel_base": [ + 2.9, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_ihp130_sW0.5_sL2", + "mode": "diffusion_only", + "A0": 208.15, + "A_true": 198.766, + "A_hat": 198.766, + "d_true": -0.04508, + "d_hat": -0.04508, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.9, + 4.08 + ], + "channel_base": [ + 2.9, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_ihp130_sW0.5_sL2", + "mode": "gate_only", + "A0": 208.15, + "A_true": 208.15, + "A_hat": 208.15, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.9, + 4.08 + ], + "channel_base": [ + 2.9, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_ihp130_sW0.5_sL2", + "mode": "combined", + "A0": 208.15, + "A_true": 198.766, + "A_hat": 198.766, + "d_true": -0.04508, + "d_hat": -0.04508, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.9, + 4.08 + ], + "channel_base": [ + 2.9, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_ihp130_sW1.5_sL1.5", + "mode": "diffusion_only", + "A0": 424.534, + "A_true": 415.15, + "A_hat": 415.15, + "d_true": -0.0221, + "d_hat": -0.0221, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.9, + 4.08 + ], + "channel_base": [ + 2.9, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_ihp130_sW1.5_sL1.5", + "mode": "gate_only", + "A0": 424.534, + "A_true": 424.534, + "A_hat": 424.534, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.9, + 4.08 + ], + "channel_base": [ + 2.9, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_ihp130_sW1.5_sL1.5", + "mode": "combined", + "A0": 424.534, + "A_true": 415.15, + "A_hat": 415.15, + "d_true": -0.0221, + "d_hat": -0.0221, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.9, + 4.08 + ], + "channel_base": [ + 2.9, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_ihp130_sW1.5_sL1", + "mode": "diffusion_only", + "A0": 324.07, + "A_true": 314.686, + "A_hat": 314.686, + "d_true": -0.02896, + "d_hat": -0.02896, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.9, + 4.08 + ], + "channel_base": [ + 2.9, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_ihp130_sW1.5_sL1", + "mode": "gate_only", + "A0": 324.07, + "A_true": 324.07, + "A_hat": 324.07, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.9, + 4.08 + ], + "channel_base": [ + 2.9, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_ihp130_sW1.5_sL1", + "mode": "combined", + "A0": 324.07, + "A_true": 314.686, + "A_hat": 314.686, + "d_true": -0.02896, + "d_hat": -0.02896, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.9, + 4.08 + ], + "channel_base": [ + 2.9, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_ihp130_sW1.5_sL2", + "mode": "diffusion_only", + "A0": 524.998, + "A_true": 515.614, + "A_hat": 515.614, + "d_true": -0.01787, + "d_hat": -0.01787, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.9, + 4.08 + ], + "channel_base": [ + 2.9, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_ihp130_sW1.5_sL2", + "mode": "gate_only", + "A0": 524.998, + "A_true": 524.998, + "A_hat": 524.998, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.9, + 4.08 + ], + "channel_base": [ + 2.9, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_ihp130_sW1.5_sL2", + "mode": "combined", + "A0": 524.998, + "A_true": 515.614, + "A_hat": 515.614, + "d_true": -0.01787, + "d_hat": -0.01787, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.9, + 4.08 + ], + "channel_base": [ + 2.9, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_ihp130_sW1_sL2", + "mode": "diffusion_only", + "A0": 366.574, + "A_true": 357.19, + "A_hat": 357.19, + "d_true": -0.0256, + "d_hat": -0.0256, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.9, + 4.08 + ], + "channel_base": [ + 2.9, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_ihp130_sW1_sL2", + "mode": "gate_only", + "A0": 366.574, + "A_true": 366.574, + "A_hat": 366.574, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.9, + 4.08 + ], + "channel_base": [ + 2.9, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_ihp130_sW1_sL2", + "mode": "combined", + "A0": 366.574, + "A_true": 357.19, + "A_hat": 357.19, + "d_true": -0.0256, + "d_hat": -0.0256, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.9, + 4.08 + ], + "channel_base": [ + 2.9, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_ihp130_sW2_sL1.5", + "mode": "diffusion_only", + "A0": 549.47, + "A_true": 540.086, + "A_hat": 540.086, + "d_true": -0.01708, + "d_hat": -0.01708, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.9, + 4.08 + ], + "channel_base": [ + 2.9, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_ihp130_sW2_sL1.5", + "mode": "gate_only", + "A0": 549.47, + "A_true": 549.47, + "A_hat": 549.47, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.9, + 4.08 + ], + "channel_base": [ + 2.9, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_ihp130_sW2_sL1.5", + "mode": "combined", + "A0": 549.47, + "A_true": 540.086, + "A_hat": 540.086, + "d_true": -0.01708, + "d_hat": -0.01708, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.9, + 4.08 + ], + "channel_base": [ + 2.9, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_ihp130_sW2_sL1", + "mode": "diffusion_only", + "A0": 415.518, + "A_true": 406.134, + "A_hat": 406.134, + "d_true": -0.02258, + "d_hat": -0.02258, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.9, + 4.08 + ], + "channel_base": [ + 2.9, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_ihp130_sW2_sL1", + "mode": "gate_only", + "A0": 415.518, + "A_true": 415.518, + "A_hat": 415.518, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.9, + 4.08 + ], + "channel_base": [ + 2.9, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_ihp130_sW2_sL1", + "mode": "combined", + "A0": 415.518, + "A_true": 406.134, + "A_hat": 406.134, + "d_true": -0.02258, + "d_hat": -0.02258, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.9, + 4.08 + ], + "channel_base": [ + 2.9, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_ihp130_sW2_sL2", + "mode": "diffusion_only", + "A0": 683.422, + "A_true": 674.038, + "A_hat": 674.038, + "d_true": -0.01373, + "d_hat": -0.01373, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.9, + 4.08 + ], + "channel_base": [ + 2.9, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_ihp130_sW2_sL2", + "mode": "gate_only", + "A0": 683.422, + "A_true": 683.422, + "A_hat": 683.422, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.9, + 4.08 + ], + "channel_base": [ + 2.9, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_ihp130_sW2_sL2", + "mode": "combined", + "A0": 683.422, + "A_true": 674.038, + "A_hat": 674.038, + "d_true": -0.01373, + "d_hat": -0.01373, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 2.9, + 4.08 + ], + "channel_base": [ + 2.9, + 4.08 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_sky130_sW0.5_sL1.5", + "mode": "diffusion_only", + "A0": 138.0191, + "A_true": 127.3399, + "A_hat": 127.3399, + "d_true": -0.07737, + "d_hat": -0.07737, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 3.1, + 4.32 + ], + "channel_base": [ + 3.1, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_sky130_sW0.5_sL1.5", + "mode": "gate_only", + "A0": 138.0191, + "A_true": 138.0191, + "A_hat": 138.0191, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 3.1, + 4.32 + ], + "channel_base": [ + 3.1, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_sky130_sW0.5_sL1.5", + "mode": "combined", + "A0": 138.0191, + "A_true": 127.3399, + "A_hat": 127.3399, + "d_true": -0.07737, + "d_hat": -0.07737, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 3.1, + 4.32 + ], + "channel_base": [ + 3.1, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_sky130_sW0.5_sL1", + "mode": "diffusion_only", + "A0": 117.9956, + "A_true": 107.3164, + "A_hat": 107.3164, + "d_true": -0.09051, + "d_hat": -0.09051, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 3.1, + 4.32 + ], + "channel_base": [ + 3.1, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_sky130_sW0.5_sL1", + "mode": "gate_only", + "A0": 117.9956, + "A_true": 117.9956, + "A_hat": 117.9956, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 3.1, + 4.32 + ], + "channel_base": [ + 3.1, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_sky130_sW0.5_sL1", + "mode": "combined", + "A0": 117.9956, + "A_true": 107.3164, + "A_hat": 107.3164, + "d_true": -0.09051, + "d_hat": -0.09051, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 3.1, + 4.32 + ], + "channel_base": [ + 3.1, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_sky130_sW0.5_sL2", + "mode": "diffusion_only", + "A0": 158.0426, + "A_true": 147.3634, + "A_hat": 147.3634, + "d_true": -0.06757, + "d_hat": -0.06757, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 3.1, + 4.32 + ], + "channel_base": [ + 3.1, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_sky130_sW0.5_sL2", + "mode": "gate_only", + "A0": 158.0426, + "A_true": 158.0426, + "A_hat": 158.0426, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 3.1, + 4.32 + ], + "channel_base": [ + 3.1, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_sky130_sW0.5_sL2", + "mode": "combined", + "A0": 158.0426, + "A_true": 147.3634, + "A_hat": 147.3634, + "d_true": -0.06757, + "d_hat": -0.06757, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 3.1, + 4.32 + ], + "channel_base": [ + 3.1, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_sky130_sW1.5_sL1.5", + "mode": "diffusion_only", + "A0": 296.8722, + "A_true": 286.193, + "A_hat": 286.193, + "d_true": -0.03597, + "d_hat": -0.03597, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 3.1, + 4.32 + ], + "channel_base": [ + 3.1, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_sky130_sW1.5_sL1.5", + "mode": "gate_only", + "A0": 296.8722, + "A_true": 296.8722, + "A_hat": 296.8722, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 3.1, + 4.32 + ], + "channel_base": [ + 3.1, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_sky130_sW1.5_sL1.5", + "mode": "combined", + "A0": 296.8722, + "A_true": 286.193, + "A_hat": 286.193, + "d_true": -0.03597, + "d_hat": -0.03597, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 3.1, + 4.32 + ], + "channel_base": [ + 3.1, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_sky130_sW1.5_sL1", + "mode": "diffusion_only", + "A0": 236.8017, + "A_true": 226.1225, + "A_hat": 226.1225, + "d_true": -0.0451, + "d_hat": -0.0451, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 3.1, + 4.32 + ], + "channel_base": [ + 3.1, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_sky130_sW1.5_sL1", + "mode": "gate_only", + "A0": 236.8017, + "A_true": 236.8017, + "A_hat": 236.8017, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 3.1, + 4.32 + ], + "channel_base": [ + 3.1, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_sky130_sW1.5_sL1", + "mode": "combined", + "A0": 236.8017, + "A_true": 226.1225, + "A_hat": 226.1225, + "d_true": -0.0451, + "d_hat": -0.0451, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 3.1, + 4.32 + ], + "channel_base": [ + 3.1, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_sky130_sW1.5_sL2", + "mode": "diffusion_only", + "A0": 356.9427, + "A_true": 346.2635, + "A_hat": 346.2635, + "d_true": -0.02992, + "d_hat": -0.02992, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 3.1, + 4.32 + ], + "channel_base": [ + 3.1, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_sky130_sW1.5_sL2", + "mode": "gate_only", + "A0": 356.9427, + "A_true": 356.9427, + "A_hat": 356.9427, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 3.1, + 4.32 + ], + "channel_base": [ + 3.1, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_sky130_sW1.5_sL2", + "mode": "combined", + "A0": 356.9427, + "A_true": 346.2635, + "A_hat": 346.2635, + "d_true": -0.02992, + "d_hat": -0.02992, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 3.1, + 4.32 + ], + "channel_base": [ + 3.1, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_sky130_sW1_sL2", + "mode": "diffusion_only", + "A0": 257.4927, + "A_true": 246.8135, + "A_hat": 246.8135, + "d_true": -0.04147, + "d_hat": -0.04147, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 3.1, + 4.32 + ], + "channel_base": [ + 3.1, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_sky130_sW1_sL2", + "mode": "gate_only", + "A0": 257.4927, + "A_true": 257.4927, + "A_hat": 257.4927, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 3.1, + 4.32 + ], + "channel_base": [ + 3.1, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_sky130_sW1_sL2", + "mode": "combined", + "A0": 257.4927, + "A_true": 246.8135, + "A_hat": 246.8135, + "d_true": -0.04147, + "d_hat": -0.04147, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 3.1, + 4.32 + ], + "channel_base": [ + 3.1, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_sky130_sW2_sL1.5", + "mode": "diffusion_only", + "A0": 376.2988, + "A_true": 365.6196, + "A_hat": 365.6196, + "d_true": -0.02838, + "d_hat": -0.02838, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 3.1, + 4.32 + ], + "channel_base": [ + 3.1, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_sky130_sW2_sL1.5", + "mode": "gate_only", + "A0": 376.2988, + "A_true": 376.2988, + "A_hat": 376.2988, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 3.1, + 4.32 + ], + "channel_base": [ + 3.1, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_sky130_sW2_sL1.5", + "mode": "combined", + "A0": 376.2988, + "A_true": 365.6196, + "A_hat": 365.6196, + "d_true": -0.02838, + "d_hat": -0.02838, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 3.1, + 4.32 + ], + "channel_base": [ + 3.1, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_sky130_sW2_sL1", + "mode": "diffusion_only", + "A0": 296.2048, + "A_true": 285.5256, + "A_hat": 285.5256, + "d_true": -0.03605, + "d_hat": -0.03605, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 3.1, + 4.32 + ], + "channel_base": [ + 3.1, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_sky130_sW2_sL1", + "mode": "gate_only", + "A0": 296.2048, + "A_true": 296.2048, + "A_hat": 296.2048, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 3.1, + 4.32 + ], + "channel_base": [ + 3.1, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_sky130_sW2_sL1", + "mode": "combined", + "A0": 296.2048, + "A_true": 285.5256, + "A_hat": 285.5256, + "d_true": -0.03605, + "d_hat": -0.03605, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 3.1, + 4.32 + ], + "channel_base": [ + 3.1, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_sky130_sW2_sL2", + "mode": "diffusion_only", + "A0": 456.3928, + "A_true": 445.7136, + "A_hat": 445.7136, + "d_true": -0.0234, + "d_hat": -0.0234, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 3.1, + 4.32 + ], + "channel_base": [ + 3.1, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_sky130_sW2_sL2", + "mode": "gate_only", + "A0": 456.3928, + "A_true": 456.3928, + "A_hat": 456.3928, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 3.1, + 4.32 + ], + "channel_base": [ + 3.1, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C14_sky130_sW2_sL2", + "mode": "combined", + "A0": 456.3928, + "A_true": 445.7136, + "A_hat": 445.7136, + "d_true": -0.0234, + "d_hat": -0.0234, + "sign_true": -1, + "sign_hat": -1, + "passive_dominated": false, + "row_shift_true": [ + 0.85 + ], + "channel_true": [ + 3.1, + 4.32 + ], + "channel_base": [ + 3.1, + 4.32 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0 + ] + }, + { + "case": "C16_gf180_sW0.5_sL1", + "mode": "diffusion_only", + "A0": 1729.3648, + "A_true": 1729.3648, + "A_hat": 1729.3648, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": true, + "row_shift_true": [ + 57.05, + 0.18 + ], + "channel_true": [ + 2.5, + 5.7, + 0.0 + ], + "channel_base": [ + 2.5, + 5.7, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C16_gf180_sW1.5_sL1.5", + "mode": "diffusion_only", + "A0": 1729.3648, + "A_true": 1729.3648, + "A_hat": 1729.3648, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": true, + "row_shift_true": [ + 44.75, + 0.02 + ], + "channel_true": [ + 2.5, + 5.7, + 0.0 + ], + "channel_base": [ + 2.5, + 5.7, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C16_gf180_sW1.5_sL1", + "mode": "diffusion_only", + "A0": 1729.3648, + "A_true": 1729.3648, + "A_hat": 1729.3648, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": true, + "row_shift_true": [ + 48.09, + 0.18 + ], + "channel_true": [ + 2.5, + 5.7, + 0.0 + ], + "channel_base": [ + 2.5, + 5.7, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C16_gf180_sW1.5_sL2", + "mode": "diffusion_only", + "A0": 1729.3648, + "A_true": 1729.3648, + "A_hat": 1729.3648, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": true, + "row_shift_true": [ + 41.39, + 0.02 + ], + "channel_true": [ + 2.5, + 5.7, + 0.0 + ], + "channel_base": [ + 2.5, + 5.7, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C16_gf180_sW1_sL2", + "mode": "diffusion_only", + "A0": 1729.3648, + "A_true": 1729.3648, + "A_hat": 1729.3648, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": true, + "row_shift_true": [ + 48.11, + 0.02 + ], + "channel_true": [ + 2.5, + 5.7, + 0.0 + ], + "channel_base": [ + 2.5, + 5.7, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C16_gf180_sW2_sL1.5", + "mode": "diffusion_only", + "A0": 1729.3648, + "A_true": 1729.3648, + "A_hat": 1729.3648, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": true, + "row_shift_true": [ + 39.15, + 0.02 + ], + "channel_true": [ + 2.5, + 5.7, + 0.0 + ], + "channel_base": [ + 2.5, + 5.7, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C16_gf180_sW2_sL1", + "mode": "diffusion_only", + "A0": 1729.3648, + "A_true": 1729.3648, + "A_hat": 1729.3648, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": true, + "row_shift_true": [ + 43.61, + 0.18 + ], + "channel_true": [ + 2.5, + 5.7, + 0.0 + ], + "channel_base": [ + 2.5, + 5.7, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C16_gf180_sW2_sL2", + "mode": "diffusion_only", + "A0": 1729.3648, + "A_true": 1729.3648, + "A_hat": 1729.3648, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": true, + "row_shift_true": [ + 34.67, + 0.02 + ], + "channel_true": [ + 2.5, + 5.7, + 0.0 + ], + "channel_base": [ + 2.5, + 5.7, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C16_ihp130_sW0.5_sL1", + "mode": "diffusion_only", + "A0": 1007.736, + "A_true": 1007.736, + "A_hat": 1007.736, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": true, + "row_shift_true": [ + 45.01, + 0.26 + ], + "channel_true": [ + 1.7199999999999998, + 4.08, + 0.0 + ], + "channel_base": [ + 1.7199999999999998, + 4.08, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C16_ihp130_sW1.5_sL1.5", + "mode": "diffusion_only", + "A0": 1007.736, + "A_true": 1007.736, + "A_hat": 1007.736, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": true, + "row_shift_true": [ + 38.33, + 0.13 + ], + "channel_true": [ + 1.7199999999999998, + 4.08, + 0.0 + ], + "channel_base": [ + 1.7199999999999998, + 4.08, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C16_ihp130_sW1.5_sL1", + "mode": "diffusion_only", + "A0": 1007.736, + "A_true": 1007.736, + "A_hat": 1007.736, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": true, + "row_shift_true": [ + 39.89, + 0.26 + ], + "channel_true": [ + 1.7199999999999998, + 4.08, + 0.0 + ], + "channel_base": [ + 1.7199999999999998, + 4.08, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C16_ihp130_sW1.5_sL2", + "mode": "diffusion_only", + "A0": 1007.736, + "A_true": 1007.736, + "A_hat": 1007.736, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": true, + "row_shift_true": [ + 36.77, + 0.0 + ], + "channel_true": [ + 1.7199999999999998, + 4.08, + 0.0 + ], + "channel_base": [ + 1.7199999999999998, + 4.08, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C16_ihp130_sW1_sL2", + "mode": "diffusion_only", + "A0": 1007.736, + "A_true": 1007.736, + "A_hat": 1007.736, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": true, + "row_shift_true": [ + 40.37, + 0.0 + ], + "channel_true": [ + 1.7199999999999998, + 4.08, + 0.0 + ], + "channel_base": [ + 1.7199999999999998, + 4.08, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C16_ihp130_sW2_sL1.5", + "mode": "diffusion_only", + "A0": 1007.736, + "A_true": 1007.736, + "A_hat": 1007.736, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": true, + "row_shift_true": [ + 35.25, + 0.13 + ], + "channel_true": [ + 1.7199999999999998, + 4.08, + 0.0 + ], + "channel_base": [ + 1.7199999999999998, + 4.08, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C16_ihp130_sW2_sL1", + "mode": "diffusion_only", + "A0": 1007.736, + "A_true": 1007.736, + "A_hat": 1007.736, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": true, + "row_shift_true": [ + 37.33, + 0.26 + ], + "channel_true": [ + 1.7199999999999998, + 4.08, + 0.0 + ], + "channel_base": [ + 1.7199999999999998, + 4.08, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C16_ihp130_sW2_sL2", + "mode": "diffusion_only", + "A0": 1007.736, + "A_true": 1007.736, + "A_hat": 1007.736, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": true, + "row_shift_true": [ + 33.17, + 0.0 + ], + "channel_true": [ + 1.7199999999999998, + 4.08, + 0.0 + ], + "channel_base": [ + 1.7199999999999998, + 4.08, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C16_sky130_sW0.5_sL1.5", + "mode": "diffusion_only", + "A0": 377.2788, + "A_true": 377.2788, + "A_hat": 377.2788, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": true, + "row_shift_true": [ + 15.25, + 0.05 + ], + "channel_true": [ + 1.88, + 4.32, + 0.0 + ], + "channel_base": [ + 1.88, + 4.32, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C16_sky130_sW0.5_sL1", + "mode": "diffusion_only", + "A0": 377.2788, + "A_true": 377.2788, + "A_hat": 377.2788, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": true, + "row_shift_true": [ + 15.85, + 0.2 + ], + "channel_true": [ + 1.88, + 4.32, + 0.0 + ], + "channel_base": [ + 1.88, + 4.32, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C16_sky130_sW0.5_sL2", + "mode": "diffusion_only", + "A0": 377.2788, + "A_true": 377.2788, + "A_hat": 377.2788, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": true, + "row_shift_true": [ + 14.66, + 0.01 + ], + "channel_true": [ + 1.88, + 4.32, + 0.0 + ], + "channel_base": [ + 1.88, + 4.32, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C16_sky130_sW1.5_sL1.5", + "mode": "diffusion_only", + "A0": 377.2788, + "A_true": 377.2788, + "A_hat": 377.2788, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": true, + "row_shift_true": [ + 9.33, + 0.05 + ], + "channel_true": [ + 1.88, + 4.32, + 0.0 + ], + "channel_base": [ + 1.88, + 4.32, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C16_sky130_sW1.5_sL1", + "mode": "diffusion_only", + "A0": 377.2788, + "A_true": 377.2788, + "A_hat": 377.2788, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": true, + "row_shift_true": [ + 11.13, + 0.2 + ], + "channel_true": [ + 1.88, + 4.32, + 0.0 + ], + "channel_base": [ + 1.88, + 4.32, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C16_sky130_sW1.5_sL2", + "mode": "diffusion_only", + "A0": 377.2788, + "A_true": 377.2788, + "A_hat": 377.2788, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": true, + "row_shift_true": [ + 7.54, + 0.01 + ], + "channel_true": [ + 1.88, + 4.32, + 0.0 + ], + "channel_base": [ + 1.88, + 4.32, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C16_sky130_sW1_sL2", + "mode": "diffusion_only", + "A0": 377.2788, + "A_true": 377.2788, + "A_hat": 377.2788, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": true, + "row_shift_true": [ + 11.1, + 0.01 + ], + "channel_true": [ + 1.88, + 4.32, + 0.0 + ], + "channel_base": [ + 1.88, + 4.32, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C16_sky130_sW2_sL1.5", + "mode": "diffusion_only", + "A0": 377.2788, + "A_true": 377.2788, + "A_hat": 377.2788, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": true, + "row_shift_true": [ + 6.37, + 0.05 + ], + "channel_true": [ + 1.88, + 4.32, + 0.0 + ], + "channel_base": [ + 1.88, + 4.32, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C16_sky130_sW2_sL1", + "mode": "diffusion_only", + "A0": 377.2788, + "A_true": 377.2788, + "A_hat": 377.2788, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": true, + "row_shift_true": [ + 8.77, + 0.2 + ], + "channel_true": [ + 1.88, + 4.32, + 0.0 + ], + "channel_base": [ + 1.88, + 4.32, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + }, + { + "case": "C16_sky130_sW2_sL2", + "mode": "diffusion_only", + "A0": 377.2788, + "A_true": 377.2788, + "A_hat": 377.2788, + "d_true": 0.0, + "d_hat": 0.0, + "sign_true": 0, + "sign_hat": 0, + "passive_dominated": true, + "row_shift_true": [ + 3.98, + 0.01 + ], + "channel_true": [ + 1.88, + 4.32, + 0.0 + ], + "channel_base": [ + 1.88, + 4.32, + 0.0 + ], + "strategy": "shared", + "channel_dh_hat": [ + 0.0, + 0.0, + 0.0 + ] + } + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/results/analysis/geometry_check.json b/benchmarks/textbook_sharing/results/analysis/geometry_check.json new file mode 100644 index 00000000..aae97b77 --- /dev/null +++ b/benchmarks/textbook_sharing/results/analysis/geometry_check.json @@ -0,0 +1,481 @@ +{ + "summary": { + "grid": { + "records": 1612, + "hash_match": 1612 + }, + "models": { + "records": 1143, + "hash_match": 1143 + }, + "selection": { + "records": 3404, + "hash_match": 3338, + "bbox_match_only": 66 + } + }, + "not_matching": [ + { + "record": "runs/selection/C08_sky130_sW1_sL1/c087f4692e78", + "hash_match": false, + "bbox_match": true, + "hash": "8907c6d1058d41fa", + "recorded_hash": "dc4d4fc49366e425" + }, + { + "record": "runs/selection/C08_sky130_sW1_sL1/c12cfed03e95", + "hash_match": false, + "bbox_match": true, + "hash": "b2fe578a029012b8", + "recorded_hash": "3654e2c5e9cf1e43" + }, + { + "record": "runs/selection/C08_sky130_sW1_sL1/c13a0048c574", + "hash_match": false, + "bbox_match": true, + "hash": "8513579868763968", + "recorded_hash": "4e6133d5b8bf9944" + }, + { + "record": "runs/selection/C08_sky130_sW1_sL1/c15f7f08c7b4", + "hash_match": false, + "bbox_match": true, + "hash": "535d6e04abaa3ea8", + "recorded_hash": "223661ddad0252f4" + }, + { + "record": "runs/selection/C08_sky130_sW1_sL1/c1f5b1d5e57e", + "hash_match": false, + "bbox_match": true, + "hash": "0e26090325f17cbb", + "recorded_hash": "26ebdda1b3031797" + }, + { + "record": "runs/selection/C08_sky130_sW1_sL1/c56512190a3f", + "hash_match": false, + "bbox_match": true, + "hash": "6ae02b2e0558ce94", + "recorded_hash": "8bbfcffca7f774d5" + }, + { + "record": "runs/selection/C08_sky130_sW1_sL1/c573cc90b25e", + "hash_match": false, + "bbox_match": true, + "hash": "fd3b19ee03555365", + "recorded_hash": "efa223e5e4462b65" + }, + { + "record": "runs/selection/C08_sky130_sW1_sL1/c66c6edf9e41", + "hash_match": false, + "bbox_match": true, + "hash": "3da7e920b7fd9aac", + "recorded_hash": "0160f1998356d858" + }, + { + "record": "runs/selection/C08_sky130_sW1_sL1/c681229827ee", + "hash_match": false, + "bbox_match": true, + "hash": "3b05244e647ec96d", + "recorded_hash": "5939372d972b60cb" + }, + { + "record": "runs/selection/C08_sky130_sW1_sL1/c717e4610efc", + "hash_match": false, + "bbox_match": true, + "hash": "613830a068eed1d6", + "recorded_hash": "3f4893e6c4c5ecbf" + }, + { + "record": "runs/selection/C08_sky130_sW1_sL1/c7281b4f8697", + "hash_match": false, + "bbox_match": true, + "hash": "17c0a403dae1552f", + "recorded_hash": "5c5f33e931304eba" + }, + { + "record": "runs/selection/C08_sky130_sW1_sL1/c81c8316ca1a", + "hash_match": false, + "bbox_match": true, + "hash": "99b5c5ee0a97c70b", + "recorded_hash": "67eeb8bf5c795740" + }, + { + "record": "runs/selection/C08_sky130_sW1_sL1/c94046dd7e8b", + "hash_match": false, + "bbox_match": true, + "hash": "3b55adbba6b0dfc0", + "recorded_hash": "35ef16945f85b52f" + }, + { + "record": "runs/selection/C08_sky130_sW1_sL1/cb39850af7c3", + "hash_match": false, + "bbox_match": true, + "hash": "d891f52c5dd2da54", + "recorded_hash": "e09f504a34f3f2d4" + }, + { + "record": "runs/selection/C08_sky130_sW1_sL1/cbe4dff6c6ae", + "hash_match": false, + "bbox_match": true, + "hash": "679d72501d1759b7", + "recorded_hash": "e8fd4026a7a45132" + }, + { + "record": "runs/selection/C08_sky130_sW1_sL1/cd28fd781ccd", + "hash_match": false, + "bbox_match": true, + "hash": "68a8b82ca06bfe67", + "recorded_hash": "83169ac50fa778e1" + }, + { + "record": "runs/selection/C08_sky130_sW1_sL1/cd6f01605600", + "hash_match": false, + "bbox_match": true, + "hash": "43d249a36e1b5301", + "recorded_hash": "92258e3757da22a3" + }, + { + "record": "runs/selection/C08_sky130_sW1_sL1/cdb1a36c9160", + "hash_match": false, + "bbox_match": true, + "hash": "694e7d83f3b4d2f1", + "recorded_hash": "8475129d648433f1" + }, + { + "record": "runs/selection/C08_sky130_sW1_sL1/ce4ab75f3ca5", + "hash_match": false, + "bbox_match": true, + "hash": "a27dacbbbe3fc48d", + "recorded_hash": "7b82cd8bc0f94708" + }, + { + "record": "runs/selection/C08_sky130_sW1_sL1/cf2b2b47a440", + "hash_match": false, + "bbox_match": true, + "hash": "21098b181befa198", + "recorded_hash": "32bc3b07184633ef" + }, + { + "record": "runs/selection/C08_sky130_sW1_sL2/c08b09de3ccc", + "hash_match": false, + "bbox_match": true, + "hash": "e03ae42a63ebd354", + "recorded_hash": "7d3296e07832e6a0" + }, + { + "record": "runs/selection/C08_sky130_sW1_sL2/c157726ecbf6", + "hash_match": false, + "bbox_match": true, + "hash": "831151163405f15b", + "recorded_hash": "21391fecce79355a" + }, + { + "record": "runs/selection/C08_sky130_sW1_sL2/c15f7f08c7b4", + "hash_match": false, + "bbox_match": true, + "hash": "f24ce8906b66ad26", + "recorded_hash": "cf76690e1725f9ee" + }, + { + "record": "runs/selection/C08_sky130_sW1_sL2/c1bd371c449e", + "hash_match": false, + "bbox_match": true, + "hash": "08c37a237482a233", + "recorded_hash": "17d92b83cb14a097" + }, + { + "record": "runs/selection/C08_sky130_sW1_sL2/c8ea4aad91f7", + "hash_match": false, + "bbox_match": true, + "hash": "ad92e4faa783f672", + "recorded_hash": "9e1c01ef0524aa85" + }, + { + "record": "runs/selection/C08_sky130_sW1_sL2/ca3df7ca75b0", + "hash_match": false, + "bbox_match": true, + "hash": "db309896421600d8", + "recorded_hash": "905621e29bbddbfe" + }, + { + "record": "runs/selection/C08_sky130_sW1_sL2/ca5331b99128", + "hash_match": false, + "bbox_match": true, + "hash": "e7569693c596362d", + "recorded_hash": "5bd3dbc42237e456" + }, + { + "record": "runs/selection/C08_sky130_sW1_sL2/caf3de657c1e", + "hash_match": false, + "bbox_match": true, + "hash": "84a6f4ac82eca25a", + "recorded_hash": "251d35d12c409f84" + }, + { + "record": "runs/selection/C08_sky130_sW1_sL2/cb286735b956", + "hash_match": false, + "bbox_match": true, + "hash": "524e5623a136284d", + "recorded_hash": "30147f118afa095d" + }, + { + "record": "runs/selection/C08_sky130_sW1_sL2/ce1449d5c160", + "hash_match": false, + "bbox_match": true, + "hash": "811f41a804cc37b1", + "recorded_hash": "7dd25d71351bfe6c" + }, + { + "record": "runs/selection/C08_sky130_sW1_sL2/ce599331fcf0", + "hash_match": false, + "bbox_match": true, + "hash": "9dcbf8a740e17402", + "recorded_hash": "c28e54743e3bf1af" + }, + { + "record": "runs/selection/C08_sky130_sW1_sL2/cf215ebe0d1f", + "hash_match": false, + "bbox_match": true, + "hash": "cd4ef8e128dd5ad9", + "recorded_hash": "a895b6a3c04a3e14" + }, + { + "record": "runs/selection/C08_sky130_sW1_sL2/cf531448ce34", + "hash_match": false, + "bbox_match": true, + "hash": "4c929c84af3871d6", + "recorded_hash": "0f2352ede35f8f60" + }, + { + "record": "runs/selection/C08_sky130_sW1_sL2/cf734dce4786", + "hash_match": false, + "bbox_match": true, + "hash": "0c8295c356cf445b", + "recorded_hash": "58fa66f6906609db" + }, + { + "record": "runs/selection/C08_sky130_sW2_sL1/c0578fc4bd1a", + "hash_match": false, + "bbox_match": true, + "hash": "bafe6219eae85405", + "recorded_hash": "1a8bfe664988b758" + }, + { + "record": "runs/selection/C08_sky130_sW2_sL1/c0769d18e2e8", + "hash_match": false, + "bbox_match": true, + "hash": "cd098481f82e2f65", + "recorded_hash": "c9865dd0a16c4ed4" + }, + { + "record": "runs/selection/C08_sky130_sW2_sL1/c14734182da0", + "hash_match": false, + "bbox_match": true, + "hash": "3ea6ae770539cd2c", + "recorded_hash": "757d1e84b16b75da" + }, + { + "record": "runs/selection/C08_sky130_sW2_sL1/c1755eaa0c55", + "hash_match": false, + "bbox_match": true, + "hash": "9989c33479db5ebe", + "recorded_hash": "75036896e48c9389" + }, + { + "record": "runs/selection/C08_sky130_sW2_sL1/c1a9dc17ff5d", + "hash_match": false, + "bbox_match": true, + "hash": "d52e353bca7c498b", + "recorded_hash": "43aed178e4af973b" + }, + { + "record": "runs/selection/C08_sky130_sW2_sL1/c32ae986b8b2", + "hash_match": false, + "bbox_match": true, + "hash": "c3b238030ccf4d4b", + "recorded_hash": "0978abc3bec4948d" + }, + { + "record": "runs/selection/C08_sky130_sW2_sL1/c389e0a5eee3", + "hash_match": false, + "bbox_match": true, + "hash": "72bbc6ba7ba8cee0", + "recorded_hash": "1fb5d64b8a94628e" + }, + { + "record": "runs/selection/C08_sky130_sW2_sL1/c443ef38398f", + "hash_match": false, + "bbox_match": true, + "hash": "702e3d51012b1afe", + "recorded_hash": "4388e630d99c4a21" + }, + { + "record": "runs/selection/C08_sky130_sW2_sL1/c5c599345b2b", + "hash_match": false, + "bbox_match": true, + "hash": "3e2b8d1803510833", + "recorded_hash": "ea703c2425454cc7" + }, + { + "record": "runs/selection/C08_sky130_sW2_sL1/c7f9f45e3884", + "hash_match": false, + "bbox_match": true, + "hash": "f00653a7a7b6c294", + "recorded_hash": "6c0ac318ce74abac" + }, + { + "record": "runs/selection/C08_sky130_sW2_sL1/c9aa2c20bdc1", + "hash_match": false, + "bbox_match": true, + "hash": "fd0a2ee7cd5ff015", + "recorded_hash": "443692acb5dc787f" + }, + { + "record": "runs/selection/C08_sky130_sW2_sL1/ce8997976b92", + "hash_match": false, + "bbox_match": true, + "hash": "451e6aba4408b155", + "recorded_hash": "c314eb1af1914fff" + }, + { + "record": "runs/selection/C08_sky130_sW2_sL1/ce9395d271c7", + "hash_match": false, + "bbox_match": true, + "hash": "4d26b61a67700c49", + "recorded_hash": "1d36b34390107a1a" + }, + { + "record": "runs/selection/C08_sky130_sW2_sL2/c0cb2c66e3db", + "hash_match": false, + "bbox_match": true, + "hash": "6adb9076dfa81278", + "recorded_hash": "0e169efb9b656273" + }, + { + "record": "runs/selection/C08_sky130_sW2_sL2/c0dc841ee139", + "hash_match": false, + "bbox_match": true, + "hash": "5c05a635769877cb", + "recorded_hash": "e29efdd6c4770c03" + }, + { + "record": "runs/selection/C08_sky130_sW2_sL2/c34a528ae7f1", + "hash_match": false, + "bbox_match": true, + "hash": "c5745f631d773694", + "recorded_hash": "725a6311c99da28c" + }, + { + "record": "runs/selection/C08_sky130_sW2_sL2/c4a4a6a394fd", + "hash_match": false, + "bbox_match": true, + "hash": "964b8199ccb9c761", + "recorded_hash": "685d29c39c0e3897" + }, + { + "record": "runs/selection/C08_sky130_sW2_sL2/c5b0856ed85c", + "hash_match": false, + "bbox_match": true, + "hash": "6594a8192541916b", + "recorded_hash": "3124a1b204834a0b" + }, + { + "record": "runs/selection/C08_sky130_sW2_sL2/c614fccb933b", + "hash_match": false, + "bbox_match": true, + "hash": "865ef0d499983726", + "recorded_hash": "8c74ae6d51ecb152" + }, + { + "record": "runs/selection/C08_sky130_sW2_sL2/c7d453aa8af8", + "hash_match": false, + "bbox_match": true, + "hash": "73e122690683ebba", + "recorded_hash": "8548eebc2ed29a77" + }, + { + "record": "runs/selection/C08_sky130_sW2_sL2/c8a24aa58675", + "hash_match": false, + "bbox_match": true, + "hash": "0427c04c73a43eb5", + "recorded_hash": "1b16385d034c6146" + }, + { + "record": "runs/selection/C08_sky130_sW2_sL2/c8cebf4fa121", + "hash_match": false, + "bbox_match": true, + "hash": "73f4f9f1f0215f83", + "recorded_hash": "1e7a6f87221aaa35" + }, + { + "record": "runs/selection/C08_sky130_sW2_sL2/c9aa2c20bdc1", + "hash_match": false, + "bbox_match": true, + "hash": "f2c078e5d0789845", + "recorded_hash": "16f1f3396c6b109f" + }, + { + "record": "runs/selection/C08_sky130_sW2_sL2/cb03edec7f6f", + "hash_match": false, + "bbox_match": true, + "hash": "dddb1f6381540095", + "recorded_hash": "9d08fca359f6903e" + }, + { + "record": "runs/selection/C08_sky130_sW2_sL2/cc57a5c20347", + "hash_match": false, + "bbox_match": true, + "hash": "60c19d802a27dccb", + "recorded_hash": "558b1e7175a2fda5" + }, + { + "record": "runs/selection/C08_sky130_sW2_sL2/cdf53f38e1e9", + "hash_match": false, + "bbox_match": true, + "hash": "3fb20615ad2a881b", + "recorded_hash": "7e08f1594f97a375" + }, + { + "record": "runs/selection/C08_sky130_sW2_sL2/cdf73f5bdccc", + "hash_match": false, + "bbox_match": true, + "hash": "6294f0717cc94e91", + "recorded_hash": "b6bbe72d02bae5ab" + }, + { + "record": "runs/selection/C08_sky130_sW2_sL2/ce30756f345b", + "hash_match": false, + "bbox_match": true, + "hash": "ef89c3637405a8e8", + "recorded_hash": "7910a22700ff382d" + }, + { + "record": "runs/selection/C08_sky130_sW2_sL2/cf1f72e0ea6f", + "hash_match": false, + "bbox_match": true, + "hash": "55ceeaf3cdba18e9", + "recorded_hash": "e36eefa900a852a7" + }, + { + "record": "runs/selection/C09_sky130_sW1_sL1/cb665d318416", + "hash_match": false, + "bbox_match": true, + "hash": "c49ed29748717563", + "recorded_hash": "335118a971cf94e9" + }, + { + "record": "runs/selection/C09_sky130_sW2_sL1/cb75dbde1b16", + "hash_match": false, + "bbox_match": true, + "hash": "6df132e3cb3401e0", + "recorded_hash": "707280a78f135830" + }, + { + "record": "runs/selection/C09_sky130_sW2_sL1/cca52d459010", + "hash_match": false, + "bbox_match": true, + "hash": "8bf31104e9589105", + "recorded_hash": "6225e8245d002b19" + } + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/results/analysis/geometry_check_diagnosis.json b/benchmarks/textbook_sharing/results/analysis/geometry_check_diagnosis.json new file mode 100644 index 00000000..9495a03a --- /dev/null +++ b/benchmarks/textbook_sharing/results/analysis/geometry_check_diagnosis.json @@ -0,0 +1,1550 @@ +{ + "description": "SKY130 selection candidates evaluated before the implant-bridge rule was added", + "n": 66, + "evaluated_utc": [ + "2026-10-11T08:35:23Z", + "2026-10-11T09:03:02Z" + ], + "layers": [ + "93/44" + ], + "layer_names": "SKY130 nsdm, the N+ implant", + "added_um2": [ + 0.3484, + 0.3484 + ], + "removed_um2": [ + 0.0, + 0.0 + ], + "method": "each layout rebuilt with this code and compared shape by shape with the recorded GDS file (not in the repository); each was then built and verified again from scratch (run_case with the recorded plans)", + "records": [ + { + "record": "runs/selection/C08_sky130_sW1_sL1/c087f4692e78", + "diff_layers": { + "93/44": { + "added_um2": 0.3484, + "removed_um2": 0.0 + } + } + }, + { + "record": "runs/selection/C08_sky130_sW1_sL1/c12cfed03e95", + "diff_layers": { + "93/44": { + "added_um2": 0.3484, + "removed_um2": 0.0 + } + } + }, + { + "record": "runs/selection/C08_sky130_sW1_sL1/c13a0048c574", + "diff_layers": { + "93/44": { + "added_um2": 0.3484, + "removed_um2": 0.0 + } + } + }, + { + "record": "runs/selection/C08_sky130_sW1_sL1/c15f7f08c7b4", + "diff_layers": { + "93/44": { + "added_um2": 0.3484, + "removed_um2": 0.0 + } + } + }, + { + "record": "runs/selection/C08_sky130_sW1_sL1/c1f5b1d5e57e", + "diff_layers": { + "93/44": { + "added_um2": 0.3484, + "removed_um2": 0.0 + } + } + }, + { + "record": "runs/selection/C08_sky130_sW1_sL1/c56512190a3f", + "diff_layers": { + "93/44": { + "added_um2": 0.3484, + "removed_um2": 0.0 + } + } + }, + { + "record": "runs/selection/C08_sky130_sW1_sL1/c573cc90b25e", + "diff_layers": { + "93/44": { + "added_um2": 0.3484, + "removed_um2": 0.0 + } + } + }, + { + "record": "runs/selection/C08_sky130_sW1_sL1/c66c6edf9e41", + "diff_layers": { + "93/44": { + "added_um2": 0.3484, + "removed_um2": 0.0 + } + } + }, + { + "record": "runs/selection/C08_sky130_sW1_sL1/c681229827ee", + "diff_layers": { + "93/44": { + "added_um2": 0.3484, + "removed_um2": 0.0 + } + } + }, + { + "record": "runs/selection/C08_sky130_sW1_sL1/c717e4610efc", + "diff_layers": { + "93/44": { + "added_um2": 0.3484, + "removed_um2": 0.0 + } + } + }, + { + "record": "runs/selection/C08_sky130_sW1_sL1/c7281b4f8697", + "diff_layers": { + "93/44": { + "added_um2": 0.3484, + "removed_um2": 0.0 + } + } + }, + { + "record": "runs/selection/C08_sky130_sW1_sL1/c81c8316ca1a", + "diff_layers": { + "93/44": { + "added_um2": 0.3484, + "removed_um2": 0.0 + } + } + }, + { + "record": "runs/selection/C08_sky130_sW1_sL1/c94046dd7e8b", + "diff_layers": { + "93/44": { + "added_um2": 0.3484, + "removed_um2": 0.0 + } + } + }, + { + "record": "runs/selection/C08_sky130_sW1_sL1/cb39850af7c3", + "diff_layers": { + "93/44": { + "added_um2": 0.3484, + "removed_um2": 0.0 + } + } + }, + { + "record": "runs/selection/C08_sky130_sW1_sL1/cbe4dff6c6ae", + "diff_layers": { + "93/44": { + "added_um2": 0.3484, + "removed_um2": 0.0 + } + } + }, + { + "record": "runs/selection/C08_sky130_sW1_sL1/cd28fd781ccd", + "diff_layers": { + "93/44": { + "added_um2": 0.3484, + "removed_um2": 0.0 + } + } + }, + { + "record": "runs/selection/C08_sky130_sW1_sL1/cd6f01605600", + "diff_layers": { + "93/44": { + "added_um2": 0.3484, + "removed_um2": 0.0 + } + } + }, + { + "record": "runs/selection/C08_sky130_sW1_sL1/cdb1a36c9160", + "diff_layers": { + "93/44": { + "added_um2": 0.3484, + "removed_um2": 0.0 + } + } + }, + { + "record": "runs/selection/C08_sky130_sW1_sL1/ce4ab75f3ca5", + "diff_layers": { + "93/44": { + "added_um2": 0.3484, + "removed_um2": 0.0 + } + } + }, + { + "record": "runs/selection/C08_sky130_sW1_sL1/cf2b2b47a440", + "diff_layers": { + "93/44": { + "added_um2": 0.3484, + "removed_um2": 0.0 + } + } + }, + { + "record": "runs/selection/C08_sky130_sW1_sL2/c08b09de3ccc", + "diff_layers": { + "93/44": { + "added_um2": 0.3484, + "removed_um2": 0.0 + } + } + }, + { + "record": "runs/selection/C08_sky130_sW1_sL2/c157726ecbf6", + "diff_layers": { + "93/44": { + "added_um2": 0.3484, + "removed_um2": 0.0 + } + } + }, + { + "record": "runs/selection/C08_sky130_sW1_sL2/c15f7f08c7b4", + "diff_layers": { + "93/44": { + "added_um2": 0.3484, + "removed_um2": 0.0 + } + } + }, + { + "record": "runs/selection/C08_sky130_sW1_sL2/c1bd371c449e", + "diff_layers": { + "93/44": { + "added_um2": 0.3484, + "removed_um2": 0.0 + } + } + }, + { + "record": "runs/selection/C08_sky130_sW1_sL2/c8ea4aad91f7", + "diff_layers": { + "93/44": { + "added_um2": 0.3484, + "removed_um2": 0.0 + } + } + }, + { + "record": "runs/selection/C08_sky130_sW1_sL2/ca3df7ca75b0", + "diff_layers": { + "93/44": { + "added_um2": 0.3484, + "removed_um2": 0.0 + } + } + }, + { + "record": "runs/selection/C08_sky130_sW1_sL2/ca5331b99128", + "diff_layers": { + "93/44": { + "added_um2": 0.3484, + "removed_um2": 0.0 + } + } + }, + { + "record": "runs/selection/C08_sky130_sW1_sL2/caf3de657c1e", + "diff_layers": { + "93/44": { + "added_um2": 0.3484, + "removed_um2": 0.0 + } + } + }, + { + "record": "runs/selection/C08_sky130_sW1_sL2/cb286735b956", + "diff_layers": { + "93/44": { + "added_um2": 0.3484, + "removed_um2": 0.0 + } + } + }, + { + "record": "runs/selection/C08_sky130_sW1_sL2/ce1449d5c160", + "diff_layers": { + "93/44": { + "added_um2": 0.3484, + "removed_um2": 0.0 + } + } + }, + { + "record": "runs/selection/C08_sky130_sW1_sL2/ce599331fcf0", + "diff_layers": { + "93/44": { + "added_um2": 0.3484, + "removed_um2": 0.0 + } + } + }, + { + "record": "runs/selection/C08_sky130_sW1_sL2/cf215ebe0d1f", + "diff_layers": { + "93/44": { + "added_um2": 0.3484, + "removed_um2": 0.0 + } + } + }, + { + "record": "runs/selection/C08_sky130_sW1_sL2/cf531448ce34", + "diff_layers": { + "93/44": { + "added_um2": 0.3484, + "removed_um2": 0.0 + } + } + }, + { + "record": "runs/selection/C08_sky130_sW1_sL2/cf734dce4786", + "diff_layers": { + "93/44": { + "added_um2": 0.3484, + "removed_um2": 0.0 + } + } + }, + { + "record": "runs/selection/C08_sky130_sW2_sL1/c0578fc4bd1a", + "diff_layers": { + "93/44": { + "added_um2": 0.3484, + "removed_um2": 0.0 + } + } + }, + { + "record": "runs/selection/C08_sky130_sW2_sL1/c0769d18e2e8", + "diff_layers": { + "93/44": { + "added_um2": 0.3484, + "removed_um2": 0.0 + } + } + }, + { + "record": "runs/selection/C08_sky130_sW2_sL1/c14734182da0", + "diff_layers": { + "93/44": { + "added_um2": 0.3484, + "removed_um2": 0.0 + } + } + }, + { + "record": "runs/selection/C08_sky130_sW2_sL1/c1755eaa0c55", + "diff_layers": { + "93/44": { + "added_um2": 0.3484, + "removed_um2": 0.0 + } + } + }, + { + "record": "runs/selection/C08_sky130_sW2_sL1/c1a9dc17ff5d", + "diff_layers": { + "93/44": { + "added_um2": 0.3484, + "removed_um2": 0.0 + } + } + }, + { + "record": "runs/selection/C08_sky130_sW2_sL1/c32ae986b8b2", + "diff_layers": { + "93/44": { + "added_um2": 0.3484, + "removed_um2": 0.0 + } + } + }, + { + "record": "runs/selection/C08_sky130_sW2_sL1/c389e0a5eee3", + "diff_layers": { + "93/44": { + "added_um2": 0.3484, + "removed_um2": 0.0 + } + } + }, + { + "record": "runs/selection/C08_sky130_sW2_sL1/c443ef38398f", + "diff_layers": { + "93/44": { + "added_um2": 0.3484, + "removed_um2": 0.0 + } + } + }, + { + "record": "runs/selection/C08_sky130_sW2_sL1/c5c599345b2b", + "diff_layers": { + "93/44": { + "added_um2": 0.3484, + "removed_um2": 0.0 + } + } + }, + { + "record": "runs/selection/C08_sky130_sW2_sL1/c7f9f45e3884", + "diff_layers": { + "93/44": { + "added_um2": 0.3484, + "removed_um2": 0.0 + } + } + }, + { + "record": "runs/selection/C08_sky130_sW2_sL1/c9aa2c20bdc1", + "diff_layers": { + "93/44": { + "added_um2": 0.3484, + "removed_um2": 0.0 + } + } + }, + { + "record": "runs/selection/C08_sky130_sW2_sL1/ce8997976b92", + "diff_layers": { + "93/44": { + "added_um2": 0.3484, + "removed_um2": 0.0 + } + } + }, + { + "record": "runs/selection/C08_sky130_sW2_sL1/ce9395d271c7", + "diff_layers": { + "93/44": { + "added_um2": 0.3484, + "removed_um2": 0.0 + } + } + }, + { + "record": "runs/selection/C08_sky130_sW2_sL2/c0cb2c66e3db", + "diff_layers": { + "93/44": { + "added_um2": 0.3484, + "removed_um2": 0.0 + } + } + }, + { + "record": "runs/selection/C08_sky130_sW2_sL2/c0dc841ee139", + "diff_layers": { + "93/44": { + "added_um2": 0.3484, + "removed_um2": 0.0 + } + } + }, + { + "record": "runs/selection/C08_sky130_sW2_sL2/c34a528ae7f1", + "diff_layers": { + "93/44": { + "added_um2": 0.3484, + "removed_um2": 0.0 + } + } + }, + { + "record": "runs/selection/C08_sky130_sW2_sL2/c4a4a6a394fd", + "diff_layers": { + "93/44": { + "added_um2": 0.3484, + "removed_um2": 0.0 + } + } + }, + { + "record": "runs/selection/C08_sky130_sW2_sL2/c5b0856ed85c", + "diff_layers": { + "93/44": { + "added_um2": 0.3484, + "removed_um2": 0.0 + } + } + }, + { + "record": "runs/selection/C08_sky130_sW2_sL2/c614fccb933b", + "diff_layers": { + "93/44": { + "added_um2": 0.3484, + "removed_um2": 0.0 + } + } + }, + { + "record": "runs/selection/C08_sky130_sW2_sL2/c7d453aa8af8", + "diff_layers": { + "93/44": { + "added_um2": 0.3484, + "removed_um2": 0.0 + } + } + }, + { + "record": "runs/selection/C08_sky130_sW2_sL2/c8a24aa58675", + "diff_layers": { + "93/44": { + "added_um2": 0.3484, + "removed_um2": 0.0 + } + } + }, + { + "record": "runs/selection/C08_sky130_sW2_sL2/c8cebf4fa121", + "diff_layers": { + "93/44": { + "added_um2": 0.3484, + "removed_um2": 0.0 + } + } + }, + { + "record": "runs/selection/C08_sky130_sW2_sL2/c9aa2c20bdc1", + "diff_layers": { + "93/44": { + "added_um2": 0.3484, + "removed_um2": 0.0 + } + } + }, + { + "record": "runs/selection/C08_sky130_sW2_sL2/cb03edec7f6f", + "diff_layers": { + "93/44": { + "added_um2": 0.3484, + "removed_um2": 0.0 + } + } + }, + { + "record": "runs/selection/C08_sky130_sW2_sL2/cc57a5c20347", + "diff_layers": { + "93/44": { + "added_um2": 0.3484, + "removed_um2": 0.0 + } + } + }, + { + "record": "runs/selection/C08_sky130_sW2_sL2/cdf53f38e1e9", + "diff_layers": { + "93/44": { + "added_um2": 0.3484, + "removed_um2": 0.0 + } + } + }, + { + "record": "runs/selection/C08_sky130_sW2_sL2/cdf73f5bdccc", + "diff_layers": { + "93/44": { + "added_um2": 0.3484, + "removed_um2": 0.0 + } + } + }, + { + "record": "runs/selection/C08_sky130_sW2_sL2/ce30756f345b", + "diff_layers": { + "93/44": { + "added_um2": 0.3484, + "removed_um2": 0.0 + } + } + }, + { + "record": "runs/selection/C08_sky130_sW2_sL2/cf1f72e0ea6f", + "diff_layers": { + "93/44": { + "added_um2": 0.3484, + "removed_um2": 0.0 + } + } + }, + { + "record": "runs/selection/C09_sky130_sW1_sL1/cb665d318416", + "diff_layers": { + "93/44": { + "added_um2": 0.3484, + "removed_um2": 0.0 + } + } + }, + { + "record": "runs/selection/C09_sky130_sW2_sL1/cb75dbde1b16", + "diff_layers": { + "93/44": { + "added_um2": 0.3484, + "removed_um2": 0.0 + } + } + }, + { + "record": "runs/selection/C09_sky130_sW2_sL1/cca52d459010", + "diff_layers": { + "93/44": { + "added_um2": 0.3484, + "removed_um2": 0.0 + } + } + } + ], + "reverification": { + "n": 66, + "same_status_area_stages": 66, + "status_changes": {}, + "max_rel_measure_diff": 2.2911481022732868e-07, + "rebuild_hash_consistent": 66, + "records": [ + { + "record": "runs/selection/C08_sky130_sW1_sL1/c087f4692e78", + "status": [ + "auto_passed", + "auto_passed" + ], + "area_um2": [ + 202.7757, + 202.7757 + ], + "verify_equal": true, + "new_hash_equals_rebuild": true, + "max_rel_measure_diff": 0.0 + }, + { + "record": "runs/selection/C08_sky130_sW1_sL1/c12cfed03e95", + "status": [ + "auto_passed", + "auto_passed" + ], + "area_um2": [ + 196.0921, + 196.0921 + ], + "verify_equal": true, + "new_hash_equals_rebuild": true, + "max_rel_measure_diff": 0.0 + }, + { + "record": "runs/selection/C08_sky130_sW1_sL1/c13a0048c574", + "status": [ + "auto_passed", + "auto_passed" + ], + "area_um2": [ + 202.7757, + 202.7757 + ], + "verify_equal": true, + "new_hash_equals_rebuild": true, + "max_rel_measure_diff": 0.0 + }, + { + "record": "runs/selection/C08_sky130_sW1_sL1/c15f7f08c7b4", + "status": [ + "auto_passed", + "auto_passed" + ], + "area_um2": [ + 196.0921, + 196.0921 + ], + "verify_equal": true, + "new_hash_equals_rebuild": true, + "max_rel_measure_diff": 0.0 + }, + { + "record": "runs/selection/C08_sky130_sW1_sL1/c1f5b1d5e57e", + "status": [ + "auto_passed", + "auto_passed" + ], + "area_um2": [ + 209.4592, + 209.4592 + ], + "verify_equal": true, + "new_hash_equals_rebuild": true, + "max_rel_measure_diff": 0.0 + }, + { + "record": "runs/selection/C08_sky130_sW1_sL1/c56512190a3f", + "status": [ + "auto_passed", + "auto_passed" + ], + "area_um2": [ + 209.4592, + 209.4592 + ], + "verify_equal": true, + "new_hash_equals_rebuild": true, + "max_rel_measure_diff": 0.0 + }, + { + "record": "runs/selection/C08_sky130_sW1_sL1/c573cc90b25e", + "status": [ + "auto_passed", + "auto_passed" + ], + "area_um2": [ + 209.4592, + 209.4592 + ], + "verify_equal": true, + "new_hash_equals_rebuild": true, + "max_rel_measure_diff": 0.0 + }, + { + "record": "runs/selection/C08_sky130_sW1_sL1/c66c6edf9e41", + "status": [ + "auto_passed", + "auto_passed" + ], + "area_um2": [ + 196.0921, + 196.0921 + ], + "verify_equal": true, + "new_hash_equals_rebuild": true, + "max_rel_measure_diff": 0.0 + }, + { + "record": "runs/selection/C08_sky130_sW1_sL1/c681229827ee", + "status": [ + "auto_passed", + "auto_passed" + ], + "area_um2": [ + 202.7757, + 202.7757 + ], + "verify_equal": true, + "new_hash_equals_rebuild": true, + "max_rel_measure_diff": 0.0 + }, + { + "record": "runs/selection/C08_sky130_sW1_sL1/c717e4610efc", + "status": [ + "auto_passed", + "auto_passed" + ], + "area_um2": [ + 202.7757, + 202.7757 + ], + "verify_equal": true, + "new_hash_equals_rebuild": true, + "max_rel_measure_diff": 0.0 + }, + { + "record": "runs/selection/C08_sky130_sW1_sL1/c7281b4f8697", + "status": [ + "auto_passed", + "auto_passed" + ], + "area_um2": [ + 209.4592, + 209.4592 + ], + "verify_equal": true, + "new_hash_equals_rebuild": true, + "max_rel_measure_diff": 0.0 + }, + { + "record": "runs/selection/C08_sky130_sW1_sL1/c81c8316ca1a", + "status": [ + "auto_passed", + "auto_passed" + ], + "area_um2": [ + 209.4592, + 209.4592 + ], + "verify_equal": true, + "new_hash_equals_rebuild": true, + "max_rel_measure_diff": 0.0 + }, + { + "record": "runs/selection/C08_sky130_sW1_sL1/c94046dd7e8b", + "status": [ + "auto_passed", + "auto_passed" + ], + "area_um2": [ + 209.4592, + 209.4592 + ], + "verify_equal": true, + "new_hash_equals_rebuild": true, + "max_rel_measure_diff": 0.0 + }, + { + "record": "runs/selection/C08_sky130_sW1_sL1/cb39850af7c3", + "status": [ + "auto_passed", + "auto_passed" + ], + "area_um2": [ + 202.7757, + 202.7757 + ], + "verify_equal": true, + "new_hash_equals_rebuild": true, + "max_rel_measure_diff": 0.0 + }, + { + "record": "runs/selection/C08_sky130_sW1_sL1/cbe4dff6c6ae", + "status": [ + "auto_passed", + "auto_passed" + ], + "area_um2": [ + 202.7757, + 202.7757 + ], + "verify_equal": true, + "new_hash_equals_rebuild": true, + "max_rel_measure_diff": 0.0 + }, + { + "record": "runs/selection/C08_sky130_sW1_sL1/cd28fd781ccd", + "status": [ + "auto_passed", + "auto_passed" + ], + "area_um2": [ + 196.0921, + 196.0921 + ], + "verify_equal": true, + "new_hash_equals_rebuild": true, + "max_rel_measure_diff": 0.0 + }, + { + "record": "runs/selection/C08_sky130_sW1_sL1/cd6f01605600", + "status": [ + "auto_passed", + "auto_passed" + ], + "area_um2": [ + 202.7757, + 202.7757 + ], + "verify_equal": true, + "new_hash_equals_rebuild": true, + "max_rel_measure_diff": 0.0 + }, + { + "record": "runs/selection/C08_sky130_sW1_sL1/cdb1a36c9160", + "status": [ + "auto_passed", + "auto_passed" + ], + "area_um2": [ + 209.4592, + 209.4592 + ], + "verify_equal": true, + "new_hash_equals_rebuild": true, + "max_rel_measure_diff": 0.0 + }, + { + "record": "runs/selection/C08_sky130_sW1_sL1/ce4ab75f3ca5", + "status": [ + "auto_passed", + "auto_passed" + ], + "area_um2": [ + 209.4592, + 209.4592 + ], + "verify_equal": true, + "new_hash_equals_rebuild": true, + "max_rel_measure_diff": 0.0 + }, + { + "record": "runs/selection/C08_sky130_sW1_sL1/cf2b2b47a440", + "status": [ + "auto_passed", + "auto_passed" + ], + "area_um2": [ + 209.4592, + 209.4592 + ], + "verify_equal": true, + "new_hash_equals_rebuild": true, + "max_rel_measure_diff": 0.0 + }, + { + "record": "runs/selection/C08_sky130_sW1_sL2/c08b09de3ccc", + "status": [ + "auto_passed", + "auto_passed" + ], + "area_um2": [ + 295.3913, + 295.3913 + ], + "verify_equal": true, + "new_hash_equals_rebuild": true, + "max_rel_measure_diff": 0.0 + }, + { + "record": "runs/selection/C08_sky130_sW1_sL2/c157726ecbf6", + "status": [ + "auto_passed", + "auto_passed" + ], + "area_um2": [ + 282.024, + 282.024 + ], + "verify_equal": true, + "new_hash_equals_rebuild": true, + "max_rel_measure_diff": 0.0 + }, + { + "record": "runs/selection/C08_sky130_sW1_sL2/c15f7f08c7b4", + "status": [ + "auto_passed", + "auto_passed" + ], + "area_um2": [ + 282.024, + 282.024 + ], + "verify_equal": true, + "new_hash_equals_rebuild": true, + "max_rel_measure_diff": 0.0 + }, + { + "record": "runs/selection/C08_sky130_sW1_sL2/c1bd371c449e", + "status": [ + "auto_passed", + "auto_passed" + ], + "area_um2": [ + 282.024, + 282.024 + ], + "verify_equal": true, + "new_hash_equals_rebuild": true, + "max_rel_measure_diff": 0.0 + }, + { + "record": "runs/selection/C08_sky130_sW1_sL2/c8ea4aad91f7", + "status": [ + "auto_passed", + "auto_passed" + ], + "area_um2": [ + 295.3913, + 295.3913 + ], + "verify_equal": true, + "new_hash_equals_rebuild": true, + "max_rel_measure_diff": 0.0 + }, + { + "record": "runs/selection/C08_sky130_sW1_sL2/ca3df7ca75b0", + "status": [ + "auto_passed", + "auto_passed" + ], + "area_um2": [ + 288.7077, + 288.7077 + ], + "verify_equal": true, + "new_hash_equals_rebuild": true, + "max_rel_measure_diff": 0.0 + }, + { + "record": "runs/selection/C08_sky130_sW1_sL2/ca5331b99128", + "status": [ + "auto_passed", + "auto_passed" + ], + "area_um2": [ + 282.024, + 282.024 + ], + "verify_equal": true, + "new_hash_equals_rebuild": true, + "max_rel_measure_diff": 0.0 + }, + { + "record": "runs/selection/C08_sky130_sW1_sL2/caf3de657c1e", + "status": [ + "auto_passed", + "auto_passed" + ], + "area_um2": [ + 288.7077, + 288.7077 + ], + "verify_equal": true, + "new_hash_equals_rebuild": true, + "max_rel_measure_diff": 0.0 + }, + { + "record": "runs/selection/C08_sky130_sW1_sL2/cb286735b956", + "status": [ + "auto_passed", + "auto_passed" + ], + "area_um2": [ + 282.024, + 282.024 + ], + "verify_equal": true, + "new_hash_equals_rebuild": true, + "max_rel_measure_diff": 0.0 + }, + { + "record": "runs/selection/C08_sky130_sW1_sL2/ce1449d5c160", + "status": [ + "auto_passed", + "auto_passed" + ], + "area_um2": [ + 295.3913, + 295.3913 + ], + "verify_equal": true, + "new_hash_equals_rebuild": true, + "max_rel_measure_diff": 0.0 + }, + { + "record": "runs/selection/C08_sky130_sW1_sL2/ce599331fcf0", + "status": [ + "auto_passed", + "auto_passed" + ], + "area_um2": [ + 282.024, + 282.024 + ], + "verify_equal": true, + "new_hash_equals_rebuild": true, + "max_rel_measure_diff": 0.0 + }, + { + "record": "runs/selection/C08_sky130_sW1_sL2/cf215ebe0d1f", + "status": [ + "auto_passed", + "auto_passed" + ], + "area_um2": [ + 295.3913, + 295.3913 + ], + "verify_equal": true, + "new_hash_equals_rebuild": true, + "max_rel_measure_diff": 0.0 + }, + { + "record": "runs/selection/C08_sky130_sW1_sL2/cf531448ce34", + "status": [ + "auto_passed", + "auto_passed" + ], + "area_um2": [ + 282.024, + 282.024 + ], + "verify_equal": true, + "new_hash_equals_rebuild": true, + "max_rel_measure_diff": 0.0 + }, + { + "record": "runs/selection/C08_sky130_sW1_sL2/cf734dce4786", + "status": [ + "auto_passed", + "auto_passed" + ], + "area_um2": [ + 295.3913, + 295.3913 + ], + "verify_equal": true, + "new_hash_equals_rebuild": true, + "max_rel_measure_diff": 0.0 + }, + { + "record": "runs/selection/C08_sky130_sW2_sL1/c0578fc4bd1a", + "status": [ + "auto_passed", + "auto_passed" + ], + "area_um2": [ + 365.0917, + 365.0917 + ], + "verify_equal": true, + "new_hash_equals_rebuild": true, + "max_rel_measure_diff": 0.0 + }, + { + "record": "runs/selection/C08_sky130_sW2_sL1/c0769d18e2e8", + "status": [ + "auto_passed", + "auto_passed" + ], + "area_um2": [ + 378.4588, + 378.4588 + ], + "verify_equal": true, + "new_hash_equals_rebuild": true, + "max_rel_measure_diff": 0.0 + }, + { + "record": "runs/selection/C08_sky130_sW2_sL1/c14734182da0", + "status": [ + "auto_passed", + "auto_passed" + ], + "area_um2": [ + 371.7752, + 371.7752 + ], + "verify_equal": true, + "new_hash_equals_rebuild": true, + "max_rel_measure_diff": 0.0 + }, + { + "record": "runs/selection/C08_sky130_sW2_sL1/c1755eaa0c55", + "status": [ + "auto_passed", + "auto_passed" + ], + "area_um2": [ + 371.7752, + 371.7752 + ], + "verify_equal": true, + "new_hash_equals_rebuild": true, + "max_rel_measure_diff": 0.0 + }, + { + "record": "runs/selection/C08_sky130_sW2_sL1/c1a9dc17ff5d", + "status": [ + "auto_passed", + "auto_passed" + ], + "area_um2": [ + 378.4588, + 378.4588 + ], + "verify_equal": true, + "new_hash_equals_rebuild": true, + "max_rel_measure_diff": 0.0 + }, + { + "record": "runs/selection/C08_sky130_sW2_sL1/c32ae986b8b2", + "status": [ + "auto_passed", + "auto_passed" + ], + "area_um2": [ + 378.4588, + 378.4588 + ], + "verify_equal": true, + "new_hash_equals_rebuild": true, + "max_rel_measure_diff": 0.0 + }, + { + "record": "runs/selection/C08_sky130_sW2_sL1/c389e0a5eee3", + "status": [ + "auto_passed", + "auto_passed" + ], + "area_um2": [ + 365.0917, + 365.0917 + ], + "verify_equal": true, + "new_hash_equals_rebuild": true, + "max_rel_measure_diff": 0.0 + }, + { + "record": "runs/selection/C08_sky130_sW2_sL1/c443ef38398f", + "status": [ + "auto_passed", + "auto_passed" + ], + "area_um2": [ + 378.4588, + 378.4588 + ], + "verify_equal": true, + "new_hash_equals_rebuild": true, + "max_rel_measure_diff": 0.0 + }, + { + "record": "runs/selection/C08_sky130_sW2_sL1/c5c599345b2b", + "status": [ + "auto_passed", + "auto_passed" + ], + "area_um2": [ + 365.0917, + 365.0917 + ], + "verify_equal": true, + "new_hash_equals_rebuild": true, + "max_rel_measure_diff": 0.0 + }, + { + "record": "runs/selection/C08_sky130_sW2_sL1/c7f9f45e3884", + "status": [ + "auto_passed", + "auto_passed" + ], + "area_um2": [ + 365.0917, + 365.0917 + ], + "verify_equal": true, + "new_hash_equals_rebuild": true, + "max_rel_measure_diff": 0.0 + }, + { + "record": "runs/selection/C08_sky130_sW2_sL1/c9aa2c20bdc1", + "status": [ + "auto_passed", + "auto_passed" + ], + "area_um2": [ + 378.4588, + 378.4588 + ], + "verify_equal": true, + "new_hash_equals_rebuild": true, + "max_rel_measure_diff": 0.0 + }, + { + "record": "runs/selection/C08_sky130_sW2_sL1/ce8997976b92", + "status": [ + "auto_passed", + "auto_passed" + ], + "area_um2": [ + 371.7752, + 371.7752 + ], + "verify_equal": true, + "new_hash_equals_rebuild": true, + "max_rel_measure_diff": 0.0 + }, + { + "record": "runs/selection/C08_sky130_sW2_sL1/ce9395d271c7", + "status": [ + "auto_passed", + "auto_passed" + ], + "area_um2": [ + 371.7752, + 371.7752 + ], + "verify_equal": true, + "new_hash_equals_rebuild": true, + "max_rel_measure_diff": 0.0 + }, + { + "record": "runs/selection/C08_sky130_sW2_sL2/c0cb2c66e3db", + "status": [ + "auto_passed", + "auto_passed" + ], + "area_um2": [ + 536.9556, + 536.9556 + ], + "verify_equal": true, + "new_hash_equals_rebuild": true, + "max_rel_measure_diff": 0.0 + }, + { + "record": "runs/selection/C08_sky130_sW2_sL2/c0dc841ee139", + "status": [ + "auto_passed", + "auto_passed" + ], + "area_um2": [ + 543.6392, + 543.6392 + ], + "verify_equal": true, + "new_hash_equals_rebuild": true, + "max_rel_measure_diff": 0.0 + }, + { + "record": "runs/selection/C08_sky130_sW2_sL2/c34a528ae7f1", + "status": [ + "auto_passed", + "auto_passed" + ], + "area_um2": [ + 543.6392, + 543.6392 + ], + "verify_equal": true, + "new_hash_equals_rebuild": true, + "max_rel_measure_diff": 0.0 + }, + { + "record": "runs/selection/C08_sky130_sW2_sL2/c4a4a6a394fd", + "status": [ + "auto_passed", + "auto_passed" + ], + "area_um2": [ + 550.3228, + 550.3228 + ], + "verify_equal": true, + "new_hash_equals_rebuild": true, + "max_rel_measure_diff": 0.0 + }, + { + "record": "runs/selection/C08_sky130_sW2_sL2/c5b0856ed85c", + "status": [ + "auto_passed", + "auto_passed" + ], + "area_um2": [ + 543.6392, + 543.6392 + ], + "verify_equal": true, + "new_hash_equals_rebuild": true, + "max_rel_measure_diff": 0.0 + }, + { + "record": "runs/selection/C08_sky130_sW2_sL2/c614fccb933b", + "status": [ + "auto_passed", + "auto_passed" + ], + "area_um2": [ + 543.6392, + 543.6392 + ], + "verify_equal": true, + "new_hash_equals_rebuild": true, + "max_rel_measure_diff": 0.0 + }, + { + "record": "runs/selection/C08_sky130_sW2_sL2/c7d453aa8af8", + "status": [ + "auto_passed", + "auto_passed" + ], + "area_um2": [ + 550.3228, + 550.3228 + ], + "verify_equal": true, + "new_hash_equals_rebuild": true, + "max_rel_measure_diff": 0.0 + }, + { + "record": "runs/selection/C08_sky130_sW2_sL2/c8a24aa58675", + "status": [ + "auto_passed", + "auto_passed" + ], + "area_um2": [ + 536.9556, + 536.9556 + ], + "verify_equal": true, + "new_hash_equals_rebuild": true, + "max_rel_measure_diff": 0.0 + }, + { + "record": "runs/selection/C08_sky130_sW2_sL2/c8cebf4fa121", + "status": [ + "auto_passed", + "auto_passed" + ], + "area_um2": [ + 550.3228, + 550.3228 + ], + "verify_equal": true, + "new_hash_equals_rebuild": true, + "max_rel_measure_diff": 0.0 + }, + { + "record": "runs/selection/C08_sky130_sW2_sL2/c9aa2c20bdc1", + "status": [ + "auto_passed", + "auto_passed" + ], + "area_um2": [ + 550.3228, + 550.3228 + ], + "verify_equal": true, + "new_hash_equals_rebuild": true, + "max_rel_measure_diff": 0.0 + }, + { + "record": "runs/selection/C08_sky130_sW2_sL2/cb03edec7f6f", + "status": [ + "auto_passed", + "auto_passed" + ], + "area_um2": [ + 550.3228, + 550.3228 + ], + "verify_equal": true, + "new_hash_equals_rebuild": true, + "max_rel_measure_diff": 0.0 + }, + { + "record": "runs/selection/C08_sky130_sW2_sL2/cc57a5c20347", + "status": [ + "auto_passed", + "auto_passed" + ], + "area_um2": [ + 550.3228, + 550.3228 + ], + "verify_equal": true, + "new_hash_equals_rebuild": true, + "max_rel_measure_diff": 0.0 + }, + { + "record": "runs/selection/C08_sky130_sW2_sL2/cdf53f38e1e9", + "status": [ + "auto_passed", + "auto_passed" + ], + "area_um2": [ + 536.9556, + 536.9556 + ], + "verify_equal": true, + "new_hash_equals_rebuild": true, + "max_rel_measure_diff": 0.0 + }, + { + "record": "runs/selection/C08_sky130_sW2_sL2/cdf73f5bdccc", + "status": [ + "auto_passed", + "auto_passed" + ], + "area_um2": [ + 536.9556, + 536.9556 + ], + "verify_equal": true, + "new_hash_equals_rebuild": true, + "max_rel_measure_diff": 0.0 + }, + { + "record": "runs/selection/C08_sky130_sW2_sL2/ce30756f345b", + "status": [ + "auto_passed", + "auto_passed" + ], + "area_um2": [ + 543.6392, + 543.6392 + ], + "verify_equal": true, + "new_hash_equals_rebuild": true, + "max_rel_measure_diff": 0.0 + }, + { + "record": "runs/selection/C08_sky130_sW2_sL2/cf1f72e0ea6f", + "status": [ + "auto_passed", + "auto_passed" + ], + "area_um2": [ + 550.3228, + 550.3228 + ], + "verify_equal": true, + "new_hash_equals_rebuild": true, + "max_rel_measure_diff": 0.0 + }, + { + "record": "runs/selection/C09_sky130_sW1_sL1/cb665d318416", + "status": [ + "auto_passed", + "auto_passed" + ], + "area_um2": [ + 1149.8563, + 1149.8563 + ], + "verify_equal": true, + "new_hash_equals_rebuild": true, + "max_rel_measure_diff": 0.0 + }, + { + "record": "runs/selection/C09_sky130_sW2_sL1/cb75dbde1b16", + "status": [ + "auto_passed", + "auto_passed" + ], + "area_um2": [ + 2243.5062, + 2243.5062 + ], + "verify_equal": true, + "new_hash_equals_rebuild": true, + "max_rel_measure_diff": 0.0 + }, + { + "record": "runs/selection/C09_sky130_sW2_sL1/cca52d459010", + "status": [ + "auto_passed", + "auto_passed" + ], + "area_um2": [ + 2235.4563, + 2235.4563 + ], + "verify_equal": true, + "new_hash_equals_rebuild": true, + "max_rel_measure_diff": 2.2911481022732868e-07 + } + ] + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/results/analysis/llm_interface.json b/benchmarks/textbook_sharing/results/analysis/llm_interface.json new file mode 100644 index 00000000..cb7d9aa0 --- /dev/null +++ b/benchmarks/textbook_sharing/results/analysis/llm_interface.json @@ -0,0 +1,873 @@ +{ + "summary": { + "sharing": { + "sessions": 42, + "tasks": 14, + "first_legal_rate": 0.9761904761904762, + "gap8": 0.02211378544856505, + "ref8": -0.1284738940157925 + }, + "base": { + "sessions": 42, + "tasks": 14, + "first_legal_rate": 1, + "gap8": 0.17317736866048994, + "ref8": -5.227118289687281e-05 + }, + "capability": { + "tasks": 14, + "mean_gap_of_best_base_expressible_candidate": 0.13074075900702747, + "note": "base-expressible = catalogue candidates with no cross-device diffusion join and no shared gate conductor" + } + }, + "rows": { + "sharing": [ + { + "task": "C02_gf180_sW2_sL1", + "rep": "r1", + "proposals": 8, + "first_legal": true, + "best": 400.4456, + "vs_reference": -0.21177091206853105, + "vs_best_evaluated": -0.06587055429277378 + }, + { + "task": "C02_gf180_sW2_sL1", + "rep": "r2", + "proposals": 8, + "first_legal": true, + "best": 400.4456, + "vs_reference": -0.21177091206853105, + "vs_best_evaluated": -0.06587055429277378 + }, + { + "task": "C02_gf180_sW2_sL1", + "rep": "r3", + "proposals": 7, + "first_legal": true, + "best": 400.6384, + "vs_reference": -0.21139140841521797, + "vs_best_evaluated": -0.06542080492074331 + }, + { + "task": "C02_ihp130_sW2_sL1", + "rep": "r1", + "proposals": 8, + "first_legal": true, + "best": 230.0767, + "vs_reference": -0.20717911537590794, + "vs_best_evaluated": -0.06322240155306669 + }, + { + "task": "C02_ihp130_sW2_sL1", + "rep": "r2", + "proposals": 8, + "first_legal": true, + "best": 230.0767, + "vs_reference": -0.20717911537590794, + "vs_best_evaluated": -0.06322240155306669 + }, + { + "task": "C02_ihp130_sW2_sL1", + "rep": "r3", + "proposals": 3, + "first_legal": true, + "best": 277.0268, + "vs_reference": -0.045393850656839985, + "vs_best_evaluated": 0.12793907601003873 + }, + { + "task": "C02_sky130_sW2_sL1", + "rep": "r1", + "proposals": 7, + "first_legal": true, + "best": 170.1103, + "vs_reference": -0.22061028796270887, + "vs_best_evaluated": -0.07653643415902589 + }, + { + "task": "C02_sky130_sW2_sL1", + "rep": "r2", + "proposals": 8, + "first_legal": true, + "best": 170.1103, + "vs_reference": -0.22061028796270887, + "vs_best_evaluated": -0.07653643415902589 + }, + { + "task": "C02_sky130_sW2_sL1", + "rep": "r3", + "proposals": 8, + "first_legal": true, + "best": 170.1103, + "vs_reference": -0.22061028796270887, + "vs_best_evaluated": -0.07653643415902589 + }, + { + "task": "C08_gf180_sW2_sL1", + "rep": "r1", + "proposals": 8, + "first_legal": true, + "best": 897.1494, + "vs_reference": -0.17271818898056024, + "vs_best_evaluated": 0.0 + }, + { + "task": "C08_gf180_sW2_sL1", + "rep": "r2", + "proposals": 4, + "first_legal": true, + "best": 1008.9664, + "vs_reference": -0.06960919703032242, + "vs_best_evaluated": 0.12463587447085178 + }, + { + "task": "C08_gf180_sW2_sL1", + "rep": "r3", + "proposals": 5, + "first_legal": true, + "best": 897.1494, + "vs_reference": -0.17271818898056024, + "vs_best_evaluated": 0.0 + }, + { + "task": "C08_sky130_sW2_sL1", + "rep": "r1", + "proposals": 7, + "first_legal": true, + "best": 365.0917, + "vs_reference": -0.19020823943586995, + "vs_best_evaluated": 0.0 + }, + { + "task": "C08_sky130_sW2_sL1", + "rep": "r2", + "proposals": 7, + "first_legal": true, + "best": 365.0917, + "vs_reference": -0.19020823943586995, + "vs_best_evaluated": 0.0 + }, + { + "task": "C08_sky130_sW2_sL1", + "rep": "r3", + "proposals": 7, + "first_legal": true, + "best": 365.0917, + "vs_reference": -0.19020823943586995, + "vs_best_evaluated": 0.0 + }, + { + "task": "C09_gf180_sW2_sL1", + "rep": "r1", + "proposals": 8, + "first_legal": true, + "best": 1526.6916, + "vs_reference": -0.1350957603313201, + "vs_best_evaluated": 0.03191442910491915 + }, + { + "task": "C09_gf180_sW2_sL1", + "rep": "r2", + "proposals": 7, + "first_legal": true, + "best": 1548.7348, + "vs_reference": -0.1226078045871053, + "vs_best_evaluated": 0.04681376839757356 + }, + { + "task": "C09_gf180_sW2_sL1", + "rep": "r3", + "proposals": 7, + "first_legal": true, + "best": 1526.6916, + "vs_reference": -0.1350957603313201, + "vs_best_evaluated": 0.03191442910491915 + }, + { + "task": "C09_ihp130_sW2_sL1", + "rep": "r1", + "proposals": 6, + "first_legal": true, + "best": 2568.6444, + "vs_reference": -0.06679799424982236, + "vs_best_evaluated": 0.08258237837037297 + }, + { + "task": "C09_ihp130_sW2_sL1", + "rep": "r2", + "proposals": 6, + "first_legal": true, + "best": 2727.6438, + "vs_reference": -0.009032676873437229, + "vs_best_evaluated": 0.14959435893547646 + }, + { + "task": "C09_ihp130_sW2_sL1", + "rep": "r3", + "proposals": 7, + "first_legal": true, + "best": 2365.4923, + "vs_reference": -0.1406042195071452, + "vs_best_evaluated": -0.003038225084482926 + }, + { + "task": "C09_sky130_sW2_sL1", + "rep": "r1", + "proposals": 6, + "first_legal": true, + "best": 2606.9788, + "vs_reference": -0.010716715574037416, + "vs_best_evaluated": 0.16619537586129507 + }, + { + "task": "C09_sky130_sW2_sL1", + "rep": "r2", + "proposals": 8, + "first_legal": true, + "best": 2227.4063, + "vs_reference": -0.15475499063702358, + "vs_best_evaluated": -0.0036010545140156003 + }, + { + "task": "C09_sky130_sW2_sL1", + "rep": "r3", + "proposals": 7, + "first_legal": false, + "best": 2227.4063, + "vs_reference": -0.15475499063702358, + "vs_best_evaluated": -0.0036010545140156003 + }, + { + "task": "C11_gf180_sW2_sL1", + "rep": "r1", + "proposals": 4, + "first_legal": true, + "best": 4234.146, + "vs_reference": -0.03524229074889884, + "vs_best_evaluated": 0.0711747553510087 + }, + { + "task": "C11_gf180_sW2_sL1", + "rep": "r2", + "proposals": 8, + "first_legal": true, + "best": 3710.0245, + "vs_reference": -0.15466430824882693, + "vs_best_evaluated": -0.06142003933408324 + }, + { + "task": "C11_gf180_sW2_sL1", + "rep": "r3", + "proposals": 8, + "first_legal": true, + "best": 3710.0245, + "vs_reference": -0.15466430824882693, + "vs_best_evaluated": -0.06142003933408324 + }, + { + "task": "C11_ihp130_sW2_sL1", + "rep": "r1", + "proposals": 8, + "first_legal": true, + "best": 2214.9722, + "vs_reference": -0.07846251668929494, + "vs_best_evaluated": 0.016272493283111755 + }, + { + "task": "C11_ihp130_sW2_sL1", + "rep": "r2", + "proposals": 7, + "first_legal": true, + "best": 2132.3812, + "vs_reference": -0.11282443883175552, + "vs_best_evaluated": -0.02162187012819694 + }, + { + "task": "C11_ihp130_sW2_sL1", + "rep": "r3", + "proposals": 7, + "first_legal": true, + "best": 2131.5674, + "vs_reference": -0.11316301969697729, + "vs_best_evaluated": -0.02199525745785902 + }, + { + "task": "C11_sky130_sW2_sL1", + "rep": "r1", + "proposals": 8, + "first_legal": true, + "best": 1879.6082, + "vs_reference": -0.09570890344213656, + "vs_best_evaluated": 0.0025430966040147496 + }, + { + "task": "C11_sky130_sW2_sL1", + "rep": "r2", + "proposals": 7, + "first_legal": true, + "best": 1868.7373, + "vs_reference": -0.10093896047294271, + "vs_best_evaluated": -0.00325521059047007 + }, + { + "task": "C11_sky130_sW2_sL1", + "rep": "r3", + "proposals": 8, + "first_legal": true, + "best": 1775.9815, + "vs_reference": -0.1455643478776698, + "vs_best_evaluated": -0.0527291844537372 + }, + { + "task": "C16_gf180_sW2_sL1", + "rep": "r1", + "proposals": 4, + "first_legal": true, + "best": 1729.3648, + "vs_reference": 0.0, + "vs_best_evaluated": 0.2531418312387792 + }, + { + "task": "C16_gf180_sW2_sL1", + "rep": "r2", + "proposals": 7, + "first_legal": true, + "best": 1380.0232, + "vs_reference": -0.20200573065902572, + "vs_best_evaluated": 0.0 + }, + { + "task": "C16_gf180_sW2_sL1", + "rep": "r3", + "proposals": 4, + "first_legal": true, + "best": 1729.3648, + "vs_reference": 0.0, + "vs_best_evaluated": 0.2531418312387792 + }, + { + "task": "C16_ihp130_sW2_sL1", + "rep": "r1", + "proposals": 7, + "first_legal": true, + "best": 880.2168, + "vs_reference": -0.1265402843601895, + "vs_best_evaluated": 0.0 + }, + { + "task": "C16_ihp130_sW2_sL1", + "rep": "r2", + "proposals": 5, + "first_legal": true, + "best": 880.2168, + "vs_reference": -0.1265402843601895, + "vs_best_evaluated": 0.0 + }, + { + "task": "C16_ihp130_sW2_sL1", + "rep": "r3", + "proposals": 6, + "first_legal": true, + "best": 880.2168, + "vs_reference": -0.1265402843601895, + "vs_best_evaluated": 0.0 + }, + { + "task": "C16_sky130_sW2_sL1", + "rep": "r1", + "proposals": 5, + "first_legal": true, + "best": 377.2789, + "vs_reference": 0.0, + "vs_best_evaluated": 0.17840662268451868 + }, + { + "task": "C16_sky130_sW2_sL1", + "rep": "r2", + "proposals": 7, + "first_legal": true, + "best": 320.1602, + "vs_reference": -0.1513964867900114, + "vs_best_evaluated": 0.0 + }, + { + "task": "C16_sky130_sW2_sL1", + "rep": "r3", + "proposals": 4, + "first_legal": true, + "best": 377.2789, + "vs_reference": 0.0, + "vs_best_evaluated": 0.17840662268451868 + } + ], + "base": [ + { + "task": "C02_gf180_sW2_sL1", + "rep": "r1", + "proposals": 3, + "first_legal": true, + "best": 508.032, + "vs_reference": 0.0, + "vs_best_evaluated": 0.1850989262000471 + }, + { + "task": "C02_gf180_sW2_sL1", + "rep": "r2", + "proposals": 4, + "first_legal": true, + "best": 508.032, + "vs_reference": 0.0, + "vs_best_evaluated": 0.1850989262000471 + }, + { + "task": "C02_gf180_sW2_sL1", + "rep": "r3", + "proposals": 4, + "first_legal": true, + "best": 508.032, + "vs_reference": 0.0, + "vs_best_evaluated": 0.1850989262000471 + }, + { + "task": "C02_ihp130_sW2_sL1", + "rep": "r1", + "proposals": 4, + "first_legal": true, + "best": 290.2001, + "vs_reference": 0.0, + "vs_best_evaluated": 0.1815753300836631 + }, + { + "task": "C02_ihp130_sW2_sL1", + "rep": "r2", + "proposals": 4, + "first_legal": true, + "best": 290.2001, + "vs_reference": 0.0, + "vs_best_evaluated": 0.1815753300836631 + }, + { + "task": "C02_ihp130_sW2_sL1", + "rep": "r3", + "proposals": 3, + "first_legal": true, + "best": 290.2001, + "vs_reference": 0.0, + "vs_best_evaluated": 0.1815753300836631 + }, + { + "task": "C02_sky130_sW2_sL1", + "rep": "r1", + "proposals": 4, + "first_legal": true, + "best": 218.2609, + "vs_reference": 0.0, + "vs_best_evaluated": 0.1848547030818255 + }, + { + "task": "C02_sky130_sW2_sL1", + "rep": "r2", + "proposals": 3, + "first_legal": true, + "best": 218.2609, + "vs_reference": 0.0, + "vs_best_evaluated": 0.1848547030818255 + }, + { + "task": "C02_sky130_sW2_sL1", + "rep": "r3", + "proposals": 4, + "first_legal": true, + "best": 218.2609, + "vs_reference": 0.0, + "vs_best_evaluated": 0.1848547030818255 + }, + { + "task": "C08_gf180_sW2_sL1", + "rep": "r1", + "proposals": 5, + "first_legal": true, + "best": 1084.4544, + "vs_reference": 0.0, + "vs_best_evaluated": 0.20877793598256877 + }, + { + "task": "C08_gf180_sW2_sL1", + "rep": "r2", + "proposals": 5, + "first_legal": true, + "best": 1082.0736, + "vs_reference": -0.002195389681668658, + "vs_best_evaluated": 0.20612419737448406 + }, + { + "task": "C08_gf180_sW2_sL1", + "rep": "r3", + "proposals": 3, + "first_legal": true, + "best": 1084.4544, + "vs_reference": 0.0, + "vs_best_evaluated": 0.20877793598256877 + }, + { + "task": "C08_sky130_sW2_sL1", + "rep": "r1", + "proposals": 4, + "first_legal": true, + "best": 450.8464, + "vs_reference": 0.0, + "vs_best_evaluated": 0.2348853726337794 + }, + { + "task": "C08_sky130_sW2_sL1", + "rep": "r2", + "proposals": 4, + "first_legal": true, + "best": 450.8464, + "vs_reference": 0.0, + "vs_best_evaluated": 0.2348853726337794 + }, + { + "task": "C08_sky130_sW2_sL1", + "rep": "r3", + "proposals": 4, + "first_legal": true, + "best": 450.8464, + "vs_reference": 0.0, + "vs_best_evaluated": 0.2348853726337794 + }, + { + "task": "C09_gf180_sW2_sL1", + "rep": "r1", + "proposals": 5, + "first_legal": true, + "best": 1765.1568, + "vs_reference": 0.0, + "vs_best_evaluated": 0.19309674039777636 + }, + { + "task": "C09_gf180_sW2_sL1", + "rep": "r2", + "proposals": 4, + "first_legal": true, + "best": 1765.1568, + "vs_reference": 0.0, + "vs_best_evaluated": 0.19309674039777636 + }, + { + "task": "C09_gf180_sW2_sL1", + "rep": "r3", + "proposals": 4, + "first_legal": true, + "best": 1765.1568, + "vs_reference": 0.0, + "vs_best_evaluated": 0.19309674039777636 + }, + { + "task": "C09_ihp130_sW2_sL1", + "rep": "r1", + "proposals": 4, + "first_legal": true, + "best": 2752.5063, + "vs_reference": 0.0, + "vs_best_evaluated": 0.16007292279672303 + }, + { + "task": "C09_ihp130_sW2_sL1", + "rep": "r2", + "proposals": 5, + "first_legal": true, + "best": 2752.5063, + "vs_reference": 0.0, + "vs_best_evaluated": 0.16007292279672303 + }, + { + "task": "C09_ihp130_sW2_sL1", + "rep": "r3", + "proposals": 3, + "first_legal": true, + "best": 2752.5063, + "vs_reference": 0.0, + "vs_best_evaluated": 0.16007292279672303 + }, + { + "task": "C09_sky130_sW2_sL1", + "rep": "r1", + "proposals": 4, + "first_legal": true, + "best": 2635.2197, + "vs_reference": 0.0, + "vs_best_evaluated": 0.17882854610040932 + }, + { + "task": "C09_sky130_sW2_sL1", + "rep": "r2", + "proposals": 5, + "first_legal": true, + "best": 2635.2197, + "vs_reference": 0.0, + "vs_best_evaluated": 0.17882854610040932 + }, + { + "task": "C09_sky130_sW2_sL1", + "rep": "r3", + "proposals": 6, + "first_legal": true, + "best": 2635.2197, + "vs_reference": 0.0, + "vs_best_evaluated": 0.17882854610040932 + }, + { + "task": "C11_gf180_sW2_sL1", + "rep": "r1", + "proposals": 3, + "first_legal": true, + "best": 4388.818, + "vs_reference": 0.0, + "vs_best_evaluated": 0.11030442677935626 + }, + { + "task": "C11_gf180_sW2_sL1", + "rep": "r2", + "proposals": 3, + "first_legal": true, + "best": 4388.818, + "vs_reference": 0.0, + "vs_best_evaluated": 0.11030442677935626 + }, + { + "task": "C11_gf180_sW2_sL1", + "rep": "r3", + "proposals": 3, + "first_legal": true, + "best": 4388.818, + "vs_reference": 0.0, + "vs_best_evaluated": 0.11030442677935626 + }, + { + "task": "C11_ihp130_sW2_sL1", + "rep": "r1", + "proposals": 3, + "first_legal": true, + "best": 2403.5617, + "vs_reference": 0.0, + "vs_best_evaluated": 0.1028010381434108 + }, + { + "task": "C11_ihp130_sW2_sL1", + "rep": "r2", + "proposals": 5, + "first_legal": true, + "best": 2403.5617, + "vs_reference": 0.0, + "vs_best_evaluated": 0.1028010381434108 + }, + { + "task": "C11_ihp130_sW2_sL1", + "rep": "r3", + "proposals": 4, + "first_legal": true, + "best": 2403.5617, + "vs_reference": 0.0, + "vs_best_evaluated": 0.1028010381434108 + }, + { + "task": "C11_sky130_sW2_sL1", + "rep": "r1", + "proposals": 4, + "first_legal": true, + "best": 2078.5433, + "vs_reference": 0.0, + "vs_best_evaluated": 0.10865085415541786 + }, + { + "task": "C11_sky130_sW2_sL1", + "rep": "r2", + "proposals": 4, + "first_legal": true, + "best": 2078.5433, + "vs_reference": 0.0, + "vs_best_evaluated": 0.10865085415541786 + }, + { + "task": "C11_sky130_sW2_sL1", + "rep": "r3", + "proposals": 4, + "first_legal": true, + "best": 2078.5433, + "vs_reference": 0.0, + "vs_best_evaluated": 0.10865085415541786 + }, + { + "task": "C16_gf180_sW2_sL1", + "rep": "r1", + "proposals": 6, + "first_legal": true, + "best": 1729.3648, + "vs_reference": 0.0, + "vs_best_evaluated": 0.2531418312387792 + }, + { + "task": "C16_gf180_sW2_sL1", + "rep": "r2", + "proposals": 6, + "first_legal": true, + "best": 1729.3648, + "vs_reference": 0.0, + "vs_best_evaluated": 0.2531418312387792 + }, + { + "task": "C16_gf180_sW2_sL1", + "rep": "r3", + "proposals": 5, + "first_legal": true, + "best": 1729.3648, + "vs_reference": 0.0, + "vs_best_evaluated": 0.2531418312387792 + }, + { + "task": "C16_ihp130_sW2_sL1", + "rep": "r1", + "proposals": 5, + "first_legal": true, + "best": 1007.736, + "vs_reference": 0.0, + "vs_best_evaluated": 0.14487249050461193 + }, + { + "task": "C16_ihp130_sW2_sL1", + "rep": "r2", + "proposals": 5, + "first_legal": true, + "best": 1007.736, + "vs_reference": 0.0, + "vs_best_evaluated": 0.14487249050461193 + }, + { + "task": "C16_ihp130_sW2_sL1", + "rep": "r3", + "proposals": 4, + "first_legal": true, + "best": 1007.736, + "vs_reference": 0.0, + "vs_best_evaluated": 0.14487249050461193 + }, + { + "task": "C16_sky130_sW2_sL1", + "rep": "r1", + "proposals": 4, + "first_legal": true, + "best": 377.2789, + "vs_reference": 0.0, + "vs_best_evaluated": 0.17840662268451868 + }, + { + "task": "C16_sky130_sW2_sL1", + "rep": "r2", + "proposals": 4, + "first_legal": true, + "best": 377.2789, + "vs_reference": 0.0, + "vs_best_evaluated": 0.17840662268451868 + }, + { + "task": "C16_sky130_sW2_sL1", + "rep": "r3", + "proposals": 4, + "first_legal": true, + "best": 377.2789, + "vs_reference": 0.0, + "vs_best_evaluated": 0.17840662268451868 + } + ] + }, + "coverage": { + "C02_gf180_sW2_sL1": { + "best_all": 428.6832, + "best_base_expressible": 508.032, + "base_gap": 0.1850989262000471 + }, + "C02_ihp130_sW2_sL1": { + "best_all": 245.6044, + "best_base_expressible": 290.2001, + "base_gap": 0.1815753300836631 + }, + "C02_sky130_sW2_sL1": { + "best_all": 184.209, + "best_base_expressible": 218.2609, + "base_gap": 0.1848547030818255 + }, + "C08_gf180_sW2_sL1": { + "best_all": 897.1494, + "best_base_expressible": 1067.7888, + "base_gap": 0.19020176572597602 + }, + "C08_sky130_sW2_sL1": { + "best_all": 365.0917, + "best_base_expressible": 450.8464, + "base_gap": 0.2348853726337794 + }, + "C09_gf180_sW2_sL1": { + "best_all": 1479.475, + "best_base_expressible": 1765.1568, + "base_gap": 0.19309674039777636 + }, + "C09_ihp130_sW2_sL1": { + "best_all": 2372.7011, + "best_base_expressible": 2752.5063, + "base_gap": 0.16007292279672303 + }, + "C09_sky130_sW2_sL1": { + "best_all": 2235.4563, + "best_base_expressible": 2635.2197, + "base_gap": 0.17882854610040932 + }, + "C11_gf180_sW2_sL1": { + "best_all": 3952.806, + "best_base_expressible": 4388.818, + "base_gap": 0.11030442677935626 + }, + "C11_ihp130_sW2_sL1": { + "best_all": 2179.5062, + "best_base_expressible": 2403.5617, + "base_gap": 0.1028010381434108 + }, + "C11_sky130_sW2_sL1": { + "best_all": 1874.8403, + "best_base_expressible": 2078.5433, + "base_gap": 0.10865085415541786 + }, + "C16_gf180_sW2_sL1": { + "best_all": 1380.0232, + "best_base_expressible": 1380.0232, + "base_gap": 0.0 + }, + "C16_ihp130_sW2_sL1": { + "best_all": 880.2168, + "best_base_expressible": 880.2168, + "base_gap": 0.0 + }, + "C16_sky130_sW2_sL1": { + "best_all": 320.1602, + "best_base_expressible": 320.1602, + "base_gap": 0.0 + } + }, + "tasks": [ + "C02_gf180_sW2_sL1", + "C02_ihp130_sW2_sL1", + "C02_sky130_sW2_sL1", + "C08_gf180_sW2_sL1", + "C08_sky130_sW2_sL1", + "C09_gf180_sW2_sL1", + "C09_ihp130_sW2_sL1", + "C09_sky130_sW2_sL1", + "C11_gf180_sW2_sL1", + "C11_ihp130_sW2_sL1", + "C11_sky130_sW2_sL1", + "C16_gf180_sW2_sL1", + "C16_ihp130_sW2_sL1", + "C16_sky130_sW2_sL1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/results/analysis/llm_summary.json b/benchmarks/textbook_sharing/results/analysis/llm_summary.json new file mode 100644 index 00000000..b28c8800 --- /dev/null +++ b/benchmarks/textbook_sharing/results/analysis/llm_summary.json @@ -0,0 +1,12269 @@ +{ + "summary": { + "openai_gpt-6.1-sol": { + "sessions": 84, + "tasks": 28, + "proposals": 565, + "eda_verifications": 556, + "first_legal_rate": 0.9880952380952381, + "rejected_rate": 0.010619469026548672, + "drc_lvs_clean_rate_of_evaluated": 1.0, + "auto_passed_rate_of_evaluated": 0.998211091234347, + "by_k": { + "1": { + "found_rate": 0.9880952380952381, + "vs_reference_balanced": -0.028748799009734746, + "vs_best_evaluated_balanced": 0.14200405394623955, + "n_vs_best_evaluated": 83 + }, + "2": { + "found_rate": 1, + "vs_reference_balanced": -0.03746158222508605, + "vs_best_evaluated_balanced": 0.13175841665348006, + "n_vs_best_evaluated": 84 + }, + "4": { + "found_rate": 1, + "vs_reference_balanced": -0.08202162346371485, + "vs_best_evaluated_balanced": 0.07900799778148403, + "n_vs_best_evaluated": 84 + }, + "8": { + "found_rate": 1, + "vs_reference_balanced": -0.1403144554999291, + "vs_best_evaluated_balanced": 0.010123149619268097, + "n_vs_best_evaluated": 84 + } + } + }, + "anthropic_claude-sonnet": { + "sessions": 84, + "tasks": 28, + "proposals": 451, + "eda_verifications": 437, + "first_legal_rate": 0.9285714285714286, + "rejected_rate": 0.028824833702882482, + "drc_lvs_clean_rate_of_evaluated": 1.0, + "auto_passed_rate_of_evaluated": 0.9885844748858448, + "by_k": { + "1": { + "found_rate": 0.9285714285714286, + "vs_reference_balanced": -0.03805008172943584, + "vs_best_evaluated_balanced": 0.13066924383043346, + "n_vs_best_evaluated": 78 + }, + "2": { + "found_rate": 1, + "vs_reference_balanced": -0.05057843696034669, + "vs_best_evaluated_balanced": 0.1164485148750518, + "n_vs_best_evaluated": 84 + }, + "4": { + "found_rate": 1, + "vs_reference_balanced": -0.06596980367208446, + "vs_best_evaluated_balanced": 0.09846253796120705, + "n_vs_best_evaluated": 84 + }, + "8": { + "found_rate": 1, + "vs_reference_balanced": -0.08953890599833567, + "vs_best_evaluated_balanced": 0.0702910354765989, + "n_vs_best_evaluated": 84 + } + } + } + }, + "sessions": [ + { + "tag": "openai_gpt-6.1-sol", + "task": "C02_gf180_sW2_sL1", + "topology": "C02", + "rep": "r1", + "n_proposals": 8, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 8, + "statuses": { + "auto_passed": 8 + }, + "drc_lvs_clean": 8, + "auto_passed": 8, + "best": { + "1": { + "best_area": 444.8808, + "vs_reference": -0.12430555555555545, + "vs_best_evaluated": 0.03778454579045798 + }, + "2": { + "best_area": 444.8808, + "vs_reference": -0.12430555555555545, + "vs_best_evaluated": 0.03778454579045798 + }, + "4": { + "best_area": 412.4912, + "vs_reference": -0.18806059460821367, + "vs_best_evaluated": -0.03777148253068929 + }, + "8": { + "best_area": 400.4456, + "vs_reference": -0.21177091206853105, + "vs_best_evaluated": -0.06587055429277378 + } + }, + "reference_area": 508.032, + "best_evaluated_area": 428.6832, + "best_evaluated_complete": true, + "evaluator_s": 160.9, + "model_s": 311.4, + "usage": [ + { + "input_tokens": 14876, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 1151, + "reasoning_output_tokens": 672 + }, + { + "input_tokens": 15523, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 773, + "reasoning_output_tokens": 415 + }, + { + "input_tokens": 16046, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 1422, + "reasoning_output_tokens": 1034 + }, + { + "input_tokens": 16606, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 805, + "reasoning_output_tokens": 418 + }, + { + "input_tokens": 17159, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 649, + "reasoning_output_tokens": 291 + }, + { + "input_tokens": 17683, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1112, + "reasoning_output_tokens": 754 + }, + { + "input_tokens": 18211, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 1798, + "reasoning_output_tokens": 1439 + }, + { + "input_tokens": 18740, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 1238, + "reasoning_output_tokens": 879 + } + ], + "isolation_breach": false, + "interface": "sharing" + }, + { + "tag": "openai_gpt-6.1-sol", + "task": "C02_gf180_sW2_sL1", + "topology": "C02", + "rep": "r2", + "n_proposals": 8, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 8, + "statuses": { + "auto_passed": 8 + }, + "drc_lvs_clean": 8, + "auto_passed": 8, + "best": { + "1": { + "best_area": 479.808, + "vs_reference": -0.05555555555555558, + "vs_best_evaluated": 0.11926009696671103 + }, + "2": { + "best_area": 479.808, + "vs_reference": -0.05555555555555558, + "vs_best_evaluated": 0.11926009696671103 + }, + "4": { + "best_area": 412.4912, + "vs_reference": -0.18806059460821367, + "vs_best_evaluated": -0.03777148253068929 + }, + "8": { + "best_area": 400.4456, + "vs_reference": -0.21177091206853105, + "vs_best_evaluated": -0.06587055429277378 + } + }, + "reference_area": 508.032, + "best_evaluated_area": 428.6832, + "best_evaluated_complete": true, + "evaluator_s": 171.3, + "model_s": 255.3, + "usage": [ + { + "input_tokens": 14874, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1075, + "reasoning_output_tokens": 659 + }, + { + "input_tokens": 15455, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 758, + "reasoning_output_tokens": 397 + }, + { + "input_tokens": 15985, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 994, + "reasoning_output_tokens": 603 + }, + { + "input_tokens": 16544, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 699, + "reasoning_output_tokens": 308 + }, + { + "input_tokens": 17103, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 907, + "reasoning_output_tokens": 516 + }, + { + "input_tokens": 17662, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 808, + "reasoning_output_tokens": 447 + }, + { + "input_tokens": 18193, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1341, + "reasoning_output_tokens": 979 + }, + { + "input_tokens": 18723, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 943, + "reasoning_output_tokens": 571 + } + ], + "isolation_breach": false, + "interface": "sharing" + }, + { + "tag": "openai_gpt-6.1-sol", + "task": "C02_gf180_sW2_sL1", + "topology": "C02", + "rep": "r3", + "n_proposals": 7, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 7, + "statuses": { + "auto_passed": 7 + }, + "drc_lvs_clean": 7, + "auto_passed": 7, + "best": { + "1": { + "best_area": 489.216, + "vs_reference": -0.03703703703703698, + "vs_best_evaluated": 0.14120637337782305 + }, + "2": { + "best_area": 489.216, + "vs_reference": -0.03703703703703698, + "vs_best_evaluated": 0.14120637337782305 + }, + "4": { + "best_area": 444.8808, + "vs_reference": -0.12430555555555545, + "vs_best_evaluated": 0.03778454579045798 + }, + "8": { + "best_area": 400.6384, + "vs_reference": -0.21139140841521797, + "vs_best_evaluated": -0.06542080492074331 + } + }, + "reference_area": 508.032, + "best_evaluated_area": 428.6832, + "best_evaluated_complete": true, + "evaluator_s": 149.3, + "model_s": 241.8, + "usage": [ + { + "input_tokens": 14874, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 961, + "reasoning_output_tokens": 603 + }, + { + "input_tokens": 15401, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 852, + "reasoning_output_tokens": 494 + }, + { + "input_tokens": 15924, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 994, + "reasoning_output_tokens": 581 + }, + { + "input_tokens": 16504, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 771, + "reasoning_output_tokens": 384 + }, + { + "input_tokens": 17059, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 762, + "reasoning_output_tokens": 375 + }, + { + "input_tokens": 17614, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 645, + "reasoning_output_tokens": 287 + }, + { + "input_tokens": 18144, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1180, + "reasoning_output_tokens": 822 + }, + { + "input_tokens": 18670, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 693, + "reasoning_output_tokens": 686 + } + ], + "isolation_breach": false, + "interface": "sharing" + }, + { + "tag": "openai_gpt-6.1-sol", + "task": "C02_gf180_sW2_sL2", + "topology": "C02", + "rep": "r1", + "n_proposals": 7, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 7, + "statuses": { + "auto_passed": 7 + }, + "drc_lvs_clean": 7, + "auto_passed": 7, + "best": { + "1": { + "best_area": 699.9552, + "vs_reference": -0.02617801047120427, + "vs_best_evaluated": 0.14740433969538724 + }, + "2": { + "best_area": 690.5472, + "vs_reference": -0.03926701570680635, + "vs_best_evaluated": 0.13198223835539546 + }, + "4": { + "best_area": 573.3872, + "vs_reference": -0.2022674252947252, + "vs_best_evaluated": -0.060072756648158365 + }, + "8": { + "best_area": 431.4452, + "vs_reference": -0.3997461222708979, + "vs_best_evaluated": -0.29275174351052136 + } + }, + "reference_area": 718.7712, + "best_evaluated_area": 610.0336, + "best_evaluated_complete": true, + "evaluator_s": 140.3, + "model_s": 233.7, + "usage": [ + { + "input_tokens": 14878, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 1078, + "reasoning_output_tokens": 720 + }, + { + "input_tokens": 15402, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 1055, + "reasoning_output_tokens": 642 + }, + { + "input_tokens": 15981, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 766, + "reasoning_output_tokens": 376 + }, + { + "input_tokens": 16541, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 732, + "reasoning_output_tokens": 374 + }, + { + "input_tokens": 17065, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 804, + "reasoning_output_tokens": 446 + }, + { + "input_tokens": 17597, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 689, + "reasoning_output_tokens": 331 + }, + { + "input_tokens": 18119, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1139, + "reasoning_output_tokens": 780 + }, + { + "input_tokens": 18644, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 248, + "reasoning_output_tokens": 241 + } + ], + "isolation_breach": false, + "interface": "sharing" + }, + { + "tag": "openai_gpt-6.1-sol", + "task": "C02_gf180_sW2_sL2", + "topology": "C02", + "rep": "r2", + "n_proposals": 8, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 8, + "statuses": { + "auto_passed": 8 + }, + "drc_lvs_clean": 8, + "auto_passed": 8, + "best": { + "1": { + "best_area": 690.5472, + "vs_reference": -0.03926701570680635, + "vs_best_evaluated": 0.13198223835539546 + }, + "2": { + "best_area": 690.5472, + "vs_reference": -0.03926701570680635, + "vs_best_evaluated": 0.13198223835539546 + }, + "4": { + "best_area": 620.7624, + "vs_reference": -0.13635604765466403, + "vs_best_evaluated": 0.017587227982196252 + }, + "8": { + "best_area": 431.4452, + "vs_reference": -0.3997461222708979, + "vs_best_evaluated": -0.29275174351052136 + } + }, + "reference_area": 718.7712, + "best_evaluated_area": 610.0336, + "best_evaluated_complete": true, + "evaluator_s": 167.0, + "model_s": 266.0, + "usage": [ + { + "input_tokens": 14874, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 1099, + "reasoning_output_tokens": 683 + }, + { + "input_tokens": 15458, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1185, + "reasoning_output_tokens": 824 + }, + { + "input_tokens": 15991, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 810, + "reasoning_output_tokens": 449 + }, + { + "input_tokens": 16516, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 727, + "reasoning_output_tokens": 337 + }, + { + "input_tokens": 17078, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 827, + "reasoning_output_tokens": 466 + }, + { + "input_tokens": 17603, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 586, + "reasoning_output_tokens": 225 + }, + { + "input_tokens": 18140, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1074, + "reasoning_output_tokens": 713 + }, + { + "input_tokens": 18663, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1117, + "reasoning_output_tokens": 756 + } + ], + "isolation_breach": false, + "interface": "sharing" + }, + { + "tag": "openai_gpt-6.1-sol", + "task": "C02_gf180_sW2_sL2", + "topology": "C02", + "rep": "r3", + "n_proposals": 7, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 7, + "statuses": { + "auto_passed": 7 + }, + "drc_lvs_clean": 7, + "auto_passed": 7, + "best": { + "1": { + "best_area": 699.9552, + "vs_reference": -0.02617801047120427, + "vs_best_evaluated": 0.14740433969538724 + }, + "2": { + "best_area": 690.5472, + "vs_reference": -0.03926701570680635, + "vs_best_evaluated": 0.13198223835539546 + }, + "4": { + "best_area": 640.5672, + "vs_reference": -0.10880235602094246, + "vs_best_evaluated": 0.05005232498668932 + }, + "8": { + "best_area": 431.4452, + "vs_reference": -0.3997461222708979, + "vs_best_evaluated": -0.29275174351052136 + } + }, + "reference_area": 718.7712, + "best_evaluated_area": 610.0336, + "best_evaluated_complete": true, + "evaluator_s": 148.4, + "model_s": 232.4, + "usage": [ + { + "input_tokens": 14872, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 814, + "reasoning_output_tokens": 456 + }, + { + "input_tokens": 15406, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1107, + "reasoning_output_tokens": 694 + }, + { + "input_tokens": 15985, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1095, + "reasoning_output_tokens": 682 + }, + { + "input_tokens": 16564, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 797, + "reasoning_output_tokens": 410 + }, + { + "input_tokens": 17119, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 711, + "reasoning_output_tokens": 353 + }, + { + "input_tokens": 17647, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 874, + "reasoning_output_tokens": 516 + }, + { + "input_tokens": 18171, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 780, + "reasoning_output_tokens": 422 + }, + { + "input_tokens": 18699, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 474, + "reasoning_output_tokens": 467 + } + ], + "isolation_breach": false, + "interface": "sharing" + }, + { + "tag": "openai_gpt-6.1-sol", + "task": "C02_ihp130_sW2_sL1", + "topology": "C02", + "rep": "r1", + "n_proposals": 8, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 8, + "statuses": { + "auto_passed": 8 + }, + "drc_lvs_clean": 8, + "auto_passed": 8, + "best": { + "1": { + "best_area": 281.4179, + "vs_reference": -0.0302625671045601, + "vs_best_evaluated": 0.1458178273679136 + }, + "2": { + "best_area": 277.0268, + "vs_reference": -0.045393850656839985, + "vs_best_evaluated": 0.12793907601003873 + }, + "4": { + "best_area": 238.0463, + "vs_reference": -0.17971668514242423, + "vs_best_evaluated": -0.030773471485038506 + }, + "8": { + "best_area": 230.0767, + "vs_reference": -0.20717911537590794, + "vs_best_evaluated": -0.06322240155306669 + } + }, + "reference_area": 290.2001, + "best_evaluated_area": 245.6044, + "best_evaluated_complete": true, + "evaluator_s": 66.8, + "model_s": 269.5, + "usage": [ + { + "input_tokens": 14873, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 847, + "reasoning_output_tokens": 489 + }, + { + "input_tokens": 15401, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1118, + "reasoning_output_tokens": 721 + }, + { + "input_tokens": 15966, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 722, + "reasoning_output_tokens": 348 + }, + { + "input_tokens": 16507, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 1262, + "reasoning_output_tokens": 888 + }, + { + "input_tokens": 17049, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 933, + "reasoning_output_tokens": 559 + }, + { + "input_tokens": 17593, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 693, + "reasoning_output_tokens": 335 + }, + { + "input_tokens": 18117, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 1148, + "reasoning_output_tokens": 790 + }, + { + "input_tokens": 18647, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 1087, + "reasoning_output_tokens": 736 + } + ], + "isolation_breach": false, + "interface": "sharing" + }, + { + "tag": "openai_gpt-6.1-sol", + "task": "C02_ihp130_sW2_sL1", + "topology": "C02", + "rep": "r2", + "n_proposals": 8, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 8, + "statuses": { + "auto_passed": 8 + }, + "drc_lvs_clean": 8, + "auto_passed": 8, + "best": { + "1": { + "best_area": 281.4179, + "vs_reference": -0.0302625671045601, + "vs_best_evaluated": 0.1458178273679136 + }, + "2": { + "best_area": 281.4179, + "vs_reference": -0.0302625671045601, + "vs_best_evaluated": 0.1458178273679136 + }, + "4": { + "best_area": 257.48, + "vs_reference": -0.11275013344240747, + "vs_best_evaluated": 0.04835255394447335 + }, + "8": { + "best_area": 230.0767, + "vs_reference": -0.20717911537590794, + "vs_best_evaluated": -0.06322240155306669 + } + }, + "reference_area": 290.2001, + "best_evaluated_area": 245.6044, + "best_evaluated_complete": true, + "evaluator_s": 68.3, + "model_s": 250.1, + "usage": [ + { + "input_tokens": 14875, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1011, + "reasoning_output_tokens": 661 + }, + { + "input_tokens": 15393, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 834, + "reasoning_output_tokens": 484 + }, + { + "input_tokens": 15915, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 1112, + "reasoning_output_tokens": 715 + }, + { + "input_tokens": 16478, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 957, + "reasoning_output_tokens": 585 + }, + { + "input_tokens": 17017, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 715, + "reasoning_output_tokens": 343 + }, + { + "input_tokens": 17561, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 887, + "reasoning_output_tokens": 516 + }, + { + "input_tokens": 18094, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 872, + "reasoning_output_tokens": 501 + }, + { + "input_tokens": 18634, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 746, + "reasoning_output_tokens": 396 + } + ], + "isolation_breach": false, + "interface": "sharing" + }, + { + "tag": "openai_gpt-6.1-sol", + "task": "C02_ihp130_sW2_sL1", + "topology": "C02", + "rep": "r3", + "n_proposals": 3, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 3, + "statuses": { + "auto_passed": 3 + }, + "drc_lvs_clean": 3, + "auto_passed": 3, + "best": { + "1": { + "best_area": 281.4179, + "vs_reference": -0.0302625671045601, + "vs_best_evaluated": 0.1458178273679136 + }, + "2": { + "best_area": 277.0268, + "vs_reference": -0.045393850656839985, + "vs_best_evaluated": 0.12793907601003873 + }, + "4": { + "best_area": 277.0268, + "vs_reference": -0.045393850656839985, + "vs_best_evaluated": 0.12793907601003873 + }, + "8": { + "best_area": 277.0268, + "vs_reference": -0.045393850656839985, + "vs_best_evaluated": 0.12793907601003873 + } + }, + "reference_area": 290.2001, + "best_evaluated_area": 245.6044, + "best_evaluated_complete": true, + "evaluator_s": 26.4, + "model_s": 128.0, + "usage": [ + { + "input_tokens": 14877, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 976, + "reasoning_output_tokens": 623 + }, + { + "input_tokens": 15394, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1290, + "reasoning_output_tokens": 890 + }, + { + "input_tokens": 15964, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 804, + "reasoning_output_tokens": 404 + }, + { + "input_tokens": 16536, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 684, + "reasoning_output_tokens": 677 + } + ], + "isolation_breach": false, + "interface": "sharing" + }, + { + "tag": "openai_gpt-6.1-sol", + "task": "C02_ihp130_sW2_sL2", + "topology": "C02", + "rep": "r1", + "n_proposals": 8, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 8, + "statuses": { + "auto_passed": 8 + }, + "drc_lvs_clean": 8, + "auto_passed": 8, + "best": { + "1": { + "best_area": 420.2972, + "vs_reference": -0.030390303377046513, + "vs_best_evaluated": 0.1393045614773163 + }, + "2": { + "best_area": 420.2972, + "vs_reference": -0.030390303377046513, + "vs_best_evaluated": 0.1393045614773163 + }, + "4": { + "best_area": 361.3487, + "vs_reference": -0.16638225669336204, + "vs_best_evaluated": -0.020487830530637963 + }, + "8": { + "best_area": 347.3887, + "vs_reference": -0.19858744712731324, + "vs_best_evaluated": -0.05832936665846222 + } + }, + "reference_area": 433.4705, + "best_evaluated_area": 368.9068, + "best_evaluated_complete": true, + "evaluator_s": 66.9, + "model_s": 279.8, + "usage": [ + { + "input_tokens": 14875, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 1331, + "reasoning_output_tokens": 915 + }, + { + "input_tokens": 15461, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 831, + "reasoning_output_tokens": 470 + }, + { + "input_tokens": 15988, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1325, + "reasoning_output_tokens": 909 + }, + { + "input_tokens": 16574, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 972, + "reasoning_output_tokens": 582 + }, + { + "input_tokens": 17132, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 805, + "reasoning_output_tokens": 415 + }, + { + "input_tokens": 17692, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 1069, + "reasoning_output_tokens": 679 + }, + { + "input_tokens": 18248, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 952, + "reasoning_output_tokens": 562 + }, + { + "input_tokens": 18804, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 786, + "reasoning_output_tokens": 425 + } + ], + "isolation_breach": false, + "interface": "sharing" + }, + { + "tag": "openai_gpt-6.1-sol", + "task": "C02_ihp130_sW2_sL2", + "topology": "C02", + "rep": "r2", + "n_proposals": 7, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 7, + "statuses": { + "auto_passed": 7 + }, + "drc_lvs_clean": 7, + "auto_passed": 7, + "best": { + "1": { + "best_area": 390.6, + "vs_reference": -0.0989006172277006, + "vs_best_evaluated": 0.05880401228711429 + }, + "2": { + "best_area": 390.6, + "vs_reference": -0.0989006172277006, + "vs_best_evaluated": 0.05880401228711429 + }, + "4": { + "best_area": 361.3487, + "vs_reference": -0.16638225669336204, + "vs_best_evaluated": -0.020487830530637963 + }, + "8": { + "best_area": 347.3887, + "vs_reference": -0.19858744712731324, + "vs_best_evaluated": -0.05832936665846222 + } + }, + "reference_area": 433.4705, + "best_evaluated_area": 368.9068, + "best_evaluated_complete": true, + "evaluator_s": 59.8, + "model_s": 230.8, + "usage": [ + { + "input_tokens": 14879, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 908, + "reasoning_output_tokens": 516 + }, + { + "input_tokens": 15434, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 662, + "reasoning_output_tokens": 319 + }, + { + "input_tokens": 15947, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 982, + "reasoning_output_tokens": 608 + }, + { + "input_tokens": 16489, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 991, + "reasoning_output_tokens": 617 + }, + { + "input_tokens": 17030, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 787, + "reasoning_output_tokens": 413 + }, + { + "input_tokens": 17574, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 652, + "reasoning_output_tokens": 309 + }, + { + "input_tokens": 18081, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1157, + "reasoning_output_tokens": 804 + }, + { + "input_tokens": 18606, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 275, + "reasoning_output_tokens": 268 + } + ], + "isolation_breach": false, + "interface": "sharing" + }, + { + "tag": "openai_gpt-6.1-sol", + "task": "C02_ihp130_sW2_sL2", + "topology": "C02", + "rep": "r3", + "n_proposals": 8, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 8, + "statuses": { + "auto_passed": 8 + }, + "drc_lvs_clean": 8, + "auto_passed": 8, + "best": { + "1": { + "best_area": 424.6883, + "vs_reference": -0.020260202251364268, + "vs_best_evaluated": 0.15120756787351186 + }, + "2": { + "best_area": 424.6883, + "vs_reference": -0.020260202251364268, + "vs_best_evaluated": 0.15120756787351186 + }, + "4": { + "best_area": 390.6, + "vs_reference": -0.0989006172277006, + "vs_best_evaluated": 0.05880401228711429 + }, + "8": { + "best_area": 347.3887, + "vs_reference": -0.19858744712731324, + "vs_best_evaluated": -0.05832936665846222 + } + }, + "reference_area": 433.4705, + "best_evaluated_area": 368.9068, + "best_evaluated_complete": true, + "evaluator_s": 68.9, + "model_s": 259.3, + "usage": [ + { + "input_tokens": 14877, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 730, + "reasoning_output_tokens": 372 + }, + { + "input_tokens": 15405, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1057, + "reasoning_output_tokens": 699 + }, + { + "input_tokens": 15929, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 926, + "reasoning_output_tokens": 513 + }, + { + "input_tokens": 16510, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 771, + "reasoning_output_tokens": 383 + }, + { + "input_tokens": 17067, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 641, + "reasoning_output_tokens": 253 + }, + { + "input_tokens": 17621, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 1404, + "reasoning_output_tokens": 1009 + }, + { + "input_tokens": 18181, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 646, + "reasoning_output_tokens": 288 + }, + { + "input_tokens": 18707, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1222, + "reasoning_output_tokens": 864 + } + ], + "isolation_breach": false, + "interface": "sharing" + }, + { + "tag": "openai_gpt-6.1-sol", + "task": "C02_sky130_sW2_sL1", + "topology": "C02", + "rep": "r1", + "n_proposals": 7, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 7, + "statuses": { + "auto_passed": 7 + }, + "drc_lvs_clean": 7, + "auto_passed": 7, + "best": { + "1": { + "best_area": 208.2649, + "vs_reference": -0.045798399988270844, + "vs_best_evaluated": 0.13059025346210018 + }, + "2": { + "best_area": 208.2649, + "vs_reference": -0.045798399988270844, + "vs_best_evaluated": 0.13059025346210018 + }, + "4": { + "best_area": 175.5458, + "vs_reference": -0.1957066061763696, + "vs_best_evaluated": -0.047029189670428684 + }, + "8": { + "best_area": 170.1103, + "vs_reference": -0.22061028796270887, + "vs_best_evaluated": -0.07653643415902589 + } + }, + "reference_area": 218.2609, + "best_evaluated_area": 184.209, + "best_evaluated_complete": true, + "evaluator_s": 122.7, + "model_s": 253.8, + "usage": [ + { + "input_tokens": 14873, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 967, + "reasoning_output_tokens": 609 + }, + { + "input_tokens": 15399, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 947, + "reasoning_output_tokens": 589 + }, + { + "input_tokens": 15925, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 718, + "reasoning_output_tokens": 331 + }, + { + "input_tokens": 16478, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 1038, + "reasoning_output_tokens": 651 + }, + { + "input_tokens": 17033, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 1088, + "reasoning_output_tokens": 701 + }, + { + "input_tokens": 17592, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1208, + "reasoning_output_tokens": 819 + }, + { + "input_tokens": 18147, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 712, + "reasoning_output_tokens": 354 + }, + { + "input_tokens": 18671, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 473, + "reasoning_output_tokens": 466 + } + ], + "isolation_breach": false, + "interface": "sharing" + }, + { + "tag": "openai_gpt-6.1-sol", + "task": "C02_sky130_sW2_sL1", + "topology": "C02", + "rep": "r2", + "n_proposals": 8, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 8, + "statuses": { + "auto_passed": 8 + }, + "drc_lvs_clean": 8, + "auto_passed": 8, + "best": { + "1": { + "best_area": 203.2669, + "vs_reference": -0.06869759998240643, + "vs_best_evaluated": 0.1034580286522373 + }, + "2": { + "best_area": 203.2669, + "vs_reference": -0.06869759998240643, + "vs_best_evaluated": 0.1034580286522373 + }, + "4": { + "best_area": 189.3898, + "vs_reference": -0.13227792976204156, + "vs_best_evaluated": 0.02812457588934314 + }, + "8": { + "best_area": 170.1103, + "vs_reference": -0.22061028796270887, + "vs_best_evaluated": -0.07653643415902589 + } + }, + "reference_area": 218.2609, + "best_evaluated_area": 184.209, + "best_evaluated_complete": true, + "evaluator_s": 142.2, + "model_s": 306.5, + "usage": [ + { + "input_tokens": 14873, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 963, + "reasoning_output_tokens": 547 + }, + { + "input_tokens": 15459, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 863, + "reasoning_output_tokens": 516 + }, + { + "input_tokens": 15976, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1224, + "reasoning_output_tokens": 833 + }, + { + "input_tokens": 16531, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1394, + "reasoning_output_tokens": 1003 + }, + { + "input_tokens": 17086, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1349, + "reasoning_output_tokens": 958 + }, + { + "input_tokens": 17649, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 830, + "reasoning_output_tokens": 469 + }, + { + "input_tokens": 18176, + "cached_input_tokens": 18048, + "cache_write_input_tokens": 0, + "output_tokens": 1227, + "reasoning_output_tokens": 866 + }, + { + "input_tokens": 18707, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 970, + "reasoning_output_tokens": 609 + } + ], + "isolation_breach": false, + "interface": "sharing" + }, + { + "tag": "openai_gpt-6.1-sol", + "task": "C02_sky130_sW2_sL1", + "topology": "C02", + "rep": "r3", + "n_proposals": 8, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 8, + "statuses": { + "auto_passed": 8 + }, + "drc_lvs_clean": 8, + "auto_passed": 8, + "best": { + "1": { + "best_area": 208.2649, + "vs_reference": -0.045798399988270844, + "vs_best_evaluated": 0.13059025346210018 + }, + "2": { + "best_area": 194.0305, + "vs_reference": -0.11101576141214486, + "vs_best_evaluated": 0.05331715605643583 + }, + "4": { + "best_area": 189.3741, + "vs_reference": -0.13234986202292753, + "vs_best_evaluated": 0.02803934661172902 + }, + "8": { + "best_area": 170.1103, + "vs_reference": -0.22061028796270887, + "vs_best_evaluated": -0.07653643415902589 + } + }, + "reference_area": 218.2609, + "best_evaluated_area": 184.209, + "best_evaluated_complete": true, + "evaluator_s": 142.7, + "model_s": 272.8, + "usage": [ + { + "input_tokens": 14873, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 920, + "reasoning_output_tokens": 562 + }, + { + "input_tokens": 15397, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 977, + "reasoning_output_tokens": 619 + }, + { + "input_tokens": 15925, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1062, + "reasoning_output_tokens": 649 + }, + { + "input_tokens": 16504, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 886, + "reasoning_output_tokens": 473 + }, + { + "input_tokens": 17083, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1146, + "reasoning_output_tokens": 759 + }, + { + "input_tokens": 17640, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 921, + "reasoning_output_tokens": 534 + }, + { + "input_tokens": 18197, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 899, + "reasoning_output_tokens": 541 + }, + { + "input_tokens": 18721, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1049, + "reasoning_output_tokens": 691 + } + ], + "isolation_breach": false, + "interface": "sharing" + }, + { + "tag": "openai_gpt-6.1-sol", + "task": "C02_sky130_sW2_sL2", + "topology": "C02", + "rep": "r1", + "n_proposals": 7, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 7, + "statuses": { + "auto_passed": 7 + }, + "drc_lvs_clean": 7, + "auto_passed": 7, + "best": { + "1": { + "best_area": 293.9449, + "vs_reference": -0.03288797262888932, + "vs_best_evaluated": 0.13727158416033136 + }, + "2": { + "best_area": 293.9449, + "vs_reference": -0.03288797262888932, + "vs_best_evaluated": 0.13727158416033136 + }, + "4": { + "best_area": 269.5018, + "vs_reference": -0.1133085412328515, + "vs_best_evaluated": 0.042701332869053976 + }, + "8": { + "best_area": 179.2095, + "vs_reference": -0.4103804390919419, + "vs_best_evaluated": -0.30663919679647145 + } + }, + "reference_area": 303.9409, + "best_evaluated_area": 258.465, + "best_evaluated_complete": true, + "evaluator_s": 121.6, + "model_s": 237.8, + "usage": [ + { + "input_tokens": 14873, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 857, + "reasoning_output_tokens": 499 + }, + { + "input_tokens": 15397, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 733, + "reasoning_output_tokens": 375 + }, + { + "input_tokens": 15925, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 1301, + "reasoning_output_tokens": 904 + }, + { + "input_tokens": 16490, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 961, + "reasoning_output_tokens": 589 + }, + { + "input_tokens": 17030, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 668, + "reasoning_output_tokens": 296 + }, + { + "input_tokens": 17570, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 1000, + "reasoning_output_tokens": 642 + }, + { + "input_tokens": 18094, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 864, + "reasoning_output_tokens": 506 + }, + { + "input_tokens": 18622, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 511, + "reasoning_output_tokens": 504 + } + ], + "isolation_breach": false, + "interface": "sharing" + }, + { + "tag": "openai_gpt-6.1-sol", + "task": "C02_sky130_sW2_sL2", + "topology": "C02", + "rep": "r2", + "n_proposals": 8, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 8, + "statuses": { + "auto_passed": 8 + }, + "drc_lvs_clean": 8, + "auto_passed": 8, + "best": { + "1": { + "best_area": 288.9469, + "vs_reference": -0.049331958943333976, + "vs_best_evaluated": 0.11793434314123785 + }, + "2": { + "best_area": 288.9469, + "vs_reference": -0.049331958943333976, + "vs_best_evaluated": 0.11793434314123785 + }, + "4": { + "best_area": 249.8018, + "vs_reference": -0.17812377340463237, + "vs_best_evaluated": -0.033517884433095335 + }, + "8": { + "best_area": 240.3343, + "vs_reference": -0.2092729211501314, + "vs_best_evaluated": -0.0701476021898515 + } + }, + "reference_area": 303.9409, + "best_evaluated_area": 258.465, + "best_evaluated_complete": true, + "evaluator_s": 141.6, + "model_s": 284.7, + "usage": [ + { + "input_tokens": 14871, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1029, + "reasoning_output_tokens": 613 + }, + { + "input_tokens": 15455, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1020, + "reasoning_output_tokens": 659 + }, + { + "input_tokens": 15984, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1033, + "reasoning_output_tokens": 642 + }, + { + "input_tokens": 16543, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 600, + "reasoning_output_tokens": 209 + }, + { + "input_tokens": 17104, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 571, + "reasoning_output_tokens": 210 + }, + { + "input_tokens": 17633, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 778, + "reasoning_output_tokens": 417 + }, + { + "input_tokens": 18162, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1395, + "reasoning_output_tokens": 1034 + }, + { + "input_tokens": 18689, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1889, + "reasoning_output_tokens": 1552 + } + ], + "isolation_breach": false, + "interface": "sharing" + }, + { + "tag": "openai_gpt-6.1-sol", + "task": "C02_sky130_sW2_sL2", + "topology": "C02", + "rep": "r3", + "n_proposals": 8, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 8, + "statuses": { + "auto_passed": 8 + }, + "drc_lvs_clean": 8, + "auto_passed": 8, + "best": { + "1": { + "best_area": 293.9449, + "vs_reference": -0.03288797262888932, + "vs_best_evaluated": 0.13727158416033136 + }, + "2": { + "best_area": 288.9469, + "vs_reference": -0.049331958943333976, + "vs_best_evaluated": 0.11793434314123785 + }, + "4": { + "best_area": 269.5018, + "vs_reference": -0.1133085412328515, + "vs_best_evaluated": 0.042701332869053976 + }, + "8": { + "best_area": 240.3343, + "vs_reference": -0.2092729211501314, + "vs_best_evaluated": -0.0701476021898515 + } + }, + "reference_area": 303.9409, + "best_evaluated_area": 258.465, + "best_evaluated_complete": true, + "evaluator_s": 142.4, + "model_s": 299.1, + "usage": [ + { + "input_tokens": 14871, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 781, + "reasoning_output_tokens": 423 + }, + { + "input_tokens": 15397, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1096, + "reasoning_output_tokens": 683 + }, + { + "input_tokens": 15980, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1133, + "reasoning_output_tokens": 720 + }, + { + "input_tokens": 16557, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1042, + "reasoning_output_tokens": 654 + }, + { + "input_tokens": 17115, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 827, + "reasoning_output_tokens": 439 + }, + { + "input_tokens": 17671, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 710, + "reasoning_output_tokens": 352 + }, + { + "input_tokens": 18195, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 1477, + "reasoning_output_tokens": 1119 + }, + { + "input_tokens": 18725, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1665, + "reasoning_output_tokens": 1307 + } + ], + "isolation_breach": false, + "interface": "sharing" + }, + { + "tag": "openai_gpt-6.1-sol", + "task": "C08_gf180_sW2_sL1", + "topology": "C08", + "rep": "r1", + "n_proposals": 8, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 8, + "statuses": { + "auto_passed": 8 + }, + "drc_lvs_clean": 8, + "auto_passed": 8, + "best": { + "1": { + "best_area": 1008.9664, + "vs_reference": -0.06960919703032242, + "vs_best_evaluated": 0.12463587447085178 + }, + "2": { + "best_area": 1008.9664, + "vs_reference": -0.06960919703032242, + "vs_best_evaluated": 0.12463587447085178 + }, + "4": { + "best_area": 1008.9664, + "vs_reference": -0.06960919703032242, + "vs_best_evaluated": 0.12463587447085178 + }, + "8": { + "best_area": 897.1494, + "vs_reference": -0.17271818898056024, + "vs_best_evaluated": 0.0 + } + }, + "reference_area": 1084.4544, + "best_evaluated_area": 897.1494, + "best_evaluated_complete": true, + "evaluator_s": 165.2, + "model_s": 180.4, + "usage": [ + { + "input_tokens": 14976, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 227, + "reasoning_output_tokens": 143 + }, + { + "input_tokens": 15293, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 490, + "reasoning_output_tokens": 406 + }, + { + "input_tokens": 15616, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 785, + "reasoning_output_tokens": 294 + }, + { + "input_tokens": 16343, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 723, + "reasoning_output_tokens": 222 + }, + { + "input_tokens": 17079, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 826, + "reasoning_output_tokens": 746 + }, + { + "input_tokens": 17398, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 228, + "reasoning_output_tokens": 144 + }, + { + "input_tokens": 17716, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 856, + "reasoning_output_tokens": 365 + }, + { + "input_tokens": 18445, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 850, + "reasoning_output_tokens": 349 + } + ], + "isolation_breach": false, + "interface": "sharing" + }, + { + "tag": "openai_gpt-6.1-sol", + "task": "C08_gf180_sW2_sL1", + "topology": "C08", + "rep": "r2", + "n_proposals": 4, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 4, + "statuses": { + "auto_passed": 4 + }, + "drc_lvs_clean": 4, + "auto_passed": 4, + "best": { + "1": { + "best_area": 1008.9664, + "vs_reference": -0.06960919703032242, + "vs_best_evaluated": 0.12463587447085178 + }, + "2": { + "best_area": 1008.9664, + "vs_reference": -0.06960919703032242, + "vs_best_evaluated": 0.12463587447085178 + }, + "4": { + "best_area": 1008.9664, + "vs_reference": -0.06960919703032242, + "vs_best_evaluated": 0.12463587447085178 + }, + "8": { + "best_area": 1008.9664, + "vs_reference": -0.06960919703032242, + "vs_best_evaluated": 0.12463587447085178 + } + }, + "reference_area": 1084.4544, + "best_evaluated_area": 897.1494, + "best_evaluated_complete": true, + "evaluator_s": 86.7, + "model_s": 98.5, + "usage": [ + { + "input_tokens": 14974, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 155, + "reasoning_output_tokens": 71 + }, + { + "input_tokens": 15295, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 801, + "reasoning_output_tokens": 297 + }, + { + "input_tokens": 16034, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 804, + "reasoning_output_tokens": 310 + }, + { + "input_tokens": 16762, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 306, + "reasoning_output_tokens": 222 + }, + { + "input_tokens": 17085, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 349, + "reasoning_output_tokens": 342 + } + ], + "isolation_breach": false, + "interface": "sharing" + }, + { + "tag": "openai_gpt-6.1-sol", + "task": "C08_gf180_sW2_sL1", + "topology": "C08", + "rep": "r3", + "n_proposals": 5, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 5, + "statuses": { + "auto_passed": 5 + }, + "drc_lvs_clean": 5, + "auto_passed": 5, + "best": { + "1": { + "best_area": 1008.9664, + "vs_reference": -0.06960919703032242, + "vs_best_evaluated": 0.12463587447085178 + }, + "2": { + "best_area": 1008.9664, + "vs_reference": -0.06960919703032242, + "vs_best_evaluated": 0.12463587447085178 + }, + "4": { + "best_area": 897.1494, + "vs_reference": -0.17271818898056024, + "vs_best_evaluated": 0.0 + }, + "8": { + "best_area": 897.1494, + "vs_reference": -0.17271818898056024, + "vs_best_evaluated": 0.0 + } + }, + "reference_area": 1084.4544, + "best_evaluated_area": 897.1494, + "best_evaluated_complete": true, + "evaluator_s": 105.9, + "model_s": 151.7, + "usage": [ + { + "input_tokens": 14972, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 162, + "reasoning_output_tokens": 78 + }, + { + "input_tokens": 15291, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 892, + "reasoning_output_tokens": 388 + }, + { + "input_tokens": 16032, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 868, + "reasoning_output_tokens": 364 + }, + { + "input_tokens": 16776, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 391, + "reasoning_output_tokens": 307 + }, + { + "input_tokens": 17096, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 640, + "reasoning_output_tokens": 556 + }, + { + "input_tokens": 17414, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 803, + "reasoning_output_tokens": 796 + } + ], + "isolation_breach": false, + "interface": "sharing" + }, + { + "tag": "openai_gpt-6.1-sol", + "task": "C08_gf180_sW2_sL2", + "topology": "C08", + "rep": "r1", + "n_proposals": 3, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 3, + "statuses": { + "auto_passed": 3 + }, + "drc_lvs_clean": 3, + "auto_passed": 3, + "best": { + "1": { + "best_area": 1477.216, + "vs_reference": -0.061613204862381754, + "vs_best_evaluated": 0.11549238427193909 + }, + "2": { + "best_area": 1477.216, + "vs_reference": -0.061613204862381754, + "vs_best_evaluated": 0.11549238427193909 + }, + "4": { + "best_area": 1477.216, + "vs_reference": -0.061613204862381754, + "vs_best_evaluated": 0.11549238427193909 + }, + "8": { + "best_area": 1477.216, + "vs_reference": -0.061613204862381754, + "vs_best_evaluated": 0.11549238427193909 + } + }, + "reference_area": 1574.208, + "best_evaluated_area": 1324.2726, + "best_evaluated_complete": true, + "evaluator_s": 62.1, + "model_s": 68.9, + "usage": [ + { + "input_tokens": 14972, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 188, + "reasoning_output_tokens": 104 + }, + { + "input_tokens": 15292, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 739, + "reasoning_output_tokens": 235 + }, + { + "input_tokens": 16034, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 732, + "reasoning_output_tokens": 238 + }, + { + "input_tokens": 16762, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 276, + "reasoning_output_tokens": 269 + } + ], + "isolation_breach": false, + "interface": "sharing" + }, + { + "tag": "openai_gpt-6.1-sol", + "task": "C08_gf180_sW2_sL2", + "topology": "C08", + "rep": "r2", + "n_proposals": 4, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 4, + "statuses": { + "auto_passed": 4 + }, + "drc_lvs_clean": 4, + "auto_passed": 4, + "best": { + "1": { + "best_area": 1477.216, + "vs_reference": -0.061613204862381754, + "vs_best_evaluated": 0.11549238427193909 + }, + "2": { + "best_area": 1477.216, + "vs_reference": -0.061613204862381754, + "vs_best_evaluated": 0.11549238427193909 + }, + "4": { + "best_area": 1477.216, + "vs_reference": -0.061613204862381754, + "vs_best_evaluated": 0.11549238427193909 + }, + "8": { + "best_area": 1477.216, + "vs_reference": -0.061613204862381754, + "vs_best_evaluated": 0.11549238427193909 + } + }, + "reference_area": 1574.208, + "best_evaluated_area": 1324.2726, + "best_evaluated_complete": true, + "evaluator_s": 94.1, + "model_s": 85.5, + "usage": [ + { + "input_tokens": 14974, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 166, + "reasoning_output_tokens": 82 + }, + { + "input_tokens": 15294, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 764, + "reasoning_output_tokens": 263 + }, + { + "input_tokens": 16027, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 378, + "reasoning_output_tokens": 294 + }, + { + "input_tokens": 16349, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 641, + "reasoning_output_tokens": 150 + }, + { + "input_tokens": 17078, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 352, + "reasoning_output_tokens": 345 + } + ], + "isolation_breach": false, + "interface": "sharing" + }, + { + "tag": "openai_gpt-6.1-sol", + "task": "C08_gf180_sW2_sL2", + "topology": "C08", + "rep": "r3", + "n_proposals": 6, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 6, + "statuses": { + "auto_passed": 6 + }, + "drc_lvs_clean": 6, + "auto_passed": 6, + "best": { + "1": { + "best_area": 1477.216, + "vs_reference": -0.061613204862381754, + "vs_best_evaluated": 0.11549238427193909 + }, + "2": { + "best_area": 1477.216, + "vs_reference": -0.061613204862381754, + "vs_best_evaluated": 0.11549238427193909 + }, + "4": { + "best_area": 1324.2726, + "vs_reference": -0.1587689809732895, + "vs_best_evaluated": 0.0 + }, + "8": { + "best_area": 1324.2726, + "vs_reference": -0.1587689809732895, + "vs_best_evaluated": 0.0 + } + }, + "reference_area": 1574.208, + "best_evaluated_area": 1324.2726, + "best_evaluated_complete": true, + "evaluator_s": 126.6, + "model_s": 191.8, + "usage": [ + { + "input_tokens": 14972, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 175, + "reasoning_output_tokens": 91 + }, + { + "input_tokens": 15292, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 253, + "reasoning_output_tokens": 169 + }, + { + "input_tokens": 15618, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 471, + "reasoning_output_tokens": 387 + }, + { + "input_tokens": 15937, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 841, + "reasoning_output_tokens": 350 + }, + { + "input_tokens": 16665, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 598, + "reasoning_output_tokens": 516 + }, + { + "input_tokens": 16984, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1414, + "reasoning_output_tokens": 913 + }, + { + "input_tokens": 17716, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 954, + "reasoning_output_tokens": 947 + } + ], + "isolation_breach": false, + "interface": "sharing" + }, + { + "tag": "openai_gpt-6.1-sol", + "task": "C08_ihp130_sW2_sL2", + "topology": "C08", + "rep": "r1", + "n_proposals": 7, + "first_legal": true, + "n_rejected": 1, + "n_duplicates": 0, + "eda_verifications": 6, + "statuses": { + "auto_passed": 6, + "rejected_program": 1 + }, + "drc_lvs_clean": 6, + "auto_passed": 6, + "best": { + "1": { + "best_area": 748.9185, + "vs_reference": -0.0548105471399859, + "vs_best_evaluated": 0.10305966670422473 + }, + "2": { + "best_area": 748.9185, + "vs_reference": -0.0548105471399859, + "vs_best_evaluated": 0.10305966670422473 + }, + "4": { + "best_area": 678.9465, + "vs_reference": -0.1431202849759733, + "vs_best_evaluated": 0.0 + }, + "8": { + "best_area": 678.9465, + "vs_reference": -0.1431202849759733, + "vs_best_evaluated": 0.0 + } + }, + "reference_area": 792.3475, + "best_evaluated_area": 678.9465, + "best_evaluated_complete": true, + "evaluator_s": 66.1, + "model_s": 154.1, + "usage": [ + { + "input_tokens": 14974, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 164, + "reasoning_output_tokens": 80 + }, + { + "input_tokens": 15292, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 298, + "reasoning_output_tokens": 214 + }, + { + "input_tokens": 15614, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 288, + "reasoning_output_tokens": 204 + }, + { + "input_tokens": 15934, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 385, + "reasoning_output_tokens": 301 + }, + { + "input_tokens": 16065, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 826, + "reasoning_output_tokens": 335 + }, + { + "input_tokens": 16792, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 1000, + "reasoning_output_tokens": 499 + }, + { + "input_tokens": 17527, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 824, + "reasoning_output_tokens": 333 + }, + { + "input_tokens": 18250, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 153, + "reasoning_output_tokens": 146 + } + ], + "isolation_breach": false, + "interface": "sharing" + }, + { + "tag": "openai_gpt-6.1-sol", + "task": "C08_ihp130_sW2_sL2", + "topology": "C08", + "rep": "r2", + "n_proposals": 5, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 5, + "statuses": { + "auto_passed": 5 + }, + "drc_lvs_clean": 5, + "auto_passed": 5, + "best": { + "1": { + "best_area": 748.9185, + "vs_reference": -0.0548105471399859, + "vs_best_evaluated": 0.10305966670422473 + }, + "2": { + "best_area": 748.9185, + "vs_reference": -0.0548105471399859, + "vs_best_evaluated": 0.10305966670422473 + }, + "4": { + "best_area": 748.9185, + "vs_reference": -0.0548105471399859, + "vs_best_evaluated": 0.10305966670422473 + }, + "8": { + "best_area": 748.9185, + "vs_reference": -0.0548105471399859, + "vs_best_evaluated": 0.10305966670422473 + } + }, + "reference_area": 792.3475, + "best_evaluated_area": 678.9465, + "best_evaluated_complete": true, + "evaluator_s": 57.1, + "model_s": 128.7, + "usage": [ + { + "input_tokens": 14972, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 165, + "reasoning_output_tokens": 81 + }, + { + "input_tokens": 15294, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 475, + "reasoning_output_tokens": 391 + }, + { + "input_tokens": 15614, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 328, + "reasoning_output_tokens": 246 + }, + { + "input_tokens": 15928, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 933, + "reasoning_output_tokens": 439 + }, + { + "input_tokens": 16660, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 783, + "reasoning_output_tokens": 289 + }, + { + "input_tokens": 17390, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 422, + "reasoning_output_tokens": 415 + } + ], + "isolation_breach": false, + "interface": "sharing" + }, + { + "tag": "openai_gpt-6.1-sol", + "task": "C08_ihp130_sW2_sL2", + "topology": "C08", + "rep": "r3", + "n_proposals": 7, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 7, + "statuses": { + "auto_passed": 7 + }, + "drc_lvs_clean": 7, + "auto_passed": 7, + "best": { + "1": { + "best_area": 748.9185, + "vs_reference": -0.0548105471399859, + "vs_best_evaluated": 0.10305966670422473 + }, + "2": { + "best_area": 748.9185, + "vs_reference": -0.0548105471399859, + "vs_best_evaluated": 0.10305966670422473 + }, + "4": { + "best_area": 678.9465, + "vs_reference": -0.1431202849759733, + "vs_best_evaluated": 0.0 + }, + "8": { + "best_area": 678.9465, + "vs_reference": -0.1431202849759733, + "vs_best_evaluated": 0.0 + } + }, + "reference_area": 792.3475, + "best_evaluated_area": 678.9465, + "best_evaluated_complete": true, + "evaluator_s": 79.4, + "model_s": 204.7, + "usage": [ + { + "input_tokens": 14974, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 198, + "reasoning_output_tokens": 114 + }, + { + "input_tokens": 15296, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 271, + "reasoning_output_tokens": 187 + }, + { + "input_tokens": 15612, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 526, + "reasoning_output_tokens": 442 + }, + { + "input_tokens": 15938, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 956, + "reasoning_output_tokens": 462 + }, + { + "input_tokens": 16660, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 791, + "reasoning_output_tokens": 297 + }, + { + "input_tokens": 17392, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 914, + "reasoning_output_tokens": 410 + }, + { + "input_tokens": 18136, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1342, + "reasoning_output_tokens": 848 + }, + { + "input_tokens": 18862, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 201, + "reasoning_output_tokens": 194 + } + ], + "isolation_breach": false, + "interface": "sharing" + }, + { + "tag": "openai_gpt-6.1-sol", + "task": "C08_sky130_sW2_sL1", + "topology": "C08", + "rep": "r1", + "n_proposals": 7, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 7, + "statuses": { + "auto_passed": 7 + }, + "drc_lvs_clean": 7, + "auto_passed": 7, + "best": { + "1": { + "best_area": 418.3469, + "vs_reference": -0.07208552624574582, + "vs_best_evaluated": 0.14586801069429955 + }, + "2": { + "best_area": 418.3469, + "vs_reference": -0.07208552624574582, + "vs_best_evaluated": 0.14586801069429955 + }, + "4": { + "best_area": 365.0917, + "vs_reference": -0.19020823943586995, + "vs_best_evaluated": 0.0 + }, + "8": { + "best_area": 365.0917, + "vs_reference": -0.19020823943586995, + "vs_best_evaluated": 0.0 + } + }, + "reference_area": 450.8464, + "best_evaluated_area": 365.0917, + "best_evaluated_complete": true, + "evaluator_s": 134.7, + "model_s": 180.8, + "usage": [ + { + "input_tokens": 14967, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 203, + "reasoning_output_tokens": 119 + }, + { + "input_tokens": 15289, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 1007, + "reasoning_output_tokens": 516 + }, + { + "input_tokens": 16016, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 243, + "reasoning_output_tokens": 159 + }, + { + "input_tokens": 16338, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 400, + "reasoning_output_tokens": 316 + }, + { + "input_tokens": 16654, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 700, + "reasoning_output_tokens": 209 + }, + { + "input_tokens": 17381, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 884, + "reasoning_output_tokens": 383 + }, + { + "input_tokens": 18122, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 829, + "reasoning_output_tokens": 338 + }, + { + "input_tokens": 18849, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 606, + "reasoning_output_tokens": 599 + } + ], + "isolation_breach": false, + "interface": "sharing" + }, + { + "tag": "openai_gpt-6.1-sol", + "task": "C08_sky130_sW2_sL1", + "topology": "C08", + "rep": "r2", + "n_proposals": 7, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 7, + "statuses": { + "auto_passed": 7 + }, + "drc_lvs_clean": 7, + "auto_passed": 7, + "best": { + "1": { + "best_area": 418.3469, + "vs_reference": -0.07208552624574582, + "vs_best_evaluated": 0.14586801069429955 + }, + "2": { + "best_area": 418.3469, + "vs_reference": -0.07208552624574582, + "vs_best_evaluated": 0.14586801069429955 + }, + "4": { + "best_area": 365.0917, + "vs_reference": -0.19020823943586995, + "vs_best_evaluated": 0.0 + }, + "8": { + "best_area": 365.0917, + "vs_reference": -0.19020823943586995, + "vs_best_evaluated": 0.0 + } + }, + "reference_area": 450.8464, + "best_evaluated_area": 365.0917, + "best_evaluated_complete": true, + "evaluator_s": 136.4, + "model_s": 172.5, + "usage": [ + { + "input_tokens": 14971, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 185, + "reasoning_output_tokens": 101 + }, + { + "input_tokens": 15293, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 259, + "reasoning_output_tokens": 175 + }, + { + "input_tokens": 15611, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 249, + "reasoning_output_tokens": 165 + }, + { + "input_tokens": 15933, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 830, + "reasoning_output_tokens": 339 + }, + { + "input_tokens": 16654, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 945, + "reasoning_output_tokens": 444 + }, + { + "input_tokens": 17391, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 939, + "reasoning_output_tokens": 438 + }, + { + "input_tokens": 18134, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1089, + "reasoning_output_tokens": 598 + }, + { + "input_tokens": 18859, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 264, + "reasoning_output_tokens": 257 + } + ], + "isolation_breach": false, + "interface": "sharing" + }, + { + "tag": "openai_gpt-6.1-sol", + "task": "C08_sky130_sW2_sL1", + "topology": "C08", + "rep": "r3", + "n_proposals": 7, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 7, + "statuses": { + "auto_passed": 7 + }, + "drc_lvs_clean": 7, + "auto_passed": 7, + "best": { + "1": { + "best_area": 418.3469, + "vs_reference": -0.07208552624574582, + "vs_best_evaluated": 0.14586801069429955 + }, + "2": { + "best_area": 418.3469, + "vs_reference": -0.07208552624574582, + "vs_best_evaluated": 0.14586801069429955 + }, + "4": { + "best_area": 365.0917, + "vs_reference": -0.19020823943586995, + "vs_best_evaluated": 0.0 + }, + "8": { + "best_area": 365.0917, + "vs_reference": -0.19020823943586995, + "vs_best_evaluated": 0.0 + } + }, + "reference_area": 450.8464, + "best_evaluated_area": 365.0917, + "best_evaluated_complete": true, + "evaluator_s": 136.4, + "model_s": 177.6, + "usage": [ + { + "input_tokens": 14969, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 160, + "reasoning_output_tokens": 76 + }, + { + "input_tokens": 15291, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 413, + "reasoning_output_tokens": 329 + }, + { + "input_tokens": 15613, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 213, + "reasoning_output_tokens": 129 + }, + { + "input_tokens": 15933, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 808, + "reasoning_output_tokens": 317 + }, + { + "input_tokens": 16660, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 900, + "reasoning_output_tokens": 409 + }, + { + "input_tokens": 17387, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 403, + "reasoning_output_tokens": 323 + }, + { + "input_tokens": 17701, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 807, + "reasoning_output_tokens": 316 + }, + { + "input_tokens": 18430, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 746, + "reasoning_output_tokens": 739 + } + ], + "isolation_breach": false, + "interface": "sharing" + }, + { + "tag": "openai_gpt-6.1-sol", + "task": "C08_sky130_sW2_sL2", + "topology": "C08", + "rep": "r1", + "n_proposals": 6, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 6, + "statuses": { + "auto_passed": 6 + }, + "drc_lvs_clean": 6, + "auto_passed": 6, + "best": { + "1": { + "best_area": 608.7149, + "vs_reference": -0.062058699173362264, + "vs_best_evaluated": 0.13364103102751868 + }, + "2": { + "best_area": 536.9556, + "vs_reference": -0.17262936400908246, + "vs_best_evaluated": 0.0 + }, + "4": { + "best_area": 536.9556, + "vs_reference": -0.17262936400908246, + "vs_best_evaluated": 0.0 + }, + "8": { + "best_area": 536.9556, + "vs_reference": -0.17262936400908246, + "vs_best_evaluated": 0.0 + } + }, + "reference_area": 648.9904, + "best_evaluated_area": 536.9556, + "best_evaluated_complete": true, + "evaluator_s": 118.6, + "model_s": 166.7, + "usage": [ + { + "input_tokens": 14973, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 181, + "reasoning_output_tokens": 97 + }, + { + "input_tokens": 15287, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 392, + "reasoning_output_tokens": 308 + }, + { + "input_tokens": 15611, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 820, + "reasoning_output_tokens": 329 + }, + { + "input_tokens": 16340, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 370, + "reasoning_output_tokens": 286 + }, + { + "input_tokens": 16658, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1365, + "reasoning_output_tokens": 864 + }, + { + "input_tokens": 17393, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 1147, + "reasoning_output_tokens": 656 + }, + { + "input_tokens": 18122, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 300, + "reasoning_output_tokens": 293 + } + ], + "isolation_breach": false, + "interface": "sharing" + }, + { + "tag": "openai_gpt-6.1-sol", + "task": "C08_sky130_sW2_sL2", + "topology": "C08", + "rep": "r2", + "n_proposals": 6, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 6, + "statuses": { + "auto_passed": 6 + }, + "drc_lvs_clean": 6, + "auto_passed": 6, + "best": { + "1": { + "best_area": 608.7149, + "vs_reference": -0.062058699173362264, + "vs_best_evaluated": 0.13364103102751868 + }, + "2": { + "best_area": 536.9556, + "vs_reference": -0.17262936400908246, + "vs_best_evaluated": 0.0 + }, + "4": { + "best_area": 536.9556, + "vs_reference": -0.17262936400908246, + "vs_best_evaluated": 0.0 + }, + "8": { + "best_area": 536.9556, + "vs_reference": -0.17262936400908246, + "vs_best_evaluated": 0.0 + } + }, + "reference_area": 648.9904, + "best_evaluated_area": 536.9556, + "best_evaluated_complete": true, + "evaluator_s": 120.0, + "model_s": 146.0, + "usage": [ + { + "input_tokens": 14973, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 177, + "reasoning_output_tokens": 93 + }, + { + "input_tokens": 15291, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 262, + "reasoning_output_tokens": 178 + }, + { + "input_tokens": 15611, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 786, + "reasoning_output_tokens": 295 + }, + { + "input_tokens": 16334, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 996, + "reasoning_output_tokens": 505 + }, + { + "input_tokens": 17061, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 264, + "reasoning_output_tokens": 180 + }, + { + "input_tokens": 17383, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1007, + "reasoning_output_tokens": 516 + }, + { + "input_tokens": 18112, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 351, + "reasoning_output_tokens": 344 + } + ], + "isolation_breach": false, + "interface": "sharing" + }, + { + "tag": "openai_gpt-6.1-sol", + "task": "C08_sky130_sW2_sL2", + "topology": "C08", + "rep": "r3", + "n_proposals": 7, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 7, + "statuses": { + "auto_passed": 7 + }, + "drc_lvs_clean": 7, + "auto_passed": 7, + "best": { + "1": { + "best_area": 608.7149, + "vs_reference": -0.062058699173362264, + "vs_best_evaluated": 0.13364103102751868 + }, + "2": { + "best_area": 608.7149, + "vs_reference": -0.062058699173362264, + "vs_best_evaluated": 0.13364103102751868 + }, + "4": { + "best_area": 536.9556, + "vs_reference": -0.17262936400908246, + "vs_best_evaluated": 0.0 + }, + "8": { + "best_area": 536.9556, + "vs_reference": -0.17262936400908246, + "vs_best_evaluated": 0.0 + } + }, + "reference_area": 648.9904, + "best_evaluated_area": 536.9556, + "best_evaluated_complete": true, + "evaluator_s": 141.1, + "model_s": 191.0, + "usage": [ + { + "input_tokens": 14969, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 161, + "reasoning_output_tokens": 77 + }, + { + "input_tokens": 15289, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 779, + "reasoning_output_tokens": 288 + }, + { + "input_tokens": 16018, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 384, + "reasoning_output_tokens": 300 + }, + { + "input_tokens": 16336, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 866, + "reasoning_output_tokens": 375 + }, + { + "input_tokens": 17069, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1108, + "reasoning_output_tokens": 617 + }, + { + "input_tokens": 17792, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 1280, + "reasoning_output_tokens": 779 + }, + { + "input_tokens": 18527, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 368, + "reasoning_output_tokens": 288 + }, + { + "input_tokens": 18843, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 161, + "reasoning_output_tokens": 154 + } + ], + "isolation_breach": false, + "interface": "sharing" + }, + { + "tag": "openai_gpt-6.1-sol", + "task": "C09_gf180_sW2_sL1", + "topology": "C09", + "rep": "r1", + "n_proposals": 8, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 8, + "statuses": { + "auto_passed": 8 + }, + "drc_lvs_clean": 8, + "auto_passed": 8, + "best": { + "1": { + "best_area": 1747.3808, + "vs_reference": -0.010070493454179319, + "vs_best_evaluated": 0.18108166748339793 + }, + "2": { + "best_area": 1638.4852, + "vs_reference": -0.07176223664662529, + "vs_best_evaluated": 0.1074774497710338 + }, + "4": { + "best_area": 1578.2936, + "vs_reference": -0.10586209678369651, + "vs_best_evaluated": 0.06679301779347413 + }, + "8": { + "best_area": 1526.6916, + "vs_reference": -0.1350957603313201, + "vs_best_evaluated": 0.03191442910491915 + } + }, + "reference_area": 1765.1568, + "best_evaluated_area": 1479.475, + "best_evaluated_complete": true, + "evaluator_s": 179.0, + "model_s": 420.4, + "usage": [ + { + "input_tokens": 15179, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 600, + "reasoning_output_tokens": 516 + }, + { + "input_tokens": 15498, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 2233, + "reasoning_output_tokens": 1030 + }, + { + "input_tokens": 16940, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 1846, + "reasoning_output_tokens": 674 + }, + { + "input_tokens": 18345, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1918, + "reasoning_output_tokens": 715 + }, + { + "input_tokens": 19789, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1849, + "reasoning_output_tokens": 646 + }, + { + "input_tokens": 21225, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1877, + "reasoning_output_tokens": 705 + }, + { + "input_tokens": 22633, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 2737, + "reasoning_output_tokens": 1552 + }, + { + "input_tokens": 24054, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 2151, + "reasoning_output_tokens": 979 + } + ], + "isolation_breach": false, + "interface": "sharing" + }, + { + "tag": "openai_gpt-6.1-sol", + "task": "C09_gf180_sW2_sL1", + "topology": "C09", + "rep": "r2", + "n_proposals": 7, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 7, + "statuses": { + "auto_passed": 7 + }, + "drc_lvs_clean": 7, + "auto_passed": 7, + "best": { + "1": { + "best_area": 1791.8768, + "vs_reference": 0.01513746540817218, + "vs_best_evaluated": 0.2111572010341507 + }, + "2": { + "best_area": 1729.6048, + "vs_reference": -0.020140986908358416, + "vs_best_evaluated": 0.1690665945690195 + }, + "4": { + "best_area": 1729.6048, + "vs_reference": -0.020140986908358416, + "vs_best_evaluated": 0.1690665945690195 + }, + "8": { + "best_area": 1548.7348, + "vs_reference": -0.1226078045871053, + "vs_best_evaluated": 0.04681376839757356 + } + }, + "reference_area": 1765.1568, + "best_evaluated_area": 1479.475, + "best_evaluated_complete": true, + "evaluator_s": 169.7, + "model_s": 412.1, + "usage": [ + { + "input_tokens": 15173, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 2171, + "reasoning_output_tokens": 964 + }, + { + "input_tokens": 16621, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 1641, + "reasoning_output_tokens": 457 + }, + { + "input_tokens": 18042, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 2369, + "reasoning_output_tokens": 1034 + }, + { + "input_tokens": 19612, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1081, + "reasoning_output_tokens": 445 + }, + { + "input_tokens": 20489, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1686, + "reasoning_output_tokens": 516 + }, + { + "input_tokens": 21893, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1726, + "reasoning_output_tokens": 556 + }, + { + "input_tokens": 23302, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 2467, + "reasoning_output_tokens": 1315 + }, + { + "input_tokens": 24688, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1341, + "reasoning_output_tokens": 1334 + } + ], + "isolation_breach": false, + "interface": "sharing" + }, + { + "tag": "openai_gpt-6.1-sol", + "task": "C09_gf180_sW2_sL1", + "topology": "C09", + "rep": "r3", + "n_proposals": 7, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 7, + "statuses": { + "auto_passed": 7 + }, + "drc_lvs_clean": 7, + "auto_passed": 7, + "best": { + "1": { + "best_area": 1791.8768, + "vs_reference": 0.01513746540817218, + "vs_best_evaluated": 0.2111572010341507 + }, + "2": { + "best_area": 1704.3112, + "vs_reference": -0.03447036546554949, + "vs_best_evaluated": 0.15197025972050904 + }, + "4": { + "best_area": 1588.5636, + "vs_reference": -0.10004391677838476, + "vs_best_evaluated": 0.07373466939285889 + }, + "8": { + "best_area": 1526.6916, + "vs_reference": -0.1350957603313201, + "vs_best_evaluated": 0.03191442910491915 + } + }, + "reference_area": 1765.1568, + "best_evaluated_area": 1479.475, + "best_evaluated_complete": true, + "evaluator_s": 160.6, + "model_s": 492.4, + "usage": [ + { + "input_tokens": 15179, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1699, + "reasoning_output_tokens": 482 + }, + { + "input_tokens": 16631, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 2465, + "reasoning_output_tokens": 1242 + }, + { + "input_tokens": 18087, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 2025, + "reasoning_output_tokens": 795 + }, + { + "input_tokens": 19556, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1970, + "reasoning_output_tokens": 740 + }, + { + "input_tokens": 21023, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 2687, + "reasoning_output_tokens": 1434 + }, + { + "input_tokens": 22513, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 2420, + "reasoning_output_tokens": 1220 + }, + { + "input_tokens": 23956, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 2162, + "reasoning_output_tokens": 932 + }, + { + "input_tokens": 25421, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1458, + "reasoning_output_tokens": 1451 + } + ], + "isolation_breach": false, + "interface": "sharing" + }, + { + "tag": "openai_gpt-6.1-sol", + "task": "C09_gf180_sW2_sL2", + "topology": "C09", + "rep": "r1", + "n_proposals": 5, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 5, + "statuses": { + "auto_passed": 5 + }, + "drc_lvs_clean": 5, + "auto_passed": 5, + "best": { + "1": { + "best_area": 2543.7456, + "vs_reference": -0.006939625260235838, + "vs_best_evaluated": 0.17566757004310185 + }, + "2": { + "best_area": 2525.9696, + "vs_reference": -0.013879250520471897, + "vs_best_evaluated": 0.16745186375349252 + }, + "4": { + "best_area": 2517.526, + "vs_reference": -0.01717557251908408, + "vs_best_evaluated": 0.16354940326592793 + }, + "8": { + "best_area": 2407.8156, + "vs_reference": -0.06000574033808659, + "vs_best_evaluated": 0.11284348386248744 + } + }, + "reference_area": 2561.5216, + "best_evaluated_area": 2163.6606, + "best_evaluated_complete": true, + "evaluator_s": 112.2, + "model_s": 336.1, + "usage": [ + { + "input_tokens": 15177, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 717, + "reasoning_output_tokens": 633 + }, + { + "input_tokens": 15496, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 2352, + "reasoning_output_tokens": 1187 + }, + { + "input_tokens": 16898, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 2106, + "reasoning_output_tokens": 842 + }, + { + "input_tokens": 18401, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 1660, + "reasoning_output_tokens": 463 + }, + { + "input_tokens": 19832, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 2642, + "reasoning_output_tokens": 1470 + }, + { + "input_tokens": 21245, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1908, + "reasoning_output_tokens": 1901 + } + ], + "isolation_breach": false, + "interface": "sharing" + }, + { + "tag": "openai_gpt-6.1-sol", + "task": "C09_gf180_sW2_sL2", + "topology": "C09", + "rep": "r2", + "n_proposals": 8, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 8, + "statuses": { + "auto_passed": 8 + }, + "drc_lvs_clean": 8, + "auto_passed": 8, + "best": { + "1": { + "best_area": 2543.7456, + "vs_reference": -0.006939625260235838, + "vs_best_evaluated": 0.17566757004310185 + }, + "2": { + "best_area": 2525.9696, + "vs_reference": -0.013879250520471897, + "vs_best_evaluated": 0.16745186375349252 + }, + "4": { + "best_area": 2508.1936, + "vs_reference": -0.020818875780707846, + "vs_best_evaluated": 0.1592361574638832 + }, + "8": { + "best_area": 2403.3108, + "vs_reference": -0.06176438254512473, + "vs_best_evaluated": 0.11076145676452209 + } + }, + "reference_area": 2561.5216, + "best_evaluated_area": 2163.6606, + "best_evaluated_complete": true, + "evaluator_s": 187.7, + "model_s": 478.4, + "usage": [ + { + "input_tokens": 15177, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1636, + "reasoning_output_tokens": 1009 + }, + { + "input_tokens": 16041, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1632, + "reasoning_output_tokens": 486 + }, + { + "input_tokens": 17426, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 2305, + "reasoning_output_tokens": 1034 + }, + { + "input_tokens": 18930, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1914, + "reasoning_output_tokens": 643 + }, + { + "input_tokens": 20440, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 2955, + "reasoning_output_tokens": 1684 + }, + { + "input_tokens": 21950, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 2132, + "reasoning_output_tokens": 884 + }, + { + "input_tokens": 23435, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 2132, + "reasoning_output_tokens": 918 + }, + { + "input_tokens": 24884, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 2214, + "reasoning_output_tokens": 1034 + } + ], + "isolation_breach": false, + "interface": "sharing" + }, + { + "tag": "openai_gpt-6.1-sol", + "task": "C09_gf180_sW2_sL2", + "topology": "C09", + "rep": "r3", + "n_proposals": 8, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 8, + "statuses": { + "auto_passed": 8 + }, + "drc_lvs_clean": 8, + "auto_passed": 8, + "best": { + "1": { + "best_area": 2543.7456, + "vs_reference": -0.006939625260235838, + "vs_best_evaluated": 0.17566757004310185 + }, + "2": { + "best_area": 2525.9696, + "vs_reference": -0.013879250520471897, + "vs_best_evaluated": 0.16745186375349252 + }, + "4": { + "best_area": 2517.526, + "vs_reference": -0.01717557251908408, + "vs_best_evaluated": 0.16354940326592793 + }, + "8": { + "best_area": 2403.3108, + "vs_reference": -0.06176438254512473, + "vs_best_evaluated": 0.11076145676452209 + } + }, + "reference_area": 2561.5216, + "best_evaluated_area": 2163.6606, + "best_evaluated_complete": true, + "evaluator_s": 190.2, + "model_s": 481.0, + "usage": [ + { + "input_tokens": 15179, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 888, + "reasoning_output_tokens": 804 + }, + { + "input_tokens": 15498, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1934, + "reasoning_output_tokens": 784 + }, + { + "input_tokens": 16881, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 2062, + "reasoning_output_tokens": 865 + }, + { + "input_tokens": 18316, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1768, + "reasoning_output_tokens": 504 + }, + { + "input_tokens": 19819, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 2902, + "reasoning_output_tokens": 1705 + }, + { + "input_tokens": 21252, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 2747, + "reasoning_output_tokens": 1521 + }, + { + "input_tokens": 22715, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1717, + "reasoning_output_tokens": 516 + }, + { + "input_tokens": 24157, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 2551, + "reasoning_output_tokens": 1350 + } + ], + "isolation_breach": false, + "interface": "sharing" + }, + { + "tag": "openai_gpt-6.1-sol", + "task": "C09_ihp130_sW2_sL1", + "topology": "C09", + "rep": "r1", + "n_proposals": 6, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 6, + "statuses": { + "auto_passed": 6 + }, + "drc_lvs_clean": 6, + "auto_passed": 6, + "best": { + "1": { + "best_area": 2744.2188, + "vs_reference": -0.003010892291145706, + "vs_best_evaluated": 0.15658006817630743 + }, + "2": { + "best_area": 2735.9313, + "vs_reference": -0.006021784582291301, + "vs_best_evaluated": 0.15308721355589205 + }, + "4": { + "best_area": 2568.6444, + "vs_reference": -0.06679799424982236, + "vs_best_evaluated": 0.08258237837037297 + }, + "8": { + "best_area": 2568.6444, + "vs_reference": -0.06679799424982236, + "vs_best_evaluated": 0.08258237837037297 + } + }, + "reference_area": 2752.5063, + "best_evaluated_area": 2372.7011, + "best_evaluated_complete": true, + "evaluator_s": 225.6, + "model_s": 486.5, + "usage": [ + { + "input_tokens": 15172, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1040, + "reasoning_output_tokens": 956 + }, + { + "input_tokens": 15497, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 2980, + "reasoning_output_tokens": 979 + }, + { + "input_tokens": 17733, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 3012, + "reasoning_output_tokens": 1011 + }, + { + "input_tokens": 19973, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 2472, + "reasoning_output_tokens": 471 + }, + { + "input_tokens": 22207, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 4042, + "reasoning_output_tokens": 1034 + }, + { + "input_tokens": 25454, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 2783, + "reasoning_output_tokens": 782 + }, + { + "input_tokens": 27688, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 1509, + "reasoning_output_tokens": 1502 + } + ], + "isolation_breach": false, + "interface": "sharing" + }, + { + "tag": "openai_gpt-6.1-sol", + "task": "C09_ihp130_sW2_sL1", + "topology": "C09", + "rep": "r2", + "n_proposals": 6, + "first_legal": true, + "n_rejected": 1, + "n_duplicates": 0, + "eda_verifications": 5, + "statuses": { + "auto_passed": 5, + "rejected_program": 1 + }, + "drc_lvs_clean": 5, + "auto_passed": 5, + "best": { + "1": { + "best_area": 2744.2188, + "vs_reference": -0.003010892291145706, + "vs_best_evaluated": 0.15658006817630743 + }, + "2": { + "best_area": 2735.9313, + "vs_reference": -0.006021784582291301, + "vs_best_evaluated": 0.15308721355589205 + }, + "4": { + "best_area": 2727.6438, + "vs_reference": -0.009032676873437229, + "vs_best_evaluated": 0.14959435893547646 + }, + "8": { + "best_area": 2727.6438, + "vs_reference": -0.009032676873437229, + "vs_best_evaluated": 0.14959435893547646 + } + }, + "reference_area": 2752.5063, + "best_evaluated_area": 2372.7011, + "best_evaluated_complete": true, + "evaluator_s": 191.3, + "model_s": 448.0, + "usage": [ + { + "input_tokens": 15172, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 785, + "reasoning_output_tokens": 701 + }, + { + "input_tokens": 15495, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 2865, + "reasoning_output_tokens": 864 + }, + { + "input_tokens": 17729, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 2685, + "reasoning_output_tokens": 684 + }, + { + "input_tokens": 19967, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 2997, + "reasoning_output_tokens": 947 + }, + { + "input_tokens": 22258, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 3350, + "reasoning_output_tokens": 1300 + }, + { + "input_tokens": 24351, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 4038, + "reasoning_output_tokens": 981 + }, + { + "input_tokens": 27647, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 419, + "reasoning_output_tokens": 412 + } + ], + "isolation_breach": false, + "interface": "sharing" + }, + { + "tag": "openai_gpt-6.1-sol", + "task": "C09_ihp130_sW2_sL1", + "topology": "C09", + "rep": "r3", + "n_proposals": 7, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 7, + "statuses": { + "auto_passed": 7 + }, + "drc_lvs_clean": 7, + "auto_passed": 7, + "best": { + "1": { + "best_area": 2735.9313, + "vs_reference": -0.006021784582291301, + "vs_best_evaluated": 0.15308721355589205 + }, + "2": { + "best_area": 2735.9313, + "vs_reference": -0.006021784582291301, + "vs_best_evaluated": 0.15308721355589205 + }, + "4": { + "best_area": 2365.4923, + "vs_reference": -0.1406042195071452, + "vs_best_evaluated": -0.003038225084482926 + }, + "8": { + "best_area": 2365.4923, + "vs_reference": -0.1406042195071452, + "vs_best_evaluated": -0.003038225084482926 + } + }, + "reference_area": 2752.5063, + "best_evaluated_area": 2372.7011, + "best_evaluated_complete": true, + "evaluator_s": 249.2, + "model_s": 574.6, + "usage": [ + { + "input_tokens": 15174, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 3926, + "reasoning_output_tokens": 940 + }, + { + "input_tokens": 18395, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 3768, + "reasoning_output_tokens": 782 + }, + { + "input_tokens": 21616, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 3038, + "reasoning_output_tokens": 1034 + }, + { + "input_tokens": 23859, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 2636, + "reasoning_output_tokens": 632 + }, + { + "input_tokens": 26102, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 3530, + "reasoning_output_tokens": 497 + }, + { + "input_tokens": 29376, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 3038, + "reasoning_output_tokens": 1034 + }, + { + "input_tokens": 31615, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 3097, + "reasoning_output_tokens": 1093 + }, + { + "input_tokens": 33856, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 686, + "reasoning_output_tokens": 679 + } + ], + "isolation_breach": false, + "interface": "sharing" + }, + { + "tag": "openai_gpt-6.1-sol", + "task": "C09_ihp130_sW2_sL2", + "topology": "C09", + "rep": "r1", + "n_proposals": 7, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 7, + "statuses": { + "auto_passed": 7 + }, + "drc_lvs_clean": 7, + "auto_passed": 7, + "best": { + "1": { + "best_area": 3817.5312, + "vs_reference": -0.004323067412085102, + "vs_best_evaluated": 0.15210515732376617 + }, + "2": { + "best_area": 3585.6812, + "vs_reference": -0.06479348264287821, + "vs_best_evaluated": 0.08213439173434156 + }, + "4": { + "best_area": 3217.4321, + "vs_reference": -0.1608390982795651, + "vs_best_evaluated": -0.029000701880567248 + }, + "8": { + "best_area": 3217.4321, + "vs_reference": -0.1608390982795651, + "vs_best_evaluated": -0.029000701880567248 + } + }, + "reference_area": 3834.1063, + "best_evaluated_area": 3313.5267, + "best_evaluated_complete": true, + "evaluator_s": 255.9, + "model_s": 676.0, + "usage": [ + { + "input_tokens": 15176, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 4299, + "reasoning_output_tokens": 1357 + }, + { + "input_tokens": 18351, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 3547, + "reasoning_output_tokens": 605 + }, + { + "input_tokens": 21534, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 3844, + "reasoning_output_tokens": 902 + }, + { + "input_tokens": 24709, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 3348, + "reasoning_output_tokens": 401 + }, + { + "input_tokens": 27897, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 3825, + "reasoning_output_tokens": 870 + }, + { + "input_tokens": 31084, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 4507, + "reasoning_output_tokens": 1552 + }, + { + "input_tokens": 34278, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 3990, + "reasoning_output_tokens": 1034 + }, + { + "input_tokens": 37469, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 523, + "reasoning_output_tokens": 516 + } + ], + "isolation_breach": false, + "interface": "sharing" + }, + { + "tag": "openai_gpt-6.1-sol", + "task": "C09_ihp130_sW2_sL2", + "topology": "C09", + "rep": "r2", + "n_proposals": 7, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 7, + "statuses": { + "auto_passed": 7 + }, + "drc_lvs_clean": 7, + "auto_passed": 7, + "best": { + "1": { + "best_area": 3825.8188, + "vs_reference": -0.002161520665193817, + "vs_best_evaluated": 0.15460629908308876 + }, + "2": { + "best_area": 3817.5312, + "vs_reference": -0.004323067412085102, + "vs_best_evaluated": 0.15210515732376617 + }, + "4": { + "best_area": 3585.6812, + "vs_reference": -0.06479348264287821, + "vs_best_evaluated": 0.08213439173434156 + }, + "8": { + "best_area": 3217.4321, + "vs_reference": -0.1608390982795651, + "vs_best_evaluated": -0.029000701880567248 + } + }, + "reference_area": 3834.1063, + "best_evaluated_area": 3313.5267, + "best_evaluated_complete": true, + "evaluator_s": 258.2, + "model_s": 514.5, + "usage": [ + { + "input_tokens": 15174, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 701, + "reasoning_output_tokens": 617 + }, + { + "input_tokens": 15495, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 2872, + "reasoning_output_tokens": 918 + }, + { + "input_tokens": 17684, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 2458, + "reasoning_output_tokens": 504 + }, + { + "input_tokens": 19877, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 2470, + "reasoning_output_tokens": 469 + }, + { + "input_tokens": 22115, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 3158, + "reasoning_output_tokens": 1157 + }, + { + "input_tokens": 24351, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 3782, + "reasoning_output_tokens": 774 + }, + { + "input_tokens": 27598, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 4042, + "reasoning_output_tokens": 1034 + }, + { + "input_tokens": 30845, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 523, + "reasoning_output_tokens": 516 + } + ], + "isolation_breach": false, + "interface": "sharing" + }, + { + "tag": "openai_gpt-6.1-sol", + "task": "C09_ihp130_sW2_sL2", + "topology": "C09", + "rep": "r3", + "n_proposals": 7, + "first_legal": true, + "n_rejected": 1, + "n_duplicates": 0, + "eda_verifications": 6, + "statuses": { + "auto_passed": 6, + "rejected_program": 1 + }, + "drc_lvs_clean": 6, + "auto_passed": 6, + "best": { + "1": { + "best_area": 3825.8188, + "vs_reference": -0.002161520665193817, + "vs_best_evaluated": 0.15460629908308876 + }, + "2": { + "best_area": 3817.5312, + "vs_reference": -0.004323067412085102, + "vs_best_evaluated": 0.15210515732376617 + }, + "4": { + "best_area": 3306.3179, + "vs_reference": -0.13765617296526178, + "vs_best_evaluated": -0.0021755671985379532 + }, + "8": { + "best_area": 3217.4321, + "vs_reference": -0.1608390982795651, + "vs_best_evaluated": -0.029000701880567248 + } + }, + "reference_area": 3834.1063, + "best_evaluated_area": 3313.5267, + "best_evaluated_complete": true, + "evaluator_s": 221.8, + "model_s": 474.6, + "usage": [ + { + "input_tokens": 15172, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 561, + "reasoning_output_tokens": 477 + }, + { + "input_tokens": 15493, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 2890, + "reasoning_output_tokens": 912 + }, + { + "input_tokens": 17706, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 2695, + "reasoning_output_tokens": 691 + }, + { + "input_tokens": 19953, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 2809, + "reasoning_output_tokens": 805 + }, + { + "input_tokens": 22196, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 2434, + "reasoning_output_tokens": 430 + }, + { + "input_tokens": 24243, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 3513, + "reasoning_output_tokens": 499 + }, + { + "input_tokens": 27490, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 3829, + "reasoning_output_tokens": 806 + }, + { + "input_tokens": 30750, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 523, + "reasoning_output_tokens": 516 + } + ], + "isolation_breach": false, + "interface": "sharing" + }, + { + "tag": "openai_gpt-6.1-sol", + "task": "C09_sky130_sW2_sL1", + "topology": "C09", + "rep": "r1", + "n_proposals": 6, + "first_legal": true, + "n_rejected": 1, + "n_duplicates": 0, + "eda_verifications": 5, + "statuses": { + "auto_passed": 5, + "rejected_program": 1 + }, + "drc_lvs_clean": 5, + "auto_passed": 5, + "best": { + "1": { + "best_area": 2625.8061, + "vs_reference": -0.003572225875512536, + "vs_best_evaluated": 0.17461750426523648 + }, + "2": { + "best_area": 2616.3924, + "vs_reference": -0.007144489698524881, + "vs_best_evaluated": 0.1704064176964677 + }, + "4": { + "best_area": 2616.3924, + "vs_reference": -0.007144489698524881, + "vs_best_evaluated": 0.1704064176964677 + }, + "8": { + "best_area": 2606.9788, + "vs_reference": -0.010716715574037416, + "vs_best_evaluated": 0.16619537586129507 + } + }, + "reference_area": 2635.2197, + "best_evaluated_area": 2235.4563, + "best_evaluated_complete": true, + "evaluator_s": 231.3, + "model_s": 454.7, + "usage": [ + { + "input_tokens": 15174, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 728, + "reasoning_output_tokens": 644 + }, + { + "input_tokens": 15493, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 2924, + "reasoning_output_tokens": 970 + }, + { + "input_tokens": 17686, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 2542, + "reasoning_output_tokens": 588 + }, + { + "input_tokens": 19877, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 2701, + "reasoning_output_tokens": 700 + }, + { + "input_tokens": 21932, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 2417, + "reasoning_output_tokens": 416 + }, + { + "input_tokens": 24172, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 5136, + "reasoning_output_tokens": 2070 + }, + { + "input_tokens": 27469, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1041, + "reasoning_output_tokens": 1034 + } + ], + "isolation_breach": false, + "interface": "sharing" + }, + { + "tag": "openai_gpt-6.1-sol", + "task": "C09_sky130_sW2_sL1", + "topology": "C09", + "rep": "r2", + "n_proposals": 8, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 8, + "statuses": { + "auto_passed": 8 + }, + "drc_lvs_clean": 8, + "auto_passed": 8, + "best": { + "1": { + "best_area": 2625.8061, + "vs_reference": -0.003572225875512536, + "vs_best_evaluated": 0.17461750426523648 + }, + "2": { + "best_area": 2616.3924, + "vs_reference": -0.007144489698524881, + "vs_best_evaluated": 0.1704064176964677 + }, + "4": { + "best_area": 2458.6921, + "vs_reference": -0.06698781130089448, + "vs_best_evaluated": 0.0998614018981272 + }, + "8": { + "best_area": 2227.4063, + "vs_reference": -0.15475499063702358, + "vs_best_evaluated": -0.0036010545140156003 + } + }, + "reference_area": 2635.2197, + "best_evaluated_area": 2235.4563, + "best_evaluated_complete": true, + "evaluator_s": 367.1, + "model_s": 627.5, + "usage": [ + { + "input_tokens": 15174, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 799, + "reasoning_output_tokens": 715 + }, + { + "input_tokens": 15495, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 2898, + "reasoning_output_tokens": 944 + }, + { + "input_tokens": 17682, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 2648, + "reasoning_output_tokens": 694 + }, + { + "input_tokens": 19873, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 2774, + "reasoning_output_tokens": 820 + }, + { + "input_tokens": 22070, + "cached_input_tokens": 21888, + "cache_write_input_tokens": 0, + "output_tokens": 3590, + "reasoning_output_tokens": 657 + }, + { + "input_tokens": 25236, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 3135, + "reasoning_output_tokens": 1181 + }, + { + "input_tokens": 27427, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 4170, + "reasoning_output_tokens": 1228 + }, + { + "input_tokens": 30610, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 2667, + "reasoning_output_tokens": 713 + } + ], + "isolation_breach": false, + "interface": "sharing" + }, + { + "tag": "openai_gpt-6.1-sol", + "task": "C09_sky130_sW2_sL1", + "topology": "C09", + "rep": "r3", + "n_proposals": 7, + "first_legal": false, + "n_rejected": 1, + "n_duplicates": 0, + "eda_verifications": 6, + "statuses": { + "rejected_program": 1, + "auto_passed": 6 + }, + "drc_lvs_clean": 6, + "auto_passed": 6, + "best": { + "1": { + "best_area": null, + "vs_reference": null, + "vs_best_evaluated": null + }, + "2": { + "best_area": 2616.3924, + "vs_reference": -0.007144489698524881, + "vs_best_evaluated": 0.1704064176964677 + }, + "4": { + "best_area": 2606.9788, + "vs_reference": -0.010716715574037416, + "vs_best_evaluated": 0.16619537586129507 + }, + "8": { + "best_area": 2227.4063, + "vs_reference": -0.15475499063702358, + "vs_best_evaluated": -0.0036010545140156003 + } + }, + "reference_area": 2635.2197, + "best_evaluated_area": 2235.4563, + "best_evaluated_complete": true, + "evaluator_s": 281.1, + "model_s": 623.8, + "usage": [ + { + "input_tokens": 15174, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 3781, + "reasoning_output_tokens": 785 + }, + { + "input_tokens": 18258, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 3763, + "reasoning_output_tokens": 740 + }, + { + "input_tokens": 21514, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 3821, + "reasoning_output_tokens": 798 + }, + { + "input_tokens": 24776, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 4110, + "reasoning_output_tokens": 1034 + }, + { + "input_tokens": 28087, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 3826, + "reasoning_output_tokens": 803 + }, + { + "input_tokens": 31349, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 3686, + "reasoning_output_tokens": 663 + }, + { + "input_tokens": 34609, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 3369, + "reasoning_output_tokens": 346 + }, + { + "input_tokens": 37867, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 674, + "reasoning_output_tokens": 667 + } + ], + "isolation_breach": false, + "interface": "sharing" + }, + { + "tag": "openai_gpt-6.1-sol", + "task": "C11_gf180_sW2_sL1", + "topology": "C11", + "rep": "r1", + "n_proposals": 4, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 4, + "statuses": { + "auto_passed": 4 + }, + "drc_lvs_clean": 4, + "auto_passed": 4, + "best": { + "1": { + "best_area": 4272.814, + "vs_reference": -0.026431718061673992, + "vs_best_evaluated": 0.08095717320809581 + }, + "2": { + "best_area": 4234.146, + "vs_reference": -0.03524229074889884, + "vs_best_evaluated": 0.0711747553510087 + }, + "4": { + "best_area": 4234.146, + "vs_reference": -0.03524229074889884, + "vs_best_evaluated": 0.0711747553510087 + }, + "8": { + "best_area": 4234.146, + "vs_reference": -0.03524229074889884, + "vs_best_evaluated": 0.0711747553510087 + } + }, + "reference_area": 4388.818, + "best_evaluated_area": 3952.806, + "best_evaluated_complete": true, + "evaluator_s": 90.2, + "model_s": 165.3, + "usage": [ + { + "input_tokens": 15265, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1215, + "reasoning_output_tokens": 555 + }, + { + "input_tokens": 16213, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1029, + "reasoning_output_tokens": 347 + }, + { + "input_tokens": 17179, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1526, + "reasoning_output_tokens": 859 + }, + { + "input_tokens": 18136, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 1258, + "reasoning_output_tokens": 591 + }, + { + "input_tokens": 19092, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 230, + "reasoning_output_tokens": 223 + } + ], + "isolation_breach": false, + "interface": "sharing" + }, + { + "tag": "openai_gpt-6.1-sol", + "task": "C11_gf180_sW2_sL1", + "topology": "C11", + "rep": "r2", + "n_proposals": 8, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 8, + "statuses": { + "auto_passed": 8 + }, + "drc_lvs_clean": 8, + "auto_passed": 8, + "best": { + "1": { + "best_area": 4272.814, + "vs_reference": -0.026431718061673992, + "vs_best_evaluated": 0.08095717320809581 + }, + "2": { + "best_area": 4234.146, + "vs_reference": -0.03524229074889884, + "vs_best_evaluated": 0.0711747553510087 + }, + "4": { + "best_area": 4118.514, + "vs_reference": -0.06158924794785292, + "vs_best_evaluated": 0.04192161214084367 + }, + "8": { + "best_area": 3710.0245, + "vs_reference": -0.15466430824882693, + "vs_best_evaluated": -0.06142003933408324 + } + }, + "reference_area": 4388.818, + "best_evaluated_area": 3952.806, + "best_evaluated_complete": true, + "evaluator_s": 200.9, + "model_s": 364.3, + "usage": [ + { + "input_tokens": 15265, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1090, + "reasoning_output_tokens": 408 + }, + { + "input_tokens": 16231, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 1110, + "reasoning_output_tokens": 403 + }, + { + "input_tokens": 17230, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 1386, + "reasoning_output_tokens": 679 + }, + { + "input_tokens": 18223, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1406, + "reasoning_output_tokens": 423 + }, + { + "input_tokens": 19494, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1462, + "reasoning_output_tokens": 492 + }, + { + "input_tokens": 20751, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 2010, + "reasoning_output_tokens": 1034 + }, + { + "input_tokens": 22018, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 2087, + "reasoning_output_tokens": 1111 + }, + { + "input_tokens": 23285, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1910, + "reasoning_output_tokens": 923 + } + ], + "isolation_breach": false, + "interface": "sharing" + }, + { + "tag": "openai_gpt-6.1-sol", + "task": "C11_gf180_sW2_sL1", + "topology": "C11", + "rep": "r3", + "n_proposals": 8, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 8, + "statuses": { + "auto_passed": 8 + }, + "drc_lvs_clean": 8, + "auto_passed": 8, + "best": { + "1": { + "best_area": 4164.066, + "vs_reference": -0.0512101435967498, + "vs_best_evaluated": 0.053445577647878384 + }, + "2": { + "best_area": 4164.066, + "vs_reference": -0.0512101435967498, + "vs_best_evaluated": 0.053445577647878384 + }, + "4": { + "best_area": 4164.066, + "vs_reference": -0.0512101435967498, + "vs_best_evaluated": 0.053445577647878384 + }, + "8": { + "best_area": 3710.0245, + "vs_reference": -0.15466430824882693, + "vs_best_evaluated": -0.06142003933408324 + } + }, + "reference_area": 4388.818, + "best_evaluated_area": 3952.806, + "best_evaluated_complete": true, + "evaluator_s": 184.2, + "model_s": 308.3, + "usage": [ + { + "input_tokens": 15265, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1148, + "reasoning_output_tokens": 472 + }, + { + "input_tokens": 16229, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1066, + "reasoning_output_tokens": 390 + }, + { + "input_tokens": 17191, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 949, + "reasoning_output_tokens": 273 + }, + { + "input_tokens": 18160, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1199, + "reasoning_output_tokens": 512 + }, + { + "input_tokens": 19131, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1245, + "reasoning_output_tokens": 569 + }, + { + "input_tokens": 20097, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1808, + "reasoning_output_tokens": 868 + }, + { + "input_tokens": 21323, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1382, + "reasoning_output_tokens": 442 + }, + { + "input_tokens": 22554, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1930, + "reasoning_output_tokens": 990 + } + ], + "isolation_breach": false, + "interface": "sharing" + }, + { + "tag": "openai_gpt-6.1-sol", + "task": "C11_gf180_sW2_sL2", + "topology": "C11", + "rep": "r1", + "n_proposals": 8, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 8, + "statuses": { + "auto_passed": 8 + }, + "drc_lvs_clean": 8, + "auto_passed": 8, + "best": { + "1": { + "best_area": 6183.0132, + "vs_reference": -0.02440512507626591, + "vs_best_evaluated": 0.07423898070835633 + }, + "2": { + "best_area": 6080.6772, + "vs_reference": -0.0405523455156781, + "vs_best_evaluated": 0.0564590865412582 + }, + "4": { + "best_area": 6080.6772, + "vs_reference": -0.0405523455156781, + "vs_best_evaluated": 0.0564590865412582 + }, + "8": { + "best_area": 6080.6772, + "vs_reference": -0.0405523455156781, + "vs_best_evaluated": 0.0564590865412582 + } + }, + "reference_area": 6337.6852, + "best_evaluated_area": 5755.7148, + "best_evaluated_complete": true, + "evaluator_s": 187.3, + "model_s": 297.0, + "usage": [ + { + "input_tokens": 15263, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1164, + "reasoning_output_tokens": 497 + }, + { + "input_tokens": 16217, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1406, + "reasoning_output_tokens": 740 + }, + { + "input_tokens": 17176, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 1161, + "reasoning_output_tokens": 231 + }, + { + "input_tokens": 18393, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1457, + "reasoning_output_tokens": 791 + }, + { + "input_tokens": 19350, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 994, + "reasoning_output_tokens": 328 + }, + { + "input_tokens": 20303, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1302, + "reasoning_output_tokens": 372 + }, + { + "input_tokens": 21522, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1224, + "reasoning_output_tokens": 558 + }, + { + "input_tokens": 22477, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1234, + "reasoning_output_tokens": 568 + } + ], + "isolation_breach": false, + "interface": "sharing" + }, + { + "tag": "openai_gpt-6.1-sol", + "task": "C11_gf180_sW2_sL2", + "topology": "C11", + "rep": "r2", + "n_proposals": 8, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 8, + "statuses": { + "auto_passed": 8 + }, + "drc_lvs_clean": 8, + "auto_passed": 8, + "best": { + "1": { + "best_area": 6183.0132, + "vs_reference": -0.02440512507626591, + "vs_best_evaluated": 0.07423898070835633 + }, + "2": { + "best_area": 6183.0132, + "vs_reference": -0.02440512507626591, + "vs_best_evaluated": 0.07423898070835633 + }, + "4": { + "best_area": 6183.0132, + "vs_reference": -0.02440512507626591, + "vs_best_evaluated": 0.07423898070835633 + }, + "8": { + "best_area": 5529.3909, + "vs_reference": -0.1275377798821563, + "vs_best_evaluated": -0.03932159738005081 + } + }, + "reference_area": 6337.6852, + "best_evaluated_area": 5755.7148, + "best_evaluated_complete": true, + "evaluator_s": 200.4, + "model_s": 326.7, + "usage": [ + { + "input_tokens": 15265, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1208, + "reasoning_output_tokens": 516 + }, + { + "input_tokens": 16250, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1184, + "reasoning_output_tokens": 516 + }, + { + "input_tokens": 17201, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1193, + "reasoning_output_tokens": 516 + }, + { + "input_tokens": 18167, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1067, + "reasoning_output_tokens": 390 + }, + { + "input_tokens": 19137, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1510, + "reasoning_output_tokens": 565 + }, + { + "input_tokens": 20369, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1397, + "reasoning_output_tokens": 452 + }, + { + "input_tokens": 21601, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 1760, + "reasoning_output_tokens": 805 + }, + { + "input_tokens": 22845, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1756, + "reasoning_output_tokens": 811 + } + ], + "isolation_breach": false, + "interface": "sharing" + }, + { + "tag": "openai_gpt-6.1-sol", + "task": "C11_gf180_sW2_sL2", + "topology": "C11", + "rep": "r3", + "n_proposals": 8, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 8, + "statuses": { + "auto_passed": 8 + }, + "drc_lvs_clean": 8, + "auto_passed": 8, + "best": { + "1": { + "best_area": 6183.0132, + "vs_reference": -0.02440512507626591, + "vs_best_evaluated": 0.07423898070835633 + }, + "2": { + "best_area": 6183.0132, + "vs_reference": -0.02440512507626591, + "vs_best_evaluated": 0.07423898070835633 + }, + "4": { + "best_area": 5859.0129, + "vs_reference": -0.07552793881273878, + "vs_best_evaluated": 0.01794704977390471 + }, + "8": { + "best_area": 5529.3909, + "vs_reference": -0.1275377798821563, + "vs_best_evaluated": -0.03932159738005081 + } + }, + "reference_area": 6337.6852, + "best_evaluated_area": 5755.7148, + "best_evaluated_complete": true, + "evaluator_s": 200.0, + "model_s": 319.5, + "usage": [ + { + "input_tokens": 15267, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1133, + "reasoning_output_tokens": 456 + }, + { + "input_tokens": 16229, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1145, + "reasoning_output_tokens": 468 + }, + { + "input_tokens": 17199, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1021, + "reasoning_output_tokens": 344 + }, + { + "input_tokens": 18163, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1189, + "reasoning_output_tokens": 248 + }, + { + "input_tokens": 19389, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1302, + "reasoning_output_tokens": 361 + }, + { + "input_tokens": 20627, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1692, + "reasoning_output_tokens": 751 + }, + { + "input_tokens": 21853, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1965, + "reasoning_output_tokens": 1034 + }, + { + "input_tokens": 23073, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1607, + "reasoning_output_tokens": 676 + } + ], + "isolation_breach": false, + "interface": "sharing" + }, + { + "tag": "openai_gpt-6.1-sol", + "task": "C11_ihp130_sW2_sL1", + "topology": "C11", + "rep": "r1", + "n_proposals": 8, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 8, + "statuses": { + "auto_passed": 8 + }, + "drc_lvs_clean": 8, + "auto_passed": 8, + "best": { + "1": { + "best_area": 2334.3522, + "vs_reference": -0.02879455934083175, + "vs_best_evaluated": 0.07104636820945953 + }, + "2": { + "best_area": 2311.2823, + "vs_reference": -0.03839277352439108, + "vs_best_evaluated": 0.06046144764350747 + }, + "4": { + "best_area": 2281.1363, + "vs_reference": -0.050934993680420204, + "vs_best_evaluated": 0.04662987423481546 + }, + "8": { + "best_area": 2214.9722, + "vs_reference": -0.07846251668929494, + "vs_best_evaluated": 0.016272493283111755 + } + }, + "reference_area": 2403.5617, + "best_evaluated_area": 2179.5062, + "best_evaluated_complete": true, + "evaluator_s": 126.2, + "model_s": 319.8, + "usage": [ + { + "input_tokens": 15256, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 981, + "reasoning_output_tokens": 321 + }, + { + "input_tokens": 16203, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 1196, + "reasoning_output_tokens": 514 + }, + { + "input_tokens": 17174, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1376, + "reasoning_output_tokens": 699 + }, + { + "input_tokens": 18140, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1532, + "reasoning_output_tokens": 866 + }, + { + "input_tokens": 19093, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1181, + "reasoning_output_tokens": 251 + }, + { + "input_tokens": 20308, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 1502, + "reasoning_output_tokens": 572 + }, + { + "input_tokens": 21531, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1488, + "reasoning_output_tokens": 558 + }, + { + "input_tokens": 22750, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1652, + "reasoning_output_tokens": 701 + } + ], + "isolation_breach": false, + "interface": "sharing" + }, + { + "tag": "openai_gpt-6.1-sol", + "task": "C11_ihp130_sW2_sL1", + "topology": "C11", + "rep": "r2", + "n_proposals": 7, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 7, + "statuses": { + "auto_passed": 7 + }, + "drc_lvs_clean": 7, + "auto_passed": 7, + "best": { + "1": { + "best_area": 2311.2823, + "vs_reference": -0.03839277352439108, + "vs_best_evaluated": 0.06046144764350747 + }, + "2": { + "best_area": 2311.2823, + "vs_reference": -0.03839277352439108, + "vs_best_evaluated": 0.06046144764350747 + }, + "4": { + "best_area": 2300.452, + "vs_reference": -0.04289871152465108, + "vs_best_evaluated": 0.055492294539010834 + }, + "8": { + "best_area": 2132.3812, + "vs_reference": -0.11282443883175552, + "vs_best_evaluated": -0.02162187012819694 + } + }, + "reference_area": 2403.5617, + "best_evaluated_area": 2179.5062, + "best_evaluated_complete": true, + "evaluator_s": 112.2, + "model_s": 305.8, + "usage": [ + { + "input_tokens": 15252, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1197, + "reasoning_output_tokens": 516 + }, + { + "input_tokens": 16220, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1207, + "reasoning_output_tokens": 516 + }, + { + "input_tokens": 17200, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1438, + "reasoning_output_tokens": 757 + }, + { + "input_tokens": 18172, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1350, + "reasoning_output_tokens": 397 + }, + { + "input_tokens": 19413, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1152, + "reasoning_output_tokens": 189 + }, + { + "input_tokens": 20663, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1497, + "reasoning_output_tokens": 534 + }, + { + "input_tokens": 21919, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1403, + "reasoning_output_tokens": 450 + }, + { + "input_tokens": 23157, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 989, + "reasoning_output_tokens": 982 + } + ], + "isolation_breach": false, + "interface": "sharing" + }, + { + "tag": "openai_gpt-6.1-sol", + "task": "C11_ihp130_sW2_sL1", + "topology": "C11", + "rep": "r3", + "n_proposals": 7, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 7, + "statuses": { + "auto_passed": 7 + }, + "drc_lvs_clean": 7, + "auto_passed": 7, + "best": { + "1": { + "best_area": 2311.2823, + "vs_reference": -0.03839277352439108, + "vs_best_evaluated": 0.06046144764350747 + }, + "2": { + "best_area": 2311.2823, + "vs_reference": -0.03839277352439108, + "vs_best_evaluated": 0.06046144764350747 + }, + "4": { + "best_area": 2311.2823, + "vs_reference": -0.03839277352439108, + "vs_best_evaluated": 0.06046144764350747 + }, + "8": { + "best_area": 2131.5674, + "vs_reference": -0.11316301969697729, + "vs_best_evaluated": -0.02199525745785902 + } + }, + "reference_area": 2403.5617, + "best_evaluated_area": 2179.5062, + "best_evaluated_complete": true, + "evaluator_s": 111.1, + "model_s": 319.8, + "usage": [ + { + "input_tokens": 15250, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1400, + "reasoning_output_tokens": 718 + }, + { + "input_tokens": 16221, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1030, + "reasoning_output_tokens": 370 + }, + { + "input_tokens": 17170, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1200, + "reasoning_output_tokens": 513 + }, + { + "input_tokens": 18146, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1168, + "reasoning_output_tokens": 481 + }, + { + "input_tokens": 19126, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1287, + "reasoning_output_tokens": 336 + }, + { + "input_tokens": 20366, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1786, + "reasoning_output_tokens": 835 + }, + { + "input_tokens": 21606, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1593, + "reasoning_output_tokens": 642 + }, + { + "input_tokens": 22842, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 868, + "reasoning_output_tokens": 861 + } + ], + "isolation_breach": false, + "interface": "sharing" + }, + { + "tag": "openai_gpt-6.1-sol", + "task": "C11_ihp130_sW2_sL2", + "topology": "C11", + "rep": "r1", + "n_proposals": 8, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 8, + "statuses": { + "auto_passed": 8 + }, + "drc_lvs_clean": 8, + "auto_passed": 8, + "best": { + "1": { + "best_area": 3181.1514, + "vs_reference": -0.02129286627832616, + "vs_best_evaluated": 0.06966025024352862 + }, + "2": { + "best_area": 3158.0815, + "vs_reference": -0.028390508881644627, + "vs_best_evaluated": 0.06190301020550537 + }, + "4": { + "best_area": 3021.7745, + "vs_reference": -0.07032646743935422, + "vs_best_evaluated": 0.016069863210381508 + }, + "8": { + "best_area": 2893.0662, + "vs_reference": -0.10992462406251557, + "vs_best_evaluated": -0.027208225467327818 + } + }, + "reference_area": 3250.3609, + "best_evaluated_area": 2973.983, + "best_evaluated_complete": true, + "evaluator_s": 125.3, + "model_s": 313.7, + "usage": [ + { + "input_tokens": 15252, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 989, + "reasoning_output_tokens": 329 + }, + { + "input_tokens": 16201, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1006, + "reasoning_output_tokens": 347 + }, + { + "input_tokens": 17147, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1171, + "reasoning_output_tokens": 512 + }, + { + "input_tokens": 18095, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1161, + "reasoning_output_tokens": 238 + }, + { + "input_tokens": 19311, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1723, + "reasoning_output_tokens": 790 + }, + { + "input_tokens": 20531, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1776, + "reasoning_output_tokens": 853 + }, + { + "input_tokens": 21743, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1405, + "reasoning_output_tokens": 482 + }, + { + "input_tokens": 22951, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1572, + "reasoning_output_tokens": 649 + } + ], + "isolation_breach": false, + "interface": "sharing" + }, + { + "tag": "openai_gpt-6.1-sol", + "task": "C11_ihp130_sW2_sL2", + "topology": "C11", + "rep": "r2", + "n_proposals": 7, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 7, + "statuses": { + "auto_passed": 7 + }, + "drc_lvs_clean": 7, + "auto_passed": 7, + "best": { + "1": { + "best_area": 3158.0815, + "vs_reference": -0.028390508881644627, + "vs_best_evaluated": 0.06190301020550537 + }, + "2": { + "best_area": 3158.0815, + "vs_reference": -0.028390508881644627, + "vs_best_evaluated": 0.06190301020550537 + }, + "4": { + "best_area": 3158.0815, + "vs_reference": -0.028390508881644627, + "vs_best_evaluated": 0.06190301020550537 + }, + "8": { + "best_area": 2913.9412, + "vs_reference": -0.10350226031823107, + "vs_best_evaluated": -0.02018901923783689 + } + }, + "reference_area": 3250.3609, + "best_evaluated_area": 2973.983, + "best_evaluated_complete": true, + "evaluator_s": 105.6, + "model_s": 318.1, + "usage": [ + { + "input_tokens": 15250, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1194, + "reasoning_output_tokens": 512 + }, + { + "input_tokens": 16227, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1161, + "reasoning_output_tokens": 501 + }, + { + "input_tokens": 17170, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1024, + "reasoning_output_tokens": 357 + }, + { + "input_tokens": 18126, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1389, + "reasoning_output_tokens": 458 + }, + { + "input_tokens": 19346, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1430, + "reasoning_output_tokens": 499 + }, + { + "input_tokens": 20567, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1436, + "reasoning_output_tokens": 495 + }, + { + "input_tokens": 21797, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1449, + "reasoning_output_tokens": 508 + }, + { + "input_tokens": 23025, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1406, + "reasoning_output_tokens": 1399 + } + ], + "isolation_breach": false, + "interface": "sharing" + }, + { + "tag": "openai_gpt-6.1-sol", + "task": "C11_ihp130_sW2_sL2", + "topology": "C11", + "rep": "r3", + "n_proposals": 8, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 1, + "eda_verifications": 7, + "statuses": { + "auto_passed": 8 + }, + "drc_lvs_clean": 8, + "auto_passed": 8, + "best": { + "1": { + "best_area": 3158.0815, + "vs_reference": -0.028390508881644627, + "vs_best_evaluated": 0.06190301020550537 + }, + "2": { + "best_area": 3158.0815, + "vs_reference": -0.028390508881644627, + "vs_best_evaluated": 0.06190301020550537 + }, + "4": { + "best_area": 2893.0662, + "vs_reference": -0.10992462406251557, + "vs_best_evaluated": -0.027208225467327818 + }, + "8": { + "best_area": 2893.0662, + "vs_reference": -0.10992462406251557, + "vs_best_evaluated": -0.027208225467327818 + } + }, + "reference_area": 3250.3609, + "best_evaluated_area": 2973.983, + "best_evaluated_complete": true, + "evaluator_s": 103.4, + "model_s": 295.7, + "usage": [ + { + "input_tokens": 15250, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1084, + "reasoning_output_tokens": 425 + }, + { + "input_tokens": 16200, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 978, + "reasoning_output_tokens": 319 + }, + { + "input_tokens": 17148, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 1052, + "reasoning_output_tokens": 393 + }, + { + "input_tokens": 18096, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 880, + "reasoning_output_tokens": 221 + }, + { + "input_tokens": 19044, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1041, + "reasoning_output_tokens": 372 + }, + { + "input_tokens": 20000, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1691, + "reasoning_output_tokens": 1032 + }, + { + "input_tokens": 20952, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 1466, + "reasoning_output_tokens": 807 + }, + { + "input_tokens": 21896, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1439, + "reasoning_output_tokens": 516 + } + ], + "isolation_breach": false, + "interface": "sharing" + }, + { + "tag": "openai_gpt-6.1-sol", + "task": "C11_sky130_sW2_sL1", + "topology": "C11", + "rep": "r1", + "n_proposals": 8, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 8, + "statuses": { + "auto_passed": 8 + }, + "drc_lvs_clean": 8, + "auto_passed": 8, + "best": { + "1": { + "best_area": 1985.2473, + "vs_reference": -0.04488528095613875, + "vs_best_evaluated": 0.05888874908438857 + }, + "2": { + "best_area": 1956.1716, + "vs_reference": -0.05887377953588935, + "vs_best_evaluated": 0.04338038818559631 + }, + "4": { + "best_area": 1908.5066, + "vs_reference": -0.08180570498579454, + "vs_best_evaluated": 0.017956889448130564 + }, + "8": { + "best_area": 1879.6082, + "vs_reference": -0.09570890344213656, + "vs_best_evaluated": 0.0025430966040147496 + } + }, + "reference_area": 2078.5433, + "best_evaluated_area": 1874.8403, + "best_evaluated_complete": true, + "evaluator_s": 217.9, + "model_s": 298.5, + "usage": [ + { + "input_tokens": 15265, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 1130, + "reasoning_output_tokens": 457 + }, + { + "input_tokens": 16227, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1119, + "reasoning_output_tokens": 446 + }, + { + "input_tokens": 17187, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1147, + "reasoning_output_tokens": 474 + }, + { + "input_tokens": 18151, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1222, + "reasoning_output_tokens": 277 + }, + { + "input_tokens": 19383, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1272, + "reasoning_output_tokens": 327 + }, + { + "input_tokens": 20619, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1650, + "reasoning_output_tokens": 695 + }, + { + "input_tokens": 21865, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1364, + "reasoning_output_tokens": 419 + }, + { + "input_tokens": 23095, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1608, + "reasoning_output_tokens": 663 + } + ], + "isolation_breach": false, + "interface": "sharing" + }, + { + "tag": "openai_gpt-6.1-sol", + "task": "C11_sky130_sW2_sL1", + "topology": "C11", + "rep": "r2", + "n_proposals": 7, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 7, + "statuses": { + "auto_passed": 7 + }, + "drc_lvs_clean": 7, + "auto_passed": 7, + "best": { + "1": { + "best_area": 1985.2473, + "vs_reference": -0.04488528095613875, + "vs_best_evaluated": 0.05888874908438857 + }, + "2": { + "best_area": 1985.2473, + "vs_reference": -0.04488528095613875, + "vs_best_evaluated": 0.05888874908438857 + }, + "4": { + "best_area": 1938.9527, + "vs_reference": -0.06715789851479148, + "vs_best_evaluated": 0.03419619260371132 + }, + "8": { + "best_area": 1868.7373, + "vs_reference": -0.10093896047294271, + "vs_best_evaluated": -0.00325521059047007 + } + }, + "reference_area": 2078.5433, + "best_evaluated_area": 1874.8403, + "best_evaluated_complete": true, + "evaluator_s": 187.6, + "model_s": 295.4, + "usage": [ + { + "input_tokens": 15267, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1106, + "reasoning_output_tokens": 414 + }, + { + "input_tokens": 16246, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1096, + "reasoning_output_tokens": 408 + }, + { + "input_tokens": 17223, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1531, + "reasoning_output_tokens": 839 + }, + { + "input_tokens": 18202, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 908, + "reasoning_output_tokens": 228 + }, + { + "input_tokens": 19171, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1287, + "reasoning_output_tokens": 610 + }, + { + "input_tokens": 20135, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1686, + "reasoning_output_tokens": 738 + }, + { + "input_tokens": 21376, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1690, + "reasoning_output_tokens": 742 + }, + { + "input_tokens": 22614, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 500, + "reasoning_output_tokens": 493 + } + ], + "isolation_breach": false, + "interface": "sharing" + }, + { + "tag": "openai_gpt-6.1-sol", + "task": "C11_sky130_sW2_sL1", + "topology": "C11", + "rep": "r3", + "n_proposals": 8, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 8, + "statuses": { + "auto_passed": 8 + }, + "drc_lvs_clean": 8, + "auto_passed": 8, + "best": { + "1": { + "best_area": 1985.2472, + "vs_reference": -0.044885329066755464, + "vs_best_evaluated": 0.058888695746512454 + }, + "2": { + "best_area": 1985.2472, + "vs_reference": -0.044885329066755464, + "vs_best_evaluated": 0.058888695746512454 + }, + "4": { + "best_area": 1985.2472, + "vs_reference": -0.044885329066755464, + "vs_best_evaluated": 0.058888695746512454 + }, + "8": { + "best_area": 1775.9815, + "vs_reference": -0.1455643478776698, + "vs_best_evaluated": -0.0527291844537372 + } + }, + "reference_area": 2078.5433, + "best_evaluated_area": 1874.8403, + "best_evaluated_complete": true, + "evaluator_s": 204.9, + "model_s": 336.4, + "usage": [ + { + "input_tokens": 15265, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1214, + "reasoning_output_tokens": 516 + }, + { + "input_tokens": 16252, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 1090, + "reasoning_output_tokens": 430 + }, + { + "input_tokens": 17199, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1063, + "reasoning_output_tokens": 386 + }, + { + "input_tokens": 18167, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1046, + "reasoning_output_tokens": 369 + }, + { + "input_tokens": 19135, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 1367, + "reasoning_output_tokens": 426 + }, + { + "input_tokens": 20361, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 1631, + "reasoning_output_tokens": 690 + }, + { + "input_tokens": 21593, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1906, + "reasoning_output_tokens": 965 + }, + { + "input_tokens": 22825, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 1964, + "reasoning_output_tokens": 1034 + } + ], + "isolation_breach": false, + "interface": "sharing" + }, + { + "tag": "openai_gpt-6.1-sol", + "task": "C11_sky130_sW2_sL2", + "topology": "C11", + "rep": "r1", + "n_proposals": 7, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 7, + "statuses": { + "auto_passed": 6, + "spec_failed": 1 + }, + "drc_lvs_clean": 7, + "auto_passed": 6, + "best": { + "1": { + "best_area": 2884.8872, + "vs_reference": -0.0313264811916204, + "vs_best_evaluated": 0.06533125157867214 + }, + "2": { + "best_area": 2884.8872, + "vs_reference": -0.0313264811916204, + "vs_best_evaluated": 0.06533125157867214 + }, + "4": { + "best_area": 2880.8551, + "vs_reference": -0.03268036029482668, + "vs_best_evaluated": 0.06384227754201288 + }, + "8": { + "best_area": 2758.6487, + "vs_reference": -0.07371423624980489, + "vs_best_evaluated": 0.01871389364439513 + } + }, + "reference_area": 2978.1832, + "best_evaluated_area": 2707.972, + "best_evaluated_complete": true, + "evaluator_s": 194.1, + "model_s": 339.9, + "usage": [ + { + "input_tokens": 15261, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 1195, + "reasoning_output_tokens": 513 + }, + { + "input_tokens": 16234, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1176, + "reasoning_output_tokens": 516 + }, + { + "input_tokens": 17185, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1886, + "reasoning_output_tokens": 940 + }, + { + "input_tokens": 18490, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 1057, + "reasoning_output_tokens": 387 + }, + { + "input_tokens": 19449, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1573, + "reasoning_output_tokens": 639 + }, + { + "input_tokens": 20672, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 2224, + "reasoning_output_tokens": 1283 + }, + { + "input_tokens": 21906, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1364, + "reasoning_output_tokens": 423 + }, + { + "input_tokens": 23134, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 590, + "reasoning_output_tokens": 583 + } + ], + "isolation_breach": false, + "interface": "sharing" + }, + { + "tag": "openai_gpt-6.1-sol", + "task": "C11_sky130_sW2_sL2", + "topology": "C11", + "rep": "r2", + "n_proposals": 7, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 7, + "statuses": { + "auto_passed": 7 + }, + "drc_lvs_clean": 7, + "auto_passed": 7, + "best": { + "1": { + "best_area": 2908.2112, + "vs_reference": -0.02349486089371522, + "vs_best_evaluated": 0.07394433915860277 + }, + "2": { + "best_area": 2884.8872, + "vs_reference": -0.0313264811916204, + "vs_best_evaluated": 0.06533125157867214 + }, + "4": { + "best_area": 2842.6356, + "vs_reference": -0.04551351978615681, + "vs_best_evaluated": 0.04972857917290119 + }, + "8": { + "best_area": 2842.6356, + "vs_reference": -0.04551351978615681, + "vs_best_evaluated": 0.04972857917290119 + } + }, + "reference_area": 2978.1832, + "best_evaluated_area": 2707.972, + "best_evaluated_complete": true, + "evaluator_s": 212.0, + "model_s": 272.3, + "usage": [ + { + "input_tokens": 15263, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1041, + "reasoning_output_tokens": 381 + }, + { + "input_tokens": 16214, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1049, + "reasoning_output_tokens": 390 + }, + { + "input_tokens": 17164, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1002, + "reasoning_output_tokens": 343 + }, + { + "input_tokens": 18106, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1175, + "reasoning_output_tokens": 516 + }, + { + "input_tokens": 19060, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1244, + "reasoning_output_tokens": 585 + }, + { + "input_tokens": 20010, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1158, + "reasoning_output_tokens": 499 + }, + { + "input_tokens": 20952, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1726, + "reasoning_output_tokens": 803 + }, + { + "input_tokens": 22166, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 355, + "reasoning_output_tokens": 348 + } + ], + "isolation_breach": false, + "interface": "sharing" + }, + { + "tag": "openai_gpt-6.1-sol", + "task": "C11_sky130_sW2_sL2", + "topology": "C11", + "rep": "r3", + "n_proposals": 8, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 8, + "statuses": { + "auto_passed": 8 + }, + "drc_lvs_clean": 8, + "auto_passed": 8, + "best": { + "1": { + "best_area": 2908.2112, + "vs_reference": -0.02349486089371522, + "vs_best_evaluated": 0.07394433915860277 + }, + "2": { + "best_area": 2884.8872, + "vs_reference": -0.0313264811916204, + "vs_best_evaluated": 0.06533125157867214 + }, + "4": { + "best_area": 2842.6356, + "vs_reference": -0.04551351978615681, + "vs_best_evaluated": 0.04972857917290119 + }, + "8": { + "best_area": 2758.6487, + "vs_reference": -0.07371423624980489, + "vs_best_evaluated": 0.01871389364439513 + } + }, + "reference_area": 2978.1832, + "best_evaluated_area": 2707.972, + "best_evaluated_complete": true, + "evaluator_s": 216.9, + "model_s": 343.4, + "usage": [ + { + "input_tokens": 15263, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1102, + "reasoning_output_tokens": 424 + }, + { + "input_tokens": 16232, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1071, + "reasoning_output_tokens": 385 + }, + { + "input_tokens": 17207, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1465, + "reasoning_output_tokens": 780 + }, + { + "input_tokens": 18181, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1190, + "reasoning_output_tokens": 231 + }, + { + "input_tokens": 19431, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1869, + "reasoning_output_tokens": 910 + }, + { + "input_tokens": 20673, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1344, + "reasoning_output_tokens": 385 + }, + { + "input_tokens": 21925, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1459, + "reasoning_output_tokens": 489 + }, + { + "input_tokens": 23184, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 1993, + "reasoning_output_tokens": 1034 + } + ], + "isolation_breach": false, + "interface": "sharing" + }, + { + "tag": "openai_gpt-6.1-sol", + "task": "C16_gf180_sW2_sL1", + "topology": "C16", + "rep": "r1", + "n_proposals": 4, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 4, + "statuses": { + "auto_passed": 4 + }, + "drc_lvs_clean": 4, + "auto_passed": 4, + "best": { + "1": { + "best_area": 1729.3648, + "vs_reference": 0.0, + "vs_best_evaluated": 0.2531418312387792 + }, + "2": { + "best_area": 1729.3648, + "vs_reference": 0.0, + "vs_best_evaluated": 0.2531418312387792 + }, + "4": { + "best_area": 1729.3648, + "vs_reference": 0.0, + "vs_best_evaluated": 0.2531418312387792 + }, + "8": { + "best_area": 1729.3648, + "vs_reference": 0.0, + "vs_best_evaluated": 0.2531418312387792 + } + }, + "reference_area": 1729.3648, + "best_evaluated_area": 1380.0232, + "best_evaluated_complete": true, + "evaluator_s": 81.0, + "model_s": 68.9, + "usage": [ + { + "input_tokens": 14827, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 80, + "reasoning_output_tokens": 32 + }, + { + "input_tokens": 15102, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 412, + "reasoning_output_tokens": 100 + }, + { + "input_tokens": 15633, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 463, + "reasoning_output_tokens": 151 + }, + { + "input_tokens": 16166, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 109, + "reasoning_output_tokens": 63 + }, + { + "input_tokens": 16431, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 285, + "reasoning_output_tokens": 278 + } + ], + "isolation_breach": false, + "interface": "sharing" + }, + { + "tag": "openai_gpt-6.1-sol", + "task": "C16_gf180_sW2_sL1", + "topology": "C16", + "rep": "r2", + "n_proposals": 7, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 7, + "statuses": { + "auto_passed": 7 + }, + "drc_lvs_clean": 7, + "auto_passed": 7, + "best": { + "1": { + "best_area": 1729.3648, + "vs_reference": 0.0, + "vs_best_evaluated": 0.2531418312387792 + }, + "2": { + "best_area": 1729.3648, + "vs_reference": 0.0, + "vs_best_evaluated": 0.2531418312387792 + }, + "4": { + "best_area": 1729.3648, + "vs_reference": 0.0, + "vs_best_evaluated": 0.2531418312387792 + }, + "8": { + "best_area": 1380.0232, + "vs_reference": -0.20200573065902572, + "vs_best_evaluated": 0.0 + } + }, + "reference_area": 1729.3648, + "best_evaluated_area": 1380.0232, + "best_evaluated_complete": true, + "evaluator_s": 152.1, + "model_s": 133.9, + "usage": [ + { + "input_tokens": 14831, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 76, + "reasoning_output_tokens": 28 + }, + { + "input_tokens": 15100, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 460, + "reasoning_output_tokens": 148 + }, + { + "input_tokens": 15631, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 406, + "reasoning_output_tokens": 94 + }, + { + "input_tokens": 16164, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 208, + "reasoning_output_tokens": 162 + }, + { + "input_tokens": 16435, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 594, + "reasoning_output_tokens": 282 + }, + { + "input_tokens": 16964, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 605, + "reasoning_output_tokens": 282 + }, + { + "input_tokens": 17512, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 791, + "reasoning_output_tokens": 482 + }, + { + "input_tokens": 18042, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 118, + "reasoning_output_tokens": 111 + } + ], + "isolation_breach": false, + "interface": "sharing" + }, + { + "tag": "openai_gpt-6.1-sol", + "task": "C16_gf180_sW2_sL1", + "topology": "C16", + "rep": "r3", + "n_proposals": 4, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 4, + "statuses": { + "auto_passed": 4 + }, + "drc_lvs_clean": 4, + "auto_passed": 4, + "best": { + "1": { + "best_area": 1729.3648, + "vs_reference": 0.0, + "vs_best_evaluated": 0.2531418312387792 + }, + "2": { + "best_area": 1729.3648, + "vs_reference": 0.0, + "vs_best_evaluated": 0.2531418312387792 + }, + "4": { + "best_area": 1729.3648, + "vs_reference": 0.0, + "vs_best_evaluated": 0.2531418312387792 + }, + "8": { + "best_area": 1729.3648, + "vs_reference": 0.0, + "vs_best_evaluated": 0.2531418312387792 + } + }, + "reference_area": 1729.3648, + "best_evaluated_area": 1380.0232, + "best_evaluated_complete": true, + "evaluator_s": 91.0, + "model_s": 75.0, + "usage": [ + { + "input_tokens": 14831, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 80, + "reasoning_output_tokens": 32 + }, + { + "input_tokens": 15102, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 530, + "reasoning_output_tokens": 218 + }, + { + "input_tokens": 15631, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 291, + "reasoning_output_tokens": 243 + }, + { + "input_tokens": 15900, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 203, + "reasoning_output_tokens": 157 + }, + { + "input_tokens": 16167, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 367, + "reasoning_output_tokens": 360 + } + ], + "isolation_breach": false, + "interface": "sharing" + }, + { + "tag": "openai_gpt-6.1-sol", + "task": "C16_gf180_sW2_sL2", + "topology": "C16", + "rep": "r1", + "n_proposals": 7, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 1, + "eda_verifications": 6, + "statuses": { + "auto_passed": 7 + }, + "drc_lvs_clean": 7, + "auto_passed": 7, + "best": { + "1": { + "best_area": 1729.3648, + "vs_reference": 0.0, + "vs_best_evaluated": 0.2531418312387792 + }, + "2": { + "best_area": 1729.3648, + "vs_reference": 0.0, + "vs_best_evaluated": 0.2531418312387792 + }, + "4": { + "best_area": 1479.1272, + "vs_reference": -0.14469914040114618, + "vs_best_evaluated": 0.07181328545780952 + }, + "8": { + "best_area": 1380.0232, + "vs_reference": -0.20200573065902572, + "vs_best_evaluated": 0.0 + } + }, + "reference_area": 1729.3648, + "best_evaluated_area": 1380.0232, + "best_evaluated_complete": true, + "evaluator_s": 128.0, + "model_s": 152.2, + "usage": [ + { + "input_tokens": 14829, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 81, + "reasoning_output_tokens": 33 + }, + { + "input_tokens": 15102, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 283, + "reasoning_output_tokens": 235 + }, + { + "input_tokens": 15369, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 226, + "reasoning_output_tokens": 178 + }, + { + "input_tokens": 15638, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 404, + "reasoning_output_tokens": 92 + }, + { + "input_tokens": 16181, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 419, + "reasoning_output_tokens": 371 + }, + { + "input_tokens": 16452, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 697, + "reasoning_output_tokens": 364 + }, + { + "input_tokens": 17006, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 665, + "reasoning_output_tokens": 356 + }, + { + "input_tokens": 17532, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 163, + "reasoning_output_tokens": 156 + } + ], + "isolation_breach": false, + "interface": "sharing" + }, + { + "tag": "openai_gpt-6.1-sol", + "task": "C16_gf180_sW2_sL2", + "topology": "C16", + "rep": "r2", + "n_proposals": 5, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 5, + "statuses": { + "auto_passed": 5 + }, + "drc_lvs_clean": 5, + "auto_passed": 5, + "best": { + "1": { + "best_area": 1729.3648, + "vs_reference": 0.0, + "vs_best_evaluated": 0.2531418312387792 + }, + "2": { + "best_area": 1729.3648, + "vs_reference": 0.0, + "vs_best_evaluated": 0.2531418312387792 + }, + "4": { + "best_area": 1729.3648, + "vs_reference": 0.0, + "vs_best_evaluated": 0.2531418312387792 + }, + "8": { + "best_area": 1479.1272, + "vs_reference": -0.14469914040114618, + "vs_best_evaluated": 0.07181328545780952 + } + }, + "reference_area": 1729.3648, + "best_evaluated_area": 1380.0232, + "best_evaluated_complete": true, + "evaluator_s": 111.0, + "model_s": 89.2, + "usage": [ + { + "input_tokens": 14829, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 68, + "reasoning_output_tokens": 20 + }, + { + "input_tokens": 15100, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 460, + "reasoning_output_tokens": 148 + }, + { + "input_tokens": 15635, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 463, + "reasoning_output_tokens": 151 + }, + { + "input_tokens": 16164, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 321, + "reasoning_output_tokens": 273 + }, + { + "input_tokens": 16433, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 552, + "reasoning_output_tokens": 240 + }, + { + "input_tokens": 16966, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 141, + "reasoning_output_tokens": 134 + } + ], + "isolation_breach": false, + "interface": "sharing" + }, + { + "tag": "openai_gpt-6.1-sol", + "task": "C16_gf180_sW2_sL2", + "topology": "C16", + "rep": "r3", + "n_proposals": 7, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 1, + "eda_verifications": 6, + "statuses": { + "auto_passed": 7 + }, + "drc_lvs_clean": 7, + "auto_passed": 7, + "best": { + "1": { + "best_area": 1729.3648, + "vs_reference": 0.0, + "vs_best_evaluated": 0.2531418312387792 + }, + "2": { + "best_area": 1729.3648, + "vs_reference": 0.0, + "vs_best_evaluated": 0.2531418312387792 + }, + "4": { + "best_area": 1479.1272, + "vs_reference": -0.14469914040114618, + "vs_best_evaluated": 0.07181328545780952 + }, + "8": { + "best_area": 1380.0232, + "vs_reference": -0.20200573065902572, + "vs_best_evaluated": 0.0 + } + }, + "reference_area": 1729.3648, + "best_evaluated_area": 1380.0232, + "best_evaluated_complete": true, + "evaluator_s": 127.9, + "model_s": 137.7, + "usage": [ + { + "input_tokens": 14833, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 105, + "reasoning_output_tokens": 57 + }, + { + "input_tokens": 15102, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 242, + "reasoning_output_tokens": 194 + }, + { + "input_tokens": 15371, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 208, + "reasoning_output_tokens": 160 + }, + { + "input_tokens": 15640, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 431, + "reasoning_output_tokens": 119 + }, + { + "input_tokens": 16185, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 456, + "reasoning_output_tokens": 408 + }, + { + "input_tokens": 16450, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 781, + "reasoning_output_tokens": 472 + }, + { + "input_tokens": 16980, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 671, + "reasoning_output_tokens": 338 + }, + { + "input_tokens": 17536, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 108, + "reasoning_output_tokens": 101 + } + ], + "isolation_breach": false, + "interface": "sharing" + }, + { + "tag": "openai_gpt-6.1-sol", + "task": "C16_ihp130_sW2_sL1", + "topology": "C16", + "rep": "r1", + "n_proposals": 7, + "first_legal": true, + "n_rejected": 1, + "n_duplicates": 0, + "eda_verifications": 6, + "statuses": { + "auto_passed": 6, + "rejected_program": 1 + }, + "drc_lvs_clean": 6, + "auto_passed": 6, + "best": { + "1": { + "best_area": 1007.736, + "vs_reference": 0.0, + "vs_best_evaluated": 0.14487249050461193 + }, + "2": { + "best_area": 1007.736, + "vs_reference": 0.0, + "vs_best_evaluated": 0.14487249050461193 + }, + "4": { + "best_area": 1007.736, + "vs_reference": 0.0, + "vs_best_evaluated": 0.14487249050461193 + }, + "8": { + "best_area": 880.2168, + "vs_reference": -0.1265402843601895, + "vs_best_evaluated": 0.0 + } + }, + "reference_area": 1007.736, + "best_evaluated_area": 880.2168, + "best_evaluated_complete": true, + "evaluator_s": 51.9, + "model_s": 126.5, + "usage": [ + { + "input_tokens": 14836, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 94, + "reasoning_output_tokens": 46 + }, + { + "input_tokens": 15098, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 423, + "reasoning_output_tokens": 111 + }, + { + "input_tokens": 15454, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 391, + "reasoning_output_tokens": 79 + }, + { + "input_tokens": 15987, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 145, + "reasoning_output_tokens": 97 + }, + { + "input_tokens": 16259, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 171, + "reasoning_output_tokens": 125 + }, + { + "input_tokens": 16523, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 151, + "reasoning_output_tokens": 103 + }, + { + "input_tokens": 16789, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 679, + "reasoning_output_tokens": 367 + }, + { + "input_tokens": 17323, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 284, + "reasoning_output_tokens": 277 + } + ], + "isolation_breach": false, + "interface": "sharing" + }, + { + "tag": "openai_gpt-6.1-sol", + "task": "C16_ihp130_sW2_sL1", + "topology": "C16", + "rep": "r2", + "n_proposals": 5, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 5, + "statuses": { + "auto_passed": 5 + }, + "drc_lvs_clean": 5, + "auto_passed": 5, + "best": { + "1": { + "best_area": 1007.736, + "vs_reference": 0.0, + "vs_best_evaluated": 0.14487249050461193 + }, + "2": { + "best_area": 1007.736, + "vs_reference": 0.0, + "vs_best_evaluated": 0.14487249050461193 + }, + "4": { + "best_area": 1007.736, + "vs_reference": 0.0, + "vs_best_evaluated": 0.14487249050461193 + }, + "8": { + "best_area": 880.2168, + "vs_reference": -0.1265402843601895, + "vs_best_evaluated": 0.0 + } + }, + "reference_area": 1007.736, + "best_evaluated_area": 880.2168, + "best_evaluated_complete": true, + "evaluator_s": 44.8, + "model_s": 97.6, + "usage": [ + { + "input_tokens": 14830, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 96, + "reasoning_output_tokens": 48 + }, + { + "input_tokens": 15100, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 494, + "reasoning_output_tokens": 182 + }, + { + "input_tokens": 15636, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 476, + "reasoning_output_tokens": 164 + }, + { + "input_tokens": 16165, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 272, + "reasoning_output_tokens": 226 + }, + { + "input_tokens": 16433, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 409, + "reasoning_output_tokens": 97 + }, + { + "input_tokens": 16965, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 272, + "reasoning_output_tokens": 265 + } + ], + "isolation_breach": false, + "interface": "sharing" + }, + { + "tag": "openai_gpt-6.1-sol", + "task": "C16_ihp130_sW2_sL1", + "topology": "C16", + "rep": "r3", + "n_proposals": 6, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 6, + "statuses": { + "auto_passed": 6 + }, + "drc_lvs_clean": 6, + "auto_passed": 6, + "best": { + "1": { + "best_area": 1007.736, + "vs_reference": 0.0, + "vs_best_evaluated": 0.14487249050461193 + }, + "2": { + "best_area": 1007.736, + "vs_reference": 0.0, + "vs_best_evaluated": 0.14487249050461193 + }, + "4": { + "best_area": 1007.736, + "vs_reference": 0.0, + "vs_best_evaluated": 0.14487249050461193 + }, + "8": { + "best_area": 880.2168, + "vs_reference": -0.1265402843601895, + "vs_best_evaluated": 0.0 + } + }, + "reference_area": 1007.736, + "best_evaluated_area": 880.2168, + "best_evaluated_complete": true, + "evaluator_s": 53.2, + "model_s": 108.2, + "usage": [ + { + "input_tokens": 14834, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 86, + "reasoning_output_tokens": 38 + }, + { + "input_tokens": 15102, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 245, + "reasoning_output_tokens": 199 + }, + { + "input_tokens": 15370, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 450, + "reasoning_output_tokens": 138 + }, + { + "input_tokens": 15901, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 111, + "reasoning_output_tokens": 63 + }, + { + "input_tokens": 16165, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 583, + "reasoning_output_tokens": 271 + }, + { + "input_tokens": 16701, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 662, + "reasoning_output_tokens": 339 + }, + { + "input_tokens": 17244, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 201, + "reasoning_output_tokens": 194 + } + ], + "isolation_breach": false, + "interface": "sharing" + }, + { + "tag": "openai_gpt-6.1-sol", + "task": "C16_ihp130_sW2_sL2", + "topology": "C16", + "rep": "r1", + "n_proposals": 5, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 5, + "statuses": { + "auto_passed": 5 + }, + "drc_lvs_clean": 5, + "auto_passed": 5, + "best": { + "1": { + "best_area": 1007.736, + "vs_reference": 0.0, + "vs_best_evaluated": 0.22318840579710142 + }, + "2": { + "best_area": 1007.736, + "vs_reference": 0.0, + "vs_best_evaluated": 0.22318840579710142 + }, + "4": { + "best_area": 1007.736, + "vs_reference": 0.0, + "vs_best_evaluated": 0.22318840579710142 + }, + "8": { + "best_area": 1007.736, + "vs_reference": 0.0, + "vs_best_evaluated": 0.22318840579710142 + } + }, + "reference_area": 1007.736, + "best_evaluated_area": 823.86, + "best_evaluated_complete": true, + "evaluator_s": 42.6, + "model_s": 86.1, + "usage": [ + { + "input_tokens": 14834, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 105, + "reasoning_output_tokens": 57 + }, + { + "input_tokens": 15102, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 512, + "reasoning_output_tokens": 200 + }, + { + "input_tokens": 15634, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 440, + "reasoning_output_tokens": 128 + }, + { + "input_tokens": 16169, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 149, + "reasoning_output_tokens": 103 + }, + { + "input_tokens": 16435, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 338, + "reasoning_output_tokens": 290 + }, + { + "input_tokens": 16699, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 206, + "reasoning_output_tokens": 199 + } + ], + "isolation_breach": false, + "interface": "sharing" + }, + { + "tag": "openai_gpt-6.1-sol", + "task": "C16_ihp130_sW2_sL2", + "topology": "C16", + "rep": "r2", + "n_proposals": 7, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 7, + "statuses": { + "auto_passed": 7 + }, + "drc_lvs_clean": 7, + "auto_passed": 7, + "best": { + "1": { + "best_area": 1007.736, + "vs_reference": 0.0, + "vs_best_evaluated": 0.22318840579710142 + }, + "2": { + "best_area": 1007.736, + "vs_reference": 0.0, + "vs_best_evaluated": 0.22318840579710142 + }, + "4": { + "best_area": 1007.736, + "vs_reference": 0.0, + "vs_best_evaluated": 0.22318840579710142 + }, + "8": { + "best_area": 823.86, + "vs_reference": -0.18246445497630326, + "vs_best_evaluated": 0.0 + } + }, + "reference_area": 1007.736, + "best_evaluated_area": 823.86, + "best_evaluated_complete": true, + "evaluator_s": 61.1, + "model_s": 134.6, + "usage": [ + { + "input_tokens": 14832, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 98, + "reasoning_output_tokens": 50 + }, + { + "input_tokens": 15100, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 481, + "reasoning_output_tokens": 169 + }, + { + "input_tokens": 15636, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 457, + "reasoning_output_tokens": 145 + }, + { + "input_tokens": 16167, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 130, + "reasoning_output_tokens": 84 + }, + { + "input_tokens": 16431, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 475, + "reasoning_output_tokens": 427 + }, + { + "input_tokens": 16701, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 552, + "reasoning_output_tokens": 240 + }, + { + "input_tokens": 17231, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 539, + "reasoning_output_tokens": 216 + }, + { + "input_tokens": 17773, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 241, + "reasoning_output_tokens": 234 + } + ], + "isolation_breach": false, + "interface": "sharing" + }, + { + "tag": "openai_gpt-6.1-sol", + "task": "C16_ihp130_sW2_sL2", + "topology": "C16", + "rep": "r3", + "n_proposals": 7, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 7, + "statuses": { + "auto_passed": 7 + }, + "drc_lvs_clean": 7, + "auto_passed": 7, + "best": { + "1": { + "best_area": 1007.736, + "vs_reference": 0.0, + "vs_best_evaluated": 0.22318840579710142 + }, + "2": { + "best_area": 1007.736, + "vs_reference": 0.0, + "vs_best_evaluated": 0.22318840579710142 + }, + "4": { + "best_area": 1007.736, + "vs_reference": 0.0, + "vs_best_evaluated": 0.22318840579710142 + }, + "8": { + "best_area": 1007.736, + "vs_reference": 0.0, + "vs_best_evaluated": 0.22318840579710142 + } + }, + "reference_area": 1007.736, + "best_evaluated_area": 823.86, + "best_evaluated_complete": true, + "evaluator_s": 62.1, + "model_s": 132.3, + "usage": [ + { + "input_tokens": 14832, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 79, + "reasoning_output_tokens": 31 + }, + { + "input_tokens": 15102, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 423, + "reasoning_output_tokens": 111 + }, + { + "input_tokens": 15633, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 116, + "reasoning_output_tokens": 68 + }, + { + "input_tokens": 15901, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 193, + "reasoning_output_tokens": 147 + }, + { + "input_tokens": 16169, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 493, + "reasoning_output_tokens": 445 + }, + { + "input_tokens": 16437, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 743, + "reasoning_output_tokens": 431 + }, + { + "input_tokens": 16966, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 614, + "reasoning_output_tokens": 302 + }, + { + "input_tokens": 17505, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 135, + "reasoning_output_tokens": 128 + } + ], + "isolation_breach": false, + "interface": "sharing" + }, + { + "tag": "openai_gpt-6.1-sol", + "task": "C16_sky130_sW2_sL1", + "topology": "C16", + "rep": "r1", + "n_proposals": 5, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 5, + "statuses": { + "auto_passed": 5 + }, + "drc_lvs_clean": 5, + "auto_passed": 5, + "best": { + "1": { + "best_area": 377.2789, + "vs_reference": 0.0, + "vs_best_evaluated": 0.17840662268451868 + }, + "2": { + "best_area": 377.2789, + "vs_reference": 0.0, + "vs_best_evaluated": 0.17840662268451868 + }, + "4": { + "best_area": 377.2789, + "vs_reference": 0.0, + "vs_best_evaluated": 0.17840662268451868 + }, + "8": { + "best_area": 377.2789, + "vs_reference": 0.0, + "vs_best_evaluated": 0.17840662268451868 + } + }, + "reference_area": 377.2789, + "best_evaluated_area": 320.1602, + "best_evaluated_complete": true, + "evaluator_s": 86.5, + "model_s": 85.3, + "usage": [ + { + "input_tokens": 14838, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 75, + "reasoning_output_tokens": 27 + }, + { + "input_tokens": 15104, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 479, + "reasoning_output_tokens": 167 + }, + { + "input_tokens": 15638, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 113, + "reasoning_output_tokens": 67 + }, + { + "input_tokens": 15904, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 446, + "reasoning_output_tokens": 134 + }, + { + "input_tokens": 16440, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 197, + "reasoning_output_tokens": 149 + }, + { + "input_tokens": 16706, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 258, + "reasoning_output_tokens": 251 + } + ], + "isolation_breach": false, + "interface": "sharing" + }, + { + "tag": "openai_gpt-6.1-sol", + "task": "C16_sky130_sW2_sL1", + "topology": "C16", + "rep": "r2", + "n_proposals": 7, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 7, + "statuses": { + "auto_passed": 7 + }, + "drc_lvs_clean": 7, + "auto_passed": 7, + "best": { + "1": { + "best_area": 377.2789, + "vs_reference": 0.0, + "vs_best_evaluated": 0.17840662268451868 + }, + "2": { + "best_area": 377.2789, + "vs_reference": 0.0, + "vs_best_evaluated": 0.17840662268451868 + }, + "4": { + "best_area": 377.2789, + "vs_reference": 0.0, + "vs_best_evaluated": 0.17840662268451868 + }, + "8": { + "best_area": 320.1602, + "vs_reference": -0.1513964867900114, + "vs_best_evaluated": 0.0 + } + }, + "reference_area": 377.2789, + "best_evaluated_area": 320.1602, + "best_evaluated_complete": true, + "evaluator_s": 125.3, + "model_s": 117.2, + "usage": [ + { + "input_tokens": 14842, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 91, + "reasoning_output_tokens": 43 + }, + { + "input_tokens": 15106, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 168, + "reasoning_output_tokens": 122 + }, + { + "input_tokens": 15374, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 425, + "reasoning_output_tokens": 113 + }, + { + "input_tokens": 15902, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 563, + "reasoning_output_tokens": 251 + }, + { + "input_tokens": 16438, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 417, + "reasoning_output_tokens": 369 + }, + { + "input_tokens": 16706, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 251, + "reasoning_output_tokens": 203 + }, + { + "input_tokens": 16972, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 523, + "reasoning_output_tokens": 211 + }, + { + "input_tokens": 17506, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 104, + "reasoning_output_tokens": 97 + } + ], + "isolation_breach": false, + "interface": "sharing" + }, + { + "tag": "openai_gpt-6.1-sol", + "task": "C16_sky130_sW2_sL1", + "topology": "C16", + "rep": "r3", + "n_proposals": 4, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 4, + "statuses": { + "auto_passed": 4 + }, + "drc_lvs_clean": 4, + "auto_passed": 4, + "best": { + "1": { + "best_area": 377.2789, + "vs_reference": 0.0, + "vs_best_evaluated": 0.17840662268451868 + }, + "2": { + "best_area": 377.2789, + "vs_reference": 0.0, + "vs_best_evaluated": 0.17840662268451868 + }, + "4": { + "best_area": 377.2789, + "vs_reference": 0.0, + "vs_best_evaluated": 0.17840662268451868 + }, + "8": { + "best_area": 377.2789, + "vs_reference": 0.0, + "vs_best_evaluated": 0.17840662268451868 + } + }, + "reference_area": 377.2789, + "best_evaluated_area": 320.1602, + "best_evaluated_complete": true, + "evaluator_s": 71.7, + "model_s": 74.9, + "usage": [ + { + "input_tokens": 14840, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 83, + "reasoning_output_tokens": 35 + }, + { + "input_tokens": 15106, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 265, + "reasoning_output_tokens": 217 + }, + { + "input_tokens": 15374, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 488, + "reasoning_output_tokens": 176 + }, + { + "input_tokens": 15910, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 103, + "reasoning_output_tokens": 57 + }, + { + "input_tokens": 16174, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 454, + "reasoning_output_tokens": 447 + } + ], + "isolation_breach": false, + "interface": "sharing" + }, + { + "tag": "openai_gpt-6.1-sol", + "task": "C16_sky130_sW2_sL2", + "topology": "C16", + "rep": "r1", + "n_proposals": 7, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 7, + "statuses": { + "auto_passed": 7 + }, + "drc_lvs_clean": 7, + "auto_passed": 7, + "best": { + "1": { + "best_area": 377.2789, + "vs_reference": 0.0, + "vs_best_evaluated": 0.2677020313599916 + }, + "2": { + "best_area": 377.2789, + "vs_reference": 0.0, + "vs_best_evaluated": 0.2677020313599916 + }, + "4": { + "best_area": 377.2789, + "vs_reference": 0.0, + "vs_best_evaluated": 0.2677020313599916 + }, + "8": { + "best_area": 297.6085, + "vs_reference": -0.21117109915237775, + "vs_best_evaluated": 0.0 + } + }, + "reference_area": 377.2789, + "best_evaluated_area": 297.6085, + "best_evaluated_complete": true, + "evaluator_s": 124.7, + "model_s": 128.7, + "usage": [ + { + "input_tokens": 14844, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 88, + "reasoning_output_tokens": 40 + }, + { + "input_tokens": 15108, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 361, + "reasoning_output_tokens": 313 + }, + { + "input_tokens": 15378, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 445, + "reasoning_output_tokens": 133 + }, + { + "input_tokens": 15908, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 128, + "reasoning_output_tokens": 82 + }, + { + "input_tokens": 16176, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 284, + "reasoning_output_tokens": 236 + }, + { + "input_tokens": 16440, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 526, + "reasoning_output_tokens": 214 + }, + { + "input_tokens": 16974, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 638, + "reasoning_output_tokens": 315 + }, + { + "input_tokens": 17515, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 251, + "reasoning_output_tokens": 244 + } + ], + "isolation_breach": false, + "interface": "sharing" + }, + { + "tag": "openai_gpt-6.1-sol", + "task": "C16_sky130_sW2_sL2", + "topology": "C16", + "rep": "r2", + "n_proposals": 5, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 5, + "statuses": { + "auto_passed": 5 + }, + "drc_lvs_clean": 5, + "auto_passed": 5, + "best": { + "1": { + "best_area": 377.2789, + "vs_reference": 0.0, + "vs_best_evaluated": 0.2677020313599916 + }, + "2": { + "best_area": 377.2789, + "vs_reference": 0.0, + "vs_best_evaluated": 0.2677020313599916 + }, + "4": { + "best_area": 377.2789, + "vs_reference": 0.0, + "vs_best_evaluated": 0.2677020313599916 + }, + "8": { + "best_area": 320.1602, + "vs_reference": -0.1513964867900114, + "vs_best_evaluated": 0.0757763975155279 + } + }, + "reference_area": 377.2789, + "best_evaluated_area": 297.6085, + "best_evaluated_complete": true, + "evaluator_s": 90.5, + "model_s": 85.1, + "usage": [ + { + "input_tokens": 14838, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 91, + "reasoning_output_tokens": 43 + }, + { + "input_tokens": 15102, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 139, + "reasoning_output_tokens": 93 + }, + { + "input_tokens": 15374, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 501, + "reasoning_output_tokens": 189 + }, + { + "input_tokens": 15904, + "cached_input_tokens": 0, + "cache_write_input_tokens": 0, + "output_tokens": 537, + "reasoning_output_tokens": 225 + }, + { + "input_tokens": 16438, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 461, + "reasoning_output_tokens": 149 + }, + { + "input_tokens": 16970, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 168, + "reasoning_output_tokens": 161 + } + ], + "isolation_breach": false, + "interface": "sharing" + }, + { + "tag": "openai_gpt-6.1-sol", + "task": "C16_sky130_sW2_sL2", + "topology": "C16", + "rep": "r3", + "n_proposals": 6, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 6, + "statuses": { + "auto_passed": 6 + }, + "drc_lvs_clean": 6, + "auto_passed": 6, + "best": { + "1": { + "best_area": 377.2789, + "vs_reference": 0.0, + "vs_best_evaluated": 0.2677020313599916 + }, + "2": { + "best_area": 377.2789, + "vs_reference": 0.0, + "vs_best_evaluated": 0.2677020313599916 + }, + "4": { + "best_area": 377.2789, + "vs_reference": 0.0, + "vs_best_evaluated": 0.2677020313599916 + }, + "8": { + "best_area": 320.1602, + "vs_reference": -0.1513964867900114, + "vs_best_evaluated": 0.0757763975155279 + } + }, + "reference_area": 377.2789, + "best_evaluated_area": 297.6085, + "best_evaluated_complete": true, + "evaluator_s": 107.9, + "model_s": 109.0, + "usage": [ + { + "input_tokens": 14836, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 80, + "reasoning_output_tokens": 32 + }, + { + "input_tokens": 15106, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 321, + "reasoning_output_tokens": 275 + }, + { + "input_tokens": 15374, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 480, + "reasoning_output_tokens": 168 + }, + { + "input_tokens": 15906, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 403, + "reasoning_output_tokens": 91 + }, + { + "input_tokens": 16438, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 147, + "reasoning_output_tokens": 99 + }, + { + "input_tokens": 16706, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 562, + "reasoning_output_tokens": 250 + }, + { + "input_tokens": 17238, + "cached_input_tokens": 8448, + "cache_write_input_tokens": 0, + "output_tokens": 398, + "reasoning_output_tokens": 391 + } + ], + "isolation_breach": false, + "interface": "sharing" + }, + { + "tag": "anthropic_claude-sonnet", + "task": "C02_gf180_sW2_sL1", + "topology": "C02", + "rep": "r1", + "n_proposals": 6, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 6, + "statuses": { + "auto_passed": 6 + }, + "drc_lvs_clean": 6, + "auto_passed": 6, + "best": { + "1": { + "best_area": 444.8808, + "vs_reference": -0.12430555555555545, + "vs_best_evaluated": 0.03778454579045798 + }, + "2": { + "best_area": 444.8808, + "vs_reference": -0.12430555555555545, + "vs_best_evaluated": 0.03778454579045798 + }, + "4": { + "best_area": 444.8808, + "vs_reference": -0.12430555555555545, + "vs_best_evaluated": 0.03778454579045798 + }, + "8": { + "best_area": 299.9124, + "vs_reference": -0.4096584467120181, + "vs_best_evaluated": -0.3003868591071449 + } + }, + "reference_area": 508.032, + "best_evaluated_area": 428.6832, + "best_evaluated_complete": true, + "evaluator_s": 125.1, + "model_s": null, + "usage": null, + "isolation_breach": null, + "interface": "sharing" + }, + { + "tag": "anthropic_claude-sonnet", + "task": "C02_gf180_sW2_sL1", + "topology": "C02", + "rep": "r2", + "n_proposals": 5, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 5, + "statuses": { + "auto_passed": 5 + }, + "drc_lvs_clean": 5, + "auto_passed": 5, + "best": { + "1": { + "best_area": 520.3312, + "vs_reference": 0.024209498614260472, + "vs_best_evaluated": 0.2137895770116487 + }, + "2": { + "best_area": 479.808, + "vs_reference": -0.05555555555555558, + "vs_best_evaluated": 0.11926009696671103 + }, + "4": { + "best_area": 455.936, + "vs_reference": -0.10254472159234063, + "vs_best_evaluated": 0.06357328675348128 + }, + "8": { + "best_area": 455.936, + "vs_reference": -0.10254472159234063, + "vs_best_evaluated": 0.06357328675348128 + } + }, + "reference_area": 508.032, + "best_evaluated_area": 428.6832, + "best_evaluated_complete": true, + "evaluator_s": 103.1, + "model_s": null, + "usage": null, + "isolation_breach": null, + "interface": "sharing" + }, + { + "tag": "anthropic_claude-sonnet", + "task": "C02_gf180_sW2_sL1", + "topology": "C02", + "rep": "r3", + "n_proposals": 7, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 7, + "statuses": { + "auto_passed": 7 + }, + "drc_lvs_clean": 7, + "auto_passed": 7, + "best": { + "1": { + "best_area": 441.612, + "vs_reference": -0.13073979591836726, + "vs_best_evaluated": 0.030159334445576613 + }, + "2": { + "best_area": 441.612, + "vs_reference": -0.13073979591836726, + "vs_best_evaluated": 0.030159334445576613 + }, + "4": { + "best_area": 441.612, + "vs_reference": -0.13073979591836726, + "vs_best_evaluated": 0.030159334445576613 + }, + "8": { + "best_area": 412.2888, + "vs_reference": -0.18845899470899474, + "vs_best_evaluated": -0.03824362606232301 + } + }, + "reference_area": 508.032, + "best_evaluated_area": 428.6832, + "best_evaluated_complete": true, + "evaluator_s": 157.7, + "model_s": null, + "usage": null, + "isolation_breach": null, + "interface": "sharing" + }, + { + "tag": "anthropic_claude-sonnet", + "task": "C02_gf180_sW2_sL2", + "topology": "C02", + "rep": "r1", + "n_proposals": 3, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 3, + "statuses": { + "auto_passed": 3 + }, + "drc_lvs_clean": 3, + "auto_passed": 3, + "best": { + "1": { + "best_area": 593.6392, + "vs_reference": -0.17409156070805298, + "vs_best_evaluated": -0.026874585268745865 + }, + "2": { + "best_area": 593.6392, + "vs_reference": -0.17409156070805298, + "vs_best_evaluated": -0.026874585268745865 + }, + "4": { + "best_area": 593.6392, + "vs_reference": -0.17409156070805298, + "vs_best_evaluated": -0.026874585268745865 + }, + "8": { + "best_area": 593.6392, + "vs_reference": -0.17409156070805298, + "vs_best_evaluated": -0.026874585268745865 + } + }, + "reference_area": 718.7712, + "best_evaluated_area": 610.0336, + "best_evaluated_complete": true, + "evaluator_s": 60.3, + "model_s": null, + "usage": null, + "isolation_breach": null, + "interface": "sharing" + }, + { + "tag": "anthropic_claude-sonnet", + "task": "C02_gf180_sW2_sL2", + "topology": "C02", + "rep": "r2", + "n_proposals": 6, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 6, + "statuses": { + "auto_passed": 6 + }, + "drc_lvs_clean": 6, + "auto_passed": 6, + "best": { + "1": { + "best_area": 682.1416, + "vs_reference": -0.05096141859885317, + "vs_best_evaluated": 0.11820332519389098 + }, + "2": { + "best_area": 682.1416, + "vs_reference": -0.05096141859885317, + "vs_best_evaluated": 0.11820332519389098 + }, + "4": { + "best_area": 587.6624, + "vs_reference": -0.18240686326886768, + "vs_best_evaluated": -0.03667207839043607 + }, + "8": { + "best_area": 587.6624, + "vs_reference": -0.18240686326886768, + "vs_best_evaluated": -0.03667207839043607 + } + }, + "reference_area": 718.7712, + "best_evaluated_area": 610.0336, + "best_evaluated_complete": true, + "evaluator_s": 126.1, + "model_s": null, + "usage": null, + "isolation_breach": null, + "interface": "sharing" + }, + { + "tag": "anthropic_claude-sonnet", + "task": "C02_gf180_sW2_sL2", + "topology": "C02", + "rep": "r3", + "n_proposals": 8, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 8, + "statuses": { + "auto_passed": 8 + }, + "drc_lvs_clean": 8, + "auto_passed": 8, + "best": { + "1": { + "best_area": 610.0336, + "vs_reference": -0.15128263347223714, + "vs_best_evaluated": 0.0 + }, + "2": { + "best_area": 610.0336, + "vs_reference": -0.15128263347223714, + "vs_best_evaluated": 0.0 + }, + "4": { + "best_area": 610.0336, + "vs_reference": -0.15128263347223714, + "vs_best_evaluated": 0.0 + }, + "8": { + "best_area": 587.6624, + "vs_reference": -0.18240686326886768, + "vs_best_evaluated": -0.03667207839043607 + } + }, + "reference_area": 718.7712, + "best_evaluated_area": 610.0336, + "best_evaluated_complete": true, + "evaluator_s": 180.3, + "model_s": null, + "usage": null, + "isolation_breach": null, + "interface": "sharing" + }, + { + "tag": "anthropic_claude-sonnet", + "task": "C02_ihp130_sW2_sL1", + "topology": "C02", + "rep": "r1", + "n_proposals": 7, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 7, + "statuses": { + "auto_passed": 7 + }, + "drc_lvs_clean": 7, + "auto_passed": 7, + "best": { + "1": { + "best_area": 281.4179, + "vs_reference": -0.0302625671045601, + "vs_best_evaluated": 0.1458178273679136 + }, + "2": { + "best_area": 238.0463, + "vs_reference": -0.17971668514242423, + "vs_best_evaluated": -0.030773471485038506 + }, + "4": { + "best_area": 219.5017, + "vs_reference": -0.24361948875965245, + "vs_best_evaluated": -0.10627944776233655 + }, + "8": { + "best_area": 219.5017, + "vs_reference": -0.24361948875965245, + "vs_best_evaluated": -0.10627944776233655 + } + }, + "reference_area": 290.2001, + "best_evaluated_area": 245.6044, + "best_evaluated_complete": true, + "evaluator_s": 59.9, + "model_s": null, + "usage": null, + "isolation_breach": null, + "interface": "sharing" + }, + { + "tag": "anthropic_claude-sonnet", + "task": "C02_ihp130_sW2_sL1", + "topology": "C02", + "rep": "r2", + "n_proposals": 8, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 8, + "statuses": { + "auto_passed": 8 + }, + "drc_lvs_clean": 8, + "auto_passed": 8, + "best": { + "1": { + "best_area": 257.48, + "vs_reference": -0.11275013344240747, + "vs_best_evaluated": 0.04835255394447335 + }, + "2": { + "best_area": 235.951, + "vs_reference": -0.18693687562478445, + "vs_best_evaluated": -0.0393046704375003 + }, + "4": { + "best_area": 235.951, + "vs_reference": -0.18693687562478445, + "vs_best_evaluated": -0.0393046704375003 + }, + "8": { + "best_area": 235.951, + "vs_reference": -0.18693687562478445, + "vs_best_evaluated": -0.0393046704375003 + } + }, + "reference_area": 290.2001, + "best_evaluated_area": 245.6044, + "best_evaluated_complete": true, + "evaluator_s": 69.1, + "model_s": null, + "usage": null, + "isolation_breach": null, + "interface": "sharing" + }, + { + "tag": "anthropic_claude-sonnet", + "task": "C02_ihp130_sW2_sL1", + "topology": "C02", + "rep": "r3", + "n_proposals": 5, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 5, + "statuses": { + "auto_passed": 5 + }, + "drc_lvs_clean": 5, + "auto_passed": 5, + "best": { + "1": { + "best_area": 281.4179, + "vs_reference": -0.0302625671045601, + "vs_best_evaluated": 0.1458178273679136 + }, + "2": { + "best_area": 230.0767, + "vs_reference": -0.20717911537590794, + "vs_best_evaluated": -0.06322240155306669 + }, + "4": { + "best_area": 230.0767, + "vs_reference": -0.20717911537590794, + "vs_best_evaluated": -0.06322240155306669 + }, + "8": { + "best_area": 177.2059, + "vs_reference": -0.38936650952222274, + "vs_best_evaluated": -0.278490531928581 + } + }, + "reference_area": 290.2001, + "best_evaluated_area": 245.6044, + "best_evaluated_complete": true, + "evaluator_s": 44.3, + "model_s": null, + "usage": null, + "isolation_breach": null, + "interface": "sharing" + }, + { + "tag": "anthropic_claude-sonnet", + "task": "C02_ihp130_sW2_sL2", + "topology": "C02", + "rep": "r1", + "n_proposals": 3, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 3, + "statuses": { + "auto_passed": 3 + }, + "drc_lvs_clean": 3, + "auto_passed": 3, + "best": { + "1": { + "best_area": 390.6, + "vs_reference": -0.0989006172277006, + "vs_best_evaluated": 0.05880401228711429 + }, + "2": { + "best_area": 390.6, + "vs_reference": -0.0989006172277006, + "vs_best_evaluated": 0.05880401228711429 + }, + "4": { + "best_area": 390.6, + "vs_reference": -0.0989006172277006, + "vs_best_evaluated": 0.05880401228711429 + }, + "8": { + "best_area": 390.6, + "vs_reference": -0.0989006172277006, + "vs_best_evaluated": 0.05880401228711429 + } + }, + "reference_area": 433.4705, + "best_evaluated_area": 368.9068, + "best_evaluated_complete": true, + "evaluator_s": 25.5, + "model_s": null, + "usage": null, + "isolation_breach": null, + "interface": "sharing" + }, + { + "tag": "anthropic_claude-sonnet", + "task": "C02_ihp130_sW2_sL2", + "topology": "C02", + "rep": "r2", + "n_proposals": 6, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 6, + "statuses": { + "auto_passed": 6 + }, + "drc_lvs_clean": 6, + "auto_passed": 6, + "best": { + "1": { + "best_area": 390.6, + "vs_reference": -0.0989006172277006, + "vs_best_evaluated": 0.05880401228711429 + }, + "2": { + "best_area": 390.6, + "vs_reference": -0.0989006172277006, + "vs_best_evaluated": 0.05880401228711429 + }, + "4": { + "best_area": 390.6, + "vs_reference": -0.0989006172277006, + "vs_best_evaluated": 0.05880401228711429 + }, + "8": { + "best_area": 361.3487, + "vs_reference": -0.16638225669336204, + "vs_best_evaluated": -0.020487830530637963 + } + }, + "reference_area": 433.4705, + "best_evaluated_area": 368.9068, + "best_evaluated_complete": true, + "evaluator_s": 53.0, + "model_s": null, + "usage": null, + "isolation_breach": null, + "interface": "sharing" + }, + { + "tag": "anthropic_claude-sonnet", + "task": "C02_ihp130_sW2_sL2", + "topology": "C02", + "rep": "r3", + "n_proposals": 6, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 6, + "statuses": { + "auto_passed": 6 + }, + "drc_lvs_clean": 6, + "auto_passed": 6, + "best": { + "1": { + "best_area": 390.6, + "vs_reference": -0.0989006172277006, + "vs_best_evaluated": 0.05880401228711429 + }, + "2": { + "best_area": 356.692, + "vs_reference": -0.17712508694363283, + "vs_best_evaluated": -0.033110801969494674 + }, + "4": { + "best_area": 356.692, + "vs_reference": -0.17712508694363283, + "vs_best_evaluated": -0.033110801969494674 + }, + "8": { + "best_area": 356.2582, + "vs_reference": -0.17812584708763346, + "vs_best_evaluated": -0.034286708729684534 + } + }, + "reference_area": 433.4705, + "best_evaluated_area": 368.9068, + "best_evaluated_complete": true, + "evaluator_s": 53.0, + "model_s": null, + "usage": null, + "isolation_breach": null, + "interface": "sharing" + }, + { + "tag": "anthropic_claude-sonnet", + "task": "C02_sky130_sW2_sL1", + "topology": "C02", + "rep": "r1", + "n_proposals": 8, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 8, + "statuses": { + "auto_passed": 8 + }, + "drc_lvs_clean": 8, + "auto_passed": 8, + "best": { + "1": { + "best_area": 179.8774, + "vs_reference": -0.17586063284811893, + "vs_best_evaluated": -0.023514594835214342 + }, + "2": { + "best_area": 179.336, + "vs_reference": -0.1783411504305168, + "vs_best_evaluated": -0.026453647758795662 + }, + "4": { + "best_area": 170.1103, + "vs_reference": -0.22061028796270887, + "vs_best_evaluated": -0.07653643415902589 + }, + "8": { + "best_area": 170.1103, + "vs_reference": -0.22061028796270887, + "vs_best_evaluated": -0.07653643415902589 + } + }, + "reference_area": 218.2609, + "best_evaluated_area": 184.209, + "best_evaluated_complete": true, + "evaluator_s": 140.9, + "model_s": null, + "usage": null, + "isolation_breach": null, + "interface": "sharing" + }, + { + "tag": "anthropic_claude-sonnet", + "task": "C02_sky130_sW2_sL1", + "topology": "C02", + "rep": "r2", + "n_proposals": 6, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 6, + "statuses": { + "auto_passed": 6 + }, + "drc_lvs_clean": 6, + "auto_passed": 6, + "best": { + "1": { + "best_area": 198.7362, + "vs_reference": -0.08945578433883483, + "vs_best_evaluated": 0.07886259629008352 + }, + "2": { + "best_area": 198.7362, + "vs_reference": -0.08945578433883483, + "vs_best_evaluated": 0.07886259629008352 + }, + "4": { + "best_area": 189.3898, + "vs_reference": -0.13227792976204156, + "vs_best_evaluated": 0.02812457588934314 + }, + "8": { + "best_area": 189.3898, + "vs_reference": -0.13227792976204156, + "vs_best_evaluated": 0.02812457588934314 + } + }, + "reference_area": 218.2609, + "best_evaluated_area": 184.209, + "best_evaluated_complete": true, + "evaluator_s": 106.6, + "model_s": null, + "usage": null, + "isolation_breach": null, + "interface": "sharing" + }, + { + "tag": "anthropic_claude-sonnet", + "task": "C02_sky130_sW2_sL1", + "topology": "C02", + "rep": "r3", + "n_proposals": 7, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 7, + "statuses": { + "auto_passed": 7 + }, + "drc_lvs_clean": 7, + "auto_passed": 7, + "best": { + "1": { + "best_area": 188.1791, + "vs_reference": -0.13782496086106122, + "vs_best_evaluated": 0.021552150003528503 + }, + "2": { + "best_area": 188.1791, + "vs_reference": -0.13782496086106122, + "vs_best_evaluated": 0.021552150003528503 + }, + "4": { + "best_area": 174.9939, + "vs_reference": -0.19823523132178045, + "vs_best_evaluated": -0.05002524306629974 + }, + "8": { + "best_area": 174.9939, + "vs_reference": -0.19823523132178045, + "vs_best_evaluated": -0.05002524306629974 + } + }, + "reference_area": 218.2609, + "best_evaluated_area": 184.209, + "best_evaluated_complete": true, + "evaluator_s": 124.8, + "model_s": null, + "usage": null, + "isolation_breach": null, + "interface": "sharing" + }, + { + "tag": "anthropic_claude-sonnet", + "task": "C02_sky130_sW2_sL2", + "topology": "C02", + "rep": "r1", + "n_proposals": 7, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 7, + "statuses": { + "auto_passed": 7 + }, + "drc_lvs_clean": 7, + "auto_passed": 7, + "best": { + "1": { + "best_area": 269.5018, + "vs_reference": -0.1133085412328515, + "vs_best_evaluated": 0.042701332869053976 + }, + "2": { + "best_area": 260.4592, + "vs_reference": -0.14305971983369137, + "vs_best_evaluated": 0.007715551428626899 + }, + "4": { + "best_area": 260.4592, + "vs_reference": -0.14305971983369137, + "vs_best_evaluated": 0.007715551428626899 + }, + "8": { + "best_area": 260.4592, + "vs_reference": -0.14305971983369137, + "vs_best_evaluated": 0.007715551428626899 + } + }, + "reference_area": 303.9409, + "best_evaluated_area": 258.465, + "best_evaluated_complete": true, + "evaluator_s": 122.0, + "model_s": null, + "usage": null, + "isolation_breach": null, + "interface": "sharing" + }, + { + "tag": "anthropic_claude-sonnet", + "task": "C02_sky130_sW2_sL2", + "topology": "C02", + "rep": "r2", + "n_proposals": 6, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 6, + "statuses": { + "auto_passed": 6 + }, + "drc_lvs_clean": 6, + "auto_passed": 6, + "best": { + "1": { + "best_area": 249.8018, + "vs_reference": -0.17812377340463237, + "vs_best_evaluated": -0.033517884433095335 + }, + "2": { + "best_area": 249.8018, + "vs_reference": -0.17812377340463237, + "vs_best_evaluated": -0.033517884433095335 + }, + "4": { + "best_area": 249.8018, + "vs_reference": -0.17812377340463237, + "vs_best_evaluated": -0.033517884433095335 + }, + "8": { + "best_area": 249.8018, + "vs_reference": -0.17812377340463237, + "vs_best_evaluated": -0.033517884433095335 + } + }, + "reference_area": 303.9409, + "best_evaluated_area": 258.465, + "best_evaluated_complete": true, + "evaluator_s": 107.6, + "model_s": null, + "usage": null, + "isolation_breach": null, + "interface": "sharing" + }, + { + "tag": "anthropic_claude-sonnet", + "task": "C02_sky130_sW2_sL2", + "topology": "C02", + "rep": "r3", + "n_proposals": 7, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 7, + "statuses": { + "auto_passed": 7 + }, + "drc_lvs_clean": 7, + "auto_passed": 7, + "best": { + "1": { + "best_area": 258.465, + "vs_reference": -0.14962086379292827, + "vs_best_evaluated": 0.0 + }, + "2": { + "best_area": 258.465, + "vs_reference": -0.14962086379292827, + "vs_best_evaluated": 0.0 + }, + "4": { + "best_area": 258.465, + "vs_reference": -0.14962086379292827, + "vs_best_evaluated": 0.0 + }, + "8": { + "best_area": 249.8018, + "vs_reference": -0.17812377340463237, + "vs_best_evaluated": -0.033517884433095335 + } + }, + "reference_area": 303.9409, + "best_evaluated_area": 258.465, + "best_evaluated_complete": true, + "evaluator_s": 126.3, + "model_s": null, + "usage": null, + "isolation_breach": null, + "interface": "sharing" + }, + { + "tag": "anthropic_claude-sonnet", + "task": "C08_gf180_sW2_sL1", + "topology": "C08", + "rep": "r1", + "n_proposals": 4, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 4, + "statuses": { + "auto_passed": 4 + }, + "drc_lvs_clean": 4, + "auto_passed": 4, + "best": { + "1": { + "best_area": 1008.9664, + "vs_reference": -0.06960919703032242, + "vs_best_evaluated": 0.12463587447085178 + }, + "2": { + "best_area": 1008.9664, + "vs_reference": -0.06960919703032242, + "vs_best_evaluated": 0.12463587447085178 + }, + "4": { + "best_area": 1008.9664, + "vs_reference": -0.06960919703032242, + "vs_best_evaluated": 0.12463587447085178 + }, + "8": { + "best_area": 1008.9664, + "vs_reference": -0.06960919703032242, + "vs_best_evaluated": 0.12463587447085178 + } + }, + "reference_area": 1084.4544, + "best_evaluated_area": 897.1494, + "best_evaluated_complete": true, + "evaluator_s": 85.9, + "model_s": null, + "usage": null, + "isolation_breach": null, + "interface": "sharing" + }, + { + "tag": "anthropic_claude-sonnet", + "task": "C08_gf180_sW2_sL1", + "topology": "C08", + "rep": "r2", + "n_proposals": 6, + "first_legal": false, + "n_rejected": 1, + "n_duplicates": 0, + "eda_verifications": 5, + "statuses": { + "rejected_program": 1, + "auto_passed": 5 + }, + "drc_lvs_clean": 5, + "auto_passed": 5, + "best": { + "1": { + "best_area": null, + "vs_reference": null, + "vs_best_evaluated": null + }, + "2": { + "best_area": 1008.9664, + "vs_reference": -0.06960919703032242, + "vs_best_evaluated": 0.12463587447085178 + }, + "4": { + "best_area": 1008.9664, + "vs_reference": -0.06960919703032242, + "vs_best_evaluated": 0.12463587447085178 + }, + "8": { + "best_area": 1008.9664, + "vs_reference": -0.06960919703032242, + "vs_best_evaluated": 0.12463587447085178 + } + }, + "reference_area": 1084.4544, + "best_evaluated_area": 897.1494, + "best_evaluated_complete": true, + "evaluator_s": 105.8, + "model_s": null, + "usage": null, + "isolation_breach": null, + "interface": "sharing" + }, + { + "tag": "anthropic_claude-sonnet", + "task": "C08_gf180_sW2_sL1", + "topology": "C08", + "rep": "r3", + "n_proposals": 2, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 2, + "statuses": { + "auto_passed": 2 + }, + "drc_lvs_clean": 2, + "auto_passed": 2, + "best": { + "1": { + "best_area": 1008.9664, + "vs_reference": -0.06960919703032242, + "vs_best_evaluated": 0.12463587447085178 + }, + "2": { + "best_area": 1008.9664, + "vs_reference": -0.06960919703032242, + "vs_best_evaluated": 0.12463587447085178 + }, + "4": { + "best_area": 1008.9664, + "vs_reference": -0.06960919703032242, + "vs_best_evaluated": 0.12463587447085178 + }, + "8": { + "best_area": 1008.9664, + "vs_reference": -0.06960919703032242, + "vs_best_evaluated": 0.12463587447085178 + } + }, + "reference_area": 1084.4544, + "best_evaluated_area": 897.1494, + "best_evaluated_complete": true, + "evaluator_s": 50.8, + "model_s": null, + "usage": null, + "isolation_breach": null, + "interface": "sharing" + }, + { + "tag": "anthropic_claude-sonnet", + "task": "C08_gf180_sW2_sL2", + "topology": "C08", + "rep": "r1", + "n_proposals": 3, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 3, + "statuses": { + "auto_passed": 3 + }, + "drc_lvs_clean": 3, + "auto_passed": 3, + "best": { + "1": { + "best_area": 1477.216, + "vs_reference": -0.061613204862381754, + "vs_best_evaluated": 0.11549238427193909 + }, + "2": { + "best_area": 1477.216, + "vs_reference": -0.061613204862381754, + "vs_best_evaluated": 0.11549238427193909 + }, + "4": { + "best_area": 1477.216, + "vs_reference": -0.061613204862381754, + "vs_best_evaluated": 0.11549238427193909 + }, + "8": { + "best_area": 1477.216, + "vs_reference": -0.061613204862381754, + "vs_best_evaluated": 0.11549238427193909 + } + }, + "reference_area": 1574.208, + "best_evaluated_area": 1324.2726, + "best_evaluated_complete": true, + "evaluator_s": 66.5, + "model_s": null, + "usage": null, + "isolation_breach": null, + "interface": "sharing" + }, + { + "tag": "anthropic_claude-sonnet", + "task": "C08_gf180_sW2_sL2", + "topology": "C08", + "rep": "r2", + "n_proposals": 2, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 2, + "statuses": { + "auto_passed": 2 + }, + "drc_lvs_clean": 2, + "auto_passed": 2, + "best": { + "1": { + "best_area": 1477.216, + "vs_reference": -0.061613204862381754, + "vs_best_evaluated": 0.11549238427193909 + }, + "2": { + "best_area": 1477.216, + "vs_reference": -0.061613204862381754, + "vs_best_evaluated": 0.11549238427193909 + }, + "4": { + "best_area": 1477.216, + "vs_reference": -0.061613204862381754, + "vs_best_evaluated": 0.11549238427193909 + }, + "8": { + "best_area": 1477.216, + "vs_reference": -0.061613204862381754, + "vs_best_evaluated": 0.11549238427193909 + } + }, + "reference_area": 1574.208, + "best_evaluated_area": 1324.2726, + "best_evaluated_complete": true, + "evaluator_s": 43.4, + "model_s": null, + "usage": null, + "isolation_breach": null, + "interface": "sharing" + }, + { + "tag": "anthropic_claude-sonnet", + "task": "C08_gf180_sW2_sL2", + "topology": "C08", + "rep": "r3", + "n_proposals": 5, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 5, + "statuses": { + "auto_passed": 5 + }, + "drc_lvs_clean": 5, + "auto_passed": 5, + "best": { + "1": { + "best_area": 1477.216, + "vs_reference": -0.061613204862381754, + "vs_best_evaluated": 0.11549238427193909 + }, + "2": { + "best_area": 1477.216, + "vs_reference": -0.061613204862381754, + "vs_best_evaluated": 0.11549238427193909 + }, + "4": { + "best_area": 1477.216, + "vs_reference": -0.061613204862381754, + "vs_best_evaluated": 0.11549238427193909 + }, + "8": { + "best_area": 1477.216, + "vs_reference": -0.061613204862381754, + "vs_best_evaluated": 0.11549238427193909 + } + }, + "reference_area": 1574.208, + "best_evaluated_area": 1324.2726, + "best_evaluated_complete": true, + "evaluator_s": 116.5, + "model_s": null, + "usage": null, + "isolation_breach": null, + "interface": "sharing" + }, + { + "tag": "anthropic_claude-sonnet", + "task": "C08_ihp130_sW2_sL2", + "topology": "C08", + "rep": "r1", + "n_proposals": 1, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 1, + "statuses": { + "auto_passed": 1 + }, + "drc_lvs_clean": 1, + "auto_passed": 1, + "best": { + "1": { + "best_area": 748.9185, + "vs_reference": -0.0548105471399859, + "vs_best_evaluated": 0.10305966670422473 + }, + "2": { + "best_area": 748.9185, + "vs_reference": -0.0548105471399859, + "vs_best_evaluated": 0.10305966670422473 + }, + "4": { + "best_area": 748.9185, + "vs_reference": -0.0548105471399859, + "vs_best_evaluated": 0.10305966670422473 + }, + "8": { + "best_area": 748.9185, + "vs_reference": -0.0548105471399859, + "vs_best_evaluated": 0.10305966670422473 + } + }, + "reference_area": 792.3475, + "best_evaluated_area": 678.9465, + "best_evaluated_complete": true, + "evaluator_s": 11.1, + "model_s": null, + "usage": null, + "isolation_breach": null, + "interface": "sharing" + }, + { + "tag": "anthropic_claude-sonnet", + "task": "C08_ihp130_sW2_sL2", + "topology": "C08", + "rep": "r2", + "n_proposals": 5, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 5, + "statuses": { + "auto_passed": 5 + }, + "drc_lvs_clean": 5, + "auto_passed": 5, + "best": { + "1": { + "best_area": 748.9185, + "vs_reference": -0.0548105471399859, + "vs_best_evaluated": 0.10305966670422473 + }, + "2": { + "best_area": 748.9185, + "vs_reference": -0.0548105471399859, + "vs_best_evaluated": 0.10305966670422473 + }, + "4": { + "best_area": 748.9185, + "vs_reference": -0.0548105471399859, + "vs_best_evaluated": 0.10305966670422473 + }, + "8": { + "best_area": 748.9185, + "vs_reference": -0.0548105471399859, + "vs_best_evaluated": 0.10305966670422473 + } + }, + "reference_area": 792.3475, + "best_evaluated_area": 678.9465, + "best_evaluated_complete": true, + "evaluator_s": 56.6, + "model_s": null, + "usage": null, + "isolation_breach": null, + "interface": "sharing" + }, + { + "tag": "anthropic_claude-sonnet", + "task": "C08_ihp130_sW2_sL2", + "topology": "C08", + "rep": "r3", + "n_proposals": 3, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 3, + "statuses": { + "auto_passed": 3 + }, + "drc_lvs_clean": 3, + "auto_passed": 3, + "best": { + "1": { + "best_area": 807.7785, + "vs_reference": 0.019475040938477184, + "vs_best_evaluated": 0.18975280084660562 + }, + "2": { + "best_area": 748.9185, + "vs_reference": -0.0548105471399859, + "vs_best_evaluated": 0.10305966670422473 + }, + "4": { + "best_area": 748.9185, + "vs_reference": -0.0548105471399859, + "vs_best_evaluated": 0.10305966670422473 + }, + "8": { + "best_area": 748.9185, + "vs_reference": -0.0548105471399859, + "vs_best_evaluated": 0.10305966670422473 + } + }, + "reference_area": 792.3475, + "best_evaluated_area": 678.9465, + "best_evaluated_complete": true, + "evaluator_s": 35.0, + "model_s": null, + "usage": null, + "isolation_breach": null, + "interface": "sharing" + }, + { + "tag": "anthropic_claude-sonnet", + "task": "C08_sky130_sW2_sL1", + "topology": "C08", + "rep": "r1", + "n_proposals": 4, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 4, + "statuses": { + "auto_passed": 4 + }, + "drc_lvs_clean": 4, + "auto_passed": 4, + "best": { + "1": { + "best_area": 418.3469, + "vs_reference": -0.07208552624574582, + "vs_best_evaluated": 0.14586801069429955 + }, + "2": { + "best_area": 418.3469, + "vs_reference": -0.07208552624574582, + "vs_best_evaluated": 0.14586801069429955 + }, + "4": { + "best_area": 418.3469, + "vs_reference": -0.07208552624574582, + "vs_best_evaluated": 0.14586801069429955 + }, + "8": { + "best_area": 418.3469, + "vs_reference": -0.07208552624574582, + "vs_best_evaluated": 0.14586801069429955 + } + }, + "reference_area": 450.8464, + "best_evaluated_area": 365.0917, + "best_evaluated_complete": true, + "evaluator_s": 77.8, + "model_s": null, + "usage": null, + "isolation_breach": null, + "interface": "sharing" + }, + { + "tag": "anthropic_claude-sonnet", + "task": "C08_sky130_sW2_sL1", + "topology": "C08", + "rep": "r2", + "n_proposals": 5, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 5, + "statuses": { + "auto_passed": 5 + }, + "drc_lvs_clean": 5, + "auto_passed": 5, + "best": { + "1": { + "best_area": 418.3469, + "vs_reference": -0.07208552624574582, + "vs_best_evaluated": 0.14586801069429955 + }, + "2": { + "best_area": 418.3469, + "vs_reference": -0.07208552624574582, + "vs_best_evaluated": 0.14586801069429955 + }, + "4": { + "best_area": 418.3469, + "vs_reference": -0.07208552624574582, + "vs_best_evaluated": 0.14586801069429955 + }, + "8": { + "best_area": 418.3469, + "vs_reference": -0.07208552624574582, + "vs_best_evaluated": 0.14586801069429955 + } + }, + "reference_area": 450.8464, + "best_evaluated_area": 365.0917, + "best_evaluated_complete": true, + "evaluator_s": 99.5, + "model_s": null, + "usage": null, + "isolation_breach": null, + "interface": "sharing" + }, + { + "tag": "anthropic_claude-sonnet", + "task": "C08_sky130_sW2_sL1", + "topology": "C08", + "rep": "r3", + "n_proposals": 8, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 8, + "statuses": { + "auto_passed": 8 + }, + "drc_lvs_clean": 8, + "auto_passed": 8, + "best": { + "1": { + "best_area": 418.3469, + "vs_reference": -0.07208552624574582, + "vs_best_evaluated": 0.14586801069429955 + }, + "2": { + "best_area": 418.3469, + "vs_reference": -0.07208552624574582, + "vs_best_evaluated": 0.14586801069429955 + }, + "4": { + "best_area": 418.3469, + "vs_reference": -0.07208552624574582, + "vs_best_evaluated": 0.14586801069429955 + }, + "8": { + "best_area": 365.0917, + "vs_reference": -0.19020823943586995, + "vs_best_evaluated": 0.0 + } + }, + "reference_area": 450.8464, + "best_evaluated_area": 365.0917, + "best_evaluated_complete": true, + "evaluator_s": 157.7, + "model_s": null, + "usage": null, + "isolation_breach": null, + "interface": "sharing" + }, + { + "tag": "anthropic_claude-sonnet", + "task": "C08_sky130_sW2_sL2", + "topology": "C08", + "rep": "r1", + "n_proposals": 5, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 5, + "statuses": { + "auto_passed": 5 + }, + "drc_lvs_clean": 5, + "auto_passed": 5, + "best": { + "1": { + "best_area": 608.7149, + "vs_reference": -0.062058699173362264, + "vs_best_evaluated": 0.13364103102751868 + }, + "2": { + "best_area": 608.7149, + "vs_reference": -0.062058699173362264, + "vs_best_evaluated": 0.13364103102751868 + }, + "4": { + "best_area": 608.7149, + "vs_reference": -0.062058699173362264, + "vs_best_evaluated": 0.13364103102751868 + }, + "8": { + "best_area": 608.7149, + "vs_reference": -0.062058699173362264, + "vs_best_evaluated": 0.13364103102751868 + } + }, + "reference_area": 648.9904, + "best_evaluated_area": 536.9556, + "best_evaluated_complete": true, + "evaluator_s": 98.9, + "model_s": null, + "usage": null, + "isolation_breach": null, + "interface": "sharing" + }, + { + "tag": "anthropic_claude-sonnet", + "task": "C08_sky130_sW2_sL2", + "topology": "C08", + "rep": "r2", + "n_proposals": 4, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 4, + "statuses": { + "auto_passed": 4 + }, + "drc_lvs_clean": 4, + "auto_passed": 4, + "best": { + "1": { + "best_area": 608.7149, + "vs_reference": -0.062058699173362264, + "vs_best_evaluated": 0.13364103102751868 + }, + "2": { + "best_area": 608.7149, + "vs_reference": -0.062058699173362264, + "vs_best_evaluated": 0.13364103102751868 + }, + "4": { + "best_area": 608.7149, + "vs_reference": -0.062058699173362264, + "vs_best_evaluated": 0.13364103102751868 + }, + "8": { + "best_area": 608.7149, + "vs_reference": -0.062058699173362264, + "vs_best_evaluated": 0.13364103102751868 + } + }, + "reference_area": 648.9904, + "best_evaluated_area": 536.9556, + "best_evaluated_complete": true, + "evaluator_s": 79.9, + "model_s": null, + "usage": null, + "isolation_breach": null, + "interface": "sharing" + }, + { + "tag": "anthropic_claude-sonnet", + "task": "C08_sky130_sW2_sL2", + "topology": "C08", + "rep": "r3", + "n_proposals": 2, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 1, + "eda_verifications": 1, + "statuses": { + "auto_passed": 2 + }, + "drc_lvs_clean": 2, + "auto_passed": 2, + "best": { + "1": { + "best_area": 608.7149, + "vs_reference": -0.062058699173362264, + "vs_best_evaluated": 0.13364103102751868 + }, + "2": { + "best_area": 608.7149, + "vs_reference": -0.062058699173362264, + "vs_best_evaluated": 0.13364103102751868 + }, + "4": { + "best_area": 608.7149, + "vs_reference": -0.062058699173362264, + "vs_best_evaluated": 0.13364103102751868 + }, + "8": { + "best_area": 608.7149, + "vs_reference": -0.062058699173362264, + "vs_best_evaluated": 0.13364103102751868 + } + }, + "reference_area": 648.9904, + "best_evaluated_area": 536.9556, + "best_evaluated_complete": true, + "evaluator_s": 20.1, + "model_s": null, + "usage": null, + "isolation_breach": null, + "interface": "sharing" + }, + { + "tag": "anthropic_claude-sonnet", + "task": "C09_gf180_sW2_sL1", + "topology": "C09", + "rep": "r1", + "n_proposals": 7, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 7, + "statuses": { + "auto_passed": 7 + }, + "drc_lvs_clean": 7, + "auto_passed": 7, + "best": { + "1": { + "best_area": 1892.2608, + "vs_reference": 0.07200720072007205, + "vs_best_evaluated": 0.27900829686206263 + }, + "2": { + "best_area": 1835.0928, + "vs_reference": 0.03962027622701836, + "vs_best_evaluated": 0.2403675628178914 + }, + "4": { + "best_area": 1791.8768, + "vs_reference": 0.01513746540817218, + "vs_best_evaluated": 0.2111572010341507 + }, + "8": { + "best_area": 1720.7168, + "vs_reference": -0.025176233635448186, + "vs_best_evaluated": 0.1630590581118303 + } + }, + "reference_area": 1765.1568, + "best_evaluated_area": 1479.475, + "best_evaluated_complete": true, + "evaluator_s": 165.2, + "model_s": null, + "usage": null, + "isolation_breach": null, + "interface": "sharing" + }, + { + "tag": "anthropic_claude-sonnet", + "task": "C09_gf180_sW2_sL1", + "topology": "C09", + "rep": "r2", + "n_proposals": 7, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 7, + "statuses": { + "auto_passed": 7 + }, + "drc_lvs_clean": 7, + "auto_passed": 7, + "best": { + "1": { + "best_area": 1747.3808, + "vs_reference": -0.010070493454179319, + "vs_best_evaluated": 0.18108166748339793 + }, + "2": { + "best_area": 1747.3808, + "vs_reference": -0.010070493454179319, + "vs_best_evaluated": 0.18108166748339793 + }, + "4": { + "best_area": 1712.3076, + "vs_reference": -0.029940229672513974, + "vs_best_evaluated": 0.15737514996873903 + }, + "8": { + "best_area": 1577.472, + "vs_reference": -0.1063275511841214, + "vs_best_evaluated": 0.06623768566552335 + } + }, + "reference_area": 1765.1568, + "best_evaluated_area": 1479.475, + "best_evaluated_complete": true, + "evaluator_s": 167.3, + "model_s": null, + "usage": null, + "isolation_breach": null, + "interface": "sharing" + }, + { + "tag": "anthropic_claude-sonnet", + "task": "C09_gf180_sW2_sL1", + "topology": "C09", + "rep": "r3", + "n_proposals": 7, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 7, + "statuses": { + "auto_passed": 7 + }, + "drc_lvs_clean": 7, + "auto_passed": 7, + "best": { + "1": { + "best_area": 1835.0928, + "vs_reference": 0.03962027622701836, + "vs_best_evaluated": 0.2403675628178914 + }, + "2": { + "best_area": 1747.3808, + "vs_reference": -0.010070493454179319, + "vs_best_evaluated": 0.18108166748339793 + }, + "4": { + "best_area": 1464.203, + "vs_reference": -0.17049692129333782, + "vs_best_evaluated": -0.010322580645161228 + }, + "8": { + "best_area": 1424.319, + "vs_reference": -0.1930920811114344, + "vs_best_evaluated": -0.037280792172899146 + } + }, + "reference_area": 1765.1568, + "best_evaluated_area": 1479.475, + "best_evaluated_complete": true, + "evaluator_s": 174.1, + "model_s": null, + "usage": null, + "isolation_breach": null, + "interface": "sharing" + }, + { + "tag": "anthropic_claude-sonnet", + "task": "C09_gf180_sW2_sL2", + "topology": "C09", + "rep": "r1", + "n_proposals": 8, + "first_legal": true, + "n_rejected": 1, + "n_duplicates": 0, + "eda_verifications": 7, + "statuses": { + "auto_passed": 7, + "rejected_program": 1 + }, + "drc_lvs_clean": 7, + "auto_passed": 7, + "best": { + "1": { + "best_area": 2543.7456, + "vs_reference": -0.006939625260235838, + "vs_best_evaluated": 0.17566757004310185 + }, + "2": { + "best_area": 2543.7456, + "vs_reference": -0.006939625260235838, + "vs_best_evaluated": 0.17566757004310185 + }, + "4": { + "best_area": 2543.7456, + "vs_reference": -0.006939625260235838, + "vs_best_evaluated": 0.17566757004310185 + }, + "8": { + "best_area": 2104.7238, + "vs_reference": -0.1783306453476714, + "vs_best_evaluated": -0.027239392352016778 + } + }, + "reference_area": 2561.5216, + "best_evaluated_area": 2163.6606, + "best_evaluated_complete": true, + "evaluator_s": 156.0, + "model_s": null, + "usage": null, + "isolation_breach": null, + "interface": "sharing" + }, + { + "tag": "anthropic_claude-sonnet", + "task": "C09_gf180_sW2_sL2", + "topology": "C09", + "rep": "r2", + "n_proposals": 8, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 8, + "statuses": { + "auto_passed": 8 + }, + "drc_lvs_clean": 8, + "auto_passed": 8, + "best": { + "1": { + "best_area": 2543.7456, + "vs_reference": -0.006939625260235838, + "vs_best_evaluated": 0.17566757004310185 + }, + "2": { + "best_area": 2525.9696, + "vs_reference": -0.013879250520471897, + "vs_best_evaluated": 0.16745186375349252 + }, + "4": { + "best_area": 2307.3696, + "vs_reference": -0.09921915161675776, + "vs_best_evaluated": 0.06641938204171205 + }, + "8": { + "best_area": 2259.0836, + "vs_reference": -0.11806966609221647, + "vs_best_evaluated": 0.044102573203948836 + } + }, + "reference_area": 2561.5216, + "best_evaluated_area": 2163.6606, + "best_evaluated_complete": true, + "evaluator_s": 186.9, + "model_s": null, + "usage": null, + "isolation_breach": null, + "interface": "sharing" + }, + { + "tag": "anthropic_claude-sonnet", + "task": "C09_gf180_sW2_sL2", + "topology": "C09", + "rep": "r3", + "n_proposals": 7, + "first_legal": false, + "n_rejected": 1, + "n_duplicates": 0, + "eda_verifications": 6, + "statuses": { + "rejected_program": 1, + "auto_passed": 6 + }, + "drc_lvs_clean": 6, + "auto_passed": 6, + "best": { + "1": { + "best_area": null, + "vs_reference": null, + "vs_best_evaluated": null + }, + "2": { + "best_area": 2616.9136, + "vs_reference": 0.021624646850528118, + "vs_best_evaluated": 0.20948433409565248 + }, + "4": { + "best_area": 2451.4788, + "vs_reference": -0.04295993443896795, + "vs_best_evaluated": 0.13302372839806753 + }, + "8": { + "best_area": 2297.554, + "vs_reference": -0.10305109275674273, + "vs_best_evaluated": 0.06188281101019255 + } + }, + "reference_area": 2561.5216, + "best_evaluated_area": 2163.6606, + "best_evaluated_complete": true, + "evaluator_s": 148.4, + "model_s": null, + "usage": null, + "isolation_breach": null, + "interface": "sharing" + }, + { + "tag": "anthropic_claude-sonnet", + "task": "C09_ihp130_sW2_sL1", + "topology": "C09", + "rep": "r1", + "n_proposals": 3, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 3, + "statuses": { + "auto_passed": 3 + }, + "drc_lvs_clean": 3, + "auto_passed": 3, + "best": { + "1": { + "best_area": 2744.2188, + "vs_reference": -0.003010892291145706, + "vs_best_evaluated": 0.15658006817630743 + }, + "2": { + "best_area": 2735.9313, + "vs_reference": -0.006021784582291301, + "vs_best_evaluated": 0.15308721355589205 + }, + "4": { + "best_area": 2735.9313, + "vs_reference": -0.006021784582291301, + "vs_best_evaluated": 0.15308721355589205 + }, + "8": { + "best_area": 2735.9313, + "vs_reference": -0.006021784582291301, + "vs_best_evaluated": 0.15308721355589205 + } + }, + "reference_area": 2752.5063, + "best_evaluated_area": 2372.7011, + "best_evaluated_complete": true, + "evaluator_s": 113.0, + "model_s": null, + "usage": null, + "isolation_breach": null, + "interface": "sharing" + }, + { + "tag": "anthropic_claude-sonnet", + "task": "C09_ihp130_sW2_sL1", + "topology": "C09", + "rep": "r2", + "n_proposals": 7, + "first_legal": true, + "n_rejected": 1, + "n_duplicates": 0, + "eda_verifications": 6, + "statuses": { + "auto_passed": 6, + "rejected_program": 1 + }, + "drc_lvs_clean": 6, + "auto_passed": 6, + "best": { + "1": { + "best_area": 2744.2188, + "vs_reference": -0.003010892291145706, + "vs_best_evaluated": 0.15658006817630743 + }, + "2": { + "best_area": 2621.1858, + "vs_reference": -0.047709427586051234, + "vs_best_evaluated": 0.10472650769201386 + }, + "4": { + "best_area": 2621.1858, + "vs_reference": -0.047709427586051234, + "vs_best_evaluated": 0.10472650769201386 + }, + "8": { + "best_area": 2365.4923, + "vs_reference": -0.1406042195071452, + "vs_best_evaluated": -0.003038225084482926 + } + }, + "reference_area": 2752.5063, + "best_evaluated_area": 2372.7011, + "best_evaluated_complete": true, + "evaluator_s": 289.7, + "model_s": null, + "usage": null, + "isolation_breach": null, + "interface": "sharing" + }, + { + "tag": "anthropic_claude-sonnet", + "task": "C09_ihp130_sW2_sL1", + "topology": "C09", + "rep": "r3", + "n_proposals": 4, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 4, + "statuses": { + "auto_passed": 4 + }, + "drc_lvs_clean": 4, + "auto_passed": 4, + "best": { + "1": { + "best_area": 2744.2188, + "vs_reference": -0.003010892291145706, + "vs_best_evaluated": 0.15658006817630743 + }, + "2": { + "best_area": 2736.7494, + "vs_reference": -0.005724564554130174, + "vs_best_evaluated": 0.15343201046267474 + }, + "4": { + "best_area": 2727.6438, + "vs_reference": -0.009032676873437229, + "vs_best_evaluated": 0.14959435893547646 + }, + "8": { + "best_area": 2727.6438, + "vs_reference": -0.009032676873437229, + "vs_best_evaluated": 0.14959435893547646 + } + }, + "reference_area": 2752.5063, + "best_evaluated_area": 2372.7011, + "best_evaluated_complete": true, + "evaluator_s": 155.9, + "model_s": null, + "usage": null, + "isolation_breach": null, + "interface": "sharing" + }, + { + "tag": "anthropic_claude-sonnet", + "task": "C09_ihp130_sW2_sL2", + "topology": "C09", + "rep": "r1", + "n_proposals": 7, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 7, + "statuses": { + "auto_passed": 7 + }, + "drc_lvs_clean": 7, + "auto_passed": 7, + "best": { + "1": { + "best_area": 3825.8188, + "vs_reference": -0.002161520665193817, + "vs_best_evaluated": 0.15460629908308876 + }, + "2": { + "best_area": 3500.6173, + "vs_reference": -0.0869795915674012, + "vs_best_evaluated": 0.0564626806839974 + }, + "4": { + "best_area": 3500.6173, + "vs_reference": -0.0869795915674012, + "vs_best_evaluated": 0.0564626806839974 + }, + "8": { + "best_area": 3381.1982, + "vs_reference": -0.11812611976877119, + "vs_best_evaluated": 0.020422802085765523 + } + }, + "reference_area": 3834.1063, + "best_evaluated_area": 3313.5267, + "best_evaluated_complete": true, + "evaluator_s": 261.4, + "model_s": null, + "usage": null, + "isolation_breach": null, + "interface": "sharing" + }, + { + "tag": "anthropic_claude-sonnet", + "task": "C09_ihp130_sW2_sL2", + "topology": "C09", + "rep": "r2", + "n_proposals": 2, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 2, + "statuses": { + "auto_passed": 2 + }, + "drc_lvs_clean": 2, + "auto_passed": 2, + "best": { + "1": { + "best_area": 4015.1863, + "vs_reference": 0.04722873750266121, + "vs_best_evaluated": 0.211756132823677 + }, + "2": { + "best_area": 4015.1863, + "vs_reference": 0.04722873750266121, + "vs_best_evaluated": 0.211756132823677 + }, + "4": { + "best_area": 4015.1863, + "vs_reference": 0.04722873750266121, + "vs_best_evaluated": 0.211756132823677 + }, + "8": { + "best_area": 4015.1863, + "vs_reference": 0.04722873750266121, + "vs_best_evaluated": 0.211756132823677 + } + }, + "reference_area": 3834.1063, + "best_evaluated_area": 3313.5267, + "best_evaluated_complete": true, + "evaluator_s": 72.9, + "model_s": null, + "usage": null, + "isolation_breach": null, + "interface": "sharing" + }, + { + "tag": "anthropic_claude-sonnet", + "task": "C09_ihp130_sW2_sL2", + "topology": "C09", + "rep": "r3", + "n_proposals": 7, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 7, + "statuses": { + "auto_passed": 7 + }, + "drc_lvs_clean": 7, + "auto_passed": 7, + "best": { + "1": { + "best_area": 3825.8188, + "vs_reference": -0.002161520665193817, + "vs_best_evaluated": 0.15460629908308876 + }, + "2": { + "best_area": 3825.8188, + "vs_reference": -0.002161520665193817, + "vs_best_evaluated": 0.15460629908308876 + }, + "4": { + "best_area": 3662.1842, + "vs_reference": -0.04484020174401526, + "vs_best_evaluated": 0.10522248092945818 + }, + "8": { + "best_area": 3638.7687, + "vs_reference": -0.0509473615794116, + "vs_best_evaluated": 0.09815584102581698 + } + }, + "reference_area": 3834.1063, + "best_evaluated_area": 3313.5267, + "best_evaluated_complete": true, + "evaluator_s": 268.2, + "model_s": null, + "usage": null, + "isolation_breach": null, + "interface": "sharing" + }, + { + "tag": "anthropic_claude-sonnet", + "task": "C09_sky130_sW2_sL1", + "topology": "C09", + "rep": "r1", + "n_proposals": 3, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 3, + "statuses": { + "auto_passed": 3 + }, + "drc_lvs_clean": 3, + "auto_passed": 3, + "best": { + "1": { + "best_area": 2616.3924, + "vs_reference": -0.007144489698524881, + "vs_best_evaluated": 0.1704064176964677 + }, + "2": { + "best_area": 2616.3924, + "vs_reference": -0.007144489698524881, + "vs_best_evaluated": 0.1704064176964677 + }, + "4": { + "best_area": 2606.9788, + "vs_reference": -0.010716715574037416, + "vs_best_evaluated": 0.16619537586129507 + }, + "8": { + "best_area": 2606.9788, + "vs_reference": -0.010716715574037416, + "vs_best_evaluated": 0.16619537586129507 + } + }, + "reference_area": 2635.2197, + "best_evaluated_area": 2235.4563, + "best_evaluated_complete": true, + "evaluator_s": 135.1, + "model_s": null, + "usage": null, + "isolation_breach": null, + "interface": "sharing" + }, + { + "tag": "anthropic_claude-sonnet", + "task": "C09_sky130_sW2_sL1", + "topology": "C09", + "rep": "r2", + "n_proposals": 7, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 7, + "statuses": { + "auto_passed": 7 + }, + "drc_lvs_clean": 7, + "auto_passed": 7, + "best": { + "1": { + "best_area": 2625.8061, + "vs_reference": -0.003572225875512536, + "vs_best_evaluated": 0.17461750426523648 + }, + "2": { + "best_area": 2625.8061, + "vs_reference": -0.003572225875512536, + "vs_best_evaluated": 0.17461750426523648 + }, + "4": { + "best_area": 2467.5458, + "vs_reference": -0.06362805347880496, + "vs_best_evaluated": 0.10382198032679057 + }, + "8": { + "best_area": 2235.4562, + "vs_reference": -0.15170025482125837, + "vs_best_evaluated": -4.473359638268448e-08 + } + }, + "reference_area": 2635.2197, + "best_evaluated_area": 2235.4563, + "best_evaluated_complete": true, + "evaluator_s": 318.6, + "model_s": null, + "usage": null, + "isolation_breach": null, + "interface": "sharing" + }, + { + "tag": "anthropic_claude-sonnet", + "task": "C09_sky130_sW2_sL1", + "topology": "C09", + "rep": "r3", + "n_proposals": 6, + "first_legal": true, + "n_rejected": 1, + "n_duplicates": 0, + "eda_verifications": 5, + "statuses": { + "auto_passed": 5, + "rejected_program": 1 + }, + "drc_lvs_clean": 5, + "auto_passed": 5, + "best": { + "1": { + "best_area": 2625.8061, + "vs_reference": -0.003572225875512536, + "vs_best_evaluated": 0.17461750426523648 + }, + "2": { + "best_area": 2625.8061, + "vs_reference": -0.003572225875512536, + "vs_best_evaluated": 0.17461750426523648 + }, + "4": { + "best_area": 2616.3924, + "vs_reference": -0.007144489698524881, + "vs_best_evaluated": 0.1704064176964677 + }, + "8": { + "best_area": 2606.9788, + "vs_reference": -0.010716715574037416, + "vs_best_evaluated": 0.16619537586129507 + } + }, + "reference_area": 2635.2197, + "best_evaluated_area": 2235.4563, + "best_evaluated_complete": true, + "evaluator_s": 234.9, + "model_s": null, + "usage": null, + "isolation_breach": null, + "interface": "sharing" + }, + { + "tag": "anthropic_claude-sonnet", + "task": "C11_gf180_sW2_sL1", + "topology": "C11", + "rep": "r1", + "n_proposals": 8, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 8, + "statuses": { + "auto_passed": 8 + }, + "drc_lvs_clean": 8, + "auto_passed": 8, + "best": { + "1": { + "best_area": 4212.8065, + "vs_reference": -0.04010453384031887, + "vs_best_evaluated": 0.06577618532252782 + }, + "2": { + "best_area": 4202.094, + "vs_reference": -0.0425453960496881, + "vs_best_evaluated": 0.06306608520630652 + }, + "4": { + "best_area": 4202.094, + "vs_reference": -0.0425453960496881, + "vs_best_evaluated": 0.06306608520630652 + }, + "8": { + "best_area": 4168.762, + "vs_reference": -0.05014015163080365, + "vs_best_evaluated": 0.05463359446428684 + } + }, + "reference_area": 4388.818, + "best_evaluated_area": 3952.806, + "best_evaluated_complete": true, + "evaluator_s": 187.2, + "model_s": null, + "usage": null, + "isolation_breach": null, + "interface": "sharing" + }, + { + "tag": "anthropic_claude-sonnet", + "task": "C11_gf180_sW2_sL1", + "topology": "C11", + "rep": "r2", + "n_proposals": 5, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 5, + "statuses": { + "auto_passed": 5 + }, + "drc_lvs_clean": 5, + "auto_passed": 5, + "best": { + "1": { + "best_area": 4288.7985, + "vs_reference": -0.02278962126021178, + "vs_best_evaluated": 0.08500100940951816 + }, + "2": { + "best_area": 4234.146, + "vs_reference": -0.03524229074889884, + "vs_best_evaluated": 0.0711747553510087 + }, + "4": { + "best_area": 4164.066, + "vs_reference": -0.0512101435967498, + "vs_best_evaluated": 0.053445577647878384 + }, + "8": { + "best_area": 4164.066, + "vs_reference": -0.0512101435967498, + "vs_best_evaluated": 0.053445577647878384 + } + }, + "reference_area": 4388.818, + "best_evaluated_area": 3952.806, + "best_evaluated_complete": true, + "evaluator_s": 119.6, + "model_s": null, + "usage": null, + "isolation_breach": null, + "interface": "sharing" + }, + { + "tag": "anthropic_claude-sonnet", + "task": "C11_gf180_sW2_sL1", + "topology": "C11", + "rep": "r3", + "n_proposals": 7, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 7, + "statuses": { + "auto_passed": 7 + }, + "drc_lvs_clean": 7, + "auto_passed": 7, + "best": { + "1": { + "best_area": 4131.374, + "vs_reference": -0.05865907403770232, + "vs_best_evaluated": 0.04517499720451745 + }, + "2": { + "best_area": 4131.374, + "vs_reference": -0.05865907403770232, + "vs_best_evaluated": 0.04517499720451745 + }, + "4": { + "best_area": 4131.374, + "vs_reference": -0.05865907403770232, + "vs_best_evaluated": 0.04517499720451745 + }, + "8": { + "best_area": 4131.374, + "vs_reference": -0.05865907403770232, + "vs_best_evaluated": 0.04517499720451745 + } + }, + "reference_area": 4388.818, + "best_evaluated_area": 3952.806, + "best_evaluated_complete": true, + "evaluator_s": 166.9, + "model_s": null, + "usage": null, + "isolation_breach": null, + "interface": "sharing" + }, + { + "tag": "anthropic_claude-sonnet", + "task": "C11_gf180_sW2_sL2", + "topology": "C11", + "rep": "r1", + "n_proposals": 2, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 2, + "statuses": { + "auto_passed": 2 + }, + "drc_lvs_clean": 2, + "auto_passed": 2, + "best": { + "1": { + "best_area": 6221.6812, + "vs_reference": -0.018303843807199516, + "vs_best_evaluated": 0.08095717320809581 + }, + "2": { + "best_area": 6183.0132, + "vs_reference": -0.02440512507626591, + "vs_best_evaluated": 0.07423898070835633 + }, + "4": { + "best_area": 6183.0132, + "vs_reference": -0.02440512507626591, + "vs_best_evaluated": 0.07423898070835633 + }, + "8": { + "best_area": 6183.0132, + "vs_reference": -0.02440512507626591, + "vs_best_evaluated": 0.07423898070835633 + } + }, + "reference_area": 6337.6852, + "best_evaluated_area": 5755.7148, + "best_evaluated_complete": true, + "evaluator_s": 48.2, + "model_s": null, + "usage": null, + "isolation_breach": null, + "interface": "sharing" + }, + { + "tag": "anthropic_claude-sonnet", + "task": "C11_gf180_sW2_sL2", + "topology": "C11", + "rep": "r2", + "n_proposals": 7, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 7, + "statuses": { + "auto_passed": 7 + }, + "drc_lvs_clean": 7, + "auto_passed": 7, + "best": { + "1": { + "best_area": 6080.6772, + "vs_reference": -0.0405523455156781, + "vs_best_evaluated": 0.0564590865412582 + }, + "2": { + "best_area": 6080.6772, + "vs_reference": -0.0405523455156781, + "vs_best_evaluated": 0.0564590865412582 + }, + "4": { + "best_area": 5911.8228, + "vs_reference": -0.06719525924070824, + "vs_best_evaluated": 0.02712226116554639 + }, + "8": { + "best_area": 5911.8228, + "vs_reference": -0.06719525924070824, + "vs_best_evaluated": 0.02712226116554639 + } + }, + "reference_area": 6337.6852, + "best_evaluated_area": 5755.7148, + "best_evaluated_complete": true, + "evaluator_s": 171.5, + "model_s": null, + "usage": null, + "isolation_breach": null, + "interface": "sharing" + }, + { + "tag": "anthropic_claude-sonnet", + "task": "C11_gf180_sW2_sL2", + "topology": "C11", + "rep": "r3", + "n_proposals": 8, + "first_legal": false, + "n_rejected": 1, + "n_duplicates": 0, + "eda_verifications": 7, + "statuses": { + "rejected_program": 1, + "auto_passed": 7 + }, + "drc_lvs_clean": 7, + "auto_passed": 7, + "best": { + "1": { + "best_area": null, + "vs_reference": null, + "vs_best_evaluated": null + }, + "2": { + "best_area": 6347.8509, + "vs_reference": 0.0016040083530814986, + "vs_best_evaluated": 0.10287794315312504 + }, + "4": { + "best_area": 6014.1588, + "vs_reference": -0.05104803880129605, + "vs_best_evaluated": 0.04490215533264452 + }, + "8": { + "best_area": 5976.5468, + "vs_reference": -0.056982697720612485, + "vs_best_evaluated": 0.038367432660145084 + } + }, + "reference_area": 6337.6852, + "best_evaluated_area": 5755.7148, + "best_evaluated_complete": true, + "evaluator_s": 165.9, + "model_s": null, + "usage": null, + "isolation_breach": null, + "interface": "sharing" + }, + { + "tag": "anthropic_claude-sonnet", + "task": "C11_ihp130_sW2_sL1", + "topology": "C11", + "rep": "r1", + "n_proposals": 2, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 2, + "statuses": { + "auto_passed": 2 + }, + "drc_lvs_clean": 2, + "auto_passed": 2, + "best": { + "1": { + "best_area": 2311.2823, + "vs_reference": -0.03839277352439108, + "vs_best_evaluated": 0.06046144764350747 + }, + "2": { + "best_area": 2311.2823, + "vs_reference": -0.03839277352439108, + "vs_best_evaluated": 0.06046144764350747 + }, + "4": { + "best_area": 2311.2823, + "vs_reference": -0.03839277352439108, + "vs_best_evaluated": 0.06046144764350747 + }, + "8": { + "best_area": 2311.2823, + "vs_reference": -0.03839277352439108, + "vs_best_evaluated": 0.06046144764350747 + } + }, + "reference_area": 2403.5617, + "best_evaluated_area": 2179.5062, + "best_evaluated_complete": true, + "evaluator_s": 40.1, + "model_s": null, + "usage": null, + "isolation_breach": null, + "interface": "sharing" + }, + { + "tag": "anthropic_claude-sonnet", + "task": "C11_ihp130_sW2_sL1", + "topology": "C11", + "rep": "r2", + "n_proposals": 8, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 8, + "statuses": { + "auto_passed": 8 + }, + "drc_lvs_clean": 8, + "auto_passed": 8, + "best": { + "1": { + "best_area": 2372.2113, + "vs_reference": -0.01304330985137614, + "vs_best_evaluated": 0.08841686249848713 + }, + "2": { + "best_area": 2358.2669, + "vs_reference": -0.018844866765850066, + "vs_best_evaluated": 0.08201889951035701 + }, + "4": { + "best_area": 2256.4305, + "vs_reference": -0.0612138228030511, + "vs_best_evaluated": 0.035294370807479325 + }, + "8": { + "best_area": 2233.6449, + "vs_reference": -0.070693754189876, + "vs_best_evaluated": 0.02483989263256059 + } + }, + "reference_area": 2403.5617, + "best_evaluated_area": 2179.5062, + "best_evaluated_complete": true, + "evaluator_s": 142.5, + "model_s": null, + "usage": null, + "isolation_breach": null, + "interface": "sharing" + }, + { + "tag": "anthropic_claude-sonnet", + "task": "C11_ihp130_sW2_sL1", + "topology": "C11", + "rep": "r3", + "n_proposals": 8, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 8, + "statuses": { + "auto_passed": 8 + }, + "drc_lvs_clean": 8, + "auto_passed": 8, + "best": { + "1": { + "best_area": 2311.2823, + "vs_reference": -0.03839277352439108, + "vs_best_evaluated": 0.06046144764350747 + }, + "2": { + "best_area": 2255.2948, + "vs_reference": -0.06168632991614076, + "vs_best_evaluated": 0.034773289472633806 + }, + "4": { + "best_area": 2157.3675, + "vs_reference": -0.10242890789947279, + "vs_best_evaluated": -0.010157667824023608 + }, + "8": { + "best_area": 2102.6586, + "vs_reference": -0.12519050374284124, + "vs_best_evaluated": -0.03525917934989109 + } + }, + "reference_area": 2403.5617, + "best_evaluated_area": 2179.5062, + "best_evaluated_complete": true, + "evaluator_s": 133.7, + "model_s": null, + "usage": null, + "isolation_breach": null, + "interface": "sharing" + }, + { + "tag": "anthropic_claude-sonnet", + "task": "C11_ihp130_sW2_sL2", + "topology": "C11", + "rep": "r1", + "n_proposals": 7, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 7, + "statuses": { + "auto_passed": 7 + }, + "drc_lvs_clean": 7, + "auto_passed": 7, + "best": { + "1": { + "best_area": 3158.0815, + "vs_reference": -0.028390508881644627, + "vs_best_evaluated": 0.06190301020550537 + }, + "2": { + "best_area": 3158.0815, + "vs_reference": -0.028390508881644627, + "vs_best_evaluated": 0.06190301020550537 + }, + "4": { + "best_area": 3116.8907, + "vs_reference": -0.041063193936402675, + "vs_best_evaluated": 0.04805262841112401 + }, + "8": { + "best_area": 3116.8907, + "vs_reference": -0.041063193936402675, + "vs_best_evaluated": 0.04805262841112401 + } + }, + "reference_area": 3250.3609, + "best_evaluated_area": 2973.983, + "best_evaluated_complete": true, + "evaluator_s": 115.6, + "model_s": null, + "usage": null, + "isolation_breach": null, + "interface": "sharing" + }, + { + "tag": "anthropic_claude-sonnet", + "task": "C11_ihp130_sW2_sL2", + "topology": "C11", + "rep": "r2", + "n_proposals": 8, + "first_legal": false, + "n_rejected": 1, + "n_duplicates": 0, + "eda_verifications": 7, + "statuses": { + "rejected_program": 1, + "auto_passed": 7 + }, + "drc_lvs_clean": 7, + "auto_passed": 7, + "best": { + "1": { + "best_area": null, + "vs_reference": null, + "vs_best_evaluated": null + }, + "2": { + "best_area": 3136.9144, + "vs_reference": -0.03490273956962753, + "vs_best_evaluated": 0.05478558552621182 + }, + "4": { + "best_area": 2939.0675, + "vs_reference": -0.09577194950874535, + "vs_best_evaluated": -0.011740315933211454 + }, + "8": { + "best_area": 2877.5218, + "vs_reference": -0.11470698530738543, + "vs_best_evaluated": -0.03243502064403203 + } + }, + "reference_area": 3250.3609, + "best_evaluated_area": 2973.983, + "best_evaluated_complete": true, + "evaluator_s": 106.7, + "model_s": null, + "usage": null, + "isolation_breach": null, + "interface": "sharing" + }, + { + "tag": "anthropic_claude-sonnet", + "task": "C11_ihp130_sW2_sL2", + "topology": "C11", + "rep": "r3", + "n_proposals": 5, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 5, + "statuses": { + "auto_passed": 5 + }, + "drc_lvs_clean": 5, + "auto_passed": 5, + "best": { + "1": { + "best_area": 3136.9144, + "vs_reference": -0.03490273956962753, + "vs_best_evaluated": 0.05478558552621182 + }, + "2": { + "best_area": 3136.9144, + "vs_reference": -0.03490273956962753, + "vs_best_evaluated": 0.05478558552621182 + }, + "4": { + "best_area": 3136.9144, + "vs_reference": -0.03490273956962753, + "vs_best_evaluated": 0.05478558552621182 + }, + "8": { + "best_area": 3136.9144, + "vs_reference": -0.03490273956962753, + "vs_best_evaluated": 0.05478558552621182 + } + }, + "reference_area": 3250.3609, + "best_evaluated_area": 2973.983, + "best_evaluated_complete": true, + "evaluator_s": 78.2, + "model_s": null, + "usage": null, + "isolation_breach": null, + "interface": "sharing" + }, + { + "tag": "anthropic_claude-sonnet", + "task": "C11_sky130_sW2_sL1", + "topology": "C11", + "rep": "r1", + "n_proposals": 5, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 5, + "statuses": { + "auto_passed": 5 + }, + "drc_lvs_clean": 5, + "auto_passed": 5, + "best": { + "1": { + "best_area": 1985.2473, + "vs_reference": -0.04488528095613875, + "vs_best_evaluated": 0.05888874908438857 + }, + "2": { + "best_area": 1985.2473, + "vs_reference": -0.04488528095613875, + "vs_best_evaluated": 0.05888874908438857 + }, + "4": { + "best_area": 1985.2473, + "vs_reference": -0.04488528095613875, + "vs_best_evaluated": 0.05888874908438857 + }, + "8": { + "best_area": 1985.2473, + "vs_reference": -0.04488528095613875, + "vs_best_evaluated": 0.05888874908438857 + } + }, + "reference_area": 2078.5433, + "best_evaluated_area": 1874.8403, + "best_evaluated_complete": true, + "evaluator_s": 118.0, + "model_s": null, + "usage": null, + "isolation_breach": null, + "interface": "sharing" + }, + { + "tag": "anthropic_claude-sonnet", + "task": "C11_sky130_sW2_sL1", + "topology": "C11", + "rep": "r2", + "n_proposals": 6, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 6, + "statuses": { + "auto_passed": 6 + }, + "drc_lvs_clean": 6, + "auto_passed": 6, + "best": { + "1": { + "best_area": 2039.7416, + "vs_reference": -0.01866773715996184, + "vs_best_evaluated": 0.08795485140787718 + }, + "2": { + "best_area": 1985.2473, + "vs_reference": -0.04488528095613875, + "vs_best_evaluated": 0.05888874908438857 + }, + "4": { + "best_area": 1985.2473, + "vs_reference": -0.04488528095613875, + "vs_best_evaluated": 0.05888874908438857 + }, + "8": { + "best_area": 1985.2473, + "vs_reference": -0.04488528095613875, + "vs_best_evaluated": 0.05888874908438857 + } + }, + "reference_area": 2078.5433, + "best_evaluated_area": 1874.8403, + "best_evaluated_complete": true, + "evaluator_s": 152.8, + "model_s": null, + "usage": null, + "isolation_breach": null, + "interface": "sharing" + }, + { + "tag": "anthropic_claude-sonnet", + "task": "C11_sky130_sW2_sL1", + "topology": "C11", + "rep": "r3", + "n_proposals": 8, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 8, + "statuses": { + "auto_passed": 8 + }, + "drc_lvs_clean": 8, + "auto_passed": 8, + "best": { + "1": { + "best_area": 2039.7416, + "vs_reference": -0.01866773715996184, + "vs_best_evaluated": 0.08795485140787718 + }, + "2": { + "best_area": 2013.1611, + "vs_reference": -0.03145577963182189, + "vs_best_evaluated": 0.07377737719847399 + }, + "4": { + "best_area": 1985.2473, + "vs_reference": -0.04488528095613875, + "vs_best_evaluated": 0.05888874908438857 + }, + "8": { + "best_area": 1804.6301, + "vs_reference": -0.13178132974184364, + "vs_best_evaluated": -0.03744862962461393 + } + }, + "reference_area": 2078.5433, + "best_evaluated_area": 1874.8403, + "best_evaluated_complete": true, + "evaluator_s": 208.8, + "model_s": null, + "usage": null, + "isolation_breach": null, + "interface": "sharing" + }, + { + "tag": "anthropic_claude-sonnet", + "task": "C11_sky130_sW2_sL2", + "topology": "C11", + "rep": "r1", + "n_proposals": 3, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 3, + "statuses": { + "auto_passed": 3 + }, + "drc_lvs_clean": 3, + "auto_passed": 3, + "best": { + "1": { + "best_area": 2884.8872, + "vs_reference": -0.0313264811916204, + "vs_best_evaluated": 0.06533125157867214 + }, + "2": { + "best_area": 2884.8872, + "vs_reference": -0.0313264811916204, + "vs_best_evaluated": 0.06533125157867214 + }, + "4": { + "best_area": 2884.8872, + "vs_reference": -0.0313264811916204, + "vs_best_evaluated": 0.06533125157867214 + }, + "8": { + "best_area": 2884.8872, + "vs_reference": -0.0313264811916204, + "vs_best_evaluated": 0.06533125157867214 + } + }, + "reference_area": 2978.1832, + "best_evaluated_area": 2707.972, + "best_evaluated_complete": true, + "evaluator_s": 84.5, + "model_s": null, + "usage": null, + "isolation_breach": null, + "interface": "sharing" + }, + { + "tag": "anthropic_claude-sonnet", + "task": "C11_sky130_sW2_sL2", + "topology": "C11", + "rep": "r2", + "n_proposals": 8, + "first_legal": false, + "n_rejected": 1, + "n_duplicates": 0, + "eda_verifications": 7, + "statuses": { + "rejected_program": 1, + "auto_passed": 7 + }, + "drc_lvs_clean": 7, + "auto_passed": 7, + "best": { + "1": { + "best_area": null, + "vs_reference": null, + "vs_best_evaluated": null + }, + "2": { + "best_area": 2884.8872, + "vs_reference": -0.0313264811916204, + "vs_best_evaluated": 0.06533125157867214 + }, + "4": { + "best_area": 2823.0248, + "vs_reference": -0.05209833968575195, + "vs_best_evaluated": 0.042486702225872364 + }, + "8": { + "best_area": 2823.0248, + "vs_reference": -0.05209833968575195, + "vs_best_evaluated": 0.042486702225872364 + } + }, + "reference_area": 2978.1832, + "best_evaluated_area": 2707.972, + "best_evaluated_complete": true, + "evaluator_s": 179.9, + "model_s": null, + "usage": null, + "isolation_breach": null, + "interface": "sharing" + }, + { + "tag": "anthropic_claude-sonnet", + "task": "C11_sky130_sW2_sL2", + "topology": "C11", + "rep": "r3", + "n_proposals": 6, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 6, + "statuses": { + "auto_passed": 6 + }, + "drc_lvs_clean": 6, + "auto_passed": 6, + "best": { + "1": { + "best_area": 2842.6356, + "vs_reference": -0.04551351978615681, + "vs_best_evaluated": 0.04972857917290119 + }, + "2": { + "best_area": 2842.6356, + "vs_reference": -0.04551351978615681, + "vs_best_evaluated": 0.04972857917290119 + }, + "4": { + "best_area": 2773.3706, + "vs_reference": -0.06877098762762468, + "vs_best_evaluated": 0.024150397419175684 + }, + "8": { + "best_area": 2773.3706, + "vs_reference": -0.06877098762762468, + "vs_best_evaluated": 0.024150397419175684 + } + }, + "reference_area": 2978.1832, + "best_evaluated_area": 2707.972, + "best_evaluated_complete": true, + "evaluator_s": 178.1, + "model_s": null, + "usage": null, + "isolation_breach": null, + "interface": "sharing" + }, + { + "tag": "anthropic_claude-sonnet", + "task": "C16_gf180_sW2_sL1", + "topology": "C16", + "rep": "r1", + "n_proposals": 4, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 4, + "statuses": { + "auto_passed": 4 + }, + "drc_lvs_clean": 4, + "auto_passed": 4, + "best": { + "1": { + "best_area": 1729.3648, + "vs_reference": 0.0, + "vs_best_evaluated": 0.2531418312387792 + }, + "2": { + "best_area": 1729.3648, + "vs_reference": 0.0, + "vs_best_evaluated": 0.2531418312387792 + }, + "4": { + "best_area": 1729.3648, + "vs_reference": 0.0, + "vs_best_evaluated": 0.2531418312387792 + }, + "8": { + "best_area": 1729.3648, + "vs_reference": 0.0, + "vs_best_evaluated": 0.2531418312387792 + } + }, + "reference_area": 1729.3648, + "best_evaluated_area": 1380.0232, + "best_evaluated_complete": true, + "evaluator_s": 83.4, + "model_s": null, + "usage": null, + "isolation_breach": null, + "interface": "sharing" + }, + { + "tag": "anthropic_claude-sonnet", + "task": "C16_gf180_sW2_sL1", + "topology": "C16", + "rep": "r2", + "n_proposals": 7, + "first_legal": true, + "n_rejected": 1, + "n_duplicates": 0, + "eda_verifications": 6, + "statuses": { + "auto_passed": 6, + "rejected_program": 1 + }, + "drc_lvs_clean": 6, + "auto_passed": 6, + "best": { + "1": { + "best_area": 1729.3648, + "vs_reference": 0.0, + "vs_best_evaluated": 0.2531418312387792 + }, + "2": { + "best_area": 1729.3648, + "vs_reference": 0.0, + "vs_best_evaluated": 0.2531418312387792 + }, + "4": { + "best_area": 1729.3648, + "vs_reference": 0.0, + "vs_best_evaluated": 0.2531418312387792 + }, + "8": { + "best_area": 1479.1272, + "vs_reference": -0.14469914040114618, + "vs_best_evaluated": 0.07181328545780952 + } + }, + "reference_area": 1729.3648, + "best_evaluated_area": 1380.0232, + "best_evaluated_complete": true, + "evaluator_s": 127.5, + "model_s": null, + "usage": null, + "isolation_breach": null, + "interface": "sharing" + }, + { + "tag": "anthropic_claude-sonnet", + "task": "C16_gf180_sW2_sL1", + "topology": "C16", + "rep": "r3", + "n_proposals": 5, + "first_legal": false, + "n_rejected": 1, + "n_duplicates": 0, + "eda_verifications": 4, + "statuses": { + "rejected_program": 1, + "auto_passed": 4 + }, + "drc_lvs_clean": 4, + "auto_passed": 4, + "best": { + "1": { + "best_area": null, + "vs_reference": null, + "vs_best_evaluated": null + }, + "2": { + "best_area": 1729.3648, + "vs_reference": 0.0, + "vs_best_evaluated": 0.2531418312387792 + }, + "4": { + "best_area": 1729.3648, + "vs_reference": 0.0, + "vs_best_evaluated": 0.2531418312387792 + }, + "8": { + "best_area": 1729.3648, + "vs_reference": 0.0, + "vs_best_evaluated": 0.2531418312387792 + } + }, + "reference_area": 1729.3648, + "best_evaluated_area": 1380.0232, + "best_evaluated_complete": true, + "evaluator_s": 80.9, + "model_s": null, + "usage": null, + "isolation_breach": null, + "interface": "sharing" + }, + { + "tag": "anthropic_claude-sonnet", + "task": "C16_gf180_sW2_sL2", + "topology": "C16", + "rep": "r1", + "n_proposals": 2, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 2, + "statuses": { + "auto_passed": 2 + }, + "drc_lvs_clean": 2, + "auto_passed": 2, + "best": { + "1": { + "best_area": 1729.3648, + "vs_reference": 0.0, + "vs_best_evaluated": 0.2531418312387792 + }, + "2": { + "best_area": 1729.3648, + "vs_reference": 0.0, + "vs_best_evaluated": 0.2531418312387792 + }, + "4": { + "best_area": 1729.3648, + "vs_reference": 0.0, + "vs_best_evaluated": 0.2531418312387792 + }, + "8": { + "best_area": 1729.3648, + "vs_reference": 0.0, + "vs_best_evaluated": 0.2531418312387792 + } + }, + "reference_area": 1729.3648, + "best_evaluated_area": 1380.0232, + "best_evaluated_complete": true, + "evaluator_s": 41.7, + "model_s": null, + "usage": null, + "isolation_breach": null, + "interface": "sharing" + }, + { + "tag": "anthropic_claude-sonnet", + "task": "C16_gf180_sW2_sL2", + "topology": "C16", + "rep": "r2", + "n_proposals": 4, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 4, + "statuses": { + "auto_passed": 4 + }, + "drc_lvs_clean": 4, + "auto_passed": 4, + "best": { + "1": { + "best_area": 1729.3648, + "vs_reference": 0.0, + "vs_best_evaluated": 0.2531418312387792 + }, + "2": { + "best_area": 1729.3648, + "vs_reference": 0.0, + "vs_best_evaluated": 0.2531418312387792 + }, + "4": { + "best_area": 1729.3648, + "vs_reference": 0.0, + "vs_best_evaluated": 0.2531418312387792 + }, + "8": { + "best_area": 1729.3648, + "vs_reference": 0.0, + "vs_best_evaluated": 0.2531418312387792 + } + }, + "reference_area": 1729.3648, + "best_evaluated_area": 1380.0232, + "best_evaluated_complete": true, + "evaluator_s": 86.2, + "model_s": null, + "usage": null, + "isolation_breach": null, + "interface": "sharing" + }, + { + "tag": "anthropic_claude-sonnet", + "task": "C16_gf180_sW2_sL2", + "topology": "C16", + "rep": "r3", + "n_proposals": 7, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 7, + "statuses": { + "auto_passed": 7 + }, + "drc_lvs_clean": 7, + "auto_passed": 7, + "best": { + "1": { + "best_area": 1729.3648, + "vs_reference": 0.0, + "vs_best_evaluated": 0.2531418312387792 + }, + "2": { + "best_area": 1729.3648, + "vs_reference": 0.0, + "vs_best_evaluated": 0.2531418312387792 + }, + "4": { + "best_area": 1729.3648, + "vs_reference": 0.0, + "vs_best_evaluated": 0.2531418312387792 + }, + "8": { + "best_area": 1479.1272, + "vs_reference": -0.14469914040114618, + "vs_best_evaluated": 0.07181328545780952 + } + }, + "reference_area": 1729.3648, + "best_evaluated_area": 1380.0232, + "best_evaluated_complete": true, + "evaluator_s": 139.9, + "model_s": null, + "usage": null, + "isolation_breach": null, + "interface": "sharing" + }, + { + "tag": "anthropic_claude-sonnet", + "task": "C16_ihp130_sW2_sL1", + "topology": "C16", + "rep": "r1", + "n_proposals": 5, + "first_legal": true, + "n_rejected": 1, + "n_duplicates": 0, + "eda_verifications": 4, + "statuses": { + "auto_passed": 3, + "spec_failed": 1, + "rejected_program": 1 + }, + "drc_lvs_clean": 4, + "auto_passed": 3, + "best": { + "1": { + "best_area": 1007.736, + "vs_reference": 0.0, + "vs_best_evaluated": 0.14487249050461193 + }, + "2": { + "best_area": 1007.736, + "vs_reference": 0.0, + "vs_best_evaluated": 0.14487249050461193 + }, + "4": { + "best_area": 1007.736, + "vs_reference": 0.0, + "vs_best_evaluated": 0.14487249050461193 + }, + "8": { + "best_area": 1007.736, + "vs_reference": 0.0, + "vs_best_evaluated": 0.14487249050461193 + } + }, + "reference_area": 1007.736, + "best_evaluated_area": 880.2168, + "best_evaluated_complete": true, + "evaluator_s": 35.9, + "model_s": null, + "usage": null, + "isolation_breach": null, + "interface": "sharing" + }, + { + "tag": "anthropic_claude-sonnet", + "task": "C16_ihp130_sW2_sL1", + "topology": "C16", + "rep": "r2", + "n_proposals": 4, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 4, + "statuses": { + "auto_passed": 4 + }, + "drc_lvs_clean": 4, + "auto_passed": 4, + "best": { + "1": { + "best_area": 1007.736, + "vs_reference": 0.0, + "vs_best_evaluated": 0.14487249050461193 + }, + "2": { + "best_area": 880.2168, + "vs_reference": -0.1265402843601895, + "vs_best_evaluated": 0.0 + }, + "4": { + "best_area": 880.2168, + "vs_reference": -0.1265402843601895, + "vs_best_evaluated": 0.0 + }, + "8": { + "best_area": 880.2168, + "vs_reference": -0.1265402843601895, + "vs_best_evaluated": 0.0 + } + }, + "reference_area": 1007.736, + "best_evaluated_area": 880.2168, + "best_evaluated_complete": true, + "evaluator_s": 35.3, + "model_s": null, + "usage": null, + "isolation_breach": null, + "interface": "sharing" + }, + { + "tag": "anthropic_claude-sonnet", + "task": "C16_ihp130_sW2_sL1", + "topology": "C16", + "rep": "r3", + "n_proposals": 3, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 3, + "statuses": { + "auto_passed": 2, + "spec_failed": 1 + }, + "drc_lvs_clean": 3, + "auto_passed": 2, + "best": { + "1": { + "best_area": 1007.736, + "vs_reference": 0.0, + "vs_best_evaluated": 0.14487249050461193 + }, + "2": { + "best_area": 1007.736, + "vs_reference": 0.0, + "vs_best_evaluated": 0.14487249050461193 + }, + "4": { + "best_area": 1007.736, + "vs_reference": 0.0, + "vs_best_evaluated": 0.14487249050461193 + }, + "8": { + "best_area": 1007.736, + "vs_reference": 0.0, + "vs_best_evaluated": 0.14487249050461193 + } + }, + "reference_area": 1007.736, + "best_evaluated_area": 880.2168, + "best_evaluated_complete": true, + "evaluator_s": 26.2, + "model_s": null, + "usage": null, + "isolation_breach": null, + "interface": "sharing" + }, + { + "tag": "anthropic_claude-sonnet", + "task": "C16_ihp130_sW2_sL2", + "topology": "C16", + "rep": "r1", + "n_proposals": 5, + "first_legal": true, + "n_rejected": 1, + "n_duplicates": 0, + "eda_verifications": 4, + "statuses": { + "auto_passed": 3, + "spec_failed": 1, + "rejected_program": 1 + }, + "drc_lvs_clean": 4, + "auto_passed": 3, + "best": { + "1": { + "best_area": 1007.736, + "vs_reference": 0.0, + "vs_best_evaluated": 0.22318840579710142 + }, + "2": { + "best_area": 1007.736, + "vs_reference": 0.0, + "vs_best_evaluated": 0.22318840579710142 + }, + "4": { + "best_area": 1007.736, + "vs_reference": 0.0, + "vs_best_evaluated": 0.22318840579710142 + }, + "8": { + "best_area": 1007.736, + "vs_reference": 0.0, + "vs_best_evaluated": 0.22318840579710142 + } + }, + "reference_area": 1007.736, + "best_evaluated_area": 823.86, + "best_evaluated_complete": true, + "evaluator_s": 34.8, + "model_s": null, + "usage": null, + "isolation_breach": null, + "interface": "sharing" + }, + { + "tag": "anthropic_claude-sonnet", + "task": "C16_ihp130_sW2_sL2", + "topology": "C16", + "rep": "r2", + "n_proposals": 3, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 3, + "statuses": { + "auto_passed": 2, + "spec_failed": 1 + }, + "drc_lvs_clean": 3, + "auto_passed": 2, + "best": { + "1": { + "best_area": 1007.736, + "vs_reference": 0.0, + "vs_best_evaluated": 0.22318840579710142 + }, + "2": { + "best_area": 1007.736, + "vs_reference": 0.0, + "vs_best_evaluated": 0.22318840579710142 + }, + "4": { + "best_area": 1007.736, + "vs_reference": 0.0, + "vs_best_evaluated": 0.22318840579710142 + }, + "8": { + "best_area": 1007.736, + "vs_reference": 0.0, + "vs_best_evaluated": 0.22318840579710142 + } + }, + "reference_area": 1007.736, + "best_evaluated_area": 823.86, + "best_evaluated_complete": true, + "evaluator_s": 26.3, + "model_s": null, + "usage": null, + "isolation_breach": null, + "interface": "sharing" + }, + { + "tag": "anthropic_claude-sonnet", + "task": "C16_ihp130_sW2_sL2", + "topology": "C16", + "rep": "r3", + "n_proposals": 4, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 4, + "statuses": { + "auto_passed": 3, + "spec_failed": 1 + }, + "drc_lvs_clean": 4, + "auto_passed": 3, + "best": { + "1": { + "best_area": 1007.736, + "vs_reference": 0.0, + "vs_best_evaluated": 0.22318840579710142 + }, + "2": { + "best_area": 1007.736, + "vs_reference": 0.0, + "vs_best_evaluated": 0.22318840579710142 + }, + "4": { + "best_area": 880.2168, + "vs_reference": -0.1265402843601895, + "vs_best_evaluated": 0.06840579710144934 + }, + "8": { + "best_area": 880.2168, + "vs_reference": -0.1265402843601895, + "vs_best_evaluated": 0.06840579710144934 + } + }, + "reference_area": 1007.736, + "best_evaluated_area": 823.86, + "best_evaluated_complete": true, + "evaluator_s": 34.3, + "model_s": null, + "usage": null, + "isolation_breach": null, + "interface": "sharing" + }, + { + "tag": "anthropic_claude-sonnet", + "task": "C16_sky130_sW2_sL1", + "topology": "C16", + "rep": "r1", + "n_proposals": 3, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 3, + "statuses": { + "auto_passed": 3 + }, + "drc_lvs_clean": 3, + "auto_passed": 3, + "best": { + "1": { + "best_area": 377.2789, + "vs_reference": 0.0, + "vs_best_evaluated": 0.17840662268451868 + }, + "2": { + "best_area": 377.2789, + "vs_reference": 0.0, + "vs_best_evaluated": 0.17840662268451868 + }, + "4": { + "best_area": 377.2789, + "vs_reference": 0.0, + "vs_best_evaluated": 0.17840662268451868 + }, + "8": { + "best_area": 377.2789, + "vs_reference": 0.0, + "vs_best_evaluated": 0.17840662268451868 + } + }, + "reference_area": 377.2789, + "best_evaluated_area": 320.1602, + "best_evaluated_complete": true, + "evaluator_s": 53.3, + "model_s": null, + "usage": null, + "isolation_breach": null, + "interface": "sharing" + }, + { + "tag": "anthropic_claude-sonnet", + "task": "C16_sky130_sW2_sL1", + "topology": "C16", + "rep": "r2", + "n_proposals": 4, + "first_legal": true, + "n_rejected": 1, + "n_duplicates": 0, + "eda_verifications": 3, + "statuses": { + "auto_passed": 3, + "rejected_program": 1 + }, + "drc_lvs_clean": 3, + "auto_passed": 3, + "best": { + "1": { + "best_area": 377.2789, + "vs_reference": 0.0, + "vs_best_evaluated": 0.17840662268451868 + }, + "2": { + "best_area": 377.2789, + "vs_reference": 0.0, + "vs_best_evaluated": 0.17840662268451868 + }, + "4": { + "best_area": 377.2789, + "vs_reference": 0.0, + "vs_best_evaluated": 0.17840662268451868 + }, + "8": { + "best_area": 377.2789, + "vs_reference": 0.0, + "vs_best_evaluated": 0.17840662268451868 + } + }, + "reference_area": 377.2789, + "best_evaluated_area": 320.1602, + "best_evaluated_complete": true, + "evaluator_s": 53.5, + "model_s": null, + "usage": null, + "isolation_breach": null, + "interface": "sharing" + }, + { + "tag": "anthropic_claude-sonnet", + "task": "C16_sky130_sW2_sL1", + "topology": "C16", + "rep": "r3", + "n_proposals": 5, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 5, + "statuses": { + "auto_passed": 5 + }, + "drc_lvs_clean": 5, + "auto_passed": 5, + "best": { + "1": { + "best_area": 377.2789, + "vs_reference": 0.0, + "vs_best_evaluated": 0.17840662268451868 + }, + "2": { + "best_area": 377.2789, + "vs_reference": 0.0, + "vs_best_evaluated": 0.17840662268451868 + }, + "4": { + "best_area": 377.2789, + "vs_reference": 0.0, + "vs_best_evaluated": 0.17840662268451868 + }, + "8": { + "best_area": 377.2789, + "vs_reference": 0.0, + "vs_best_evaluated": 0.17840662268451868 + } + }, + "reference_area": 377.2789, + "best_evaluated_area": 320.1602, + "best_evaluated_complete": true, + "evaluator_s": 87.4, + "model_s": null, + "usage": null, + "isolation_breach": null, + "interface": "sharing" + }, + { + "tag": "anthropic_claude-sonnet", + "task": "C16_sky130_sW2_sL2", + "topology": "C16", + "rep": "r1", + "n_proposals": 5, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 5, + "statuses": { + "auto_passed": 5 + }, + "drc_lvs_clean": 5, + "auto_passed": 5, + "best": { + "1": { + "best_area": 377.2789, + "vs_reference": 0.0, + "vs_best_evaluated": 0.2677020313599916 + }, + "2": { + "best_area": 377.2789, + "vs_reference": 0.0, + "vs_best_evaluated": 0.2677020313599916 + }, + "4": { + "best_area": 377.2789, + "vs_reference": 0.0, + "vs_best_evaluated": 0.2677020313599916 + }, + "8": { + "best_area": 320.1602, + "vs_reference": -0.1513964867900114, + "vs_best_evaluated": 0.0757763975155279 + } + }, + "reference_area": 377.2789, + "best_evaluated_area": 297.6085, + "best_evaluated_complete": true, + "evaluator_s": 89.3, + "model_s": null, + "usage": null, + "isolation_breach": null, + "interface": "sharing" + }, + { + "tag": "anthropic_claude-sonnet", + "task": "C16_sky130_sW2_sL2", + "topology": "C16", + "rep": "r2", + "n_proposals": 5, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 5, + "statuses": { + "auto_passed": 5 + }, + "drc_lvs_clean": 5, + "auto_passed": 5, + "best": { + "1": { + "best_area": 377.2789, + "vs_reference": 0.0, + "vs_best_evaluated": 0.2677020313599916 + }, + "2": { + "best_area": 377.2789, + "vs_reference": 0.0, + "vs_best_evaluated": 0.2677020313599916 + }, + "4": { + "best_area": 377.2789, + "vs_reference": 0.0, + "vs_best_evaluated": 0.2677020313599916 + }, + "8": { + "best_area": 377.2789, + "vs_reference": 0.0, + "vs_best_evaluated": 0.2677020313599916 + } + }, + "reference_area": 377.2789, + "best_evaluated_area": 297.6085, + "best_evaluated_complete": true, + "evaluator_s": 88.9, + "model_s": null, + "usage": null, + "isolation_breach": null, + "interface": "sharing" + }, + { + "tag": "anthropic_claude-sonnet", + "task": "C16_sky130_sW2_sL2", + "topology": "C16", + "rep": "r3", + "n_proposals": 5, + "first_legal": true, + "n_rejected": 0, + "n_duplicates": 0, + "eda_verifications": 5, + "statuses": { + "auto_passed": 5 + }, + "drc_lvs_clean": 5, + "auto_passed": 5, + "best": { + "1": { + "best_area": 377.2789, + "vs_reference": 0.0, + "vs_best_evaluated": 0.2677020313599916 + }, + "2": { + "best_area": 377.2789, + "vs_reference": 0.0, + "vs_best_evaluated": 0.2677020313599916 + }, + "4": { + "best_area": 377.2789, + "vs_reference": 0.0, + "vs_best_evaluated": 0.2677020313599916 + }, + "8": { + "best_area": 377.2789, + "vs_reference": 0.0, + "vs_best_evaluated": 0.2677020313599916 + } + }, + "reference_area": 377.2789, + "best_evaluated_area": 297.6085, + "best_evaluated_complete": true, + "evaluator_s": 90.2, + "model_s": null, + "usage": null, + "isolation_breach": null, + "interface": "sharing" + } + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/results/analysis/pex_sensitivity_C10_gf180.json b/benchmarks/textbook_sharing/results/analysis/pex_sensitivity_C10_gf180.json new file mode 100644 index 00000000..3f13557c --- /dev/null +++ b/benchmarks/textbook_sharing/results/analysis/pex_sensitivity_C10_gf180.json @@ -0,0 +1,101 @@ +[ + { + "run": "runs/grid/C10/gf180/sW1_sL1.5/independent", + "status": "spec_failed", + "rc_measures": { + "vo1": 1.981158, + "vo2": 1.319728, + "idd": 7.962147e-05, + "gain_lf": 61.37221, + "ugf": 21315020.0, + "f3db": 18131.0 + }, + "c_only_measures": { + "vo1": 1.650431, + "vo2": 1.650431, + "idd": 7.966196e-05, + "gain_lf": 68.34504, + "ugf": 21336780.0, + "f3db": 8135.213 + }, + "c_only_counts": { + "n_res": 0, + "n_cap": 78, + "n_devices": 80 + }, + "spec": { + "gain_lf": { + "min": 65.35 + }, + "ugf": { + "min": 13000000.0 + } + } + }, + { + "run": "runs/grid/C10/gf180/sW1_sL1.5/combined", + "status": "spec_failed", + "rc_measures": { + "vo1": 1.967881, + "vo2": 1.333007, + "idd": 7.962102e-05, + "gain_lf": 62.20407, + "ugf": 21342790.0, + "f3db": 16496.64 + }, + "c_only_measures": { + "vo1": 1.650431, + "vo2": 1.650431, + "idd": 7.966196e-05, + "gain_lf": 68.34505, + "ugf": 21353590.0, + "f3db": 8141.614 + }, + "c_only_counts": { + "n_res": 0, + "n_cap": 78, + "n_devices": 80 + }, + "spec": { + "gain_lf": { + "min": 65.35 + }, + "ugf": { + "min": 13000000.0 + } + } + }, + { + "run": "runs/grid/C10/gf180/sW1_sL1/independent", + "status": "auto_passed", + "rc_measures": { + "vo1": 1.824683, + "vo2": 1.475098, + "idd": 7.999468e-05, + "gain_lf": 62.70657, + "ugf": 26647450.0, + "f3db": 19438.34 + }, + "c_only_measures": { + "vo1": 1.649878, + "vo2": 1.649878, + "idd": 8.003606e-05, + "gain_lf": 62.87456, + "ugf": 26771560.0, + "f3db": 19159.28 + }, + "c_only_counts": { + "n_res": 0, + "n_cap": 81, + "n_devices": 80 + }, + "spec": { + "gain_lf": { + "min": 59.87 + }, + "ugf": { + "min": 16300000.0 + } + } + } +] \ No newline at end of file diff --git a/benchmarks/textbook_sharing/results/analysis/pvt.json b/benchmarks/textbook_sharing/results/analysis/pvt.json new file mode 100644 index 00000000..8e433334 --- /dev/null +++ b/benchmarks/textbook_sharing/results/analysis/pvt.json @@ -0,0 +1,8074 @@ +{ + "conditions": [ + [ + "TT_27C_VDD", + "tt", + 27, + 1.0 + ], + [ + "SS_27C_VDD", + "ss", + 27, + 1.0 + ], + [ + "FF_27C_VDD", + "ff", + 27, + 1.0 + ], + [ + "SS_85C_0.9VDD", + "ss", + 85, + 0.9 + ], + [ + "FF_m40C_1.1VDD", + "ff", + -40, + 1.1 + ] + ], + "targets": [ + [ + "C02_sky130", + "reference", + "runs/grid/C02/sky130/sW1_sL1/independent/result.json" + ], + [ + "C02_sky130", + "combined", + "runs/grid/C02/sky130/sW1_sL1/combined/result.json" + ], + [ + "C02_sky130", + "best_evaluated", + "runs/selection/C02_sky130_sW1_sL1/cbf80e3ede2f/result.json" + ], + [ + "C02_gf180", + "reference", + "runs/grid/C02/gf180/sW1_sL1/independent/result.json" + ], + [ + "C02_gf180", + "combined", + "runs/grid/C02/gf180/sW1_sL1/combined/result.json" + ], + [ + "C02_gf180", + "best_evaluated", + "runs/selection/C02_gf180_sW1_sL1/c054e1700ec1/result.json" + ], + [ + "C02_ihp130", + "reference", + "runs/grid/C02/ihp130/sW1_sL1/independent/result.json" + ], + [ + "C02_ihp130", + "combined", + "runs/grid/C02/ihp130/sW1_sL1/combined/result.json" + ], + [ + "C02_ihp130", + "best_evaluated", + "runs/selection/C02_ihp130_sW1_sL1/c054e1700ec1/result.json" + ], + [ + "C08_sky130", + "reference", + "runs/grid/C08/sky130/sW1_sL1/independent/result.json" + ], + [ + "C08_sky130", + "combined", + "runs/grid/C08/sky130/sW1_sL1/combined/result.json" + ], + [ + "C08_sky130", + "best_evaluated", + "runs/selection/C08_sky130_sW1_sL1/c12cfed03e95/result.json" + ], + [ + "C08_gf180", + "reference", + "runs/grid/C08/gf180/sW1_sL1/independent/result.json" + ], + [ + "C08_gf180", + "combined", + "runs/grid/C08/gf180/sW1_sL1/combined/result.json" + ], + [ + "C08_gf180", + "best_evaluated", + "runs/selection/C08_gf180_sW1_sL1/c66b5f77dca4/result.json" + ], + [ + "C08_ihp130", + "reference", + "runs/grid/C08/ihp130/sW1_sL1/independent/result.json" + ], + [ + "C08_ihp130", + "combined", + "runs/grid/C08/ihp130/sW1_sL1/combined/result.json" + ], + [ + "C08_ihp130", + "best_evaluated", + "runs/selection/C08_ihp130_sW1_sL1/c1ed2c9bd13e/result.json" + ], + [ + "C09_sky130", + "reference", + "runs/grid/C09/sky130/sW1_sL1/independent/result.json" + ], + [ + "C09_sky130", + "combined", + "runs/grid/C09/sky130/sW1_sL1/combined/result.json" + ], + [ + "C09_sky130", + "best_evaluated", + "runs/selection/C09_sky130_sW1_sL1/cb665d318416/result.json" + ], + [ + "C09_gf180", + "reference", + "runs/grid/C09/gf180/sW1_sL1/independent/result.json" + ], + [ + "C09_gf180", + "combined", + "runs/grid/C09/gf180/sW1_sL1/combined/result.json" + ], + [ + "C09_gf180", + "best_evaluated", + "runs/selection/C09_gf180_sW1_sL1/ca6f6963e509/result.json" + ], + [ + "C09_ihp130", + "reference", + "runs/grid/C09/ihp130/sW1_sL1/independent/result.json" + ], + [ + "C09_ihp130", + "combined", + "runs/grid/C09/ihp130/sW1_sL1/combined/result.json" + ], + [ + "C09_ihp130", + "best_evaluated", + "runs/selection/C09_ihp130_sW1_sL1/c5974eb942a8/result.json" + ], + [ + "C11_sky130", + "reference", + "runs/grid/C11/sky130/sW1_sL1/independent/result.json" + ], + [ + "C11_sky130", + "combined", + "runs/grid/C11/sky130/sW1_sL1/combined/result.json" + ], + [ + "C11_sky130", + "best_evaluated", + "runs/selection/C11_sky130_sW1_sL1/c7a85b0ddcef/result.json" + ], + [ + "C11_gf180", + "reference", + "runs/grid/C11/gf180/sW1_sL1/independent/result.json" + ], + [ + "C11_gf180", + "combined", + "runs/grid/C11/gf180/sW1_sL1/combined/result.json" + ], + [ + "C11_gf180", + "best_evaluated", + "runs/selection/C11_gf180_sW1_sL1/c3d4bacbce79/result.json" + ], + [ + "C11_ihp130", + "reference", + "runs/grid/C11/ihp130/sW1_sL1/independent/result.json" + ], + [ + "C11_ihp130", + "combined", + "runs/grid/C11/ihp130/sW1_sL1/combined/result.json" + ], + [ + "C11_ihp130", + "best_evaluated", + "runs/selection/C11_ihp130_sW1_sL1/c054b3c446d5/result.json" + ], + [ + "C16_sky130", + "reference", + "runs/grid/C16/sky130/sW1_sL1/independent/result.json" + ], + [ + "C16_sky130", + "best_evaluated", + "runs/selection/C16_sky130_sW1_sL1/c0c48e26e41e/result.json" + ], + [ + "C16_gf180", + "reference", + "runs/grid/C16/gf180/sW1_sL1/independent/result.json" + ], + [ + "C16_gf180", + "best_evaluated", + "runs/selection/C16_gf180_sW1_sL1/c1905d32dbcf/result.json" + ], + [ + "C16_ihp130", + "reference", + "runs/grid/C16/ihp130/sW1_sL1/independent/result.json" + ], + [ + "C16_ihp130", + "best_evaluated", + "runs/selection/C16_ihp130_sW1_sL1/c0c48e26e41e/result.json" + ] + ], + "rows": [ + { + "key": "C02_sky130", + "role": "reference", + "condition": "TT_27C_VDD", + "status": "passed", + "measures": { + "iout_t": 1.998035e-05, + "err": -0.0009825, + "vmin": 0.6798476, + "dev_at_vdd": 0.0005593018, + "gout_t": 7.376655e-08, + "rout_t": 13556530.0, + "vout_test": 1.24, + "rout_nom": 13556530.0, + "ok_at_vdd": 1.0 + }, + "spec": { + "err": { + "value": -0.0009825, + "spec": { + "abs_max": 0.03 + }, + "ok": true + }, + "vmin": { + "value": 0.6798476, + "spec": { + "max": 0.7809 + }, + "ok": true + } + }, + "result": "runs/grid/C02/sky130/sW1_sL1/independent/result.json", + "geometry_hash": "9a9bcb6396aab6c6", + "area_um2": 134.0089 + }, + { + "key": "C02_sky130", + "role": "reference", + "condition": "SS_27C_VDD", + "status": "passed", + "measures": { + "iout_t": 1.997634e-05, + "err": -0.001183, + "vmin": 0.7235224, + "dev_at_vdd": 9.893872e-05, + "gout_t": 7.340006e-08, + "rout_t": 13624880.0, + "vout_test": 1.24, + "rout_nom": 13624880.0, + "ok_at_vdd": 1.0 + }, + "spec": { + "err": { + "value": -0.001183, + "spec": { + "abs_max": 0.03 + }, + "ok": true + }, + "vmin": { + "value": 0.7235224, + "spec": { + "max": 0.7809 + }, + "ok": true + } + }, + "result": "runs/grid/C02/sky130/sW1_sL1/independent/result.json", + "geometry_hash": "9a9bcb6396aab6c6", + "area_um2": 134.0089 + }, + { + "key": "C02_sky130", + "role": "reference", + "condition": "FF_27C_VDD", + "status": "passed", + "measures": { + "iout_t": 1.99857e-05, + "err": -0.000715, + "vmin": 0.6392014, + "dev_at_vdd": 0.001338685, + "gout_t": 8.938601e-08, + "rout_t": 11187510.0, + "vout_test": 1.24, + "rout_nom": 11187510.0, + "ok_at_vdd": 1.0 + }, + "spec": { + "err": { + "value": -0.000715, + "spec": { + "abs_max": 0.03 + }, + "ok": true + }, + "vmin": { + "value": 0.6392014, + "spec": { + "max": 0.7809 + }, + "ok": true + } + }, + "result": "runs/grid/C02/sky130/sW1_sL1/independent/result.json", + "geometry_hash": "9a9bcb6396aab6c6", + "area_um2": 134.0089 + }, + { + "key": "C02_sky130", + "role": "reference", + "condition": "SS_85C_0.9VDD", + "status": "passed", + "measures": { + "iout_t": 1.997811e-05, + "err": -0.0010945, + "vmin": 0.7052279, + "dev_at_vdd": 0.0001584413, + "gout_t": 7.388614e-08, + "rout_t": 13534790.0, + "vout_test": 1.24, + "rout_nom": 13534790.0, + "ok_at_vdd": 1.0 + }, + "spec": { + "err": { + "value": -0.0010945, + "spec": { + "abs_max": 0.03 + }, + "ok": true + }, + "vmin": { + "value": 0.7052279, + "spec": { + "max": 0.7809 + }, + "ok": true + } + }, + "result": "runs/grid/C02/sky130/sW1_sL1/independent/result.json", + "geometry_hash": "9a9bcb6396aab6c6", + "area_um2": 134.0089 + }, + { + "key": "C02_sky130", + "role": "reference", + "condition": "FF_m40C_1.1VDD", + "status": "passed", + "measures": { + "iout_t": 1.997903e-05, + "err": -0.0010485, + "vmin": 0.6742354, + "dev_at_vdd": 0.001804889, + "gout_t": 9.51773e-08, + "rout_t": 10506790.0, + "vout_test": 1.24, + "rout_nom": 10506790.0, + "ok_at_vdd": 1.0 + }, + "spec": { + "err": { + "value": -0.0010485, + "spec": { + "abs_max": 0.03 + }, + "ok": true + }, + "vmin": { + "value": 0.6742354, + "spec": { + "max": 0.7809 + }, + "ok": true + } + }, + "result": "runs/grid/C02/sky130/sW1_sL1/independent/result.json", + "geometry_hash": "9a9bcb6396aab6c6", + "area_um2": 134.0089 + }, + { + "key": "C02_sky130", + "role": "combined", + "condition": "TT_27C_VDD", + "status": "passed", + "measures": { + "iout_t": 1.996603e-05, + "err": -0.0016985, + "vmin": 0.6812876, + "dev_at_vdd": 0.0001735267, + "gout_t": 7.285176e-08, + "rout_t": 13726750.0, + "vout_test": 1.24, + "rout_nom": 13726750.0, + "ok_at_vdd": 1.0 + }, + "spec": { + "err": { + "value": -0.0016985, + "spec": { + "abs_max": 0.03 + }, + "ok": true + }, + "vmin": { + "value": 0.6812876, + "spec": { + "max": 0.7809 + }, + "ok": true + } + }, + "result": "runs/grid/C02/sky130/sW1_sL1/combined/result.json", + "geometry_hash": "7e64cc2498b0680d", + "area_um2": 119.9594 + }, + { + "key": "C02_sky130", + "role": "combined", + "condition": "SS_27C_VDD", + "status": "passed", + "measures": { + "iout_t": 1.996516e-05, + "err": -0.001742, + "vmin": 0.7246917, + "dev_at_vdd": 0.0004735028, + "gout_t": 7.240397e-08, + "rout_t": 13812310.0, + "vout_test": 1.24, + "rout_nom": 13812310.0, + "ok_at_vdd": 1.0 + }, + "spec": { + "err": { + "value": -0.001742, + "spec": { + "abs_max": 0.03 + }, + "ok": true + }, + "vmin": { + "value": 0.7246917, + "spec": { + "max": 0.7809 + }, + "ok": true + } + }, + "result": "runs/grid/C02/sky130/sW1_sL1/combined/result.json", + "geometry_hash": "7e64cc2498b0680d", + "area_um2": 119.9594 + }, + { + "key": "C02_sky130", + "role": "combined", + "condition": "FF_27C_VDD", + "status": "passed", + "measures": { + "iout_t": 1.996736e-05, + "err": -0.001632, + "vmin": 0.6410394, + "dev_at_vdd": 0.0003980315, + "gout_t": 8.827766e-08, + "rout_t": 11327970.0, + "vout_test": 1.24, + "rout_nom": 11327970.0, + "ok_at_vdd": 1.0 + }, + "spec": { + "err": { + "value": -0.001632, + "spec": { + "abs_max": 0.03 + }, + "ok": true + }, + "vmin": { + "value": 0.6410394, + "spec": { + "max": 0.7809 + }, + "ok": true + } + }, + "result": "runs/grid/C02/sky130/sW1_sL1/combined/result.json", + "geometry_hash": "7e64cc2498b0680d", + "area_um2": 119.9594 + }, + { + "key": "C02_sky130", + "role": "combined", + "condition": "SS_85C_0.9VDD", + "status": "passed", + "measures": { + "iout_t": 1.996747e-05, + "err": -0.0016265, + "vmin": 0.7065214, + "dev_at_vdd": 0.0006998915, + "gout_t": 7.294052e-08, + "rout_t": 13710250.0, + "vout_test": 1.24, + "rout_nom": 13710250.0, + "ok_at_vdd": 1.0 + }, + "spec": { + "err": { + "value": -0.0016265, + "spec": { + "abs_max": 0.03 + }, + "ok": true + }, + "vmin": { + "value": 0.7065214, + "spec": { + "max": 0.7809 + }, + "ok": true + } + }, + "result": "runs/grid/C02/sky130/sW1_sL1/combined/result.json", + "geometry_hash": "7e64cc2498b0680d", + "area_um2": 119.9594 + }, + { + "key": "C02_sky130", + "role": "combined", + "condition": "FF_m40C_1.1VDD", + "status": "passed", + "measures": { + "iout_t": 1.995922e-05, + "err": -0.002039, + "vmin": 0.6759507, + "dev_at_vdd": 0.0007767864, + "gout_t": 9.383478e-08, + "rout_t": 10657110.0, + "vout_test": 1.24, + "rout_nom": 10657110.0, + "ok_at_vdd": 1.0 + }, + "spec": { + "err": { + "value": -0.002039, + "spec": { + "abs_max": 0.03 + }, + "ok": true + }, + "vmin": { + "value": 0.6759507, + "spec": { + "max": 0.7809 + }, + "ok": true + } + }, + "result": "runs/grid/C02/sky130/sW1_sL1/combined/result.json", + "geometry_hash": "7e64cc2498b0680d", + "area_um2": 119.9594 + }, + { + "key": "C02_sky130", + "role": "best_evaluated", + "condition": "TT_27C_VDD", + "status": "passed", + "measures": { + "iout_t": 1.996601e-05, + "err": -0.0016995, + "vmin": 0.6812844, + "dev_at_vdd": 0.0001744298, + "gout_t": 7.285054e-08, + "rout_t": 13726980.0, + "vout_test": 1.24, + "rout_nom": 13726980.0, + "ok_at_vdd": 1.0 + }, + "spec": { + "err": { + "value": -0.0016995, + "spec": { + "abs_max": 0.03 + }, + "ok": true + }, + "vmin": { + "value": 0.6812844, + "spec": { + "max": 0.7809 + }, + "ok": true + } + }, + "result": "runs/selection/C02_sky130_sW1_sL1/cbf80e3ede2f/result.json", + "geometry_hash": "5859a39e1ff75a19", + "area_um2": 111.1906 + }, + { + "key": "C02_sky130", + "role": "best_evaluated", + "condition": "SS_27C_VDD", + "status": "passed", + "measures": { + "iout_t": 1.996515e-05, + "err": -0.0017425, + "vmin": 0.7246883, + "dev_at_vdd": 0.0004741311, + "gout_t": 7.240168e-08, + "rout_t": 13812740.0, + "vout_test": 1.24, + "rout_nom": 13812740.0, + "ok_at_vdd": 1.0 + }, + "spec": { + "err": { + "value": -0.0017425, + "spec": { + "abs_max": 0.03 + }, + "ok": true + }, + "vmin": { + "value": 0.7246883, + "spec": { + "max": 0.7809 + }, + "ok": true + } + }, + "result": "runs/selection/C02_sky130_sW1_sL1/cbf80e3ede2f/result.json", + "geometry_hash": "5859a39e1ff75a19", + "area_um2": 111.1906 + }, + { + "key": "C02_sky130", + "role": "best_evaluated", + "condition": "FF_27C_VDD", + "status": "passed", + "measures": { + "iout_t": 1.996734e-05, + "err": -0.001633, + "vmin": 0.6410368, + "dev_at_vdd": 0.0003966817, + "gout_t": 8.827672e-08, + "rout_t": 11328090.0, + "vout_test": 1.24, + "rout_nom": 11328090.0, + "ok_at_vdd": 1.0 + }, + "spec": { + "err": { + "value": -0.001633, + "spec": { + "abs_max": 0.03 + }, + "ok": true + }, + "vmin": { + "value": 0.6410368, + "spec": { + "max": 0.7809 + }, + "ok": true + } + }, + "result": "runs/selection/C02_sky130_sW1_sL1/cbf80e3ede2f/result.json", + "geometry_hash": "5859a39e1ff75a19", + "area_um2": 111.1906 + }, + { + "key": "C02_sky130", + "role": "best_evaluated", + "condition": "SS_85C_0.9VDD", + "status": "passed", + "measures": { + "iout_t": 1.996746e-05, + "err": -0.001627, + "vmin": 0.7065181, + "dev_at_vdd": 0.0007005113, + "gout_t": 7.293812e-08, + "rout_t": 13710700.0, + "vout_test": 1.24, + "rout_nom": 13710700.0, + "ok_at_vdd": 1.0 + }, + "spec": { + "err": { + "value": -0.001627, + "spec": { + "abs_max": 0.03 + }, + "ok": true + }, + "vmin": { + "value": 0.7065181, + "spec": { + "max": 0.7809 + }, + "ok": true + } + }, + "result": "runs/selection/C02_sky130_sW1_sL1/cbf80e3ede2f/result.json", + "geometry_hash": "5859a39e1ff75a19", + "area_um2": 111.1906 + }, + { + "key": "C02_sky130", + "role": "best_evaluated", + "condition": "FF_m40C_1.1VDD", + "status": "passed", + "measures": { + "iout_t": 1.995919e-05, + "err": -0.0020405, + "vmin": 0.6759478, + "dev_at_vdd": 0.0007753668, + "gout_t": 9.383378e-08, + "rout_t": 10657220.0, + "vout_test": 1.24, + "rout_nom": 10657220.0, + "ok_at_vdd": 1.0 + }, + "spec": { + "err": { + "value": -0.0020405, + "spec": { + "abs_max": 0.03 + }, + "ok": true + }, + "vmin": { + "value": 0.6759478, + "spec": { + "max": 0.7809 + }, + "ok": true + } + }, + "result": "runs/selection/C02_sky130_sW1_sL1/cbf80e3ede2f/result.json", + "geometry_hash": "5859a39e1ff75a19", + "area_um2": 111.1906 + }, + { + "key": "C02_gf180", + "role": "reference", + "condition": "TT_27C_VDD", + "status": "passed", + "measures": { + "iout_t": 1.999595e-05, + "err": -0.0002025, + "vmin": 0.6105232, + "dev_at_vdd": 0.0005756214, + "gout_t": 7.959508e-09, + "rout_t": 125637500.0, + "vout_test": 1.95, + "rout_nom": 125637500.0, + "ok_at_vdd": 1.0 + }, + "spec": { + "err": { + "value": -0.0002025, + "spec": { + "abs_max": 0.03 + }, + "ok": true + }, + "vmin": { + "value": 0.6105232, + "spec": { + "max": 0.7093 + }, + "ok": true + } + }, + "result": "runs/grid/C02/gf180/sW1_sL1/independent/result.json", + "geometry_hash": "1adc78654fdfccf7", + "area_um2": 297.2928 + }, + { + "key": "C02_gf180", + "role": "reference", + "condition": "SS_27C_VDD", + "status": "passed", + "measures": { + "iout_t": 1.999418e-05, + "err": -0.000291, + "vmin": 0.6774665, + "dev_at_vdd": 0.000251484, + "gout_t": 8.412537e-09, + "rout_t": 118873000.0, + "vout_test": 1.95, + "rout_nom": 118873000.0, + "ok_at_vdd": 1.0 + }, + "spec": { + "err": { + "value": -0.000291, + "spec": { + "abs_max": 0.03 + }, + "ok": true + }, + "vmin": { + "value": 0.6774665, + "spec": { + "max": 0.7093 + }, + "ok": true + } + }, + "result": "runs/grid/C02/gf180/sW1_sL1/independent/result.json", + "geometry_hash": "1adc78654fdfccf7", + "area_um2": 297.2928 + }, + { + "key": "C02_gf180", + "role": "reference", + "condition": "FF_27C_VDD", + "status": "passed", + "measures": { + "iout_t": 1.999806e-05, + "err": -9.7e-05, + "vmin": 0.5458138, + "dev_at_vdd": 0.001133937, + "gout_t": 7.992945e-09, + "rout_t": 125111200.0, + "vout_test": 1.95, + "rout_nom": 125111200.0, + "ok_at_vdd": 1.0 + }, + "spec": { + "err": { + "value": -9.7e-05, + "spec": { + "abs_max": 0.03 + }, + "ok": true + }, + "vmin": { + "value": 0.5458138, + "spec": { + "max": 0.7093 + }, + "ok": true + } + }, + "result": "runs/grid/C02/gf180/sW1_sL1/independent/result.json", + "geometry_hash": "1adc78654fdfccf7", + "area_um2": 297.2928 + }, + { + "key": "C02_gf180", + "role": "reference", + "condition": "SS_85C_0.9VDD", + "status": "passed", + "measures": { + "iout_t": 1.999454e-05, + "err": -0.000273, + "vmin": 0.6833079, + "dev_at_vdd": 6.210672e-05, + "gout_t": 9.292437e-09, + "rout_t": 107616700.0, + "vout_test": 1.95, + "rout_nom": 107616700.0, + "ok_at_vdd": 1.0 + }, + "spec": { + "err": { + "value": -0.000273, + "spec": { + "abs_max": 0.03 + }, + "ok": true + }, + "vmin": { + "value": 0.6833079, + "spec": { + "max": 0.7093 + }, + "ok": true + } + }, + "result": "runs/grid/C02/gf180/sW1_sL1/independent/result.json", + "geometry_hash": "1adc78654fdfccf7", + "area_um2": 297.2928 + }, + { + "key": "C02_gf180", + "role": "reference", + "condition": "FF_m40C_1.1VDD", + "status": "passed", + "measures": { + "iout_t": 1.999686e-05, + "err": -0.000157, + "vmin": 0.5452364, + "dev_at_vdd": 0.003720375, + "gout_t": 7.216513e-09, + "rout_t": 138571600.0, + "vout_test": 1.95, + "rout_nom": 138571600.0, + "ok_at_vdd": 1.0 + }, + "spec": { + "err": { + "value": -0.000157, + "spec": { + "abs_max": 0.03 + }, + "ok": true + }, + "vmin": { + "value": 0.5452364, + "spec": { + "max": 0.7093 + }, + "ok": true + } + }, + "result": "runs/grid/C02/gf180/sW1_sL1/independent/result.json", + "geometry_hash": "1adc78654fdfccf7", + "area_um2": 297.2928 + }, + { + "key": "C02_gf180", + "role": "combined", + "condition": "TT_27C_VDD", + "status": "passed", + "measures": { + "iout_t": 1.999547e-05, + "err": -0.0002265, + "vmin": 0.6108221, + "dev_at_vdd": 0.000552402, + "gout_t": 7.958878e-09, + "rout_t": 125647400.0, + "vout_test": 1.95, + "rout_nom": 125647400.0, + "ok_at_vdd": 1.0 + }, + "spec": { + "err": { + "value": -0.0002265, + "spec": { + "abs_max": 0.03 + }, + "ok": true + }, + "vmin": { + "value": 0.6108221, + "spec": { + "max": 0.7093 + }, + "ok": true + } + }, + "result": "runs/grid/C02/gf180/sW1_sL1/combined/result.json", + "geometry_hash": "eeacc8fa81b7a354", + "area_um2": 247.3328 + }, + { + "key": "C02_gf180", + "role": "combined", + "condition": "SS_27C_VDD", + "status": "passed", + "measures": { + "iout_t": 1.999376e-05, + "err": -0.000312, + "vmin": 0.6777495, + "dev_at_vdd": 0.0002307086, + "gout_t": 8.411536e-09, + "rout_t": 118887100.0, + "vout_test": 1.95, + "rout_nom": 118887100.0, + "ok_at_vdd": 1.0 + }, + "spec": { + "err": { + "value": -0.000312, + "spec": { + "abs_max": 0.03 + }, + "ok": true + }, + "vmin": { + "value": 0.6777495, + "spec": { + "max": 0.7093 + }, + "ok": true + } + }, + "result": "runs/grid/C02/gf180/sW1_sL1/combined/result.json", + "geometry_hash": "eeacc8fa81b7a354", + "area_um2": 247.3328 + }, + { + "key": "C02_gf180", + "role": "combined", + "condition": "FF_27C_VDD", + "status": "passed", + "measures": { + "iout_t": 1.999752e-05, + "err": -0.000124, + "vmin": 0.5461306, + "dev_at_vdd": 0.001107779, + "gout_t": 7.992848e-09, + "rout_t": 125112800.0, + "vout_test": 1.95, + "rout_nom": 125112800.0, + "ok_at_vdd": 1.0 + }, + "spec": { + "err": { + "value": -0.000124, + "spec": { + "abs_max": 0.03 + }, + "ok": true + }, + "vmin": { + "value": 0.5461306, + "spec": { + "max": 0.7093 + }, + "ok": true + } + }, + "result": "runs/grid/C02/gf180/sW1_sL1/combined/result.json", + "geometry_hash": "eeacc8fa81b7a354", + "area_um2": 247.3328 + }, + { + "key": "C02_gf180", + "role": "combined", + "condition": "SS_85C_0.9VDD", + "status": "passed", + "measures": { + "iout_t": 1.999412e-05, + "err": -0.000294, + "vmin": 0.6836204, + "dev_at_vdd": 4.091949e-05, + "gout_t": 9.292077e-09, + "rout_t": 107620800.0, + "vout_test": 1.95, + "rout_nom": 107620800.0, + "ok_at_vdd": 1.0 + }, + "spec": { + "err": { + "value": -0.000294, + "spec": { + "abs_max": 0.03 + }, + "ok": true + }, + "vmin": { + "value": 0.6836204, + "spec": { + "max": 0.7093 + }, + "ok": true + } + }, + "result": "runs/grid/C02/gf180/sW1_sL1/combined/result.json", + "geometry_hash": "eeacc8fa81b7a354", + "area_um2": 247.3328 + }, + { + "key": "C02_gf180", + "role": "combined", + "condition": "FF_m40C_1.1VDD", + "status": "passed", + "measures": { + "iout_t": 1.999632e-05, + "err": -0.000184, + "vmin": 0.5455121, + "dev_at_vdd": 0.003699197, + "gout_t": 7.215369e-09, + "rout_t": 138593600.0, + "vout_test": 1.95, + "rout_nom": 138593600.0, + "ok_at_vdd": 1.0 + }, + "spec": { + "err": { + "value": -0.000184, + "spec": { + "abs_max": 0.03 + }, + "ok": true + }, + "vmin": { + "value": 0.5455121, + "spec": { + "max": 0.7093 + }, + "ok": true + } + }, + "result": "runs/grid/C02/gf180/sW1_sL1/combined/result.json", + "geometry_hash": "eeacc8fa81b7a354", + "area_um2": 247.3328 + }, + { + "key": "C02_gf180", + "role": "best_evaluated", + "condition": "TT_27C_VDD", + "status": "passed", + "measures": { + "iout_t": 1.999547e-05, + "err": -0.0002265, + "vmin": 0.6108221, + "dev_at_vdd": 0.000552402, + "gout_t": 7.958878e-09, + "rout_t": 125647400.0, + "vout_test": 1.95, + "rout_nom": 125647400.0, + "ok_at_vdd": 1.0 + }, + "spec": { + "err": { + "value": -0.0002265, + "spec": { + "abs_max": 0.03 + }, + "ok": true + }, + "vmin": { + "value": 0.6108221, + "spec": { + "max": 0.7093 + }, + "ok": true + } + }, + "result": "runs/selection/C02_gf180_sW1_sL1/c054e1700ec1/result.json", + "geometry_hash": "eeacc8fa81b7a354", + "area_um2": 247.3328 + }, + { + "key": "C02_gf180", + "role": "best_evaluated", + "condition": "SS_27C_VDD", + "status": "passed", + "measures": { + "iout_t": 1.999376e-05, + "err": -0.000312, + "vmin": 0.6777495, + "dev_at_vdd": 0.0002307086, + "gout_t": 8.411536e-09, + "rout_t": 118887100.0, + "vout_test": 1.95, + "rout_nom": 118887100.0, + "ok_at_vdd": 1.0 + }, + "spec": { + "err": { + "value": -0.000312, + "spec": { + "abs_max": 0.03 + }, + "ok": true + }, + "vmin": { + "value": 0.6777495, + "spec": { + "max": 0.7093 + }, + "ok": true + } + }, + "result": "runs/selection/C02_gf180_sW1_sL1/c054e1700ec1/result.json", + "geometry_hash": "eeacc8fa81b7a354", + "area_um2": 247.3328 + }, + { + "key": "C02_gf180", + "role": "best_evaluated", + "condition": "FF_27C_VDD", + "status": "passed", + "measures": { + "iout_t": 1.999752e-05, + "err": -0.000124, + "vmin": 0.5461306, + "dev_at_vdd": 0.001107779, + "gout_t": 7.992848e-09, + "rout_t": 125112800.0, + "vout_test": 1.95, + "rout_nom": 125112800.0, + "ok_at_vdd": 1.0 + }, + "spec": { + "err": { + "value": -0.000124, + "spec": { + "abs_max": 0.03 + }, + "ok": true + }, + "vmin": { + "value": 0.5461306, + "spec": { + "max": 0.7093 + }, + "ok": true + } + }, + "result": "runs/selection/C02_gf180_sW1_sL1/c054e1700ec1/result.json", + "geometry_hash": "eeacc8fa81b7a354", + "area_um2": 247.3328 + }, + { + "key": "C02_gf180", + "role": "best_evaluated", + "condition": "SS_85C_0.9VDD", + "status": "passed", + "measures": { + "iout_t": 1.999412e-05, + "err": -0.000294, + "vmin": 0.6836204, + "dev_at_vdd": 4.091949e-05, + "gout_t": 9.292077e-09, + "rout_t": 107620800.0, + "vout_test": 1.95, + "rout_nom": 107620800.0, + "ok_at_vdd": 1.0 + }, + "spec": { + "err": { + "value": -0.000294, + "spec": { + "abs_max": 0.03 + }, + "ok": true + }, + "vmin": { + "value": 0.6836204, + "spec": { + "max": 0.7093 + }, + "ok": true + } + }, + "result": "runs/selection/C02_gf180_sW1_sL1/c054e1700ec1/result.json", + "geometry_hash": "eeacc8fa81b7a354", + "area_um2": 247.3328 + }, + { + "key": "C02_gf180", + "role": "best_evaluated", + "condition": "FF_m40C_1.1VDD", + "status": "passed", + "measures": { + "iout_t": 1.999632e-05, + "err": -0.000184, + "vmin": 0.5455121, + "dev_at_vdd": 0.003699197, + "gout_t": 7.215369e-09, + "rout_t": 138593600.0, + "vout_test": 1.95, + "rout_nom": 138593600.0, + "ok_at_vdd": 1.0 + }, + "spec": { + "err": { + "value": -0.000184, + "spec": { + "abs_max": 0.03 + }, + "ok": true + }, + "vmin": { + "value": 0.5455121, + "spec": { + "max": 0.7093 + }, + "ok": true + } + }, + "result": "runs/selection/C02_gf180_sW1_sL1/c054e1700ec1/result.json", + "geometry_hash": "eeacc8fa81b7a354", + "area_um2": 247.3328 + }, + { + "key": "C02_ihp130", + "role": "reference", + "condition": "TT_27C_VDD", + "status": "passed", + "measures": { + "iout_t": 1.995475e-05, + "err": -0.0022625, + "vmin": 0.4687881, + "dev_at_vdd": 0.002619574, + "gout_t": 3.291953e-07, + "rout_t": 3037724.0, + "vout_test": 0.83, + "rout_nom": 3037724.0, + "ok_at_vdd": 1.0 + }, + "spec": { + "err": { + "value": -0.0022625, + "spec": { + "abs_max": 0.03 + }, + "ok": true + }, + "vmin": { + "value": 0.4687881, + "spec": { + "max": 0.5684 + }, + "ok": true + } + }, + "result": "runs/grid/C02/ihp130/sW1_sL1/independent/result.json", + "geometry_hash": "30e61546ff19413d", + "area_um2": 166.2161 + }, + { + "key": "C02_ihp130", + "role": "reference", + "condition": "SS_27C_VDD", + "status": "passed", + "measures": { + "iout_t": 1.992027e-05, + "err": -0.0039865, + "vmin": 0.523858, + "dev_at_vdd": 0.0009696444, + "gout_t": 3.455924e-07, + "rout_t": 2893607.0, + "vout_test": 0.83, + "rout_nom": 2893607.0, + "ok_at_vdd": 1.0 + }, + "spec": { + "err": { + "value": -0.0039865, + "spec": { + "abs_max": 0.03 + }, + "ok": true + }, + "vmin": { + "value": 0.523858, + "spec": { + "max": 0.5684 + }, + "ok": true + } + }, + "result": "runs/grid/C02/ihp130/sW1_sL1/independent/result.json", + "geometry_hash": "30e61546ff19413d", + "area_um2": 166.2161 + }, + { + "key": "C02_ihp130", + "role": "reference", + "condition": "FF_27C_VDD", + "status": "passed", + "measures": { + "iout_t": 1.999162e-05, + "err": -0.000419, + "vmin": 0.4154765, + "dev_at_vdd": 0.004409804, + "gout_t": 3.203162e-07, + "rout_t": 3121925.0, + "vout_test": 0.83, + "rout_nom": 3121925.0, + "ok_at_vdd": 1.0 + }, + "spec": { + "err": { + "value": -0.000419, + "spec": { + "abs_max": 0.03 + }, + "ok": true + }, + "vmin": { + "value": 0.4154765, + "spec": { + "max": 0.5684 + }, + "ok": true + } + }, + "result": "runs/grid/C02/ihp130/sW1_sL1/independent/result.json", + "geometry_hash": "30e61546ff19413d", + "area_um2": 166.2161 + }, + { + "key": "C02_ihp130", + "role": "reference", + "condition": "SS_85C_0.9VDD", + "status": "passed", + "measures": { + "iout_t": 1.992626e-05, + "err": -0.003687, + "vmin": 0.5199506, + "dev_at_vdd": 3.613163e-05, + "gout_t": 3.633095e-07, + "rout_t": 2752506.0, + "vout_test": 0.83, + "rout_nom": 2752506.0, + "ok_at_vdd": 1.0 + }, + "spec": { + "err": { + "value": -0.003687, + "spec": { + "abs_max": 0.03 + }, + "ok": true + }, + "vmin": { + "value": 0.5199506, + "spec": { + "max": 0.5684 + }, + "ok": true + } + }, + "result": "runs/grid/C02/ihp130/sW1_sL1/independent/result.json", + "geometry_hash": "30e61546ff19413d", + "area_um2": 166.2161 + }, + { + "key": "C02_ihp130", + "role": "reference", + "condition": "FF_m40C_1.1VDD", + "status": "passed", + "measures": { + "iout_t": 1.997983e-05, + "err": -0.0010085, + "vmin": 0.423272, + "dev_at_vdd": 0.004949032, + "gout_t": 3.13494e-07, + "rout_t": 3189867.0, + "vout_test": 0.83, + "rout_nom": 3189867.0, + "ok_at_vdd": 1.0 + }, + "spec": { + "err": { + "value": -0.0010085, + "spec": { + "abs_max": 0.03 + }, + "ok": true + }, + "vmin": { + "value": 0.423272, + "spec": { + "max": 0.5684 + }, + "ok": true + } + }, + "result": "runs/grid/C02/ihp130/sW1_sL1/independent/result.json", + "geometry_hash": "30e61546ff19413d", + "area_um2": 166.2161 + }, + { + "key": "C02_ihp130", + "role": "combined", + "condition": "TT_27C_VDD", + "status": "passed", + "measures": { + "iout_t": 1.99449e-05, + "err": -0.002755, + "vmin": 0.4703917, + "dev_at_vdd": 0.002122912, + "gout_t": 3.288766e-07, + "rout_t": 3040668.0, + "vout_test": 0.83, + "rout_nom": 3040668.0, + "ok_at_vdd": 1.0 + }, + "spec": { + "err": { + "value": -0.002755, + "spec": { + "abs_max": 0.03 + }, + "ok": true + }, + "vmin": { + "value": 0.4703917, + "spec": { + "max": 0.5684 + }, + "ok": true + } + }, + "result": "runs/grid/C02/ihp130/sW1_sL1/combined/result.json", + "geometry_hash": "80022663ae6427dd", + "area_um2": 138.9004 + }, + { + "key": "C02_ihp130", + "role": "combined", + "condition": "SS_27C_VDD", + "status": "passed", + "measures": { + "iout_t": 1.991114e-05, + "err": -0.004443, + "vmin": 0.5254228, + "dev_at_vdd": 0.0005087262, + "gout_t": 3.451902e-07, + "rout_t": 2896979.0, + "vout_test": 0.83, + "rout_nom": 2896979.0, + "ok_at_vdd": 1.0 + }, + "spec": { + "err": { + "value": -0.004443, + "spec": { + "abs_max": 0.03 + }, + "ok": true + }, + "vmin": { + "value": 0.5254228, + "spec": { + "max": 0.5684 + }, + "ok": true + } + }, + "result": "runs/grid/C02/ihp130/sW1_sL1/combined/result.json", + "geometry_hash": "80022663ae6427dd", + "area_um2": 138.9004 + }, + { + "key": "C02_ihp130", + "role": "combined", + "condition": "FF_27C_VDD", + "status": "passed", + "measures": { + "iout_t": 1.998098e-05, + "err": -0.000951, + "vmin": 0.4171059, + "dev_at_vdd": 0.003874357, + "gout_t": 3.2004e-07, + "rout_t": 3124620.0, + "vout_test": 0.83, + "rout_nom": 3124620.0, + "ok_at_vdd": 1.0 + }, + "spec": { + "err": { + "value": -0.000951, + "spec": { + "abs_max": 0.03 + }, + "ok": true + }, + "vmin": { + "value": 0.4171059, + "spec": { + "max": 0.5684 + }, + "ok": true + } + }, + "result": "runs/grid/C02/ihp130/sW1_sL1/combined/result.json", + "geometry_hash": "80022663ae6427dd", + "area_um2": 138.9004 + }, + { + "key": "C02_ihp130", + "role": "combined", + "condition": "SS_85C_0.9VDD", + "status": "passed", + "measures": { + "iout_t": 1.991751e-05, + "err": -0.0041245, + "vmin": 0.5215826, + "dev_at_vdd": 0.0004765861, + "gout_t": 3.629146e-07, + "rout_t": 2755501.0, + "vout_test": 0.83, + "rout_nom": 2755501.0, + "ok_at_vdd": 1.0 + }, + "spec": { + "err": { + "value": -0.0041245, + "spec": { + "abs_max": 0.03 + }, + "ok": true + }, + "vmin": { + "value": 0.5215826, + "spec": { + "max": 0.5684 + }, + "ok": true + } + }, + "result": "runs/grid/C02/ihp130/sW1_sL1/combined/result.json", + "geometry_hash": "80022663ae6427dd", + "area_um2": 138.9004 + }, + { + "key": "C02_ihp130", + "role": "combined", + "condition": "FF_m40C_1.1VDD", + "status": "passed", + "measures": { + "iout_t": 1.996871e-05, + "err": -0.0015645, + "vmin": 0.424833, + "dev_at_vdd": 0.004386884, + "gout_t": 3.131325e-07, + "rout_t": 3193550.0, + "vout_test": 0.83, + "rout_nom": 3193550.0, + "ok_at_vdd": 1.0 + }, + "spec": { + "err": { + "value": -0.0015645, + "spec": { + "abs_max": 0.03 + }, + "ok": true + }, + "vmin": { + "value": 0.424833, + "spec": { + "max": 0.5684 + }, + "ok": true + } + }, + "result": "runs/grid/C02/ihp130/sW1_sL1/combined/result.json", + "geometry_hash": "80022663ae6427dd", + "area_um2": 138.9004 + }, + { + "key": "C02_ihp130", + "role": "best_evaluated", + "condition": "TT_27C_VDD", + "status": "passed", + "measures": { + "iout_t": 1.99449e-05, + "err": -0.002755, + "vmin": 0.4703917, + "dev_at_vdd": 0.002122912, + "gout_t": 3.288766e-07, + "rout_t": 3040668.0, + "vout_test": 0.83, + "rout_nom": 3040668.0, + "ok_at_vdd": 1.0 + }, + "spec": { + "err": { + "value": -0.002755, + "spec": { + "abs_max": 0.03 + }, + "ok": true + }, + "vmin": { + "value": 0.4703917, + "spec": { + "max": 0.5684 + }, + "ok": true + } + }, + "result": "runs/selection/C02_ihp130_sW1_sL1/c054e1700ec1/result.json", + "geometry_hash": "80022663ae6427dd", + "area_um2": 138.9004 + }, + { + "key": "C02_ihp130", + "role": "best_evaluated", + "condition": "SS_27C_VDD", + "status": "passed", + "measures": { + "iout_t": 1.991114e-05, + "err": -0.004443, + "vmin": 0.5254228, + "dev_at_vdd": 0.0005087262, + "gout_t": 3.451902e-07, + "rout_t": 2896979.0, + "vout_test": 0.83, + "rout_nom": 2896979.0, + "ok_at_vdd": 1.0 + }, + "spec": { + "err": { + "value": -0.004443, + "spec": { + "abs_max": 0.03 + }, + "ok": true + }, + "vmin": { + "value": 0.5254228, + "spec": { + "max": 0.5684 + }, + "ok": true + } + }, + "result": "runs/selection/C02_ihp130_sW1_sL1/c054e1700ec1/result.json", + "geometry_hash": "80022663ae6427dd", + "area_um2": 138.9004 + }, + { + "key": "C02_ihp130", + "role": "best_evaluated", + "condition": "FF_27C_VDD", + "status": "passed", + "measures": { + "iout_t": 1.998098e-05, + "err": -0.000951, + "vmin": 0.4171059, + "dev_at_vdd": 0.003874357, + "gout_t": 3.2004e-07, + "rout_t": 3124620.0, + "vout_test": 0.83, + "rout_nom": 3124620.0, + "ok_at_vdd": 1.0 + }, + "spec": { + "err": { + "value": -0.000951, + "spec": { + "abs_max": 0.03 + }, + "ok": true + }, + "vmin": { + "value": 0.4171059, + "spec": { + "max": 0.5684 + }, + "ok": true + } + }, + "result": "runs/selection/C02_ihp130_sW1_sL1/c054e1700ec1/result.json", + "geometry_hash": "80022663ae6427dd", + "area_um2": 138.9004 + }, + { + "key": "C02_ihp130", + "role": "best_evaluated", + "condition": "SS_85C_0.9VDD", + "status": "passed", + "measures": { + "iout_t": 1.991751e-05, + "err": -0.0041245, + "vmin": 0.5215826, + "dev_at_vdd": 0.0004765861, + "gout_t": 3.629146e-07, + "rout_t": 2755501.0, + "vout_test": 0.83, + "rout_nom": 2755501.0, + "ok_at_vdd": 1.0 + }, + "spec": { + "err": { + "value": -0.0041245, + "spec": { + "abs_max": 0.03 + }, + "ok": true + }, + "vmin": { + "value": 0.5215826, + "spec": { + "max": 0.5684 + }, + "ok": true + } + }, + "result": "runs/selection/C02_ihp130_sW1_sL1/c054e1700ec1/result.json", + "geometry_hash": "80022663ae6427dd", + "area_um2": 138.9004 + }, + { + "key": "C02_ihp130", + "role": "best_evaluated", + "condition": "FF_m40C_1.1VDD", + "status": "passed", + "measures": { + "iout_t": 1.996871e-05, + "err": -0.0015645, + "vmin": 0.424833, + "dev_at_vdd": 0.004386884, + "gout_t": 3.131325e-07, + "rout_t": 3193550.0, + "vout_test": 0.83, + "rout_nom": 3193550.0, + "ok_at_vdd": 1.0 + }, + "spec": { + "err": { + "value": -0.0015645, + "spec": { + "abs_max": 0.03 + }, + "ok": true + }, + "vmin": { + "value": 0.424833, + "spec": { + "max": 0.5684 + }, + "ok": true + } + }, + "result": "runs/selection/C02_ihp130_sW1_sL1/c054e1700ec1/result.json", + "geometry_hash": "80022663ae6427dd", + "area_um2": 138.9004 + }, + { + "key": "C08_sky130", + "role": "reference", + "condition": "TT_27C_VDD", + "status": "passed", + "measures": { + "vout0": 0.8999996, + "idd": 2.786139e-05, + "vos": -0.0043688, + "gain_lf": 31.89302, + "ph_lf": 0.02910097, + "ugf": 32196720.0, + "ph_ugf": -89.6843, + "f3db": 816629.3, + "pm": 90.28659903 + }, + "spec": { + "gain_lf": { + "value": 31.89302, + "spec": { + "min": 28.85 + }, + "ok": true + }, + "ugf": { + "value": 32196720.0, + "spec": { + "min": 20130000.0 + }, + "ok": true + } + }, + "result": "runs/grid/C08/sky130/sW1_sL1/independent/result.json", + "geometry_hash": "0e251a0982397f27", + "area_um2": 256.0048 + }, + { + "key": "C08_sky130", + "role": "reference", + "condition": "SS_27C_VDD", + "status": "passed", + "measures": { + "vout0": 0.8999996, + "idd": 1.718425e-05, + "vos": -0.004096, + "gain_lf": 32.65107, + "ph_lf": 0.02739469, + "ugf": 20356870.0, + "ph_ugf": -89.76586, + "f3db": 473089.5, + "pm": 90.20674531 + }, + "spec": { + "gain_lf": { + "value": 32.65107, + "spec": { + "min": 28.85 + }, + "ok": true + }, + "ugf": { + "value": 20356870.0, + "spec": { + "min": 20130000.0 + }, + "ok": true + } + }, + "result": "runs/grid/C08/sky130/sW1_sL1/independent/result.json", + "geometry_hash": "0e251a0982397f27", + "area_um2": 256.0048 + }, + { + "key": "C08_sky130", + "role": "reference", + "condition": "FF_27C_VDD", + "status": "passed", + "measures": { + "vout0": 0.8999995, + "idd": 4.198066e-05, + "vos": -0.00478081, + "gain_lf": 30.64582, + "ph_lf": 0.02705561, + "ugf": 46527640.0, + "ph_ugf": -89.51827, + "f3db": 1361589.0, + "pm": 90.45467439 + }, + "spec": { + "gain_lf": { + "value": 30.64582, + "spec": { + "min": 28.85 + }, + "ok": true + }, + "ugf": { + "value": 46527640.0, + "spec": { + "min": 20130000.0 + }, + "ok": true + } + }, + "result": "runs/grid/C08/sky130/sW1_sL1/independent/result.json", + "geometry_hash": "0e251a0982397f27", + "area_um2": 256.0048 + }, + { + "key": "C08_sky130", + "role": "reference", + "condition": "SS_85C_0.9VDD", + "status": "spec_failed", + "measures": { + "vout0": 0.8099995, + "idd": 1.913136e-05, + "vos": -0.00511967, + "gain_lf": 31.73063, + "ph_lf": 0.02450214, + "ugf": 19915240.0, + "ph_ugf": -89.59904, + "f3db": 515035.8, + "pm": 90.37645786 + }, + "spec": { + "gain_lf": { + "value": 31.73063, + "spec": { + "min": 28.85 + }, + "ok": true + }, + "ugf": { + "value": 19915240.0, + "spec": { + "min": 20130000.0 + }, + "ok": false + } + }, + "result": "runs/grid/C08/sky130/sW1_sL1/independent/result.json", + "geometry_hash": "0e251a0982397f27", + "area_um2": 256.0048 + }, + { + "key": "C08_sky130", + "role": "reference", + "condition": "FF_m40C_1.1VDD", + "status": "passed", + "measures": { + "vout0": 0.9899996, + "idd": 3.945648e-05, + "vos": -0.0041832, + "gain_lf": 31.46881, + "ph_lf": 0.03010552, + "ugf": 50954420.0, + "ph_ugf": -89.72471, + "f3db": 1357217.0, + "pm": 90.24518447999999 + }, + "spec": { + "gain_lf": { + "value": 31.46881, + "spec": { + "min": 28.85 + }, + "ok": true + }, + "ugf": { + "value": 50954420.0, + "spec": { + "min": 20130000.0 + }, + "ok": true + } + }, + "result": "runs/grid/C08/sky130/sW1_sL1/independent/result.json", + "geometry_hash": "0e251a0982397f27", + "area_um2": 256.0048 + }, + { + "key": "C08_sky130", + "role": "combined", + "condition": "TT_27C_VDD", + "status": "passed", + "measures": { + "vout0": 0.8999996, + "idd": 2.786161e-05, + "vos": -0.00434727, + "gain_lf": 31.8742, + "ph_lf": 0.02904004, + "ugf": 32206830.0, + "ph_ugf": -89.6743, + "f3db": 818639.9, + "pm": 90.29665996 + }, + "spec": { + "gain_lf": { + "value": 31.8742, + "spec": { + "min": 28.85 + }, + "ok": true + }, + "ugf": { + "value": 32206830.0, + "spec": { + "min": 20130000.0 + }, + "ok": true + } + }, + "result": "runs/grid/C08/sky130/sW1_sL1/combined/result.json", + "geometry_hash": "b86fe99b14db63b1", + "area_um2": 245.9581 + }, + { + "key": "C08_sky130", + "role": "combined", + "condition": "SS_27C_VDD", + "status": "passed", + "measures": { + "vout0": 0.8999996, + "idd": 1.718447e-05, + "vos": -0.0040801, + "gain_lf": 32.63763, + "ph_lf": 0.02735503, + "ugf": 20362550.0, + "ph_ugf": -89.75282, + "f3db": 473943.9, + "pm": 90.21982497 + }, + "spec": { + "gain_lf": { + "value": 32.63763, + "spec": { + "min": 28.85 + }, + "ok": true + }, + "ugf": { + "value": 20362550.0, + "spec": { + "min": 20130000.0 + }, + "ok": true + } + }, + "result": "runs/grid/C08/sky130/sW1_sL1/combined/result.json", + "geometry_hash": "b86fe99b14db63b1", + "area_um2": 245.9581 + }, + { + "key": "C08_sky130", + "role": "combined", + "condition": "FF_27C_VDD", + "status": "passed", + "measures": { + "vout0": 0.8999995, + "idd": 4.198076e-05, + "vos": -0.0047565, + "gain_lf": 30.62053, + "ph_lf": 0.02697855, + "ugf": 46540780.0, + "ph_ugf": -89.51111, + "f3db": 1365925.0, + "pm": 90.46191145 + }, + "spec": { + "gain_lf": { + "value": 30.62053, + "spec": { + "min": 28.85 + }, + "ok": true + }, + "ugf": { + "value": 46540780.0, + "spec": { + "min": 20130000.0 + }, + "ok": true + } + }, + "result": "runs/grid/C08/sky130/sW1_sL1/combined/result.json", + "geometry_hash": "b86fe99b14db63b1", + "area_um2": 245.9581 + }, + { + "key": "C08_sky130", + "role": "combined", + "condition": "SS_85C_0.9VDD", + "status": "spec_failed", + "measures": { + "vout0": 0.8099995, + "idd": 1.913152e-05, + "vos": -0.00510446, + "gain_lf": 31.716, + "ph_lf": 0.0244633, + "ugf": 19919290.0, + "ph_ugf": -89.58556, + "f3db": 516010.2, + "pm": 90.3899767 + }, + "spec": { + "gain_lf": { + "value": 31.716, + "spec": { + "min": 28.85 + }, + "ok": true + }, + "ugf": { + "value": 19919290.0, + "spec": { + "min": 20130000.0 + }, + "ok": false + } + }, + "result": "runs/grid/C08/sky130/sW1_sL1/combined/result.json", + "geometry_hash": "b86fe99b14db63b1", + "area_um2": 245.9581 + }, + { + "key": "C08_sky130", + "role": "combined", + "condition": "FF_m40C_1.1VDD", + "status": "passed", + "measures": { + "vout0": 0.9899996, + "idd": 3.945668e-05, + "vos": -0.00415804, + "gain_lf": 31.44433, + "ph_lf": 0.03002243, + "ugf": 50973730.0, + "ph_ugf": -89.71949, + "f3db": 1361529.0, + "pm": 90.25048757 + }, + "spec": { + "gain_lf": { + "value": 31.44433, + "spec": { + "min": 28.85 + }, + "ok": true + }, + "ugf": { + "value": 50973730.0, + "spec": { + "min": 20130000.0 + }, + "ok": true + } + }, + "result": "runs/grid/C08/sky130/sW1_sL1/combined/result.json", + "geometry_hash": "b86fe99b14db63b1", + "area_um2": 245.9581 + }, + { + "key": "C08_sky130", + "role": "best_evaluated", + "condition": "TT_27C_VDD", + "status": "passed", + "measures": { + "vout0": 0.8999996, + "idd": 2.776115e-05, + "vos": -0.00449433, + "gain_lf": 31.87377, + "ph_lf": 0.02900857, + "ugf": 32048170.0, + "ph_ugf": -89.71215, + "f3db": 814840.9, + "pm": 90.25884143 + }, + "spec": { + "gain_lf": { + "value": 31.87377, + "spec": { + "min": 28.85 + }, + "ok": true + }, + "ugf": { + "value": 32048170.0, + "spec": { + "min": 20130000.0 + }, + "ok": true + } + }, + "result": "runs/selection/C08_sky130_sW1_sL1/c12cfed03e95/result.json", + "geometry_hash": "3654e2c5e9cf1e43", + "area_um2": 196.0921 + }, + { + "key": "C08_sky130", + "role": "best_evaluated", + "condition": "SS_27C_VDD", + "status": "passed", + "measures": { + "vout0": 0.8999996, + "idd": 1.715088e-05, + "vos": -0.00417878, + "gain_lf": 32.63554, + "ph_lf": 0.02730358, + "ugf": 20272570.0, + "ph_ugf": -89.79587, + "f3db": 472062.8, + "pm": 90.17682642000001 + }, + "spec": { + "gain_lf": { + "value": 32.63554, + "spec": { + "min": 28.85 + }, + "ok": true + }, + "ugf": { + "value": 20272570.0, + "spec": { + "min": 20130000.0 + }, + "ok": true + } + }, + "result": "runs/selection/C08_sky130_sW1_sL1/c12cfed03e95/result.json", + "geometry_hash": "3654e2c5e9cf1e43", + "area_um2": 196.0921 + }, + { + "key": "C08_sky130", + "role": "best_evaluated", + "condition": "FF_27C_VDD", + "status": "passed", + "measures": { + "vout0": 0.8999995, + "idd": 4.175055e-05, + "vos": -0.00495321, + "gain_lf": 30.62535, + "ph_lf": 0.02697285, + "ugf": 46304190.0, + "ph_ugf": -89.54594, + "f3db": 1358405.0, + "pm": 90.42708714999999 + }, + "spec": { + "gain_lf": { + "value": 30.62535, + "spec": { + "min": 28.85 + }, + "ok": true + }, + "ugf": { + "value": 46304190.0, + "spec": { + "min": 20130000.0 + }, + "ok": true + } + }, + "result": "runs/selection/C08_sky130_sW1_sL1/c12cfed03e95/result.json", + "geometry_hash": "3654e2c5e9cf1e43", + "area_um2": 196.0921 + }, + { + "key": "C08_sky130", + "role": "best_evaluated", + "condition": "SS_85C_0.9VDD", + "status": "spec_failed", + "measures": { + "vout0": 0.8099995, + "idd": 1.909586e-05, + "vos": -0.00520714, + "gain_lf": 31.71806, + "ph_lf": 0.02442798, + "ugf": 19842890.0, + "ph_ugf": -89.62927, + "f3db": 513818.4, + "pm": 90.34630202 + }, + "spec": { + "gain_lf": { + "value": 31.71806, + "spec": { + "min": 28.85 + }, + "ok": true + }, + "ugf": { + "value": 19842890.0, + "spec": { + "min": 20130000.0 + }, + "ok": false + } + }, + "result": "runs/selection/C08_sky130_sW1_sL1/c12cfed03e95/result.json", + "geometry_hash": "3654e2c5e9cf1e43", + "area_um2": 196.0921 + }, + { + "key": "C08_sky130", + "role": "best_evaluated", + "condition": "FF_m40C_1.1VDD", + "status": "passed", + "measures": { + "vout0": 0.9899996, + "idd": 3.921821e-05, + "vos": -0.00435706, + "gain_lf": 31.44226, + "ph_lf": 0.02999488, + "ugf": 50679710.0, + "ph_ugf": -89.75179, + "f3db": 1354379.0, + "pm": 90.21821512 + }, + "spec": { + "gain_lf": { + "value": 31.44226, + "spec": { + "min": 28.85 + }, + "ok": true + }, + "ugf": { + "value": 50679710.0, + "spec": { + "min": 20130000.0 + }, + "ok": true + } + }, + "result": "runs/selection/C08_sky130_sW1_sL1/c12cfed03e95/result.json", + "geometry_hash": "3654e2c5e9cf1e43", + "area_um2": 196.0921 + }, + { + "key": "C08_gf180", + "role": "reference", + "condition": "TT_27C_VDD", + "status": "passed", + "measures": { + "vout0": 1.65, + "idd": 4.145869e-05, + "vos": 0.002791751, + "gain_lf": 39.87664, + "ph_lf": 0.06929093, + "ugf": 27449640.0, + "ph_ugf": -91.24393, + "f3db": 277710.2, + "pm": 88.68677907 + }, + "spec": { + "gain_lf": { + "value": 39.87664, + "spec": { + "min": 36.87 + }, + "ok": true + }, + "ugf": { + "value": 27449640.0, + "spec": { + "min": 16570000.0 + }, + "ok": true + } + }, + "result": "runs/grid/C08/gf180/sW1_sL1/independent/result.json", + "geometry_hash": "0826b3df49ee5e45", + "area_um2": 594.7008 + }, + { + "key": "C08_gf180", + "role": "reference", + "condition": "SS_27C_VDD", + "status": "passed", + "measures": { + "vout0": 1.65, + "idd": 3.971974e-05, + "vos": 0.001356738, + "gain_lf": 39.84925, + "ph_lf": 0.06736935, + "ugf": 25266090.0, + "ph_ugf": -91.24457, + "f3db": 256660.4, + "pm": 88.68806065 + }, + "spec": { + "gain_lf": { + "value": 39.84925, + "spec": { + "min": 36.87 + }, + "ok": true + }, + "ugf": { + "value": 25266090.0, + "spec": { + "min": 16570000.0 + }, + "ok": true + } + }, + "result": "runs/grid/C08/gf180/sW1_sL1/independent/result.json", + "geometry_hash": "0826b3df49ee5e45", + "area_um2": 594.7008 + }, + { + "key": "C08_gf180", + "role": "reference", + "condition": "FF_27C_VDD", + "status": "passed", + "measures": { + "vout0": 1.65, + "idd": 4.307231e-05, + "vos": 0.004264412, + "gain_lf": 39.81182, + "ph_lf": 0.07026885, + "ugf": 29686850.0, + "ph_ugf": -91.24962, + "f3db": 302461.8, + "pm": 88.68011115 + }, + "spec": { + "gain_lf": { + "value": 39.81182, + "spec": { + "min": 36.87 + }, + "ok": true + }, + "ugf": { + "value": 29686850.0, + "spec": { + "min": 16570000.0 + }, + "ok": true + } + }, + "result": "runs/grid/C08/gf180/sW1_sL1/independent/result.json", + "geometry_hash": "0826b3df49ee5e45", + "area_um2": 594.7008 + }, + { + "key": "C08_gf180", + "role": "reference", + "condition": "SS_85C_0.9VDD", + "status": "passed", + "measures": { + "vout0": 1.485, + "idd": 4.062502e-05, + "vos": -0.000469682, + "gain_lf": 38.10803, + "ph_lf": 0.05286963, + "ugf": 22410900.0, + "ph_ugf": -91.08581, + "f3db": 278244.4, + "pm": 88.86132037 + }, + "spec": { + "gain_lf": { + "value": 38.10803, + "spec": { + "min": 36.87 + }, + "ok": true + }, + "ugf": { + "value": 22410900.0, + "spec": { + "min": 16570000.0 + }, + "ok": true + } + }, + "result": "runs/grid/C08/gf180/sW1_sL1/independent/result.json", + "geometry_hash": "0826b3df49ee5e45", + "area_um2": 594.7008 + }, + { + "key": "C08_gf180", + "role": "reference", + "condition": "FF_m40C_1.1VDD", + "status": "passed", + "measures": { + "vout0": 1.815, + "idd": 4.153611e-05, + "vos": 0.004979225, + "gain_lf": 41.65247, + "ph_lf": 0.09037887, + "ugf": 34874100.0, + "ph_ugf": -91.42051, + "f3db": 287711.5, + "pm": 88.48911113000001 + }, + "spec": { + "gain_lf": { + "value": 41.65247, + "spec": { + "min": 36.87 + }, + "ok": true + }, + "ugf": { + "value": 34874100.0, + "spec": { + "min": 16570000.0 + }, + "ok": true + } + }, + "result": "runs/grid/C08/gf180/sW1_sL1/independent/result.json", + "geometry_hash": "0826b3df49ee5e45", + "area_um2": 594.7008 + }, + { + "key": "C08_gf180", + "role": "combined", + "condition": "TT_27C_VDD", + "status": "passed", + "measures": { + "vout0": 1.65, + "idd": 4.145869e-05, + "vos": 0.002791078, + "gain_lf": 39.87641, + "ph_lf": 0.0692928, + "ugf": 27455520.0, + "ph_ugf": -91.20699, + "f3db": 277765.3, + "pm": 88.7237172 + }, + "spec": { + "gain_lf": { + "value": 39.87641, + "spec": { + "min": 36.87 + }, + "ok": true + }, + "ugf": { + "value": 27455520.0, + "spec": { + "min": 16570000.0 + }, + "ok": true + } + }, + "result": "runs/grid/C08/gf180/sW1_sL1/combined/result.json", + "geometry_hash": "cf4e7fd6863e8f67", + "area_um2": 568.5888 + }, + { + "key": "C08_gf180", + "role": "combined", + "condition": "SS_27C_VDD", + "status": "passed", + "measures": { + "vout0": 1.65, + "idd": 3.971974e-05, + "vos": 0.001356042, + "gain_lf": 39.84903, + "ph_lf": 0.06737157, + "ugf": 25271970.0, + "ph_ugf": -91.20737, + "f3db": 256710.6, + "pm": 88.72525843 + }, + "spec": { + "gain_lf": { + "value": 39.84903, + "spec": { + "min": 36.87 + }, + "ok": true + }, + "ugf": { + "value": 25271970.0, + "spec": { + "min": 16570000.0 + }, + "ok": true + } + }, + "result": "runs/grid/C08/gf180/sW1_sL1/combined/result.json", + "geometry_hash": "cf4e7fd6863e8f67", + "area_um2": 568.5888 + }, + { + "key": "C08_gf180", + "role": "combined", + "condition": "FF_27C_VDD", + "status": "passed", + "measures": { + "vout0": 1.65, + "idd": 4.307231e-05, + "vos": 0.004263768, + "gain_lf": 39.81159, + "ph_lf": 0.0702704, + "ugf": 29693460.0, + "ph_ugf": -91.21283, + "f3db": 302521.6, + "pm": 88.7168996 + }, + "spec": { + "gain_lf": { + "value": 39.81159, + "spec": { + "min": 36.87 + }, + "ok": true + }, + "ugf": { + "value": 29693460.0, + "spec": { + "min": 16570000.0 + }, + "ok": true + } + }, + "result": "runs/grid/C08/gf180/sW1_sL1/combined/result.json", + "geometry_hash": "cf4e7fd6863e8f67", + "area_um2": 568.5888 + }, + { + "key": "C08_gf180", + "role": "combined", + "condition": "SS_85C_0.9VDD", + "status": "passed", + "measures": { + "vout0": 1.485, + "idd": 4.062501e-05, + "vos": -0.000470536, + "gain_lf": 38.10781, + "ph_lf": 0.05287197, + "ugf": 22416040.0, + "ph_ugf": -91.04992, + "f3db": 278298.8, + "pm": 88.89720803 + }, + "spec": { + "gain_lf": { + "value": 38.10781, + "spec": { + "min": 36.87 + }, + "ok": true + }, + "ugf": { + "value": 22416040.0, + "spec": { + "min": 16570000.0 + }, + "ok": true + } + }, + "result": "runs/grid/C08/gf180/sW1_sL1/combined/result.json", + "geometry_hash": "cf4e7fd6863e8f67", + "area_um2": 568.5888 + }, + { + "key": "C08_gf180", + "role": "combined", + "condition": "FF_m40C_1.1VDD", + "status": "passed", + "measures": { + "vout0": 1.815, + "idd": 4.15361e-05, + "vos": 0.004978713, + "gain_lf": 41.65224, + "ph_lf": 0.09037992, + "ugf": 34881680.0, + "ph_ugf": -91.38222, + "f3db": 287768.3, + "pm": 88.52740007999999 + }, + "spec": { + "gain_lf": { + "value": 41.65224, + "spec": { + "min": 36.87 + }, + "ok": true + }, + "ugf": { + "value": 34881680.0, + "spec": { + "min": 16570000.0 + }, + "ok": true + } + }, + "result": "runs/grid/C08/gf180/sW1_sL1/combined/result.json", + "geometry_hash": "cf4e7fd6863e8f67", + "area_um2": 568.5888 + }, + { + "key": "C08_gf180", + "role": "best_evaluated", + "condition": "TT_27C_VDD", + "status": "passed", + "measures": { + "vout0": 1.65, + "idd": 4.145347e-05, + "vos": 0.002764117, + "gain_lf": 39.87661, + "ph_lf": 0.06928625, + "ugf": 27445720.0, + "ph_ugf": -91.16504, + "f3db": 277644.2, + "pm": 88.76567374999999 + }, + "spec": { + "gain_lf": { + "value": 39.87661, + "spec": { + "min": 36.87 + }, + "ok": true + }, + "ugf": { + "value": 27445720.0, + "spec": { + "min": 16570000.0 + }, + "ok": true + } + }, + "result": "runs/selection/C08_gf180_sW1_sL1/c66b5f77dca4/result.json", + "geometry_hash": "aa596049db6c3062", + "area_um2": 470.0262 + }, + { + "key": "C08_gf180", + "role": "best_evaluated", + "condition": "SS_27C_VDD", + "status": "passed", + "measures": { + "vout0": 1.65, + "idd": 3.971525e-05, + "vos": 0.001329805, + "gain_lf": 39.84918, + "ph_lf": 0.0673643, + "ugf": 25262440.0, + "ph_ugf": -91.16539, + "f3db": 256603.1, + "pm": 88.7672457 + }, + "spec": { + "gain_lf": { + "value": 39.84918, + "spec": { + "min": 36.87 + }, + "ok": true + }, + "ugf": { + "value": 25262440.0, + "spec": { + "min": 16570000.0 + }, + "ok": true + } + }, + "result": "runs/selection/C08_gf180_sW1_sL1/c66b5f77dca4/result.json", + "geometry_hash": "aa596049db6c3062", + "area_um2": 470.0262 + }, + { + "key": "C08_gf180", + "role": "best_evaluated", + "condition": "FF_27C_VDD", + "status": "passed", + "measures": { + "vout0": 1.65, + "idd": 4.306644e-05, + "vos": 0.004236167, + "gain_lf": 39.81182, + "ph_lf": 0.07026462, + "ugf": 29682180.0, + "ph_ugf": -91.17062, + "f3db": 302386.1, + "pm": 88.75911538 + }, + "spec": { + "gain_lf": { + "value": 39.81182, + "spec": { + "min": 36.87 + }, + "ok": true + }, + "ugf": { + "value": 29682180.0, + "spec": { + "min": 16570000.0 + }, + "ok": true + } + }, + "result": "runs/selection/C08_gf180_sW1_sL1/c66b5f77dca4/result.json", + "geometry_hash": "aa596049db6c3062", + "area_um2": 470.0262 + }, + { + "key": "C08_gf180", + "role": "best_evaluated", + "condition": "SS_85C_0.9VDD", + "status": "passed", + "measures": { + "vout0": 1.485, + "idd": 4.062097e-05, + "vos": -0.00049777, + "gain_lf": 38.10803, + "ph_lf": 0.05286575, + "ugf": 22407740.0, + "ph_ugf": -91.00959, + "f3db": 278182.9, + "pm": 88.93754425 + }, + "spec": { + "gain_lf": { + "value": 38.10803, + "spec": { + "min": 36.87 + }, + "ok": true + }, + "ugf": { + "value": 22407740.0, + "spec": { + "min": 16570000.0 + }, + "ok": true + } + }, + "result": "runs/selection/C08_gf180_sW1_sL1/c66b5f77dca4/result.json", + "geometry_hash": "aa596049db6c3062", + "area_um2": 470.0262 + }, + { + "key": "C08_gf180", + "role": "best_evaluated", + "condition": "FF_m40C_1.1VDD", + "status": "passed", + "measures": { + "vout0": 1.815, + "idd": 4.152949e-05, + "vos": 0.004952728, + "gain_lf": 41.65237, + "ph_lf": 0.09037292, + "ugf": 34868560.0, + "ph_ugf": -91.3378, + "f3db": 287637.5, + "pm": 88.57182708 + }, + "spec": { + "gain_lf": { + "value": 41.65237, + "spec": { + "min": 36.87 + }, + "ok": true + }, + "ugf": { + "value": 34868560.0, + "spec": { + "min": 16570000.0 + }, + "ok": true + } + }, + "result": "runs/selection/C08_gf180_sW1_sL1/c66b5f77dca4/result.json", + "geometry_hash": "aa596049db6c3062", + "area_um2": 470.0262 + }, + { + "key": "C08_ihp130", + "role": "reference", + "condition": "TT_27C_VDD", + "status": "passed", + "measures": { + "vout0": 0.6, + "idd": 2.702427e-05, + "vos": -0.000407149, + "gain_lf": 25.09053, + "ph_lf": 0.01313413, + "ugf": 30797970.0, + "ph_ugf": -88.30732, + "f3db": 1711423.0, + "pm": 91.67954587 + }, + "spec": { + "gain_lf": { + "value": 25.09053, + "spec": { + "min": 25.0 + }, + "ok": true + }, + "ugf": { + "value": 30797970.0, + "spec": { + "min": 18630000.0 + }, + "ok": true + } + }, + "result": "runs/grid/C08/ihp130/sW1_sL1/independent/result.json", + "geometry_hash": "48d0ec7dda539200", + "area_um2": 297.5875 + }, + { + "key": "C08_ihp130", + "role": "reference", + "condition": "SS_27C_VDD", + "status": "passed", + "measures": { + "vout0": 0.5999998, + "idd": 2.174275e-05, + "vos": -0.00174079, + "gain_lf": 25.49457, + "ph_lf": 0.01323487, + "ugf": 26463360.0, + "ph_ugf": -88.41255, + "f3db": 1402848.0, + "pm": 91.57421513 + }, + "spec": { + "gain_lf": { + "value": 25.49457, + "spec": { + "min": 25.0 + }, + "ok": true + }, + "ugf": { + "value": 26463360.0, + "spec": { + "min": 18630000.0 + }, + "ok": true + } + }, + "result": "runs/grid/C08/ihp130/sW1_sL1/independent/result.json", + "geometry_hash": "48d0ec7dda539200", + "area_um2": 297.5875 + }, + { + "key": "C08_ihp130", + "role": "reference", + "condition": "FF_27C_VDD", + "status": "spec_failed", + "measures": { + "vout0": 0.6000001, + "idd": 3.289745e-05, + "vos": 0.001407636, + "gain_lf": 24.77238, + "ph_lf": 0.01305626, + "ugf": 35558730.0, + "ph_ugf": -88.2478, + "f3db": 2052273.0, + "pm": 91.73914374 + }, + "spec": { + "gain_lf": { + "value": 24.77238, + "spec": { + "min": 25.0 + }, + "ok": false + }, + "ugf": { + "value": 35558730.0, + "spec": { + "min": 18630000.0 + }, + "ok": true + } + }, + "result": "runs/grid/C08/ihp130/sW1_sL1/independent/result.json", + "geometry_hash": "48d0ec7dda539200", + "area_um2": 297.5875 + }, + { + "key": "C08_ihp130", + "role": "reference", + "condition": "SS_85C_0.9VDD", + "status": "spec_failed", + "measures": { + "vout0": 0.5399994, + "idd": 2.404703e-05, + "vos": -0.00591231, + "gain_lf": 23.66615, + "ph_lf": 0.01051162, + "ugf": 24124970.0, + "ph_ugf": -87.62147, + "f3db": 1579819.0, + "pm": 92.36801838 + }, + "spec": { + "gain_lf": { + "value": 23.66615, + "spec": { + "min": 25.0 + }, + "ok": false + }, + "ugf": { + "value": 24124970.0, + "spec": { + "min": 18630000.0 + }, + "ok": true + } + }, + "result": "runs/grid/C08/ihp130/sW1_sL1/independent/result.json", + "geometry_hash": "48d0ec7dda539200", + "area_um2": 297.5875 + }, + { + "key": "C08_ihp130", + "role": "reference", + "condition": "FF_m40C_1.1VDD", + "status": "passed", + "measures": { + "vout0": 0.6600004, + "idd": 3.044041e-05, + "vos": 0.003854145, + "gain_lf": 26.6551, + "ph_lf": 0.01654226, + "ugf": 40180430.0, + "ph_ugf": -88.9908, + "f3db": 1865452.0, + "pm": 90.99265774000001 + }, + "spec": { + "gain_lf": { + "value": 26.6551, + "spec": { + "min": 25.0 + }, + "ok": true + }, + "ugf": { + "value": 40180430.0, + "spec": { + "min": 18630000.0 + }, + "ok": true + } + }, + "result": "runs/grid/C08/ihp130/sW1_sL1/independent/result.json", + "geometry_hash": "48d0ec7dda539200", + "area_um2": 297.5875 + }, + { + "key": "C08_ihp130", + "role": "combined", + "condition": "TT_27C_VDD", + "status": "passed", + "measures": { + "vout0": 0.6, + "idd": 2.702424e-05, + "vos": -0.000409507, + "gain_lf": 25.09012, + "ph_lf": 0.01313405, + "ugf": 30802100.0, + "ph_ugf": -88.28789, + "f3db": 1711707.0, + "pm": 91.69897594999999 + }, + "spec": { + "gain_lf": { + "value": 25.09012, + "spec": { + "min": 25.0 + }, + "ok": true + }, + "ugf": { + "value": 30802100.0, + "spec": { + "min": 18630000.0 + }, + "ok": true + } + }, + "result": "runs/grid/C08/ihp130/sW1_sL1/combined/result.json", + "geometry_hash": "299105d1394054b0", + "area_um2": 286.1763 + }, + { + "key": "C08_ihp130", + "role": "combined", + "condition": "SS_27C_VDD", + "status": "passed", + "measures": { + "vout0": 0.5999998, + "idd": 2.174271e-05, + "vos": -0.00174266, + "gain_lf": 25.4942, + "ph_lf": 0.01323498, + "ugf": 26467170.0, + "ph_ugf": -88.39307, + "f3db": 1403084.0, + "pm": 91.59369502000001 + }, + "spec": { + "gain_lf": { + "value": 25.4942, + "spec": { + "min": 25.0 + }, + "ok": true + }, + "ugf": { + "value": 26467170.0, + "spec": { + "min": 18630000.0 + }, + "ok": true + } + }, + "result": "runs/grid/C08/ihp130/sW1_sL1/combined/result.json", + "geometry_hash": "299105d1394054b0", + "area_um2": 286.1763 + }, + { + "key": "C08_ihp130", + "role": "combined", + "condition": "FF_27C_VDD", + "status": "spec_failed", + "measures": { + "vout0": 0.6000001, + "idd": 3.289741e-05, + "vos": 0.001404786, + "gain_lf": 24.77191, + "ph_lf": 0.01305601, + "ugf": 35563740.0, + "ph_ugf": -88.22815, + "f3db": 2052616.0, + "pm": 91.75879399 + }, + "spec": { + "gain_lf": { + "value": 24.77191, + "spec": { + "min": 25.0 + }, + "ok": false + }, + "ugf": { + "value": 35563740.0, + "spec": { + "min": 18630000.0 + }, + "ok": true + } + }, + "result": "runs/grid/C08/ihp130/sW1_sL1/combined/result.json", + "geometry_hash": "299105d1394054b0", + "area_um2": 286.1763 + }, + { + "key": "C08_ihp130", + "role": "combined", + "condition": "SS_85C_0.9VDD", + "status": "spec_failed", + "measures": { + "vout0": 0.5399994, + "idd": 2.404698e-05, + "vos": -0.00591511, + "gain_lf": 23.66574, + "ph_lf": 0.01051172, + "ugf": 24128070.0, + "ph_ugf": -87.60324, + "f3db": 1580076.0, + "pm": 92.38624828 + }, + "spec": { + "gain_lf": { + "value": 23.66574, + "spec": { + "min": 25.0 + }, + "ok": false + }, + "ugf": { + "value": 24128070.0, + "spec": { + "min": 18630000.0 + }, + "ok": true + } + }, + "result": "runs/grid/C08/ihp130/sW1_sL1/combined/result.json", + "geometry_hash": "299105d1394054b0", + "area_um2": 286.1763 + }, + { + "key": "C08_ihp130", + "role": "combined", + "condition": "FF_m40C_1.1VDD", + "status": "passed", + "measures": { + "vout0": 0.6600004, + "idd": 3.044038e-05, + "vos": 0.003852301, + "gain_lf": 26.65461, + "ph_lf": 0.01654184, + "ugf": 40186580.0, + "ph_ugf": -88.96983, + "f3db": 1865788.0, + "pm": 91.01362816 + }, + "spec": { + "gain_lf": { + "value": 26.65461, + "spec": { + "min": 25.0 + }, + "ok": true + }, + "ugf": { + "value": 40186580.0, + "spec": { + "min": 18630000.0 + }, + "ok": true + } + }, + "result": "runs/grid/C08/ihp130/sW1_sL1/combined/result.json", + "geometry_hash": "299105d1394054b0", + "area_um2": 286.1763 + }, + { + "key": "C08_ihp130", + "role": "best_evaluated", + "condition": "TT_27C_VDD", + "status": "passed", + "measures": { + "vout0": 0.6, + "idd": 2.701454e-05, + "vos": -0.000453061, + "gain_lf": 25.09052, + "ph_lf": 0.01313294, + "ugf": 30783610.0, + "ph_ugf": -88.29498, + "f3db": 1710591.0, + "pm": 91.69188706 + }, + "spec": { + "gain_lf": { + "value": 25.09052, + "spec": { + "min": 25.0 + }, + "ok": true + }, + "ugf": { + "value": 30783610.0, + "spec": { + "min": 18630000.0 + }, + "ok": true + } + }, + "result": "runs/selection/C08_ihp130_sW1_sL1/c1ed2c9bd13e/result.json", + "geometry_hash": "0e876aae387355fb", + "area_um2": 240.9165 + }, + { + "key": "C08_ihp130", + "role": "best_evaluated", + "condition": "SS_27C_VDD", + "status": "passed", + "measures": { + "vout0": 0.5999998, + "idd": 2.173625e-05, + "vos": -0.00177838, + "gain_lf": 25.49445, + "ph_lf": 0.01323353, + "ugf": 26452100.0, + "ph_ugf": -88.40047, + "f3db": 1402265.0, + "pm": 91.58629647000001 + }, + "spec": { + "gain_lf": { + "value": 25.49445, + "spec": { + "min": 25.0 + }, + "ok": true + }, + "ugf": { + "value": 26452100.0, + "spec": { + "min": 18630000.0 + }, + "ok": true + } + }, + "result": "runs/selection/C08_ihp130_sW1_sL1/c1ed2c9bd13e/result.json", + "geometry_hash": "0e876aae387355fb", + "area_um2": 240.9165 + }, + { + "key": "C08_ihp130", + "role": "best_evaluated", + "condition": "FF_27C_VDD", + "status": "spec_failed", + "measures": { + "vout0": 0.6000001, + "idd": 3.288363e-05, + "vos": 0.00135255, + "gain_lf": 24.77252, + "ph_lf": 0.01305538, + "ugf": 35538470.0, + "ph_ugf": -88.23518, + "f3db": 2051120.0, + "pm": 91.75176462 + }, + "spec": { + "gain_lf": { + "value": 24.77252, + "spec": { + "min": 25.0 + }, + "ok": false + }, + "ugf": { + "value": 35538470.0, + "spec": { + "min": 18630000.0 + }, + "ok": true + } + }, + "result": "runs/selection/C08_ihp130_sW1_sL1/c1ed2c9bd13e/result.json", + "geometry_hash": "0e876aae387355fb", + "area_um2": 240.9165 + }, + { + "key": "C08_ihp130", + "role": "best_evaluated", + "condition": "SS_85C_0.9VDD", + "status": "spec_failed", + "measures": { + "vout0": 0.5399994, + "idd": 2.404043e-05, + "vos": -0.00595422, + "gain_lf": 23.66608, + "ph_lf": 0.01051053, + "ugf": 24115610.0, + "ph_ugf": -87.61009, + "f3db": 1579199.0, + "pm": 92.37939947 + }, + "spec": { + "gain_lf": { + "value": 23.66608, + "spec": { + "min": 25.0 + }, + "ok": false + }, + "ugf": { + "value": 24115610.0, + "spec": { + "min": 18630000.0 + }, + "ok": true + } + }, + "result": "runs/selection/C08_ihp130_sW1_sL1/c1ed2c9bd13e/result.json", + "geometry_hash": "0e876aae387355fb", + "area_um2": 240.9165 + }, + { + "key": "C08_ihp130", + "role": "best_evaluated", + "condition": "FF_m40C_1.1VDD", + "status": "passed", + "measures": { + "vout0": 0.6600004, + "idd": 3.042631e-05, + "vos": 0.0038036, + "gain_lf": 26.65525, + "ph_lf": 0.01654133, + "ugf": 40155900.0, + "ph_ugf": -88.97729, + "f3db": 1864321.0, + "pm": 91.00616867000001 + }, + "spec": { + "gain_lf": { + "value": 26.65525, + "spec": { + "min": 25.0 + }, + "ok": true + }, + "ugf": { + "value": 40155900.0, + "spec": { + "min": 18630000.0 + }, + "ok": true + } + }, + "result": "runs/selection/C08_ihp130_sW1_sL1/c1ed2c9bd13e/result.json", + "geometry_hash": "0e876aae387355fb", + "area_um2": 240.9165 + }, + { + "key": "C09_sky130", + "role": "reference", + "condition": "TT_27C_VDD", + "status": "passed", + "measures": { + "vout0": 0.8099935, + "idd": 2.000001e-05, + "vos": -0.0647385, + "gain_lf": 44.26744, + "ph_lf": 0.2925074, + "ugf": 3810334.0, + "ph_ugf": -89.37148, + "f3db": 23218.88, + "pm": 90.33601259999999 + }, + "spec": { + "gain_lf": { + "value": 44.26744, + "spec": { + "min": 41.68 + }, + "ok": true + }, + "ugf": { + "value": 3810334.0, + "spec": { + "min": 2480000.0 + }, + "ok": true + } + }, + "result": "runs/grid/C09/sky130/sW1_sL1/independent/result.json", + "geometry_hash": "acdbfac074bee967", + "area_um2": 1365.7285 + }, + { + "key": "C09_sky130", + "role": "reference", + "condition": "SS_27C_VDD", + "status": "spec_failed", + "measures": { + "vout0": 0.8099824, + "idd": 1.999999e-05, + "vos": -0.168845, + "gain_lf": 26.34015, + "ph_lf": 0.07632014, + "ugf": 999703.6, + "ph_ugf": -86.71513, + "f3db": 48115.5, + "pm": 93.20854985999999 + }, + "spec": { + "gain_lf": { + "value": 26.34015, + "spec": { + "min": 41.68 + }, + "ok": false + }, + "ugf": { + "value": 999703.6, + "spec": { + "min": 2480000.0 + }, + "ok": false + } + }, + "result": "runs/grid/C09/sky130/sW1_sL1/independent/result.json", + "geometry_hash": "acdbfac074bee967", + "area_um2": 1365.7285 + }, + { + "key": "C09_sky130", + "role": "reference", + "condition": "FF_27C_VDD", + "status": "passed", + "measures": { + "vout0": 0.8099991, + "idd": 2.000002e-05, + "vos": -0.00857391, + "gain_lf": 52.14337, + "ph_lf": 0.3229309, + "ugf": 17634900.0, + "ph_ugf": -94.46381, + "f3db": 43814.05, + "pm": 85.2132591 + }, + "spec": { + "gain_lf": { + "value": 52.14337, + "spec": { + "min": 41.68 + }, + "ok": true + }, + "ugf": { + "value": 17634900.0, + "spec": { + "min": 2480000.0 + }, + "ok": true + } + }, + "result": "runs/grid/C09/sky130/sW1_sL1/independent/result.json", + "geometry_hash": "acdbfac074bee967", + "area_um2": 1365.7285 + }, + { + "key": "C09_sky130", + "role": "reference", + "condition": "SS_85C_0.9VDD", + "status": "spec_failed", + "measures": { + "vout0": 0.8099846, + "idd": 1.999948e-05, + "vos": -0.149288, + "gain_lf": 17.27045, + "ph_lf": 0.01673433, + "ugf": 1274073.0, + "ph_ugf": -81.73184, + "f3db": 175572.4, + "pm": 98.25142566999999 + }, + "spec": { + "gain_lf": { + "value": 17.27045, + "spec": { + "min": 41.68 + }, + "ok": false + }, + "ugf": { + "value": 1274073.0, + "spec": { + "min": 2480000.0 + }, + "ok": false + } + }, + "result": "runs/grid/C09/sky130/sW1_sL1/independent/result.json", + "geometry_hash": "acdbfac074bee967", + "area_um2": 1365.7285 + }, + { + "key": "C09_sky130", + "role": "reference", + "condition": "FF_m40C_1.1VDD", + "status": "passed", + "measures": { + "vout0": 0.8099964, + "idd": 2.000001e-05, + "vos": -0.0356969, + "gain_lf": 49.21314, + "ph_lf": 0.431469, + "ugf": 7455476.0, + "ph_ugf": -89.98689, + "f3db": 25710.08, + "pm": 89.58164099999999 + }, + "spec": { + "gain_lf": { + "value": 49.21314, + "spec": { + "min": 41.68 + }, + "ok": true + }, + "ugf": { + "value": 7455476.0, + "spec": { + "min": 2480000.0 + }, + "ok": true + } + }, + "result": "runs/grid/C09/sky130/sW1_sL1/independent/result.json", + "geometry_hash": "acdbfac074bee967", + "area_um2": 1365.7285 + }, + { + "key": "C09_sky130", + "role": "combined", + "condition": "TT_27C_VDD", + "status": "passed", + "measures": { + "vout0": 0.8099935, + "idd": 2.000001e-05, + "vos": -0.0647493, + "gain_lf": 44.26833, + "ph_lf": 0.2925334, + "ugf": 3810166.0, + "ph_ugf": -89.46519, + "f3db": 23217.38, + "pm": 90.2422766 + }, + "spec": { + "gain_lf": { + "value": 44.26833, + "spec": { + "min": 41.68 + }, + "ok": true + }, + "ugf": { + "value": 3810166.0, + "spec": { + "min": 2480000.0 + }, + "ok": true + } + }, + "result": "runs/grid/C09/sky130/sW1_sL1/combined/result.json", + "geometry_hash": "249dfb6fb978bb13", + "area_um2": 1356.3148 + }, + { + "key": "C09_sky130", + "role": "combined", + "condition": "SS_27C_VDD", + "status": "spec_failed", + "measures": { + "vout0": 0.8099824, + "idd": 1.999999e-05, + "vos": -0.168855, + "gain_lf": 26.34124, + "ph_lf": 0.07623968, + "ugf": 998999.4, + "ph_ugf": -86.74309, + "f3db": 48074.29, + "pm": 93.18067032 + }, + "spec": { + "gain_lf": { + "value": 26.34124, + "spec": { + "min": 41.68 + }, + "ok": false + }, + "ugf": { + "value": 998999.4, + "spec": { + "min": 2480000.0 + }, + "ok": false + } + }, + "result": "runs/grid/C09/sky130/sW1_sL1/combined/result.json", + "geometry_hash": "249dfb6fb978bb13", + "area_um2": 1356.3148 + }, + { + "key": "C09_sky130", + "role": "combined", + "condition": "FF_27C_VDD", + "status": "passed", + "measures": { + "vout0": 0.8099991, + "idd": 2.000002e-05, + "vos": -0.00858872, + "gain_lf": 52.14464, + "ph_lf": 0.3230522, + "ugf": 17631670.0, + "ph_ugf": -94.74435, + "f3db": 43826.69, + "pm": 84.9325978 + }, + "spec": { + "gain_lf": { + "value": 52.14464, + "spec": { + "min": 41.68 + }, + "ok": true + }, + "ugf": { + "value": 17631670.0, + "spec": { + "min": 2480000.0 + }, + "ok": true + } + }, + "result": "runs/grid/C09/sky130/sW1_sL1/combined/result.json", + "geometry_hash": "249dfb6fb978bb13", + "area_um2": 1356.3148 + }, + { + "key": "C09_sky130", + "role": "combined", + "condition": "SS_85C_0.9VDD", + "status": "spec_failed", + "measures": { + "vout0": 0.8099846, + "idd": 1.999951e-05, + "vos": -0.149298, + "gain_lf": 17.27091, + "ph_lf": 0.01666376, + "ugf": 1271269.0, + "ph_ugf": -81.76971, + "f3db": 175196.8, + "pm": 98.21362624 + }, + "spec": { + "gain_lf": { + "value": 17.27091, + "spec": { + "min": 41.68 + }, + "ok": false + }, + "ugf": { + "value": 1271269.0, + "spec": { + "min": 2480000.0 + }, + "ok": false + } + }, + "result": "runs/grid/C09/sky130/sW1_sL1/combined/result.json", + "geometry_hash": "249dfb6fb978bb13", + "area_um2": 1356.3148 + }, + { + "key": "C09_sky130", + "role": "combined", + "condition": "FF_m40C_1.1VDD", + "status": "passed", + "measures": { + "vout0": 0.8099964, + "idd": 2.000001e-05, + "vos": -0.035708, + "gain_lf": 49.21394, + "ph_lf": 0.4315543, + "ugf": 7455898.0, + "ph_ugf": -90.16737, + "f3db": 25714.93, + "pm": 89.40107569999999 + }, + "spec": { + "gain_lf": { + "value": 49.21394, + "spec": { + "min": 41.68 + }, + "ok": true + }, + "ugf": { + "value": 7455898.0, + "spec": { + "min": 2480000.0 + }, + "ok": true + } + }, + "result": "runs/grid/C09/sky130/sW1_sL1/combined/result.json", + "geometry_hash": "249dfb6fb978bb13", + "area_um2": 1356.3148 + }, + { + "key": "C09_sky130", + "role": "best_evaluated", + "condition": "TT_27C_VDD", + "status": "passed", + "measures": { + "vout0": 0.8099935, + "idd": 2.000001e-05, + "vos": -0.0648441, + "gain_lf": 44.24846, + "ph_lf": 0.2920802, + "ugf": 3798601.0, + "ph_ugf": -89.39719, + "f3db": 23197.69, + "pm": 90.3107298 + }, + "spec": { + "gain_lf": { + "value": 44.24846, + "spec": { + "min": 41.68 + }, + "ok": true + }, + "ugf": { + "value": 3798601.0, + "spec": { + "min": 2480000.0 + }, + "ok": true + } + }, + "result": "runs/selection/C09_sky130_sW1_sL1/cb665d318416/result.json", + "geometry_hash": "335118a971cf94e9", + "area_um2": 1149.8563 + }, + { + "key": "C09_sky130", + "role": "best_evaluated", + "condition": "SS_27C_VDD", + "status": "spec_failed", + "measures": { + "vout0": 0.8099824, + "idd": 1.999999e-05, + "vos": -0.168991, + "gain_lf": 26.31945, + "ph_lf": 0.07599209, + "ugf": 996478.6, + "ph_ugf": -86.72551, + "f3db": 48066.68, + "pm": 93.19849791 + }, + "spec": { + "gain_lf": { + "value": 26.31945, + "spec": { + "min": 41.68 + }, + "ok": false + }, + "ugf": { + "value": 996478.6, + "spec": { + "min": 2480000.0 + }, + "ok": false + } + }, + "result": "runs/selection/C09_sky130_sW1_sL1/cb665d318416/result.json", + "geometry_hash": "335118a971cf94e9", + "area_um2": 1149.8563 + }, + { + "key": "C09_sky130", + "role": "best_evaluated", + "condition": "FF_27C_VDD", + "status": "passed", + "measures": { + "vout0": 0.8099991, + "idd": 2.000002e-05, + "vos": -0.00858743, + "gain_lf": 52.13681, + "ph_lf": 0.3227996, + "ugf": 17647790.0, + "ph_ugf": -94.01664, + "f3db": 43785.88, + "pm": 85.66056040000001 + }, + "spec": { + "gain_lf": { + "value": 52.13681, + "spec": { + "min": 41.68 + }, + "ok": true + }, + "ugf": { + "value": 17647790.0, + "spec": { + "min": 2480000.0 + }, + "ok": true + } + }, + "result": "runs/selection/C09_sky130_sW1_sL1/cb665d318416/result.json", + "geometry_hash": "335118a971cf94e9", + "area_um2": 1149.8563 + }, + { + "key": "C09_sky130", + "role": "best_evaluated", + "condition": "SS_85C_0.9VDD", + "status": "spec_failed", + "measures": { + "vout0": 0.8099846, + "idd": 1.999948e-05, + "vos": -0.149424, + "gain_lf": 17.25099, + "ph_lf": 0.01660073, + "ugf": 1267512.0, + "ph_ugf": -81.73914, + "f3db": 175110.8, + "pm": 98.24425927 + }, + "spec": { + "gain_lf": { + "value": 17.25099, + "spec": { + "min": 41.68 + }, + "ok": false + }, + "ugf": { + "value": 1267512.0, + "spec": { + "min": 2480000.0 + }, + "ok": false + } + }, + "result": "runs/selection/C09_sky130_sW1_sL1/cb665d318416/result.json", + "geometry_hash": "335118a971cf94e9", + "area_um2": 1149.8563 + }, + { + "key": "C09_sky130", + "role": "best_evaluated", + "condition": "FF_m40C_1.1VDD", + "status": "passed", + "measures": { + "vout0": 0.8099964, + "idd": 2.000001e-05, + "vos": -0.0357814, + "gain_lf": 49.19378, + "ph_lf": 0.4311216, + "ugf": 7429245.0, + "ph_ugf": -89.99632, + "f3db": 25677.28, + "pm": 89.5725584 + }, + "spec": { + "gain_lf": { + "value": 49.19378, + "spec": { + "min": 41.68 + }, + "ok": true + }, + "ugf": { + "value": 7429245.0, + "spec": { + "min": 2480000.0 + }, + "ok": true + } + }, + "result": "runs/selection/C09_sky130_sW1_sL1/cb665d318416/result.json", + "geometry_hash": "335118a971cf94e9", + "area_um2": 1149.8563 + }, + { + "key": "C09_gf180", + "role": "reference", + "condition": "TT_27C_VDD", + "status": "passed", + "measures": { + "vout0": 1.484999, + "idd": 4.000002e-05, + "vos": -0.00715658, + "gain_lf": 45.50098, + "ph_lf": 0.07433937, + "ugf": 9905446.0, + "ph_ugf": -92.15744, + "f3db": 52531.81, + "pm": 87.76822063 + }, + "spec": { + "gain_lf": { + "value": 45.50098, + "spec": { + "min": 42.52 + }, + "ok": true + }, + "ugf": { + "value": 9905446.0, + "spec": { + "min": 6008000.0 + }, + "ok": true + } + }, + "result": "runs/grid/C09/gf180/sW1_sL1/independent/result.json", + "geometry_hash": "ef2adf2a7e3eb073", + "area_um2": 968.792 + }, + { + "key": "C09_gf180", + "role": "reference", + "condition": "SS_27C_VDD", + "status": "spec_failed", + "measures": { + "vout0": 1.484991, + "idd": 4.000002e-05, + "vos": -0.0878104, + "gain_lf": 44.63986, + "ph_lf": 0.04472549, + "ugf": 3668380.0, + "ph_ugf": -89.72543, + "f3db": 21422.72, + "pm": 90.22984450999999 + }, + "spec": { + "gain_lf": { + "value": 44.63986, + "spec": { + "min": 42.52 + }, + "ok": true + }, + "ugf": { + "value": 3668380.0, + "spec": { + "min": 6008000.0 + }, + "ok": false + } + }, + "result": "runs/grid/C09/gf180/sW1_sL1/independent/result.json", + "geometry_hash": "ef2adf2a7e3eb073", + "area_um2": 968.792 + }, + { + "key": "C09_gf180", + "role": "reference", + "condition": "FF_27C_VDD", + "status": "passed", + "measures": { + "vout0": 1.485, + "idd": 4.000003e-05, + "vos": -0.00324735, + "gain_lf": 46.28878, + "ph_lf": 0.08802996, + "ugf": 11129850.0, + "ph_ugf": -92.34985, + "f3db": 53921.98, + "pm": 87.56212004 + }, + "spec": { + "gain_lf": { + "value": 46.28878, + "spec": { + "min": 42.52 + }, + "ok": true + }, + "ugf": { + "value": 11129850.0, + "spec": { + "min": 6008000.0 + }, + "ok": true + } + }, + "result": "runs/grid/C09/gf180/sW1_sL1/independent/result.json", + "geometry_hash": "ef2adf2a7e3eb073", + "area_um2": 968.792 + }, + { + "key": "C09_gf180", + "role": "reference", + "condition": "SS_85C_0.9VDD", + "status": "spec_failed", + "measures": { + "vout0": 1.48494, + "idd": 4.000001e-05, + "vos": -0.418241, + "gain_lf": 21.52036, + "ph_lf": -0.07077548, + "ugf": 668663.0, + "ph_ugf": -84.75738, + "f3db": 56099.92, + "pm": 95.31339548 + }, + "spec": { + "gain_lf": { + "value": 21.52036, + "spec": { + "min": 42.52 + }, + "ok": false + }, + "ugf": { + "value": 668663.0, + "spec": { + "min": 6008000.0 + }, + "ok": false + } + }, + "result": "runs/grid/C09/gf180/sW1_sL1/independent/result.json", + "geometry_hash": "ef2adf2a7e3eb073", + "area_um2": 968.792 + }, + { + "key": "C09_gf180", + "role": "reference", + "condition": "FF_m40C_1.1VDD", + "status": "passed", + "measures": { + "vout0": 1.485, + "idd": 4.000003e-05, + "vos": -0.00114717, + "gain_lf": 49.06809, + "ph_lf": 0.1549964, + "ugf": 15093570.0, + "ph_ugf": -92.85069, + "f3db": 53078.58, + "pm": 86.9943136 + }, + "spec": { + "gain_lf": { + "value": 49.06809, + "spec": { + "min": 42.52 + }, + "ok": true + }, + "ugf": { + "value": 15093570.0, + "spec": { + "min": 6008000.0 + }, + "ok": true + } + }, + "result": "runs/grid/C09/gf180/sW1_sL1/independent/result.json", + "geometry_hash": "ef2adf2a7e3eb073", + "area_um2": 968.792 + }, + { + "key": "C09_gf180", + "role": "combined", + "condition": "TT_27C_VDD", + "status": "passed", + "measures": { + "vout0": 1.484999, + "idd": 4.000002e-05, + "vos": -0.00714867, + "gain_lf": 45.50079, + "ph_lf": 0.07431974, + "ugf": 9905044.0, + "ph_ugf": -92.13603, + "f3db": 52528.78, + "pm": 87.78965025999999 + }, + "spec": { + "gain_lf": { + "value": 45.50079, + "spec": { + "min": 42.52 + }, + "ok": true + }, + "ugf": { + "value": 9905044.0, + "spec": { + "min": 6008000.0 + }, + "ok": true + } + }, + "result": "runs/grid/C09/gf180/sW1_sL1/combined/result.json", + "geometry_hash": "277cb534b8acb653", + "area_um2": 951.016 + }, + { + "key": "C09_gf180", + "role": "combined", + "condition": "SS_27C_VDD", + "status": "spec_failed", + "measures": { + "vout0": 1.484991, + "idd": 4.000002e-05, + "vos": -0.087811, + "gain_lf": 44.63959, + "ph_lf": 0.04468748, + "ugf": 3667777.0, + "ph_ugf": -89.72391, + "f3db": 21419.97, + "pm": 90.23140252 + }, + "spec": { + "gain_lf": { + "value": 44.63959, + "spec": { + "min": 42.52 + }, + "ok": true + }, + "ugf": { + "value": 3667777.0, + "spec": { + "min": 6008000.0 + }, + "ok": false + } + }, + "result": "runs/grid/C09/gf180/sW1_sL1/combined/result.json", + "geometry_hash": "277cb534b8acb653", + "area_um2": 951.016 + }, + { + "key": "C09_gf180", + "role": "combined", + "condition": "FF_27C_VDD", + "status": "passed", + "measures": { + "vout0": 1.485, + "idd": 4.000003e-05, + "vos": -0.00323973, + "gain_lf": 46.28858, + "ph_lf": 0.08800977, + "ugf": 11129490.0, + "ph_ugf": -92.32737, + "f3db": 53919.19, + "pm": 87.58462023 + }, + "spec": { + "gain_lf": { + "value": 46.28858, + "spec": { + "min": 42.52 + }, + "ok": true + }, + "ugf": { + "value": 11129490.0, + "spec": { + "min": 6008000.0 + }, + "ok": true + } + }, + "result": "runs/grid/C09/gf180/sW1_sL1/combined/result.json", + "geometry_hash": "277cb534b8acb653", + "area_um2": 951.016 + }, + { + "key": "C09_gf180", + "role": "combined", + "condition": "SS_85C_0.9VDD", + "status": "spec_failed", + "measures": { + "vout0": 1.48494, + "idd": 4.000001e-05, + "vos": -0.418247, + "gain_lf": 21.51989, + "ph_lf": -0.07078782, + "ugf": 668565.8, + "ph_ugf": -84.75789, + "f3db": 56094.8, + "pm": 95.31289782 + }, + "spec": { + "gain_lf": { + "value": 21.51989, + "spec": { + "min": 42.52 + }, + "ok": false + }, + "ugf": { + "value": 668565.8, + "spec": { + "min": 6008000.0 + }, + "ok": false + } + }, + "result": "runs/grid/C09/gf180/sW1_sL1/combined/result.json", + "geometry_hash": "277cb534b8acb653", + "area_um2": 951.016 + }, + { + "key": "C09_gf180", + "role": "combined", + "condition": "FF_m40C_1.1VDD", + "status": "passed", + "measures": { + "vout0": 1.485, + "idd": 4.000003e-05, + "vos": -0.00114077, + "gain_lf": 49.06784, + "ph_lf": 0.1549709, + "ugf": 15093490.0, + "ph_ugf": -92.82492, + "f3db": 53076.83, + "pm": 87.0201091 + }, + "spec": { + "gain_lf": { + "value": 49.06784, + "spec": { + "min": 42.52 + }, + "ok": true + }, + "ugf": { + "value": 15093490.0, + "spec": { + "min": 6008000.0 + }, + "ok": true + } + }, + "result": "runs/grid/C09/gf180/sW1_sL1/combined/result.json", + "geometry_hash": "277cb534b8acb653", + "area_um2": 951.016 + }, + { + "key": "C09_gf180", + "role": "best_evaluated", + "condition": "TT_27C_VDD", + "status": "passed", + "measures": { + "vout0": 1.484999, + "idd": 4.000002e-05, + "vos": -0.00715469, + "gain_lf": 45.50082, + "ph_lf": 0.0741304, + "ugf": 9891795.0, + "ph_ugf": -91.84731, + "f3db": 52431.69, + "pm": 88.0785596 + }, + "spec": { + "gain_lf": { + "value": 45.50082, + "spec": { + "min": 42.52 + }, + "ok": true + }, + "ugf": { + "value": 9891795.0, + "spec": { + "min": 6008000.0 + }, + "ok": true + } + }, + "result": "runs/selection/C09_gf180_sW1_sL1/ca6f6963e509/result.json", + "geometry_hash": "0bbe80282fc7f122", + "area_um2": 795.2894 + }, + { + "key": "C09_gf180", + "role": "best_evaluated", + "condition": "SS_27C_VDD", + "status": "spec_failed", + "measures": { + "vout0": 1.484991, + "idd": 4.000002e-05, + "vos": -0.0878644, + "gain_lf": 44.6402, + "ph_lf": 0.04419438, + "ugf": 3659186.0, + "ph_ugf": -89.68878, + "f3db": 21369.2, + "pm": 90.26702562000001 + }, + "spec": { + "gain_lf": { + "value": 44.6402, + "spec": { + "min": 42.52 + }, + "ok": true + }, + "ugf": { + "value": 3659186.0, + "spec": { + "min": 6008000.0 + }, + "ok": false + } + }, + "result": "runs/selection/C09_gf180_sW1_sL1/ca6f6963e509/result.json", + "geometry_hash": "0bbe80282fc7f122", + "area_um2": 795.2894 + }, + { + "key": "C09_gf180", + "role": "best_evaluated", + "condition": "FF_27C_VDD", + "status": "passed", + "measures": { + "vout0": 1.485, + "idd": 4.000003e-05, + "vos": -0.0032448, + "gain_lf": 46.28862, + "ph_lf": 0.08782649, + "ugf": 11115360.0, + "ph_ugf": -92.0175, + "f3db": 53820.11, + "pm": 87.89467351 + }, + "spec": { + "gain_lf": { + "value": 46.28862, + "spec": { + "min": 42.52 + }, + "ok": true + }, + "ugf": { + "value": 11115360.0, + "spec": { + "min": 6008000.0 + }, + "ok": true + } + }, + "result": "runs/selection/C09_gf180_sW1_sL1/ca6f6963e509/result.json", + "geometry_hash": "0bbe80282fc7f122", + "area_um2": 795.2894 + }, + { + "key": "C09_gf180", + "role": "best_evaluated", + "condition": "SS_85C_0.9VDD", + "status": "spec_failed", + "measures": { + "vout0": 1.48494, + "idd": 4.000001e-05, + "vos": -0.418333, + "gain_lf": 21.51647, + "ph_lf": -0.07110918, + "ugf": 666417.7, + "ph_ugf": -84.76171, + "f3db": 55936.9, + "pm": 95.30939918 + }, + "spec": { + "gain_lf": { + "value": 21.51647, + "spec": { + "min": 42.52 + }, + "ok": false + }, + "ugf": { + "value": 666417.7, + "spec": { + "min": 6008000.0 + }, + "ok": false + } + }, + "result": "runs/selection/C09_gf180_sW1_sL1/ca6f6963e509/result.json", + "geometry_hash": "0bbe80282fc7f122", + "area_um2": 795.2894 + }, + { + "key": "C09_gf180", + "role": "best_evaluated", + "condition": "FF_m40C_1.1VDD", + "status": "passed", + "measures": { + "vout0": 1.485, + "idd": 4.000003e-05, + "vos": -0.00114483, + "gain_lf": 49.06789, + "ph_lf": 0.1547876, + "ugf": 15076300.0, + "ph_ugf": -92.45664, + "f3db": 52979.25, + "pm": 87.3885724 + }, + "spec": { + "gain_lf": { + "value": 49.06789, + "spec": { + "min": 42.52 + }, + "ok": true + }, + "ugf": { + "value": 15076300.0, + "spec": { + "min": 6008000.0 + }, + "ok": true + } + }, + "result": "runs/selection/C09_gf180_sW1_sL1/ca6f6963e509/result.json", + "geometry_hash": "0bbe80282fc7f122", + "area_um2": 795.2894 + }, + { + "key": "C09_ihp130", + "role": "reference", + "condition": "TT_27C_VDD", + "status": "passed", + "measures": { + "vout0": 0.5399999, + "idd": 2e-05, + "vos": -0.00126686, + "gain_lf": 46.78378, + "ph_lf": 0.1569452, + "ugf": 27108850.0, + "ph_ugf": -98.44142, + "f3db": 126498.6, + "pm": 81.40163480000001 + }, + "spec": { + "gain_lf": { + "value": 46.78378, + "spec": { + "min": 43.79 + }, + "ok": true + }, + "ugf": { + "value": 27108850.0, + "spec": { + "min": 17120000.0 + }, + "ok": true + } + }, + "result": "runs/grid/C09/ihp130/sW1_sL1/independent/result.json", + "geometry_hash": "141ee9dbb44a536d", + "area_um2": 1421.3063 + }, + { + "key": "C09_ihp130", + "role": "reference", + "condition": "SS_27C_VDD", + "status": "passed", + "measures": { + "vout0": 0.5399998, + "idd": 2e-05, + "vos": -0.00197092, + "gain_lf": 47.05506, + "ph_lf": 0.1640587, + "ugf": 27192570.0, + "ph_ugf": -98.35817, + "f3db": 122915.4, + "pm": 81.4777713 + }, + "spec": { + "gain_lf": { + "value": 47.05506, + "spec": { + "min": 43.79 + }, + "ok": true + }, + "ugf": { + "value": 27192570.0, + "spec": { + "min": 17120000.0 + }, + "ok": true + } + }, + "result": "runs/grid/C09/ihp130/sW1_sL1/independent/result.json", + "geometry_hash": "141ee9dbb44a536d", + "area_um2": 1421.3063 + }, + { + "key": "C09_ihp130", + "role": "reference", + "condition": "FF_27C_VDD", + "status": "passed", + "measures": { + "vout0": 0.5399999, + "idd": 2e-05, + "vos": -0.000544056, + "gain_lf": 46.94322, + "ph_lf": 0.1586281, + "ugf": 27448840.0, + "ph_ugf": -98.65337, + "f3db": 125952.5, + "pm": 81.1880019 + }, + "spec": { + "gain_lf": { + "value": 46.94322, + "spec": { + "min": 43.79 + }, + "ok": true + }, + "ugf": { + "value": 27448840.0, + "spec": { + "min": 17120000.0 + }, + "ok": true + } + }, + "result": "runs/grid/C09/ihp130/sW1_sL1/independent/result.json", + "geometry_hash": "141ee9dbb44a536d", + "area_um2": 1421.3063 + }, + { + "key": "C09_ihp130", + "role": "reference", + "condition": "SS_85C_0.9VDD", + "status": "spec_failed", + "measures": { + "vout0": 0.5399997, + "idd": 2e-05, + "vos": -0.00339592, + "gain_lf": 43.02186, + "ph_lf": 0.0994761, + "ugf": 22356220.0, + "ph_ugf": -97.75444, + "f3db": 160684.4, + "pm": 82.1460839 + }, + "spec": { + "gain_lf": { + "value": 43.02186, + "spec": { + "min": 43.79 + }, + "ok": false + }, + "ugf": { + "value": 22356220.0, + "spec": { + "min": 17120000.0 + }, + "ok": true + } + }, + "result": "runs/grid/C09/ihp130/sW1_sL1/independent/result.json", + "geometry_hash": "141ee9dbb44a536d", + "area_um2": 1421.3063 + }, + { + "key": "C09_ihp130", + "role": "reference", + "condition": "FF_m40C_1.1VDD", + "status": "passed", + "measures": { + "vout0": 0.54, + "idd": 2e-05, + "vos": -0.000259947, + "gain_lf": 50.71011, + "ph_lf": 0.255629, + "ugf": 33126870.0, + "ph_ugf": -99.07813, + "f3db": 98583.14, + "pm": 80.666241 + }, + "spec": { + "gain_lf": { + "value": 50.71011, + "spec": { + "min": 43.79 + }, + "ok": true + }, + "ugf": { + "value": 33126870.0, + "spec": { + "min": 17120000.0 + }, + "ok": true + } + }, + "result": "runs/grid/C09/ihp130/sW1_sL1/independent/result.json", + "geometry_hash": "141ee9dbb44a536d", + "area_um2": 1421.3063 + }, + { + "key": "C09_ihp130", + "role": "combined", + "condition": "TT_27C_VDD", + "status": "passed", + "measures": { + "vout0": 0.5399999, + "idd": 2e-05, + "vos": -0.0012655, + "gain_lf": 46.78368, + "ph_lf": 0.1569541, + "ugf": 27118620.0, + "ph_ugf": -98.42416, + "f3db": 126532.0, + "pm": 81.4188859 + }, + "spec": { + "gain_lf": { + "value": 46.78368, + "spec": { + "min": 43.79 + }, + "ok": true + }, + "ugf": { + "value": 27118620.0, + "spec": { + "min": 17120000.0 + }, + "ok": true + } + }, + "result": "runs/grid/C09/ihp130/sW1_sL1/combined/result.json", + "geometry_hash": "62286a66ccf12337", + "area_um2": 1413.0187 + }, + { + "key": "C09_ihp130", + "role": "combined", + "condition": "SS_27C_VDD", + "status": "passed", + "measures": { + "vout0": 0.5399998, + "idd": 2e-05, + "vos": -0.00196955, + "gain_lf": 47.05497, + "ph_lf": 0.1640681, + "ugf": 27202300.0, + "ph_ugf": -98.34104, + "f3db": 122948.1, + "pm": 81.4948919 + }, + "spec": { + "gain_lf": { + "value": 47.05497, + "spec": { + "min": 43.79 + }, + "ok": true + }, + "ugf": { + "value": 27202300.0, + "spec": { + "min": 17120000.0 + }, + "ok": true + } + }, + "result": "runs/grid/C09/ihp130/sW1_sL1/combined/result.json", + "geometry_hash": "62286a66ccf12337", + "area_um2": 1413.0187 + }, + { + "key": "C09_ihp130", + "role": "combined", + "condition": "FF_27C_VDD", + "status": "passed", + "measures": { + "vout0": 0.5399999, + "idd": 2e-05, + "vos": -0.000542715, + "gain_lf": 46.94311, + "ph_lf": 0.1586369, + "ugf": 27458770.0, + "ph_ugf": -98.63583, + "f3db": 125985.8, + "pm": 81.2055331 + }, + "spec": { + "gain_lf": { + "value": 46.94311, + "spec": { + "min": 43.79 + }, + "ok": true + }, + "ugf": { + "value": 27458770.0, + "spec": { + "min": 17120000.0 + }, + "ok": true + } + }, + "result": "runs/grid/C09/ihp130/sW1_sL1/combined/result.json", + "geometry_hash": "62286a66ccf12337", + "area_um2": 1413.0187 + }, + { + "key": "C09_ihp130", + "role": "combined", + "condition": "SS_85C_0.9VDD", + "status": "spec_failed", + "measures": { + "vout0": 0.5399997, + "idd": 2e-05, + "vos": -0.00339445, + "gain_lf": 43.0218, + "ph_lf": 0.09948388, + "ugf": 22363730.0, + "ph_ugf": -97.73779, + "f3db": 160726.6, + "pm": 82.16272612 + }, + "spec": { + "gain_lf": { + "value": 43.0218, + "spec": { + "min": 43.79 + }, + "ok": false + }, + "ugf": { + "value": 22363730.0, + "spec": { + "min": 17120000.0 + }, + "ok": true + } + }, + "result": "runs/grid/C09/ihp130/sW1_sL1/combined/result.json", + "geometry_hash": "62286a66ccf12337", + "area_um2": 1413.0187 + }, + { + "key": "C09_ihp130", + "role": "combined", + "condition": "FF_m40C_1.1VDD", + "status": "passed", + "measures": { + "vout0": 0.54, + "idd": 2e-05, + "vos": -0.000258664, + "gain_lf": 50.71001, + "ph_lf": 0.2556405, + "ugf": 33139840.0, + "ph_ugf": -99.06103, + "f3db": 98610.11, + "pm": 80.6833295 + }, + "spec": { + "gain_lf": { + "value": 50.71001, + "spec": { + "min": 43.79 + }, + "ok": true + }, + "ugf": { + "value": 33139840.0, + "spec": { + "min": 17120000.0 + }, + "ok": true + } + }, + "result": "runs/grid/C09/ihp130/sW1_sL1/combined/result.json", + "geometry_hash": "62286a66ccf12337", + "area_um2": 1413.0187 + }, + { + "key": "C09_ihp130", + "role": "best_evaluated", + "condition": "TT_27C_VDD", + "status": "passed", + "measures": { + "vout0": 0.5399999, + "idd": 2e-05, + "vos": -0.00126608, + "gain_lf": 46.78362, + "ph_lf": 0.1570002, + "ugf": 27319860.0, + "ph_ugf": -97.30275, + "f3db": 126646.6, + "pm": 82.5402498 + }, + "spec": { + "gain_lf": { + "value": 46.78362, + "spec": { + "min": 43.79 + }, + "ok": true + }, + "ugf": { + "value": 27319860.0, + "spec": { + "min": 17120000.0 + }, + "ok": true + } + }, + "result": "runs/selection/C09_ihp130_sW1_sL1/c5974eb942a8/result.json", + "geometry_hash": "aa1d276ab3ef7c96", + "area_um2": 1214.7619 + }, + { + "key": "C09_ihp130", + "role": "best_evaluated", + "condition": "SS_27C_VDD", + "status": "passed", + "measures": { + "vout0": 0.5399998, + "idd": 2e-05, + "vos": -0.00197024, + "gain_lf": 47.05489, + "ph_lf": 0.1641151, + "ugf": 27398280.0, + "ph_ugf": -97.23615, + "f3db": 123059.0, + "pm": 82.5997349 + }, + "spec": { + "gain_lf": { + "value": 47.05489, + "spec": { + "min": 43.79 + }, + "ok": true + }, + "ugf": { + "value": 27398280.0, + "spec": { + "min": 17120000.0 + }, + "ok": true + } + }, + "result": "runs/selection/C09_ihp130_sW1_sL1/c5974eb942a8/result.json", + "geometry_hash": "aa1d276ab3ef7c96", + "area_um2": 1214.7619 + }, + { + "key": "C09_ihp130", + "role": "best_evaluated", + "condition": "FF_27C_VDD", + "status": "passed", + "measures": { + "vout0": 0.5399999, + "idd": 2e-05, + "vos": -0.000543176, + "gain_lf": 46.94306, + "ph_lf": 0.1586832, + "ugf": 27670020.0, + "ph_ugf": -97.48646, + "f3db": 126100.5, + "pm": 82.35485680000001 + }, + "spec": { + "gain_lf": { + "value": 46.94306, + "spec": { + "min": 43.79 + }, + "ok": true + }, + "ugf": { + "value": 27670020.0, + "spec": { + "min": 17120000.0 + }, + "ok": true + } + }, + "result": "runs/selection/C09_ihp130_sW1_sL1/c5974eb942a8/result.json", + "geometry_hash": "aa1d276ab3ef7c96", + "area_um2": 1214.7619 + }, + { + "key": "C09_ihp130", + "role": "best_evaluated", + "condition": "SS_85C_0.9VDD", + "status": "spec_failed", + "measures": { + "vout0": 0.5399997, + "idd": 2e-05, + "vos": -0.00339574, + "gain_lf": 43.02166, + "ph_lf": 0.09951906, + "ugf": 22517210.0, + "ph_ugf": -96.70055, + "f3db": 160859.1, + "pm": 83.19993093999999 + }, + "spec": { + "gain_lf": { + "value": 43.02166, + "spec": { + "min": 43.79 + }, + "ok": false + }, + "ugf": { + "value": 22517210.0, + "spec": { + "min": 17120000.0 + }, + "ok": true + } + }, + "result": "runs/selection/C09_ihp130_sW1_sL1/c5974eb942a8/result.json", + "geometry_hash": "aa1d276ab3ef7c96", + "area_um2": 1214.7619 + }, + { + "key": "C09_ihp130", + "role": "best_evaluated", + "condition": "FF_m40C_1.1VDD", + "status": "passed", + "measures": { + "vout0": 0.54, + "idd": 2e-05, + "vos": -0.000258918, + "gain_lf": 50.70996, + "ph_lf": 0.2556983, + "ugf": 33413770.0, + "ph_ugf": -97.9029, + "f3db": 98702.96, + "pm": 81.84140169999999 + }, + "spec": { + "gain_lf": { + "value": 50.70996, + "spec": { + "min": 43.79 + }, + "ok": true + }, + "ugf": { + "value": 33413770.0, + "spec": { + "min": 17120000.0 + }, + "ok": true + } + }, + "result": "runs/selection/C09_ihp130_sW1_sL1/c5974eb942a8/result.json", + "geometry_hash": "aa1d276ab3ef7c96", + "area_um2": 1214.7619 + }, + { + "key": "C11_sky130", + "role": "reference", + "condition": "TT_27C_VDD", + "status": "passed", + "measures": { + "vout0": 0.9000002, + "idd": 7.745746e-05, + "vos": 0.002050348, + "gain_lf": 59.65045, + "ph_lf": 0.5053558, + "ugf": 14907830.0, + "ph_ugf": -96.4035, + "f3db": 15765.6, + "pm": 83.0911442 + }, + "spec": { + "gain_lf": { + "value": 59.65045, + "spec": { + "min": 56.62 + }, + "ok": true + }, + "ugf": { + "value": 14907830.0, + "spec": { + "min": 9313000.0 + }, + "ok": true + }, + "pm": { + "value": 83.0911442, + "spec": { + "min": 45.0 + }, + "ok": true + } + }, + "result": "runs/grid/C11/sky130/sW1_sL1/independent/result.json", + "geometry_hash": "24dc98a229f1c957", + "area_um2": 1446.921 + }, + { + "key": "C11_sky130", + "role": "reference", + "condition": "SS_27C_VDD", + "status": "passed", + "measures": { + "vout0": 0.9000003, + "idd": 7.198238e-05, + "vos": 0.002968872, + "gain_lf": 60.33577, + "ph_lf": 0.4029222, + "ugf": 10920810.0, + "ph_ugf": -97.96446, + "f3db": 10670.0, + "pm": 81.63261779999999 + }, + "spec": { + "gain_lf": { + "value": 60.33577, + "spec": { + "min": 56.62 + }, + "ok": true + }, + "ugf": { + "value": 10920810.0, + "spec": { + "min": 9313000.0 + }, + "ok": true + }, + "pm": { + "value": 81.63261779999999, + "spec": { + "min": 45.0 + }, + "ok": true + } + }, + "result": "runs/grid/C11/sky130/sW1_sL1/independent/result.json", + "geometry_hash": "24dc98a229f1c957", + "area_um2": 1446.921 + }, + { + "key": "C11_sky130", + "role": "reference", + "condition": "FF_27C_VDD", + "status": "passed", + "measures": { + "vout0": 0.9000001, + "idd": 8.306221e-05, + "vos": 0.00139893, + "gain_lf": 57.6493, + "ph_lf": 0.4590275, + "ugf": 18655410.0, + "ph_ugf": -94.56095, + "f3db": 24749.25, + "pm": 84.98002249999999 + }, + "spec": { + "gain_lf": { + "value": 57.6493, + "spec": { + "min": 56.62 + }, + "ok": true + }, + "ugf": { + "value": 18655410.0, + "spec": { + "min": 9313000.0 + }, + "ok": true + }, + "pm": { + "value": 84.98002249999999, + "spec": { + "min": 45.0 + }, + "ok": true + } + }, + "result": "runs/grid/C11/sky130/sW1_sL1/independent/result.json", + "geometry_hash": "24dc98a229f1c957", + "area_um2": 1446.921 + }, + { + "key": "C11_sky130", + "role": "reference", + "condition": "SS_85C_0.9VDD", + "status": "spec_failed", + "measures": { + "vout0": 0.9000005, + "idd": 6.579924e-05, + "vos": 0.004545284, + "gain_lf": 58.61445, + "ph_lf": 0.07707279, + "ugf": 7005626.0, + "ph_ugf": -97.06525, + "f3db": 8284.015, + "pm": 82.85767720999999 + }, + "spec": { + "gain_lf": { + "value": 58.61445, + "spec": { + "min": 56.62 + }, + "ok": true + }, + "ugf": { + "value": 7005626.0, + "spec": { + "min": 9313000.0 + }, + "ok": false + }, + "pm": { + "value": 82.85767720999999, + "spec": { + "min": 45.0 + }, + "ok": true + } + }, + "result": "runs/grid/C11/sky130/sW1_sL1/independent/result.json", + "geometry_hash": "24dc98a229f1c957", + "area_um2": 1446.921 + }, + { + "key": "C11_sky130", + "role": "reference", + "condition": "FF_m40C_1.1VDD", + "status": "passed", + "measures": { + "vout0": 0.9000001, + "idd": 8.852868e-05, + "vos": 0.0007278467, + "gain_lf": 58.84232, + "ph_lf": 0.5897442, + "ugf": 24569940.0, + "ph_ugf": -90.46211, + "f3db": 27879.44, + "pm": 88.9481458 + }, + "spec": { + "gain_lf": { + "value": 58.84232, + "spec": { + "min": 56.62 + }, + "ok": true + }, + "ugf": { + "value": 24569940.0, + "spec": { + "min": 9313000.0 + }, + "ok": true + }, + "pm": { + "value": 88.9481458, + "spec": { + "min": 45.0 + }, + "ok": true + } + }, + "result": "runs/grid/C11/sky130/sW1_sL1/independent/result.json", + "geometry_hash": "24dc98a229f1c957", + "area_um2": 1446.921 + }, + { + "key": "C11_sky130", + "role": "combined", + "condition": "TT_27C_VDD", + "status": "passed", + "measures": { + "vout0": 0.9000002, + "idd": 7.751296e-05, + "vos": 0.001663045, + "gain_lf": 60.17492, + "ph_lf": 0.5371498, + "ugf": 14918240.0, + "ph_ugf": -96.55934, + "f3db": 14850.45, + "pm": 82.9035102 + }, + "spec": { + "gain_lf": { + "value": 60.17492, + "spec": { + "min": 56.62 + }, + "ok": true + }, + "ugf": { + "value": 14918240.0, + "spec": { + "min": 9313000.0 + }, + "ok": true + }, + "pm": { + "value": 82.9035102, + "spec": { + "min": 45.0 + }, + "ok": true + } + }, + "result": "runs/grid/C11/sky130/sW1_sL1/combined/result.json", + "geometry_hash": "555212f012941696", + "area_um2": 1426.7718 + }, + { + "key": "C11_sky130", + "role": "combined", + "condition": "SS_27C_VDD", + "status": "passed", + "measures": { + "vout0": 0.9000003, + "idd": 7.200499e-05, + "vos": 0.002577951, + "gain_lf": 60.87051, + "ph_lf": 0.4281748, + "ugf": 10913770.0, + "ph_ugf": -98.0949, + "f3db": 10025.61, + "pm": 81.47692520000001 + }, + "spec": { + "gain_lf": { + "value": 60.87051, + "spec": { + "min": 56.62 + }, + "ok": true + }, + "ugf": { + "value": 10913770.0, + "spec": { + "min": 9313000.0 + }, + "ok": true + }, + "pm": { + "value": 81.47692520000001, + "spec": { + "min": 45.0 + }, + "ok": true + } + }, + "result": "runs/grid/C11/sky130/sW1_sL1/combined/result.json", + "geometry_hash": "555212f012941696", + "area_um2": 1426.7718 + }, + { + "key": "C11_sky130", + "role": "combined", + "condition": "FF_27C_VDD", + "status": "passed", + "measures": { + "vout0": 0.9000001, + "idd": 8.317183e-05, + "vos": 0.001014907, + "gain_lf": 58.1292, + "ph_lf": 0.4857411, + "ugf": 18701860.0, + "ph_ugf": -94.72479, + "f3db": 23471.12, + "pm": 84.7894689 + }, + "spec": { + "gain_lf": { + "value": 58.1292, + "spec": { + "min": 56.62 + }, + "ok": true + }, + "ugf": { + "value": 18701860.0, + "spec": { + "min": 9313000.0 + }, + "ok": true + }, + "pm": { + "value": 84.7894689, + "spec": { + "min": 45.0 + }, + "ok": true + } + }, + "result": "runs/grid/C11/sky130/sW1_sL1/combined/result.json", + "geometry_hash": "555212f012941696", + "area_um2": 1426.7718 + }, + { + "key": "C11_sky130", + "role": "combined", + "condition": "SS_85C_0.9VDD", + "status": "spec_failed", + "measures": { + "vout0": 0.9000004, + "idd": 6.580367e-05, + "vos": 0.004158429, + "gain_lf": 59.13375, + "ph_lf": 0.08000592, + "ugf": 6989099.0, + "ph_ugf": -97.15303, + "f3db": 7783.084, + "pm": 82.76696408 + }, + "spec": { + "gain_lf": { + "value": 59.13375, + "spec": { + "min": 56.62 + }, + "ok": true + }, + "ugf": { + "value": 6989099.0, + "spec": { + "min": 9313000.0 + }, + "ok": false + }, + "pm": { + "value": 82.76696408, + "spec": { + "min": 45.0 + }, + "ok": true + } + }, + "result": "runs/grid/C11/sky130/sW1_sL1/combined/result.json", + "geometry_hash": "555212f012941696", + "area_um2": 1426.7718 + }, + { + "key": "C11_sky130", + "role": "combined", + "condition": "FF_m40C_1.1VDD", + "status": "passed", + "measures": { + "vout0": 0.9, + "idd": 8.873535e-05, + "vos": 0.0003446276, + "gain_lf": 59.36854, + "ph_lf": 0.6276364, + "ugf": 24701000.0, + "ph_ugf": -90.62587, + "f3db": 26365.01, + "pm": 88.7464936 + }, + "spec": { + "gain_lf": { + "value": 59.36854, + "spec": { + "min": 56.62 + }, + "ok": true + }, + "ugf": { + "value": 24701000.0, + "spec": { + "min": 9313000.0 + }, + "ok": true + }, + "pm": { + "value": 88.7464936, + "spec": { + "min": 45.0 + }, + "ok": true + } + }, + "result": "runs/grid/C11/sky130/sW1_sL1/combined/result.json", + "geometry_hash": "555212f012941696", + "area_um2": 1426.7718 + }, + { + "key": "C11_sky130", + "role": "best_evaluated", + "condition": "TT_27C_VDD", + "status": "passed", + "measures": { + "vout0": 0.9000002, + "idd": 7.799865e-05, + "vos": 0.002087821, + "gain_lf": 59.62579, + "ph_lf": 0.5046968, + "ugf": 14950970.0, + "ph_ugf": -96.1694, + "f3db": 15844.07, + "pm": 83.3259032 + }, + "spec": { + "gain_lf": { + "value": 59.62579, + "spec": { + "min": 56.62 + }, + "ok": true + }, + "ugf": { + "value": 14950970.0, + "spec": { + "min": 9313000.0 + }, + "ok": true + }, + "pm": { + "value": 83.3259032, + "spec": { + "min": 45.0 + }, + "ok": true + } + }, + "result": "runs/selection/C11_sky130_sW1_sL1/c7a85b0ddcef/result.json", + "geometry_hash": "2a6c5c74b2d4d87f", + "area_um2": 1298.136 + }, + { + "key": "C11_sky130", + "role": "best_evaluated", + "condition": "SS_27C_VDD", + "status": "passed", + "measures": { + "vout0": 0.9000003, + "idd": 7.242311e-05, + "vos": 0.003006684, + "gain_lf": 60.30567, + "ph_lf": 0.402375, + "ugf": 10941570.0, + "ph_ugf": -97.79397, + "f3db": 10723.36, + "pm": 81.80365499999999 + }, + "spec": { + "gain_lf": { + "value": 60.30567, + "spec": { + "min": 56.62 + }, + "ok": true + }, + "ugf": { + "value": 10941570.0, + "spec": { + "min": 9313000.0 + }, + "ok": true + }, + "pm": { + "value": 81.80365499999999, + "spec": { + "min": 45.0 + }, + "ok": true + } + }, + "result": "runs/selection/C11_sky130_sW1_sL1/c7a85b0ddcef/result.json", + "geometry_hash": "2a6c5c74b2d4d87f", + "area_um2": 1298.136 + }, + { + "key": "C11_sky130", + "role": "best_evaluated", + "condition": "FF_27C_VDD", + "status": "passed", + "measures": { + "vout0": 0.9000001, + "idd": 8.370635e-05, + "vos": 0.00143575, + "gain_lf": 57.62883, + "ph_lf": 0.4586113, + "ugf": 18733280.0, + "ph_ugf": -94.26609, + "f3db": 24880.84, + "pm": 85.2752987 + }, + "spec": { + "gain_lf": { + "value": 57.62883, + "spec": { + "min": 56.62 + }, + "ok": true + }, + "ugf": { + "value": 18733280.0, + "spec": { + "min": 9313000.0 + }, + "ok": true + }, + "pm": { + "value": 85.2752987, + "spec": { + "min": 45.0 + }, + "ok": true + } + }, + "result": "runs/selection/C11_sky130_sW1_sL1/c7a85b0ddcef/result.json", + "geometry_hash": "2a6c5c74b2d4d87f", + "area_um2": 1298.136 + }, + { + "key": "C11_sky130", + "role": "best_evaluated", + "condition": "SS_85C_0.9VDD", + "status": "spec_failed", + "measures": { + "vout0": 0.9000005, + "idd": 6.618325e-05, + "vos": 0.00458537, + "gain_lf": 58.57671, + "ph_lf": 0.07757588, + "ugf": 7014944.0, + "ph_ugf": -96.95009, + "f3db": 8329.918, + "pm": 82.97233412 + }, + "spec": { + "gain_lf": { + "value": 58.57671, + "spec": { + "min": 56.62 + }, + "ok": true + }, + "ugf": { + "value": 7014944.0, + "spec": { + "min": 9313000.0 + }, + "ok": false + }, + "pm": { + "value": 82.97233412, + "spec": { + "min": 45.0 + }, + "ok": true + } + }, + "result": "runs/selection/C11_sky130_sW1_sL1/c7a85b0ddcef/result.json", + "geometry_hash": "2a6c5c74b2d4d87f", + "area_um2": 1298.136 + }, + { + "key": "C11_sky130", + "role": "best_evaluated", + "condition": "FF_m40C_1.1VDD", + "status": "passed", + "measures": { + "vout0": 0.9000001, + "idd": 8.93297e-05, + "vos": 0.0007541604, + "gain_lf": 58.82272, + "ph_lf": 0.5891756, + "ugf": 24712210.0, + "ph_ugf": -90.0885, + "f3db": 28051.85, + "pm": 89.3223244 + }, + "spec": { + "gain_lf": { + "value": 58.82272, + "spec": { + "min": 56.62 + }, + "ok": true + }, + "ugf": { + "value": 24712210.0, + "spec": { + "min": 9313000.0 + }, + "ok": true + }, + "pm": { + "value": 89.3223244, + "spec": { + "min": 45.0 + }, + "ok": true + } + }, + "result": "runs/selection/C11_sky130_sW1_sL1/c7a85b0ddcef/result.json", + "geometry_hash": "2a6c5c74b2d4d87f", + "area_um2": 1298.136 + }, + { + "key": "C11_gf180", + "role": "reference", + "condition": "TT_27C_VDD", + "status": "passed", + "measures": { + "vout0": 1.65, + "idd": 9.863076e-05, + "vos": 0.0001466159, + "gain_lf": 73.18916, + "ph_lf": 2.210247, + "ugf": 12720330.0, + "ph_ugf": -114.4691, + "f3db": 2937.976, + "pm": 63.32065300000001 + }, + "spec": { + "gain_lf": { + "value": 73.18916, + "spec": { + "min": 70.18 + }, + "ok": true + }, + "ugf": { + "value": 12720330.0, + "spec": { + "min": 7692000.0 + }, + "ok": true + }, + "pm": { + "value": 63.32065300000001, + "spec": { + "min": 45.0 + }, + "ok": true + } + }, + "result": "runs/grid/C11/gf180/sW1_sL1/independent/result.json", + "geometry_hash": "94233513ac528fd9", + "area_um2": 2439.9508 + }, + { + "key": "C11_gf180", + "role": "reference", + "condition": "SS_27C_VDD", + "status": "passed", + "measures": { + "vout0": 1.65, + "idd": 9.697771e-05, + "vos": 0.0002727352, + "gain_lf": 73.01353, + "ph_lf": 2.004344, + "ugf": 11783100.0, + "ph_ugf": -115.1198, + "f3db": 2767.519, + "pm": 62.875856 + }, + "spec": { + "gain_lf": { + "value": 73.01353, + "spec": { + "min": 70.18 + }, + "ok": true + }, + "ugf": { + "value": 11783100.0, + "spec": { + "min": 7692000.0 + }, + "ok": true + }, + "pm": { + "value": 62.875856, + "spec": { + "min": 45.0 + }, + "ok": true + } + }, + "result": "runs/grid/C11/gf180/sW1_sL1/independent/result.json", + "geometry_hash": "94233513ac528fd9", + "area_um2": 2439.9508 + }, + { + "key": "C11_gf180", + "role": "reference", + "condition": "FF_27C_VDD", + "status": "passed", + "measures": { + "vout0": 1.65, + "idd": 9.95884e-05, + "vos": 8.332422e-05, + "gain_lf": 73.16918, + "ph_lf": 2.339029, + "ugf": 13641810.0, + "ph_ugf": -113.6845, + "f3db": 3160.774, + "pm": 63.976471000000004 + }, + "spec": { + "gain_lf": { + "value": 73.16918, + "spec": { + "min": 70.18 + }, + "ok": true + }, + "ugf": { + "value": 13641810.0, + "spec": { + "min": 7692000.0 + }, + "ok": true + }, + "pm": { + "value": 63.976471000000004, + "spec": { + "min": 45.0 + }, + "ok": true + } + }, + "result": "runs/grid/C11/gf180/sW1_sL1/independent/result.json", + "geometry_hash": "94233513ac528fd9", + "area_um2": 2439.9508 + }, + { + "key": "C11_gf180", + "role": "reference", + "condition": "SS_85C_0.9VDD", + "status": "passed", + "measures": { + "vout0": 1.65, + "idd": 8.842498e-05, + "vos": 0.001048374, + "gain_lf": 71.41311, + "ph_lf": 1.245211, + "ugf": 9589523.0, + "ph_ugf": -114.8313, + "f3db": 2679.702, + "pm": 63.923489000000004 + }, + "spec": { + "gain_lf": { + "value": 71.41311, + "spec": { + "min": 70.18 + }, + "ok": true + }, + "ugf": { + "value": 9589523.0, + "spec": { + "min": 7692000.0 + }, + "ok": true + }, + "pm": { + "value": 63.923489000000004, + "spec": { + "min": 45.0 + }, + "ok": true + } + }, + "result": "runs/grid/C11/gf180/sW1_sL1/independent/result.json", + "geometry_hash": "94233513ac528fd9", + "area_um2": 2439.9508 + }, + { + "key": "C11_gf180", + "role": "reference", + "condition": "FF_m40C_1.1VDD", + "status": "passed", + "measures": { + "vout0": 1.65, + "idd": 0.0001005673, + "vos": 7.186805e-05, + "gain_lf": 75.79694, + "ph_lf": 3.511704, + "ugf": 15862250.0, + "ph_ugf": -110.0043, + "f3db": 2723.196, + "pm": 66.483996 + }, + "spec": { + "gain_lf": { + "value": 75.79694, + "spec": { + "min": 70.18 + }, + "ok": true + }, + "ugf": { + "value": 15862250.0, + "spec": { + "min": 7692000.0 + }, + "ok": true + }, + "pm": { + "value": 66.483996, + "spec": { + "min": 45.0 + }, + "ok": true + } + }, + "result": "runs/grid/C11/gf180/sW1_sL1/independent/result.json", + "geometry_hash": "94233513ac528fd9", + "area_um2": 2439.9508 + }, + { + "key": "C11_gf180", + "role": "combined", + "condition": "TT_27C_VDD", + "status": "passed", + "measures": { + "vout0": 1.65, + "idd": 9.863547e-05, + "vos": 0.0001025418, + "gain_lf": 73.22722, + "ph_lf": 2.220101, + "ugf": 12721260.0, + "ph_ugf": -114.6098, + "f3db": 2925.443, + "pm": 63.17009899999999 + }, + "spec": { + "gain_lf": { + "value": 73.22722, + "spec": { + "min": 70.18 + }, + "ok": true + }, + "ugf": { + "value": 12721260.0, + "spec": { + "min": 7692000.0 + }, + "ok": true + }, + "pm": { + "value": 63.17009899999999, + "spec": { + "min": 45.0 + }, + "ok": true + } + }, + "result": "runs/grid/C11/gf180/sW1_sL1/combined/result.json", + "geometry_hash": "28288888966ff819", + "area_um2": 2373.8001 + }, + { + "key": "C11_gf180", + "role": "combined", + "condition": "SS_27C_VDD", + "status": "passed", + "measures": { + "vout0": 1.65, + "idd": 9.698185e-05, + "vos": 0.0002286827, + "gain_lf": 73.05183, + "ph_lf": 2.013329, + "ugf": 11783790.0, + "ph_ugf": -115.256, + "f3db": 2755.604, + "pm": 62.730671 + }, + "spec": { + "gain_lf": { + "value": 73.05183, + "spec": { + "min": 70.18 + }, + "ok": true + }, + "ugf": { + "value": 11783790.0, + "spec": { + "min": 7692000.0 + }, + "ok": true + }, + "pm": { + "value": 62.730671, + "spec": { + "min": 45.0 + }, + "ok": true + } + }, + "result": "runs/grid/C11/gf180/sW1_sL1/combined/result.json", + "geometry_hash": "28288888966ff819", + "area_um2": 2373.8001 + }, + { + "key": "C11_gf180", + "role": "combined", + "condition": "FF_27C_VDD", + "status": "passed", + "measures": { + "vout0": 1.65, + "idd": 9.959351e-05, + "vos": 3.960458e-05, + "gain_lf": 73.2067, + "ph_lf": 2.349304, + "ugf": 13642950.0, + "ph_ugf": -113.8281, + "f3db": 3147.468, + "pm": 63.82259599999999 + }, + "spec": { + "gain_lf": { + "value": 73.2067, + "spec": { + "min": 70.18 + }, + "ok": true + }, + "ugf": { + "value": 13642950.0, + "spec": { + "min": 7692000.0 + }, + "ok": true + }, + "pm": { + "value": 63.82259599999999, + "spec": { + "min": 45.0 + }, + "ok": true + } + }, + "result": "runs/grid/C11/gf180/sW1_sL1/combined/result.json", + "geometry_hash": "28288888966ff819", + "area_um2": 2373.8001 + }, + { + "key": "C11_gf180", + "role": "combined", + "condition": "SS_85C_0.9VDD", + "status": "passed", + "measures": { + "vout0": 1.65, + "idd": 8.842761e-05, + "vos": 0.001008238, + "gain_lf": 71.45114, + "ph_lf": 1.25071, + "ugf": 9589865.0, + "ph_ugf": -114.9522, + "f3db": 2668.153, + "pm": 63.79709 + }, + "spec": { + "gain_lf": { + "value": 71.45114, + "spec": { + "min": 70.18 + }, + "ok": true + }, + "ugf": { + "value": 9589865.0, + "spec": { + "min": 7692000.0 + }, + "ok": true + }, + "pm": { + "value": 63.79709, + "spec": { + "min": 45.0 + }, + "ok": true + } + }, + "result": "runs/grid/C11/gf180/sW1_sL1/combined/result.json", + "geometry_hash": "28288888966ff819", + "area_um2": 2373.8001 + }, + { + "key": "C11_gf180", + "role": "combined", + "condition": "FF_m40C_1.1VDD", + "status": "passed", + "measures": { + "vout0": 1.65, + "idd": 0.0001005733, + "vos": 2.636862e-05, + "gain_lf": 75.84286, + "ph_lf": 3.530562, + "ugf": 15864720.0, + "ph_ugf": -110.151, + "f3db": 2709.292, + "pm": 66.318438 + }, + "spec": { + "gain_lf": { + "value": 75.84286, + "spec": { + "min": 70.18 + }, + "ok": true + }, + "ugf": { + "value": 15864720.0, + "spec": { + "min": 7692000.0 + }, + "ok": true + }, + "pm": { + "value": 66.318438, + "spec": { + "min": 45.0 + }, + "ok": true + } + }, + "result": "runs/grid/C11/gf180/sW1_sL1/combined/result.json", + "geometry_hash": "28288888966ff819", + "area_um2": 2373.8001 + }, + { + "key": "C11_gf180", + "role": "best_evaluated", + "condition": "TT_27C_VDD", + "status": "passed", + "measures": { + "vout0": 1.65, + "idd": 9.862997e-05, + "vos": 0.0001448419, + "gain_lf": 73.18298, + "ph_lf": 2.208624, + "ugf": 12727100.0, + "ph_ugf": -114.2605, + "f3db": 2939.98, + "pm": 63.530876000000006 + }, + "spec": { + "gain_lf": { + "value": 73.18298, + "spec": { + "min": 70.18 + }, + "ok": true + }, + "ugf": { + "value": 12727100.0, + "spec": { + "min": 7692000.0 + }, + "ok": true + }, + "pm": { + "value": 63.530876000000006, + "spec": { + "min": 45.0 + }, + "ok": true + } + }, + "result": "runs/selection/C11_gf180_sW1_sL1/c3d4bacbce79/result.json", + "geometry_hash": "8657d60538f98592", + "area_um2": 2157.3144 + }, + { + "key": "C11_gf180", + "role": "best_evaluated", + "condition": "SS_27C_VDD", + "status": "passed", + "measures": { + "vout0": 1.65, + "idd": 9.697701e-05, + "vos": 0.0002712314, + "gain_lf": 73.00711, + "ph_lf": 2.002816, + "ugf": 11789210.0, + "ph_ugf": -114.9194, + "f3db": 2769.503, + "pm": 63.07778400000001 + }, + "spec": { + "gain_lf": { + "value": 73.00711, + "spec": { + "min": 70.18 + }, + "ok": true + }, + "ugf": { + "value": 11789210.0, + "spec": { + "min": 7692000.0 + }, + "ok": true + }, + "pm": { + "value": 63.07778400000001, + "spec": { + "min": 45.0 + }, + "ok": true + } + }, + "result": "runs/selection/C11_gf180_sW1_sL1/c3d4bacbce79/result.json", + "geometry_hash": "8657d60538f98592", + "area_um2": 2157.3144 + }, + { + "key": "C11_gf180", + "role": "best_evaluated", + "condition": "FF_27C_VDD", + "status": "passed", + "measures": { + "vout0": 1.65, + "idd": 9.958754e-05, + "vos": 8.142008e-05, + "gain_lf": 73.16329, + "ph_lf": 2.337391, + "ugf": 13648660.0, + "ph_ugf": -113.4711, + "f3db": 3162.821, + "pm": 64.191509 + }, + "spec": { + "gain_lf": { + "value": 73.16329, + "spec": { + "min": 70.18 + }, + "ok": true + }, + "ugf": { + "value": 13648660.0, + "spec": { + "min": 7692000.0 + }, + "ok": true + }, + "pm": { + "value": 64.191509, + "spec": { + "min": 45.0 + }, + "ok": true + } + }, + "result": "runs/selection/C11_gf180_sW1_sL1/c3d4bacbce79/result.json", + "geometry_hash": "8657d60538f98592", + "area_um2": 2157.3144 + }, + { + "key": "C11_gf180", + "role": "best_evaluated", + "condition": "SS_85C_0.9VDD", + "status": "passed", + "measures": { + "vout0": 1.65, + "idd": 8.842444e-05, + "vos": 0.001048439, + "gain_lf": 71.40637, + "ph_lf": 1.24423, + "ugf": 9594111.0, + "ph_ugf": -114.6579, + "f3db": 2681.779, + "pm": 64.09787 + }, + "spec": { + "gain_lf": { + "value": 71.40637, + "spec": { + "min": 70.18 + }, + "ok": true + }, + "ugf": { + "value": 9594111.0, + "spec": { + "min": 7692000.0 + }, + "ok": true + }, + "pm": { + "value": 64.09787, + "spec": { + "min": 45.0 + }, + "ok": true + } + }, + "result": "runs/selection/C11_gf180_sW1_sL1/c3d4bacbce79/result.json", + "geometry_hash": "8657d60538f98592", + "area_um2": 2157.3144 + }, + { + "key": "C11_gf180", + "role": "best_evaluated", + "condition": "FF_m40C_1.1VDD", + "status": "passed", + "measures": { + "vout0": 1.65, + "idd": 0.0001005663, + "vos": 7.006956e-05, + "gain_lf": 75.78974, + "ph_lf": 3.508711, + "ugf": 15870360.0, + "ph_ugf": -109.7872, + "f3db": 2725.326, + "pm": 66.704089 + }, + "spec": { + "gain_lf": { + "value": 75.78974, + "spec": { + "min": 70.18 + }, + "ok": true + }, + "ugf": { + "value": 15870360.0, + "spec": { + "min": 7692000.0 + }, + "ok": true + }, + "pm": { + "value": 66.704089, + "spec": { + "min": 45.0 + }, + "ok": true + } + }, + "result": "runs/selection/C11_gf180_sW1_sL1/c3d4bacbce79/result.json", + "geometry_hash": "8657d60538f98592", + "area_um2": 2157.3144 + }, + { + "key": "C11_ihp130", + "role": "reference", + "condition": "TT_27C_VDD", + "status": "passed", + "measures": { + "vout0": 0.6000001, + "idd": 9.167618e-05, + "vos": 0.0009439903, + "gain_lf": 47.11818, + "ph_lf": 0.1515527, + "ugf": 23377030.0, + "ph_ugf": -100.8757, + "f3db": 106903.1, + "pm": 78.97274730000001 + }, + "spec": { + "gain_lf": { + "value": 47.11818, + "spec": { + "min": 44.12 + }, + "ok": true + }, + "ugf": { + "value": 23377030.0, + "spec": { + "min": 14200000.0 + }, + "ok": true + }, + "pm": { + "value": 78.97274730000001, + "spec": { + "min": 45.0 + }, + "ok": true + } + }, + "result": "runs/grid/C11/ihp130/sW1_sL1/independent/result.json", + "geometry_hash": "45f8091108fbbac8", + "area_um2": 2092.7973 + }, + { + "key": "C11_ihp130", + "role": "reference", + "condition": "SS_27C_VDD", + "status": "passed", + "measures": { + "vout0": 0.6000002, + "idd": 8.762972e-05, + "vos": 0.001748997, + "gain_lf": 47.56337, + "ph_lf": 0.1546769, + "ugf": 21876370.0, + "ph_ugf": -100.7129, + "f3db": 94808.39, + "pm": 79.1324231 + }, + "spec": { + "gain_lf": { + "value": 47.56337, + "spec": { + "min": 44.12 + }, + "ok": true + }, + "ugf": { + "value": 21876370.0, + "spec": { + "min": 14200000.0 + }, + "ok": true + }, + "pm": { + "value": 79.1324231, + "spec": { + "min": 45.0 + }, + "ok": true + } + }, + "result": "runs/grid/C11/ihp130/sW1_sL1/independent/result.json", + "geometry_hash": "45f8091108fbbac8", + "area_um2": 2092.7973 + }, + { + "key": "C11_ihp130", + "role": "reference", + "condition": "FF_27C_VDD", + "status": "passed", + "measures": { + "vout0": 0.6, + "idd": 9.494886e-05, + "vos": 0.0002649892, + "gain_lf": 46.83669, + "ph_lf": 0.1500647, + "ugf": 24615320.0, + "ph_ugf": -100.6153, + "f3db": 116413.2, + "pm": 79.2346353 + }, + "spec": { + "gain_lf": { + "value": 46.83669, + "spec": { + "min": 44.12 + }, + "ok": true + }, + "ugf": { + "value": 24615320.0, + "spec": { + "min": 14200000.0 + }, + "ok": true + }, + "pm": { + "value": 79.2346353, + "spec": { + "min": 45.0 + }, + "ok": true + } + }, + "result": "runs/grid/C11/ihp130/sW1_sL1/independent/result.json", + "geometry_hash": "45f8091108fbbac8", + "area_um2": 2092.7973 + }, + { + "key": "C11_ihp130", + "role": "reference", + "condition": "SS_85C_0.9VDD", + "status": "passed", + "measures": { + "vout0": 0.6000004, + "idd": 7.804189e-05, + "vos": 0.00410246, + "gain_lf": 45.72163, + "ph_lf": 0.1037084, + "ugf": 15800110.0, + "ph_ugf": -101.1433, + "f3db": 84063.52, + "pm": 78.7529916 + }, + "spec": { + "gain_lf": { + "value": 45.72163, + "spec": { + "min": 44.12 + }, + "ok": true + }, + "ugf": { + "value": 15800110.0, + "spec": { + "min": 14200000.0 + }, + "ok": true + }, + "pm": { + "value": 78.7529916, + "spec": { + "min": 45.0 + }, + "ok": true + } + }, + "result": "runs/grid/C11/ihp130/sW1_sL1/independent/result.json", + "geometry_hash": "45f8091108fbbac8", + "area_um2": 2092.7973 + }, + { + "key": "C11_ihp130", + "role": "reference", + "condition": "FF_m40C_1.1VDD", + "status": "passed", + "measures": { + "vout0": 0.6, + "idd": 9.767412e-05, + "vos": 0.0001364161, + "gain_lf": 48.70812, + "ph_lf": 0.1959591, + "ugf": 29164490.0, + "ph_ugf": -97.41431, + "f3db": 109865.3, + "pm": 82.3897309 + }, + "spec": { + "gain_lf": { + "value": 48.70812, + "spec": { + "min": 44.12 + }, + "ok": true + }, + "ugf": { + "value": 29164490.0, + "spec": { + "min": 14200000.0 + }, + "ok": true + }, + "pm": { + "value": 82.3897309, + "spec": { + "min": 45.0 + }, + "ok": true + } + }, + "result": "runs/grid/C11/ihp130/sW1_sL1/independent/result.json", + "geometry_hash": "45f8091108fbbac8", + "area_um2": 2092.7973 + }, + { + "key": "C11_ihp130", + "role": "combined", + "condition": "TT_27C_VDD", + "status": "passed", + "measures": { + "vout0": 0.6000001, + "idd": 9.169178e-05, + "vos": 0.0008766724, + "gain_lf": 47.13479, + "ph_lf": 0.1518568, + "ugf": 23388710.0, + "ph_ugf": -100.9068, + "f3db": 106737.2, + "pm": 78.94134319999999 + }, + "spec": { + "gain_lf": { + "value": 47.13479, + "spec": { + "min": 44.12 + }, + "ok": true + }, + "ugf": { + "value": 23388710.0, + "spec": { + "min": 14200000.0 + }, + "ok": true + }, + "pm": { + "value": 78.94134319999999, + "spec": { + "min": 45.0 + }, + "ok": true + } + }, + "result": "runs/grid/C11/ihp130/sW1_sL1/combined/result.json", + "geometry_hash": "116834701c006e60", + "area_um2": 2064.5756 + }, + { + "key": "C11_ihp130", + "role": "combined", + "condition": "SS_27C_VDD", + "status": "passed", + "measures": { + "vout0": 0.6000002, + "idd": 8.764203e-05, + "vos": 0.001684105, + "gain_lf": 47.58121, + "ph_lf": 0.1550062, + "ugf": 21885310.0, + "ph_ugf": -100.7439, + "f3db": 94641.64, + "pm": 79.1010938 + }, + "spec": { + "gain_lf": { + "value": 47.58121, + "spec": { + "min": 44.12 + }, + "ok": true + }, + "ugf": { + "value": 21885310.0, + "spec": { + "min": 14200000.0 + }, + "ok": true + }, + "pm": { + "value": 79.1010938, + "spec": { + "min": 45.0 + }, + "ok": true + } + }, + "result": "runs/grid/C11/ihp130/sW1_sL1/combined/result.json", + "geometry_hash": "116834701c006e60", + "area_um2": 2064.5756 + }, + { + "key": "C11_ihp130", + "role": "combined", + "condition": "FF_27C_VDD", + "status": "passed", + "measures": { + "vout0": 0.6, + "idd": 9.496783e-05, + "vos": 0.0001952337, + "gain_lf": 46.85254, + "ph_lf": 0.1503556, + "ugf": 24628560.0, + "ph_ugf": -100.6456, + "f3db": 116249.1, + "pm": 79.2040444 + }, + "spec": { + "gain_lf": { + "value": 46.85254, + "spec": { + "min": 44.12 + }, + "ok": true + }, + "ugf": { + "value": 24628560.0, + "spec": { + "min": 14200000.0 + }, + "ok": true + }, + "pm": { + "value": 79.2040444, + "spec": { + "min": 45.0 + }, + "ok": true + } + }, + "result": "runs/grid/C11/ihp130/sW1_sL1/combined/result.json", + "geometry_hash": "116834701c006e60", + "area_um2": 2064.5756 + }, + { + "key": "C11_ihp130", + "role": "combined", + "condition": "SS_85C_0.9VDD", + "status": "passed", + "measures": { + "vout0": 0.6000004, + "idd": 7.804845e-05, + "vos": 0.004042106, + "gain_lf": 45.7393, + "ph_lf": 0.1039209, + "ugf": 15803170.0, + "ph_ugf": -101.1709, + "f3db": 83900.82, + "pm": 78.72517909999999 + }, + "spec": { + "gain_lf": { + "value": 45.7393, + "spec": { + "min": 44.12 + }, + "ok": true + }, + "ugf": { + "value": 15803170.0, + "spec": { + "min": 14200000.0 + }, + "ok": true + }, + "pm": { + "value": 78.72517909999999, + "spec": { + "min": 45.0 + }, + "ok": true + } + }, + "result": "runs/grid/C11/ihp130/sW1_sL1/combined/result.json", + "geometry_hash": "116834701c006e60", + "area_um2": 2064.5756 + }, + { + "key": "C11_ihp130", + "role": "combined", + "condition": "FF_m40C_1.1VDD", + "status": "passed", + "measures": { + "vout0": 0.6, + "idd": 9.769814e-05, + "vos": 6.514362e-05, + "gain_lf": 48.72731, + "ph_lf": 0.196417, + "ugf": 29185540.0, + "ph_ugf": -97.44392, + "f3db": 109680.2, + "pm": 82.359663 + }, + "spec": { + "gain_lf": { + "value": 48.72731, + "spec": { + "min": 44.12 + }, + "ok": true + }, + "ugf": { + "value": 29185540.0, + "spec": { + "min": 14200000.0 + }, + "ok": true + }, + "pm": { + "value": 82.359663, + "spec": { + "min": 45.0 + }, + "ok": true + } + }, + "result": "runs/grid/C11/ihp130/sW1_sL1/combined/result.json", + "geometry_hash": "116834701c006e60", + "area_um2": 2064.5756 + }, + { + "key": "C11_ihp130", + "role": "best_evaluated", + "condition": "TT_27C_VDD", + "status": "passed", + "measures": { + "vout0": 0.6000001, + "idd": 9.172002e-05, + "vos": 0.0009629359, + "gain_lf": 47.12357, + "ph_lf": 0.1516946, + "ugf": 23415490.0, + "ph_ugf": -100.3566, + "f3db": 106918.0, + "pm": 79.4917054 + }, + "spec": { + "gain_lf": { + "value": 47.12357, + "spec": { + "min": 44.12 + }, + "ok": true + }, + "ugf": { + "value": 23415490.0, + "spec": { + "min": 14200000.0 + }, + "ok": true + }, + "pm": { + "value": 79.4917054, + "spec": { + "min": 45.0 + }, + "ok": true + } + }, + "result": "runs/selection/C11_ihp130_sW1_sL1/c054b3c446d5/result.json", + "geometry_hash": "fa740bef2dd25d5f", + "area_um2": 1927.1642 + }, + { + "key": "C11_ihp130", + "role": "best_evaluated", + "condition": "SS_27C_VDD", + "status": "passed", + "measures": { + "vout0": 0.6000002, + "idd": 8.767077e-05, + "vos": 0.001766065, + "gain_lf": 47.56782, + "ph_lf": 0.1548081, + "ugf": 21908250.0, + "ph_ugf": -100.2246, + "f3db": 94826.41, + "pm": 79.62059190000001 + }, + "spec": { + "gain_lf": { + "value": 47.56782, + "spec": { + "min": 44.12 + }, + "ok": true + }, + "ugf": { + "value": 21908250.0, + "spec": { + "min": 14200000.0 + }, + "ok": true + }, + "pm": { + "value": 79.62059190000001, + "spec": { + "min": 45.0 + }, + "ok": true + } + }, + "result": "runs/selection/C11_ihp130_sW1_sL1/c054b3c446d5/result.json", + "geometry_hash": "fa740bef2dd25d5f", + "area_um2": 1927.1642 + }, + { + "key": "C11_ihp130", + "role": "best_evaluated", + "condition": "FF_27C_VDD", + "status": "passed", + "measures": { + "vout0": 0.6, + "idd": 9.49955e-05, + "vos": 0.0002854991, + "gain_lf": 46.84284, + "ph_lf": 0.150216, + "ugf": 24656300.0, + "ph_ugf": -100.0733, + "f3db": 116424.9, + "pm": 79.776484 + }, + "spec": { + "gain_lf": { + "value": 46.84284, + "spec": { + "min": 44.12 + }, + "ok": true + }, + "ugf": { + "value": 24656300.0, + "spec": { + "min": 14200000.0 + }, + "ok": true + }, + "pm": { + "value": 79.776484, + "spec": { + "min": 45.0 + }, + "ok": true + } + }, + "result": "runs/selection/C11_ihp130_sW1_sL1/c054b3c446d5/result.json", + "geometry_hash": "fa740bef2dd25d5f", + "area_um2": 1927.1642 + }, + { + "key": "C11_ihp130", + "role": "best_evaluated", + "condition": "SS_85C_0.9VDD", + "status": "passed", + "measures": { + "vout0": 0.6000004, + "idd": 7.807537e-05, + "vos": 0.004115915, + "gain_lf": 45.72398, + "ph_lf": 0.1037892, + "ugf": 15818190.0, + "ph_ugf": -100.7545, + "f3db": 84093.7, + "pm": 79.14171080000001 + }, + "spec": { + "gain_lf": { + "value": 45.72398, + "spec": { + "min": 44.12 + }, + "ok": true + }, + "ugf": { + "value": 15818190.0, + "spec": { + "min": 14200000.0 + }, + "ok": true + }, + "pm": { + "value": 79.14171080000001, + "spec": { + "min": 45.0 + }, + "ok": true + } + }, + "result": "runs/selection/C11_ihp130_sW1_sL1/c054b3c446d5/result.json", + "geometry_hash": "fa740bef2dd25d5f", + "area_um2": 1927.1642 + }, + { + "key": "C11_ihp130", + "role": "best_evaluated", + "condition": "FF_m40C_1.1VDD", + "status": "passed", + "measures": { + "vout0": 0.6, + "idd": 9.772792e-05, + "vos": 0.000157504, + "gain_lf": 48.7149, + "ph_lf": 0.1961595, + "ugf": 29222330.0, + "ph_ugf": -96.82356, + "f3db": 109871.4, + "pm": 82.9802805 + }, + "spec": { + "gain_lf": { + "value": 48.7149, + "spec": { + "min": 44.12 + }, + "ok": true + }, + "ugf": { + "value": 29222330.0, + "spec": { + "min": 14200000.0 + }, + "ok": true + }, + "pm": { + "value": 82.9802805, + "spec": { + "min": 45.0 + }, + "ok": true + } + }, + "result": "runs/selection/C11_ihp130_sW1_sL1/c054b3c446d5/result.json", + "geometry_hash": "fa740bef2dd25d5f", + "area_um2": 1927.1642 + }, + { + "key": "C16_sky130", + "role": "reference", + "condition": "TT_27C_VDD", + "status": "passed", + "measures": { + "vo1": 1.390164, + "vo2": 1.390164, + "idd": 4.000037e-05, + "vos_in": -7.01181e-05, + "gain_lf": 14.39065, + "f3db": 76870970.0, + "ugf": 396750600.0 + }, + "spec": { + "gain_lf": { + "value": 14.39065, + "spec": { + "min": 11.4 + }, + "ok": true + }, + "f3db": { + "value": 76870970.0, + "spec": { + "min": 49720000.0 + }, + "ok": true + } + }, + "result": "runs/grid/C16/sky130/sW1_sL1/independent/result.json", + "geometry_hash": "bc1634c8eabc044f", + "area_um2": 377.2789 + }, + { + "key": "C16_sky130", + "role": "reference", + "condition": "SS_27C_VDD", + "status": "passed", + "measures": { + "vo1": 1.390162, + "vo2": 1.390162, + "idd": 4.000057e-05, + "vos_in": -6.88771e-05, + "gain_lf": 13.48121, + "f3db": 75657530.0, + "ugf": 350258500.0 + }, + "spec": { + "gain_lf": { + "value": 13.48121, + "spec": { + "min": 11.4 + }, + "ok": true + }, + "f3db": { + "value": 75657530.0, + "spec": { + "min": 49720000.0 + }, + "ok": true + } + }, + "result": "runs/grid/C16/sky130/sW1_sL1/independent/result.json", + "geometry_hash": "bc1634c8eabc044f", + "area_um2": 377.2789 + }, + { + "key": "C16_sky130", + "role": "reference", + "condition": "FF_27C_VDD", + "status": "passed", + "measures": { + "vo1": 1.390165, + "vo2": 1.390165, + "idd": 4.000023e-05, + "vos_in": -7.04514e-05, + "gain_lf": 14.91696, + "f3db": 78417480.0, + "ugf": 431438300.0 + }, + "spec": { + "gain_lf": { + "value": 14.91696, + "spec": { + "min": 11.4 + }, + "ok": true + }, + "f3db": { + "value": 78417480.0, + "spec": { + "min": 49720000.0 + }, + "ok": true + } + }, + "result": "runs/grid/C16/sky130/sW1_sL1/independent/result.json", + "geometry_hash": "bc1634c8eabc044f", + "area_um2": 377.2789 + }, + { + "key": "C16_sky130", + "role": "reference", + "condition": "SS_85C_0.9VDD", + "status": "passed", + "measures": { + "vo1": 1.197464, + "vo2": 1.197464, + "idd": 4.000004e-05, + "vos_in": -6.71658e-05, + "gain_lf": 12.89585, + "f3db": 73267570.0, + "ugf": 315828000.0 + }, + "spec": { + "gain_lf": { + "value": 12.89585, + "spec": { + "min": 11.4 + }, + "ok": true + }, + "f3db": { + "value": 73267570.0, + "spec": { + "min": 49720000.0 + }, + "ok": true + } + }, + "result": "runs/grid/C16/sky130/sW1_sL1/independent/result.json", + "geometry_hash": "bc1634c8eabc044f", + "area_um2": 377.2789 + }, + { + "key": "C16_sky130", + "role": "reference", + "condition": "FF_m40C_1.1VDD", + "status": "passed", + "measures": { + "vo1": 1.580832, + "vo2": 1.580832, + "idd": 4.000308e-05, + "vos_in": -7.23184e-05, + "gain_lf": 15.71532, + "f3db": 81170780.0, + "ugf": 490749800.0 + }, + "spec": { + "gain_lf": { + "value": 15.71532, + "spec": { + "min": 11.4 + }, + "ok": true + }, + "f3db": { + "value": 81170780.0, + "spec": { + "min": 49720000.0 + }, + "ok": true + } + }, + "result": "runs/grid/C16/sky130/sW1_sL1/independent/result.json", + "geometry_hash": "bc1634c8eabc044f", + "area_um2": 377.2789 + }, + { + "key": "C16_sky130", + "role": "best_evaluated", + "condition": "TT_27C_VDD", + "status": "passed", + "measures": { + "vo1": 1.390164, + "vo2": 1.390164, + "idd": 4.000037e-05, + "vos_in": -7.00978e-05, + "gain_lf": 14.38679, + "f3db": 75554600.0, + "ugf": 390042800.0 + }, + "spec": { + "gain_lf": { + "value": 14.38679, + "spec": { + "min": 11.4 + }, + "ok": true + }, + "f3db": { + "value": 75554600.0, + "spec": { + "min": 49720000.0 + }, + "ok": true + } + }, + "result": "runs/selection/C16_sky130_sW1_sL1/c0c48e26e41e/result.json", + "geometry_hash": "00ddcc62ca7fb3c0", + "area_um2": 320.1602 + }, + { + "key": "C16_sky130", + "role": "best_evaluated", + "condition": "SS_27C_VDD", + "status": "passed", + "measures": { + "vo1": 1.390162, + "vo2": 1.390162, + "idd": 4.000057e-05, + "vos_in": -6.88573e-05, + "gain_lf": 13.4777, + "f3db": 74367430.0, + "ugf": 344319700.0 + }, + "spec": { + "gain_lf": { + "value": 13.4777, + "spec": { + "min": 11.4 + }, + "ok": true + }, + "f3db": { + "value": 74367430.0, + "spec": { + "min": 49720000.0 + }, + "ok": true + } + }, + "result": "runs/selection/C16_sky130_sW1_sL1/c0c48e26e41e/result.json", + "geometry_hash": "00ddcc62ca7fb3c0", + "area_um2": 320.1602 + }, + { + "key": "C16_sky130", + "role": "best_evaluated", + "condition": "FF_27C_VDD", + "status": "passed", + "measures": { + "vo1": 1.390165, + "vo2": 1.390165, + "idd": 4.000023e-05, + "vos_in": -7.04308e-05, + "gain_lf": 14.9129, + "f3db": 77067930.0, + "ugf": 423891500.0 + }, + "spec": { + "gain_lf": { + "value": 14.9129, + "spec": { + "min": 11.4 + }, + "ok": true + }, + "f3db": { + "value": 77067930.0, + "spec": { + "min": 49720000.0 + }, + "ok": true + } + }, + "result": "runs/selection/C16_sky130_sW1_sL1/c0c48e26e41e/result.json", + "geometry_hash": "00ddcc62ca7fb3c0", + "area_um2": 320.1602 + }, + { + "key": "C16_sky130", + "role": "best_evaluated", + "condition": "SS_85C_0.9VDD", + "status": "passed", + "measures": { + "vo1": 1.197464, + "vo2": 1.197464, + "idd": 4.000004e-05, + "vos_in": -6.71469e-05, + "gain_lf": 12.89267, + "f3db": 72019610.0, + "ugf": 310547700.0 + }, + "spec": { + "gain_lf": { + "value": 12.89267, + "spec": { + "min": 11.4 + }, + "ok": true + }, + "f3db": { + "value": 72019610.0, + "spec": { + "min": 49720000.0 + }, + "ok": true + } + }, + "result": "runs/selection/C16_sky130_sW1_sL1/c0c48e26e41e/result.json", + "geometry_hash": "00ddcc62ca7fb3c0", + "area_um2": 320.1602 + }, + { + "key": "C16_sky130", + "role": "best_evaluated", + "condition": "FF_m40C_1.1VDD", + "status": "passed", + "measures": { + "vo1": 1.580832, + "vo2": 1.580832, + "idd": 4.000308e-05, + "vos_in": -7.22965e-05, + "gain_lf": 15.71075, + "f3db": 79768010.0, + "ugf": 482214200.0 + }, + "spec": { + "gain_lf": { + "value": 15.71075, + "spec": { + "min": 11.4 + }, + "ok": true + }, + "f3db": { + "value": 79768010.0, + "spec": { + "min": 49720000.0 + }, + "ok": true + } + }, + "result": "runs/selection/C16_sky130_sW1_sL1/c0c48e26e41e/result.json", + "geometry_hash": "00ddcc62ca7fb3c0", + "area_um2": 320.1602 + }, + { + "key": "C16_gf180", + "role": "reference", + "condition": "TT_27C_VDD", + "status": "passed", + "measures": { + "vo1": 2.853843, + "vo2": 2.853843, + "idd": 4.00275e-05, + "vos_in": 2.357578e-05, + "gain_lf": 11.62277, + "f3db": 63334190.0, + "ugf": 233923200.0 + }, + "spec": { + "gain_lf": { + "value": 11.62277, + "spec": { + "min": 8.616 + }, + "ok": true + }, + "f3db": { + "value": 63334190.0, + "spec": { + "min": 41040000.0 + }, + "ok": true + } + }, + "result": "runs/grid/C16/gf180/sW1_sL1/independent/result.json", + "geometry_hash": "a5ada0153f64f8ad", + "area_um2": 1729.3648 + }, + { + "key": "C16_gf180", + "role": "reference", + "condition": "SS_27C_VDD", + "status": "passed", + "measures": { + "vo1": 2.853692, + "vo2": 2.853692, + "idd": 4.004105e-05, + "vos_in": 2.503722e-05, + "gain_lf": 11.13833, + "f3db": 63274250.0, + "ugf": 219922900.0 + }, + "spec": { + "gain_lf": { + "value": 11.13833, + "spec": { + "min": 8.616 + }, + "ok": true + }, + "f3db": { + "value": 63274250.0, + "spec": { + "min": 41040000.0 + }, + "ok": true + } + }, + "result": "runs/grid/C16/gf180/sW1_sL1/independent/result.json", + "geometry_hash": "a5ada0153f64f8ad", + "area_um2": 1729.3648 + }, + { + "key": "C16_gf180", + "role": "reference", + "condition": "FF_27C_VDD", + "status": "passed", + "measures": { + "vo1": 2.853953, + "vo2": 2.853953, + "idd": 4.001759e-05, + "vos_in": 2.223121e-05, + "gain_lf": 12.08807, + "f3db": 63404700.0, + "ugf": 247811800.0 + }, + "spec": { + "gain_lf": { + "value": 12.08807, + "spec": { + "min": 8.616 + }, + "ok": true + }, + "f3db": { + "value": 63404700.0, + "spec": { + "min": 41040000.0 + }, + "ok": true + } + }, + "result": "runs/grid/C16/gf180/sW1_sL1/independent/result.json", + "geometry_hash": "a5ada0153f64f8ad", + "area_um2": 1729.3648 + }, + { + "key": "C16_gf180", + "role": "reference", + "condition": "SS_85C_0.9VDD", + "status": "passed", + "measures": { + "vo1": 2.5255, + "vo2": 2.5255, + "idd": 4.000487e-05, + "vos_in": 2.847328e-05, + "gain_lf": 10.0598, + "f3db": 63246520.0, + "ugf": 191945200.0 + }, + "spec": { + "gain_lf": { + "value": 10.0598, + "spec": { + "min": 8.616 + }, + "ok": true + }, + "f3db": { + "value": 63246520.0, + "spec": { + "min": 41040000.0 + }, + "ok": true + } + }, + "result": "runs/grid/C16/gf180/sW1_sL1/independent/result.json", + "geometry_hash": "a5ada0153f64f8ad", + "area_um2": 1729.3648 + }, + { + "key": "C16_gf180", + "role": "reference", + "condition": "FF_m40C_1.1VDD", + "status": "passed", + "measures": { + "vo1": 3.178708, + "vo2": 3.178708, + "idd": 4.010731e-05, + "vos_in": 1.888013e-05, + "gain_lf": 13.62097, + "f3db": 63261900.0, + "ugf": 298133400.0 + }, + "spec": { + "gain_lf": { + "value": 13.62097, + "spec": { + "min": 8.616 + }, + "ok": true + }, + "f3db": { + "value": 63261900.0, + "spec": { + "min": 41040000.0 + }, + "ok": true + } + }, + "result": "runs/grid/C16/gf180/sW1_sL1/independent/result.json", + "geometry_hash": "a5ada0153f64f8ad", + "area_um2": 1729.3648 + }, + { + "key": "C16_gf180", + "role": "best_evaluated", + "condition": "TT_27C_VDD", + "status": "passed", + "measures": { + "vo1": 2.853846, + "vo2": 2.853846, + "idd": 4.002751e-05, + "vos_in": 2.536558e-05, + "gain_lf": 11.62144, + "f3db": 62001730.0, + "ugf": 228885100.0 + }, + "spec": { + "gain_lf": { + "value": 11.62144, + "spec": { + "min": 8.616 + }, + "ok": true + }, + "f3db": { + "value": 62001730.0, + "spec": { + "min": 41040000.0 + }, + "ok": true + } + }, + "result": "runs/selection/C16_gf180_sW1_sL1/c1905d32dbcf/result.json", + "geometry_hash": "a7195a0f8372f88f", + "area_um2": 1380.0232 + }, + { + "key": "C16_gf180", + "role": "best_evaluated", + "condition": "SS_27C_VDD", + "status": "passed", + "measures": { + "vo1": 2.853695, + "vo2": 2.853695, + "idd": 4.004105e-05, + "vos_in": 2.699111e-05, + "gain_lf": 11.13702, + "f3db": 61943860.0, + "ugf": 215399600.0 + }, + "spec": { + "gain_lf": { + "value": 11.13702, + "spec": { + "min": 8.616 + }, + "ok": true + }, + "f3db": { + "value": 61943860.0, + "spec": { + "min": 41040000.0 + }, + "ok": true + } + }, + "result": "runs/selection/C16_gf180_sW1_sL1/c1905d32dbcf/result.json", + "geometry_hash": "a7195a0f8372f88f", + "area_um2": 1380.0232 + }, + { + "key": "C16_gf180", + "role": "best_evaluated", + "condition": "FF_27C_VDD", + "status": "passed", + "measures": { + "vo1": 2.853957, + "vo2": 2.853957, + "idd": 4.001759e-05, + "vos_in": 2.387008e-05, + "gain_lf": 12.08672, + "f3db": 62069940.0, + "ugf": 242732600.0 + }, + "spec": { + "gain_lf": { + "value": 12.08672, + "spec": { + "min": 8.616 + }, + "ok": true + }, + "f3db": { + "value": 62069940.0, + "spec": { + "min": 41040000.0 + }, + "ok": true + } + }, + "result": "runs/selection/C16_gf180_sW1_sL1/c1905d32dbcf/result.json", + "geometry_hash": "a7195a0f8372f88f", + "area_um2": 1380.0232 + }, + { + "key": "C16_gf180", + "role": "best_evaluated", + "condition": "SS_85C_0.9VDD", + "status": "passed", + "measures": { + "vo1": 2.525503, + "vo2": 2.525503, + "idd": 4.000487e-05, + "vos_in": 3.087559e-05, + "gain_lf": 10.05867, + "f3db": 61910950.0, + "ugf": 187911800.0 + }, + "spec": { + "gain_lf": { + "value": 10.05867, + "spec": { + "min": 8.616 + }, + "ok": true + }, + "f3db": { + "value": 61910950.0, + "spec": { + "min": 41040000.0 + }, + "ok": true + } + }, + "result": "runs/selection/C16_gf180_sW1_sL1/c1905d32dbcf/result.json", + "geometry_hash": "a7195a0f8372f88f", + "area_um2": 1380.0232 + }, + { + "key": "C16_gf180", + "role": "best_evaluated", + "condition": "FF_m40C_1.1VDD", + "status": "passed", + "measures": { + "vo1": 3.178711, + "vo2": 3.178711, + "idd": 4.010732e-05, + "vos_in": 2.008492e-05, + "gain_lf": 13.61927, + "f3db": 61937190.0, + "ugf": 291797000.0 + }, + "spec": { + "gain_lf": { + "value": 13.61927, + "spec": { + "min": 8.616 + }, + "ok": true + }, + "f3db": { + "value": 61937190.0, + "spec": { + "min": 41040000.0 + }, + "ok": true + } + }, + "result": "runs/selection/C16_gf180_sW1_sL1/c1905d32dbcf/result.json", + "geometry_hash": "a7195a0f8372f88f", + "area_um2": 1380.0232 + }, + { + "key": "C16_ihp130", + "role": "reference", + "condition": "TT_27C_VDD", + "status": "passed", + "measures": { + "vo1": 0.9589611, + "vo2": 0.9589611, + "idd": 4e-05, + "vos_in": 5.395898e-05, + "gain_lf": 9.838062, + "f3db": 129108100.0, + "ugf": 380891900.0 + }, + "spec": { + "gain_lf": { + "value": 9.838062, + "spec": { + "min": 8.0 + }, + "ok": true + }, + "f3db": { + "value": 129108100.0, + "spec": { + "min": 83980000.0 + }, + "ok": true + } + }, + "result": "runs/grid/C16/ihp130/sW1_sL1/independent/result.json", + "geometry_hash": "a3358a6d5ec65e54", + "area_um2": 1007.736 + }, + { + "key": "C16_ihp130", + "role": "reference", + "condition": "SS_27C_VDD", + "status": "passed", + "measures": { + "vo1": 0.9589611, + "vo2": 0.9589611, + "idd": 4e-05, + "vos_in": 5.415247e-05, + "gain_lf": 9.913828, + "f3db": 128185800.0, + "ugf": 381852600.0 + }, + "spec": { + "gain_lf": { + "value": 9.913828, + "spec": { + "min": 8.0 + }, + "ok": true + }, + "f3db": { + "value": 128185800.0, + "spec": { + "min": 83980000.0 + }, + "ok": true + } + }, + "result": "runs/grid/C16/ihp130/sW1_sL1/independent/result.json", + "geometry_hash": "a3358a6d5ec65e54", + "area_um2": 1007.736 + }, + { + "key": "C16_ihp130", + "role": "reference", + "condition": "FF_27C_VDD", + "status": "passed", + "measures": { + "vo1": 0.9589611, + "vo2": 0.9589611, + "idd": 4e-05, + "vos_in": 5.313939e-05, + "gain_lf": 9.879677, + "f3db": 129881200.0, + "ugf": 385169900.0 + }, + "spec": { + "gain_lf": { + "value": 9.879677, + "spec": { + "min": 8.0 + }, + "ok": true + }, + "f3db": { + "value": 129881200.0, + "spec": { + "min": 83980000.0 + }, + "ok": true + } + }, + "result": "runs/grid/C16/ihp130/sW1_sL1/independent/result.json", + "geometry_hash": "a3358a6d5ec65e54", + "area_um2": 1007.736 + }, + { + "key": "C16_ihp130", + "role": "reference", + "condition": "SS_85C_0.9VDD", + "status": "passed", + "measures": { + "vo1": 0.836365, + "vo2": 0.836365, + "idd": 4e-05, + "vos_in": 6.03514e-05, + "gain_lf": 8.747818, + "f3db": 128795200.0, + "ugf": 329509200.0 + }, + "spec": { + "gain_lf": { + "value": 8.747818, + "spec": { + "min": 8.0 + }, + "ok": true + }, + "f3db": { + "value": 128795200.0, + "spec": { + "min": 83980000.0 + }, + "ok": true + } + }, + "result": "runs/grid/C16/ihp130/sW1_sL1/independent/result.json", + "geometry_hash": "a3358a6d5ec65e54", + "area_um2": 1007.736 + }, + { + "key": "C16_ihp130", + "role": "reference", + "condition": "FF_m40C_1.1VDD", + "status": "passed", + "measures": { + "vo1": 1.081161, + "vo2": 1.081161, + "idd": 4e-05, + "vos_in": 4.705988e-05, + "gain_lf": 11.16845, + "f3db": 128947500.0, + "ugf": 449717200.0 + }, + "spec": { + "gain_lf": { + "value": 11.16845, + "spec": { + "min": 8.0 + }, + "ok": true + }, + "f3db": { + "value": 128947500.0, + "spec": { + "min": 83980000.0 + }, + "ok": true + } + }, + "result": "runs/grid/C16/ihp130/sW1_sL1/independent/result.json", + "geometry_hash": "a3358a6d5ec65e54", + "area_um2": 1007.736 + }, + { + "key": "C16_ihp130", + "role": "best_evaluated", + "condition": "TT_27C_VDD", + "status": "passed", + "measures": { + "vo1": 0.9589611, + "vo2": 0.9589611, + "idd": 4e-05, + "vos_in": 5.39604e-05, + "gain_lf": 9.837875, + "f3db": 127797200.0, + "ugf": 377044400.0 + }, + "spec": { + "gain_lf": { + "value": 9.837875, + "spec": { + "min": 8.0 + }, + "ok": true + }, + "f3db": { + "value": 127797200.0, + "spec": { + "min": 83980000.0 + }, + "ok": true + } + }, + "result": "runs/selection/C16_ihp130_sW1_sL1/c0c48e26e41e/result.json", + "geometry_hash": "e464537a6c2cf371", + "area_um2": 880.2168 + }, + { + "key": "C16_ihp130", + "role": "best_evaluated", + "condition": "SS_27C_VDD", + "status": "passed", + "measures": { + "vo1": 0.9589611, + "vo2": 0.9589611, + "idd": 4e-05, + "vos_in": 5.415388e-05, + "gain_lf": 9.913641, + "f3db": 126883500.0, + "ugf": 378003500.0 + }, + "spec": { + "gain_lf": { + "value": 9.913641, + "spec": { + "min": 8.0 + }, + "ok": true + }, + "f3db": { + "value": 126883500.0, + "spec": { + "min": 83980000.0 + }, + "ok": true + } + }, + "result": "runs/selection/C16_ihp130_sW1_sL1/c0c48e26e41e/result.json", + "geometry_hash": "e464537a6c2cf371", + "area_um2": 880.2168 + }, + { + "key": "C16_ihp130", + "role": "best_evaluated", + "condition": "FF_27C_VDD", + "status": "passed", + "measures": { + "vo1": 0.9589611, + "vo2": 0.9589611, + "idd": 4e-05, + "vos_in": 5.314082e-05, + "gain_lf": 9.879489, + "f3db": 128562800.0, + "ugf": 381312900.0 + }, + "spec": { + "gain_lf": { + "value": 9.879489, + "spec": { + "min": 8.0 + }, + "ok": true + }, + "f3db": { + "value": 128562800.0, + "spec": { + "min": 83980000.0 + }, + "ok": true + } + }, + "result": "runs/selection/C16_ihp130_sW1_sL1/c0c48e26e41e/result.json", + "geometry_hash": "e464537a6c2cf371", + "area_um2": 880.2168 + }, + { + "key": "C16_ihp130", + "role": "best_evaluated", + "condition": "SS_85C_0.9VDD", + "status": "passed", + "measures": { + "vo1": 0.836365, + "vo2": 0.836365, + "idd": 4e-05, + "vos_in": 6.035284e-05, + "gain_lf": 8.747652, + "f3db": 127487900.0, + "ugf": 326107600.0 + }, + "spec": { + "gain_lf": { + "value": 8.747652, + "spec": { + "min": 8.0 + }, + "ok": true + }, + "f3db": { + "value": 127487900.0, + "spec": { + "min": 83980000.0 + }, + "ok": true + } + }, + "result": "runs/selection/C16_ihp130_sW1_sL1/c0c48e26e41e/result.json", + "geometry_hash": "e464537a6c2cf371", + "area_um2": 880.2168 + }, + { + "key": "C16_ihp130", + "role": "best_evaluated", + "condition": "FF_m40C_1.1VDD", + "status": "passed", + "measures": { + "vo1": 1.081161, + "vo2": 1.081161, + "idd": 4e-05, + "vos_in": 4.706128e-05, + "gain_lf": 11.16823, + "f3db": 127637500.0, + "ugf": 445078100.0 + }, + "spec": { + "gain_lf": { + "value": 11.16823, + "spec": { + "min": 8.0 + }, + "ok": true + }, + "f3db": { + "value": 127637500.0, + "spec": { + "min": 83980000.0 + }, + "ok": true + } + }, + "result": "runs/selection/C16_ihp130_sW1_sL1/c0c48e26e41e/result.json", + "geometry_hash": "e464537a6c2cf371", + "area_um2": 880.2168 + } + ], + "comparison_vs_reference": { + "combined": { + "co_pass": 51, + "co_fail": 9 + }, + "best_evaluated": { + "co_pass": 66, + "co_fail": 9 + } + }, + "note": "interconnect R/C extracted at nominal; device corners only; frozen nominal specs; no Monte Carlo" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/results/analysis/resim_after_testbench_fix.json b/benchmarks/textbook_sharing/results/analysis/resim_after_testbench_fix.json new file mode 100644 index 00000000..2fd51fad --- /dev/null +++ b/benchmarks/textbook_sharing/results/analysis/resim_after_testbench_fix.json @@ -0,0 +1,18 @@ +{ + "counts": { + "auto_passed->auto_passed": 2082, + "skipped_no_postsim": 592, + "unchanged_deck": 1041, + "spec_failed->auto_passed": 2 + }, + "status_changes": [ + [ + "runs/grid/C13/gf180/sW1_sL1/combined/result.json", + "spec_failed->auto_passed" + ], + [ + "runs/grid/C14/sky130/sW1.5_sL2/gate_only/result.json", + "spec_failed->auto_passed" + ] + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/results/analysis/review_connectivity_check.json b/benchmarks/textbook_sharing/results/analysis/review_connectivity_check.json new file mode 100644 index 00000000..45f293e1 --- /dev/null +++ b/benchmarks/textbook_sharing/results/analysis/review_connectivity_check.json @@ -0,0 +1,90 @@ +{ + "6b65d9a50aa6e509c1e8": { + "components": 3, + "floating_components": [], + "gate_pads": 9, + "gate_pads_without_via1": 0, + "met2_without_via2": [], + "run": "runs/grid/C11/gf180/sW2_sL1/combined", + "drc": "passed", + "lvs": "passed", + "primary_status": "auto_passed" + }, + "7bf147b383aedb270085": { + "components": 3, + "floating_components": [], + "gate_pads": 12, + "gate_pads_without_via1": 0, + "met2_without_via2": [], + "run": "runs/grid/C11/gf180/sW1_sL2/independent", + "drc": "passed", + "lvs": "passed", + "primary_status": "auto_passed" + }, + "a092e520a90160c0ac5f": { + "components": 3, + "floating_components": [], + "gate_pads": 9, + "gate_pads_without_via1": 0, + "met2_without_via2": [], + "run": "runs/grid/C11/gf180/sW2_sL1.5/gate_only", + "drc": "passed", + "lvs": "passed", + "primary_status": "auto_passed" + }, + "6a8d28e5d3967992e782": { + "components": 3, + "floating_components": [], + "gate_pads": 12, + "gate_pads_without_via1": 0, + "met2_without_via2": [], + "run": "runs/grid/C11/gf180/sW2_sL2/independent", + "drc": "passed", + "lvs": "passed", + "primary_status": "auto_passed" + }, + "e7658776110d82fb2d02": { + "components": 3, + "floating_components": [], + "gate_pads": 2, + "gate_pads_without_via1": 0, + "met2_without_via2": [], + "run": "runs/grid/C04/gf180/sW1_sL1/independent", + "drc": "passed", + "lvs": "passed", + "primary_status": "auto_passed" + }, + "9bde12205a844615c348": { + "components": 1, + "floating_components": [], + "gate_pads": 2, + "gate_pads_without_via1": 0, + "met2_without_via2": [], + "run": "runs/grid/C13/sky130/sW1_sL1.5/combined", + "drc": "passed", + "lvs": "passed", + "primary_status": "auto_passed" + }, + "c8631f26b95b75f3bd08": { + "components": 4, + "floating_components": [], + "gate_pads": 4, + "gate_pads_without_via1": 0, + "met2_without_via2": [], + "run": "runs/grid/C08/sky130/sW1_sL1/combined", + "drc": "passed", + "lvs": "passed", + "primary_status": "auto_passed" + }, + "ccee6d68a66d4beceba1": { + "components": 4, + "floating_components": [], + "gate_pads": 4, + "gate_pads_without_via1": 0, + "met2_without_via2": [], + "run": "runs/selection/C08_sky130_sW2_sL1/c443ef38398f", + "drc": "passed", + "lvs": "passed", + "primary_status": "auto_passed" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/results/analysis/review_coverage.json b/benchmarks/textbook_sharing/results/analysis/review_coverage.json new file mode 100644 index 00000000..c9e54111 --- /dev/null +++ b/benchmarks/textbook_sharing/results/analysis/review_coverage.json @@ -0,0 +1,27 @@ +{ + "main_grid": { + "n": 1612, + "group_effective": { + "pass": 1612 + }, + "not_pass": [] + }, + "reported": { + "n": 456, + "group_effective": { + "pass": 456 + }, + "not_pass": [] + }, + "pvt_targets": { + "n": 42, + "group_effective": { + "pass": 42 + }, + "not_pass": [] + }, + "all_records_effective": { + "pass": 2848, + "review_pending": 3311 + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/results/analysis/review_gate_pad_check.json b/benchmarks/textbook_sharing/results/analysis/review_gate_pad_check.json new file mode 100644 index 00000000..bf1fa809 --- /dev/null +++ b/benchmarks/textbook_sharing/results/analysis/review_gate_pad_check.json @@ -0,0 +1,130 @@ +{ + "f0bb56594d7e78f6fd78": { + "gate_contacts": 2, + "wired_to_via1": 2, + "unwired": [], + "run": "runs/grid/C13/gf180/sW1.5_sL1.5/combined", + "drc": "passed", + "lvs": "passed" + }, + "a233abd35c3f024cbdcd": { + "gate_contacts": 2, + "wired_to_via1": 2, + "unwired": [], + "run": "runs/grid/C13/gf180/sW2_sL2/combined", + "drc": "passed", + "lvs": "passed" + }, + "25867fe51ca293ac2bd9": { + "gate_contacts": 2, + "wired_to_via1": 2, + "unwired": [], + "run": "runs/grid/C02/ihp130/sW1.5_sL1/combined", + "drc": "passed", + "lvs": "passed" + }, + "e95e0541581395f59adc": { + "gate_contacts": 5, + "wired_to_via1": 5, + "unwired": [], + "run": "runs/selection/C09_sky130_sW2_sL1/c273ec38a57d", + "drc": "passed", + "lvs": "passed" + }, + "468c5dc1b3eefad11192": { + "gate_contacts": 2, + "wired_to_via1": 2, + "unwired": [], + "run": "runs/selection/C02_sky130_sW2_sL2/c3dfd5a42932", + "drc": "passed", + "lvs": "passed" + }, + "4b0af1fafd7c3d226ab8": { + "gate_contacts": 2, + "wired_to_via1": 2, + "unwired": [], + "run": "runs/selection/C02_ihp130_sW1_sL2/c125515c9382", + "drc": "passed", + "lvs": "passed" + }, + "0addf071b40180293465": { + "gate_contacts": 5, + "wired_to_via1": 5, + "unwired": [], + "run": "runs/selection/C08_sky130_sW1_sL1/c8c9a152a80c", + "drc": "passed", + "lvs": "passed" + }, + "9437838d3523885885f7": { + "gate_contacts": 5, + "wired_to_via1": 5, + "unwired": [], + "run": "runs/selection/C08_sky130_sW2_sL2/c169f3570210", + "drc": "passed", + "lvs": "passed" + }, + "c3ed6278f868ceba1882": { + "gate_contacts": 5, + "wired_to_via1": 5, + "unwired": [], + "run": "runs/selection/C08_sky130_sW2_sL2/cb96a10867e8", + "drc": "passed", + "lvs": "passed" + }, + "376bb34871184bc75cef": { + "gate_contacts": 4, + "wired_to_via1": 4, + "unwired": [], + "run": "runs/selection/C08_sky130_sW2_sL2/c34a528ae7f1", + "drc": "passed", + "lvs": "passed" + }, + "f8e8092d1308b514ad03": { + "gate_contacts": 2, + "wired_to_via1": 2, + "unwired": [], + "run": "runs/selection/C02_sky130_sW2_sL1/c92dbf630ab4", + "drc": "passed", + "lvs": "passed" + }, + "e702e1eb829b642b8fdb": { + "gate_contacts": 2, + "wired_to_via1": 2, + "unwired": [], + "run": "runs/selection/C02_sky130_sW2_sL1/cb5fd06efa8c", + "drc": "passed", + "lvs": "passed" + }, + "9ae332d07a2274d9f19a": { + "gate_contacts": 5, + "wired_to_via1": 5, + "unwired": [], + "run": "runs/selection/C08_gf180_sW1_sL1/cc4838ac16fb", + "drc": "passed", + "lvs": "passed" + }, + "13212cf18b13a0818780": { + "gate_contacts": 2, + "wired_to_via1": 2, + "unwired": [], + "run": "runs/selection/C02_sky130_sW1_sL1/cf5fc7c0ae10", + "drc": "passed", + "lvs": "passed" + }, + "a9bf479af933db29c085": { + "gate_contacts": 2, + "wired_to_via1": 2, + "unwired": [], + "run": "runs/selection/C02_sky130_sW1_sL1/c9d3046021c9", + "drc": "passed", + "lvs": "passed" + }, + "a6a9b3cda93e1f5d812f": { + "gate_contacts": 5, + "wired_to_via1": 5, + "unwired": [], + "run": "runs/selection/C08_sky130_sW2_sL1/ce4ae2fe99b7", + "drc": "passed", + "lvs": "passed" + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/results/analysis/running_example.json b/benchmarks/textbook_sharing/results/analysis/running_example.json new file mode 100644 index 00000000..65194b60 --- /dev/null +++ b/benchmarks/textbook_sharing/results/analysis/running_example.json @@ -0,0 +1,439 @@ +{ + "task": "C08_sky130_sW1_sL1", + "steps": [ + { + "candidate": "c1ebe43136e1", + "decision": "unshared reference", + "status": "auto_passed", + "visual_review": "pass", + "area_um2": 256.0048, + "width_um": 18.605, + "height_um": 13.76, + "rows": [ + { + "kind": "n", + "width_um": 15.83, + "height_um": 3.565 + }, + { + "kind": "p", + "width_um": 5.93, + "height_um": 3.565 + } + ], + "channel_heights_um": [ + 1.88, + 4.32, + 1.88 + ], + "groups": [ + { + "devices": [ + "M1", + "M2", + "M3" + ], + "shared_diffusion_nets": [], + "gate_straps": [ + { + "fingers": 8, + "side": "bottom", + "pad_end": "left" + }, + { + "fingers": 8, + "side": "bottom", + "pad_end": "left" + }, + { + "fingers": 8, + "side": "bottom", + "pad_end": "left" + } + ], + "shared_gate_conductors": [], + "active_islands": 3 + }, + { + "devices": [ + "M4", + "M5" + ], + "shared_diffusion_nets": [], + "gate_straps": [ + { + "fingers": 4, + "side": "bottom", + "pad_end": "left" + }, + { + "fingers": 4, + "side": "bottom", + "pad_end": "left" + } + ], + "shared_gate_conductors": [], + "active_islands": 2 + } + ], + "gain_db": 31.89302, + "ugf_hz": 32196720.0, + "change_vs_unshared": 0.0 + }, + { + "candidate": "cc0a97e9039c", + "decision": "group 0 shares its net23 diffusion nodes", + "status": "auto_passed", + "visual_review": "pass", + "area_um2": 240.5936, + "width_um": 17.485, + "height_um": 13.76, + "rows": [ + { + "kind": "n", + "width_um": 14.71, + "height_um": 3.565 + }, + { + "kind": "p", + "width_um": 5.93, + "height_um": 3.565 + } + ], + "channel_heights_um": [ + 1.88, + 4.32, + 1.88 + ], + "groups": [ + { + "devices": [ + "M1", + "M2", + "M3" + ], + "shared_diffusion_nets": [ + "net23", + "net23" + ], + "gate_straps": [ + { + "fingers": 8, + "side": "bottom", + "pad_end": "right" + }, + { + "fingers": 8, + "side": "bottom", + "pad_end": "right" + }, + { + "fingers": 8, + "side": "bottom", + "pad_end": "right" + } + ], + "shared_gate_conductors": [], + "active_islands": 1 + }, + { + "devices": [ + "M4", + "M5" + ], + "shared_diffusion_nets": [], + "gate_straps": [ + { + "fingers": 4, + "side": "bottom", + "pad_end": "left" + }, + { + "fingers": 4, + "side": "bottom", + "pad_end": "left" + } + ], + "shared_gate_conductors": [], + "active_islands": 2 + } + ], + "gain_db": 31.8982, + "ugf_hz": 32150780.0, + "change_vs_unshared": -0.0602 + }, + { + "candidate": "c051fabe4412", + "decision": "group 1 also shares its VDD node (side case)", + "status": "auto_passed", + "visual_review": "pass", + "area_um2": 240.5936, + "width_um": 17.485, + "height_um": 13.76, + "rows": [ + { + "kind": "n", + "width_um": 14.71, + "height_um": 3.565 + }, + { + "kind": "p", + "width_um": 5.37, + "height_um": 3.565 + } + ], + "channel_heights_um": [ + 1.88, + 4.32, + 1.88 + ], + "groups": [ + { + "devices": [ + "M1", + "M2", + "M3" + ], + "shared_diffusion_nets": [ + "net23", + "net23" + ], + "gate_straps": [ + { + "fingers": 8, + "side": "bottom", + "pad_end": "left" + }, + { + "fingers": 8, + "side": "bottom", + "pad_end": "left" + }, + { + "fingers": 8, + "side": "bottom", + "pad_end": "left" + } + ], + "shared_gate_conductors": [], + "active_islands": 1 + }, + { + "devices": [ + "M4", + "M5" + ], + "shared_diffusion_nets": [ + "VDD" + ], + "gate_straps": [ + { + "fingers": 4, + "side": "bottom", + "pad_end": "right" + }, + { + "fingers": 4, + "side": "bottom", + "pad_end": "right" + } + ], + "shared_gate_conductors": [], + "active_islands": 1 + } + ], + "gain_db": 31.87944, + "ugf_hz": 32160780.0, + "change_vs_unshared": -0.0602 + }, + { + "candidate": "cd7b91d3467f", + "decision": "group 1 shares VDD and drives both gates (net22) with one strap", + "status": "auto_passed", + "visual_review": "pass", + "area_um2": 231.1517, + "width_um": 17.485, + "height_um": 13.22, + "rows": [ + { + "kind": "n", + "width_um": 14.71, + "height_um": 3.565 + }, + { + "kind": "p", + "width_um": 5.37, + "height_um": 3.025 + } + ], + "channel_heights_um": [ + 1.88, + 4.32, + 1.88 + ], + "groups": [ + { + "devices": [ + "M1", + "M2", + "M3" + ], + "shared_diffusion_nets": [ + "net23", + "net23" + ], + "gate_straps": [ + { + "fingers": 8, + "side": "bottom", + "pad_end": "right" + }, + { + "fingers": 8, + "side": "bottom", + "pad_end": "right" + }, + { + "fingers": 8, + "side": "bottom", + "pad_end": "right" + } + ], + "shared_gate_conductors": [], + "active_islands": 1 + }, + { + "devices": [ + "M4", + "M5" + ], + "shared_diffusion_nets": [ + "VDD" + ], + "gate_straps": [ + { + "fingers": 8, + "side": "bottom", + "pad_end": "left" + } + ], + "shared_gate_conductors": [ + [ + "M4", + "M5" + ] + ], + "active_islands": 1 + } + ], + "gain_db": 31.87944, + "ugf_hz": 32160920.0, + "change_vs_unshared": -0.09708 + }, + { + "candidate": "c15f7f08c7b4", + "decision": "that strap is turned toward the middle channel", + "status": "auto_passed", + "visual_review": "pass", + "area_um2": 196.0921, + "width_um": 16.43, + "height_um": 11.935, + "rows": [ + { + "kind": "n", + "width_um": 14.71, + "height_um": 3.565 + }, + { + "kind": "p", + "width_um": 5.81, + "height_um": 2.675 + } + ], + "channel_heights_um": [ + 1.88, + 4.32, + 0.0 + ], + "groups": [ + { + "devices": [ + "M1", + "M2", + "M3" + ], + "shared_diffusion_nets": [ + "net23", + "net23" + ], + "gate_straps": [ + { + "fingers": 8, + "side": "bottom", + "pad_end": "left" + }, + { + "fingers": 8, + "side": "bottom", + "pad_end": "left" + }, + { + "fingers": 8, + "side": "bottom", + "pad_end": "left" + } + ], + "shared_gate_conductors": [], + "active_islands": 1 + }, + { + "devices": [ + "M4", + "M5" + ], + "shared_diffusion_nets": [ + "VDD" + ], + "gate_straps": [ + { + "fingers": 8, + "side": "top", + "pad_end": "right" + } + ], + "shared_gate_conductors": [ + [ + "M4", + "M5" + ] + ], + "active_islands": 1 + } + ], + "gain_db": 31.87999, + "ugf_hz": 32159530.0, + "change_vs_unshared": -0.23403 + } + ], + "plan_space": { + "plans_per_group": [ + 10, + 101 + ], + "plans": 1010, + "catalogue_size": 64 + }, + "named_mode_combined": { + "area_um2": 245.9581, + "status": "auto_passed", + "unshared_groups": [ + 0 + ], + "change_vs_unshared": -0.03924, + "above_best": 0.2543 + }, + "specs": { + "gain_db_min": 28.85, + "ugf_hz_min": 20130000.0 + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/results/analysis/scope_audit.json b/benchmarks/textbook_sharing/results/analysis/scope_audit.json new file mode 100644 index 00000000..41f16366 --- /dev/null +++ b/benchmarks/textbook_sharing/results/analysis/scope_audit.json @@ -0,0 +1,540 @@ +{ + "task_sets": { + "designed_selection": 72, + "dropped": { + "C08_ihp130_sW2_sL1": "schematic_not_qualified: gain_lf=24.94 below floor 25", + "C09_sky130_sW1_sL2": "schematic_not_qualified: gain_lf=13.57 below floor 35; ugf=2.635e+05 below floor 2e+06", + "C09_sky130_sW2_sL2": "schematic_not_qualified: gain_lf=27.56 below floor 35; ugf=5.326e+05 below floor 2e+06", + "C09_gf180_sW1_sL2": "schematic_not_qualified: ugf=7.508e+05 below floor 2e+06", + "C18_sky130_sW1_sL1": "schematic_not_qualified: servo did not reach the output target: vout0=0.9644481 target=0.9 (tol 0.036 V); thd_pct=51.71 above floor 3; out_swing=0 below floor 0.45", + "C18_sky130_sW1_sL2": "schematic_not_qualified: servo did not reach the output target: vout0=0.999616 target=0.9 (tol 0.036 V); thd_pct=43.08 above floor 3; out_swing=0 below floor 0.45", + "C18_sky130_sW2_sL1": "schematic_not_qualified: servo did not reach the output target: vout0=0.96461 target=0.9 (tol 0.036 V); thd_pct=52.88 above floor 3; out_swing=0 below floor 0.45", + "C18_sky130_sW2_sL2": "schematic_not_qualified: servo did not reach the output target: vout0=1.008435 target=0.9 (tol 0.036 V); thd_pct=44.53 above floor 3; out_swing=0 below floor 0.45", + "C18_gf180_sW1_sL1": "schematic_not_qualified: thd_pct=32.9 above floor 3; out_swing=0.4151 below floor 0.825", + "C18_gf180_sW1_sL2": "schematic_not_qualified: thd_pct=21.38 above floor 3; out_swing=0 below floor 0.825", + "C18_gf180_sW2_sL1": "schematic_not_qualified: thd_pct=26.61 above floor 3; out_swing=0.2552 below floor 0.825", + "C18_gf180_sW2_sL2": "schematic_not_qualified: thd_pct=42.28 above floor 3; out_swing=0 below floor 0.825", + "C18_ihp130_sW1_sL1": "schematic_not_qualified: thd_pct=31.41 above floor 3; out_swing=0.1982 below floor 0.3", + "C18_ihp130_sW1_sL2": "schematic_not_qualified: thd_pct=56.22 above floor 3; out_swing=0 below floor 0.3", + "C18_ihp130_sW2_sL1": "schematic_not_qualified: thd_pct=22.86 above floor 3; out_swing=0.1709 below floor 0.3", + "C18_ihp130_sW2_sL2": "schematic_not_qualified: thd_pct=31.05 above floor 3; out_swing=0.2425 below floor 0.3" + }, + "selection": 56, + "selection_topologies": [ + "C02", + "C08", + "C09", + "C11", + "C16" + ], + "model_tasks": 28, + "model_tasks_rule": "selection tasks at sW = 2 (sL 1 and 2)", + "model_tasks_ok": true, + "interface_tasks": 14, + "interface_tasks_rule": "model tasks at sW2_sL1", + "interface_tasks_ok": true + }, + "model_tasks": [ + "C02_gf180_sW2_sL1", + "C02_gf180_sW2_sL2", + "C02_ihp130_sW2_sL1", + "C02_ihp130_sW2_sL2", + "C02_sky130_sW2_sL1", + "C02_sky130_sW2_sL2", + "C08_gf180_sW2_sL1", + "C08_gf180_sW2_sL2", + "C08_ihp130_sW2_sL2", + "C08_sky130_sW2_sL1", + "C08_sky130_sW2_sL2", + "C09_gf180_sW2_sL1", + "C09_gf180_sW2_sL2", + "C09_ihp130_sW2_sL1", + "C09_ihp130_sW2_sL2", + "C09_sky130_sW2_sL1", + "C11_gf180_sW2_sL1", + "C11_gf180_sW2_sL2", + "C11_ihp130_sW2_sL1", + "C11_ihp130_sW2_sL2", + "C11_sky130_sW2_sL1", + "C11_sky130_sW2_sL2", + "C16_gf180_sW2_sL1", + "C16_gf180_sW2_sL2", + "C16_ihp130_sW2_sL1", + "C16_ihp130_sW2_sL2", + "C16_sky130_sW2_sL1", + "C16_sky130_sW2_sL2" + ], + "interface_tasks": [ + "C02_gf180_sW2_sL1", + "C02_ihp130_sW2_sL1", + "C02_sky130_sW2_sL1", + "C08_gf180_sW2_sL1", + "C08_sky130_sW2_sL1", + "C09_gf180_sW2_sL1", + "C09_ihp130_sW2_sL1", + "C09_sky130_sW2_sL1", + "C11_gf180_sW2_sL1", + "C11_ihp130_sW2_sL1", + "C11_sky130_sW2_sL1", + "C16_gf180_sW2_sL1", + "C16_ihp130_sW2_sL1", + "C16_sky130_sW2_sL1" + ], + "best_known_source": { + "model proposal": 16, + "catalogue": 12 + }, + "best_known_found_by": { + "C02_gf180_sW2_sL1": [ + "anthropic_claude-sonnet" + ], + "C02_gf180_sW2_sL2": [ + "openai_gpt-6.1-sol" + ], + "C02_ihp130_sW2_sL1": [ + "anthropic_claude-sonnet" + ], + "C02_ihp130_sW2_sL2": [ + "openai_gpt-6.1-sol" + ], + "C02_sky130_sW2_sL1": [ + "anthropic_claude-sonnet", + "openai_gpt-6.1-sol" + ], + "C02_sky130_sW2_sL2": [ + "openai_gpt-6.1-sol" + ], + "C09_gf180_sW2_sL1": [ + "anthropic_claude-sonnet" + ], + "C09_gf180_sW2_sL2": [ + "anthropic_claude-sonnet" + ], + "C09_ihp130_sW2_sL1": [ + "anthropic_claude-sonnet", + "openai_gpt-6.1-sol" + ], + "C09_ihp130_sW2_sL2": [ + "openai_gpt-6.1-sol" + ], + "C09_sky130_sW2_sL1": [ + "openai_gpt-6.1-sol" + ], + "C11_gf180_sW2_sL1": [ + "openai_gpt-6.1-sol" + ], + "C11_gf180_sW2_sL2": [ + "openai_gpt-6.1-sol" + ], + "C11_ihp130_sW2_sL1": [ + "anthropic_claude-sonnet" + ], + "C11_ihp130_sW2_sL2": [ + "anthropic_claude-sonnet" + ], + "C11_sky130_sW2_sL1": [ + "openai_gpt-6.1-sol" + ] + }, + "best_known_by_task": { + "C02_gf180_sW2_sL1": { + "catalogue_best": 428.6832, + "best_known": 299.9124, + "source": "model proposal", + "reference": 508.032 + }, + "C02_gf180_sW2_sL2": { + "catalogue_best": 610.0336, + "best_known": 431.4452, + "source": "model proposal", + "reference": 718.7712 + }, + "C02_ihp130_sW2_sL1": { + "catalogue_best": 245.6044, + "best_known": 177.2059, + "source": "model proposal", + "reference": 290.2001 + }, + "C02_ihp130_sW2_sL2": { + "catalogue_best": 368.9068, + "best_known": 347.3887, + "source": "model proposal", + "reference": 433.4705 + }, + "C02_sky130_sW2_sL1": { + "catalogue_best": 184.209, + "best_known": 170.1103, + "source": "model proposal", + "reference": 218.2609 + }, + "C02_sky130_sW2_sL2": { + "catalogue_best": 258.465, + "best_known": 179.2095, + "source": "model proposal", + "reference": 303.9409 + }, + "C08_gf180_sW2_sL1": { + "catalogue_best": 897.1494, + "best_known": 897.1494, + "source": "catalogue", + "reference": 1084.4544 + }, + "C08_gf180_sW2_sL2": { + "catalogue_best": 1324.2726, + "best_known": 1324.2726, + "source": "catalogue", + "reference": 1574.208 + }, + "C08_ihp130_sW2_sL2": { + "catalogue_best": 678.9465, + "best_known": 678.9465, + "source": "catalogue", + "reference": 792.3475 + }, + "C08_sky130_sW2_sL1": { + "catalogue_best": 365.0917, + "best_known": 365.0917, + "source": "catalogue", + "reference": 450.8464 + }, + "C08_sky130_sW2_sL2": { + "catalogue_best": 536.9556, + "best_known": 536.9556, + "source": "catalogue", + "reference": 648.9904 + }, + "C09_gf180_sW2_sL1": { + "catalogue_best": 1479.475, + "best_known": 1424.319, + "source": "model proposal", + "reference": 1765.1568 + }, + "C09_gf180_sW2_sL2": { + "catalogue_best": 2163.6606, + "best_known": 2104.7238, + "source": "model proposal", + "reference": 2561.5216 + }, + "C09_ihp130_sW2_sL1": { + "catalogue_best": 2372.7011, + "best_known": 2365.4923, + "source": "model proposal", + "reference": 2752.5063 + }, + "C09_ihp130_sW2_sL2": { + "catalogue_best": 3313.5267, + "best_known": 3217.4321, + "source": "model proposal", + "reference": 3834.1063 + }, + "C09_sky130_sW2_sL1": { + "catalogue_best": 2235.4563, + "best_known": 2227.4063, + "source": "model proposal", + "reference": 2635.2197 + }, + "C11_gf180_sW2_sL1": { + "catalogue_best": 3952.806, + "best_known": 3710.0245, + "source": "model proposal", + "reference": 4388.818 + }, + "C11_gf180_sW2_sL2": { + "catalogue_best": 5755.7148, + "best_known": 5529.3909, + "source": "model proposal", + "reference": 6337.6852 + }, + "C11_ihp130_sW2_sL1": { + "catalogue_best": 2179.5062, + "best_known": 2102.6586, + "source": "model proposal", + "reference": 2403.5617 + }, + "C11_ihp130_sW2_sL2": { + "catalogue_best": 2973.983, + "best_known": 2877.5218, + "source": "model proposal", + "reference": 3250.3609 + }, + "C11_sky130_sW2_sL1": { + "catalogue_best": 1874.8403, + "best_known": 1775.9815, + "source": "model proposal", + "reference": 2078.5433 + }, + "C11_sky130_sW2_sL2": { + "catalogue_best": 2707.972, + "best_known": 2707.972, + "source": "catalogue", + "reference": 2978.1832 + }, + "C16_gf180_sW2_sL1": { + "catalogue_best": 1380.0232, + "best_known": 1380.0232, + "source": "catalogue", + "reference": 1729.3648 + }, + "C16_gf180_sW2_sL2": { + "catalogue_best": 1380.0232, + "best_known": 1380.0232, + "source": "catalogue", + "reference": 1729.3648 + }, + "C16_ihp130_sW2_sL1": { + "catalogue_best": 880.2168, + "best_known": 880.2168, + "source": "catalogue", + "reference": 1007.736 + }, + "C16_ihp130_sW2_sL2": { + "catalogue_best": 823.86, + "best_known": 823.86, + "source": "catalogue", + "reference": 1007.736 + }, + "C16_sky130_sW2_sL1": { + "catalogue_best": 320.1602, + "best_known": 320.1602, + "source": "catalogue", + "reference": 377.2789 + }, + "C16_sky130_sW2_sL2": { + "catalogue_best": 297.6085, + "best_known": 297.6085, + "source": "catalogue", + "reference": 377.2789 + } + }, + "same_task_comparison_model_tasks": { + "fixed_mode": { + "1 ver.": { + "vs_catalogue_best": 0.12678550947762657, + "vs_best_known": 0.20074843132664394 + }, + "2 ver.": { + "vs_catalogue_best": 0.1249405760957976, + "vs_best_known": 0.1987505903179964 + }, + "4 ver.": { + "vs_catalogue_best": 0.12448440213201542, + "vs_best_known": 0.19828665108939253 + }, + "8 ver.": { + "vs_catalogue_best": 0.09455125047499409, + "vs_best_known": 0.16816654656653945 + }, + "16 ver.": { + "vs_catalogue_best": 0.0697154650913907, + "vs_best_known": 0.1428277057278827 + } + }, + "share_most": { + "1 ver.": { + "vs_catalogue_best": 0.25500949808505513, + "vs_best_known": 0.3376003185828833 + }, + "2 ver.": { + "vs_catalogue_best": 0.24724043867789358, + "vs_best_known": 0.3298152517059936 + }, + "4 ver.": { + "vs_catalogue_best": 0.21446087767906738, + "vs_best_known": 0.2961307729603807 + }, + "8 ver.": { + "vs_catalogue_best": 0.12100160662096499, + "vs_best_known": 0.19456127437334686 + }, + "16 ver.": { + "vs_catalogue_best": 0.0719270625165671, + "vs_best_known": 0.145003608309259 + } + }, + "cost_rank": { + "1 ver.": { + "vs_catalogue_best": 0.01261217038451147, + "vs_best_known": 0.08525624959295984 + }, + "2 ver.": { + "vs_catalogue_best": 0.009593625517753208, + "vs_best_known": 0.08200558826648846 + }, + "4 ver.": { + "vs_catalogue_best": 0.0, + "vs_best_known": 0.07241196274873525 + }, + "8 ver.": { + "vs_catalogue_best": 0.0, + "vs_best_known": 0.07241196274873525 + }, + "16 ver.": { + "vs_catalogue_best": 0.0, + "vs_best_known": 0.07241196274873525 + } + }, + "geometry_first": { + "1 ver.": { + "vs_catalogue_best": 0.0, + "vs_best_known": 0.07241196274873525 + }, + "2 ver.": { + "vs_catalogue_best": 0.0, + "vs_best_known": 0.07241196274873525 + }, + "4 ver.": { + "vs_catalogue_best": 0.0, + "vs_best_known": 0.07241196274873525 + }, + "8 ver.": { + "vs_catalogue_best": 0.0, + "vs_best_known": 0.07241196274873525 + }, + "16 ver.": { + "vs_catalogue_best": 0.0, + "vs_best_known": 0.07241196274873525 + } + }, + "random": { + "1 ver.": { + "vs_catalogue_best": 0.2209364603182384, + "vs_best_known": 0.3163839906483041 + }, + "2 ver.": { + "vs_catalogue_best": 0.1508259865654037, + "vs_best_known": 0.23778570435273788 + }, + "4 ver.": { + "vs_catalogue_best": 0.1009226988759447, + "vs_best_known": 0.18017229260830991 + }, + "8 ver.": { + "vs_catalogue_best": 0.07111230417161883, + "vs_best_known": 0.14779414144983052 + }, + "16 ver.": { + "vs_catalogue_best": 0.03190610100581273, + "vs_best_known": 0.10496928331449115 + } + }, + "neighbourhood": { + "1 ver.": { + "vs_catalogue_best": 0.17580150773080114, + "vs_best_known": 0.2606713586456354 + }, + "2 ver.": { + "vs_catalogue_best": 0.1333351491314286, + "vs_best_known": 0.20821342240227295 + }, + "4 ver.": { + "vs_catalogue_best": 0.1289623618651815, + "vs_best_known": 0.20377866925290677 + }, + "8 ver.": { + "vs_catalogue_best": 0.07025541469889066, + "vs_best_known": 0.1449432522830883 + }, + "16 ver.": { + "vs_catalogue_best": 0.05228227761276887, + "vs_best_known": 0.12570336360989398 + } + }, + "baseline_independent": { + "1 ver.": { + "vs_catalogue_best": 0.17580150773080114, + "vs_best_known": 0.2606713586456354 + }, + "2 ver.": { + "vs_catalogue_best": 0.17580150773080114, + "vs_best_known": 0.2606713586456354 + }, + "4 ver.": { + "vs_catalogue_best": 0.17580150773080114, + "vs_best_known": 0.2606713586456354 + }, + "8 ver.": { + "vs_catalogue_best": 0.17580150773080114, + "vs_best_known": 0.2606713586456354 + }, + "16 ver.": { + "vs_catalogue_best": 0.17580150773080114, + "vs_best_known": 0.2606713586456354 + } + }, + "openai_gpt-6.1-sol": { + "1 prop.": { + "vs_catalogue_best": 0.1420397169615761, + "vs_best_known": 0.2234717282272301, + "sessions": 84 + }, + "2 prop.": { + "vs_catalogue_best": 0.13175841665348006, + "vs_best_known": 0.212559695753069, + "sessions": 84 + }, + "4 prop.": { + "vs_catalogue_best": 0.07900799778148403, + "vs_best_known": 0.15290872298311858, + "sessions": 84 + }, + "8 prop.": { + "vs_catalogue_best": 0.010123149619268097, + "vs_best_known": 0.07507825075077348, + "sessions": 84 + }, + "sessions_below_catalogue_best": 34, + "sessions_equal": 20, + "sessions_above": 30 + }, + "anthropic_claude-sonnet": { + "1 prop.": { + "vs_catalogue_best": 0.13068729637417842, + "vs_best_known": 0.20790049203903674, + "sessions": 84 + }, + "2 prop.": { + "vs_catalogue_best": 0.1164485148750518, + "vs_best_known": 0.19081995896639076, + "sessions": 84 + }, + "4 prop.": { + "vs_catalogue_best": 0.09846253796120705, + "vs_best_known": 0.17102840477617529, + "sessions": 84 + }, + "8 prop.": { + "vs_catalogue_best": 0.0702910354765989, + "vs_best_known": 0.13929124940545445, + "sessions": 84 + }, + "sessions_below_catalogue_best": 21, + "sessions_equal": 2, + "sessions_above": 61 + }, + "unshared reference": { + "vs_catalogue_best": 0.17580150773080114, + "vs_best_known": 0.2606713586456354 + } + }, + "interface_comparison": { + "sharing interface": { + "sessions": 42, + "vs_reference": -0.13086085989584026, + "vs_catalogue_best": 0.022024376135003514, + "vs_best_known": 0.09311061911307013, + "sessions_equal_to_reference": 4 + }, + "base-gLayout interface": { + "sessions": 42, + "vs_reference": -7.317965605562194e-05, + "vs_catalogue_best": 0.1763915017191346, + "vs_best_known": 0.26250996529333204, + "sessions_equal_to_reference": 41 + }, + "unshared reference": { + "vs_catalogue_best": 0.17647995967273744, + "vs_best_known": 0.26259842324693483 + } + }, + "note": "selection methods choose only among the <=64 sampled catalogue plans; models may propose any legal plan" +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/results/analysis/selection_summary.json b/benchmarks/textbook_sharing/results/analysis/selection_summary.json new file mode 100644 index 00000000..4dc15b31 --- /dev/null +++ b/benchmarks/textbook_sharing/results/analysis/selection_summary.json @@ -0,0 +1,16968 @@ +{ + "summary": { + "n_tasks_complete": 56, + "n_tasks_with_feasible": 56, + "tasks_without_feasible": [], + "incomplete": [], + "topologies": [ + "C02", + "C08", + "C09", + "C11", + "C16" + ], + "fixed_order": [ + "combined", + "gate_only", + "diffusion_only", + "independent" + ], + "by_method": { + "baseline_independent": { + "1": { + "found_rate_balanced": 1.0, + "found_rate_ci": [ + 1.0, + 1.0 + ], + "gap_balanced_when_found": 0.18329058526979092, + "gap_ci": [ + 0.1408831689007075, + 0.21641185167931412 + ], + "hit_best_rate_balanced": 0.0, + "time_s_balanced": 23.170909090909092, + "n_tasks": 56 + }, + "2": { + "found_rate_balanced": 1.0, + "found_rate_ci": [ + 1.0, + 1.0 + ], + "gap_balanced_when_found": 0.18329058526979092, + "gap_ci": [ + 0.1408831689007075, + 0.21641185167931412 + ], + "hit_best_rate_balanced": 0.0, + "time_s_balanced": 23.170909090909092, + "n_tasks": 56 + }, + "4": { + "found_rate_balanced": 1.0, + "found_rate_ci": [ + 1.0, + 1.0 + ], + "gap_balanced_when_found": 0.18329058526979092, + "gap_ci": [ + 0.1408831689007075, + 0.21641185167931412 + ], + "hit_best_rate_balanced": 0.0, + "time_s_balanced": 23.170909090909092, + "n_tasks": 56 + }, + "8": { + "found_rate_balanced": 1.0, + "found_rate_ci": [ + 1.0, + 1.0 + ], + "gap_balanced_when_found": 0.18329058526979092, + "gap_ci": [ + 0.1408831689007075, + 0.21641185167931412 + ], + "hit_best_rate_balanced": 0.0, + "time_s_balanced": 23.170909090909092, + "n_tasks": 56 + }, + "16": { + "found_rate_balanced": 1.0, + "found_rate_ci": [ + 1.0, + 1.0 + ], + "gap_balanced_when_found": 0.18329058526979092, + "gap_ci": [ + 0.1408831689007075, + 0.21641185167931412 + ], + "hit_best_rate_balanced": 0.0, + "time_s_balanced": 23.170909090909092, + "n_tasks": 56 + } + }, + "fixed_mode": { + "1": { + "found_rate_balanced": 1.0, + "found_rate_ci": [ + 1.0, + 1.0 + ], + "gap_balanced_when_found": 0.1323945232999384, + "gap_ci": [ + 0.05940274373556189, + 0.19202323976201674 + ], + "hit_best_rate_balanced": 0.16666666666666669, + "time_s_balanced": 23.242020202020203, + "n_tasks": 56 + }, + "2": { + "found_rate_balanced": 1.0, + "found_rate_ci": [ + 1.0, + 1.0 + ], + "gap_balanced_when_found": 0.13080695242455748, + "gap_ci": [ + 0.05464003110941914, + 0.19202323976201674 + ], + "hit_best_rate_balanced": 0.16666666666666669, + "time_s_balanced": 46.33277777777778, + "n_tasks": 56 + }, + "4": { + "found_rate_balanced": 1.0, + "found_rate_ci": [ + 1.0, + 1.0 + ], + "gap_balanced_when_found": 0.13018092407213638, + "gap_ci": [ + 0.05433067506118109, + 0.19138989515365065 + ], + "hit_best_rate_balanced": 0.16666666666666669, + "time_s_balanced": 92.6240404040404, + "n_tasks": 56 + }, + "8": { + "found_rate_balanced": 1.0, + "found_rate_ci": [ + 1.0, + 1.0 + ], + "gap_balanced_when_found": 0.09420942267656951, + "gap_ci": [ + 0.029856460561740523, + 0.16442284494862347 + ], + "hit_best_rate_balanced": 0.27575757575757576, + "time_s_balanced": 555.0899999999999, + "n_tasks": 56 + }, + "16": { + "found_rate_balanced": 1.0, + "found_rate_ci": [ + 1.0, + 1.0 + ], + "gap_balanced_when_found": 0.07112302314281534, + "gap_ci": [ + 0.018391044495864307, + 0.1475385223407893 + ], + "hit_best_rate_balanced": 0.4121212121212121, + "time_s_balanced": 999.6276262626263, + "n_tasks": 56 + } + }, + "share_most": { + "1": { + "found_rate_balanced": 0.9666666666666667, + "found_rate_ci": [ + 0.9, + 1.0 + ], + "gap_balanced_when_found": 0.25020664541266574, + "gap_ci": [ + 0.0756635713524115, + 0.5079725851904116 + ], + "hit_best_rate_balanced": 0.09090909090909091, + "time_s_balanced": 104.76646464646464, + "n_tasks": 56 + }, + "2": { + "found_rate_balanced": 1.0, + "found_rate_ci": [ + 1.0, + 1.0 + ], + "gap_balanced_when_found": 0.24398514165675209, + "gap_ci": [ + 0.06977441207669938, + 0.5020209054509703 + ], + "hit_best_rate_balanced": 0.09090909090909091, + "time_s_balanced": 223.35500000000002, + "n_tasks": 56 + }, + "4": { + "found_rate_balanced": 1.0, + "found_rate_ci": [ + 1.0, + 1.0 + ], + "gap_balanced_when_found": 0.21524741592020563, + "gap_ci": [ + 0.06096428196280335, + 0.4252100684274681 + ], + "hit_best_rate_balanced": 0.10909090909090909, + "time_s_balanced": 462.4684848484849, + "n_tasks": 56 + }, + "8": { + "found_rate_balanced": 1.0, + "found_rate_ci": [ + 1.0, + 1.0 + ], + "gap_balanced_when_found": 0.12502945382684255, + "gap_ci": [ + 0.023512864667085475, + 0.24052936785404297 + ], + "hit_best_rate_balanced": 0.2924242424242424, + "time_s_balanced": 787.4344444444445, + "n_tasks": 56 + }, + "16": { + "found_rate_balanced": 1.0, + "found_rate_ci": [ + 1.0, + 1.0 + ], + "gap_balanced_when_found": 0.06996248436625639, + "gap_ci": [ + 0.014919247816102373, + 0.15558481102073757 + ], + "hit_best_rate_balanced": 0.4691919191919192, + "time_s_balanced": 1093.9320707070708, + "n_tasks": 56 + } + }, + "random": { + "1": { + "found_rate_balanced": 0.98, + "found_rate_ci": [ + 0.9400000000000001, + 1.0 + ], + "gap_balanced_when_found": 0.2233598305582618, + "gap_ci": [ + 0.12664862931547638, + 0.30466197279454904 + ], + "hit_best_rate_balanced": 0.0, + "time_s_balanced": 47.69535353535353, + "n_tasks": 56 + }, + "2": { + "found_rate_balanced": 0.9866666666666667, + "found_rate_ci": [ + 0.96, + 1.0 + ], + "gap_balanced_when_found": 0.14962129082434525, + "gap_ci": [ + 0.09345233288742406, + 0.1950111697554088 + ], + "hit_best_rate_balanced": 0.0, + "time_s_balanced": 97.17588888888888, + "n_tasks": 56 + }, + "4": { + "found_rate_balanced": 1.0, + "found_rate_ci": [ + 1.0, + 1.0 + ], + "gap_balanced_when_found": 0.1035217160787728, + "gap_ci": [ + 0.06649049664084575, + 0.14763831329015925 + ], + "hit_best_rate_balanced": 0.0, + "time_s_balanced": 186.49559595959596, + "n_tasks": 56 + }, + "8": { + "found_rate_balanced": 1.0, + "found_rate_ci": [ + 1.0, + 1.0 + ], + "gap_balanced_when_found": 0.07402095017699165, + "gap_ci": [ + 0.041704947839503306, + 0.11042367691955887 + ], + "hit_best_rate_balanced": 0.0, + "time_s_balanced": 367.0226666666667, + "n_tasks": 56 + }, + "16": { + "found_rate_balanced": 1.0, + "found_rate_ci": [ + 1.0, + 1.0 + ], + "gap_balanced_when_found": 0.03964090917220232, + "gap_ci": [ + 0.018220294539080993, + 0.06333173063885685 + ], + "hit_best_rate_balanced": 0.01818181818181818, + "time_s_balanced": 709.5931818181818, + "n_tasks": 56 + } + }, + "neighbourhood": { + "1": { + "found_rate_balanced": 1.0, + "found_rate_ci": [ + 1.0, + 1.0 + ], + "gap_balanced_when_found": 0.18329058526979092, + "gap_ci": [ + 0.1408831689007075, + 0.21641185167931412 + ], + "hit_best_rate_balanced": 0.0, + "time_s_balanced": 23.170909090909092, + "n_tasks": 56 + }, + "2": { + "found_rate_balanced": 1.0, + "found_rate_ci": [ + 1.0, + 1.0 + ], + "gap_balanced_when_found": 0.13881879848401463, + "gap_ci": [ + 0.06811954662740533, + 0.19548585371012553 + ], + "hit_best_rate_balanced": 0.0, + "time_s_balanced": 87.45055555555555, + "n_tasks": 56 + }, + "4": { + "found_rate_balanced": 1.0, + "found_rate_ci": [ + 1.0, + 1.0 + ], + "gap_balanced_when_found": 0.11811948275930494, + "gap_ci": [ + 0.06512449248456638, + 0.1677742645040324 + ], + "hit_best_rate_balanced": 0.03333333333333333, + "time_s_balanced": 210.7329292929293, + "n_tasks": 56 + }, + "8": { + "found_rate_balanced": 1.0, + "found_rate_ci": [ + 1.0, + 1.0 + ], + "gap_balanced_when_found": 0.07627764050254109, + "gap_ci": [ + 0.038719649332232466, + 0.12721790217005963 + ], + "hit_best_rate_balanced": 0.1393939393939394, + "time_s_balanced": 423.01, + "n_tasks": 56 + }, + "16": { + "found_rate_balanced": 1.0, + "found_rate_ci": [ + 1.0, + 1.0 + ], + "gap_balanced_when_found": 0.053576597103302176, + "gap_ci": [ + 0.014551130347263568, + 0.1051052570563597 + ], + "hit_best_rate_balanced": 0.35909090909090907, + "time_s_balanced": 660.2298484848485, + "n_tasks": 56 + } + }, + "cost_rank": { + "1": { + "found_rate_balanced": 1.0, + "found_rate_ci": [ + 1.0, + 1.0 + ], + "gap_balanced_when_found": 0.012912699173557562, + "gap_ci": [ + 0.0006903173582018345, + 0.031409632850862144 + ], + "hit_best_rate_balanced": 0.8, + "time_s_balanced": 23.850555555555555, + "n_tasks": 56 + }, + "2": { + "found_rate_balanced": 1.0, + "found_rate_ci": [ + 1.0, + 1.0 + ], + "gap_balanced_when_found": 0.010908005210521002, + "gap_ci": [ + 0.0, + 0.030095256246027418 + ], + "hit_best_rate_balanced": 0.85, + "time_s_balanced": 46.56393939393939, + "n_tasks": 56 + }, + "4": { + "found_rate_balanced": 1.0, + "found_rate_ci": [ + 1.0, + 1.0 + ], + "gap_balanced_when_found": 0.0, + "gap_ci": [ + 0.0, + 0.0 + ], + "hit_best_rate_balanced": 1.0, + "time_s_balanced": 92.75282828282829, + "n_tasks": 56 + }, + "8": { + "found_rate_balanced": 1.0, + "found_rate_ci": [ + 1.0, + 1.0 + ], + "gap_balanced_when_found": 0.0, + "gap_ci": [ + 0.0, + 0.0 + ], + "hit_best_rate_balanced": 1.0, + "time_s_balanced": 185.40353535353535, + "n_tasks": 56 + }, + "16": { + "found_rate_balanced": 1.0, + "found_rate_ci": [ + 1.0, + 1.0 + ], + "gap_balanced_when_found": 0.0, + "gap_ci": [ + 0.0, + 0.0 + ], + "hit_best_rate_balanced": 1.0, + "time_s_balanced": 371.575202020202, + "n_tasks": 56 + } + }, + "geometry_first": { + "1": { + "found_rate_balanced": 1.0, + "found_rate_ci": [ + 1.0, + 1.0 + ], + "gap_balanced_when_found": 0.0, + "gap_ci": [ + 0.0, + 0.0 + ], + "hit_best_rate_balanced": 1.0, + "time_s_balanced": 1439.7225252525254, + "n_tasks": 56 + }, + "2": { + "found_rate_balanced": 1.0, + "found_rate_ci": [ + 1.0, + 1.0 + ], + "gap_balanced_when_found": 0.0, + "gap_ci": [ + 0.0, + 0.0 + ], + "hit_best_rate_balanced": 1.0, + "time_s_balanced": 1462.4378787878788, + "n_tasks": 56 + }, + "4": { + "found_rate_balanced": 1.0, + "found_rate_ci": [ + 1.0, + 1.0 + ], + "gap_balanced_when_found": 0.0, + "gap_ci": [ + 0.0, + 0.0 + ], + "hit_best_rate_balanced": 1.0, + "time_s_balanced": 1508.6288383838385, + "n_tasks": 56 + }, + "8": { + "found_rate_balanced": 1.0, + "found_rate_ci": [ + 1.0, + 1.0 + ], + "gap_balanced_when_found": 0.0, + "gap_ci": [ + 0.0, + 0.0 + ], + "hit_best_rate_balanced": 1.0, + "time_s_balanced": 1601.2745454545454, + "n_tasks": 56 + }, + "16": { + "found_rate_balanced": 1.0, + "found_rate_ci": [ + 1.0, + 1.0 + ], + "gap_balanced_when_found": 0.0, + "gap_ci": [ + 0.0, + 0.0 + ], + "hit_best_rate_balanced": 1.0, + "time_s_balanced": 1787.4456565656565, + "n_tasks": 56 + } + } + }, + "paired_vs_cost_rank": { + "baseline_independent": { + "1": { + "better": 0, + "equal": 0, + "worse": 56 + }, + "2": { + "better": 0, + "equal": 0, + "worse": 56 + }, + "4": { + "better": 0, + "equal": 0, + "worse": 56 + }, + "8": { + "better": 0, + "equal": 0, + "worse": 56 + }, + "16": { + "better": 0, + "equal": 0, + "worse": 56 + } + }, + "fixed_mode": { + "1": { + "better": 0, + "equal": 12, + "worse": 44 + }, + "2": { + "better": 1, + "equal": 10, + "worse": 45 + }, + "4": { + "better": 0, + "equal": 10, + "worse": 46 + }, + "8": { + "better": 0, + "equal": 16, + "worse": 40 + }, + "16": { + "better": 0, + "equal": 23, + "worse": 33 + } + }, + "share_most": { + "1": { + "better": 0, + "equal": 5, + "worse": 51 + }, + "2": { + "better": 0, + "equal": 5, + "worse": 51 + }, + "4": { + "better": 0, + "equal": 6, + "worse": 50 + }, + "8": { + "better": 0, + "equal": 17, + "worse": 39 + }, + "16": { + "better": 0, + "equal": 26, + "worse": 30 + } + }, + "random": { + "1": { + "better": 0, + "equal": 0, + "worse": 56 + }, + "2": { + "better": 0, + "equal": 0, + "worse": 56 + }, + "4": { + "better": 0, + "equal": 0, + "worse": 56 + }, + "8": { + "better": 0, + "equal": 0, + "worse": 56 + }, + "16": { + "better": 0, + "equal": 1, + "worse": 55 + } + }, + "neighbourhood": { + "1": { + "better": 0, + "equal": 0, + "worse": 56 + }, + "2": { + "better": 1, + "equal": 0, + "worse": 55 + }, + "4": { + "better": 0, + "equal": 2, + "worse": 54 + }, + "8": { + "better": 0, + "equal": 8, + "worse": 48 + }, + "16": { + "better": 0, + "equal": 21, + "worse": 35 + } + }, + "geometry_first": { + "1": { + "better": 12, + "equal": 44, + "worse": 0 + }, + "2": { + "better": 9, + "equal": 47, + "worse": 0 + }, + "4": { + "better": 0, + "equal": 56, + "worse": 0 + }, + "8": { + "better": 0, + "equal": 56, + "worse": 0 + }, + "16": { + "better": 0, + "equal": 56, + "worse": 0 + } + } + } + }, + "tasks": [ + { + "task": "C02_gf180_sW1_sL1", + "n_evaluated": 64, + "n_feasible": 64, + "best_evaluated": 247.3328, + "methods": { + "baseline_independent": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.20199504473325014, + "gap_or_inf": 0.20199504473325014, + "time_s": 17.0 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.20199504473325014, + "gap_or_inf": 0.20199504473325014, + "time_s": 17.0 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.20199504473325014, + "gap_or_inf": 0.20199504473325014, + "time_s": 17.0 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.20199504473325014, + "gap_or_inf": 0.20199504473325014, + "time_s": 17.0 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.20199504473325014, + "gap_or_inf": 0.20199504473325014, + "time_s": 17.0 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "fixed_mode": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 17.0 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 33.9 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 67.8 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 135.6 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 271.2 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "share_most": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.14969304516020543, + "gap_or_inf": 0.14969304516020543, + "time_s": 17.0 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.14881002438819269, + "gap_or_inf": 0.14881002438819269, + "time_s": 33.9 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.14881002438819269, + "gap_or_inf": 0.14881002438819269, + "time_s": 67.8 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 135.6 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 271.2 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "random": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.3293217882949614, + "gap_or_inf": 0.3293217882949614, + "time_s": 17.0 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.16111441749739625, + "gap_or_inf": 0.16111441749739625, + "time_s": 33.9 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.06891475776767178, + "gap_or_inf": 0.06891475776767178, + "time_s": 67.8 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.065382674679622, + "gap_or_inf": 0.065382674679622, + "time_s": 135.6 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.04007588156524331, + "gap_or_inf": 0.04007588156524331, + "time_s": 271.2 + } + }, + "precompute_s": 0.0, + "n_runs": 10, + "first_feasible_query": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ] + }, + "neighbourhood": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.20199504473325014, + "gap_or_inf": 0.20199504473325014, + "time_s": 17.0 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.032733224222585955, + "gap_or_inf": 0.032733224222585955, + "time_s": 33.9 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.032733224222585955, + "gap_or_inf": 0.032733224222585955, + "time_s": 67.8 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.032733224222585955, + "gap_or_inf": 0.032733224222585955, + "time_s": 135.6 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 271.2 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "cost_rank": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 17.9 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 34.8 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 68.7 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 136.5 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 272.1 + } + }, + "precompute_s": 0.91, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "geometry_first": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 17.9 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 34.8 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 68.7 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 136.5 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 272.1 + } + }, + "precompute_s": 0.94, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + } + } + }, + { + "task": "C02_gf180_sW1_sL2", + "n_evaluated": 64, + "n_feasible": 64, + "best_evaluated": 338.008, + "methods": { + "baseline_independent": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.19128067974722485, + "gap_or_inf": 0.19128067974722485, + "time_s": 19.8 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.19128067974722485, + "gap_or_inf": 0.19128067974722485, + "time_s": 19.8 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.19128067974722485, + "gap_or_inf": 0.19128067974722485, + "time_s": 19.8 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.19128067974722485, + "gap_or_inf": 0.19128067974722485, + "time_s": 19.8 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.19128067974722485, + "gap_or_inf": 0.19128067974722485, + "time_s": 19.8 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "fixed_mode": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 19.8 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 39.5 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 79.0 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 158.0 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 316.1 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "share_most": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.13074246763390218, + "gap_or_inf": 0.13074246763390218, + "time_s": 19.8 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.1300963290809687, + "gap_or_inf": 0.1300963290809687, + "time_s": 39.5 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.1300963290809687, + "gap_or_inf": 0.1300963290809687, + "time_s": 79.0 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 158.0 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 316.1 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "random": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.2601687534022864, + "gap_or_inf": 0.2601687534022864, + "time_s": 19.8 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.13189462971290622, + "gap_or_inf": 0.13189462971290622, + "time_s": 39.5 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.05891008496840311, + "gap_or_inf": 0.05891008496840311, + "time_s": 79.0 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.05632553075666846, + "gap_or_inf": 0.05632553075666846, + "time_s": 158.0 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.035686965988970656, + "gap_or_inf": 0.035686965988970656, + "time_s": 316.1 + } + }, + "precompute_s": 0.0, + "n_runs": 10, + "first_feasible_query": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ] + }, + "neighbourhood": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.19128067974722485, + "gap_or_inf": 0.19128067974722485, + "time_s": 19.8 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0239520958083832, + "gap_or_inf": 0.0239520958083832, + "time_s": 39.5 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0239520958083832, + "gap_or_inf": 0.0239520958083832, + "time_s": 79.0 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0239520958083832, + "gap_or_inf": 0.0239520958083832, + "time_s": 158.0 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 316.1 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "cost_rank": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 20.7 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 40.4 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 79.9 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 158.9 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 317.0 + } + }, + "precompute_s": 0.91, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "geometry_first": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 20.7 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 40.5 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 80.0 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 159.0 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 317.0 + } + }, + "precompute_s": 0.96, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + } + } + }, + { + "task": "C02_gf180_sW2_sL1", + "n_evaluated": 64, + "n_feasible": 64, + "best_evaluated": 428.6832, + "methods": { + "baseline_independent": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.1850989262000471, + "gap_or_inf": 0.1850989262000471, + "time_s": 19.8 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.1850989262000471, + "gap_or_inf": 0.1850989262000471, + "time_s": 19.8 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.1850989262000471, + "gap_or_inf": 0.1850989262000471, + "time_s": 19.8 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.1850989262000471, + "gap_or_inf": 0.1850989262000471, + "time_s": 19.8 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.1850989262000471, + "gap_or_inf": 0.1850989262000471, + "time_s": 19.8 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "fixed_mode": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 19.8 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 39.5 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 79.0 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 158.1 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 316.2 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "share_most": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.11980875387698897, + "gap_or_inf": 0.11980875387698897, + "time_s": 19.8 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.11929928674601653, + "gap_or_inf": 0.11929928674601653, + "time_s": 39.5 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.11929928674601653, + "gap_or_inf": 0.11929928674601653, + "time_s": 79.0 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 158.1 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 316.2 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "random": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.3990392905530238, + "gap_or_inf": 0.3990392905530238, + "time_s": 19.8 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.24300518424794815, + "gap_or_inf": 0.24300518424794815, + "time_s": 39.5 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.10379338401878122, + "gap_or_inf": 0.10379338401878122, + "time_s": 79.0 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.06119222773367374, + "gap_or_inf": 0.06119222773367374, + "time_s": 158.1 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0037771482530689405, + "gap_or_inf": 0.0037771482530689405, + "time_s": 316.2 + } + }, + "precompute_s": 0.0, + "n_runs": 10, + "first_feasible_query": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ] + }, + "neighbourhood": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.1850989262000471, + "gap_or_inf": 0.1850989262000471, + "time_s": 19.8 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.018885741265344702, + "gap_or_inf": 0.018885741265344702, + "time_s": 39.5 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.018885741265344702, + "gap_or_inf": 0.018885741265344702, + "time_s": 79.0 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.018885741265344702, + "gap_or_inf": 0.018885741265344702, + "time_s": 158.1 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 316.2 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "cost_rank": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 20.7 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 40.4 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 80.0 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 159.0 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 317.1 + } + }, + "precompute_s": 0.92, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "geometry_first": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 21.2 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 40.9 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 80.5 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 159.5 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 317.6 + } + }, + "precompute_s": 1.42, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + } + } + }, + { + "task": "C02_gf180_sW2_sL2", + "n_evaluated": 64, + "n_feasible": 64, + "best_evaluated": 610.0336, + "methods": { + "baseline_independent": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.1782485423753708, + "gap_or_inf": 0.1782485423753708, + "time_s": 20.0 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.1782485423753708, + "gap_or_inf": 0.1782485423753708, + "time_s": 20.0 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.1782485423753708, + "gap_or_inf": 0.1782485423753708, + "time_s": 20.0 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.1782485423753708, + "gap_or_inf": 0.1782485423753708, + "time_s": 20.0 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.1782485423753708, + "gap_or_inf": 0.1782485423753708, + "time_s": 20.0 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "fixed_mode": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 20.0 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 40.0 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 79.9 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 159.9 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 319.8 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "share_most": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.10769242874490859, + "gap_or_inf": 0.10769242874490859, + "time_s": 20.0 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.10733441567808732, + "gap_or_inf": 0.10733441567808732, + "time_s": 40.0 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.10733441567808732, + "gap_or_inf": 0.10733441567808732, + "time_s": 79.9 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 159.9 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 319.8 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "random": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.3015634548654369, + "gap_or_inf": 0.3015634548654369, + "time_s": 20.0 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.1968501407135607, + "gap_or_inf": 0.1968501407135607, + "time_s": 40.0 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.08938799436621199, + "gap_or_inf": 0.08938799436621199, + "time_s": 79.9 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.05475121370363871, + "gap_or_inf": 0.05475121370363871, + "time_s": 159.9 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.002654280026542821, + "gap_or_inf": 0.002654280026542821, + "time_s": 319.8 + } + }, + "precompute_s": 0.0, + "n_runs": 10, + "first_feasible_query": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ] + }, + "neighbourhood": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.1782485423753708, + "gap_or_inf": 0.1782485423753708, + "time_s": 20.0 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.013271400132714106, + "gap_or_inf": 0.013271400132714106, + "time_s": 40.0 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.013271400132714106, + "gap_or_inf": 0.013271400132714106, + "time_s": 79.9 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.013271400132714106, + "gap_or_inf": 0.013271400132714106, + "time_s": 159.9 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 319.8 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "cost_rank": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 20.9 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 40.9 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 80.9 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 160.8 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 320.7 + } + }, + "precompute_s": 0.92, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "geometry_first": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 21.5 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 41.5 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 81.5 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 161.4 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 321.3 + } + }, + "precompute_s": 1.56, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + } + } + }, + { + "task": "C02_ihp130_sW1_sL1", + "n_evaluated": 64, + "n_feasible": 64, + "best_evaluated": 138.9004, + "methods": { + "baseline_independent": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.19665674108929876, + "gap_or_inf": 0.19665674108929876, + "time_s": 7.6 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.19665674108929876, + "gap_or_inf": 0.19665674108929876, + "time_s": 7.6 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.19665674108929876, + "gap_or_inf": 0.19665674108929876, + "time_s": 7.6 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.19665674108929876, + "gap_or_inf": 0.19665674108929876, + "time_s": 7.6 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.19665674108929876, + "gap_or_inf": 0.19665674108929876, + "time_s": 7.6 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "fixed_mode": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 7.6 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 15.2 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 30.4 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 60.8 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 121.6 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "share_most": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.13836965192324868, + "gap_or_inf": 0.13836965192324868, + "time_s": 7.6 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.13836965192324868, + "gap_or_inf": 0.13836965192324868, + "time_s": 15.2 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.13836965192324868, + "gap_or_inf": 0.13836965192324868, + "time_s": 30.4 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 60.8 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 121.6 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "random": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.2877112664902334, + "gap_or_inf": 0.2877112664902334, + "time_s": 7.6 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.14470174311953035, + "gap_or_inf": 0.14470174311953035, + "time_s": 15.2 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.06411385424376034, + "gap_or_inf": 0.06411385424376034, + "time_s": 30.4 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.06117649769187137, + "gap_or_inf": 0.06117649769187137, + "time_s": 60.8 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.03874402089554822, + "gap_or_inf": 0.03874402089554822, + "time_s": 121.6 + } + }, + "precompute_s": 0.0, + "n_runs": 10, + "first_feasible_query": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ] + }, + "neighbourhood": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.19665674108929876, + "gap_or_inf": 0.19665674108929876, + "time_s": 7.6 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.027207985002203117, + "gap_or_inf": 0.027207985002203117, + "time_s": 15.2 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.027207985002203117, + "gap_or_inf": 0.027207985002203117, + "time_s": 30.4 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.027207985002203117, + "gap_or_inf": 0.027207985002203117, + "time_s": 60.8 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 121.6 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "cost_rank": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 8.5 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 16.1 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 31.3 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 61.7 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 122.5 + } + }, + "precompute_s": 0.9, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "geometry_first": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 8.5 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 16.1 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 31.3 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 61.7 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 122.5 + } + }, + "precompute_s": 0.94, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + } + } + }, + { + "task": "C02_ihp130_sW1_sL2", + "n_evaluated": 64, + "n_feasible": 64, + "best_evaluated": 200.5516, + "methods": { + "baseline_independent": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.18598555184800314, + "gap_or_inf": 0.18598555184800314, + "time_s": 7.5 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.18598555184800314, + "gap_or_inf": 0.18598555184800314, + "time_s": 7.5 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.18598555184800314, + "gap_or_inf": 0.18598555184800314, + "time_s": 7.5 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.18598555184800314, + "gap_or_inf": 0.18598555184800314, + "time_s": 7.5 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.18598555184800314, + "gap_or_inf": 0.18598555184800314, + "time_s": 7.5 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "fixed_mode": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 7.5 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 15.0 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 30.0 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 60.1 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 120.2 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "share_most": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.1203101845111183, + "gap_or_inf": 0.1203101845111183, + "time_s": 7.5 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.1203101845111183, + "gap_or_inf": 0.1203101845111183, + "time_s": 15.0 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.1203101845111183, + "gap_or_inf": 0.1203101845111183, + "time_s": 30.0 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 60.1 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 120.2 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "random": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.2213782388173417, + "gap_or_inf": 0.2213782388173417, + "time_s": 7.5 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.11517619405679129, + "gap_or_inf": 0.11517619405679129, + "time_s": 15.0 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.05419507996944421, + "gap_or_inf": 0.05419507996944421, + "time_s": 30.0 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.052160690814732916, + "gap_or_inf": 0.052160690814732916, + "time_s": 60.1 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.03417654109964714, + "gap_or_inf": 0.03417654109964714, + "time_s": 120.2 + } + }, + "precompute_s": 0.0, + "n_runs": 10, + "first_feasible_query": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ] + }, + "neighbourhood": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.18598555184800314, + "gap_or_inf": 0.18598555184800314, + "time_s": 7.5 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.018843529545513382, + "gap_or_inf": 0.018843529545513382, + "time_s": 15.0 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.018843529545513382, + "gap_or_inf": 0.018843529545513382, + "time_s": 30.0 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.018843529545513382, + "gap_or_inf": 0.018843529545513382, + "time_s": 60.1 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 120.2 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "cost_rank": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 8.1 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 15.6 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 30.6 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 60.7 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 120.8 + } + }, + "precompute_s": 0.59, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "geometry_first": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 8.1 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 15.6 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 30.6 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 60.7 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 120.7 + } + }, + "precompute_s": 0.58, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + } + } + }, + { + "task": "C02_ihp130_sW2_sL1", + "n_evaluated": 64, + "n_feasible": 64, + "best_evaluated": 245.6044, + "methods": { + "baseline_independent": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.1815753300836631, + "gap_or_inf": 0.1815753300836631, + "time_s": 7.9 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.1815753300836631, + "gap_or_inf": 0.1815753300836631, + "time_s": 7.9 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.1815753300836631, + "gap_or_inf": 0.1815753300836631, + "time_s": 7.9 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.1815753300836631, + "gap_or_inf": 0.1815753300836631, + "time_s": 7.9 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.1815753300836631, + "gap_or_inf": 0.1815753300836631, + "time_s": 7.9 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "fixed_mode": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 7.9 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 15.8 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 31.6 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 63.1 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 126.2 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "share_most": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.11284651252176259, + "gap_or_inf": 0.11284651252176259, + "time_s": 7.9 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.11284651252176259, + "gap_or_inf": 0.11284651252176259, + "time_s": 15.8 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.11284651252176259, + "gap_or_inf": 0.11284651252176259, + "time_s": 31.6 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 63.1 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 126.2 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "random": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.33989635364838744, + "gap_or_inf": 0.33989635364838744, + "time_s": 7.9 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.2151755424577085, + "gap_or_inf": 0.2151755424577085, + "time_s": 15.8 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.09575056472929647, + "gap_or_inf": 0.09575056472929647, + "time_s": 31.6 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.05818087949564425, + "gap_or_inf": 0.05818087949564425, + "time_s": 63.1 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0030774692961526907, + "gap_or_inf": 0.0030774692961526907, + "time_s": 126.2 + } + }, + "precompute_s": 0.0, + "n_runs": 10, + "first_feasible_query": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ] + }, + "neighbourhood": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.1815753300836631, + "gap_or_inf": 0.1815753300836631, + "time_s": 7.9 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.015387346480763453, + "gap_or_inf": 0.015387346480763453, + "time_s": 15.8 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.015387346480763453, + "gap_or_inf": 0.015387346480763453, + "time_s": 31.6 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.015387346480763453, + "gap_or_inf": 0.015387346480763453, + "time_s": 63.1 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 126.2 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "cost_rank": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 8.8 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 16.7 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 32.5 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 64.0 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 127.2 + } + }, + "precompute_s": 0.92, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "geometry_first": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 9.2 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 17.1 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 32.9 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 64.4 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 127.5 + } + }, + "precompute_s": 1.31, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + } + } + }, + { + "task": "C02_ihp130_sW2_sL2", + "n_evaluated": 64, + "n_feasible": 64, + "best_evaluated": 368.9068, + "methods": { + "baseline_independent": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.17501358066590278, + "gap_or_inf": 0.17501358066590278, + "time_s": 8.0 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.17501358066590278, + "gap_or_inf": 0.17501358066590278, + "time_s": 8.0 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.17501358066590278, + "gap_or_inf": 0.17501358066590278, + "time_s": 8.0 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.17501358066590278, + "gap_or_inf": 0.17501358066590278, + "time_s": 8.0 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.17501358066590278, + "gap_or_inf": 0.17501358066590278, + "time_s": 8.0 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "fixed_mode": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 8.0 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 16.0 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 32.0 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 64.0 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 128.0 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "share_most": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.10174168651811244, + "gap_or_inf": 0.10174168651811244, + "time_s": 8.0 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.10174168651811244, + "gap_or_inf": 0.10174168651811244, + "time_s": 16.0 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.10174168651811244, + "gap_or_inf": 0.10174168651811244, + "time_s": 32.0 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 64.0 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 128.0 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "random": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.25024174127449006, + "gap_or_inf": 0.25024174127449006, + "time_s": 8.0 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.17271023467173832, + "gap_or_inf": 0.17271023467173832, + "time_s": 16.0 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.08237603644064036, + "gap_or_inf": 0.08237603644064036, + "time_s": 32.0 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.052041003310321264, + "gap_or_inf": 0.052041003310321264, + "time_s": 64.0 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.002048864374416537, + "gap_or_inf": 0.002048864374416537, + "time_s": 128.0 + } + }, + "precompute_s": 0.0, + "n_runs": 10, + "first_feasible_query": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ] + }, + "neighbourhood": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.17501358066590278, + "gap_or_inf": 0.17501358066590278, + "time_s": 8.0 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.010244321872082685, + "gap_or_inf": 0.010244321872082685, + "time_s": 16.0 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.010244321872082685, + "gap_or_inf": 0.010244321872082685, + "time_s": 32.0 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.010244321872082685, + "gap_or_inf": 0.010244321872082685, + "time_s": 64.0 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 128.0 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "cost_rank": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 8.9 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 16.9 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 32.9 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 64.9 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 128.9 + } + }, + "precompute_s": 0.95, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "geometry_first": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 9.6 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 17.6 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 33.6 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 65.6 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 129.6 + } + }, + "precompute_s": 1.6, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + } + } + }, + { + "task": "C02_sky130_sW1_sL1", + "n_evaluated": 64, + "n_feasible": 64, + "best_evaluated": 111.1906, + "methods": { + "baseline_independent": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.20521788712355193, + "gap_or_inf": 0.20521788712355193, + "time_s": 15.3 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.20521788712355193, + "gap_or_inf": 0.20521788712355193, + "time_s": 15.3 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.20521788712355193, + "gap_or_inf": 0.20521788712355193, + "time_s": 15.3 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.20521788712355193, + "gap_or_inf": 0.20521788712355193, + "time_s": 15.3 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.20521788712355193, + "gap_or_inf": 0.20521788712355193, + "time_s": 15.3 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "fixed_mode": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.07886278156606763, + "gap_or_inf": 0.07886278156606763, + "time_s": 15.3 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.038956530498081676, + "gap_or_inf": 0.038956530498081676, + "time_s": 30.5 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.038956530498081676, + "gap_or_inf": 0.038956530498081676, + "time_s": 61.0 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.038956530498081676, + "gap_or_inf": 0.038956530498081676, + "time_s": 122.1 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.038956530498081676, + "gap_or_inf": 0.038956530498081676, + "time_s": 244.2 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "share_most": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.16292024685539963, + "gap_or_inf": 0.16292024685539963, + "time_s": 15.3 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.16292024685539963, + "gap_or_inf": 0.16292024685539963, + "time_s": 30.5 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.16292024685539963, + "gap_or_inf": 0.16292024685539963, + "time_s": 61.0 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.07886278156606763, + "gap_or_inf": 0.07886278156606763, + "time_s": 122.1 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 244.2 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "random": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.3780253906355394, + "gap_or_inf": 0.3780253906355394, + "time_s": 15.3 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.18910834189221032, + "gap_or_inf": 0.18910834189221032, + "time_s": 30.5 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.10082111257606308, + "gap_or_inf": 0.10082111257606308, + "time_s": 61.0 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.09661823931159648, + "gap_or_inf": 0.09661823931159648, + "time_s": 122.1 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.06372696972585812, + "gap_or_inf": 0.06372696972585812, + "time_s": 244.2 + } + }, + "precompute_s": 0.0, + "n_runs": 10, + "first_feasible_query": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ] + }, + "neighbourhood": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.20521788712355193, + "gap_or_inf": 0.20521788712355193, + "time_s": 15.3 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.038956530498081676, + "gap_or_inf": 0.038956530498081676, + "time_s": 30.5 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.038956530498081676, + "gap_or_inf": 0.038956530498081676, + "time_s": 61.0 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.038956530498081676, + "gap_or_inf": 0.038956530498081676, + "time_s": 122.1 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.038956530498081676, + "gap_or_inf": 0.038956530498081676, + "time_s": 244.2 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "cost_rank": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.07886278156606763, + "gap_or_inf": 0.07886278156606763, + "time_s": 16.2 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.07886278156606763, + "gap_or_inf": 0.07886278156606763, + "time_s": 31.4 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 61.9 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 123.0 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 245.1 + } + }, + "precompute_s": 0.91, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "geometry_first": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 16.2 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 31.5 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 62.0 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 123.0 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 245.1 + } + }, + "precompute_s": 0.94, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + } + } + }, + { + "task": "C02_sky130_sW1_sL2", + "n_evaluated": 64, + "n_feasible": 64, + "best_evaluated": 148.3186, + "methods": { + "baseline_independent": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.1923582072646315, + "gap_or_inf": 0.1923582072646315, + "time_s": 15.0 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.1923582072646315, + "gap_or_inf": 0.1923582072646315, + "time_s": 15.0 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.1923582072646315, + "gap_or_inf": 0.1923582072646315, + "time_s": 15.0 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.1923582072646315, + "gap_or_inf": 0.1923582072646315, + "time_s": 15.0 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.1923582072646315, + "gap_or_inf": 0.1923582072646315, + "time_s": 15.0 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "fixed_mode": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 15.0 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 30.1 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 60.1 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 120.3 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 240.6 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "share_most": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.1418783618507724, + "gap_or_inf": 0.1418783618507724, + "time_s": 15.0 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.1418783618507724, + "gap_or_inf": 0.1418783618507724, + "time_s": 30.1 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.1418783618507724, + "gap_or_inf": 0.1418783618507724, + "time_s": 60.1 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 120.3 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 240.6 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "random": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.3010658811504423, + "gap_or_inf": 0.3010658811504423, + "time_s": 15.0 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.14934896904366682, + "gap_or_inf": 0.14934896904366682, + "time_s": 30.1 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.06505212427841153, + "gap_or_inf": 0.06505212427841153, + "time_s": 60.1 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.06190133941393734, + "gap_or_inf": 0.06190133941393734, + "time_s": 120.3 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.038491463646501536, + "gap_or_inf": 0.038491463646501536, + "time_s": 240.6 + } + }, + "precompute_s": 0.0, + "n_runs": 10, + "first_feasible_query": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ] + }, + "neighbourhood": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.1923582072646315, + "gap_or_inf": 0.1923582072646315, + "time_s": 15.0 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.02920469853410168, + "gap_or_inf": 0.02920469853410168, + "time_s": 30.1 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.02920469853410168, + "gap_or_inf": 0.02920469853410168, + "time_s": 60.1 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.02920469853410168, + "gap_or_inf": 0.02920469853410168, + "time_s": 120.3 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 240.6 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "cost_rank": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 15.9 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 31.0 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 61.0 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 121.2 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 241.5 + } + }, + "precompute_s": 0.9, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "geometry_first": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 16.0 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 31.0 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 61.1 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 121.2 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 241.5 + } + }, + "precompute_s": 0.94, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + } + } + }, + { + "task": "C02_sky130_sW2_sL1", + "n_evaluated": 64, + "n_feasible": 64, + "best_evaluated": 184.209, + "methods": { + "baseline_independent": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.1848547030818255, + "gap_or_inf": 0.1848547030818255, + "time_s": 15.5 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.1848547030818255, + "gap_or_inf": 0.1848547030818255, + "time_s": 15.5 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.1848547030818255, + "gap_or_inf": 0.1848547030818255, + "time_s": 15.5 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.1848547030818255, + "gap_or_inf": 0.1848547030818255, + "time_s": 15.5 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.1848547030818255, + "gap_or_inf": 0.1848547030818255, + "time_s": 15.5 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "fixed_mode": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.07886259629008352, + "gap_or_inf": 0.07886259629008352, + "time_s": 15.5 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.023514594835214453, + "gap_or_inf": 0.023514594835214453, + "time_s": 31.0 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.023514594835214453, + "gap_or_inf": 0.023514594835214453, + "time_s": 62.0 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.023514594835214453, + "gap_or_inf": 0.023514594835214453, + "time_s": 123.9 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 247.8 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "share_most": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.12960061669082412, + "gap_or_inf": 0.12960061669082412, + "time_s": 15.5 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.12960061669082412, + "gap_or_inf": 0.12960061669082412, + "time_s": 31.0 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.12960061669082412, + "gap_or_inf": 0.12960061669082412, + "time_s": 62.0 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 123.9 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 247.8 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "random": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.4873036605160443, + "gap_or_inf": 0.4873036605160443, + "time_s": 15.5 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.28779169313117164, + "gap_or_inf": 0.28779169313117164, + "time_s": 31.0 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.13167651960544818, + "gap_or_inf": 0.13167651960544818, + "time_s": 62.0 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.08001650299388201, + "gap_or_inf": 0.08001650299388201, + "time_s": 123.9 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.014108756901128672, + "gap_or_inf": 0.014108756901128672, + "time_s": 247.8 + } + }, + "precompute_s": 0.0, + "n_runs": 10, + "first_feasible_query": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ] + }, + "neighbourhood": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.1848547030818255, + "gap_or_inf": 0.1848547030818255, + "time_s": 15.5 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.023514594835214453, + "gap_or_inf": 0.023514594835214453, + "time_s": 31.0 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.023514594835214453, + "gap_or_inf": 0.023514594835214453, + "time_s": 62.0 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.023514594835214453, + "gap_or_inf": 0.023514594835214453, + "time_s": 123.9 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 247.8 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "cost_rank": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.07886259629008352, + "gap_or_inf": 0.07886259629008352, + "time_s": 16.1 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 31.6 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 62.5 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 124.5 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 248.4 + } + }, + "precompute_s": 0.58, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "geometry_first": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 16.5 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 32.0 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 62.9 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 124.9 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 248.8 + } + }, + "precompute_s": 0.98, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + } + } + }, + { + "task": "C02_sky130_sW2_sL2", + "n_evaluated": 64, + "n_feasible": 64, + "best_evaluated": 258.465, + "methods": { + "baseline_independent": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.17594606619851838, + "gap_or_inf": 0.17594606619851838, + "time_s": 15.8 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.17594606619851838, + "gap_or_inf": 0.17594606619851838, + "time_s": 15.8 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.17594606619851838, + "gap_or_inf": 0.17594606619851838, + "time_s": 15.8 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.17594606619851838, + "gap_or_inf": 0.17594606619851838, + "time_s": 15.8 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.17594606619851838, + "gap_or_inf": 0.17594606619851838, + "time_s": 15.8 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "fixed_mode": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 15.8 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 31.7 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 63.4 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 126.8 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 253.5 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "share_most": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.11502369759928821, + "gap_or_inf": 0.11502369759928821, + "time_s": 15.8 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.11502369759928821, + "gap_or_inf": 0.11502369759928821, + "time_s": 31.7 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.11502369759928821, + "gap_or_inf": 0.11502369759928821, + "time_s": 63.4 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 126.8 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 253.5 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "random": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.36207378174994687, + "gap_or_inf": 0.36207378174994687, + "time_s": 15.8 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.2241893486545568, + "gap_or_inf": 0.2241893486545568, + "time_s": 31.7 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.09833284970885818, + "gap_or_inf": 0.09833284970885818, + "time_s": 63.4 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.05879124833149572, + "gap_or_inf": 0.05879124833149572, + "time_s": 126.8 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.003351788443309589, + "gap_or_inf": 0.003351788443309589, + "time_s": 253.5 + } + }, + "precompute_s": 0.0, + "n_runs": 10, + "first_feasible_query": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ] + }, + "neighbourhood": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.17594606619851838, + "gap_or_inf": 0.17594606619851838, + "time_s": 15.8 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.016758942216547945, + "gap_or_inf": 0.016758942216547945, + "time_s": 31.7 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.016758942216547945, + "gap_or_inf": 0.016758942216547945, + "time_s": 63.4 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.016758942216547945, + "gap_or_inf": 0.016758942216547945, + "time_s": 126.8 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 253.5 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "cost_rank": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 16.8 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 32.6 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 64.3 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 127.7 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 254.4 + } + }, + "precompute_s": 0.91, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "geometry_first": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 17.4 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 33.2 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 64.9 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 128.3 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 255.1 + } + }, + "precompute_s": 1.53, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + } + } + }, + { + "task": "C08_gf180_sW1_sL1", + "n_evaluated": 64, + "n_feasible": 64, + "best_evaluated": 470.0262, + "methods": { + "baseline_independent": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.26525032008853966, + "gap_or_inf": 0.26525032008853966, + "time_s": 18.4 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.26525032008853966, + "gap_or_inf": 0.26525032008853966, + "time_s": 18.4 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.26525032008853966, + "gap_or_inf": 0.26525032008853966, + "time_s": 18.4 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.26525032008853966, + "gap_or_inf": 0.26525032008853966, + "time_s": 18.4 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.26525032008853966, + "gap_or_inf": 0.26525032008853966, + "time_s": 18.4 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "fixed_mode": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.2096959701395369, + "gap_or_inf": 0.2096959701395369, + "time_s": 18.4 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.2096959701395369, + "gap_or_inf": 0.2096959701395369, + "time_s": 36.9 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.2096959701395369, + "gap_or_inf": 0.2096959701395369, + "time_s": 73.8 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 147.6 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 295.1 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "share_most": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 18.4 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 36.9 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 73.8 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 147.6 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 295.1 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "random": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.20208528801160447, + "gap_or_inf": 0.20208528801160447, + "time_s": 18.4 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.12992424677603073, + "gap_or_inf": 0.12992424677603073, + "time_s": 36.9 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.07499969150655852, + "gap_or_inf": 0.07499969150655852, + "time_s": 73.8 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.054420200405849675, + "gap_or_inf": 0.054420200405849675, + "time_s": 147.6 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.013522650439486106, + "gap_or_inf": 0.013522650439486106, + "time_s": 295.1 + } + }, + "precompute_s": 0.0, + "n_runs": 10, + "first_feasible_query": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ] + }, + "neighbourhood": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.26525032008853966, + "gap_or_inf": 0.26525032008853966, + "time_s": 18.4 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.2096959701395369, + "gap_or_inf": 0.2096959701395369, + "time_s": 36.9 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.2096959701395369, + "gap_or_inf": 0.2096959701395369, + "time_s": 73.8 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.18004655910670508, + "gap_or_inf": 0.18004655910670508, + "time_s": 147.6 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 295.1 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "cost_rank": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 19.4 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 37.9 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 74.8 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 148.5 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 296.1 + } + }, + "precompute_s": 0.99, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "geometry_first": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 22.5 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 40.9 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 77.8 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 151.6 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 299.1 + } + }, + "precompute_s": 4.01, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + } + } + }, + { + "task": "C08_gf180_sW1_sL2", + "n_evaluated": 64, + "n_feasible": 64, + "best_evaluated": 683.5878, + "methods": { + "baseline_independent": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.22819277933280846, + "gap_or_inf": 0.22819277933280846, + "time_s": 17.3 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.22819277933280846, + "gap_or_inf": 0.22819277933280846, + "time_s": 17.3 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.22819277933280846, + "gap_or_inf": 0.22819277933280846, + "time_s": 17.3 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.22819277933280846, + "gap_or_inf": 0.22819277933280846, + "time_s": 17.3 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.22819277933280846, + "gap_or_inf": 0.22819277933280846, + "time_s": 17.3 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "fixed_mode": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.17426554423586849, + "gap_or_inf": 0.17426554423586849, + "time_s": 17.3 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.17426554423586849, + "gap_or_inf": 0.17426554423586849, + "time_s": 34.6 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.17426554423586849, + "gap_or_inf": 0.17426554423586849, + "time_s": 69.2 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.018596001859600086, + "gap_or_inf": 0.018596001859600086, + "time_s": 138.3 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.018596001859600086, + "gap_or_inf": 0.018596001859600086, + "time_s": 276.6 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "share_most": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.13349243506101183, + "gap_or_inf": 0.13349243506101183, + "time_s": 17.3 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.018596001859600086, + "gap_or_inf": 0.018596001859600086, + "time_s": 34.6 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.018596001859600086, + "gap_or_inf": 0.018596001859600086, + "time_s": 69.2 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.018596001859600086, + "gap_or_inf": 0.018596001859600086, + "time_s": 138.3 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 276.6 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "random": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.15582606945296565, + "gap_or_inf": 0.15582606945296565, + "time_s": 17.3 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.106588473346072, + "gap_or_inf": 0.106588473346072, + "time_s": 34.6 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.08164159746560715, + "gap_or_inf": 0.08164159746560715, + "time_s": 69.2 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.030264700452524117, + "gap_or_inf": 0.030264700452524117, + "time_s": 138.3 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.014876801487680068, + "gap_or_inf": 0.014876801487680068, + "time_s": 276.6 + } + }, + "precompute_s": 0.0, + "n_runs": 10, + "first_feasible_query": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ] + }, + "neighbourhood": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.22819277933280846, + "gap_or_inf": 0.22819277933280846, + "time_s": 17.3 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.17426554423586849, + "gap_or_inf": 0.17426554423586849, + "time_s": 34.6 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.17426554423586849, + "gap_or_inf": 0.17426554423586849, + "time_s": 69.2 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.018596001859600086, + "gap_or_inf": 0.018596001859600086, + "time_s": 138.3 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.018596001859600086, + "gap_or_inf": 0.018596001859600086, + "time_s": 276.6 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "cost_rank": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 18.3 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 35.5 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 70.1 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 139.3 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 277.6 + } + }, + "precompute_s": 0.97, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "geometry_first": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 20.4 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 37.6 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 72.2 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 141.4 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 279.7 + } + }, + "precompute_s": 3.07, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + } + } + }, + { + "task": "C08_gf180_sW2_sL1", + "n_evaluated": 64, + "n_feasible": 64, + "best_evaluated": 897.1494, + "methods": { + "baseline_independent": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.20877793598256877, + "gap_or_inf": 0.20877793598256877, + "time_s": 18.5 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.20877793598256877, + "gap_or_inf": 0.20877793598256877, + "time_s": 18.5 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.20877793598256877, + "gap_or_inf": 0.20877793598256877, + "time_s": 18.5 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.20877793598256877, + "gap_or_inf": 0.20877793598256877, + "time_s": 18.5 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.20877793598256877, + "gap_or_inf": 0.20877793598256877, + "time_s": 18.5 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "fixed_mode": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.15570316382087546, + "gap_or_inf": 0.15570316382087546, + "time_s": 18.5 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.15570316382087546, + "gap_or_inf": 0.15570316382087546, + "time_s": 36.9 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.15570316382087546, + "gap_or_inf": 0.15570316382087546, + "time_s": 73.8 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.12463587447085178, + "gap_or_inf": 0.12463587447085178, + "time_s": 147.6 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.014169323414807034, + "gap_or_inf": 0.014169323414807034, + "time_s": 295.3 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "share_most": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.12463587447085178, + "gap_or_inf": 0.12463587447085178, + "time_s": 18.5 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.12463587447085178, + "gap_or_inf": 0.12463587447085178, + "time_s": 36.9 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.12463587447085178, + "gap_or_inf": 0.12463587447085178, + "time_s": 73.8 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.014169323414807034, + "gap_or_inf": 0.014169323414807034, + "time_s": 147.6 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.014169323414807034, + "gap_or_inf": 0.014169323414807034, + "time_s": 295.3 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "random": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.10444597076027698, + "gap_or_inf": 0.10444597076027698, + "time_s": 18.5 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.051832950008103465, + "gap_or_inf": 0.051832950008103465, + "time_s": 36.9 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.04899908532514208, + "gap_or_inf": 0.04899908532514208, + "time_s": 73.8 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.033428768943054556, + "gap_or_inf": 0.033428768943054556, + "time_s": 147.6 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.005667729365922791, + "gap_or_inf": 0.005667729365922791, + "time_s": 295.3 + } + }, + "precompute_s": 0.0, + "n_runs": 10, + "first_feasible_query": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ] + }, + "neighbourhood": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.20877793598256877, + "gap_or_inf": 0.20877793598256877, + "time_s": 18.5 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.15570316382087546, + "gap_or_inf": 0.15570316382087546, + "time_s": 36.9 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.15570316382087546, + "gap_or_inf": 0.15570316382087546, + "time_s": 73.8 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.12463587447085178, + "gap_or_inf": 0.12463587447085178, + "time_s": 147.6 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.014169323414807034, + "gap_or_inf": 0.014169323414807034, + "time_s": 295.3 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "cost_rank": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 19.5 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 37.9 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 74.8 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 148.7 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 296.3 + } + }, + "precompute_s": 1.02, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "geometry_first": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 34.4 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 52.9 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 89.8 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 163.6 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 311.3 + } + }, + "precompute_s": 15.97, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + } + } + }, + { + "task": "C08_gf180_sW2_sL2", + "n_evaluated": 64, + "n_feasible": 64, + "best_evaluated": 1324.2726, + "methods": { + "baseline_independent": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.1887341020270299, + "gap_or_inf": 0.1887341020270299, + "time_s": 12.7 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.1887341020270299, + "gap_or_inf": 0.1887341020270299, + "time_s": 12.7 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.1887341020270299, + "gap_or_inf": 0.1887341020270299, + "time_s": 12.7 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.1887341020270299, + "gap_or_inf": 0.1887341020270299, + "time_s": 12.7 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.1887341020270299, + "gap_or_inf": 0.1887341020270299, + "time_s": 12.7 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "fixed_mode": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.1365394103902775, + "gap_or_inf": 0.1365394103902775, + "time_s": 12.7 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.1365394103902775, + "gap_or_inf": 0.1365394103902775, + "time_s": 25.4 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.1365394103902775, + "gap_or_inf": 0.1365394103902775, + "time_s": 50.8 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 101.6 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 203.2 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "share_most": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.11549238427193909, + "gap_or_inf": 0.11549238427193909, + "time_s": 12.7 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.11549238427193909, + "gap_or_inf": 0.11549238427193909, + "time_s": 25.4 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 50.8 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 101.6 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 203.2 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "random": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.12024799123684957, + "gap_or_inf": 0.12024799123684957, + "time_s": 12.7 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0748502234358696, + "gap_or_inf": 0.0748502234358696, + "time_s": 25.4 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.06208492118616664, + "gap_or_inf": 0.06208492118616664, + "time_s": 50.8 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.016348854457911455, + "gap_or_inf": 0.016348854457911455, + "time_s": 101.6 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.014429008045624437, + "gap_or_inf": 0.014429008045624437, + "time_s": 203.2 + } + }, + "precompute_s": 0.0, + "n_runs": 10, + "first_feasible_query": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ] + }, + "neighbourhood": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.1887341020270299, + "gap_or_inf": 0.1887341020270299, + "time_s": 12.7 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.1365394103902775, + "gap_or_inf": 0.1365394103902775, + "time_s": 25.4 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.1365394103902775, + "gap_or_inf": 0.1365394103902775, + "time_s": 50.8 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 101.6 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 203.2 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "cost_rank": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 13.7 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 26.4 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 51.8 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 102.6 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 204.2 + } + }, + "precompute_s": 1.04, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "geometry_first": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 24.8 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 37.5 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 62.9 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 113.7 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 215.3 + } + }, + "precompute_s": 12.09, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + } + } + }, + { + "task": "C08_ihp130_sW1_sL1", + "n_evaluated": 64, + "n_feasible": 64, + "best_evaluated": 240.9165, + "methods": { + "baseline_independent": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.23523087874844584, + "gap_or_inf": 0.23523087874844584, + "time_s": 5.7 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.23523087874844584, + "gap_or_inf": 0.23523087874844584, + "time_s": 5.7 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.23523087874844584, + "gap_or_inf": 0.23523087874844584, + "time_s": 5.7 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.23523087874844584, + "gap_or_inf": 0.23523087874844584, + "time_s": 5.7 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.23523087874844584, + "gap_or_inf": 0.23523087874844584, + "time_s": 5.7 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "fixed_mode": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.18786509018684905, + "gap_or_inf": 0.18786509018684905, + "time_s": 5.7 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.18786509018684905, + "gap_or_inf": 0.18786509018684905, + "time_s": 11.3 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.18786509018684905, + "gap_or_inf": 0.18786509018684905, + "time_s": 22.7 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.1337143782181791, + "gap_or_inf": 0.1337143782181791, + "time_s": 45.4 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 90.7 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "share_most": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.1337143782181791, + "gap_or_inf": 0.1337143782181791, + "time_s": 5.7 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.1337143782181791, + "gap_or_inf": 0.1337143782181791, + "time_s": 11.3 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.1337143782181791, + "gap_or_inf": 0.1337143782181791, + "time_s": 22.7 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.04985337243401755, + "gap_or_inf": 0.04985337243401755, + "time_s": 45.4 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 90.7 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "random": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.204385959450681, + "gap_or_inf": 0.204385959450681, + "time_s": 5.7 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.15561184061697722, + "gap_or_inf": 0.15561184061697722, + "time_s": 11.3 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.10765061753761147, + "gap_or_inf": 0.10765061753761147, + "time_s": 22.7 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.05209937883042455, + "gap_or_inf": 0.05209937883042455, + "time_s": 45.4 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.017448784122299534, + "gap_or_inf": 0.017448784122299534, + "time_s": 90.7 + } + }, + "precompute_s": 0.0, + "n_runs": 10, + "first_feasible_query": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ] + }, + "neighbourhood": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.23523087874844584, + "gap_or_inf": 0.23523087874844584, + "time_s": 5.7 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.18786509018684905, + "gap_or_inf": 0.18786509018684905, + "time_s": 11.3 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.18786509018684905, + "gap_or_inf": 0.18786509018684905, + "time_s": 22.7 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.024926893757795554, + "gap_or_inf": 0.024926893757795554, + "time_s": 45.4 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.024926893757795554, + "gap_or_inf": 0.024926893757795554, + "time_s": 90.7 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "cost_rank": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 6.6 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 12.3 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 23.6 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 46.3 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 91.7 + } + }, + "precompute_s": 0.97, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "geometry_first": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 10.0 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 15.7 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 27.0 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 49.7 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 95.1 + } + }, + "precompute_s": 4.33, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + } + } + }, + { + "task": "C08_ihp130_sW1_sL2", + "n_evaluated": 64, + "n_feasible": 64, + "best_evaluated": 351.1305, + "methods": { + "baseline_independent": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.2020473869401831, + "gap_or_inf": 0.2020473869401831, + "time_s": 5.6 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.2020473869401831, + "gap_or_inf": 0.2020473869401831, + "time_s": 5.6 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.2020473869401831, + "gap_or_inf": 0.2020473869401831, + "time_s": 5.6 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.2020473869401831, + "gap_or_inf": 0.2020473869401831, + "time_s": 5.6 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.2020473869401831, + "gap_or_inf": 0.2020473869401831, + "time_s": 5.6 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "fixed_mode": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.1559536981264802, + "gap_or_inf": 0.1559536981264802, + "time_s": 5.6 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.1559536981264802, + "gap_or_inf": 0.1559536981264802, + "time_s": 11.3 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.1559536981264802, + "gap_or_inf": 0.1559536981264802, + "time_s": 22.6 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 45.1 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 90.2 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "share_most": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 5.6 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 11.3 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 22.6 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 45.1 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 90.2 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "random": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.12741413804838947, + "gap_or_inf": 0.12741413804838947, + "time_s": 5.6 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.11747068397647036, + "gap_or_inf": 0.11747068397647036, + "time_s": 11.3 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.05940002363793524, + "gap_or_inf": 0.05940002363793524, + "time_s": 22.6 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.017102587214725063, + "gap_or_inf": 0.017102587214725063, + "time_s": 45.1 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 90.2 + } + }, + "precompute_s": 0.0, + "n_runs": 10, + "first_feasible_query": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ] + }, + "neighbourhood": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.2020473869401831, + "gap_or_inf": 0.2020473869401831, + "time_s": 5.6 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.1559536981264802, + "gap_or_inf": 0.1559536981264802, + "time_s": 11.3 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.1559536981264802, + "gap_or_inf": 0.1559536981264802, + "time_s": 22.6 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 45.1 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 90.2 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "cost_rank": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 6.6 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 12.2 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 23.5 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 46.1 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 91.2 + } + }, + "precompute_s": 0.96, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "geometry_first": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 8.7 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 14.3 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 25.6 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 48.2 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 93.3 + } + }, + "precompute_s": 3.04, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + } + } + }, + { + "task": "C08_ihp130_sW2_sL2", + "n_evaluated": 64, + "n_feasible": 64, + "best_evaluated": 678.9465, + "methods": { + "baseline_independent": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.16702494231872467, + "gap_or_inf": 0.16702494231872467, + "time_s": 6.6 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.16702494231872467, + "gap_or_inf": 0.16702494231872467, + "time_s": 6.6 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.16702494231872467, + "gap_or_inf": 0.16702494231872467, + "time_s": 6.6 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.16702494231872467, + "gap_or_inf": 0.16702494231872467, + "time_s": 6.6 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.16702494231872467, + "gap_or_inf": 0.16702494231872467, + "time_s": 6.6 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "fixed_mode": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.1222744354673011, + "gap_or_inf": 0.1222744354673011, + "time_s": 6.6 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.1222744354673011, + "gap_or_inf": 0.1222744354673011, + "time_s": 13.1 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.1222744354673011, + "gap_or_inf": 0.1222744354673011, + "time_s": 26.2 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.008845026817282386, + "gap_or_inf": 0.008845026817282386, + "time_s": 52.5 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.008845026817282386, + "gap_or_inf": 0.008845026817282386, + "time_s": 105.0 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "share_most": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.10305966670422473, + "gap_or_inf": 0.10305966670422473, + "time_s": 6.6 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.10305966670422473, + "gap_or_inf": 0.10305966670422473, + "time_s": 13.1 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.008845026817282386, + "gap_or_inf": 0.008845026817282386, + "time_s": 26.2 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.008845026817282386, + "gap_or_inf": 0.008845026817282386, + "time_s": 52.5 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.008845026817282386, + "gap_or_inf": 0.008845026817282386, + "time_s": 105.0 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "random": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.07488208570189255, + "gap_or_inf": 0.07488208570189255, + "time_s": 6.6 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.03662843832319633, + "gap_or_inf": 0.03662843832319633, + "time_s": 13.1 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.022808542352011553, + "gap_or_inf": 0.022808542352011553, + "time_s": 26.2 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0035380107269129546, + "gap_or_inf": 0.0035380107269129546, + "time_s": 52.5 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0035380107269129546, + "gap_or_inf": 0.0035380107269129546, + "time_s": 105.0 + } + }, + "precompute_s": 0.0, + "n_runs": 10, + "first_feasible_query": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ] + }, + "neighbourhood": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.16702494231872467, + "gap_or_inf": 0.16702494231872467, + "time_s": 6.6 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.1570344644239272, + "gap_or_inf": 0.1570344644239272, + "time_s": 13.1 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.1222744354673011, + "gap_or_inf": 0.1222744354673011, + "time_s": 26.2 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.10305966670422473, + "gap_or_inf": 0.10305966670422473, + "time_s": 52.5 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.008845026817282386, + "gap_or_inf": 0.008845026817282386, + "time_s": 105.0 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "cost_rank": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 7.6 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 14.1 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 27.3 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 53.5 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 106.0 + } + }, + "precompute_s": 1.02, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "geometry_first": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 36.3 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 42.9 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 56.0 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 82.2 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 134.7 + } + }, + "precompute_s": 29.74, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + } + } + }, + { + "task": "C08_sky130_sW1_sL1", + "n_evaluated": 64, + "n_feasible": 64, + "best_evaluated": 196.0921, + "methods": { + "baseline_independent": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.30553347126171837, + "gap_or_inf": 0.30553347126171837, + "time_s": 17.5 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.30553347126171837, + "gap_or_inf": 0.30553347126171837, + "time_s": 17.5 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.30553347126171837, + "gap_or_inf": 0.30553347126171837, + "time_s": 17.5 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.30553347126171837, + "gap_or_inf": 0.30553347126171837, + "time_s": 17.5 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.30553347126171837, + "gap_or_inf": 0.30553347126171837, + "time_s": 17.5 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "fixed_mode": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.2542988728255755, + "gap_or_inf": 0.2542988728255755, + "time_s": 17.5 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.2542988728255755, + "gap_or_inf": 0.2542988728255755, + "time_s": 35.0 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.2542988728255755, + "gap_or_inf": 0.2542988728255755, + "time_s": 70.0 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.034083984005474965, + "gap_or_inf": 0.034083984005474965, + "time_s": 140.0 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 280.0 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "share_most": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.034083984005474965, + "gap_or_inf": 0.034083984005474965, + "time_s": 17.5 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.034083984005474965, + "gap_or_inf": 0.034083984005474965, + "time_s": 35.0 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.034083984005474965, + "gap_or_inf": 0.034083984005474965, + "time_s": 70.0 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.034083984005474965, + "gap_or_inf": 0.034083984005474965, + "time_s": 140.0 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 280.0 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "random": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.1593697553343557, + "gap_or_inf": 0.1593697553343557, + "time_s": 17.5 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.11132136378773043, + "gap_or_inf": 0.11132136378773043, + "time_s": 35.0 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.048554531263625675, + "gap_or_inf": 0.048554531263625675, + "time_s": 70.0 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.03408378001969488, + "gap_or_inf": 0.03408378001969488, + "time_s": 140.0 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.01704194100629246, + "gap_or_inf": 0.01704194100629246, + "time_s": 280.0 + } + }, + "precompute_s": 0.0, + "n_runs": 10, + "first_feasible_query": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ] + }, + "neighbourhood": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.30553347126171837, + "gap_or_inf": 0.30553347126171837, + "time_s": 17.5 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.2542988728255755, + "gap_or_inf": 0.2542988728255755, + "time_s": 35.0 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.2542988728255755, + "gap_or_inf": 0.2542988728255755, + "time_s": 70.0 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.034083984005474965, + "gap_or_inf": 0.034083984005474965, + "time_s": 140.0 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.034083984005474965, + "gap_or_inf": 0.034083984005474965, + "time_s": 280.0 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "cost_rank": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 18.4 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 35.9 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 70.9 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 140.9 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 280.9 + } + }, + "precompute_s": 0.95, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "geometry_first": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 21.0 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 38.5 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 73.5 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 143.5 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 283.5 + } + }, + "precompute_s": 3.54, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + } + } + }, + { + "task": "C08_sky130_sW1_sL2", + "n_evaluated": 64, + "n_feasible": 64, + "best_evaluated": 282.024, + "methods": { + "baseline_independent": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.2590304371259182, + "gap_or_inf": 0.2590304371259182, + "time_s": 16.7 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.2590304371259182, + "gap_or_inf": 0.2590304371259182, + "time_s": 16.7 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.2590304371259182, + "gap_or_inf": 0.2590304371259182, + "time_s": 16.7 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.2590304371259182, + "gap_or_inf": 0.2590304371259182, + "time_s": 16.7 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.2590304371259182, + "gap_or_inf": 0.2590304371259182, + "time_s": 16.7 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "fixed_mode": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.20962081241312802, + "gap_or_inf": 0.20962081241312802, + "time_s": 16.7 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.20962081241312802, + "gap_or_inf": 0.20962081241312802, + "time_s": 33.5 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.20962081241312802, + "gap_or_inf": 0.20962081241312802, + "time_s": 66.9 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 133.8 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 267.6 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "share_most": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 16.7 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 33.5 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 66.9 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 133.8 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 267.6 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "random": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.20636874875897088, + "gap_or_inf": 0.20636874875897088, + "time_s": 16.7 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.11794779876889908, + "gap_or_inf": 0.11794779876889908, + "time_s": 33.5 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.09990270331602982, + "gap_or_inf": 0.09990270331602982, + "time_s": 66.9 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.04589854054974045, + "gap_or_inf": 0.04589854054974045, + "time_s": 133.8 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.004739809377925263, + "gap_or_inf": 0.004739809377925263, + "time_s": 267.6 + } + }, + "precompute_s": 0.0, + "n_runs": 10, + "first_feasible_query": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ] + }, + "neighbourhood": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.2590304371259182, + "gap_or_inf": 0.2590304371259182, + "time_s": 16.7 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.20962081241312802, + "gap_or_inf": 0.20962081241312802, + "time_s": 33.5 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.20962081241312802, + "gap_or_inf": 0.20962081241312802, + "time_s": 66.9 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.20962081241312802, + "gap_or_inf": 0.20962081241312802, + "time_s": 133.8 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 267.6 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "cost_rank": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 17.3 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 34.1 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 67.5 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 134.4 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 268.2 + } + }, + "precompute_s": 0.62, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "geometry_first": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 18.3 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 35.1 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 68.5 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 135.4 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 269.2 + } + }, + "precompute_s": 1.62, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + } + } + }, + { + "task": "C08_sky130_sW2_sL1", + "n_evaluated": 64, + "n_feasible": 64, + "best_evaluated": 365.0917, + "methods": { + "baseline_independent": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.2348853726337794, + "gap_or_inf": 0.2348853726337794, + "time_s": 19.8 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.2348853726337794, + "gap_or_inf": 0.2348853726337794, + "time_s": 19.8 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.2348853726337794, + "gap_or_inf": 0.2348853726337794, + "time_s": 19.8 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.2348853726337794, + "gap_or_inf": 0.2348853726337794, + "time_s": 19.8 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.2348853726337794, + "gap_or_inf": 0.2348853726337794, + "time_s": 19.8 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "fixed_mode": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.18642330132402352, + "gap_or_inf": 0.18642330132402352, + "time_s": 19.8 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.18642330132402352, + "gap_or_inf": 0.18642330132402352, + "time_s": 39.6 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.18642330132402352, + "gap_or_inf": 0.18642330132402352, + "time_s": 79.2 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 158.3 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 316.6 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "share_most": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 19.8 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 39.6 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 79.2 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 158.3 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 316.6 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "random": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.15706577279078102, + "gap_or_inf": 0.15706577279078102, + "time_s": 19.8 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.11138089416987562, + "gap_or_inf": 0.11138089416987562, + "time_s": 39.6 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.08764304967765628, + "gap_or_inf": 0.08764304967765628, + "time_s": 79.2 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.04257943963119395, + "gap_or_inf": 0.04257943963119395, + "time_s": 158.3 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.007322543897875455, + "gap_or_inf": 0.007322543897875455, + "time_s": 316.6 + } + }, + "precompute_s": 0.0, + "n_runs": 10, + "first_feasible_query": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ] + }, + "neighbourhood": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.2348853726337794, + "gap_or_inf": 0.2348853726337794, + "time_s": 19.8 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.18642330132402352, + "gap_or_inf": 0.18642330132402352, + "time_s": 39.6 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.16614565600916142, + "gap_or_inf": 0.16614565600916142, + "time_s": 79.2 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 158.3 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 316.6 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "cost_rank": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 20.8 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 40.6 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 80.1 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 159.3 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 317.6 + } + }, + "precompute_s": 0.97, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "geometry_first": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 44.7 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 64.5 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 104.1 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 183.3 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 341.6 + } + }, + "precompute_s": 24.95, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + } + } + }, + { + "task": "C08_sky130_sW2_sL2", + "n_evaluated": 64, + "n_feasible": 64, + "best_evaluated": 536.9556, + "methods": { + "baseline_independent": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.20864816383328533, + "gap_or_inf": 0.20864816383328533, + "time_s": 19.1 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.20864816383328533, + "gap_or_inf": 0.20864816383328533, + "time_s": 19.1 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.20864816383328533, + "gap_or_inf": 0.20864816383328533, + "time_s": 19.1 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.20864816383328533, + "gap_or_inf": 0.20864816383328533, + "time_s": 19.1 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.20864816383328533, + "gap_or_inf": 0.20864816383328533, + "time_s": 19.1 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "fixed_mode": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.16121575042703706, + "gap_or_inf": 0.16121575042703706, + "time_s": 19.1 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.16121575042703706, + "gap_or_inf": 0.16121575042703706, + "time_s": 38.1 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.16121575042703706, + "gap_or_inf": 0.16121575042703706, + "time_s": 76.3 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 152.6 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 305.2 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "share_most": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 19.1 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 38.1 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 76.3 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 152.6 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 305.2 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "random": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.16856142295564097, + "gap_or_inf": 0.16856142295564097, + "time_s": 19.1 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.12716259966373383, + "gap_or_inf": 0.12716259966373383, + "time_s": 38.1 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.07519573312951752, + "gap_or_inf": 0.07519573312951752, + "time_s": 76.3 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.03819872630064747, + "gap_or_inf": 0.03819872630064747, + "time_s": 152.6 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.001244721165027407, + "gap_or_inf": 0.001244721165027407, + "time_s": 305.2 + } + }, + "precompute_s": 0.0, + "n_runs": 10, + "first_feasible_query": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ] + }, + "neighbourhood": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.20864816383328533, + "gap_or_inf": 0.20864816383328533, + "time_s": 19.1 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.16121575042703706, + "gap_or_inf": 0.16121575042703706, + "time_s": 38.1 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.16121575042703706, + "gap_or_inf": 0.16121575042703706, + "time_s": 76.3 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 152.6 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 305.2 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "cost_rank": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 20.1 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 39.1 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 77.3 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 153.6 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 306.2 + } + }, + "precompute_s": 0.99, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "geometry_first": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 37.4 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 56.5 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 94.6 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 170.9 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 323.5 + } + }, + "precompute_s": 18.34, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + } + } + }, + { + "task": "C09_gf180_sW1_sL1", + "n_evaluated": 64, + "n_feasible": 64, + "best_evaluated": 795.2894, + "methods": { + "baseline_independent": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.21816284738612146, + "gap_or_inf": 0.21816284738612146, + "time_s": 28.4 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.21816284738612146, + "gap_or_inf": 0.21816284738612146, + "time_s": 28.4 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.21816284738612146, + "gap_or_inf": 0.21816284738612146, + "time_s": 28.4 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.21816284738612146, + "gap_or_inf": 0.21816284738612146, + "time_s": 28.4 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.21816284738612146, + "gap_or_inf": 0.21816284738612146, + "time_s": 28.4 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "fixed_mode": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.1958112355074768, + "gap_or_inf": 0.1958112355074768, + "time_s": 28.4 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.1958112355074768, + "gap_or_inf": 0.1958112355074768, + "time_s": 56.8 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.1958112355074768, + "gap_or_inf": 0.1958112355074768, + "time_s": 113.5 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.1958112355074768, + "gap_or_inf": 0.1958112355074768, + "time_s": 227.0 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.17330823219824132, + "gap_or_inf": 0.17330823219824132, + "time_s": 454.1 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "share_most": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.5957924247450048, + "gap_or_inf": 0.5957924247450048, + "time_s": 28.4 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.5957924247450048, + "gap_or_inf": 0.5957924247450048, + "time_s": 56.8 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.5952547588337025, + "gap_or_inf": 0.5952547588337025, + "time_s": 113.5 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.17330823219824132, + "gap_or_inf": 0.17330823219824132, + "time_s": 227.0 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.17330823219824132, + "gap_or_inf": 0.17330823219824132, + "time_s": 454.1 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "random": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.3765991097077366, + "gap_or_inf": 0.3765991097077366, + "time_s": 28.4 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.24194146181251758, + "gap_or_inf": 0.24194146181251758, + "time_s": 56.8 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.1878369308078292, + "gap_or_inf": 0.1878369308078292, + "time_s": 113.5 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.1295050330106248, + "gap_or_inf": 0.1295050330106248, + "time_s": 227.0 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0765757471431155, + "gap_or_inf": 0.0765757471431155, + "time_s": 454.1 + } + }, + "precompute_s": 0.0, + "n_runs": 10, + "first_feasible_query": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ] + }, + "neighbourhood": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.21816284738612146, + "gap_or_inf": 0.21816284738612146, + "time_s": 28.4 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.21816284738612146, + "gap_or_inf": 0.21816284738612146, + "time_s": 56.8 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.21816284738612146, + "gap_or_inf": 0.21816284738612146, + "time_s": 113.5 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.21816284738612146, + "gap_or_inf": 0.21816284738612146, + "time_s": 227.0 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.17330823219824132, + "gap_or_inf": 0.17330823219824132, + "time_s": 454.1 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "cost_rank": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 29.0 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 57.4 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 114.1 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 227.7 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 454.7 + } + }, + "precompute_s": 0.63, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "geometry_first": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 34.4 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 62.7 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 119.5 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 233.0 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 460.1 + } + }, + "precompute_s": 5.99, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + } + } + }, + { + "task": "C09_gf180_sW2_sL1", + "n_evaluated": 64, + "n_feasible": 64, + "best_evaluated": 1479.475, + "methods": { + "baseline_independent": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.19309674039777636, + "gap_or_inf": 0.19309674039777636, + "time_s": 35.1 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.19309674039777636, + "gap_or_inf": 0.19309674039777636, + "time_s": 35.1 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.19309674039777636, + "gap_or_inf": 0.19309674039777636, + "time_s": 35.1 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.19309674039777636, + "gap_or_inf": 0.19309674039777636, + "time_s": 35.1 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.19309674039777636, + "gap_or_inf": 0.19309674039777636, + "time_s": 35.1 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "fixed_mode": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.18108166748339793, + "gap_or_inf": 0.18108166748339793, + "time_s": 35.1 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.18108166748339793, + "gap_or_inf": 0.18108166748339793, + "time_s": 70.2 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.18108166748339793, + "gap_or_inf": 0.18108166748339793, + "time_s": 140.3 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.1428224201152437, + "gap_or_inf": 0.1428224201152437, + "time_s": 280.7 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 561.4 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "share_most": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.7267560452187432, + "gap_or_inf": 0.7267560452187432, + "time_s": 35.1 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.7267560452187432, + "gap_or_inf": 0.7267560452187432, + "time_s": 70.2 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.1428224201152437, + "gap_or_inf": 0.1428224201152437, + "time_s": 140.3 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.1428224201152437, + "gap_or_inf": 0.1428224201152437, + "time_s": 280.7 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 561.4 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "random": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.22194500076040496, + "gap_or_inf": 0.22194500076040496, + "time_s": 35.1 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.12391905236654902, + "gap_or_inf": 0.12391905236654902, + "time_s": 70.2 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.11738048970073849, + "gap_or_inf": 0.11738048970073849, + "time_s": 140.3 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.10855276364926754, + "gap_or_inf": 0.10855276364926754, + "time_s": 280.7 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.046430375640007474, + "gap_or_inf": 0.046430375640007474, + "time_s": 561.4 + } + }, + "precompute_s": 0.0, + "n_runs": 10, + "first_feasible_query": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ] + }, + "neighbourhood": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.19309674039777636, + "gap_or_inf": 0.19309674039777636, + "time_s": 35.1 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.19309674039777636, + "gap_or_inf": 0.19309674039777636, + "time_s": 70.2 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.19309674039777636, + "gap_or_inf": 0.19309674039777636, + "time_s": 140.3 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.18108166748339793, + "gap_or_inf": 0.18108166748339793, + "time_s": 280.7 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.18108166748339793, + "gap_or_inf": 0.18108166748339793, + "time_s": 561.4 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "cost_rank": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 36.1 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 71.2 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 141.4 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 281.7 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 562.4 + } + }, + "precompute_s": 1.06, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "geometry_first": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 302.5 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 337.6 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 407.8 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 548.1 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 828.8 + } + }, + "precompute_s": 267.42, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + } + } + }, + { + "task": "C09_gf180_sW2_sL2", + "n_evaluated": 64, + "n_feasible": 64, + "best_evaluated": 2163.6606, + "methods": { + "baseline_independent": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.18388327633271118, + "gap_or_inf": 0.18388327633271118, + "time_s": 36.5 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.18388327633271118, + "gap_or_inf": 0.18388327633271118, + "time_s": 36.5 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.18388327633271118, + "gap_or_inf": 0.18388327633271118, + "time_s": 36.5 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.18388327633271118, + "gap_or_inf": 0.18388327633271118, + "time_s": 36.5 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.18388327633271118, + "gap_or_inf": 0.18388327633271118, + "time_s": 36.5 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "fixed_mode": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.17566757004310185, + "gap_or_inf": 0.17566757004310185, + "time_s": 36.5 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.17566757004310185, + "gap_or_inf": 0.17566757004310185, + "time_s": 73.0 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.17566757004310185, + "gap_or_inf": 0.17566757004310185, + "time_s": 146.0 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.17566757004310185, + "gap_or_inf": 0.17566757004310185, + "time_s": 291.9 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.13181226297691961, + "gap_or_inf": 0.13181226297691961, + "time_s": 583.8 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "share_most": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.5483330426223039, + "gap_or_inf": 0.5483330426223039, + "time_s": 36.5 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.5481280197088212, + "gap_or_inf": 0.5481280197088212, + "time_s": 73.0 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.5481280197088212, + "gap_or_inf": 0.5481280197088212, + "time_s": 146.0 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.13181226297691961, + "gap_or_inf": 0.13181226297691961, + "time_s": 291.9 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.1316168534011295, + "gap_or_inf": 0.1316168534011295, + "time_s": 583.8 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "random": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.2545966220395194, + "gap_or_inf": 0.2545966220395194, + "time_s": 36.5 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.2078044218210563, + "gap_or_inf": 0.2078044218210563, + "time_s": 73.0 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.13329502788006578, + "gap_or_inf": 0.13329502788006578, + "time_s": 146.0 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.11391341137329943, + "gap_or_inf": 0.11391341137329943, + "time_s": 291.9 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.09820426549339571, + "gap_or_inf": 0.09820426549339571, + "time_s": 583.8 + } + }, + "precompute_s": 0.0, + "n_runs": 10, + "first_feasible_query": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ] + }, + "neighbourhood": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.18388327633271118, + "gap_or_inf": 0.18388327633271118, + "time_s": 36.5 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.1797754231879065, + "gap_or_inf": 0.1797754231879065, + "time_s": 73.0 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.17566757004310185, + "gap_or_inf": 0.17566757004310185, + "time_s": 146.0 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.17566757004310185, + "gap_or_inf": 0.17566757004310185, + "time_s": 291.9 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.1444639699960335, + "gap_or_inf": 0.1444639699960335, + "time_s": 583.8 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "cost_rank": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 37.5 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 74.0 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 147.0 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 293.0 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 584.9 + } + }, + "precompute_s": 1.05, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "geometry_first": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 162.9 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 199.4 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 272.4 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 418.4 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 710.3 + } + }, + "precompute_s": 126.46, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + } + } + }, + { + "task": "C09_ihp130_sW1_sL1", + "n_evaluated": 64, + "n_feasible": 64, + "best_evaluated": 1214.7619, + "methods": { + "baseline_independent": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.17002871097620043, + "gap_or_inf": 0.17002871097620043, + "time_s": 32.3 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.17002871097620043, + "gap_or_inf": 0.17002871097620043, + "time_s": 32.3 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.17002871097620043, + "gap_or_inf": 0.17002871097620043, + "time_s": 32.3 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.17002871097620043, + "gap_or_inf": 0.17002871097620043, + "time_s": 32.3 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.17002871097620043, + "gap_or_inf": 0.17002871097620043, + "time_s": 32.3 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "fixed_mode": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.1632063040502012, + "gap_or_inf": 0.1632063040502012, + "time_s": 32.3 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.1632063040502012, + "gap_or_inf": 0.1632063040502012, + "time_s": 64.6 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.1632063040502012, + "gap_or_inf": 0.1632063040502012, + "time_s": 129.2 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.1632063040502012, + "gap_or_inf": 0.1632063040502012, + "time_s": 258.4 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.12931027882912693, + "gap_or_inf": 0.12931027882912693, + "time_s": 516.7 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "share_most": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.8053569180923437, + "gap_or_inf": 0.8053569180923437, + "time_s": 32.3 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.7986765966235854, + "gap_or_inf": 0.7986765966235854, + "time_s": 64.6 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.7986765966235854, + "gap_or_inf": 0.7986765966235854, + "time_s": 129.2 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.12932633135761007, + "gap_or_inf": 0.12932633135761007, + "time_s": 258.4 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 516.7 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "random": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.2794584601311582, + "gap_or_inf": 0.2794584601311582, + "time_s": 32.3 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.09658250723866138, + "gap_or_inf": 0.09658250723866138, + "time_s": 64.6 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0897552763220513, + "gap_or_inf": 0.0897552763220513, + "time_s": 129.2 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.08166122101788013, + "gap_or_inf": 0.08166122101788013, + "time_s": 258.4 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0387946889015864, + "gap_or_inf": 0.0387946889015864, + "time_s": 516.7 + } + }, + "precompute_s": 0.0, + "n_runs": 10, + "first_feasible_query": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ] + }, + "neighbourhood": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.17002871097620043, + "gap_or_inf": 0.17002871097620043, + "time_s": 32.3 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.17002871097620043, + "gap_or_inf": 0.17002871097620043, + "time_s": 64.6 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.1632063040502012, + "gap_or_inf": 0.1632063040502012, + "time_s": 129.2 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.1632063040502012, + "gap_or_inf": 0.1632063040502012, + "time_s": 258.4 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.14245878142868995, + "gap_or_inf": 0.14245878142868995, + "time_s": 516.7 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "cost_rank": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 33.0 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 65.3 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 129.9 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 259.1 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 517.4 + } + }, + "precompute_s": 0.72, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "geometry_first": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 1079.2 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 1111.5 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 1176.1 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 1305.3 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 1563.7 + } + }, + "precompute_s": 1046.95, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + } + } + }, + { + "task": "C09_ihp130_sW1_sL2", + "n_evaluated": 64, + "n_feasible": 64, + "best_evaluated": 1685.1747, + "methods": { + "baseline_independent": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.16433405984554583, + "gap_or_inf": 0.16433405984554583, + "time_s": 31.8 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.16433405984554583, + "gap_or_inf": 0.16433405984554583, + "time_s": 31.8 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.16433405984554583, + "gap_or_inf": 0.16433405984554583, + "time_s": 31.8 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.16433405984554583, + "gap_or_inf": 0.16433405984554583, + "time_s": 31.8 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.16433405984554583, + "gap_or_inf": 0.16433405984554583, + "time_s": 31.8 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "fixed_mode": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.15941611276267076, + "gap_or_inf": 0.15941611276267076, + "time_s": 31.8 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.15941611276267076, + "gap_or_inf": 0.15941611276267076, + "time_s": 63.5 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.15941611276267076, + "gap_or_inf": 0.15941611276267076, + "time_s": 127.0 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.11002301423110605, + "gap_or_inf": 0.11002301423110605, + "time_s": 254.0 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 508.1 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "share_most": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.6171013011291944, + "gap_or_inf": 0.6171013011291944, + "time_s": 31.8 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.6171013011291944, + "gap_or_inf": 0.6171013011291944, + "time_s": 63.5 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.11002301423110605, + "gap_or_inf": 0.11002301423110605, + "time_s": 127.0 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.11002301423110605, + "gap_or_inf": 0.11002301423110605, + "time_s": 254.0 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 508.1 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "random": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.1958113600922206, + "gap_or_inf": 0.1958113600922206, + "time_s": 31.8 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.1291040448209909, + "gap_or_inf": 0.1291040448209909, + "time_s": 63.5 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.08899836913051204, + "gap_or_inf": 0.08899836913051204, + "time_s": 127.0 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.07046107445121261, + "gap_or_inf": 0.07046107445121261, + "time_s": 254.0 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.024571304090905154, + "gap_or_inf": 0.024571304090905154, + "time_s": 508.1 + } + }, + "precompute_s": 0.0, + "n_runs": 10, + "first_feasible_query": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ] + }, + "neighbourhood": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.16433405984554583, + "gap_or_inf": 0.16433405984554583, + "time_s": 31.8 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.15941611276267076, + "gap_or_inf": 0.15941611276267076, + "time_s": 63.5 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.15941611276267076, + "gap_or_inf": 0.15941611276267076, + "time_s": 127.0 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.15941611276267076, + "gap_or_inf": 0.15941611276267076, + "time_s": 254.0 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.12294695618205043, + "gap_or_inf": 0.12294695618205043, + "time_s": 508.1 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "cost_rank": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 32.9 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 64.6 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 128.2 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 255.2 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 509.2 + } + }, + "precompute_s": 1.13, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "geometry_first": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 327.9 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 359.7 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 423.2 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 550.2 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 804.2 + } + }, + "precompute_s": 296.17, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + } + } + }, + { + "task": "C09_ihp130_sW2_sL1", + "n_evaluated": 64, + "n_feasible": 64, + "best_evaluated": 2372.7011, + "methods": { + "baseline_independent": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.16007292279672303, + "gap_or_inf": 0.16007292279672303, + "time_s": 58.1 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.16007292279672303, + "gap_or_inf": 0.16007292279672303, + "time_s": 58.1 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.16007292279672303, + "gap_or_inf": 0.16007292279672303, + "time_s": 58.1 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.16007292279672303, + "gap_or_inf": 0.16007292279672303, + "time_s": 58.1 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.16007292279672303, + "gap_or_inf": 0.16007292279672303, + "time_s": 58.1 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "fixed_mode": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.15658006817630743, + "gap_or_inf": 0.15658006817630743, + "time_s": 58.4 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.15658006817630743, + "gap_or_inf": 0.15658006817630743, + "time_s": 106.7 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.15658006817630743, + "gap_or_inf": 0.15658006817630743, + "time_s": 224.2 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.15658006817630743, + "gap_or_inf": 0.15658006817630743, + "time_s": 5852.6 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 8953.9 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "share_most": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.8195554425291915, + "gap_or_inf": 0.8195554425291915, + "time_s": 1401.5 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.8195554425291915, + "gap_or_inf": 0.8195554425291915, + "time_s": 2813.5 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.8161352898601513, + "gap_or_inf": 0.8161352898601513, + "time_s": 5628.4 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.1181734606183642, + "gap_or_inf": 0.1181734606183642, + "time_s": 8537.2 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 10929.5 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "random": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.3259506096237742, + "gap_or_inf": 0.3259506096237742, + "time_s": 439.19 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.22832413235700005, + "gap_or_inf": 0.22832413235700005, + "time_s": 876.88 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.09072884907416265, + "gap_or_inf": 0.09072884907416265, + "time_s": 1527.98 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.04566401979583512, + "gap_or_inf": 0.04566401979583512, + "time_s": 3062.33 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.044115611528143986, + "gap_or_inf": 0.044115611528143986, + "time_s": 5818.73 + } + }, + "precompute_s": 0.0, + "n_runs": 10, + "first_feasible_query": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ] + }, + "neighbourhood": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.16007292279672303, + "gap_or_inf": 0.16007292279672303, + "time_s": 58.1 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.16007292279672303, + "gap_or_inf": 0.16007292279672303, + "time_s": 115.0 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.15658006817630743, + "gap_or_inf": 0.15658006817630743, + "time_s": 226.8 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.15658006817630743, + "gap_or_inf": 0.15658006817630743, + "time_s": 442.4 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.15658006817630743, + "gap_or_inf": 0.15658006817630743, + "time_s": 894.0 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "cost_rank": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 51.4 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 94.4 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 194.1 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 397.1 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 811.3 + } + }, + "precompute_s": 0.32, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "geometry_first": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 19811.4 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 19854.4 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 19954.2 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 20157.1 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 20571.3 + } + }, + "precompute_s": 19760.38, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + } + } + }, + { + "task": "C09_ihp130_sW2_sL2", + "n_evaluated": 64, + "n_feasible": 64, + "best_evaluated": 3313.5267, + "methods": { + "baseline_independent": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.15710741066308587, + "gap_or_inf": 0.15710741066308587, + "time_s": 51.5 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.15710741066308587, + "gap_or_inf": 0.15710741066308587, + "time_s": 51.5 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.15710741066308587, + "gap_or_inf": 0.15710741066308587, + "time_s": 51.5 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.15710741066308587, + "gap_or_inf": 0.15710741066308587, + "time_s": 51.5 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.15710741066308587, + "gap_or_inf": 0.15710741066308587, + "time_s": 51.5 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "fixed_mode": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.15460629908308876, + "gap_or_inf": 0.15460629908308876, + "time_s": 54.2 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.15460629908308876, + "gap_or_inf": 0.15460629908308876, + "time_s": 114.2 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.15460629908308876, + "gap_or_inf": 0.15460629908308876, + "time_s": 213.3 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.15460629908308876, + "gap_or_inf": 0.15460629908308876, + "time_s": 7482.5 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.10202060541718283, + "gap_or_inf": 0.10202060541718283, + "time_s": 11494.2 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "share_most": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.6289381341034614, + "gap_or_inf": 0.6289381341034614, + "time_s": 1880.3 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.6264890818595186, + "gap_or_inf": 0.6264890818595186, + "time_s": 3640.5 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.6264890818595186, + "gap_or_inf": 0.6264890818595186, + "time_s": 7269.2 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.11485137572605053, + "gap_or_inf": 0.11485137572605053, + "time_s": 11078.9 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.10202060541718283, + "gap_or_inf": 0.10202060541718283, + "time_s": 13760.1 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "random": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.1765643807849806, + "gap_or_inf": 0.1765643807849806, + "time_s": 235.74 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.10991263477671695, + "gap_or_inf": 0.10991263477671695, + "time_s": 693.64 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.06349819363157694, + "gap_or_inf": 0.06349819363157694, + "time_s": 1838.0900000000001 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.036506100886406025, + "gap_or_inf": 0.036506100886406025, + "time_s": 2858.38 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.00152291816450425, + "gap_or_inf": 0.00152291816450425, + "time_s": 4964.34 + } + }, + "precompute_s": 0.0, + "n_runs": 10, + "first_feasible_query": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ] + }, + "neighbourhood": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.15710741066308587, + "gap_or_inf": 0.15710741066308587, + "time_s": 51.5 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.15710741066308587, + "gap_or_inf": 0.15710741066308587, + "time_s": 1931.8 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.15710741066308587, + "gap_or_inf": 0.15710741066308587, + "time_s": 5502.6 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.11485137572605053, + "gap_or_inf": 0.11485137572605053, + "time_s": 11066.6 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.11485137572605053, + "gap_or_inf": 0.11485137572605053, + "time_s": 13805.9 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "cost_rank": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 52.9 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 100.0 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 188.4 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 398.4 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 824.7 + } + }, + "precompute_s": 0.32, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "geometry_first": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 19925.2 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 19972.3 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 20060.7 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 20270.7 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 20697.0 + } + }, + "precompute_s": 19872.62, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + } + } + }, + { + "task": "C09_sky130_sW1_sL1", + "n_evaluated": 64, + "n_feasible": 64, + "best_evaluated": 1149.8563, + "methods": { + "baseline_independent": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.187738415661157, + "gap_or_inf": 0.187738415661157, + "time_s": 17.5 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.187738415661157, + "gap_or_inf": 0.187738415661157, + "time_s": 17.5 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.187738415661157, + "gap_or_inf": 0.187738415661157, + "time_s": 17.5 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.187738415661157, + "gap_or_inf": 0.187738415661157, + "time_s": 17.5 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.187738415661157, + "gap_or_inf": 0.187738415661157, + "time_s": 17.5 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "fixed_mode": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.1795515665740146, + "gap_or_inf": 0.1795515665740146, + "time_s": 17.5 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.1795515665740146, + "gap_or_inf": 0.1795515665740146, + "time_s": 35.0 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.1795515665740146, + "gap_or_inf": 0.1795515665740146, + "time_s": 70.0 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.1795515665740146, + "gap_or_inf": 0.1795515665740146, + "time_s": 140.0 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.1379104502014732, + "gap_or_inf": 0.1379104502014732, + "time_s": 280.1 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "share_most": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.9508282904568164, + "gap_or_inf": 0.9508282904568164, + "time_s": 17.5 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.9508282904568164, + "gap_or_inf": 0.9508282904568164, + "time_s": 35.0 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.9508282904568164, + "gap_or_inf": 0.9508282904568164, + "time_s": 70.0 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.9508282904568164, + "gap_or_inf": 0.9508282904568164, + "time_s": 140.0 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.1379104502014732, + "gap_or_inf": 0.1379104502014732, + "time_s": 280.1 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "random": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.4241681243125772, + "gap_or_inf": 0.4241681243125772, + "time_s": 17.5 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.16159633164596313, + "gap_or_inf": 0.16159633164596313, + "time_s": 35.0 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.1527037421980469, + "gap_or_inf": 0.1527037421980469, + "time_s": 70.0 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.1460508760964305, + "gap_or_inf": 0.1460508760964305, + "time_s": 140.0 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.12085910213302309, + "gap_or_inf": 0.12085910213302309, + "time_s": 280.1 + } + }, + "precompute_s": 0.0, + "n_runs": 10, + "first_feasible_query": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ] + }, + "neighbourhood": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.187738415661157, + "gap_or_inf": 0.187738415661157, + "time_s": 17.5 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.187738415661157, + "gap_or_inf": 0.187738415661157, + "time_s": 35.0 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.187738415661157, + "gap_or_inf": 0.187738415661157, + "time_s": 70.0 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.187738415661157, + "gap_or_inf": 0.187738415661157, + "time_s": 140.0 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.1795515665740146, + "gap_or_inf": 0.1795515665740146, + "time_s": 280.1 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "cost_rank": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 18.2 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 35.7 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 70.7 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 140.8 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 280.8 + } + }, + "precompute_s": 0.71, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "geometry_first": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 998.4 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 1015.9 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 1050.9 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 1120.9 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 1260.9 + } + }, + "precompute_s": 980.85, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + } + } + }, + { + "task": "C09_sky130_sW2_sL1", + "n_evaluated": 64, + "n_feasible": 64, + "best_evaluated": 2235.4563, + "methods": { + "baseline_independent": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.17882854610040932, + "gap_or_inf": 0.17882854610040932, + "time_s": 30.4 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.17882854610040932, + "gap_or_inf": 0.17882854610040932, + "time_s": 30.4 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.17882854610040932, + "gap_or_inf": 0.17882854610040932, + "time_s": 30.4 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.17882854610040932, + "gap_or_inf": 0.17882854610040932, + "time_s": 30.4 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.17882854610040932, + "gap_or_inf": 0.17882854610040932, + "time_s": 30.4 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "fixed_mode": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.17461750426523648, + "gap_or_inf": 0.17461750426523648, + "time_s": 30.6 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.17461750426523648, + "gap_or_inf": 0.17461750426523648, + "time_s": 59.1 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.17461750426523648, + "gap_or_inf": 0.17461750426523648, + "time_s": 120.9 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.17461750426523648, + "gap_or_inf": 0.17461750426523648, + "time_s": 4424.6 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.12651001050657995, + "gap_or_inf": 0.12651001050657995, + "time_s": 10096.4 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "share_most": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.9816295223485247, + "gap_or_inf": 0.9816295223485247, + "time_s": 530.0 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.9773356338927317, + "gap_or_inf": 0.9773356338927317, + "time_s": 1792.0 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.9773356338927317, + "gap_or_inf": 0.9773356338927317, + "time_s": 4303.8 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.9773356338927317, + "gap_or_inf": 0.9773356338927317, + "time_s": 8599.1 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.12651001050657995, + "gap_or_inf": 0.12651001050657995, + "time_s": 10098.6 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "random": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.5219126627525666, + "gap_or_inf": 0.5219126627525666, + "time_s": 568.67 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.24713176455294622, + "gap_or_inf": 0.24713176455294622, + "time_s": 997.42 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.1546383930654337, + "gap_or_inf": 0.1546383930654337, + "time_s": 1416.55 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.09872903353109616, + "gap_or_inf": 0.09872903353109616, + "time_s": 3375.96 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.06817375495105862, + "gap_or_inf": 0.06817375495105862, + "time_s": 6709.88 + } + }, + "precompute_s": 0.0, + "n_runs": 10, + "first_feasible_query": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ] + }, + "neighbourhood": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.17882854610040932, + "gap_or_inf": 0.17882854610040932, + "time_s": 30.4 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.17882854610040932, + "gap_or_inf": 0.17882854610040932, + "time_s": 83.5 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.17882854610040932, + "gap_or_inf": 0.17882854610040932, + "time_s": 143.9 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.17461750426523648, + "gap_or_inf": 0.17461750426523648, + "time_s": 307.1 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.17461750426523648, + "gap_or_inf": 0.17461750426523648, + "time_s": 571.7 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "cost_rank": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 29.8 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 59.6 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 145.1 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 291.5 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 609.4 + } + }, + "precompute_s": 0.31, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "geometry_first": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 20839.7 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 20869.5 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 20955.0 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 21101.4 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 21419.3 + } + }, + "precompute_s": 20810.22, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + } + } + }, + { + "task": "C11_gf180_sW1_sL1", + "n_evaluated": 64, + "n_feasible": 64, + "best_evaluated": 2157.3144, + "methods": { + "baseline_independent": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.13101307811230467, + "gap_or_inf": 0.13101307811230467, + "time_s": 35.2 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.13101307811230467, + "gap_or_inf": 0.13101307811230467, + "time_s": 35.2 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.13101307811230467, + "gap_or_inf": 0.13101307811230467, + "time_s": 35.2 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.13101307811230467, + "gap_or_inf": 0.13101307811230467, + "time_s": 35.2 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.13101307811230467, + "gap_or_inf": 0.13101307811230467, + "time_s": 35.2 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "fixed_mode": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.10034962915002077, + "gap_or_inf": 0.10034962915002077, + "time_s": 35.2 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.10034962915002077, + "gap_or_inf": 0.10034962915002077, + "time_s": 70.5 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.09516480305327746, + "gap_or_inf": 0.09516480305327746, + "time_s": 140.9 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.06358762542909835, + "gap_or_inf": 0.06358762542909835, + "time_s": 281.8 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.04170444511935756, + "gap_or_inf": 0.04170444511935756, + "time_s": 563.6 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "share_most": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.06453542422931013, + "gap_or_inf": 0.06453542422931013, + "time_s": 35.2 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.06358762542909835, + "gap_or_inf": 0.06358762542909835, + "time_s": 70.5 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.06358762542909835, + "gap_or_inf": 0.06358762542909835, + "time_s": 140.9 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.04170444511935756, + "gap_or_inf": 0.04170444511935756, + "time_s": 281.8 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.04170444511935756, + "gap_or_inf": 0.04170444511935756, + "time_s": 563.6 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "random": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.10124676774048307, + "gap_or_inf": 0.10124676774048307, + "time_s": 35.2 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.09434189101041535, + "gap_or_inf": 0.09434189101041535, + "time_s": 70.5 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0759851276197849, + "gap_or_inf": 0.0759851276197849, + "time_s": 140.9 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0575257783473748, + "gap_or_inf": 0.0575257783473748, + "time_s": 281.8 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.031921142323993165, + "gap_or_inf": 0.031921142323993165, + "time_s": 563.6 + } + }, + "precompute_s": 0.0, + "n_runs": 10, + "first_feasible_query": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ] + }, + "neighbourhood": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.13101307811230467, + "gap_or_inf": 0.13101307811230467, + "time_s": 35.2 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.13101307811230467, + "gap_or_inf": 0.13101307811230467, + "time_s": 70.5 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.09516480305327746, + "gap_or_inf": 0.09516480305327746, + "time_s": 140.9 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.09516480305327746, + "gap_or_inf": 0.09516480305327746, + "time_s": 281.8 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.06358762542909835, + "gap_or_inf": 0.06358762542909835, + "time_s": 563.6 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "cost_rank": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.029725291779445717, + "gap_or_inf": 0.029725291779445717, + "time_s": 36.3 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 71.5 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 142.0 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 282.9 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 564.7 + } + }, + "precompute_s": 1.06, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "geometry_first": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 47.4 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 82.6 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 153.1 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 294.0 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 575.8 + } + }, + "precompute_s": 12.17, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + } + } + }, + { + "task": "C11_gf180_sW1_sL2", + "n_evaluated": 64, + "n_feasible": 64, + "best_evaluated": 3112.4925, + "methods": { + "baseline_independent": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.09699361524565919, + "gap_or_inf": 0.09699361524565919, + "time_s": 37.5 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.09699361524565919, + "gap_or_inf": 0.09699361524565919, + "time_s": 37.5 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.09699361524565919, + "gap_or_inf": 0.09699361524565919, + "time_s": 37.5 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.09699361524565919, + "gap_or_inf": 0.09699361524565919, + "time_s": 37.5 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.09699361524565919, + "gap_or_inf": 0.09699361524565919, + "time_s": 37.5 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "fixed_mode": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.07029954289046492, + "gap_or_inf": 0.07029954289046492, + "time_s": 37.5 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.07029954289046492, + "gap_or_inf": 0.07029954289046492, + "time_s": 74.9 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.07029954289046492, + "gap_or_inf": 0.07029954289046492, + "time_s": 149.9 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.04335920488161826, + "gap_or_inf": 0.04335920488161826, + "time_s": 299.8 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.03604464910357219, + "gap_or_inf": 0.03604464910357219, + "time_s": 599.5 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "share_most": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.051370147879874484, + "gap_or_inf": 0.051370147879874484, + "time_s": 37.5 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.051370147879874484, + "gap_or_inf": 0.051370147879874484, + "time_s": 74.9 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.04335920488161826, + "gap_or_inf": 0.04335920488161826, + "time_s": 149.9 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.03604464910357219, + "gap_or_inf": 0.03604464910357219, + "time_s": 299.8 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.03604464910357219, + "gap_or_inf": 0.03604464910357219, + "time_s": 599.5 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "random": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.07560563117822779, + "gap_or_inf": 0.07560563117822779, + "time_s": 37.5 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.06562605050453943, + "gap_or_inf": 0.06562605050453943, + "time_s": 74.9 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.050361374364757516, + "gap_or_inf": 0.050361374364757516, + "time_s": 149.9 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.03908707892468814, + "gap_or_inf": 0.03908707892468814, + "time_s": 299.8 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.029151350565503376, + "gap_or_inf": 0.029151350565503376, + "time_s": 599.5 + } + }, + "precompute_s": 0.0, + "n_runs": 10, + "first_feasible_query": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ] + }, + "neighbourhood": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.09699361524565919, + "gap_or_inf": 0.09699361524565919, + "time_s": 37.5 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.051370147879874484, + "gap_or_inf": 0.051370147879874484, + "time_s": 74.9 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.04335920488161826, + "gap_or_inf": 0.04335920488161826, + "time_s": 149.9 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.03604464910357219, + "gap_or_inf": 0.03604464910357219, + "time_s": 299.8 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.03604464910357219, + "gap_or_inf": 0.03604464910357219, + "time_s": 599.5 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "cost_rank": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 38.5 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 76.0 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 150.9 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 300.8 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 600.6 + } + }, + "precompute_s": 1.06, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "geometry_first": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 46.2 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 83.6 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 158.6 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 308.5 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 608.2 + } + }, + "precompute_s": 8.71, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + } + } + }, + { + "task": "C11_gf180_sW2_sL1", + "n_evaluated": 64, + "n_feasible": 64, + "best_evaluated": 3952.806, + "methods": { + "baseline_independent": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.11030442677935626, + "gap_or_inf": 0.11030442677935626, + "time_s": 40.7 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.11030442677935626, + "gap_or_inf": 0.11030442677935626, + "time_s": 40.7 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.11030442677935626, + "gap_or_inf": 0.11030442677935626, + "time_s": 40.7 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.11030442677935626, + "gap_or_inf": 0.11030442677935626, + "time_s": 40.7 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.11030442677935626, + "gap_or_inf": 0.11030442677935626, + "time_s": 40.7 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "fixed_mode": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.08500100940951816, + "gap_or_inf": 0.08500100940951816, + "time_s": 40.7 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.08500100940951816, + "gap_or_inf": 0.08500100940951816, + "time_s": 81.4 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.08500100940951816, + "gap_or_inf": 0.08500100940951816, + "time_s": 162.8 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.052804033387927385, + "gap_or_inf": 0.052804033387927385, + "time_s": 325.5 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.052804033387927385, + "gap_or_inf": 0.052804033387927385, + "time_s": 651.0 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "share_most": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.052804033387927385, + "gap_or_inf": 0.052804033387927385, + "time_s": 40.7 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.052804033387927385, + "gap_or_inf": 0.052804033387927385, + "time_s": 81.4 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.052804033387927385, + "gap_or_inf": 0.052804033387927385, + "time_s": 162.8 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.052804033387927385, + "gap_or_inf": 0.052804033387927385, + "time_s": 325.5 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.052804033387927385, + "gap_or_inf": 0.052804033387927385, + "time_s": 651.0 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "random": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.08488423160661059, + "gap_or_inf": 0.08488423160661059, + "time_s": 40.7 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.05669073817435009, + "gap_or_inf": 0.05669073817435009, + "time_s": 81.4 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.05511967194949614, + "gap_or_inf": 0.05511967194949614, + "time_s": 162.8 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.03012719824853536, + "gap_or_inf": 0.03012719824853536, + "time_s": 325.5 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.017985208482278157, + "gap_or_inf": 0.017985208482278157, + "time_s": 651.0 + } + }, + "precompute_s": 0.0, + "n_runs": 10, + "first_feasible_query": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ] + }, + "neighbourhood": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.11030442677935626, + "gap_or_inf": 0.11030442677935626, + "time_s": 40.7 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.09073959106518248, + "gap_or_inf": 0.09073959106518248, + "time_s": 81.4 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.09073959106518248, + "gap_or_inf": 0.09073959106518248, + "time_s": 162.8 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.08500100940951816, + "gap_or_inf": 0.08500100940951816, + "time_s": 325.5 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.052804033387927385, + "gap_or_inf": 0.052804033387927385, + "time_s": 651.0 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "cost_rank": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 42.0 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 82.6 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 164.0 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 326.8 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 652.3 + } + }, + "precompute_s": 1.26, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "geometry_first": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 226.7 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 267.4 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 348.8 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 511.6 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 837.1 + } + }, + "precompute_s": 186.03, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + } + } + }, + { + "task": "C11_gf180_sW2_sL2", + "n_evaluated": 64, + "n_feasible": 64, + "best_evaluated": 5755.7148, + "methods": { + "baseline_independent": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.10111175070731448, + "gap_or_inf": 0.10111175070731448, + "time_s": 32.9 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.10111175070731448, + "gap_or_inf": 0.10111175070731448, + "time_s": 32.9 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.10111175070731448, + "gap_or_inf": 0.10111175070731448, + "time_s": 32.9 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.10111175070731448, + "gap_or_inf": 0.10111175070731448, + "time_s": 32.9 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.10111175070731448, + "gap_or_inf": 0.10111175070731448, + "time_s": 32.9 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "fixed_mode": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.07784994836783787, + "gap_or_inf": 0.07784994836783787, + "time_s": 32.9 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.07784994836783787, + "gap_or_inf": 0.07784994836783787, + "time_s": 65.9 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.07784994836783787, + "gap_or_inf": 0.07784994836783787, + "time_s": 131.7 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.05377683063796024, + "gap_or_inf": 0.05377683063796024, + "time_s": 263.4 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.046889137036463246, + "gap_or_inf": 0.046889137036463246, + "time_s": 526.9 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "share_most": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.05377683063796024, + "gap_or_inf": 0.05377683063796024, + "time_s": 32.9 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.05377683063796024, + "gap_or_inf": 0.05377683063796024, + "time_s": 65.9 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.05377683063796024, + "gap_or_inf": 0.05377683063796024, + "time_s": 131.7 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.046889137036463246, + "gap_or_inf": 0.046889137036463246, + "time_s": 263.4 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.046889137036463246, + "gap_or_inf": 0.046889137036463246, + "time_s": 526.9 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "random": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.08371687387985242, + "gap_or_inf": 0.08371687387985242, + "time_s": 32.9 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.07274294410834954, + "gap_or_inf": 0.07274294410834954, + "time_s": 65.9 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0574096218249035, + "gap_or_inf": 0.0574096218249035, + "time_s": 131.7 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.036361501094529534, + "gap_or_inf": 0.036361501094529534, + "time_s": 263.4 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.025629280658589958, + "gap_or_inf": 0.025629280658589958, + "time_s": 526.9 + } + }, + "precompute_s": 0.0, + "n_runs": 10, + "first_feasible_query": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ] + }, + "neighbourhood": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.10111175070731448, + "gap_or_inf": 0.10111175070731448, + "time_s": 32.9 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0876753657078353, + "gap_or_inf": 0.0876753657078353, + "time_s": 65.9 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0876753657078353, + "gap_or_inf": 0.0876753657078353, + "time_s": 131.7 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.05377683063796024, + "gap_or_inf": 0.05377683063796024, + "time_s": 263.4 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.046889137036463246, + "gap_or_inf": 0.046889137036463246, + "time_s": 526.9 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "cost_rank": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 34.2 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 67.1 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 133.0 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 264.7 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 528.1 + } + }, + "precompute_s": 1.25, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "geometry_first": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 126.5 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 159.4 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 225.3 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 357.0 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 620.5 + } + }, + "precompute_s": 93.58, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + } + } + }, + { + "task": "C11_ihp130_sW1_sL1", + "n_evaluated": 64, + "n_feasible": 64, + "best_evaluated": 1927.1642, + "methods": { + "baseline_independent": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.08594654259351664, + "gap_or_inf": 0.08594654259351664, + "time_s": 14.2 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.08594654259351664, + "gap_or_inf": 0.08594654259351664, + "time_s": 14.2 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.08594654259351664, + "gap_or_inf": 0.08594654259351664, + "time_s": 14.2 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.08594654259351664, + "gap_or_inf": 0.08594654259351664, + "time_s": 14.2 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.08594654259351664, + "gap_or_inf": 0.08594654259351664, + "time_s": 14.2 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "fixed_mode": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0713023830558912, + "gap_or_inf": 0.0713023830558912, + "time_s": 14.2 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0713023830558912, + "gap_or_inf": 0.0713023830558912, + "time_s": 28.5 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0713023830558912, + "gap_or_inf": 0.0713023830558912, + "time_s": 56.9 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.041569991804538464, + "gap_or_inf": 0.041569991804538464, + "time_s": 113.9 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.02771216899940332, + "gap_or_inf": 0.02771216899940332, + "time_s": 227.8 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "share_most": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.041569991804538464, + "gap_or_inf": 0.041569991804538464, + "time_s": 14.2 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.041569991804538464, + "gap_or_inf": 0.041569991804538464, + "time_s": 28.5 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.041569991804538464, + "gap_or_inf": 0.041569991804538464, + "time_s": 56.9 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.02771216899940332, + "gap_or_inf": 0.02771216899940332, + "time_s": 113.9 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.02771216899940332, + "gap_or_inf": 0.02771216899940332, + "time_s": 227.8 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "random": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.04984861694711853, + "gap_or_inf": 0.04984861694711853, + "time_s": 14.2 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.03672271931992095, + "gap_or_inf": 0.03672271931992095, + "time_s": 28.5 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.03525830855512986, + "gap_or_inf": 0.03525830855512986, + "time_s": 56.9 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.032335288295621115, + "gap_or_inf": 0.032335288295621115, + "time_s": 113.9 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.018977422889030416, + "gap_or_inf": 0.018977422889030416, + "time_s": 227.8 + } + }, + "precompute_s": 0.0, + "n_runs": 10, + "first_feasible_query": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ] + }, + "neighbourhood": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.08594654259351664, + "gap_or_inf": 0.08594654259351664, + "time_s": 14.2 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.08594654259351664, + "gap_or_inf": 0.08594654259351664, + "time_s": 28.5 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0713023830558912, + "gap_or_inf": 0.0713023830558912, + "time_s": 56.9 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0713023830558912, + "gap_or_inf": 0.0713023830558912, + "time_s": 113.9 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.05355018529298139, + "gap_or_inf": 0.05355018529298139, + "time_s": 227.8 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "cost_rank": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 15.3 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 29.5 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 58.0 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 114.9 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 228.8 + } + }, + "precompute_s": 1.04, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "geometry_first": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 30.9 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 45.1 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 73.6 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 130.5 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 244.4 + } + }, + "precompute_s": 16.64, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + } + } + }, + { + "task": "C11_ihp130_sW1_sL2", + "n_evaluated": 64, + "n_feasible": 64, + "best_evaluated": 1921.0466, + "methods": { + "baseline_independent": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.08940475467903819, + "gap_or_inf": 0.08940475467903819, + "time_s": 15.0 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.08940475467903819, + "gap_or_inf": 0.08940475467903819, + "time_s": 15.0 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.08940475467903819, + "gap_or_inf": 0.08940475467903819, + "time_s": 15.0 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.08940475467903819, + "gap_or_inf": 0.08940475467903819, + "time_s": 15.0 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.08940475467903819, + "gap_or_inf": 0.08940475467903819, + "time_s": 15.0 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "fixed_mode": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.07471396060876412, + "gap_or_inf": 0.07471396060876412, + "time_s": 15.0 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.07471396060876412, + "gap_or_inf": 0.07471396060876412, + "time_s": 30.0 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.07471396060876412, + "gap_or_inf": 0.07471396060876412, + "time_s": 60.0 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.04427909244887651, + "gap_or_inf": 0.04427909244887651, + "time_s": 120.0 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 240.0 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "share_most": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.05642877169143112, + "gap_or_inf": 0.05642877169143112, + "time_s": 15.0 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.04488688613800429, + "gap_or_inf": 0.04488688613800429, + "time_s": 30.0 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.04427909244887651, + "gap_or_inf": 0.04427909244887651, + "time_s": 60.0 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.04427909244887651, + "gap_or_inf": 0.04427909244887651, + "time_s": 120.0 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 240.0 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "random": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.06456199969329228, + "gap_or_inf": 0.06456199969329228, + "time_s": 15.0 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.06126440139453158, + "gap_or_inf": 0.06126440139453158, + "time_s": 30.0 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.04079340397052318, + "gap_or_inf": 0.04079340397052318, + "time_s": 60.0 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.028286669360337236, + "gap_or_inf": 0.028286669360337236, + "time_s": 120.0 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.01226931194693559, + "gap_or_inf": 0.01226931194693559, + "time_s": 240.0 + } + }, + "precompute_s": 0.0, + "n_runs": 10, + "first_feasible_query": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ] + }, + "neighbourhood": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.08940475467903819, + "gap_or_inf": 0.08940475467903819, + "time_s": 15.0 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.08940475467903819, + "gap_or_inf": 0.08940475467903819, + "time_s": 30.0 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.08940475467903819, + "gap_or_inf": 0.08940475467903819, + "time_s": 60.0 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.08940475467903819, + "gap_or_inf": 0.08940475467903819, + "time_s": 120.0 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.04427909244887651, + "gap_or_inf": 0.04427909244887651, + "time_s": 240.0 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "cost_rank": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 15.6 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 30.6 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 60.6 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 120.6 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 240.6 + } + }, + "precompute_s": 0.65, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "geometry_first": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 22.2 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 37.2 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 67.2 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 127.2 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 247.2 + } + }, + "precompute_s": 7.25, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + } + } + }, + { + "task": "C11_ihp130_sW2_sL1", + "n_evaluated": 64, + "n_feasible": 64, + "best_evaluated": 2179.5062, + "methods": { + "baseline_independent": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.1028010381434108, + "gap_or_inf": 0.1028010381434108, + "time_s": 20.2 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.1028010381434108, + "gap_or_inf": 0.1028010381434108, + "time_s": 20.2 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.1028010381434108, + "gap_or_inf": 0.1028010381434108, + "time_s": 20.2 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.1028010381434108, + "gap_or_inf": 0.1028010381434108, + "time_s": 20.2 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.1028010381434108, + "gap_or_inf": 0.1028010381434108, + "time_s": 20.2 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "fixed_mode": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.07687323853449013, + "gap_or_inf": 0.07687323853449013, + "time_s": 20.2 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.07687323853449013, + "gap_or_inf": 0.07687323853449013, + "time_s": 40.4 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.07687323853449013, + "gap_or_inf": 0.07687323853449013, + "time_s": 80.8 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.07687323853449013, + "gap_or_inf": 0.07687323853449013, + "time_s": 161.7 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.07687323853449013, + "gap_or_inf": 0.07687323853449013, + "time_s": 323.4 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "share_most": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0971720566796277, + "gap_or_inf": 0.0971720566796277, + "time_s": 20.2 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0971720566796277, + "gap_or_inf": 0.0971720566796277, + "time_s": 40.4 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0971720566796277, + "gap_or_inf": 0.0971720566796277, + "time_s": 80.8 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0971720566796277, + "gap_or_inf": 0.0971720566796277, + "time_s": 161.7 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.04775306443266847, + "gap_or_inf": 0.04775306443266847, + "time_s": 323.4 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "random": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.08536359749745157, + "gap_or_inf": 0.08536359749745157, + "time_s": 20.2 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.07108461081689063, + "gap_or_inf": 0.07108461081689063, + "time_s": 40.4 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.06292754294527825, + "gap_or_inf": 0.06292754294527825, + "time_s": 80.8 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.05368277915428741, + "gap_or_inf": 0.05368277915428741, + "time_s": 161.7 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.03234163316442973, + "gap_or_inf": 0.03234163316442973, + "time_s": 323.4 + } + }, + "precompute_s": 0.0, + "n_runs": 10, + "first_feasible_query": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ] + }, + "neighbourhood": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.1028010381434108, + "gap_or_inf": 0.1028010381434108, + "time_s": 20.2 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.1028010381434108, + "gap_or_inf": 0.1028010381434108, + "time_s": 40.4 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0971720566796277, + "gap_or_inf": 0.0971720566796277, + "time_s": 80.8 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0971720566796277, + "gap_or_inf": 0.0971720566796277, + "time_s": 161.7 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.04775306443266847, + "gap_or_inf": 0.04775306443266847, + "time_s": 323.4 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "cost_rank": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.011693749712664347, + "gap_or_inf": 0.011693749712664347, + "time_s": 21.3 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 41.5 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 82.0 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 162.8 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 324.5 + } + }, + "precompute_s": 1.12, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "geometry_first": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 115.3 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 135.5 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 175.9 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 256.8 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 418.4 + } + }, + "precompute_s": 95.09, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + } + } + }, + { + "task": "C11_ihp130_sW2_sL2", + "n_evaluated": 64, + "n_feasible": 64, + "best_evaluated": 2973.983, + "methods": { + "baseline_independent": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.09293190310771782, + "gap_or_inf": 0.09293190310771782, + "time_s": 19.5 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.09293190310771782, + "gap_or_inf": 0.09293190310771782, + "time_s": 19.5 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.09293190310771782, + "gap_or_inf": 0.09293190310771782, + "time_s": 19.5 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.09293190310771782, + "gap_or_inf": 0.09293190310771782, + "time_s": 19.5 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.09293190310771782, + "gap_or_inf": 0.09293190310771782, + "time_s": 19.5 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "fixed_mode": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.07009081760050395, + "gap_or_inf": 0.07009081760050395, + "time_s": 19.5 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.07009081760050395, + "gap_or_inf": 0.07009081760050395, + "time_s": 38.9 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.07009081760050395, + "gap_or_inf": 0.07009081760050395, + "time_s": 77.8 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.048063220267230866, + "gap_or_inf": 0.048063220267230866, + "time_s": 155.6 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.040645625748364944, + "gap_or_inf": 0.040645625748364944, + "time_s": 311.3 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "share_most": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.048063220267230866, + "gap_or_inf": 0.048063220267230866, + "time_s": 19.5 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.048063220267230866, + "gap_or_inf": 0.048063220267230866, + "time_s": 38.9 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.048063220267230866, + "gap_or_inf": 0.048063220267230866, + "time_s": 77.8 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.048063220267230866, + "gap_or_inf": 0.048063220267230866, + "time_s": 155.6 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.040645625748364944, + "gap_or_inf": 0.040645625748364944, + "time_s": 311.3 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "random": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0686298442190153, + "gap_or_inf": 0.0686298442190153, + "time_s": 19.5 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.06440525719212242, + "gap_or_inf": 0.06440525719212242, + "time_s": 38.9 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.05536285177151308, + "gap_or_inf": 0.05536285177151308, + "time_s": 77.8 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.037037881521178775, + "gap_or_inf": 0.037037881521178775, + "time_s": 155.6 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.02725638310642655, + "gap_or_inf": 0.02725638310642655, + "time_s": 311.3 + } + }, + "precompute_s": 0.0, + "n_runs": 10, + "first_feasible_query": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ] + }, + "neighbourhood": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.09293190310771782, + "gap_or_inf": 0.09293190310771782, + "time_s": 19.5 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.09293190310771782, + "gap_or_inf": 0.09293190310771782, + "time_s": 38.9 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0774174566566117, + "gap_or_inf": 0.0774174566566117, + "time_s": 77.8 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0774174566566117, + "gap_or_inf": 0.0774174566566117, + "time_s": 155.6 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.048063220267230866, + "gap_or_inf": 0.048063220267230866, + "time_s": 311.3 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "cost_rank": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 20.6 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 40.1 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 79.0 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 156.8 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 312.4 + } + }, + "precompute_s": 1.15, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "geometry_first": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 81.7 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 101.1 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 140.0 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 217.9 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 373.5 + } + }, + "precompute_s": 62.22, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + } + } + }, + { + "task": "C11_sky130_sW1_sL1", + "n_evaluated": 64, + "n_feasible": 64, + "best_evaluated": 1298.136, + "methods": { + "baseline_independent": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.1146143393296235, + "gap_or_inf": 0.1146143393296235, + "time_s": 32.4 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.1146143393296235, + "gap_or_inf": 0.1146143393296235, + "time_s": 32.4 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.1146143393296235, + "gap_or_inf": 0.1146143393296235, + "time_s": 32.4 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.1146143393296235, + "gap_or_inf": 0.1146143393296235, + "time_s": 32.4 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.1146143393296235, + "gap_or_inf": 0.1146143393296235, + "time_s": 32.4 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "fixed_mode": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.09909269907005114, + "gap_or_inf": 0.09909269907005114, + "time_s": 32.4 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.09909269907005114, + "gap_or_inf": 0.09909269907005114, + "time_s": 64.8 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.09909269907005114, + "gap_or_inf": 0.09909269907005114, + "time_s": 129.6 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.056554937233078695, + "gap_or_inf": 0.056554937233078695, + "time_s": 259.2 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.056554937233078695, + "gap_or_inf": 0.056554937233078695, + "time_s": 518.3 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "share_most": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.056554937233078695, + "gap_or_inf": 0.056554937233078695, + "time_s": 32.4 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.056554937233078695, + "gap_or_inf": 0.056554937233078695, + "time_s": 64.8 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.056554937233078695, + "gap_or_inf": 0.056554937233078695, + "time_s": 129.6 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.056554937233078695, + "gap_or_inf": 0.056554937233078695, + "time_s": 259.2 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.056554937233078695, + "gap_or_inf": 0.056554937233078695, + "time_s": 518.3 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "random": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.08112652295291094, + "gap_or_inf": 0.08112652295291094, + "time_s": 32.4 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0687303795596147, + "gap_or_inf": 0.0687303795596147, + "time_s": 64.8 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.06717821553365746, + "gap_or_inf": 0.06717821553365746, + "time_s": 129.6 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0330261621278511, + "gap_or_inf": 0.0330261621278511, + "time_s": 259.2 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.017287364343951638, + "gap_or_inf": 0.017287364343951638, + "time_s": 518.3 + } + }, + "precompute_s": 0.0, + "n_runs": 10, + "first_feasible_query": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ] + }, + "neighbourhood": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.1146143393296235, + "gap_or_inf": 0.1146143393296235, + "time_s": 32.4 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.1146143393296235, + "gap_or_inf": 0.1146143393296235, + "time_s": 64.8 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.09909269907005114, + "gap_or_inf": 0.09909269907005114, + "time_s": 129.6 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.09909269907005114, + "gap_or_inf": 0.09909269907005114, + "time_s": 259.2 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.056554937233078695, + "gap_or_inf": 0.056554937233078695, + "time_s": 518.3 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "cost_rank": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 33.1 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 65.5 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 130.3 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 259.8 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 519.0 + } + }, + "precompute_s": 0.68, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "geometry_first": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 43.7 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 76.1 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 140.9 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 270.5 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 529.7 + } + }, + "precompute_s": 11.33, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + } + } + }, + { + "task": "C11_sky130_sW1_sL2", + "n_evaluated": 64, + "n_feasible": 64, + "best_evaluated": 1512.4321, + "methods": { + "baseline_independent": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.08680402908666118, + "gap_or_inf": 0.08680402908666118, + "time_s": 34.8 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.08680402908666118, + "gap_or_inf": 0.08680402908666118, + "time_s": 34.8 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.08680402908666118, + "gap_or_inf": 0.08680402908666118, + "time_s": 34.8 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.08680402908666118, + "gap_or_inf": 0.08680402908666118, + "time_s": 34.8 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.08680402908666118, + "gap_or_inf": 0.08680402908666118, + "time_s": 34.8 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "fixed_mode": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0651524785806914, + "gap_or_inf": 0.0651524785806914, + "time_s": 34.8 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0651524785806914, + "gap_or_inf": 0.0651524785806914, + "time_s": 69.7 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.055960991571125884, + "gap_or_inf": 0.055960991571125884, + "time_s": 139.4 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.055960991571125884, + "gap_or_inf": 0.055960991571125884, + "time_s": 278.7 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.010798104589290425, + "gap_or_inf": 0.010798104589290425, + "time_s": 557.4 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "share_most": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.09757125625672725, + "gap_or_inf": 0.09757125625672725, + "time_s": 34.8 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.06223519059136606, + "gap_or_inf": 0.06223519059136606, + "time_s": 69.7 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.06223519059136606, + "gap_or_inf": 0.06223519059136606, + "time_s": 139.4 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.010798104589290425, + "gap_or_inf": 0.010798104589290425, + "time_s": 278.7 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.010798104589290425, + "gap_or_inf": 0.010798104589290425, + "time_s": 557.4 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "random": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.057383071940882525, + "gap_or_inf": 0.057383071940882525, + "time_s": 34.8 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.04392377680955069, + "gap_or_inf": 0.04392377680955069, + "time_s": 69.7 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.030636284432206916, + "gap_or_inf": 0.030636284432206916, + "time_s": 139.4 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.015407098275684605, + "gap_or_inf": 0.015407098275684605, + "time_s": 278.7 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.006211749935749222, + "gap_or_inf": 0.006211749935749222, + "time_s": 557.4 + } + }, + "precompute_s": 0.0, + "n_runs": 10, + "first_feasible_query": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ] + }, + "neighbourhood": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.08680402908666118, + "gap_or_inf": 0.08680402908666118, + "time_s": 34.8 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.055960991571125884, + "gap_or_inf": 0.055960991571125884, + "time_s": 69.7 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.055960991571125884, + "gap_or_inf": 0.055960991571125884, + "time_s": 139.4 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.055960991571125884, + "gap_or_inf": 0.055960991571125884, + "time_s": 278.7 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.055960991571125884, + "gap_or_inf": 0.055960991571125884, + "time_s": 557.4 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "cost_rank": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 35.9 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 70.7 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 140.4 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 279.8 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 558.5 + } + }, + "precompute_s": 1.04, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "geometry_first": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 49.6 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 84.5 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 154.2 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 293.5 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 572.2 + } + }, + "precompute_s": 14.8, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + } + } + }, + { + "task": "C11_sky130_sW2_sL1", + "n_evaluated": 64, + "n_feasible": 64, + "best_evaluated": 1874.8403, + "methods": { + "baseline_independent": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.10865085415541786, + "gap_or_inf": 0.10865085415541786, + "time_s": 47.3 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.10865085415541786, + "gap_or_inf": 0.10865085415541786, + "time_s": 47.3 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.10865085415541786, + "gap_or_inf": 0.10865085415541786, + "time_s": 47.3 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.10865085415541786, + "gap_or_inf": 0.10865085415541786, + "time_s": 47.3 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.10865085415541786, + "gap_or_inf": 0.10865085415541786, + "time_s": 47.3 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "fixed_mode": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.08795485140787718, + "gap_or_inf": 0.08795485140787718, + "time_s": 47.3 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.08795485140787718, + "gap_or_inf": 0.08795485140787718, + "time_s": 94.5 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0837698016199031, + "gap_or_inf": 0.0837698016199031, + "time_s": 189.1 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0837698016199031, + "gap_or_inf": 0.0837698016199031, + "time_s": 378.1 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.05079077935331355, + "gap_or_inf": 0.05079077935331355, + "time_s": 756.2 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "share_most": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.09100289768680558, + "gap_or_inf": 0.09100289768680558, + "time_s": 47.3 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.09100289768680558, + "gap_or_inf": 0.09100289768680558, + "time_s": 94.5 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.09100289768680558, + "gap_or_inf": 0.09100289768680558, + "time_s": 189.1 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.07259050277508972, + "gap_or_inf": 0.07259050277508972, + "time_s": 378.1 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.05079077935331355, + "gap_or_inf": 0.05079077935331355, + "time_s": 756.2 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "random": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.08343958149395445, + "gap_or_inf": 0.08343958149395445, + "time_s": 47.3 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.06879788641197866, + "gap_or_inf": 0.06879788641197866, + "time_s": 94.5 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.06786030255483626, + "gap_or_inf": 0.06786030255483626, + "time_s": 189.1 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.061219288917568095, + "gap_or_inf": 0.061219288917568095, + "time_s": 378.1 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.045971024838755634, + "gap_or_inf": 0.045971024838755634, + "time_s": 756.2 + } + }, + "precompute_s": 0.0, + "n_runs": 10, + "first_feasible_query": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ] + }, + "neighbourhood": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.10865085415541786, + "gap_or_inf": 0.10865085415541786, + "time_s": 47.3 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.10865085415541786, + "gap_or_inf": 0.10865085415541786, + "time_s": 94.5 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.09100289768680558, + "gap_or_inf": 0.09100289768680558, + "time_s": 189.1 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.09100289768680558, + "gap_or_inf": 0.09100289768680558, + "time_s": 378.1 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.05079077935331355, + "gap_or_inf": 0.05079077935331355, + "time_s": 756.2 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "cost_rank": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 48.0 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 95.3 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 189.8 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 378.9 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 757.0 + } + }, + "precompute_s": 0.78, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "geometry_first": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 103.0 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 150.3 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 244.8 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 433.9 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 812.0 + } + }, + "precompute_s": 55.78, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + } + } + }, + { + "task": "C11_sky130_sW2_sL2", + "n_evaluated": 64, + "n_feasible": 64, + "best_evaluated": 2707.972, + "methods": { + "baseline_independent": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.09978360189839464, + "gap_or_inf": 0.09978360189839464, + "time_s": 51.3 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.09978360189839464, + "gap_or_inf": 0.09978360189839464, + "time_s": 51.3 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.09978360189839464, + "gap_or_inf": 0.09978360189839464, + "time_s": 51.3 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.09978360189839464, + "gap_or_inf": 0.09978360189839464, + "time_s": 51.3 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.09978360189839464, + "gap_or_inf": 0.09978360189839464, + "time_s": 51.3 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "fixed_mode": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0808286053179279, + "gap_or_inf": 0.0808286053179279, + "time_s": 51.3 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0808286053179279, + "gap_or_inf": 0.0808286053179279, + "time_s": 102.7 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0808286053179279, + "gap_or_inf": 0.0808286053179279, + "time_s": 205.4 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.06145303570347105, + "gap_or_inf": 0.06145303570347105, + "time_s": 410.7 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.05247942002354522, + "gap_or_inf": 0.05247942002354522, + "time_s": 821.4 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "share_most": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.09067604834909648, + "gap_or_inf": 0.09067604834909648, + "time_s": 51.3 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.08836690335055164, + "gap_or_inf": 0.08836690335055164, + "time_s": 102.7 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.06145303570347105, + "gap_or_inf": 0.06145303570347105, + "time_s": 205.4 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.05247942002354522, + "gap_or_inf": 0.05247942002354522, + "time_s": 410.7 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.05247942002354522, + "gap_or_inf": 0.05247942002354522, + "time_s": 821.4 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "random": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.07308957773566335, + "gap_or_inf": 0.07308957773566335, + "time_s": 51.3 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.06265719512609429, + "gap_or_inf": 0.06265719512609429, + "time_s": 102.7 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.05038128902366783, + "gap_or_inf": 0.05038128902366783, + "time_s": 205.4 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.04636851858143285, + "gap_or_inf": 0.04636851858143285, + "time_s": 410.7 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.032739252843086986, + "gap_or_inf": 0.032739252843086986, + "time_s": 821.4 + } + }, + "precompute_s": 0.0, + "n_runs": 10, + "first_feasible_query": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ] + }, + "neighbourhood": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.09978360189839464, + "gap_or_inf": 0.09978360189839464, + "time_s": 51.3 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.09978360189839464, + "gap_or_inf": 0.09978360189839464, + "time_s": 102.7 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.08255742673853339, + "gap_or_inf": 0.08255742673853339, + "time_s": 205.4 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0808286053179279, + "gap_or_inf": 0.0808286053179279, + "time_s": 410.7 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0808286053179279, + "gap_or_inf": 0.0808286053179279, + "time_s": 821.4 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "cost_rank": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 52.5 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 103.9 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 206.6 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 411.9 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 822.6 + } + }, + "precompute_s": 1.2, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "geometry_first": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 106.9 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 158.3 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 260.9 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 466.3 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 877.0 + } + }, + "precompute_s": 55.58, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + } + } + }, + { + "task": "C16_gf180_sW1_sL1", + "n_evaluated": 49, + "n_feasible": 49, + "best_evaluated": 1380.0232, + "methods": { + "baseline_independent": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.2531418312387792, + "gap_or_inf": 0.2531418312387792, + "time_s": 30.2 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.2531418312387792, + "gap_or_inf": 0.2531418312387792, + "time_s": 30.2 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.2531418312387792, + "gap_or_inf": 0.2531418312387792, + "time_s": 30.2 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.2531418312387792, + "gap_or_inf": 0.2531418312387792, + "time_s": 30.2 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.2531418312387792, + "gap_or_inf": 0.2531418312387792, + "time_s": 30.2 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "fixed_mode": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.2531418312387792, + "gap_or_inf": 0.2531418312387792, + "time_s": 30.2 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.2531418312387792, + "gap_or_inf": 0.2531418312387792, + "time_s": 60.5 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.24955116696588853, + "gap_or_inf": 0.24955116696588853, + "time_s": 121.0 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.24955116696588853, + "gap_or_inf": 0.24955116696588853, + "time_s": 241.9 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.24955116696588853, + "gap_or_inf": 0.24955116696588853, + "time_s": 483.8 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "share_most": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.24955116696588853, + "gap_or_inf": 0.24955116696588853, + "time_s": 30.2 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.24955116696588853, + "gap_or_inf": 0.24955116696588853, + "time_s": 60.5 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.24955116696588853, + "gap_or_inf": 0.24955116696588853, + "time_s": 121.0 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.24955116696588853, + "gap_or_inf": 0.24955116696588853, + "time_s": 241.9 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.24955116696588853, + "gap_or_inf": 0.24955116696588853, + "time_s": 483.8 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "random": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.28581687612208245, + "gap_or_inf": 0.28581687612208245, + "time_s": 30.2 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.26427289048473956, + "gap_or_inf": 0.26427289048473956, + "time_s": 60.5 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.22459605026929969, + "gap_or_inf": 0.22459605026929969, + "time_s": 121.0 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.16409335727109503, + "gap_or_inf": 0.16409335727109503, + "time_s": 241.9 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.119210053859964, + "gap_or_inf": 0.119210053859964, + "time_s": 483.8 + } + }, + "precompute_s": 0.0, + "n_runs": 10, + "first_feasible_query": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ] + }, + "neighbourhood": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.2531418312387792, + "gap_or_inf": 0.2531418312387792, + "time_s": 30.2 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.2531418312387792, + "gap_or_inf": 0.2531418312387792, + "time_s": 60.5 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.07181328545780952, + "gap_or_inf": 0.07181328545780952, + "time_s": 121.0 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.07181328545780952, + "gap_or_inf": 0.07181328545780952, + "time_s": 241.9 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.07181328545780952, + "gap_or_inf": 0.07181328545780952, + "time_s": 483.8 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "cost_rank": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.07181328545780952, + "gap_or_inf": 0.07181328545780952, + "time_s": 30.8 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.07181328545780952, + "gap_or_inf": 0.07181328545780952, + "time_s": 61.1 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 121.5 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 242.5 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 484.4 + } + }, + "precompute_s": 0.58, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "geometry_first": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 31.1 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 61.3 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 121.8 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 242.7 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 484.7 + } + }, + "precompute_s": 0.83, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + } + } + }, + { + "task": "C16_gf180_sW1_sL2", + "n_evaluated": 49, + "n_feasible": 49, + "best_evaluated": 1380.0232, + "methods": { + "baseline_independent": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.2531418312387792, + "gap_or_inf": 0.2531418312387792, + "time_s": 27.3 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.2531418312387792, + "gap_or_inf": 0.2531418312387792, + "time_s": 27.3 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.2531418312387792, + "gap_or_inf": 0.2531418312387792, + "time_s": 27.3 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.2531418312387792, + "gap_or_inf": 0.2531418312387792, + "time_s": 27.3 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.2531418312387792, + "gap_or_inf": 0.2531418312387792, + "time_s": 27.3 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "fixed_mode": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.2531418312387792, + "gap_or_inf": 0.2531418312387792, + "time_s": 27.3 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.2531418312387792, + "gap_or_inf": 0.2531418312387792, + "time_s": 54.5 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.24955116696588853, + "gap_or_inf": 0.24955116696588853, + "time_s": 109.0 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.24955116696588853, + "gap_or_inf": 0.24955116696588853, + "time_s": 218.1 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.24955116696588853, + "gap_or_inf": 0.24955116696588853, + "time_s": 436.2 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "share_most": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.24955116696588853, + "gap_or_inf": 0.24955116696588853, + "time_s": 27.3 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.24955116696588853, + "gap_or_inf": 0.24955116696588853, + "time_s": 54.5 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.24955116696588853, + "gap_or_inf": 0.24955116696588853, + "time_s": 109.0 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.24955116696588853, + "gap_or_inf": 0.24955116696588853, + "time_s": 218.1 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.24955116696588853, + "gap_or_inf": 0.24955116696588853, + "time_s": 436.2 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "random": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.28581687612208245, + "gap_or_inf": 0.28581687612208245, + "time_s": 27.3 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.26427289048473956, + "gap_or_inf": 0.26427289048473956, + "time_s": 54.5 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.22459605026929969, + "gap_or_inf": 0.22459605026929969, + "time_s": 109.0 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.16409335727109503, + "gap_or_inf": 0.16409335727109503, + "time_s": 218.1 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.119210053859964, + "gap_or_inf": 0.119210053859964, + "time_s": 436.2 + } + }, + "precompute_s": 0.0, + "n_runs": 10, + "first_feasible_query": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ] + }, + "neighbourhood": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.2531418312387792, + "gap_or_inf": 0.2531418312387792, + "time_s": 27.3 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.2531418312387792, + "gap_or_inf": 0.2531418312387792, + "time_s": 54.5 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.07181328545780952, + "gap_or_inf": 0.07181328545780952, + "time_s": 109.0 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.07181328545780952, + "gap_or_inf": 0.07181328545780952, + "time_s": 218.1 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.07181328545780952, + "gap_or_inf": 0.07181328545780952, + "time_s": 436.2 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "cost_rank": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.07181328545780952, + "gap_or_inf": 0.07181328545780952, + "time_s": 27.8 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.07181328545780952, + "gap_or_inf": 0.07181328545780952, + "time_s": 55.1 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 109.6 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 218.7 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 436.7 + } + }, + "precompute_s": 0.58, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "geometry_first": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 28.1 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 55.3 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 109.8 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 218.9 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 437.0 + } + }, + "precompute_s": 0.8, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + } + } + }, + { + "task": "C16_gf180_sW2_sL1", + "n_evaluated": 49, + "n_feasible": 49, + "best_evaluated": 1380.0232, + "methods": { + "baseline_independent": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.2531418312387792, + "gap_or_inf": 0.2531418312387792, + "time_s": 26.2 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.2531418312387792, + "gap_or_inf": 0.2531418312387792, + "time_s": 26.2 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.2531418312387792, + "gap_or_inf": 0.2531418312387792, + "time_s": 26.2 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.2531418312387792, + "gap_or_inf": 0.2531418312387792, + "time_s": 26.2 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.2531418312387792, + "gap_or_inf": 0.2531418312387792, + "time_s": 26.2 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "fixed_mode": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.2531418312387792, + "gap_or_inf": 0.2531418312387792, + "time_s": 26.2 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.2531418312387792, + "gap_or_inf": 0.2531418312387792, + "time_s": 52.5 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.24955116696588853, + "gap_or_inf": 0.24955116696588853, + "time_s": 105.0 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.24955116696588853, + "gap_or_inf": 0.24955116696588853, + "time_s": 209.9 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.24955116696588853, + "gap_or_inf": 0.24955116696588853, + "time_s": 419.8 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "share_most": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.24955116696588853, + "gap_or_inf": 0.24955116696588853, + "time_s": 26.2 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.24955116696588853, + "gap_or_inf": 0.24955116696588853, + "time_s": 52.5 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.24955116696588853, + "gap_or_inf": 0.24955116696588853, + "time_s": 105.0 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.24955116696588853, + "gap_or_inf": 0.24955116696588853, + "time_s": 209.9 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.24955116696588853, + "gap_or_inf": 0.24955116696588853, + "time_s": 419.8 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "random": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.2590664272890484, + "gap_or_inf": 0.2590664272890484, + "time_s": 26.2 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.21903052064631942, + "gap_or_inf": 0.21903052064631942, + "time_s": 52.5 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.18904847396768387, + "gap_or_inf": 0.18904847396768387, + "time_s": 105.0 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.16193895870736075, + "gap_or_inf": 0.16193895870736075, + "time_s": 209.9 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.08366247755834819, + "gap_or_inf": 0.08366247755834819, + "time_s": 419.8 + } + }, + "precompute_s": 0.0, + "n_runs": 10, + "first_feasible_query": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ] + }, + "neighbourhood": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.2531418312387792, + "gap_or_inf": 0.2531418312387792, + "time_s": 26.2 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.2531418312387792, + "gap_or_inf": 0.2531418312387792, + "time_s": 52.5 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.2531418312387792, + "gap_or_inf": 0.2531418312387792, + "time_s": 105.0 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.07181328545780952, + "gap_or_inf": 0.07181328545780952, + "time_s": 209.9 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.07181328545780952, + "gap_or_inf": 0.07181328545780952, + "time_s": 419.8 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "cost_rank": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.07181328545780952, + "gap_or_inf": 0.07181328545780952, + "time_s": 26.9 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.07181328545780952, + "gap_or_inf": 0.07181328545780952, + "time_s": 53.1 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 105.6 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 210.5 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 420.5 + } + }, + "precompute_s": 0.61, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "geometry_first": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 27.7 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 53.9 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 106.4 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 211.4 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 421.3 + } + }, + "precompute_s": 1.44, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + } + } + }, + { + "task": "C16_gf180_sW2_sL2", + "n_evaluated": 49, + "n_feasible": 45, + "best_evaluated": 1380.0232, + "methods": { + "baseline_independent": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.2531418312387792, + "gap_or_inf": 0.2531418312387792, + "time_s": 24.8 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.2531418312387792, + "gap_or_inf": 0.2531418312387792, + "time_s": 24.8 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.2531418312387792, + "gap_or_inf": 0.2531418312387792, + "time_s": 24.8 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.2531418312387792, + "gap_or_inf": 0.2531418312387792, + "time_s": 24.8 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.2531418312387792, + "gap_or_inf": 0.2531418312387792, + "time_s": 24.8 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "fixed_mode": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.2531418312387792, + "gap_or_inf": 0.2531418312387792, + "time_s": 24.8 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.2531418312387792, + "gap_or_inf": 0.2531418312387792, + "time_s": 49.6 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.24955116696588853, + "gap_or_inf": 0.24955116696588853, + "time_s": 99.2 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.24955116696588853, + "gap_or_inf": 0.24955116696588853, + "time_s": 198.5 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.24955116696588853, + "gap_or_inf": 0.24955116696588853, + "time_s": 397.0 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "share_most": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.24955116696588853, + "gap_or_inf": 0.24955116696588853, + "time_s": 24.8 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.24955116696588853, + "gap_or_inf": 0.24955116696588853, + "time_s": 49.6 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.24955116696588853, + "gap_or_inf": 0.24955116696588853, + "time_s": 99.2 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.24955116696588853, + "gap_or_inf": 0.24955116696588853, + "time_s": 198.5 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.24955116696588853, + "gap_or_inf": 0.24955116696588853, + "time_s": 397.0 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "random": { + "prefix": { + "1": { + "found_rate": 0.8, + "gap_mean_found": 0.24349192100538591, + "gap_or_inf": Infinity, + "time_s": 24.8 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.21903052064631942, + "gap_or_inf": 0.21903052064631942, + "time_s": 49.6 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.18904847396768387, + "gap_or_inf": 0.18904847396768387, + "time_s": 99.2 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.16193895870736075, + "gap_or_inf": 0.16193895870736075, + "time_s": 198.5 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.08366247755834819, + "gap_or_inf": 0.08366247755834819, + "time_s": 397.0 + } + }, + "precompute_s": 0.0, + "n_runs": 10, + "first_feasible_query": [ + 1, + 1, + 2, + 1, + 1, + 1, + 1, + 2, + 1, + 1 + ] + }, + "neighbourhood": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.2531418312387792, + "gap_or_inf": 0.2531418312387792, + "time_s": 24.8 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.2531418312387792, + "gap_or_inf": 0.2531418312387792, + "time_s": 49.6 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.2531418312387792, + "gap_or_inf": 0.2531418312387792, + "time_s": 99.2 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.07181328545780952, + "gap_or_inf": 0.07181328545780952, + "time_s": 198.5 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.07181328545780952, + "gap_or_inf": 0.07181328545780952, + "time_s": 397.0 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "cost_rank": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.07181328545780952, + "gap_or_inf": 0.07181328545780952, + "time_s": 25.4 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.07181328545780952, + "gap_or_inf": 0.07181328545780952, + "time_s": 50.2 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 99.8 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 199.1 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 397.6 + } + }, + "precompute_s": 0.6, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "geometry_first": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 26.2 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 51.0 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 100.6 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 199.8 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 398.3 + } + }, + "precompute_s": 1.35, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + } + } + }, + { + "task": "C16_ihp130_sW1_sL1", + "n_evaluated": 49, + "n_feasible": 49, + "best_evaluated": 880.2168, + "methods": { + "baseline_independent": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.14487249050461193, + "gap_or_inf": 0.14487249050461193, + "time_s": 10.5 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.14487249050461193, + "gap_or_inf": 0.14487249050461193, + "time_s": 10.5 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.14487249050461193, + "gap_or_inf": 0.14487249050461193, + "time_s": 10.5 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.14487249050461193, + "gap_or_inf": 0.14487249050461193, + "time_s": 10.5 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.14487249050461193, + "gap_or_inf": 0.14487249050461193, + "time_s": 10.5 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "fixed_mode": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.14487249050461193, + "gap_or_inf": 0.14487249050461193, + "time_s": 10.5 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.14487249050461193, + "gap_or_inf": 0.14487249050461193, + "time_s": 20.9 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.14487249050461193, + "gap_or_inf": 0.14487249050461193, + "time_s": 41.8 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.14487249050461193, + "gap_or_inf": 0.14487249050461193, + "time_s": 83.7 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.14487249050461193, + "gap_or_inf": 0.14487249050461193, + "time_s": 167.4 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "share_most": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.20672816060770471, + "gap_or_inf": 0.20672816060770471, + "time_s": 10.5 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.20672816060770471, + "gap_or_inf": 0.20672816060770471, + "time_s": 20.9 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.20672816060770471, + "gap_or_inf": 0.20672816060770471, + "time_s": 41.8 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.20672816060770471, + "gap_or_inf": 0.20672816060770471, + "time_s": 83.7 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.18719479110146509, + "gap_or_inf": 0.18719479110146509, + "time_s": 167.4 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "random": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.20054259359739543, + "gap_or_inf": 0.20054259359739543, + "time_s": 10.5 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.1881714595767769, + "gap_or_inf": 0.1881714595767769, + "time_s": 20.9 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.14894194248507858, + "gap_or_inf": 0.14894194248507858, + "time_s": 41.8 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.08692349430276716, + "gap_or_inf": 0.08692349430276716, + "time_s": 83.7 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.05794899620184477, + "gap_or_inf": 0.05794899620184477, + "time_s": 167.4 + } + }, + "precompute_s": 0.0, + "n_runs": 10, + "first_feasible_query": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ] + }, + "neighbourhood": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.14487249050461193, + "gap_or_inf": 0.14487249050461193, + "time_s": 10.5 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.14487249050461193, + "gap_or_inf": 0.14487249050461193, + "time_s": 20.9 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 41.8 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 83.7 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 167.4 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "cost_rank": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 11.0 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 21.5 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 42.4 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 84.3 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 167.9 + } + }, + "precompute_s": 0.59, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "geometry_first": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 11.3 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 21.7 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 42.6 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 84.5 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 168.2 + } + }, + "precompute_s": 0.81, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + } + } + }, + { + "task": "C16_ihp130_sW1_sL2", + "n_evaluated": 49, + "n_feasible": 49, + "best_evaluated": 823.86, + "methods": { + "baseline_independent": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.22318840579710142, + "gap_or_inf": 0.22318840579710142, + "time_s": 12.4 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.22318840579710142, + "gap_or_inf": 0.22318840579710142, + "time_s": 12.4 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.22318840579710142, + "gap_or_inf": 0.22318840579710142, + "time_s": 12.4 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.22318840579710142, + "gap_or_inf": 0.22318840579710142, + "time_s": 12.4 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.22318840579710142, + "gap_or_inf": 0.22318840579710142, + "time_s": 12.4 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "fixed_mode": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.22318840579710142, + "gap_or_inf": 0.22318840579710142, + "time_s": 12.4 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.22318840579710142, + "gap_or_inf": 0.22318840579710142, + "time_s": 24.8 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.22086956521739132, + "gap_or_inf": 0.22086956521739132, + "time_s": 49.6 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.22086956521739132, + "gap_or_inf": 0.22086956521739132, + "time_s": 99.1 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.22086956521739132, + "gap_or_inf": 0.22086956521739132, + "time_s": 198.2 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "share_most": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.22086956521739132, + "gap_or_inf": 0.22086956521739132, + "time_s": 12.4 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.22086956521739132, + "gap_or_inf": 0.22086956521739132, + "time_s": 24.8 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.22086956521739132, + "gap_or_inf": 0.22086956521739132, + "time_s": 49.6 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.22086956521739132, + "gap_or_inf": 0.22086956521739132, + "time_s": 99.1 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.22086956521739132, + "gap_or_inf": 0.22086956521739132, + "time_s": 198.2 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "random": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.2553043478260869, + "gap_or_inf": 0.2553043478260869, + "time_s": 12.4 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.23478260869565215, + "gap_or_inf": 0.23478260869565215, + "time_s": 24.8 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.19878260869565217, + "gap_or_inf": 0.19878260869565217, + "time_s": 49.6 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.14620289855072466, + "gap_or_inf": 0.14620289855072466, + "time_s": 99.1 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.10678260869565219, + "gap_or_inf": 0.10678260869565219, + "time_s": 198.2 + } + }, + "precompute_s": 0.0, + "n_runs": 10, + "first_feasible_query": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ] + }, + "neighbourhood": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.22318840579710142, + "gap_or_inf": 0.22318840579710142, + "time_s": 12.4 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.22318840579710142, + "gap_or_inf": 0.22318840579710142, + "time_s": 24.8 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.06840579710144934, + "gap_or_inf": 0.06840579710144934, + "time_s": 49.6 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.06840579710144934, + "gap_or_inf": 0.06840579710144934, + "time_s": 99.1 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.06840579710144934, + "gap_or_inf": 0.06840579710144934, + "time_s": 198.2 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "cost_rank": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.06840579710144934, + "gap_or_inf": 0.06840579710144934, + "time_s": 13.0 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.06840579710144934, + "gap_or_inf": 0.06840579710144934, + "time_s": 25.4 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 50.2 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 99.7 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 198.8 + } + }, + "precompute_s": 0.6, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "geometry_first": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 13.2 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 25.6 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 50.3 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 99.9 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 199.0 + } + }, + "precompute_s": 0.78, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + } + } + }, + { + "task": "C16_ihp130_sW2_sL1", + "n_evaluated": 49, + "n_feasible": 29, + "best_evaluated": 880.2168, + "methods": { + "baseline_independent": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.14487249050461193, + "gap_or_inf": 0.14487249050461193, + "time_s": 14.0 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.14487249050461193, + "gap_or_inf": 0.14487249050461193, + "time_s": 14.0 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.14487249050461193, + "gap_or_inf": 0.14487249050461193, + "time_s": 14.0 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.14487249050461193, + "gap_or_inf": 0.14487249050461193, + "time_s": 14.0 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.14487249050461193, + "gap_or_inf": 0.14487249050461193, + "time_s": 14.0 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "fixed_mode": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.14487249050461193, + "gap_or_inf": 0.14487249050461193, + "time_s": 14.0 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.14487249050461193, + "gap_or_inf": 0.14487249050461193, + "time_s": 27.9 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.14487249050461193, + "gap_or_inf": 0.14487249050461193, + "time_s": 55.9 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.14487249050461193, + "gap_or_inf": 0.14487249050461193, + "time_s": 111.8 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.14487249050461193, + "gap_or_inf": 0.14487249050461193, + "time_s": 223.5 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "share_most": { + "prefix": { + "1": { + "found_rate": 0.0, + "gap_mean_found": null, + "gap_or_inf": Infinity, + "time_s": 14.0 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.20672816060770471, + "gap_or_inf": 0.20672816060770471, + "time_s": 27.9 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.20672816060770471, + "gap_or_inf": 0.20672816060770471, + "time_s": 55.9 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.20672816060770471, + "gap_or_inf": 0.20672816060770471, + "time_s": 111.8 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.18719479110146509, + "gap_or_inf": 0.18719479110146509, + "time_s": 223.5 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 2 + ] + }, + "random": { + "prefix": { + "1": { + "found_rate": 0.5, + "gap_mean_found": 0.13673358654367873, + "gap_or_inf": Infinity, + "time_s": 14.0 + }, + "2": { + "found_rate": 0.6, + "gap_mean_found": 0.12425393380358107, + "gap_or_inf": Infinity, + "time_s": 27.9 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.13038524145415079, + "gap_or_inf": 0.13038524145415079, + "time_s": 55.9 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.09734129137276175, + "gap_or_inf": 0.09734129137276175, + "time_s": 111.8 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.028974498100922386, + "gap_or_inf": 0.028974498100922386, + "time_s": 223.5 + } + }, + "precompute_s": 0.0, + "n_runs": 10, + "first_feasible_query": [ + 1, + 1, + 3, + 2, + 1, + 3, + 1, + 3, + 4, + 1 + ] + }, + "neighbourhood": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.14487249050461193, + "gap_or_inf": 0.14487249050461193, + "time_s": 14.0 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.14487249050461193, + "gap_or_inf": 0.14487249050461193, + "time_s": 27.9 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.14487249050461193, + "gap_or_inf": 0.14487249050461193, + "time_s": 55.9 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 111.8 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 223.5 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "cost_rank": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 14.9 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 28.9 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 56.8 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 112.7 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 224.5 + } + }, + "precompute_s": 0.94, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "geometry_first": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 16.4 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 30.4 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 58.3 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 114.2 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 225.9 + } + }, + "precompute_s": 2.43, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + } + } + }, + { + "task": "C16_ihp130_sW2_sL2", + "n_evaluated": 49, + "n_feasible": 29, + "best_evaluated": 823.86, + "methods": { + "baseline_independent": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.22318840579710142, + "gap_or_inf": 0.22318840579710142, + "time_s": 11.7 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.22318840579710142, + "gap_or_inf": 0.22318840579710142, + "time_s": 11.7 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.22318840579710142, + "gap_or_inf": 0.22318840579710142, + "time_s": 11.7 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.22318840579710142, + "gap_or_inf": 0.22318840579710142, + "time_s": 11.7 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.22318840579710142, + "gap_or_inf": 0.22318840579710142, + "time_s": 11.7 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "fixed_mode": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.22318840579710142, + "gap_or_inf": 0.22318840579710142, + "time_s": 11.7 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.22318840579710142, + "gap_or_inf": 0.22318840579710142, + "time_s": 23.4 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.22086956521739132, + "gap_or_inf": 0.22086956521739132, + "time_s": 46.7 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.22086956521739132, + "gap_or_inf": 0.22086956521739132, + "time_s": 93.4 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.22086956521739132, + "gap_or_inf": 0.22086956521739132, + "time_s": 186.9 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "share_most": { + "prefix": { + "1": { + "found_rate": 0.0, + "gap_mean_found": null, + "gap_or_inf": Infinity, + "time_s": 11.7 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.22086956521739132, + "gap_or_inf": 0.22086956521739132, + "time_s": 23.4 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.22086956521739132, + "gap_or_inf": 0.22086956521739132, + "time_s": 46.7 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.22086956521739132, + "gap_or_inf": 0.22086956521739132, + "time_s": 93.4 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.22086956521739132, + "gap_or_inf": 0.22086956521739132, + "time_s": 186.9 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 2 + ] + }, + "random": { + "prefix": { + "1": { + "found_rate": 0.5, + "gap_mean_found": 0.2008115942028985, + "gap_or_inf": Infinity, + "time_s": 11.7 + }, + "2": { + "found_rate": 0.6, + "gap_mean_found": 0.17797101449275363, + "gap_or_inf": Infinity, + "time_s": 23.4 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.1682898550724638, + "gap_or_inf": 0.1682898550724638, + "time_s": 46.7 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.14411594202898553, + "gap_or_inf": 0.14411594202898553, + "time_s": 93.4 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0762898550724638, + "gap_or_inf": 0.0762898550724638, + "time_s": 186.9 + } + }, + "precompute_s": 0.0, + "n_runs": 10, + "first_feasible_query": [ + 1, + 1, + 3, + 2, + 1, + 3, + 1, + 3, + 4, + 1 + ] + }, + "neighbourhood": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.22318840579710142, + "gap_or_inf": 0.22318840579710142, + "time_s": 11.7 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.22318840579710142, + "gap_or_inf": 0.22318840579710142, + "time_s": 23.4 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.22318840579710142, + "gap_or_inf": 0.22318840579710142, + "time_s": 46.7 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.06840579710144934, + "gap_or_inf": 0.06840579710144934, + "time_s": 93.4 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.06840579710144934, + "gap_or_inf": 0.06840579710144934, + "time_s": 186.9 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "cost_rank": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.06840579710144934, + "gap_or_inf": 0.06840579710144934, + "time_s": 12.3 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.06840579710144934, + "gap_or_inf": 0.06840579710144934, + "time_s": 24.0 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 47.3 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 94.0 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 187.5 + } + }, + "precompute_s": 0.59, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "geometry_first": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 13.0 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 24.7 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 48.1 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 94.8 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 188.2 + } + }, + "precompute_s": 1.34, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + } + } + }, + { + "task": "C16_sky130_sW1_sL1", + "n_evaluated": 49, + "n_feasible": 49, + "best_evaluated": 320.1602, + "methods": { + "baseline_independent": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.17840662268451868, + "gap_or_inf": 0.17840662268451868, + "time_s": 19.7 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.17840662268451868, + "gap_or_inf": 0.17840662268451868, + "time_s": 19.7 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.17840662268451868, + "gap_or_inf": 0.17840662268451868, + "time_s": 19.7 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.17840662268451868, + "gap_or_inf": 0.17840662268451868, + "time_s": 19.7 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.17840662268451868, + "gap_or_inf": 0.17840662268451868, + "time_s": 19.7 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "fixed_mode": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.17840662268451868, + "gap_or_inf": 0.17840662268451868, + "time_s": 19.7 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.17840662268451868, + "gap_or_inf": 0.17840662268451868, + "time_s": 39.3 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.17840662268451868, + "gap_or_inf": 0.17840662268451868, + "time_s": 78.6 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.17840662268451868, + "gap_or_inf": 0.17840662268451868, + "time_s": 157.3 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.17840662268451868, + "gap_or_inf": 0.17840662268451868, + "time_s": 314.6 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "share_most": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.25230962499398757, + "gap_or_inf": 0.25230962499398757, + "time_s": 19.7 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.25230962499398757, + "gap_or_inf": 0.25230962499398757, + "time_s": 39.3 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.25230962499398757, + "gap_or_inf": 0.25230962499398757, + "time_s": 78.6 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.25230962499398757, + "gap_or_inf": 0.25230962499398757, + "time_s": 157.3 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.22806020236119307, + "gap_or_inf": 0.22806020236119307, + "time_s": 314.6 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "random": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.24491929352867736, + "gap_or_inf": 0.24491929352867736, + "time_s": 19.7 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.23013866183242027, + "gap_or_inf": 0.23013866183242027, + "time_s": 39.3 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.1827367674058175, + "gap_or_inf": 0.1827367674058175, + "time_s": 78.6 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.1070439736107112, + "gap_or_inf": 0.1070439736107112, + "time_s": 157.3 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.07136264907380747, + "gap_or_inf": 0.07136264907380747, + "time_s": 314.6 + } + }, + "precompute_s": 0.0, + "n_runs": 10, + "first_feasible_query": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ] + }, + "neighbourhood": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.17840662268451868, + "gap_or_inf": 0.17840662268451868, + "time_s": 19.7 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.17840662268451868, + "gap_or_inf": 0.17840662268451868, + "time_s": 39.3 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 78.6 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 157.3 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 314.6 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "cost_rank": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 20.2 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 39.9 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 79.2 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 157.8 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 315.1 + } + }, + "precompute_s": 0.56, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "geometry_first": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 20.5 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 40.1 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 79.4 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 158.1 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 315.4 + } + }, + "precompute_s": 0.8, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + } + } + }, + { + "task": "C16_sky130_sW1_sL2", + "n_evaluated": 49, + "n_feasible": 49, + "best_evaluated": 297.6085, + "methods": { + "baseline_independent": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.2677020313599916, + "gap_or_inf": 0.2677020313599916, + "time_s": 20.9 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.2677020313599916, + "gap_or_inf": 0.2677020313599916, + "time_s": 20.9 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.2677020313599916, + "gap_or_inf": 0.2677020313599916, + "time_s": 20.9 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.2677020313599916, + "gap_or_inf": 0.2677020313599916, + "time_s": 20.9 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.2677020313599916, + "gap_or_inf": 0.2677020313599916, + "time_s": 20.9 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "fixed_mode": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.2677020313599916, + "gap_or_inf": 0.2677020313599916, + "time_s": 20.9 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.2677020313599916, + "gap_or_inf": 0.2677020313599916, + "time_s": 41.7 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.2677020313599916, + "gap_or_inf": 0.2677020313599916, + "time_s": 83.4 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.2677020313599916, + "gap_or_inf": 0.2677020313599916, + "time_s": 166.9 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.2677020313599916, + "gap_or_inf": 0.2677020313599916, + "time_s": 333.8 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "share_most": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.2714287394345256, + "gap_or_inf": 0.2714287394345256, + "time_s": 20.9 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.2714287394345256, + "gap_or_inf": 0.2714287394345256, + "time_s": 41.7 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.2714287394345256, + "gap_or_inf": 0.2714287394345256, + "time_s": 83.4 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.2714287394345256, + "gap_or_inf": 0.2714287394345256, + "time_s": 166.9 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.2714287394345256, + "gap_or_inf": 0.2714287394345256, + "time_s": 333.8 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "random": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.30894416658126367, + "gap_or_inf": 0.30894416658126367, + "time_s": 20.9 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.2854659393128893, + "gap_or_inf": 0.2854659393128893, + "time_s": 41.7 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.24204984064635265, + "gap_or_inf": 0.24204984064635265, + "time_s": 83.4 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.17577649831910053, + "gap_or_inf": 0.17577649831910053, + "time_s": 166.9 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.1275777069539345, + "gap_or_inf": 0.1275777069539345, + "time_s": 333.8 + } + }, + "precompute_s": 0.0, + "n_runs": 10, + "first_feasible_query": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ] + }, + "neighbourhood": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.2677020313599916, + "gap_or_inf": 0.2677020313599916, + "time_s": 20.9 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.2677020313599916, + "gap_or_inf": 0.2677020313599916, + "time_s": 41.7 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0757763975155279, + "gap_or_inf": 0.0757763975155279, + "time_s": 83.4 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0757763975155279, + "gap_or_inf": 0.0757763975155279, + "time_s": 166.9 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0757763975155279, + "gap_or_inf": 0.0757763975155279, + "time_s": 333.8 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "cost_rank": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0757763975155279, + "gap_or_inf": 0.0757763975155279, + "time_s": 21.7 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0757763975155279, + "gap_or_inf": 0.0757763975155279, + "time_s": 42.6 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 84.3 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 167.7 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 334.6 + } + }, + "precompute_s": 0.87, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "geometry_first": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 22.2 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 43.1 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 84.8 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 168.2 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 335.1 + } + }, + "precompute_s": 1.34, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + } + } + }, + { + "task": "C16_sky130_sW2_sL1", + "n_evaluated": 49, + "n_feasible": 49, + "best_evaluated": 320.1602, + "methods": { + "baseline_independent": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.17840662268451868, + "gap_or_inf": 0.17840662268451868, + "time_s": 18.7 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.17840662268451868, + "gap_or_inf": 0.17840662268451868, + "time_s": 18.7 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.17840662268451868, + "gap_or_inf": 0.17840662268451868, + "time_s": 18.7 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.17840662268451868, + "gap_or_inf": 0.17840662268451868, + "time_s": 18.7 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.17840662268451868, + "gap_or_inf": 0.17840662268451868, + "time_s": 18.7 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "fixed_mode": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.17840662268451868, + "gap_or_inf": 0.17840662268451868, + "time_s": 18.7 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.17840662268451868, + "gap_or_inf": 0.17840662268451868, + "time_s": 37.3 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.17840662268451868, + "gap_or_inf": 0.17840662268451868, + "time_s": 74.7 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.17840662268451868, + "gap_or_inf": 0.17840662268451868, + "time_s": 149.4 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.17840662268451868, + "gap_or_inf": 0.17840662268451868, + "time_s": 298.7 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "share_most": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.25230962499398757, + "gap_or_inf": 0.25230962499398757, + "time_s": 18.7 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.25230962499398757, + "gap_or_inf": 0.25230962499398757, + "time_s": 37.3 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.25230962499398757, + "gap_or_inf": 0.25230962499398757, + "time_s": 74.7 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.25230962499398757, + "gap_or_inf": 0.25230962499398757, + "time_s": 149.4 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.22806020236119307, + "gap_or_inf": 0.22806020236119307, + "time_s": 298.7 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "random": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.22362576610084586, + "gap_or_inf": 0.22362576610084586, + "time_s": 18.7 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.1920324262666004, + "gap_or_inf": 0.1920324262666004, + "time_s": 37.3 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.15941116353625476, + "gap_or_inf": 0.15941116353625476, + "time_s": 74.7 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.11939963180932553, + "gap_or_inf": 0.11939963180932553, + "time_s": 149.4 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.03568132453690374, + "gap_or_inf": 0.03568132453690374, + "time_s": 298.7 + } + }, + "precompute_s": 0.0, + "n_runs": 10, + "first_feasible_query": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ] + }, + "neighbourhood": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.17840662268451868, + "gap_or_inf": 0.17840662268451868, + "time_s": 18.7 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.17840662268451868, + "gap_or_inf": 0.17840662268451868, + "time_s": 37.3 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.17840662268451868, + "gap_or_inf": 0.17840662268451868, + "time_s": 74.7 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 149.4 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 298.7 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "cost_rank": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 19.3 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 37.9 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 75.3 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 149.9 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 299.3 + } + }, + "precompute_s": 0.58, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "geometry_first": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 20.0 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 38.7 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 76.1 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 150.7 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 300.1 + } + }, + "precompute_s": 1.38, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + } + } + }, + { + "task": "C16_sky130_sW2_sL2", + "n_evaluated": 49, + "n_feasible": 49, + "best_evaluated": 297.6085, + "methods": { + "baseline_independent": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.2677020313599916, + "gap_or_inf": 0.2677020313599916, + "time_s": 22.6 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.2677020313599916, + "gap_or_inf": 0.2677020313599916, + "time_s": 22.6 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.2677020313599916, + "gap_or_inf": 0.2677020313599916, + "time_s": 22.6 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.2677020313599916, + "gap_or_inf": 0.2677020313599916, + "time_s": 22.6 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.2677020313599916, + "gap_or_inf": 0.2677020313599916, + "time_s": 22.6 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "fixed_mode": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.2677020313599916, + "gap_or_inf": 0.2677020313599916, + "time_s": 22.6 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.2677020313599916, + "gap_or_inf": 0.2677020313599916, + "time_s": 45.3 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.2677020313599916, + "gap_or_inf": 0.2677020313599916, + "time_s": 90.6 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.2677020313599916, + "gap_or_inf": 0.2677020313599916, + "time_s": 181.1 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.2677020313599916, + "gap_or_inf": 0.2677020313599916, + "time_s": 362.2 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "share_most": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.36325205765292323, + "gap_or_inf": 0.36325205765292323, + "time_s": 22.6 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.2714287394345256, + "gap_or_inf": 0.2714287394345256, + "time_s": 45.3 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.2714287394345256, + "gap_or_inf": 0.2714287394345256, + "time_s": 90.6 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.2714287394345256, + "gap_or_inf": 0.2714287394345256, + "time_s": 181.1 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.2714287394345256, + "gap_or_inf": 0.2714287394345256, + "time_s": 362.2 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "random": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.3937155020773937, + "gap_or_inf": 0.3937155020773937, + "time_s": 22.6 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.27362387163001056, + "gap_or_inf": 0.27362387163001056, + "time_s": 45.3 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.21359238731420646, + "gap_or_inf": 0.21359238731420646, + "time_s": 90.6 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.1739131442818334, + "gap_or_inf": 0.1739131442818334, + "time_s": 181.1 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.08919258018504175, + "gap_or_inf": 0.08919258018504175, + "time_s": 362.2 + } + }, + "precompute_s": 0.0, + "n_runs": 10, + "first_feasible_query": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ] + }, + "neighbourhood": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.2677020313599916, + "gap_or_inf": 0.2677020313599916, + "time_s": 22.6 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.2677020313599916, + "gap_or_inf": 0.2677020313599916, + "time_s": 45.3 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.2677020313599916, + "gap_or_inf": 0.2677020313599916, + "time_s": 90.6 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0757763975155279, + "gap_or_inf": 0.0757763975155279, + "time_s": 181.1 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0757763975155279, + "gap_or_inf": 0.0757763975155279, + "time_s": 362.2 + } + }, + "precompute_s": 0.0, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "cost_rank": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0757763975155279, + "gap_or_inf": 0.0757763975155279, + "time_s": 23.6 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0757763975155279, + "gap_or_inf": 0.0757763975155279, + "time_s": 46.2 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 91.5 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 182.1 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 363.2 + } + }, + "precompute_s": 0.94, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + }, + "geometry_first": { + "prefix": { + "1": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 24.8 + }, + "2": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 47.5 + }, + "4": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 92.8 + }, + "8": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 183.3 + }, + "16": { + "found_rate": 1.0, + "gap_mean_found": 0.0, + "gap_or_inf": 0.0, + "time_s": 364.4 + } + }, + "precompute_s": 2.2, + "n_runs": 1, + "first_feasible_query": [ + 1 + ] + } + } + } + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/results/analysis/testbench_equivalence.json b/benchmarks/textbook_sharing/results/analysis/testbench_equivalence.json new file mode 100644 index 00000000..bb34d0f9 --- /dev/null +++ b/benchmarks/textbook_sharing/results/analysis/testbench_equivalence.json @@ -0,0 +1,6 @@ +{ + "testbench_rule": "55e01f6c3361826d", + "cases": 639, + "identical_without_comments": 639, + "different": [] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/results/analysis/timing_controlled.json b/benchmarks/textbook_sharing/results/analysis/timing_controlled.json new file mode 100644 index 00000000..00986282 --- /dev/null +++ b/benchmarks/textbook_sharing/results/analysis/timing_controlled.json @@ -0,0 +1,4124 @@ +{ + "note": "each task in its own process, candidates built one at a time (up to 10 tasks in parallel). Tasks listed in fallback_tasks did not finish: 10-16 of their candidates take 100-2350 s each to assemble (a slow path of the assembler on large C09 cases, also visible in the evaluation records), about 5.5 h of geometry per task; for them the replay uses the geometry times recorded during the evaluation (shared server).", + "jobs": 10, + "tasks": { + "C11_ihp130_sW2_sL2": { + "geometry_s": { + "c45f3ec86981": 0.2406, + "ca8b85af080b": 0.3137, + "c4ea6f39b379": 0.3166, + "c0bd3be90393": 0.2558, + "c505a0e968de": 0.2513, + "cbadc5b592c6": 6.062, + "c7a61c5c3130": 0.2615, + "c913b22ef1a0": 0.3077, + "c20f3b3dcfd4": 0.2238, + "c1af9d0bda9d": 0.143, + "c6e0482e72c9": 0.17, + "cc8e7e97058e": 0.1563, + "c6b7a89bf7f2": 0.3063, + "cd31d6775790": 4.9312, + "c3bc5f377f06": 0.2398, + "c3e1ecad0c0a": 0.2765, + "c3fb0f5538ab": 0.2646, + "c8742269b8df": 0.1532, + "c0054288145b": 0.1042, + "c204fe092ea0": 0.2824, + "c2c3d0c229e5": 0.265, + "ce2ccb948667": 6.1185, + "ccfec73c8cd0": 0.1107, + "cc7f44dd1df5": 6.9283, + "c3da85d48569": 0.2674, + "c0559934b05a": 3.7314, + "cc04b73a40de": 0.061, + "c54676c3a6be": 0.1248, + "cbd77406f846": 0.2222, + "c60ca1c0b670": 0.1049, + "c3950e71de52": 0.1538, + "c146930930a8": 0.0663, + "cb79619526fb": 0.1506, + "c8a97ca7b464": 0.103, + "c6add60b7443": 0.1509, + "cb3c859a20ab": 0.1548, + "c8f126b7be21": 0.145, + "c19fea673532": 3.3343, + "c8e917e4a351": 0.0634, + "c43ccf312ed1": 0.1054, + "c9836033a712": 0.1214, + "c8c793f965a2": 0.1449, + "ce03677b2598": 0.1275, + "c7f39648a8a5": 5.4111, + "c71962c1fca2": 0.059, + "cfc7eab78176": 2.9211, + "cc4d918e70cf": 0.2265, + "c8e1a51e2313": 0.1681, + "c2c9bf03ca5e": 0.1496, + "ccce2a6de916": 2.7572, + "c043b8ed0d9e": 4.0505, + "c0227054a8f5": 0.1432, + "c69aa57975be": 0.1029, + "ca9acabe7cf7": 0.0635, + "c5e6c1ee2aae": 3.9005, + "c9a8af5e5a96": 0.1208, + "c26d6ab5213f": 0.0603, + "ca3ae174de30": 0.2029, + "c8a58650f9f3": 0.1484, + "c80c90035ea7": 2.7599, + "c1e1b59facc1": 0.063, + "cf5e073340cb": 0.1402, + "c62c6788866c": 0.1319, + "c656ef5abdff": 0.6272 + }, + "load_start": [ + 18.39306640625, + 14.20166015625, + 16.50927734375 + ], + "baseline_geometry_s": 1.1357, + "cost_estimates_total_s": 0.0185, + "verification_median_s": 19.455, + "load_end": [ + 18.79736328125, + 15.14306640625, + 16.6806640625 + ] + }, + "C08_sky130_sW1_sL1": { + "geometry_s": { + "c1ebe43136e1": 0.0369, + "ce7ddcde62c6": 0.0349, + "c1b6567ac7e4": 0.0374, + "cb7b9eec0f72": 0.0332, + "cb605cca6d0f": 0.0331, + "c087f4692e78": 0.1158, + "cb60f91c1c34": 0.0457, + "c63e58b365e9": 0.0346, + "c3d7f2bbae44": 0.0633, + "c7281b4f8697": 0.0597, + "cf7c78c5af02": 0.12, + "ce535ea0da3c": 0.0348, + "cc4d9187b942": 0.036, + "cb39850af7c3": 0.1181, + "caa5bff0fe1d": 0.0579, + "c17dfd04050d": 0.0358, + "c8c9a152a80c": 0.0349, + "c943514d032f": 0.0546, + "cf61694d65bb": 0.0354, + "cf8f2690534c": 0.0903, + "c7bbd4395a79": 0.131, + "c4dc53475517": 0.0348, + "c5b9e55d956c": 0.0688, + "c5a63205f0a3": 0.0498, + "c08a8f092422": 0.0345, + "cdb1a36c9160": 0.0457, + "c5dcd6134f04": 0.0441, + "c81c8316ca1a": 0.0348, + "cf2540ad0e2a": 0.1197, + "cd108601914c": 0.0634, + "cd28fd781ccd": 0.0389, + "ceb6a144c78f": 0.04, + "c12efd3da30c": 0.0368, + "cfff933c1094": 0.037, + "c1f5b1d5e57e": 0.0602, + "cf85c0d71498": 0.1096, + "c7d0a3f2c88a": 0.0376, + "c681229827ee": 0.0399, + "c948c00bda3a": 0.0431, + "c32cef85f1a7": 0.0338, + "c341269ad384": 0.1093, + "c573cc90b25e": 0.0477, + "cc9029676c71": 0.0327, + "c15f7f08c7b4": 0.038, + "cc0a97e9039c": 0.038, + "c66c6edf9e41": 0.1122, + "c94fa14014d9": 0.0939, + "c248ba5f20cb": 0.0344, + "c37278b341b7": 0.0358, + "ce4ab75f3ca5": 0.0453, + "c051fabe4412": 0.0347, + "c717e4610efc": 0.0577, + "cd6f01605600": 0.0546, + "c12cfed03e95": 0.1653, + "cf2b2b47a440": 0.0347, + "cef56be44956": 0.0328, + "c64ab9d5f988": 0.0534, + "c56512190a3f": 0.0332, + "cbe4dff6c6ae": 0.0354, + "cd7b91d3467f": 0.0327, + "c844f3d7e464": 0.0455, + "c13a0048c574": 0.0754, + "c91485c78a91": 0.0415, + "c94046dd7e8b": 0.0416 + }, + "load_start": [ + 11.595703125, + 10.93310546875, + 16.072265625 + ], + "baseline_geometry_s": 0.931, + "cost_estimates_total_s": 0.0145, + "verification_median_s": 17.5, + "load_end": [ + 12.18896484375, + 11.0673828125, + 16.08837890625 + ] + }, + "C16_gf180_sW2_sL1": { + "geometry_s": { + "c0606cccb220": 0.0173, + "cfd6befdce13": 0.0208, + "cb70b109f00f": 0.017, + "c9553d5916e1": 0.0168, + "cba6597162e5": 0.0206, + "c728d61e65e7": 0.0206, + "c3f287f9d792": 0.0277, + "c01285f03617": 0.0234, + "ce2c87119b01": 0.0226, + "c3bc4d855c9c": 0.0423, + "c574abc47fe0": 0.0268, + "c33da7e0dd09": 0.0417, + "c6a58cb08ae1": 0.0269, + "c912c75bc3b4": 0.0476, + "c396a5685f48": 0.0221, + "c6d8d3cb496f": 0.0467, + "cb38b7257112": 0.0218, + "c3cc70fff0d9": 0.0285, + "c20b5daff011": 0.0761, + "c76653203c31": 0.0298, + "ccf380b2ebbb": 0.0753, + "c3cc306f1924": 0.0237, + "ca224dc4b94d": 0.0514, + "cdfc365d73e6": 0.0231, + "c15394cfe7e2": 0.0502, + "c6674e3e19e6": 0.0249, + "c4455d921128": 0.022, + "cf60b3b360c3": 0.0256, + "ccdb4c2d96fb": 0.0214, + "c7b3516eb6ff": 0.0224, + "ca9247c82c6c": 0.0352, + "c3f570a30303": 0.0237, + "cfcf7ab63434": 0.0362, + "c3b64ce65d28": 0.0168, + "cffbbe9f4325": 0.0231, + "c649cf571aec": 0.0165, + "c85a1455092e": 0.0236, + "c5c5f93d5439": 0.0779, + "c133f65cb1eb": 0.0175, + "c942d1dbb835": 0.0326, + "ce731a77d1fe": 0.0171, + "c23fdab4193a": 0.0312, + "c448b3911c10": 0.017, + "cd5bf8a0c035": 0.0323, + "c454bb246f1d": 0.0172, + "c59f5a7a68da": 0.0174, + "c2d0f459474a": 0.0263, + "c589c6b321ce": 0.0173, + "ca4a16813e36": 0.0269 + }, + "load_start": [ + 18.66015625, + 15.57861328125, + 16.763671875 + ], + "baseline_geometry_s": 0.6077, + "cost_estimates_total_s": 0.0043, + "verification_median_s": 26.24, + "load_end": [ + 18.66015625, + 15.57861328125, + 16.763671875 + ] + }, + "C11_gf180_sW2_sL2": { + "geometry_s": { + "c45f3ec86981": 0.3328, + "ca8b85af080b": 0.3109, + "c4ea6f39b379": 0.3308, + "c0bd3be90393": 0.3163, + "c2c3d0c229e5": 0.3173, + "c5b44f14c082": 0.3208, + "c6aea1f543aa": 0.106, + "c7530ddff2c8": 10.9522, + "c2a66c85a216": 0.3171, + "c3588e5f627b": 6.9147, + "c9efdb97a9d3": 0.1841, + "cb799348cf5c": 0.1928, + "c6b7a89bf7f2": 0.3193, + "cd31d6775790": 2.598, + "c4253e67c397": 0.3321, + "cbd019cd2898": 0.333, + "c2b93f9d369e": 0.3262, + "c2663fbf82a2": 0.3264, + "ce22cd6b0de9": 0.3335, + "ccbe465485a7": 0.1403, + "c40d34fa18f3": 0.2027, + "ca9acabe7cf7": 0.107, + "ca384a35bff5": 11.5718, + "c42d1a55f019": 0.318, + "c871090d5c82": 0.2333, + "c26d6ab5213f": 0.1053, + "c4978c015136": 0.1731, + "c8e2648ec1f1": 0.3888, + "cdde02b4a3af": 7.5884, + "c0691ff0607e": 0.3346, + "cf16d7a992af": 0.3301, + "c270b684f680": 0.2378, + "c2791e00f19f": 0.1066, + "c3ed24574327": 0.2833, + "c4b2144ae074": 0.1075, + "cb3a0a6a7f49": 0.2049, + "ce5652252ec5": 0.3231, + "cbc2e86c2c1f": 0.1121, + "c20f3b3dcfd4": 0.2357, + "c3de087929a0": 6.9269, + "cb3833dc6941": 0.2752, + "c38652101719": 10.2161, + "c19e064c15b2": 0.1007, + "ce626ae5012d": 1.8553, + "c8b786402970": 0.2259, + "cedf18ba95fe": 0.101, + "c8c2970324ce": 1.8967, + "c0b5a14ef33b": 0.148, + "ca6dd767f081": 0.0594, + "c843d8dceec5": 0.1765, + "c8861c7d1c4f": 3.7837, + "c2cca27a346e": 0.1907, + "c9836033a712": 0.2221, + "c9a7802e8b1b": 0.196, + "c3ec35fdb4c2": 0.3196, + "cfca57b3df55": 10.0337, + "cdd7f910b0ac": 0.105, + "c60ca1c0b670": 0.1995, + "c95e85d8388b": 0.3264, + "c9f7dfcfd6ae": 0.1039, + "c925093d0007": 0.1035, + "cdf71fcaa832": 0.2858, + "c9fdbd4f17fe": 0.3527, + "c4b4a3fbaefb": 7.1035 + }, + "load_start": [ + 15.61572265625, + 12.14453125, + 16.21728515625 + ], + "baseline_geometry_s": 1.2254, + "cost_estimates_total_s": 0.0207, + "verification_median_s": 32.93, + "load_end": [ + 18.21923828125, + 13.9541015625, + 16.46826171875 + ] + }, + "C09_gf180_sW2_sL1": { + "geometry_s": { + "c356972a7591": 0.0984, + "ce1c72423ac5": 0.0971, + "c868dae116fc": 0.0973, + "c3d299aa1684": 0.0959, + "cf45025f4f62": 0.0991, + "c93791a9a582": 32.4408, + "cc2458915d2a": 0.0962, + "cc2aa43316ad": 0.1402, + "cbefdd82b419": 0.0966, + "c7de18bfa37b": 0.0934, + "cdcbab2271c3": 0.1692, + "c6c9a06e89de": 44.0902, + "cbb8c69ed5d7": 0.0943, + "c11bc0257b89": 0.1573, + "c0caa7bad5d5": 0.0975, + "c387a4cf39de": 46.34, + "c6d9009490f4": 0.1, + "c816eab87546": 0.1761, + "c8164c59c7af": 0.101, + "cb05877ece26": 0.1005, + "c1a9933ee693": 0.098, + "ca25a659d97c": 0.0984, + "c3d0aef08736": 30.0013, + "c486587a08ac": 0.0529, + "c0004162fdeb": 0.0545, + "c366afa91fb5": 29.2529, + "c2fb884f7b0d": 0.097, + "cebc3aaf250a": 0.2448, + "cd71bb8cc5f3": 0.0962, + "c045cd75d934": 0.1012, + "c68fcd50c3a9": 0.0969, + "c7b745255e9e": 0.1706, + "c3166d0865d0": 0.1092, + "c27d18ad2480": 45.171, + "c30d95452a3e": 0.0963, + "c6c2dc1dc235": 0.0967, + "cd8cdc55083f": 0.0991, + "c5dcff235d46": 0.0992, + "c76a09fd22db": 0.0982, + "c9babe3a0829": 0.2166, + "c0408f6e3709": 0.0983, + "c38e68850c7e": 0.1187, + "c0ee27e43bfe": 0.0962, + "c4a15fd10502": 0.0975, + "c38b3198c8f4": 0.0968, + "c31efd3ab5b2": 0.2323, + "cf760534ff29": 0.0975, + "cfda88d9f307": 0.0945, + "c285f2ba6eae": 0.0953, + "c3394258ed47": 0.114, + "cfcf7ac2f12c": 0.0987, + "cc52464a5e11": 0.224, + "cba8bce0e14c": 0.0982, + "c99ede2934c4": 0.1006, + "c84eea21a1a0": 33.556, + "c6ab119f86c2": 0.098, + "c1d214206159": 0.1102, + "cc25b6ac29bc": 0.1127, + "cf01475ab01b": 0.2089, + "c81e5d10d88d": 0.09, + "cf20146568b8": 0.088, + "c4772dbbdf66": 0.085, + "c1c5cf5629c9": 0.0831, + "cec45110f11d": 0.195 + }, + "load_start": [ + 12.73486328125, + 11.19921875, + 16.1044921875 + ], + "baseline_geometry_s": 1.0414, + "cost_estimates_total_s": 0.0206, + "verification_median_s": 35.085, + "load_end": [ + 18.55810546875, + 15.65869140625, + 16.77734375 + ] + }, + "C11_sky130_sW1_sL1": { + "geometry_s": { + "cfced3a470f5": 0.0921, + "c41bf8068e51": 0.0851, + "c9ee941a0780": 0.0887, + "c96b72c1e756": 0.0855, + "c4f93c32109a": 0.3361, + "ce561b4e6dd2": 0.09, + "cc312cbea79b": 0.1261, + "c452d90d233c": 0.0712, + "cd5458d16a6d": 0.0704, + "cc55aa616bf4": 0.0776, + "c183bdec1fe1": 0.1832, + "c7ab0c2f5bfd": 0.0864, + "c462b9db828f": 0.0608, + "c117919040ba": 0.0623, + "c5ed0456538e": 0.2159, + "ccbf4200196b": 0.0882, + "ccacf08b9929": 0.4387, + "cbc4d22d541f": 0.078, + "c37c00781dcb": 0.0956, + "ccc84295daae": 0.0855, + "c8bd10dbe32d": 0.5088, + "c3e06a6c97e8": 0.657, + "c0a4106dbdbc": 0.0854, + "c7976119f101": 0.1646, + "c1efa5c511d2": 0.0893, + "c582a37cd045": 0.0601, + "c5ffefc57e7d": 0.1419, + "c0a8259af5e1": 0.0843, + "c65d09985d74": 0.0897, + "c5350b7bf8cd": 0.2243, + "cc55cbdb0729": 0.0722, + "c3aa066176c9": 0.0723, + "ce7cb16e3bf4": 0.1312, + "c2dd91d140b8": 0.5129, + "cda3a1e3300f": 0.0863, + "cafe65e13350": 0.0841, + "c7fe0f2bb233": 0.0893, + "ce64bcc5f73c": 0.5944, + "ca070104688e": 0.085, + "c8ea21206108": 0.1952, + "ccbcb7b59184": 0.0722, + "c4a530d4f3b6": 0.438, + "c1b6326d8bdf": 0.2465, + "cfde38e06776": 0.0909, + "c699eb0a329d": 0.09, + "c48c9df86da2": 0.0865, + "c188704c53d7": 0.2146, + "c2146d7a232b": 0.0758, + "c7a85b0ddcef": 0.0766, + "cc491c91258f": 0.0878, + "cef807f06042": 0.1314, + "c85e51fe77cb": 0.7392, + "c8ed7c3b7a53": 0.5121, + "c6bc29b23cf2": 0.0824, + "cd4cb910d62b": 0.0816, + "c65d9b1203b6": 0.0908, + "c6f74de34498": 0.0848, + "ca94f83e31b6": 0.1001, + "ccb94e36ec29": 0.1464, + "c6df89eaf753": 0.0748, + "c94e608c4cf0": 0.5858, + "cf4d6f6c3374": 0.079, + "c9b06ecca750": 0.0875, + "c9ab82051c9f": 0.5096 + }, + "load_start": [ + 18.79736328125, + 15.14306640625, + 16.6806640625 + ], + "baseline_geometry_s": 0.6662, + "cost_estimates_total_s": 0.0098, + "verification_median_s": 32.394999999999996, + "load_end": [ + 19.00341796875, + 15.36572265625, + 16.7294921875 + ] + }, + "C02_sky130_sW1_sL2": { + "geometry_s": { + "c8a189738e65": 0.0139, + "cd992aac7ce2": 0.0135, + "ce39cc1ec93f": 0.0132, + "c054e1700ec1": 0.0132, + "cf4728da73fe": 0.0144, + "c86c9634114b": 0.0132, + "cb576b91477c": 0.013, + "cb3e6de06c0f": 0.0131, + "c973a0640e6b": 0.0137, + "cce4299c7ab5": 0.0143, + "cd8f1aa389a8": 0.013, + "c8dd1d70bf66": 0.0153, + "c265c2508f23": 0.0145, + "ce7769f4c7e7": 0.0137, + "c304759e429e": 0.0128, + "c1e11cb14870": 0.0126, + "c5eef773315c": 0.0118, + "c33ede984d3e": 0.0115, + "cfaca0eebc3f": 0.0115, + "c8d46a4c3707": 0.0118, + "cc1e93f291ee": 0.0124, + "cbd555382858": 0.0136, + "cbf80e3ede2f": 0.0145, + "c64d82336648": 0.0158, + "c806cfa2dae7": 0.0189, + "c9d3046021c9": 0.0182, + "cb8200500a8a": 0.018, + "cf5fc7c0ae10": 0.018, + "cf60c9835ab8": 0.0175, + "ce8428be62ff": 0.0181, + "c6026fb86c54": 0.0178, + "cd102a7cd82e": 0.0172, + "c476fe7ff0f5": 0.017, + "c125515c9382": 0.0176, + "c7e50b349bee": 0.0175, + "c6710bc5dcd2": 0.0203, + "c3baa7b4203e": 0.0171, + "c6510312eb71": 0.0173, + "c38de2e8fa1d": 0.0172, + "c15f7f002a47": 0.0165, + "ca526079d482": 0.0136, + "c7ed721c88ab": 0.0133, + "c4dace9a4128": 0.013, + "c8af75ae914c": 0.0146, + "c08225022991": 0.0141, + "cf327f6e6aab": 0.0142, + "c5138b51f856": 0.0134, + "c7bed3c57cdb": 0.016, + "c49fe6bd1a15": 0.014, + "c9eca9c94337": 0.0143, + "c09b49fdcd23": 0.0147, + "c79c5edca55e": 0.0139, + "c0c7811f6a18": 0.0137, + "cb13a6e943ff": 0.0135, + "cc7a40dcbaef": 0.014, + "c54ce3f64cb0": 0.0136, + "c10dca933831": 0.0144, + "c1612704af84": 0.0143, + "cb96b859e360": 0.0146, + "cc047915b5da": 0.0151, + "c818a0c6e5be": 0.0141, + "c0a8bab8808f": 0.0139, + "c65e5f21ab9b": 0.0142, + "c43b0a8fcd1b": 0.014 + }, + "load_start": [ + 10.77685546875, + 10.7626953125, + 16.04541015625 + ], + "baseline_geometry_s": 0.8904, + "cost_estimates_total_s": 0.0086, + "verification_median_s": 15.035, + "load_end": [ + 10.77685546875, + 10.7626953125, + 16.04541015625 + ] + }, + "C09_ihp130_sW1_sL2": { + "geometry_s": { + "c3f5b4262276": 0.1444, + "c86596aeb75c": 0.1422, + "c6ac96d612da": 0.143, + "c3c7f40b70a2": 0.1405, + "cb9725147385": 0.1429, + "cbd2f9b16f7f": 0.1408, + "c42a53c19f40": 0.2031, + "caa8d92758e5": 0.1414, + "c200936a0952": 0.1411, + "cd0d7abc4ae3": 0.1406, + "c2fd7698c777": 0.1428, + "c5dbf381d687": 0.1425, + "ca32b6b99d0f": 0.141, + "c4629b765e2c": 0.1417, + "c53488be328e": 0.142, + "c3bc576299f8": 0.1439, + "cbb6d10e8f0e": 0.1414, + "cc81a47c2208": 0.1426, + "c94854c837b7": 0.2206, + "cdfd361a0f44": 1.3614, + "c7669e79f2bb": 0.1417, + "c4a023be8f95": 0.142, + "cdfda92247fd": 0.1411, + "cdba567f898a": 0.1436, + "ced0c3895408": 0.143, + "ce8944a3188c": 0.1423, + "c3dbf47f733d": 0.1434, + "c40061638a43": 118.107, + "c41055f502af": 0.1269, + "cacdbd386393": 3.1859, + "ca7e49c9d0ce": 0.0799, + "cb665d318416": 0.0791, + "ca9fba6e1170": 0.0796, + "c2685178f14c": 0.0783, + "c3b089ae36a9": 0.0778, + "cff483c67637": 0.0809, + "c3eb5c07135e": 78.7893, + "ccf2b622aea9": 0.0788, + "c4a551a150bd": 0.0767, + "c646769d07dc": 0.0781, + "c9db933f3d6d": 0.0799, + "c8d7191b8d2a": 0.1578, + "c942996b9e87": 0.0805, + "c0d2de6a9c56": 0.0795, + "ccac56fd8262": 0.079, + "c2c5967c235d": 0.0799, + "cab58fcf8471": 2.4894, + "c692b4802e56": 0.0787, + "c5211ed1b981": 0.0793, + "c1ee14806cfa": 0.0808, + "c4e95a5c3cb5": 0.0784, + "c6e0ed22af79": 0.0777, + "c345c31b44f2": 0.0782, + "c13db6e968cb": 0.1371, + "ce10f22e4182": 0.0787, + "c84ea771ccd8": 0.0809, + "c65bd79c3823": 0.0822, + "c16ade7e07c1": 81.9696, + "ca42e771f855": 0.0794, + "c1c5b7aa586f": 3.7882, + "ce750a257fa0": 0.0794, + "c77457be5aaa": 0.0772, + "ccd74aed8959": 0.0792, + "c2899e7c350b": 0.079 + }, + "load_start": [ + 12.73486328125, + 11.19921875, + 16.1044921875 + ], + "baseline_geometry_s": 1.1069, + "cost_estimates_total_s": 0.0273, + "verification_median_s": 31.755000000000003, + "load_end": [ + 17.8076171875, + 15.767578125, + 16.77978515625 + ] + }, + "C11_gf180_sW2_sL1": { + "geometry_s": { + "c45f3ec86981": 0.3272, + "ca8b85af080b": 0.3162, + "c4ea6f39b379": 0.33, + "c0bd3be90393": 0.3142, + "c843d8dceec5": 0.3129, + "c9f353f71fd8": 0.3055, + "cb592897c649": 0.1972, + "cc316a1f6249": 9.9321, + "c5912a5ebdaa": 0.2348, + "c3588e5f627b": 6.1093, + "cf2fda72d4a1": 0.2004, + "c2b3b1648244": 10.6636, + "c6b7a89bf7f2": 0.3209, + "cd2b2fdeb9f6": 0.0991, + "c83fcb22accc": 0.2034, + "cc0b362d9f31": 10.1754, + "cb79619526fb": 0.325, + "c414643456a5": 0.2372, + "c9201a1c9cab": 0.1115, + "c7f7e5ccf4c0": 10.7595, + "c505a0e968de": 0.3218, + "cb398c9443fc": 0.3176, + "ca9acabe7cf7": 0.2028, + "c72b46d532cf": 10.4923, + "c2a66c85a216": 0.3192, + "c376e4d1050c": 0.2014, + "cb44374ecbd4": 0.1977, + "c41ebf380d80": 10.3724, + "cdd7f910b0ac": 0.1024, + "c6f22fbbee08": 6.5567, + "c75ab507b359": 0.2042, + "c260bca35862": 1.5481, + "c2f6a9932935": 0.239, + "c314bae67314": 0.2438, + "c0c9afdb8d03": 0.2838, + "c58b90071763": 10.5072, + "c5b44f14c082": 0.3197, + "ce5652252ec5": 0.3356, + "c71a2a1af3f9": 1.5985, + "c3da85d48569": 0.2343, + "c3c50bbb8ae1": 9.495, + "cb33ff54e8c4": 0.2728, + "c2f1e1959d6f": 10.3627, + "cbd77406f846": 0.3268, + "c4264d0e4998": 6.2499, + "cba082d21229": 0.2059, + "c217a9b20393": 10.483, + "ccf5b506ff60": 0.1726, + "c8434650edc3": 6.1998, + "c41cf9b8d9a5": 0.1125, + "cd1ccef61a5a": 10.5814, + "cdc45176a71f": 0.3187, + "c21ae38da751": 5.997, + "c6aea1f543aa": 0.2027, + "c128c4ca4be4": 0.2017, + "c20f3b3dcfd4": 0.2347, + "c625cd6bfbce": 8.1691, + "c39770bf9343": 0.2373, + "cfbe5f388201": 0.2033, + "cab80b4560c8": 0.3306, + "c1032f450462": 8.8255, + "c0f5ab56b694": 10.2109, + "c06335089b3c": 0.2365, + "c6017846c624": 0.3277 + }, + "load_start": [ + 15.61572265625, + 12.14453125, + 16.21728515625 + ], + "baseline_geometry_s": 1.2417, + "cost_estimates_total_s": 0.0208, + "verification_median_s": 40.69, + "load_end": [ + 18.8291015625, + 15.2705078125, + 16.7060546875 + ] + }, + "C02_sky130_sW2_sL2": { + "geometry_s": { + "c8518d00a186": 0.0212, + "cb1a393bdfaf": 0.0202, + "c0391f77ad6b": 0.0197, + "c11635c35151": 0.0192, + "c03f3036669f": 0.02, + "cf675937f822": 0.0208, + "cbcf41e784f8": 0.0185, + "c04d0fbcbbdd": 0.0173, + "c0edda0cff55": 0.0212, + "c2943399381b": 0.0207, + "c14b90138a67": 0.0193, + "c49606b115a4": 0.0187, + "c8b962eabbd7": 0.0195, + "c0e8c84240fa": 0.019, + "c4e4dbfd48e6": 0.0205, + "cbef5ee1960b": 0.0223, + "ca768292a9a7": 0.0194, + "cb0e11b955bb": 0.0192, + "c96d83290a85": 0.0194, + "c5692d105b99": 0.0197, + "cf84543a4f57": 0.0197, + "c2bb97ae9670": 0.0184, + "c1384f98c43d": 0.0191, + "c6ac954e1758": 0.0188, + "ccfa89a8d172": 0.0323, + "c9ef4c9ccf36": 0.0302, + "cbfd7e1c1e6c": 0.0314, + "cceae287b1bb": 0.0313, + "cb76c2e3650b": 0.031, + "c3dfd5a42932": 0.03, + "c0e6e807276e": 0.0334, + "ccabc22666cf": 0.0307, + "c82de43f88cc": 0.03, + "c9339cbaa1bb": 0.0312, + "c26ee653792d": 0.0302, + "c8199062b191": 0.0312, + "cf49791c49e5": 0.0329, + "c92dbf630ab4": 0.0294, + "cb64f3cb9973": 0.0302, + "c2870c5a5e89": 0.0302, + "cb8db8bce506": 0.0209, + "caf7c6bbb899": 0.0199, + "c0ad044d1cc3": 0.0211, + "cb33a1c6c1e4": 0.0208, + "cd7e109bb558": 0.0231, + "c98ec3e14006": 0.0201, + "cb41f1ed5051": 0.0193, + "c16cbde90679": 0.0206, + "c7dcdc470b5b": 0.0207, + "c36cf2c7dc73": 0.0208, + "c46ae367db8f": 0.0205, + "cd6bd155f988": 0.0205, + "c4d54317483f": 0.0201, + "cb5fd06efa8c": 0.0219, + "cbb5d96593ef": 0.0199, + "cc989ed726da": 0.0195, + "c4d1e1cc9e66": 0.0201, + "cb36a0a2bc2e": 0.0208, + "c1beec90ed89": 0.0209, + "c4f44157181a": 0.0213, + "c3f22742ce2c": 0.0204, + "cce03735ed2f": 0.0201, + "ca16449e398a": 0.0223, + "c2e07f5e499c": 0.0898 + }, + "load_start": [ + 11.595703125, + 10.93310546875, + 16.072265625 + ], + "baseline_geometry_s": 0.9053, + "cost_estimates_total_s": 0.0096, + "verification_median_s": 15.844999999999999, + "load_end": [ + 12.18896484375, + 11.0673828125, + 16.08837890625 + ] + }, + "C11_ihp130_sW1_sL2": { + "geometry_s": { + "cfced3a470f5": 0.0739, + "c41bf8068e51": 0.0695, + "c9ee941a0780": 0.0739, + "c96b72c1e756": 0.0671, + "ccc84295daae": 0.0711, + "ca823f77ce51": 0.3933, + "c7fe0f2bb233": 0.0772, + "c1c603184628": 0.0741, + "ce0de2697e40": 0.0636, + "c89be23b8bff": 0.0557, + "c5d811a58801": 0.0387, + "c922c9370aae": 0.1093, + "c7ab0c2f5bfd": 0.073, + "cd56b27dddc4": 0.4487, + "c64551158e2d": 0.0748, + "c81b186e8b7c": 0.2879, + "c6df89eaf753": 0.0644, + "c5e744446c59": 0.0913, + "cca86f90e260": 0.0484, + "c4799d35f0f4": 0.0691, + "c6e4b352825e": 0.3931, + "ca8a0cc33ccc": 0.0729, + "c1998e0233ec": 0.0901, + "cb25ee95df95": 0.0614, + "cf9e11cd3be5": 0.0621, + "c5bafdb5c091": 0.0478, + "c1336e1f941b": 0.1093, + "c67089c30812": 0.0387, + "c5a20929e321": 0.2506, + "cdfabe92cc0e": 0.0408, + "c52f91aa16c5": 0.0416, + "cc55cbdb0729": 0.064, + "c3adc628068a": 0.1899, + "c7f702217217": 0.0669, + "ca7a625e61ab": 0.0622, + "c9b06ecca750": 0.1234, + "c3679e86c391": 0.1236, + "cabec2003315": 0.1246, + "ce64bcc5f73c": 0.3072, + "c1808619fdb4": 0.0627, + "c955001ea5ca": 0.0628, + "c23d7c375ee7": 0.0627, + "c7236b92468d": 0.0663, + "cf92a9b17813": 0.127, + "c6f74de34498": 0.4117, + "c9dd49f0b58d": 0.0441, + "ce70ddc9f60b": 0.0443, + "cb16912231a6": 0.0468, + "cd91bb8d0f3b": 0.0741, + "cbc4d22d541f": 0.0435, + "c63289a38226": 0.381, + "cda3a1e3300f": 0.067, + "cd9e24afefd2": 0.0421, + "ce6859114ef1": 0.0675, + "cf70884eccda": 0.1294, + "c74d4769cf77": 0.0659, + "c596d3048c6f": 0.0481, + "c0a8259af5e1": 0.0696, + "c07fdd273341": 0.0738, + "c1bb2ad03556": 0.4148, + "c06d9218e8f2": 0.0628, + "ca52de118196": 0.0455, + "c82bb72df17d": 0.0426, + "ca7321e3e179": 0.0951 + }, + "load_start": [ + 18.2822265625, + 14.0380859375, + 16.48193359375 + ], + "baseline_geometry_s": 0.6367, + "cost_estimates_total_s": 0.0096, + "verification_median_s": 15.0, + "load_end": [ + 18.33984375, + 14.12060546875, + 16.49560546875 + ] + }, + "C02_gf180_sW1_sL2": { + "geometry_s": { + "c8a189738e65": 0.0151, + "cd992aac7ce2": 0.0141, + "ce39cc1ec93f": 0.0132, + "c054e1700ec1": 0.0131, + "cf4728da73fe": 0.0144, + "c86c9634114b": 0.0134, + "cb576b91477c": 0.0133, + "cb3e6de06c0f": 0.0128, + "c973a0640e6b": 0.0136, + "cce4299c7ab5": 0.0143, + "cd8f1aa389a8": 0.013, + "c8dd1d70bf66": 0.0155, + "c265c2508f23": 0.0135, + "ce7769f4c7e7": 0.0131, + "c304759e429e": 0.0138, + "c1e11cb14870": 0.0145, + "c5eef773315c": 0.0138, + "c33ede984d3e": 0.0131, + "cfaca0eebc3f": 0.0132, + "c8d46a4c3707": 0.0138, + "cc1e93f291ee": 0.0141, + "cbd555382858": 0.0131, + "cbf80e3ede2f": 0.0129, + "c64d82336648": 0.0149, + "c806cfa2dae7": 0.018, + "c9d3046021c9": 0.0178, + "cb8200500a8a": 0.018, + "cf5fc7c0ae10": 0.0179, + "cf60c9835ab8": 0.0172, + "ce8428be62ff": 0.0179, + "c6026fb86c54": 0.0178, + "cd102a7cd82e": 0.018, + "c476fe7ff0f5": 0.0178, + "c125515c9382": 0.0177, + "c7e50b349bee": 0.0174, + "c6710bc5dcd2": 0.0205, + "c3baa7b4203e": 0.0168, + "c6510312eb71": 0.0174, + "c38de2e8fa1d": 0.0174, + "c15f7f002a47": 0.0166, + "ca526079d482": 0.0138, + "c7ed721c88ab": 0.0145, + "c4dace9a4128": 0.0141, + "c8af75ae914c": 0.0147, + "c08225022991": 0.0139, + "cf327f6e6aab": 0.0145, + "c5138b51f856": 0.0135, + "c7bed3c57cdb": 0.0163, + "c49fe6bd1a15": 0.0142, + "c9eca9c94337": 0.0145, + "c09b49fdcd23": 0.0146, + "c79c5edca55e": 0.0142, + "c0c7811f6a18": 0.0139, + "cb13a6e943ff": 0.0135, + "cc7a40dcbaef": 0.014, + "c54ce3f64cb0": 0.0136, + "c10dca933831": 0.0143, + "c1612704af84": 0.0144, + "cb96b859e360": 0.014, + "cc047915b5da": 0.0167, + "c818a0c6e5be": 0.014, + "c0a8bab8808f": 0.0139, + "c65e5f21ab9b": 0.0142, + "c43b0a8fcd1b": 0.0144 + }, + "load_start": [ + 10.77685546875, + 10.7626953125, + 16.04541015625 + ], + "baseline_geometry_s": 0.8964, + "cost_estimates_total_s": 0.0086, + "verification_median_s": 19.755000000000003, + "load_end": [ + 10.77685546875, + 10.7626953125, + 16.04541015625 + ] + }, + "C08_gf180_sW1_sL2": { + "geometry_s": { + "c1ebe43136e1": 0.0485, + "ce7ddcde62c6": 0.0453, + "c1b6567ac7e4": 0.0491, + "cb7b9eec0f72": 0.0347, + "cc4d9187b942": 0.0416, + "ca900821583e": 0.042, + "cbd1ac6cda33": 0.0576, + "c24959db5a54": 0.0358, + "c68997273bc8": 0.0374, + "c07258663c57": 0.0441, + "c722a99f71e1": 0.0367, + "cb19028cd938": 0.0373, + "cbe4dff6c6ae": 0.0464, + "c0cbfeb30288": 0.0492, + "cbd8d4c15275": 0.0709, + "ca6691e808c5": 0.0386, + "cba70928c771": 0.0502, + "ccf1dfaeb192": 0.0356, + "c00a0d5cc756": 0.0433, + "c985184c0724": 0.0389, + "cf2540ad0e2a": 0.077, + "c4f7b66e6711": 0.0507, + "c89f76b76d60": 0.0353, + "c4e23649b6ab": 0.0327, + "c25e0bdd2014": 0.0721, + "c888ca2347dd": 0.0424, + "c31c86627526": 0.035, + "c8aeb3d1d558": 0.0576, + "cc588a68b6f6": 0.0567, + "c778ab3175c9": 0.0437, + "ca955b444028": 0.0525, + "cf4fd2b8186b": 0.036, + "c838f240207c": 0.0456, + "cf8259c41d61": 0.0392, + "c566f5a9d5b6": 0.1129, + "c379ff40a101": 0.0349, + "c58f636942ec": 0.0459, + "c07c706fed11": 0.0362, + "c88950e6ef23": 0.0578, + "cc7901b32d6f": 0.0465, + "cde65d38ffba": 0.0367, + "ca2ed1c0e727": 0.0443, + "ccb512d7b5ae": 0.1102, + "c24ccab2ab3b": 0.035, + "ce4a205fd6b8": 0.0463, + "c91485c78a91": 0.0451, + "cc0754b7dffc": 0.0358, + "c8005e841821": 0.0839, + "c723d467a2c3": 0.0353, + "c683007503d7": 0.046, + "c69f25b85d0e": 0.0445, + "c3b4b73e0253": 0.0547, + "c7b68f8824e7": 0.0415, + "c398aec83b54": 0.0381, + "ca00c6d3fd9c": 0.0378, + "ce25557ac89a": 0.0419, + "c814b1429989": 0.0409, + "c15f7f08c7b4": 0.0403, + "cb507e576dab": 0.09, + "c603634449f7": 0.0356, + "ca2cc0943eae": 0.0366, + "cb05e6ca89a8": 0.0585, + "cc1940cee854": 0.0521, + "cbf2637d721f": 0.0414 + }, + "load_start": [ + 11.595703125, + 10.93310546875, + 16.072265625 + ], + "baseline_geometry_s": 0.9545, + "cost_estimates_total_s": 0.0144, + "verification_median_s": 17.29, + "load_end": [ + 12.18896484375, + 11.0673828125, + 16.08837890625 + ] + }, + "C11_sky130_sW1_sL2": { + "geometry_s": { + "cfced3a470f5": 0.1617, + "c41bf8068e51": 0.153, + "c9ee941a0780": 0.1604, + "c96b72c1e756": 0.1531, + "cda3a1e3300f": 0.1544, + "c318bd5ad6d7": 0.7394, + "ca8a0cc33ccc": 0.1595, + "c0f040b36920": 0.1131, + "c452d90d233c": 0.1304, + "c398af30679a": 0.1051, + "c23d7c375ee7": 0.1866, + "cc4538de96fa": 0.112, + "cba625b0a67b": 0.1095, + "c1b96cda9c0d": 0.1563, + "c9dd49f0b58d": 0.1117, + "c3e33a63608c": 0.112, + "cb16912231a6": 0.108, + "cbc46b1585a3": 0.8635, + "cbc071f6779f": 0.1505, + "c7ceec63c48c": 0.1245, + "c212e484c9e2": 0.1505, + "cc5a50b58889": 0.1563, + "cd1913bc5ce8": 0.1556, + "c9b2a2434e12": 0.1276, + "c84ec762bb4a": 0.7564, + "cc55aa616bf4": 0.109, + "cb3ac4f62b7a": 0.1823, + "cdf82010ae0e": 0.1092, + "c725bc95574b": 0.1091, + "c07fdd273341": 0.1585, + "cede2cb25709": 0.2232, + "ce118a2b5368": 0.1067, + "cd4466f1fbed": 0.1549, + "c35602fa5089": 0.1495, + "c216de2502b3": 0.1554, + "caa005ac9bf4": 0.1241, + "cab20e9831ca": 0.1091, + "c47e47f0efc7": 0.1592, + "c70cdf407bcd": 0.1271, + "cbed48a14564": 0.7791, + "c35038541b93": 0.1307, + "c0cd440288a7": 0.1598, + "c67089c30812": 0.1898, + "cfedeb20546b": 0.9663, + "cec76a8e6fd1": 0.1097, + "c52f91aa16c5": 0.1127, + "c534321b9995": 0.1326, + "c3adc628068a": 0.9896, + "c5b9601a6409": 0.1497, + "c1d68bbce8b0": 0.1072, + "cc154118fd8d": 0.1513, + "c3679e86c391": 0.152, + "cee35228b87d": 0.1558, + "cf6fe742a828": 0.106, + "c79eb3a6d2c1": 0.1295, + "c4525aa76ae7": 0.9227, + "c5bafdb5c091": 0.12, + "cea30028ad01": 0.1609, + "c7042361c4b7": 0.2353, + "cdc78c8d871e": 0.8862, + "c80fb5712e77": 0.1091, + "c7a6c0bfd49d": 0.1651, + "c6113bb60701": 0.1324, + "cdd2d3806e51": 0.1566 + }, + "load_start": [ + 19.00341796875, + 15.36572265625, + 16.7294921875 + ], + "baseline_geometry_s": 1.02, + "cost_estimates_total_s": 0.0163, + "verification_median_s": 34.84, + "load_end": [ + 18.7802734375, + 15.49560546875, + 16.75 + ] + }, + "C16_gf180_sW2_sL2": { + "geometry_s": { + "c0606cccb220": 0.0183, + "cfd6befdce13": 0.0179, + "cb70b109f00f": 0.0178, + "c9553d5916e1": 0.0183, + "cba6597162e5": 0.0187, + "c728d61e65e7": 0.0173, + "c3f287f9d792": 0.0247, + "c01285f03617": 0.0233, + "ce2c87119b01": 0.0248, + "c3bc4d855c9c": 0.0288, + "c574abc47fe0": 0.0269, + "c33da7e0dd09": 0.027, + "c6a58cb08ae1": 0.0283, + "c912c75bc3b4": 0.0261, + "c396a5685f48": 0.0227, + "c6d8d3cb496f": 0.0249, + "cb38b7257112": 0.0225, + "c3cc70fff0d9": 0.0319, + "c20b5daff011": 0.0771, + "c76653203c31": 0.0299, + "ccf380b2ebbb": 0.0759, + "c3cc306f1924": 0.0256, + "ca224dc4b94d": 0.0503, + "cdfc365d73e6": 0.0239, + "c15394cfe7e2": 0.0508, + "c6674e3e19e6": 0.0249, + "c4455d921128": 0.0229, + "cf60b3b360c3": 0.0227, + "ccdb4c2d96fb": 0.0225, + "c7b3516eb6ff": 0.0251, + "ca9247c82c6c": 0.0369, + "c3f570a30303": 0.023, + "cfcf7ab63434": 0.0372, + "c3b64ce65d28": 0.0182, + "cffbbe9f4325": 0.0805, + "c649cf571aec": 0.0183, + "c85a1455092e": 0.0246, + "c5c5f93d5439": 0.0199, + "c133f65cb1eb": 0.0187, + "c942d1dbb835": 0.0199, + "ce731a77d1fe": 0.0199, + "c23fdab4193a": 0.0191, + "c448b3911c10": 0.0169, + "cd5bf8a0c035": 0.0188, + "c454bb246f1d": 0.0172, + "c59f5a7a68da": 0.018, + "c2d0f459474a": 0.029, + "c589c6b321ce": 0.0185, + "ca4a16813e36": 0.0279 + }, + "load_start": [ + 18.60693359375, + 15.619140625, + 16.7705078125 + ], + "baseline_geometry_s": 0.5918, + "cost_estimates_total_s": 0.0043, + "verification_median_s": 24.81, + "load_end": [ + 18.60693359375, + 15.619140625, + 16.7705078125 + ] + }, + "C02_ihp130_sW1_sL1": { + "geometry_s": { + "c8a189738e65": 0.0145, + "cd992aac7ce2": 0.0142, + "ce39cc1ec93f": 0.013, + "c054e1700ec1": 0.0128, + "cf4728da73fe": 0.0139, + "c86c9634114b": 0.0132, + "cb576b91477c": 0.0133, + "cb3e6de06c0f": 0.013, + "c973a0640e6b": 0.0134, + "cce4299c7ab5": 0.0137, + "cd8f1aa389a8": 0.0128, + "c8dd1d70bf66": 0.0147, + "c265c2508f23": 0.0131, + "ce7769f4c7e7": 0.0133, + "c304759e429e": 0.0137, + "c1e11cb14870": 0.0138, + "c5eef773315c": 0.0131, + "c33ede984d3e": 0.0133, + "cfaca0eebc3f": 0.0134, + "c8d46a4c3707": 0.0127, + "cc1e93f291ee": 0.0136, + "cbd555382858": 0.0131, + "cbf80e3ede2f": 0.0131, + "c64d82336648": 0.0147, + "c806cfa2dae7": 0.0171, + "c9d3046021c9": 0.0176, + "cb8200500a8a": 0.0178, + "cf5fc7c0ae10": 0.018, + "cf60c9835ab8": 0.0175, + "ce8428be62ff": 0.017, + "c6026fb86c54": 0.0175, + "cd102a7cd82e": 0.0178, + "c476fe7ff0f5": 0.0174, + "c125515c9382": 0.0178, + "c7e50b349bee": 0.0174, + "c6710bc5dcd2": 0.0196, + "c3baa7b4203e": 0.0166, + "c6510312eb71": 0.017, + "c38de2e8fa1d": 0.0172, + "c15f7f002a47": 0.0168, + "ca526079d482": 0.0142, + "c7ed721c88ab": 0.0135, + "c4dace9a4128": 0.0136, + "c8af75ae914c": 0.0143, + "c08225022991": 0.014, + "cf327f6e6aab": 0.0144, + "c5138b51f856": 0.0136, + "c7bed3c57cdb": 0.0162, + "c49fe6bd1a15": 0.0132, + "c9eca9c94337": 0.0134, + "c09b49fdcd23": 0.014, + "c79c5edca55e": 0.014, + "c0c7811f6a18": 0.0136, + "cb13a6e943ff": 0.0135, + "cc7a40dcbaef": 0.0134, + "c54ce3f64cb0": 0.0133, + "c10dca933831": 0.0143, + "c1612704af84": 0.014, + "cb96b859e360": 0.0139, + "cc047915b5da": 0.0161, + "c818a0c6e5be": 0.0137, + "c0a8bab8808f": 0.0135, + "c65e5f21ab9b": 0.0138, + "c43b0a8fcd1b": 0.0137 + }, + "load_start": [ + 10.77685546875, + 10.7626953125, + 16.04541015625 + ], + "baseline_geometry_s": 0.8937, + "cost_estimates_total_s": 0.0082, + "verification_median_s": 7.6, + "load_end": [ + 10.77685546875, + 10.7626953125, + 16.04541015625 + ] + }, + "C08_ihp130_sW1_sL1": { + "geometry_s": { + "c1ebe43136e1": 0.0449, + "ce7ddcde62c6": 0.0425, + "c1b6567ac7e4": 0.0455, + "cb7b9eec0f72": 0.0343, + "c4c105f0e6f3": 0.1588, + "cda320abfa9d": 0.041, + "c778ab3175c9": 0.0522, + "c88aebce4693": 0.0341, + "cd9c2ebc7384": 0.0438, + "cb555958383c": 0.033, + "c8d5fb5a3e18": 0.0466, + "c7ae00594dca": 0.0449, + "ca77940fb7e7": 0.1889, + "c1b2b13e285c": 0.0354, + "c6c5ec6ebbf5": 0.0845, + "c494e473be33": 0.0389, + "c87d8c8f541f": 0.063, + "cb05e6ca89a8": 0.0401, + "c0556bfc944e": 0.036, + "c9f8808b47c1": 0.0351, + "c8cd2cabbaa8": 0.0476, + "cef567b9b34d": 0.1476, + "c03121001577": 0.1233, + "c63e58b365e9": 0.0425, + "ce87e84d7240": 0.0455, + "c32405eaab98": 0.0454, + "c130c7933da9": 0.0835, + "c573cc90b25e": 0.0423, + "cfeacc8a1a0a": 0.0453, + "c326e6c16a16": 0.0362, + "c6d4cad6f6d7": 0.0428, + "c72079aed3d5": 0.034, + "ca34eaf6cd93": 0.0443, + "ca167ac45b21": 0.0529, + "c3fc658ccc5c": 0.0357, + "c64515cf53ce": 0.1467, + "cb6b47992989": 0.0331, + "ca1d0ced6e9a": 0.0485, + "c414c47fb1cd": 0.0893, + "c1ed2c9bd13e": 0.0636, + "c8ea4aad91f7": 0.0795, + "c70827fc9131": 0.2819, + "c56d91519e33": 0.0373, + "cf9ad84efc55": 0.1897, + "c57c0df7efc8": 0.0533, + "c1364eb41d72": 0.1088, + "caa2a5dcbb01": 0.1154, + "ca59e5e64f47": 0.0344, + "c1c12e8963bf": 0.1516, + "ca3764892336": 0.0378, + "cd212fe898ae": 0.0375, + "c6631ca19a21": 0.1432, + "c4dc53475517": 0.0417, + "c472f3ec6d2f": 0.0352, + "c41a5902bbfd": 0.0547, + "c232a012c9cb": 0.0418, + "c07258663c57": 0.1982, + "c7b1a0d8b16f": 0.0471, + "c413af203dba": 0.0361, + "ccb834de1543": 0.0428, + "ca3df7ca75b0": 0.036, + "c89f76b76d60": 0.0526, + "c4017c0bc15c": 0.0384, + "c2fe54e4f0b6": 0.0419 + }, + "load_start": [ + 11.595703125, + 10.93310546875, + 16.072265625 + ], + "baseline_geometry_s": 0.9519, + "cost_estimates_total_s": 0.0148, + "verification_median_s": 5.67, + "load_end": [ + 12.18896484375, + 11.0673828125, + 16.08837890625 + ] + }, + "C08_gf180_sW2_sL1": { + "geometry_s": { + "ce3e6e258d71": 0.0857, + "c8df2dc9645f": 0.0812, + "ccc7ff22ac6e": 0.0846, + "c8f372de09a3": 0.0519, + "c48ad820fd4d": 0.0829, + "c5b0856ed85c": 0.0681, + "c82ae190b137": 1.37, + "c4482744eaf9": 0.5793, + "cfdd2c84ad1c": 0.0537, + "c0c496817388": 0.0521, + "c7f999f00373": 0.0555, + "c899b032fd17": 0.115, + "c88e4f30f7b2": 0.7245, + "cd085229fe3f": 0.7936, + "c033c2a0fa27": 0.1392, + "c7e8883088b7": 0.3943, + "ce8d233c9c04": 0.8641, + "cabbf84ba88a": 0.0451, + "c44bc60e75fa": 0.0643, + "cdc9ff5f0801": 1.0806, + "ceed2f965793": 0.0807, + "c5a60d231db7": 0.0472, + "c85c99645541": 0.1035, + "c026d2999e2a": 0.4141, + "cc121275f3c5": 0.0512, + "cad46dd41d93": 0.9559, + "c610b124c6a2": 0.1097, + "c2485b4435d7": 0.0302, + "ce23af1bd320": 0.4263, + "c479f5661112": 0.5536, + "ce702563cf95": 0.0408, + "c83b96ca6f4f": 0.0564, + "cb11ae1cbf9d": 0.0293, + "ce655ee0e162": 0.0395, + "cd52c5f7c04b": 0.0591, + "c5d04953867a": 0.5653, + "c0cb2c66e3db": 0.0812, + "c662f8e67967": 0.533, + "cd60481c0226": 0.0462, + "ca848b12445b": 0.0304, + "cdb9f434a826": 0.5359, + "c7f944f4549e": 0.0321, + "ce3fa009b55b": 0.0479, + "cdba4a0fcb31": 0.0292, + "c14734182da0": 0.4782, + "c9e165312b3d": 0.8176, + "c93f93d7dcf2": 0.2563, + "cd6d0a10ffce": 0.0311, + "c86a24ed9ec1": 0.5735, + "c388e24c3c23": 0.044, + "c856e61c8ea4": 0.0654, + "c22c9043f344": 0.0566, + "cb652286f074": 0.0327, + "c302ec470af6": 0.1856, + "c9cede377d32": 0.0541, + "cb96a10867e8": 0.0549, + "c88c4520382d": 0.0519, + "cd2bd61c4af5": 0.5088, + "c2eddae745de": 0.1374, + "c694f9b7a19d": 0.5044, + "c5698cc72682": 0.0489, + "cbe14a78a0ed": 0.2669, + "c3fe4b95de02": 0.0868, + "c9dd3ca1e0f1": 0.0334 + }, + "load_start": [ + 11.595703125, + 10.93310546875, + 16.072265625 + ], + "baseline_geometry_s": 1.0076, + "cost_estimates_total_s": 0.0163, + "verification_median_s": 18.455, + "load_end": [ + 13.77880859375, + 11.47314453125, + 16.14111328125 + ] + }, + "C11_sky130_sW2_sL2": { + "geometry_s": { + "c45f3ec86981": 0.2881, + "ca8b85af080b": 0.277, + "c4ea6f39b379": 0.2878, + "c0bd3be90393": 0.2737, + "c0227054a8f5": 0.2759, + "c8824c7d3e59": 0.2764, + "c09800314346": 0.3421, + "c930ac4cc65f": 0.3558, + "c20f3b3dcfd4": 0.2076, + "cc6c429ff102": 6.4142, + "cb44374ecbd4": 0.1419, + "c033df2dc6fa": 1.0561, + "c8a58650f9f3": 0.2852, + "c61a1d6bdcb8": 6.3562, + "c4e6588b003a": 0.1499, + "c1076c8ca537": 0.1484, + "c9d51150d33b": 0.146, + "cdfa9cb58983": 0.3972, + "ca6486c9e9c1": 0.2306, + "c27f25b564c6": 0.2412, + "c505a0e968de": 0.2706, + "c98f7fc3f947": 0.2727, + "c2ea5b2f4464": 0.2765, + "c5b1bc93fccb": 0.2773, + "c1f62303193b": 0.2044, + "c9c39a3d98a0": 7.0152, + "c37bbacb76a1": 0.2029, + "c0dacdb02121": 0.4165, + "c8e2648ec1f1": 0.2747, + "c5326bb6e0ca": 4.9204, + "c6bdad0cd5aa": 0.0789, + "cc21d99e3d80": 0.7209, + "c62c6788866c": 0.117, + "ce79b20ba55c": 3.4856, + "cd7029ec0d7f": 0.1183, + "c4a7a517ac63": 0.1888, + "c58ec884a43c": 0.1501, + "c7a61c5c3130": 0.1566, + "c5c34ebaca84": 0.0988, + "c496177d482a": 0.1499, + "cc6b7bc4d301": 3.6397, + "cba2548434aa": 0.1736, + "c03d267d9ca1": 0.0916, + "cb24fcff3488": 0.0782, + "cdde02b4a3af": 4.3516, + "c3950e71de52": 0.1578, + "cf5c029f8c79": 0.1968, + "c33aadc9b21e": 0.1544, + "cb72da3e81d2": 0.1107, + "c4b2144ae074": 0.0811, + "c8d283c2dc4e": 0.1105, + "c666354b0b2e": 0.0793, + "c52bde4f7291": 3.3802, + "cd6c8ed0cc62": 0.0997, + "ca74e982c990": 0.1413, + "c19e064c15b2": 0.0812, + "cd1fa1c8cd63": 0.1941, + "c00f1a268103": 0.0796, + "c23b65bc58ef": 0.0792, + "ce0091e09bb1": 0.1177, + "c510936b4e68": 3.7299, + "c0c9afdb8d03": 0.1444, + "cf3bd672b378": 0.6073, + "c843d8dceec5": 0.1528 + }, + "load_start": [ + 18.7177734375, + 15.53759765625, + 16.7568359375 + ], + "baseline_geometry_s": 1.1815, + "cost_estimates_total_s": 0.0221, + "verification_median_s": 51.34, + "load_end": [ + 17.2216796875, + 15.70849609375, + 16.74951171875 + ] + }, + "C08_sky130_sW2_sL2": { + "geometry_s": { + "ce3e6e258d71": 0.0546, + "c8df2dc9645f": 0.057, + "ccc7ff22ac6e": 0.063, + "c8f372de09a3": 0.0559, + "c4cdd539d6e7": 0.5424, + "cdf53f38e1e9": 0.0517, + "cd3cdca09d13": 0.5154, + "c45d4a91f9de": 0.0564, + "c2d2f43d767f": 0.7007, + "c15a211ec406": 0.0542, + "c098d717b2e1": 0.082, + "cf1f72e0ea6f": 0.0535, + "c169f3570210": 0.7684, + "cdf73f5bdccc": 0.0646, + "cb669b894eae": 0.1225, + "c34a528ae7f1": 0.0653, + "caab8c3cdb80": 0.882, + "c83a184bbba1": 0.0801, + "c4f88416d43e": 0.0547, + "c1992da4f5b5": 0.0659, + "ce30756f345b": 0.6237, + "c62da22f8499": 0.1529, + "c0dc841ee139": 0.0531, + "c58482b80d55": 0.5987, + "c0c496817388": 0.1249, + "c38d9072e007": 0.0556, + "cdc9ff5f0801": 0.8813, + "c0cb2c66e3db": 0.1, + "c1582c509b6c": 0.0571, + "cac1b3e72c2f": 0.1007, + "c6d64e7afc73": 0.6715, + "c59f9bfe2d6d": 0.0855, + "c4a4a6a394fd": 0.0637, + "c3bb6c7fb509": 0.0605, + "ca735d661c3e": 0.0556, + "c539c1244e6f": 0.6734, + "ccc29563205a": 0.0529, + "c30892fce22e": 1.0483, + "c8a24aa58675": 0.0936, + "ca89e1a39a15": 0.752, + "cf470b9d7c29": 0.6362, + "c18d79b0b074": 0.1611, + "cc57a5c20347": 0.0557, + "cfc35e0dec0a": 0.7077, + "cd01a9e2018e": 0.0569, + "c8bb85c62591": 0.482, + "c614fccb933b": 0.0622, + "c3e3829a0803": 0.0684, + "c7d453aa8af8": 0.5952, + "cedfcf91cbb7": 0.0786, + "c9aa2c20bdc1": 0.5527, + "c694f9b7a19d": 0.6115, + "c5b0856ed85c": 0.0597, + "c3f8600e43e7": 0.1012, + "c25a9428fc90": 0.0581, + "c8cebf4fa121": 0.0523, + "c516243f5c65": 0.727, + "ca991dd83b61": 0.056, + "cb03edec7f6f": 0.8815, + "c38ccd6d7534": 0.6596, + "cdfb88971248": 0.5422, + "cba6571692b8": 0.2319, + "c77dd72e047a": 0.1449, + "cb96a10867e8": 0.0666 + }, + "load_start": [ + 12.73486328125, + 11.19921875, + 16.1044921875 + ], + "baseline_geometry_s": 0.9696, + "cost_estimates_total_s": 0.0179, + "verification_median_s": 19.075, + "load_end": [ + 14.197265625, + 11.59814453125, + 16.15673828125 + ] + }, + "C16_gf180_sW1_sL1": { + "geometry_s": { + "c2e52d6ac401": 0.0125, + "cb7b19550006": 0.0135, + "cfbd7ec81e6b": 0.0125, + "c0c48e26e41e": 0.0128, + "cf9559574acb": 0.0139, + "c0f923f8248d": 0.0139, + "c5dc28bfca06": 0.0151, + "cbbd4ef2e0bb": 0.0144, + "c1905d32dbcf": 0.0163, + "c2aac95fccb8": 0.0215, + "ccbca30b74a7": 0.0167, + "c0019263a233": 0.0213, + "cb18c44bc6e4": 0.0168, + "c97d05c1501f": 0.0241, + "cd9f57dd0924": 0.0158, + "c075ba8e1639": 0.0238, + "cf9098cedba8": 0.0143, + "c2827ff310d4": 0.0175, + "c35bd7131b3f": 0.0323, + "c17a0c4f773b": 0.0179, + "c4834dc35303": 0.0328, + "c15773d79602": 0.0164, + "c4f5495ffef5": 0.0242, + "c1a3de6634ce": 0.0146, + "c31cb3370cac": 0.0245, + "cc9ee41cef40": 0.0153, + "c8b272104ec5": 0.0142, + "cbd1d4dc35ec": 0.0155, + "ca99aed17c77": 0.014, + "ca7feca451cb": 0.0157, + "cc2c5c9f6cbb": 0.0197, + "c249482f72c4": 0.015, + "c8ddfb4208f5": 0.0194, + "c2c13fc313bb": 0.0122, + "ca7e4dec30cb": 0.0142, + "c7fff4d94d75": 0.0122, + "c0e34e2a054e": 0.0151, + "ccde9fba0434": 0.0198, + "c035f6c2753f": 0.0147, + "c10291a49c1a": 0.019, + "cca189885768": 0.0126, + "c3a9d1c5d402": 0.0181, + "c1a7f501df1e": 0.012, + "c9fb113ccb24": 0.0183, + "cf3a54028200": 0.012, + "c5919a61b4f2": 0.0127, + "c4989ef5e566": 0.0168, + "c13e5c3c6da4": 0.0125, + "c4cdf00d4097": 0.019 + }, + "load_start": [ + 18.7177734375, + 15.53759765625, + 16.7568359375 + ], + "baseline_geometry_s": 0.5726, + "cost_estimates_total_s": 0.0039, + "verification_median_s": 30.24, + "load_end": [ + 18.7177734375, + 15.53759765625, + 16.7568359375 + ] + }, + "C16_sky130_sW1_sL2": { + "geometry_s": { + "c2e52d6ac401": 0.02, + "cb7b19550006": 0.0234, + "cfbd7ec81e6b": 0.0249, + "c0c48e26e41e": 0.0244, + "cf9559574acb": 0.0237, + "c0f923f8248d": 0.0242, + "c5dc28bfca06": 0.0271, + "cbbd4ef2e0bb": 0.0302, + "c1905d32dbcf": 0.0257, + "c2aac95fccb8": 0.0269, + "ccbca30b74a7": 0.0335, + "c0019263a233": 0.0339, + "cb18c44bc6e4": 0.0322, + "c97d05c1501f": 0.0313, + "cd9f57dd0924": 0.0278, + "c075ba8e1639": 0.034, + "cf9098cedba8": 0.0252, + "c2827ff310d4": 0.0293, + "c35bd7131b3f": 0.0542, + "c17a0c4f773b": 0.03, + "c4834dc35303": 0.0554, + "c15773d79602": 0.0292, + "c4f5495ffef5": 0.0325, + "c1a3de6634ce": 0.0255, + "c31cb3370cac": 0.0336, + "cc9ee41cef40": 0.0264, + "c8b272104ec5": 0.0245, + "cbd1d4dc35ec": 0.0302, + "ca99aed17c77": 0.0243, + "ca7feca451cb": 0.0258, + "cc2c5c9f6cbb": 0.0268, + "c249482f72c4": 0.0242, + "c8ddfb4208f5": 0.0268, + "c2c13fc313bb": 0.02, + "ca7e4dec30cb": 0.0216, + "c7fff4d94d75": 0.0209, + "c0e34e2a054e": 0.0219, + "ccde9fba0434": 0.026, + "c035f6c2753f": 0.0236, + "c10291a49c1a": 0.0261, + "cca189885768": 0.0214, + "c3a9d1c5d402": 0.0246, + "c1a7f501df1e": 0.0201, + "c9fb113ccb24": 0.0253, + "cf3a54028200": 0.0213, + "c5919a61b4f2": 0.0211, + "c4989ef5e566": 0.0248, + "c13e5c3c6da4": 0.0237, + "c4cdf00d4097": 0.0264 + }, + "load_start": [ + 18.4716796875, + 15.736328125, + 16.791015625 + ], + "baseline_geometry_s": 0.8632, + "cost_estimates_total_s": 0.0058, + "verification_median_s": 20.86, + "load_end": [ + 18.43359375, + 15.77392578125, + 16.7978515625 + ] + }, + "C08_ihp130_sW1_sL2": { + "geometry_s": { + "c1ebe43136e1": 0.0453, + "ce7ddcde62c6": 0.0421, + "c1b6567ac7e4": 0.0449, + "cb7b9eec0f72": 0.0356, + "c5e7159c6ce7": 0.0419, + "c88e6048c8b2": 0.0362, + "ca5331b99128": 0.0363, + "c603634449f7": 0.0361, + "ca16ebdcdb77": 0.0433, + "c1c12e8963bf": 0.038, + "c9d6b3758851": 0.0367, + "c1e88a85d4d8": 0.06, + "cd22616356d2": 0.0357, + "c0cbfeb30288": 0.0498, + "c5b9e55d956c": 0.0967, + "c9a98f158c76": 0.0376, + "c48a9bf64397": 0.0412, + "c3e5592a0bae": 0.0449, + "c7acf940a4bb": 0.0378, + "cd8a0d484428": 0.0531, + "c716e5d66e70": 0.0551, + "c28b5290574e": 0.0394, + "c728880c5121": 0.0443, + "cbf08aee42f2": 0.0822, + "ca34eaf6cd93": 0.0426, + "cbe43ba9074c": 0.0378, + "c8db328b2edf": 0.0468, + "c4c764f3da72": 0.0376, + "c1c34ac8478c": 0.0345, + "c958684a4c7f": 0.0724, + "c4f9430ce88b": 0.0378, + "c724ffec4449": 0.0686, + "c08a8f092422": 0.0389, + "cd0d16edb1ac": 0.0356, + "c3284f823adb": 0.0372, + "c57e4ad3ef73": 0.0365, + "c5608d49faa8": 0.0429, + "c2b84d6a78ce": 0.0396, + "cd9a5997f77d": 0.0389, + "c1bd371c449e": 0.0372, + "ca6b7bf587a2": 0.0357, + "c94046dd7e8b": 0.045, + "c07b0e985aaf": 0.0716, + "c59025811298": 0.0401, + "c6cbc2023fe4": 0.1073, + "c4c20421bdcc": 0.0763, + "c9776171d573": 0.0347, + "cd496074d309": 0.0539, + "ce0f2a1d0766": 0.0357, + "c14fa1f08b18": 0.0413, + "c193de880bd4": 0.0513, + "c3fdb05f1e81": 0.0532, + "c157726ecbf6": 0.0333, + "c6d1a37e859c": 0.0515, + "c17836863c15": 0.048, + "c920043ce1f6": 0.0391, + "c32cef85f1a7": 0.0354, + "cf49ba41d0ef": 0.0368, + "c943223a8811": 0.0525, + "ccb834de1543": 0.0429, + "c2e690c558ca": 0.066, + "c141aa3210cd": 0.0368, + "c6d5d62f88fc": 0.1162, + "cb6f9aaf03f7": 0.0363 + }, + "load_start": [ + 11.595703125, + 10.93310546875, + 16.072265625 + ], + "baseline_geometry_s": 0.9473, + "cost_estimates_total_s": 0.0146, + "verification_median_s": 5.64, + "load_end": [ + 12.18896484375, + 11.0673828125, + 16.08837890625 + ] + }, + "C16_sky130_sW2_sL2": { + "geometry_s": { + "c0606cccb220": 0.0334, + "cfd6befdce13": 0.0329, + "cb70b109f00f": 0.0337, + "c9553d5916e1": 0.0328, + "cba6597162e5": 0.0297, + "c728d61e65e7": 0.025, + "c3f287f9d792": 0.0316, + "c01285f03617": 0.0315, + "ce2c87119b01": 0.0322, + "c3bc4d855c9c": 0.0454, + "c574abc47fe0": 0.0434, + "c33da7e0dd09": 0.0428, + "c6a58cb08ae1": 0.0441, + "c912c75bc3b4": 0.055, + "c396a5685f48": 0.0329, + "c6d8d3cb496f": 0.0508, + "cb38b7257112": 0.0332, + "c3cc70fff0d9": 0.0456, + "c20b5daff011": 0.0986, + "c76653203c31": 0.046, + "ccf380b2ebbb": 0.149, + "c3cc306f1924": 0.0486, + "ca224dc4b94d": 0.0822, + "cdfc365d73e6": 0.0446, + "c15394cfe7e2": 0.0753, + "c6674e3e19e6": 0.0566, + "c4455d921128": 0.0397, + "cf60b3b360c3": 0.0521, + "ccdb4c2d96fb": 0.0397, + "c7b3516eb6ff": 0.0445, + "ca9247c82c6c": 0.0468, + "c3f570a30303": 0.0387, + "cfcf7ab63434": 0.0463, + "c3b64ce65d28": 0.0294, + "cffbbe9f4325": 0.0949, + "c649cf571aec": 0.0292, + "c85a1455092e": 0.0341, + "c5c5f93d5439": 0.0415, + "c133f65cb1eb": 0.0304, + "c942d1dbb835": 0.0412, + "ce731a77d1fe": 0.0327, + "c23fdab4193a": 0.0398, + "c448b3911c10": 0.0306, + "cd5bf8a0c035": 0.0402, + "c454bb246f1d": 0.0297, + "c59f5a7a68da": 0.0316, + "c2d0f459474a": 0.0417, + "c589c6b321ce": 0.0318, + "ca4a16813e36": 0.0411 + }, + "load_start": [ + 18.318359375, + 15.79443359375, + 16.79931640625 + ], + "baseline_geometry_s": 0.9342, + "cost_estimates_total_s": 0.0081, + "verification_median_s": 22.64, + "load_end": [ + 18.318359375, + 15.79443359375, + 16.79931640625 + ] + }, + "C02_ihp130_sW1_sL2": { + "geometry_s": { + "c8a189738e65": 0.0085, + "cd992aac7ce2": 0.0086, + "ce39cc1ec93f": 0.0081, + "c054e1700ec1": 0.0081, + "cf4728da73fe": 0.0087, + "c86c9634114b": 0.0081, + "cb576b91477c": 0.0081, + "cb3e6de06c0f": 0.0079, + "c973a0640e6b": 0.0084, + "cce4299c7ab5": 0.0084, + "cd8f1aa389a8": 0.0081, + "c8dd1d70bf66": 0.0094, + "c265c2508f23": 0.0079, + "ce7769f4c7e7": 0.008, + "c304759e429e": 0.0084, + "c1e11cb14870": 0.0084, + "c5eef773315c": 0.0081, + "c33ede984d3e": 0.0081, + "cfaca0eebc3f": 0.008, + "c8d46a4c3707": 0.008, + "cc1e93f291ee": 0.008, + "cbd555382858": 0.0077, + "cbf80e3ede2f": 0.0078, + "c64d82336648": 0.0096, + "c806cfa2dae7": 0.0102, + "c9d3046021c9": 0.0106, + "cb8200500a8a": 0.0105, + "cf5fc7c0ae10": 0.0105, + "cf60c9835ab8": 0.0104, + "ce8428be62ff": 0.0106, + "c6026fb86c54": 0.0104, + "cd102a7cd82e": 0.0105, + "c476fe7ff0f5": 0.0106, + "c125515c9382": 0.0105, + "c7e50b349bee": 0.0104, + "c6710bc5dcd2": 0.0125, + "c3baa7b4203e": 0.0097, + "c6510312eb71": 0.0099, + "c38de2e8fa1d": 0.0103, + "c15f7f002a47": 0.0102, + "ca526079d482": 0.0085, + "c7ed721c88ab": 0.009, + "c4dace9a4128": 0.0088, + "c8af75ae914c": 0.0087, + "c08225022991": 0.0087, + "cf327f6e6aab": 0.0087, + "c5138b51f856": 0.0088, + "c7bed3c57cdb": 0.0105, + "c49fe6bd1a15": 0.0085, + "c9eca9c94337": 0.0086, + "c09b49fdcd23": 0.0084, + "c79c5edca55e": 0.0087, + "c0c7811f6a18": 0.0083, + "cb13a6e943ff": 0.0086, + "cc7a40dcbaef": 0.0082, + "c54ce3f64cb0": 0.0084, + "c10dca933831": 0.0089, + "c1612704af84": 0.0086, + "cb96b859e360": 0.0085, + "cc047915b5da": 0.0104, + "c818a0c6e5be": 0.0084, + "c0a8bab8808f": 0.0089, + "c65e5f21ab9b": 0.0084, + "c43b0a8fcd1b": 0.0086 + }, + "load_start": [ + 10.77685546875, + 10.7626953125, + 16.04541015625 + ], + "baseline_geometry_s": 0.5888, + "cost_estimates_total_s": 0.005, + "verification_median_s": 7.51, + "load_end": [ + 10.77685546875, + 10.7626953125, + 16.04541015625 + ] + }, + "C16_ihp130_sW1_sL2": { + "geometry_s": { + "c2e52d6ac401": 0.0127, + "cb7b19550006": 0.012, + "cfbd7ec81e6b": 0.0128, + "c0c48e26e41e": 0.0129, + "cf9559574acb": 0.0122, + "c0f923f8248d": 0.0125, + "c5dc28bfca06": 0.0138, + "cbbd4ef2e0bb": 0.0148, + "c1905d32dbcf": 0.014, + "c2aac95fccb8": 0.0175, + "ccbca30b74a7": 0.0168, + "c0019263a233": 0.0186, + "cb18c44bc6e4": 0.0169, + "c97d05c1501f": 0.0197, + "cd9f57dd0924": 0.0163, + "c075ba8e1639": 0.0199, + "cf9098cedba8": 0.0146, + "c2827ff310d4": 0.0169, + "c35bd7131b3f": 0.0274, + "c17a0c4f773b": 0.0168, + "c4834dc35303": 0.0277, + "c15773d79602": 0.0164, + "c4f5495ffef5": 0.0221, + "c1a3de6634ce": 0.0147, + "c31cb3370cac": 0.0218, + "cc9ee41cef40": 0.0169, + "c8b272104ec5": 0.0149, + "cbd1d4dc35ec": 0.0165, + "ca99aed17c77": 0.0143, + "ca7feca451cb": 0.0164, + "cc2c5c9f6cbb": 0.018, + "c249482f72c4": 0.015, + "c8ddfb4208f5": 0.018, + "c2c13fc313bb": 0.0124, + "ca7e4dec30cb": 0.0139, + "c7fff4d94d75": 0.0122, + "c0e34e2a054e": 0.0141, + "ccde9fba0434": 0.0166, + "c035f6c2753f": 0.0145, + "c10291a49c1a": 0.0168, + "cca189885768": 0.0128, + "c3a9d1c5d402": 0.0157, + "c1a7f501df1e": 0.0127, + "c9fb113ccb24": 0.0155, + "cf3a54028200": 0.0125, + "c5919a61b4f2": 0.0131, + "c4989ef5e566": 0.0161, + "c13e5c3c6da4": 0.0147, + "c4cdf00d4097": 0.0159 + }, + "load_start": [ + 18.55810546875, + 15.65869140625, + 16.77734375 + ], + "baseline_geometry_s": 0.5953, + "cost_estimates_total_s": 0.0037, + "verification_median_s": 12.39, + "load_end": [ + 18.51318359375, + 15.69775390625, + 16.7841796875 + ] + }, + "C08_gf180_sW2_sL2": { + "geometry_s": { + "ce3e6e258d71": 0.0873, + "c8df2dc9645f": 0.0839, + "ccc7ff22ac6e": 0.085, + "c8f372de09a3": 0.0568, + "c5fcd822ea3f": 0.0547, + "c4bf05d38bf5": 0.0533, + "c2fdc4f73b4f": 0.089, + "c910ab25f01b": 0.8596, + "ca848b12445b": 0.053, + "c2030067357a": 0.1393, + "c4c544dc2243": 0.0976, + "c83e9a976517": 0.0956, + "c37aeffc9569": 0.0558, + "c89fc7742417": 0.3234, + "cf2b62f9a017": 0.0855, + "ca9cc4d26a1f": 0.1487, + "c03cd5442e66": 0.1073, + "c0769d18e2e8": 0.0552, + "c44bc60e75fa": 0.0912, + "ce9aa3d31a1f": 0.0606, + "ccc0bb83009e": 0.4655, + "c9a1c0672556": 0.0548, + "ce1281f86efe": 0.0575, + "c45d4a91f9de": 0.1263, + "cf623c9c4058": 0.0942, + "cabbf84ba88a": 0.0556, + "c610b124c6a2": 0.0973, + "cbd4a85b096e": 0.0957, + "c8736b92cf26": 0.637, + "c6fba58d4aaa": 0.0932, + "cc5481353215": 0.1359, + "c9a6c7166fd6": 0.0982, + "c960c242200f": 0.3589, + "ce3e55ba8e69": 0.0565, + "c0af64869d95": 0.0538, + "c10d05aa27b6": 0.0549, + "c38bf6b290ed": 0.111, + "c2813e34f9fa": 0.0921, + "c2b8bcc2d3b3": 0.1042, + "cea437c7ce7d": 0.0595, + "cfe3c4720055": 0.2873, + "c799f2e7a07b": 0.5836, + "c9e165312b3d": 0.9756, + "c2f5ea2581f2": 0.5914, + "c1b49f6fe63f": 0.1085, + "c90098cde79b": 0.0963, + "cdbdc88059be": 0.1984, + "cca603842292": 0.2823, + "c2eb390d7e95": 0.0584, + "c14734182da0": 0.4992, + "cfb6fdb3d424": 0.0932, + "c880c8a0fdfb": 0.0564, + "ca5daff3f5b9": 0.3182, + "c83445130a03": 0.0872, + "cf5f633f8d82": 0.0562, + "cef590d4dfd2": 0.5954, + "c6370d0e525b": 0.5879, + "ccf2eb50ef49": 0.0578, + "c1a33c110427": 0.5396, + "cb7cea4354b2": 0.06, + "cacaca6813a9": 0.1983, + "c9d035ab3996": 0.0549, + "c38dead8033e": 0.0628, + "c25e0a81c910": 0.0537 + }, + "load_start": [ + 11.595703125, + 10.93310546875, + 16.072265625 + ], + "baseline_geometry_s": 1.0241, + "cost_estimates_total_s": 0.0165, + "verification_median_s": 12.7, + "load_end": [ + 13.23681640625, + 11.3291015625, + 16.1201171875 + ] + }, + "C08_sky130_sW1_sL2": { + "geometry_s": { + "c1ebe43136e1": 0.0216, + "ce7ddcde62c6": 0.0208, + "c1b6567ac7e4": 0.0226, + "cb7b9eec0f72": 0.0203, + "cb4513ca8d66": 0.0198, + "ca3df7ca75b0": 0.0192, + "ca5331b99128": 0.0206, + "ce599331fcf0": 0.0214, + "cd496074d309": 0.0478, + "cf734dce4786": 0.0229, + "c337dc5cae16": 0.0327, + "ce96aa7fc245": 0.0205, + "ce77acf8360b": 0.0195, + "caf3de657c1e": 0.0203, + "cf9664e5032d": 0.0246, + "c17dfd04050d": 0.0216, + "ce2962b926fa": 0.0204, + "c8ea4aad91f7": 0.0445, + "c63d82032275": 0.0209, + "c1785ed0e756": 0.0224, + "cdff7a171f2f": 0.0212, + "cc0640122cb3": 0.0322, + "c4e23649b6ab": 0.0202, + "c591f3f3d2b8": 0.0209, + "c5b942ca0953": 0.0327, + "ca2ed1c0e727": 0.0249, + "ce3abaf22ae4": 0.0295, + "cb286735b956": 0.0295, + "ca6ce9020ebb": 0.0193, + "c35929f74933": 0.0229, + "cb936c357495": 0.0199, + "c66e86dc75a7": 0.0232, + "cf215ebe0d1f": 0.0418, + "ca68e1d22cd2": 0.0255, + "ce1449d5c160": 0.0245, + "c32add367501": 0.0225, + "c157726ecbf6": 0.0191, + "caa5bff0fe1d": 0.0392, + "cf531448ce34": 0.0253, + "ce6a7b37cc40": 0.0239, + "cd6907e25d39": 0.0199, + "c91fc7ca6e75": 0.0236, + "cc14a36fee03": 0.0214, + "ccb834de1543": 0.0209, + "c15f7f08c7b4": 0.0801, + "c778ab3175c9": 0.023, + "c1bd371c449e": 0.0202, + "c68997273bc8": 0.0201, + "c08b09de3ccc": 0.0202, + "cc0faf9fadde": 0.0219, + "ce535ea0da3c": 0.022, + "c6205fd22fe2": 0.0254, + "c7f91bc770a8": 0.02, + "c472f3ec6d2f": 0.0208, + "cbf08aee42f2": 0.0432, + "cb83732b5564": 0.0203, + "ca3f14c65506": 0.0244, + "cce7606f7754": 0.0266, + "c220bad8d305": 0.0238, + "cd0e64a302e9": 0.0279, + "ce6609d0c2c4": 0.0204, + "c89f76b76d60": 0.0232, + "c5acfc991e1c": 0.0254, + "c47a54933a2b": 0.0203 + }, + "load_start": [ + 12.18896484375, + 11.0673828125, + 16.08837890625 + ], + "baseline_geometry_s": 0.6168, + "cost_estimates_total_s": 0.0078, + "verification_median_s": 16.725, + "load_end": [ + 12.18896484375, + 11.0673828125, + 16.08837890625 + ] + }, + "C08_sky130_sW2_sL1": { + "geometry_s": { + "ce3e6e258d71": 0.0607, + "c8df2dc9645f": 0.0575, + "ccc7ff22ac6e": 0.0591, + "c8f372de09a3": 0.0521, + "cfc4423b7370": 0.068, + "cd45d30c42d2": 0.0562, + "ce4ae2fe99b7": 0.0855, + "c32f11ebd5d4": 0.0517, + "c87e69f3ca1d": 1.0067, + "c4ae32d4a196": 1.1165, + "c9c8bac040c3": 0.6765, + "c4f88416d43e": 0.0551, + "c69d846eee46": 0.0522, + "ce9395d271c7": 0.0512, + "cf5ee87ad240": 0.6215, + "c5c599345b2b": 0.0749, + "c48d583027e0": 0.0669, + "c0769d18e2e8": 0.0512, + "c7f944f4549e": 0.0533, + "cfca6d35eb33": 0.7043, + "cdba4a0fcb31": 0.0525, + "c90066ce1eff": 0.0499, + "c031b2180741": 0.0756, + "c0578fc4bd1a": 0.6128, + "c1999bc37d27": 1.1725, + "ce97211e0ace": 0.0523, + "c4a602e5463e": 0.9693, + "c32ae986b8b2": 0.1636, + "c7752653c0b7": 0.9808, + "ce8997976b92": 0.0633, + "cd652bf45252": 0.0854, + "c389e0a5eee3": 0.0881, + "c685c92beaf7": 1.1039, + "c4326cb671f2": 0.0542, + "cfc1490eb2a9": 0.6735, + "c9e4b18b3487": 0.0535, + "cdc357789758": 0.0687, + "cdcf192784ff": 0.0744, + "ceb00c4f5487": 0.0954, + "c04197fef3f6": 1.1768, + "ce655ee0e162": 0.0547, + "c86b2b0d0a0b": 0.0554, + "c6cf642d134b": 0.597, + "c03a464e88b1": 1.1098, + "c14734182da0": 0.9965, + "cfc5fe51d1bf": 0.0801, + "c1755eaa0c55": 0.8421, + "c114895366b8": 0.0869, + "cac46bc28eec": 0.0511, + "c1ae9f3baab6": 0.0528, + "cca577de7bcd": 0.0526, + "ceb347c93fa5": 0.0585, + "c7f9f45e3884": 0.0496, + "c38bf6b290ed": 0.09, + "c30a89e6f9d2": 1.0825, + "c1a9dc17ff5d": 1.0745, + "cdcb29eec4ac": 0.5505, + "c9aa2c20bdc1": 0.6343, + "c7770ee6a1f1": 1.0835, + "ca0a7eb9f854": 0.9458, + "c30892fce22e": 0.5161, + "c98b65c127d0": 0.0573, + "cbc9a90790d5": 1.0841, + "c443ef38398f": 1.0518 + }, + "load_start": [ + 12.18896484375, + 11.0673828125, + 16.08837890625 + ], + "baseline_geometry_s": 0.9556, + "cost_estimates_total_s": 0.0169, + "verification_median_s": 19.79, + "load_end": [ + 14.58203125, + 11.72119140625, + 16.17236328125 + ] + }, + "C09_gf180_sW1_sL1": { + "geometry_s": { + "c4b1052e8467": 0.0386, + "c3adbfecf775": 0.033, + "cacfec877b5d": 0.0322, + "c002e37770a8": 0.0317, + "c24ce93aad9d": 0.0335, + "c835fb48a97f": 0.0625, + "c40994dcaf30": 0.0329, + "c640fc5e0461": 0.0335, + "cf9ce5baa5c9": 0.032, + "cd38e77e48cd": 0.0567, + "c523e1866538": 0.0336, + "c01cc8061ef5": 0.288, + "c9fb0f982a21": 0.033, + "ce1ab88319c3": 0.0345, + "cb3cb249c44b": 0.0325, + "c130ade69c98": 0.1287, + "c0bb06053899": 0.0328, + "c53f0bd967e1": 0.0479, + "cc2760a4e2ff": 0.0344, + "c4193d4b85f8": 0.3933, + "c73d89ac0c80": 0.1188, + "c574025546fc": 0.0968, + "ca8a3aaf075c": 0.4471, + "ccdd3109540d": 0.0367, + "c948e6b0b3c5": 0.2104, + "cbfb9e6e599f": 0.0333, + "cfcec5846b78": 0.0314, + "cdc2bf0624de": 0.0349, + "c6d260a49204": 0.033, + "cbaf77b0452a": 0.0331, + "c63fab665d6c": 0.0337, + "cfda738113ee": 0.0342, + "c48d728be3ca": 0.056, + "cd1754585dc8": 0.0356, + "c09c82aaab4e": 0.427, + "c46168b28edf": 0.0343, + "c06f37137521": 0.0618, + "cf42b1d8c1bc": 0.0329, + "c3806fe82362": 0.3113, + "c0784d9d2dbb": 0.204, + "c9c1e6a1227c": 0.0403, + "c253be58b2d1": 0.0432, + "ca6f6963e509": 0.0377, + "c047ce929b82": 0.034, + "cee2acf40658": 0.0348, + "ce4d5b2d2383": 0.0329, + "cc04a2ad624f": 0.1672, + "c84c3e387c30": 0.0344, + "ccc06577b086": 0.3642, + "ca5367cc57bc": 0.0326, + "c28b40b737bf": 0.0347, + "ca5586902835": 0.0341, + "c793dcc093c4": 0.3718, + "c44d6de198b5": 0.1444, + "ca26167cd3ad": 0.0334, + "ce92eb562897": 0.0459, + "c855d467a86c": 0.0455, + "c701f251ccad": 0.0807, + "cff3e15bb93a": 0.052, + "cbab087e1c40": 0.316, + "c66d5a989dc3": 0.0537, + "c6016d3a30b9": 0.0544, + "cd9938728a12": 0.0952, + "c1448232a0b6": 0.0518 + }, + "load_start": [ + 12.18896484375, + 11.0673828125, + 16.08837890625 + ], + "baseline_geometry_s": 0.619, + "cost_estimates_total_s": 0.0099, + "verification_median_s": 28.380000000000003, + "load_end": [ + 13.23681640625, + 11.3291015625, + 16.1201171875 + ] + }, + "C11_ihp130_sW2_sL1": { + "geometry_s": { + "c45f3ec86981": 0.2657, + "ca8b85af080b": 0.2509, + "c4ea6f39b379": 0.2806, + "c0bd3be90393": 0.2511, + "c2c3d0c229e5": 0.2424, + "c89df0b187af": 4.383, + "c6fb5860c208": 0.1531, + "c42096decc19": 0.6643, + "c1f62303193b": 0.2115, + "c8220735314c": 0.1762, + "c807639e560b": 0.2664, + "cdff0fb6158f": 0.22, + "cf75e8507c3c": 0.2572, + "c493c01c54eb": 2.1867, + "c83fcb22accc": 0.083, + "c8a07a5ae499": 0.6914, + "c06335089b3c": 0.2212, + "c68edd8edcf4": 4.0602, + "ca56e9e3e728": 0.0955, + "c3c22300b98e": 0.6085, + "c505a0e968de": 0.1577, + "cc4ea35e1113": 3.1673, + "cb592897c649": 0.0959, + "c7730571d4c2": 6.2864, + "c58583afaed6": 0.217, + "c9a7802e8b1b": 0.1802, + "c66ce9091cd2": 0.1023, + "ce20b537c0a2": 5.3052, + "c8e2648ec1f1": 0.2504, + "cd7952baf4eb": 0.1726, + "cd6414569645": 0.2671, + "ccd2515636e4": 0.8186, + "cd0ad7448066": 0.1574, + "c8c2970324ce": 2.1566, + "c108bb581ff2": 0.1031, + "cde1abd066d9": 4.2852, + "c21641facf0e": 0.1034, + "c8e917e4a351": 0.0804, + "ce06fc4a861b": 0.0884, + "c5e7ffffe51b": 2.6515, + "cc04b73a40de": 0.0849, + "c4bebc25ee00": 7.243, + "cd31d6775790": 3.5562, + "c3d8a2e19a79": 0.5543, + "c3fb0f5538ab": 0.206, + "c6f5af80ac6b": 4.1102, + "c6286e63b092": 0.0837, + "cc702398af08": 5.2248, + "c282dc62b932": 3.0776, + "c09800314346": 0.2726, + "c05a5514424d": 0.2019, + "c496177d482a": 0.2598, + "c8026b509b1e": 3.6684, + "c9efdb97a9d3": 0.1836, + "c59ea963849e": 0.7447, + "c4c5813507eb": 4.8461, + "c0f5ab56b694": 4.9708, + "cedf18ba95fe": 0.0571, + "c6dae6a47033": 3.3403, + "cda0cbb3f55a": 3.9701, + "ca971b5a0fcf": 0.1463, + "c0291fca0d25": 0.1545, + "c3588e5f627b": 2.0748, + "c542020bfb58": 3.8387 + }, + "load_start": [ + 18.39306640625, + 14.20166015625, + 16.50927734375 + ], + "baseline_geometry_s": 1.1064, + "cost_estimates_total_s": 0.0182, + "verification_median_s": 20.21, + "load_end": [ + 18.7802734375, + 15.49560546875, + 16.75 + ] + }, + "C16_ihp130_sW1_sL1": { + "geometry_s": { + "c2e52d6ac401": 0.0128, + "cb7b19550006": 0.0145, + "cfbd7ec81e6b": 0.0128, + "c0c48e26e41e": 0.0129, + "cf9559574acb": 0.0145, + "c0f923f8248d": 0.0146, + "c5dc28bfca06": 0.0144, + "cbbd4ef2e0bb": 0.0141, + "c1905d32dbcf": 0.0157, + "c2aac95fccb8": 0.0246, + "ccbca30b74a7": 0.0167, + "c0019263a233": 0.0248, + "cb18c44bc6e4": 0.0165, + "c97d05c1501f": 0.0205, + "cd9f57dd0924": 0.017, + "c075ba8e1639": 0.0202, + "cf9098cedba8": 0.0161, + "c2827ff310d4": 0.0168, + "c35bd7131b3f": 0.0288, + "c17a0c4f773b": 0.0169, + "c4834dc35303": 0.0281, + "c15773d79602": 0.0163, + "c4f5495ffef5": 0.0221, + "c1a3de6634ce": 0.0148, + "c31cb3370cac": 0.0225, + "cc9ee41cef40": 0.0155, + "c8b272104ec5": 0.0147, + "cbd1d4dc35ec": 0.0157, + "ca99aed17c77": 0.0147, + "ca7feca451cb": 0.0161, + "cc2c5c9f6cbb": 0.0169, + "c249482f72c4": 0.0146, + "c8ddfb4208f5": 0.0175, + "c2c13fc313bb": 0.0118, + "ca7e4dec30cb": 0.0138, + "c7fff4d94d75": 0.0124, + "c0e34e2a054e": 0.014, + "ccde9fba0434": 0.0176, + "c035f6c2753f": 0.0154, + "c10291a49c1a": 0.0176, + "cca189885768": 0.0135, + "c3a9d1c5d402": 0.0158, + "c1a7f501df1e": 0.0129, + "c9fb113ccb24": 0.0162, + "cf3a54028200": 0.0131, + "c5919a61b4f2": 0.0129, + "c4989ef5e566": 0.016, + "c13e5c3c6da4": 0.0144, + "c4cdf00d4097": 0.0162 + }, + "load_start": [ + 18.55810546875, + 15.65869140625, + 16.77734375 + ], + "baseline_geometry_s": 0.5841, + "cost_estimates_total_s": 0.0039, + "verification_median_s": 10.46, + "load_end": [ + 18.55810546875, + 15.65869140625, + 16.77734375 + ] + }, + "C11_ihp130_sW1_sL1": { + "geometry_s": { + "cfced3a470f5": 0.1399, + "c41bf8068e51": 0.1303, + "c9ee941a0780": 0.1403, + "c96b72c1e756": 0.1285, + "cef78b15f3ce": 0.1291, + "c50a94a38bcc": 0.0872, + "c33a701f84ad": 0.0839, + "c8ba0ac61d66": 0.1283, + "c5445386abf1": 0.2421, + "ccbcb7b59184": 0.0679, + "cc2dc56f391e": 0.1315, + "c0cf06fd53cc": 0.1301, + "c725bc95574b": 0.4, + "cce4ffaf3aca": 0.1383, + "c014ae50b2b9": 0.0953, + "cb16912231a6": 0.0683, + "c5627b8bfdda": 0.6352, + "c6393550b90c": 0.1257, + "c4f688e02b33": 0.8473, + "cda3a1e3300f": 0.1266, + "c9ab82051c9f": 0.2279, + "cabec2003315": 0.1324, + "c8bd67375b5e": 0.2184, + "c9b2a2434e12": 0.1087, + "ca724353c454": 0.0971, + "cc55aa616bf4": 0.0969, + "ced68ea67009": 0.1146, + "cdf82010ae0e": 0.0687, + "c27da0b090b9": 0.248, + "c65d09985d74": 0.1379, + "cfaa5b69e242": 1.2406, + "ccbf4200196b": 0.1318, + "ce34f3aaa2fa": 0.6871, + "c6c63e34fa4e": 0.1353, + "cbdb1cfd7a81": 0.8277, + "cc154118fd8d": 0.1261, + "cbcd2d9e8c37": 0.2973, + "ce0d641af23b": 0.0839, + "c6b7c02d3f79": 0.1216, + "ca070104688e": 0.1257, + "c572c6741d3f": 1.0279, + "cb8f83a9365a": 0.1178, + "c054b3c446d5": 0.215, + "cba625b0a67b": 0.0713, + "c4d4cfb88d33": 0.1321, + "c7242b1d58a4": 1.5056, + "c6df89eaf753": 0.1155, + "c6ce58fd897e": 0.1668, + "cbc4d22d541f": 0.1, + "c2654b643392": 0.2369, + "cc63d720b29b": 0.126, + "cafe65e13350": 0.1275, + "cee35228b87d": 0.1314, + "c85e51fe77cb": 1.3534, + "c79eb3a6d2c1": 0.11, + "cd5d51697028": 0.0787, + "c54520f6a889": 0.1349, + "cf2e79cffadd": 0.2368, + "c53d37e1c8c2": 0.1296, + "c2edf2970393": 0.6295, + "c7c2a2d422c6": 0.0865, + "c9cd75934d1e": 0.2369, + "cc183ec0d33e": 0.1288, + "c41316f14ec2": 0.2344 + }, + "load_start": [ + 18.15087890625, + 13.86865234375, + 16.4541015625 + ], + "baseline_geometry_s": 1.0239, + "cost_estimates_total_s": 0.0171, + "verification_median_s": 14.235, + "load_end": [ + 18.39306640625, + 14.20166015625, + 16.50927734375 + ] + }, + "C02_sky130_sW1_sL1": { + "geometry_s": { + "c8a189738e65": 0.0143, + "cd992aac7ce2": 0.0137, + "ce39cc1ec93f": 0.0129, + "c054e1700ec1": 0.0123, + "cf4728da73fe": 0.014, + "c86c9634114b": 0.0127, + "cb576b91477c": 0.0133, + "cb3e6de06c0f": 0.0133, + "c973a0640e6b": 0.0137, + "cce4299c7ab5": 0.0137, + "cd8f1aa389a8": 0.0129, + "c8dd1d70bf66": 0.0154, + "c265c2508f23": 0.0129, + "ce7769f4c7e7": 0.0125, + "c304759e429e": 0.0142, + "c1e11cb14870": 0.0142, + "c5eef773315c": 0.0133, + "c33ede984d3e": 0.0129, + "cfaca0eebc3f": 0.0128, + "c8d46a4c3707": 0.0133, + "cc1e93f291ee": 0.0135, + "cbd555382858": 0.0129, + "cbf80e3ede2f": 0.0128, + "c64d82336648": 0.0147, + "c806cfa2dae7": 0.0171, + "c9d3046021c9": 0.0174, + "cb8200500a8a": 0.0176, + "cf5fc7c0ae10": 0.0173, + "cf60c9835ab8": 0.0177, + "ce8428be62ff": 0.0174, + "c6026fb86c54": 0.017, + "cd102a7cd82e": 0.017, + "c476fe7ff0f5": 0.0177, + "c125515c9382": 0.0174, + "c7e50b349bee": 0.0173, + "c6710bc5dcd2": 0.02, + "c3baa7b4203e": 0.0165, + "c6510312eb71": 0.0166, + "c38de2e8fa1d": 0.0169, + "c15f7f002a47": 0.0173, + "ca526079d482": 0.0137, + "c7ed721c88ab": 0.0141, + "c4dace9a4128": 0.0133, + "c8af75ae914c": 0.0135, + "c08225022991": 0.0139, + "cf327f6e6aab": 0.0139, + "c5138b51f856": 0.0141, + "c7bed3c57cdb": 0.0167, + "c49fe6bd1a15": 0.014, + "c9eca9c94337": 0.014, + "c09b49fdcd23": 0.0142, + "c79c5edca55e": 0.0139, + "c0c7811f6a18": 0.0134, + "cb13a6e943ff": 0.0133, + "cc7a40dcbaef": 0.0135, + "c54ce3f64cb0": 0.0129, + "c10dca933831": 0.0141, + "c1612704af84": 0.0142, + "cb96b859e360": 0.0143, + "cc047915b5da": 0.0163, + "c818a0c6e5be": 0.0137, + "c0a8bab8808f": 0.0139, + "c65e5f21ab9b": 0.0133, + "c43b0a8fcd1b": 0.0139 + }, + "load_start": [ + 10.77685546875, + 10.7626953125, + 16.04541015625 + ], + "baseline_geometry_s": 0.9014, + "cost_estimates_total_s": 0.0085, + "verification_median_s": 15.26, + "load_end": [ + 10.77685546875, + 10.7626953125, + 16.04541015625 + ] + }, + "C09_sky130_sW1_sL1": { + "geometry_s": { + "c3f5b4262276": 0.0799, + "c86596aeb75c": 0.0788, + "c6ac96d612da": 0.0793, + "c3c7f40b70a2": 0.0769, + "c04084ece242": 0.0794, + "caa6bd0563e5": 67.7692, + "cbf6211408c0": 0.1314, + "c2feb63f6a78": 0.0784, + "c13fa5981761": 0.0767, + "c19701f0a179": 65.349, + "c6e0ed22af79": 0.0823, + "c05d13262ec0": 91.5027, + "ce943fd0291e": 0.0772, + "c1861f78c195": 0.1255, + "c712b85445df": 0.0762, + "c58a7aa371f3": 0.1097, + "cbb6d10e8f0e": 0.0781, + "cc3409ae8f0c": 0.0771, + "c086f2e5d9f7": 0.132, + "caee5dfda9b9": 0.0755, + "c8077cbb6497": 0.0753, + "c3b089ae36a9": 0.0755, + "cff483c67637": 0.0765, + "c200936a0952": 0.0745, + "c76c29b3e363": 66.0604, + "c67920993f97": 0.0789, + "c589e7f13b80": 90.3444, + "cd2d14703dad": 0.0783, + "c4c661d0bd6e": 65.3536, + "c8d7191b8d2a": 0.0775, + "c3e18375bfc7": 91.3617, + "c1e10c76036b": 0.0786, + "c27b2373ae58": 0.0782, + "c0b5a3d3c109": 0.0754, + "c4c22d0ccb48": 0.0765, + "c67182bd6efc": 66.5266, + "c42a53c19f40": 0.0767, + "c53bd1dd4377": 88.2344, + "c6f450c85259": 0.0749, + "cfd4ef9be4ac": 0.0754, + "ce9b7e83a5ec": 89.6744, + "c3dbf47f733d": 0.1334, + "c96434d5a1ad": 64.7559, + "c9190356b5d0": 0.0738, + "ce190029930e": 0.0748, + "cb665d318416": 0.0753, + "c7b9ef7811ff": 0.0743, + "c13ba4913293": 0.0747, + "cbd2f9b16f7f": 0.0728, + "c77457be5aaa": 0.0754, + "c4e445b682e3": 0.0752, + "c8829afcab9c": 0.0756, + "c40061638a43": 64.5555, + "c6005504ec4b": 0.0773, + "c395c45bced2": 0.1308, + "c76526324869": 65.1279, + "c776d5b9d74e": 0.0779, + "ceebfd02b193": 0.08, + "c7669e79f2bb": 0.0782, + "ce750a257fa0": 0.0791, + "c1bc7ac18a71": 0.0788, + "cd051fedba38": 0.0797, + "ccd74aed8959": 0.0775, + "cda7cf78e79d": 0.0784 + }, + "load_start": [ + 13.77880859375, + 11.47314453125, + 16.14111328125 + ], + "baseline_geometry_s": 0.6963, + "cost_estimates_total_s": 0.0153, + "verification_median_s": 17.505000000000003, + "load_end": [ + 9.2568359375, + 10.7216796875, + 13.60009765625 + ] + }, + "C02_ihp130_sW2_sL1": { + "geometry_s": { + "c8518d00a186": 0.0208, + "cb1a393bdfaf": 0.0199, + "c0391f77ad6b": 0.0198, + "c11635c35151": 0.0192, + "c03f3036669f": 0.0198, + "cf675937f822": 0.0204, + "cbcf41e784f8": 0.0195, + "c04d0fbcbbdd": 0.0191, + "c0edda0cff55": 0.0204, + "c2943399381b": 0.02, + "c14b90138a67": 0.0194, + "c49606b115a4": 0.0198, + "c8b962eabbd7": 0.0187, + "c0e8c84240fa": 0.0199, + "c4e4dbfd48e6": 0.0208, + "cbef5ee1960b": 0.0216, + "ca768292a9a7": 0.0194, + "cb0e11b955bb": 0.0198, + "c96d83290a85": 0.0198, + "c5692d105b99": 0.0195, + "cf84543a4f57": 0.0194, + "c2bb97ae9670": 0.0193, + "c1384f98c43d": 0.0189, + "c6ac954e1758": 0.0196, + "ccfa89a8d172": 0.0321, + "c9ef4c9ccf36": 0.0296, + "cbfd7e1c1e6c": 0.0299, + "cceae287b1bb": 0.03, + "cb76c2e3650b": 0.0289, + "c3dfd5a42932": 0.0302, + "c0e6e807276e": 0.0323, + "ccabc22666cf": 0.0291, + "c82de43f88cc": 0.0295, + "c9339cbaa1bb": 0.0306, + "c26ee653792d": 0.0295, + "c8199062b191": 0.0302, + "cf49791c49e5": 0.0321, + "c92dbf630ab4": 0.0296, + "cb64f3cb9973": 0.0298, + "c2870c5a5e89": 0.0253, + "cb8db8bce506": 0.0119, + "caf7c6bbb899": 0.012, + "c0ad044d1cc3": 0.0114, + "cb33a1c6c1e4": 0.0118, + "cd7e109bb558": 0.0137, + "c98ec3e14006": 0.0117, + "cb41f1ed5051": 0.0122, + "c16cbde90679": 0.0117, + "c7dcdc470b5b": 0.0121, + "c36cf2c7dc73": 0.0121, + "c46ae367db8f": 0.0116, + "cd6bd155f988": 0.0119, + "c4d54317483f": 0.0118, + "cb5fd06efa8c": 0.0129, + "cbb5d96593ef": 0.0115, + "cc989ed726da": 0.0147, + "c4d1e1cc9e66": 0.0144, + "cb36a0a2bc2e": 0.012, + "c1beec90ed89": 0.0111, + "c4f44157181a": 0.0118, + "c3f22742ce2c": 0.0114, + "cce03735ed2f": 0.0116, + "ca16449e398a": 0.0137, + "c2e07f5e499c": 0.0707 + }, + "load_start": [ + 10.77685546875, + 10.7626953125, + 16.04541015625 + ], + "baseline_geometry_s": 0.9105, + "cost_estimates_total_s": 0.0098, + "verification_median_s": 7.89, + "load_end": [ + 10.77685546875, + 10.7626953125, + 16.04541015625 + ] + }, + "C16_sky130_sW1_sL1": { + "geometry_s": { + "c2e52d6ac401": 0.0126, + "cb7b19550006": 0.0153, + "cfbd7ec81e6b": 0.0159, + "c0c48e26e41e": 0.0126, + "cf9559574acb": 0.0136, + "c0f923f8248d": 0.0135, + "c5dc28bfca06": 0.0133, + "cbbd4ef2e0bb": 0.0134, + "c1905d32dbcf": 0.0152, + "c2aac95fccb8": 0.0267, + "ccbca30b74a7": 0.0163, + "c0019263a233": 0.0279, + "cb18c44bc6e4": 0.0174, + "c97d05c1501f": 0.021, + "cd9f57dd0924": 0.0169, + "c075ba8e1639": 0.0205, + "cf9098cedba8": 0.0147, + "c2827ff310d4": 0.0161, + "c35bd7131b3f": 0.0271, + "c17a0c4f773b": 0.0156, + "c4834dc35303": 0.0303, + "c15773d79602": 0.0165, + "c4f5495ffef5": 0.0205, + "c1a3de6634ce": 0.0137, + "c31cb3370cac": 0.0209, + "cc9ee41cef40": 0.0159, + "c8b272104ec5": 0.0147, + "cbd1d4dc35ec": 0.0159, + "ca99aed17c77": 0.0142, + "ca7feca451cb": 0.0157, + "cc2c5c9f6cbb": 0.016, + "c249482f72c4": 0.0164, + "c8ddfb4208f5": 0.0197, + "c2c13fc313bb": 0.012, + "ca7e4dec30cb": 0.0131, + "c7fff4d94d75": 0.012, + "c0e34e2a054e": 0.0128, + "ccde9fba0434": 0.0156, + "c035f6c2753f": 0.0145, + "c10291a49c1a": 0.0156, + "cca189885768": 0.013, + "c3a9d1c5d402": 0.0151, + "c1a7f501df1e": 0.0124, + "c9fb113ccb24": 0.0142, + "cf3a54028200": 0.0121, + "c5919a61b4f2": 0.0125, + "c4989ef5e566": 0.015, + "c13e5c3c6da4": 0.0128, + "c4cdf00d4097": 0.0167 + }, + "load_start": [ + 18.4716796875, + 15.736328125, + 16.791015625 + ], + "baseline_geometry_s": 0.5562, + "cost_estimates_total_s": 0.0038, + "verification_median_s": 19.66, + "load_end": [ + 18.4716796875, + 15.736328125, + 16.791015625 + ] + }, + "C11_sky130_sW2_sL1": { + "geometry_s": { + "c45f3ec86981": 0.1868, + "ca8b85af080b": 0.1534, + "c4ea6f39b379": 0.1833, + "c0bd3be90393": 0.1553, + "c505a0e968de": 0.1531, + "c08a98d352fc": 2.601, + "c4593c5fe785": 0.236, + "c4fdc7c64cee": 0.4097, + "c496177d482a": 0.1501, + "cd1673c7e2d1": 2.6291, + "c3ec35fdb4c2": 0.1817, + "c853b3a52b15": 0.1474, + "c6b7a89bf7f2": 0.1573, + "c805d131eaf0": 0.9484, + "c00f1a268103": 0.0814, + "c61cbb78f60d": 0.9231, + "ce0091e09bb1": 0.1169, + "c414643456a5": 0.118, + "cf3288f82e2c": 0.2023, + "c5bf710d2f61": 4.3067, + "c0227054a8f5": 0.1525, + "c27bef76a71a": 2.6187, + "cd0697eb6f4a": 0.0831, + "cea431b72565": 0.1094, + "c9836033a712": 0.1136, + "cb8e12d2b300": 2.9749, + "c26d6ab5213f": 0.1275, + "c1f3a241de5d": 0.0808, + "cdd7f910b0ac": 0.0768, + "c7ed714eea02": 3.1288, + "c83fcb22accc": 0.1471, + "c7afcd006c2f": 0.4529, + "c78e1ed9d9d3": 0.0755, + "c3eb64680900": 0.5139, + "c0b5a14ef33b": 0.1546, + "cf2e2c94f100": 0.4661, + "c2c3d0c229e5": 0.1536, + "c642ed0160f2": 0.1098, + "c6aea1f543aa": 0.082, + "cfc49ffa3e6c": 0.1064, + "c20f3b3dcfd4": 0.1208, + "cab5be9567dc": 0.1075, + "cb33ff54e8c4": 0.2085, + "ce20b537c0a2": 4.2661, + "ca058a429c70": 0.1551, + "c79c0e4978c8": 3.1364, + "cd6414569645": 0.1864, + "c36fb92177d0": 3.6666, + "c33aadc9b21e": 0.1589, + "c91a31ee309f": 0.5584, + "c36b1a358706": 0.1139, + "c65bb9f456d1": 0.1509, + "c843d8dceec5": 0.1524, + "cc3f511cde21": 2.9918, + "c42619f6b5e7": 0.1415, + "cc7f44dd1df5": 4.0962, + "c1f62303193b": 0.1144, + "cb5b5f70488d": 0.1079, + "c9910fd38ab5": 0.1408, + "c74143461f96": 4.5282, + "c728f1b18522": 0.1576, + "c04cb177d8ce": 0.1556, + "c166741dd8ad": 0.1854, + "c2f52a2c17ba": 4.4059 + }, + "load_start": [ + 19.00341796875, + 15.36572265625, + 16.7294921875 + ], + "baseline_geometry_s": 0.7655, + "cost_estimates_total_s": 0.0121, + "verification_median_s": 47.265, + "load_end": [ + 18.318359375, + 15.79443359375, + 16.79931640625 + ] + }, + "C02_ihp130_sW2_sL2": { + "geometry_s": { + "c8518d00a186": 0.0221, + "cb1a393bdfaf": 0.0205, + "c0391f77ad6b": 0.0203, + "c11635c35151": 0.0202, + "c03f3036669f": 0.0212, + "cf675937f822": 0.0219, + "cbcf41e784f8": 0.0203, + "c04d0fbcbbdd": 0.0209, + "c0edda0cff55": 0.0216, + "c2943399381b": 0.0214, + "c14b90138a67": 0.0211, + "c49606b115a4": 0.0207, + "c8b962eabbd7": 0.0202, + "c0e8c84240fa": 0.0208, + "c4e4dbfd48e6": 0.0237, + "cbef5ee1960b": 0.0215, + "ca768292a9a7": 0.0203, + "cb0e11b955bb": 0.0208, + "c96d83290a85": 0.0203, + "c5692d105b99": 0.021, + "cf84543a4f57": 0.0209, + "c2bb97ae9670": 0.0199, + "c1384f98c43d": 0.02, + "c6ac954e1758": 0.0222, + "ccfa89a8d172": 0.0316, + "c9ef4c9ccf36": 0.03, + "cbfd7e1c1e6c": 0.0312, + "cceae287b1bb": 0.0313, + "cb76c2e3650b": 0.0305, + "c3dfd5a42932": 0.0329, + "c0e6e807276e": 0.0315, + "ccabc22666cf": 0.0311, + "c82de43f88cc": 0.0314, + "c9339cbaa1bb": 0.0314, + "c26ee653792d": 0.031, + "c8199062b191": 0.034, + "cf49791c49e5": 0.0306, + "c92dbf630ab4": 0.0274, + "cb64f3cb9973": 0.0308, + "c2870c5a5e89": 0.0305, + "cb8db8bce506": 0.0218, + "caf7c6bbb899": 0.0245, + "c0ad044d1cc3": 0.021, + "cb33a1c6c1e4": 0.0216, + "cd7e109bb558": 0.0218, + "c98ec3e14006": 0.0213, + "cb41f1ed5051": 0.0214, + "c16cbde90679": 0.022, + "c7dcdc470b5b": 0.0216, + "c36cf2c7dc73": 0.0241, + "c46ae367db8f": 0.0215, + "cd6bd155f988": 0.0218, + "c4d54317483f": 0.0204, + "cb5fd06efa8c": 0.0211, + "cbb5d96593ef": 0.0205, + "cc989ed726da": 0.021, + "c4d1e1cc9e66": 0.0209, + "cb36a0a2bc2e": 0.0238, + "c1beec90ed89": 0.0985, + "c4f44157181a": 0.0219, + "c3f22742ce2c": 0.0213, + "cce03735ed2f": 0.0206, + "ca16449e398a": 0.0215, + "c2e07f5e499c": 0.021 + }, + "load_start": [ + 10.77685546875, + 10.7626953125, + 16.04541015625 + ], + "baseline_geometry_s": 0.9371, + "cost_estimates_total_s": 0.01, + "verification_median_s": 8.0, + "load_end": [ + 11.595703125, + 10.93310546875, + 16.072265625 + ] + }, + "C08_ihp130_sW2_sL2": { + "geometry_s": { + "ce3e6e258d71": 0.0804, + "c8df2dc9645f": 0.0763, + "ccc7ff22ac6e": 0.079, + "c8f372de09a3": 0.057, + "c85500baa303": 1.8506, + "c90066ce1eff": 0.0537, + "cb54033396af": 1.4547, + "c98b65c127d0": 0.0557, + "ca3a79d6a82a": 0.2375, + "c4a272a87f33": 1.7334, + "c49280a1172a": 0.0755, + "cc7f4f9f1cb4": 0.095, + "c5fcd822ea3f": 0.0563, + "c567e9c91792": 0.3093, + "cccc7be27ad9": 1.4925, + "c3749b466daf": 0.3474, + "cc121275f3c5": 0.0571, + "c5c2949aae83": 1.9859, + "ccf617bd74d9": 0.077, + "c4d77aee1d4a": 2.0297, + "ce7f7fa4112a": 0.094, + "cf694c56f7f3": 0.3115, + "cd60481c0226": 0.149, + "c7f8a17e652a": 0.0549, + "c79943193f73": 1.7922, + "c5762b0290d1": 0.0736, + "ccfac8b45afc": 0.0738, + "c09dfe1e4467": 0.0561, + "c3d0ea8a85b0": 0.0578, + "ce1b6ac46968": 0.3928, + "c65e699ec5fc": 0.0579, + "c39a57f79128": 0.0749, + "cdde15552f06": 0.0552, + "c86b2b0d0a0b": 0.0562, + "c3b3a0c72815": 0.2417, + "c0cb2c66e3db": 0.0552, + "c80576ad79dc": 1.916, + "ccee36916e65": 1.7928, + "c25813b9ad71": 0.359, + "c3fe4b95de02": 0.073, + "c7c7c9ba4b85": 0.054, + "c90d648b4e4f": 0.0648, + "cdbecb7a7e33": 0.0552, + "c7770ee6a1f1": 1.9133, + "c1250d34a525": 0.0557, + "c8bb85c62591": 1.5263, + "c774b882f76d": 0.0543, + "ceec2c25ef9f": 0.0584, + "cf8687fb140f": 0.0796, + "c89e063467ab": 1.7771, + "ca494c4327a0": 0.0558, + "c41123144671": 0.0534, + "c73545913857": 0.0558, + "c1a33c110427": 1.5337, + "cd102ffb6a67": 0.0765, + "c3244fb4fe94": 0.0709, + "cc9384ce596b": 0.0553, + "c12fdcd761bd": 0.1238, + "cd01a9e2018e": 0.0543, + "c98928c63f20": 1.4636, + "c5c599345b2b": 0.4424, + "c7fb198f8c84": 0.0572, + "cc0c9ffbecd7": 0.0546, + "c93f61729c4a": 0.0627 + }, + "load_start": [ + 11.595703125, + 10.93310546875, + 16.072265625 + ], + "baseline_geometry_s": 1.0024, + "cost_estimates_total_s": 0.0164, + "verification_median_s": 6.5600000000000005, + "load_end": [ + 14.58203125, + 11.72119140625, + 16.17236328125 + ] + }, + "C02_sky130_sW2_sL1": { + "geometry_s": { + "c8518d00a186": 0.0116, + "cb1a393bdfaf": 0.0116, + "c0391f77ad6b": 0.0109, + "c11635c35151": 0.0109, + "c03f3036669f": 0.0113, + "cf675937f822": 0.0114, + "cbcf41e784f8": 0.0126, + "c04d0fbcbbdd": 0.0107, + "c0edda0cff55": 0.0111, + "c2943399381b": 0.011, + "c14b90138a67": 0.0111, + "c49606b115a4": 0.0111, + "c8b962eabbd7": 0.0111, + "c0e8c84240fa": 0.0111, + "c4e4dbfd48e6": 0.0116, + "cbef5ee1960b": 0.0146, + "ca768292a9a7": 0.0135, + "cb0e11b955bb": 0.0154, + "c96d83290a85": 0.0136, + "c5692d105b99": 0.0135, + "cf84543a4f57": 0.0142, + "c2bb97ae9670": 0.0133, + "c1384f98c43d": 0.0135, + "c6ac954e1758": 0.0132, + "ccfa89a8d172": 0.0176, + "c9ef4c9ccf36": 0.0223, + "cbfd7e1c1e6c": 0.0214, + "cceae287b1bb": 0.022, + "cb76c2e3650b": 0.0213, + "c3dfd5a42932": 0.0215, + "c0e6e807276e": 0.0219, + "ccabc22666cf": 0.0235, + "c82de43f88cc": 0.0214, + "c9339cbaa1bb": 0.021, + "c26ee653792d": 0.0213, + "c8199062b191": 0.0211, + "cf49791c49e5": 0.0206, + "c92dbf630ab4": 0.022, + "cb64f3cb9973": 0.0209, + "c2870c5a5e89": 0.0206, + "cb8db8bce506": 0.0146, + "caf7c6bbb899": 0.0147, + "c0ad044d1cc3": 0.0144, + "cb33a1c6c1e4": 0.0144, + "cd7e109bb558": 0.0141, + "c98ec3e14006": 0.0146, + "cb41f1ed5051": 0.0158, + "c16cbde90679": 0.0145, + "c7dcdc470b5b": 0.0147, + "c36cf2c7dc73": 0.0146, + "c46ae367db8f": 0.0147, + "cd6bd155f988": 0.014, + "c4d54317483f": 0.0116, + "cb5fd06efa8c": 0.0112, + "cbb5d96593ef": 0.0124, + "cc989ed726da": 0.014, + "c4d1e1cc9e66": 0.017, + "cb36a0a2bc2e": 0.0147, + "c1beec90ed89": 0.0151, + "c4f44157181a": 0.0148, + "c3f22742ce2c": 0.0141, + "cce03735ed2f": 0.0143, + "ca16449e398a": 0.0142, + "c2e07f5e499c": 0.0145 + }, + "load_start": [ + 11.595703125, + 10.93310546875, + 16.072265625 + ], + "baseline_geometry_s": 0.5772, + "cost_estimates_total_s": 0.0056, + "verification_median_s": 15.49, + "load_end": [ + 11.595703125, + 10.93310546875, + 16.072265625 + ] + }, + "C11_gf180_sW1_sL2": { + "geometry_s": { + "cfced3a470f5": 0.1539, + "c41bf8068e51": 0.1447, + "c9ee941a0780": 0.1559, + "c96b72c1e756": 0.1402, + "c6d5edbd93eb": 0.1438, + "c7fe0f2bb233": 0.149, + "c2ce895d39e2": 0.0954, + "c8ba0ac61d66": 0.1464, + "c80c38c53da5": 0.1132, + "c6bc29b23cf2": 0.1305, + "c11ab1467142": 0.1142, + "c53d37e1c8c2": 0.1475, + "c9becde82ae7": 0.0858, + "c7c2a2d422c6": 0.0727, + "c7327459f496": 0.3277, + "cc183ec0d33e": 0.1471, + "cd28676fcce4": 0.0857, + "cc063f23e3ca": 0.1379, + "cdabdf2e629b": 0.1289, + "c9b06ecca750": 0.1473, + "c20fecbc3cee": 0.1536, + "cf4715c8556b": 0.1482, + "c42e9c539ada": 0.147, + "cb25ee95df95": 0.1133, + "c2694af7df2e": 0.1537, + "c13d30c2a2ba": 0.117, + "cae33cbc4be5": 0.0728, + "c0cf06fd53cc": 0.1486, + "cff7e9064ffd": 0.1084, + "c117919040ba": 0.0743, + "c4b133b7b6dc": 0.1941, + "c6df89eaf753": 0.1208, + "c79f2a5adc95": 0.1523, + "cbc071f6779f": 0.1339, + "c282423d7819": 0.0839, + "c212e484c9e2": 0.1443, + "ce561b4e6dd2": 0.1496, + "c0a4106dbdbc": 0.1439, + "c4039810733c": 0.0731, + "c6745c1426e0": 0.0715, + "c09423c1ec57": 0.071, + "cf92a9b17813": 0.1518, + "c16d651aac4b": 0.1251, + "cdf3e051df65": 0.229, + "c1c9516afb52": 0.0955, + "ce118a2b5368": 0.0718, + "c9672bdad4b5": 0.0871, + "c55413b42fe3": 0.0711, + "c395156762a7": 0.0975, + "ccc84295daae": 0.1407, + "cad817abf21b": 0.1055, + "cc5a50b58889": 0.1502, + "cd1913bc5ce8": 0.7928, + "c70cdf407bcd": 0.1173, + "c78bbdbec7a9": 0.1141, + "c54520f6a889": 0.1515, + "c3c754061f36": 0.1149, + "c71c9c3a9b0c": 0.1251, + "c22fd2302168": 0.1206, + "c605aad3cb20": 0.0694, + "c93b07dbc0e2": 0.0846, + "cb47265f17a6": 0.1225, + "cf53ec9ef241": 0.0851, + "cef78b15f3ce": 0.1418 + }, + "load_start": [ + 14.93603515625, + 11.84228515625, + 16.18798828125 + ], + "baseline_geometry_s": 1.0435, + "cost_estimates_total_s": 0.0166, + "verification_median_s": 37.47, + "load_end": [ + 15.40771484375, + 12.04541015625, + 16.20751953125 + ] + }, + "C16_ihp130_sW2_sL2": { + "geometry_s": { + "c0606cccb220": 0.0178, + "cfd6befdce13": 0.0174, + "cb70b109f00f": 0.0179, + "c9553d5916e1": 0.018, + "cba6597162e5": 0.0237, + "c728d61e65e7": 0.0172, + "c3f287f9d792": 0.0212, + "c01285f03617": 0.0212, + "ce2c87119b01": 0.0219, + "c3bc4d855c9c": 0.0344, + "c574abc47fe0": 0.0264, + "c33da7e0dd09": 0.0325, + "c6a58cb08ae1": 0.0275, + "c912c75bc3b4": 0.0372, + "c396a5685f48": 0.0217, + "c6d8d3cb496f": 0.0359, + "cb38b7257112": 0.0222, + "c3cc70fff0d9": 0.0297, + "c20b5daff011": 0.0624, + "c76653203c31": 0.0283, + "ccf380b2ebbb": 0.0634, + "c3cc306f1924": 0.025, + "ca224dc4b94d": 0.0432, + "cdfc365d73e6": 0.0231, + "c15394cfe7e2": 0.0429, + "c6674e3e19e6": 0.0309, + "c4455d921128": 0.0222, + "cf60b3b360c3": 0.0288, + "ccdb4c2d96fb": 0.0222, + "c7b3516eb6ff": 0.0241, + "ca9247c82c6c": 0.0308, + "c3f570a30303": 0.0228, + "cfcf7ab63434": 0.0308, + "c3b64ce65d28": 0.0181, + "cffbbe9f4325": 0.0821, + "c649cf571aec": 0.0176, + "c85a1455092e": 0.0219, + "c5c5f93d5439": 0.0261, + "c133f65cb1eb": 0.018, + "c942d1dbb835": 0.0261, + "ce731a77d1fe": 0.019, + "c23fdab4193a": 0.0247, + "c448b3911c10": 0.0172, + "cd5bf8a0c035": 0.0242, + "c454bb246f1d": 0.0174, + "c59f5a7a68da": 0.0177, + "c2d0f459474a": 0.0257, + "c589c6b321ce": 0.0175, + "ca4a16813e36": 0.0241 + }, + "load_start": [ + 18.51318359375, + 15.69775390625, + 16.7841796875 + ], + "baseline_geometry_s": 0.5904, + "cost_estimates_total_s": 0.0045, + "verification_median_s": 11.68, + "load_end": [ + 18.4716796875, + 15.736328125, + 16.791015625 + ] + }, + "C16_ihp130_sW2_sL1": { + "geometry_s": { + "c0606cccb220": 0.0307, + "cfd6befdce13": 0.0403, + "cb70b109f00f": 0.0304, + "c9553d5916e1": 0.0314, + "cba6597162e5": 0.0414, + "c728d61e65e7": 0.0391, + "c3f287f9d792": 0.0361, + "c01285f03617": 0.0381, + "ce2c87119b01": 0.0388, + "c3bc4d855c9c": 0.0917, + "c574abc47fe0": 0.048, + "c33da7e0dd09": 0.0888, + "c6a58cb08ae1": 0.0472, + "c912c75bc3b4": 0.0684, + "c396a5685f48": 0.0459, + "c6d8d3cb496f": 0.0687, + "cb38b7257112": 0.0518, + "c3cc70fff0d9": 0.0553, + "c20b5daff011": 0.1333, + "c76653203c31": 0.0426, + "ccf380b2ebbb": 0.1025, + "c3cc306f1924": 0.0348, + "ca224dc4b94d": 0.0708, + "cdfc365d73e6": 0.0352, + "c15394cfe7e2": 0.0672, + "c6674e3e19e6": 0.0377, + "c4455d921128": 0.0339, + "cf60b3b360c3": 0.0421, + "ccdb4c2d96fb": 0.0329, + "c7b3516eb6ff": 0.0353, + "ca9247c82c6c": 0.0471, + "c3f570a30303": 0.0346, + "cfcf7ab63434": 0.0669, + "c3b64ce65d28": 0.0341, + "cffbbe9f4325": 0.0443, + "c649cf571aec": 0.0335, + "c85a1455092e": 0.0412, + "c5c5f93d5439": 0.0511, + "c133f65cb1eb": 0.0438, + "c942d1dbb835": 0.1264, + "ce731a77d1fe": 0.0359, + "c23fdab4193a": 0.051, + "c448b3911c10": 0.0341, + "cd5bf8a0c035": 0.051, + "c454bb246f1d": 0.0349, + "c59f5a7a68da": 0.0304, + "c2d0f459474a": 0.039, + "c589c6b321ce": 0.0295, + "ca4a16813e36": 0.0398 + }, + "load_start": [ + 18.51318359375, + 15.69775390625, + 16.7841796875 + ], + "baseline_geometry_s": 0.9331, + "cost_estimates_total_s": 0.0072, + "verification_median_s": 13.97, + "load_end": [ + 18.4716796875, + 15.736328125, + 16.791015625 + ] + }, + "C16_sky130_sW2_sL1": { + "geometry_s": { + "c0606cccb220": 0.0173, + "cfd6befdce13": 0.0208, + "cb70b109f00f": 0.0172, + "c9553d5916e1": 0.0173, + "cba6597162e5": 0.0221, + "c728d61e65e7": 0.021, + "c3f287f9d792": 0.0206, + "c01285f03617": 0.0205, + "ce2c87119b01": 0.0197, + "c3bc4d855c9c": 0.0457, + "c574abc47fe0": 0.0277, + "c33da7e0dd09": 0.0461, + "c6a58cb08ae1": 0.0264, + "c912c75bc3b4": 0.0408, + "c396a5685f48": 0.0257, + "c6d8d3cb496f": 0.0403, + "cb38b7257112": 0.0248, + "c3cc70fff0d9": 0.0364, + "c20b5daff011": 0.0665, + "c76653203c31": 0.0361, + "ccf380b2ebbb": 0.0672, + "c3cc306f1924": 0.0239, + "ca224dc4b94d": 0.0426, + "cdfc365d73e6": 0.0216, + "c15394cfe7e2": 0.0399, + "c6674e3e19e6": 0.0258, + "c4455d921128": 0.0219, + "cf60b3b360c3": 0.0334, + "ccdb4c2d96fb": 0.0217, + "c7b3516eb6ff": 0.0223, + "ca9247c82c6c": 0.0262, + "c3f570a30303": 0.0222, + "cfcf7ab63434": 0.0286, + "c3b64ce65d28": 0.017, + "cffbbe9f4325": 0.0195, + "c649cf571aec": 0.0173, + "c85a1455092e": 0.0193, + "c5c5f93d5439": 0.0255, + "c133f65cb1eb": 0.0796, + "c942d1dbb835": 0.0258, + "ce731a77d1fe": 0.0182, + "c23fdab4193a": 0.0243, + "c448b3911c10": 0.0184, + "cd5bf8a0c035": 0.024, + "c454bb246f1d": 0.0196, + "c59f5a7a68da": 0.0178, + "c2d0f459474a": 0.0228, + "c589c6b321ce": 0.0174, + "ca4a16813e36": 0.0224 + }, + "load_start": [ + 18.43359375, + 15.77392578125, + 16.7978515625 + ], + "baseline_geometry_s": 0.5781, + "cost_estimates_total_s": 0.0042, + "verification_median_s": 18.67, + "load_end": [ + 18.43359375, + 15.77392578125, + 16.7978515625 + ] + }, + "C11_gf180_sW1_sL1": { + "geometry_s": { + "cfced3a470f5": 0.1593, + "c41bf8068e51": 0.146, + "c9ee941a0780": 0.1566, + "c96b72c1e756": 0.1441, + "c40614a38b94": 0.1467, + "ca823f77ce51": 0.1237, + "c9305defc5a4": 0.1039, + "ca479733e3cc": 0.0926, + "c79eb3a6d2c1": 0.1138, + "cc7084485028": 0.071, + "cd621f4b80ac": 0.0762, + "c3143301f1f6": 0.1666, + "c7ab0c2f5bfd": 0.1506, + "c11b048157a7": 0.1221, + "c65d09985d74": 0.1566, + "c9f99ef11120": 0.1229, + "cd9eb9e1c399": 0.1501, + "cde0785c99f3": 0.1053, + "c5602aa25f76": 0.1446, + "c3d4bacbce79": 0.2912, + "ca12a40dcee4": 0.1046, + "cee35228b87d": 0.1531, + "cea93f4caef5": 0.1505, + "c0063897b2c2": 0.0842, + "cf95eb7e6c0b": 0.1016, + "c177846e65da": 0.0706, + "ceb290738199": 0.1499, + "c54e63e0d0be": 0.1093, + "cdde34158f7d": 0.1088, + "cb6fb37da621": 0.2581, + "c7fddcc18df1": 0.0708, + "c72e56bc0bf9": 0.4432, + "cf3693f970c9": 0.1254, + "cb35159210a1": 0.2146, + "c87b0961f5a3": 0.4182, + "c0226cd8e9b2": 0.1556, + "c42e9c539ada": 0.1518, + "c1bceea07f78": 0.1219, + "c6745c1426e0": 0.1052, + "cb3e0dc76914": 0.5328, + "cf92a9b17813": 0.1543, + "c8dc8b1e1a0b": 0.1905, + "c80fb5712e77": 0.1099, + "c23d6b9ab428": 2.1195, + "c2efa8cf7fb4": 0.0692, + "c9a019475e54": 0.1626, + "cca86f90e260": 0.0737, + "cd05d3f56e74": 0.107, + "c38876427ca3": 0.1425, + "cdfe7530798a": 0.1022, + "c0e065e8697e": 0.2622, + "c8ba0ac61d66": 0.1454, + "c49b81d4767e": 0.1058, + "c7e0ee867169": 0.103, + "c38b34e45e44": 0.4892, + "c5ffefc57e7d": 0.1498, + "cec6fc00688f": 0.1245, + "ca2738f2c946": 0.1109, + "c737e30c5050": 0.1076, + "c534321b9995": 0.1174, + "cd21fb3c2423": 0.471, + "cbc071f6779f": 0.132, + "c8f348969870": 0.1073, + "c9b06ecca750": 0.1425 + }, + "load_start": [ + 14.93603515625, + 11.84228515625, + 16.18798828125 + ], + "baseline_geometry_s": 1.0425, + "cost_estimates_total_s": 0.017, + "verification_median_s": 35.225, + "load_end": [ + 15.61572265625, + 12.14453125, + 16.21728515625 + ] + }, + "C08_gf180_sW1_sL1": { + "geometry_s": { + "c1ebe43136e1": 0.048, + "ce7ddcde62c6": 0.0447, + "c1b6567ac7e4": 0.0488, + "cb7b9eec0f72": 0.034, + "c5e7159c6ce7": 0.0449, + "c9d8307445aa": 0.0451, + "c05c4b8fa0bb": 0.0668, + "c784b3c9dcd1": 0.0441, + "cbedd96e5fb0": 0.0976, + "ce30e3b3ee9e": 0.106, + "cc0faf9fadde": 0.0511, + "c00eb9349b52": 0.0327, + "cc588a68b6f6": 0.0703, + "c66b5f77dca4": 0.0486, + "cb507e576dab": 0.2851, + "cb936c357495": 0.0502, + "c2047f6f9310": 0.0591, + "c84607b26008": 0.0342, + "c62ff4546b38": 0.053, + "c07d1edd0182": 0.0409, + "c17dd3f13207": 0.044, + "c3d2aa97056d": 0.0599, + "cf4ce105f634": 0.0644, + "c82904f51c0d": 0.0421, + "c93a361e25d5": 0.031, + "cdab814476d9": 0.0302, + "c0c45dd82516": 0.0422, + "c9bf46f7154b": 0.0373, + "c317a31ea4fb": 0.0335, + "c87958cd4bf3": 0.0326, + "cae6b566016d": 0.1961, + "c8e800191bd6": 0.0356, + "c10173f797c7": 0.0372, + "c6270e20bdd6": 0.0541, + "c00320f53037": 0.0577, + "cf550bebf6ea": 0.0576, + "cbe4dff6c6ae": 0.0462, + "cbe19eaa460f": 0.034, + "c07c706fed11": 0.0478, + "c0a18d003ac5": 0.1745, + "cf4fd2b8186b": 0.034, + "c32405eaab98": 0.061, + "cc5c9effb95a": 0.0371, + "c05157bffba8": 0.0495, + "c814b1429989": 0.0486, + "ccaacbc48f9a": 0.1219, + "c123dd60113e": 0.0902, + "ca53e1f0c98e": 0.0483, + "c3f224909fd4": 0.0342, + "c3a8d7780a62": 0.0342, + "cc4838ac16fb": 0.079, + "c6dc45cb611f": 0.0424, + "cd0e64a302e9": 0.0515, + "c753cd08dd86": 0.0459, + "c6c09923d7c0": 0.0951, + "ca78e37f2a34": 0.0348, + "c91485c78a91": 0.0466, + "cdb7a0e1f49b": 0.055, + "cf01041a377a": 0.0359, + "cc4d9187b942": 0.0409, + "cde5b8731752": 0.0534, + "c7728d1841f9": 0.122, + "cbf08aee42f2": 0.1788, + "ce835e0a5978": 0.1058 + }, + "load_start": [ + 11.595703125, + 10.93310546875, + 16.072265625 + ], + "baseline_geometry_s": 0.9732, + "cost_estimates_total_s": 0.0139, + "verification_median_s": 18.445, + "load_end": [ + 12.18896484375, + 11.0673828125, + 16.08837890625 + ] + }, + "C02_gf180_sW1_sL1": { + "geometry_s": { + "c8a189738e65": 0.0144, + "cd992aac7ce2": 0.014, + "ce39cc1ec93f": 0.013, + "c054e1700ec1": 0.0123, + "cf4728da73fe": 0.0141, + "c86c9634114b": 0.0132, + "cb576b91477c": 0.013, + "cb3e6de06c0f": 0.013, + "c973a0640e6b": 0.0134, + "cce4299c7ab5": 0.0134, + "cd8f1aa389a8": 0.0132, + "c8dd1d70bf66": 0.0145, + "c265c2508f23": 0.0133, + "ce7769f4c7e7": 0.0133, + "c304759e429e": 0.0135, + "c1e11cb14870": 0.0137, + "c5eef773315c": 0.0132, + "c33ede984d3e": 0.0133, + "cfaca0eebc3f": 0.0133, + "c8d46a4c3707": 0.0124, + "cc1e93f291ee": 0.0138, + "cbd555382858": 0.0131, + "cbf80e3ede2f": 0.0129, + "c64d82336648": 0.0146, + "c806cfa2dae7": 0.0174, + "c9d3046021c9": 0.0178, + "cb8200500a8a": 0.0178, + "cf5fc7c0ae10": 0.0177, + "cf60c9835ab8": 0.0175, + "ce8428be62ff": 0.0174, + "c6026fb86c54": 0.0176, + "cd102a7cd82e": 0.0174, + "c476fe7ff0f5": 0.0178, + "c125515c9382": 0.0177, + "c7e50b349bee": 0.0173, + "c6710bc5dcd2": 0.0197, + "c3baa7b4203e": 0.0171, + "c6510312eb71": 0.017, + "c38de2e8fa1d": 0.0173, + "c15f7f002a47": 0.0168, + "ca526079d482": 0.0136, + "c7ed721c88ab": 0.0137, + "c4dace9a4128": 0.0137, + "c8af75ae914c": 0.014, + "c08225022991": 0.0142, + "cf327f6e6aab": 0.0144, + "c5138b51f856": 0.0134, + "c7bed3c57cdb": 0.0161, + "c49fe6bd1a15": 0.0136, + "c9eca9c94337": 0.0137, + "c09b49fdcd23": 0.014, + "c79c5edca55e": 0.0143, + "c0c7811f6a18": 0.0136, + "cb13a6e943ff": 0.013, + "cc7a40dcbaef": 0.0133, + "c54ce3f64cb0": 0.0133, + "c10dca933831": 0.0142, + "c1612704af84": 0.014, + "cb96b859e360": 0.0141, + "cc047915b5da": 0.0162, + "c818a0c6e5be": 0.0134, + "c0a8bab8808f": 0.0138, + "c65e5f21ab9b": 0.0139, + "c43b0a8fcd1b": 0.0137 + }, + "load_start": [ + 10.77685546875, + 10.7626953125, + 16.04541015625 + ], + "baseline_geometry_s": 0.8993, + "cost_estimates_total_s": 0.0085, + "verification_median_s": 16.950000000000003, + "load_end": [ + 10.77685546875, + 10.7626953125, + 16.04541015625 + ] + }, + "C09_ihp130_sW1_sL1": { + "geometry_s": { + "c3f5b4262276": 0.08, + "c86596aeb75c": 0.0775, + "c6ac96d612da": 0.0789, + "c3c7f40b70a2": 0.0765, + "cb9725147385": 0.0784, + "c67182bd6efc": 96.7738, + "c77457be5aaa": 0.1262, + "c53bd1dd4377": 135.4492, + "c13fa5981761": 0.1318, + "c6f450c85259": 0.1337, + "ccf2b622aea9": 0.1348, + "c3d346d017de": 0.1393, + "cd2d14703dad": 0.1404, + "c96434d5a1ad": 95.9127, + "c8d7191b8d2a": 0.0772, + "c6905b311734": 0.0781, + "c0d2de6a9c56": 0.0771, + "c5974eb942a8": 0.0752, + "c3e34dd46add": 0.1306, + "c0f45cf7bd48": 0.0958, + "c04084ece242": 0.0758, + "caa6bd0563e5": 68.9156, + "c42a53c19f40": 0.0771, + "c830806c2f8e": 0.0796, + "cdba567f898a": 0.0759, + "c0e2c8609cae": 67.9732, + "c6e0ed22af79": 0.0791, + "c632ff3ee515": 96.0214, + "c646769d07dc": 0.0749, + "cd994f7471e1": 0.1427, + "c22228b67cd2": 0.0767, + "cd2818379719": 0.0782, + "cbb6d10e8f0e": 0.0767, + "c6c080050521": 0.154, + "c2e5cf38aa09": 0.0746, + "c6f2b618a50b": 0.0823, + "c65546b31a01": 0.0746, + "c1bc7ac18a71": 0.077, + "c0626bacabcc": 0.0773, + "c200936a0952": 0.0759, + "c19701f0a179": 68.1621, + "cda7cf78e79d": 0.0765, + "c9ce6dc5bb2e": 0.1318, + "ca32b6b99d0f": 0.0751, + "cc8a4dfc9b41": 66.4311, + "c36a90e38016": 0.0766, + "cbacdd5f1bf6": 93.0121, + "ca7e49c9d0ce": 0.0771, + "c76526324869": 66.8464, + "c7941c583a82": 0.0755, + "c503f098823c": 0.0737, + "ce2bc3f425c1": 0.0736, + "cc47d2bb1a55": 0.0734, + "c53103d96445": 94.6063, + "cfc82abe8b03": 0.0743, + "ca155f61b8e1": 0.076, + "c13db6e968cb": 0.0763, + "c16a4b3393cc": 0.0766, + "c1473c65fe92": 92.2434, + "ceca68662823": 0.0774, + "c505a0d703f4": 0.0769, + "c7b9ef7811ff": 0.076, + "c2938b5cbbc7": 0.0773, + "c5b73c0997d3": 0.0742 + }, + "load_start": [ + 12.73486328125, + 11.19921875, + 16.1044921875 + ], + "baseline_geometry_s": 0.7023, + "cost_estimates_total_s": 0.015, + "verification_median_s": 32.295, + "load_end": [ + 8.70654296875, + 10.33447265625, + 13.30126953125 + ] + }, + "C09_gf180_sW2_sL2": { + "geometry_s": { + "c356972a7591": 0.1027, + "ce1c72423ac5": 0.1004, + "c868dae116fc": 0.1045, + "c3d299aa1684": 0.1005, + "cc25b6ac29bc": 0.1033, + "c14d77c66bce": 27.7238, + "ca25a659d97c": 0.0573, + "cc2aa43316ad": 0.0805, + "c4772dbbdf66": 0.0562, + "cabf6c247694": 0.1233, + "c0408f6e3709": 0.1113, + "cb158ed58a04": 0.0574, + "cee871477aad": 0.0587, + "c9aed153d628": 0.0563, + "ce409908ba72": 0.0561, + "c2cb09750dec": 0.0913, + "c3167f27de12": 0.0566, + "cd384a167111": 0.0576, + "c94701ea1602": 0.0581, + "cf03185bf1ff": 0.0571, + "c30d95452a3e": 0.0579, + "ce3a7e0ac9ac": 0.1278, + "c27a1590e2dc": 0.059, + "c5780de004da": 0.0569, + "cfcf7ac2f12c": 0.0564, + "ccca6b541f26": 22.0323, + "cec45110f11d": 0.0558, + "c66cce746f09": 0.0597, + "c2fb884f7b0d": 0.1208, + "ca3d4bc833d4": 22.3454, + "c5d895f71ddb": 0.0583, + "c15a26abdcc5": 0.0833, + "c024a221aa1c": 0.0583, + "cb5cfcbbbfdd": 0.0561, + "c22f6901a055": 0.123, + "c1a9933ee693": 0.0551, + "c972ccf1b6f5": 0.0615, + "cdcbab2271c3": 0.0583, + "c015b4be0035": 0.0573, + "c7493d83956d": 0.0602, + "c79c97410b04": 0.0567, + "cd07576d270f": 0.0595, + "caccf6135b3d": 0.0827, + "c223b8bb4118": 0.0577, + "c032ff1430c3": 0.093, + "cfda88d9f307": 0.1235, + "ce156303721e": 0.0582, + "cf45025f4f62": 0.059, + "c8690514c678": 0.0559, + "c3603bd93b53": 0.0574, + "c1c5cf5629c9": 0.0544, + "c31972ebb369": 0.0794, + "c6d79e431c04": 0.0589, + "ccc11a399b96": 25.9444, + "cacfdfeecf2e": 0.0932, + "c7ae0d2e6352": 0.0562, + "c1100f9dafce": 0.0573, + "c2f38453b69b": 0.1271, + "c32babd9a847": 0.0579, + "cd6f1e2c1557": 22.9427, + "c53800fd7262": 0.0598, + "c9809742b886": 1.1069, + "cd3af4492494": 0.0983, + "c5516609743f": 0.1609 + }, + "load_start": [ + 12.73486328125, + 11.19921875, + 16.1044921875 + ], + "baseline_geometry_s": 1.0173, + "cost_estimates_total_s": 0.0335, + "verification_median_s": 36.489999999999995, + "load_end": [ + 18.07666015625, + 13.78173828125, + 16.43994140625 + ] + }, + "C02_gf180_sW2_sL2": { + "geometry_s": { + "c8518d00a186": 0.0212, + "cb1a393bdfaf": 0.0204, + "c0391f77ad6b": 0.0202, + "c11635c35151": 0.0196, + "c03f3036669f": 0.0204, + "cf675937f822": 0.0206, + "cbcf41e784f8": 0.0199, + "c04d0fbcbbdd": 0.0198, + "c0edda0cff55": 0.0209, + "c2943399381b": 0.0203, + "c14b90138a67": 0.0203, + "c49606b115a4": 0.0201, + "c8b962eabbd7": 0.0199, + "c0e8c84240fa": 0.0204, + "c4e4dbfd48e6": 0.0208, + "cbef5ee1960b": 0.0226, + "ca768292a9a7": 0.0202, + "cb0e11b955bb": 0.0203, + "c96d83290a85": 0.0203, + "c5692d105b99": 0.0197, + "cf84543a4f57": 0.0204, + "c2bb97ae9670": 0.0196, + "c1384f98c43d": 0.0197, + "c6ac954e1758": 0.0195, + "ccfa89a8d172": 0.0318, + "c9ef4c9ccf36": 0.0304, + "cbfd7e1c1e6c": 0.0306, + "cceae287b1bb": 0.0301, + "cb76c2e3650b": 0.0304, + "c3dfd5a42932": 0.031, + "c0e6e807276e": 0.0318, + "ccabc22666cf": 0.0295, + "c82de43f88cc": 0.0307, + "c9339cbaa1bb": 0.0308, + "c26ee653792d": 0.0309, + "c8199062b191": 0.0306, + "cf49791c49e5": 0.0321, + "c92dbf630ab4": 0.0305, + "cb64f3cb9973": 0.0267, + "c2870c5a5e89": 0.0288, + "cb8db8bce506": 0.0204, + "caf7c6bbb899": 0.0209, + "c0ad044d1cc3": 0.0211, + "cb33a1c6c1e4": 0.0235, + "cd7e109bb558": 0.021, + "c98ec3e14006": 0.0208, + "cb41f1ed5051": 0.0207, + "c16cbde90679": 0.0209, + "c7dcdc470b5b": 0.0214, + "c36cf2c7dc73": 0.0205, + "c46ae367db8f": 0.0208, + "cd6bd155f988": 0.0213, + "c4d54317483f": 0.0225, + "cb5fd06efa8c": 0.0204, + "cbb5d96593ef": 0.0207, + "cc989ed726da": 0.0204, + "c4d1e1cc9e66": 0.0207, + "cb36a0a2bc2e": 0.0209, + "c1beec90ed89": 0.0212, + "c4f44157181a": 0.0203, + "c3f22742ce2c": 0.0203, + "cce03735ed2f": 0.023, + "ca16449e398a": 0.0969, + "c2e07f5e499c": 0.0209 + }, + "load_start": [ + 10.77685546875, + 10.7626953125, + 16.04541015625 + ], + "baseline_geometry_s": 0.9119, + "cost_estimates_total_s": 0.0098, + "verification_median_s": 19.985, + "load_end": [ + 11.595703125, + 10.93310546875, + 16.072265625 + ] + }, + "C16_gf180_sW1_sL2": { + "geometry_s": { + "c2e52d6ac401": 0.0131, + "cb7b19550006": 0.0123, + "cfbd7ec81e6b": 0.013, + "c0c48e26e41e": 0.013, + "cf9559574acb": 0.0123, + "c0f923f8248d": 0.0126, + "c5dc28bfca06": 0.0151, + "cbbd4ef2e0bb": 0.0169, + "c1905d32dbcf": 0.0156, + "c2aac95fccb8": 0.0172, + "ccbca30b74a7": 0.0172, + "c0019263a233": 0.0169, + "cb18c44bc6e4": 0.0174, + "c97d05c1501f": 0.016, + "cd9f57dd0924": 0.0159, + "c075ba8e1639": 0.0157, + "cf9098cedba8": 0.0149, + "c2827ff310d4": 0.0174, + "c35bd7131b3f": 0.0328, + "c17a0c4f773b": 0.0183, + "c4834dc35303": 0.033, + "c15773d79602": 0.0166, + "c4f5495ffef5": 0.0245, + "c1a3de6634ce": 0.0154, + "c31cb3370cac": 0.0247, + "cc9ee41cef40": 0.0152, + "c8b272104ec5": 0.015, + "cbd1d4dc35ec": 0.0146, + "ca99aed17c77": 0.0151, + "ca7feca451cb": 0.0167, + "cc2c5c9f6cbb": 0.0202, + "c249482f72c4": 0.015, + "c8ddfb4208f5": 0.0197, + "c2c13fc313bb": 0.0123, + "ca7e4dec30cb": 0.0154, + "c7fff4d94d75": 0.0126, + "c0e34e2a054e": 0.0155, + "ccde9fba0434": 0.0142, + "c035f6c2753f": 0.0153, + "c10291a49c1a": 0.0139, + "cca189885768": 0.013, + "c3a9d1c5d402": 0.0133, + "c1a7f501df1e": 0.0127, + "c9fb113ccb24": 0.013, + "cf3a54028200": 0.0126, + "c5919a61b4f2": 0.0134, + "c4989ef5e566": 0.0172, + "c13e5c3c6da4": 0.0146, + "c4cdf00d4097": 0.0175 + }, + "load_start": [ + 18.7177734375, + 15.53759765625, + 16.7568359375 + ], + "baseline_geometry_s": 0.5764, + "cost_estimates_total_s": 0.0038, + "verification_median_s": 27.26, + "load_end": [ + 18.66015625, + 15.57861328125, + 16.763671875 + ] + }, + "C02_gf180_sW2_sL1": { + "geometry_s": { + "c8518d00a186": 0.0196, + "cb1a393bdfaf": 0.0194, + "c0391f77ad6b": 0.0189, + "c11635c35151": 0.0187, + "c03f3036669f": 0.0196, + "cf675937f822": 0.0183, + "cbcf41e784f8": 0.0205, + "c04d0fbcbbdd": 0.0189, + "c0edda0cff55": 0.0201, + "c2943399381b": 0.0199, + "c14b90138a67": 0.0183, + "c49606b115a4": 0.0196, + "c8b962eabbd7": 0.0186, + "c0e8c84240fa": 0.0185, + "c4e4dbfd48e6": 0.0201, + "cbef5ee1960b": 0.02, + "ca768292a9a7": 0.0205, + "cb0e11b955bb": 0.019, + "c96d83290a85": 0.0196, + "c5692d105b99": 0.0188, + "cf84543a4f57": 0.0194, + "c2bb97ae9670": 0.0179, + "c1384f98c43d": 0.0186, + "c6ac954e1758": 0.0188, + "ccfa89a8d172": 0.0301, + "c9ef4c9ccf36": 0.0307, + "cbfd7e1c1e6c": 0.0293, + "cceae287b1bb": 0.0297, + "cb76c2e3650b": 0.0287, + "c3dfd5a42932": 0.0291, + "c0e6e807276e": 0.0298, + "ccabc22666cf": 0.032, + "c82de43f88cc": 0.0279, + "c9339cbaa1bb": 0.03, + "c26ee653792d": 0.0299, + "c8199062b191": 0.0303, + "cf49791c49e5": 0.0295, + "c92dbf630ab4": 0.0314, + "cb64f3cb9973": 0.0285, + "c2870c5a5e89": 0.0293, + "cb8db8bce506": 0.0206, + "caf7c6bbb899": 0.0209, + "c0ad044d1cc3": 0.0198, + "cb33a1c6c1e4": 0.0201, + "cd7e109bb558": 0.02, + "c98ec3e14006": 0.0206, + "cb41f1ed5051": 0.0227, + "c16cbde90679": 0.02, + "c7dcdc470b5b": 0.0201, + "c36cf2c7dc73": 0.0208, + "c46ae367db8f": 0.0206, + "cd6bd155f988": 0.0193, + "c4d54317483f": 0.0184, + "cb5fd06efa8c": 0.0188, + "cbb5d96593ef": 0.0189, + "cc989ed726da": 0.0211, + "c4d1e1cc9e66": 0.02, + "cb36a0a2bc2e": 0.0205, + "c1beec90ed89": 0.0203, + "c4f44157181a": 0.0198, + "c3f22742ce2c": 0.0198, + "cce03735ed2f": 0.0198, + "ca16449e398a": 0.0193, + "c2e07f5e499c": 0.0195 + }, + "load_start": [ + 10.77685546875, + 10.7626953125, + 16.04541015625 + ], + "baseline_geometry_s": 0.9058, + "cost_estimates_total_s": 0.0097, + "verification_median_s": 19.759999999999998, + "load_end": [ + 11.595703125, + 10.93310546875, + 16.072265625 + ] + } + }, + "fallback_tasks": [ + "C09_ihp130_sW2_sL1", + "C09_ihp130_sW2_sL2", + "C09_sky130_sW2_sL1" + ] +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/results/case_build.json b/benchmarks/textbook_sharing/results/case_build.json new file mode 100644 index 00000000..bd19e6c9 --- /dev/null +++ b/benchmarks/textbook_sharing/results/case_build.json @@ -0,0 +1,72142 @@ +[ + { + "case_id": "C01_gf180_sW0.5_sL1", + "circuit_id": "C01", + "pdk": "gf180", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.12, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.12, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "8d80e8fb05c7090c", + "mirror_pass1": { + "vmin": 0.4939107, + "status": "passed", + "vout_test": 1.9 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.5939 + }, + "_frozen_from": { + "schematic": { + "err": 0.0096, + "vmin": 0.4939107 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 1.1549999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 2.0192e-05, + "err": 0.0096, + "vmin": 0.4939107, + "dev_at_vdd": 0.03076857, + "gout_t": 2.682199e-07, + "rout_t": 3728291.0, + "vout_test": 1.9, + "rout_nom": 3728291.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 0.2 + }, + { + "case_id": "C01_gf180_sW0.5_sL1.5", + "circuit_id": "C01", + "pdk": "gf180", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.68, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.68, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "cfe3a427088c0740", + "mirror_pass1": { + "vmin": 0.5582265, + "status": "passed", + "vout_test": 1.93 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.6582 + }, + "_frozen_from": { + "schematic": { + "err": 0.004839, + "vmin": 0.5582265 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 1.1549999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 2.009678e-05, + "err": 0.004839, + "vmin": 0.5582265, + "dev_at_vdd": 0.02584804, + "gout_t": 1.752604e-07, + "rout_t": 5705798.0, + "vout_test": 1.93, + "rout_nom": 5705798.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 0.2 + }, + { + "case_id": "C01_gf180_sW0.5_sL2", + "circuit_id": "C01", + "pdk": "gf180", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 2.24, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 2.24, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "473392a1b0f6b0ba", + "mirror_pass1": { + "vmin": 0.6231022, + "status": "passed", + "vout_test": 1.96 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.7231 + }, + "_frozen_from": { + "schematic": { + "err": 0.002796, + "vmin": 0.6231022 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 1.1549999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 2.005592e-05, + "err": 0.002796, + "vmin": 0.6231022, + "dev_at_vdd": 0.01716841, + "gout_t": 1.317882e-07, + "rout_t": 7587959.0, + "vout_test": 1.96, + "rout_nom": 7587959.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 0.2 + }, + { + "case_id": "C01_gf180_sW1.5_sL1", + "circuit_id": "C01", + "pdk": "gf180", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.12, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.12, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "a21601cfb88c77f2", + "mirror_pass1": { + "vmin": 0.3068542, + "status": "passed", + "vout_test": 1.8 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.4069 + }, + "_frozen_from": { + "schematic": { + "err": 0.0164475, + "vmin": 0.3068542 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 1.1549999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 2.032895e-05, + "err": 0.0164475, + "vmin": 0.3068542, + "dev_at_vdd": 0.0506685, + "gout_t": 3.573105e-07, + "rout_t": 2798687.0, + "vout_test": 1.8, + "rout_nom": 2798687.0, + "ok_at_vdd": 0.0 + }, + "presim_s": 0.2 + }, + { + "case_id": "C01_gf180_sW1.5_sL1.5", + "circuit_id": "C01", + "pdk": "gf180", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.68, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.68, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "04e58f2ea147e188", + "mirror_pass1": { + "vmin": 0.3330656, + "status": "passed", + "vout_test": 1.82 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.4331 + }, + "_frozen_from": { + "schematic": { + "err": 0.00945, + "vmin": 0.3330656 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 1.1549999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 2.0189e-05, + "err": 0.00945, + "vmin": 0.3330656, + "dev_at_vdd": 0.05038195, + "gout_t": 2.277447e-07, + "rout_t": 4390884.0, + "vout_test": 1.82, + "rout_nom": 4390884.0, + "ok_at_vdd": 0.0 + }, + "presim_s": 0.2 + }, + { + "case_id": "C01_gf180_sW1.5_sL2", + "circuit_id": "C01", + "pdk": "gf180", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 2.24, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 2.24, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "5b62d65d2e8506af", + "mirror_pass1": { + "vmin": 0.3645314, + "status": "passed", + "vout_test": 1.83 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.4645 + }, + "_frozen_from": { + "schematic": { + "err": 0.0062665, + "vmin": 0.3645314 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 1.1549999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 2.012533e-05, + "err": 0.0062665, + "vmin": 0.3645314, + "dev_at_vdd": 0.03793406, + "gout_t": 1.673393e-07, + "rout_t": 5975886.0, + "vout_test": 1.83, + "rout_nom": 5975886.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 0.2 + }, + { + "case_id": "C01_gf180_sW1_sL1", + "circuit_id": "C01", + "pdk": "gf180", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "b8f486775160b817", + "mirror_pass1": { + "vmin": 0.3632665, + "status": "passed", + "vout_test": 1.83 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.4633 + }, + "_frozen_from": { + "schematic": { + "err": 0.0137495, + "vmin": 0.3632665 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 1.1549999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 2.027499e-05, + "err": 0.0137495, + "vmin": 0.3632665, + "dev_at_vdd": 0.04274814, + "gout_t": 3.184771e-07, + "rout_t": 3139945.0, + "vout_test": 1.83, + "rout_nom": 3139945.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 0.2 + }, + { + "case_id": "C01_gf180_sW1_sL1.5", + "circuit_id": "C01", + "pdk": "gf180", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.68, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.68, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "fa75150823673e58", + "mirror_pass1": { + "vmin": 0.4007682, + "status": "passed", + "vout_test": 1.85 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.5008 + }, + "_frozen_from": { + "schematic": { + "err": 0.0076215, + "vmin": 0.4007682 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 1.1549999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 2.015243e-05, + "err": 0.0076215, + "vmin": 0.4007682, + "dev_at_vdd": 0.04081703, + "gout_t": 2.042242e-07, + "rout_t": 4896584.0, + "vout_test": 1.85, + "rout_nom": 4896584.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 0.2 + }, + { + "case_id": "C01_gf180_sW1_sL2", + "circuit_id": "C01", + "pdk": "gf180", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 2.24, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 2.24, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "fcd39913c768f6cc", + "mirror_pass1": { + "vmin": 0.441899, + "status": "passed", + "vout_test": 1.87 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.5419 + }, + "_frozen_from": { + "schematic": { + "err": 0.004934, + "vmin": 0.441899 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 1.1549999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 2.009868e-05, + "err": 0.004934, + "vmin": 0.441899, + "dev_at_vdd": 0.02965071, + "gout_t": 1.507288e-07, + "rout_t": 6634442.0, + "vout_test": 1.87, + "rout_nom": 6634442.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 0.2 + }, + { + "case_id": "C01_gf180_sW2_sL1", + "circuit_id": "C01", + "pdk": "gf180", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "6397d295385c22c7", + "mirror_pass1": { + "vmin": 0.273695, + "status": "passed", + "vout_test": 1.79 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.3737 + }, + "_frozen_from": { + "schematic": { + "err": 0.0186885, + "vmin": 0.273695 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 1.1549999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 2.037377e-05, + "err": 0.0186885, + "vmin": 0.273695, + "dev_at_vdd": 0.05676728, + "gout_t": 3.890374e-07, + "rout_t": 2570447.0, + "vout_test": 1.79, + "rout_nom": 2570447.0, + "ok_at_vdd": 0.0 + }, + "presim_s": 0.2 + }, + { + "case_id": "C01_gf180_sW2_sL1.5", + "circuit_id": "C01", + "pdk": "gf180", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.68, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.68, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "c73195cf17258e63", + "mirror_pass1": { + "vmin": 0.2933166, + "status": "passed", + "vout_test": 1.8 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.3933 + }, + "_frozen_from": { + "schematic": { + "err": 0.010827, + "vmin": 0.2933166 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 1.1549999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 2.021654e-05, + "err": 0.010827, + "vmin": 0.2933166, + "dev_at_vdd": 0.05741479, + "gout_t": 2.478971e-07, + "rout_t": 4033933.0, + "vout_test": 1.8, + "rout_nom": 4033933.0, + "ok_at_vdd": 0.0 + }, + "presim_s": 0.2 + }, + { + "case_id": "C01_gf180_sW2_sL2", + "circuit_id": "C01", + "pdk": "gf180", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 2.24, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 2.24, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "dce0b41fe2b0cb39", + "mirror_pass1": { + "vmin": 0.3192599, + "status": "passed", + "vout_test": 1.81 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.4193 + }, + "_frozen_from": { + "schematic": { + "err": 0.0073185, + "vmin": 0.3192599 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 1.1549999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 2.014637e-05, + "err": 0.0073185, + "vmin": 0.3192599, + "dev_at_vdd": 0.04407303, + "gout_t": 1.815763e-07, + "rout_t": 5507330.0, + "vout_test": 1.81, + "rout_nom": 5507330.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 0.2 + }, + { + "case_id": "C01_ihp130_sW0.5_sL1", + "circuit_id": "C01", + "pdk": "ihp130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.04, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.04, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "9a13ef4413250202", + "mirror_pass1": { + "vmin": 0.3824582, + "status": "passed", + "vout_test": 0.79 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.42 + }, + "_frozen_from": { + "schematic": { + "err": 0.0299515, + "vmin": 0.3824582 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.42 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 2.059903e-05, + "err": 0.0299515, + "vmin": 0.3824582, + "dev_at_vdd": 0.08277446, + "gout_t": 3.054209e-06, + "rout_t": 327417.5, + "vout_test": 0.79, + "rout_nom": 327417.5, + "ok_at_vdd": 0.0 + }, + "presim_s": 0.2 + }, + { + "case_id": "C01_ihp130_sW0.5_sL1.5", + "circuit_id": "C01", + "pdk": "ihp130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.56, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.56, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "04391e35aef9ecf6", + "mirror_pass1": { + "vmin": 0.3936066, + "status": "passed", + "vout_test": 0.8 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.42 + }, + "_frozen_from": { + "schematic": { + "err": 0.015862, + "vmin": 0.3936066 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.42 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 2.031724e-05, + "err": 0.015862, + "vmin": 0.3936066, + "dev_at_vdd": 0.05496639, + "gout_t": 2.345381e-06, + "rout_t": 426370.8, + "vout_test": 0.8, + "rout_nom": 426370.8, + "ok_at_vdd": 0.0 + }, + "presim_s": 0.2 + }, + { + "case_id": "C01_ihp130_sW0.5_sL2", + "circuit_id": "C01", + "pdk": "ihp130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 2.08, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 2.08, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "eeb5b806a712205f", + "mirror_pass1": { + "vmin": 0.4148405, + "status": "passed", + "vout_test": 0.81 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.42 + }, + "_frozen_from": { + "schematic": { + "err": 0.008108, + "vmin": 0.4148405 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.42 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 2.016216e-05, + "err": 0.008108, + "vmin": 0.4148405, + "dev_at_vdd": 0.03965959, + "gout_t": 1.958164e-06, + "rout_t": 510682.6, + "vout_test": 0.81, + "rout_nom": 510682.6, + "ok_at_vdd": 1.0 + }, + "presim_s": 0.2 + }, + { + "case_id": "C01_ihp130_sW1.5_sL1", + "circuit_id": "C01", + "pdk": "ihp130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.04, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.04, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "d5d7a3931da3560e", + "mirror_pass1": { + "vmin": 0.3035163, + "status": "passed", + "vout_test": 0.75 + }, + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "|err|=0.07675 above floor 0.05" + ], + "spec": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.4035 + }, + "_frozen_from": { + "schematic": { + "err": 0.0767505, + "vmin": 0.3035163 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.42 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 2.153501e-05, + "err": 0.0767505, + "vmin": 0.3035163, + "dev_at_vdd": 0.1651087, + "gout_t": 4.602516e-06, + "rout_t": 217272.4, + "vout_test": 0.75, + "rout_nom": 217272.4, + "ok_at_vdd": 0.0 + }, + "presim_s": 0.4 + }, + { + "case_id": "C01_ihp130_sW1.5_sL1.5", + "circuit_id": "C01", + "pdk": "ihp130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.56, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.56, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "ae219fd8159ea3d6", + "mirror_pass1": { + "vmin": 0.2958726, + "status": "passed", + "vout_test": 0.75 + }, + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "|err|=0.05134 above floor 0.05" + ], + "spec": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.3959 + }, + "_frozen_from": { + "schematic": { + "err": 0.0513445, + "vmin": 0.2958726 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.42 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 2.102689e-05, + "err": 0.0513445, + "vmin": 0.2958726, + "dev_at_vdd": 0.1172686, + "gout_t": 3.47955e-06, + "rout_t": 287393.4, + "vout_test": 0.75, + "rout_nom": 287393.4, + "ok_at_vdd": 0.0 + }, + "presim_s": 0.4 + }, + { + "case_id": "C01_ihp130_sW1.5_sL2", + "circuit_id": "C01", + "pdk": "ihp130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 2.08, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 2.08, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "0acba9963926f8dc", + "mirror_pass1": { + "vmin": 0.2946816, + "status": "passed", + "vout_test": 0.75 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.3947 + }, + "_frozen_from": { + "schematic": { + "err": 0.0369945, + "vmin": 0.2946816 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.42 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 2.073989e-05, + "err": 0.0369945, + "vmin": 0.2946816, + "dev_at_vdd": 0.0906925, + "gout_t": 2.862879e-06, + "rout_t": 349298.7, + "vout_test": 0.75, + "rout_nom": 349298.7, + "ok_at_vdd": 0.0 + }, + "presim_s": 0.4 + }, + { + "case_id": "C01_ihp130_sW1_sL1", + "circuit_id": "C01", + "pdk": "ihp130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.04, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.04, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "9a1b25496b543424", + "mirror_pass1": { + "vmin": 0.3270033, + "status": "passed", + "vout_test": 0.76 + }, + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "|err|=0.05651 above floor 0.05" + ], + "spec": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.42 + }, + "_frozen_from": { + "schematic": { + "err": 0.056512, + "vmin": 0.3270033 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.42 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 2.113024e-05, + "err": 0.056512, + "vmin": 0.3270033, + "dev_at_vdd": 0.1301068, + "gout_t": 3.940946e-06, + "rout_t": 253746.5, + "vout_test": 0.76, + "rout_nom": 253746.5, + "ok_at_vdd": 0.0 + }, + "presim_s": 0.3 + }, + { + "case_id": "C01_ihp130_sW1_sL1.5", + "circuit_id": "C01", + "pdk": "ihp130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "5858574cc97f6612", + "mirror_pass1": { + "vmin": 0.3235503, + "status": "passed", + "vout_test": 0.76 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.42 + }, + "_frozen_from": { + "schematic": { + "err": 0.0356015, + "vmin": 0.3235503 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.42 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 2.071203e-05, + "err": 0.0356015, + "vmin": 0.3235503, + "dev_at_vdd": 0.09082531, + "gout_t": 2.99952e-06, + "rout_t": 333387.2, + "vout_test": 0.76, + "rout_nom": 333387.2, + "ok_at_vdd": 0.0 + }, + "presim_s": 0.3 + }, + { + "case_id": "C01_ihp130_sW1_sL2", + "circuit_id": "C01", + "pdk": "ihp130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 2.08, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 2.08, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "f53b5292532a26d3", + "mirror_pass1": { + "vmin": 0.3285227, + "status": "passed", + "vout_test": 0.76 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.42 + }, + "_frozen_from": { + "schematic": { + "err": 0.023855, + "vmin": 0.3285227 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.42 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 2.04771e-05, + "err": 0.023855, + "vmin": 0.3285227, + "dev_at_vdd": 0.06910039, + "gout_t": 2.48508e-06, + "rout_t": 402402.2, + "vout_test": 0.76, + "rout_nom": 402402.2, + "ok_at_vdd": 0.0 + }, + "presim_s": 0.3 + }, + { + "case_id": "C01_ihp130_sW2_sL1", + "circuit_id": "C01", + "pdk": "ihp130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.04, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.04, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "7afc7b8864ddcc1e", + "mirror_pass1": { + "vmin": 0.2894176, + "status": "passed", + "vout_test": 0.74 + }, + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "|err|=0.09228 above floor 0.05" + ], + "spec": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.3894 + }, + "_frozen_from": { + "schematic": { + "err": 0.092279, + "vmin": 0.2894176 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.42 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 2.184558e-05, + "err": 0.092279, + "vmin": 0.2894176, + "dev_at_vdd": 0.1938621, + "gout_t": 5.165312e-06, + "rout_t": 193599.4, + "vout_test": 0.74, + "rout_nom": 193599.4, + "ok_at_vdd": 0.0 + }, + "presim_s": 0.5 + }, + { + "case_id": "C01_ihp130_sW2_sL1.5", + "circuit_id": "C01", + "pdk": "ihp130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "ee72d3c9a1719555", + "mirror_pass1": { + "vmin": 0.2801363, + "status": "passed", + "vout_test": 0.74 + }, + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "|err|=0.06344 above floor 0.05" + ], + "spec": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.3801 + }, + "_frozen_from": { + "schematic": { + "err": 0.0634415, + "vmin": 0.2801363 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.42 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 2.126883e-05, + "err": 0.0634415, + "vmin": 0.2801363, + "dev_at_vdd": 0.139056, + "gout_t": 3.894337e-06, + "rout_t": 256783.5, + "vout_test": 0.74, + "rout_nom": 256783.5, + "ok_at_vdd": 0.0 + }, + "presim_s": 0.5 + }, + { + "case_id": "C01_ihp130_sW2_sL2", + "circuit_id": "C01", + "pdk": "ihp130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 2.08, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 2.08, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "46171163d4eb7b45", + "mirror_pass1": { + "vmin": 0.2760895, + "status": "passed", + "vout_test": 0.74 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.3761 + }, + "_frozen_from": { + "schematic": { + "err": 0.0470665, + "vmin": 0.2760895 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.42 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 2.094133e-05, + "err": 0.0470665, + "vmin": 0.2760895, + "dev_at_vdd": 0.1084847, + "gout_t": 3.19377e-06, + "rout_t": 313110.1, + "vout_test": 0.74, + "rout_nom": 313110.1, + "ok_at_vdd": 0.0 + }, + "presim_s": 0.5 + }, + { + "case_id": "C01_sky130_sW0.5_sL1", + "circuit_id": "C01", + "pdk": "sky130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.6, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.6, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "eb7052d274d608b9", + "mirror_pass1": { + "vmin": 0.4881766, + "status": "passed", + "vout_test": 1.14 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.5882 + }, + "_frozen_from": { + "schematic": { + "err": 0.0134955, + "vmin": 0.4881766 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.63 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 2.026991e-05, + "err": 0.0134955, + "vmin": 0.4881766, + "dev_at_vdd": 0.04744706, + "gout_t": 1.254398e-06, + "rout_t": 797197.0, + "vout_test": 1.14, + "rout_nom": 797197.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 14.9 + }, + { + "case_id": "C01_sky130_sW0.5_sL1.5", + "circuit_id": "C01", + "pdk": "sky130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.9, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.9, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "9d5b53afb44a129f", + "mirror_pass1": { + "vmin": 0.52631, + "status": "passed", + "vout_test": 1.16 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.6263 + }, + "_frozen_from": { + "schematic": { + "err": 0.010299, + "vmin": 0.52631 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.63 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 2.020598e-05, + "err": 0.010299, + "vmin": 0.52631, + "dev_at_vdd": 0.04216954, + "gout_t": 1.215248e-06, + "rout_t": 822879.3, + "vout_test": 1.16, + "rout_nom": 822879.3, + "ok_at_vdd": 1.0 + }, + "presim_s": 18.7 + }, + { + "case_id": "C01_sky130_sW0.5_sL2", + "circuit_id": "C01", + "pdk": "sky130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.2, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.2, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "a567139dc78d630e", + "mirror_pass1": { + "vmin": 0.5386201, + "status": "passed", + "vout_test": 1.17 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.63 + }, + "_frozen_from": { + "schematic": { + "err": 0.0066305, + "vmin": 0.5386201 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.63 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 2.013261e-05, + "err": 0.0066305, + "vmin": 0.5386201, + "dev_at_vdd": 0.03586485, + "gout_t": 1.115739e-06, + "rout_t": 896266.8, + "vout_test": 1.17, + "rout_nom": 896266.8, + "ok_at_vdd": 1.0 + }, + "presim_s": 19.3 + }, + { + "case_id": "C01_sky130_sW1.5_sL1", + "circuit_id": "C01", + "pdk": "sky130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.6, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.6, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "5cb64fa52ad1fd83", + "mirror_pass1": { + "vmin": 0.3938734, + "status": "passed", + "vout_test": 1.1 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.4939 + }, + "_frozen_from": { + "schematic": { + "err": 0.024797, + "vmin": 0.3938734 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.63 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 2.049594e-05, + "err": 0.024797, + "vmin": 0.3938734, + "dev_at_vdd": 0.06899832, + "gout_t": 1.464635e-06, + "rout_t": 682765.3, + "vout_test": 1.1, + "rout_nom": 682765.3, + "ok_at_vdd": 0.0 + }, + "presim_s": 12.3 + }, + { + "case_id": "C01_sky130_sW1.5_sL1.5", + "circuit_id": "C01", + "pdk": "sky130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.9, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.9, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "4f5be3a7c4ef7ccf", + "mirror_pass1": { + "vmin": 0.4069824, + "status": "passed", + "vout_test": 1.1 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.507 + }, + "_frozen_from": { + "schematic": { + "err": 0.0218265, + "vmin": 0.4069824 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.63 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 2.043653e-05, + "err": 0.0218265, + "vmin": 0.4069824, + "dev_at_vdd": 0.06462978, + "gout_t": 1.422084e-06, + "rout_t": 703194.4, + "vout_test": 1.1, + "rout_nom": 703194.4, + "ok_at_vdd": 0.0 + }, + "presim_s": 12.3 + }, + { + "case_id": "C01_sky130_sW1.5_sL2", + "circuit_id": "C01", + "pdk": "sky130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.2, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.2, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "b31d3b8581a9d2fc", + "mirror_pass1": { + "vmin": 0.4017564, + "status": "passed", + "vout_test": 1.1 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.5018 + }, + "_frozen_from": { + "schematic": { + "err": 0.0186775, + "vmin": 0.4017564 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.63 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 2.037355e-05, + "err": 0.0186775, + "vmin": 0.4017564, + "dev_at_vdd": 0.06052456, + "gout_t": 1.359599e-06, + "rout_t": 735511.9, + "vout_test": 1.1, + "rout_nom": 735511.9, + "ok_at_vdd": 0.0 + }, + "presim_s": 12.2 + }, + { + "case_id": "C01_sky130_sW1_sL1", + "circuit_id": "C01", + "pdk": "sky130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "f45f6e49e69623cf", + "mirror_pass1": { + "vmin": 0.4211187, + "status": "passed", + "vout_test": 1.11 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.5211 + }, + "_frozen_from": { + "schematic": { + "err": 0.02052, + "vmin": 0.4211187 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.63 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 2.04104e-05, + "err": 0.02052, + "vmin": 0.4211187, + "dev_at_vdd": 0.06062094, + "gout_t": 1.37352e-06, + "rout_t": 728057.7, + "vout_test": 1.11, + "rout_nom": 728057.7, + "ok_at_vdd": 0.0 + }, + "presim_s": 20.6 + }, + { + "case_id": "C01_sky130_sW1_sL1.5", + "circuit_id": "C01", + "pdk": "sky130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.9, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.9, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "baeb93405e70889e", + "mirror_pass1": { + "vmin": 0.4415389, + "status": "passed", + "vout_test": 1.12 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.5415 + }, + "_frozen_from": { + "schematic": { + "err": 0.0177605, + "vmin": 0.4415389 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.63 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 2.035521e-05, + "err": 0.0177605, + "vmin": 0.4415389, + "dev_at_vdd": 0.05590602, + "gout_t": 1.32694e-06, + "rout_t": 753614.1, + "vout_test": 1.12, + "rout_nom": 753614.1, + "ok_at_vdd": 0.0 + }, + "presim_s": 18.5 + }, + { + "case_id": "C01_sky130_sW1_sL2", + "circuit_id": "C01", + "pdk": "sky130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.2, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.2, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "374164a2e191e2cf", + "mirror_pass1": { + "vmin": 0.4409208, + "status": "passed", + "vout_test": 1.12 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.5409 + }, + "_frozen_from": { + "schematic": { + "err": 0.0141635, + "vmin": 0.4409208 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.63 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 2.028327e-05, + "err": 0.0141635, + "vmin": 0.4409208, + "dev_at_vdd": 0.05078378, + "gout_t": 1.249339e-06, + "rout_t": 800423.6, + "vout_test": 1.12, + "rout_nom": 800423.6, + "ok_at_vdd": 0.0 + }, + "presim_s": 16.4 + }, + { + "case_id": "C01_sky130_sW2_sL1", + "circuit_id": "C01", + "pdk": "sky130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "a75813d6ca5b8c0c", + "mirror_pass1": { + "vmin": 0.3786519, + "status": "passed", + "vout_test": 1.09 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.4787 + }, + "_frozen_from": { + "schematic": { + "err": 0.0275665, + "vmin": 0.3786519 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.63 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 2.055133e-05, + "err": 0.0275665, + "vmin": 0.3786519, + "dev_at_vdd": 0.07530348, + "gout_t": 1.542371e-06, + "rout_t": 648352.9, + "vout_test": 1.09, + "rout_nom": 648352.9, + "ok_at_vdd": 0.0 + }, + "presim_s": 11.9 + }, + { + "case_id": "C01_sky130_sW2_sL1.5", + "circuit_id": "C01", + "pdk": "sky130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.9, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.9, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "0a52817d47e34b34", + "mirror_pass1": { + "vmin": 0.3879408, + "status": "passed", + "vout_test": 1.09 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.4879 + }, + "_frozen_from": { + "schematic": { + "err": 0.024923, + "vmin": 0.3879408 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.63 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 2.049846e-05, + "err": 0.024923, + "vmin": 0.3879408, + "dev_at_vdd": 0.07130613, + "gout_t": 1.500827e-06, + "rout_t": 666300.1, + "vout_test": 1.09, + "rout_nom": 666300.1, + "ok_at_vdd": 0.0 + }, + "presim_s": 12.0 + }, + { + "case_id": "C01_sky130_sW2_sL2", + "circuit_id": "C01", + "pdk": "sky130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.2, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.2, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "efdd6b96556445bd", + "mirror_pass1": { + "vmin": 0.3807052, + "status": "passed", + "vout_test": 1.09 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.4807 + }, + "_frozen_from": { + "schematic": { + "err": 0.0221195, + "vmin": 0.3807052 + }, + "floors": { + "err": { + "abs_max": 0.05 + }, + "vmin": { + "max": 0.63 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 2.044239e-05, + "err": 0.0221195, + "vmin": 0.3807052, + "dev_at_vdd": 0.06807787, + "gout_t": 1.45266e-06, + "rout_t": 688392.6, + "vout_test": 1.09, + "rout_nom": 688392.6, + "ok_at_vdd": 0.0 + }, + "presim_s": 12.0 + }, + { + "case_id": "C02_gf180_sW0.5_sL1", + "circuit_id": "C02", + "pdk": "gf180", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.56, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.56, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.56, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.56, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "77590a9359bb5a82", + "mirror_pass1": { + "vmin": 0.7435945, + "status": "passed", + "vout_test": 2.02 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.8436 + }, + "_frozen_from": { + "schematic": { + "err": -0.000192, + "vmin": 0.7435945 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.9799999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.999616e-05, + "err": -0.000192, + "vmin": 0.7435945, + "dev_at_vdd": 0.0003154771, + "gout_t": 1.068846e-08, + "rout_t": 93560570.0, + "vout_test": 2.02, + "rout_nom": 93560570.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 0.2 + }, + { + "case_id": "C02_gf180_sW0.5_sL1.5", + "circuit_id": "C02", + "pdk": "gf180", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.84, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.84, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.84, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.84, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "fc301ba6bb21b3a4", + "mirror_pass1": { + "vmin": 0.6954534, + "status": "passed", + "vout_test": 2.0 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.7955 + }, + "_frozen_from": { + "schematic": { + "err": -0.0001375, + "vmin": 0.6954534 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.9799999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.999725e-05, + "err": -0.0001375, + "vmin": 0.6954534, + "dev_at_vdd": 7.452212e-05, + "gout_t": 6.509062e-09, + "rout_t": 153651300.0, + "vout_test": 2.0, + "rout_nom": 153651300.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 0.2 + }, + { + "case_id": "C02_gf180_sW0.5_sL2", + "circuit_id": "C02", + "pdk": "gf180", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.12, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.12, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.12, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.12, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "4af620ff0d57022c", + "mirror_pass1": { + "vmin": 0.7109873, + "status": "passed", + "vout_test": 2.01 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.811 + }, + "_frozen_from": { + "schematic": { + "err": -0.000122, + "vmin": 0.7109873 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.9799999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.999756e-05, + "err": -0.000122, + "vmin": 0.7109873, + "dev_at_vdd": 2.446146e-05, + "gout_t": 6.874304e-09, + "rout_t": 145538500.0, + "vout_test": 2.01, + "rout_nom": 145538500.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C02_gf180_sW1.5_sL1", + "circuit_id": "C02", + "pdk": "gf180", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.56, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.56, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.56, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.56, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "e77f24768a6419d7", + "mirror_pass1": { + "vmin": 0.5577191, + "status": "passed", + "vout_test": 1.93 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.6577 + }, + "_frozen_from": { + "schematic": { + "err": -3.75e-05, + "vmin": 0.5577191 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.9799999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.999925e-05, + "err": -3.75e-05, + "vmin": 0.5577191, + "dev_at_vdd": 0.001026859, + "gout_t": 7.294065e-09, + "rout_t": 137098000.0, + "vout_test": 1.93, + "rout_nom": 137098000.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 0.2 + }, + { + "case_id": "C02_gf180_sW1.5_sL1.5", + "circuit_id": "C02", + "pdk": "gf180", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.84, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.84, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.84, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.84, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "39e6f9cd7c9ad576", + "mirror_pass1": { + "vmin": 0.4599782, + "status": "passed", + "vout_test": 1.88 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.56 + }, + "_frozen_from": { + "schematic": { + "err": -4.25e-05, + "vmin": 0.4599782 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.9799999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.999915e-05, + "err": -4.25e-05, + "vmin": 0.4599782, + "dev_at_vdd": 0.0004312884, + "gout_t": 3.111474e-09, + "rout_t": 321393600.0, + "vout_test": 1.88, + "rout_nom": 321393600.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 0.2 + }, + { + "case_id": "C02_gf180_sW1.5_sL2", + "circuit_id": "C02", + "pdk": "gf180", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.12, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.12, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.12, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.12, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "108b7665c0c5f997", + "mirror_pass1": { + "vmin": 0.431989, + "status": "passed", + "vout_test": 1.87 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.532 + }, + "_frozen_from": { + "schematic": { + "err": -3.7e-05, + "vmin": 0.431989 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.9799999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.999926e-05, + "err": -3.7e-05, + "vmin": 0.431989, + "dev_at_vdd": 0.000208023, + "gout_t": 2.06274e-09, + "rout_t": 484803600.0, + "vout_test": 1.87, + "rout_nom": 484803600.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 0.2 + }, + { + "case_id": "C02_gf180_sW1_sL1", + "circuit_id": "C02", + "pdk": "gf180", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "696ceb44a6fa6494", + "mirror_pass1": { + "vmin": 0.6092603, + "status": "passed", + "vout_test": 1.95 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.7093 + }, + "_frozen_from": { + "schematic": { + "err": -8.05e-05, + "vmin": 0.6092603 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.9799999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.999839e-05, + "err": -8.05e-05, + "vmin": 0.6092603, + "dev_at_vdd": 0.0006958431, + "gout_t": 7.968778e-09, + "rout_t": 125491300.0, + "vout_test": 1.95, + "rout_nom": 125491300.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 0.2 + }, + { + "case_id": "C02_gf180_sW1_sL1.5", + "circuit_id": "C02", + "pdk": "gf180", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "2899078a84470112", + "mirror_pass1": { + "vmin": 0.5269029, + "status": "passed", + "vout_test": 1.91 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.6269 + }, + "_frozen_from": { + "schematic": { + "err": -6.55e-05, + "vmin": 0.5269029 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.9799999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.999869e-05, + "err": -6.55e-05, + "vmin": 0.5269029, + "dev_at_vdd": 0.0002402067, + "gout_t": 3.689619e-09, + "rout_t": 271039400.0, + "vout_test": 1.91, + "rout_nom": 271039400.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C02_gf180_sW1_sL2", + "circuit_id": "C02", + "pdk": "gf180", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "219af85053dd9873", + "mirror_pass1": { + "vmin": 0.5125606, + "status": "passed", + "vout_test": 1.91 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.6126 + }, + "_frozen_from": { + "schematic": { + "err": -5.45e-05, + "vmin": 0.5125606 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.9799999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.999891e-05, + "err": -5.45e-05, + "vmin": 0.5125606, + "dev_at_vdd": 0.0001010362, + "gout_t": 2.588956e-09, + "rout_t": 386278100.0, + "vout_test": 1.91, + "rout_nom": 386278100.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C02_gf180_sW2_sL1", + "circuit_id": "C02", + "pdk": "gf180", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "a3e77f280dda9152", + "mirror_pass1": { + "vmin": 0.5301283, + "status": "passed", + "vout_test": 1.92 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.6301 + }, + "_frozen_from": { + "schematic": { + "err": -1.3e-05, + "vmin": 0.5301283 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.9799999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.999974e-05, + "err": -1.3e-05, + "vmin": 0.5301283, + "dev_at_vdd": 0.001301787, + "gout_t": 7.061242e-09, + "rout_t": 141618800.0, + "vout_test": 1.92, + "rout_nom": 141618800.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 0.2 + }, + { + "case_id": "C02_gf180_sW2_sL1.5", + "circuit_id": "C02", + "pdk": "gf180", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "d88167d0f21f7579", + "mirror_pass1": { + "vmin": 0.4234542, + "status": "passed", + "vout_test": 1.86 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.5235 + }, + "_frozen_from": { + "schematic": { + "err": -3.05e-05, + "vmin": 0.4234542 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.9799999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.999939e-05, + "err": -3.05e-05, + "vmin": 0.4234542, + "dev_at_vdd": 0.0006111761, + "gout_t": 2.895754e-09, + "rout_t": 345337400.0, + "vout_test": 1.86, + "rout_nom": 345337400.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 0.3 + }, + { + "case_id": "C02_gf180_sW2_sL2", + "circuit_id": "C02", + "pdk": "gf180", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "11f3545f762ddd46", + "mirror_pass1": { + "vmin": 0.3868082, + "status": "passed", + "vout_test": 1.84 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.4868 + }, + "_frozen_from": { + "schematic": { + "err": -2.95e-05, + "vmin": 0.3868082 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.9799999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.999941e-05, + "err": -2.95e-05, + "vmin": 0.3868082, + "dev_at_vdd": 0.0003213657, + "gout_t": 1.88651e-09, + "rout_t": 530080400.0, + "vout_test": 1.84, + "rout_nom": 530080400.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 0.2 + }, + { + "case_id": "C02_ihp130_sW0.5_sL1", + "circuit_id": "C02", + "pdk": "ihp130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.52, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.52, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.52, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.52, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "2291a191007f09a4", + "mirror_pass1": { + "vmin": 0.5520631, + "status": "passed", + "vout_test": 0.88 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.6521 + }, + "_frozen_from": { + "schematic": { + "err": -0.0033385, + "vmin": 0.5520631 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.72 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.993323e-05, + "err": -0.0033385, + "vmin": 0.5520631, + "dev_at_vdd": 0.0003863601, + "gout_t": 3.137602e-07, + "rout_t": 3187212.0, + "vout_test": 0.88, + "rout_nom": 3187212.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 0.3 + }, + { + "case_id": "C02_ihp130_sW0.5_sL1.5", + "circuit_id": "C02", + "pdk": "ihp130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.78, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.78, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.78, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.78, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "a2fee2b3a2cb4273", + "mirror_pass1": { + "vmin": 0.5686756, + "status": "passed", + "vout_test": 0.88 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.6687 + }, + "_frozen_from": { + "schematic": { + "err": -0.0031305, + "vmin": 0.5686756 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.72 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.993739e-05, + "err": -0.0031305, + "vmin": 0.5686756, + "dev_at_vdd": 0.0001911442, + "gout_t": 3.092906e-07, + "rout_t": 3233593.0, + "vout_test": 0.88, + "rout_nom": 3233593.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 0.3 + }, + { + "case_id": "C02_ihp130_sW0.5_sL2", + "circuit_id": "C02", + "pdk": "ihp130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.04, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.04, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.04, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.04, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "d396a29721c76006", + "mirror_pass1": { + "vmin": 0.5894041, + "status": "passed", + "vout_test": 0.89 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.6894 + }, + "_frozen_from": { + "schematic": { + "err": -0.0033235, + "vmin": 0.5894041 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.72 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.993353e-05, + "err": -0.0033235, + "vmin": 0.5894041, + "dev_at_vdd": 0.0005298698, + "gout_t": 4.422629e-07, + "rout_t": 2261795.0, + "vout_test": 0.89, + "rout_nom": 2261795.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 0.3 + }, + { + "case_id": "C02_ihp130_sW1.5_sL1", + "circuit_id": "C02", + "pdk": "ihp130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.52, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.52, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.52, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.52, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "57b50b03a56e4590", + "mirror_pass1": { + "vmin": 0.4307584, + "status": "passed", + "vout_test": 0.82 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.5308 + }, + "_frozen_from": { + "schematic": { + "err": -0.001464, + "vmin": 0.4307584 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.72 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.997072e-05, + "err": -0.001464, + "vmin": 0.4307584, + "dev_at_vdd": 0.004151491, + "gout_t": 3.612603e-07, + "rout_t": 2768095.0, + "vout_test": 0.82, + "rout_nom": 2768095.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 0.7 + }, + { + "case_id": "C02_ihp130_sW1.5_sL1.5", + "circuit_id": "C02", + "pdk": "ihp130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.78, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.78, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.78, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.78, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "3bf56c781ae2513b", + "mirror_pass1": { + "vmin": 0.4297788, + "status": "passed", + "vout_test": 0.81 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.5298 + }, + "_frozen_from": { + "schematic": { + "err": -0.0014615, + "vmin": 0.4297788 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.72 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.997077e-05, + "err": -0.0014615, + "vmin": 0.4297788, + "dev_at_vdd": 0.002586955, + "gout_t": 2.597865e-07, + "rout_t": 3849315.0, + "vout_test": 0.81, + "rout_nom": 3849315.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 0.7 + }, + { + "case_id": "C02_ihp130_sW1.5_sL2", + "circuit_id": "C02", + "pdk": "ihp130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.04, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.04, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.04, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.04, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "3bb1211635a6db28", + "mirror_pass1": { + "vmin": 0.4348501, + "status": "passed", + "vout_test": 0.82 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.5349 + }, + "_frozen_from": { + "schematic": { + "err": -0.0013475, + "vmin": 0.4348501 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.72 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.997305e-05, + "err": -0.0013475, + "vmin": 0.4348501, + "dev_at_vdd": 0.00170769, + "gout_t": 2.036465e-07, + "rout_t": 4910495.0, + "vout_test": 0.82, + "rout_nom": 4910495.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 0.7 + }, + { + "case_id": "C02_ihp130_sW1_sL1", + "circuit_id": "C02", + "pdk": "ihp130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "66e86865cef02a99", + "mirror_pass1": { + "vmin": 0.4684034, + "status": "passed", + "vout_test": 0.83 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.5684 + }, + "_frozen_from": { + "schematic": { + "err": -0.002309, + "vmin": 0.4684034 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.72 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.995382e-05, + "err": -0.002309, + "vmin": 0.4684034, + "dev_at_vdd": 0.002584595, + "gout_t": 3.298376e-07, + "rout_t": 3031809.0, + "vout_test": 0.83, + "rout_nom": 3031809.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 0.4 + }, + { + "case_id": "C02_ihp130_sW1_sL1.5", + "circuit_id": "C02", + "pdk": "ihp130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.78, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.78, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.78, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.78, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "d8de84c95a231086", + "mirror_pass1": { + "vmin": 0.4723216, + "status": "passed", + "vout_test": 0.84 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.5723 + }, + "_frozen_from": { + "schematic": { + "err": -0.001908, + "vmin": 0.4723216 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.72 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.996184e-05, + "err": -0.001908, + "vmin": 0.4723216, + "dev_at_vdd": 0.001451824, + "gout_t": 2.377361e-07, + "rout_t": 4206345.0, + "vout_test": 0.84, + "rout_nom": 4206345.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 0.4 + }, + { + "case_id": "C02_ihp130_sW1_sL2", + "circuit_id": "C02", + "pdk": "ihp130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.04, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.04, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.04, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.04, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "3f0beef46459e717", + "mirror_pass1": { + "vmin": 0.4816118, + "status": "passed", + "vout_test": 0.84 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.5816 + }, + "_frozen_from": { + "schematic": { + "err": -0.001863, + "vmin": 0.4816118 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.72 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.996274e-05, + "err": -0.001863, + "vmin": 0.4816118, + "dev_at_vdd": 0.0008137832, + "gout_t": 1.988411e-07, + "rout_t": 5029141.0, + "vout_test": 0.84, + "rout_nom": 5029141.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 0.5 + }, + { + "case_id": "C02_ihp130_sW2_sL1", + "circuit_id": "C02", + "pdk": "ihp130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "7cd9e3ddd394d92e", + "mirror_pass1": { + "vmin": 0.4077134, + "status": "passed", + "vout_test": 0.8 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.5077 + }, + "_frozen_from": { + "schematic": { + "err": -0.001074, + "vmin": 0.4077134 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.72 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.997852e-05, + "err": -0.001074, + "vmin": 0.4077134, + "dev_at_vdd": 0.005426679, + "gout_t": 3.974781e-07, + "rout_t": 2515868.0, + "vout_test": 0.8, + "rout_nom": 2515868.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 0.8 + }, + { + "case_id": "C02_ihp130_sW2_sL1.5", + "circuit_id": "C02", + "pdk": "ihp130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.78, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.78, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.78, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.78, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "369851ccc7abddea", + "mirror_pass1": { + "vmin": 0.4040129, + "status": "passed", + "vout_test": 0.8 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.504 + }, + "_frozen_from": { + "schematic": { + "err": -0.0010005, + "vmin": 0.4040129 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.72 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.997999e-05, + "err": -0.0010005, + "vmin": 0.4040129, + "dev_at_vdd": 0.003509739, + "gout_t": 2.791383e-07, + "rout_t": 3582464.0, + "vout_test": 0.8, + "rout_nom": 3582464.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 0.9 + }, + { + "case_id": "C02_ihp130_sW2_sL2", + "circuit_id": "C02", + "pdk": "ihp130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.04, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.04, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.04, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.04, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "057857a71ac3d1dc", + "mirror_pass1": { + "vmin": 0.4068016, + "status": "passed", + "vout_test": 0.8 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.5068 + }, + "_frozen_from": { + "schematic": { + "err": -0.001059, + "vmin": 0.4068016 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.72 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.997882e-05, + "err": -0.001059, + "vmin": 0.4068016, + "dev_at_vdd": 0.002429683, + "gout_t": 2.189419e-07, + "rout_t": 4567438.0, + "vout_test": 0.8, + "rout_nom": 4567438.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 0.9 + }, + { + "case_id": "C02_sky130_sW0.5_sL1", + "circuit_id": "C02", + "pdk": "sky130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.3, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.3, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.3, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.3, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "7a0796ed8bbaeaf2", + "mirror_pass1": { + "vmin": 0.742627, + "status": "passed", + "vout_test": 1.27 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.8426 + }, + "_frozen_from": { + "schematic": { + "err": -0.0017955, + "vmin": 0.742627 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.08 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.996409e-05, + "err": -0.0017955, + "vmin": 0.742627, + "dev_at_vdd": 0.0002320793, + "gout_t": 9.266985e-08, + "rout_t": 10791410.0, + "vout_test": 1.27, + "rout_nom": 10791410.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 15.1 + }, + { + "case_id": "C02_sky130_sW0.5_sL1.5", + "circuit_id": "C02", + "pdk": "sky130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.45, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.45, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.45, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.45, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "9962a96c328aa24e", + "mirror_pass1": { + "vmin": 0.7174334, + "status": "passed", + "vout_test": 1.26 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.8174 + }, + "_frozen_from": { + "schematic": { + "err": -0.0013765, + "vmin": 0.7174334 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.08 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.997247e-05, + "err": -0.0013765, + "vmin": 0.7174334, + "dev_at_vdd": 0.0002110897, + "gout_t": 9.573341e-08, + "rout_t": 10445670.0, + "vout_test": 1.26, + "rout_nom": 10445670.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 16.5 + }, + { + "case_id": "C02_sky130_sW0.5_sL2", + "circuit_id": "C02", + "pdk": "sky130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.6, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.6, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.6, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.6, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "e99087ba8803a050", + "mirror_pass1": { + "vmin": 0.710947, + "status": "passed", + "vout_test": 1.26 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.8109 + }, + "_frozen_from": { + "schematic": { + "err": -0.0014165, + "vmin": 0.710947 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.08 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.997167e-05, + "err": -0.0014165, + "vmin": 0.710947, + "dev_at_vdd": 0.0002164835, + "gout_t": 1.435474e-07, + "rout_t": 6966341.0, + "vout_test": 1.26, + "rout_nom": 6966341.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 12.3 + }, + { + "case_id": "C02_sky130_sW1.5_sL1", + "circuit_id": "C02", + "pdk": "sky130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.3, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.3, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.3, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.3, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "9003b1a735973f41", + "mirror_pass1": { + "vmin": 0.6541737, + "status": "passed", + "vout_test": 1.23 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.7542 + }, + "_frozen_from": { + "schematic": { + "err": -0.0013375, + "vmin": 0.6541737 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.08 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.997325e-05, + "err": -0.0013375, + "vmin": 0.6541737, + "dev_at_vdd": 0.000315141, + "gout_t": 7.266066e-08, + "rout_t": 13762720.0, + "vout_test": 1.23, + "rout_nom": 13762720.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 15.9 + }, + { + "case_id": "C02_sky130_sW1.5_sL1.5", + "circuit_id": "C02", + "pdk": "sky130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.45, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.45, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.45, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.45, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "2458f178b486d709", + "mirror_pass1": { + "vmin": 0.6033771, + "status": "passed", + "vout_test": 1.2 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.7034 + }, + "_frozen_from": { + "schematic": { + "err": -0.0007555, + "vmin": 0.6033771 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.08 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.998489e-05, + "err": -0.0007555, + "vmin": 0.6033771, + "dev_at_vdd": 0.0001205313, + "gout_t": 4.32638e-08, + "rout_t": 23114650.0, + "vout_test": 1.2, + "rout_nom": 23114650.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 13.1 + }, + { + "case_id": "C02_sky130_sW1.5_sL2", + "circuit_id": "C02", + "pdk": "sky130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.6, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.6, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.6, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.6, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "6cb15f7df9a0927a", + "mirror_pass1": { + "vmin": 0.5589609, + "status": "passed", + "vout_test": 1.18 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.659 + }, + "_frozen_from": { + "schematic": { + "err": -0.000534, + "vmin": 0.5589609 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.08 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.998932e-05, + "err": -0.000534, + "vmin": 0.5589609, + "dev_at_vdd": 4.010322e-05, + "gout_t": 3.407456e-08, + "rout_t": 29348980.0, + "vout_test": 1.18, + "rout_nom": 29348980.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 12.5 + }, + { + "case_id": "C02_sky130_sW1_sL1", + "circuit_id": "C02", + "pdk": "sky130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "8d0db555bdfc9e9d", + "mirror_pass1": { + "vmin": 0.6808938, + "status": "passed", + "vout_test": 1.24 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.7809 + }, + "_frozen_from": { + "schematic": { + "err": -0.0014555, + "vmin": 0.6808938 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.08 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.997089e-05, + "err": -0.0014555, + "vmin": 0.6808938, + "dev_at_vdd": 0.0001185779, + "gout_t": 7.478576e-08, + "rout_t": 13371760.0, + "vout_test": 1.24, + "rout_nom": 13371760.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 12.5 + }, + { + "case_id": "C02_sky130_sW1_sL1.5", + "circuit_id": "C02", + "pdk": "sky130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "1d181a682fb86f1c", + "mirror_pass1": { + "vmin": 0.636125, + "status": "passed", + "vout_test": 1.22 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.7361 + }, + "_frozen_from": { + "schematic": { + "err": -0.00089, + "vmin": 0.636125 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.08 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.99822e-05, + "err": -0.00089, + "vmin": 0.636125, + "dev_at_vdd": 1.956831e-05, + "gout_t": 5.11016e-08, + "rout_t": 19569280.0, + "vout_test": 1.22, + "rout_nom": 19569280.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 18.9 + }, + { + "case_id": "C02_sky130_sW1_sL2", + "circuit_id": "C02", + "pdk": "sky130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "54c7f706cf7bf208", + "mirror_pass1": { + "vmin": 0.6025103, + "status": "passed", + "vout_test": 1.2 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.7025 + }, + "_frozen_from": { + "schematic": { + "err": -0.000714, + "vmin": 0.6025103 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.08 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.998572e-05, + "err": -0.000714, + "vmin": 0.6025103, + "dev_at_vdd": 2.352138e-05, + "gout_t": 4.94023e-08, + "rout_t": 20244820.0, + "vout_test": 1.2, + "rout_nom": 20244820.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 15.1 + }, + { + "case_id": "C02_sky130_sW2_sL1", + "circuit_id": "C02", + "pdk": "sky130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "ac888ea0c21e788b", + "mirror_pass1": { + "vmin": 0.6378416, + "status": "passed", + "vout_test": 1.22 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.7378 + }, + "_frozen_from": { + "schematic": { + "err": -0.001289, + "vmin": 0.6378416 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.08 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.997422e-05, + "err": -0.001289, + "vmin": 0.6378416, + "dev_at_vdd": 0.0004603069, + "gout_t": 7.354139e-08, + "rout_t": 13597820.0, + "vout_test": 1.22, + "rout_nom": 13597820.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 12.3 + }, + { + "case_id": "C02_sky130_sW2_sL1.5", + "circuit_id": "C02", + "pdk": "sky130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "e4a9c21c3c9a18df", + "mirror_pass1": { + "vmin": 0.5843798, + "status": "passed", + "vout_test": 1.19 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.6844 + }, + "_frozen_from": { + "schematic": { + "err": -0.000684, + "vmin": 0.5843798 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.08 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.998632e-05, + "err": -0.000684, + "vmin": 0.5843798, + "dev_at_vdd": 0.0001858258, + "gout_t": 4.004975e-08, + "rout_t": 24969460.0, + "vout_test": 1.19, + "rout_nom": 24969460.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 12.1 + }, + { + "case_id": "C02_sky130_sW2_sL2", + "circuit_id": "C02", + "pdk": "sky130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "bf6148deeedeb4f6", + "mirror_pass1": { + "vmin": 0.5344892, + "status": "passed", + "vout_test": 1.17 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.6345 + }, + "_frozen_from": { + "schematic": { + "err": -0.0004495, + "vmin": 0.5344892 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.08 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.999101e-05, + "err": -0.0004495, + "vmin": 0.5344892, + "dev_at_vdd": 7.496273e-05, + "gout_t": 2.82494e-08, + "rout_t": 35398980.0, + "vout_test": 1.17, + "rout_nom": 35398980.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 12.2 + }, + { + "case_id": "C03_gf180_sW0.5_sL1", + "circuit_id": "C03", + "pdk": "gf180", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 2.24, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 2.24, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 2.24, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "04496cb3cbee2fda", + "mirror_pass1": { + "vmin": 1.377771, + "status": "passed", + "vout_test": 2.34 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 1.478 + }, + "_frozen_from": { + "schematic": { + "err": -0.016521, + "vmin": 1.377771 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 2.145 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.966958e-05, + "err": -0.016521, + "vmin": 1.377771, + "dev_at_vdd": 0.01645253, + "gout_t": 2.02782e-09, + "rout_t": 493158800.0, + "vout_test": 2.34, + "rout_nom": 493158800.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C03_gf180_sW0.5_sL1.5", + "circuit_id": "C03", + "pdk": "gf180", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 3.36, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 3.36, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 3.36, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "359bc611df7023da", + "mirror_pass1": { + "vmin": 1.583426, + "status": "passed", + "vout_test": 2.44 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 1.683 + }, + "_frozen_from": { + "schematic": { + "err": -0.0168415, + "vmin": 1.583426 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 2.145 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.966317e-05, + "err": -0.0168415, + "vmin": 1.583426, + "dev_at_vdd": 0.01676485, + "gout_t": 3.215138e-09, + "rout_t": 311059700.0, + "vout_test": 2.44, + "rout_nom": 311059700.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 0.2 + }, + { + "case_id": "C03_gf180_sW0.5_sL2", + "circuit_id": "C03", + "pdk": "gf180", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 4.48, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 4.48, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 4.48, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "b921441dd9cb5765", + "mirror_pass1": { + "vmin": 1.765737, + "status": "passed", + "vout_test": 2.53 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 1.866 + }, + "_frozen_from": { + "schematic": { + "err": -0.0192845, + "vmin": 1.765737 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 2.145 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.961431e-05, + "err": -0.0192845, + "vmin": 1.765737, + "dev_at_vdd": 0.01918324, + "gout_t": 6.618019e-09, + "rout_t": 151192900.0, + "vout_test": 2.53, + "rout_nom": 151192900.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 0.2 + }, + { + "case_id": "C03_gf180_sW1.5_sL1", + "circuit_id": "C03", + "pdk": "gf180", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 2.24, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 2.24, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 2.24, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "9b3c48dde945aae0", + "mirror_pass1": { + "vmin": 1.024915, + "status": "passed", + "vout_test": 2.16 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 1.125 + }, + "_frozen_from": { + "schematic": { + "err": -0.0146025, + "vmin": 1.024915 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 2.145 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.970795e-05, + "err": -0.0146025, + "vmin": 1.024915, + "dev_at_vdd": 0.01422239, + "gout_t": 5.411942e-10, + "rout_t": 1847772000.0, + "vout_test": 2.16, + "rout_nom": 1847772000.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 0.3 + }, + { + "case_id": "C03_gf180_sW1.5_sL1.5", + "circuit_id": "C03", + "pdk": "gf180", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 3.36, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 3.36, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 3.36, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "3a06adf7af4eb057", + "mirror_pass1": { + "vmin": 1.12544, + "status": "passed", + "vout_test": 2.21 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 1.225 + }, + "_frozen_from": { + "schematic": { + "err": -0.010751, + "vmin": 1.12544 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 2.145 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.978498e-05, + "err": -0.010751, + "vmin": 1.12544, + "dev_at_vdd": 0.01065515, + "gout_t": 3.989691e-10, + "rout_t": 2506469000.0, + "vout_test": 2.21, + "rout_nom": 2506469000.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 0.3 + }, + { + "case_id": "C03_gf180_sW1.5_sL2", + "circuit_id": "C03", + "pdk": "gf180", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 4.48, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 4.48, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 4.48, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "99ab7f4263734970", + "mirror_pass1": { + "vmin": 1.212092, + "status": "passed", + "vout_test": 2.26 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 1.312 + }, + "_frozen_from": { + "schematic": { + "err": -0.009085, + "vmin": 1.212092 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 2.145 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.98183e-05, + "err": -0.009085, + "vmin": 1.212092, + "dev_at_vdd": 0.009051847, + "gout_t": 3.619841e-10, + "rout_t": 2762560000.0, + "vout_test": 2.26, + "rout_nom": 2762560000.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 0.2 + }, + { + "case_id": "C03_gf180_sW1_sL1", + "circuit_id": "C03", + "pdk": "gf180", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 2.24, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 2.24, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 2.24, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "9db71b9a393b0e44", + "mirror_pass1": { + "vmin": 1.126864, + "status": "passed", + "vout_test": 2.21 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 1.227 + }, + "_frozen_from": { + "schematic": { + "err": -0.014305, + "vmin": 1.126864 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 2.145 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.97139e-05, + "err": -0.014305, + "vmin": 1.126864, + "dev_at_vdd": 0.01415489, + "gout_t": 7.09511e-10, + "rout_t": 1409428000.0, + "vout_test": 2.21, + "rout_nom": 1409428000.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 0.2 + }, + { + "case_id": "C03_gf180_sW1_sL1.5", + "circuit_id": "C03", + "pdk": "gf180", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 3.36, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 3.36, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 3.36, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "0d3aea99f2a4424c", + "mirror_pass1": { + "vmin": 1.255746, + "status": "passed", + "vout_test": 2.28 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 1.356 + }, + "_frozen_from": { + "schematic": { + "err": -0.0112105, + "vmin": 1.255746 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 2.145 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.977579e-05, + "err": -0.0112105, + "vmin": 1.255746, + "dev_at_vdd": 0.01117144, + "gout_t": 6.478086e-10, + "rout_t": 1543692000.0, + "vout_test": 2.28, + "rout_nom": 1543692000.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 0.2 + }, + { + "case_id": "C03_gf180_sW1_sL2", + "circuit_id": "C03", + "pdk": "gf180", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 4.48, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 4.48, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 4.48, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "1324023f18bc0d99", + "mirror_pass1": { + "vmin": 1.367713, + "status": "passed", + "vout_test": 2.33 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 1.468 + }, + "_frozen_from": { + "schematic": { + "err": -0.010186, + "vmin": 1.367713 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 2.145 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.979628e-05, + "err": -0.010186, + "vmin": 1.367713, + "dev_at_vdd": 0.01016059, + "gout_t": 7.13289e-10, + "rout_t": 1402004000.0, + "vout_test": 2.33, + "rout_nom": 1402004000.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 0.2 + }, + { + "case_id": "C03_gf180_sW2_sL1", + "circuit_id": "C03", + "pdk": "gf180", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 2.24, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 2.24, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 2.24, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "499d6f72f1a867a1", + "mirror_pass1": { + "vmin": 0.9661599, + "status": "passed", + "vout_test": 2.13 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 1.066 + }, + "_frozen_from": { + "schematic": { + "err": -0.0151325, + "vmin": 0.9661599 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 2.145 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.969735e-05, + "err": -0.0151325, + "vmin": 0.9661599, + "dev_at_vdd": 0.01448253, + "gout_t": 4.98348e-10, + "rout_t": 2006634000.0, + "vout_test": 2.13, + "rout_nom": 2006634000.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 0.3 + }, + { + "case_id": "C03_gf180_sW2_sL1.5", + "circuit_id": "C03", + "pdk": "gf180", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 3.36, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 3.36, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 3.36, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "4d187a84ed2fa3f7", + "mirror_pass1": { + "vmin": 1.051141, + "status": "passed", + "vout_test": 2.18 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 1.151 + }, + "_frozen_from": { + "schematic": { + "err": -0.0108945, + "vmin": 1.051141 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 2.145 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.978211e-05, + "err": -0.0108945, + "vmin": 1.051141, + "dev_at_vdd": 0.01069933, + "gout_t": 3.293691e-10, + "rout_t": 3036119000.0, + "vout_test": 2.18, + "rout_nom": 3036119000.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 0.3 + }, + { + "case_id": "C03_gf180_sW2_sL2", + "circuit_id": "C03", + "pdk": "gf180", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 4.48, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 4.48, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 2.24, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 4.48, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "92107ce4fee179c1", + "mirror_pass1": { + "vmin": 1.124088, + "status": "passed", + "vout_test": 2.21 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 1.224 + }, + "_frozen_from": { + "schematic": { + "err": -0.008961, + "vmin": 1.124088 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 2.145 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.982078e-05, + "err": -0.008961, + "vmin": 1.124088, + "dev_at_vdd": 0.008892388, + "gout_t": 2.741858e-10, + "rout_t": 3647172000.0, + "vout_test": 2.21, + "rout_nom": 3647172000.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 0.3 + }, + { + "case_id": "C03_ihp130_sW0.5_sL1", + "circuit_id": "C03", + "pdk": "ihp130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 2.08, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 2.08, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 2.08, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "c96ce9ef9e8b9b6c", + "mirror_pass1": { + "vmin": 0.6393236, + "status": "passed", + "vout_test": 0.92 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 0.7393 + }, + "_frozen_from": { + "schematic": { + "err": -0.0699635, + "vmin": 0.6393236 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 0.78 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.860073e-05, + "err": -0.0699635, + "vmin": 0.6393236, + "dev_at_vdd": 0.06921668, + "gout_t": 8.710236e-08, + "rout_t": 11482700.0, + "vout_test": 0.92, + "rout_nom": 11482700.0, + "ok_at_vdd": 0.0 + }, + "presim_s": 0.4 + }, + { + "case_id": "C03_ihp130_sW0.5_sL1.5", + "circuit_id": "C03", + "pdk": "ihp130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 3.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 3.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 3.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "53cef8e23a479779", + "mirror_pass1": { + "vmin": 0.7060432, + "status": "passed", + "vout_test": 0.95 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 0.78 + }, + "_frozen_from": { + "schematic": { + "err": -0.056157, + "vmin": 0.7060432 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 0.78 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.887686e-05, + "err": -0.056157, + "vmin": 0.7060432, + "dev_at_vdd": 0.05519875, + "gout_t": 2.84866e-07, + "rout_t": 3512583.0, + "vout_test": 0.95, + "rout_nom": 3512583.0, + "ok_at_vdd": 0.0 + }, + "presim_s": 0.4 + }, + { + "case_id": "C03_ihp130_sW0.5_sL2", + "circuit_id": "C03", + "pdk": "ihp130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 4.16, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 4.16, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 4.16, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "6a279ddec0850926", + "mirror_pass1": { + "vmin": 0.780093, + "status": "passed", + "vout_test": 0.99 + }, + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "vmin=0.7801 above floor 0.78" + ], + "spec": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 0.78 + }, + "_frozen_from": { + "schematic": { + "err": -0.0488655, + "vmin": 0.780093 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 0.78 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.902269e-05, + "err": -0.0488655, + "vmin": 0.780093, + "dev_at_vdd": 0.04699181, + "gout_t": 5.681386e-07, + "rout_t": 1760134.0, + "vout_test": 0.99, + "rout_nom": 1760134.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 0.4 + }, + { + "case_id": "C03_ihp130_sW1.5_sL1", + "circuit_id": "C03", + "pdk": "ihp130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 2.08, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 2.08, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 2.08, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "a25067b2aa8dc024", + "mirror_pass1": { + "vmin": 0.5052037, + "status": "passed", + "vout_test": 0.85 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 0.6052 + }, + "_frozen_from": { + "schematic": { + "err": -0.0898685, + "vmin": 0.5052037 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 0.78 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.820263e-05, + "err": -0.0898685, + "vmin": 0.5052037, + "dev_at_vdd": 0.08867583, + "gout_t": 8.355636e-08, + "rout_t": 11968010.0, + "vout_test": 0.85, + "rout_nom": 11968010.0, + "ok_at_vdd": 0.0 + }, + "presim_s": 1.0 + }, + { + "case_id": "C03_ihp130_sW1.5_sL1.5", + "circuit_id": "C03", + "pdk": "ihp130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 3.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 3.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 3.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "f1d23c8922edb903", + "mirror_pass1": { + "vmin": 0.5064997, + "status": "passed", + "vout_test": 0.85 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 0.6065 + }, + "_frozen_from": { + "schematic": { + "err": -0.0718915, + "vmin": 0.5064997 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 0.78 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.856217e-05, + "err": -0.0718915, + "vmin": 0.5064997, + "dev_at_vdd": 0.07107148, + "gout_t": 5.92658e-08, + "rout_t": 16873230.0, + "vout_test": 0.85, + "rout_nom": 16873230.0, + "ok_at_vdd": 0.0 + }, + "presim_s": 1.0 + }, + { + "case_id": "C03_ihp130_sW1.5_sL2", + "circuit_id": "C03", + "pdk": "ihp130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 4.16, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 4.16, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 4.16, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "e624a962708bc8f8", + "mirror_pass1": { + "vmin": 0.5321486, + "status": "passed", + "vout_test": 0.87 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 0.6321 + }, + "_frozen_from": { + "schematic": { + "err": -0.0612935, + "vmin": 0.5321486 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 0.78 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.877413e-05, + "err": -0.0612935, + "vmin": 0.5321486, + "dev_at_vdd": 0.06069959, + "gout_t": 4.672538e-08, + "rout_t": 21401650.0, + "vout_test": 0.87, + "rout_nom": 21401650.0, + "ok_at_vdd": 0.0 + }, + "presim_s": 1.0 + }, + { + "case_id": "C03_ihp130_sW1_sL1", + "circuit_id": "C03", + "pdk": "ihp130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 2.08, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 2.08, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 2.08, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "b5e3471e68d0d905", + "mirror_pass1": { + "vmin": 0.5380896, + "status": "passed", + "vout_test": 0.87 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 0.6381 + }, + "_frozen_from": { + "schematic": { + "err": -0.081922, + "vmin": 0.5380896 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 0.78 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.836156e-05, + "err": -0.081922, + "vmin": 0.5380896, + "dev_at_vdd": 0.08094295, + "gout_t": 7.393831e-08, + "rout_t": 13524790.0, + "vout_test": 0.87, + "rout_nom": 13524790.0, + "ok_at_vdd": 0.0 + }, + "presim_s": 0.7 + }, + { + "case_id": "C03_ihp130_sW1_sL1.5", + "circuit_id": "C03", + "pdk": "ihp130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 3.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 3.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 3.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "5b9e18c661300475", + "mirror_pass1": { + "vmin": 0.5642074, + "status": "passed", + "vout_test": 0.88 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 0.6642 + }, + "_frozen_from": { + "schematic": { + "err": -0.065394, + "vmin": 0.5642074 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 0.78 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.869212e-05, + "err": -0.065394, + "vmin": 0.5642074, + "dev_at_vdd": 0.06472306, + "gout_t": 5.646776e-08, + "rout_t": 17709660.0, + "vout_test": 0.88, + "rout_nom": 17709660.0, + "ok_at_vdd": 0.0 + }, + "presim_s": 0.7 + }, + { + "case_id": "C03_ihp130_sW1_sL2", + "circuit_id": "C03", + "pdk": "ihp130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 4.16, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 4.16, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 4.16, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "b6debe16c4743f34", + "mirror_pass1": { + "vmin": 0.6032443, + "status": "passed", + "vout_test": 0.9 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 0.7032 + }, + "_frozen_from": { + "schematic": { + "err": -0.0557205, + "vmin": 0.6032443 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 0.78 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.888559e-05, + "err": -0.0557205, + "vmin": 0.6032443, + "dev_at_vdd": 0.05519737, + "gout_t": 6.220546e-08, + "rout_t": 16075760.0, + "vout_test": 0.9, + "rout_nom": 16075760.0, + "ok_at_vdd": 0.0 + }, + "presim_s": 0.7 + }, + { + "case_id": "C03_ihp130_sW2_sL1", + "circuit_id": "C03", + "pdk": "ihp130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 2.08, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 2.08, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 2.08, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "2d4e356bd97263f8", + "mirror_pass1": { + "vmin": 0.5092047, + "status": "passed", + "vout_test": 0.85 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 0.6092 + }, + "_frozen_from": { + "schematic": { + "err": -0.0958015, + "vmin": 0.5092047 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 0.78 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.808397e-05, + "err": -0.0958015, + "vmin": 0.5092047, + "dev_at_vdd": 0.09448254, + "gout_t": 9.114522e-08, + "rout_t": 10971530.0, + "vout_test": 0.85, + "rout_nom": 10971530.0, + "ok_at_vdd": 0.0 + }, + "presim_s": 1.3 + }, + { + "case_id": "C03_ihp130_sW2_sL1.5", + "circuit_id": "C03", + "pdk": "ihp130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 3.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 3.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 3.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "05c2eb893fe84728", + "mirror_pass1": { + "vmin": 0.4735241, + "status": "passed", + "vout_test": 0.84 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 0.5735 + }, + "_frozen_from": { + "schematic": { + "err": -0.076829, + "vmin": 0.4735241 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 0.78 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.846342e-05, + "err": -0.076829, + "vmin": 0.4735241, + "dev_at_vdd": 0.0759008, + "gout_t": 6.412233e-08, + "rout_t": 15595190.0, + "vout_test": 0.84, + "rout_nom": 15595190.0, + "ok_at_vdd": 0.0 + }, + "presim_s": 1.3 + }, + { + "case_id": "C03_ihp130_sW2_sL2", + "circuit_id": "C03", + "pdk": "ihp130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 4.16, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 4.16, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 2.08, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 4.16, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "74f359119e81f700", + "mirror_pass1": { + "vmin": 0.4913955, + "status": "passed", + "vout_test": 0.85 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 0.5914 + }, + "_frozen_from": { + "schematic": { + "err": -0.0655975, + "vmin": 0.4913955 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 0.78 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.868805e-05, + "err": -0.0655975, + "vmin": 0.4913955, + "dev_at_vdd": 0.06490927, + "gout_t": 4.967715e-08, + "rout_t": 20130090.0, + "vout_test": 0.85, + "rout_nom": 20130090.0, + "ok_at_vdd": 0.0 + }, + "presim_s": 1.5 + }, + { + "case_id": "C03_sky130_sW0.5_sL1", + "circuit_id": "C03", + "pdk": "sky130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.2, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.2, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.2, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "284a079fce6f5248", + "mirror_pass1": { + "vmin": 0.944352, + "status": "passed", + "vout_test": 1.37 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 1.044 + }, + "_frozen_from": { + "schematic": { + "err": -0.0576435, + "vmin": 0.944352 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 1.1700000000000002 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.884713e-05, + "err": -0.0576435, + "vmin": 0.944352, + "dev_at_vdd": 0.05727683, + "gout_t": 2.995324e-08, + "rout_t": 33389350.0, + "vout_test": 1.37, + "rout_nom": 33389350.0, + "ok_at_vdd": 0.0 + }, + "presim_s": 19.2 + }, + { + "case_id": "C03_sky130_sW0.5_sL1.5", + "circuit_id": "C03", + "pdk": "sky130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.8, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.8, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.8, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "a82dc8d176e418ba", + "mirror_pass1": { + "vmin": 1.018252, + "status": "passed", + "vout_test": 1.41 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 1.118 + }, + "_frozen_from": { + "schematic": { + "err": -0.053443, + "vmin": 1.018252 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 1.1700000000000002 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.893114e-05, + "err": -0.053443, + "vmin": 1.018252, + "dev_at_vdd": 0.05303414, + "gout_t": 4.862011e-08, + "rout_t": 20575750.0, + "vout_test": 1.41, + "rout_nom": 20575750.0, + "ok_at_vdd": 0.0 + }, + "presim_s": 20.8 + }, + { + "case_id": "C03_sky130_sW0.5_sL2", + "circuit_id": "C03", + "pdk": "sky130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 2.4, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 2.4, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 2.4, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "5f86b0c35341a71a", + "mirror_pass1": { + "vmin": 1.092726, + "status": "passed", + "vout_test": 1.45 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 1.17 + }, + "_frozen_from": { + "schematic": { + "err": -0.0451645, + "vmin": 1.092726 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 1.1700000000000002 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.909671e-05, + "err": -0.0451645, + "vmin": 1.092726, + "dev_at_vdd": 0.04462777, + "gout_t": 1.082491e-07, + "rout_t": 9243799.0, + "vout_test": 1.45, + "rout_nom": 9243799.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 19.5 + }, + { + "case_id": "C03_sky130_sW1.5_sL1", + "circuit_id": "C03", + "pdk": "sky130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.2, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.2, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.2, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "74eae343c490b5c3", + "mirror_pass1": { + "vmin": 0.7792565, + "status": "passed", + "vout_test": 1.29 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 0.8793 + }, + "_frozen_from": { + "schematic": { + "err": -0.067462, + "vmin": 0.7792565 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 1.1700000000000002 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.865076e-05, + "err": -0.067462, + "vmin": 0.7792565, + "dev_at_vdd": 0.06715289, + "gout_t": 1.602318e-08, + "rout_t": 62410420.0, + "vout_test": 1.29, + "rout_nom": 62410420.0, + "ok_at_vdd": 0.0 + }, + "presim_s": 12.7 + }, + { + "case_id": "C03_sky130_sW1.5_sL1.5", + "circuit_id": "C03", + "pdk": "sky130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.8, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.8, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.8, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "ad62c7bd943afc81", + "mirror_pass1": { + "vmin": 0.8145786, + "status": "passed", + "vout_test": 1.31 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 0.9146 + }, + "_frozen_from": { + "schematic": { + "err": -0.064108, + "vmin": 0.8145786 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 1.1700000000000002 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.871784e-05, + "err": -0.064108, + "vmin": 0.8145786, + "dev_at_vdd": 0.06380109, + "gout_t": 1.627051e-08, + "rout_t": 61461280.0, + "vout_test": 1.31, + "rout_nom": 61461280.0, + "ok_at_vdd": 0.0 + }, + "presim_s": 12.4 + }, + { + "case_id": "C03_sky130_sW1.5_sL2", + "circuit_id": "C03", + "pdk": "sky130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 2.4, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 2.4, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 2.4, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "2cd6f97b3bbc6b7d", + "mirror_pass1": { + "vmin": 0.8451094, + "status": "passed", + "vout_test": 1.32 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 0.9451 + }, + "_frozen_from": { + "schematic": { + "err": -0.053092, + "vmin": 0.8451094 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 1.1700000000000002 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.893816e-05, + "err": -0.053092, + "vmin": 0.8451094, + "dev_at_vdd": 0.05285044, + "gout_t": 1.405508e-08, + "rout_t": 71151010.0, + "vout_test": 1.32, + "rout_nom": 71151010.0, + "ok_at_vdd": 0.0 + }, + "presim_s": 12.4 + }, + { + "case_id": "C03_sky130_sW1_sL1", + "circuit_id": "C03", + "pdk": "sky130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.2, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.2, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.2, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "23d4d2bffd33d197", + "mirror_pass1": { + "vmin": 0.8278448, + "status": "passed", + "vout_test": 1.31 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 0.9278 + }, + "_frozen_from": { + "schematic": { + "err": -0.0631645, + "vmin": 0.8278448 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 1.1700000000000002 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.873671e-05, + "err": -0.0631645, + "vmin": 0.8278448, + "dev_at_vdd": 0.06285188, + "gout_t": 1.813997e-08, + "rout_t": 55127510.0, + "vout_test": 1.31, + "rout_nom": 55127510.0, + "ok_at_vdd": 0.0 + }, + "presim_s": 14.1 + }, + { + "case_id": "C03_sky130_sW1_sL1.5", + "circuit_id": "C03", + "pdk": "sky130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.8, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.8, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.8, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "291f97cbcd18eec2", + "mirror_pass1": { + "vmin": 0.8733776, + "status": "passed", + "vout_test": 1.34 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 0.9734 + }, + "_frozen_from": { + "schematic": { + "err": -0.059348, + "vmin": 0.8733776 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 1.1700000000000002 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.881304e-05, + "err": -0.059348, + "vmin": 0.8733776, + "dev_at_vdd": 0.05904376, + "gout_t": 1.907403e-08, + "rout_t": 52428960.0, + "vout_test": 1.34, + "rout_nom": 52428960.0, + "ok_at_vdd": 0.0 + }, + "presim_s": 15.5 + }, + { + "case_id": "C03_sky130_sW1_sL2", + "circuit_id": "C03", + "pdk": "sky130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 2.4, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 2.4, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 2.4, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "0aefeceb302adf47", + "mirror_pass1": { + "vmin": 0.9165947, + "status": "passed", + "vout_test": 1.36 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 1.017 + }, + "_frozen_from": { + "schematic": { + "err": -0.0493415, + "vmin": 0.9165947 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 1.1700000000000002 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.901317e-05, + "err": -0.0493415, + "vmin": 0.9165947, + "dev_at_vdd": 0.04909291, + "gout_t": 1.889715e-08, + "rout_t": 52922570.0, + "vout_test": 1.36, + "rout_nom": 52922570.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 20.7 + }, + { + "case_id": "C03_sky130_sW2_sL1", + "circuit_id": "C03", + "pdk": "sky130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.2, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.2, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.2, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "56ac4688540b57a4", + "mirror_pass1": { + "vmin": 0.7507061, + "status": "passed", + "vout_test": 1.28 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 0.8507 + }, + "_frozen_from": { + "schematic": { + "err": -0.070958, + "vmin": 0.7507061 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 1.1700000000000002 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.858084e-05, + "err": -0.070958, + "vmin": 0.7507061, + "dev_at_vdd": 0.07064225, + "gout_t": 1.540003e-08, + "rout_t": 64935570.0, + "vout_test": 1.28, + "rout_nom": 64935570.0, + "ok_at_vdd": 0.0 + }, + "presim_s": 12.2 + }, + { + "case_id": "C03_sky130_sW2_sL1.5", + "circuit_id": "C03", + "pdk": "sky130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.8, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.8, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.8, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "5344a87aa48d26c8", + "mirror_pass1": { + "vmin": 0.7809883, + "status": "passed", + "vout_test": 1.29 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 0.881 + }, + "_frozen_from": { + "schematic": { + "err": -0.068048, + "vmin": 0.7809883 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 1.1700000000000002 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.863904e-05, + "err": -0.068048, + "vmin": 0.7809883, + "dev_at_vdd": 0.06772667, + "gout_t": 1.563482e-08, + "rout_t": 63960370.0, + "vout_test": 1.29, + "rout_nom": 63960370.0, + "ok_at_vdd": 0.0 + }, + "presim_s": 12.3 + }, + { + "case_id": "C03_sky130_sW2_sL2", + "circuit_id": "C03", + "pdk": "sky130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 2.4, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 2.4, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 1.2, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 2.4, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "75af9ca34d6fb9fd", + "mirror_pass1": { + "vmin": 0.8043552, + "status": "passed", + "vout_test": 1.3 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 0.9044 + }, + "_frozen_from": { + "schematic": { + "err": -0.0562665, + "vmin": 0.8043552 + }, + "floors": { + "err": { + "abs_max": 0.1 + }, + "vmin": { + "max": 1.1700000000000002 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.887467e-05, + "err": -0.0562665, + "vmin": 0.8043552, + "dev_at_vdd": 0.05602016, + "gout_t": 1.274017e-08, + "rout_t": 78492470.0, + "vout_test": 1.3, + "rout_nom": 78492470.0, + "ok_at_vdd": 0.0 + }, + "presim_s": 12.4 + }, + { + "case_id": "C04_gf180_sW0.5_sL1", + "circuit_id": "C04", + "pdk": "gf180", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "single", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.56, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "9720970bb1f7ebca", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 31.98 + }, + "f3db": { + "min": 1364000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 34.97751, + "f3db": 2273552.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 1.096757, + "vin0": 1.096757, + "idd": 2.077341e-05, + "gain_lf": 34.97751, + "f3db": 2273552.0, + "ugf": 127908600.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C04_gf180_sW0.5_sL1.5", + "circuit_id": "C04", + "pdk": "gf180", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "single", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.84, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "226afc0f6f4023b3", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 34.71 + }, + "f3db": { + "min": 1000000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 37.71032, + "f3db": 1338737.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 1.20415, + "vin0": 1.20415, + "idd": 2.048337e-05, + "gain_lf": 37.71032, + "f3db": 1338737.0, + "ugf": 103237300.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C04_gf180_sW0.5_sL2", + "circuit_id": "C04", + "pdk": "gf180", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "single", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.12, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "ff8468bd000fb2c3", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "f3db=9.953e+05 below floor 1e+06" + ], + "spec": { + "gain_lf": { + "min": 36.06 + }, + "f3db": { + "min": 1000000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 39.06276, + "f3db": 995268.4 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 1.295546, + "vin0": 1.295546, + "idd": 2.048308e-05, + "gain_lf": 39.06276, + "f3db": 995268.4, + "ugf": 89599820.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C04_gf180_sW1.5_sL1", + "circuit_id": "C04", + "pdk": "gf180", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "single", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.56, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "834dbe4cf1c65d82", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 35.44 + }, + "f3db": { + "min": 1608000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 38.43946, + "f3db": 2679591.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.9008991, + "vin0": 0.9008991, + "idd": 2.180169e-05, + "gain_lf": 38.43946, + "f3db": 2679591.0, + "ugf": 224676300.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C04_gf180_sW1.5_sL1.5", + "circuit_id": "C04", + "pdk": "gf180", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "single", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.84, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "b7e1596f18559e41", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 38.7 + }, + "f3db": { + "min": 1000000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 41.70021, + "f3db": 1455363.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.9561736, + "vin0": 0.9561736, + "idd": 2.058442e-05, + "gain_lf": 41.70021, + "f3db": 1455363.0, + "ugf": 177737900.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C04_gf180_sW1.5_sL2", + "circuit_id": "C04", + "pdk": "gf180", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "single", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.12, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "ac9c00f6ba32d8e6", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 40.26 + }, + "f3db": { + "min": 1000000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 43.26178, + "f3db": 1043772.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 1.00573, + "vin0": 1.00573, + "idd": 2.025167e-05, + "gain_lf": 43.26178, + "f3db": 1043772.0, + "ugf": 152947800.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C04_gf180_sW1_sL1", + "circuit_id": "C04", + "pdk": "gf180", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "single", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "1de1531581fde416", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 34.34 + }, + "f3db": { + "min": 1506000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 37.34011, + "f3db": 2510374.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.9591849, + "vin0": 0.9591849, + "idd": 2.124699e-05, + "gain_lf": 37.34011, + "f3db": 2510374.0, + "ugf": 185593900.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C04_gf180_sW1_sL1.5", + "circuit_id": "C04", + "pdk": "gf180", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "single", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "eb31a3b03ab1e1f1", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 37.42 + }, + "f3db": { + "min": 1000000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 40.4152, + "f3db": 1400763.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 1.029848, + "vin0": 1.029848, + "idd": 2.043086e-05, + "gain_lf": 40.4152, + "f3db": 1400763.0, + "ugf": 147613000.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C04_gf180_sW1_sL2", + "circuit_id": "C04", + "pdk": "gf180", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "single", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "7728496ffc2a1c2e", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 38.93 + }, + "f3db": { + "min": 1000000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 41.92742, + "f3db": 1013506.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 1.091967, + "vin0": 1.091967, + "idd": 2.02447e-05, + "gain_lf": 41.92742, + "f3db": 1013506.0, + "ugf": 127029000.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C04_gf180_sW2_sL1", + "circuit_id": "C04", + "pdk": "gf180", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "single", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "f26ae743bd8c1153", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 36.1 + }, + "f3db": { + "min": 1682000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 39.1024, + "f3db": 2803340.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.8664028, + "vin0": 0.8664028, + "idd": 2.23145e-05, + "gain_lf": 39.1024, + "f3db": 2803340.0, + "ugf": 254032700.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C04_gf180_sW2_sL1.5", + "circuit_id": "C04", + "pdk": "gf180", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "single", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "2abf8061df3bc753", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 39.49 + }, + "f3db": { + "min": 1000000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 42.49499, + "f3db": 1495316.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.9128714, + "vin0": 0.9128714, + "idd": 2.077108e-05, + "gain_lf": 42.49499, + "f3db": 1495316.0, + "ugf": 200476500.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C04_gf180_sW2_sL2", + "circuit_id": "C04", + "pdk": "gf180", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "single", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "d9962e9042c54950", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 41.09 + }, + "f3db": { + "min": 1000000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 44.09058, + "f3db": 1067028.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.9551104, + "vin0": 0.9551104, + "idd": 2.031433e-05, + "gain_lf": 44.09058, + "f3db": 1067028.0, + "ugf": 172375100.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C04_ihp130_sW0.5_sL1", + "circuit_id": "C04", + "pdk": "ihp130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "single", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.26, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.26, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "0945adf3afbcf5e8", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 20.51 + }, + "f3db": { + "min": 11260000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 23.50605, + "f3db": 18772100.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.5445191, + "vin0": 0.5445191, + "idd": 2.10582e-05, + "gain_lf": 23.50605, + "f3db": 18772100.0, + "ugf": 281196600.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C04_ihp130_sW0.5_sL1.5", + "circuit_id": "C04", + "pdk": "ihp130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "single", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.39, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "8b813574283ad134", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 21.77 + }, + "f3db": { + "min": 8830000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 24.76924, + "f3db": 14717410.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.5453245, + "vin0": 0.5453245, + "idd": 2.18489e-05, + "gain_lf": 24.76924, + "f3db": 14717410.0, + "ugf": 255338500.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C04_ihp130_sW0.5_sL2", + "circuit_id": "C04", + "pdk": "ihp130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "single", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.52, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "4ae5b357404368b3", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 22.43 + }, + "f3db": { + "min": 7444000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 25.43384, + "f3db": 12406650.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.5593728, + "vin0": 0.5593728, + "idd": 2.216823e-05, + "gain_lf": 25.43384, + "f3db": 12406650.0, + "ugf": 232659000.0 + }, + "presim_s": 0.2 + }, + { + "case_id": "C04_ihp130_sW1.5_sL1", + "circuit_id": "C04", + "pdk": "ihp130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "single", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.26, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.26, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "49cbe5fbb3ed1378", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 20.97 + }, + "f3db": { + "min": 15580000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 23.97213, + "f3db": 25973440.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.4506865, + "vin0": 0.4506865, + "idd": 2.233765e-05, + "gain_lf": 23.97213, + "f3db": 25973440.0, + "ugf": 412146200.0 + }, + "presim_s": 0.2 + }, + { + "case_id": "C04_ihp130_sW1.5_sL1.5", + "circuit_id": "C04", + "pdk": "ihp130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "single", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.39, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.39, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "787e72fcac157b6f", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 22.43 + }, + "f3db": { + "min": 12350000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 25.43194, + "f3db": 20582690.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.4396949, + "vin0": 0.4396949, + "idd": 2.337619e-05, + "gain_lf": 25.43194, + "f3db": 20582690.0, + "ugf": 387849100.0 + }, + "presim_s": 0.2 + }, + { + "case_id": "C04_ihp130_sW1.5_sL2", + "circuit_id": "C04", + "pdk": "ihp130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "single", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.52, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.52, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "37f0005d77350767", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 23.3 + }, + "f3db": { + "min": 10380000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 26.29534, + "f3db": 17307010.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.4427213, + "vin0": 0.4427213, + "idd": 2.382704e-05, + "gain_lf": 26.29534, + "f3db": 17307010.0, + "ugf": 361730700.0 + }, + "presim_s": 0.2 + }, + { + "case_id": "C04_ihp130_sW1_sL1", + "circuit_id": "C04", + "pdk": "ihp130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "single", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.26, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "4c5bd60ff54f2cd1", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 20.89 + }, + "f3db": { + "min": 13910000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 23.89137, + "f3db": 23180350.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.4813387, + "vin0": 0.4813387, + "idd": 2.189247e-05, + "gain_lf": 23.89137, + "f3db": 23180350.0, + "ugf": 363696500.0 + }, + "presim_s": 0.2 + }, + { + "case_id": "C04_ihp130_sW1_sL1.5", + "circuit_id": "C04", + "pdk": "ihp130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "single", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "67bdfb9a5ac76ac4", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 22.3 + }, + "f3db": { + "min": 10950000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 25.30474, + "f3db": 18257830.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.4740232, + "vin0": 0.4740232, + "idd": 2.286579e-05, + "gain_lf": 25.30474, + "f3db": 18257830.0, + "ugf": 337900800.0 + }, + "presim_s": 0.2 + }, + { + "case_id": "C04_ihp130_sW1_sL2", + "circuit_id": "C04", + "pdk": "ihp130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "single", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "20581ff512e96703", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 23.13 + }, + "f3db": { + "min": 9182000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 26.13388, + "f3db": 15303070.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.4804788, + "vin0": 0.4804788, + "idd": 2.327906e-05, + "gain_lf": 26.13388, + "f3db": 15303070.0, + "ugf": 311941800.0 + }, + "presim_s": 0.2 + }, + { + "case_id": "C04_ihp130_sW2_sL1", + "circuit_id": "C04", + "pdk": "ihp130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "single", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.26, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "eaf68bc3d5cb10f1", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 21.0 + }, + "f3db": { + "min": 16720000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 23.99546, + "f3db": 27870130.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.4312207, + "vin0": 0.4312207, + "idd": 2.263739e-05, + "gain_lf": 23.99546, + "f3db": 27870130.0, + "ugf": 444095400.0 + }, + "presim_s": 0.2 + }, + { + "case_id": "C04_ihp130_sW2_sL1.5", + "circuit_id": "C04", + "pdk": "ihp130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "single", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "22f808f4000767ba", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 22.48 + }, + "f3db": { + "min": 13320000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 25.47899, + "f3db": 22192700.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.4180287, + "vin0": 0.4180287, + "idd": 2.370763e-05, + "gain_lf": 25.47899, + "f3db": 22192700.0, + "ugf": 422939400.0 + }, + "presim_s": 0.3 + }, + { + "case_id": "C04_ihp130_sW2_sL2", + "circuit_id": "C04", + "pdk": "ihp130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "single", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "a48b30eaf5be6695", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 23.36 + }, + "f3db": { + "min": 11230000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 26.35756, + "f3db": 18722290.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.4190026, + "vin0": 0.4190026, + "idd": 2.418103e-05, + "gain_lf": 26.35756, + "f3db": 18722290.0, + "ugf": 397053400.0 + }, + "presim_s": 0.3 + }, + { + "case_id": "C04_sky130_sW0.5_sL1", + "circuit_id": "C04", + "pdk": "sky130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "single", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.3, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "acfabf7c9971dc41", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 24.83 + }, + "f3db": { + "min": 7233000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 27.83126, + "f3db": 12054280.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.9178438, + "vin0": 0.9178438, + "idd": 2.828317e-05, + "gain_lf": 27.83126, + "f3db": 12054280.0, + "ugf": 297935000.0 + }, + "presim_s": 11.0 + }, + { + "case_id": "C04_sky130_sW0.5_sL1.5", + "circuit_id": "C04", + "pdk": "sky130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "single", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.45, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "db9070de99473313", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 26.29 + }, + "f3db": { + "min": 4832000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 29.28869, + "f3db": 8053563.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.9562723, + "vin0": 0.9562723, + "idd": 2.728845e-05, + "gain_lf": 29.28869, + "f3db": 8053563.0, + "ugf": 235469500.0 + }, + "presim_s": 7.2 + }, + { + "case_id": "C04_sky130_sW0.5_sL2", + "circuit_id": "C04", + "pdk": "sky130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "single", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.6, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "9c00386f50a410f9", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 26.53 + }, + "f3db": { + "min": 3995000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 29.53157, + "f3db": 6657604.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 1.001204, + "vin0": 1.001204, + "idd": 2.708523e-05, + "gain_lf": 29.53157, + "f3db": 6657604.0, + "ugf": 199892300.0 + }, + "presim_s": 9.2 + }, + { + "case_id": "C04_sky130_sW1.5_sL1", + "circuit_id": "C04", + "pdk": "sky130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "single", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.3, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.3, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "44601873b4d9e32b", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 26.71 + }, + "f3db": { + "min": 12390000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 29.70515, + "f3db": 20647140.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.8363995, + "vin0": 0.8363995, + "idd": 4.41524e-05, + "gain_lf": 29.70515, + "f3db": 20647140.0, + "ugf": 633062300.0 + }, + "presim_s": 10.9 + }, + { + "case_id": "C04_sky130_sW1.5_sL1.5", + "circuit_id": "C04", + "pdk": "sky130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "single", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.45, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.45, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "7e3a8751fae6c89a", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 29.27 + }, + "f3db": { + "min": 7205000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 32.26552, + "f3db": 12008180.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.8482126, + "vin0": 0.8482126, + "idd": 3.951739e-05, + "gain_lf": 32.26552, + "f3db": 12008180.0, + "ugf": 495057200.0 + }, + "presim_s": 10.1 + }, + { + "case_id": "C04_sky130_sW1.5_sL2", + "circuit_id": "C04", + "pdk": "sky130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "single", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.6, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.6, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "51bc1411ed2fbe23", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 30.84 + }, + "f3db": { + "min": 5083000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 33.84283, + "f3db": 8471881.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.8702655, + "vin0": 0.8702655, + "idd": 3.779692e-05, + "gain_lf": 33.84283, + "f3db": 8471881.0, + "ugf": 419619300.0 + }, + "presim_s": 10.3 + }, + { + "case_id": "C04_sky130_sW1_sL1", + "circuit_id": "C04", + "pdk": "sky130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "single", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "1cf81ad6c2ef8819", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 26.15 + }, + "f3db": { + "min": 10050000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 29.1507, + "f3db": 16754670.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.8624328, + "vin0": 0.8624328, + "idd": 3.714779e-05, + "gain_lf": 29.1507, + "f3db": 16754670.0, + "ugf": 482189600.0 + }, + "presim_s": 8.1 + }, + { + "case_id": "C04_sky130_sW1_sL1.5", + "circuit_id": "C04", + "pdk": "sky130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "single", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "98c26f7ec9445349", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 28.39 + }, + "f3db": { + "min": 6074000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 31.38694, + "f3db": 10124020.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.8813821, + "vin0": 0.8813821, + "idd": 3.399709e-05, + "gain_lf": 31.38694, + "f3db": 10124020.0, + "ugf": 377153400.0 + }, + "presim_s": 8.3 + }, + { + "case_id": "C04_sky130_sW1_sL2", + "circuit_id": "C04", + "pdk": "sky130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "single", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "dd0f8ae02d0c0fa7", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 29.6 + }, + "f3db": { + "min": 4465000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 32.59777, + "f3db": 7441151.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.9094343, + "vin0": 0.9094343, + "idd": 3.282374e-05, + "gain_lf": 32.59777, + "f3db": 7441151.0, + "ugf": 318398700.0 + }, + "presim_s": 7.0 + }, + { + "case_id": "C04_sky130_sW2_sL1", + "circuit_id": "C04", + "pdk": "sky130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "single", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "7f8e4b176acbfb40", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 27.03 + }, + "f3db": { + "min": 14350000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 30.03456, + "f3db": 23917820.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.8195053, + "vin0": 0.8195053, + "idd": 4.989e-05, + "gain_lf": 30.03456, + "f3db": 23917820.0, + "ugf": 763914300.0 + }, + "presim_s": 8.1 + }, + { + "case_id": "C04_sky130_sW2_sL1.5", + "circuit_id": "C04", + "pdk": "sky130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "single", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "4e00250019e951d1", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 29.79 + }, + "f3db": { + "min": 8176000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 32.79353, + "f3db": 13626050.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.8275789, + "vin0": 0.8275789, + "idd": 4.41498e-05, + "gain_lf": 32.79353, + "f3db": 13626050.0, + "ugf": 598776900.0 + }, + "presim_s": 8.7 + }, + { + "case_id": "C04_sky130_sW2_sL2", + "circuit_id": "C04", + "pdk": "sky130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "single", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "1a815ffbe3043411", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 31.59 + }, + "f3db": { + "min": 5641000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 34.59165, + "f3db": 9401574.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.8465248, + "vin0": 0.8465248, + "idd": 4.208694e-05, + "gain_lf": 34.59165, + "f3db": 9401574.0, + "ugf": 508469700.0 + }, + "presim_s": 10.4 + }, + { + "case_id": "C05_gf180_sW0.5_sL1", + "circuit_id": "C05", + "pdk": "gf180", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "follower", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.56, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "010cd44721340082", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_at_nom": { + "min": 0.6052 + }, + "f3db": { + "min": 28090000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.6551654, + "f3db": 46820220.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.7461246, + "idd": 5.820329e-05, + "gain_at_nom": 0.6551654, + "vout_at_nom": 0.7461246, + "vin_lo": 1.266606, + "vin_hi": 1.266606, + "gain_lf": -3.67227, + "f3db": 46820220.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C05_gf180_sW0.5_sL1.5", + "circuit_id": "C05", + "pdk": "gf180", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "follower", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.84, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "de0f3d880667d197", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 23260000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.6176683, + "f3db": 38759890.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.6577102, + "idd": 5.325655e-05, + "gain_at_nom": 0.6176683, + "vout_at_nom": 0.6577104, + "vin_lo": 1.500472, + "vin_hi": 1.500472, + "gain_lf": -4.184004, + "f3db": 38759890.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C05_gf180_sW0.5_sL2", + "circuit_id": "C05", + "pdk": "gf180", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "follower", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.12, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "bb0d0563348d42f5", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "gain_at_nom=0.5874 below floor 0.6" + ], + "spec": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 20580000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.5874089, + "f3db": 34292100.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.5940654, + "idd": 4.976311e-05, + "gain_at_nom": 0.5874089, + "vout_at_nom": 0.5940654, + "vin_lo": 1.703668, + "vin_hi": 1.703668, + "gain_lf": -4.620147, + "f3db": 34292100.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C05_gf180_sW1.5_sL1", + "circuit_id": "C05", + "pdk": "gf180", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "follower", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.56, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "4e7e8f3c2e1d6706", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_at_nom": { + "min": 0.6763 + }, + "f3db": { + "min": 51110000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.7263237, + "f3db": 85187880.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.9170634, + "idd": 6.834132e-05, + "gain_at_nom": 0.7263237, + "vout_at_nom": 0.9170635, + "vin_lo": 0.9501328, + "vin_hi": 0.9501328, + "gain_lf": -2.776847, + "f3db": 85187880.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C05_gf180_sW1.5_sL1.5", + "circuit_id": "C05", + "pdk": "gf180", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "follower", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.84, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "0aadb8d8802ec67b", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_at_nom": { + "min": 0.6498 + }, + "f3db": { + "min": 41210000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.6997546, + "f3db": 68675720.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.8545068, + "idd": 6.312905e-05, + "gain_at_nom": 0.6997546, + "vout_at_nom": 0.8545068, + "vin_lo": 1.046353, + "vin_hi": 1.046353, + "gain_lf": -3.10038, + "f3db": 68675720.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C05_gf180_sW1.5_sL2", + "circuit_id": "C05", + "pdk": "gf180", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "follower", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.12, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "c690c8a6767bd4cb", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_at_nom": { + "min": 0.6309 + }, + "f3db": { + "min": 35530000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.6809448, + "f3db": 59222770.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.8087849, + "idd": 5.99297e-05, + "gain_at_nom": 0.6809448, + "vout_at_nom": 0.8087849, + "vin_lo": 1.12946, + "vin_hi": 1.12946, + "gain_lf": -3.336947, + "f3db": 59222770.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C05_gf180_sW1_sL1", + "circuit_id": "C05", + "pdk": "gf180", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "follower", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "0e05434cd8b5f2d9", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_at_nom": { + "min": 0.6554 + }, + "f3db": { + "min": 41180000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.7054489, + "f3db": 68638120.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.8631292, + "idd": 6.490372e-05, + "gain_at_nom": 0.7054489, + "vout_at_nom": 0.8631292, + "vin_lo": 1.03423, + "vin_hi": 1.03423, + "gain_lf": -3.030078, + "f3db": 68638120.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C05_gf180_sW1_sL1.5", + "circuit_id": "C05", + "pdk": "gf180", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "follower", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "1f80275162187fc2", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_at_nom": { + "min": 0.6255 + }, + "f3db": { + "min": 33420000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.6754529, + "f3db": 55698050.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.791703, + "idd": 5.987414e-05, + "gain_at_nom": 0.6754529, + "vout_at_nom": 0.791703, + "vin_lo": 1.165817, + "vin_hi": 1.165817, + "gain_lf": -3.407319, + "f3db": 55698050.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C05_gf180_sW1_sL2", + "circuit_id": "C05", + "pdk": "gf180", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "follower", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "94adb534ca849a23", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_at_nom": { + "min": 0.6039 + }, + "f3db": { + "min": 28990000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.6538903, + "f3db": 48312250.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.7393739, + "idd": 5.662267e-05, + "gain_at_nom": 0.6538903, + "vout_at_nom": 0.7393739, + "vin_lo": 1.280164, + "vin_hi": 1.280164, + "gain_lf": -3.689009, + "f3db": 48312250.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C05_gf180_sW2_sL1", + "circuit_id": "C05", + "pdk": "gf180", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "follower", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "e0addbaefaea9a09", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_at_nom": { + "min": 0.6882 + }, + "f3db": { + "min": 59210000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.7382363, + "f3db": 98678480.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.9498892, + "idd": 7.067995e-05, + "gain_at_nom": 0.7382363, + "vout_at_nom": 0.9498892, + "vin_lo": 0.904072, + "vin_hi": 0.904072, + "gain_lf": -2.635587, + "f3db": 98678480.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C05_gf180_sW2_sL1.5", + "circuit_id": "C05", + "pdk": "gf180", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "follower", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "dc565ccae0092713", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_at_nom": { + "min": 0.6638 + }, + "f3db": { + "min": 47630000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.7138419, + "f3db": 79377220.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.8927972, + "idd": 6.530943e-05, + "gain_at_nom": 0.7138419, + "vout_at_nom": 0.8927972, + "vin_lo": 0.9824942, + "vin_hi": 0.9824942, + "gain_lf": -2.927308, + "f3db": 79377220.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C05_gf180_sW2_sL2", + "circuit_id": "C05", + "pdk": "gf180", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "follower", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "4035e4161c10cfbb", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_at_nom": { + "min": 0.6468 + }, + "f3db": { + "min": 40950000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.6967894, + "f3db": 68257440.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.8513223, + "idd": 6.212506e-05, + "gain_at_nom": 0.6967894, + "vout_at_nom": 0.8513223, + "vin_lo": 1.049555, + "vin_hi": 1.049555, + "gain_lf": -3.137212, + "f3db": 68257440.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C05_ihp130_sW0.5_sL1", + "circuit_id": "C05", + "pdk": "ihp130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "follower", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.26, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.26, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "abfe36960c3ba7cd", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_at_nom": { + "min": 0.6798 + }, + "f3db": { + "min": 38110000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.729817, + "f3db": 63517890.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.2576804, + "idd": 2.917118e-05, + "gain_at_nom": 0.729817, + "vout_at_nom": 0.2576796, + "vin_lo": 0.4872625, + "vin_hi": 0.4872625, + "gain_lf": -2.735766, + "f3db": 63517890.0 + }, + "presim_s": 0.2 + }, + { + "case_id": "C05_ihp130_sW0.5_sL1.5", + "circuit_id": "C05", + "pdk": "ihp130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "follower", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.39, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "cfb9562ee86242de", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_at_nom": { + "min": 0.6754 + }, + "f3db": { + "min": 35230000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.7254285, + "f3db": 58723160.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.2602329, + "idd": 3.020821e-05, + "gain_at_nom": 0.7254285, + "vout_at_nom": 0.260232, + "vin_lo": 0.4965802, + "vin_hi": 0.4965802, + "gain_lf": -2.788168, + "f3db": 58723160.0 + }, + "presim_s": 0.2 + }, + { + "case_id": "C05_ihp130_sW0.5_sL2", + "circuit_id": "C05", + "pdk": "ihp130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "follower", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.52, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "2ef8027b87d2499f", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_at_nom": { + "min": 0.6639 + }, + "f3db": { + "min": 32500000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.7139067, + "f3db": 54158500.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.2527973, + "idd": 3.011537e-05, + "gain_at_nom": 0.7139067, + "vout_at_nom": 0.2527961, + "vin_lo": 0.5171557, + "vin_hi": 0.5171557, + "gain_lf": -2.927275, + "f3db": 54158500.0 + }, + "presim_s": 0.2 + }, + { + "case_id": "C05_ihp130_sW1.5_sL1", + "circuit_id": "C05", + "pdk": "ihp130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "follower", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.26, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.26, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "0648556f7a684bd9", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_at_nom": { + "min": 0.7264 + }, + "f3db": { + "min": 54030000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.7763982, + "f3db": 90048590.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.3326983, + "idd": 3.107174e-05, + "gain_at_nom": 0.7763982, + "vout_at_nom": 0.332698, + "vin_lo": 0.3736716, + "vin_hi": 0.3736716, + "gain_lf": -2.198318, + "f3db": 90048590.0 + }, + "presim_s": 0.4 + }, + { + "case_id": "C05_ihp130_sW1.5_sL1.5", + "circuit_id": "C05", + "pdk": "ihp130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "follower", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.39, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.39, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "7df5eef1df75bb86", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_at_nom": { + "min": 0.7277 + }, + "f3db": { + "min": 51610000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.7776932, + "f3db": 86023690.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.3420958, + "idd": 3.298738e-05, + "gain_at_nom": 0.7776932, + "vout_at_nom": 0.3420954, + "vin_lo": 0.3681853, + "vin_hi": 0.3681853, + "gain_lf": -2.183841, + "f3db": 86023690.0 + }, + "presim_s": 0.4 + }, + { + "case_id": "C05_ihp130_sW1.5_sL2", + "circuit_id": "C05", + "pdk": "ihp130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "follower", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.52, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.52, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "006eee7ac8dae220", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_at_nom": { + "min": 0.7253 + }, + "f3db": { + "min": 48330000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.7752678, + "f3db": 80548170.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.3405532, + "idd": 3.35421e-05, + "gain_at_nom": 0.7752678, + "vout_at_nom": 0.3405528, + "vin_lo": 0.3744812, + "vin_hi": 0.3744812, + "gain_lf": -2.210972, + "f3db": 80548170.0 + }, + "presim_s": 0.4 + }, + { + "case_id": "C05_ihp130_sW1_sL1", + "circuit_id": "C05", + "pdk": "ihp130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "follower", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.26, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "2aebf270f7880bf1", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_at_nom": { + "min": 0.7131 + }, + "f3db": { + "min": 47940000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.7631106, + "f3db": 79894260.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.3069455, + "idd": 3.08296e-05, + "gain_at_nom": 0.7631106, + "vout_at_nom": 0.306945, + "vin_lo": 0.4096913, + "vin_hi": 0.4096913, + "gain_lf": -2.348263, + "f3db": 79894260.0 + }, + "presim_s": 0.3 + }, + { + "case_id": "C05_ihp130_sW1_sL1.5", + "circuit_id": "C05", + "pdk": "ihp130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "follower", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "82bd959f65e7bb80", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_at_nom": { + "min": 0.7132 + }, + "f3db": { + "min": 45290000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.7632474, + "f3db": 75490140.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.3140574, + "idd": 3.246175e-05, + "gain_at_nom": 0.7632474, + "vout_at_nom": 0.3140569, + "vin_lo": 0.4092456, + "vin_hi": 0.4092456, + "gain_lf": -2.346705, + "f3db": 75490140.0 + }, + "presim_s": 0.2 + }, + { + "case_id": "C05_ihp130_sW1_sL2", + "circuit_id": "C05", + "pdk": "ihp130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "follower", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "b7284ee6da15bd44", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_at_nom": { + "min": 0.7091 + }, + "f3db": { + "min": 42110000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.7591457, + "f3db": 70185470.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.3104767, + "idd": 3.280455e-05, + "gain_at_nom": 0.7591457, + "vout_at_nom": 0.3104762, + "vin_lo": 0.4197914, + "vin_hi": 0.4197914, + "gain_lf": -2.393509, + "f3db": 70185470.0 + }, + "presim_s": 0.2 + }, + { + "case_id": "C05_ihp130_sW2_sL1", + "circuit_id": "C05", + "pdk": "ihp130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "follower", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.26, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "8ef63d5b6f4fc7df", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_at_nom": { + "min": 0.7345 + }, + "f3db": { + "min": 58370000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.7845447, + "f3db": 97280540.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.3496368, + "idd": 3.090327e-05, + "gain_at_nom": 0.7845447, + "vout_at_nom": 0.3496365, + "vin_lo": 0.3515873, + "vin_hi": 0.3515873, + "gain_lf": -2.107654, + "f3db": 97280540.0 + }, + "presim_s": 0.5 + }, + { + "case_id": "C05_ihp130_sW2_sL1.5", + "circuit_id": "C05", + "pdk": "ihp130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "follower", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "730a68d562366227", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_at_nom": { + "min": 0.7362 + }, + "f3db": { + "min": 56070000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.7861768, + "f3db": 93451050.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.3605514, + "idd": 3.296641e-05, + "gain_at_nom": 0.7861768, + "vout_at_nom": 0.3605511, + "vin_lo": 0.3427679, + "vin_hi": 0.3427679, + "gain_lf": -2.089602, + "f3db": 93451050.0 + }, + "presim_s": 0.5 + }, + { + "case_id": "C05_ihp130_sW2_sL2", + "circuit_id": "C05", + "pdk": "ihp130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "follower", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "288b182ad6ac88a2", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_at_nom": { + "min": 0.7346 + }, + "f3db": { + "min": 52740000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.7845507, + "f3db": 87893260.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.3603281, + "idd": 3.365257e-05, + "gain_at_nom": 0.7845507, + "vout_at_nom": 0.3603277, + "vin_lo": 0.346292, + "vin_hi": 0.346292, + "gain_lf": -2.107586, + "f3db": 87893260.0 + }, + "presim_s": 0.4 + }, + { + "case_id": "C05_sky130_sW0.5_sL1", + "circuit_id": "C05", + "pdk": "sky130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "follower", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.3, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "9e3ff600c55a2835", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_at_nom": { + "min": 0.6587 + }, + "f3db": { + "min": 39900000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.7086538, + "f3db": 66496440.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.2746515, + "idd": 3.261578e-05, + "gain_at_nom": 0.7086538, + "vout_at_nom": 0.2746515, + "vin_lo": 0.8699711, + "vin_hi": 0.8699711, + "gain_lf": -2.991257, + "f3db": 66496440.0 + }, + "presim_s": 8.1 + }, + { + "case_id": "C05_sky130_sW0.5_sL1.5", + "circuit_id": "C05", + "pdk": "sky130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "follower", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.45, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "635cda71f9594d72", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_at_nom": { + "min": 0.6286 + }, + "f3db": { + "min": 33020000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.6786287, + "f3db": 55028800.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.2590432, + "idd": 3.09043e-05, + "gain_at_nom": 0.6786287, + "vout_at_nom": 0.2590432, + "vin_lo": 0.9045592, + "vin_hi": 0.9045592, + "gain_lf": -3.367227, + "f3db": 55028800.0 + }, + "presim_s": 8.6 + }, + { + "case_id": "C05_sky130_sW0.5_sL2", + "circuit_id": "C05", + "pdk": "sky130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "follower", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.6, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "69d1e61e4c1779ff", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 29170000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.6365827, + "f3db": 48621940.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.2407817, + "idd": 2.863318e-05, + "gain_at_nom": 0.6365827, + "vout_at_nom": 0.2407817, + "vin_lo": 0.951101, + "vin_hi": 0.951101, + "gain_lf": -3.922816, + "f3db": 48621940.0 + }, + "presim_s": 10.5 + }, + { + "case_id": "C05_sky130_sW1.5_sL1", + "circuit_id": "C05", + "pdk": "sky130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "follower", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.3, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.3, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "df0df0653fb4c194", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_at_nom": { + "min": 0.7092 + }, + "f3db": { + "min": 60030000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.7592457, + "f3db": 100054200.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.3494129, + "idd": 3.574033e-05, + "gain_at_nom": 0.7592457, + "vout_at_nom": 0.3494129, + "vin_lo": 0.7522897, + "vin_hi": 0.7522897, + "gain_lf": -2.392343, + "f3db": 100054200.0 + }, + "presim_s": 7.5 + }, + { + "case_id": "C05_sky130_sW1.5_sL1.5", + "circuit_id": "C05", + "pdk": "sky130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "follower", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.45, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.45, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "eab5696aa66e742d", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_at_nom": { + "min": 0.7088 + }, + "f3db": { + "min": 52110000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.7587754, + "f3db": 86842120.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.3437213, + "idd": 3.540741e-05, + "gain_at_nom": 0.7587754, + "vout_at_nom": 0.3437213, + "vin_lo": 0.76352, + "vin_hi": 0.76352, + "gain_lf": -2.397726, + "f3db": 86842120.0 + }, + "presim_s": 9.3 + }, + { + "case_id": "C05_sky130_sW1.5_sL2", + "circuit_id": "C05", + "pdk": "sky130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "follower", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.6, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.6, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "e277d7c7f7380fda", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_at_nom": { + "min": 0.6994 + }, + "f3db": { + "min": 45420000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.7494204, + "f3db": 75701030.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.3326244, + "idd": 3.356999e-05, + "gain_at_nom": 0.7494204, + "vout_at_nom": 0.3326244, + "vin_lo": 0.7794716, + "vin_hi": 0.7794716, + "gain_lf": -2.505476, + "f3db": 75701030.0 + }, + "presim_s": 9.9 + }, + { + "case_id": "C05_sky130_sW1_sL1", + "circuit_id": "C05", + "pdk": "sky130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "follower", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "fd1865c2ef80024a", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_at_nom": { + "min": 0.6961 + }, + "f3db": { + "min": 51990000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.7460907, + "f3db": 86655320.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.3255993, + "idd": 3.429753e-05, + "gain_at_nom": 0.7460907, + "vout_at_nom": 0.3255994, + "vin_lo": 0.7868045, + "vin_hi": 0.7868045, + "gain_lf": -2.544153, + "f3db": 86655320.0 + }, + "presim_s": 9.3 + }, + { + "case_id": "C05_sky130_sW1_sL1.5", + "circuit_id": "C05", + "pdk": "sky130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "follower", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "c635b50631355e72", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_at_nom": { + "min": 0.6903 + }, + "f3db": { + "min": 44140000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.7403227, + "f3db": 73573610.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.3161718, + "idd": 3.386103e-05, + "gain_at_nom": 0.7403227, + "vout_at_nom": 0.3161718, + "vin_lo": 0.8034114, + "vin_hi": 0.8034114, + "gain_lf": -2.611558, + "f3db": 73573610.0 + }, + "presim_s": 8.6 + }, + { + "case_id": "C05_sky130_sW1_sL2", + "circuit_id": "C05", + "pdk": "sky130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "follower", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "9db1cbe6ad1c381f", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_at_nom": { + "min": 0.6762 + }, + "f3db": { + "min": 38230000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.7261568, + "f3db": 63718630.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.3024541, + "idd": 3.198847e-05, + "gain_at_nom": 0.7261568, + "vout_at_nom": 0.3024541, + "vin_lo": 0.825593, + "vin_hi": 0.825593, + "gain_lf": -2.779357, + "f3db": 63718630.0 + }, + "presim_s": 10.6 + }, + { + "case_id": "C05_sky130_sW2_sL1", + "circuit_id": "C05", + "pdk": "sky130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "follower", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "e675b4595c16f64f", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_at_nom": { + "min": 0.7154 + }, + "f3db": { + "min": 64130000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.7654134, + "f3db": 106882800.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.366875, + "idd": 3.544366e-05, + "gain_at_nom": 0.7654134, + "vout_at_nom": 0.366875, + "vin_lo": 0.7264476, + "vin_hi": 0.7264476, + "gain_lf": -2.322071, + "f3db": 106882800.0 + }, + "presim_s": 10.2 + }, + { + "case_id": "C05_sky130_sW2_sL1.5", + "circuit_id": "C05", + "pdk": "sky130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "follower", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "7a061e1c7eb1a934", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_at_nom": { + "min": 0.7178 + }, + "f3db": { + "min": 57000000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.767843, + "f3db": 95002890.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.3630991, + "idd": 3.539556e-05, + "gain_at_nom": 0.767843, + "vout_at_nom": 0.3630992, + "vin_lo": 0.7361643, + "vin_hi": 0.7361643, + "gain_lf": -2.294543, + "f3db": 95002890.0 + }, + "presim_s": 10.8 + }, + { + "case_id": "C05_sky130_sW2_sL2", + "circuit_id": "C05", + "pdk": "sky130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "follower", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "dfdf19015b0f0b0f", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_at_nom": { + "min": 0.7114 + }, + "f3db": { + "min": 50670000.0 + }, + "_frozen_from": { + "schematic": { + "gain_at_nom": 0.7613855, + "f3db": 84455480.0 + }, + "floors": { + "gain_at_nom": { + "min": 0.6 + }, + "f3db": { + "min": 10000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.3522278, + "idd": 3.434093e-05, + "gain_at_nom": 0.7613855, + "vout_at_nom": 0.352228, + "vin_lo": 0.7517677, + "vin_hi": 0.7517677, + "gain_lf": -2.367897, + "f3db": 84455480.0 + }, + "presim_s": 6.3 + }, + { + "case_id": "C06_gf180_sW0.5_sL1", + "circuit_id": "C06", + "pdk": "gf180", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "single", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.56, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.56, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "ce7474b5e041d6c0", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 50.11 + }, + "f3db": { + "min": 140300.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 53.10618, + "f3db": 233789.4 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 1.092331, + "vin0": 1.092331, + "idd": 1.90246e-05, + "gain_lf": 53.10618, + "f3db": 233789.4, + "ugf": 106116900.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C06_gf180_sW0.5_sL1.5", + "circuit_id": "C06", + "pdk": "gf180", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "single", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.84, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.84, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "4de731f518e1d118", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 53.43 + }, + "f3db": { + "min": 100000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 56.43498, + "f3db": 135535.3 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 1.201718, + "vin0": 1.201718, + "idd": 1.947492e-05, + "gain_lf": 56.43498, + "f3db": 135535.3, + "ugf": 90143860.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C06_gf180_sW0.5_sL2", + "circuit_id": "C06", + "pdk": "gf180", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "single", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.12, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.12, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "3e91ef5ed8d080a5", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 54.27 + }, + "f3db": { + "min": 100000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 57.26683, + "f3db": 109227.1 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 1.294706, + "vin0": 1.294706, + "idd": 1.979704e-05, + "gain_lf": 57.26683, + "f3db": 109227.1, + "ugf": 79918480.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C06_gf180_sW1.5_sL1", + "circuit_id": "C06", + "pdk": "gf180", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "single", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.56, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.56, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "dd2d433e7113c6a1", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 49.87 + }, + "f3db": { + "min": 208700.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 52.86996, + "f3db": 347908.6 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.9005459, + "vin0": 0.9005459, + "idd": 1.894019e-05, + "gain_lf": 52.86996, + "f3db": 347908.6, + "ugf": 153526800.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C06_gf180_sW1.5_sL1.5", + "circuit_id": "C06", + "pdk": "gf180", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "single", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.84, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.84, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "edb15c0901c45b69", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 53.84 + }, + "f3db": { + "min": 111100.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 56.83854, + "f3db": 185121.9 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.9575607, + "vin0": 0.9575607, + "idd": 1.891868e-05, + "gain_lf": 56.83854, + "f3db": 185121.9, + "ugf": 128931800.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C06_gf180_sW1.5_sL2", + "circuit_id": "C06", + "pdk": "gf180", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "single", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.12, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.12, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "bf7895c3dd71f8b0", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 55.59 + }, + "f3db": { + "min": 100000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 58.5935, + "f3db": 132664.1 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 1.008382, + "vin0": 1.008382, + "idd": 1.907116e-05, + "gain_lf": 58.5935, + "f3db": 132664.1, + "ugf": 112980300.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C06_gf180_sW1_sL1", + "circuit_id": "C06", + "pdk": "gf180", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "single", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "7b3650aef46077cb", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 50.27 + }, + "f3db": { + "min": 176900.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 53.27176, + "f3db": 294878.4 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.957582, + "vin0": 0.957582, + "idd": 1.884774e-05, + "gain_lf": 53.27176, + "f3db": 294878.4, + "ugf": 136348000.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C06_gf180_sW1_sL1.5", + "circuit_id": "C06", + "pdk": "gf180", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "single", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "b79e403cdffeb3b6", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 54.27 + }, + "f3db": { + "min": 100000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 57.27059, + "f3db": 157449.1 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 1.029786, + "vin0": 1.029786, + "idd": 1.903041e-05, + "gain_lf": 57.27059, + "f3db": 157449.1, + "ugf": 115321000.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C06_gf180_sW1_sL2", + "circuit_id": "C06", + "pdk": "gf180", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "single", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "ac0492233c8a0173", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 56.04 + }, + "f3db": { + "min": 100000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 59.03807, + "f3db": 113210.2 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 1.093088, + "vin0": 1.093088, + "idd": 1.925956e-05, + "gain_lf": 59.03807, + "f3db": 113210.2, + "ugf": 101564500.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C06_gf180_sW2_sL1", + "circuit_id": "C06", + "pdk": "gf180", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "single", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "5222460009e30c42", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 49.73 + }, + "f3db": { + "min": 229800.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 52.72692, + "f3db": 383023.0 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.8664278, + "vin0": 0.8664278, + "idd": 1.907915e-05, + "gain_lf": 52.72692, + "f3db": 383023.0, + "ugf": 166221300.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C06_gf180_sW2_sL1.5", + "circuit_id": "C06", + "pdk": "gf180", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "single", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "516eec9f3eae926c", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 53.71 + }, + "f3db": { + "min": 121600.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 56.70929, + "f3db": 202665.1 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.9148134, + "vin0": 0.9148134, + "idd": 1.889219e-05, + "gain_lf": 56.70929, + "f3db": 202665.1, + "ugf": 138947700.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C06_gf180_sW2_sL2", + "circuit_id": "C06", + "pdk": "gf180", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "single", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "20ae0bd437c33c25", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 55.46 + }, + "f3db": { + "min": 100000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 58.46082, + "f3db": 145002.3 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.9583967, + "vin0": 0.9583967, + "idd": 1.897854e-05, + "gain_lf": 58.46082, + "f3db": 145002.3, + "ugf": 121660600.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C06_ihp130_sW0.5_sL1", + "circuit_id": "C06", + "pdk": "ihp130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "single", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.26, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.26, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.26, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.26, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "cea5e9b1e5ca88d2", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 33.29 + }, + "f3db": { + "min": 1818000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 36.28555, + "f3db": 3030727.0 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.5597058, + "vin0": 0.5597058, + "idd": 1.845556e-05, + "gain_lf": 36.28555, + "f3db": 3030727.0, + "ugf": 198128000.0 + }, + "presim_s": 0.2 + }, + { + "case_id": "C06_ihp130_sW0.5_sL1.5", + "circuit_id": "C06", + "pdk": "ihp130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "single", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.39, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.39, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "6c5a38204228862f", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 33.63 + }, + "f3db": { + "min": 1644000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 36.63339, + "f3db": 2739355.0 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.5601549, + "vin0": 0.5601549, + "idd": 2.008242e-05, + "gain_lf": 36.63339, + "f3db": 2739355.0, + "ugf": 186625000.0 + }, + "presim_s": 0.2 + }, + { + "case_id": "C06_ihp130_sW0.5_sL2", + "circuit_id": "C06", + "pdk": "ihp130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "single", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.52, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.52, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "8552463d5d873ae3", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 31.7 + }, + "f3db": { + "min": 1882000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 34.69502, + "f3db": 3137098.0 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.5741607, + "vin0": 0.5741607, + "idd": 2.084907e-05, + "gain_lf": 34.69502, + "f3db": 3137098.0, + "ugf": 170957000.0 + }, + "presim_s": 0.2 + }, + { + "case_id": "C06_ihp130_sW1.5_sL1", + "circuit_id": "C06", + "pdk": "ihp130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "single", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.26, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.26, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.26, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.26, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "5169a8d045964c4b", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 31.57 + }, + "f3db": { + "min": 2800000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 34.56628, + "f3db": 4667127.0 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.4661412, + "vin0": 0.4661412, + "idd": 1.813558e-05, + "gain_lf": 34.56628, + "f3db": 4667127.0, + "ugf": 250163500.0 + }, + "presim_s": 0.4 + }, + { + "case_id": "C06_ihp130_sW1.5_sL1.5", + "circuit_id": "C06", + "pdk": "ihp130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "single", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.39, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.39, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.39, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.39, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "6400ffa0df8ec521", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 32.05 + }, + "f3db": { + "min": 2523000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 35.05241, + "f3db": 4204701.0 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.4553442, + "vin0": 0.4553442, + "idd": 2.026799e-05, + "gain_lf": 35.05241, + "f3db": 4204701.0, + "ugf": 238673600.0 + }, + "presim_s": 0.4 + }, + { + "case_id": "C06_ihp130_sW1.5_sL2", + "circuit_id": "C06", + "pdk": "ihp130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "single", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.52, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.52, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.52, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.52, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "c104af8159c860d1", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 32.33 + }, + "f3db": { + "min": 2275000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 35.32998, + "f3db": 3792025.0 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.4588734, + "vin0": 0.4588734, + "idd": 2.134392e-05, + "gain_lf": 35.32998, + "f3db": 3792025.0, + "ugf": 221981100.0 + }, + "presim_s": 0.4 + }, + { + "case_id": "C06_ihp130_sW1_sL1", + "circuit_id": "C06", + "pdk": "ihp130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "single", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.26, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.26, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "597c1e5723987d1c", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 32.78 + }, + "f3db": { + "min": 2291000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 35.78481, + "f3db": 3819148.0 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.4960872, + "vin0": 0.4960872, + "idd": 1.828126e-05, + "gain_lf": 35.78481, + "f3db": 3819148.0, + "ugf": 235936300.0 + }, + "presim_s": 0.3 + }, + { + "case_id": "C06_ihp130_sW1_sL1.5", + "circuit_id": "C06", + "pdk": "ihp130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "single", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "6c18fac722792f53", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 33.48 + }, + "f3db": { + "min": 2011000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 36.47854, + "f3db": 3351195.0 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.4888074, + "vin0": 0.4888074, + "idd": 2.026449e-05, + "gain_lf": 36.47854, + "f3db": 3351195.0, + "ugf": 223861900.0 + }, + "presim_s": 0.3 + }, + { + "case_id": "C06_ihp130_sW1_sL2", + "circuit_id": "C06", + "pdk": "ihp130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "single", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "ba95db124d335dc8", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 33.75 + }, + "f3db": { + "min": 1810000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 36.74976, + "f3db": 3016877.0 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.495658, + "vin0": 0.495658, + "idd": 2.125107e-05, + "gain_lf": 36.74976, + "f3db": 3016877.0, + "ugf": 208240200.0 + }, + "presim_s": 0.2 + }, + { + "case_id": "C06_ihp130_sW2_sL1", + "circuit_id": "C06", + "pdk": "ihp130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "single", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.26, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.26, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "deff2cc2b4a17a28", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 30.28 + }, + "f3db": { + "min": 3295000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 33.27684, + "f3db": 5491747.0 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.4478767, + "vin0": 0.4478767, + "idd": 1.802846e-05, + "gain_lf": 33.27684, + "f3db": 5491747.0, + "ugf": 253779400.0 + }, + "presim_s": 0.4 + }, + { + "case_id": "C06_ihp130_sW2_sL1.5", + "circuit_id": "C06", + "pdk": "ihp130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "single", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "851f47a091e47c6b", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 30.63 + }, + "f3db": { + "min": 3017000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 33.62703, + "f3db": 5027927.0 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.4350349, + "vin0": 0.4350349, + "idd": 2.024208e-05, + "gain_lf": 33.62703, + "f3db": 5027927.0, + "ugf": 242105800.0 + }, + "presim_s": 0.4 + }, + { + "case_id": "C06_ihp130_sW2_sL2", + "circuit_id": "C06", + "pdk": "ihp130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "single", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "11a2dd171388db52", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 30.92 + }, + "f3db": { + "min": 2723000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 33.91987, + "f3db": 4538329.0 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.436597, + "vin0": 0.436597, + "idd": 2.137046e-05, + "gain_lf": 33.91987, + "f3db": 4538329.0, + "ugf": 225810500.0 + }, + "presim_s": 0.4 + }, + { + "case_id": "C06_sky130_sW0.5_sL1", + "circuit_id": "C06", + "pdk": "sky130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "single", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.3, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.3, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "1f55d153da27b7e6", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 35.32 + }, + "f3db": { + "min": 1320000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 38.32105, + "f3db": 2199673.0 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.9259073, + "vin0": 0.9259073, + "idd": 2.36117e-05, + "gain_lf": 38.32105, + "f3db": 2199673.0, + "ugf": 181913400.0 + }, + "presim_s": 11.0 + }, + { + "case_id": "C06_sky130_sW0.5_sL1.5", + "circuit_id": "C06", + "pdk": "sky130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "single", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.45, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.45, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "f6de7845e8f9caf2", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 33.49 + }, + "f3db": { + "min": 1245000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 36.48902, + "f3db": 2074689.0 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.9721896, + "vin0": 0.9721896, + "idd": 2.417715e-05, + "gain_lf": 36.48902, + "f3db": 2074689.0, + "ugf": 138911500.0 + }, + "presim_s": 8.8 + }, + { + "case_id": "C06_sky130_sW0.5_sL2", + "circuit_id": "C06", + "pdk": "sky130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "single", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.6, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.6, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "74cb5b113c474ab2", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "gain_lf=27.82 below floor 30" + ], + "spec": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 2776000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 27.82435, + "f3db": 4627096.0 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 1.021696, + "vin0": 1.021696, + "idd": 2.453699e-05, + "gain_lf": 27.82435, + "f3db": 4627096.0, + "ugf": 114174000.0 + }, + "presim_s": 10.2 + }, + { + "case_id": "C06_sky130_sW1.5_sL1", + "circuit_id": "C06", + "pdk": "sky130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "single", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.3, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.3, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.3, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.3, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "e99a2b2be0d3f9e5", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "gain_lf=28.66 below floor 30" + ], + "spec": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 3461000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 28.65828, + "f3db": 5767797.0 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.8882844, + "vin0": 0.8882844, + "idd": 3.270373e-05, + "gain_lf": 28.65828, + "f3db": 5767797.0, + "ugf": 156660600.0 + }, + "presim_s": 7.8 + }, + { + "case_id": "C06_sky130_sW1.5_sL1.5", + "circuit_id": "C06", + "pdk": "sky130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "single", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.45, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.45, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.45, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.45, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "32456d73fa1c5aac", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 2100000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 31.62205, + "f3db": 3499481.0 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.9040551, + "vin0": 0.9040551, + "idd": 3.155117e-05, + "gain_lf": 31.62205, + "f3db": 3499481.0, + "ugf": 133912400.0 + }, + "presim_s": 9.7 + }, + { + "case_id": "C06_sky130_sW1.5_sL2", + "circuit_id": "C06", + "pdk": "sky130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "single", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.6, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.6, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.6, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.6, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "101e3c82adc5b1b7", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 1617000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 31.72946, + "f3db": 2694726.0 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.9448314, + "vin0": 0.9448314, + "idd": 3.132846e-05, + "gain_lf": 31.72946, + "f3db": 2694726.0, + "ugf": 104413800.0 + }, + "presim_s": 6.2 + }, + { + "case_id": "C06_sky130_sW1_sL1", + "circuit_id": "C06", + "pdk": "sky130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "single", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "335d0b79d88c93fb", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 2513000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 31.85868, + "f3db": 4187927.0 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.8956893, + "vin0": 0.8956893, + "idd": 2.87363e-05, + "gain_lf": 31.85868, + "f3db": 4187927.0, + "ugf": 164614000.0 + }, + "presim_s": 7.9 + }, + { + "case_id": "C06_sky130_sW1_sL1.5", + "circuit_id": "C06", + "pdk": "sky130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "single", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "833cfe7aeaa9cc95", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 31.06 + }, + "f3db": { + "min": 1623000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 34.0632, + "f3db": 2704167.0 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.9196085, + "vin0": 0.9196085, + "idd": 2.827558e-05, + "gain_lf": 34.0632, + "f3db": 2704167.0, + "ugf": 137010100.0 + }, + "presim_s": 8.4 + }, + { + "case_id": "C06_sky130_sW1_sL2", + "circuit_id": "C06", + "pdk": "sky130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "single", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "74eb3cfbec8c455b", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 30.47 + }, + "f3db": { + "min": 1375000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 33.47465, + "f3db": 2292044.0 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.9613413, + "vin0": 0.9613413, + "idd": 2.825032e-05, + "gain_lf": 33.47465, + "f3db": 2292044.0, + "ugf": 108532800.0 + }, + "presim_s": 8.4 + }, + { + "case_id": "C06_sky130_sW2_sL1", + "circuit_id": "C06", + "pdk": "sky130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "single", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "2f46255bebd9aa8c", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "gain_lf=24.89 below floor 30" + ], + "spec": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 4437000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 24.88672, + "f3db": 7394724.0 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.901791, + "vin0": 0.901791, + "idd": 3.598761e-05, + "gain_lf": 24.88672, + "f3db": 7394724.0, + "ugf": 130087900.0 + }, + "presim_s": 8.3 + }, + { + "case_id": "C06_sky130_sW2_sL1.5", + "circuit_id": "C06", + "pdk": "sky130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "single", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "8a82d1153ad1fe98", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "gain_lf=28.59 below floor 30" + ], + "spec": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 2596000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 28.59087, + "f3db": 4326249.0 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.9109606, + "vin0": 0.9109606, + "idd": 3.433001e-05, + "gain_lf": 28.59087, + "f3db": 4326249.0, + "ugf": 116742800.0 + }, + "presim_s": 9.4 + }, + { + "case_id": "C06_sky130_sW2_sL2", + "circuit_id": "C06", + "pdk": "sky130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "single", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "874c1c3eb064baa2", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "gain_lf=29.84 below floor 30" + ], + "spec": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 1869000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 29.83562, + "f3db": 3115616.0 + }, + "floors": { + "gain_lf": { + "min": 30.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.9447336, + "vin0": 0.9447336, + "idd": 3.401447e-05, + "gain_lf": 29.83562, + "f3db": 3115616.0, + "ugf": 97059820.0 + }, + "presim_s": 10.3 + }, + { + "case_id": "C07_gf180_sW0.5_sL1", + "circuit_id": "C07", + "pdk": "gf180", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "diff_cs", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "f483279329cf82a0", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 34.97 + }, + "f3db": { + "min": 1412000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 37.9669, + "f3db": 2352737.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 1.650378, + "vo2": 1.650378, + "idd": 4.000002e-05, + "vos_in": 0.0, + "gain_lf": 37.9669, + "f3db": 2352737.0, + "ugf": 186921500.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C07_gf180_sW0.5_sL1.5", + "circuit_id": "C07", + "pdk": "gf180", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "diff_cs", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "bf6dd03a5e67665f", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 37.61 + }, + "f3db": { + "min": 843900.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 40.60838, + "f3db": 1406516.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 1.65033, + "vo2": 1.65033, + "idd": 4.000002e-05, + "vos_in": 3.637979e-12, + "gain_lf": 40.60838, + "f3db": 1406516.0, + "ugf": 151479100.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C07_gf180_sW0.5_sL2", + "circuit_id": "C07", + "pdk": "gf180", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "diff_cs", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "f02fecbcd6320c1b", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 38.8 + }, + "f3db": { + "min": 635100.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 41.80138, + "f3db": 1058574.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 1.650445, + "vo2": 1.650445, + "idd": 4.000002e-05, + "vos_in": -1.92813e-10, + "gain_lf": 41.80138, + "f3db": 1058574.0, + "ugf": 130792200.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C07_gf180_sW1.5_sL1", + "circuit_id": "C07", + "pdk": "gf180", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "diff_cs", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "ab5f62a0ef4aedf1", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 37.96 + }, + "f3db": { + "min": 1554000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 40.96297, + "f3db": 2590804.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 1.650604, + "vo2": 1.650604, + "idd": 4.000005e-05, + "vos_in": -3.63798e-12, + "gain_lf": 40.96297, + "f3db": 2590804.0, + "ugf": 290673800.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C07_gf180_sW1.5_sL1.5", + "circuit_id": "C07", + "pdk": "gf180", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "diff_cs", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "454f5cb369384cb9", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 41.31 + }, + "f3db": { + "min": 882800.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 44.31449, + "f3db": 1471348.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 1.650203, + "vo2": 1.650203, + "idd": 4.000005e-05, + "vos_in": 0.0, + "gain_lf": 44.31449, + "f3db": 1471348.0, + "ugf": 243001000.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C07_gf180_sW1.5_sL2", + "circuit_id": "C07", + "pdk": "gf180", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "diff_cs", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "99b4505dbd9b9ef1", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 42.75 + }, + "f3db": { + "min": 654400.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 45.74969, + "f3db": 1090687.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 1.650063, + "vo2": 1.650063, + "idd": 4.000005e-05, + "vos_in": 0.0, + "gain_lf": 45.74969, + "f3db": 1090687.0, + "ugf": 212765600.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C07_gf180_sW1_sL1", + "circuit_id": "C07", + "pdk": "gf180", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "diff_cs", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "256c1bd0e2e5d8bb", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 37.07 + }, + "f3db": { + "min": 1503000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 40.06547, + "f3db": 2504702.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 1.650476, + "vo2": 1.650476, + "idd": 4.000003e-05, + "vos_in": 0.0, + "gain_lf": 40.06547, + "f3db": 2504702.0, + "ugf": 253138300.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C07_gf180_sW1_sL1.5", + "circuit_id": "C07", + "pdk": "gf180", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "diff_cs", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "d1fe42bc2b7be1a4", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 40.16 + }, + "f3db": { + "min": 866400.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 43.15772, + "f3db": 1444063.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 1.650159, + "vo2": 1.650159, + "idd": 4.000003e-05, + "vos_in": 0.0, + "gain_lf": 43.15772, + "f3db": 1444063.0, + "ugf": 208666900.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C07_gf180_sW1_sL2", + "circuit_id": "C07", + "pdk": "gf180", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "diff_cs", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "a233a39b1f4f29dd", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 41.51 + }, + "f3db": { + "min": 643700.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 44.50965, + "f3db": 1072820.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 1.650086, + "vo2": 1.650086, + "idd": 4.000003e-05, + "vos_in": 0.0, + "gain_lf": 44.50965, + "f3db": 1072820.0, + "ugf": 181096200.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C07_gf180_sW2_sL1", + "circuit_id": "C07", + "pdk": "gf180", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "diff_cs", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "8795cf736a75aba2", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 38.47 + }, + "f3db": { + "min": 1582000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 41.46527, + "f3db": 2637462.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 1.650697, + "vo2": 1.650697, + "idd": 4.000007e-05, + "vos_in": 0.0, + "gain_lf": 41.46527, + "f3db": 2637462.0, + "ugf": 313371300.0 + }, + "presim_s": 0.2 + }, + { + "case_id": "C07_gf180_sW2_sL1.5", + "circuit_id": "C07", + "pdk": "gf180", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "diff_cs", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "6a692ffd39e46bfa", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 41.99 + }, + "f3db": { + "min": 891400.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 44.99227, + "f3db": 1485694.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 1.650257, + "vo2": 1.650257, + "idd": 4.000007e-05, + "vos_in": 0.0, + "gain_lf": 44.99227, + "f3db": 1485694.0, + "ugf": 265542300.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C07_gf180_sW2_sL2", + "circuit_id": "C07", + "pdk": "gf180", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "diff_cs", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "95dad40c57a3086b", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 43.49 + }, + "f3db": { + "min": 660800.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 46.48706, + "f3db": 1101379.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 1.650084, + "vo2": 1.650084, + "idd": 4.000007e-05, + "vos_in": 0.0, + "gain_lf": 46.48706, + "f3db": 1101379.0, + "ugf": 234161200.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C07_ihp130_sW0.5_sL1", + "circuit_id": "C07", + "pdk": "ihp130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "diff_cs", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.26, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.26, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.26, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.26, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "14e92c78a6f0b2d0", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 20.77 + }, + "f3db": { + "min": 13730000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 23.77264, + "f3db": 22884650.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 0.6002827, + "vo2": 0.6002827, + "idd": 4e-05, + "vos_in": 9.094947e-13, + "gain_lf": 23.77264, + "f3db": 22884650.0, + "ugf": 353554300.0 + }, + "presim_s": 0.2 + }, + { + "case_id": "C07_ihp130_sW0.5_sL1.5", + "circuit_id": "C07", + "pdk": "ihp130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "diff_cs", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "de4b561c7a402af8", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 22.1 + }, + "f3db": { + "min": 10680000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 25.0983, + "f3db": 17807610.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 0.6006468, + "vo2": 0.6006468, + "idd": 4e-05, + "vos_in": 0.0, + "gain_lf": 25.0983, + "f3db": 17807610.0, + "ugf": 320882000.0 + }, + "presim_s": 0.2 + }, + { + "case_id": "C07_ihp130_sW0.5_sL2", + "circuit_id": "C07", + "pdk": "ihp130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "diff_cs", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "5bfb2876a73e7f1a", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 22.89 + }, + "f3db": { + "min": 8927000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 25.89251, + "f3db": 14878350.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 0.6008857, + "vo2": 0.6008857, + "idd": 4e-05, + "vos_in": -9.09495e-13, + "gain_lf": 25.89251, + "f3db": 14878350.0, + "ugf": 294149900.0 + }, + "presim_s": 0.3 + }, + { + "case_id": "C07_ihp130_sW1.5_sL1", + "circuit_id": "C07", + "pdk": "ihp130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "diff_cs", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.26, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.26, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.26, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.26, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "c08a84dbcc35481e", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 20.64 + }, + "f3db": { + "min": 18710000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 23.635, + "f3db": 31189430.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 0.6003577, + "vo2": 0.6003577, + "idd": 4e-05, + "vos_in": 0.0, + "gain_lf": 23.635, + "f3db": 31189430.0, + "ugf": 475420900.0 + }, + "presim_s": 0.6 + }, + { + "case_id": "C07_ihp130_sW1.5_sL1.5", + "circuit_id": "C07", + "pdk": "ihp130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "diff_cs", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.39, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.39, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.39, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.39, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "9127391f3a93e650", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 22.11 + }, + "f3db": { + "min": 14720000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 25.10702, + "f3db": 24535880.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 0.6006771, + "vo2": 0.6006771, + "idd": 4e-05, + "vos_in": 0.0, + "gain_lf": 25.10702, + "f3db": 24535880.0, + "ugf": 443202400.0 + }, + "presim_s": 0.8 + }, + { + "case_id": "C07_ihp130_sW1.5_sL2", + "circuit_id": "C07", + "pdk": "ihp130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "diff_cs", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.52, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.52, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.52, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.52, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "44e06a459e1d96c0", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 23.04 + }, + "f3db": { + "min": 12340000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 26.0359, + "f3db": 20569130.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 0.6008833, + "vo2": 0.6008833, + "idd": 4e-05, + "vos_in": 0.0, + "gain_lf": 26.0359, + "f3db": 20569130.0, + "ugf": 414566700.0 + }, + "presim_s": 0.5 + }, + { + "case_id": "C07_ihp130_sW1_sL1", + "circuit_id": "C07", + "pdk": "ihp130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "diff_cs", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "32f278c8e9f1989e", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 20.72 + }, + "f3db": { + "min": 16890000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 23.71739, + "f3db": 28149450.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 0.6003496, + "vo2": 0.6003496, + "idd": 4e-05, + "vos_in": 0.0, + "gain_lf": 23.71739, + "f3db": 28149450.0, + "ugf": 432803400.0 + }, + "presim_s": 0.4 + }, + { + "case_id": "C07_ihp130_sW1_sL1.5", + "circuit_id": "C07", + "pdk": "ihp130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "diff_cs", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "b5cb51c678195e4c", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 22.17 + }, + "f3db": { + "min": 13190000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 25.16505, + "f3db": 21988990.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 0.6006961, + "vo2": 0.6006961, + "idd": 4e-05, + "vos_in": 0.0, + "gain_lf": 25.16505, + "f3db": 21988990.0, + "ugf": 399388700.0 + }, + "presim_s": 0.4 + }, + { + "case_id": "C07_ihp130_sW1_sL2", + "circuit_id": "C07", + "pdk": "ihp130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "diff_cs", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "499c4bcbf27c7078", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 23.07 + }, + "f3db": { + "min": 11010000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 26.06961, + "f3db": 18356100.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 0.6009213, + "vo2": 0.6009213, + "idd": 4e-05, + "vos_in": 0.0, + "gain_lf": 26.06961, + "f3db": 18356100.0, + "ugf": 370858700.0 + }, + "presim_s": 0.4 + }, + { + "case_id": "C07_ihp130_sW2_sL1", + "circuit_id": "C07", + "pdk": "ihp130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "diff_cs", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.26, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.26, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.26, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.26, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "f4be17b428abcb73", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 20.59 + }, + "f3db": { + "min": 19830000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 23.58585, + "f3db": 33050730.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 0.6003564, + "vo2": 0.6003564, + "idd": 4e-05, + "vos_in": 0.0, + "gain_lf": 23.58585, + "f3db": 33050730.0, + "ugf": 500458300.0 + }, + "presim_s": 0.8 + }, + { + "case_id": "C07_ihp130_sW2_sL1.5", + "circuit_id": "C07", + "pdk": "ihp130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "diff_cs", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "c361bd3eb5b0b581", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 22.06 + }, + "f3db": { + "min": 15710000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 25.05554, + "f3db": 26179600.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 0.6006539, + "vo2": 0.6006539, + "idd": 4e-05, + "vos_in": 0.0, + "gain_lf": 25.05554, + "f3db": 26179600.0, + "ugf": 471140000.0 + }, + "presim_s": 0.7 + }, + { + "case_id": "C07_ihp130_sW2_sL2", + "circuit_id": "C07", + "pdk": "ihp130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "diff_cs", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "748fe8081e7c23b4", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 22.99 + }, + "f3db": { + "min": 13230000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 25.9892, + "f3db": 22044280.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 0.6008455, + "vo2": 0.6008455, + "idd": 4.000001e-05, + "vos_in": -9.09495e-13, + "gain_lf": 25.9892, + "f3db": 22044280.0, + "ugf": 442230500.0 + }, + "presim_s": 0.9 + }, + { + "case_id": "C07_sky130_sW0.5_sL1", + "circuit_id": "C07", + "pdk": "sky130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "diff_cs", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "b61a93ffab3be575", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 27.66 + }, + "f3db": { + "min": 6076000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 30.66212, + "f3db": 10127190.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 0.9031917, + "vo2": 0.9031917, + "idd": 4.000001e-05, + "vos_in": -3.13685e-08, + "gain_lf": 30.66212, + "f3db": 10127190.0, + "ugf": 346694000.0 + }, + "presim_s": 8.2 + }, + { + "case_id": "C07_sky130_sW0.5_sL1.5", + "circuit_id": "C07", + "pdk": "sky130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "diff_cs", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "d45d402bf99a590d", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 30.03 + }, + "f3db": { + "min": 3899000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 33.02688, + "f3db": 6497612.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 0.9033138, + "vo2": 0.9033138, + "idd": 4.000001e-05, + "vos_in": 2.531669e-08, + "gain_lf": 33.02688, + "f3db": 6497612.0, + "ugf": 292225800.0 + }, + "presim_s": 10.9 + }, + { + "case_id": "C07_sky130_sW0.5_sL2", + "circuit_id": "C07", + "pdk": "sky130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "diff_cs", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "6ab9021f36419794", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 31.45 + }, + "f3db": { + "min": 2884000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 34.44544, + "f3db": 4806507.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 0.903684, + "vo2": 0.903684, + "idd": 4.000001e-05, + "vos_in": -4.63842e-10, + "gain_lf": 34.44544, + "f3db": 4806507.0, + "ugf": 254384800.0 + }, + "presim_s": 6.6 + }, + { + "case_id": "C07_sky130_sW1.5_sL1", + "circuit_id": "C07", + "pdk": "sky130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "diff_cs", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.3, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.3, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.3, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.3, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "d4c987653d38d923", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 28.56 + }, + "f3db": { + "min": 7604000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 31.55705, + "f3db": 12673820.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 0.9047534, + "vo2": 0.9047534, + "idd": 4.000003e-05, + "vos_in": 0.0, + "gain_lf": 31.55705, + "f3db": 12673820.0, + "ugf": 481568000.0 + }, + "presim_s": 6.3 + }, + { + "case_id": "C07_sky130_sW1.5_sL1.5", + "circuit_id": "C07", + "pdk": "sky130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "diff_cs", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.45, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.45, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.45, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.45, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "7e0eff77b0230ae8", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 32.2 + }, + "f3db": { + "min": 4552000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 35.19793, + "f3db": 7587366.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 0.904562, + "vo2": 0.904562, + "idd": 4.000003e-05, + "vos_in": 0.0, + "gain_lf": 35.19793, + "f3db": 7587366.0, + "ugf": 438580500.0 + }, + "presim_s": 10.8 + }, + { + "case_id": "C07_sky130_sW1.5_sL2", + "circuit_id": "C07", + "pdk": "sky130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "diff_cs", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.6, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.6, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.6, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.6, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "db5adcd296ee3c65", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 34.81 + }, + "f3db": { + "min": 3075000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 37.80515, + "f3db": 5124564.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 0.9047223, + "vo2": 0.9047223, + "idd": 4.000003e-05, + "vos_in": 0.0, + "gain_lf": 37.80515, + "f3db": 5124564.0, + "ugf": 400100200.0 + }, + "presim_s": 9.8 + }, + { + "case_id": "C07_sky130_sW1_sL1", + "circuit_id": "C07", + "pdk": "sky130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "diff_cs", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "987ca528fb04696e", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 28.41 + }, + "f3db": { + "min": 7014000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 31.41335, + "f3db": 11690480.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 0.9042868, + "vo2": 0.9042868, + "idd": 4.000002e-05, + "vos_in": -1.81899e-12, + "gain_lf": 31.41335, + "f3db": 11690480.0, + "ugf": 436524100.0 + }, + "presim_s": 6.4 + }, + { + "case_id": "C07_sky130_sW1_sL1.5", + "circuit_id": "C07", + "pdk": "sky130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "diff_cs", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "8a692dea32a17987", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 31.61 + }, + "f3db": { + "min": 4294000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 34.61195, + "f3db": 7157315.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 0.9041513, + "vo2": 0.9041513, + "idd": 4.000002e-05, + "vos_in": -1.65528e-10, + "gain_lf": 34.61195, + "f3db": 7157315.0, + "ugf": 386530100.0 + }, + "presim_s": 6.2 + }, + { + "case_id": "C07_sky130_sW1_sL2", + "circuit_id": "C07", + "pdk": "sky130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "diff_cs", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "fda265233217f677", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 33.83 + }, + "f3db": { + "min": 2981000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 36.82993, + "f3db": 4968312.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 0.9043304, + "vo2": 0.9043304, + "idd": 4.000002e-05, + "vos_in": 4.388494e-08, + "gain_lf": 36.82993, + "f3db": 4968312.0, + "ugf": 346516500.0 + }, + "presim_s": 6.2 + }, + { + "case_id": "C07_sky130_sW2_sL1", + "circuit_id": "C07", + "pdk": "sky130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "diff_cs", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "915c086e6bf2ab8d", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 28.56 + }, + "f3db": { + "min": 8015000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 31.55954, + "f3db": 13358630.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 0.9049994, + "vo2": 0.9049994, + "idd": 4.000003e-05, + "vos_in": 2.273737e-10, + "gain_lf": 31.55954, + "f3db": 13358630.0, + "ugf": 507592900.0 + }, + "presim_s": 10.9 + }, + { + "case_id": "C07_sky130_sW2_sL1.5", + "circuit_id": "C07", + "pdk": "sky130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "diff_cs", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "c9a6d7f9b58b9a1d", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 32.49 + }, + "f3db": { + "min": 4729000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 35.49124, + "f3db": 7881932.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 0.9047924, + "vo2": 0.9047924, + "idd": 4.000003e-05, + "vos_in": -1.81899e-12, + "gain_lf": 35.49124, + "f3db": 7881932.0, + "ugf": 472136200.0 + }, + "presim_s": 10.8 + }, + { + "case_id": "C07_sky130_sW2_sL2", + "circuit_id": "C07", + "pdk": "sky130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "diff_cs", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "0d0b3898849cd39c", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 35.33 + }, + "f3db": { + "min": 3147000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 38.33312, + "f3db": 5244487.0 + }, + "floors": { + "gain_lf": { + "min": 20.0 + }, + "f3db": { + "min": 100000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 0.9049579, + "vo2": 0.9049579, + "idd": 4.000003e-05, + "vos_in": -1.81899e-12, + "gain_lf": 38.33312, + "f3db": 5244487.0, + "ugf": 436283600.0 + }, + "presim_s": 6.5 + }, + { + "case_id": "C08_gf180_sW0.5_sL1", + "circuit_id": "C08", + "pdk": "gf180", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "ota", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.56, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.56, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "c8f7bdc8b98415ed", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 34.73 + }, + "ugf": { + "min": 11280000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 37.72799, + "ugf": 18808120.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 1.65, + "idd": 3.891173e-05, + "vos": 0.0003982061, + "gain_lf": 37.72799, + "ph_lf": 0.04682252, + "ugf": 18808120.0, + "ph_ugf": -89.96297, + "f3db": 243375.5, + "pm": 89.99020748 + }, + "presim_s": 0.1 + }, + { + "case_id": "C08_gf180_sW0.5_sL1.5", + "circuit_id": "C08", + "pdk": "gf180", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "ota", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.84, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.84, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "bbc98ab733caefd8", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 37.47 + }, + "ugf": { + "min": 8782000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 40.47497, + "ugf": 14636300.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 1.65, + "idd": 3.567391e-05, + "vos": -0.00154057, + "gain_lf": 40.47497, + "ph_lf": 0.05533407, + "ugf": 14636300.0, + "ph_ugf": -90.43508, + "f3db": 138085.6, + "pm": 89.50958593 + }, + "presim_s": 0.1 + }, + { + "case_id": "C08_gf180_sW0.5_sL2", + "circuit_id": "C08", + "pdk": "gf180", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "ota", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.12, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.12, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "56f9bd7e977fa709", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 38.94 + }, + "ugf": { + "min": 7248000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 41.94394, + "ugf": 12079980.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 1.65, + "idd": 3.235917e-05, + "vos": -0.00228577, + "gain_lf": 41.94394, + "ph_lf": 0.05539647, + "ugf": 12079980.0, + "ph_ugf": -90.80232, + "f3db": 96233.96, + "pm": 89.14228353 + }, + "presim_s": 0.1 + }, + { + "case_id": "C08_gf180_sW1.5_sL1", + "circuit_id": "C08", + "pdk": "gf180", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "ota", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.56, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.56, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "6a6ce56e82646caa", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 37.79 + }, + "ugf": { + "min": 20290000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 40.79162, + "ugf": 33823100.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 1.65, + "idd": 4.332281e-05, + "vos": 0.003542733, + "gain_lf": 40.79162, + "ph_lf": 0.08127332, + "ugf": 33823100.0, + "ph_ugf": -91.36284, + "f3db": 307817.6, + "pm": 88.55588668 + }, + "presim_s": 0.1 + }, + { + "case_id": "C08_gf180_sW1.5_sL1.5", + "circuit_id": "C08", + "pdk": "gf180", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "ota", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.84, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.84, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "0e70d53c874bdca7", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 41.24 + }, + "ugf": { + "min": 15960000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 44.23723, + "ugf": 26604640.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 1.65, + "idd": 3.917696e-05, + "vos": 0.001677474, + "gain_lf": 44.23723, + "ph_lf": 0.1134194, + "ugf": 26604640.0, + "ph_ugf": -92.15202, + "f3db": 162947.9, + "pm": 87.73456060000001 + }, + "presim_s": 0.1 + }, + { + "case_id": "C08_gf180_sW1.5_sL2", + "circuit_id": "C08", + "pdk": "gf180", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "ota", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.12, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.12, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "e6658e2440989467", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 42.76 + }, + "ugf": { + "min": 13570000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 45.76099, + "ugf": 22610800.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 1.65, + "idd": 3.729526e-05, + "vos": 0.000924354, + "gain_lf": 45.76099, + "ph_lf": 0.1278973, + "ugf": 22610800.0, + "ph_ugf": -92.80872, + "f3db": 116432.0, + "pm": 87.0633827 + }, + "presim_s": 0.1 + }, + { + "case_id": "C08_gf180_sW1_sL1", + "circuit_id": "C08", + "pdk": "gf180", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "ota", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "867f68557540e58c", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 36.87 + }, + "ugf": { + "min": 16570000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 39.87391, + "ugf": 27619540.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 1.65, + "idd": 4.152962e-05, + "vos": 0.002837094, + "gain_lf": 39.87391, + "ph_lf": 0.06939099, + "ugf": 27619540.0, + "ph_ugf": -90.73614, + "f3db": 279430.5, + "pm": 89.19446900999999 + }, + "presim_s": 0.1 + }, + { + "case_id": "C08_gf180_sW1_sL1.5", + "circuit_id": "C08", + "pdk": "gf180", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "ota", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "22aee7afdf9f5ebc", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 40.05 + }, + "ugf": { + "min": 13060000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 43.04609, + "ugf": 21769850.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 1.65, + "idd": 3.830364e-05, + "vos": 0.0009475883, + "gain_lf": 43.04609, + "ph_lf": 0.09210504, + "ugf": 21769850.0, + "ph_ugf": -91.33537, + "f3db": 152868.1, + "pm": 88.57252496 + }, + "presim_s": 0.1 + }, + { + "case_id": "C08_gf180_sW1_sL2", + "circuit_id": "C08", + "pdk": "gf180", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "ota", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "94f40bc58f7d1dd9", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 41.46 + }, + "ugf": { + "min": 11110000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 44.45594, + "ugf": 18509170.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 1.65, + "idd": 3.676275e-05, + "vos": 0.0001022394, + "gain_lf": 44.45594, + "ph_lf": 0.1006336, + "ugf": 18509170.0, + "ph_ugf": -91.81732, + "f3db": 110512.8, + "pm": 88.08204640000001 + }, + "presim_s": 0.2 + }, + { + "case_id": "C08_gf180_sW2_sL1", + "circuit_id": "C08", + "pdk": "gf180", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "ota", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "37e94361ce7b421a", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 38.31 + }, + "ugf": { + "min": 23190000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 41.31396, + "ugf": 38648770.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 1.65, + "idd": 4.47758e-05, + "vos": 0.003887041, + "gain_lf": 41.31396, + "ph_lf": 0.08878371, + "ugf": 38648770.0, + "ph_ugf": -91.91884, + "f3db": 331511.2, + "pm": 87.99237629 + }, + "presim_s": 0.1 + }, + { + "case_id": "C08_gf180_sW2_sL1.5", + "circuit_id": "C08", + "pdk": "gf180", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "ota", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "659c2ad457b68bce", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 41.92 + }, + "ugf": { + "min": 18230000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 44.9243, + "ugf": 30378520.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 1.65, + "idd": 3.995612e-05, + "vos": 0.002011632, + "gain_lf": 44.9243, + "ph_lf": 0.127504, + "ugf": 30378520.0, + "ph_ugf": -92.8935, + "f3db": 172103.3, + "pm": 86.978996 + }, + "presim_s": 0.1 + }, + { + "case_id": "C08_gf180_sW2_sL2", + "circuit_id": "C08", + "pdk": "gf180", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "ota", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "c9bb5e751c50b45c", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 43.52 + }, + "ugf": { + "min": 15510000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 46.51716, + "ugf": 25849390.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 1.65, + "idd": 3.775778e-05, + "vos": 0.001299616, + "gain_lf": 46.51716, + "ph_lf": 0.1462722, + "ugf": 25849390.0, + "ph_ugf": -93.73535, + "f3db": 122115.8, + "pm": 86.1183778 + }, + "presim_s": 0.1 + }, + { + "case_id": "C08_ihp130_sW0.5_sL1", + "circuit_id": "C08", + "pdk": "ihp130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "ota", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.39, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.39, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.39, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.39, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "749950b295caac87", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "gain_lf=24.93 below floor 25" + ], + "spec": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 14620000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 24.92868, + "ugf": 24369370.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.5999993, + "idd": 2.790715e-05, + "vos": -0.00661216, + "gain_lf": 24.92868, + "ph_lf": 0.0123724, + "ugf": 24369370.0, + "ph_ugf": -87.4555, + "f3db": 1378959.0, + "pm": 92.5321276 + }, + "presim_s": 0.6 + }, + { + "case_id": "C08_ihp130_sW0.5_sL1.5", + "circuit_id": "C08", + "pdk": "ihp130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "ota", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.585, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.585, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.585, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.39, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.585, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 2.0, + "l0": 0.39, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.585, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "53f98b713459bcc6", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 12790000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 25.84446, + "ugf": 21318990.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.5999991, + "idd": 2.779222e-05, + "vos": -0.0091125, + "gain_lf": 25.84446, + "ph_lf": 0.01334806, + "ugf": 21318990.0, + "ph_ugf": -88.13613, + "f3db": 1085072.0, + "pm": 91.85052194000001 + }, + "presim_s": 0.6 + }, + { + "case_id": "C08_ihp130_sW0.5_sL2", + "circuit_id": "C08", + "pdk": "ihp130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "ota", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.78, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.78, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.78, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.39, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.78, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.39, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.78, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "d67ac26c94abfeba", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 11010000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 26.30932, + "ugf": 18351520.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.5999989, + "idd": 2.6294e-05, + "vos": -0.0108065, + "gain_lf": 26.30932, + "ph_lf": 0.01353739, + "ugf": 18351520.0, + "ph_ugf": -88.65026, + "f3db": 885664.7, + "pm": 91.33620261 + }, + "presim_s": 0.5 + }, + { + "case_id": "C08_ihp130_sW1.5_sL1", + "circuit_id": "C08", + "pdk": "ihp130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "ota", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.39, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.39, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.39, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.39, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.39, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.39, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.39, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "9552d7593fa18ddc", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 19680000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 25.00595, + "ugf": 32807890.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.6000003, + "idd": 2.426154e-05, + "vos": 0.002842062, + "gain_lf": 25.00595, + "ph_lf": 0.0131306, + "ugf": 32807890.0, + "ph_ugf": -88.43947, + "f3db": 1840752.0, + "pm": 91.5473994 + }, + "presim_s": 1.9 + }, + { + "case_id": "C08_ihp130_sW1.5_sL1.5", + "circuit_id": "C08", + "pdk": "ihp130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "ota", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.585, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.585, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.585, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.39, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.585, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 2.0, + "l0": 0.39, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.585, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "ad8cd836f536beef", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 19170000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 26.32609, + "ugf": 31952060.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.6000001, + "idd": 2.668031e-05, + "vos": 0.0005374781, + "gain_lf": 26.32609, + "ph_lf": 0.01522783, + "ugf": 31952060.0, + "ph_ugf": -89.66261, + "f3db": 1541715.0, + "pm": 90.32216217 + }, + "presim_s": 1.4 + }, + { + "case_id": "C08_ihp130_sW1.5_sL2", + "circuit_id": "C08", + "pdk": "ihp130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "ota", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.78, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.78, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.78, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.39, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.78, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.39, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.78, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "e3670a45183a2b3e", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 18270000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 27.21287, + "ugf": 30442040.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.5999999, + "idd": 2.797448e-05, + "vos": -0.00109955, + "gain_lf": 27.21287, + "ph_lf": 0.01669147, + "ugf": 30442040.0, + "ph_ugf": -90.73779, + "f3db": 1326164.0, + "pm": 89.24551853 + }, + "presim_s": 1.5 + }, + { + "case_id": "C08_ihp130_sW1_sL1", + "circuit_id": "C08", + "pdk": "ihp130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "ota", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.39, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.39, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "eb3cf902919b635b", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 18630000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 25.09325, + "ugf": 31051350.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.6, + "idd": 2.712371e-05, + "vos": -0.000394234, + "gain_lf": 25.09325, + "ph_lf": 0.01316656, + "ugf": 31051350.0, + "ph_ugf": -88.01592, + "f3db": 1725048.0, + "pm": 91.97091344 + }, + "presim_s": 1.1 + }, + { + "case_id": "C08_ihp130_sW1_sL1.5", + "circuit_id": "C08", + "pdk": "ihp130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "ota", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.585, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.585, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.585, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.39, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.585, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 2.0, + "l0": 0.39, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.585, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "0a402a64f4f7ae60", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 17640000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 26.3514, + "ugf": 29403360.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.5999997, + "idd": 2.921485e-05, + "vos": -0.0028096, + "gain_lf": 26.3514, + "ph_lf": 0.01505258, + "ugf": 29403360.0, + "ph_ugf": -89.00909, + "f3db": 1412325.0, + "pm": 90.97585742 + }, + "presim_s": 1.6 + }, + { + "case_id": "C08_ihp130_sW1_sL2", + "circuit_id": "C08", + "pdk": "ihp130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "ota", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.78, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.78, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.78, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.39, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.78, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.39, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.78, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "d9b17ef2697f09d9", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 16380000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 27.14772, + "ugf": 27305520.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.5999995, + "idd": 3.003247e-05, + "vos": -0.00457877, + "gain_lf": 27.14772, + "ph_lf": 0.01624442, + "ugf": 27305520.0, + "ph_ugf": -89.85906, + "f3db": 1197272.0, + "pm": 90.12469558 + }, + "presim_s": 1.7 + }, + { + "case_id": "C08_ihp130_sW2_sL1", + "circuit_id": "C08", + "pdk": "ihp130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "ota", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.39, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.39, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "7b7b8a8fb958c6e0", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "gain_lf=24.94 below floor 25" + ], + "spec": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 19730000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 24.94102, + "ugf": 32877000.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.6000005, + "idd": 2.164491e-05, + "vos": 0.00488522, + "gain_lf": 24.94102, + "ph_lf": 0.01299105, + "ugf": 32877000.0, + "ph_ugf": -88.82285, + "f3db": 1859066.0, + "pm": 91.16415895 + }, + "presim_s": 1.6 + }, + { + "case_id": "C08_ihp130_sW2_sL1.5", + "circuit_id": "C08", + "pdk": "ihp130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "ota", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.585, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.585, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.585, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.39, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.585, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 2.0, + "l0": 0.39, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.585, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "2550ddb5c9302ac3", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 19640000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 26.25516, + "ugf": 32728630.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.6000003, + "idd": 2.414455e-05, + "vos": 0.002635176, + "gain_lf": 26.25516, + "ph_lf": 0.0151384, + "ugf": 32728630.0, + "ph_ugf": -90.22953, + "f3db": 1592089.0, + "pm": 89.7553316 + }, + "presim_s": 3.2 + }, + { + "case_id": "C08_ihp130_sW2_sL2", + "circuit_id": "C08", + "pdk": "ihp130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "ota", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.78, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.78, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.39, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.78, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.39, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.78, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.39, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.78, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "3095cdc2e3040032", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 18950000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 27.15846, + "ugf": 31575720.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.6000001, + "idd": 2.557596e-05, + "vos": 0.001060683, + "gain_lf": 27.15846, + "ph_lf": 0.01669001, + "ugf": 31575720.0, + "ph_ugf": -91.511, + "f3db": 1387941.0, + "pm": 88.47230999 + }, + "presim_s": 3.5 + }, + { + "case_id": "C08_sky130_sW0.5_sL1", + "circuit_id": "C08", + "pdk": "sky130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "ota", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.3, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.3, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "41f4def2270387c7", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 28.33 + }, + "ugf": { + "min": 14540000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 31.32883, + "ugf": 24225320.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.8999993, + "idd": 2.464207e-05, + "vos": -0.00692929, + "gain_lf": 31.32883, + "ph_lf": 0.02563727, + "ugf": 24225320.0, + "ph_ugf": -88.88233, + "f3db": 655171.4, + "pm": 91.09203273 + }, + "presim_s": 9.6 + }, + { + "case_id": "C08_sky130_sW0.5_sL1.5", + "circuit_id": "C08", + "pdk": "sky130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "ota", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.45, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.45, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "13e2706a081f53ec", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 31.21 + }, + "ugf": { + "min": 11880000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 34.21334, + "ugf": 19794020.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.8999993, + "idd": 2.218699e-05, + "vos": -0.0070443, + "gain_lf": 34.21334, + "ph_lf": 0.03329973, + "ugf": 19794020.0, + "ph_ugf": -89.51321, + "f3db": 384368.7, + "pm": 90.45349027 + }, + "presim_s": 9.8 + }, + { + "case_id": "C08_sky130_sW0.5_sL2", + "circuit_id": "C08", + "pdk": "sky130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "ota", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.6, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.6, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "cf5925c6135e65c7", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 33.44 + }, + "ugf": { + "min": 9793000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 36.44027, + "ugf": 16321500.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.8999994, + "idd": 1.938649e-05, + "vos": -0.00648764, + "gain_lf": 36.44027, + "ph_lf": 0.03919215, + "ugf": 16321500.0, + "ph_ugf": -89.95196, + "f3db": 245052.1, + "pm": 90.00884785 + }, + "presim_s": 10.4 + }, + { + "case_id": "C08_sky130_sW1.5_sL1", + "circuit_id": "C08", + "pdk": "sky130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "ota", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.3, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.3, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.3, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.3, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.3, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "5265442c24e0e4a4", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 28.94 + }, + "ugf": { + "min": 21880000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 31.93944, + "ugf": 36474930.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.8999997, + "idd": 2.808255e-05, + "vos": -0.00293878, + "gain_lf": 31.93944, + "ph_lf": 0.02994302, + "ugf": 36474930.0, + "ph_ugf": -89.51701, + "f3db": 919810.7, + "pm": 90.45304698 + }, + "presim_s": 6.9 + }, + { + "case_id": "C08_sky130_sW1.5_sL1.5", + "circuit_id": "C08", + "pdk": "sky130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "ota", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.45, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.45, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.45, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.45, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.45, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "66326fdadc4c0d0f", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 32.71 + }, + "ugf": { + "min": 20920000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 35.70749, + "ugf": 34859820.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.8999996, + "idd": 2.89816e-05, + "vos": -0.0035564, + "gain_lf": 35.70749, + "ph_lf": 0.04583744, + "ugf": 34859820.0, + "ph_ugf": -90.49729, + "f3db": 569871.5, + "pm": 89.45687256 + }, + "presim_s": 6.5 + }, + { + "case_id": "C08_sky130_sW1.5_sL2", + "circuit_id": "C08", + "pdk": "sky130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "ota", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.6, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.6, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.6, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.6, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.6, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "db7473d1d15a00a8", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 35.4 + }, + "ugf": { + "min": 19040000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 38.4011, + "ugf": 31734200.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.8999997, + "idd": 2.833459e-05, + "vos": -0.00337589, + "gain_lf": 38.4011, + "ph_lf": 0.06131791, + "ugf": 31734200.0, + "ph_ugf": -91.23838, + "f3db": 380782.5, + "pm": 88.70030209 + }, + "presim_s": 8.5 + }, + { + "case_id": "C08_sky130_sW1_sL1", + "circuit_id": "C08", + "pdk": "sky130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "ota", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "ecaff994d341081e", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 28.85 + }, + "ugf": { + "min": 20130000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 31.8508, + "ugf": 33543780.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.8999996, + "idd": 2.860214e-05, + "vos": -0.00434792, + "gain_lf": 31.8508, + "ph_lf": 0.02922916, + "ugf": 33543780.0, + "ph_ugf": -89.2572, + "f3db": 854083.7, + "pm": 90.71357084 + }, + "presim_s": 10.1 + }, + { + "case_id": "C08_sky130_sW1_sL1.5", + "circuit_id": "C08", + "pdk": "sky130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "ota", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "a0bbab3b6fbfb727", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 32.19 + }, + "ugf": { + "min": 18120000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 35.18988, + "ugf": 30192960.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.8999995, + "idd": 2.827926e-05, + "vos": -0.00480091, + "gain_lf": 35.18988, + "ph_lf": 0.04204101, + "ugf": 30192960.0, + "ph_ugf": -90.08166, + "f3db": 523419.9, + "pm": 89.87629899 + }, + "presim_s": 10.4 + }, + { + "case_id": "C08_sky130_sW1_sL2", + "circuit_id": "C08", + "pdk": "sky130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "ota", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "c583133ebdaacaf3", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 34.65 + }, + "ugf": { + "min": 15750000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 37.65402, + "ugf": 26256940.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.8999996, + "idd": 2.636539e-05, + "vos": -0.00448632, + "gain_lf": 37.65402, + "ph_lf": 0.05390085, + "ugf": 26256940.0, + "ph_ugf": -90.68992, + "f3db": 342782.6, + "pm": 89.25617915 + }, + "presim_s": 6.5 + }, + { + "case_id": "C08_sky130_sW2_sL1", + "circuit_id": "C08", + "pdk": "sky130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "ota", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "5b4ca74c921b0f82", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 28.88 + }, + "ugf": { + "min": 22290000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 31.88189, + "ugf": 37147170.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.8999998, + "idd": 2.680646e-05, + "vos": -0.00203215, + "gain_lf": 31.88189, + "ph_lf": 0.02981593, + "ugf": 37147170.0, + "ph_ugf": -89.73583, + "f3db": 942694.5, + "pm": 90.23435407 + }, + "presim_s": 10.9 + }, + { + "case_id": "C08_sky130_sW2_sL1.5", + "circuit_id": "C08", + "pdk": "sky130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "ota", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "d84083be8ee54420", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 32.98 + }, + "ugf": { + "min": 21900000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 35.98452, + "ugf": 36495360.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.8999997, + "idd": 2.789256e-05, + "vos": -0.00276677, + "gain_lf": 35.98452, + "ph_lf": 0.04767376, + "ugf": 36495360.0, + "ph_ugf": -90.85866, + "f3db": 577797.6, + "pm": 89.09366624 + }, + "presim_s": 7.3 + }, + { + "case_id": "C08_sky130_sW2_sL2", + "circuit_id": "C08", + "pdk": "sky130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "ota", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "d310cfc1bd5d7ae9", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 35.9 + }, + "ugf": { + "min": 20370000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 38.9039, + "ugf": 33947460.0 + }, + "floors": { + "gain_lf": { + "min": 25.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.8999997, + "idd": 2.75585e-05, + "vos": -0.0026313, + "gain_lf": 38.9039, + "ph_lf": 0.06574798, + "ugf": 33947460.0, + "ph_ugf": -91.70478, + "f3db": 384031.3, + "pm": 88.22947202 + }, + "presim_s": 6.7 + }, + { + "case_id": "C09_gf180_sW0.5_sL1", + "circuit_id": "C09", + "pdk": "gf180", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "ota", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "a2c77bb7c2fdcb82", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "gain_lf=33 below floor 35", + "ugf=1.153e+06 below floor 2e+06" + ], + "spec": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 33.00468, + "ugf": 1152701.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 1.484969, + "idd": 4.000001e-05, + "vos": -0.277689, + "gain_lf": 33.00468, + "ph_lf": -0.08404525, + "ugf": 1152701.0, + "ph_ugf": -88.54876, + "f3db": 25707.47, + "pm": 91.53528525 + }, + "presim_s": 0.1 + }, + { + "case_id": "C09_gf180_sW0.5_sL1.5", + "circuit_id": "C09", + "pdk": "gf180", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "ota", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "c932e6f486a55940", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "servo did not reach the output target: vout0=-0.238433 target=1.485 (tol 0.066 V)", + "gain_lf=-26.09 below floor 35", + "ugf: not measurable in the schematic" + ], + "spec": { + "gain_lf": { + "min": 35.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": -26.08643, + "ugf": null + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": -0.238433, + "idd": 3.999998e-05, + "vos": -0.5, + "gain_lf": -26.08643, + "ph_lf": -0.00115706, + "f3db": 4465256.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C09_gf180_sW0.5_sL2", + "circuit_id": "C09", + "pdk": "gf180", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "ota", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "c07b8735a7aa3336", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "servo did not reach the output target: vout0=-0.565526 target=1.485 (tol 0.066 V)", + "gain_lf=-37.12 below floor 35", + "ugf: not measurable in the schematic" + ], + "spec": { + "gain_lf": { + "min": 35.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": -37.11679, + "ugf": null + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": -0.565526, + "idd": 3.903016e-05, + "vos": -0.5, + "gain_lf": -37.11679, + "ph_lf": -0.000426523, + "f3db": 9797591.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C09_gf180_sW1.5_sL1", + "circuit_id": "C09", + "pdk": "gf180", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "ota", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "718a3f2f9e21dbd6", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 45.31 + }, + "ugf": { + "min": 8305000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 48.30557, + "ugf": 13841910.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 1.485, + "idd": 4.000004e-05, + "vos": -0.00340849, + "gain_lf": 48.30557, + "ph_lf": 0.1389248, + "ugf": 13841910.0, + "ph_ugf": -92.34326, + "f3db": 53115.2, + "pm": 87.5178152 + }, + "presim_s": 0.3 + }, + { + "case_id": "C09_gf180_sW1.5_sL1.5", + "circuit_id": "C09", + "pdk": "gf180", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "ota", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "8f56e9e4010101fa", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 46.27 + }, + "ugf": { + "min": 5903000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 49.27492, + "ugf": 9838559.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 1.484999, + "idd": 4.000003e-05, + "vos": -0.00537861, + "gain_lf": 49.27492, + "ph_lf": 0.1095608, + "ugf": 9838559.0, + "ph_ugf": -92.82147, + "f3db": 33796.36, + "pm": 87.0689692 + }, + "presim_s": 0.3 + }, + { + "case_id": "C09_gf180_sW1.5_sL2", + "circuit_id": "C09", + "pdk": "gf180", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "ota", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "ac4979c19963d71c", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 46.03 + }, + "ugf": { + "min": 2773000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 49.03029, + "ugf": 4621210.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 1.484996, + "idd": 4.000003e-05, + "vos": -0.0438883, + "gain_lf": 49.03029, + "ph_lf": 0.01109919, + "ugf": 4621210.0, + "ph_ugf": -90.71342, + "f3db": 16290.77, + "pm": 89.27548081 + }, + "presim_s": 0.4 + }, + { + "case_id": "C09_gf180_sW1_sL1", + "circuit_id": "C09", + "pdk": "gf180", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "ota", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "9d6eb97d1f873d08", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 42.52 + }, + "ugf": { + "min": 6008000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 45.52368, + "ugf": 10013880.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 1.484999, + "idd": 4.000002e-05, + "vos": -0.00707075, + "gain_lf": 45.52368, + "ph_lf": 0.07554511, + "ugf": 10013880.0, + "ph_ugf": -91.24582, + "f3db": 52922.97, + "pm": 88.67863489000001 + }, + "presim_s": 0.3 + }, + { + "case_id": "C09_gf180_sW1_sL1.5", + "circuit_id": "C09", + "pdk": "gf180", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "ota", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "38178daef83b041b", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 42.89 + }, + "ugf": { + "min": 2000000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 45.88616, + "ugf": 3014986.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 1.48499, + "idd": 4.000002e-05, + "vos": -0.0960662, + "gain_lf": 45.88616, + "ph_lf": -0.02556657, + "ugf": 3014986.0, + "ph_ugf": -89.70507, + "f3db": 15249.72, + "pm": 90.32049656999999 + }, + "presim_s": 0.3 + }, + { + "case_id": "C09_gf180_sW1_sL2", + "circuit_id": "C09", + "pdk": "gf180", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "ota", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "1564b7b67504e34e", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "ugf=7.508e+05 below floor 2e+06" + ], + "spec": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 35.77727, + "ugf": 750824.1 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 1.484953, + "idd": 4.000001e-05, + "vos": -0.367095, + "gain_lf": 35.77727, + "ph_lf": -0.2812141, + "ugf": 750824.1, + "ph_ugf": -88.33157, + "f3db": 12159.9, + "pm": 91.9496441 + }, + "presim_s": 0.3 + }, + { + "case_id": "C09_gf180_sW2_sL1", + "circuit_id": "C09", + "pdk": "gf180", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "ota", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "08da8cc09fe65eec", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 47.26 + }, + "ugf": { + "min": 10270000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 50.26471, + "ugf": 17110230.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 1.485, + "idd": 4.000005e-05, + "vos": -0.00218438, + "gain_lf": 50.26471, + "ph_lf": 0.1969983, + "ugf": 17110230.0, + "ph_ugf": -93.43458, + "f3db": 52459.47, + "pm": 86.3684217 + }, + "presim_s": 0.5 + }, + { + "case_id": "C09_gf180_sW2_sL1.5", + "circuit_id": "C09", + "pdk": "gf180", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "ota", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "f25508dd5db37001", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 48.16 + }, + "ugf": { + "min": 7397000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 51.15948, + "ugf": 12328900.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 1.485, + "idd": 4.000005e-05, + "vos": -0.00304527, + "gain_lf": 51.15948, + "ph_lf": 0.173299, + "ugf": 12328900.0, + "ph_ugf": -94.13874, + "f3db": 34166.46, + "pm": 85.687961 + }, + "presim_s": 0.4 + }, + { + "case_id": "C09_gf180_sW2_sL2", + "circuit_id": "C09", + "pdk": "gf180", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "ota", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "292c825afbb8df4d", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 48.02 + }, + "ugf": { + "min": 5830000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 51.01766, + "ugf": 9717255.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 1.485, + "idd": 4.000004e-05, + "vos": -0.00449277, + "gain_lf": 51.01766, + "ph_lf": 0.1294533, + "ugf": 9717255.0, + "ph_ugf": -94.75591, + "f3db": 27409.63, + "pm": 85.1146367 + }, + "presim_s": 0.4 + }, + { + "case_id": "C09_ihp130_sW0.5_sL1", + "circuit_id": "C09", + "pdk": "ihp130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "ota", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.26, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.26, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.26, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.26, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "4a112fc40a3fe2cb", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 40.68 + }, + "ugf": { + "min": 13640000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 43.67905, + "ugf": 22738910.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.5399997, + "idd": 2e-05, + "vos": -0.00252386, + "gain_lf": 43.67905, + "ph_lf": 0.1062832, + "ugf": 22738910.0, + "ph_ugf": -92.50618, + "f3db": 148695.9, + "pm": 87.3875368 + }, + "presim_s": 3.3 + }, + { + "case_id": "C09_ihp130_sW0.5_sL1.5", + "circuit_id": "C09", + "pdk": "ihp130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "ota", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "e09ec1f3c2822a3b", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 41.47 + }, + "ugf": { + "min": 12430000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 44.4675, + "ugf": 20708420.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.5399997, + "idd": 2e-05, + "vos": -0.00253795, + "gain_lf": 44.4675, + "ph_lf": 0.1142998, + "ugf": 20708420.0, + "ph_ugf": -93.60535, + "f3db": 123797.1, + "pm": 86.2803502 + }, + "presim_s": 3.6 + }, + { + "case_id": "C09_ihp130_sW0.5_sL2", + "circuit_id": "C09", + "pdk": "ihp130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "ota", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "c928b5ccafcda93a", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 40.91 + }, + "ugf": { + "min": 10990000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 43.90615, + "ugf": 18316470.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.5399997, + "idd": 1.999999e-05, + "vos": -0.0030973, + "gain_lf": 43.90615, + "ph_lf": 0.104474, + "ugf": 18316470.0, + "ph_ugf": -94.50707, + "f3db": 117070.6, + "pm": 85.388456 + }, + "presim_s": 3.0 + }, + { + "case_id": "C09_ihp130_sW1.5_sL1", + "circuit_id": "C09", + "pdk": "ihp130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "ota", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 12.0, + "l": 0.26, + "nf": 24, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 12.0, + "l": 0.26, + "nf": 24, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 12.0, + "l": 0.26, + "nf": 24, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 12.0, + "l": 0.26, + "nf": 24, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.26, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.26, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.26, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.26, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "1c8b504905907c72", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 45.18 + }, + "ugf": { + "min": 18610000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 48.18118, + "ugf": 31024640.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.5399999, + "idd": 2e-05, + "vos": -0.00082002, + "gain_lf": 48.18118, + "ph_lf": 0.1892039, + "ugf": 31024640.0, + "ph_ugf": -97.45121, + "f3db": 122268.6, + "pm": 82.3595861 + }, + "presim_s": 16.9 + }, + { + "case_id": "C09_ihp130_sW1.5_sL1.5", + "circuit_id": "C09", + "pdk": "ihp130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "ota", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 12.0, + "l": 0.39, + "nf": 24, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 12.0, + "l": 0.39, + "nf": 24, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 12.0, + "l": 0.39, + "nf": 24, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 12.0, + "l": 0.39, + "nf": 24, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.39, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.39, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.39, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.39, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "a03b66ce86a207f2", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 47.12 + }, + "ugf": { + "min": 17850000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 50.12015, + "ugf": 29755190.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.5399999, + "idd": 2e-05, + "vos": -0.00068188, + "gain_lf": 50.12015, + "ph_lf": 0.2350669, + "ugf": 29755190.0, + "ph_ugf": -100.001, + "f3db": 94823.1, + "pm": 79.76393309999999 + }, + "presim_s": 14.9 + }, + { + "case_id": "C09_ihp130_sW1.5_sL2", + "circuit_id": "C09", + "pdk": "ihp130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "ota", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 12.0, + "l": 0.52, + "nf": 24, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 12.0, + "l": 0.52, + "nf": 24, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 12.0, + "l": 0.52, + "nf": 24, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 12.0, + "l": 0.52, + "nf": 24, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.52, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.52, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.52, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.52, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "b468f8cab3fa3e1e", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 47.73 + }, + "ugf": { + "min": 16740000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 50.73498, + "ugf": 27896820.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.5399999, + "idd": 1.999999e-05, + "vos": -0.000680615, + "gain_lf": 50.73498, + "ph_lf": 0.2498229, + "ugf": 27896820.0, + "ph_ugf": -102.4383, + "f3db": 84102.49, + "pm": 77.3118771 + }, + "presim_s": 13.3 + }, + { + "case_id": "C09_ihp130_sW1_sL1", + "circuit_id": "C09", + "pdk": "ihp130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "ota", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 8.0, + "l": 0.26, + "nf": 16, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 8.0, + "l": 0.26, + "nf": 16, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 8.0, + "l": 0.26, + "nf": 16, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 8.0, + "l": 0.26, + "nf": 16, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.26, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.26, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.26, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.26, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "07fe9430f41bc598", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 43.79 + }, + "ugf": { + "min": 17120000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 46.79468, + "ugf": 28533340.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.5399999, + "idd": 2e-05, + "vos": -0.00121206, + "gain_lf": 46.79468, + "ph_lf": 0.1587416, + "ugf": 28533340.0, + "ph_ugf": -95.19714, + "f3db": 131028.6, + "pm": 84.6441184 + }, + "presim_s": 9.8 + }, + { + "case_id": "C09_ihp130_sW1_sL1.5", + "circuit_id": "C09", + "pdk": "ihp130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "ota", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.39, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.39, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.39, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.39, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "2773afcd095b5522", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 45.42 + }, + "ugf": { + "min": 16230000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 48.41935, + "ugf": 27051630.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.5399999, + "idd": 2e-05, + "vos": -0.00106018, + "gain_lf": 48.41935, + "ph_lf": 0.1895577, + "ugf": 27051630.0, + "ph_ugf": -97.19938, + "f3db": 103583.1, + "pm": 82.6110623 + }, + "presim_s": 9.1 + }, + { + "case_id": "C09_ihp130_sW1_sL2", + "circuit_id": "C09", + "pdk": "ihp130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "ota", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.52, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.52, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.52, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.52, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "4f835db8a1834f5b", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 45.68 + }, + "ugf": { + "min": 15040000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 48.6813, + "ugf": 25073620.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.5399999, + "idd": 1.999999e-05, + "vos": -0.0011112, + "gain_lf": 48.6813, + "ph_lf": 0.1926998, + "ugf": 25073620.0, + "ph_ugf": -99.08496, + "f3db": 94007.78, + "pm": 80.7223402 + }, + "presim_s": 10.3 + }, + { + "case_id": "C09_ihp130_sW2_sL1", + "circuit_id": "C09", + "pdk": "ihp130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "ota", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 16.0, + "l": 0.26, + "nf": 32, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 16.0, + "l": 0.26, + "nf": 32, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 16.0, + "l": 0.26, + "nf": 32, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 16.0, + "l": 0.26, + "nf": 32, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.26, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.26, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.26, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.26, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "c11cce1d9fae50fc", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 46.0 + }, + "ugf": { + "min": 19340000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 49.00288, + "ugf": 32225140.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.5399999, + "idd": 2e-05, + "vos": -0.000623098, + "gain_lf": 49.00288, + "ph_lf": 0.2096117, + "ugf": 32225140.0, + "ph_ugf": -99.42526, + "f3db": 116519.7, + "pm": 80.36512830000001 + }, + "presim_s": 20.3 + }, + { + "case_id": "C09_ihp130_sW2_sL1.5", + "circuit_id": "C09", + "pdk": "ihp130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "ota", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 16.0, + "l": 0.39, + "nf": 32, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 16.0, + "l": 0.39, + "nf": 32, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 16.0, + "l": 0.39, + "nf": 32, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 16.0, + "l": 0.39, + "nf": 32, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.39, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.39, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.39, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.39, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "893e19d18b5b4777", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 48.11 + }, + "ugf": { + "min": 18620000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 51.11291, + "ugf": 31038840.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.5399999, + "idd": 2e-05, + "vos": -0.000504572, + "gain_lf": 51.11291, + "ph_lf": 0.2661535, + "ugf": 31038840.0, + "ph_ugf": -102.3014, + "f3db": 89504.81, + "pm": 77.4324465 + }, + "presim_s": 18.2 + }, + { + "case_id": "C09_ihp130_sW2_sL2", + "circuit_id": "C09", + "pdk": "ihp130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "ota", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 16.0, + "l": 0.52, + "nf": 32, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 16.0, + "l": 0.52, + "nf": 32, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 16.0, + "l": 0.52, + "nf": 32, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 16.0, + "l": 0.52, + "nf": 32, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.52, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.52, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.52, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.52, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "59f0815772422d47", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 48.92 + }, + "ugf": { + "min": 17550000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 51.92119, + "ugf": 29256470.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.54, + "idd": 1.999999e-05, + "vos": -0.00049106, + "gain_lf": 51.92119, + "ph_lf": 0.2898429, + "ugf": 29256470.0, + "ph_ugf": -105.043, + "f3db": 78417.83, + "pm": 74.6671571 + }, + "presim_s": 18.5 + }, + { + "case_id": "C09_sky130_sW0.5_sL1", + "circuit_id": "C09", + "pdk": "sky130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "ota", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "c5f1c2be5c408f29", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "gain_lf=22.39 below floor 35", + "ugf=8.161e+05 below floor 2e+06" + ], + "spec": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 22.38777, + "ugf": 816125.7 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.8099784, + "idd": 1.999994e-05, + "vos": -0.203514, + "gain_lf": 22.38777, + "ph_lf": 0.04722269, + "ugf": 816125.7, + "ph_ugf": -85.36469, + "f3db": 61954.29, + "pm": 94.58808731 + }, + "presim_s": 9.6 + }, + { + "case_id": "C09_sky130_sW0.5_sL1.5", + "circuit_id": "C09", + "pdk": "sky130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "ota", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "19df375125cff68f", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "gain_lf=8.451 below floor 35", + "ugf=2.38e+05 below floor 2e+06" + ], + "spec": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 8.450714, + "ugf": 237980.3 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.8099353, + "idd": 1.998931e-05, + "vos": -0.430166, + "gain_lf": 8.450714, + "ph_lf": -0.03354311, + "ugf": 237980.3, + "ph_ugf": -67.36812, + "f3db": 96809.53, + "pm": 112.66542310999999 + }, + "presim_s": 9.8 + }, + { + "case_id": "C09_sky130_sW0.5_sL2", + "circuit_id": "C09", + "pdk": "sky130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "ota", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "ccb734ca7f830377", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "servo did not reach the output target: vout0=-0.378581 target=0.81 (tol 0.036 V)", + "gain_lf=-32.29 below floor 35", + "ugf: not measurable in the schematic" + ], + "spec": { + "gain_lf": { + "min": 35.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": -32.28633, + "ugf": null + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": -0.378581, + "idd": 1.979847e-05, + "vos": -0.5, + "gain_lf": -32.28633, + "ph_lf": -0.0004297137, + "f3db": 9692172.0 + }, + "presim_s": 8.8 + }, + { + "case_id": "C09_sky130_sW1.5_sL1", + "circuit_id": "C09", + "pdk": "sky130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "ota", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 12.0, + "l": 0.3, + "nf": 24, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 12.0, + "l": 0.3, + "nf": 24, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 12.0, + "l": 0.3, + "nf": 24, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 12.0, + "l": 0.3, + "nf": 24, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.3, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.3, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.3, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.3, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "c62225e8e02aeb09", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 49.4 + }, + "ugf": { + "min": 7808000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 52.40228, + "ugf": 13012700.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.8099983, + "idd": 2.000002e-05, + "vos": -0.0168035, + "gain_lf": 52.40228, + "ph_lf": 0.4020045, + "ugf": 13012700.0, + "ph_ugf": -91.89919, + "f3db": 31157.06, + "pm": 87.69880549999999 + }, + "presim_s": 10.2 + }, + { + "case_id": "C09_sky130_sW1.5_sL1.5", + "circuit_id": "C09", + "pdk": "sky130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "ota", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 12.0, + "l": 0.45, + "nf": 24, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 12.0, + "l": 0.45, + "nf": 24, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 12.0, + "l": 0.45, + "nf": 24, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 12.0, + "l": 0.45, + "nf": 24, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.45, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.45, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.45, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.45, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "bdc2f7fa87756349", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "gain_lf=32.13 below floor 35", + "ugf=8.883e+05 below floor 2e+06" + ], + "spec": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 32.1333, + "ugf": 888255.2 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.8099819, + "idd": 1.99998e-05, + "vos": -0.173456, + "gain_lf": 32.1333, + "ph_lf": 0.2317307, + "ugf": 888255.2, + "ph_ugf": -87.46472, + "f3db": 21917.11, + "pm": 92.3035493 + }, + "presim_s": 15.1 + }, + { + "case_id": "C09_sky130_sW1.5_sL2", + "circuit_id": "C09", + "pdk": "sky130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "ota", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 12.0, + "l": 0.6, + "nf": 24, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 12.0, + "l": 0.6, + "nf": 24, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 12.0, + "l": 0.6, + "nf": 24, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 12.0, + "l": 0.6, + "nf": 24, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.6, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.6, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.6, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.6, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "ef9ccdc07d28f273", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "gain_lf=20.24 below floor 35", + "ugf=3.812e+05 below floor 2e+06" + ], + "spec": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 20.24485, + "ugf": 381238.9 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.8099682, + "idd": 1.999741e-05, + "vos": -0.280805, + "gain_lf": 20.24485, + "ph_lf": 0.05648142, + "ugf": 381238.9, + "ph_ugf": -82.89011, + "f3db": 37081.1, + "pm": 97.05340858 + }, + "presim_s": 11.8 + }, + { + "case_id": "C09_sky130_sW1_sL1", + "circuit_id": "C09", + "pdk": "sky130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "ota", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.3, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.3, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.3, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.3, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "cd1ed5967a96f430", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 41.68 + }, + "ugf": { + "min": 2480000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 44.68225, + "ugf": 4133133.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.8099937, + "idd": 2e-05, + "vos": -0.0626237, + "gain_lf": 44.68225, + "ph_lf": 0.3094196, + "ugf": 4133133.0, + "ph_ugf": -89.45495, + "f3db": 24016.61, + "pm": 90.2356304 + }, + "presim_s": 12.4 + }, + { + "case_id": "C09_sky130_sW1_sL1.5", + "circuit_id": "C09", + "pdk": "sky130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "ota", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.45, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.45, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.45, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.45, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "067b1a039bcdf28a", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "gain_lf=19.7 below floor 35", + "ugf=4.845e+05 below floor 2e+06" + ], + "spec": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 19.69825, + "ugf": 484494.6 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.8099714, + "idd": 1.999924e-05, + "vos": -0.258346, + "gain_lf": 19.69825, + "ph_lf": 0.05073495, + "ugf": 484494.6, + "ph_ugf": -83.25803, + "f3db": 50240.21, + "pm": 96.69123504999999 + }, + "presim_s": 11.8 + }, + { + "case_id": "C09_sky130_sW1_sL2", + "circuit_id": "C09", + "pdk": "sky130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "ota", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.6, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.6, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.6, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.6, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "c6bdd644af3634d8", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "gain_lf=13.57 below floor 35", + "ugf=2.635e+05 below floor 2e+06" + ], + "spec": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 13.5663, + "ugf": 263476.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.8099517, + "idd": 1.998939e-05, + "vos": -0.373543, + "gain_lf": 13.5663, + "ph_lf": -0.01904386, + "ugf": 263476.0, + "ph_ugf": -76.84406, + "f3db": 56293.05, + "pm": 103.17498386 + }, + "presim_s": 12.1 + }, + { + "case_id": "C09_sky130_sW2_sL1", + "circuit_id": "C09", + "pdk": "sky130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "ota", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 16.0, + "l": 0.3, + "nf": 32, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 16.0, + "l": 0.3, + "nf": 32, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 16.0, + "l": 0.3, + "nf": 32, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 16.0, + "l": 0.3, + "nf": 32, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.3, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.3, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.3, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.3, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "d7def710d3e945c9", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 52.21 + }, + "ugf": { + "min": 13190000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 55.20624, + "ugf": 21980900.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.8099995, + "idd": 2.000003e-05, + "vos": -0.00532868, + "gain_lf": 55.20624, + "ph_lf": 0.450439, + "ugf": 21980900.0, + "ph_ugf": -96.9943, + "f3db": 38654.91, + "pm": 82.555261 + }, + "presim_s": 10.7 + }, + { + "case_id": "C09_sky130_sW2_sL1.5", + "circuit_id": "C09", + "pdk": "sky130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "ota", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 16.0, + "l": 0.45, + "nf": 32, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 16.0, + "l": 0.45, + "nf": 32, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 16.0, + "l": 0.45, + "nf": 32, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 16.0, + "l": 0.45, + "nf": 32, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.45, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.45, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.45, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.45, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "be4570c009a3d202", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "ugf=1.549e+06 below floor 2e+06" + ], + "spec": { + "gain_lf": { + "min": 38.61 + }, + "ugf": { + "min": 2000000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 41.61467, + "ugf": 1548783.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.8099876, + "idd": 1.999992e-05, + "vos": -0.121526, + "gain_lf": 41.61467, + "ph_lf": 0.5103991, + "ugf": 1548783.0, + "ph_ugf": -88.16643, + "f3db": 12812.55, + "pm": 91.3231709 + }, + "presim_s": 10.5 + }, + { + "case_id": "C09_sky130_sW2_sL2", + "circuit_id": "C09", + "pdk": "sky130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "ota", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 16.0, + "l": 0.6, + "nf": 32, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 16.0, + "l": 0.6, + "nf": 32, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 16.0, + "l": 0.6, + "nf": 32, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 16.0, + "l": 0.6, + "nf": 32, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.6, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.6, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.6, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.6, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "44fe5f1a66fe9b30", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "gain_lf=27.56 below floor 35", + "ugf=5.326e+05 below floor 2e+06" + ], + "spec": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 27.55868, + "ugf": 532603.2 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 2000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.809976, + "idd": 1.999897e-05, + "vos": -0.222959, + "gain_lf": 27.55868, + "ph_lf": 0.176519, + "ugf": 532603.2, + "ph_ugf": -85.61201, + "f3db": 22222.56, + "pm": 94.211471 + }, + "presim_s": 10.5 + }, + { + "case_id": "C10_gf180_sW0.5_sL1", + "circuit_id": "C10", + "pdk": "gf180", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "ota_fd", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M9": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M10": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "f8150c9844f1b633", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 52.01 + }, + "ugf": { + "min": 11340000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 55.00841, + "ugf": 18895170.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 1.649936, + "vo2": 1.649936, + "idd": 8.00532e-05, + "vos_in": 0.0, + "gain_lf": 55.00841, + "ugf": 18895170.0, + "f3db": 33435.54 + }, + "presim_s": 0.1 + }, + { + "case_id": "C10_gf180_sW0.5_sL1.5", + "circuit_id": "C10", + "pdk": "gf180", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "ota_fd", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M9": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M10": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "0b47d0bba5d70315", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 41.19 + }, + "ugf": { + "min": 8907000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 44.18703, + "ugf": 14845750.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 1.650454, + "vo2": 1.650454, + "idd": 8.02609e-05, + "vos_in": -7.27596e-12, + "gain_lf": 44.18703, + "ugf": 14845750.0, + "f3db": 91314.97 + }, + "presim_s": 0.1 + }, + { + "case_id": "C10_gf180_sW0.5_sL2", + "circuit_id": "C10", + "pdk": "gf180", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "ota_fd", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M9": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M10": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "19c99fdac3b5d49f", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 39.36 + }, + "ugf": { + "min": 7541000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 42.36428, + "ugf": 12568580.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 1.650831, + "vo2": 1.650831, + "idd": 8.050033e-05, + "vos_in": -3.63798e-12, + "gain_lf": 42.36428, + "ugf": 12568580.0, + "f3db": 95502.18 + }, + "presim_s": 0.1 + }, + { + "case_id": "C10_gf180_sW1.5_sL1", + "circuit_id": "C10", + "pdk": "gf180", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "ota_fd", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M9": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M10": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "a57bf2de4e1e77d3", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 59.85 + }, + "ugf": { + "min": 19880000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 62.84618, + "ugf": 33128080.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 1.649799, + "vo2": 1.649799, + "idd": 8.059775e-05, + "vos_in": 1.091394e-11, + "gain_lf": 62.84618, + "ugf": 33128080.0, + "f3db": 23787.08 + }, + "presim_s": 0.2 + }, + { + "case_id": "C10_gf180_sW1.5_sL1.5", + "circuit_id": "C10", + "pdk": "gf180", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "ota_fd", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M9": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M10": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "24c456bcb054a1a9", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 66.04 + }, + "ugf": { + "min": 15900000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 69.04331, + "ugf": 26497430.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 1.650297, + "vo2": 1.650297, + "idd": 7.965916e-05, + "vos_in": 0.0, + "gain_lf": 69.04331, + "ugf": 26497430.0, + "f3db": 9329.025 + }, + "presim_s": 0.2 + }, + { + "case_id": "C10_gf180_sW1.5_sL2", + "circuit_id": "C10", + "pdk": "gf180", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "ota_fd", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M9": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M10": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "44ad043904d485b6", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 69.23 + }, + "ugf": { + "min": 13670000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 72.2261, + "ugf": 22776580.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 1.650689, + "vo2": 1.650689, + "idd": 7.953871e-05, + "vos_in": -2.21917e-10, + "gain_lf": 72.2261, + "ugf": 22776580.0, + "f3db": 5569.856 + }, + "presim_s": 0.2 + }, + { + "case_id": "C10_gf180_sW1_sL1", + "circuit_id": "C10", + "pdk": "gf180", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "ota_fd", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M9": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M10": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "d66d7444939df7ce", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 59.87 + }, + "ugf": { + "min": 16310000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 62.87385, + "ugf": 27175880.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 1.649878, + "vo2": 1.649878, + "idd": 8.003606e-05, + "vos_in": -3.63798e-12, + "gain_lf": 62.87385, + "ugf": 27175880.0, + "f3db": 19452.04 + }, + "presim_s": 0.1 + }, + { + "case_id": "C10_gf180_sW1_sL1.5", + "circuit_id": "C10", + "pdk": "gf180", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "ota_fd", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M9": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M10": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "f8bf9d5f97abbb01", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 65.34 + }, + "ugf": { + "min": 13000000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 68.34192, + "ugf": 21665870.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 1.650431, + "vo2": 1.650431, + "idd": 7.966196e-05, + "vos_in": 1.091394e-11, + "gain_lf": 68.34192, + "ugf": 21665870.0, + "f3db": 8269.995 + }, + "presim_s": 0.2 + }, + { + "case_id": "C10_gf180_sW1_sL2", + "circuit_id": "C10", + "pdk": "gf180", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "ota_fd", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M9": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M10": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "a424ad6b4c28d155", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 64.24 + }, + "ugf": { + "min": 11110000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 67.23655, + "ugf": 18515360.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 1.650858, + "vo2": 1.650858, + "idd": 7.976098e-05, + "vos_in": -1.45519e-11, + "gain_lf": 67.23655, + "ugf": 18515360.0, + "f3db": 8023.884 + }, + "presim_s": 0.1 + }, + { + "case_id": "C10_gf180_sW2_sL1", + "circuit_id": "C10", + "pdk": "gf180", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "ota_fd", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M9": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M10": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "2b37eb1bddd0a71f", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 59.56 + }, + "ugf": { + "min": 22670000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 62.56124, + "ugf": 37786640.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 1.649748, + "vo2": 1.649748, + "idd": 8.122218e-05, + "vos_in": 3.637979e-12, + "gain_lf": 62.56124, + "ugf": 37786640.0, + "f3db": 28038.02 + }, + "presim_s": 0.2 + }, + { + "case_id": "C10_gf180_sW2_sL1.5", + "circuit_id": "C10", + "pdk": "gf180", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "ota_fd", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M9": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M10": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "fe5158b497bc63fc", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 65.88 + }, + "ugf": { + "min": 18210000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 68.87529, + "ugf": 30356750.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 1.650197, + "vo2": 1.650197, + "idd": 7.982058e-05, + "vos_in": -7.27596e-12, + "gain_lf": 68.87529, + "ugf": 30356750.0, + "f3db": 10898.23 + }, + "presim_s": 0.2 + }, + { + "case_id": "C10_gf180_sW2_sL2", + "circuit_id": "C10", + "pdk": "gf180", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "ota_fd", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M9": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M10": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "f2098ffbf1d166a7", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 69.25 + }, + "ugf": { + "min": 15630000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 72.24854, + "ugf": 26051210.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 1.650557, + "vo2": 1.650557, + "idd": 7.950629e-05, + "vos_in": 3.637979e-12, + "gain_lf": 72.24854, + "ugf": 26051210.0, + "f3db": 6351.242 + }, + "presim_s": 0.2 + }, + { + "case_id": "C10_ihp130_sW0.5_sL1", + "circuit_id": "C10", + "pdk": "ihp130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "ota_fd", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M9": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M10": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "3c17ac99e063492f", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "gain_lf=30.08 below floor 35" + ], + "spec": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 19710000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 30.0802, + "ugf": 32857060.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 0.6014065, + "vo2": 0.6014065, + "idd": 8.360509e-05, + "vos_in": 9.094947e-13, + "gain_lf": 30.0802, + "ugf": 32857060.0, + "f3db": 1026079.0 + }, + "presim_s": 0.7 + }, + { + "case_id": "C10_ihp130_sW0.5_sL1.5", + "circuit_id": "C10", + "pdk": "ihp130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "ota_fd", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.78, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.78, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.78, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.78, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.78, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.78, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.78, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.78, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M9": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.78, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M10": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.78, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "15af3e252f0102f6", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "gain_lf=27.28 below floor 35" + ], + "spec": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 16330000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 27.28475, + "ugf": 27211820.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 0.6013167, + "vo2": 0.6013167, + "idd": 8.423659e-05, + "vos_in": 4.547474e-12, + "gain_lf": 27.28475, + "ugf": 27211820.0, + "f3db": 1172969.0 + }, + "presim_s": 0.5 + }, + { + "case_id": "C10_ihp130_sW0.5_sL2", + "circuit_id": "C10", + "pdk": "ihp130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "ota_fd", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.04, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.04, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.04, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.04, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.04, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.04, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.04, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.04, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M9": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.04, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M10": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.04, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "5b68becc522af8b2", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "gain_lf=21.41 below floor 35" + ], + "spec": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 13890000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 21.40682, + "ugf": 23152470.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 0.6012868, + "vo2": 0.6012868, + "idd": 8.429907e-05, + "vos_in": 0.0, + "gain_lf": 21.40682, + "ugf": 23152470.0, + "f3db": 1968790.0 + }, + "presim_s": 0.5 + }, + { + "case_id": "C10_ihp130_sW1.5_sL1", + "circuit_id": "C10", + "pdk": "ihp130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "ota_fd", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.52, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.52, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.52, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.52, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.52, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.52, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.52, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.52, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M9": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.52, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M10": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.52, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "6c93bbbca6a8632f", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 35.99 + }, + "ugf": { + "min": 31020000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 38.99394, + "ugf": 51696740.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 0.6023343, + "vo2": 0.6023343, + "idd": 8.566161e-05, + "vos_in": -1.09139e-11, + "gain_lf": 38.99394, + "ugf": 51696740.0, + "f3db": 578425.3 + }, + "presim_s": 1.4 + }, + { + "case_id": "C10_ihp130_sW1.5_sL1.5", + "circuit_id": "C10", + "pdk": "ihp130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "ota_fd", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.78, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.78, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.78, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.78, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.78, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.78, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.78, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.78, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M9": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.78, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M10": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.78, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "9e8226f5d66e075f", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 25850000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 37.46391, + "ugf": 43086990.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 0.6022738, + "vo2": 0.6022738, + "idd": 8.728037e-05, + "vos_in": -2.54659e-11, + "gain_lf": 37.46391, + "ugf": 43086990.0, + "f3db": 574821.5 + }, + "presim_s": 2.1 + }, + { + "case_id": "C10_ihp130_sW1.5_sL2", + "circuit_id": "C10", + "pdk": "ihp130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "ota_fd", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.04, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.04, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.04, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.04, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.04, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.04, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.04, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.04, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M9": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.04, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M10": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.04, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "5586335ab17c4366", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 21870000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 36.16087, + "ugf": 36451150.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 0.6022597, + "vo2": 0.6022597, + "idd": 8.7871e-05, + "vos_in": 1.546141e-11, + "gain_lf": 36.16087, + "ugf": 36451150.0, + "f3db": 565070.4 + }, + "presim_s": 2.3 + }, + { + "case_id": "C10_ihp130_sW1_sL1", + "circuit_id": "C10", + "pdk": "ihp130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "ota_fd", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M9": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M10": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "11509295a52bdb08", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 26400000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 36.03274, + "ugf": 43998640.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 0.6019595, + "vo2": 0.6019595, + "idd": 8.52423e-05, + "vos_in": 1.818989e-12, + "gain_lf": 36.03274, + "ugf": 43998640.0, + "f3db": 692621.0 + }, + "presim_s": 1.4 + }, + { + "case_id": "C10_ihp130_sW1_sL1.5", + "circuit_id": "C10", + "pdk": "ihp130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "ota_fd", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.78, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.78, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.78, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.78, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.78, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.78, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.78, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.78, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M9": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.78, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M10": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.78, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "c8041ee9ebc99c29", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "gain_lf=34.19 below floor 35" + ], + "spec": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 21860000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 34.18552, + "ugf": 36435230.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 0.6018909, + "vo2": 0.6018909, + "idd": 8.644131e-05, + "vos_in": 1.818989e-12, + "gain_lf": 34.18552, + "ugf": 36435230.0, + "f3db": 709232.2 + }, + "presim_s": 1.6 + }, + { + "case_id": "C10_ihp130_sW1_sL2", + "circuit_id": "C10", + "pdk": "ihp130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "ota_fd", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.04, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.04, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.04, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.04, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.04, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.04, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.04, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.04, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M9": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.04, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M10": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.04, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "8b6f51e6560bffce", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "gain_lf=33.42 below floor 35" + ], + "spec": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 18830000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 33.41973, + "ugf": 31377570.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 0.6018748, + "vo2": 0.6018748, + "idd": 8.686533e-05, + "vos_in": 0.0, + "gain_lf": 33.41973, + "ugf": 31377570.0, + "f3db": 667546.7 + }, + "presim_s": 1.5 + }, + { + "case_id": "C10_ihp130_sW2_sL1", + "circuit_id": "C10", + "pdk": "ihp130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "ota_fd", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M9": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M10": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "05a65252be3caf9c", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 35.51 + }, + "ugf": { + "min": 33870000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 38.50789, + "ugf": 56447740.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 0.6026398, + "vo2": 0.6026398, + "idd": 8.581298e-05, + "vos_in": 0.0, + "gain_lf": 38.50789, + "ugf": 56447740.0, + "f3db": 668684.3 + }, + "presim_s": 3.9 + }, + { + "case_id": "C10_ihp130_sW2_sL1.5", + "circuit_id": "C10", + "pdk": "ihp130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "ota_fd", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.78, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.78, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.78, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.78, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.78, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.78, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.78, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.78, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M9": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.78, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M10": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.78, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "0ea063e7887a656d", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 36.56 + }, + "ugf": { + "min": 29300000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 39.55606, + "ugf": 48839540.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 0.602577, + "vo2": 0.602577, + "idd": 8.765805e-05, + "vos_in": 2.091838e-11, + "gain_lf": 39.55606, + "ugf": 48839540.0, + "f3db": 512234.0 + }, + "presim_s": 2.9 + }, + { + "case_id": "C10_ihp130_sW2_sL2", + "circuit_id": "C10", + "pdk": "ihp130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "ota_fd", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.04, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.04, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.04, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.04, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.04, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.04, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.04, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.04, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M9": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.04, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M10": { + "w0": 4.0, + "l0": 0.52, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.04, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "3d8989a11cd4e825", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 35.14 + }, + "ugf": { + "min": 24650000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 38.13594, + "ugf": 41078900.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 0.6025637, + "vo2": 0.6025637, + "idd": 8.841174e-05, + "vos_in": -9.09495e-13, + "gain_lf": 38.13594, + "ugf": 41078900.0, + "f3db": 507139.7 + }, + "presim_s": 3.5 + }, + { + "case_id": "C10_sky130_sW0.5_sL1", + "circuit_id": "C10", + "pdk": "sky130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "ota_fd", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M9": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M10": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "ae35d796e7f3ce5a", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "gain_lf=31.79 below floor 35" + ], + "spec": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 15880000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 31.7936, + "ugf": 26458940.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 0.9031849, + "vo2": 0.9031849, + "idd": 9.346657e-05, + "vos_in": 3.637979e-12, + "gain_lf": 31.7936, + "ugf": 26458940.0, + "f3db": 678087.9 + }, + "presim_s": 9.6 + }, + { + "case_id": "C10_sky130_sW0.5_sL1.5", + "circuit_id": "C10", + "pdk": "sky130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "ota_fd", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.9, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.9, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.9, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.9, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.9, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.9, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.9, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.9, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M9": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.9, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M10": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.9, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "e2db45bf4d49b061", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "gain_lf=28.3 below floor 35" + ], + "spec": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 13000000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 28.30011, + "ugf": 21671540.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 0.9038703, + "vo2": 0.9038703, + "idd": 9.247186e-05, + "vos_in": 0.0, + "gain_lf": 28.30011, + "ugf": 21671540.0, + "f3db": 830977.5 + }, + "presim_s": 9.4 + }, + { + "case_id": "C10_sky130_sW0.5_sL2", + "circuit_id": "C10", + "pdk": "sky130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "ota_fd", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.2, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.2, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.2, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.2, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.2, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.2, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.2, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.2, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M9": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.2, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M10": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.2, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "c5068b3c22cce6c8", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "gain_lf=24.99 below floor 35" + ], + "spec": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 11200000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 24.98593, + "ugf": 18659840.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 0.903966, + "vo2": 0.903966, + "idd": 9.122761e-05, + "vos_in": -1.81899e-12, + "gain_lf": 24.98593, + "ugf": 18659840.0, + "f3db": 1048510.0 + }, + "presim_s": 9.5 + }, + { + "case_id": "C10_sky130_sW1.5_sL1", + "circuit_id": "C10", + "pdk": "sky130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "ota_fd", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.6, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.6, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.6, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.6, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.6, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.6, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.6, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.6, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M9": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.6, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M10": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.6, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "5a570e4dc6968024", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 38.24 + }, + "ugf": { + "min": 22370000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 41.24251, + "ugf": 37287640.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 0.9041499, + "vo2": 0.9041499, + "idd": 0.0001118322, + "vos_in": 0.0, + "gain_lf": 41.24251, + "ugf": 37287640.0, + "f3db": 321902.3 + }, + "presim_s": 11.6 + }, + { + "case_id": "C10_sky130_sW1.5_sL1.5", + "circuit_id": "C10", + "pdk": "sky130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "ota_fd", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.9, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.9, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.9, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.9, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.9, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.9, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.9, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.9, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M9": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.9, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M10": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.9, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "e77df1bf272837ab", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 37.34 + }, + "ugf": { + "min": 19790000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 40.34035, + "ugf": 32978840.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 0.9043928, + "vo2": 0.9043928, + "idd": 0.000108377, + "vos_in": 1.818989e-12, + "gain_lf": 40.34035, + "ugf": 32978840.0, + "f3db": 315879.0 + }, + "presim_s": 11.3 + }, + { + "case_id": "C10_sky130_sW1.5_sL2", + "circuit_id": "C10", + "pdk": "sky130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "ota_fd", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.2, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.2, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.2, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.2, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.2, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.2, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.2, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.2, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M9": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.2, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M10": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.2, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "3c07779a6f1822cc", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 16980000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 37.05462, + "ugf": 28302730.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 0.9046205, + "vo2": 0.9046205, + "idd": 0.0001059207, + "vos_in": -3.63798e-12, + "gain_lf": 37.05462, + "ugf": 28302730.0, + "f3db": 396235.1 + }, + "presim_s": 10.2 + }, + { + "case_id": "C10_sky130_sW1_sL1", + "circuit_id": "C10", + "pdk": "sky130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "ota_fd", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M9": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M10": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "a64df7aeeefcce85", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 38.92 + }, + "ugf": { + "min": 20810000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 41.92104, + "ugf": 34675090.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 0.903568, + "vo2": 0.903568, + "idd": 0.0001034238, + "vos_in": 3.637979e-12, + "gain_lf": 41.92104, + "ugf": 34675090.0, + "f3db": 276994.2 + }, + "presim_s": 8.5 + }, + { + "case_id": "C10_sky130_sW1_sL1.5", + "circuit_id": "C10", + "pdk": "sky130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "ota_fd", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.9, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.9, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.9, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.9, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.9, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.9, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.9, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.9, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M9": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.9, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M10": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.9, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "016bed964adb8f5a", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 17280000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 35.65616, + "ugf": 28796160.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 0.9039441, + "vo2": 0.9039441, + "idd": 0.0001006574, + "vos_in": -1.81899e-12, + "gain_lf": 35.65616, + "ugf": 28796160.0, + "f3db": 473269.6 + }, + "presim_s": 9.7 + }, + { + "case_id": "C10_sky130_sW1_sL2", + "circuit_id": "C10", + "pdk": "sky130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "ota_fd", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.2, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.2, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.2, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.2, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.2, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.2, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.2, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.2, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M9": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.2, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M10": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.2, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "554daf197d6a22ee", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "gain_lf=33.8 below floor 35" + ], + "spec": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 14790000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 33.80061, + "ugf": 24651180.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 0.9041324, + "vo2": 0.9041324, + "idd": 9.880095e-05, + "vos_in": 1.818989e-12, + "gain_lf": 33.80061, + "ugf": 24651180.0, + "f3db": 501697.7 + }, + "presim_s": 8.5 + }, + { + "case_id": "C10_sky130_sW2_sL1", + "circuit_id": "C10", + "pdk": "sky130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "ota_fd", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M9": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M10": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "7e08dbb075cd10c8", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 35.78 + }, + "ugf": { + "min": 22660000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 38.78135, + "ugf": 37772910.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 0.9049236, + "vo2": 0.9049236, + "idd": 0.0001190659, + "vos_in": -1.81899e-12, + "gain_lf": 38.78135, + "ugf": 37772910.0, + "f3db": 432885.8 + }, + "presim_s": 10.8 + }, + { + "case_id": "C10_sky130_sW2_sL1.5", + "circuit_id": "C10", + "pdk": "sky130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "ota_fd", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.9, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.9, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.9, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.9, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.9, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.9, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.9, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.9, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M9": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.9, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M10": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.9, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "db5926e088d11aed", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 36.21 + }, + "ugf": { + "min": 20400000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 39.21398, + "ugf": 33994410.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 0.9051101, + "vo2": 0.9051101, + "idd": 0.0001152521, + "vos_in": -3.63798e-12, + "gain_lf": 39.21398, + "ugf": 33994410.0, + "f3db": 370679.4 + }, + "presim_s": 7.4 + }, + { + "case_id": "C10_sky130_sW2_sL2", + "circuit_id": "C10", + "pdk": "sky130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "ota_fd", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.2, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.2, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.2, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.2, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.2, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.2, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.2, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.2, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M9": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.2, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M10": { + "w0": 4.0, + "l0": 0.6, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.2, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "8aa0b696ebfac126", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 35.86 + }, + "ugf": { + "min": 18450000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 38.86216, + "ugf": 30752370.0 + }, + "floors": { + "gain_lf": { + "min": 35.0 + }, + "ugf": { + "min": 5000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 0.9052035, + "vo2": 0.9052035, + "idd": 0.0001121763, + "vos_in": 3.637979e-12, + "gain_lf": 38.86216, + "ugf": 30752370.0, + "f3db": 349260.0 + }, + "presim_s": 7.3 + }, + { + "case_id": "C11_gf180_sW0.5_sL1", + "circuit_id": "C11", + "pdk": "gf180", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "twostage", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.56, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.56, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.56, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "53f95ae2cd8a5d4a", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 65.48 + }, + "ugf": { + "min": 4984000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 68.48272, + "ugf": 8307234.0, + "pm": 62.6064719 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 1.65, + "idd": 9.347894e-05, + "vos": 0.0008384993, + "gain_lf": 68.48272, + "ph_lf": 0.6402281, + "ugf": 8307234.0, + "ph_ugf": -116.7533, + "f3db": 3225.827, + "pm": 62.6064719 + }, + "presim_s": 0.2 + }, + { + "case_id": "C11_gf180_sW0.5_sL1.5", + "circuit_id": "C11", + "pdk": "gf180", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "twostage", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.84, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.84, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.84, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "30a2cf3b9ee09c6e", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 70.86 + }, + "ugf": { + "min": 3684000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 73.86129, + "ugf": 6139199.0, + "pm": 63.546246409999995 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 1.65, + "idd": 8.74172e-05, + "vos": 0.001506027, + "gain_lf": 73.86129, + "ph_lf": -0.01194641, + "ugf": 6139199.0, + "ph_ugf": -116.4657, + "f3db": 1278.467, + "pm": 63.546246409999995 + }, + "presim_s": 0.3 + }, + { + "case_id": "C11_gf180_sW0.5_sL2", + "circuit_id": "C11", + "pdk": "gf180", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "twostage", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.12, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.12, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.12, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "8c0111900cefe3a9", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 73.58 + }, + "ugf": { + "min": 2935000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 76.58088, + "ugf": 4891370.0, + "pm": 66.238562 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 1.65, + "idd": 8.309113e-05, + "vos": 0.001951382, + "gain_lf": 76.58088, + "ph_lf": -1.626862, + "ugf": 4891370.0, + "ph_ugf": -115.3883, + "f3db": 10.46153, + "pm": 66.238562 + }, + "presim_s": 0.2 + }, + { + "case_id": "C11_gf180_sW1.5_sL1", + "circuit_id": "C11", + "pdk": "gf180", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "twostage", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.56, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.56, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.56, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "a8a036a8bd0a1d5a", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 72.66 + }, + "ugf": { + "min": 9590000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 75.65867, + "ugf": 15982530.0, + "pm": 65.109734 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 1.65, + "idd": 9.935793e-05, + "vos": 1.32633e-05, + "gain_lf": 75.65867, + "ph_lf": 3.469366, + "ugf": 15982530.0, + "ph_ugf": -111.4209, + "f3db": 2784.256, + "pm": 65.109734 + }, + "presim_s": 0.4 + }, + { + "case_id": "C11_gf180_sW1.5_sL1.5", + "circuit_id": "C11", + "pdk": "gf180", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "twostage", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.84, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.84, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.84, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "374a28d6ec0f1425", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 78.27 + }, + "ugf": { + "min": 7628000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 81.26861, + "ugf": 12712850.0, + "pm": 59.506123 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 1.65, + "idd": 9.88841e-05, + "vos": 3.760084e-05, + "gain_lf": 81.26861, + "ph_lf": 5.590777, + "ugf": 12712850.0, + "ph_ugf": -114.9031, + "f3db": 18.11987, + "pm": 59.506123 + }, + "presim_s": 0.3 + }, + { + "case_id": "C11_gf180_sW1.5_sL2", + "circuit_id": "C11", + "pdk": "gf180", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "twostage", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.12, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.12, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.12, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "593f571f82dba8c2", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 80.9 + }, + "ugf": { + "min": 6471000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 83.90365, + "ugf": 10785700.0, + "pm": 56.909099 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 1.65, + "idd": 9.793855e-05, + "vos": 8.268192e-05, + "gain_lf": 83.90365, + "ph_lf": 6.323901, + "ugf": 10785700.0, + "ph_ugf": -116.767, + "f3db": 24.11151, + "pm": 56.909099 + }, + "presim_s": 0.3 + }, + { + "case_id": "C11_gf180_sW1_sL1", + "circuit_id": "C11", + "pdk": "gf180", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "twostage", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "8b4b65717367801b", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 70.18 + }, + "ugf": { + "min": 7692000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 73.18377, + "ugf": 12819770.0, + "pm": 63.88807100000001 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 1.65, + "idd": 9.862901e-05, + "vos": 6.958778e-05, + "gain_lf": 73.18377, + "ph_lf": 2.213129, + "ugf": 12819770.0, + "ph_ugf": -113.8988, + "f3db": 2946.208, + "pm": 63.88807100000001 + }, + "presim_s": 0.2 + }, + { + "case_id": "C11_gf180_sW1_sL1.5", + "circuit_id": "C11", + "pdk": "gf180", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "twostage", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "70a5e2c282688cde", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 75.59 + }, + "ugf": { + "min": 6033000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 78.59393, + "ugf": 10055800.0, + "pm": 60.540797 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 1.65, + "idd": 9.683367e-05, + "vos": 0.0001905323, + "gain_lf": 78.59393, + "ph_lf": 3.096203, + "ugf": 10055800.0, + "ph_ugf": -116.363, + "f3db": 13.43361, + "pm": 60.540797 + }, + "presim_s": 0.3 + }, + { + "case_id": "C11_gf180_sW1_sL2", + "circuit_id": "C11", + "pdk": "gf180", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "twostage", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "7c4a5bbbb66c5162", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 78.41 + }, + "ugf": { + "min": 4980000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 81.40751, + "ugf": 8300766.0, + "pm": 60.156407 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 1.65, + "idd": 9.360237e-05, + "vos": 0.0004053435, + "gain_lf": 81.40751, + "ph_lf": 2.854793, + "ugf": 8300766.0, + "ph_ugf": -116.9888, + "f3db": 18.29642, + "pm": 60.156407 + }, + "presim_s": 0.3 + }, + { + "case_id": "C11_gf180_sW2_sL1", + "circuit_id": "C11", + "pdk": "gf180", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "twostage", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "c1b2b26fcf3b72e6", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 74.19 + }, + "ugf": { + "min": 11160000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 77.19261, + "ugf": 18596840.0, + "pm": 65.895181 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 1.65, + "idd": 9.97155e-05, + "vos": -4.51224e-06, + "gain_lf": 77.19261, + "ph_lf": 4.491219, + "ugf": 18596840.0, + "ph_ugf": -109.6136, + "f3db": 11.48645, + "pm": 65.895181 + }, + "presim_s": 0.5 + }, + { + "case_id": "C11_gf180_sW2_sL1.5", + "circuit_id": "C11", + "pdk": "gf180", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "twostage", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "c8c4c93e8c03f24a", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 80.03 + }, + "ugf": { + "min": 8890000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 83.02858, + "ugf": 14815990.0, + "pm": 58.66306 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 1.65, + "idd": 9.933259e-05, + "vos": 1.36988e-05, + "gain_lf": 83.02858, + "ph_lf": 7.74254, + "ugf": 14815990.0, + "ph_ugf": -113.5944, + "f3db": 22.00551, + "pm": 58.66306 + }, + "presim_s": 0.3 + }, + { + "case_id": "C11_gf180_sW2_sL2", + "circuit_id": "C11", + "pdk": "gf180", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "twostage", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "f8af15a1bc1ae4d7", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 82.63 + }, + "ugf": { + "min": 7580000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 85.63474, + "ugf": 12633350.0, + "pm": 54.78100499999999 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 1.65, + "idd": 9.905801e-05, + "vos": 2.397089e-05, + "gain_lf": 85.63474, + "ph_lf": 9.230995, + "ugf": 12633350.0, + "ph_ugf": -115.988, + "f3db": 29.00301, + "pm": 54.78100499999999 + }, + "presim_s": 0.6 + }, + { + "case_id": "C11_ihp130_sW0.5_sL1", + "circuit_id": "C11", + "pdk": "ihp130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "twostage", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.26, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.26, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.26, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.26, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.26, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.26, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.26, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.26, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "88ea587afaa71a38", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 43.16 + }, + "ugf": { + "min": 9294000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 46.16096, + "ugf": 15490510.0, + "pm": 76.337805 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.6000003, + "idd": 8.361483e-05, + "vos": 0.003398534, + "gain_lf": 46.16096, + "ph_lf": 0.108995, + "ugf": 15490510.0, + "ph_ugf": -103.5532, + "f3db": 78375.89, + "pm": 76.337805 + }, + "presim_s": 0.9 + }, + { + "case_id": "C11_ihp130_sW0.5_sL1.5", + "circuit_id": "C11", + "pdk": "ihp130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "twostage", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.39, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.39, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.39, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "68fe1c7fac0a4350", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 45.57 + }, + "ugf": { + "min": 7661000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 48.57331, + "ugf": 12767720.0, + "pm": 75.3038516 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.6000004, + "idd": 8.059249e-05, + "vos": 0.004174753, + "gain_lf": 48.57331, + "ph_lf": 0.1230484, + "ugf": 12767720.0, + "ph_ugf": -104.5731, + "f3db": 48756.62, + "pm": 75.3038516 + }, + "presim_s": 0.9 + }, + { + "case_id": "C11_ihp130_sW0.5_sL2", + "circuit_id": "C11", + "pdk": "ihp130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "twostage", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.52, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.52, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.52, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "412ec07f00f7c402", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 46.82 + }, + "ugf": { + "min": 6467000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 49.81679, + "ugf": 10778910.0, + "pm": 74.81895320000001 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.6000005, + "idd": 7.789472e-05, + "vos": 0.005019453, + "gain_lf": 49.81679, + "ph_lf": 0.1165468, + "ugf": 10778910.0, + "ph_ugf": -105.0645, + "f3db": 35507.67, + "pm": 74.81895320000001 + }, + "presim_s": 1.0 + }, + { + "case_id": "C11_ihp130_sW1.5_sL1", + "circuit_id": "C11", + "pdk": "ihp130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "twostage", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.26, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.26, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.26, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.26, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.26, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.26, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.26, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.26, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "414c659d5ec3491e", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 44.49 + }, + "ugf": { + "min": 17400000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 47.49291, + "ugf": 29004360.0, + "pm": 82.2825251 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.6, + "idd": 9.458112e-05, + "vos": 0.0002541931, + "gain_lf": 47.49291, + "ph_lf": 0.1694349, + "ugf": 29004360.0, + "ph_ugf": -97.54804, + "f3db": 125441.4, + "pm": 82.2825251 + }, + "presim_s": 2.8 + }, + { + "case_id": "C11_ihp130_sW1.5_sL1.5", + "circuit_id": "C11", + "pdk": "ihp130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "twostage", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.39, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.39, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.39, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.39, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.39, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.39, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.39, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.39, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "0ff76684b29ba066", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 47.28 + }, + "ugf": { + "min": 15540000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 50.28308, + "ugf": 25892190.0, + "pm": 79.2430392 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.6, + "idd": 9.418466e-05, + "vos": 0.0003122778, + "gain_lf": 50.28308, + "ph_lf": 0.2261608, + "ugf": 25892190.0, + "ph_ugf": -100.5308, + "f3db": 81807.34, + "pm": 79.2430392 + }, + "presim_s": 2.8 + }, + { + "case_id": "C11_ihp130_sW1.5_sL2", + "circuit_id": "C11", + "pdk": "ihp130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "twostage", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.52, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.52, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.52, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.52, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.52, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.52, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.52, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.52, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "1ba3764d535990c7", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 48.97 + }, + "ugf": { + "min": 13890000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 51.96874, + "ugf": 23157510.0, + "pm": 76.86364549999999 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.6000001, + "idd": 9.285203e-05, + "vos": 0.0005491362, + "gain_lf": 51.96874, + "ph_lf": 0.2641545, + "ugf": 23157510.0, + "ph_ugf": -102.8722, + "f3db": 60434.27, + "pm": 76.86364549999999 + }, + "presim_s": 2.5 + }, + { + "case_id": "C11_ihp130_sW1_sL1", + "circuit_id": "C11", + "pdk": "ihp130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "twostage", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.26, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.26, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.26, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "e756b93b17af3c2f", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 44.12 + }, + "ugf": { + "min": 14200000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 47.12022, + "ugf": 23668180.0, + "pm": 79.4408445 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.6000001, + "idd": 9.172873e-05, + "vos": 0.0008903594, + "gain_lf": 47.12022, + "ph_lf": 0.1519555, + "ugf": 23668180.0, + "ph_ugf": -100.4072, + "f3db": 107608.4, + "pm": 79.4408445 + }, + "presim_s": 1.8 + }, + { + "case_id": "C11_ihp130_sW1_sL1.5", + "circuit_id": "C11", + "pdk": "ihp130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "twostage", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "70ea72afbd6a2557", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 46.84 + }, + "ugf": { + "min": 12340000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 49.84097, + "ugf": 20571200.0, + "pm": 77.0407355 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.6000001, + "idd": 9.010908e-05, + "vos": 0.001164414, + "gain_lf": 49.84097, + "ph_lf": 0.1964645, + "ugf": 20571200.0, + "ph_ugf": -102.7628, + "f3db": 68519.9, + "pm": 77.0407355 + }, + "presim_s": 1.5 + }, + { + "case_id": "C11_ihp130_sW1_sL2", + "circuit_id": "C11", + "pdk": "ihp130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "twostage", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "68af9296ffd48da9", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 48.48 + }, + "ugf": { + "min": 10780000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 51.47979, + "ugf": 17958840.0, + "pm": 75.4006569 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.6000002, + "idd": 8.774862e-05, + "vos": 0.001640854, + "gain_lf": 51.47979, + "ph_lf": 0.2220431, + "ugf": 17958840.0, + "ph_ugf": -104.3773, + "f3db": 49508.27, + "pm": 75.4006569 + }, + "presim_s": 1.9 + }, + { + "case_id": "C11_ihp130_sW2_sL1", + "circuit_id": "C11", + "pdk": "ihp130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "twostage", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.26, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.26, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.26, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.26, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.26, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "2673c12ef849322d", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 44.74 + }, + "ugf": { + "min": 19870000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 47.74041, + "ugf": 33122360.0, + "pm": 84.5240709 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.6, + "idd": 9.586525e-05, + "vos": -6.08798e-08, + "gain_lf": 47.74041, + "ph_lf": 0.1800691, + "ugf": 33122360.0, + "ph_ugf": -95.29586, + "f3db": 137634.3, + "pm": 84.5240709 + }, + "presim_s": 4.3 + }, + { + "case_id": "C11_ihp130_sW2_sL1.5", + "circuit_id": "C11", + "pdk": "ihp130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "twostage", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "6223827e0f779bdd", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 47.57 + }, + "ugf": { + "min": 17950000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 50.5663, + "ugf": 29909400.0, + "pm": 81.1490187 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.6, + "idd": 9.596058e-05, + "vos": -3.77671e-06, + "gain_lf": 50.5663, + "ph_lf": 0.2437113, + "ugf": 29909400.0, + "ph_ugf": -98.60727, + "f3db": 90802.36, + "pm": 81.1490187 + }, + "presim_s": 8.0 + }, + { + "case_id": "C11_ihp130_sW2_sL2", + "circuit_id": "C11", + "pdk": "ihp130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "twostage", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "9afe5b647cc2e80b", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 49.26 + }, + "ugf": { + "min": 16250000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 52.26004, + "ugf": 27091400.0, + "pm": 78.3270603 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.6, + "idd": 9.536886e-05, + "vos": 0.0001160888, + "gain_lf": 52.26004, + "ph_lf": 0.2883397, + "ugf": 27091400.0, + "ph_ugf": -101.3846, + "f3db": 68141.79, + "pm": 78.3270603 + }, + "presim_s": 3.9 + }, + { + "case_id": "C11_sky130_sW0.5_sL1", + "circuit_id": "C11", + "pdk": "sky130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "twostage", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.3, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.3, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.3, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "b28cc014c5ff4795", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 54.71 + }, + "ugf": { + "min": 5518000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 57.71389, + "ugf": 9196623.0, + "pm": 79.91076799999999 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.9000004, + "idd": 7.08425e-05, + "vos": 0.003997836, + "gain_lf": 57.71389, + "ph_lf": 0.221512, + "ugf": 9196623.0, + "ph_ugf": -99.86772, + "f3db": 12107.36, + "pm": 79.91076799999999 + }, + "presim_s": 8.6 + }, + { + "case_id": "C11_sky130_sW0.5_sL1.5", + "circuit_id": "C11", + "pdk": "sky130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "twostage", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.45, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.45, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.45, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "f2fd6a3c14b5b945", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 60.47 + }, + "ugf": { + "min": 3706000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 63.46528, + "ugf": 6177062.0, + "pm": 80.00739835 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.9000004, + "idd": 6.628901e-05, + "vos": 0.003838643, + "gain_lf": 63.46528, + "ph_lf": -0.01879835, + "ugf": 6177062.0, + "ph_ugf": -100.0114, + "f3db": 4176.243, + "pm": 80.00739835 + }, + "presim_s": 9.1 + }, + { + "case_id": "C11_sky130_sW0.5_sL2", + "circuit_id": "C11", + "pdk": "sky130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "twostage", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.6, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.6, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.6, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "4264c4edf25c1d71", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 64.47 + }, + "ugf": { + "min": 2792000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 67.46989, + "ugf": 4653428.0, + "pm": 80.8851173 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.9000003, + "idd": 6.430267e-05, + "vos": 0.003289089, + "gain_lf": 67.46989, + "ph_lf": -0.7426173, + "ugf": 4653428.0, + "ph_ugf": -99.8575, + "f3db": 1980.305, + "pm": 80.8851173 + }, + "presim_s": 9.9 + }, + { + "case_id": "C11_sky130_sW1.5_sL1", + "circuit_id": "C11", + "pdk": "sky130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "twostage", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.3, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.3, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.3, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.3, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.3, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.3, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.3, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.3, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "dc7a3013f5e26714", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 57.29 + }, + "ugf": { + "min": 12250000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 60.28898, + "ugf": 20415820.0, + "pm": 84.0980606 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.9000001, + "idd": 8.303241e-05, + "vos": 0.001193754, + "gain_lf": 60.28898, + "ph_lf": 0.6498294, + "ugf": 20415820.0, + "ph_ugf": -95.25211, + "f3db": 19992.76, + "pm": 84.0980606 + }, + "presim_s": 8.4 + }, + { + "case_id": "C11_sky130_sW1.5_sL1.5", + "circuit_id": "C11", + "pdk": "sky130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "twostage", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.45, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.45, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.45, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.45, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.45, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.45, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.45, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.45, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "ffa3ae67729e74b2", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 64.58 + }, + "ugf": { + "min": 8902000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 67.57983, + "ugf": 14836950.0, + "pm": 81.356473 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.9000001, + "idd": 7.584572e-05, + "vos": 0.001411123, + "gain_lf": 67.57983, + "ph_lf": 1.258137, + "ugf": 14836950.0, + "ph_ugf": -97.38539, + "f3db": 6281.387, + "pm": 81.356473 + }, + "presim_s": 6.7 + }, + { + "case_id": "C11_sky130_sW1.5_sL2", + "circuit_id": "C11", + "pdk": "sky130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "twostage", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.6, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.6, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.6, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.6, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.6, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.6, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.6, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.6, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "04830be76542c849", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 70.23 + }, + "ugf": { + "min": 6970000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 73.23297, + "ugf": 11617010.0, + "pm": 79.454114 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.9000001, + "idd": 7.204728e-05, + "vos": 0.00132239, + "gain_lf": 73.23297, + "ph_lf": 1.933746, + "ugf": 11617010.0, + "ph_ugf": -98.61214, + "f3db": 2568.78, + "pm": 79.454114 + }, + "presim_s": 6.8 + }, + { + "case_id": "C11_sky130_sW1_sL1", + "circuit_id": "C11", + "pdk": "sky130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "twostage", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "aa6df86bf40f1e84", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 56.62 + }, + "ugf": { + "min": 9313000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 59.62107, + "ugf": 15521590.0, + "pm": 82.0995872 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.9000002, + "idd": 7.821191e-05, + "vos": 0.001955459, + "gain_lf": 59.62107, + "ph_lf": 0.5179528, + "ugf": 15521590.0, + "ph_ugf": -97.38246, + "f3db": 16466.22, + "pm": 82.0995872 + }, + "presim_s": 7.9 + }, + { + "case_id": "C11_sky130_sW1_sL1.5", + "circuit_id": "C11", + "pdk": "sky130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "twostage", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "2d7b224f2eca0675", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 63.38 + }, + "ugf": { + "min": 6534000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 66.38135, + "ugf": 10889710.0, + "pm": 80.4318989 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.9000002, + "idd": 7.1761e-05, + "vos": 0.002102033, + "gain_lf": 66.38135, + "ph_lf": 0.8071111, + "ugf": 10889710.0, + "ph_ugf": -98.76099, + "f3db": 5288.982, + "pm": 80.4318989 + }, + "presim_s": 10.7 + }, + { + "case_id": "C11_sky130_sW1_sL2", + "circuit_id": "C11", + "pdk": "sky130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "twostage", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "9354e6f133edc4c0", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 68.48 + }, + "ugf": { + "min": 5037000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 71.48478, + "ugf": 8395595.0, + "pm": 79.7019255 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.9000002, + "idd": 6.866944e-05, + "vos": 0.001888361, + "gain_lf": 71.48478, + "ph_lf": 0.8750745, + "ugf": 8395595.0, + "ph_ugf": -99.423, + "f3db": 2263.368, + "pm": 79.7019255 + }, + "presim_s": 10.3 + }, + { + "case_id": "C11_sky130_sW2_sL1", + "circuit_id": "C11", + "pdk": "sky130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "twostage", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "1c4c341f77f8a3c6", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 57.59 + }, + "ugf": { + "min": 14590000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 60.59334, + "ugf": 24313470.0, + "pm": 85.74901139999999 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.9000001, + "idd": 8.632783e-05, + "vos": 0.0008089348, + "gain_lf": 60.59334, + "ph_lf": 0.7202986, + "ugf": 24313470.0, + "ph_ugf": -93.53069, + "f3db": 22841.22, + "pm": 85.74901139999999 + }, + "presim_s": 11.3 + }, + { + "case_id": "C11_sky130_sW2_sL1.5", + "circuit_id": "C11", + "pdk": "sky130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "twostage", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M7": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M8": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "571b9207288eaf32", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 65.25 + }, + "ugf": { + "min": 10950000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 68.24719, + "ugf": 18256050.0, + "pm": 82.302631 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.9000001, + "idd": 7.911434e-05, + "vos": 0.001030174, + "gain_lf": 68.24719, + "ph_lf": 1.542879, + "ugf": 18256050.0, + "ph_ugf": -96.15449, + "f3db": 7148.059, + "pm": 82.302631 + }, + "presim_s": 9.5 + }, + { + "case_id": "C11_sky130_sW2_sL2", + "circuit_id": "C11", + "pdk": "sky130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "twostage", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M7": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M8": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "6826f554f16982db", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 71.25 + }, + "ugf": { + "min": 8693000.0 + }, + "pm": { + "min": 45.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 74.24809, + "ugf": 14488170.0, + "pm": 79.503574 + }, + "floors": { + "gain_lf": { + "min": 40.0 + }, + "ugf": { + "min": 2000000.0 + }, + "pm": { + "min": 45.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.9000001, + "idd": 7.486715e-05, + "vos": 0.001005018, + "gain_lf": 74.24809, + "ph_lf": 2.672396, + "ugf": 14488170.0, + "ph_ugf": -97.82403, + "f3db": 2852.949, + "pm": 79.503574 + }, + "presim_s": 8.0 + }, + { + "case_id": "C12_gf180_sW0.5_sL1", + "circuit_id": "C12", + "pdk": "gf180", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "single", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.56, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "9114ae9a7093c8a0", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 31.9 + }, + "f3db": { + "min": 3603000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 34.89966, + "f3db": 6005391.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 1.458836, + "vin0": 1.458836, + "idd": 5.888605e-05, + "gain_lf": 34.89966, + "f3db": 6005391.0, + "ugf": 335213900.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C12_gf180_sW0.5_sL1.5", + "circuit_id": "C12", + "pdk": "gf180", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "single", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.84, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "952a17028df62d86", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 36.27 + }, + "f3db": { + "min": 1515000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 39.26713, + "f3db": 2525533.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 1.439152, + "vin0": 1.439152, + "idd": 3.874439e-05, + "gain_lf": 39.26713, + "f3db": 2525533.0, + "ugf": 233119300.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C12_gf180_sW0.5_sL2", + "circuit_id": "C12", + "pdk": "gf180", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "single", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.12, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "595a10478c8a74e5", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 38.96 + }, + "f3db": { + "min": 1000000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 41.96165, + "f3db": 1425042.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 1.429767, + "vin0": 1.429767, + "idd": 2.897452e-05, + "gain_lf": 41.96165, + "f3db": 1425042.0, + "ugf": 179247500.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C12_gf180_sW1.5_sL1", + "circuit_id": "C12", + "pdk": "gf180", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "single", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.56, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "f80f5b1cea29bcf6", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 31.9 + }, + "f3db": { + "min": 10190000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 34.89966, + "f3db": 16976400.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 1.458836, + "vin0": 1.458836, + "idd": 0.0001766581, + "gain_lf": 34.89966, + "f3db": 16976400.0, + "ugf": 949313500.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C12_gf180_sW1.5_sL1.5", + "circuit_id": "C12", + "pdk": "gf180", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "single", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.84, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "fa0a5700f898e6e5", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 36.27 + }, + "f3db": { + "min": 4284000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 39.26713, + "f3db": 7139193.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 1.439152, + "vin0": 1.439152, + "idd": 0.0001162332, + "gain_lf": 39.26713, + "f3db": 7139193.0, + "ugf": 661342500.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C12_gf180_sW1.5_sL2", + "circuit_id": "C12", + "pdk": "gf180", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "single", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.12, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "0c0161a185d1abcc", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 38.96 + }, + "f3db": { + "min": 2417000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 41.96166, + "f3db": 4028244.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 1.429767, + "vin0": 1.429767, + "idd": 8.692357e-05, + "gain_lf": 41.96166, + "f3db": 4028244.0, + "ugf": 509785600.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C12_gf180_sW1_sL1", + "circuit_id": "C12", + "pdk": "gf180", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "single", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "1f4454974ddde722", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 31.9 + }, + "f3db": { + "min": 6993000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 34.89966, + "f3db": 11654240.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 1.458836, + "vin0": 1.458836, + "idd": 0.0001177721, + "gain_lf": 34.89966, + "f3db": 11654240.0, + "ugf": 650733700.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C12_gf180_sW1_sL1.5", + "circuit_id": "C12", + "pdk": "gf180", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "single", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "3aeb1033e3b42900", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 36.27 + }, + "f3db": { + "min": 2940000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 39.26713, + "f3db": 4900743.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 1.439152, + "vin0": 1.439152, + "idd": 7.748878e-05, + "gain_lf": 39.26713, + "f3db": 4900743.0, + "ugf": 452619200.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C12_gf180_sW1_sL2", + "circuit_id": "C12", + "pdk": "gf180", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "single", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "cfc6b4eb7d64c5fc", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 38.96 + }, + "f3db": { + "min": 1659000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 41.96166, + "f3db": 2765227.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 1.429767, + "vin0": 1.429767, + "idd": 5.794905e-05, + "gain_lf": 41.96166, + "f3db": 2765227.0, + "ugf": 348768500.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C12_gf180_sW2_sL1", + "circuit_id": "C12", + "pdk": "gf180", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "single", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "cb080639ead3a44c", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 31.9 + }, + "f3db": { + "min": 13200000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 34.89966, + "f3db": 22000180.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 1.458836, + "vin0": 1.458836, + "idd": 0.0002355442, + "gain_lf": 34.89966, + "f3db": 22000180.0, + "ugf": 1231243000.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C12_gf180_sW2_sL1.5", + "circuit_id": "C12", + "pdk": "gf180", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "single", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "470c01e3f59602bd", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 36.27 + }, + "f3db": { + "min": 5551000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 39.26713, + "f3db": 9251873.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 1.439152, + "vin0": 1.439152, + "idd": 0.0001549776, + "gain_lf": 39.26713, + "f3db": 9251873.0, + "ugf": 859253500.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C12_gf180_sW2_sL2", + "circuit_id": "C12", + "pdk": "gf180", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "single", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "11b233d9c6c48603", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 38.96 + }, + "f3db": { + "min": 3132000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 41.96166, + "f3db": 5220240.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 1.429767, + "vin0": 1.429767, + "idd": 0.0001158981, + "gain_lf": 41.96166, + "f3db": 5220240.0, + "ugf": 664154000.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C12_ihp130_sW0.5_sL1", + "circuit_id": "C12", + "pdk": "ihp130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "single", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.26, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.26, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "a03b17113367c3f7", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 25.79 + }, + "f3db": { + "min": 12110000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 28.78626, + "f3db": 20185360.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.5543392, + "vin0": 0.5543392, + "idd": 2.299929e-05, + "gain_lf": 28.78626, + "f3db": 20185360.0, + "ugf": 556581500.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C12_ihp130_sW0.5_sL1.5", + "circuit_id": "C12", + "pdk": "ihp130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "single", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.39, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "89a697c8a44e7f68", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 27.08 + }, + "f3db": { + "min": 8479000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 30.08356, + "f3db": 14131660.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.536533, + "vin0": 0.536533, + "idd": 2.035058e-05, + "gain_lf": 30.08356, + "f3db": 14131660.0, + "ugf": 452762300.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C12_ihp130_sW0.5_sL2", + "circuit_id": "C12", + "pdk": "ihp130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "single", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.52, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "09cbc581b674ed48", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 27.95 + }, + "f3db": { + "min": 6334000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 30.94605, + "f3db": 10557420.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.5279493, + "vin0": 0.5279493, + "idd": 1.751375e-05, + "gain_lf": 30.94605, + "f3db": 10557420.0, + "ugf": 374160700.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C12_ihp130_sW1.5_sL1", + "circuit_id": "C12", + "pdk": "ihp130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "single", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.26, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.26, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "b8a8396df71d5d77", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 25.79 + }, + "f3db": { + "min": 34570000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 28.78626, + "f3db": 57621230.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.5543392, + "vin0": 0.5543392, + "idd": 6.899786e-05, + "gain_lf": 28.78626, + "f3db": 57621230.0, + "ugf": 1593823000.0 + }, + "presim_s": 0.2 + }, + { + "case_id": "C12_ihp130_sW1.5_sL1.5", + "circuit_id": "C12", + "pdk": "ihp130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "single", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.39, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.39, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "47c566519aff0867", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 27.08 + }, + "f3db": { + "min": 24200000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 30.08356, + "f3db": 40334740.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.536533, + "vin0": 0.536533, + "idd": 6.105175e-05, + "gain_lf": 30.08356, + "f3db": 40334740.0, + "ugf": 1301497000.0 + }, + "presim_s": 0.2 + }, + { + "case_id": "C12_ihp130_sW1.5_sL2", + "circuit_id": "C12", + "pdk": "ihp130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "single", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.52, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.52, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "e7a468f5c301824d", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 27.95 + }, + "f3db": { + "min": 18080000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 30.94606, + "f3db": 30129050.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.5279493, + "vin0": 0.5279493, + "idd": 5.254126e-05, + "gain_lf": 30.94606, + "f3db": 30129050.0, + "ugf": 1078875000.0 + }, + "presim_s": 0.2 + }, + { + "case_id": "C12_ihp130_sW1_sL1", + "circuit_id": "C12", + "pdk": "ihp130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "single", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.26, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "48ee1a2627474a85", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 25.79 + }, + "f3db": { + "min": 23620000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 28.78626, + "f3db": 39366570.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.5543392, + "vin0": 0.5543392, + "idd": 4.599857e-05, + "gain_lf": 28.78626, + "f3db": 39366570.0, + "ugf": 1087796000.0 + }, + "presim_s": 0.2 + }, + { + "case_id": "C12_ihp130_sW1_sL1.5", + "circuit_id": "C12", + "pdk": "ihp130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "single", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "42d505e7cd3febc6", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 27.08 + }, + "f3db": { + "min": 16540000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 30.08356, + "f3db": 27558440.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.536533, + "vin0": 0.536533, + "idd": 4.070117e-05, + "gain_lf": 30.08356, + "f3db": 27558440.0, + "ugf": 884930600.0 + }, + "presim_s": 0.2 + }, + { + "case_id": "C12_ihp130_sW1_sL2", + "circuit_id": "C12", + "pdk": "ihp130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "single", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "4eb2f9a567fcf389", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 27.95 + }, + "f3db": { + "min": 12350000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 30.94606, + "f3db": 20588090.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.5279493, + "vin0": 0.5279493, + "idd": 3.502751e-05, + "gain_lf": 30.94606, + "f3db": 20588090.0, + "ugf": 732416700.0 + }, + "presim_s": 0.2 + }, + { + "case_id": "C12_ihp130_sW2_sL1", + "circuit_id": "C12", + "pdk": "ihp130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "single", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.26, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "1f7e4b7e71115c2a", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 25.79 + }, + "f3db": { + "min": 45010000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 28.78626, + "f3db": 75008680.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.5543392, + "vin0": 0.5543392, + "idd": 9.199715e-05, + "gain_lf": 28.78626, + "f3db": 75008680.0, + "ugf": 2083083000.0 + }, + "presim_s": 0.2 + }, + { + "case_id": "C12_ihp130_sW2_sL1.5", + "circuit_id": "C12", + "pdk": "ihp130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "single", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "0f43b765ca2619dc", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 27.08 + }, + "f3db": { + "min": 31500000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 30.08356, + "f3db": 52503150.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.536533, + "vin0": 0.536533, + "idd": 8.140233e-05, + "gain_lf": 30.08356, + "f3db": 52503150.0, + "ugf": 1703299000.0 + }, + "presim_s": 0.2 + }, + { + "case_id": "C12_ihp130_sW2_sL2", + "circuit_id": "C12", + "pdk": "ihp130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "single", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "b5142b752376cb2d", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 27.95 + }, + "f3db": { + "min": 23530000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 30.94606, + "f3db": 39216800.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.5279493, + "vin0": 0.5279493, + "idd": 7.005501e-05, + "gain_lf": 30.94606, + "f3db": 39216800.0, + "ugf": 1414007000.0 + }, + "presim_s": 0.2 + }, + { + "case_id": "C12_sky130_sW0.5_sL1", + "circuit_id": "C12", + "pdk": "sky130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "single", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.3, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "69bc89667e478184", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 32.44 + }, + "f3db": { + "min": 2876000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 35.44454, + "f3db": 4792647.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.7891508, + "vin0": 0.7891508, + "idd": 8.966682e-06, + "gain_lf": 35.44454, + "f3db": 4792647.0, + "ugf": 284493400.0 + }, + "presim_s": 8.2 + }, + { + "case_id": "C12_sky130_sW0.5_sL1.5", + "circuit_id": "C12", + "pdk": "sky130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "single", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.45, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "477f67efba7c179c", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 36.41 + }, + "f3db": { + "min": 1162000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 39.41067, + "f3db": 1937173.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.7583221, + "vin0": 0.7583221, + "idd": 5.345944e-06, + "gain_lf": 39.41067, + "f3db": 1937173.0, + "ugf": 181679400.0 + }, + "presim_s": 8.9 + }, + { + "case_id": "C12_sky130_sW0.5_sL2", + "circuit_id": "C12", + "pdk": "sky130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "single", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.6, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "95e90493eaf4b295", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "f3db=9.794e+05 below floor 1e+06" + ], + "spec": { + "gain_lf": { + "min": 39.69 + }, + "f3db": { + "min": 1000000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 42.68887, + "f3db": 979391.6 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.7451755, + "vin0": 0.7451755, + "idd": 3.834826e-06, + "gain_lf": 42.68887, + "f3db": 979391.6, + "ugf": 134090900.0 + }, + "presim_s": 8.6 + }, + { + "case_id": "C12_sky130_sW1.5_sL1", + "circuit_id": "C12", + "pdk": "sky130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "single", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.3, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.3, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "95ec4a0ec29b0a19", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 32.44 + }, + "f3db": { + "min": 8488000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 35.44454, + "f3db": 14146020.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.7891508, + "vin0": 0.7891508, + "idd": 2.690005e-05, + "gain_lf": 35.44454, + "f3db": 14146020.0, + "ugf": 841905800.0 + }, + "presim_s": 8.7 + }, + { + "case_id": "C12_sky130_sW1.5_sL1.5", + "circuit_id": "C12", + "pdk": "sky130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "single", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.45, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.45, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "26177c318efa256b", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 36.41 + }, + "f3db": { + "min": 3431000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 39.41068, + "f3db": 5718338.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.7583221, + "vin0": 0.7583221, + "idd": 1.603783e-05, + "gain_lf": 39.41068, + "f3db": 5718338.0, + "ugf": 538082900.0 + }, + "presim_s": 8.5 + }, + { + "case_id": "C12_sky130_sW1.5_sL2", + "circuit_id": "C12", + "pdk": "sky130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "single", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.6, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.6, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "95016f3292bec7d2", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 39.69 + }, + "f3db": { + "min": 1735000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 42.68889, + "f3db": 2890836.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.7451755, + "vin0": 0.7451755, + "idd": 1.150448e-05, + "gain_lf": 42.68889, + "f3db": 2890836.0, + "ugf": 396986800.0 + }, + "presim_s": 9.8 + }, + { + "case_id": "C12_sky130_sW1_sL1", + "circuit_id": "C12", + "pdk": "sky130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "single", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "bde578a4c1c724f3", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 32.44 + }, + "f3db": { + "min": 5704000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 35.44454, + "f3db": 9507317.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.7891508, + "vin0": 0.7891508, + "idd": 1.793336e-05, + "gain_lf": 35.44454, + "f3db": 9507317.0, + "ugf": 564509400.0 + }, + "presim_s": 9.0 + }, + { + "case_id": "C12_sky130_sW1_sL1.5", + "circuit_id": "C12", + "pdk": "sky130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "single", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "a7f0b2f2b39cf7bc", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 36.41 + }, + "f3db": { + "min": 2306000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 39.41068, + "f3db": 3842948.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.7583221, + "vin0": 0.7583221, + "idd": 1.069189e-05, + "gain_lf": 39.41068, + "f3db": 3842948.0, + "ugf": 360726400.0 + }, + "presim_s": 10.4 + }, + { + "case_id": "C12_sky130_sW1_sL2", + "circuit_id": "C12", + "pdk": "sky130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "single", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "c715dce9369810b6", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 39.69 + }, + "f3db": { + "min": 1166000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 42.68889, + "f3db": 1942822.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.7451755, + "vin0": 0.7451755, + "idd": 7.669652e-06, + "gain_lf": 42.68889, + "f3db": 1942822.0, + "ugf": 266463300.0 + }, + "presim_s": 6.2 + }, + { + "case_id": "C12_sky130_sW2_sL1", + "circuit_id": "C12", + "pdk": "sky130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "single", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "618985fdfbbd2dd0", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 32.44 + }, + "f3db": { + "min": 11230000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 35.44454, + "f3db": 18710300.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.7891508, + "vin0": 0.7891508, + "idd": 3.586673e-05, + "gain_lf": 35.44454, + "f3db": 18710300.0, + "ugf": 1113531000.0 + }, + "presim_s": 8.6 + }, + { + "case_id": "C12_sky130_sW2_sL1.5", + "circuit_id": "C12", + "pdk": "sky130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "single", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "b36759efdec0cc84", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 36.41 + }, + "f3db": { + "min": 4538000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 39.41068, + "f3db": 7563395.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.7583221, + "vin0": 0.7583221, + "idd": 2.138378e-05, + "gain_lf": 39.41068, + "f3db": 7563395.0, + "ugf": 712515700.0 + }, + "presim_s": 10.3 + }, + { + "case_id": "C12_sky130_sW2_sL2", + "circuit_id": "C12", + "pdk": "sky130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "single", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "b9b7f63f683b8ad1", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 39.69 + }, + "f3db": { + "min": 2294000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 42.68889, + "f3db": 3823403.0 + }, + "floors": { + "gain_lf": { + "min": 15.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.7451755, + "vin0": 0.7451755, + "idd": 1.53393e-05, + "gain_lf": 42.68889, + "f3db": 3823403.0, + "ugf": 527922900.0 + }, + "presim_s": 6.3 + }, + { + "case_id": "C13_gf180_sW0.5_sL1", + "circuit_id": "C13", + "pdk": "gf180", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "parameter_illegal", + "reason": "unit finger width 0.25 um of M1 below the gf180 minimum 0.36 um" + }, + "stage": "parameter_illegal" + }, + { + "case_id": "C13_gf180_sW0.5_sL1.5", + "circuit_id": "C13", + "pdk": "gf180", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "parameter_illegal", + "reason": "unit finger width 0.25 um of M1 below the gf180 minimum 0.36 um" + }, + "stage": "parameter_illegal" + }, + { + "case_id": "C13_gf180_sW0.5_sL2", + "circuit_id": "C13", + "pdk": "gf180", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "parameter_illegal", + "reason": "unit finger width 0.25 um of M1 below the gf180 minimum 0.36 um" + }, + "stage": "parameter_illegal" + }, + { + "case_id": "C13_gf180_sW1.5_sL1", + "circuit_id": "C13", + "pdk": "gf180", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "unit width scaled (nf kept)", + "devices": { + "M1": { + "w0": 0.5, + "l0": 0.56, + "nf0": 1, + "uw0": 0.5, + "w": 0.75, + "l": 0.56, + "nf": 1, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.56, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.56, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.56, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.56, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "7c3b860a1fe73745", + "mirror_pass1": { + "vmin": 0.3788226, + "status": "passed", + "vout_test": 1.84 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.4788 + }, + "_frozen_from": { + "schematic": { + "err": 0.007247, + "vmin": 0.3788226 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.32 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 2.014494e-05, + "err": 0.007247, + "vmin": 0.3788226, + "dev_at_vdd": 0.02427484, + "gout_t": 1.244677e-07, + "rout_t": 8034213.0, + "vout_test": 1.84, + "rout_nom": 8034213.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 0.2 + }, + { + "case_id": "C13_gf180_sW1.5_sL1.5", + "circuit_id": "C13", + "pdk": "gf180", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "unit width scaled (nf kept)", + "devices": { + "M1": { + "w0": 0.5, + "l0": 0.56, + "nf0": 1, + "uw0": 0.5, + "w": 0.75, + "l": 0.84, + "nf": 1, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.84, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.84, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.84, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.84, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "8b11bd64855278aa", + "mirror_pass1": { + "vmin": 0.4243952, + "status": "passed", + "vout_test": 1.86 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.5244 + }, + "_frozen_from": { + "schematic": { + "err": 0.0032835, + "vmin": 0.4243952 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.32 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 2.006567e-05, + "err": 0.0032835, + "vmin": 0.4243952, + "dev_at_vdd": 0.01314676, + "gout_t": 5.70892e-08, + "rout_t": 17516480.0, + "vout_test": 1.86, + "rout_nom": 17516480.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 0.2 + }, + { + "case_id": "C13_gf180_sW1.5_sL2", + "circuit_id": "C13", + "pdk": "gf180", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "unit width scaled (nf kept)", + "devices": { + "M1": { + "w0": 0.5, + "l0": 0.56, + "nf0": 1, + "uw0": 0.5, + "w": 0.75, + "l": 1.12, + "nf": 1, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.12, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.12, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.12, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.12, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "f3065378e1dba6f9", + "mirror_pass1": { + "vmin": 0.4696164, + "status": "passed", + "vout_test": 1.88 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.5696 + }, + "_frozen_from": { + "schematic": { + "err": 0.002052, + "vmin": 0.4696164 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.32 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 2.004104e-05, + "err": 0.002052, + "vmin": 0.4696164, + "dev_at_vdd": 0.00840051, + "gout_t": 3.678481e-08, + "rout_t": 27185160.0, + "vout_test": 1.88, + "rout_nom": 27185160.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 0.2 + }, + { + "case_id": "C13_gf180_sW1_sL1", + "circuit_id": "C13", + "pdk": "gf180", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 0.5, + "l0": 0.56, + "nf0": 1, + "uw0": 0.5, + "w": 0.5, + "l": 0.56, + "nf": 1, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "c3220a42e3e2e956", + "mirror_pass1": { + "vmin": 0.4546396, + "status": "passed", + "vout_test": 1.88 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.5546 + }, + "_frozen_from": { + "schematic": { + "err": 0.00595, + "vmin": 0.4546396 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.32 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 2.0119e-05, + "err": 0.00595, + "vmin": 0.4546396, + "dev_at_vdd": 0.01859027, + "gout_t": 9.758502e-08, + "rout_t": 10247480.0, + "vout_test": 1.88, + "rout_nom": 10247480.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 0.2 + }, + { + "case_id": "C13_gf180_sW1_sL1.5", + "circuit_id": "C13", + "pdk": "gf180", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 0.5, + "l0": 0.56, + "nf0": 1, + "uw0": 0.5, + "w": 0.5, + "l": 0.84, + "nf": 1, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "d0c61bf69907be03", + "mirror_pass1": { + "vmin": 0.514447, + "status": "passed", + "vout_test": 1.91 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.6144 + }, + "_frozen_from": { + "schematic": { + "err": 0.0026085, + "vmin": 0.514447 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.32 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 2.005217e-05, + "err": 0.0026085, + "vmin": 0.514447, + "dev_at_vdd": 0.009134582, + "gout_t": 4.323265e-08, + "rout_t": 23130740.0, + "vout_test": 1.91, + "rout_nom": 23130740.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 0.2 + }, + { + "case_id": "C13_gf180_sW1_sL2", + "circuit_id": "C13", + "pdk": "gf180", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 0.5, + "l0": 0.56, + "nf0": 1, + "uw0": 0.5, + "w": 0.5, + "l": 1.12, + "nf": 1, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "83ab95de4bd1df51", + "mirror_pass1": { + "vmin": 0.5713862, + "status": "passed", + "vout_test": 1.94 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.6714 + }, + "_frozen_from": { + "schematic": { + "err": 0.0016055, + "vmin": 0.5713862 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.32 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 2.003211e-05, + "err": 0.0016055, + "vmin": 0.5713862, + "dev_at_vdd": 0.005457576, + "gout_t": 2.738518e-08, + "rout_t": 36516170.0, + "vout_test": 1.94, + "rout_nom": 36516170.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 0.2 + }, + { + "case_id": "C13_gf180_sW2_sL1", + "circuit_id": "C13", + "pdk": "gf180", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 0.5, + "l0": 0.56, + "nf0": 1, + "uw0": 0.5, + "w": 1.0, + "l": 0.56, + "nf": 2, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "a061c1e243689d8a", + "mirror_pass1": { + "vmin": 0.3391952, + "status": "passed", + "vout_test": 1.82 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.4392 + }, + "_frozen_from": { + "schematic": { + "err": 0.008924, + "vmin": 0.3391952 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.32 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 2.017848e-05, + "err": 0.008924, + "vmin": 0.3391952, + "dev_at_vdd": 0.02969435, + "gout_t": 1.510911e-07, + "rout_t": 6618531.0, + "vout_test": 1.82, + "rout_nom": 6618531.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 0.2 + }, + { + "case_id": "C13_gf180_sW2_sL1.5", + "circuit_id": "C13", + "pdk": "gf180", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 0.5, + "l0": 0.56, + "nf0": 1, + "uw0": 0.5, + "w": 1.0, + "l": 0.84, + "nf": 2, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "247be6bcb62f3bd4", + "mirror_pass1": { + "vmin": 0.3754779, + "status": "passed", + "vout_test": 1.84 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.4755 + }, + "_frozen_from": { + "schematic": { + "err": 0.0040535, + "vmin": 0.3754779 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.32 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 2.008107e-05, + "err": 0.0040535, + "vmin": 0.3754779, + "dev_at_vdd": 0.01609027, + "gout_t": 6.94235e-08, + "rout_t": 14404350.0, + "vout_test": 1.84, + "rout_nom": 14404350.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 0.2 + }, + { + "case_id": "C13_gf180_sW2_sL2", + "circuit_id": "C13", + "pdk": "gf180", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 0.5, + "l0": 0.56, + "nf0": 1, + "uw0": 0.5, + "w": 1.0, + "l": 1.12, + "nf": 2, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "bf140597675567a1", + "mirror_pass1": { + "vmin": 0.41394, + "status": "passed", + "vout_test": 1.86 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.5139 + }, + "_frozen_from": { + "schematic": { + "err": 0.002549, + "vmin": 0.41394 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.32 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 2.005098e-05, + "err": 0.002549, + "vmin": 0.41394, + "dev_at_vdd": 0.01042855, + "gout_t": 4.486788e-08, + "rout_t": 22287690.0, + "vout_test": 1.86, + "rout_nom": 22287690.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 0.3 + }, + { + "case_id": "C13_ihp130_sW0.5_sL1", + "circuit_id": "C13", + "pdk": "ihp130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "parameter_illegal", + "reason": "unit finger width 0.25 um of M1 below the ihp130 minimum 0.3 um" + }, + "stage": "parameter_illegal" + }, + { + "case_id": "C13_ihp130_sW0.5_sL1.5", + "circuit_id": "C13", + "pdk": "ihp130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "parameter_illegal", + "reason": "unit finger width 0.25 um of M1 below the ihp130 minimum 0.3 um" + }, + "stage": "parameter_illegal" + }, + { + "case_id": "C13_ihp130_sW0.5_sL2", + "circuit_id": "C13", + "pdk": "ihp130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "parameter_illegal", + "reason": "unit finger width 0.25 um of M1 below the ihp130 minimum 0.3 um" + }, + "stage": "parameter_illegal" + }, + { + "case_id": "C13_ihp130_sW1.5_sL1", + "circuit_id": "C13", + "pdk": "ihp130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "unit width scaled (nf kept)", + "devices": { + "M1": { + "w0": 0.5, + "l0": 0.52, + "nf0": 1, + "uw0": 0.5, + "w": 0.75, + "l": 0.52, + "nf": 1, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.52, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.52, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.52, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.52, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "34e3b673916c0cb0", + "mirror_pass1": { + "vmin": 0.2513401, + "status": "passed", + "vout_test": 0.73 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.3513 + }, + "_frozen_from": { + "schematic": { + "err": 0.0188565, + "vmin": 0.2513401 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.48 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 2.037713e-05, + "err": 0.0188565, + "vmin": 0.2513401, + "dev_at_vdd": 0.03790745, + "gout_t": 1.069849e-06, + "rout_t": 934715.0, + "vout_test": 0.73, + "rout_nom": 934715.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 0.6 + }, + { + "case_id": "C13_ihp130_sW1.5_sL1.5", + "circuit_id": "C13", + "pdk": "ihp130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "unit width scaled (nf kept)", + "devices": { + "M1": { + "w0": 0.5, + "l0": 0.52, + "nf0": 1, + "uw0": 0.5, + "w": 0.75, + "l": 0.78, + "nf": 1, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.78, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.78, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.78, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.78, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "f941650ac44f4d6f", + "mirror_pass1": { + "vmin": 0.269955, + "status": "passed", + "vout_test": 0.73 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.37 + }, + "_frozen_from": { + "schematic": { + "err": 0.013075, + "vmin": 0.269955 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.48 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 2.02615e-05, + "err": 0.013075, + "vmin": 0.269955, + "dev_at_vdd": 0.02656023, + "gout_t": 7.633454e-07, + "rout_t": 1310028.0, + "vout_test": 0.73, + "rout_nom": 1310028.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 0.7 + }, + { + "case_id": "C13_ihp130_sW1.5_sL2", + "circuit_id": "C13", + "pdk": "ihp130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "unit width scaled (nf kept)", + "devices": { + "M1": { + "w0": 0.5, + "l0": 0.52, + "nf0": 1, + "uw0": 0.5, + "w": 0.75, + "l": 1.04, + "nf": 1, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.04, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.04, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.04, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.04, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "f14cb069a03f1fd1", + "mirror_pass1": { + "vmin": 0.2927887, + "status": "passed", + "vout_test": 0.75 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.3928 + }, + "_frozen_from": { + "schematic": { + "err": 0.010306, + "vmin": 0.2927887 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.48 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 2.020612e-05, + "err": 0.010306, + "vmin": 0.2927887, + "dev_at_vdd": 0.02019321, + "gout_t": 5.809266e-07, + "rout_t": 1721388.0, + "vout_test": 0.75, + "rout_nom": 1721388.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 0.6 + }, + { + "case_id": "C13_ihp130_sW1_sL1", + "circuit_id": "C13", + "pdk": "ihp130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 0.5, + "l0": 0.52, + "nf0": 1, + "uw0": 0.5, + "w": 0.5, + "l": 0.52, + "nf": 1, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "1e3699f2b75dcc6b", + "mirror_pass1": { + "vmin": 0.2824946, + "status": "passed", + "vout_test": 0.74 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.3825 + }, + "_frozen_from": { + "schematic": { + "err": 0.013431, + "vmin": 0.2824946 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.48 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 2.026862e-05, + "err": 0.013431, + "vmin": 0.2824946, + "dev_at_vdd": 0.02833661, + "gout_t": 8.5428e-07, + "rout_t": 1170581.0, + "vout_test": 0.74, + "rout_nom": 1170581.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 0.6 + }, + { + "case_id": "C13_ihp130_sW1_sL1.5", + "circuit_id": "C13", + "pdk": "ihp130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 0.5, + "l0": 0.52, + "nf0": 1, + "uw0": 0.5, + "w": 0.5, + "l": 0.78, + "nf": 1, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.78, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.78, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.78, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.78, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "4f4a9ce82de22f07", + "mirror_pass1": { + "vmin": 0.3111346, + "status": "passed", + "vout_test": 0.76 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.4111 + }, + "_frozen_from": { + "schematic": { + "err": 0.0096275, + "vmin": 0.3111346 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.48 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 2.019255e-05, + "err": 0.0096275, + "vmin": 0.3111346, + "dev_at_vdd": 0.01941545, + "gout_t": 5.859922e-07, + "rout_t": 1706515.0, + "vout_test": 0.76, + "rout_nom": 1706515.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 0.6 + }, + { + "case_id": "C13_ihp130_sW1_sL2", + "circuit_id": "C13", + "pdk": "ihp130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 0.5, + "l0": 0.52, + "nf0": 1, + "uw0": 0.5, + "w": 0.5, + "l": 1.04, + "nf": 1, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.04, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.04, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.04, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.04, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "870f690a2828127d", + "mirror_pass1": { + "vmin": 0.341118, + "status": "passed", + "vout_test": 0.77 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.4411 + }, + "_frozen_from": { + "schematic": { + "err": 0.007254, + "vmin": 0.341118 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.48 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 2.014508e-05, + "err": 0.007254, + "vmin": 0.341118, + "dev_at_vdd": 0.01455954, + "gout_t": 4.498607e-07, + "rout_t": 2222921.0, + "vout_test": 0.77, + "rout_nom": 2222921.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 0.5 + }, + { + "case_id": "C13_ihp130_sW2_sL1", + "circuit_id": "C13", + "pdk": "ihp130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 0.5, + "l0": 0.52, + "nf0": 1, + "uw0": 0.5, + "w": 1.0, + "l": 0.52, + "nf": 2, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "89f5efd015f5dcc6", + "mirror_pass1": { + "vmin": 0.2329467, + "status": "passed", + "vout_test": 0.72 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.3329 + }, + "_frozen_from": { + "schematic": { + "err": 0.0216245, + "vmin": 0.2329467 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.48 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 2.043249e-05, + "err": 0.0216245, + "vmin": 0.2329467, + "dev_at_vdd": 0.04239439, + "gout_t": 1.153404e-06, + "rout_t": 866998.8, + "vout_test": 0.72, + "rout_nom": 866998.8, + "ok_at_vdd": 1.0 + }, + "presim_s": 1.2 + }, + { + "case_id": "C13_ihp130_sW2_sL1.5", + "circuit_id": "C13", + "pdk": "ihp130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 0.5, + "l0": 0.52, + "nf0": 1, + "uw0": 0.5, + "w": 1.0, + "l": 0.78, + "nf": 2, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.78, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.78, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.78, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.78, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "d595e7d146a31041", + "mirror_pass1": { + "vmin": 0.2463465, + "status": "passed", + "vout_test": 0.72 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.3463 + }, + "_frozen_from": { + "schematic": { + "err": 0.015422, + "vmin": 0.2463465 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.48 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 2.030844e-05, + "err": 0.015422, + "vmin": 0.2463465, + "dev_at_vdd": 0.03041006, + "gout_t": 8.35527e-07, + "rout_t": 1196849.0, + "vout_test": 0.72, + "rout_nom": 1196849.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 1.2 + }, + { + "case_id": "C13_ihp130_sW2_sL2", + "circuit_id": "C13", + "pdk": "ihp130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 0.5, + "l0": 0.52, + "nf0": 1, + "uw0": 0.5, + "w": 1.0, + "l": 1.04, + "nf": 2, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.04, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.04, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.04, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.52, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.04, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "db11b7917011c8fb", + "mirror_pass1": { + "vmin": 0.2651642, + "status": "passed", + "vout_test": 0.73 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.3652 + }, + "_frozen_from": { + "schematic": { + "err": 0.01204, + "vmin": 0.2651642 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.48 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 2.02408e-05, + "err": 0.01204, + "vmin": 0.2651642, + "dev_at_vdd": 0.02349678, + "gout_t": 6.50998e-07, + "rout_t": 1536109.0, + "vout_test": 0.73, + "rout_nom": 1536109.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 1.3 + }, + { + "case_id": "C13_sky130_sW0.5_sL1", + "circuit_id": "C13", + "pdk": "sky130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "parameter_illegal", + "reason": "unit finger width 0.25 um of M1 below the sky130 minimum 0.29 um" + }, + "stage": "parameter_illegal" + }, + { + "case_id": "C13_sky130_sW0.5_sL1.5", + "circuit_id": "C13", + "pdk": "sky130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "parameter_illegal", + "reason": "unit finger width 0.25 um of M1 below the sky130 minimum 0.29 um" + }, + "stage": "parameter_illegal" + }, + { + "case_id": "C13_sky130_sW0.5_sL2", + "circuit_id": "C13", + "pdk": "sky130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "parameter_illegal", + "reason": "unit finger width 0.25 um of M1 below the sky130 minimum 0.29 um" + }, + "stage": "parameter_illegal" + }, + { + "case_id": "C13_sky130_sW1.5_sL1", + "circuit_id": "C13", + "pdk": "sky130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "unit width scaled (nf kept)", + "devices": { + "M1": { + "w0": 0.5, + "l0": 0.3, + "nf0": 1, + "uw0": 0.5, + "w": 0.75, + "l": 0.3, + "nf": 1, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.3, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.3, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.3, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.3, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "bcf4ecc14cdef995", + "mirror_pass1": { + "vmin": 0.2971104, + "status": "passed", + "vout_test": 1.05 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.3971 + }, + "_frozen_from": { + "schematic": { + "err": 0.0093025, + "vmin": 0.2971104 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.7200000000000001 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 2.018605e-05, + "err": 0.0093025, + "vmin": 0.2971104, + "dev_at_vdd": 0.03041712, + "gout_t": 6.419703e-07, + "rout_t": 1557706.0, + "vout_test": 1.05, + "rout_nom": 1557706.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 16.9 + }, + { + "case_id": "C13_sky130_sW1.5_sL1.5", + "circuit_id": "C13", + "pdk": "sky130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "unit width scaled (nf kept)", + "devices": { + "M1": { + "w0": 0.5, + "l0": 0.3, + "nf0": 1, + "uw0": 0.5, + "w": 0.75, + "l": 0.45, + "nf": 1, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.45, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.45, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.45, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.45, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "d1ed7a2f3f1633f3", + "mirror_pass1": { + "vmin": 0.2886881, + "status": "passed", + "vout_test": 1.04 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.3887 + }, + "_frozen_from": { + "schematic": { + "err": 0.005341, + "vmin": 0.2886881 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.7200000000000001 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 2.010682e-05, + "err": 0.005341, + "vmin": 0.2886881, + "dev_at_vdd": 0.01758996, + "gout_t": 3.827309e-07, + "rout_t": 2612804.0, + "vout_test": 1.04, + "rout_nom": 2612804.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 19.8 + }, + { + "case_id": "C13_sky130_sW1.5_sL2", + "circuit_id": "C13", + "pdk": "sky130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "unit width scaled (nf kept)", + "devices": { + "M1": { + "w0": 0.5, + "l0": 0.3, + "nf0": 1, + "uw0": 0.5, + "w": 0.75, + "l": 0.6, + "nf": 1, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.6, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.6, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.6, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.6, + "nf": 4, + "uw": 0.75, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "8a5a90fb89a67ff2", + "mirror_pass1": { + "vmin": 0.3102468, + "status": "passed", + "vout_test": 1.06 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.4102 + }, + "_frozen_from": { + "schematic": { + "err": 0.0035335, + "vmin": 0.3102468 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.7200000000000001 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 2.007067e-05, + "err": 0.0035335, + "vmin": 0.3102468, + "dev_at_vdd": 0.01072303, + "gout_t": 2.426725e-07, + "rout_t": 4120797.0, + "vout_test": 1.06, + "rout_nom": 4120797.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 16.6 + }, + { + "case_id": "C13_sky130_sW1_sL1", + "circuit_id": "C13", + "pdk": "sky130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 0.5, + "l0": 0.3, + "nf0": 1, + "uw0": 0.5, + "w": 0.5, + "l": 0.3, + "nf": 1, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "8e41465834e6a761", + "mirror_pass1": { + "vmin": 0.3184171, + "status": "passed", + "vout_test": 1.06 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.4184 + }, + "_frozen_from": { + "schematic": { + "err": 0.006713, + "vmin": 0.3184171 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.7200000000000001 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 2.013426e-05, + "err": 0.006713, + "vmin": 0.3184171, + "dev_at_vdd": 0.02351458, + "gout_t": 5.268826e-07, + "rout_t": 1897959.0, + "vout_test": 1.06, + "rout_nom": 1897959.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 19.0 + }, + { + "case_id": "C13_sky130_sW1_sL1.5", + "circuit_id": "C13", + "pdk": "sky130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 0.5, + "l0": 0.3, + "nf0": 1, + "uw0": 0.5, + "w": 0.5, + "l": 0.45, + "nf": 1, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "c59d2c767e881918", + "mirror_pass1": { + "vmin": 0.3394912, + "status": "passed", + "vout_test": 1.07 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.4395 + }, + "_frozen_from": { + "schematic": { + "err": 0.0040145, + "vmin": 0.3394912 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.7200000000000001 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 2.008029e-05, + "err": 0.0040145, + "vmin": 0.3394912, + "dev_at_vdd": 0.01329274, + "gout_t": 3.114416e-07, + "rout_t": 3210882.0, + "vout_test": 1.07, + "rout_nom": 3210882.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 18.0 + }, + { + "case_id": "C13_sky130_sW1_sL2", + "circuit_id": "C13", + "pdk": "sky130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 0.5, + "l0": 0.3, + "nf0": 1, + "uw0": 0.5, + "w": 0.5, + "l": 0.6, + "nf": 1, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "34d9b48425c961ba", + "mirror_pass1": { + "vmin": 0.3698112, + "status": "passed", + "vout_test": 1.08 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.4698 + }, + "_frozen_from": { + "schematic": { + "err": 0.002608, + "vmin": 0.3698112 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.7200000000000001 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 2.005216e-05, + "err": 0.002608, + "vmin": 0.3698112, + "dev_at_vdd": 0.00812611, + "gout_t": 2.04396e-07, + "rout_t": 4892465.0, + "vout_test": 1.08, + "rout_nom": 4892465.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 17.9 + }, + { + "case_id": "C13_sky130_sW2_sL1", + "circuit_id": "C13", + "pdk": "sky130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 0.5, + "l0": 0.3, + "nf0": 1, + "uw0": 0.5, + "w": 1.0, + "l": 0.3, + "nf": 2, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "e36dae11343dafcd", + "mirror_pass1": { + "vmin": 0.2975041, + "status": "passed", + "vout_test": 1.05 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.3975 + }, + "_frozen_from": { + "schematic": { + "err": 0.010947, + "vmin": 0.2975041 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.7200000000000001 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 2.021894e-05, + "err": 0.010947, + "vmin": 0.2975041, + "dev_at_vdd": 0.03467514, + "gout_t": 7.184159e-07, + "rout_t": 1391953.0, + "vout_test": 1.05, + "rout_nom": 1391953.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 12.6 + }, + { + "case_id": "C13_sky130_sW2_sL1.5", + "circuit_id": "C13", + "pdk": "sky130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 0.5, + "l0": 0.3, + "nf0": 1, + "uw0": 0.5, + "w": 1.0, + "l": 0.45, + "nf": 2, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "e301942eaaf247c4", + "mirror_pass1": { + "vmin": 0.2747151, + "status": "passed", + "vout_test": 1.04 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.3747 + }, + "_frozen_from": { + "schematic": { + "err": 0.0062795, + "vmin": 0.2747151 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.7200000000000001 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 2.012559e-05, + "err": 0.0062795, + "vmin": 0.2747151, + "dev_at_vdd": 0.0201392, + "gout_t": 4.284173e-07, + "rout_t": 2334174.0, + "vout_test": 1.04, + "rout_nom": 2334174.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 12.5 + }, + { + "case_id": "C13_sky130_sW2_sL2", + "circuit_id": "C13", + "pdk": "sky130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 0.5, + "l0": 0.3, + "nf0": 1, + "uw0": 0.5, + "w": 1.0, + "l": 0.6, + "nf": 2, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "ea2079e4099fc136", + "mirror_pass1": { + "vmin": 0.2858051, + "status": "passed", + "vout_test": 1.04 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.3858 + }, + "_frozen_from": { + "schematic": { + "err": 0.0038505, + "vmin": 0.2858051 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.7200000000000001 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 2.007701e-05, + "err": 0.0038505, + "vmin": 0.2858051, + "dev_at_vdd": 0.0118518, + "gout_t": 2.654067e-07, + "rout_t": 3767809.0, + "vout_test": 1.04, + "rout_nom": 3767809.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 12.2 + }, + { + "case_id": "C14_gf180_sW0.5_sL1", + "circuit_id": "C14", + "pdk": "gf180", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.12, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.12, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 1.0, + "l0": 1.12, + "nf0": 2, + "uw0": 0.5, + "w": 0.5, + "l": 1.12, + "nf": 1, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.12, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "4905de285a7cb6e7", + "mirror_pass1": { + "vmin": 0.7094948, + "status": "passed", + "vout_test": 2.0 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.8095 + }, + "_frozen_from": { + "schematic": { + "err": -0.0043175, + "vmin": 0.7094948 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.9799999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.991365e-05, + "err": -0.0043175, + "vmin": 0.7094948, + "dev_at_vdd": 0.004299304, + "gout_t": 2.39829e-11, + "rout_t": 41699820000.0, + "vout_test": 2.0, + "rout_nom": 41699820000.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 0.2 + }, + { + "case_id": "C14_gf180_sW0.5_sL1.5", + "circuit_id": "C14", + "pdk": "gf180", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.68, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.68, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 1.0, + "l0": 1.12, + "nf0": 2, + "uw0": 0.5, + "w": 0.5, + "l": 1.68, + "nf": 1, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.68, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "ade2c7d0fafd684f", + "mirror_pass1": { + "vmin": 0.7763944, + "status": "passed", + "vout_test": 2.04 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.8764 + }, + "_frozen_from": { + "schematic": { + "err": -0.0033225, + "vmin": 0.7763944 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.9799999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.993355e-05, + "err": -0.0033225, + "vmin": 0.7763944, + "dev_at_vdd": 0.003317149, + "gout_t": 5.946231e-11, + "rout_t": 16824180000.0, + "vout_test": 2.04, + "rout_nom": 16824180000.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 0.2 + }, + { + "case_id": "C14_gf180_sW0.5_sL2", + "circuit_id": "C14", + "pdk": "gf180", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 2.24, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 2.24, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 1.0, + "l0": 1.12, + "nf0": 2, + "uw0": 0.5, + "w": 0.5, + "l": 2.24, + "nf": 1, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 2.24, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "3047c5f4031e8aa1", + "mirror_pass1": { + "vmin": 0.8593138, + "status": "passed", + "vout_test": 2.08 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.9593 + }, + "_frozen_from": { + "schematic": { + "err": -0.002807, + "vmin": 0.8593138 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.9799999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.994386e-05, + "err": -0.002807, + "vmin": 0.8593138, + "dev_at_vdd": 0.002804686, + "gout_t": 2.856617e-10, + "rout_t": 3505060000.0, + "vout_test": 2.08, + "rout_nom": 3505060000.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 0.2 + }, + { + "case_id": "C14_gf180_sW1.5_sL1", + "circuit_id": "C14", + "pdk": "gf180", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.12, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.12, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 1.0, + "l0": 1.12, + "nf0": 2, + "uw0": 0.5, + "w": 1.5, + "l": 1.12, + "nf": 3, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.12, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "860f9f227b5e4ca4", + "mirror_pass1": { + "vmin": 0.5361322, + "status": "passed", + "vout_test": 1.92 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.6361 + }, + "_frozen_from": { + "schematic": { + "err": -0.0030695, + "vmin": 0.5361322 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.9799999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.993861e-05, + "err": -0.0030695, + "vmin": 0.5361322, + "dev_at_vdd": 0.002771026, + "gout_t": 1.299068e-11, + "rout_t": 76978480000.0, + "vout_test": 1.92, + "rout_nom": 76978480000.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C14_gf180_sW1.5_sL1.5", + "circuit_id": "C14", + "pdk": "gf180", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.68, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.68, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 1.0, + "l0": 1.12, + "nf0": 2, + "uw0": 0.5, + "w": 1.5, + "l": 1.68, + "nf": 3, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.68, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "6970d3dc60c2448f", + "mirror_pass1": { + "vmin": 0.5855717, + "status": "passed", + "vout_test": 1.94 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.6856 + }, + "_frozen_from": { + "schematic": { + "err": -0.0023405, + "vmin": 0.5855717 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.9799999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.995319e-05, + "err": -0.0023405, + "vmin": 0.5855717, + "dev_at_vdd": 0.00196495, + "gout_t": 9.850565e-12, + "rout_t": 101517200000.0, + "vout_test": 1.94, + "rout_nom": 101517200000.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 0.2 + }, + { + "case_id": "C14_gf180_sW1.5_sL2", + "circuit_id": "C14", + "pdk": "gf180", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 2.24, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 2.24, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 1.0, + "l0": 1.12, + "nf0": 2, + "uw0": 0.5, + "w": 1.5, + "l": 2.24, + "nf": 3, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 2.24, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "6cd1b2cee7c1f8fd", + "mirror_pass1": { + "vmin": 0.6268137, + "status": "passed", + "vout_test": 1.96 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.7268 + }, + "_frozen_from": { + "schematic": { + "err": -0.001958, + "vmin": 0.6268137 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.9799999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.996084e-05, + "err": -0.001958, + "vmin": 0.6268137, + "dev_at_vdd": 0.001807008, + "gout_t": 8.866212e-12, + "rout_t": 112788100000.0, + "vout_test": 1.96, + "rout_nom": 112788100000.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 0.2 + }, + { + "case_id": "C14_gf180_sW1_sL1", + "circuit_id": "C14", + "pdk": "gf180", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 1.0, + "l0": 1.12, + "nf0": 2, + "uw0": 0.5, + "w": 1.0, + "l": 1.12, + "nf": 2, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "eb0d615f654305b0", + "mirror_pass1": { + "vmin": 0.5939181, + "status": "passed", + "vout_test": 1.95 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.6939 + }, + "_frozen_from": { + "schematic": { + "err": -0.003444, + "vmin": 0.5939181 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.9799999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.993112e-05, + "err": -0.003444, + "vmin": 0.5939181, + "dev_at_vdd": 0.003301525, + "gout_t": 1.294508e-11, + "rout_t": 77250220000.0, + "vout_test": 1.95, + "rout_nom": 77250220000.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 0.2 + }, + { + "case_id": "C14_gf180_sW1_sL1.5", + "circuit_id": "C14", + "pdk": "gf180", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.68, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.68, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 1.0, + "l0": 1.12, + "nf0": 2, + "uw0": 0.5, + "w": 1.0, + "l": 1.68, + "nf": 2, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.68, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "66fb7161948868f1", + "mirror_pass1": { + "vmin": 0.6433773, + "status": "passed", + "vout_test": 1.97 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.7434 + }, + "_frozen_from": { + "schematic": { + "err": -0.002634, + "vmin": 0.6433773 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.9799999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.994732e-05, + "err": -0.002634, + "vmin": 0.6433773, + "dev_at_vdd": 0.002509207, + "gout_t": 1.08626e-11, + "rout_t": 92060170000.0, + "vout_test": 1.97, + "rout_nom": 92060170000.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C14_gf180_sW1_sL2", + "circuit_id": "C14", + "pdk": "gf180", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 2.24, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 2.24, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 1.0, + "l0": 1.12, + "nf0": 2, + "uw0": 0.5, + "w": 1.0, + "l": 2.24, + "nf": 2, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 2.24, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "be9d26616d20ba9f", + "mirror_pass1": { + "vmin": 0.7010976, + "status": "passed", + "vout_test": 2.0 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.8011 + }, + "_frozen_from": { + "schematic": { + "err": -0.002207, + "vmin": 0.7010976 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.9799999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.995586e-05, + "err": -0.002207, + "vmin": 0.7010976, + "dev_at_vdd": 0.002173331, + "gout_t": 1.070011e-11, + "rout_t": 93460290000.0, + "vout_test": 2.0, + "rout_nom": 93460290000.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C14_gf180_sW2_sL1", + "circuit_id": "C14", + "pdk": "gf180", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 1.0, + "l0": 1.12, + "nf0": 2, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "5fb7a92c99701474", + "mirror_pass1": { + "vmin": 0.5030476, + "status": "passed", + "vout_test": 1.9 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.603 + }, + "_frozen_from": { + "schematic": { + "err": -0.0028555, + "vmin": 0.5030476 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.9799999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.994289e-05, + "err": -0.0028555, + "vmin": 0.5030476, + "dev_at_vdd": 0.002409741, + "gout_t": 1.426431e-11, + "rout_t": 70105130000.0, + "vout_test": 1.9, + "rout_nom": 70105130000.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 0.2 + }, + { + "case_id": "C14_gf180_sW2_sL1.5", + "circuit_id": "C14", + "pdk": "gf180", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.68, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.68, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 1.0, + "l0": 1.12, + "nf0": 2, + "uw0": 0.5, + "w": 2.0, + "l": 1.68, + "nf": 4, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.68, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "50e268d6bfb195a2", + "mirror_pass1": { + "vmin": 0.5442732, + "status": "passed", + "vout_test": 1.92 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.6443 + }, + "_frozen_from": { + "schematic": { + "err": -0.0021705, + "vmin": 0.5442732 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.9799999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.995659e-05, + "err": -0.0021705, + "vmin": 0.5442732, + "dev_at_vdd": 0.001501267, + "gout_t": 1.099459e-11, + "rout_t": 90953880000.0, + "vout_test": 1.92, + "rout_nom": 90953880000.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 0.2 + }, + { + "case_id": "C14_gf180_sW2_sL2", + "circuit_id": "C14", + "pdk": "gf180", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 2.24, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 2.24, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 1.0, + "l0": 1.12, + "nf0": 2, + "uw0": 0.5, + "w": 2.0, + "l": 2.24, + "nf": 4, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 1.12, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 2.24, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "e2ab2475e07a8df1", + "mirror_pass1": { + "vmin": 0.5855146, + "status": "passed", + "vout_test": 1.94 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.6855 + }, + "_frozen_from": { + "schematic": { + "err": -0.0018125, + "vmin": 0.5855146 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.9799999999999998 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.996375e-05, + "err": -0.0018125, + "vmin": 0.5855146, + "dev_at_vdd": 0.001489803, + "gout_t": 9.950808e-12, + "rout_t": 100494400000.0, + "vout_test": 1.94, + "rout_nom": 100494400000.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 0.2 + }, + { + "case_id": "C14_ihp130_sW0.5_sL1", + "circuit_id": "C14", + "pdk": "ihp130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.04, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.04, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 1.0, + "l0": 1.04, + "nf0": 2, + "uw0": 0.5, + "w": 0.5, + "l": 1.04, + "nf": 1, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.04, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "5d3b293e01331d85", + "mirror_pass1": { + "vmin": 0.5150785, + "status": "passed", + "vout_test": 0.86 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.6151 + }, + "_frozen_from": { + "schematic": { + "err": -0.024261, + "vmin": 0.5150785 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.72 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.951478e-05, + "err": -0.024261, + "vmin": 0.5150785, + "dev_at_vdd": 0.02420698, + "gout_t": 5.011179e-09, + "rout_t": 199570200.0, + "vout_test": 0.86, + "rout_nom": 199570200.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 0.3 + }, + { + "case_id": "C14_ihp130_sW0.5_sL1.5", + "circuit_id": "C14", + "pdk": "ihp130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.56, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.56, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 1.0, + "l0": 1.04, + "nf0": 2, + "uw0": 0.5, + "w": 0.5, + "l": 1.56, + "nf": 1, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.56, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "07e83c784eedc38a", + "mirror_pass1": { + "vmin": 0.5686029, + "status": "passed", + "vout_test": 0.88 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.6686 + }, + "_frozen_from": { + "schematic": { + "err": -0.0212725, + "vmin": 0.5686029 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.72 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.957455e-05, + "err": -0.0212725, + "vmin": 0.5686029, + "dev_at_vdd": 0.02122927, + "gout_t": 7.647966e-09, + "rout_t": 130816600.0, + "vout_test": 0.88, + "rout_nom": 130816600.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 0.3 + }, + { + "case_id": "C14_ihp130_sW0.5_sL2", + "circuit_id": "C14", + "pdk": "ihp130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 2.08, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 2.08, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 1.0, + "l0": 1.04, + "nf0": 2, + "uw0": 0.5, + "w": 0.5, + "l": 2.08, + "nf": 1, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 2.08, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "4076379bf7710c72", + "mirror_pass1": { + "vmin": 0.6224217, + "status": "passed", + "vout_test": 0.91 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.72 + }, + "_frozen_from": { + "schematic": { + "err": -0.0195255, + "vmin": 0.6224217 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.72 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.960949e-05, + "err": -0.0195255, + "vmin": 0.6224217, + "dev_at_vdd": 0.01947342, + "gout_t": 1.357794e-08, + "rout_t": 73679960.0, + "vout_test": 0.91, + "rout_nom": 73679960.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 0.3 + }, + { + "case_id": "C14_ihp130_sW1.5_sL1", + "circuit_id": "C14", + "pdk": "ihp130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.04, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.04, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 1.0, + "l0": 1.04, + "nf0": 2, + "uw0": 0.5, + "w": 1.5, + "l": 1.04, + "nf": 3, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.04, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "fa54eda32ba64792", + "mirror_pass1": { + "vmin": 0.3811875, + "status": "passed", + "vout_test": 0.79 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.4812 + }, + "_frozen_from": { + "schematic": { + "err": -0.0247995, + "vmin": 0.3811875 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.72 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.950401e-05, + "err": -0.0247995, + "vmin": 0.3811875, + "dev_at_vdd": 0.02471719, + "gout_t": 5.071973e-09, + "rout_t": 197162700.0, + "vout_test": 0.79, + "rout_nom": 197162700.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 0.7 + }, + { + "case_id": "C14_ihp130_sW1.5_sL1.5", + "circuit_id": "C14", + "pdk": "ihp130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.56, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.56, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 1.0, + "l0": 1.04, + "nf0": 2, + "uw0": 0.5, + "w": 1.5, + "l": 1.56, + "nf": 3, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.56, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "58117cef7b455207", + "mirror_pass1": { + "vmin": 0.4018094, + "status": "passed", + "vout_test": 0.8 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.5018 + }, + "_frozen_from": { + "schematic": { + "err": -0.0212935, + "vmin": 0.4018094 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.72 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.957413e-05, + "err": -0.0212935, + "vmin": 0.4018094, + "dev_at_vdd": 0.02124491, + "gout_t": 3.139546e-09, + "rout_t": 318519300.0, + "vout_test": 0.8, + "rout_nom": 318519300.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 0.7 + }, + { + "case_id": "C14_ihp130_sW1.5_sL2", + "circuit_id": "C14", + "pdk": "ihp130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 2.08, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 2.08, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 1.0, + "l0": 1.04, + "nf0": 2, + "uw0": 0.5, + "w": 1.5, + "l": 2.08, + "nf": 3, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 2.08, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "198656f7f3528079", + "mirror_pass1": { + "vmin": 0.4295694, + "status": "passed", + "vout_test": 0.81 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.5296 + }, + "_frozen_from": { + "schematic": { + "err": -0.0191985, + "vmin": 0.4295694 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.72 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.961603e-05, + "err": -0.0191985, + "vmin": 0.4295694, + "dev_at_vdd": 0.01916515, + "gout_t": 2.293335e-09, + "rout_t": 436046200.0, + "vout_test": 0.81, + "rout_nom": 436046200.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 0.8 + }, + { + "case_id": "C14_ihp130_sW1_sL1", + "circuit_id": "C14", + "pdk": "ihp130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.04, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.04, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 1.0, + "l0": 1.04, + "nf0": 2, + "uw0": 0.5, + "w": 1.0, + "l": 1.04, + "nf": 2, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.04, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "670d6b40ce2d2b65", + "mirror_pass1": { + "vmin": 0.4206067, + "status": "passed", + "vout_test": 0.81 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.5206 + }, + "_frozen_from": { + "schematic": { + "err": -0.0243925, + "vmin": 0.4206067 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.72 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.951215e-05, + "err": -0.0243925, + "vmin": 0.4206067, + "dev_at_vdd": 0.02432419, + "gout_t": 4.547072e-09, + "rout_t": 219921700.0, + "vout_test": 0.81, + "rout_nom": 219921700.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 0.6 + }, + { + "case_id": "C14_ihp130_sW1_sL1.5", + "circuit_id": "C14", + "pdk": "ihp130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 1.0, + "l0": 1.04, + "nf0": 2, + "uw0": 0.5, + "w": 1.0, + "l": 1.56, + "nf": 2, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "4875bd2cab9213f2", + "mirror_pass1": { + "vmin": 0.4521513, + "status": "passed", + "vout_test": 0.83 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.5522 + }, + "_frozen_from": { + "schematic": { + "err": -0.0210755, + "vmin": 0.4521513 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.72 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.957849e-05, + "err": -0.0210755, + "vmin": 0.4521513, + "dev_at_vdd": 0.02103556, + "gout_t": 2.945076e-09, + "rout_t": 339555500.0, + "vout_test": 0.83, + "rout_nom": 339555500.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 0.5 + }, + { + "case_id": "C14_ihp130_sW1_sL2", + "circuit_id": "C14", + "pdk": "ihp130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 2.08, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 2.08, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 1.0, + "l0": 1.04, + "nf0": 2, + "uw0": 0.5, + "w": 1.0, + "l": 2.08, + "nf": 2, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 2.08, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "b9b577a40ce05d31", + "mirror_pass1": { + "vmin": 0.4878588, + "status": "passed", + "vout_test": 0.84 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.5879 + }, + "_frozen_from": { + "schematic": { + "err": -0.019096, + "vmin": 0.4878588 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.72 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.961808e-05, + "err": -0.019096, + "vmin": 0.4878588, + "dev_at_vdd": 0.01906682, + "gout_t": 2.535919e-09, + "rout_t": 394334300.0, + "vout_test": 0.84, + "rout_nom": 394334300.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 0.4 + }, + { + "case_id": "C14_ihp130_sW2_sL1", + "circuit_id": "C14", + "pdk": "ihp130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.04, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.04, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 1.0, + "l0": 1.04, + "nf0": 2, + "uw0": 0.5, + "w": 2.0, + "l": 1.04, + "nf": 4, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.04, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "48ca72d1df585caa", + "mirror_pass1": { + "vmin": 0.3586395, + "status": "passed", + "vout_test": 0.78 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.4586 + }, + "_frozen_from": { + "schematic": { + "err": -0.0251955, + "vmin": 0.3586395 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.72 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.949609e-05, + "err": -0.0251955, + "vmin": 0.3586395, + "dev_at_vdd": 0.02510205, + "gout_t": 5.580814e-09, + "rout_t": 179185300.0, + "vout_test": 0.78, + "rout_nom": 179185300.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 0.9 + }, + { + "case_id": "C14_ihp130_sW2_sL1.5", + "circuit_id": "C14", + "pdk": "ihp130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 1.0, + "l0": 1.04, + "nf0": 2, + "uw0": 0.5, + "w": 2.0, + "l": 1.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "846970e5d2b47f91", + "mirror_pass1": { + "vmin": 0.3723262, + "status": "passed", + "vout_test": 0.79 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.4723 + }, + "_frozen_from": { + "schematic": { + "err": -0.0215525, + "vmin": 0.3723262 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.72 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.956895e-05, + "err": -0.0215525, + "vmin": 0.3723262, + "dev_at_vdd": 0.02149791, + "gout_t": 3.39237e-09, + "rout_t": 294780300.0, + "vout_test": 0.79, + "rout_nom": 294780300.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 0.8 + }, + { + "case_id": "C14_ihp130_sW2_sL2", + "circuit_id": "C14", + "pdk": "ihp130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 2.08, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 2.08, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 1.0, + "l0": 1.04, + "nf0": 2, + "uw0": 0.5, + "w": 2.0, + "l": 2.08, + "nf": 4, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 1.04, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 2.08, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "bd7838c5c1dac2d6", + "mirror_pass1": { + "vmin": 0.3948416, + "status": "passed", + "vout_test": 0.8 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.4948 + }, + "_frozen_from": { + "schematic": { + "err": -0.0193775, + "vmin": 0.3948416 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.72 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.961245e-05, + "err": -0.0193775, + "vmin": 0.3948416, + "dev_at_vdd": 0.01934037, + "gout_t": 2.401369e-09, + "rout_t": 416431300.0, + "vout_test": 0.8, + "rout_nom": 416431300.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 1.0 + }, + { + "case_id": "C14_sky130_sW0.5_sL1", + "circuit_id": "C14", + "pdk": "sky130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.6, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.6, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 1.0, + "l0": 0.6, + "nf0": 2, + "uw0": 0.5, + "w": 0.5, + "l": 0.6, + "nf": 1, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.6, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "cec90c22ccda6260", + "mirror_pass1": { + "vmin": 0.6825595, + "status": "passed", + "vout_test": 1.24 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.7826 + }, + "_frozen_from": { + "schematic": { + "err": -0.008847, + "vmin": 0.6825595 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.08 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.982306e-05, + "err": -0.008847, + "vmin": 0.6825595, + "dev_at_vdd": 0.00883981, + "gout_t": 6.273302e-10, + "rout_t": 1594470000.0, + "vout_test": 1.24, + "rout_nom": 1594470000.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 19.1 + }, + { + "case_id": "C14_sky130_sW0.5_sL1.5", + "circuit_id": "C14", + "pdk": "sky130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.9, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.9, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 1.0, + "l0": 0.6, + "nf0": 2, + "uw0": 0.5, + "w": 0.5, + "l": 0.9, + "nf": 1, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.9, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "9149c4dac9a1af5b", + "mirror_pass1": { + "vmin": 0.7394514, + "status": "passed", + "vout_test": 1.27 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.8395 + }, + "_frozen_from": { + "schematic": { + "err": -0.010322, + "vmin": 0.7394514 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.08 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.979356e-05, + "err": -0.010322, + "vmin": 0.7394514, + "dev_at_vdd": 0.01031004, + "gout_t": 1.451525e-09, + "rout_t": 689193900.0, + "vout_test": 1.27, + "rout_nom": 689193900.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 19.2 + }, + { + "case_id": "C14_sky130_sW0.5_sL2", + "circuit_id": "C14", + "pdk": "sky130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.2, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.2, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 1.0, + "l0": 0.6, + "nf0": 2, + "uw0": 0.5, + "w": 0.5, + "l": 1.2, + "nf": 1, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.2, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "09e948c51cdf0fa7", + "mirror_pass1": { + "vmin": 0.7688774, + "status": "passed", + "vout_test": 1.28 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.8689 + }, + "_frozen_from": { + "schematic": { + "err": -0.010678, + "vmin": 0.7688774 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.08 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.978644e-05, + "err": -0.010678, + "vmin": 0.7688774, + "dev_at_vdd": 0.01065672, + "gout_t": 3.72794e-09, + "rout_t": 268445700.0, + "vout_test": 1.28, + "rout_nom": 268445700.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 19.1 + }, + { + "case_id": "C14_sky130_sW1.5_sL1", + "circuit_id": "C14", + "pdk": "sky130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.6, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.6, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 1.0, + "l0": 0.6, + "nf0": 2, + "uw0": 0.5, + "w": 1.5, + "l": 0.6, + "nf": 3, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.6, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "ddf8e23b97de0177", + "mirror_pass1": { + "vmin": 0.546345, + "status": "passed", + "vout_test": 1.17 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.6463 + }, + "_frozen_from": { + "schematic": { + "err": -0.0063195, + "vmin": 0.546345 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.08 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.987361e-05, + "err": -0.0063195, + "vmin": 0.546345, + "dev_at_vdd": 0.00631613, + "gout_t": 1.864492e-10, + "rout_t": 5363391000.0, + "vout_test": 1.17, + "rout_nom": 5363391000.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 12.3 + }, + { + "case_id": "C14_sky130_sW1.5_sL1.5", + "circuit_id": "C14", + "pdk": "sky130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.9, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.9, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 1.0, + "l0": 0.6, + "nf0": 2, + "uw0": 0.5, + "w": 1.5, + "l": 0.9, + "nf": 3, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.9, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "e81ecec96cb109d9", + "mirror_pass1": { + "vmin": 0.5698569, + "status": "passed", + "vout_test": 1.18 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.6699 + }, + "_frozen_from": { + "schematic": { + "err": -0.007168, + "vmin": 0.5698569 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.08 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.985664e-05, + "err": -0.007168, + "vmin": 0.5698569, + "dev_at_vdd": 0.007163431, + "gout_t": 2.607722e-10, + "rout_t": 3834946000.0, + "vout_test": 1.18, + "rout_nom": 3834946000.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 12.4 + }, + { + "case_id": "C14_sky130_sW1.5_sL2", + "circuit_id": "C14", + "pdk": "sky130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.2, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.2, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 1.0, + "l0": 0.6, + "nf0": 2, + "uw0": 0.5, + "w": 1.5, + "l": 1.2, + "nf": 3, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.2, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "cf7ee1291b61ccbb", + "mirror_pass1": { + "vmin": 0.5775861, + "status": "passed", + "vout_test": 1.19 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.6776 + }, + "_frozen_from": { + "schematic": { + "err": -0.007468, + "vmin": 0.5775861 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.08 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.985064e-05, + "err": -0.007468, + "vmin": 0.5775861, + "dev_at_vdd": 0.00746273, + "gout_t": 3.154333e-10, + "rout_t": 3170565000.0, + "vout_test": 1.19, + "rout_nom": 3170565000.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 12.3 + }, + { + "case_id": "C14_sky130_sW1_sL1", + "circuit_id": "C14", + "pdk": "sky130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 1.0, + "l0": 0.6, + "nf0": 2, + "uw0": 0.5, + "w": 1.0, + "l": 0.6, + "nf": 2, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "e52fa280169f5140", + "mirror_pass1": { + "vmin": 0.5866486, + "status": "passed", + "vout_test": 1.19 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.6866 + }, + "_frozen_from": { + "schematic": { + "err": -0.0070175, + "vmin": 0.5866486 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.08 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.985965e-05, + "err": -0.0070175, + "vmin": 0.5866486, + "dev_at_vdd": 0.007013247, + "gout_t": 2.542863e-10, + "rout_t": 3932890000.0, + "vout_test": 1.19, + "rout_nom": 3932890000.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 18.7 + }, + { + "case_id": "C14_sky130_sW1_sL1.5", + "circuit_id": "C14", + "pdk": "sky130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.9, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.9, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 1.0, + "l0": 0.6, + "nf0": 2, + "uw0": 0.5, + "w": 1.0, + "l": 0.9, + "nf": 2, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.9, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "a2f661aad0521e79", + "mirror_pass1": { + "vmin": 0.6196821, + "status": "passed", + "vout_test": 1.21 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.7197 + }, + "_frozen_from": { + "schematic": { + "err": -0.008077, + "vmin": 0.6196821 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.08 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.983846e-05, + "err": -0.008077, + "vmin": 0.6196821, + "dev_at_vdd": 0.008071483, + "gout_t": 3.878803e-10, + "rout_t": 2578252000.0, + "vout_test": 1.21, + "rout_nom": 2578252000.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 12.3 + }, + { + "case_id": "C14_sky130_sW1_sL2", + "circuit_id": "C14", + "pdk": "sky130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.2, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.2, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 1.0, + "l0": 0.6, + "nf0": 2, + "uw0": 0.5, + "w": 1.0, + "l": 1.2, + "nf": 2, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.2, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "4071a01c9b314c3d", + "mirror_pass1": { + "vmin": 0.6332049, + "status": "passed", + "vout_test": 1.22 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.7332 + }, + "_frozen_from": { + "schematic": { + "err": -0.0084205, + "vmin": 0.6332049 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.08 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.983159e-05, + "err": -0.0084205, + "vmin": 0.6332049, + "dev_at_vdd": 0.00841385, + "gout_t": 5.408206e-10, + "rout_t": 1849226000.0, + "vout_test": 1.22, + "rout_nom": 1849226000.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 15.6 + }, + { + "case_id": "C14_sky130_sW2_sL1", + "circuit_id": "C14", + "pdk": "sky130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "mirror", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 1.0, + "l0": 0.6, + "nf0": 2, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "e689edfc71f66240", + "mirror_pass1": { + "vmin": 0.523346, + "status": "passed", + "vout_test": 1.16 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.6233 + }, + "_frozen_from": { + "schematic": { + "err": -0.0059585, + "vmin": 0.523346 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.08 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.988083e-05, + "err": -0.0059585, + "vmin": 0.523346, + "dev_at_vdd": 0.005955145, + "gout_t": 1.600138e-10, + "rout_t": 6249602000.0, + "vout_test": 1.16, + "rout_nom": 6249602000.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 12.1 + }, + { + "case_id": "C14_sky130_sW2_sL1.5", + "circuit_id": "C14", + "pdk": "sky130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "mirror", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.9, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.9, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 1.0, + "l0": 0.6, + "nf0": 2, + "uw0": 0.5, + "w": 2.0, + "l": 0.9, + "nf": 4, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.9, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "cf5bd71dfe67d9fd", + "mirror_pass1": { + "vmin": 0.5415636, + "status": "passed", + "vout_test": 1.17 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.6416 + }, + "_frozen_from": { + "schematic": { + "err": -0.0066865, + "vmin": 0.5415636 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.08 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.986627e-05, + "err": -0.0066865, + "vmin": 0.5415636, + "dev_at_vdd": 0.006682356, + "gout_t": 2.10599e-10, + "rout_t": 4748360000.0, + "vout_test": 1.17, + "rout_nom": 4748360000.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 12.1 + }, + { + "case_id": "C14_sky130_sW2_sL2", + "circuit_id": "C14", + "pdk": "sky130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "mirror", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.2, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.2, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 1.0, + "l0": 0.6, + "nf0": 2, + "uw0": 0.5, + "w": 2.0, + "l": 1.2, + "nf": 4, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 2.0, + "l0": 0.6, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.2, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "6753c26801898c56", + "mirror_pass1": { + "vmin": 0.5463274, + "status": "passed", + "vout_test": 1.17 + }, + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 0.6463 + }, + "_frozen_from": { + "schematic": { + "err": -0.0069555, + "vmin": 0.5463274 + }, + "floors": { + "err": { + "abs_max": 0.03 + }, + "vmin": { + "max": 1.08 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "iout_t": 1.986089e-05, + "err": -0.0069555, + "vmin": 0.5463274, + "dev_at_vdd": 0.006950881, + "gout_t": 2.502328e-10, + "rout_t": 3996279000.0, + "vout_test": 1.17, + "rout_nom": 3996279000.0, + "ok_at_vdd": 1.0 + }, + "presim_s": 12.1 + }, + { + "case_id": "C15_gf180_sW0.5_sL1", + "circuit_id": "C15", + "pdk": "gf180", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "single", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.56, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "3ea6591d35394b90", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 43520000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 8.859438, + "f3db": 72536000.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 1.596329, + "vin0": 1.596329, + "idd": 7.656709e-05, + "gain_lf": 8.859438, + "f3db": 72536000.0, + "ugf": 188295400.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C15_gf180_sW0.5_sL1.5", + "circuit_id": "C15", + "pdk": "gf180", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "single", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.84, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "e5c92a4c6f49b5ae", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "gain_lf=7.201 below floor 8" + ], + "spec": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 42490000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 7.201418, + "f3db": 70820190.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 1.753914, + "vin0": 1.753914, + "idd": 6.948485e-05, + "gain_lf": 7.201418, + "f3db": 70820190.0, + "ugf": 146479100.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C15_gf180_sW0.5_sL2", + "circuit_id": "C15", + "pdk": "gf180", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "single", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.12, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "0e75830eef7fa606", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "gain_lf=5.973 below floor 8" + ], + "spec": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 42110000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 5.973049, + "f3db": 70183790.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 1.868614, + "vin0": 1.868614, + "idd": 6.432993e-05, + "gain_lf": 5.973049, + "f3db": 70183790.0, + "ugf": 121057600.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C15_gf180_sW1.5_sL1", + "circuit_id": "C15", + "pdk": "gf180", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "single", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.56, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "86a486d0e4f5032f", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 12.52 + }, + "f3db": { + "min": 43980000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 15.51781, + "f3db": 73303320.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 1.211577, + "vin0": 1.211577, + "idd": 9.385875e-05, + "gain_lf": 15.51781, + "f3db": 73303320.0, + "ugf": 433003800.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C15_gf180_sW1.5_sL1.5", + "circuit_id": "C15", + "pdk": "gf180", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "single", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.84, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "4c8495fad8681d30", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 10.89 + }, + "f3db": { + "min": 42350000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 13.8931, + "f3db": 70579120.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 1.328069, + "vin0": 1.328069, + "idd": 8.862334e-05, + "gain_lf": 13.8931, + "f3db": 70579120.0, + "ugf": 343586600.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C15_gf180_sW1.5_sL2", + "circuit_id": "C15", + "pdk": "gf180", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "single", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.12, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "01ed2036739dac11", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 9.672 + }, + "f3db": { + "min": 41740000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 12.67212, + "f3db": 69571380.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 1.418151, + "vin0": 1.418151, + "idd": 8.457483e-05, + "gain_lf": 12.67212, + "f3db": 69571380.0, + "ugf": 292319300.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C15_gf180_sW1_sL1", + "circuit_id": "C15", + "pdk": "gf180", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "single", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "741d811afb36a449", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 10.18 + }, + "f3db": { + "min": 43920000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 13.1781, + "f3db": 73207020.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 1.333873, + "vin0": 1.333873, + "idd": 8.83625e-05, + "gain_lf": 13.1781, + "f3db": 73207020.0, + "ugf": 326850000.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C15_gf180_sW1_sL1.5", + "circuit_id": "C15", + "pdk": "gf180", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "single", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "ce02ba3fd6fac776", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 8.539 + }, + "f3db": { + "min": 42510000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 11.53859, + "f3db": 70852030.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 1.466917, + "vin0": 1.466917, + "idd": 8.238316e-05, + "gain_lf": 11.53859, + "f3db": 70852030.0, + "ugf": 258862800.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C15_gf180_sW1_sL2", + "circuit_id": "C15", + "pdk": "gf180", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "single", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "1cd57dfdb1973c1c", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 41990000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 10.31506, + "f3db": 69977800.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 1.567756, + "vin0": 1.567756, + "idd": 7.785124e-05, + "gain_lf": 10.31506, + "f3db": 69977800.0, + "ugf": 219291100.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C15_gf180_sW2_sL1", + "circuit_id": "C15", + "pdk": "gf180", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "single", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "dfff483edf5d728d", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 14.1 + }, + "f3db": { + "min": 43890000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 17.09957, + "f3db": 73149630.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 1.137371, + "vin0": 1.137371, + "idd": 9.719374e-05, + "gain_lf": 17.09957, + "f3db": 73149630.0, + "ugf": 520860300.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C15_gf180_sW2_sL1.5", + "circuit_id": "C15", + "pdk": "gf180", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "single", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "49b7a00077cfbee6", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 12.49 + }, + "f3db": { + "min": 42100000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 15.491, + "f3db": 70173410.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 1.242207, + "vin0": 1.242207, + "idd": 9.248218e-05, + "gain_lf": 15.491, + "f3db": 70173410.0, + "ugf": 413486600.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C15_gf180_sW2_sL2", + "circuit_id": "C15", + "pdk": "gf180", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "single", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "13fc8e728fc9fd01", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 11.27 + }, + "f3db": { + "min": 41450000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 14.27284, + "f3db": 69077760.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 1.32431, + "vin0": 1.32431, + "idd": 8.879226e-05, + "gain_lf": 14.27284, + "f3db": 69077760.0, + "ugf": 351920900.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C15_ihp130_sW0.5_sL1", + "circuit_id": "C15", + "pdk": "ihp130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "single", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.26, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "9b70078aee21bb36", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 89420000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 9.307059, + "f3db": 149028300.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.6462885, + "vin0": 0.6462885, + "idd": 4.614805e-05, + "gain_lf": 9.307059, + "f3db": 149028300.0, + "ugf": 410210500.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C15_ihp130_sW0.5_sL1.5", + "circuit_id": "C15", + "pdk": "ihp130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "single", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.39, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "87a6b19045a6cb8c", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 86530000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 8.319831, + "f3db": 144216600.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.6544276, + "vin0": 0.6544276, + "idd": 4.546971e-05, + "gain_lf": 8.319831, + "f3db": 144216600.0, + "ugf": 348140800.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C15_ihp130_sW0.5_sL2", + "circuit_id": "C15", + "pdk": "ihp130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "single", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.52, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "3772d1331b2bfd17", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "gain_lf=7.377 below floor 8" + ], + "spec": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 84590000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 7.377442, + "f3db": 140980200.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.6726415, + "vin0": 0.6726415, + "idd": 4.395171e-05, + "gain_lf": 7.377442, + "f3db": 140980200.0, + "ugf": 299023600.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C15_ihp130_sW1.5_sL1", + "circuit_id": "C15", + "pdk": "ihp130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "single", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.26, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "d3209990dbb25d8e", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 10.44 + }, + "f3db": { + "min": 97350000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 13.4412, + "f3db": 162241800.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.5311651, + "vin0": 0.5311651, + "idd": 5.57428e-05, + "gain_lf": 13.4412, + "f3db": 162241800.0, + "ugf": 748211300.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C15_ihp130_sW1.5_sL1.5", + "circuit_id": "C15", + "pdk": "ihp130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "single", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.39, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "0076cec2241a3686", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 9.877 + }, + "f3db": { + "min": 92970000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 12.877, + "f3db": 154945300.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.5264768, + "vin0": 0.5264768, + "idd": 5.613354e-05, + "gain_lf": 12.877, + "f3db": 154945300.0, + "ugf": 667673000.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C15_ihp130_sW1.5_sL2", + "circuit_id": "C15", + "pdk": "ihp130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "single", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.52, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "dfe46ecfb09fcaff", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 9.247 + }, + "f3db": { + "min": 89910000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 12.24704, + "f3db": 149846600.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.5348215, + "vin0": 0.5348215, + "idd": 5.543807e-05, + "gain_lf": 12.24704, + "f3db": 149846600.0, + "ugf": 598223700.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C15_ihp130_sW1_sL1", + "circuit_id": "C15", + "pdk": "ihp130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "single", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.26, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "d7ff3e1b04562e8f", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 9.071 + }, + "f3db": { + "min": 94170000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 12.07051, + "f3db": 156951600.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.5697971, + "vin0": 0.5697971, + "idd": 5.252309e-05, + "gain_lf": 12.07051, + "f3db": 156951600.0, + "ugf": 612331300.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C15_ihp130_sW1_sL1.5", + "circuit_id": "C15", + "pdk": "ihp130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "single", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "a5d13a517b6c773d", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 8.351 + }, + "f3db": { + "min": 90400000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 11.35112, + "f3db": 150666800.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.5694624, + "vin0": 0.5694624, + "idd": 5.255099e-05, + "gain_lf": 11.35112, + "f3db": 150666800.0, + "ugf": 538054100.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C15_ihp130_sW1_sL2", + "circuit_id": "C15", + "pdk": "ihp130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "single", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "a0cabdab59942aae", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 87800000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 10.60652, + "f3db": 146326000.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.5813189, + "vin0": 0.5813189, + "idd": 5.156283e-05, + "gain_lf": 10.60652, + "f3db": 146326000.0, + "ugf": 476155200.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C15_ihp130_sW2_sL1", + "circuit_id": "C15", + "pdk": "ihp130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "single", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "dcad40c2373a6514", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 11.31 + }, + "f3db": { + "min": 99720000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 14.31278, + "f3db": 166198500.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.5062686, + "vin0": 0.5062686, + "idd": 5.781776e-05, + "gain_lf": 14.31278, + "f3db": 166198500.0, + "ugf": 851250200.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C15_ihp130_sW2_sL1.5", + "circuit_id": "C15", + "pdk": "ihp130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "single", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "f7049c9dd7d69d1a", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 10.86 + }, + "f3db": { + "min": 94880000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 13.85799, + "f3db": 158126100.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.4988202, + "vin0": 0.4988202, + "idd": 5.843853e-05, + "gain_lf": 13.85799, + "f3db": 158126100.0, + "ugf": 767281300.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C15_ihp130_sW2_sL2", + "circuit_id": "C15", + "pdk": "ihp130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "single", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "649588b2052271a8", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 10.31 + }, + "f3db": { + "min": 91460000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 13.30866, + "f3db": 152436800.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.5048617, + "vin0": 0.5048617, + "idd": 5.793501e-05, + "gain_lf": 13.30866, + "f3db": 152436800.0, + "ugf": 692654800.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C15_sky130_sW0.5_sL1", + "circuit_id": "C15", + "pdk": "sky130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "single", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.3, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "505bd95e8dcbbaed", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 9.121 + }, + "f3db": { + "min": 51370000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 12.12053, + "f3db": 85623300.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.9785074, + "vin0": 0.9785074, + "idd": 4.101788e-05, + "gain_lf": 12.12053, + "f3db": 85623300.0, + "ugf": 336160500.0 + }, + "presim_s": 8.9 + }, + { + "case_id": "C15_sky130_sW0.5_sL1.5", + "circuit_id": "C15", + "pdk": "sky130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "single", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.45, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "8998307b59f6d76d", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 49960000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 10.19672, + "f3db": 83271890.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 1.025537, + "vin0": 1.025537, + "idd": 3.865494e-05, + "gain_lf": 10.19672, + "f3db": 83271890.0, + "ugf": 257005100.0 + }, + "presim_s": 9.5 + }, + { + "case_id": "C15_sky130_sW0.5_sL2", + "circuit_id": "C15", + "pdk": "sky130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "single", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.6, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "afaff861fdfe443d", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 49210000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 8.726616, + "f3db": 82015780.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 1.069306, + "vin0": 1.069306, + "idd": 3.645686e-05, + "gain_lf": 8.726616, + "f3db": 82015780.0, + "ugf": 209186400.0 + }, + "presim_s": 10.2 + }, + { + "case_id": "C15_sky130_sW1.5_sL1", + "circuit_id": "C15", + "pdk": "sky130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "single", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.3, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "4b2112236cbf51db", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 14.39 + }, + "f3db": { + "min": 53550000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 17.39146, + "f3db": 89253290.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.8448226, + "vin0": 0.8448226, + "idd": 4.77399e-05, + "gain_lf": 17.39146, + "f3db": 89253290.0, + "ugf": 657617900.0 + }, + "presim_s": 9.4 + }, + { + "case_id": "C15_sky130_sW1.5_sL1.5", + "circuit_id": "C15", + "pdk": "sky130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "single", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.45, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "21d648e4ab31c007", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 12.95 + }, + "f3db": { + "min": 51250000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 15.95233, + "f3db": 85413490.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.8689475, + "vin0": 0.8689475, + "idd": 4.652634e-05, + "gain_lf": 15.95233, + "f3db": 85413490.0, + "ugf": 531470000.0 + }, + "presim_s": 6.0 + }, + { + "case_id": "C15_sky130_sW1.5_sL2", + "circuit_id": "C15", + "pdk": "sky130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "single", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.6, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "d276f4855c7c1e77", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 11.75 + }, + "f3db": { + "min": 49980000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 14.74626, + "f3db": 83303350.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.8960326, + "vin0": 0.8960326, + "idd": 4.516411e-05, + "gain_lf": 14.74626, + "f3db": 83303350.0, + "ugf": 448768800.0 + }, + "presim_s": 8.7 + }, + { + "case_id": "C15_sky130_sW1_sL1", + "circuit_id": "C15", + "pdk": "sky130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "single", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "0f19065f287c7cfb", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 12.61 + }, + "f3db": { + "min": 52730000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 15.61151, + "f3db": 87882490.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.8878716, + "vin0": 0.8878716, + "idd": 4.557453e-05, + "gain_lf": 15.61151, + "f3db": 87882490.0, + "ugf": 525014400.0 + }, + "presim_s": 7.8 + }, + { + "case_id": "C15_sky130_sW1_sL1.5", + "circuit_id": "C15", + "pdk": "sky130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "single", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "369d8c947d175331", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 10.94 + }, + "f3db": { + "min": 50790000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 13.94361, + "f3db": 84652550.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.9196854, + "vin0": 0.9196854, + "idd": 4.397473e-05, + "gain_lf": 13.94361, + "f3db": 84652550.0, + "ugf": 414579500.0 + }, + "presim_s": 8.4 + }, + { + "case_id": "C15_sky130_sW1_sL2", + "circuit_id": "C15", + "pdk": "sky130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "single", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "264ef86abdf63fdf", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 9.617 + }, + "f3db": { + "min": 49750000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 12.6172, + "f3db": 82912590.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.9527432, + "vin0": 0.9527432, + "idd": 4.23128e-05, + "gain_lf": 12.6172, + "f3db": 82912590.0, + "ugf": 345835500.0 + }, + "presim_s": 10.3 + }, + { + "case_id": "C15_sky130_sW2_sL1", + "circuit_id": "C15", + "pdk": "sky130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "single", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "6211f14f6e3e3a9d", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 15.52 + }, + "f3db": { + "min": 54130000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 18.52396, + "f3db": 90209280.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.8179266, + "vin0": 0.8179266, + "idd": 4.909307e-05, + "gain_lf": 18.52396, + "f3db": 90209280.0, + "ugf": 759025500.0 + }, + "presim_s": 9.4 + }, + { + "case_id": "C15_sky130_sW2_sL1.5", + "circuit_id": "C15", + "pdk": "sky130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "single", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "666425d59334542a", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 14.28 + }, + "f3db": { + "min": 51540000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 17.27803, + "f3db": 85900090.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.8373893, + "vin0": 0.8373893, + "idd": 4.811385e-05, + "gain_lf": 17.27803, + "f3db": 85900090.0, + "ugf": 624330000.0 + }, + "presim_s": 9.1 + }, + { + "case_id": "C15_sky130_sW2_sL2", + "circuit_id": "C15", + "pdk": "sky130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "single", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "3a8e9c122c45c82e", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 13.18 + }, + "f3db": { + "min": 50090000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 16.1788, + "f3db": 83489130.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.8606514, + "vin0": 0.8606514, + "idd": 4.694364e-05, + "gain_lf": 16.1788, + "f3db": 83489130.0, + "ugf": 534006600.0 + }, + "presim_s": 6.1 + }, + { + "case_id": "C16_gf180_sW0.5_sL1", + "circuit_id": "C16", + "pdk": "gf180", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "diff_r", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "104c0497b6755bd9", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 41640000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 8.6615, + "f3db": 69405180.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 2.854677, + "vo2": 2.854677, + "idd": 4.002774e-05, + "vos_in": 3.637979e-12, + "gain_lf": 8.6615, + "f3db": 69405180.0, + "ugf": 175383000.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C16_gf180_sW0.5_sL1.5", + "circuit_id": "C16", + "pdk": "gf180", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "diff_r", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "137e08d7f3f3e764", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "gain_lf=6.852 below floor 8" + ], + "spec": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 41370000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 6.852083, + "f3db": 68950960.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 2.854718, + "vo2": 2.854718, + "idd": 4.00241e-05, + "vos_in": 0.0, + "gain_lf": 6.852083, + "f3db": 68950960.0, + "ugf": 135645000.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C16_gf180_sW0.5_sL2", + "circuit_id": "C16", + "pdk": "gf180", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "diff_r", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "c89d1ef4a42f7ea3", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "gain_lf=5.577 below floor 8" + ], + "spec": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 41280000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 5.577394, + "f3db": 68802710.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 2.854768, + "vo2": 2.854768, + "idd": 4.001955e-05, + "vos_in": 0.0, + "gain_lf": 5.577394, + "f3db": 68802710.0, + "ugf": 111493500.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C16_gf180_sW1.5_sL1", + "circuit_id": "C16", + "pdk": "gf180", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "diff_r", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "c334fe9064288036", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 10.08 + }, + "f3db": { + "min": 40410000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 13.0785, + "f3db": 67348800.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 2.85468, + "vo2": 2.85468, + "idd": 4.002751e-05, + "vos_in": 3.637979e-12, + "gain_lf": 13.0785, + "f3db": 67348800.0, + "ugf": 297298700.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C16_gf180_sW1.5_sL1.5", + "circuit_id": "C16", + "pdk": "gf180", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "diff_r", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "9d9530d415cc31cd", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 8.579 + }, + "f3db": { + "min": 40030000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 11.57911, + "f3db": 66720130.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 2.854718, + "vo2": 2.854718, + "idd": 4.002409e-05, + "vos_in": 0.0, + "gain_lf": 11.57911, + "f3db": 66720130.0, + "ugf": 245177300.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C16_gf180_sW1.5_sL2", + "circuit_id": "C16", + "pdk": "gf180", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "diff_r", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "ada439db6e83a40c", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 39920000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 10.44895, + "f3db": 66538770.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 2.854767, + "vo2": 2.854767, + "idd": 4.001965e-05, + "vos_in": 0.0, + "gain_lf": 10.44895, + "f3db": 66538770.0, + "ugf": 212527800.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C16_gf180_sW1_sL1", + "circuit_id": "C16", + "pdk": "gf180", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "diff_r", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "8094ec594a0bafc3", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 8.616 + }, + "f3db": { + "min": 41040000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 11.61561, + "f3db": 68401630.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 2.854679, + "vo2": 2.854679, + "idd": 4.002764e-05, + "vos_in": 0.0, + "gain_lf": 11.61561, + "f3db": 68401630.0, + "ugf": 252093600.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C16_gf180_sW1_sL1.5", + "circuit_id": "C16", + "pdk": "gf180", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "diff_r", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "44b139f1258451ea", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 40700000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 9.95608, + "f3db": 67834790.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 2.854718, + "vo2": 2.854718, + "idd": 4.002409e-05, + "vos_in": 0.0, + "gain_lf": 9.95608, + "f3db": 67834790.0, + "ugf": 203091000.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C16_gf180_sW1_sL2", + "circuit_id": "C16", + "pdk": "gf180", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "diff_r", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "7e34aaf32d0ab872", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 40600000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 8.731853, + "f3db": 67663690.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 2.854768, + "vo2": 2.854768, + "idd": 4.00196e-05, + "vos_in": 0.0, + "gain_lf": 8.731853, + "f3db": 67663690.0, + "ugf": 172786600.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C16_gf180_sW2_sL1", + "circuit_id": "C16", + "pdk": "gf180", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "diff_r", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "654ff4b73c733749", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 11.03 + }, + "f3db": { + "min": 39780000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 14.02758, + "f3db": 66299530.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 2.854682, + "vo2": 2.854682, + "idd": 4.002735e-05, + "vos_in": 0.0, + "gain_lf": 14.02758, + "f3db": 66299530.0, + "ugf": 328146900.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C16_gf180_sW2_sL1.5", + "circuit_id": "C16", + "pdk": "gf180", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "diff_r", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "04b1a6054b58e13a", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 9.644 + }, + "f3db": { + "min": 39380000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 12.64394, + "f3db": 65626640.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 2.854719, + "vo2": 2.854719, + "idd": 4.002405e-05, + "vos_in": 0.0, + "gain_lf": 12.64394, + "f3db": 65626640.0, + "ugf": 275012200.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C16_gf180_sW2_sL2", + "circuit_id": "C16", + "pdk": "gf180", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "diff_r", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "9d03c44b3a59d72c", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 8.559 + }, + "f3db": { + "min": 39260000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 11.55868, + "f3db": 65435360.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 2.854767, + "vo2": 2.854767, + "idd": 4.001967e-05, + "vos_in": 0.0, + "gain_lf": 11.55868, + "f3db": 65435360.0, + "ugf": 240426500.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C16_ihp130_sW0.5_sL1", + "circuit_id": "C16", + "pdk": "ihp130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "diff_r", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.26, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.26, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "7844684450a58e2d", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 83120000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 8.045954, + "f3db": 138540100.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 0.9600281, + "vo2": 0.9600281, + "idd": 4e-05, + "vos_in": 1.818989e-12, + "gain_lf": 8.045954, + "f3db": 138540100.0, + "ugf": 322254800.0 + }, + "presim_s": 0.2 + }, + { + "case_id": "C16_ihp130_sW0.5_sL1.5", + "circuit_id": "C16", + "pdk": "ihp130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "diff_r", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "90f7962027ac3501", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "gain_lf=7.371 below floor 8" + ], + "spec": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 81630000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 7.370634, + "f3db": 136047200.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 0.9600282, + "vo2": 0.9600282, + "idd": 4e-05, + "vos_in": 0.0, + "gain_lf": 7.370634, + "f3db": 136047200.0, + "ugf": 288199800.0 + }, + "presim_s": 0.2 + }, + { + "case_id": "C16_ihp130_sW0.5_sL2", + "circuit_id": "C16", + "pdk": "ihp130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "diff_r", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "e3a20daa1d9d7424", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "gain_lf=6.721 below floor 8" + ], + "spec": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 80630000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 6.720895, + "f3db": 134386300.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 0.9600282, + "vo2": 0.9600282, + "idd": 4e-05, + "vos_in": 0.0, + "gain_lf": 6.720895, + "f3db": 134386300.0, + "ugf": 259389900.0 + }, + "presim_s": 0.2 + }, + { + "case_id": "C16_ihp130_sW1.5_sL1", + "circuit_id": "C16", + "pdk": "ihp130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "diff_r", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.26, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.26, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "b39896e42b07eb87", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 83990000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 10.80834, + "f3db": 139975700.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 0.9600281, + "vo2": 0.9600281, + "idd": 4e-05, + "vos_in": 0.0, + "gain_lf": 10.80834, + "f3db": 139975700.0, + "ugf": 467342700.0 + }, + "presim_s": 0.3 + }, + { + "case_id": "C16_ihp130_sW1.5_sL1.5", + "circuit_id": "C16", + "pdk": "ihp130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "diff_r", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.39, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.39, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "7ebed7572ae83e36", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 82100000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 10.36718, + "f3db": 136826000.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 0.9600282, + "vo2": 0.9600282, + "idd": 4e-05, + "vos_in": -1.81899e-12, + "gain_lf": 10.36718, + "f3db": 136826000.0, + "ugf": 432273800.0 + }, + "presim_s": 0.4 + }, + { + "case_id": "C16_ihp130_sW1.5_sL2", + "circuit_id": "C16", + "pdk": "ihp130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "diff_r", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.52, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.52, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "bacc38bc5d80bef5", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 80760000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 9.904036, + "f3db": 134605800.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 0.9600282, + "vo2": 0.9600282, + "idd": 4e-05, + "vos_in": 0.0, + "gain_lf": 9.904036, + "f3db": 134605800.0, + "ugf": 400906900.0 + }, + "presim_s": 0.3 + }, + { + "case_id": "C16_ihp130_sW1_sL1", + "circuit_id": "C16", + "pdk": "ihp130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "diff_r", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "c560286cd4977237", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 83980000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 9.827807, + "f3db": 139975000.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 0.9600281, + "vo2": 0.9600281, + "idd": 4e-05, + "vos_in": 0.0, + "gain_lf": 9.827807, + "f3db": 139975000.0, + "ugf": 412374600.0 + }, + "presim_s": 0.2 + }, + { + "case_id": "C16_ihp130_sW1_sL1.5", + "circuit_id": "C16", + "pdk": "ihp130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "diff_r", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "ab187a703b51798d", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 82190000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 9.322068, + "f3db": 136986900.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 0.9600282, + "vo2": 0.9600282, + "idd": 4e-05, + "vos_in": 0.0, + "gain_lf": 9.322068, + "f3db": 136986900.0, + "ugf": 378180200.0 + }, + "presim_s": 0.2 + }, + { + "case_id": "C16_ihp130_sW1_sL2", + "circuit_id": "C16", + "pdk": "ihp130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "diff_r", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "f4f951893cec6bc8", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 80960000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 8.79747, + "f3db": 134939200.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 0.9600282, + "vo2": 0.9600282, + "idd": 4e-05, + "vos_in": 0.0, + "gain_lf": 8.79747, + "f3db": 134939200.0, + "ugf": 347657700.0 + }, + "presim_s": 0.2 + }, + { + "case_id": "C16_ihp130_sW2_sL1", + "circuit_id": "C16", + "pdk": "ihp130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "diff_r", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.26, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.26, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "49f4a9c44985bba4", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 8.48 + }, + "f3db": { + "min": 83560000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 11.47984, + "f3db": 139272800.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 0.9600281, + "vo2": 0.9600281, + "idd": 4e-05, + "vos_in": 0.0, + "gain_lf": 11.47984, + "f3db": 139272800.0, + "ugf": 505411700.0 + }, + "presim_s": 0.4 + }, + { + "case_id": "C16_ihp130_sW2_sL1.5", + "circuit_id": "C16", + "pdk": "ihp130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "diff_r", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "397ffbf15ed43bea", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 8.072 + }, + "f3db": { + "min": 81670000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 11.0718, + "f3db": 136109000.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 0.9600282, + "vo2": 0.9600282, + "idd": 4e-05, + "vos_in": 0.0, + "gain_lf": 11.0718, + "f3db": 136109000.0, + "ugf": 470402500.0 + }, + "presim_s": 0.4 + }, + { + "case_id": "C16_ihp130_sW2_sL2", + "circuit_id": "C16", + "pdk": "ihp130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "diff_r", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "611a16c2cf270253", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 80290000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 10.6453, + "f3db": 133821800.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 0.9600282, + "vo2": 0.9600282, + "idd": 3.999999e-05, + "vos_in": -3.63798e-12, + "gain_lf": 10.6453, + "f3db": 133821800.0, + "ugf": 438722600.0 + }, + "presim_s": 0.4 + }, + { + "case_id": "C16_sky130_sW0.5_sL1", + "circuit_id": "C16", + "pdk": "sky130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "diff_r", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "23ba434e91ba9cc6", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 9.459 + }, + "f3db": { + "min": 49390000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 12.45872, + "f3db": 82314190.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 1.397826, + "vo2": 1.397826, + "idd": 4.000047e-05, + "vos_in": 0.0, + "gain_lf": 12.45872, + "f3db": 82314190.0, + "ugf": 336834500.0 + }, + "presim_s": 7.0 + }, + { + "case_id": "C16_sky130_sW0.5_sL1.5", + "circuit_id": "C16", + "pdk": "sky130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "diff_r", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "df610f73af6cd6e4", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 8.188 + }, + "f3db": { + "min": 48280000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 11.1881, + "f3db": 80474360.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 1.39783, + "vo2": 1.39783, + "idd": 4.000012e-05, + "vos_in": 0.0, + "gain_lf": 11.1881, + "f3db": 80474360.0, + "ugf": 281208300.0 + }, + "presim_s": 8.8 + }, + { + "case_id": "C16_sky130_sW0.5_sL2", + "circuit_id": "C16", + "pdk": "sky130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "diff_r", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "f98f1ab65c511c92", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 47650000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 10.11452, + "f3db": 79422910.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 1.39783, + "vo2": 1.39783, + "idd": 4.00001e-05, + "vos_in": -1.81899e-12, + "gain_lf": 10.11452, + "f3db": 79422910.0, + "ugf": 242691900.0 + }, + "presim_s": 10.2 + }, + { + "case_id": "C16_sky130_sW1.5_sL1", + "circuit_id": "C16", + "pdk": "sky130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "diff_r", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.3, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.3, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "10a907dd00787c1a", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 12.26 + }, + "f3db": { + "min": 49780000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 15.25772, + "f3db": 82972260.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 1.397827, + "vo2": 1.397827, + "idd": 4.000039e-05, + "vos_in": 0.0, + "gain_lf": 15.25772, + "f3db": 82972260.0, + "ugf": 475653900.0 + }, + "presim_s": 9.7 + }, + { + "case_id": "C16_sky130_sW1.5_sL1.5", + "circuit_id": "C16", + "pdk": "sky130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "diff_r", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.45, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.45, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "7a72245721f90e8b", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 11.76 + }, + "f3db": { + "min": 48220000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 14.76196, + "f3db": 80371300.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 1.39783, + "vo2": 1.39783, + "idd": 4.000012e-05, + "vos_in": -3.63798e-12, + "gain_lf": 14.76196, + "f3db": 80371300.0, + "ugf": 434498500.0 + }, + "presim_s": 7.6 + }, + { + "case_id": "C16_sky130_sW1.5_sL2", + "circuit_id": "C16", + "pdk": "sky130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "diff_r", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.6, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.6, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "f571453fdd7e17ca", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 11.14 + }, + "f3db": { + "min": 47300000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 14.1392, + "f3db": 78827960.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 1.39783, + "vo2": 1.39783, + "idd": 4.000011e-05, + "vos_in": 0.0, + "gain_lf": 14.1392, + "f3db": 78827960.0, + "ugf": 395668900.0 + }, + "presim_s": 6.2 + }, + { + "case_id": "C16_sky130_sW1_sL1", + "circuit_id": "C16", + "pdk": "sky130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "diff_r", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "4832805b1b446506", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 11.4 + }, + "f3db": { + "min": 49720000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 14.39639, + "f3db": 82864900.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 1.397827, + "vo2": 1.397827, + "idd": 4.000041e-05, + "vos_in": 0.0, + "gain_lf": 14.39639, + "f3db": 82864900.0, + "ugf": 428504800.0 + }, + "presim_s": 9.9 + }, + { + "case_id": "C16_sky130_sW1_sL1.5", + "circuit_id": "C16", + "pdk": "sky130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "diff_r", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "80bd48e9e064726a", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 10.62 + }, + "f3db": { + "min": 48330000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 13.62179, + "f3db": 80548140.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 1.39783, + "vo2": 1.39783, + "idd": 4.000012e-05, + "vos_in": 0.0, + "gain_lf": 13.62179, + "f3db": 80548140.0, + "ugf": 379720000.0 + }, + "presim_s": 6.6 + }, + { + "case_id": "C16_sky130_sW1_sL2", + "circuit_id": "C16", + "pdk": "sky130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "diff_r", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "1062603d06092a5e", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 9.83 + }, + "f3db": { + "min": 47510000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 12.82955, + "f3db": 79176130.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 1.39783, + "vo2": 1.39783, + "idd": 4.00001e-05, + "vos_in": 0.0, + "gain_lf": 12.82955, + "f3db": 79176130.0, + "ugf": 339298000.0 + }, + "presim_s": 6.2 + }, + { + "case_id": "C16_sky130_sW2_sL1", + "circuit_id": "C16", + "pdk": "sky130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "diff_r", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "31f28fd76db9084e", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 12.74 + }, + "f3db": { + "min": 49720000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 15.74038, + "f3db": 82863360.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 1.397827, + "vo2": 1.397827, + "idd": 4.000038e-05, + "vos_in": 0.0, + "gain_lf": 15.74038, + "f3db": 82863360.0, + "ugf": 502553600.0 + }, + "presim_s": 9.6 + }, + { + "case_id": "C16_sky130_sW2_sL1.5", + "circuit_id": "C16", + "pdk": "sky130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "diff_r", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "9a274eb3b2a75082", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 12.45 + }, + "f3db": { + "min": 48050000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 15.45251, + "f3db": 80085140.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 1.39783, + "vo2": 1.39783, + "idd": 4.000013e-05, + "vos_in": 1.818989e-12, + "gain_lf": 15.45251, + "f3db": 80085140.0, + "ugf": 470667400.0 + }, + "presim_s": 10.5 + }, + { + "case_id": "C16_sky130_sW2_sL2", + "circuit_id": "C16", + "pdk": "sky130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "diff_r", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "38e046d7bad937af", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 11.94 + }, + "f3db": { + "min": 47060000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 14.94208, + "f3db": 78435440.0 + }, + "floors": { + "gain_lf": { + "min": 8.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 1.39783, + "vo2": 1.39783, + "idd": 4.000012e-05, + "vos_in": 0.0, + "gain_lf": 14.94208, + "f3db": 78435440.0, + "ugf": 434414100.0 + }, + "presim_s": 6.9 + }, + { + "case_id": "C17_gf180_sW0.5_sL1", + "circuit_id": "C17", + "pdk": "gf180", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "diff_r", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "76efb510b767858e", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 41490000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 6.147384, + "f3db": 69151350.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 2.872855, + "vo2": 2.872855, + "idd": 3.839382e-05, + "vos_in": 0.0, + "gain_lf": 6.147384, + "f3db": 69151350.0, + "ugf": 122486300.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C17_gf180_sW0.5_sL1.5", + "circuit_id": "C17", + "pdk": "gf180", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "diff_r", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "e308b00f7ced0681", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "gain_lf=4.396 below floor 6" + ], + "spec": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 41290000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 4.395898, + "f3db": 68814990.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 2.913756, + "vo2": 2.913756, + "idd": 3.471751e-05, + "vos_in": 0.0, + "gain_lf": 4.395898, + "f3db": 68814990.0, + "ugf": 91327520.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C17_gf180_sW0.5_sL2", + "circuit_id": "C17", + "pdk": "gf180", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "diff_r", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "d3626f227a8198d5", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "gain_lf=3.003 below floor 6" + ], + "spec": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 41220000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 3.003399, + "f3db": 68701510.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 2.95199, + "vo2": 2.95199, + "idd": 3.128084e-05, + "vos_in": 0.0, + "gain_lf": 3.003399, + "f3db": 68701510.0, + "ugf": 68755470.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C17_gf180_sW1.5_sL1", + "circuit_id": "C17", + "pdk": "gf180", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "diff_r", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "adaaa61db8464556", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 6.678 + }, + "f3db": { + "min": 40140000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 9.677684, + "f3db": 66891800.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 2.820001, + "vo2": 2.820001, + "idd": 4.314466e-05, + "vos_in": -3.63798e-12, + "gain_lf": 9.677684, + "f3db": 66891800.0, + "ugf": 193229800.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C17_gf180_sW1.5_sL1.5", + "circuit_id": "C17", + "pdk": "gf180", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "diff_r", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "c0e8d314e7790c49", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 39890000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 8.305866, + "f3db": 66484790.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 2.86526, + "vo2": 2.86526, + "idd": 3.907651e-05, + "vos_in": 0.0, + "gain_lf": 8.305866, + "f3db": 66484790.0, + "ugf": 160204800.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C17_gf180_sW1.5_sL2", + "circuit_id": "C17", + "pdk": "gf180", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "diff_r", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "60948ff25ac440c0", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 39820000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 7.315751, + "f3db": 66371130.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 2.886042, + "vo2": 2.886042, + "idd": 3.720852e-05, + "vos_in": 0.0, + "gain_lf": 7.315751, + "f3db": 66371130.0, + "ugf": 139533800.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C17_gf180_sW1_sL1", + "circuit_id": "C17", + "pdk": "gf180", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "diff_r", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "5983103958081783", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 40820000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 8.524808, + "f3db": 68028250.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 2.840199, + "vo2": 2.840199, + "idd": 4.132911e-05, + "vos_in": 0.0, + "gain_lf": 8.524808, + "f3db": 68028250.0, + "ugf": 168910800.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C17_gf180_sW1_sL1.5", + "circuit_id": "C17", + "pdk": "gf180", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "diff_r", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "5db991fefb6215a9", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 40590000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 7.062054, + "f3db": 67646170.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 2.875718, + "vo2": 2.875718, + "idd": 3.813652e-05, + "vos_in": 0.0, + "gain_lf": 7.062054, + "f3db": 67646170.0, + "ugf": 137161400.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C17_gf180_sW1_sL2", + "circuit_id": "C17", + "pdk": "gf180", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "diff_r", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "caff61a89c3c6ac3", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "gain_lf=5.996 below floor 6" + ], + "spec": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 40520000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 5.996186, + "f3db": 67532410.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 2.893826, + "vo2": 2.893826, + "idd": 3.650884e-05, + "vos_in": 0.0, + "gain_lf": 5.996186, + "f3db": 67532410.0, + "ugf": 116934400.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C17_gf180_sW2_sL1", + "circuit_id": "C17", + "pdk": "gf180", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "diff_r", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "f8fde3b54068678a", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 7.405 + }, + "f3db": { + "min": 39460000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 10.40503, + "f3db": 65772220.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 2.803843, + "vo2": 2.803843, + "idd": 4.459697e-05, + "vos_in": 3.637979e-12, + "gain_lf": 10.40503, + "f3db": 65772220.0, + "ugf": 208572000.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C17_gf180_sW2_sL1.5", + "circuit_id": "C17", + "pdk": "gf180", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "diff_r", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "c5f4f94b1511cbb6", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 6.099 + }, + "f3db": { + "min": 39210000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 9.099341, + "f3db": 65352150.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 2.856445, + "vo2": 2.856445, + "idd": 3.98689e-05, + "vos_in": 0.0, + "gain_lf": 9.099341, + "f3db": 65352150.0, + "ugf": 175080000.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C17_gf180_sW2_sL2", + "circuit_id": "C17", + "pdk": "gf180", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "diff_r", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "ff66d5a891505aaa", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 39140000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 8.156878, + "f3db": 65239890.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 2.880635, + "vo2": 2.880635, + "idd": 3.769457e-05, + "vos_in": -3.63798e-12, + "gain_lf": 8.156878, + "f3db": 65239890.0, + "ugf": 154226200.0 + }, + "presim_s": 0.1 + }, + { + "case_id": "C17_ihp130_sW0.5_sL1", + "circuit_id": "C17", + "pdk": "ihp130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "diff_r", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.26, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.26, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.26, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "f346c32c94f6ee07", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 64600000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 6.071398, + "f3db": 107658700.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 1.006454, + "vo2": 1.006454, + "idd": 2.580981e-05, + "vos_in": 0.0, + "gain_lf": 6.071398, + "f3db": 107658700.0, + "ugf": 188550200.0 + }, + "presim_s": 0.2 + }, + { + "case_id": "C17_ihp130_sW0.5_sL1.5", + "circuit_id": "C17", + "pdk": "ihp130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "diff_r", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "0aba1e99791534e3", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "gain_lf=5.942 below floor 6" + ], + "spec": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 63990000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 5.941521, + "f3db": 106646300.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 0.9889885, + "vo2": 0.9889885, + "idd": 2.813885e-05, + "vos_in": 3.637979e-12, + "gain_lf": 5.941521, + "f3db": 106646300.0, + "ugf": 183056300.0 + }, + "presim_s": 0.2 + }, + { + "case_id": "C17_ihp130_sW0.5_sL2", + "circuit_id": "C17", + "pdk": "ihp130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "diff_r", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "5e9312d16677d32d", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "gain_lf=5.469 below floor 6" + ], + "spec": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 63410000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 5.468711, + "f3db": 105677000.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 0.9872316, + "vo2": 0.9872316, + "idd": 2.837313e-05, + "vos_in": 0.0, + "gain_lf": 5.468711, + "f3db": 105677000.0, + "ugf": 168395000.0 + }, + "presim_s": 0.2 + }, + { + "case_id": "C17_ihp130_sW1.5_sL1", + "circuit_id": "C17", + "pdk": "ihp130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "diff_r", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.26, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.26, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.26, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "1d0375d5f1075dad", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 63040000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 7.456876, + "f3db": 105071600.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 1.043034, + "vo2": 1.043034, + "idd": 2.093175e-05, + "vos_in": -1.81899e-12, + "gain_lf": 7.456876, + "f3db": 105071600.0, + "ugf": 225280100.0 + }, + "presim_s": 0.3 + }, + { + "case_id": "C17_ihp130_sW1.5_sL1.5", + "circuit_id": "C17", + "pdk": "ihp130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "diff_r", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.39, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.39, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.39, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "7d30068458eda978", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 62880000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 7.715947, + "f3db": 104791900.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 1.01808, + "vo2": 1.01808, + "idd": 2.425947e-05, + "vos_in": 0.0, + "gain_lf": 7.715947, + "f3db": 104791900.0, + "ugf": 233216000.0 + }, + "presim_s": 0.3 + }, + { + "case_id": "C17_ihp130_sW1.5_sL2", + "circuit_id": "C17", + "pdk": "ihp130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "diff_r", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.52, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.52, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.52, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "c8fb0ecf39c25b8e", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 62500000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 7.652116, + "f3db": 104159200.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 1.004767, + "vo2": 1.004767, + "idd": 2.603473e-05, + "vos_in": 0.0, + "gain_lf": 7.652116, + "f3db": 104159200.0, + "ugf": 229824300.0 + }, + "presim_s": 0.3 + }, + { + "case_id": "C17_ihp130_sW1_sL1", + "circuit_id": "C17", + "pdk": "ihp130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "diff_r", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "674e7201b22c0d84", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 64200000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 7.213422, + "f3db": 106993800.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 1.02104, + "vo2": 1.02104, + "idd": 2.386467e-05, + "vos_in": 3.637979e-12, + "gain_lf": 7.213422, + "f3db": 106993800.0, + "ugf": 221610800.0 + }, + "presim_s": 0.3 + }, + { + "case_id": "C17_ihp130_sW1_sL1.5", + "circuit_id": "C17", + "pdk": "ihp130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "diff_r", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "cb211546087dec2f", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 63790000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 7.353998, + "f3db": 106311400.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 0.9965709, + "vo2": 0.9965709, + "idd": 2.712772e-05, + "vos_in": 1.818989e-12, + "gain_lf": 7.353998, + "f3db": 106311400.0, + "ugf": 224624700.0 + }, + "presim_s": 0.2 + }, + { + "case_id": "C17_ihp130_sW1_sL2", + "circuit_id": "C17", + "pdk": "ihp130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "diff_r", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "357001ffc886bf12", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 63290000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 7.18929, + "f3db": 105477500.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 0.9847926, + "vo2": 0.9847926, + "idd": 2.869837e-05, + "vos_in": 1.818989e-12, + "gain_lf": 7.18929, + "f3db": 105477500.0, + "ugf": 217910300.0 + }, + "presim_s": 0.2 + }, + { + "case_id": "C17_ihp130_sW2_sL1", + "circuit_id": "C17", + "pdk": "ihp130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "diff_r", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.26, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.26, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.26, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "7cc8f02c0a3a3521", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 61730000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 7.382897, + "f3db": 102887100.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 1.061853, + "vo2": 1.061853, + "idd": 1.842219e-05, + "vos_in": -3.63798e-12, + "gain_lf": 7.382897, + "f3db": 102887100.0, + "ugf": 218482700.0 + }, + "presim_s": 0.4 + }, + { + "case_id": "C17_ihp130_sW2_sL1.5", + "circuit_id": "C17", + "pdk": "ihp130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "diff_r", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "9f7bed10f4ef6849", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 61750000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 7.7766, + "f3db": 102911000.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 1.03766, + "vo2": 1.03766, + "idd": 2.164834e-05, + "vos_in": -1.81899e-12, + "gain_lf": 7.7766, + "f3db": 102911000.0, + "ugf": 231036100.0 + }, + "presim_s": 0.4 + }, + { + "case_id": "C17_ihp130_sW2_sL2", + "circuit_id": "C17", + "pdk": "ihp130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "diff_r", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "1826b0386648d6e3", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 61490000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 7.786772, + "f3db": 102489800.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 1.024025, + "vo2": 1.024025, + "idd": 2.346664e-05, + "vos_in": 0.0, + "gain_lf": 7.786772, + "f3db": 102489800.0, + "ugf": 230572000.0 + }, + "presim_s": 0.4 + }, + { + "case_id": "C17_sky130_sW0.5_sL1", + "circuit_id": "C17", + "pdk": "sky130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "diff_r", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "bdfe90aea4ba36ab", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 47700000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 6.458793, + "f3db": 79500490.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 1.567544, + "vo2": 1.567544, + "idd": 2.307286e-05, + "vos_in": -3.63798e-12, + "gain_lf": 6.458793, + "f3db": 79500490.0, + "ugf": 147605100.0 + }, + "presim_s": 9.0 + }, + { + "case_id": "C17_sky130_sW0.5_sL1.5", + "circuit_id": "C17", + "pdk": "sky130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "diff_r", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "7fdece2029af6a38", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "gain_lf=5.423 below floor 6" + ], + "spec": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 47130000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 5.422736, + "f3db": 78553550.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 1.590567, + "vo2": 1.590567, + "idd": 2.078147e-05, + "vos_in": -3.63798e-12, + "gain_lf": 5.422736, + "f3db": 78553550.0, + "ugf": 124182900.0 + }, + "presim_s": 9.5 + }, + { + "case_id": "C17_sky130_sW0.5_sL2", + "circuit_id": "C17", + "pdk": "sky130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "diff_r", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "ee836db74e1b2dc2", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "gain_lf=4.267 below floor 6" + ], + "spec": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 46770000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 4.267453, + "f3db": 77942910.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 1.616323, + "vo2": 1.616323, + "idd": 1.821962e-05, + "vos_in": 0.0, + "gain_lf": 4.267453, + "f3db": 77942910.0, + "ugf": 101030500.0 + }, + "presim_s": 9.5 + }, + { + "case_id": "C17_sky130_sW1.5_sL1", + "circuit_id": "C17", + "pdk": "sky130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "diff_r", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.3, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.3, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.3, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "8c18d770f04bd12d", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 47510000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 8.631978, + "f3db": 79182690.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 1.524254, + "vo2": 1.524254, + "idd": 2.738469e-05, + "vos_in": 0.0, + "gain_lf": 8.631978, + "f3db": 79182690.0, + "ugf": 199267800.0 + }, + "presim_s": 10.6 + }, + { + "case_id": "C17_sky130_sW1.5_sL1.5", + "circuit_id": "C17", + "pdk": "sky130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "diff_r", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.45, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.45, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.45, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "f1d751cc273d80bf", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 46860000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 8.569138, + "f3db": 78103720.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 1.519202, + "vo2": 1.519202, + "idd": 2.788819e-05, + "vos_in": -1.81899e-12, + "gain_lf": 8.569138, + "f3db": 78103720.0, + "ugf": 195090500.0 + }, + "presim_s": 10.1 + }, + { + "case_id": "C17_sky130_sW1.5_sL2", + "circuit_id": "C17", + "pdk": "sky130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "diff_r", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.6, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.6, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.6, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "5a506eabdbbefada", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 46420000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 8.100762, + "f3db": 77370550.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 1.529405, + "vo2": 1.529405, + "idd": 2.687138e-05, + "vos_in": 3.637979e-12, + "gain_lf": 8.100762, + "f3db": 77370550.0, + "ugf": 181459300.0 + }, + "presim_s": 10.4 + }, + { + "case_id": "C17_sky130_sW1_sL1", + "circuit_id": "C17", + "pdk": "sky130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "diff_r", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "e3355a0044395ab0", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 47730000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 8.178825, + "f3db": 79542460.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 1.524965, + "vo2": 1.524965, + "idd": 2.731382e-05, + "vos_in": -3.63798e-12, + "gain_lf": 8.178825, + "f3db": 79542460.0, + "ugf": 188501400.0 + }, + "presim_s": 9.5 + }, + { + "case_id": "C17_sky130_sW1_sL1.5", + "circuit_id": "C17", + "pdk": "sky130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "diff_r", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "93f6bcf65f79ac74", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 47090000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 7.751929, + "f3db": 78477050.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 1.533358, + "vo2": 1.533358, + "idd": 2.647755e-05, + "vos_in": -1.81899e-12, + "gain_lf": 7.751929, + "f3db": 78477050.0, + "ugf": 175310600.0 + }, + "presim_s": 8.4 + }, + { + "case_id": "C17_sky130_sW1_sL2", + "circuit_id": "C17", + "pdk": "sky130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "diff_r", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "ac667ca55d98cec8", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 46650000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 7.011717, + "f3db": 77755120.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 1.553628, + "vo2": 1.553628, + "idd": 2.445846e-05, + "vos_in": 0.0, + "gain_lf": 7.011717, + "f3db": 77755120.0, + "ugf": 156497000.0 + }, + "presim_s": 7.3 + }, + { + "case_id": "C17_sky130_sW2_sL1", + "circuit_id": "C17", + "pdk": "sky130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "diff_r", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "96d020ab38cf0aef", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 47220000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 8.723596, + "f3db": 78697350.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 1.534642, + "vo2": 1.534642, + "idd": 2.634963e-05, + "vos_in": 3.637979e-12, + "gain_lf": 8.723596, + "f3db": 78697350.0, + "ugf": 200561900.0 + }, + "presim_s": 7.3 + }, + { + "case_id": "C17_sky130_sW2_sL1.5", + "circuit_id": "C17", + "pdk": "sky130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "diff_r", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "ed5bcaca675aa7a6", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 46560000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 8.838831, + "f3db": 77607350.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 1.525305, + "vo2": 1.525305, + "idd": 2.727998e-05, + "vos_in": 0.0, + "gain_lf": 8.838831, + "f3db": 77607350.0, + "ugf": 200921400.0 + }, + "presim_s": 7.9 + }, + { + "case_id": "C17_sky130_sW2_sL2", + "circuit_id": "C17", + "pdk": "sky130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "diff_r", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "44f3db779a0eedeb", + "stage": "qualified", + "qualification": { + "qualified": true, + "reasons": [], + "spec": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 46130000.0 + }, + "_frozen_from": { + "schematic": { + "gain_lf": 8.509626, + "f3db": 76882420.0 + }, + "floors": { + "gain_lf": { + "min": 6.0 + }, + "f3db": { + "min": 1000000.0 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vo1": 1.530562, + "vo2": 1.530562, + "idd": 2.675617e-05, + "vos_in": 0.0, + "gain_lf": 8.509626, + "f3db": 76882420.0, + "ugf": 190754500.0 + }, + "presim_s": 6.4 + }, + { + "case_id": "C18_gf180_sW0.5_sL1", + "circuit_id": "C18", + "pdk": "gf180", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "buffer_ab", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.56, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.56, + "nf0": 16, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 16.0, + "l0": 0.56, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.56, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 32.0, + "l0": 0.56, + "nf0": 64, + "uw0": 0.5, + "w": 16.0, + "l": 0.56, + "nf": 32, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "faa3188fe532f1da", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "thd_pct=26.94 above floor 3", + "out_swing=0 below floor 0.825" + ], + "spec": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 14570000.0 + }, + "out_swing": { + "min": 0.825 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 26.9362, + "iq": 5.295894e-05, + "f3db": 24278360.0, + "out_swing": 0.0 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.825 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 1.656175, + "vin0": 1.412015, + "iq": 5.295894e-05, + "gain_lf": -19.35979, + "f3db": 24278360.0, + "gmid": 0.107644, + "vo_a": 1.635907, + "vo_b": 1.635907, + "out_swing": 0.0, + "vamp2": 0.3, + "thd_pct": 26.9362 + }, + "presim_s": 1.1 + }, + { + "case_id": "C18_gf180_sW0.5_sL1.5", + "circuit_id": "C18", + "pdk": "gf180", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "buffer_ab", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.84, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 8.0, + "l0": 0.56, + "nf0": 16, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 16.0, + "l0": 0.56, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 16.0, + "l0": 0.56, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 32.0, + "l0": 0.56, + "nf0": 64, + "uw0": 0.5, + "w": 16.0, + "l": 0.84, + "nf": 32, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "eb34481d183ffc94", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "thd_pct=21.36 above floor 3", + "out_swing=0 below floor 0.825" + ], + "spec": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 10680000.0 + }, + "out_swing": { + "min": 0.825 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 21.3568, + "iq": 4.128334e-05, + "f3db": 17806850.0, + "out_swing": 0.0 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.825 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 1.706328, + "vin0": 1.49, + "iq": 4.128334e-05, + "gain_lf": -22.93675, + "f3db": 17806850.0, + "gmid": 0.07130919, + "vo_a": 1.690331, + "vo_b": 1.690331, + "out_swing": 0.0, + "vamp2": 0.3, + "thd_pct": 21.3568 + }, + "presim_s": 1.0 + }, + { + "case_id": "C18_gf180_sW0.5_sL2", + "circuit_id": "C18", + "pdk": "gf180", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "buffer_ab", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 1.12, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.56, + "nf0": 16, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 16.0, + "l0": 0.56, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.56, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 32.0, + "l0": 0.56, + "nf0": 64, + "uw0": 0.5, + "w": 16.0, + "l": 1.12, + "nf": 32, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "0b54a83843c05712", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "servo did not reach the output target: vout0=1.725938 target=1.65 (tol 0.066 V)", + "thd_pct=20.72 above floor 3", + "out_swing=0 below floor 0.825" + ], + "spec": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 8494000.0 + }, + "out_swing": { + "min": 0.825 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 20.7249, + "iq": 3.33925e-05, + "f3db": 14157280.0, + "out_swing": 0.0 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.825 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 1.725938, + "vin0": 1.49, + "iq": 3.33925e-05, + "gain_lf": -23.87583, + "f3db": 14157280.0, + "gmid": 0.06400154, + "vo_a": 1.711236, + "vo_b": 1.711236, + "out_swing": 0.0, + "vamp2": 0.3, + "thd_pct": 20.7249 + }, + "presim_s": 1.1 + }, + { + "case_id": "C18_gf180_sW1.5_sL1", + "circuit_id": "C18", + "pdk": "gf180", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "buffer_ab", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.56, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.56, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.56, + "nf0": 16, + "uw0": 0.5, + "w": 12.0, + "l": 0.56, + "nf": 24, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 16.0, + "l0": 0.56, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.56, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.56, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.56, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 32.0, + "l0": 0.56, + "nf0": 64, + "uw0": 0.5, + "w": 48.0, + "l": 0.56, + "nf": 96, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "9d239e397e692f04", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "thd_pct=28.89 above floor 3", + "out_swing=0.3135 below floor 0.825" + ], + "spec": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 14450000.0 + }, + "out_swing": { + "min": 0.825 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 28.8929, + "iq": 6.122585e-05, + "f3db": 24088320.0, + "out_swing": 0.313468 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.825 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 1.649173, + "vin0": 0.9080044, + "iq": 6.122585e-05, + "gain_lf": 10.93205, + "f3db": 24088320.0, + "gmid": 3.528578, + "vo_a": 1.935532, + "vo_b": 1.622064, + "out_swing": 0.313468, + "vamp2": 0.02840501, + "thd_pct": 28.8929 + }, + "presim_s": 3.0 + }, + { + "case_id": "C18_gf180_sW1.5_sL1.5", + "circuit_id": "C18", + "pdk": "gf180", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "buffer_ab", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.84, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.84, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 8.0, + "l0": 0.56, + "nf0": 16, + "uw0": 0.5, + "w": 12.0, + "l": 0.84, + "nf": 24, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 16.0, + "l0": 0.56, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.84, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 16.0, + "l0": 0.56, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.84, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 32.0, + "l0": 0.56, + "nf0": 64, + "uw0": 0.5, + "w": 48.0, + "l": 0.84, + "nf": 96, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "48bcd1ee0b1f064e", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "thd_pct=38.76 above floor 3", + "out_swing=0.4003 below floor 0.825" + ], + "spec": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 19190000.0 + }, + "out_swing": { + "min": 0.825 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 38.7588, + "iq": 5.853009e-05, + "f3db": 31984040.0, + "out_swing": 0.400254 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.825 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 1.650572, + "vin0": 1.046996, + "iq": 5.853009e-05, + "gain_lf": -7.898394, + "f3db": 31984040.0, + "gmid": 0.4027752, + "vo_a": 2.025529, + "vo_b": 1.625275, + "out_swing": 0.400254, + "vamp2": 0.2482673, + "thd_pct": 38.7588 + }, + "presim_s": 3.1 + }, + { + "case_id": "C18_gf180_sW1.5_sL2", + "circuit_id": "C18", + "pdk": "gf180", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "buffer_ab", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 1.12, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 1.12, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.56, + "nf0": 16, + "uw0": 0.5, + "w": 12.0, + "l": 1.12, + "nf": 24, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 16.0, + "l0": 0.56, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 1.12, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.56, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 1.12, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 32.0, + "l0": 0.56, + "nf0": 64, + "uw0": 0.5, + "w": 48.0, + "l": 1.12, + "nf": 96, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "8e140a0f707bbdcc", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "thd_pct=33.01 above floor 3", + "out_swing=0 below floor 0.825" + ], + "spec": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 17570000.0 + }, + "out_swing": { + "min": 0.825 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 33.0134, + "iq": 5.690205e-05, + "f3db": 29290630.0, + "out_swing": 0.0 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.825 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 1.65395, + "vin0": 1.319204, + "iq": 5.690205e-05, + "gain_lf": -19.75458, + "f3db": 29290630.0, + "gmid": 0.1028636, + "vo_a": 1.63726, + "vo_b": 1.63726, + "out_swing": 0.0, + "vamp2": 0.3, + "thd_pct": 33.0134 + }, + "presim_s": 3.1 + }, + { + "case_id": "C18_gf180_sW1_sL1", + "circuit_id": "C18", + "pdk": "gf180", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "buffer_ab", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.56, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.56, + "nf0": 16, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 16.0, + "l0": 0.56, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.56, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.56, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.56, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 32.0, + "l0": 0.56, + "nf0": 64, + "uw0": 0.5, + "w": 32.0, + "l": 0.56, + "nf": 64, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "80490b484f82087d", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "thd_pct=32.9 above floor 3", + "out_swing=0.4151 below floor 0.825" + ], + "spec": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 19870000.0 + }, + "out_swing": { + "min": 0.825 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 32.8993, + "iq": 5.918492e-05, + "f3db": 33112140.0, + "out_swing": 0.41509 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.825 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 1.650088, + "vin0": 0.9988306, + "iq": 5.918492e-05, + "gain_lf": -0.8197628, + "f3db": 33112140.0, + "gmid": 0.9100092, + "vo_a": 2.033717, + "vo_b": 1.618627, + "out_swing": 0.41509, + "vamp2": 0.1098976, + "thd_pct": 32.8993 + }, + "presim_s": 2.0 + }, + { + "case_id": "C18_gf180_sW1_sL1.5", + "circuit_id": "C18", + "pdk": "gf180", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "buffer_ab", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.84, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 8.0, + "l0": 0.56, + "nf0": 16, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 16.0, + "l0": 0.56, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.84, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 16.0, + "l0": 0.56, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.84, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 32.0, + "l0": 0.56, + "nf0": 64, + "uw0": 0.5, + "w": 32.0, + "l": 0.84, + "nf": 64, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "f69b009192ebadc8", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "thd_pct=29.98 above floor 3", + "out_swing=0 below floor 0.825" + ], + "spec": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 17060000.0 + }, + "out_swing": { + "min": 0.825 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 29.979, + "iq": 5.600763e-05, + "f3db": 28436200.0, + "out_swing": 0.0 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.825 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 1.654657, + "vin0": 1.355626, + "iq": 5.600763e-05, + "gain_lf": -19.89406, + "f3db": 28436200.0, + "gmid": 0.1012222, + "vo_a": 1.637144, + "vo_b": 1.637144, + "out_swing": 0.0, + "vamp2": 0.3, + "thd_pct": 29.979 + }, + "presim_s": 2.1 + }, + { + "case_id": "C18_gf180_sW1_sL2", + "circuit_id": "C18", + "pdk": "gf180", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "buffer_ab", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 1.12, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.56, + "nf0": 16, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 16.0, + "l0": 0.56, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 1.12, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.56, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 1.12, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 32.0, + "l0": 0.56, + "nf0": 64, + "uw0": 0.5, + "w": 32.0, + "l": 1.12, + "nf": 64, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "5cf5566114aeb37e", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "thd_pct=21.38 above floor 3", + "out_swing=0 below floor 0.825" + ], + "spec": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 14190000.0 + }, + "out_swing": { + "min": 0.825 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 21.3766, + "iq": 5.028947e-05, + "f3db": 23652200.0, + "out_swing": 0.0 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.825 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 1.683178, + "vin0": 1.489998, + "iq": 5.028947e-05, + "gain_lf": -23.77753, + "f3db": 23652200.0, + "gmid": 0.0647298, + "vo_a": 1.668788, + "vo_b": 1.668788, + "out_swing": 0.0, + "vamp2": 0.3, + "thd_pct": 21.3766 + }, + "presim_s": 2.2 + }, + { + "case_id": "C18_gf180_sW2_sL1", + "circuit_id": "C18", + "pdk": "gf180", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "buffer_ab", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.56, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.56, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.56, + "nf0": 16, + "uw0": 0.5, + "w": 16.0, + "l": 0.56, + "nf": 32, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 16.0, + "l0": 0.56, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.56, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.56, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.56, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 32.0, + "l0": 0.56, + "nf0": 64, + "uw0": 0.5, + "w": 64.0, + "l": 0.56, + "nf": 128, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "051218102f694e22", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "thd_pct=26.61 above floor 3", + "out_swing=0.2552 below floor 0.825" + ], + "spec": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 7414000.0 + }, + "out_swing": { + "min": 0.825 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 26.6068, + "iq": 6.284896e-05, + "f3db": 12356960.0, + "out_swing": 0.2552 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.825 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 1.648752, + "vin0": 0.8676934, + "iq": 6.284896e-05, + "gain_lf": 18.96702, + "f3db": 12356960.0, + "gmid": 8.936743, + "vo_a": 1.875164, + "vo_b": 1.619964, + "out_swing": 0.2552, + "vamp2": 0.01126289, + "thd_pct": 26.6068 + }, + "presim_s": 3.6 + }, + { + "case_id": "C18_gf180_sW2_sL1.5", + "circuit_id": "C18", + "pdk": "gf180", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "buffer_ab", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.84, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.84, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 8.0, + "l0": 0.56, + "nf0": 16, + "uw0": 0.5, + "w": 16.0, + "l": 0.84, + "nf": 32, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 16.0, + "l0": 0.56, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.84, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 16.0, + "l0": 0.56, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.84, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 32.0, + "l0": 0.56, + "nf0": 64, + "uw0": 0.5, + "w": 64.0, + "l": 0.84, + "nf": 128, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "37371290d4270b9f", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "thd_pct=33.43 above floor 3", + "out_swing=0.3971 below floor 0.825" + ], + "spec": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 16840000.0 + }, + "out_swing": { + "min": 0.825 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 33.43, + "iq": 5.946696e-05, + "f3db": 28070750.0, + "out_swing": 0.397109 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.825 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 1.649532, + "vin0": 0.9433282, + "iq": 5.946696e-05, + "gain_lf": 0.1937598, + "f3db": 28070750.0, + "gmid": 1.022776, + "vo_a": 2.020227, + "vo_b": 1.623118, + "out_swing": 0.397109, + "vamp2": 0.09779395, + "thd_pct": 33.43 + }, + "presim_s": 4.2 + }, + { + "case_id": "C18_gf180_sW2_sL2", + "circuit_id": "C18", + "pdk": "gf180", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "buffer_ab", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.56, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 1.12, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.56, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 1.12, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.56, + "nf0": 16, + "uw0": 0.5, + "w": 16.0, + "l": 1.12, + "nf": 32, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 16.0, + "l0": 0.56, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 1.12, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.56, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 1.12, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 32.0, + "l0": 0.56, + "nf0": 64, + "uw0": 0.5, + "w": 64.0, + "l": 1.12, + "nf": 128, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "5289f1065a71db6a", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "thd_pct=42.28 above floor 3", + "out_swing=0 below floor 0.825" + ], + "spec": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 17710000.0 + }, + "out_swing": { + "min": 0.825 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 42.2833, + "iq": 5.833965e-05, + "f3db": 29518230.0, + "out_swing": 0.0 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.825 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 1.650887, + "vin0": 1.07775, + "iq": 5.833965e-05, + "gain_lf": -10.80582, + "f3db": 29518230.0, + "gmid": 0.2882045, + "vo_a": 1.628495, + "vo_b": 1.628495, + "out_swing": 0.0, + "vamp2": 0.3, + "thd_pct": 42.2833 + }, + "presim_s": 2.8 + }, + { + "case_id": "C18_ihp130_sW0.5_sL1", + "circuit_id": "C18", + "pdk": "ihp130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "buffer_ab", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.26, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.26, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.26, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.26, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 32.0, + "l0": 0.26, + "nf0": 64, + "uw0": 0.5, + "w": 16.0, + "l": 0.26, + "nf": 32, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "28b505f9731bf2c0", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "thd_pct=54.68 above floor 3", + "out_swing=0 below floor 0.3" + ], + "spec": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 21840000.0 + }, + "out_swing": { + "min": 0.3 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 54.6817, + "iq": 4.628699e-05, + "f3db": 36399540.0, + "out_swing": 0.0 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.3 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.6043479, + "vin0": 0.7105812, + "iq": 4.628699e-05, + "gain_lf": -21.08209, + "f3db": 36399540.0, + "gmid": 0.08828463, + "vo_a": 0.5972281, + "vo_b": 0.5972281, + "out_swing": 0.0, + "vamp2": 0.3, + "thd_pct": 54.6817 + }, + "presim_s": 74.6 + }, + { + "case_id": "C18_ihp130_sW0.5_sL1.5", + "circuit_id": "C18", + "pdk": "ihp130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "buffer_ab", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.39, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 32.0, + "l0": 0.26, + "nf0": 64, + "uw0": 0.5, + "w": 16.0, + "l": 0.39, + "nf": 32, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "08b310978ed647bb", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "thd_pct=40.33 above floor 3", + "out_swing=0 below floor 0.3" + ], + "spec": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 20120000.0 + }, + "out_swing": { + "min": 0.3 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 40.3251, + "iq": 4.742868e-05, + "f3db": 33525560.0, + "out_swing": 0.0 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.3 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.6118055, + "vin0": 0.8511827, + "iq": 4.742868e-05, + "gain_lf": -27.96005, + "f3db": 33525560.0, + "gmid": 0.0399938, + "vo_a": 0.6068152, + "vo_b": 0.6068152, + "out_swing": 0.0, + "vamp2": 0.3, + "thd_pct": 40.3251 + }, + "presim_s": 23.8 + }, + { + "case_id": "C18_ihp130_sW0.5_sL2", + "circuit_id": "C18", + "pdk": "ihp130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "buffer_ab", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.52, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 32.0, + "l0": 0.26, + "nf0": 64, + "uw0": 0.5, + "w": 16.0, + "l": 0.52, + "nf": 32, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "97e6c10759926681", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "thd_pct=36.63 above floor 3", + "out_swing=0 below floor 0.3" + ], + "spec": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 17850000.0 + }, + "out_swing": { + "min": 0.3 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 36.632, + "iq": 4.446401e-05, + "f3db": 29750080.0, + "out_swing": 0.0 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.3 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.6217032, + "vin0": 0.8598303, + "iq": 4.446401e-05, + "gain_lf": -28.082, + "f3db": 29750080.0, + "gmid": 0.03943634, + "vo_a": 0.6164709, + "vo_b": 0.6164709, + "out_swing": 0.0, + "vamp2": 0.3, + "thd_pct": 36.632 + }, + "presim_s": 9.0 + }, + { + "case_id": "C18_ihp130_sW1.5_sL1", + "circuit_id": "C18", + "pdk": "ihp130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "buffer_ab", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.26, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.26, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 12.0, + "l": 0.26, + "nf": 24, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.26, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.26, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 32.0, + "l0": 0.26, + "nf0": 64, + "uw0": 0.5, + "w": 48.0, + "l": 0.26, + "nf": 96, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "c8f9c93822d7cdeb", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "thd_pct=25.63 above floor 3", + "out_swing=0.1936 below floor 0.3" + ], + "spec": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 35820000.0 + }, + "out_swing": { + "min": 0.3 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 25.6333, + "iq": 6.034971e-05, + "f3db": 59696350.0, + "out_swing": 0.1936459 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.3 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.6011689, + "vin0": 0.474809, + "iq": 6.034971e-05, + "gain_lf": 2.389674, + "f3db": 59696350.0, + "gmid": 1.317209, + "vo_a": 0.7765116, + "vo_b": 0.5828657, + "out_swing": 0.1936459, + "vamp2": 0.07594803, + "thd_pct": 25.6333 + }, + "presim_s": 88.5 + }, + { + "case_id": "C18_ihp130_sW1.5_sL1.5", + "circuit_id": "C18", + "pdk": "ihp130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "buffer_ab", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.39, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.39, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 12.0, + "l": 0.39, + "nf": 24, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.39, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.39, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 32.0, + "l0": 0.26, + "nf0": 64, + "uw0": 0.5, + "w": 48.0, + "l": 0.39, + "nf": 96, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "73e69a61ee8d4e8d", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "thd_pct=31.37 above floor 3", + "out_swing=0.228 below floor 0.3" + ], + "spec": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 36530000.0 + }, + "out_swing": { + "min": 0.3 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 31.3697, + "iq": 6.579642e-05, + "f3db": 60880530.0, + "out_swing": 0.2279786 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.3 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.6012279, + "vin0": 0.4803811, + "iq": 6.579642e-05, + "gain_lf": -3.507436, + "f3db": 60880530.0, + "gmid": 0.6679019, + "vo_a": 0.81337, + "vo_b": 0.5853914, + "out_swing": 0.2279786, + "vamp2": 0.1497518, + "thd_pct": 31.3697 + }, + "presim_s": 64.7 + }, + { + "case_id": "C18_ihp130_sW1.5_sL2", + "circuit_id": "C18", + "pdk": "ihp130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "buffer_ab", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.52, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.52, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 12.0, + "l": 0.52, + "nf": 24, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.52, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.52, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 32.0, + "l0": 0.26, + "nf0": 64, + "uw0": 0.5, + "w": 48.0, + "l": 0.52, + "nf": 96, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "dce189abb5766e5e", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "thd_pct=34.67 above floor 3", + "out_swing=0.2387 below floor 0.3" + ], + "spec": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 35080000.0 + }, + "out_swing": { + "min": 0.3 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 34.6666, + "iq": 6.750667e-05, + "f3db": 58463990.0, + "out_swing": 0.2387012 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.3 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.6015679, + "vin0": 0.5118427, + "iq": 6.750667e-05, + "gain_lf": -8.80122, + "f3db": 58463990.0, + "gmid": 0.3630485, + "vo_a": 0.8261181, + "vo_b": 0.5874169, + "out_swing": 0.2387012, + "vamp2": 0.2754616, + "thd_pct": 34.6666 + }, + "presim_s": 74.5 + }, + { + "case_id": "C18_ihp130_sW1_sL1", + "circuit_id": "C18", + "pdk": "ihp130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "buffer_ab", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.26, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 8.0, + "l": 0.26, + "nf": 16, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.26, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.26, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 32.0, + "l0": 0.26, + "nf0": 64, + "uw0": 0.5, + "w": 32.0, + "l": 0.26, + "nf": 64, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "76485ab8bb4105c5", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "thd_pct=31.41 above floor 3", + "out_swing=0.1982 below floor 0.3" + ], + "spec": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 32190000.0 + }, + "out_swing": { + "min": 0.3 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 31.4117, + "iq": 5.666062e-05, + "f3db": 53647720.0, + "out_swing": 0.1982082 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.3 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.601749, + "vin0": 0.5280955, + "iq": 5.666062e-05, + "gain_lf": -5.664669, + "f3db": 53647720.0, + "gmid": 0.5209781, + "vo_a": 0.7852801, + "vo_b": 0.5870719, + "out_swing": 0.1982082, + "vamp2": 0.1919701, + "thd_pct": 31.4117 + }, + "presim_s": 60.6 + }, + { + "case_id": "C18_ihp130_sW1_sL1.5", + "circuit_id": "C18", + "pdk": "ihp130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "buffer_ab", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.39, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.39, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.39, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 32.0, + "l0": 0.26, + "nf0": 64, + "uw0": 0.5, + "w": 32.0, + "l": 0.39, + "nf": 64, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "64d50719a975becd", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "thd_pct=39.25 above floor 3", + "out_swing=0.2183 below floor 0.3" + ], + "spec": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 31080000.0 + }, + "out_swing": { + "min": 0.3 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 39.2533, + "iq": 6.132357e-05, + "f3db": 51793050.0, + "out_swing": 0.2183261 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.3 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.6022713, + "vin0": 0.5726971, + "iq": 6.132357e-05, + "gain_lf": -13.14255, + "f3db": 51793050.0, + "gmid": 0.2202138, + "vo_a": 0.8090009, + "vo_b": 0.5906748, + "out_swing": 0.2183261, + "vamp2": 0.3, + "thd_pct": 39.2533 + }, + "presim_s": 62.7 + }, + { + "case_id": "C18_ihp130_sW1_sL2", + "circuit_id": "C18", + "pdk": "ihp130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "buffer_ab", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.52, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.52, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.52, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 32.0, + "l0": 0.26, + "nf0": 64, + "uw0": 0.5, + "w": 32.0, + "l": 0.52, + "nf": 64, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "10054bb31697d3b3", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "thd_pct=56.22 above floor 3", + "out_swing=0 below floor 0.3" + ], + "spec": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 28880000.0 + }, + "out_swing": { + "min": 0.3 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 56.219, + "iq": 6.201357e-05, + "f3db": 48134030.0, + "out_swing": 0.0 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.3 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.6034816, + "vin0": 0.6610136, + "iq": 6.201357e-05, + "gain_lf": -19.58239, + "f3db": 48134030.0, + "gmid": 0.1049226, + "vo_a": 0.5948294, + "vo_b": 0.5948294, + "out_swing": 0.0, + "vamp2": 0.3, + "thd_pct": 56.219 + }, + "presim_s": 52.2 + }, + { + "case_id": "C18_ihp130_sW2_sL1", + "circuit_id": "C18", + "pdk": "ihp130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "buffer_ab", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.26, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.26, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 16.0, + "l": 0.26, + "nf": 32, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.26, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.26, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 32.0, + "l0": 0.26, + "nf0": 64, + "uw0": 0.5, + "w": 64.0, + "l": 0.26, + "nf": 128, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "61ce3b7138701efd", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "thd_pct=22.86 above floor 3", + "out_swing=0.1709 below floor 0.3" + ], + "spec": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 32290000.0 + }, + "out_swing": { + "min": 0.3 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 22.8591, + "iq": 6.236234e-05, + "f3db": 53820020.0, + "out_swing": 0.1709128 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.3 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.6008871, + "vin0": 0.4477911, + "iq": 6.236234e-05, + "gain_lf": 7.291935, + "f3db": 53820020.0, + "gmid": 2.316724, + "vo_a": 0.7506718, + "vo_b": 0.579759, + "out_swing": 0.1709128, + "vamp2": 0.04319202, + "thd_pct": 22.8591 + }, + "presim_s": 94.8 + }, + { + "case_id": "C18_ihp130_sW2_sL1.5", + "circuit_id": "C18", + "pdk": "ihp130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "buffer_ab", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.39, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.39, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 16.0, + "l": 0.39, + "nf": 32, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.39, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.39, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 32.0, + "l0": 0.26, + "nf0": 64, + "uw0": 0.5, + "w": 64.0, + "l": 0.39, + "nf": 128, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "f4d8f3ef142ec982", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "thd_pct=27.96 above floor 3", + "out_swing=0.2199 below floor 0.3" + ], + "spec": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 34300000.0 + }, + "out_swing": { + "min": 0.3 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 27.9647, + "iq": 6.810104e-05, + "f3db": 57174060.0, + "out_swing": 0.2198753 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.3 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.60082, + "vin0": 0.4412735, + "iq": 6.810104e-05, + "gain_lf": 2.770807, + "f3db": 57174060.0, + "gmid": 1.376713, + "vo_a": 0.80318, + "vo_b": 0.5833047, + "out_swing": 0.2198753, + "vamp2": 0.07268746, + "thd_pct": 27.9647 + }, + "presim_s": 89.9 + }, + { + "case_id": "C18_ihp130_sW2_sL2", + "circuit_id": "C18", + "pdk": "ihp130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "buffer_ab", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.26, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.52, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.26, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.52, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.26, + "nf0": 16, + "uw0": 0.5, + "w": 16.0, + "l": 0.52, + "nf": 32, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.52, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.26, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.52, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 32.0, + "l0": 0.26, + "nf0": 64, + "uw0": 0.5, + "w": 64.0, + "l": 0.52, + "nf": 128, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "6fe5bda305e5fead", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "thd_pct=31.05 above floor 3", + "out_swing=0.2425 below floor 0.3" + ], + "spec": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 34650000.0 + }, + "out_swing": { + "min": 0.3 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 31.0486, + "iq": 7.012928e-05, + "f3db": 57755300.0, + "out_swing": 0.2424721 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.3 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.6009576, + "vin0": 0.4546021, + "iq": 7.012928e-05, + "gain_lf": -1.998438, + "f3db": 57755300.0, + "gmid": 0.7946839, + "vo_a": 0.8267659, + "vo_b": 0.5842938, + "out_swing": 0.2424721, + "vamp2": 0.1258699, + "thd_pct": 31.0486 + }, + "presim_s": 81.3 + }, + { + "case_id": "C18_sky130_sW0.5_sL1", + "circuit_id": "C18", + "pdk": "sky130", + "size": "sW0.5_sL1", + "sW": 0.5, + "sL": 1.0, + "category": "buffer_ab", + "derivation": { + "sW": 0.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.3, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 32.0, + "l0": 0.3, + "nf0": 64, + "uw0": 0.5, + "w": 16.0, + "l": 0.3, + "nf": 32, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "21b49306a7f1808e", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "servo did not reach the output target: vout0=0.9614974 target=0.9 (tol 0.036 V)", + "thd_pct=49.73 above floor 3", + "out_swing=0 below floor 0.45" + ], + "spec": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5852000.0 + }, + "out_swing": { + "min": 0.45 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 49.7262, + "iq": 1.024917e-05, + "f3db": 9752937.0, + "out_swing": 0.0 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.45 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.9614974, + "vin0": 1.04, + "iq": 1.024917e-05, + "gain_lf": -42.24355, + "f3db": 9752937.0, + "gmid": 0.007723707, + "vo_a": 0.9606606, + "vo_b": 0.9606606, + "out_swing": 0.0, + "vamp2": 0.3, + "thd_pct": 49.7262 + }, + "presim_s": 10.7 + }, + { + "case_id": "C18_sky130_sW0.5_sL1.5", + "circuit_id": "C18", + "pdk": "sky130", + "size": "sW0.5_sL1.5", + "sW": 0.5, + "sL": 1.5, + "category": "buffer_ab", + "derivation": { + "sW": 0.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.45, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 32.0, + "l0": 0.3, + "nf0": 64, + "uw0": 0.5, + "w": 16.0, + "l": 0.45, + "nf": 32, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "7964407fd9178853", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "servo did not reach the output target: vout0=0.983791 target=0.9 (tol 0.036 V)", + "thd_pct=43.65 above floor 3", + "out_swing=0 below floor 0.45" + ], + "spec": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.45 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 43.6465, + "iq": 7.38858e-06, + "f3db": 7027076.0, + "out_swing": 0.0 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.45 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.983791, + "vin0": 1.04, + "iq": 7.38858e-06, + "gain_lf": -49.45347, + "f3db": 7027076.0, + "gmid": 0.003367665, + "vo_a": 0.983392, + "vo_b": 0.983392, + "out_swing": 0.0, + "vamp2": 0.3, + "thd_pct": 43.6465 + }, + "presim_s": 10.7 + }, + { + "case_id": "C18_sky130_sW0.5_sL2", + "circuit_id": "C18", + "pdk": "sky130", + "size": "sW0.5_sL2", + "sW": 0.5, + "sL": 2.0, + "category": "buffer_ab", + "derivation": { + "sW": 0.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 1.0, + "l": 0.6, + "nf": 2, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 32.0, + "l0": 0.3, + "nf0": 64, + "uw0": 0.5, + "w": 16.0, + "l": 0.6, + "nf": 32, + "uw": 0.5, + "w_ratio": 0.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "4519e206a6fac587", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "servo did not reach the output target: vout0=0.9867281 target=0.9 (tol 0.036 V)", + "thd_pct=41.38 above floor 3", + "out_swing=0 below floor 0.45" + ], + "spec": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.45 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 41.3803, + "iq": 6.251843e-06, + "f3db": 5960859.0, + "out_swing": 0.0 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.45 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.9867281, + "vin0": 1.04, + "iq": 6.251843e-06, + "gain_lf": -54.26525, + "f3db": 5960859.0, + "gmid": 0.001935263, + "vo_a": 0.9864907, + "vo_b": 0.9864907, + "out_swing": 0.0, + "vamp2": 0.3, + "thd_pct": 41.3803 + }, + "presim_s": 9.8 + }, + { + "case_id": "C18_sky130_sW1.5_sL1", + "circuit_id": "C18", + "pdk": "sky130", + "size": "sW1.5_sL1", + "sW": 1.5, + "sL": 1.0, + "category": "buffer_ab", + "derivation": { + "sW": 1.5, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.3, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.3, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 12.0, + "l": 0.3, + "nf": 24, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.3, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.3, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 32.0, + "l0": 0.3, + "nf0": 64, + "uw0": 0.5, + "w": 48.0, + "l": 0.3, + "nf": 96, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "a5b472df9e3d1b23", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "servo did not reach the output target: vout0=0.9648527 target=0.9 (tol 0.036 V)", + "thd_pct=52.47 above floor 3", + "out_swing=0 below floor 0.45" + ], + "spec": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 14070000.0 + }, + "out_swing": { + "min": 0.45 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 52.4707, + "iq": 2.522956e-05, + "f3db": 23454130.0, + "out_swing": 0.0 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.45 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.9648527, + "vin0": 1.04, + "iq": 2.522956e-05, + "gain_lf": -40.25145, + "f3db": 23454130.0, + "gmid": 0.009714729, + "vo_a": 0.9638176, + "vo_b": 0.9638176, + "out_swing": 0.0, + "vamp2": 0.3, + "thd_pct": 52.4707 + }, + "presim_s": 10.4 + }, + { + "case_id": "C18_sky130_sW1.5_sL1.5", + "circuit_id": "C18", + "pdk": "sky130", + "size": "sW1.5_sL1.5", + "sW": 1.5, + "sL": 1.5, + "category": "buffer_ab", + "derivation": { + "sW": 1.5, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.45, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.45, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 12.0, + "l": 0.45, + "nf": 24, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.45, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.45, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 32.0, + "l0": 0.3, + "nf0": 64, + "uw0": 0.5, + "w": 48.0, + "l": 0.45, + "nf": 96, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "27dbdf4b8370397c", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "servo did not reach the output target: vout0=0.99676 target=0.9 (tol 0.036 V)", + "thd_pct=46.44 above floor 3", + "out_swing=0 below floor 0.45" + ], + "spec": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 8890000.0 + }, + "out_swing": { + "min": 0.45 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 46.4405, + "iq": 1.579314e-05, + "f3db": 14816630.0, + "out_swing": 0.0 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.45 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.99676, + "vin0": 1.04, + "iq": 1.579314e-05, + "gain_lf": -45.19149, + "f3db": 14816630.0, + "gmid": 0.005500832, + "vo_a": 0.9961201, + "vo_b": 0.9961201, + "out_swing": 0.0, + "vamp2": 0.3, + "thd_pct": 46.4405 + }, + "presim_s": 14.2 + }, + { + "case_id": "C18_sky130_sW1.5_sL2", + "circuit_id": "C18", + "pdk": "sky130", + "size": "sW1.5_sL2", + "sW": 1.5, + "sL": 2.0, + "category": "buffer_ab", + "derivation": { + "sW": 1.5, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 3.0, + "l": 0.6, + "nf": 6, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 6.0, + "l": 0.6, + "nf": 12, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 12.0, + "l": 0.6, + "nf": 24, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.6, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 24.0, + "l": 0.6, + "nf": 48, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 32.0, + "l0": 0.3, + "nf0": 64, + "uw0": 0.5, + "w": 48.0, + "l": 0.6, + "nf": 96, + "uw": 0.5, + "w_ratio": 1.5, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "de2cba923b099141", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "servo did not reach the output target: vout0=1.005301 target=0.9 (tol 0.036 V)", + "thd_pct=43.98 above floor 3", + "out_swing=0 below floor 0.45" + ], + "spec": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 6813000.0 + }, + "out_swing": { + "min": 0.45 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 43.9839, + "iq": 1.217202e-05, + "f3db": 11354920.0, + "out_swing": 0.0 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.45 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 1.005301, + "vin0": 1.04, + "iq": 1.217202e-05, + "gain_lf": -48.51603, + "f3db": 11354920.0, + "gmid": 0.003751467, + "vo_a": 1.004848, + "vo_b": 1.004848, + "out_swing": 0.0, + "vamp2": 0.3, + "thd_pct": 43.9839 + }, + "presim_s": 10.7 + }, + { + "case_id": "C18_sky130_sW1_sL1", + "circuit_id": "C18", + "pdk": "sky130", + "size": "sW1_sL1", + "sW": 1.0, + "sL": 1.0, + "category": "buffer_ab", + "derivation": { + "sW": 1.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.3, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.3, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.3, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 32.0, + "l0": 0.3, + "nf0": 64, + "uw0": 0.5, + "w": 32.0, + "l": 0.3, + "nf": 64, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "e13aa8d3c3a2f41f", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "servo did not reach the output target: vout0=0.9644481 target=0.9 (tol 0.036 V)", + "thd_pct=51.71 above floor 3", + "out_swing=0 below floor 0.45" + ], + "spec": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 10040000.0 + }, + "out_swing": { + "min": 0.45 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 51.7123, + "iq": 1.791735e-05, + "f3db": 16728900.0, + "out_swing": 0.0 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.45 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.9644481, + "vin0": 1.04, + "iq": 1.791735e-05, + "gain_lf": -40.76458, + "f3db": 16728900.0, + "gmid": 0.009157438, + "vo_a": 0.9634673, + "vo_b": 0.9634673, + "out_swing": 0.0, + "vamp2": 0.3, + "thd_pct": 51.7123 + }, + "presim_s": 11.9 + }, + { + "case_id": "C18_sky130_sW1_sL1.5", + "circuit_id": "C18", + "pdk": "sky130", + "size": "sW1_sL1.5", + "sW": 1.0, + "sL": 1.5, + "category": "buffer_ab", + "derivation": { + "sW": 1.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.45, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.45, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.45, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 32.0, + "l0": 0.3, + "nf0": 64, + "uw0": 0.5, + "w": 32.0, + "l": 0.45, + "nf": 64, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "00e5f9e72e8e2c2d", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "servo did not reach the output target: vout0=0.9931647 target=0.9 (tol 0.036 V)", + "thd_pct=45.56 above floor 3", + "out_swing=0 below floor 0.45" + ], + "spec": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 6578000.0 + }, + "out_swing": { + "min": 0.45 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 45.5605, + "iq": 1.169591e-05, + "f3db": 10963250.0, + "out_swing": 0.0 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.45 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.9931647, + "vin0": 1.04, + "iq": 1.169591e-05, + "gain_lf": -46.4172, + "f3db": 10963250.0, + "gmid": 0.00477686, + "vo_a": 0.9926056, + "vo_b": 0.9926056, + "out_swing": 0.0, + "vamp2": 0.3, + "thd_pct": 45.5605 + }, + "presim_s": 9.0 + }, + { + "case_id": "C18_sky130_sW1_sL2", + "circuit_id": "C18", + "pdk": "sky130", + "size": "sW1_sL2", + "sW": 1.0, + "sL": 2.0, + "category": "buffer_ab", + "derivation": { + "sW": 1.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 2.0, + "l": 0.6, + "nf": 4, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.6, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 16.0, + "l": 0.6, + "nf": 32, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 32.0, + "l0": 0.3, + "nf0": 64, + "uw0": 0.5, + "w": 32.0, + "l": 0.6, + "nf": 64, + "uw": 0.5, + "w_ratio": 1.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "458fd75b00038f25", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "servo did not reach the output target: vout0=0.999616 target=0.9 (tol 0.036 V)", + "thd_pct=43.08 above floor 3", + "out_swing=0 below floor 0.45" + ], + "spec": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5217000.0 + }, + "out_swing": { + "min": 0.45 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 43.0831, + "iq": 9.318186e-06, + "f3db": 8695030.0, + "out_swing": 0.0 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.45 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.999616, + "vin0": 1.04, + "iq": 9.318186e-06, + "gain_lf": -50.29108, + "f3db": 8695030.0, + "gmid": 0.003058079, + "vo_a": 0.9992444, + "vo_b": 0.9992444, + "out_swing": 0.0, + "vamp2": 0.3, + "thd_pct": 43.0831 + }, + "presim_s": 8.9 + }, + { + "case_id": "C18_sky130_sW2_sL1", + "circuit_id": "C18", + "pdk": "sky130", + "size": "sW2_sL1", + "sW": 2.0, + "sL": 1.0, + "category": "buffer_ab", + "derivation": { + "sW": 2.0, + "sL": 1.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.3, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.3, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 16.0, + "l": 0.3, + "nf": 32, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M4": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.3, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.3, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + }, + "M6": { + "w0": 32.0, + "l0": 0.3, + "nf0": 64, + "uw0": 0.5, + "w": 64.0, + "l": 0.3, + "nf": 128, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.0 + } + } + }, + "signature": "f0ae8d5f09761da9", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "servo did not reach the output target: vout0=0.96461 target=0.9 (tol 0.036 V)", + "thd_pct=52.88 above floor 3", + "out_swing=0 below floor 0.45" + ], + "spec": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 17990000.0 + }, + "out_swing": { + "min": 0.45 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 52.8808, + "iq": 3.228383e-05, + "f3db": 29978200.0, + "out_swing": 0.0 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.45 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.96461, + "vin0": 1.04, + "iq": 3.228383e-05, + "gain_lf": -40.00373, + "f3db": 29978200.0, + "gmid": 0.009995783, + "vo_a": 0.9635484, + "vo_b": 0.9635484, + "out_swing": 0.0, + "vamp2": 0.3, + "thd_pct": 52.8808 + }, + "presim_s": 12.0 + }, + { + "case_id": "C18_sky130_sW2_sL1.5", + "circuit_id": "C18", + "pdk": "sky130", + "size": "sW2_sL1.5", + "sW": 2.0, + "sL": 1.5, + "category": "buffer_ab", + "derivation": { + "sW": 2.0, + "sL": 1.5, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.45, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.45, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M3": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 16.0, + "l": 0.45, + "nf": 32, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M4": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.45, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M5": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.45, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + }, + "M6": { + "w0": 32.0, + "l0": 0.3, + "nf0": 64, + "uw0": 0.5, + "w": 64.0, + "l": 0.45, + "nf": 128, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 1.5 + } + } + }, + "signature": "b3a96efbd6f92422", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "servo did not reach the output target: vout0=0.9985048 target=0.9 (tol 0.036 V)", + "thd_pct=46.94 above floor 3", + "out_swing=0 below floor 0.45" + ], + "spec": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 11170000.0 + }, + "out_swing": { + "min": 0.45 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 46.9376, + "iq": 1.978111e-05, + "f3db": 18615980.0, + "out_swing": 0.0 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.45 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 0.9985048, + "vin0": 1.04, + "iq": 1.978111e-05, + "gain_lf": -44.53606, + "f3db": 18615980.0, + "gmid": 0.005931983, + "vo_a": 0.9978174, + "vo_b": 0.9978174, + "out_swing": 0.0, + "vamp2": 0.3, + "thd_pct": 46.9376 + }, + "presim_s": 12.0 + }, + { + "case_id": "C18_sky130_sW2_sL2", + "circuit_id": "C18", + "pdk": "sky130", + "size": "sW2_sL2", + "sW": 2.0, + "sL": 2.0, + "category": "buffer_ab", + "derivation": { + "sW": 2.0, + "sL": 2.0, + "rule": "grid.derive_sizing v1", + "status": "derived", + "finger_rule": "nf scaled (unit width kept)", + "devices": { + "M1": { + "w0": 2.0, + "l0": 0.3, + "nf0": 4, + "uw0": 0.5, + "w": 4.0, + "l": 0.6, + "nf": 8, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M2": { + "w0": 4.0, + "l0": 0.3, + "nf0": 8, + "uw0": 0.5, + "w": 8.0, + "l": 0.6, + "nf": 16, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M3": { + "w0": 8.0, + "l0": 0.3, + "nf0": 16, + "uw0": 0.5, + "w": 16.0, + "l": 0.6, + "nf": 32, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M4": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.6, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M5": { + "w0": 16.0, + "l0": 0.3, + "nf0": 32, + "uw0": 0.5, + "w": 32.0, + "l": 0.6, + "nf": 64, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + }, + "M6": { + "w0": 32.0, + "l0": 0.3, + "nf0": 64, + "uw0": 0.5, + "w": 64.0, + "l": 0.6, + "nf": 128, + "uw": 0.5, + "w_ratio": 2.0, + "l_ratio_exact": 2.0 + } + } + }, + "signature": "3796e57029af3adc", + "stage": "schematic_not_qualified", + "qualification": { + "qualified": false, + "reasons": [ + "servo did not reach the output target: vout0=1.008435 target=0.9 (tol 0.036 V)", + "thd_pct=44.53 above floor 3", + "out_swing=0 below floor 0.45" + ], + "spec": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 8401000.0 + }, + "out_swing": { + "min": 0.45 + }, + "_frozen_from": { + "schematic": { + "thd_pct": 44.5327, + "iq": 1.494627e-05, + "f3db": 14001530.0, + "out_swing": 0.0 + }, + "floors": { + "thd_pct": { + "max": 3.0 + }, + "iq": { + "max": 0.0003 + }, + "f3db": { + "min": 5000000.0 + }, + "out_swing": { + "min": 0.45 + } + }, + "rule": "textbook_sharing.qualify v1" + } + } + }, + "presim_status": "passed", + "presim_errors": [], + "schematic_measures": { + "vout0": 1.008435, + "vin0": 1.04, + "iq": 1.494627e-05, + "gain_lf": -47.51454, + "f3db": 14001530.0, + "gmid": 0.004209937, + "vo_a": 1.007928, + "vo_b": 1.007928, + "out_swing": 0.0, + "vamp2": 0.3, + "thd_pct": 44.5327 + }, + "presim_s": 11.9 + } +] \ No newline at end of file diff --git a/benchmarks/textbook_sharing/results/count_ledger.json b/benchmarks/textbook_sharing/results/count_ledger.json new file mode 100644 index 00000000..2c837bdd --- /dev/null +++ b/benchmarks/textbook_sharing/results/count_ledger.json @@ -0,0 +1,3193 @@ +{ + "cases": { + "requested": 648, + "parameter_illegal": 9, + "duplicate": 0, + "distinct_legal": 639, + "schematic_not_qualified": 88, + "qualified": 551, + "reference": { + "auto_passed": 547, + "spec_failed": 4 + }, + "formal_entries": 547, + "diagnostic": 101, + "mode_rows": { + "total": 2204, + "by_status": { + "auto_passed": 1608, + "NA": 592, + "spec_failed": 4 + }, + "by_mode": { + "independent": { + "auto_passed": 547, + "spec_failed": 4 + }, + "diffusion_only": { + "auto_passed": 419, + "NA": 132 + }, + "gate_only": { + "auto_passed": 321, + "NA": 230 + }, + "combined": { + "auto_passed": 321, + "NA": 230 + } + }, + "geometry_identical_pairs": {} + }, + "visual_review_main_grid": { + "all_kept_gds": { + "pass": 1594, + "suspicious(resolved_ok)": 18 + }, + "auto_passed_gds": { + "pass": 1590, + "suspicious(resolved_ok)": 18 + } + } + }, + "formal_entries": [ + "C01_gf180_sW0.5_sL1", + "C01_gf180_sW0.5_sL1.5", + "C01_gf180_sW0.5_sL2", + "C01_gf180_sW1.5_sL1", + "C01_gf180_sW1.5_sL1.5", + "C01_gf180_sW1.5_sL2", + "C01_gf180_sW1_sL1", + "C01_gf180_sW1_sL1.5", + "C01_gf180_sW1_sL2", + "C01_gf180_sW2_sL1", + "C01_gf180_sW2_sL1.5", + "C01_gf180_sW2_sL2", + "C01_ihp130_sW0.5_sL1", + "C01_ihp130_sW0.5_sL1.5", + "C01_ihp130_sW0.5_sL2", + "C01_ihp130_sW1.5_sL2", + "C01_ihp130_sW1_sL1.5", + "C01_ihp130_sW1_sL2", + "C01_ihp130_sW2_sL2", + "C01_sky130_sW0.5_sL1", + "C01_sky130_sW0.5_sL1.5", + "C01_sky130_sW0.5_sL2", + "C01_sky130_sW1.5_sL1", + "C01_sky130_sW1.5_sL1.5", + "C01_sky130_sW1.5_sL2", + "C01_sky130_sW1_sL1", + "C01_sky130_sW1_sL1.5", + "C01_sky130_sW1_sL2", + "C01_sky130_sW2_sL1", + "C01_sky130_sW2_sL1.5", + "C01_sky130_sW2_sL2", + "C02_gf180_sW0.5_sL1", + "C02_gf180_sW0.5_sL1.5", + "C02_gf180_sW0.5_sL2", + "C02_gf180_sW1.5_sL1", + "C02_gf180_sW1.5_sL1.5", + "C02_gf180_sW1.5_sL2", + "C02_gf180_sW1_sL1", + "C02_gf180_sW1_sL1.5", + "C02_gf180_sW1_sL2", + "C02_gf180_sW2_sL1", + "C02_gf180_sW2_sL1.5", + "C02_gf180_sW2_sL2", + "C02_ihp130_sW0.5_sL1", + "C02_ihp130_sW0.5_sL1.5", + "C02_ihp130_sW0.5_sL2", + "C02_ihp130_sW1.5_sL1", + "C02_ihp130_sW1.5_sL1.5", + "C02_ihp130_sW1.5_sL2", + "C02_ihp130_sW1_sL1", + "C02_ihp130_sW1_sL1.5", + "C02_ihp130_sW1_sL2", + "C02_ihp130_sW2_sL1", + "C02_ihp130_sW2_sL1.5", + "C02_ihp130_sW2_sL2", + "C02_sky130_sW0.5_sL1", + "C02_sky130_sW0.5_sL1.5", + "C02_sky130_sW0.5_sL2", + "C02_sky130_sW1.5_sL1", + "C02_sky130_sW1.5_sL1.5", + "C02_sky130_sW1.5_sL2", + "C02_sky130_sW1_sL1", + "C02_sky130_sW1_sL1.5", + "C02_sky130_sW1_sL2", + "C02_sky130_sW2_sL1", + "C02_sky130_sW2_sL1.5", + "C02_sky130_sW2_sL2", + "C03_gf180_sW0.5_sL1", + "C03_gf180_sW0.5_sL1.5", + "C03_gf180_sW0.5_sL2", + "C03_gf180_sW1.5_sL1", + "C03_gf180_sW1.5_sL1.5", + "C03_gf180_sW1.5_sL2", + "C03_gf180_sW1_sL1", + "C03_gf180_sW1_sL1.5", + "C03_gf180_sW1_sL2", + "C03_gf180_sW2_sL1", + "C03_gf180_sW2_sL1.5", + "C03_gf180_sW2_sL2", + "C03_ihp130_sW0.5_sL1", + "C03_ihp130_sW0.5_sL1.5", + "C03_ihp130_sW1.5_sL1", + "C03_ihp130_sW1.5_sL1.5", + "C03_ihp130_sW1.5_sL2", + "C03_ihp130_sW1_sL1", + "C03_ihp130_sW1_sL1.5", + "C03_ihp130_sW1_sL2", + "C03_ihp130_sW2_sL1", + "C03_ihp130_sW2_sL1.5", + "C03_ihp130_sW2_sL2", + "C03_sky130_sW0.5_sL1", + "C03_sky130_sW0.5_sL1.5", + "C03_sky130_sW0.5_sL2", + "C03_sky130_sW1.5_sL1", + "C03_sky130_sW1.5_sL1.5", + "C03_sky130_sW1.5_sL2", + "C03_sky130_sW1_sL1", + "C03_sky130_sW1_sL1.5", + "C03_sky130_sW1_sL2", + "C03_sky130_sW2_sL1", + "C03_sky130_sW2_sL1.5", + "C03_sky130_sW2_sL2", + "C04_gf180_sW0.5_sL1", + "C04_gf180_sW0.5_sL1.5", + "C04_gf180_sW1.5_sL1", + "C04_gf180_sW1.5_sL1.5", + "C04_gf180_sW1_sL1", + "C04_gf180_sW1_sL1.5", + "C04_gf180_sW2_sL1", + "C04_gf180_sW2_sL1.5", + "C04_ihp130_sW0.5_sL1", + "C04_ihp130_sW0.5_sL1.5", + "C04_ihp130_sW0.5_sL2", + "C04_ihp130_sW1.5_sL1", + "C04_ihp130_sW1.5_sL1.5", + "C04_ihp130_sW1.5_sL2", + "C04_ihp130_sW1_sL1", + "C04_ihp130_sW1_sL1.5", + "C04_ihp130_sW1_sL2", + "C04_ihp130_sW2_sL1", + "C04_ihp130_sW2_sL1.5", + "C04_ihp130_sW2_sL2", + "C04_sky130_sW0.5_sL1", + "C04_sky130_sW0.5_sL1.5", + "C04_sky130_sW0.5_sL2", + "C04_sky130_sW1.5_sL1", + "C04_sky130_sW1.5_sL1.5", + "C04_sky130_sW1.5_sL2", + "C04_sky130_sW1_sL1", + "C04_sky130_sW1_sL1.5", + "C04_sky130_sW1_sL2", + "C04_sky130_sW2_sL1", + "C04_sky130_sW2_sL1.5", + "C04_sky130_sW2_sL2", + "C05_gf180_sW0.5_sL1", + "C05_gf180_sW0.5_sL1.5", + "C05_gf180_sW1.5_sL1", + "C05_gf180_sW1.5_sL1.5", + "C05_gf180_sW1.5_sL2", + "C05_gf180_sW1_sL1", + "C05_gf180_sW1_sL1.5", + "C05_gf180_sW1_sL2", + "C05_gf180_sW2_sL1", + "C05_gf180_sW2_sL1.5", + "C05_gf180_sW2_sL2", + "C05_ihp130_sW0.5_sL1", + "C05_ihp130_sW0.5_sL1.5", + "C05_ihp130_sW0.5_sL2", + "C05_ihp130_sW1.5_sL1", + "C05_ihp130_sW1.5_sL1.5", + "C05_ihp130_sW1.5_sL2", + "C05_ihp130_sW1_sL1", + "C05_ihp130_sW1_sL1.5", + "C05_ihp130_sW1_sL2", + "C05_ihp130_sW2_sL1", + "C05_ihp130_sW2_sL1.5", + "C05_ihp130_sW2_sL2", + "C05_sky130_sW0.5_sL1", + "C05_sky130_sW0.5_sL1.5", + "C05_sky130_sW0.5_sL2", + "C05_sky130_sW1.5_sL1", + "C05_sky130_sW1.5_sL1.5", + "C05_sky130_sW1.5_sL2", + "C05_sky130_sW1_sL1", + "C05_sky130_sW1_sL1.5", + "C05_sky130_sW1_sL2", + "C05_sky130_sW2_sL1", + "C05_sky130_sW2_sL1.5", + "C05_sky130_sW2_sL2", + "C06_gf180_sW0.5_sL1", + "C06_gf180_sW0.5_sL1.5", + "C06_gf180_sW0.5_sL2", + "C06_gf180_sW1.5_sL1", + "C06_gf180_sW1.5_sL1.5", + "C06_gf180_sW1.5_sL2", + "C06_gf180_sW1_sL1", + "C06_gf180_sW1_sL1.5", + "C06_gf180_sW1_sL2", + "C06_gf180_sW2_sL1", + "C06_gf180_sW2_sL1.5", + "C06_gf180_sW2_sL2", + "C06_ihp130_sW0.5_sL1", + "C06_ihp130_sW0.5_sL1.5", + "C06_ihp130_sW0.5_sL2", + "C06_ihp130_sW1.5_sL1", + "C06_ihp130_sW1.5_sL1.5", + "C06_ihp130_sW1.5_sL2", + "C06_ihp130_sW1_sL1", + "C06_ihp130_sW1_sL1.5", + "C06_ihp130_sW1_sL2", + "C06_ihp130_sW2_sL1", + "C06_ihp130_sW2_sL1.5", + "C06_ihp130_sW2_sL2", + "C06_sky130_sW0.5_sL1", + "C06_sky130_sW0.5_sL1.5", + "C06_sky130_sW1.5_sL1.5", + "C06_sky130_sW1.5_sL2", + "C06_sky130_sW1_sL1", + "C06_sky130_sW1_sL1.5", + "C06_sky130_sW1_sL2", + "C07_gf180_sW0.5_sL1", + "C07_gf180_sW0.5_sL1.5", + "C07_gf180_sW0.5_sL2", + "C07_gf180_sW1.5_sL1", + "C07_gf180_sW1.5_sL1.5", + "C07_gf180_sW1.5_sL2", + "C07_gf180_sW1_sL1", + "C07_gf180_sW1_sL1.5", + "C07_gf180_sW1_sL2", + "C07_gf180_sW2_sL1", + "C07_gf180_sW2_sL1.5", + "C07_gf180_sW2_sL2", + "C07_ihp130_sW0.5_sL1", + "C07_ihp130_sW0.5_sL1.5", + "C07_ihp130_sW0.5_sL2", + "C07_ihp130_sW1.5_sL1", + "C07_ihp130_sW1.5_sL1.5", + "C07_ihp130_sW1.5_sL2", + "C07_ihp130_sW1_sL1", + "C07_ihp130_sW1_sL1.5", + "C07_ihp130_sW1_sL2", + "C07_ihp130_sW2_sL1", + "C07_ihp130_sW2_sL1.5", + "C07_ihp130_sW2_sL2", + "C07_sky130_sW0.5_sL1", + "C07_sky130_sW0.5_sL1.5", + "C07_sky130_sW0.5_sL2", + "C07_sky130_sW1.5_sL1", + "C07_sky130_sW1.5_sL1.5", + "C07_sky130_sW1.5_sL2", + "C07_sky130_sW1_sL1", + "C07_sky130_sW1_sL1.5", + "C07_sky130_sW1_sL2", + "C07_sky130_sW2_sL1", + "C07_sky130_sW2_sL1.5", + "C07_sky130_sW2_sL2", + "C08_gf180_sW0.5_sL1", + "C08_gf180_sW0.5_sL1.5", + "C08_gf180_sW0.5_sL2", + "C08_gf180_sW1.5_sL1", + "C08_gf180_sW1.5_sL1.5", + "C08_gf180_sW1.5_sL2", + "C08_gf180_sW1_sL1", + "C08_gf180_sW1_sL1.5", + "C08_gf180_sW1_sL2", + "C08_gf180_sW2_sL1", + "C08_gf180_sW2_sL1.5", + "C08_gf180_sW2_sL2", + "C08_ihp130_sW0.5_sL1.5", + "C08_ihp130_sW0.5_sL2", + "C08_ihp130_sW1.5_sL1", + "C08_ihp130_sW1.5_sL1.5", + "C08_ihp130_sW1.5_sL2", + "C08_ihp130_sW1_sL1", + "C08_ihp130_sW1_sL1.5", + "C08_ihp130_sW1_sL2", + "C08_ihp130_sW2_sL1.5", + "C08_ihp130_sW2_sL2", + "C08_sky130_sW0.5_sL1", + "C08_sky130_sW0.5_sL1.5", + "C08_sky130_sW0.5_sL2", + "C08_sky130_sW1.5_sL1", + "C08_sky130_sW1.5_sL1.5", + "C08_sky130_sW1.5_sL2", + "C08_sky130_sW1_sL1", + "C08_sky130_sW1_sL1.5", + "C08_sky130_sW1_sL2", + "C08_sky130_sW2_sL1", + "C08_sky130_sW2_sL1.5", + "C08_sky130_sW2_sL2", + "C09_gf180_sW1.5_sL1", + "C09_gf180_sW1.5_sL1.5", + "C09_gf180_sW1.5_sL2", + "C09_gf180_sW1_sL1", + "C09_gf180_sW1_sL1.5", + "C09_gf180_sW2_sL1", + "C09_gf180_sW2_sL1.5", + "C09_gf180_sW2_sL2", + "C09_ihp130_sW0.5_sL1", + "C09_ihp130_sW0.5_sL1.5", + "C09_ihp130_sW0.5_sL2", + "C09_ihp130_sW1.5_sL1", + "C09_ihp130_sW1.5_sL1.5", + "C09_ihp130_sW1.5_sL2", + "C09_ihp130_sW1_sL1", + "C09_ihp130_sW1_sL1.5", + "C09_ihp130_sW1_sL2", + "C09_ihp130_sW2_sL1", + "C09_ihp130_sW2_sL1.5", + "C09_ihp130_sW2_sL2", + "C09_sky130_sW1.5_sL1", + "C09_sky130_sW1_sL1", + "C09_sky130_sW2_sL1", + "C10_gf180_sW0.5_sL1", + "C10_gf180_sW0.5_sL1.5", + "C10_gf180_sW0.5_sL2", + "C10_gf180_sW1.5_sL1", + "C10_gf180_sW1.5_sL1.5", + "C10_gf180_sW1.5_sL2", + "C10_gf180_sW1_sL1", + "C10_gf180_sW1_sL1.5", + "C10_gf180_sW1_sL2", + "C10_gf180_sW2_sL1", + "C10_gf180_sW2_sL1.5", + "C10_gf180_sW2_sL2", + "C10_ihp130_sW1.5_sL1", + "C10_ihp130_sW1.5_sL1.5", + "C10_ihp130_sW1.5_sL2", + "C10_ihp130_sW1_sL1", + "C10_ihp130_sW2_sL1", + "C10_ihp130_sW2_sL1.5", + "C10_ihp130_sW2_sL2", + "C10_sky130_sW1.5_sL1", + "C10_sky130_sW1.5_sL1.5", + "C10_sky130_sW1.5_sL2", + "C10_sky130_sW1_sL1", + "C10_sky130_sW1_sL1.5", + "C10_sky130_sW2_sL1", + "C10_sky130_sW2_sL1.5", + "C10_sky130_sW2_sL2", + "C11_gf180_sW0.5_sL1", + "C11_gf180_sW0.5_sL1.5", + "C11_gf180_sW0.5_sL2", + "C11_gf180_sW1.5_sL1", + "C11_gf180_sW1.5_sL1.5", + "C11_gf180_sW1.5_sL2", + "C11_gf180_sW1_sL1", + "C11_gf180_sW1_sL1.5", + "C11_gf180_sW1_sL2", + "C11_gf180_sW2_sL1", + "C11_gf180_sW2_sL1.5", + "C11_gf180_sW2_sL2", + "C11_ihp130_sW0.5_sL1", + "C11_ihp130_sW0.5_sL1.5", + "C11_ihp130_sW0.5_sL2", + "C11_ihp130_sW1.5_sL1", + "C11_ihp130_sW1.5_sL1.5", + "C11_ihp130_sW1.5_sL2", + "C11_ihp130_sW1_sL1", + "C11_ihp130_sW1_sL1.5", + "C11_ihp130_sW1_sL2", + "C11_ihp130_sW2_sL1", + "C11_ihp130_sW2_sL1.5", + "C11_ihp130_sW2_sL2", + "C11_sky130_sW0.5_sL1", + "C11_sky130_sW0.5_sL1.5", + "C11_sky130_sW0.5_sL2", + "C11_sky130_sW1.5_sL1", + "C11_sky130_sW1.5_sL1.5", + "C11_sky130_sW1.5_sL2", + "C11_sky130_sW1_sL1", + "C11_sky130_sW1_sL1.5", + "C11_sky130_sW1_sL2", + "C11_sky130_sW2_sL1", + "C11_sky130_sW2_sL1.5", + "C11_sky130_sW2_sL2", + "C12_gf180_sW0.5_sL1", + "C12_gf180_sW0.5_sL1.5", + "C12_gf180_sW0.5_sL2", + "C12_gf180_sW1.5_sL1", + "C12_gf180_sW1.5_sL1.5", + "C12_gf180_sW1.5_sL2", + "C12_gf180_sW1_sL1", + "C12_gf180_sW1_sL1.5", + "C12_gf180_sW1_sL2", + "C12_gf180_sW2_sL1", + "C12_gf180_sW2_sL1.5", + "C12_gf180_sW2_sL2", + "C12_ihp130_sW0.5_sL1", + "C12_ihp130_sW0.5_sL1.5", + "C12_ihp130_sW0.5_sL2", + "C12_ihp130_sW1.5_sL1", + "C12_ihp130_sW1.5_sL1.5", + "C12_ihp130_sW1.5_sL2", + "C12_ihp130_sW1_sL1", + "C12_ihp130_sW1_sL1.5", + "C12_ihp130_sW1_sL2", + "C12_ihp130_sW2_sL1", + "C12_ihp130_sW2_sL1.5", + "C12_ihp130_sW2_sL2", + "C12_sky130_sW0.5_sL1", + "C12_sky130_sW0.5_sL1.5", + "C12_sky130_sW1.5_sL1", + "C12_sky130_sW1.5_sL1.5", + "C12_sky130_sW1.5_sL2", + "C12_sky130_sW1_sL1", + "C12_sky130_sW1_sL1.5", + "C12_sky130_sW1_sL2", + "C12_sky130_sW2_sL1", + "C12_sky130_sW2_sL1.5", + "C12_sky130_sW2_sL2", + "C13_gf180_sW1.5_sL1", + "C13_gf180_sW1.5_sL1.5", + "C13_gf180_sW1.5_sL2", + "C13_gf180_sW1_sL1", + "C13_gf180_sW1_sL1.5", + "C13_gf180_sW1_sL2", + "C13_gf180_sW2_sL1", + "C13_gf180_sW2_sL1.5", + "C13_gf180_sW2_sL2", + "C13_ihp130_sW1.5_sL1", + "C13_ihp130_sW1.5_sL1.5", + "C13_ihp130_sW1.5_sL2", + "C13_ihp130_sW1_sL1", + "C13_ihp130_sW1_sL1.5", + "C13_ihp130_sW1_sL2", + "C13_ihp130_sW2_sL1", + "C13_ihp130_sW2_sL1.5", + "C13_ihp130_sW2_sL2", + "C13_sky130_sW1.5_sL1", + "C13_sky130_sW1.5_sL1.5", + "C13_sky130_sW1.5_sL2", + "C13_sky130_sW1_sL1", + "C13_sky130_sW1_sL1.5", + "C13_sky130_sW1_sL2", + "C13_sky130_sW2_sL1", + "C13_sky130_sW2_sL1.5", + "C13_sky130_sW2_sL2", + "C14_gf180_sW0.5_sL1", + "C14_gf180_sW0.5_sL1.5", + "C14_gf180_sW0.5_sL2", + "C14_gf180_sW1.5_sL1", + "C14_gf180_sW1.5_sL1.5", + "C14_gf180_sW1.5_sL2", + "C14_gf180_sW1_sL1", + "C14_gf180_sW1_sL1.5", + "C14_gf180_sW1_sL2", + "C14_gf180_sW2_sL1", + "C14_gf180_sW2_sL1.5", + "C14_gf180_sW2_sL2", + "C14_ihp130_sW0.5_sL1", + "C14_ihp130_sW0.5_sL1.5", + "C14_ihp130_sW0.5_sL2", + "C14_ihp130_sW1.5_sL1", + "C14_ihp130_sW1.5_sL1.5", + "C14_ihp130_sW1.5_sL2", + "C14_ihp130_sW1_sL1", + "C14_ihp130_sW1_sL1.5", + "C14_ihp130_sW1_sL2", + "C14_ihp130_sW2_sL1", + "C14_ihp130_sW2_sL1.5", + "C14_ihp130_sW2_sL2", + "C14_sky130_sW0.5_sL1", + "C14_sky130_sW0.5_sL1.5", + "C14_sky130_sW0.5_sL2", + "C14_sky130_sW1.5_sL1", + "C14_sky130_sW1.5_sL1.5", + "C14_sky130_sW1.5_sL2", + "C14_sky130_sW1_sL1", + "C14_sky130_sW1_sL1.5", + "C14_sky130_sW1_sL2", + "C14_sky130_sW2_sL1", + "C14_sky130_sW2_sL1.5", + "C14_sky130_sW2_sL2", + "C15_gf180_sW0.5_sL1", + "C15_gf180_sW1.5_sL1", + "C15_gf180_sW1.5_sL1.5", + "C15_gf180_sW1.5_sL2", + "C15_gf180_sW1_sL1", + "C15_gf180_sW1_sL1.5", + "C15_gf180_sW1_sL2", + "C15_gf180_sW2_sL1", + "C15_gf180_sW2_sL1.5", + "C15_gf180_sW2_sL2", + "C15_ihp130_sW0.5_sL1", + "C15_ihp130_sW0.5_sL1.5", + "C15_ihp130_sW1.5_sL1", + "C15_ihp130_sW1.5_sL1.5", + "C15_ihp130_sW1.5_sL2", + "C15_ihp130_sW1_sL1", + "C15_ihp130_sW1_sL1.5", + "C15_ihp130_sW1_sL2", + "C15_ihp130_sW2_sL1", + "C15_ihp130_sW2_sL1.5", + "C15_ihp130_sW2_sL2", + "C15_sky130_sW0.5_sL1", + "C15_sky130_sW0.5_sL1.5", + "C15_sky130_sW0.5_sL2", + "C15_sky130_sW1.5_sL1", + "C15_sky130_sW1.5_sL1.5", + "C15_sky130_sW1.5_sL2", + "C15_sky130_sW1_sL1", + "C15_sky130_sW1_sL1.5", + "C15_sky130_sW1_sL2", + "C15_sky130_sW2_sL1", + "C15_sky130_sW2_sL1.5", + "C15_sky130_sW2_sL2", + "C16_gf180_sW0.5_sL1", + "C16_gf180_sW1.5_sL1", + "C16_gf180_sW1.5_sL1.5", + "C16_gf180_sW1.5_sL2", + "C16_gf180_sW1_sL1", + "C16_gf180_sW1_sL1.5", + "C16_gf180_sW1_sL2", + "C16_gf180_sW2_sL1", + "C16_gf180_sW2_sL1.5", + "C16_gf180_sW2_sL2", + "C16_ihp130_sW0.5_sL1", + "C16_ihp130_sW1.5_sL1", + "C16_ihp130_sW1.5_sL1.5", + "C16_ihp130_sW1.5_sL2", + "C16_ihp130_sW1_sL1", + "C16_ihp130_sW1_sL1.5", + "C16_ihp130_sW1_sL2", + "C16_ihp130_sW2_sL1", + "C16_ihp130_sW2_sL1.5", + "C16_ihp130_sW2_sL2", + "C16_sky130_sW0.5_sL1", + "C16_sky130_sW0.5_sL1.5", + "C16_sky130_sW0.5_sL2", + "C16_sky130_sW1.5_sL1", + "C16_sky130_sW1.5_sL1.5", + "C16_sky130_sW1.5_sL2", + "C16_sky130_sW1_sL1", + "C16_sky130_sW1_sL1.5", + "C16_sky130_sW1_sL2", + "C16_sky130_sW2_sL1", + "C16_sky130_sW2_sL1.5", + "C16_sky130_sW2_sL2", + "C17_gf180_sW0.5_sL1", + "C17_gf180_sW1.5_sL1", + "C17_gf180_sW1.5_sL1.5", + "C17_gf180_sW1.5_sL2", + "C17_gf180_sW1_sL1", + "C17_gf180_sW1_sL1.5", + "C17_gf180_sW2_sL1", + "C17_gf180_sW2_sL1.5", + "C17_gf180_sW2_sL2", + "C17_ihp130_sW1.5_sL1", + "C17_ihp130_sW1.5_sL1.5", + "C17_ihp130_sW1.5_sL2", + "C17_ihp130_sW1_sL1", + "C17_ihp130_sW1_sL1.5", + "C17_ihp130_sW1_sL2", + "C17_ihp130_sW2_sL1", + "C17_ihp130_sW2_sL1.5", + "C17_ihp130_sW2_sL2", + "C17_sky130_sW0.5_sL1", + "C17_sky130_sW1.5_sL1", + "C17_sky130_sW1.5_sL1.5", + "C17_sky130_sW1.5_sL2", + "C17_sky130_sW1_sL1", + "C17_sky130_sW1_sL1.5", + "C17_sky130_sW1_sL2", + "C17_sky130_sW2_sL1", + "C17_sky130_sW2_sL1.5", + "C17_sky130_sW2_sL2" + ], + "diagnostic": [ + { + "case_id": "C01_ihp130_sW1.5_sL1", + "reason": "schematic_not_qualified", + "detail": "|err|=0.07675 above floor 0.05" + }, + { + "case_id": "C01_ihp130_sW1.5_sL1.5", + "reason": "schematic_not_qualified", + "detail": "|err|=0.05134 above floor 0.05" + }, + { + "case_id": "C01_ihp130_sW1_sL1", + "reason": "schematic_not_qualified", + "detail": "|err|=0.05651 above floor 0.05" + }, + { + "case_id": "C01_ihp130_sW2_sL1", + "reason": "schematic_not_qualified", + "detail": "|err|=0.09228 above floor 0.05" + }, + { + "case_id": "C01_ihp130_sW2_sL1.5", + "reason": "schematic_not_qualified", + "detail": "|err|=0.06344 above floor 0.05" + }, + { + "case_id": "C03_ihp130_sW0.5_sL2", + "reason": "schematic_not_qualified", + "detail": "vmin=0.7801 above floor 0.78" + }, + { + "case_id": "C04_gf180_sW0.5_sL2", + "reason": "schematic_not_qualified", + "detail": "f3db=9.953e+05 below floor 1e+06" + }, + { + "case_id": "C04_gf180_sW1.5_sL2", + "reason": "reference_spec_failed" + }, + { + "case_id": "C04_gf180_sW1_sL2", + "reason": "reference_spec_failed" + }, + { + "case_id": "C04_gf180_sW2_sL2", + "reason": "reference_spec_failed" + }, + { + "case_id": "C05_gf180_sW0.5_sL2", + "reason": "schematic_not_qualified", + "detail": "gain_at_nom=0.5874 below floor 0.6" + }, + { + "case_id": "C06_sky130_sW0.5_sL2", + "reason": "schematic_not_qualified", + "detail": "gain_lf=27.82 below floor 30" + }, + { + "case_id": "C06_sky130_sW1.5_sL1", + "reason": "schematic_not_qualified", + "detail": "gain_lf=28.66 below floor 30" + }, + { + "case_id": "C06_sky130_sW2_sL1", + "reason": "schematic_not_qualified", + "detail": "gain_lf=24.89 below floor 30" + }, + { + "case_id": "C06_sky130_sW2_sL1.5", + "reason": "schematic_not_qualified", + "detail": "gain_lf=28.59 below floor 30" + }, + { + "case_id": "C06_sky130_sW2_sL2", + "reason": "schematic_not_qualified", + "detail": "gain_lf=29.84 below floor 30" + }, + { + "case_id": "C08_ihp130_sW0.5_sL1", + "reason": "schematic_not_qualified", + "detail": "gain_lf=24.93 below floor 25" + }, + { + "case_id": "C08_ihp130_sW2_sL1", + "reason": "schematic_not_qualified", + "detail": "gain_lf=24.94 below floor 25" + }, + { + "case_id": "C09_gf180_sW0.5_sL1", + "reason": "schematic_not_qualified", + "detail": "gain_lf=33 below floor 35; ugf=1.153e+06 below floor 2e+06" + }, + { + "case_id": "C09_gf180_sW0.5_sL1.5", + "reason": "schematic_not_qualified", + "detail": "servo did not reach the output target: vout0=-0.238433 target=1.485 (tol 0.066 V); gain_lf=-26.09 below floor 35; ugf: not measurable in the schematic" + }, + { + "case_id": "C09_gf180_sW0.5_sL2", + "reason": "schematic_not_qualified", + "detail": "servo did not reach the output target: vout0=-0.565526 target=1.485 (tol 0.066 V); gain_lf=-37.12 below floor 35; ugf: not measurable in the schematic" + }, + { + "case_id": "C09_gf180_sW1_sL2", + "reason": "schematic_not_qualified", + "detail": "ugf=7.508e+05 below floor 2e+06" + }, + { + "case_id": "C09_sky130_sW0.5_sL1", + "reason": "schematic_not_qualified", + "detail": "gain_lf=22.39 below floor 35; ugf=8.161e+05 below floor 2e+06" + }, + { + "case_id": "C09_sky130_sW0.5_sL1.5", + "reason": "schematic_not_qualified", + "detail": "gain_lf=8.451 below floor 35; ugf=2.38e+05 below floor 2e+06" + }, + { + "case_id": "C09_sky130_sW0.5_sL2", + "reason": "schematic_not_qualified", + "detail": "servo did not reach the output target: vout0=-0.378581 target=0.81 (tol 0.036 V); gain_lf=-32.29 below floor 35; ugf: not measurable in the schematic" + }, + { + "case_id": "C09_sky130_sW1.5_sL1.5", + "reason": "schematic_not_qualified", + "detail": "gain_lf=32.13 below floor 35; ugf=8.883e+05 below floor 2e+06" + }, + { + "case_id": "C09_sky130_sW1.5_sL2", + "reason": "schematic_not_qualified", + "detail": "gain_lf=20.24 below floor 35; ugf=3.812e+05 below floor 2e+06" + }, + { + "case_id": "C09_sky130_sW1_sL1.5", + "reason": "schematic_not_qualified", + "detail": "gain_lf=19.7 below floor 35; ugf=4.845e+05 below floor 2e+06" + }, + { + "case_id": "C09_sky130_sW1_sL2", + "reason": "schematic_not_qualified", + "detail": "gain_lf=13.57 below floor 35; ugf=2.635e+05 below floor 2e+06" + }, + { + "case_id": "C09_sky130_sW2_sL1.5", + "reason": "schematic_not_qualified", + "detail": "ugf=1.549e+06 below floor 2e+06" + }, + { + "case_id": "C09_sky130_sW2_sL2", + "reason": "schematic_not_qualified", + "detail": "gain_lf=27.56 below floor 35; ugf=5.326e+05 below floor 2e+06" + }, + { + "case_id": "C10_ihp130_sW0.5_sL1", + "reason": "schematic_not_qualified", + "detail": "gain_lf=30.08 below floor 35" + }, + { + "case_id": "C10_ihp130_sW0.5_sL1.5", + "reason": "schematic_not_qualified", + "detail": "gain_lf=27.28 below floor 35" + }, + { + "case_id": "C10_ihp130_sW0.5_sL2", + "reason": "schematic_not_qualified", + "detail": "gain_lf=21.41 below floor 35" + }, + { + "case_id": "C10_ihp130_sW1_sL1.5", + "reason": "schematic_not_qualified", + "detail": "gain_lf=34.19 below floor 35" + }, + { + "case_id": "C10_ihp130_sW1_sL2", + "reason": "schematic_not_qualified", + "detail": "gain_lf=33.42 below floor 35" + }, + { + "case_id": "C10_sky130_sW0.5_sL1", + "reason": "schematic_not_qualified", + "detail": "gain_lf=31.79 below floor 35" + }, + { + "case_id": "C10_sky130_sW0.5_sL1.5", + "reason": "schematic_not_qualified", + "detail": "gain_lf=28.3 below floor 35" + }, + { + "case_id": "C10_sky130_sW0.5_sL2", + "reason": "schematic_not_qualified", + "detail": "gain_lf=24.99 below floor 35" + }, + { + "case_id": "C10_sky130_sW1_sL2", + "reason": "schematic_not_qualified", + "detail": "gain_lf=33.8 below floor 35" + }, + { + "case_id": "C12_sky130_sW0.5_sL2", + "reason": "schematic_not_qualified", + "detail": "f3db=9.794e+05 below floor 1e+06" + }, + { + "case_id": "C13_gf180_sW0.5_sL1", + "reason": "parameter_illegal", + "detail": "unit finger width 0.25 um of M1 below the gf180 minimum 0.36 um" + }, + { + "case_id": "C13_gf180_sW0.5_sL1.5", + "reason": "parameter_illegal", + "detail": "unit finger width 0.25 um of M1 below the gf180 minimum 0.36 um" + }, + { + "case_id": "C13_gf180_sW0.5_sL2", + "reason": "parameter_illegal", + "detail": "unit finger width 0.25 um of M1 below the gf180 minimum 0.36 um" + }, + { + "case_id": "C13_ihp130_sW0.5_sL1", + "reason": "parameter_illegal", + "detail": "unit finger width 0.25 um of M1 below the ihp130 minimum 0.3 um" + }, + { + "case_id": "C13_ihp130_sW0.5_sL1.5", + "reason": "parameter_illegal", + "detail": "unit finger width 0.25 um of M1 below the ihp130 minimum 0.3 um" + }, + { + "case_id": "C13_ihp130_sW0.5_sL2", + "reason": "parameter_illegal", + "detail": "unit finger width 0.25 um of M1 below the ihp130 minimum 0.3 um" + }, + { + "case_id": "C13_sky130_sW0.5_sL1", + "reason": "parameter_illegal", + "detail": "unit finger width 0.25 um of M1 below the sky130 minimum 0.29 um" + }, + { + "case_id": "C13_sky130_sW0.5_sL1.5", + "reason": "parameter_illegal", + "detail": "unit finger width 0.25 um of M1 below the sky130 minimum 0.29 um" + }, + { + "case_id": "C13_sky130_sW0.5_sL2", + "reason": "parameter_illegal", + "detail": "unit finger width 0.25 um of M1 below the sky130 minimum 0.29 um" + }, + { + "case_id": "C15_gf180_sW0.5_sL1.5", + "reason": "schematic_not_qualified", + "detail": "gain_lf=7.201 below floor 8" + }, + { + "case_id": "C15_gf180_sW0.5_sL2", + "reason": "schematic_not_qualified", + "detail": "gain_lf=5.973 below floor 8" + }, + { + "case_id": "C15_ihp130_sW0.5_sL2", + "reason": "schematic_not_qualified", + "detail": "gain_lf=7.377 below floor 8" + }, + { + "case_id": "C16_gf180_sW0.5_sL1.5", + "reason": "schematic_not_qualified", + "detail": "gain_lf=6.852 below floor 8" + }, + { + "case_id": "C16_gf180_sW0.5_sL2", + "reason": "schematic_not_qualified", + "detail": "gain_lf=5.577 below floor 8" + }, + { + "case_id": "C16_ihp130_sW0.5_sL1.5", + "reason": "schematic_not_qualified", + "detail": "gain_lf=7.371 below floor 8" + }, + { + "case_id": "C16_ihp130_sW0.5_sL2", + "reason": "schematic_not_qualified", + "detail": "gain_lf=6.721 below floor 8" + }, + { + "case_id": "C17_gf180_sW0.5_sL1.5", + "reason": "schematic_not_qualified", + "detail": "gain_lf=4.396 below floor 6" + }, + { + "case_id": "C17_gf180_sW0.5_sL2", + "reason": "schematic_not_qualified", + "detail": "gain_lf=3.003 below floor 6" + }, + { + "case_id": "C17_gf180_sW1_sL2", + "reason": "schematic_not_qualified", + "detail": "gain_lf=5.996 below floor 6" + }, + { + "case_id": "C17_ihp130_sW0.5_sL1", + "reason": "reference_spec_failed" + }, + { + "case_id": "C17_ihp130_sW0.5_sL1.5", + "reason": "schematic_not_qualified", + "detail": "gain_lf=5.942 below floor 6" + }, + { + "case_id": "C17_ihp130_sW0.5_sL2", + "reason": "schematic_not_qualified", + "detail": "gain_lf=5.469 below floor 6" + }, + { + "case_id": "C17_sky130_sW0.5_sL1.5", + "reason": "schematic_not_qualified", + "detail": "gain_lf=5.423 below floor 6" + }, + { + "case_id": "C17_sky130_sW0.5_sL2", + "reason": "schematic_not_qualified", + "detail": "gain_lf=4.267 below floor 6" + }, + { + "case_id": "C18_gf180_sW0.5_sL1", + "reason": "schematic_not_qualified", + "detail": "thd_pct=26.94 above floor 3; out_swing=0 below floor 0.825" + }, + { + "case_id": "C18_gf180_sW0.5_sL1.5", + "reason": "schematic_not_qualified", + "detail": "thd_pct=21.36 above floor 3; out_swing=0 below floor 0.825" + }, + { + "case_id": "C18_gf180_sW0.5_sL2", + "reason": "schematic_not_qualified", + "detail": "servo did not reach the output target: vout0=1.725938 target=1.65 (tol 0.066 V); thd_pct=20.72 above floor 3; out_swing=0 below floor 0.825" + }, + { + "case_id": "C18_gf180_sW1.5_sL1", + "reason": "schematic_not_qualified", + "detail": "thd_pct=28.89 above floor 3; out_swing=0.3135 below floor 0.825" + }, + { + "case_id": "C18_gf180_sW1.5_sL1.5", + "reason": "schematic_not_qualified", + "detail": "thd_pct=38.76 above floor 3; out_swing=0.4003 below floor 0.825" + }, + { + "case_id": "C18_gf180_sW1.5_sL2", + "reason": "schematic_not_qualified", + "detail": "thd_pct=33.01 above floor 3; out_swing=0 below floor 0.825" + }, + { + "case_id": "C18_gf180_sW1_sL1", + "reason": "schematic_not_qualified", + "detail": "thd_pct=32.9 above floor 3; out_swing=0.4151 below floor 0.825" + }, + { + "case_id": "C18_gf180_sW1_sL1.5", + "reason": "schematic_not_qualified", + "detail": "thd_pct=29.98 above floor 3; out_swing=0 below floor 0.825" + }, + { + "case_id": "C18_gf180_sW1_sL2", + "reason": "schematic_not_qualified", + "detail": "thd_pct=21.38 above floor 3; out_swing=0 below floor 0.825" + }, + { + "case_id": "C18_gf180_sW2_sL1", + "reason": "schematic_not_qualified", + "detail": "thd_pct=26.61 above floor 3; out_swing=0.2552 below floor 0.825" + }, + { + "case_id": "C18_gf180_sW2_sL1.5", + "reason": "schematic_not_qualified", + "detail": "thd_pct=33.43 above floor 3; out_swing=0.3971 below floor 0.825" + }, + { + "case_id": "C18_gf180_sW2_sL2", + "reason": "schematic_not_qualified", + "detail": "thd_pct=42.28 above floor 3; out_swing=0 below floor 0.825" + }, + { + "case_id": "C18_ihp130_sW0.5_sL1", + "reason": "schematic_not_qualified", + "detail": "thd_pct=54.68 above floor 3; out_swing=0 below floor 0.3" + }, + { + "case_id": "C18_ihp130_sW0.5_sL1.5", + "reason": "schematic_not_qualified", + "detail": "thd_pct=40.33 above floor 3; out_swing=0 below floor 0.3" + }, + { + "case_id": "C18_ihp130_sW0.5_sL2", + "reason": "schematic_not_qualified", + "detail": "thd_pct=36.63 above floor 3; out_swing=0 below floor 0.3" + }, + { + "case_id": "C18_ihp130_sW1.5_sL1", + "reason": "schematic_not_qualified", + "detail": "thd_pct=25.63 above floor 3; out_swing=0.1936 below floor 0.3" + }, + { + "case_id": "C18_ihp130_sW1.5_sL1.5", + "reason": "schematic_not_qualified", + "detail": "thd_pct=31.37 above floor 3; out_swing=0.228 below floor 0.3" + }, + { + "case_id": "C18_ihp130_sW1.5_sL2", + "reason": "schematic_not_qualified", + "detail": "thd_pct=34.67 above floor 3; out_swing=0.2387 below floor 0.3" + }, + { + "case_id": "C18_ihp130_sW1_sL1", + "reason": "schematic_not_qualified", + "detail": "thd_pct=31.41 above floor 3; out_swing=0.1982 below floor 0.3" + }, + { + "case_id": "C18_ihp130_sW1_sL1.5", + "reason": "schematic_not_qualified", + "detail": "thd_pct=39.25 above floor 3; out_swing=0.2183 below floor 0.3" + }, + { + "case_id": "C18_ihp130_sW1_sL2", + "reason": "schematic_not_qualified", + "detail": "thd_pct=56.22 above floor 3; out_swing=0 below floor 0.3" + }, + { + "case_id": "C18_ihp130_sW2_sL1", + "reason": "schematic_not_qualified", + "detail": "thd_pct=22.86 above floor 3; out_swing=0.1709 below floor 0.3" + }, + { + "case_id": "C18_ihp130_sW2_sL1.5", + "reason": "schematic_not_qualified", + "detail": "thd_pct=27.96 above floor 3; out_swing=0.2199 below floor 0.3" + }, + { + "case_id": "C18_ihp130_sW2_sL2", + "reason": "schematic_not_qualified", + "detail": "thd_pct=31.05 above floor 3; out_swing=0.2425 below floor 0.3" + }, + { + "case_id": "C18_sky130_sW0.5_sL1", + "reason": "schematic_not_qualified", + "detail": "servo did not reach the output target: vout0=0.9614974 target=0.9 (tol 0.036 V); thd_pct=49.73 above floor 3; out_swing=0 below floor 0.45" + }, + { + "case_id": "C18_sky130_sW0.5_sL1.5", + "reason": "schematic_not_qualified", + "detail": "servo did not reach the output target: vout0=0.983791 target=0.9 (tol 0.036 V); thd_pct=43.65 above floor 3; out_swing=0 below floor 0.45" + }, + { + "case_id": "C18_sky130_sW0.5_sL2", + "reason": "schematic_not_qualified", + "detail": "servo did not reach the output target: vout0=0.9867281 target=0.9 (tol 0.036 V); thd_pct=41.38 above floor 3; out_swing=0 below floor 0.45" + }, + { + "case_id": "C18_sky130_sW1.5_sL1", + "reason": "schematic_not_qualified", + "detail": "servo did not reach the output target: vout0=0.9648527 target=0.9 (tol 0.036 V); thd_pct=52.47 above floor 3; out_swing=0 below floor 0.45" + }, + { + "case_id": "C18_sky130_sW1.5_sL1.5", + "reason": "schematic_not_qualified", + "detail": "servo did not reach the output target: vout0=0.99676 target=0.9 (tol 0.036 V); thd_pct=46.44 above floor 3; out_swing=0 below floor 0.45" + }, + { + "case_id": "C18_sky130_sW1.5_sL2", + "reason": "schematic_not_qualified", + "detail": "servo did not reach the output target: vout0=1.005301 target=0.9 (tol 0.036 V); thd_pct=43.98 above floor 3; out_swing=0 below floor 0.45" + }, + { + "case_id": "C18_sky130_sW1_sL1", + "reason": "schematic_not_qualified", + "detail": "servo did not reach the output target: vout0=0.9644481 target=0.9 (tol 0.036 V); thd_pct=51.71 above floor 3; out_swing=0 below floor 0.45" + }, + { + "case_id": "C18_sky130_sW1_sL1.5", + "reason": "schematic_not_qualified", + "detail": "servo did not reach the output target: vout0=0.9931647 target=0.9 (tol 0.036 V); thd_pct=45.56 above floor 3; out_swing=0 below floor 0.45" + }, + { + "case_id": "C18_sky130_sW1_sL2", + "reason": "schematic_not_qualified", + "detail": "servo did not reach the output target: vout0=0.999616 target=0.9 (tol 0.036 V); thd_pct=43.08 above floor 3; out_swing=0 below floor 0.45" + }, + { + "case_id": "C18_sky130_sW2_sL1", + "reason": "schematic_not_qualified", + "detail": "servo did not reach the output target: vout0=0.96461 target=0.9 (tol 0.036 V); thd_pct=52.88 above floor 3; out_swing=0 below floor 0.45" + }, + { + "case_id": "C18_sky130_sW2_sL1.5", + "reason": "schematic_not_qualified", + "detail": "servo did not reach the output target: vout0=0.9985048 target=0.9 (tol 0.036 V); thd_pct=46.94 above floor 3; out_swing=0 below floor 0.45" + }, + { + "case_id": "C18_sky130_sW2_sL2", + "reason": "schematic_not_qualified", + "detail": "servo did not reach the output target: vout0=1.008435 target=0.9 (tol 0.036 V); thd_pct=44.53 above floor 3; out_swing=0 below floor 0.45" + } + ], + "candidates": { + "tasks": 56, + "per_task": { + "C02_gf180_sW1_sL1": { + "ledger": { + "per_group": [ + { + "devices": [ + "M1", + "M2", + "M3", + "M4" + ], + "raw": 256, + "static_illegal": 144, + "equivalent_duplicate": 48, + "unique": 64 + } + ], + "raw_per_group": 256, + "global_product_of_unique": 64, + "named_distinct": 4, + "selected_for_evaluation": 64, + "sampling": "exhaustive (prod(p_g) <= limit)", + "limit": 64 + }, + "evaluated": { + "auto_passed": 64 + }, + "review": { + "pass": 19, + "review_pending": 45 + } + }, + "C02_gf180_sW1_sL2": { + "ledger": { + "per_group": [ + { + "devices": [ + "M1", + "M2", + "M3", + "M4" + ], + "raw": 256, + "static_illegal": 144, + "equivalent_duplicate": 48, + "unique": 64 + } + ], + "raw_per_group": 256, + "global_product_of_unique": 64, + "named_distinct": 4, + "selected_for_evaluation": 64, + "sampling": "exhaustive (prod(p_g) <= limit)", + "limit": 64 + }, + "evaluated": { + "auto_passed": 64 + }, + "review": { + "pass": 17, + "review_pending": 47 + } + }, + "C02_gf180_sW2_sL1": { + "ledger": { + "per_group": [ + { + "devices": [ + "M1", + "M2", + "M3", + "M4" + ], + "raw": 256, + "static_illegal": 144, + "equivalent_duplicate": 48, + "unique": 64 + } + ], + "raw_per_group": 256, + "global_product_of_unique": 64, + "named_distinct": 4, + "selected_for_evaluation": 64, + "sampling": "exhaustive (prod(p_g) <= limit)", + "limit": 64 + }, + "evaluated": { + "auto_passed": 64 + }, + "review": { + "pass": 26, + "review_pending": 38 + } + }, + "C02_gf180_sW2_sL2": { + "ledger": { + "per_group": [ + { + "devices": [ + "M1", + "M2", + "M3", + "M4" + ], + "raw": 256, + "static_illegal": 144, + "equivalent_duplicate": 48, + "unique": 64 + } + ], + "raw_per_group": 256, + "global_product_of_unique": 64, + "named_distinct": 4, + "selected_for_evaluation": 64, + "sampling": "exhaustive (prod(p_g) <= limit)", + "limit": 64 + }, + "evaluated": { + "auto_passed": 64 + }, + "review": { + "pass": 17, + "review_pending": 47 + } + }, + "C02_ihp130_sW1_sL1": { + "ledger": { + "per_group": [ + { + "devices": [ + "M1", + "M2", + "M3", + "M4" + ], + "raw": 256, + "static_illegal": 144, + "equivalent_duplicate": 48, + "unique": 64 + } + ], + "raw_per_group": 256, + "global_product_of_unique": 64, + "named_distinct": 4, + "selected_for_evaluation": 64, + "sampling": "exhaustive (prod(p_g) <= limit)", + "limit": 64 + }, + "evaluated": { + "auto_passed": 64 + }, + "review": { + "pass": 19, + "review_pending": 45 + } + }, + "C02_ihp130_sW1_sL2": { + "ledger": { + "per_group": [ + { + "devices": [ + "M1", + "M2", + "M3", + "M4" + ], + "raw": 256, + "static_illegal": 144, + "equivalent_duplicate": 48, + "unique": 64 + } + ], + "raw_per_group": 256, + "global_product_of_unique": 64, + "named_distinct": 4, + "selected_for_evaluation": 64, + "sampling": "exhaustive (prod(p_g) <= limit)", + "limit": 64 + }, + "evaluated": { + "auto_passed": 64 + }, + "review": { + "pass": 11, + "review_pending": 52, + "suspicious(resolved_ok)": 1 + } + }, + "C02_ihp130_sW2_sL1": { + "ledger": { + "per_group": [ + { + "devices": [ + "M1", + "M2", + "M3", + "M4" + ], + "raw": 256, + "static_illegal": 144, + "equivalent_duplicate": 48, + "unique": 64 + } + ], + "raw_per_group": 256, + "global_product_of_unique": 64, + "named_distinct": 4, + "selected_for_evaluation": 64, + "sampling": "exhaustive (prod(p_g) <= limit)", + "limit": 64 + }, + "evaluated": { + "auto_passed": 64 + }, + "review": { + "pass": 17, + "review_pending": 47 + } + }, + "C02_ihp130_sW2_sL2": { + "ledger": { + "per_group": [ + { + "devices": [ + "M1", + "M2", + "M3", + "M4" + ], + "raw": 256, + "static_illegal": 144, + "equivalent_duplicate": 48, + "unique": 64 + } + ], + "raw_per_group": 256, + "global_product_of_unique": 64, + "named_distinct": 4, + "selected_for_evaluation": 64, + "sampling": "exhaustive (prod(p_g) <= limit)", + "limit": 64 + }, + "evaluated": { + "auto_passed": 64 + }, + "review": { + "pass": 14, + "review_pending": 50 + } + }, + "C02_sky130_sW1_sL1": { + "ledger": { + "per_group": [ + { + "devices": [ + "M1", + "M2", + "M3", + "M4" + ], + "raw": 256, + "static_illegal": 144, + "equivalent_duplicate": 48, + "unique": 64 + } + ], + "raw_per_group": 256, + "global_product_of_unique": 64, + "named_distinct": 4, + "selected_for_evaluation": 64, + "sampling": "exhaustive (prod(p_g) <= limit)", + "limit": 64 + }, + "evaluated": { + "auto_passed": 64 + }, + "review": { + "pass": 19, + "review_pending": 41, + "suspicious(resolved_ok)": 4 + } + }, + "C02_sky130_sW1_sL2": { + "ledger": { + "per_group": [ + { + "devices": [ + "M1", + "M2", + "M3", + "M4" + ], + "raw": 256, + "static_illegal": 144, + "equivalent_duplicate": 48, + "unique": 64 + } + ], + "raw_per_group": 256, + "global_product_of_unique": 64, + "named_distinct": 4, + "selected_for_evaluation": 64, + "sampling": "exhaustive (prod(p_g) <= limit)", + "limit": 64 + }, + "evaluated": { + "auto_passed": 64 + }, + "review": { + "pass": 21, + "review_pending": 43 + } + }, + "C02_sky130_sW2_sL1": { + "ledger": { + "per_group": [ + { + "devices": [ + "M1", + "M2", + "M3", + "M4" + ], + "raw": 256, + "static_illegal": 144, + "equivalent_duplicate": 48, + "unique": 64 + } + ], + "raw_per_group": 256, + "global_product_of_unique": 64, + "named_distinct": 4, + "selected_for_evaluation": 64, + "sampling": "exhaustive (prod(p_g) <= limit)", + "limit": 64 + }, + "evaluated": { + "auto_passed": 64 + }, + "review": { + "pass": 16, + "review_pending": 45, + "suspicious(resolved_ok)": 3 + } + }, + "C02_sky130_sW2_sL2": { + "ledger": { + "per_group": [ + { + "devices": [ + "M1", + "M2", + "M3", + "M4" + ], + "raw": 256, + "static_illegal": 144, + "equivalent_duplicate": 48, + "unique": 64 + } + ], + "raw_per_group": 256, + "global_product_of_unique": 64, + "named_distinct": 4, + "selected_for_evaluation": 64, + "sampling": "exhaustive (prod(p_g) <= limit)", + "limit": 64 + }, + "evaluated": { + "auto_passed": 64 + }, + "review": { + "pass": 21, + "review_pending": 42, + "suspicious(resolved_ok)": 1 + } + }, + "C08_gf180_sW1_sL1": { + "ledger": { + "per_group": [ + { + "devices": [ + "M1", + "M2", + "M3" + ], + "raw": 256, + "static_illegal": 224, + "equivalent_duplicate": 22, + "unique": 10 + }, + { + "devices": [ + "M4", + "M5" + ], + "raw": 256, + "static_illegal": 8, + "equivalent_duplicate": 147, + "unique": 101 + } + ], + "raw_per_group": 256, + "global_product_of_unique": 1010, + "named_distinct": 4, + "selected_for_evaluation": 64, + "sampling": "stratified seeded sample over 8 strata (seed 20261011+task hash)", + "limit": 64 + }, + "evaluated": { + "auto_passed": 64 + }, + "review": { + "pass": 21, + "review_pending": 42, + "suspicious(resolved_ok)": 1 + } + }, + "C08_gf180_sW1_sL2": { + "ledger": { + "per_group": [ + { + "devices": [ + "M1", + "M2", + "M3" + ], + "raw": 256, + "static_illegal": 224, + "equivalent_duplicate": 22, + "unique": 10 + }, + { + "devices": [ + "M4", + "M5" + ], + "raw": 256, + "static_illegal": 8, + "equivalent_duplicate": 147, + "unique": 101 + } + ], + "raw_per_group": 256, + "global_product_of_unique": 1010, + "named_distinct": 4, + "selected_for_evaluation": 64, + "sampling": "stratified seeded sample over 8 strata (seed 20261011+task hash)", + "limit": 64 + }, + "evaluated": { + "auto_passed": 64 + }, + "review": { + "pass": 23, + "review_pending": 41 + } + }, + "C08_gf180_sW2_sL1": { + "ledger": { + "per_group": [ + { + "devices": [ + "M1", + "M2", + "M3" + ], + "raw": 256, + "static_illegal": 224, + "equivalent_duplicate": 22, + "unique": 10 + }, + { + "devices": [ + "M4", + "M5" + ], + "raw": 256, + "static_illegal": 8, + "equivalent_duplicate": 147, + "unique": 101 + } + ], + "raw_per_group": 256, + "global_product_of_unique": 1010, + "named_distinct": 4, + "selected_for_evaluation": 64, + "sampling": "stratified seeded sample over 8 strata (seed 20261011+task hash)", + "limit": 64 + }, + "evaluated": { + "auto_passed": 64 + }, + "review": { + "pass": 18, + "review_pending": 46 + } + }, + "C08_gf180_sW2_sL2": { + "ledger": { + "per_group": [ + { + "devices": [ + "M1", + "M2", + "M3" + ], + "raw": 256, + "static_illegal": 224, + "equivalent_duplicate": 22, + "unique": 10 + }, + { + "devices": [ + "M4", + "M5" + ], + "raw": 256, + "static_illegal": 8, + "equivalent_duplicate": 147, + "unique": 101 + } + ], + "raw_per_group": 256, + "global_product_of_unique": 1010, + "named_distinct": 4, + "selected_for_evaluation": 64, + "sampling": "stratified seeded sample over 8 strata (seed 20261011+task hash)", + "limit": 64 + }, + "evaluated": { + "auto_passed": 64 + }, + "review": { + "pass": 13, + "review_pending": 51 + } + }, + "C08_ihp130_sW1_sL1": { + "ledger": { + "per_group": [ + { + "devices": [ + "M1", + "M2", + "M3" + ], + "raw": 256, + "static_illegal": 224, + "equivalent_duplicate": 22, + "unique": 10 + }, + { + "devices": [ + "M4", + "M5" + ], + "raw": 256, + "static_illegal": 8, + "equivalent_duplicate": 147, + "unique": 101 + } + ], + "raw_per_group": 256, + "global_product_of_unique": 1010, + "named_distinct": 4, + "selected_for_evaluation": 64, + "sampling": "stratified seeded sample over 8 strata (seed 20261011+task hash)", + "limit": 64 + }, + "evaluated": { + "auto_passed": 64 + }, + "review": { + "pass": 18, + "review_pending": 46 + } + }, + "C08_ihp130_sW1_sL2": { + "ledger": { + "per_group": [ + { + "devices": [ + "M1", + "M2", + "M3" + ], + "raw": 256, + "static_illegal": 224, + "equivalent_duplicate": 22, + "unique": 10 + }, + { + "devices": [ + "M4", + "M5" + ], + "raw": 256, + "static_illegal": 8, + "equivalent_duplicate": 147, + "unique": 101 + } + ], + "raw_per_group": 256, + "global_product_of_unique": 1010, + "named_distinct": 4, + "selected_for_evaluation": 64, + "sampling": "stratified seeded sample over 8 strata (seed 20261011+task hash)", + "limit": 64 + }, + "evaluated": { + "auto_passed": 64 + }, + "review": { + "pass": 22, + "review_pending": 42 + } + }, + "C08_ihp130_sW2_sL2": { + "ledger": { + "per_group": [ + { + "devices": [ + "M1", + "M2", + "M3" + ], + "raw": 256, + "static_illegal": 224, + "equivalent_duplicate": 22, + "unique": 10 + }, + { + "devices": [ + "M4", + "M5" + ], + "raw": 256, + "static_illegal": 8, + "equivalent_duplicate": 147, + "unique": 101 + } + ], + "raw_per_group": 256, + "global_product_of_unique": 1010, + "named_distinct": 4, + "selected_for_evaluation": 64, + "sampling": "stratified seeded sample over 8 strata (seed 20261011+task hash)", + "limit": 64 + }, + "evaluated": { + "auto_passed": 64 + }, + "review": { + "pass": 24, + "review_pending": 40 + } + }, + "C08_sky130_sW1_sL1": { + "ledger": { + "per_group": [ + { + "devices": [ + "M1", + "M2", + "M3" + ], + "raw": 256, + "static_illegal": 224, + "equivalent_duplicate": 22, + "unique": 10 + }, + { + "devices": [ + "M4", + "M5" + ], + "raw": 256, + "static_illegal": 8, + "equivalent_duplicate": 147, + "unique": 101 + } + ], + "raw_per_group": 256, + "global_product_of_unique": 1010, + "named_distinct": 4, + "selected_for_evaluation": 64, + "sampling": "stratified seeded sample over 8 strata (seed 20261011+task hash)", + "limit": 64 + }, + "evaluated": { + "auto_passed": 64 + }, + "review": { + "pass": 24, + "review_pending": 38, + "suspicious(resolved_ok)": 2 + } + }, + "C08_sky130_sW1_sL2": { + "ledger": { + "per_group": [ + { + "devices": [ + "M1", + "M2", + "M3" + ], + "raw": 256, + "static_illegal": 224, + "equivalent_duplicate": 22, + "unique": 10 + }, + { + "devices": [ + "M4", + "M5" + ], + "raw": 256, + "static_illegal": 8, + "equivalent_duplicate": 147, + "unique": 101 + } + ], + "raw_per_group": 256, + "global_product_of_unique": 1010, + "named_distinct": 4, + "selected_for_evaluation": 64, + "sampling": "stratified seeded sample over 8 strata (seed 20261011+task hash)", + "limit": 64 + }, + "evaluated": { + "auto_passed": 64 + }, + "review": { + "pass": 18, + "review_pending": 46 + } + }, + "C08_sky130_sW2_sL1": { + "ledger": { + "per_group": [ + { + "devices": [ + "M1", + "M2", + "M3" + ], + "raw": 256, + "static_illegal": 224, + "equivalent_duplicate": 22, + "unique": 10 + }, + { + "devices": [ + "M4", + "M5" + ], + "raw": 256, + "static_illegal": 8, + "equivalent_duplicate": 147, + "unique": 101 + } + ], + "raw_per_group": 256, + "global_product_of_unique": 1010, + "named_distinct": 4, + "selected_for_evaluation": 64, + "sampling": "stratified seeded sample over 8 strata (seed 20261011+task hash)", + "limit": 64 + }, + "evaluated": { + "auto_passed": 64 + }, + "review": { + "pass": 14, + "review_pending": 47, + "suspicious(resolved_ok)": 3 + } + }, + "C08_sky130_sW2_sL2": { + "ledger": { + "per_group": [ + { + "devices": [ + "M1", + "M2", + "M3" + ], + "raw": 256, + "static_illegal": 224, + "equivalent_duplicate": 22, + "unique": 10 + }, + { + "devices": [ + "M4", + "M5" + ], + "raw": 256, + "static_illegal": 8, + "equivalent_duplicate": 147, + "unique": 101 + } + ], + "raw_per_group": 256, + "global_product_of_unique": 1010, + "named_distinct": 4, + "selected_for_evaluation": 64, + "sampling": "stratified seeded sample over 8 strata (seed 20261011+task hash)", + "limit": 64 + }, + "evaluated": { + "auto_passed": 64 + }, + "review": { + "pass": 16, + "review_pending": 45, + "suspicious(resolved_ok)": 3 + } + }, + "C09_gf180_sW1_sL1": { + "ledger": { + "per_group": [ + { + "devices": [ + "M1", + "M2", + "M3", + "M4" + ], + "raw": 256, + "static_illegal": 224, + "equivalent_duplicate": 20, + "unique": 12 + }, + { + "devices": [ + "M5", + "M6", + "M7", + "M8" + ], + "raw": 256, + "static_illegal": 152, + "equivalent_duplicate": 65, + "unique": 39 + } + ], + "raw_per_group": 256, + "global_product_of_unique": 468, + "named_distinct": 4, + "selected_for_evaluation": 64, + "sampling": "stratified seeded sample over 16 strata (seed 20261011+task hash)", + "limit": 64 + }, + "evaluated": { + "auto_passed": 64 + }, + "review": { + "pass": 13, + "review_pending": 51 + } + }, + "C09_gf180_sW2_sL1": { + "ledger": { + "per_group": [ + { + "devices": [ + "M1", + "M2", + "M3", + "M4" + ], + "raw": 256, + "static_illegal": 224, + "equivalent_duplicate": 20, + "unique": 12 + }, + { + "devices": [ + "M5", + "M6", + "M7", + "M8" + ], + "raw": 256, + "static_illegal": 152, + "equivalent_duplicate": 65, + "unique": 39 + } + ], + "raw_per_group": 256, + "global_product_of_unique": 468, + "named_distinct": 4, + "selected_for_evaluation": 64, + "sampling": "stratified seeded sample over 16 strata (seed 20261011+task hash)", + "limit": 64 + }, + "evaluated": { + "auto_passed": 64 + }, + "review": { + "pass": 21, + "review_pending": 43 + } + }, + "C09_gf180_sW2_sL2": { + "ledger": { + "per_group": [ + { + "devices": [ + "M1", + "M2", + "M3", + "M4" + ], + "raw": 256, + "static_illegal": 224, + "equivalent_duplicate": 20, + "unique": 12 + }, + { + "devices": [ + "M5", + "M6", + "M7", + "M8" + ], + "raw": 256, + "static_illegal": 152, + "equivalent_duplicate": 65, + "unique": 39 + } + ], + "raw_per_group": 256, + "global_product_of_unique": 468, + "named_distinct": 4, + "selected_for_evaluation": 64, + "sampling": "stratified seeded sample over 16 strata (seed 20261011+task hash)", + "limit": 64 + }, + "evaluated": { + "auto_passed": 64 + }, + "review": { + "pass": 17, + "review_pending": 47 + } + }, + "C09_ihp130_sW1_sL1": { + "ledger": { + "per_group": [ + { + "devices": [ + "M1", + "M2", + "M3", + "M4" + ], + "raw": 256, + "static_illegal": 224, + "equivalent_duplicate": 20, + "unique": 12 + }, + { + "devices": [ + "M5", + "M6", + "M7", + "M8" + ], + "raw": 256, + "static_illegal": 152, + "equivalent_duplicate": 65, + "unique": 39 + } + ], + "raw_per_group": 256, + "global_product_of_unique": 468, + "named_distinct": 4, + "selected_for_evaluation": 64, + "sampling": "stratified seeded sample over 16 strata (seed 20261011+task hash)", + "limit": 64 + }, + "evaluated": { + "auto_passed": 64 + }, + "review": { + "pass": 20, + "review_pending": 44 + } + }, + "C09_ihp130_sW1_sL2": { + "ledger": { + "per_group": [ + { + "devices": [ + "M1", + "M2", + "M3", + "M4" + ], + "raw": 256, + "static_illegal": 224, + "equivalent_duplicate": 20, + "unique": 12 + }, + { + "devices": [ + "M5", + "M6", + "M7", + "M8" + ], + "raw": 256, + "static_illegal": 152, + "equivalent_duplicate": 65, + "unique": 39 + } + ], + "raw_per_group": 256, + "global_product_of_unique": 468, + "named_distinct": 4, + "selected_for_evaluation": 64, + "sampling": "stratified seeded sample over 16 strata (seed 20261011+task hash)", + "limit": 64 + }, + "evaluated": { + "auto_passed": 64 + }, + "review": { + "pass": 16, + "review_pending": 48 + } + }, + "C09_ihp130_sW2_sL1": { + "ledger": { + "per_group": [ + { + "devices": [ + "M1", + "M2", + "M3", + "M4" + ], + "raw": 256, + "static_illegal": 224, + "equivalent_duplicate": 20, + "unique": 12 + }, + { + "devices": [ + "M5", + "M6", + "M7", + "M8" + ], + "raw": 256, + "static_illegal": 152, + "equivalent_duplicate": 65, + "unique": 39 + } + ], + "raw_per_group": 256, + "global_product_of_unique": 468, + "named_distinct": 4, + "selected_for_evaluation": 64, + "sampling": "stratified seeded sample over 16 strata (seed 20261011+task hash)", + "limit": 64 + }, + "evaluated": { + "auto_passed": 64 + }, + "review": { + "pass": 20, + "review_pending": 44 + } + }, + "C09_ihp130_sW2_sL2": { + "ledger": { + "per_group": [ + { + "devices": [ + "M1", + "M2", + "M3", + "M4" + ], + "raw": 256, + "static_illegal": 224, + "equivalent_duplicate": 20, + "unique": 12 + }, + { + "devices": [ + "M5", + "M6", + "M7", + "M8" + ], + "raw": 256, + "static_illegal": 152, + "equivalent_duplicate": 65, + "unique": 39 + } + ], + "raw_per_group": 256, + "global_product_of_unique": 468, + "named_distinct": 4, + "selected_for_evaluation": 64, + "sampling": "stratified seeded sample over 16 strata (seed 20261011+task hash)", + "limit": 64 + }, + "evaluated": { + "auto_passed": 64 + }, + "review": { + "pass": 18, + "review_pending": 46 + } + }, + "C09_sky130_sW1_sL1": { + "ledger": { + "per_group": [ + { + "devices": [ + "M1", + "M2", + "M3", + "M4" + ], + "raw": 256, + "static_illegal": 224, + "equivalent_duplicate": 20, + "unique": 12 + }, + { + "devices": [ + "M5", + "M6", + "M7", + "M8" + ], + "raw": 256, + "static_illegal": 152, + "equivalent_duplicate": 65, + "unique": 39 + } + ], + "raw_per_group": 256, + "global_product_of_unique": 468, + "named_distinct": 4, + "selected_for_evaluation": 64, + "sampling": "stratified seeded sample over 16 strata (seed 20261011+task hash)", + "limit": 64 + }, + "evaluated": { + "auto_passed": 64 + }, + "review": { + "pass": 22, + "review_pending": 42 + } + }, + "C09_sky130_sW2_sL1": { + "ledger": { + "per_group": [ + { + "devices": [ + "M1", + "M2", + "M3", + "M4" + ], + "raw": 256, + "static_illegal": 224, + "equivalent_duplicate": 20, + "unique": 12 + }, + { + "devices": [ + "M5", + "M6", + "M7", + "M8" + ], + "raw": 256, + "static_illegal": 152, + "equivalent_duplicate": 65, + "unique": 39 + } + ], + "raw_per_group": 256, + "global_product_of_unique": 468, + "named_distinct": 4, + "selected_for_evaluation": 64, + "sampling": "stratified seeded sample over 16 strata (seed 20261011+task hash)", + "limit": 64 + }, + "evaluated": { + "auto_passed": 64 + }, + "review": { + "pass": 16, + "review_pending": 47, + "suspicious(resolved_ok)": 1 + } + }, + "C11_gf180_sW1_sL1": { + "ledger": { + "per_group": [ + { + "devices": [ + "M1", + "M2", + "M3", + "M4", + "M7" + ], + "raw": 256, + "static_illegal": 216, + "equivalent_duplicate": 15, + "unique": 25 + }, + { + "devices": [ + "M5", + "M6", + "M8" + ], + "raw": 256, + "static_illegal": 152, + "equivalent_duplicate": 61, + "unique": 43 + } + ], + "raw_per_group": 256, + "global_product_of_unique": 1075, + "named_distinct": 4, + "selected_for_evaluation": 64, + "sampling": "stratified seeded sample over 16 strata (seed 20261011+task hash)", + "limit": 64 + }, + "evaluated": { + "auto_passed": 64 + }, + "review": { + "pass": 5, + "review_pending": 59 + } + }, + "C11_gf180_sW1_sL2": { + "ledger": { + "per_group": [ + { + "devices": [ + "M1", + "M2", + "M3", + "M4", + "M7" + ], + "raw": 256, + "static_illegal": 216, + "equivalent_duplicate": 15, + "unique": 25 + }, + { + "devices": [ + "M5", + "M6", + "M8" + ], + "raw": 256, + "static_illegal": 152, + "equivalent_duplicate": 61, + "unique": 43 + } + ], + "raw_per_group": 256, + "global_product_of_unique": 1075, + "named_distinct": 4, + "selected_for_evaluation": 64, + "sampling": "stratified seeded sample over 16 strata (seed 20261011+task hash)", + "limit": 64 + }, + "evaluated": { + "auto_passed": 64 + }, + "review": { + "review_pending": 61, + "pass": 3 + } + }, + "C11_gf180_sW2_sL1": { + "ledger": { + "per_group": [ + { + "devices": [ + "M1", + "M2", + "M3", + "M4", + "M7" + ], + "raw": 256, + "static_illegal": 216, + "equivalent_duplicate": 15, + "unique": 25 + }, + { + "devices": [ + "M5", + "M6", + "M8" + ], + "raw": 256, + "static_illegal": 152, + "equivalent_duplicate": 61, + "unique": 43 + } + ], + "raw_per_group": 256, + "global_product_of_unique": 1075, + "named_distinct": 4, + "selected_for_evaluation": 64, + "sampling": "stratified seeded sample over 16 strata (seed 20261011+task hash)", + "limit": 64 + }, + "evaluated": { + "auto_passed": 64 + }, + "review": { + "pass": 4, + "review_pending": 60 + } + }, + "C11_gf180_sW2_sL2": { + "ledger": { + "per_group": [ + { + "devices": [ + "M1", + "M2", + "M3", + "M4", + "M7" + ], + "raw": 256, + "static_illegal": 216, + "equivalent_duplicate": 15, + "unique": 25 + }, + { + "devices": [ + "M5", + "M6", + "M8" + ], + "raw": 256, + "static_illegal": 152, + "equivalent_duplicate": 61, + "unique": 43 + } + ], + "raw_per_group": 256, + "global_product_of_unique": 1075, + "named_distinct": 4, + "selected_for_evaluation": 64, + "sampling": "stratified seeded sample over 16 strata (seed 20261011+task hash)", + "limit": 64 + }, + "evaluated": { + "auto_passed": 64 + }, + "review": { + "review_pending": 61, + "pass": 3 + } + }, + "C11_ihp130_sW1_sL1": { + "ledger": { + "per_group": [ + { + "devices": [ + "M1", + "M2", + "M3", + "M4", + "M7" + ], + "raw": 256, + "static_illegal": 216, + "equivalent_duplicate": 15, + "unique": 25 + }, + { + "devices": [ + "M5", + "M6", + "M8" + ], + "raw": 256, + "static_illegal": 152, + "equivalent_duplicate": 61, + "unique": 43 + } + ], + "raw_per_group": 256, + "global_product_of_unique": 1075, + "named_distinct": 4, + "selected_for_evaluation": 64, + "sampling": "stratified seeded sample over 16 strata (seed 20261011+task hash)", + "limit": 64 + }, + "evaluated": { + "auto_passed": 64 + }, + "review": { + "pass": 5, + "review_pending": 59 + } + }, + "C11_ihp130_sW1_sL2": { + "ledger": { + "per_group": [ + { + "devices": [ + "M1", + "M2", + "M3", + "M4", + "M7" + ], + "raw": 256, + "static_illegal": 216, + "equivalent_duplicate": 15, + "unique": 25 + }, + { + "devices": [ + "M5", + "M6", + "M8" + ], + "raw": 256, + "static_illegal": 152, + "equivalent_duplicate": 61, + "unique": 43 + } + ], + "raw_per_group": 256, + "global_product_of_unique": 1075, + "named_distinct": 4, + "selected_for_evaluation": 64, + "sampling": "stratified seeded sample over 16 strata (seed 20261011+task hash)", + "limit": 64 + }, + "evaluated": { + "auto_passed": 64 + }, + "review": { + "pass": 4, + "review_pending": 60 + } + }, + "C11_ihp130_sW2_sL1": { + "ledger": { + "per_group": [ + { + "devices": [ + "M1", + "M2", + "M3", + "M4", + "M7" + ], + "raw": 256, + "static_illegal": 216, + "equivalent_duplicate": 15, + "unique": 25 + }, + { + "devices": [ + "M5", + "M6", + "M8" + ], + "raw": 256, + "static_illegal": 152, + "equivalent_duplicate": 61, + "unique": 43 + } + ], + "raw_per_group": 256, + "global_product_of_unique": 1075, + "named_distinct": 4, + "selected_for_evaluation": 64, + "sampling": "stratified seeded sample over 16 strata (seed 20261011+task hash)", + "limit": 64 + }, + "evaluated": { + "auto_passed": 64 + }, + "review": { + "pass": 5, + "review_pending": 59 + } + }, + "C11_ihp130_sW2_sL2": { + "ledger": { + "per_group": [ + { + "devices": [ + "M1", + "M2", + "M3", + "M4", + "M7" + ], + "raw": 256, + "static_illegal": 216, + "equivalent_duplicate": 15, + "unique": 25 + }, + { + "devices": [ + "M5", + "M6", + "M8" + ], + "raw": 256, + "static_illegal": 152, + "equivalent_duplicate": 61, + "unique": 43 + } + ], + "raw_per_group": 256, + "global_product_of_unique": 1075, + "named_distinct": 4, + "selected_for_evaluation": 64, + "sampling": "stratified seeded sample over 16 strata (seed 20261011+task hash)", + "limit": 64 + }, + "evaluated": { + "auto_passed": 64 + }, + "review": { + "pass": 3, + "review_pending": 61 + } + }, + "C11_sky130_sW1_sL1": { + "ledger": { + "per_group": [ + { + "devices": [ + "M1", + "M2", + "M3", + "M4", + "M7" + ], + "raw": 256, + "static_illegal": 216, + "equivalent_duplicate": 15, + "unique": 25 + }, + { + "devices": [ + "M5", + "M6", + "M8" + ], + "raw": 256, + "static_illegal": 152, + "equivalent_duplicate": 61, + "unique": 43 + } + ], + "raw_per_group": 256, + "global_product_of_unique": 1075, + "named_distinct": 4, + "selected_for_evaluation": 64, + "sampling": "stratified seeded sample over 16 strata (seed 20261011+task hash)", + "limit": 64 + }, + "evaluated": { + "auto_passed": 64 + }, + "review": { + "review_pending": 51, + "pass": 13 + } + }, + "C11_sky130_sW1_sL2": { + "ledger": { + "per_group": [ + { + "devices": [ + "M1", + "M2", + "M3", + "M4", + "M7" + ], + "raw": 256, + "static_illegal": 216, + "equivalent_duplicate": 15, + "unique": 25 + }, + { + "devices": [ + "M5", + "M6", + "M8" + ], + "raw": 256, + "static_illegal": 152, + "equivalent_duplicate": 61, + "unique": 43 + } + ], + "raw_per_group": 256, + "global_product_of_unique": 1075, + "named_distinct": 4, + "selected_for_evaluation": 64, + "sampling": "stratified seeded sample over 16 strata (seed 20261011+task hash)", + "limit": 64 + }, + "evaluated": { + "auto_passed": 64 + }, + "review": { + "pass": 19, + "review_pending": 45 + } + }, + "C11_sky130_sW2_sL1": { + "ledger": { + "per_group": [ + { + "devices": [ + "M1", + "M2", + "M3", + "M4", + "M7" + ], + "raw": 256, + "static_illegal": 216, + "equivalent_duplicate": 15, + "unique": 25 + }, + { + "devices": [ + "M5", + "M6", + "M8" + ], + "raw": 256, + "static_illegal": 152, + "equivalent_duplicate": 61, + "unique": 43 + } + ], + "raw_per_group": 256, + "global_product_of_unique": 1075, + "named_distinct": 4, + "selected_for_evaluation": 64, + "sampling": "stratified seeded sample over 16 strata (seed 20261011+task hash)", + "limit": 64 + }, + "evaluated": { + "auto_passed": 64 + }, + "review": { + "pass": 14, + "review_pending": 50 + } + }, + "C11_sky130_sW2_sL2": { + "ledger": { + "per_group": [ + { + "devices": [ + "M1", + "M2", + "M3", + "M4", + "M7" + ], + "raw": 256, + "static_illegal": 216, + "equivalent_duplicate": 15, + "unique": 25 + }, + { + "devices": [ + "M5", + "M6", + "M8" + ], + "raw": 256, + "static_illegal": 152, + "equivalent_duplicate": 61, + "unique": 43 + } + ], + "raw_per_group": 256, + "global_product_of_unique": 1075, + "named_distinct": 4, + "selected_for_evaluation": 64, + "sampling": "stratified seeded sample over 16 strata (seed 20261011+task hash)", + "limit": 64 + }, + "evaluated": { + "auto_passed": 64 + }, + "review": { + "pass": 12, + "review_pending": 52 + } + }, + "C16_gf180_sW1_sL1": { + "ledger": { + "per_group": [ + { + "devices": [ + "M1", + "M2" + ], + "raw": 256, + "static_illegal": 16, + "equivalent_duplicate": 191, + "unique": 49 + } + ], + "raw_per_group": 256, + "global_product_of_unique": 49, + "named_distinct": 2, + "selected_for_evaluation": 49, + "sampling": "exhaustive (prod(p_g) <= limit)", + "limit": 64 + }, + "evaluated": { + "auto_passed": 49 + }, + "review": { + "pass": 2, + "review_pending": 47 + } + }, + "C16_gf180_sW1_sL2": { + "ledger": { + "per_group": [ + { + "devices": [ + "M1", + "M2" + ], + "raw": 256, + "static_illegal": 16, + "equivalent_duplicate": 191, + "unique": 49 + } + ], + "raw_per_group": 256, + "global_product_of_unique": 49, + "named_distinct": 2, + "selected_for_evaluation": 49, + "sampling": "exhaustive (prod(p_g) <= limit)", + "limit": 64 + }, + "evaluated": { + "auto_passed": 49 + }, + "review": { + "pass": 3, + "review_pending": 46 + } + }, + "C16_gf180_sW2_sL1": { + "ledger": { + "per_group": [ + { + "devices": [ + "M1", + "M2" + ], + "raw": 256, + "static_illegal": 16, + "equivalent_duplicate": 191, + "unique": 49 + } + ], + "raw_per_group": 256, + "global_product_of_unique": 49, + "named_distinct": 2, + "selected_for_evaluation": 49, + "sampling": "exhaustive (prod(p_g) <= limit)", + "limit": 64 + }, + "evaluated": { + "auto_passed": 49 + }, + "review": { + "pass": 5, + "review_pending": 44 + } + }, + "C16_gf180_sW2_sL2": { + "ledger": { + "per_group": [ + { + "devices": [ + "M1", + "M2" + ], + "raw": 256, + "static_illegal": 16, + "equivalent_duplicate": 191, + "unique": 49 + } + ], + "raw_per_group": 256, + "global_product_of_unique": 49, + "named_distinct": 2, + "selected_for_evaluation": 49, + "sampling": "exhaustive (prod(p_g) <= limit)", + "limit": 64 + }, + "evaluated": { + "auto_passed": 45, + "spec_failed": 4 + }, + "review": { + "pass": 5, + "review_pending": 44 + } + }, + "C16_ihp130_sW1_sL1": { + "ledger": { + "per_group": [ + { + "devices": [ + "M1", + "M2" + ], + "raw": 256, + "static_illegal": 16, + "equivalent_duplicate": 191, + "unique": 49 + } + ], + "raw_per_group": 256, + "global_product_of_unique": 49, + "named_distinct": 2, + "selected_for_evaluation": 49, + "sampling": "exhaustive (prod(p_g) <= limit)", + "limit": 64 + }, + "evaluated": { + "auto_passed": 49 + }, + "review": { + "review_pending": 47, + "pass": 2 + } + }, + "C16_ihp130_sW1_sL2": { + "ledger": { + "per_group": [ + { + "devices": [ + "M1", + "M2" + ], + "raw": 256, + "static_illegal": 16, + "equivalent_duplicate": 191, + "unique": 49 + } + ], + "raw_per_group": 256, + "global_product_of_unique": 49, + "named_distinct": 2, + "selected_for_evaluation": 49, + "sampling": "exhaustive (prod(p_g) <= limit)", + "limit": 64 + }, + "evaluated": { + "auto_passed": 49 + }, + "review": { + "review_pending": 48, + "pass": 1 + } + }, + "C16_ihp130_sW2_sL1": { + "ledger": { + "per_group": [ + { + "devices": [ + "M1", + "M2" + ], + "raw": 256, + "static_illegal": 16, + "equivalent_duplicate": 191, + "unique": 49 + } + ], + "raw_per_group": 256, + "global_product_of_unique": 49, + "named_distinct": 2, + "selected_for_evaluation": 49, + "sampling": "exhaustive (prod(p_g) <= limit)", + "limit": 64 + }, + "evaluated": { + "auto_passed": 29, + "spec_failed": 20 + }, + "review": { + "review_pending": 44, + "pass": 5 + } + }, + "C16_ihp130_sW2_sL2": { + "ledger": { + "per_group": [ + { + "devices": [ + "M1", + "M2" + ], + "raw": 256, + "static_illegal": 16, + "equivalent_duplicate": 191, + "unique": 49 + } + ], + "raw_per_group": 256, + "global_product_of_unique": 49, + "named_distinct": 2, + "selected_for_evaluation": 49, + "sampling": "exhaustive (prod(p_g) <= limit)", + "limit": 64 + }, + "evaluated": { + "auto_passed": 29, + "spec_failed": 20 + }, + "review": { + "pass": 4, + "review_pending": 45 + } + }, + "C16_sky130_sW1_sL1": { + "ledger": { + "per_group": [ + { + "devices": [ + "M1", + "M2" + ], + "raw": 256, + "static_illegal": 16, + "equivalent_duplicate": 191, + "unique": 49 + } + ], + "raw_per_group": 256, + "global_product_of_unique": 49, + "named_distinct": 2, + "selected_for_evaluation": 49, + "sampling": "exhaustive (prod(p_g) <= limit)", + "limit": 64 + }, + "evaluated": { + "auto_passed": 49 + }, + "review": { + "review_pending": 47, + "pass": 2 + } + }, + "C16_sky130_sW1_sL2": { + "ledger": { + "per_group": [ + { + "devices": [ + "M1", + "M2" + ], + "raw": 256, + "static_illegal": 16, + "equivalent_duplicate": 191, + "unique": 49 + } + ], + "raw_per_group": 256, + "global_product_of_unique": 49, + "named_distinct": 2, + "selected_for_evaluation": 49, + "sampling": "exhaustive (prod(p_g) <= limit)", + "limit": 64 + }, + "evaluated": { + "auto_passed": 49 + }, + "review": { + "pass": 2, + "review_pending": 47 + } + }, + "C16_sky130_sW2_sL1": { + "ledger": { + "per_group": [ + { + "devices": [ + "M1", + "M2" + ], + "raw": 256, + "static_illegal": 16, + "equivalent_duplicate": 191, + "unique": 49 + } + ], + "raw_per_group": 256, + "global_product_of_unique": 49, + "named_distinct": 2, + "selected_for_evaluation": 49, + "sampling": "exhaustive (prod(p_g) <= limit)", + "limit": 64 + }, + "evaluated": { + "auto_passed": 49 + }, + "review": { + "pass": 6, + "review_pending": 43 + } + }, + "C16_sky130_sW2_sL2": { + "ledger": { + "per_group": [ + { + "devices": [ + "M1", + "M2" + ], + "raw": 256, + "static_illegal": 16, + "equivalent_duplicate": 191, + "unique": 49 + } + ], + "raw_per_group": 256, + "global_product_of_unique": 49, + "named_distinct": 2, + "selected_for_evaluation": 49, + "sampling": "exhaustive (prod(p_g) <= limit)", + "limit": 64 + }, + "evaluated": { + "auto_passed": 49 + }, + "review": { + "review_pending": 46, + "pass": 3 + } + } + }, + "totals": { + "selected": 3404, + "eval:auto_passed": 3360, + "review:pass": 721, + "review:review_pending": 2664, + "review:suspicious(resolved_ok)": 19, + "eval:spec_failed": 44 + } + } +} \ No newline at end of file diff --git a/benchmarks/textbook_sharing/results/count_ledger.md b/benchmarks/textbook_sharing/results/count_ledger.md new file mode 100644 index 00000000..b4d52d89 --- /dev/null +++ b/benchmarks/textbook_sharing/results/count_ledger.md @@ -0,0 +1,18 @@ +# Count ledger + +| level | count | +|---|---| +| requested | 648 | +| parameter_illegal | 9 | +| duplicate | 0 | +| distinct_legal | 639 | +| schematic_not_qualified | 88 | +| qualified | 551 | +| formal_entries | 547 | +| diagnostic | 101 | + +reference (independent mode) first status: {"auto_passed": 547, "spec_failed": 4} + +mode rows: {"auto_passed": 1608, "NA": 592, "spec_failed": 4} + +selection candidates: {"selected": 3404, "eval:auto_passed": 3360, "review:pass": 721, "review:review_pending": 2664, "review:suspicious(resolved_ok)": 19, "eval:spec_failed": 44} diff --git a/benchmarks/textbook_sharing/results/redesign_search/attempts_gf180_sky130.json b/benchmarks/textbook_sharing/results/redesign_search/attempts_gf180_sky130.json new file mode 100644 index 00000000..7c2b2ef2 --- /dev/null +++ b/benchmarks/textbook_sharing/results/redesign_search/attempts_gf180_sky130.json @@ -0,0 +1,4369 @@ +[ + { + "pdk": "gf180", + "ib": 5e-06, + "wd": 1, + "wf": 1, + "lm": 1.0, + "tag": "ib5u_wd1_wf1_lm1", + "qualified": false, + "reasons": [ + "thd_pct=12.26 above floor 3", + "f3db=2.817e+06 below floor 5e+06", + "out_swing=0.2891 below floor 0.825" + ], + "measures": { + "vout0": 1.64797, + "vin0": 0.7974522, + "iq": 1.674419e-05, + "gain_lf": 28.4035, + "f3db": 2817459.0, + "out_swing": 0.289131, + "thd_pct": 12.2571 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 0.56, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "M3": { + "w": 8.0, + "l": 0.56, + "nf": 16 + }, + "M4": { + "w": 16.0, + "l": 0.56, + "nf": 32 + }, + "M5": { + "w": 16.0, + "l": 0.56, + "nf": 32 + }, + "M6": { + "w": 32.0, + "l": 0.56, + "nf": 64 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 5e-06 + } + } + }, + { + "pdk": "gf180", + "ib": 5e-06, + "wd": 1, + "wf": 1, + "lm": 2.0, + "tag": "ib5u_wd1_wf1_lm2", + "qualified": false, + "reasons": [ + "thd_pct=27.55 above floor 3", + "out_swing=0.2584 below floor 0.825" + ], + "measures": { + "vout0": 1.648751, + "vin0": 0.8676577, + "iq": 1.515964e-05, + "gain_lf": 9.654884, + "f3db": 7148000.0, + "out_swing": 0.258419, + "thd_pct": 27.5483 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 1.12, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 1.12, + "nf": 8 + }, + "M3": { + "w": 8.0, + "l": 1.12, + "nf": 16 + }, + "M4": { + "w": 16.0, + "l": 1.12, + "nf": 32 + }, + "M5": { + "w": 16.0, + "l": 1.12, + "nf": 32 + }, + "M6": { + "w": 32.0, + "l": 1.12, + "nf": 64 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 5e-06 + } + } + }, + { + "pdk": "gf180", + "ib": 5e-06, + "wd": 1, + "wf": 2, + "lm": 1.0, + "tag": "ib5u_wd1_wf2_lm1", + "qualified": false, + "reasons": [ + "thd_pct=10.29 above floor 3", + "f3db=2.11e+06 below floor 5e+06", + "out_swing=0.3046 below floor 0.825" + ], + "measures": { + "vout0": 1.64797, + "vin0": 0.7974482, + "iq": 2.804021e-05, + "gain_lf": 28.87047, + "f3db": 2109664.0, + "out_swing": 0.304591, + "thd_pct": 10.2916 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 0.56, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "M3": { + "w": 8.0, + "l": 0.56, + "nf": 16 + }, + "M4": { + "w": 16.0, + "l": 0.56, + "nf": 32 + }, + "M5": { + "w": 32.0, + "l": 0.56, + "nf": 64 + }, + "M6": { + "w": 64.0, + "l": 0.56, + "nf": 128 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 5e-06 + } + } + }, + { + "pdk": "gf180", + "ib": 5e-06, + "wd": 1, + "wf": 2, + "lm": 2.0, + "tag": "ib5u_wd1_wf2_lm2", + "qualified": false, + "reasons": [ + "thd_pct=27.4 above floor 3", + "out_swing=0.2833 below floor 0.825" + ], + "measures": { + "vout0": 1.648751, + "vin0": 0.8676305, + "iq": 2.531469e-05, + "gain_lf": 10.2824, + "f3db": 6791306.0, + "out_swing": 0.283299, + "thd_pct": 27.3952 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 1.12, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 1.12, + "nf": 8 + }, + "M3": { + "w": 8.0, + "l": 1.12, + "nf": 16 + }, + "M4": { + "w": 16.0, + "l": 1.12, + "nf": 32 + }, + "M5": { + "w": 32.0, + "l": 1.12, + "nf": 64 + }, + "M6": { + "w": 64.0, + "l": 1.12, + "nf": 128 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 5e-06 + } + } + }, + { + "pdk": "gf180", + "ib": 5e-06, + "wd": 2, + "wf": 1, + "lm": 1.0, + "tag": "ib5u_wd2_wf1_lm1", + "qualified": false, + "reasons": [ + "thd_pct=6.146 above floor 3", + "f3db=1.483e+06 below floor 5e+06", + "out_swing=0.3112 below floor 0.825" + ], + "measures": { + "vout0": 1.647964, + "vin0": 0.7969174, + "iq": 1.116462e-05, + "gain_lf": 29.485, + "f3db": 1483239.0, + "out_swing": 0.311176, + "thd_pct": 6.14588 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 0.56, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "M3": { + "w": 16.0, + "l": 0.56, + "nf": 32 + }, + "M4": { + "w": 32.0, + "l": 0.56, + "nf": 64 + }, + "M5": { + "w": 16.0, + "l": 0.56, + "nf": 32 + }, + "M6": { + "w": 32.0, + "l": 0.56, + "nf": 64 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 5e-06 + } + } + }, + { + "pdk": "gf180", + "ib": 5e-06, + "wd": 2, + "wf": 1, + "lm": 2.0, + "tag": "ib5u_wd2_wf1_lm2", + "qualified": false, + "reasons": [ + "thd_pct=19.31 above floor 3", + "f3db=1.631e+06 below floor 5e+06", + "out_swing=0.1882 below floor 0.825" + ], + "measures": { + "vout0": 1.648692, + "vin0": 0.8621415, + "iq": 1.011729e-05, + "gain_lf": 21.81149, + "f3db": 1631192.0, + "out_swing": 0.188228, + "thd_pct": 19.3059 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 1.12, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 1.12, + "nf": 8 + }, + "M3": { + "w": 16.0, + "l": 1.12, + "nf": 32 + }, + "M4": { + "w": 32.0, + "l": 1.12, + "nf": 64 + }, + "M5": { + "w": 16.0, + "l": 1.12, + "nf": 32 + }, + "M6": { + "w": 32.0, + "l": 1.12, + "nf": 64 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 5e-06 + } + } + }, + { + "pdk": "gf180", + "ib": 5e-06, + "wd": 2, + "wf": 2, + "lm": 1.0, + "tag": "ib5u_wd2_wf2_lm1", + "qualified": false, + "reasons": [ + "thd_pct=4.655 above floor 3", + "f3db=1.224e+06 below floor 5e+06", + "out_swing=0.3355 below floor 0.825" + ], + "measures": { + "vout0": 1.647964, + "vin0": 0.7969118, + "iq": 1.686538e-05, + "gain_lf": 30.23296, + "f3db": 1224263.0, + "out_swing": 0.335487, + "thd_pct": 4.65476 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 0.56, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "M3": { + "w": 16.0, + "l": 0.56, + "nf": 32 + }, + "M4": { + "w": 32.0, + "l": 0.56, + "nf": 64 + }, + "M5": { + "w": 32.0, + "l": 0.56, + "nf": 64 + }, + "M6": { + "w": 64.0, + "l": 0.56, + "nf": 128 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 5e-06 + } + } + }, + { + "pdk": "gf180", + "ib": 5e-06, + "wd": 2, + "wf": 2, + "lm": 2.0, + "tag": "ib5u_wd2_wf2_lm2", + "qualified": false, + "reasons": [ + "thd_pct=16.98 above floor 3", + "f3db=1.3e+06 below floor 5e+06", + "out_swing=0.2068 below floor 0.825" + ], + "measures": { + "vout0": 1.648692, + "vin0": 0.8621309, + "iq": 1.521985e-05, + "gain_lf": 22.76816, + "f3db": 1299859.0, + "out_swing": 0.20679, + "thd_pct": 16.9751 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 1.12, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 1.12, + "nf": 8 + }, + "M3": { + "w": 16.0, + "l": 1.12, + "nf": 32 + }, + "M4": { + "w": 32.0, + "l": 1.12, + "nf": 64 + }, + "M5": { + "w": 32.0, + "l": 1.12, + "nf": 64 + }, + "M6": { + "w": 64.0, + "l": 1.12, + "nf": 128 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 5e-06 + } + } + }, + { + "pdk": "gf180", + "ib": 5e-06, + "wd": 4, + "wf": 1, + "lm": 1.0, + "tag": "ib5u_wd4_wf1_lm1", + "qualified": false, + "reasons": [ + "f3db=7.713e+05 below floor 5e+06", + "out_swing=0.3244 below floor 0.825" + ], + "measures": { + "vout0": 1.64796, + "vin0": 0.7965732, + "iq": 8.352779e-06, + "gain_lf": 29.50482, + "f3db": 771274.2, + "out_swing": 0.324426, + "thd_pct": 2.37048 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 0.56, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "M3": { + "w": 32.0, + "l": 0.56, + "nf": 64 + }, + "M4": { + "w": 64.0, + "l": 0.56, + "nf": 128 + }, + "M5": { + "w": 16.0, + "l": 0.56, + "nf": 32 + }, + "M6": { + "w": 32.0, + "l": 0.56, + "nf": 64 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 5e-06 + } + } + }, + { + "pdk": "gf180", + "ib": 5e-06, + "wd": 4, + "wf": 1, + "lm": 2.0, + "tag": "ib5u_wd4_wf1_lm2", + "qualified": false, + "reasons": [ + "thd_pct=4.98 above floor 3", + "f3db=4.944e+05 below floor 5e+06", + "out_swing=0.182 below floor 0.825" + ], + "measures": { + "vout0": 1.64868, + "vin0": 0.8610217, + "iq": 7.586339e-06, + "gain_lf": 26.96742, + "f3db": 494446.5, + "out_swing": 0.181986, + "thd_pct": 4.97961 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 1.12, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 1.12, + "nf": 8 + }, + "M3": { + "w": 32.0, + "l": 1.12, + "nf": 64 + }, + "M4": { + "w": 64.0, + "l": 1.12, + "nf": 128 + }, + "M5": { + "w": 16.0, + "l": 1.12, + "nf": 32 + }, + "M6": { + "w": 32.0, + "l": 1.12, + "nf": 64 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 5e-06 + } + } + }, + { + "pdk": "gf180", + "ib": 5e-06, + "wd": 4, + "wf": 2, + "lm": 1.0, + "tag": "ib5u_wd4_wf2_lm1", + "qualified": false, + "reasons": [ + "f3db=6.854e+05 below floor 5e+06", + "out_swing=0.3557 below floor 0.825" + ], + "measures": { + "vout0": 1.647959, + "vin0": 0.7965644, + "iq": 1.122819e-05, + "gain_lf": 30.70702, + "f3db": 685357.8, + "out_swing": 0.355746, + "thd_pct": 1.73516 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 0.56, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "M3": { + "w": 32.0, + "l": 0.56, + "nf": 64 + }, + "M4": { + "w": 64.0, + "l": 0.56, + "nf": 128 + }, + "M5": { + "w": 32.0, + "l": 0.56, + "nf": 64 + }, + "M6": { + "w": 64.0, + "l": 0.56, + "nf": 128 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 5e-06 + } + } + }, + { + "pdk": "gf180", + "ib": 5e-06, + "wd": 4, + "wf": 2, + "lm": 2.0, + "tag": "ib5u_wd4_wf2_lm2", + "qualified": false, + "reasons": [ + "thd_pct=3.344 above floor 3", + "f3db=4.189e+05 below floor 5e+06", + "out_swing=0.2055 below floor 0.825" + ], + "measures": { + "vout0": 1.64868, + "vin0": 0.8610129, + "iq": 1.014933e-05, + "gain_lf": 28.41585, + "f3db": 418889.9, + "out_swing": 0.205527, + "thd_pct": 3.34429 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 1.12, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 1.12, + "nf": 8 + }, + "M3": { + "w": 32.0, + "l": 1.12, + "nf": 64 + }, + "M4": { + "w": 64.0, + "l": 1.12, + "nf": 128 + }, + "M5": { + "w": 32.0, + "l": 1.12, + "nf": 64 + }, + "M6": { + "w": 64.0, + "l": 1.12, + "nf": 128 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 5e-06 + } + } + }, + { + "pdk": "gf180", + "ib": 1e-05, + "wd": 1, + "wf": 1, + "lm": 1.0, + "tag": "ib10u_wd1_wf1_lm1", + "qualified": false, + "reasons": [ + "thd_pct=26.52 above floor 3", + "out_swing=0.2456 below floor 0.825" + ], + "measures": { + "vout0": 1.648751, + "vin0": 0.8676514, + "iq": 3.139683e-05, + "gain_lf": 18.66359, + "f3db": 10681150.0, + "out_swing": 0.245565, + "thd_pct": 26.5163 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 0.56, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "M3": { + "w": 8.0, + "l": 0.56, + "nf": 16 + }, + "M4": { + "w": 16.0, + "l": 0.56, + "nf": 32 + }, + "M5": { + "w": 16.0, + "l": 0.56, + "nf": 32 + }, + "M6": { + "w": 32.0, + "l": 0.56, + "nf": 64 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 1e-05 + } + } + }, + { + "pdk": "gf180", + "ib": 1e-05, + "wd": 1, + "wf": 1, + "lm": 2.0, + "tag": "ib10u_wd1_wf1_lm2", + "qualified": false, + "reasons": [ + "thd_pct=42.05 above floor 3", + "out_swing=0 below floor 0.825" + ], + "measures": { + "vout0": 1.650943, + "vin0": 1.083233, + "iq": 2.944301e-05, + "gain_lf": -11.47582, + "f3db": 17673570.0, + "out_swing": 0.0, + "thd_pct": 42.046 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 1.12, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 1.12, + "nf": 8 + }, + "M3": { + "w": 8.0, + "l": 1.12, + "nf": 16 + }, + "M4": { + "w": 16.0, + "l": 1.12, + "nf": 32 + }, + "M5": { + "w": 16.0, + "l": 1.12, + "nf": 32 + }, + "M6": { + "w": 32.0, + "l": 1.12, + "nf": 64 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 1e-05 + } + } + }, + { + "pdk": "gf180", + "ib": 1e-05, + "wd": 1, + "wf": 2, + "lm": 1.0, + "tag": "ib10u_wd1_wf2_lm1", + "qualified": false, + "reasons": [ + "thd_pct=26.26 above floor 3", + "out_swing=0.2552 below floor 0.825" + ], + "measures": { + "vout0": 1.648751, + "vin0": 0.8676463, + "iq": 5.249277e-05, + "gain_lf": 18.97611, + "f3db": 9452952.0, + "out_swing": 0.255184, + "thd_pct": 26.2597 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 0.56, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "M3": { + "w": 8.0, + "l": 0.56, + "nf": 16 + }, + "M4": { + "w": 16.0, + "l": 0.56, + "nf": 32 + }, + "M5": { + "w": 32.0, + "l": 0.56, + "nf": 64 + }, + "M6": { + "w": 64.0, + "l": 0.56, + "nf": 128 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 1e-05 + } + } + }, + { + "pdk": "gf180", + "ib": 1e-05, + "wd": 1, + "wf": 2, + "lm": 2.0, + "tag": "ib10u_wd1_wf2_lm2", + "qualified": false, + "reasons": [ + "thd_pct=42.99 above floor 3", + "out_swing=0 below floor 0.825" + ], + "measures": { + "vout0": 1.650945, + "vin0": 1.083388, + "iq": 4.908924e-05, + "gain_lf": -11.08104, + "f3db": 26880700.0, + "out_swing": 0.0, + "thd_pct": 42.9943 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 1.12, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 1.12, + "nf": 8 + }, + "M3": { + "w": 8.0, + "l": 1.12, + "nf": 16 + }, + "M4": { + "w": 16.0, + "l": 1.12, + "nf": 32 + }, + "M5": { + "w": 32.0, + "l": 1.12, + "nf": 64 + }, + "M6": { + "w": 64.0, + "l": 1.12, + "nf": 128 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 1e-05 + } + } + }, + { + "pdk": "gf180", + "ib": 1e-05, + "wd": 2, + "wf": 1, + "lm": 1.0, + "tag": "ib10u_wd2_wf1_lm1", + "qualified": false, + "reasons": [ + "thd_pct=18.33 above floor 3", + "f3db=4.228e+06 below floor 5e+06", + "out_swing=0.248 below floor 0.825" + ], + "measures": { + "vout0": 1.648727, + "vin0": 0.8653915, + "iq": 2.099212e-05, + "gain_lf": 23.68099, + "f3db": 4227906.0, + "out_swing": 0.247962, + "thd_pct": 18.334 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 0.56, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "M3": { + "w": 16.0, + "l": 0.56, + "nf": 32 + }, + "M4": { + "w": 32.0, + "l": 0.56, + "nf": 64 + }, + "M5": { + "w": 16.0, + "l": 0.56, + "nf": 32 + }, + "M6": { + "w": 32.0, + "l": 0.56, + "nf": 64 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 1e-05 + } + } + }, + { + "pdk": "gf180", + "ib": 1e-05, + "wd": 2, + "wf": 1, + "lm": 2.0, + "tag": "ib10u_wd2_wf1_lm2", + "qualified": false, + "reasons": [ + "thd_pct=30.65 above floor 3", + "out_swing=0.3284 below floor 0.825" + ], + "measures": { + "vout0": 1.649993, + "vin0": 0.9892736, + "iq": 1.976616e-05, + "gain_lf": -0.9594997, + "f3db": 10320080.0, + "out_swing": 0.328429, + "thd_pct": 30.646 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 1.12, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 1.12, + "nf": 8 + }, + "M3": { + "w": 16.0, + "l": 1.12, + "nf": 32 + }, + "M4": { + "w": 32.0, + "l": 1.12, + "nf": 64 + }, + "M5": { + "w": 16.0, + "l": 1.12, + "nf": 32 + }, + "M6": { + "w": 32.0, + "l": 1.12, + "nf": 64 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 1e-05 + } + } + }, + { + "pdk": "gf180", + "ib": 1e-05, + "wd": 2, + "wf": 2, + "lm": 1.0, + "tag": "ib10u_wd2_wf2_lm1", + "qualified": false, + "reasons": [ + "thd_pct=17.22 above floor 3", + "f3db=3.666e+06 below floor 5e+06", + "out_swing=0.2619 below floor 0.825" + ], + "measures": { + "vout0": 1.648727, + "vin0": 0.8653871, + "iq": 3.164586e-05, + "gain_lf": 24.1672, + "f3db": 3665773.0, + "out_swing": 0.261944, + "thd_pct": 17.2172 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 0.56, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "M3": { + "w": 16.0, + "l": 0.56, + "nf": 32 + }, + "M4": { + "w": 32.0, + "l": 0.56, + "nf": 64 + }, + "M5": { + "w": 32.0, + "l": 0.56, + "nf": 64 + }, + "M6": { + "w": 64.0, + "l": 0.56, + "nf": 128 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 1e-05 + } + } + }, + { + "pdk": "gf180", + "ib": 1e-05, + "wd": 2, + "wf": 2, + "lm": 2.0, + "tag": "ib10u_wd2_wf2_lm2", + "qualified": false, + "reasons": [ + "thd_pct=31.73 above floor 3", + "out_swing=0.3668 below floor 0.825" + ], + "measures": { + "vout0": 1.649993, + "vin0": 0.989273, + "iq": 2.968767e-05, + "gain_lf": -0.3538898, + "f3db": 13591240.0, + "out_swing": 0.36676, + "thd_pct": 31.7323 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 1.12, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 1.12, + "nf": 8 + }, + "M3": { + "w": 16.0, + "l": 1.12, + "nf": 32 + }, + "M4": { + "w": 32.0, + "l": 1.12, + "nf": 64 + }, + "M5": { + "w": 32.0, + "l": 1.12, + "nf": 64 + }, + "M6": { + "w": 64.0, + "l": 1.12, + "nf": 128 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 1e-05 + } + } + }, + { + "pdk": "gf180", + "ib": 1e-05, + "wd": 4, + "wf": 1, + "lm": 1.0, + "tag": "ib10u_wd4_wf1_lm1", + "qualified": false, + "reasons": [ + "thd_pct=10.61 above floor 3", + "f3db=1.892e+06 below floor 5e+06", + "out_swing=0.2617 below floor 0.825" + ], + "measures": { + "vout0": 1.648717, + "vin0": 0.8644299, + "iq": 1.574572e-05, + "gain_lf": 25.6328, + "f3db": 1891859.0, + "out_swing": 0.26166, + "thd_pct": 10.6064 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 0.56, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "M3": { + "w": 32.0, + "l": 0.56, + "nf": 64 + }, + "M4": { + "w": 64.0, + "l": 0.56, + "nf": 128 + }, + "M5": { + "w": 16.0, + "l": 0.56, + "nf": 32 + }, + "M6": { + "w": 32.0, + "l": 0.56, + "nf": 64 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 1e-05 + } + } + }, + { + "pdk": "gf180", + "ib": 1e-05, + "wd": 4, + "wf": 1, + "lm": 2.0, + "tag": "ib10u_wd4_wf1_lm2", + "qualified": false, + "reasons": [ + "thd_pct=24.45 above floor 3", + "f3db=4.673e+06 below floor 5e+06", + "out_swing=0.2491 below floor 0.825" + ], + "measures": { + "vout0": 1.649756, + "vin0": 0.9656205, + "iq": 1.486696e-05, + "gain_lf": 7.40847, + "f3db": 4672922.0, + "out_swing": 0.249103, + "thd_pct": 24.454 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 1.12, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 1.12, + "nf": 8 + }, + "M3": { + "w": 32.0, + "l": 1.12, + "nf": 64 + }, + "M4": { + "w": 64.0, + "l": 1.12, + "nf": 128 + }, + "M5": { + "w": 16.0, + "l": 1.12, + "nf": 32 + }, + "M6": { + "w": 32.0, + "l": 1.12, + "nf": 64 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 1e-05 + } + } + }, + { + "pdk": "gf180", + "ib": 1e-05, + "wd": 4, + "wf": 2, + "lm": 1.0, + "tag": "ib10u_wd4_wf2_lm1", + "qualified": false, + "reasons": [ + "thd_pct=9.21 above floor 3", + "f3db=1.719e+06 below floor 5e+06", + "out_swing=0.283 below floor 0.825" + ], + "measures": { + "vout0": 1.648717, + "vin0": 0.8644242, + "iq": 2.112313e-05, + "gain_lf": 26.41188, + "f3db": 1719308.0, + "out_swing": 0.283017, + "thd_pct": 9.2099 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 0.56, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "M3": { + "w": 32.0, + "l": 0.56, + "nf": 64 + }, + "M4": { + "w": 64.0, + "l": 0.56, + "nf": 128 + }, + "M5": { + "w": 32.0, + "l": 0.56, + "nf": 64 + }, + "M6": { + "w": 64.0, + "l": 0.56, + "nf": 128 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 1e-05 + } + } + }, + { + "pdk": "gf180", + "ib": 1e-05, + "wd": 4, + "wf": 2, + "lm": 2.0, + "tag": "ib10u_wd4_wf2_lm2", + "qualified": false, + "reasons": [ + "thd_pct=25.26 above floor 3", + "out_swing=0.2779 below floor 0.825" + ], + "measures": { + "vout0": 1.649756, + "vin0": 0.96561, + "iq": 1.985952e-05, + "gain_lf": 8.344975, + "f3db": 5156542.0, + "out_swing": 0.277938, + "thd_pct": 25.2643 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 1.12, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 1.12, + "nf": 8 + }, + "M3": { + "w": 32.0, + "l": 1.12, + "nf": 64 + }, + "M4": { + "w": 64.0, + "l": 1.12, + "nf": 128 + }, + "M5": { + "w": 32.0, + "l": 1.12, + "nf": 64 + }, + "M6": { + "w": 64.0, + "l": 1.12, + "nf": 128 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 1e-05 + } + } + }, + { + "pdk": "gf180", + "ib": 2e-05, + "wd": 1, + "wf": 1, + "lm": 1.0, + "tag": "ib20u_wd1_wf1_lm1", + "qualified": false, + "reasons": [ + "thd_pct=32.9 above floor 3", + "out_swing=0.4151 below floor 0.825" + ], + "measures": { + "vout0": 1.650088, + "vin0": 0.9988306, + "iq": 5.918492e-05, + "gain_lf": -0.8197628, + "f3db": 33112140.0, + "out_swing": 0.41509, + "thd_pct": 32.8993 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 0.56, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "M3": { + "w": 8.0, + "l": 0.56, + "nf": 16 + }, + "M4": { + "w": 16.0, + "l": 0.56, + "nf": 32 + }, + "M5": { + "w": 16.0, + "l": 0.56, + "nf": 32 + }, + "M6": { + "w": 32.0, + "l": 0.56, + "nf": 64 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 2e-05 + } + } + }, + { + "pdk": "gf180", + "ib": 2e-05, + "wd": 1, + "wf": 1, + "lm": 2.0, + "tag": "ib20u_wd1_wf1_lm2", + "qualified": false, + "reasons": [ + "thd_pct=21.38 above floor 3", + "out_swing=0 below floor 0.825" + ], + "measures": { + "vout0": 1.683178, + "vin0": 1.489998, + "iq": 5.028947e-05, + "gain_lf": -23.77753, + "f3db": 23652200.0, + "out_swing": 0.0, + "thd_pct": 21.3766 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 1.12, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 1.12, + "nf": 8 + }, + "M3": { + "w": 8.0, + "l": 1.12, + "nf": 16 + }, + "M4": { + "w": 16.0, + "l": 1.12, + "nf": 32 + }, + "M5": { + "w": 16.0, + "l": 1.12, + "nf": 32 + }, + "M6": { + "w": 32.0, + "l": 1.12, + "nf": 64 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 2e-05 + } + } + }, + { + "pdk": "gf180", + "ib": 2e-05, + "wd": 1, + "wf": 2, + "lm": 1.0, + "tag": "ib20u_wd1_wf2_lm1", + "qualified": false, + "reasons": [ + "thd_pct=33.21 above floor 3", + "out_swing=0.4517 below floor 0.825" + ], + "measures": { + "vout0": 1.650088, + "vin0": 0.9988328, + "iq": 9.883681e-05, + "gain_lf": -0.6127515, + "f3db": 48907880.0, + "out_swing": 0.451692, + "thd_pct": 33.2117 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 0.56, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "M3": { + "w": 8.0, + "l": 0.56, + "nf": 16 + }, + "M4": { + "w": 16.0, + "l": 0.56, + "nf": 32 + }, + "M5": { + "w": 32.0, + "l": 0.56, + "nf": 64 + }, + "M6": { + "w": 64.0, + "l": 0.56, + "nf": 128 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 2e-05 + } + } + }, + { + "pdk": "gf180", + "ib": 2e-05, + "wd": 1, + "wf": 2, + "lm": 2.0, + "tag": "ib20u_wd1_wf2_lm2", + "qualified": false, + "reasons": [ + "thd_pct=21.48 above floor 3", + "out_swing=0 below floor 0.825" + ], + "measures": { + "vout0": 1.684363, + "vin0": 1.489999, + "iq": 8.32498e-05, + "gain_lf": -23.46383, + "f3db": 43591760.0, + "out_swing": 0.0, + "thd_pct": 21.4762 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 1.12, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 1.12, + "nf": 8 + }, + "M3": { + "w": 8.0, + "l": 1.12, + "nf": 16 + }, + "M4": { + "w": 16.0, + "l": 1.12, + "nf": 32 + }, + "M5": { + "w": 32.0, + "l": 1.12, + "nf": 64 + }, + "M6": { + "w": 64.0, + "l": 1.12, + "nf": 128 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 2e-05 + } + } + }, + { + "pdk": "gf180", + "ib": 2e-05, + "wd": 2, + "wf": 1, + "lm": 1.0, + "tag": "ib20u_wd2_wf1_lm1", + "qualified": false, + "reasons": [ + "thd_pct=26.82 above floor 3", + "out_swing=0.3225 below floor 0.825" + ], + "measures": { + "vout0": 1.649797, + "vin0": 0.9697261, + "iq": 3.976768e-05, + "gain_lf": 8.314162, + "f3db": 17333130.0, + "out_swing": 0.322513, + "thd_pct": 26.8177 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 0.56, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "M3": { + "w": 16.0, + "l": 0.56, + "nf": 32 + }, + "M4": { + "w": 32.0, + "l": 0.56, + "nf": 64 + }, + "M5": { + "w": 16.0, + "l": 0.56, + "nf": 32 + }, + "M6": { + "w": 32.0, + "l": 0.56, + "nf": 64 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 2e-05 + } + } + }, + { + "pdk": "gf180", + "ib": 2e-05, + "wd": 2, + "wf": 1, + "lm": 2.0, + "tag": "ib20u_wd2_wf1_lm2", + "qualified": false, + "reasons": [ + "thd_pct=32.42 above floor 3", + "out_swing=0 below floor 0.825" + ], + "measures": { + "vout0": 1.654744, + "vin0": 1.359598, + "iq": 3.695314e-05, + "gain_lf": -17.54634, + "f3db": 16864370.0, + "out_swing": 0.0, + "thd_pct": 32.4208 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 1.12, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 1.12, + "nf": 8 + }, + "M3": { + "w": 16.0, + "l": 1.12, + "nf": 32 + }, + "M4": { + "w": 32.0, + "l": 1.12, + "nf": 64 + }, + "M5": { + "w": 16.0, + "l": 1.12, + "nf": 32 + }, + "M6": { + "w": 32.0, + "l": 1.12, + "nf": 64 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 2e-05 + } + } + }, + { + "pdk": "gf180", + "ib": 2e-05, + "wd": 2, + "wf": 2, + "lm": 1.0, + "tag": "ib20u_wd2_wf2_lm1", + "qualified": false, + "reasons": [ + "thd_pct=27.08 above floor 3", + "out_swing=0.3468 below floor 0.825" + ], + "measures": { + "vout0": 1.649797, + "vin0": 0.9697233, + "iq": 5.986201e-05, + "gain_lf": 8.629879, + "f3db": 21581170.0, + "out_swing": 0.346841, + "thd_pct": 27.0752 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 0.56, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "M3": { + "w": 16.0, + "l": 0.56, + "nf": 32 + }, + "M4": { + "w": 32.0, + "l": 0.56, + "nf": 64 + }, + "M5": { + "w": 32.0, + "l": 0.56, + "nf": 64 + }, + "M6": { + "w": 64.0, + "l": 0.56, + "nf": 128 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 2e-05 + } + } + }, + { + "pdk": "gf180", + "ib": 2e-05, + "wd": 2, + "wf": 2, + "lm": 2.0, + "tag": "ib20u_wd2_wf2_lm2", + "qualified": false, + "reasons": [ + "thd_pct=32.52 above floor 3", + "out_swing=0 below floor 0.825" + ], + "measures": { + "vout0": 1.654776, + "vin0": 1.361056, + "iq": 5.542531e-05, + "gain_lf": -17.17082, + "f3db": 29737190.0, + "out_swing": 0.0, + "thd_pct": 32.5179 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 1.12, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 1.12, + "nf": 8 + }, + "M3": { + "w": 16.0, + "l": 1.12, + "nf": 32 + }, + "M4": { + "w": 32.0, + "l": 1.12, + "nf": 64 + }, + "M5": { + "w": 32.0, + "l": 1.12, + "nf": 64 + }, + "M6": { + "w": 64.0, + "l": 1.12, + "nf": 128 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 2e-05 + } + } + }, + { + "pdk": "gf180", + "ib": 2e-05, + "wd": 4, + "wf": 1, + "lm": 1.0, + "tag": "ib20u_wd4_wf1_lm1", + "qualified": false, + "reasons": [ + "thd_pct=22.81 above floor 3", + "out_swing=0.2389 below floor 0.825" + ], + "measures": { + "vout0": 1.649718, + "vin0": 0.9618687, + "iq": 2.992177e-05, + "gain_lf": 15.0179, + "f3db": 7232390.0, + "out_swing": 0.238947, + "thd_pct": 22.8083 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 0.56, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "M3": { + "w": 32.0, + "l": 0.56, + "nf": 64 + }, + "M4": { + "w": 64.0, + "l": 0.56, + "nf": 128 + }, + "M5": { + "w": 16.0, + "l": 0.56, + "nf": 32 + }, + "M6": { + "w": 32.0, + "l": 0.56, + "nf": 64 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 2e-05 + } + } + }, + { + "pdk": "gf180", + "ib": 2e-05, + "wd": 4, + "wf": 1, + "lm": 2.0, + "tag": "ib20u_wd4_wf1_lm2", + "qualified": false, + "reasons": [ + "thd_pct=35.03 above floor 3", + "out_swing=0 below floor 0.825" + ], + "measures": { + "vout0": 1.652269, + "vin0": 1.202503, + "iq": 2.858549e-05, + "gain_lf": -9.469554, + "f3db": 10850530.0, + "out_swing": 0.0, + "thd_pct": 35.0279 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 1.12, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 1.12, + "nf": 8 + }, + "M3": { + "w": 32.0, + "l": 1.12, + "nf": 64 + }, + "M4": { + "w": 64.0, + "l": 1.12, + "nf": 128 + }, + "M5": { + "w": 16.0, + "l": 1.12, + "nf": 32 + }, + "M6": { + "w": 32.0, + "l": 1.12, + "nf": 64 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 2e-05 + } + } + }, + { + "pdk": "gf180", + "ib": 2e-05, + "wd": 4, + "wf": 2, + "lm": 1.0, + "tag": "ib20u_wd4_wf2_lm1", + "qualified": false, + "reasons": [ + "thd_pct=22.89 above floor 3", + "out_swing=0.2546 below floor 0.825" + ], + "measures": { + "vout0": 1.649718, + "vin0": 0.961866, + "iq": 4.008038e-05, + "gain_lf": 15.51573, + "f3db": 7740844.0, + "out_swing": 0.254633, + "thd_pct": 22.895 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 0.56, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.56, + "nf": 8 + }, + "M3": { + "w": 32.0, + "l": 0.56, + "nf": 64 + }, + "M4": { + "w": 64.0, + "l": 0.56, + "nf": 128 + }, + "M5": { + "w": 32.0, + "l": 0.56, + "nf": 64 + }, + "M6": { + "w": 64.0, + "l": 0.56, + "nf": 128 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 2e-05 + } + } + }, + { + "pdk": "gf180", + "ib": 2e-05, + "wd": 4, + "wf": 2, + "lm": 2.0, + "tag": "ib20u_wd4_wf2_lm2", + "qualified": false, + "reasons": [ + "thd_pct=36.73 above floor 3", + "out_swing=0 below floor 0.825" + ], + "measures": { + "vout0": 1.652274, + "vin0": 1.202952, + "iq": 3.814683e-05, + "gain_lf": -8.875622, + "f3db": 17072460.0, + "out_swing": 0.0, + "thd_pct": 36.7304 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 1.12, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 1.12, + "nf": 8 + }, + "M3": { + "w": 32.0, + "l": 1.12, + "nf": 64 + }, + "M4": { + "w": 64.0, + "l": 1.12, + "nf": 128 + }, + "M5": { + "w": 32.0, + "l": 1.12, + "nf": 64 + }, + "M6": { + "w": 64.0, + "l": 1.12, + "nf": 128 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 2e-05 + } + } + }, + { + "pdk": "sky130", + "ib": 5e-06, + "wd": 1, + "wf": 1, + "lm": 1.0, + "tag": "ib5u_wd1_wf1_lm1", + "qualified": false, + "reasons": [ + "servo did not reach the output target: vout0=0.9560967 target=0.9 (tol 0.036 V)", + "thd_pct=52.5 above floor 3", + "out_swing=0 below floor 0.45" + ], + "measures": { + "vout0": 0.9560967, + "vin0": 1.04, + "iq": 1.553827e-05, + "gain_lf": -40.9451, + "f3db": 14921480.0, + "out_swing": 0.0, + "thd_pct": 52.4956 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 0.3, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.3, + "nf": 8 + }, + "M3": { + "w": 8.0, + "l": 0.3, + "nf": 16 + }, + "M4": { + "w": 16.0, + "l": 0.3, + "nf": 32 + }, + "M5": { + "w": 16.0, + "l": 0.3, + "nf": 32 + }, + "M6": { + "w": 32.0, + "l": 0.3, + "nf": 64 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 5e-06 + } + } + }, + { + "pdk": "sky130", + "ib": 5e-06, + "wd": 1, + "wf": 1, + "lm": 2.0, + "tag": "ib5u_wd1_wf1_lm2", + "qualified": false, + "reasons": [ + "servo did not reach the output target: vout0=0.9949824 target=0.9 (tol 0.036 V)", + "thd_pct=43.57 above floor 3", + "out_swing=0 below floor 0.45" + ], + "measures": { + "vout0": 0.9949824, + "vin0": 1.04, + "iq": 8.742031e-06, + "gain_lf": -49.73784, + "f3db": 8315345.0, + "out_swing": 0.0, + "thd_pct": 43.5718 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 0.6, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.6, + "nf": 8 + }, + "M3": { + "w": 8.0, + "l": 0.6, + "nf": 16 + }, + "M4": { + "w": 16.0, + "l": 0.6, + "nf": 32 + }, + "M5": { + "w": 16.0, + "l": 0.6, + "nf": 32 + }, + "M6": { + "w": 32.0, + "l": 0.6, + "nf": 64 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 5e-06 + } + } + }, + { + "pdk": "sky130", + "ib": 5e-06, + "wd": 1, + "wf": 2, + "lm": 1.0, + "tag": "ib5u_wd1_wf2_lm1", + "qualified": false, + "reasons": [ + "servo did not reach the output target: vout0=0.9592771 target=0.9 (tol 0.036 V)", + "thd_pct=53.34 above floor 3", + "out_swing=0 below floor 0.45" + ], + "measures": { + "vout0": 0.9592771, + "vin0": 1.04, + "iq": 2.48694e-05, + "gain_lf": -40.16981, + "f3db": 28205040.0, + "out_swing": 0.0, + "thd_pct": 53.3379 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 0.3, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.3, + "nf": 8 + }, + "M3": { + "w": 8.0, + "l": 0.3, + "nf": 16 + }, + "M4": { + "w": 16.0, + "l": 0.3, + "nf": 32 + }, + "M5": { + "w": 32.0, + "l": 0.3, + "nf": 64 + }, + "M6": { + "w": 64.0, + "l": 0.3, + "nf": 128 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 5e-06 + } + } + }, + { + "pdk": "sky130", + "ib": 5e-06, + "wd": 1, + "wf": 2, + "lm": 2.0, + "tag": "ib5u_wd1_wf2_lm2", + "qualified": false, + "reasons": [ + "servo did not reach the output target: vout0=1.005593 target=0.9 (tol 0.036 V)", + "thd_pct=44.8 above floor 3", + "out_swing=0 below floor 0.45" + ], + "measures": { + "vout0": 1.005593, + "vin0": 1.04, + "iq": 1.24975e-05, + "gain_lf": -47.38862, + "f3db": 13834100.0, + "out_swing": 0.0, + "thd_pct": 44.8018 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 0.6, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.6, + "nf": 8 + }, + "M3": { + "w": 8.0, + "l": 0.6, + "nf": 16 + }, + "M4": { + "w": 16.0, + "l": 0.6, + "nf": 32 + }, + "M5": { + "w": 32.0, + "l": 0.6, + "nf": 64 + }, + "M6": { + "w": 64.0, + "l": 0.6, + "nf": 128 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 5e-06 + } + } + }, + { + "pdk": "sky130", + "ib": 5e-06, + "wd": 2, + "wf": 1, + "lm": 1.0, + "tag": "ib5u_wd2_wf1_lm1", + "qualified": false, + "reasons": [ + "servo did not reach the output target: vout0=0.9445714 target=0.9 (tol 0.036 V)", + "thd_pct=53.23 above floor 3", + "out_swing=0 below floor 0.45" + ], + "measures": { + "vout0": 0.9445714, + "vin0": 1.04, + "iq": 1.516557e-05, + "gain_lf": -36.43454, + "f3db": 11827570.0, + "out_swing": 0.0, + "thd_pct": 53.2295 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 0.3, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.3, + "nf": 8 + }, + "M3": { + "w": 16.0, + "l": 0.3, + "nf": 32 + }, + "M4": { + "w": 32.0, + "l": 0.3, + "nf": 64 + }, + "M5": { + "w": 16.0, + "l": 0.3, + "nf": 32 + }, + "M6": { + "w": 32.0, + "l": 0.3, + "nf": 64 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 5e-06 + } + } + }, + { + "pdk": "sky130", + "ib": 5e-06, + "wd": 2, + "wf": 1, + "lm": 2.0, + "tag": "ib5u_wd2_wf1_lm2", + "qualified": false, + "reasons": [ + "servo did not reach the output target: vout0=0.987495 target=0.9 (tol 0.036 V)", + "thd_pct=42.55 above floor 3", + "out_swing=0 below floor 0.45" + ], + "measures": { + "vout0": 0.987495, + "vin0": 1.04, + "iq": 9.145518e-06, + "gain_lf": -44.07203, + "f3db": 7444937.0, + "out_swing": 0.0, + "thd_pct": 42.546 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 0.6, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.6, + "nf": 8 + }, + "M3": { + "w": 16.0, + "l": 0.6, + "nf": 32 + }, + "M4": { + "w": 32.0, + "l": 0.6, + "nf": 64 + }, + "M5": { + "w": 16.0, + "l": 0.6, + "nf": 32 + }, + "M6": { + "w": 32.0, + "l": 0.6, + "nf": 64 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 5e-06 + } + } + }, + { + "pdk": "sky130", + "ib": 5e-06, + "wd": 2, + "wf": 2, + "lm": 1.0, + "tag": "ib5u_wd2_wf2_lm1", + "qualified": false, + "reasons": [ + "servo did not reach the output target: vout0=0.947803 target=0.9 (tol 0.036 V)", + "thd_pct=54.51 above floor 3", + "out_swing=0 below floor 0.45" + ], + "measures": { + "vout0": 0.947803, + "vin0": 1.04, + "iq": 2.218849e-05, + "gain_lf": -35.6245, + "f3db": 21855840.0, + "out_swing": 0.0, + "thd_pct": 54.506 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 0.3, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.3, + "nf": 8 + }, + "M3": { + "w": 16.0, + "l": 0.3, + "nf": 32 + }, + "M4": { + "w": 32.0, + "l": 0.3, + "nf": 64 + }, + "M5": { + "w": 32.0, + "l": 0.3, + "nf": 64 + }, + "M6": { + "w": 64.0, + "l": 0.3, + "nf": 128 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 5e-06 + } + } + }, + { + "pdk": "sky130", + "ib": 5e-06, + "wd": 2, + "wf": 2, + "lm": 2.0, + "tag": "ib5u_wd2_wf2_lm2", + "qualified": false, + "reasons": [ + "servo did not reach the output target: vout0=0.998576 target=0.9 (tol 0.036 V)", + "thd_pct=43.91 above floor 3", + "out_swing=0 below floor 0.45" + ], + "measures": { + "vout0": 0.998576, + "vin0": 1.04, + "iq": 1.231796e-05, + "gain_lf": -42.04041, + "f3db": 11957340.0, + "out_swing": 0.0, + "thd_pct": 43.9051 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 0.6, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.6, + "nf": 8 + }, + "M3": { + "w": 16.0, + "l": 0.6, + "nf": 32 + }, + "M4": { + "w": 32.0, + "l": 0.6, + "nf": 64 + }, + "M5": { + "w": 32.0, + "l": 0.6, + "nf": 64 + }, + "M6": { + "w": 64.0, + "l": 0.6, + "nf": 128 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 5e-06 + } + } + }, + { + "pdk": "sky130", + "ib": 5e-06, + "wd": 4, + "wf": 1, + "lm": 1.0, + "tag": "ib5u_wd4_wf1_lm1", + "qualified": false, + "reasons": [ + "thd_pct=55.58 above floor 3", + "out_swing=0 below floor 0.45" + ], + "measures": { + "vout0": 0.9288694, + "vin0": 1.03999, + "iq": 1.48226e-05, + "gain_lf": -32.9071, + "f3db": 8682204.0, + "out_swing": 0.0, + "thd_pct": 55.5838 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 0.3, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.3, + "nf": 8 + }, + "M3": { + "w": 32.0, + "l": 0.3, + "nf": 64 + }, + "M4": { + "w": 64.0, + "l": 0.3, + "nf": 128 + }, + "M5": { + "w": 16.0, + "l": 0.3, + "nf": 32 + }, + "M6": { + "w": 32.0, + "l": 0.3, + "nf": 64 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 5e-06 + } + } + }, + { + "pdk": "sky130", + "ib": 5e-06, + "wd": 4, + "wf": 1, + "lm": 2.0, + "tag": "ib5u_wd4_wf1_lm2", + "qualified": false, + "reasons": [ + "servo did not reach the output target: vout0=0.9764401 target=0.9 (tol 0.036 V)", + "thd_pct=42.15 above floor 3", + "out_swing=0 below floor 0.45" + ], + "measures": { + "vout0": 0.9764401, + "vin0": 1.04, + "iq": 9.726633e-06, + "gain_lf": -39.10968, + "f3db": 6396320.0, + "out_swing": 0.0, + "thd_pct": 42.1513 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 0.6, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.6, + "nf": 8 + }, + "M3": { + "w": 32.0, + "l": 0.6, + "nf": 64 + }, + "M4": { + "w": 64.0, + "l": 0.6, + "nf": 128 + }, + "M5": { + "w": 16.0, + "l": 0.6, + "nf": 32 + }, + "M6": { + "w": 32.0, + "l": 0.6, + "nf": 64 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 5e-06 + } + } + }, + { + "pdk": "sky130", + "ib": 5e-06, + "wd": 4, + "wf": 2, + "lm": 1.0, + "tag": "ib5u_wd4_wf2_lm1", + "qualified": false, + "reasons": [ + "thd_pct=57.53 above floor 3", + "out_swing=0 below floor 0.45" + ], + "measures": { + "vout0": 0.9317904, + "vin0": 1.039997, + "iq": 1.960162e-05, + "gain_lf": -31.97278, + "f3db": 15555270.0, + "out_swing": 0.0, + "thd_pct": 57.5282 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 0.3, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.3, + "nf": 8 + }, + "M3": { + "w": 32.0, + "l": 0.3, + "nf": 64 + }, + "M4": { + "w": 64.0, + "l": 0.3, + "nf": 128 + }, + "M5": { + "w": 32.0, + "l": 0.3, + "nf": 64 + }, + "M6": { + "w": 64.0, + "l": 0.3, + "nf": 128 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 5e-06 + } + } + }, + { + "pdk": "sky130", + "ib": 5e-06, + "wd": 4, + "wf": 2, + "lm": 2.0, + "tag": "ib5u_wd4_wf2_lm2", + "qualified": false, + "reasons": [ + "servo did not reach the output target: vout0=0.9879986 target=0.9 (tol 0.036 V)", + "thd_pct=43.51 above floor 3", + "out_swing=0 below floor 0.45" + ], + "measures": { + "vout0": 0.9879986, + "vin0": 1.04, + "iq": 1.223281e-05, + "gain_lf": -37.34761, + "f3db": 9839779.0, + "out_swing": 0.0, + "thd_pct": 43.5102 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 0.6, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.6, + "nf": 8 + }, + "M3": { + "w": 32.0, + "l": 0.6, + "nf": 64 + }, + "M4": { + "w": 64.0, + "l": 0.6, + "nf": 128 + }, + "M5": { + "w": 32.0, + "l": 0.6, + "nf": 64 + }, + "M6": { + "w": 64.0, + "l": 0.6, + "nf": 128 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 5e-06 + } + } + }, + { + "pdk": "sky130", + "ib": 1e-05, + "wd": 1, + "wf": 1, + "lm": 1.0, + "tag": "ib10u_wd1_wf1_lm1", + "qualified": false, + "reasons": [ + "servo did not reach the output target: vout0=0.9608078 target=0.9 (tol 0.036 V)", + "thd_pct=52.07 above floor 3", + "out_swing=0 below floor 0.45" + ], + "measures": { + "vout0": 0.9608078, + "vin0": 1.04, + "iq": 1.685244e-05, + "gain_lf": -40.81587, + "f3db": 15924530.0, + "out_swing": 0.0, + "thd_pct": 52.0717 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 0.3, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.3, + "nf": 8 + }, + "M3": { + "w": 8.0, + "l": 0.3, + "nf": 16 + }, + "M4": { + "w": 16.0, + "l": 0.3, + "nf": 32 + }, + "M5": { + "w": 16.0, + "l": 0.3, + "nf": 32 + }, + "M6": { + "w": 32.0, + "l": 0.3, + "nf": 64 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 1e-05 + } + } + }, + { + "pdk": "sky130", + "ib": 1e-05, + "wd": 1, + "wf": 1, + "lm": 2.0, + "tag": "ib10u_wd1_wf1_lm2", + "qualified": false, + "reasons": [ + "servo did not reach the output target: vout0=0.9975618 target=0.9 (tol 0.036 V)", + "thd_pct=43.31 above floor 3", + "out_swing=0 below floor 0.45" + ], + "measures": { + "vout0": 0.9975618, + "vin0": 1.04, + "iq": 9.059618e-06, + "gain_lf": -50.0145, + "f3db": 8525450.0, + "out_swing": 0.0, + "thd_pct": 43.3114 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 0.6, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.6, + "nf": 8 + }, + "M3": { + "w": 8.0, + "l": 0.6, + "nf": 16 + }, + "M4": { + "w": 16.0, + "l": 0.6, + "nf": 32 + }, + "M5": { + "w": 16.0, + "l": 0.6, + "nf": 32 + }, + "M6": { + "w": 32.0, + "l": 0.6, + "nf": 64 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 1e-05 + } + } + }, + { + "pdk": "sky130", + "ib": 1e-05, + "wd": 1, + "wf": 2, + "lm": 1.0, + "tag": "ib10u_wd1_wf2_lm1", + "qualified": false, + "reasons": [ + "servo did not reach the output target: vout0=0.9640223 target=0.9 (tol 0.036 V)", + "thd_pct=52.94 above floor 3", + "out_swing=0 below floor 0.45" + ], + "measures": { + "vout0": 0.9640223, + "vin0": 1.04, + "iq": 2.696423e-05, + "gain_lf": -40.01856, + "f3db": 30138050.0, + "out_swing": 0.0, + "thd_pct": 52.9397 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 0.3, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.3, + "nf": 8 + }, + "M3": { + "w": 8.0, + "l": 0.3, + "nf": 16 + }, + "M4": { + "w": 16.0, + "l": 0.3, + "nf": 32 + }, + "M5": { + "w": 32.0, + "l": 0.3, + "nf": 64 + }, + "M6": { + "w": 64.0, + "l": 0.3, + "nf": 128 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 1e-05 + } + } + }, + { + "pdk": "sky130", + "ib": 1e-05, + "wd": 1, + "wf": 2, + "lm": 2.0, + "tag": "ib10u_wd1_wf2_lm2", + "qualified": false, + "reasons": [ + "servo did not reach the output target: vout0=1.008124 target=0.9 (tol 0.036 V)", + "thd_pct=44.58 above floor 3", + "out_swing=0 below floor 0.45" + ], + "measures": { + "vout0": 1.008124, + "vin0": 1.04, + "iq": 1.296793e-05, + "gain_lf": -47.49807, + "f3db": 14191540.0, + "out_swing": 0.0, + "thd_pct": 44.5812 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 0.6, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.6, + "nf": 8 + }, + "M3": { + "w": 8.0, + "l": 0.6, + "nf": 16 + }, + "M4": { + "w": 16.0, + "l": 0.6, + "nf": 32 + }, + "M5": { + "w": 32.0, + "l": 0.6, + "nf": 64 + }, + "M6": { + "w": 64.0, + "l": 0.6, + "nf": 128 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 1e-05 + } + } + }, + { + "pdk": "sky130", + "ib": 1e-05, + "wd": 2, + "wf": 1, + "lm": 1.0, + "tag": "ib10u_wd2_wf1_lm1", + "qualified": false, + "reasons": [ + "servo did not reach the output target: vout0=0.9520027 target=0.9 (tol 0.036 V)", + "thd_pct=52.36 above floor 3", + "out_swing=0 below floor 0.45" + ], + "measures": { + "vout0": 0.9520027, + "vin0": 1.04, + "iq": 1.722976e-05, + "gain_lf": -36.05978, + "f3db": 13074950.0, + "out_swing": 0.0, + "thd_pct": 52.3589 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 0.3, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.3, + "nf": 8 + }, + "M3": { + "w": 16.0, + "l": 0.3, + "nf": 32 + }, + "M4": { + "w": 32.0, + "l": 0.3, + "nf": 64 + }, + "M5": { + "w": 16.0, + "l": 0.3, + "nf": 32 + }, + "M6": { + "w": 32.0, + "l": 0.3, + "nf": 64 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 1e-05 + } + } + }, + { + "pdk": "sky130", + "ib": 1e-05, + "wd": 2, + "wf": 1, + "lm": 2.0, + "tag": "ib10u_wd2_wf1_lm2", + "qualified": false, + "reasons": [ + "servo did not reach the output target: vout0=0.9917873 target=0.9 (tol 0.036 V)", + "thd_pct=41.94 above floor 3", + "out_swing=0 below floor 0.45" + ], + "measures": { + "vout0": 0.9917873, + "vin0": 1.04, + "iq": 9.714555e-06, + "gain_lf": -44.31295, + "f3db": 7761509.0, + "out_swing": 0.0, + "thd_pct": 41.9434 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 0.6, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.6, + "nf": 8 + }, + "M3": { + "w": 16.0, + "l": 0.6, + "nf": 32 + }, + "M4": { + "w": 32.0, + "l": 0.6, + "nf": 64 + }, + "M5": { + "w": 16.0, + "l": 0.6, + "nf": 32 + }, + "M6": { + "w": 32.0, + "l": 0.6, + "nf": 64 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 1e-05 + } + } + }, + { + "pdk": "sky130", + "ib": 1e-05, + "wd": 2, + "wf": 2, + "lm": 1.0, + "tag": "ib10u_wd2_wf2_lm1", + "qualified": false, + "reasons": [ + "servo did not reach the output target: vout0=0.9553883 target=0.9 (tol 0.036 V)", + "thd_pct=53.7 above floor 3", + "out_swing=0 below floor 0.45" + ], + "measures": { + "vout0": 0.9553883, + "vin0": 1.04, + "iq": 2.516984e-05, + "gain_lf": -35.23999, + "f3db": 24283330.0, + "out_swing": 0.0, + "thd_pct": 53.6998 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 0.3, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.3, + "nf": 8 + }, + "M3": { + "w": 16.0, + "l": 0.3, + "nf": 32 + }, + "M4": { + "w": 32.0, + "l": 0.3, + "nf": 64 + }, + "M5": { + "w": 32.0, + "l": 0.3, + "nf": 64 + }, + "M6": { + "w": 64.0, + "l": 0.3, + "nf": 128 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 1e-05 + } + } + }, + { + "pdk": "sky130", + "ib": 1e-05, + "wd": 2, + "wf": 2, + "lm": 2.0, + "tag": "ib10u_wd2_wf2_lm2", + "qualified": false, + "reasons": [ + "servo did not reach the output target: vout0=1.002846 target=0.9 (tol 0.036 V)", + "thd_pct=43.37 above floor 3", + "out_swing=0 below floor 0.45" + ], + "measures": { + "vout0": 1.002846, + "vin0": 1.04, + "iq": 1.309094e-05, + "gain_lf": -42.09707, + "f3db": 12527510.0, + "out_swing": 0.0, + "thd_pct": 43.3732 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 0.6, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.6, + "nf": 8 + }, + "M3": { + "w": 16.0, + "l": 0.6, + "nf": 32 + }, + "M4": { + "w": 32.0, + "l": 0.6, + "nf": 64 + }, + "M5": { + "w": 32.0, + "l": 0.6, + "nf": 64 + }, + "M6": { + "w": 64.0, + "l": 0.6, + "nf": 128 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 1e-05 + } + } + }, + { + "pdk": "sky130", + "ib": 1e-05, + "wd": 4, + "wf": 1, + "lm": 1.0, + "tag": "ib10u_wd4_wf1_lm1", + "qualified": false, + "reasons": [ + "servo did not reach the output target: vout0=0.9398318 target=0.9 (tol 0.036 V)", + "thd_pct=53.9 above floor 3", + "out_swing=0 below floor 0.45" + ], + "measures": { + "vout0": 0.9398318, + "vin0": 1.04, + "iq": 1.796408e-05, + "gain_lf": -32.12179, + "f3db": 10044100.0, + "out_swing": 0.0, + "thd_pct": 53.8994 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 0.3, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.3, + "nf": 8 + }, + "M3": { + "w": 32.0, + "l": 0.3, + "nf": 64 + }, + "M4": { + "w": 64.0, + "l": 0.3, + "nf": 128 + }, + "M5": { + "w": 16.0, + "l": 0.3, + "nf": 32 + }, + "M6": { + "w": 32.0, + "l": 0.3, + "nf": 64 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 1e-05 + } + } + }, + { + "pdk": "sky130", + "ib": 1e-05, + "wd": 4, + "wf": 1, + "lm": 2.0, + "tag": "ib10u_wd4_wf1_lm2", + "qualified": false, + "reasons": [ + "servo did not reach the output target: vout0=0.983061 target=0.9 (tol 0.036 V)", + "thd_pct=41.05 above floor 3", + "out_swing=0 below floor 0.45" + ], + "measures": { + "vout0": 0.983061, + "vin0": 1.04, + "iq": 1.070104e-05, + "gain_lf": -39.19398, + "f3db": 6813374.0, + "out_swing": 0.0, + "thd_pct": 41.0522 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 0.6, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.6, + "nf": 8 + }, + "M3": { + "w": 32.0, + "l": 0.6, + "nf": 64 + }, + "M4": { + "w": 64.0, + "l": 0.6, + "nf": 128 + }, + "M5": { + "w": 16.0, + "l": 0.6, + "nf": 32 + }, + "M6": { + "w": 32.0, + "l": 0.6, + "nf": 64 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 1e-05 + } + } + }, + { + "pdk": "sky130", + "ib": 1e-05, + "wd": 4, + "wf": 2, + "lm": 1.0, + "tag": "ib10u_wd4_wf2_lm1", + "qualified": false, + "reasons": [ + "servo did not reach the output target: vout0=0.9432735 target=0.9 (tol 0.036 V)", + "thd_pct=55.95 above floor 3", + "out_swing=0 below floor 0.45" + ], + "measures": { + "vout0": 0.9432735, + "vin0": 1.04, + "iq": 2.368228e-05, + "gain_lf": -31.2193, + "f3db": 18172020.0, + "out_swing": 0.0, + "thd_pct": 55.9466 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 0.3, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.3, + "nf": 8 + }, + "M3": { + "w": 32.0, + "l": 0.3, + "nf": 64 + }, + "M4": { + "w": 64.0, + "l": 0.3, + "nf": 128 + }, + "M5": { + "w": 32.0, + "l": 0.3, + "nf": 64 + }, + "M6": { + "w": 64.0, + "l": 0.3, + "nf": 128 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 1e-05 + } + } + }, + { + "pdk": "sky130", + "ib": 1e-05, + "wd": 4, + "wf": 2, + "lm": 2.0, + "tag": "ib10u_wd4_wf2_lm2", + "qualified": false, + "reasons": [ + "servo did not reach the output target: vout0=0.9947265 target=0.9 (tol 0.036 V)", + "thd_pct=42.47 above floor 3", + "out_swing=0 below floor 0.45" + ], + "measures": { + "vout0": 0.9947265, + "vin0": 1.04, + "iq": 1.343854e-05, + "gain_lf": -37.26719, + "f3db": 10572330.0, + "out_swing": 0.0, + "thd_pct": 42.4672 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 0.6, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.6, + "nf": 8 + }, + "M3": { + "w": 32.0, + "l": 0.6, + "nf": 64 + }, + "M4": { + "w": 64.0, + "l": 0.6, + "nf": 128 + }, + "M5": { + "w": 32.0, + "l": 0.6, + "nf": 64 + }, + "M6": { + "w": 64.0, + "l": 0.6, + "nf": 128 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 1e-05 + } + } + }, + { + "pdk": "sky130", + "ib": 2e-05, + "wd": 1, + "wf": 1, + "lm": 1.0, + "tag": "ib20u_wd1_wf1_lm1", + "qualified": false, + "reasons": [ + "servo did not reach the output target: vout0=0.9644481 target=0.9 (tol 0.036 V)", + "thd_pct=51.71 above floor 3", + "out_swing=0 below floor 0.45" + ], + "measures": { + "vout0": 0.9644481, + "vin0": 1.04, + "iq": 1.791735e-05, + "gain_lf": -40.76458, + "f3db": 16728900.0, + "out_swing": 0.0, + "thd_pct": 51.7123 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 0.3, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.3, + "nf": 8 + }, + "M3": { + "w": 8.0, + "l": 0.3, + "nf": 16 + }, + "M4": { + "w": 16.0, + "l": 0.3, + "nf": 32 + }, + "M5": { + "w": 16.0, + "l": 0.3, + "nf": 32 + }, + "M6": { + "w": 32.0, + "l": 0.3, + "nf": 64 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 2e-05 + } + } + }, + { + "pdk": "sky130", + "ib": 2e-05, + "wd": 1, + "wf": 1, + "lm": 2.0, + "tag": "ib20u_wd1_wf1_lm2", + "qualified": false, + "reasons": [ + "servo did not reach the output target: vout0=0.999616 target=0.9 (tol 0.036 V)", + "thd_pct=43.08 above floor 3", + "out_swing=0 below floor 0.45" + ], + "measures": { + "vout0": 0.999616, + "vin0": 1.04, + "iq": 9.318186e-06, + "gain_lf": -50.29108, + "f3db": 8695030.0, + "out_swing": 0.0, + "thd_pct": 43.0831 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 0.6, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.6, + "nf": 8 + }, + "M3": { + "w": 8.0, + "l": 0.6, + "nf": 16 + }, + "M4": { + "w": 16.0, + "l": 0.6, + "nf": 32 + }, + "M5": { + "w": 16.0, + "l": 0.6, + "nf": 32 + }, + "M6": { + "w": 32.0, + "l": 0.6, + "nf": 64 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 2e-05 + } + } + }, + { + "pdk": "sky130", + "ib": 2e-05, + "wd": 1, + "wf": 2, + "lm": 1.0, + "tag": "ib20u_wd1_wf2_lm1", + "qualified": false, + "reasons": [ + "servo did not reach the output target: vout0=0.9676793 target=0.9 (tol 0.036 V)", + "thd_pct=52.61 above floor 3", + "out_swing=0 below floor 0.45" + ], + "measures": { + "vout0": 0.9676793, + "vin0": 1.04, + "iq": 2.86652e-05, + "gain_lf": -39.94438, + "f3db": 31673070.0, + "out_swing": 0.0, + "thd_pct": 52.6111 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 0.3, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.3, + "nf": 8 + }, + "M3": { + "w": 8.0, + "l": 0.3, + "nf": 16 + }, + "M4": { + "w": 16.0, + "l": 0.3, + "nf": 32 + }, + "M5": { + "w": 32.0, + "l": 0.3, + "nf": 64 + }, + "M6": { + "w": 64.0, + "l": 0.3, + "nf": 128 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 2e-05 + } + } + }, + { + "pdk": "sky130", + "ib": 2e-05, + "wd": 1, + "wf": 2, + "lm": 2.0, + "tag": "ib20u_wd1_wf2_lm2", + "qualified": false, + "reasons": [ + "servo did not reach the output target: vout0=1.010137 target=0.9 (tol 0.036 V)", + "thd_pct=44.4 above floor 3", + "out_swing=0 below floor 0.45" + ], + "measures": { + "vout0": 1.010137, + "vin0": 1.04, + "iq": 1.335239e-05, + "gain_lf": -47.6189, + "f3db": 14473080.0, + "out_swing": 0.0, + "thd_pct": 44.3969 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 0.6, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.6, + "nf": 8 + }, + "M3": { + "w": 8.0, + "l": 0.6, + "nf": 16 + }, + "M4": { + "w": 16.0, + "l": 0.6, + "nf": 32 + }, + "M5": { + "w": 32.0, + "l": 0.6, + "nf": 64 + }, + "M6": { + "w": 64.0, + "l": 0.6, + "nf": 128 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 2e-05 + } + } + }, + { + "pdk": "sky130", + "ib": 2e-05, + "wd": 2, + "wf": 1, + "lm": 1.0, + "tag": "ib20u_wd2_wf1_lm1", + "qualified": false, + "reasons": [ + "servo did not reach the output target: vout0=0.9578016 target=0.9 (tol 0.036 V)", + "thd_pct=51.56 above floor 3", + "out_swing=0 below floor 0.45" + ], + "measures": { + "vout0": 0.9578016, + "vin0": 1.04, + "iq": 1.894706e-05, + "gain_lf": -35.84903, + "f3db": 14099550.0, + "out_swing": 0.0, + "thd_pct": 51.5568 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 0.3, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.3, + "nf": 8 + }, + "M3": { + "w": 16.0, + "l": 0.3, + "nf": 32 + }, + "M4": { + "w": 32.0, + "l": 0.3, + "nf": 64 + }, + "M5": { + "w": 16.0, + "l": 0.3, + "nf": 32 + }, + "M6": { + "w": 32.0, + "l": 0.3, + "nf": 64 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 2e-05 + } + } + }, + { + "pdk": "sky130", + "ib": 2e-05, + "wd": 2, + "wf": 1, + "lm": 2.0, + "tag": "ib20u_wd2_wf1_lm2", + "qualified": false, + "reasons": [ + "servo did not reach the output target: vout0=0.9952648 target=0.9 (tol 0.036 V)", + "thd_pct=41.38 above floor 3", + "out_swing=0 below floor 0.45" + ], + "measures": { + "vout0": 0.9952648, + "vin0": 1.04, + "iq": 1.019093e-05, + "gain_lf": -44.61146, + "f3db": 8024053.0, + "out_swing": 0.0, + "thd_pct": 41.3813 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 0.6, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.6, + "nf": 8 + }, + "M3": { + "w": 16.0, + "l": 0.6, + "nf": 32 + }, + "M4": { + "w": 32.0, + "l": 0.6, + "nf": 64 + }, + "M5": { + "w": 16.0, + "l": 0.6, + "nf": 32 + }, + "M6": { + "w": 32.0, + "l": 0.6, + "nf": 64 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 2e-05 + } + } + }, + { + "pdk": "sky130", + "ib": 2e-05, + "wd": 2, + "wf": 2, + "lm": 1.0, + "tag": "ib20u_wd2_wf2_lm1", + "qualified": false, + "reasons": [ + "servo did not reach the output target: vout0=0.9612726 target=0.9 (tol 0.036 V)", + "thd_pct=52.98 above floor 3", + "out_swing=0 below floor 0.45" + ], + "measures": { + "vout0": 0.9612726, + "vin0": 1.04, + "iq": 2.76551e-05, + "gain_lf": -35.01053, + "f3db": 26272090.0, + "out_swing": 0.0, + "thd_pct": 52.9821 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 0.3, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.3, + "nf": 8 + }, + "M3": { + "w": 16.0, + "l": 0.3, + "nf": 32 + }, + "M4": { + "w": 32.0, + "l": 0.3, + "nf": 64 + }, + "M5": { + "w": 32.0, + "l": 0.3, + "nf": 64 + }, + "M6": { + "w": 64.0, + "l": 0.3, + "nf": 128 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 2e-05 + } + } + }, + { + "pdk": "sky130", + "ib": 2e-05, + "wd": 2, + "wf": 2, + "lm": 2.0, + "tag": "ib20u_wd2_wf2_lm2", + "qualified": false, + "reasons": [ + "servo did not reach the output target: vout0=1.006294 target=0.9 (tol 0.036 V)", + "thd_pct=42.9 above floor 3", + "out_swing=0 below floor 0.45" + ], + "measures": { + "vout0": 1.006294, + "vin0": 1.04, + "iq": 1.37409e-05, + "gain_lf": -42.20948, + "f3db": 12995880.0, + "out_swing": 0.0, + "thd_pct": 42.9034 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 0.6, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.6, + "nf": 8 + }, + "M3": { + "w": 16.0, + "l": 0.6, + "nf": 32 + }, + "M4": { + "w": 32.0, + "l": 0.6, + "nf": 64 + }, + "M5": { + "w": 32.0, + "l": 0.6, + "nf": 64 + }, + "M6": { + "w": 64.0, + "l": 0.6, + "nf": 128 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 2e-05 + } + } + }, + { + "pdk": "sky130", + "ib": 2e-05, + "wd": 4, + "wf": 1, + "lm": 1.0, + "tag": "ib20u_wd4_wf1_lm1", + "qualified": false, + "reasons": [ + "servo did not reach the output target: vout0=0.9484293 target=0.9 (tol 0.036 V)", + "thd_pct=52.15 above floor 3", + "out_swing=0 below floor 0.45" + ], + "measures": { + "vout0": 0.9484293, + "vin0": 1.04, + "iq": 2.061854e-05, + "gain_lf": -31.6503, + "f3db": 11174240.0, + "out_swing": 0.0, + "thd_pct": 52.1546 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 0.3, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.3, + "nf": 8 + }, + "M3": { + "w": 32.0, + "l": 0.3, + "nf": 64 + }, + "M4": { + "w": 64.0, + "l": 0.3, + "nf": 128 + }, + "M5": { + "w": 16.0, + "l": 0.3, + "nf": 32 + }, + "M6": { + "w": 32.0, + "l": 0.3, + "nf": 64 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 2e-05 + } + } + }, + { + "pdk": "sky130", + "ib": 2e-05, + "wd": 4, + "wf": 1, + "lm": 2.0, + "tag": "ib20u_wd4_wf1_lm2", + "qualified": false, + "reasons": [ + "servo did not reach the output target: vout0=0.9885181 target=0.9 (tol 0.036 V)", + "thd_pct=39.96 above floor 3", + "out_swing=0 below floor 0.45" + ], + "measures": { + "vout0": 0.9885181, + "vin0": 1.04, + "iq": 1.153906e-05, + "gain_lf": -39.42218, + "f3db": 7165200.0, + "out_swing": 0.0, + "thd_pct": 39.9606 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 0.6, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.6, + "nf": 8 + }, + "M3": { + "w": 32.0, + "l": 0.6, + "nf": 64 + }, + "M4": { + "w": 64.0, + "l": 0.6, + "nf": 128 + }, + "M5": { + "w": 16.0, + "l": 0.6, + "nf": 32 + }, + "M6": { + "w": 32.0, + "l": 0.6, + "nf": 64 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 2e-05 + } + } + }, + { + "pdk": "sky130", + "ib": 2e-05, + "wd": 4, + "wf": 2, + "lm": 1.0, + "tag": "ib20u_wd4_wf2_lm1", + "qualified": false, + "reasons": [ + "servo did not reach the output target: vout0=0.9521598 target=0.9 (tol 0.036 V)", + "thd_pct=54.35 above floor 3", + "out_swing=0 below floor 0.45" + ], + "measures": { + "vout0": 0.9521598, + "vin0": 1.04, + "iq": 2.713209e-05, + "gain_lf": -30.74723, + "f3db": 20347350.0, + "out_swing": 0.0, + "thd_pct": 54.3523 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 0.3, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.3, + "nf": 8 + }, + "M3": { + "w": 32.0, + "l": 0.3, + "nf": 64 + }, + "M4": { + "w": 64.0, + "l": 0.3, + "nf": 128 + }, + "M5": { + "w": 32.0, + "l": 0.3, + "nf": 64 + }, + "M6": { + "w": 64.0, + "l": 0.3, + "nf": 128 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 2e-05 + } + } + }, + { + "pdk": "sky130", + "ib": 2e-05, + "wd": 4, + "wf": 2, + "lm": 2.0, + "tag": "ib20u_wd4_wf2_lm2", + "qualified": false, + "reasons": [ + "servo did not reach the output target: vout0=1.000239 target=0.9 (tol 0.036 V)", + "thd_pct=41.49 above floor 3", + "out_swing=0 below floor 0.45" + ], + "measures": { + "vout0": 1.000239, + "vin0": 1.04, + "iq": 1.447909e-05, + "gain_lf": -37.31118, + "f3db": 11192240.0, + "out_swing": 0.0, + "thd_pct": 41.4861 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 0.6, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.6, + "nf": 8 + }, + "M3": { + "w": 32.0, + "l": 0.6, + "nf": 64 + }, + "M4": { + "w": 64.0, + "l": 0.6, + "nf": 128 + }, + "M5": { + "w": 32.0, + "l": 0.6, + "nf": 64 + }, + "M6": { + "w": 64.0, + "l": 0.6, + "nf": 128 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 2e-05 + } + } + } +] \ No newline at end of file diff --git a/benchmarks/textbook_sharing/results/redesign_search/attempts_ihp130.json b/benchmarks/textbook_sharing/results/redesign_search/attempts_ihp130.json new file mode 100644 index 00000000..7cca7a65 --- /dev/null +++ b/benchmarks/textbook_sharing/results/redesign_search/attempts_ihp130.json @@ -0,0 +1,2164 @@ +[ + { + "pdk": "ihp130", + "ib": 5e-06, + "wd": 1, + "wf": 1, + "lm": 1.0, + "tag": "ib5u_wd1_wf1_lm1", + "qualified": false, + "reasons": [ + "thd_pct=17.02 above floor 3", + "out_swing=0.1492 below floor 0.3" + ], + "measures": { + "vout0": 0.6003751, + "vin0": 0.397442, + "iq": 1.602345e-05, + "gain_lf": 14.97653, + "f3db": 15927780.0, + "out_swing": 0.1492125, + "thd_pct": 17.0166 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 0.26, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.26, + "nf": 8 + }, + "M3": { + "w": 8.0, + "l": 0.26, + "nf": 16 + }, + "M4": { + "w": 16.0, + "l": 0.26, + "nf": 32 + }, + "M5": { + "w": 16.0, + "l": 0.26, + "nf": 32 + }, + "M6": { + "w": 32.0, + "l": 0.26, + "nf": 64 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 5e-06 + } + } + }, + { + "pdk": "ihp130", + "ib": 5e-06, + "wd": 1, + "wf": 1, + "lm": 2.0, + "tag": "ib5u_wd1_wf1_lm2", + "qualified": false, + "reasons": [ + "thd_pct=24.43 above floor 3", + "out_swing=0.1603 below floor 0.3" + ], + "measures": { + "vout0": 0.6001728, + "vin0": 0.3772696, + "iq": 1.788578e-05, + "gain_lf": 12.84677, + "f3db": 14430040.0, + "out_swing": 0.1602601, + "thd_pct": 24.4296 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 0.52, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.52, + "nf": 8 + }, + "M3": { + "w": 8.0, + "l": 0.52, + "nf": 16 + }, + "M4": { + "w": 16.0, + "l": 0.52, + "nf": 32 + }, + "M5": { + "w": 16.0, + "l": 0.52, + "nf": 32 + }, + "M6": { + "w": 32.0, + "l": 0.52, + "nf": 64 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 5e-06 + } + } + }, + { + "pdk": "ihp130", + "ib": 5e-06, + "wd": 1, + "wf": 2, + "lm": 1.0, + "tag": "ib5u_wd1_wf2_lm1", + "qualified": false, + "reasons": [ + "thd_pct=17.71 above floor 3", + "out_swing=0.1572 below floor 0.3" + ], + "measures": { + "vout0": 0.6003751, + "vin0": 0.3974445, + "iq": 2.722915e-05, + "gain_lf": 15.30364, + "f3db": 15674470.0, + "out_swing": 0.1571562, + "thd_pct": 17.7096 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 0.26, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.26, + "nf": 8 + }, + "M3": { + "w": 8.0, + "l": 0.26, + "nf": 16 + }, + "M4": { + "w": 16.0, + "l": 0.26, + "nf": 32 + }, + "M5": { + "w": 32.0, + "l": 0.26, + "nf": 64 + }, + "M6": { + "w": 64.0, + "l": 0.26, + "nf": 128 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 5e-06 + } + } + }, + { + "pdk": "ihp130", + "ib": 5e-06, + "wd": 1, + "wf": 2, + "lm": 2.0, + "tag": "ib5u_wd1_wf2_lm2", + "qualified": false, + "reasons": [ + "thd_pct=24.37 above floor 3", + "out_swing=0.1696 below floor 0.3" + ], + "measures": { + "vout0": 0.6001728, + "vin0": 0.3772713, + "iq": 3.026926e-05, + "gain_lf": 13.18372, + "f3db": 13562860.0, + "out_swing": 0.1696402, + "thd_pct": 24.3685 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 0.52, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.52, + "nf": 8 + }, + "M3": { + "w": 8.0, + "l": 0.52, + "nf": 16 + }, + "M4": { + "w": 16.0, + "l": 0.52, + "nf": 32 + }, + "M5": { + "w": 32.0, + "l": 0.52, + "nf": 64 + }, + "M6": { + "w": 64.0, + "l": 0.52, + "nf": 128 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 5e-06 + } + } + }, + { + "pdk": "ihp130", + "ib": 5e-06, + "wd": 2, + "wf": 1, + "lm": 1.0, + "tag": "ib5u_wd2_wf1_lm1", + "qualified": false, + "reasons": [ + "thd_pct=13.38 above floor 3", + "out_swing=0.1625 below floor 0.3" + ], + "measures": { + "vout0": 0.6003561, + "vin0": 0.3955521, + "iq": 1.071459e-05, + "gain_lf": 16.50318, + "f3db": 9596144.0, + "out_swing": 0.1625496, + "thd_pct": 13.3835 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 0.26, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.26, + "nf": 8 + }, + "M3": { + "w": 16.0, + "l": 0.26, + "nf": 32 + }, + "M4": { + "w": 32.0, + "l": 0.26, + "nf": 64 + }, + "M5": { + "w": 16.0, + "l": 0.26, + "nf": 32 + }, + "M6": { + "w": 32.0, + "l": 0.26, + "nf": 64 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 5e-06 + } + } + }, + { + "pdk": "ihp130", + "ib": 5e-06, + "wd": 2, + "wf": 1, + "lm": 2.0, + "tag": "ib5u_wd2_wf1_lm2", + "qualified": false, + "reasons": [ + "thd_pct=19.7 above floor 3", + "out_swing=0.1562 below floor 0.3" + ], + "measures": { + "vout0": 0.6001442, + "vin0": 0.3744137, + "iq": 1.197964e-05, + "gain_lf": 17.35638, + "f3db": 7532873.0, + "out_swing": 0.1561641, + "thd_pct": 19.7031 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 0.52, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.52, + "nf": 8 + }, + "M3": { + "w": 16.0, + "l": 0.52, + "nf": 32 + }, + "M4": { + "w": 32.0, + "l": 0.52, + "nf": 64 + }, + "M5": { + "w": 16.0, + "l": 0.52, + "nf": 32 + }, + "M6": { + "w": 32.0, + "l": 0.52, + "nf": 64 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 5e-06 + } + } + }, + { + "pdk": "ihp130", + "ib": 5e-06, + "wd": 2, + "wf": 2, + "lm": 1.0, + "tag": "ib5u_wd2_wf2_lm1", + "qualified": false, + "reasons": [ + "thd_pct=13.41 above floor 3", + "out_swing=0.175 below floor 0.3" + ], + "measures": { + "vout0": 0.6003562, + "vin0": 0.3955554, + "iq": 1.655455e-05, + "gain_lf": 17.04916, + "f3db": 10148340.0, + "out_swing": 0.1750118, + "thd_pct": 13.4149 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 0.26, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.26, + "nf": 8 + }, + "M3": { + "w": 16.0, + "l": 0.26, + "nf": 32 + }, + "M4": { + "w": 32.0, + "l": 0.26, + "nf": 64 + }, + "M5": { + "w": 32.0, + "l": 0.26, + "nf": 64 + }, + "M6": { + "w": 64.0, + "l": 0.26, + "nf": 128 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 5e-06 + } + } + }, + { + "pdk": "ihp130", + "ib": 5e-06, + "wd": 2, + "wf": 2, + "lm": 2.0, + "tag": "ib5u_wd2_wf2_lm2", + "qualified": false, + "reasons": [ + "thd_pct=19.7 above floor 3", + "out_swing=0.168 below floor 0.3" + ], + "measures": { + "vout0": 0.6001442, + "vin0": 0.374415, + "iq": 1.841566e-05, + "gain_lf": 17.8941, + "f3db": 6805992.0, + "out_swing": 0.1679606, + "thd_pct": 19.7004 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 0.52, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.52, + "nf": 8 + }, + "M3": { + "w": 16.0, + "l": 0.52, + "nf": 32 + }, + "M4": { + "w": 32.0, + "l": 0.52, + "nf": 64 + }, + "M5": { + "w": 32.0, + "l": 0.52, + "nf": 64 + }, + "M6": { + "w": 64.0, + "l": 0.52, + "nf": 128 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 5e-06 + } + } + }, + { + "pdk": "ihp130", + "ib": 5e-06, + "wd": 4, + "wf": 1, + "lm": 1.0, + "tag": "ib5u_wd4_wf1_lm1", + "qualified": false, + "reasons": [ + "thd_pct=10.69 above floor 3", + "out_swing=0.1747 below floor 0.3" + ], + "measures": { + "vout0": 0.6003418, + "vin0": 0.3941262, + "iq": 7.949147e-06, + "gain_lf": 16.78341, + "f3db": 5709270.0, + "out_swing": 0.1747146, + "thd_pct": 10.6896 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 0.26, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.26, + "nf": 8 + }, + "M3": { + "w": 32.0, + "l": 0.26, + "nf": 64 + }, + "M4": { + "w": 64.0, + "l": 0.26, + "nf": 128 + }, + "M5": { + "w": 16.0, + "l": 0.26, + "nf": 32 + }, + "M6": { + "w": 32.0, + "l": 0.26, + "nf": 64 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 5e-06 + } + } + }, + { + "pdk": "ihp130", + "ib": 5e-06, + "wd": 4, + "wf": 1, + "lm": 2.0, + "tag": "ib5u_wd4_wf1_lm2", + "qualified": false, + "reasons": [ + "thd_pct=15.39 above floor 3", + "f3db=4.185e+06 below floor 5e+06", + "out_swing=0.1635 below floor 0.3" + ], + "measures": { + "vout0": 0.6001292, + "vin0": 0.3729204, + "iq": 8.901237e-06, + "gain_lf": 18.8319, + "f3db": 4184567.0, + "out_swing": 0.1634767, + "thd_pct": 15.3917 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 0.52, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.52, + "nf": 8 + }, + "M3": { + "w": 32.0, + "l": 0.52, + "nf": 64 + }, + "M4": { + "w": 64.0, + "l": 0.52, + "nf": 128 + }, + "M5": { + "w": 16.0, + "l": 0.52, + "nf": 32 + }, + "M6": { + "w": 32.0, + "l": 0.52, + "nf": 64 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 5e-06 + } + } + }, + { + "pdk": "ihp130", + "ib": 5e-06, + "wd": 4, + "wf": 2, + "lm": 1.0, + "tag": "ib5u_wd4_wf2_lm1", + "qualified": false, + "reasons": [ + "thd_pct=10.58 above floor 3", + "out_swing=0.1916 below floor 0.3" + ], + "measures": { + "vout0": 0.6003418, + "vin0": 0.3941313, + "iq": 1.0976e-05, + "gain_lf": 17.7046, + "f3db": 6416225.0, + "out_swing": 0.1915993, + "thd_pct": 10.5776 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 0.26, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.26, + "nf": 8 + }, + "M3": { + "w": 32.0, + "l": 0.26, + "nf": 64 + }, + "M4": { + "w": 64.0, + "l": 0.26, + "nf": 128 + }, + "M5": { + "w": 32.0, + "l": 0.26, + "nf": 64 + }, + "M6": { + "w": 64.0, + "l": 0.26, + "nf": 128 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 5e-06 + } + } + }, + { + "pdk": "ihp130", + "ib": 5e-06, + "wd": 4, + "wf": 2, + "lm": 2.0, + "tag": "ib5u_wd4_wf2_lm2", + "qualified": false, + "reasons": [ + "thd_pct=14.22 above floor 3", + "f3db=3.93e+06 below floor 5e+06", + "out_swing=0.1795 below floor 0.3" + ], + "measures": { + "vout0": 0.6001292, + "vin0": 0.3729219, + "iq": 1.222643e-05, + "gain_lf": 19.70777, + "f3db": 3929675.0, + "out_swing": 0.1795498, + "thd_pct": 14.2177 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 0.52, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.52, + "nf": 8 + }, + "M3": { + "w": 32.0, + "l": 0.52, + "nf": 64 + }, + "M4": { + "w": 64.0, + "l": 0.52, + "nf": 128 + }, + "M5": { + "w": 32.0, + "l": 0.52, + "nf": 64 + }, + "M6": { + "w": 64.0, + "l": 0.52, + "nf": 128 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 5e-06 + } + } + }, + { + "pdk": "ihp130", + "ib": 1e-05, + "wd": 1, + "wf": 1, + "lm": 1.0, + "tag": "ib10u_wd1_wf1_lm1", + "qualified": false, + "reasons": [ + "thd_pct=22.74 above floor 3", + "out_swing=0.1586 below floor 0.3" + ], + "measures": { + "vout0": 0.6008681, + "vin0": 0.4459502, + "iq": 3.058218e-05, + "gain_lf": 7.425625, + "f3db": 32886170.0, + "out_swing": 0.1585654, + "thd_pct": 22.7364 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 0.26, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.26, + "nf": 8 + }, + "M3": { + "w": 8.0, + "l": 0.26, + "nf": 16 + }, + "M4": { + "w": 16.0, + "l": 0.26, + "nf": 32 + }, + "M5": { + "w": 16.0, + "l": 0.26, + "nf": 32 + }, + "M6": { + "w": 32.0, + "l": 0.26, + "nf": 64 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 1e-05 + } + } + }, + { + "pdk": "ihp130", + "ib": 1e-05, + "wd": 1, + "wf": 1, + "lm": 2.0, + "tag": "ib10u_wd1_wf1_lm2", + "qualified": false, + "reasons": [ + "thd_pct=30.28 above floor 3", + "out_swing=0.218 below floor 0.3" + ], + "measures": { + "vout0": 0.6009117, + "vin0": 0.4501685, + "iq": 3.419844e-05, + "gain_lf": -1.564916, + "f3db": 33186070.0, + "out_swing": 0.2180432, + "thd_pct": 30.283 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 0.52, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.52, + "nf": 8 + }, + "M3": { + "w": 8.0, + "l": 0.52, + "nf": 16 + }, + "M4": { + "w": 16.0, + "l": 0.52, + "nf": 32 + }, + "M5": { + "w": 16.0, + "l": 0.52, + "nf": 32 + }, + "M6": { + "w": 32.0, + "l": 0.52, + "nf": 64 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 1e-05 + } + } + }, + { + "pdk": "ihp130", + "ib": 1e-05, + "wd": 1, + "wf": 2, + "lm": 1.0, + "tag": "ib10u_wd1_wf2_lm1", + "qualified": false, + "reasons": [ + "thd_pct=22.76 above floor 3", + "out_swing=0.1689 below floor 0.3" + ], + "measures": { + "vout0": 0.6008682, + "vin0": 0.4459589, + "iq": 5.17498e-05, + "gain_lf": 7.626614, + "f3db": 42423230.0, + "out_swing": 0.1689435, + "thd_pct": 22.7561 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 0.26, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.26, + "nf": 8 + }, + "M3": { + "w": 8.0, + "l": 0.26, + "nf": 16 + }, + "M4": { + "w": 16.0, + "l": 0.26, + "nf": 32 + }, + "M5": { + "w": 32.0, + "l": 0.26, + "nf": 64 + }, + "M6": { + "w": 64.0, + "l": 0.26, + "nf": 128 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 1e-05 + } + } + }, + { + "pdk": "ihp130", + "ib": 1e-05, + "wd": 1, + "wf": 2, + "lm": 2.0, + "tag": "ib10u_wd1_wf2_lm2", + "qualified": false, + "reasons": [ + "thd_pct=30.75 above floor 3", + "out_swing=0.2413 below floor 0.3" + ], + "measures": { + "vout0": 0.6009119, + "vin0": 0.4501957, + "iq": 5.762452e-05, + "gain_lf": -1.351827, + "f3db": 47123850.0, + "out_swing": 0.2412605, + "thd_pct": 30.7489 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 0.52, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.52, + "nf": 8 + }, + "M3": { + "w": 8.0, + "l": 0.52, + "nf": 16 + }, + "M4": { + "w": 16.0, + "l": 0.52, + "nf": 32 + }, + "M5": { + "w": 32.0, + "l": 0.52, + "nf": 64 + }, + "M6": { + "w": 64.0, + "l": 0.52, + "nf": 128 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 1e-05 + } + } + }, + { + "pdk": "ihp130", + "ib": 1e-05, + "wd": 2, + "wf": 1, + "lm": 1.0, + "tag": "ib10u_wd2_wf1_lm1", + "qualified": false, + "reasons": [ + "thd_pct=18.64 above floor 3", + "out_swing=0.1466 below floor 0.3" + ], + "measures": { + "vout0": 0.6008192, + "vin0": 0.441197, + "iq": 2.073399e-05, + "gain_lf": 12.01624, + "f3db": 18930760.0, + "out_swing": 0.1466451, + "thd_pct": 18.6377 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 0.26, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.26, + "nf": 8 + }, + "M3": { + "w": 16.0, + "l": 0.26, + "nf": 32 + }, + "M4": { + "w": 32.0, + "l": 0.26, + "nf": 64 + }, + "M5": { + "w": 16.0, + "l": 0.26, + "nf": 32 + }, + "M6": { + "w": 32.0, + "l": 0.26, + "nf": 64 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 1e-05 + } + } + }, + { + "pdk": "ihp130", + "ib": 1e-05, + "wd": 2, + "wf": 1, + "lm": 2.0, + "tag": "ib10u_wd2_wf1_lm2", + "qualified": false, + "reasons": [ + "thd_pct=25.17 above floor 3", + "out_swing=0.18 below floor 0.3" + ], + "measures": { + "vout0": 0.6007325, + "vin0": 0.432729, + "iq": 2.320432e-05, + "gain_lf": 7.080271, + "f3db": 18959550.0, + "out_swing": 0.1799856, + "thd_pct": 25.1656 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 0.52, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.52, + "nf": 8 + }, + "M3": { + "w": 16.0, + "l": 0.52, + "nf": 32 + }, + "M4": { + "w": 32.0, + "l": 0.52, + "nf": 64 + }, + "M5": { + "w": 16.0, + "l": 0.52, + "nf": 32 + }, + "M6": { + "w": 32.0, + "l": 0.52, + "nf": 64 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 1e-05 + } + } + }, + { + "pdk": "ihp130", + "ib": 1e-05, + "wd": 2, + "wf": 2, + "lm": 1.0, + "tag": "ib10u_wd2_wf2_lm1", + "qualified": false, + "reasons": [ + "thd_pct=18.59 above floor 3", + "out_swing=0.1555 below floor 0.3" + ], + "measures": { + "vout0": 0.6008193, + "vin0": 0.4412047, + "iq": 3.188163e-05, + "gain_lf": 12.34197, + "f3db": 23726950.0, + "out_swing": 0.1555342, + "thd_pct": 18.5877 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 0.26, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.26, + "nf": 8 + }, + "M3": { + "w": 16.0, + "l": 0.26, + "nf": 32 + }, + "M4": { + "w": 32.0, + "l": 0.26, + "nf": 64 + }, + "M5": { + "w": 32.0, + "l": 0.26, + "nf": 64 + }, + "M6": { + "w": 64.0, + "l": 0.26, + "nf": 128 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 1e-05 + } + } + }, + { + "pdk": "ihp130", + "ib": 1e-05, + "wd": 2, + "wf": 2, + "lm": 2.0, + "tag": "ib10u_wd2_wf2_lm2", + "qualified": false, + "reasons": [ + "thd_pct=25.54 above floor 3", + "out_swing=0.1959 below floor 0.3" + ], + "measures": { + "vout0": 0.6007326, + "vin0": 0.4327415, + "iq": 3.548671e-05, + "gain_lf": 7.412943, + "f3db": 23968650.0, + "out_swing": 0.1959472, + "thd_pct": 25.5406 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 0.52, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.52, + "nf": 8 + }, + "M3": { + "w": 16.0, + "l": 0.52, + "nf": 32 + }, + "M4": { + "w": 32.0, + "l": 0.52, + "nf": 64 + }, + "M5": { + "w": 32.0, + "l": 0.52, + "nf": 64 + }, + "M6": { + "w": 64.0, + "l": 0.52, + "nf": 128 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 1e-05 + } + } + }, + { + "pdk": "ihp130", + "ib": 1e-05, + "wd": 4, + "wf": 1, + "lm": 1.0, + "tag": "ib10u_wd4_wf1_lm1", + "qualified": false, + "reasons": [ + "thd_pct=15.35 above floor 3", + "out_swing=0.1503 below floor 0.3" + ], + "measures": { + "vout0": 0.6007941, + "vin0": 0.4387445, + "iq": 1.552975e-05, + "gain_lf": 14.32967, + "f3db": 10721260.0, + "out_swing": 0.150259, + "thd_pct": 15.3457 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 0.26, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.26, + "nf": 8 + }, + "M3": { + "w": 32.0, + "l": 0.26, + "nf": 64 + }, + "M4": { + "w": 64.0, + "l": 0.26, + "nf": 128 + }, + "M5": { + "w": 16.0, + "l": 0.26, + "nf": 32 + }, + "M6": { + "w": 32.0, + "l": 0.26, + "nf": 64 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 1e-05 + } + } + }, + { + "pdk": "ihp130", + "ib": 1e-05, + "wd": 4, + "wf": 1, + "lm": 2.0, + "tag": "ib10u_wd4_wf1_lm2", + "qualified": false, + "reasons": [ + "thd_pct=21.65 above floor 3", + "out_swing=0.1523 below floor 0.3" + ], + "measures": { + "vout0": 0.6006764, + "vin0": 0.4272284, + "iq": 1.741119e-05, + "gain_lf": 12.77362, + "f3db": 9832880.0, + "out_swing": 0.1523499, + "thd_pct": 21.6463 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 0.52, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.52, + "nf": 8 + }, + "M3": { + "w": 32.0, + "l": 0.52, + "nf": 64 + }, + "M4": { + "w": 64.0, + "l": 0.52, + "nf": 128 + }, + "M5": { + "w": 16.0, + "l": 0.52, + "nf": 32 + }, + "M6": { + "w": 32.0, + "l": 0.52, + "nf": 64 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 1e-05 + } + } + }, + { + "pdk": "ihp130", + "ib": 1e-05, + "wd": 4, + "wf": 2, + "lm": 1.0, + "tag": "ib10u_wd4_wf2_lm1", + "qualified": false, + "reasons": [ + "thd_pct=14.96 above floor 3", + "out_swing=0.1623 below floor 0.3" + ], + "measures": { + "vout0": 0.6007941, + "vin0": 0.4387538, + "iq": 2.13468e-05, + "gain_lf": 14.87464, + "f3db": 13508490.0, + "out_swing": 0.1623328, + "thd_pct": 14.9593 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 0.26, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.26, + "nf": 8 + }, + "M3": { + "w": 32.0, + "l": 0.26, + "nf": 64 + }, + "M4": { + "w": 64.0, + "l": 0.26, + "nf": 128 + }, + "M5": { + "w": 32.0, + "l": 0.26, + "nf": 64 + }, + "M6": { + "w": 64.0, + "l": 0.26, + "nf": 128 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 1e-05 + } + } + }, + { + "pdk": "ihp130", + "ib": 1e-05, + "wd": 4, + "wf": 2, + "lm": 2.0, + "tag": "ib10u_wd4_wf2_lm2", + "qualified": false, + "reasons": [ + "thd_pct=21.72 above floor 3", + "out_swing=0.1651 below floor 0.3" + ], + "measures": { + "vout0": 0.6006765, + "vin0": 0.4272378, + "iq": 2.380301e-05, + "gain_lf": 13.30658, + "f3db": 11358020.0, + "out_swing": 0.16511, + "thd_pct": 21.7162 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 0.52, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.52, + "nf": 8 + }, + "M3": { + "w": 32.0, + "l": 0.52, + "nf": 64 + }, + "M4": { + "w": 64.0, + "l": 0.52, + "nf": 128 + }, + "M5": { + "w": 32.0, + "l": 0.52, + "nf": 64 + }, + "M6": { + "w": 64.0, + "l": 0.52, + "nf": 128 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 1e-05 + } + } + }, + { + "pdk": "ihp130", + "ib": 2e-05, + "wd": 1, + "wf": 1, + "lm": 1.0, + "tag": "ib20u_wd1_wf1_lm1", + "qualified": false, + "reasons": [ + "thd_pct=31.41 above floor 3", + "out_swing=0.1982 below floor 0.3" + ], + "measures": { + "vout0": 0.601749, + "vin0": 0.5280955, + "iq": 5.666062e-05, + "gain_lf": -5.664669, + "f3db": 53647720.0, + "out_swing": 0.1982082, + "thd_pct": 31.4117 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 0.26, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.26, + "nf": 8 + }, + "M3": { + "w": 8.0, + "l": 0.26, + "nf": 16 + }, + "M4": { + "w": 16.0, + "l": 0.26, + "nf": 32 + }, + "M5": { + "w": 16.0, + "l": 0.26, + "nf": 32 + }, + "M6": { + "w": 32.0, + "l": 0.26, + "nf": 64 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 2e-05 + } + } + }, + { + "pdk": "ihp130", + "ib": 2e-05, + "wd": 1, + "wf": 1, + "lm": 2.0, + "tag": "ib20u_wd1_wf1_lm2", + "qualified": false, + "reasons": [ + "thd_pct=56.22 above floor 3", + "out_swing=0 below floor 0.3" + ], + "measures": { + "vout0": 0.6034816, + "vin0": 0.6610136, + "iq": 6.201357e-05, + "gain_lf": -19.58239, + "f3db": 48134030.0, + "out_swing": 0.0, + "thd_pct": 56.219 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 0.52, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.52, + "nf": 8 + }, + "M3": { + "w": 8.0, + "l": 0.52, + "nf": 16 + }, + "M4": { + "w": 16.0, + "l": 0.52, + "nf": 32 + }, + "M5": { + "w": 16.0, + "l": 0.52, + "nf": 32 + }, + "M6": { + "w": 32.0, + "l": 0.52, + "nf": 64 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 2e-05 + } + } + }, + { + "pdk": "ihp130", + "ib": 2e-05, + "wd": 1, + "wf": 2, + "lm": 1.0, + "tag": "ib20u_wd1_wf2_lm1", + "qualified": false, + "reasons": [ + "thd_pct=32.07 above floor 3", + "out_swing=0.2188 below floor 0.3" + ], + "measures": { + "vout0": 0.6017495, + "vin0": 0.5281464, + "iq": 9.545017e-05, + "gain_lf": -5.53842, + "f3db": 99347780.0, + "out_swing": 0.2188272, + "thd_pct": 32.0713 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 0.26, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.26, + "nf": 8 + }, + "M3": { + "w": 8.0, + "l": 0.26, + "nf": 16 + }, + "M4": { + "w": 16.0, + "l": 0.26, + "nf": 32 + }, + "M5": { + "w": 32.0, + "l": 0.26, + "nf": 64 + }, + "M6": { + "w": 64.0, + "l": 0.26, + "nf": 128 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 2e-05 + } + } + }, + { + "pdk": "ihp130", + "ib": 2e-05, + "wd": 1, + "wf": 2, + "lm": 2.0, + "tag": "ib20u_wd1_wf2_lm2", + "qualified": false, + "reasons": [ + "thd_pct=57 above floor 3", + "out_swing=0 below floor 0.3" + ], + "measures": { + "vout0": 0.6034895, + "vin0": 0.6615142, + "iq": 0.0001040723, + "gain_lf": -19.46066, + "f3db": 93493500.0, + "out_swing": 0.0, + "thd_pct": 56.9991 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 0.52, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.52, + "nf": 8 + }, + "M3": { + "w": 8.0, + "l": 0.52, + "nf": 16 + }, + "M4": { + "w": 16.0, + "l": 0.52, + "nf": 32 + }, + "M5": { + "w": 32.0, + "l": 0.52, + "nf": 64 + }, + "M6": { + "w": 64.0, + "l": 0.52, + "nf": 128 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 2e-05 + } + } + }, + { + "pdk": "ihp130", + "ib": 2e-05, + "wd": 2, + "wf": 1, + "lm": 1.0, + "tag": "ib20u_wd2_wf1_lm1", + "qualified": false, + "reasons": [ + "thd_pct=23.73 above floor 3", + "out_swing=0.1804 below floor 0.3" + ], + "measures": { + "vout0": 0.6015065, + "vin0": 0.5062487, + "iq": 3.956789e-05, + "gain_lf": 2.383834, + "f3db": 34287380.0, + "out_swing": 0.1804493, + "thd_pct": 23.735 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 0.26, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.26, + "nf": 8 + }, + "M3": { + "w": 16.0, + "l": 0.26, + "nf": 32 + }, + "M4": { + "w": 32.0, + "l": 0.26, + "nf": 64 + }, + "M5": { + "w": 16.0, + "l": 0.26, + "nf": 32 + }, + "M6": { + "w": 32.0, + "l": 0.26, + "nf": 64 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 2e-05 + } + } + }, + { + "pdk": "ihp130", + "ib": 2e-05, + "wd": 2, + "wf": 1, + "lm": 2.0, + "tag": "ib20u_wd2_wf1_lm2", + "qualified": false, + "reasons": [ + "thd_pct=32.35 above floor 3", + "out_swing=0.2252 below floor 0.3" + ], + "measures": { + "vout0": 0.601928, + "vin0": 0.5437775, + "iq": 4.381252e-05, + "gain_lf": -7.375718, + "f3db": 32339370.0, + "out_swing": 0.2251774, + "thd_pct": 32.3466 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 0.52, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.52, + "nf": 8 + }, + "M3": { + "w": 16.0, + "l": 0.52, + "nf": 32 + }, + "M4": { + "w": 32.0, + "l": 0.52, + "nf": 64 + }, + "M5": { + "w": 16.0, + "l": 0.52, + "nf": 32 + }, + "M6": { + "w": 32.0, + "l": 0.52, + "nf": 64 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 2e-05 + } + } + }, + { + "pdk": "ihp130", + "ib": 2e-05, + "wd": 2, + "wf": 2, + "lm": 1.0, + "tag": "ib20u_wd2_wf2_lm1", + "qualified": false, + "reasons": [ + "thd_pct=24.19 above floor 3", + "out_swing=0.199 below floor 0.3" + ], + "measures": { + "vout0": 0.6015068, + "vin0": 0.5062755, + "iq": 6.051565e-05, + "gain_lf": 2.58283, + "f3db": 57885740.0, + "out_swing": 0.1989798, + "thd_pct": 24.193 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 0.26, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.26, + "nf": 8 + }, + "M3": { + "w": 16.0, + "l": 0.26, + "nf": 32 + }, + "M4": { + "w": 32.0, + "l": 0.26, + "nf": 64 + }, + "M5": { + "w": 32.0, + "l": 0.26, + "nf": 64 + }, + "M6": { + "w": 64.0, + "l": 0.26, + "nf": 128 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 2e-05 + } + } + }, + { + "pdk": "ihp130", + "ib": 2e-05, + "wd": 2, + "wf": 2, + "lm": 2.0, + "tag": "ib20u_wd2_wf2_lm2", + "qualified": false, + "reasons": [ + "thd_pct=33.29 above floor 3", + "out_swing=0.2483 below floor 0.3" + ], + "measures": { + "vout0": 0.6019293, + "vin0": 0.5438896, + "iq": 6.664644e-05, + "gain_lf": -7.165578, + "f3db": 58523430.0, + "out_swing": 0.2483364, + "thd_pct": 33.2862 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 0.52, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.52, + "nf": 8 + }, + "M3": { + "w": 16.0, + "l": 0.52, + "nf": 32 + }, + "M4": { + "w": 32.0, + "l": 0.52, + "nf": 64 + }, + "M5": { + "w": 32.0, + "l": 0.52, + "nf": 64 + }, + "M6": { + "w": 64.0, + "l": 0.52, + "nf": 128 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 2e-05 + } + } + }, + { + "pdk": "ihp130", + "ib": 2e-05, + "wd": 4, + "wf": 1, + "lm": 1.0, + "tag": "ib20u_wd4_wf1_lm1", + "qualified": false, + "reasons": [ + "thd_pct=19.33 above floor 3", + "out_swing=0.1566 below floor 0.3" + ], + "measures": { + "vout0": 0.6014196, + "vin0": 0.4982662, + "iq": 3.016018e-05, + "gain_lf": 7.481788, + "f3db": 20421970.0, + "out_swing": 0.1566479, + "thd_pct": 19.3308 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 0.26, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.26, + "nf": 8 + }, + "M3": { + "w": 32.0, + "l": 0.26, + "nf": 64 + }, + "M4": { + "w": 64.0, + "l": 0.26, + "nf": 128 + }, + "M5": { + "w": 16.0, + "l": 0.26, + "nf": 32 + }, + "M6": { + "w": 32.0, + "l": 0.26, + "nf": 64 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 2e-05 + } + } + }, + { + "pdk": "ihp130", + "ib": 2e-05, + "wd": 4, + "wf": 1, + "lm": 2.0, + "tag": "ib20u_wd4_wf1_lm2", + "qualified": false, + "reasons": [ + "thd_pct=26.46 above floor 3", + "out_swing=0.2085 below floor 0.3" + ], + "measures": { + "vout0": 0.6015626, + "vin0": 0.5113597, + "iq": 3.357985e-05, + "gain_lf": 0.1826807, + "f3db": 20249540.0, + "out_swing": 0.2084842, + "thd_pct": 26.4562 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 0.52, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.52, + "nf": 8 + }, + "M3": { + "w": 32.0, + "l": 0.52, + "nf": 64 + }, + "M4": { + "w": 64.0, + "l": 0.52, + "nf": 128 + }, + "M5": { + "w": 16.0, + "l": 0.52, + "nf": 32 + }, + "M6": { + "w": 32.0, + "l": 0.52, + "nf": 64 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 2e-05 + } + } + }, + { + "pdk": "ihp130", + "ib": 2e-05, + "wd": 4, + "wf": 2, + "lm": 1.0, + "tag": "ib20u_wd4_wf2_lm1", + "qualified": false, + "reasons": [ + "thd_pct=19.56 above floor 3", + "out_swing=0.1695 below floor 0.3" + ], + "measures": { + "vout0": 0.6014199, + "vin0": 0.4982886, + "iq": 4.125168e-05, + "gain_lf": 7.80441, + "f3db": 31958730.0, + "out_swing": 0.169544, + "thd_pct": 19.5601 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 0.26, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.26, + "nf": 8 + }, + "M3": { + "w": 32.0, + "l": 0.26, + "nf": 64 + }, + "M4": { + "w": 64.0, + "l": 0.26, + "nf": 128 + }, + "M5": { + "w": 32.0, + "l": 0.26, + "nf": 64 + }, + "M6": { + "w": 64.0, + "l": 0.26, + "nf": 128 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 2e-05 + } + } + }, + { + "pdk": "ihp130", + "ib": 2e-05, + "wd": 4, + "wf": 2, + "lm": 2.0, + "tag": "ib20u_wd4_wf2_lm2", + "qualified": false, + "reasons": [ + "thd_pct=26.95 above floor 3", + "out_swing=0.2322 below floor 0.3" + ], + "measures": { + "vout0": 0.6015632, + "vin0": 0.5114187, + "iq": 4.56696e-05, + "gain_lf": 0.5119596, + "f3db": 33265370.0, + "out_swing": 0.2321769, + "thd_pct": 26.949 + }, + "sizing": { + "M1": { + "w": 2.0, + "l": 0.52, + "nf": 4 + }, + "M2": { + "w": 4.0, + "l": 0.52, + "nf": 8 + }, + "M3": { + "w": 32.0, + "l": 0.52, + "nf": 64 + }, + "M4": { + "w": 64.0, + "l": 0.52, + "nf": 128 + }, + "M5": { + "w": 32.0, + "l": 0.52, + "nf": 64 + }, + "M6": { + "w": 64.0, + "l": 0.52, + "nf": 128 + } + }, + "bias": { + "VB1": { + "replica": "M2", + "current": 2e-05 + } + } + } +] \ No newline at end of file diff --git a/benchmarks/textbook_sharing/results/run_records.tar.xz b/benchmarks/textbook_sharing/results/run_records.tar.xz new file mode 100644 index 0000000000000000000000000000000000000000..68ba03b875adac0af70c8ae0d5fd0a00b5b95288 GIT binary patch literal 5746140 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 z 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�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

_Bs2SonghhK4;~iNwvhR&iRf-!H2RrfciM zzfgvEu4?{TzpeFDnFEDf@Lw14)rQ4f~?`3GYsO*NxsU;)c&iVOa|k3%#42P(7x zJ*yBK|BATYAGkry!iYe5#uATeT2Ld*n{O-1lVb1W#mh>AwZIRx?h`aACgXY|4TW#r z8~afkhe@|>&*J{zE&S~}rg8)MqqP+uAPbK7kC|k6X~4Hu1Q@^c-7H0(^$oA>Di+>% z`#dppyup~Qk%`7Yh>=ZC9t4k1H_itQNL&ueyBoewOUk(1D-`Med91Z+9Ga@0xW7h} zF^TbMg6JS4ZbDv{vjs9{l!vTP4}(KeC>}ut^7OWL$+*ExLwX3QGu0E}J(}exVMC3+ z`>gH$%*?xvF#h`NlRCk;`+gc>K`ygb31=W)R-Q}n;|}5`g$KFaxexA0gbiZLmwhW< zwM#DIeZ}@*#79_uB}J>!l4&mIN6XgesA0I=hJ_8g7wjtbNJo(L%cTQkn+0Lkr&1k^ ztPve*e0-hH4SLdJ!^;#^OE$oC^s;n%h9IJs;0ZO*gR+IFS;M%B1FKcS#=#>?Ae3I10UwF`Y(lk`{*m)hjJ z`;^L9^62E4VK2uwo(Uh?uQVhvHGW${rC;&I_2n^zzo)|!LC~1=qrfn^l$7ThAS7IH z+cll-+b<)$^T;>(!3gY#Qa@QD(0zb65${M4_`syLVV!&9vXHHPXDz)6;zQW$u7zJW~;NH zbyZ>hmJaI>$GgcQk+@t@Z)OmK$9TFW$Q=kY_ilxWYzB*oHddN-JOnU{S9wQw#I;S5 z9r&ehV^IgnVG|`y>cbh7)yzLmMvRsn-&GHKhR7S{k%rSujIWq>RFG$A=t>Cr5RX~? z!Evr0rVznNX+1;sqLcZFT=n%%OvIb~zQGT&JZ!s45kiOLXZ6LlWzpb+sQM6@u_?$A z`na{kfR~P=9C2ng#8jtN#66PZ*QW{01!cw+{Vi^D^n<~KHQVYxqSCZh3cai2EB>LT z_fp$ceQDmOiO13JZ4=S2J!}lcxxP25hl$UPu4Roy-IL#f(tND6)Pc0VgY z>br7XWo;9V{Edso$bm_>y((AZ7RAclW7=xfhJ;LA<|)CF5xumdwY&THm}T5q@Z@&P zw3j)Rg;Ns{sYB|9o5NhQ1)*p*SpYIA=lLQ<{*7FFr4GA9$((2aUE&5;L_#4K`>sZ| zA`UIJrk|}GlD<{jMbeQK8$s^4BMNwPxMoQiIyE<5c0!ke)DpwC3K@)IvF5EB5K8IG zH<(M)Sj6b=T|acIv`rhyNWh2CvhMfE8WH~N1^c3_>ehQ4>5x%F#86zbR1I2s&necQJZyj}tY6XAe$_JuHhg}%#U4-;- zr=g2G`mi2~nuNVDjd^?UhpX7uweSt79v4ssZ|_f)*TIt~g)V0isF-;58)37V1XCx% zP&Yx|FNmZKELV9>tNd-=`KU1!XYj~ek8F^I#mV5X#CUSSQ%Kt(%m2R$`|Sex%wbgC zxNZSFUw9oyHJL_kw1xYep&evybcVlsX?+KBgQEyZgt0kQB*{BQ_$| zEHiQUqhBHsc#AD>LaQVpmt!^wBM^AgZf>FGJ2o)OwxSNF1+N^Ka)~r z6FU>3W7>LJB0VW?8>Txf_|NIXR181(RJrD3OOs#<2)I>sm+pAc%)=u)ARp60c?IF~ z4i=RvAwbD9JWKsgJ@SKQpi09xhEMsGIQF72*(Y z;>Mz-?!qd&FXblouj8Mev8=#p`R#_N?smDCjY&Ptb)k1{M+m}5$MgJ=4oz!akQ4pVa_Fsyt0g* zvC3_KxT^GDwRP(NFiDR}-)K?ru1#;xPKs|A0+$6V*q(~!C8(qMtb4On?>NTTk11ZH z5`%qBZfw6b@msLWOYp_eB0pdY*=PhUrjY4K`tE_sNL{Al)u0cYX$HT96s3M z0=%bf!zW}}oWG*U`UU!R*zeizxJG&nOp<9sr2( zGN`c5D~@32v-fvPr5CrX>klydpDVj^AGs?QsXXcNu*K1ttrtn6RqSG5XxS5CHPFrQ zN^mOD9`4!YTJ{WWUIGu85rj#0SxAtJ=C|jEN^h`tx2a)Drd@{9hA}2Kl3!**ROL9e zqG{kz`sGzu;(|NW!w!XzR{5#tF-NQngnon?`LVGKjv+YYpin1{;JudQpqt6PNk;lN zX7Wi*glq3f{9q!&@e8iJ+JIz3_T^O4sZb)AuT*Lgj@ z+pTa%617VboQPIxL*ncVZVOa%+Q&Mj_}o8GXIofR+m_wWuZKDX-}(}quEeG@43vjq z$6`aa(09rKD^2u5gux{QpC%zNToOVp@4Oe&F13LgQgnz-23%(W)Q{z(Qpr`nWvFWjmzob?PLg1Z2G4n< z-CW$#R7P2UhkDVV#w6>=zc%U;3l5aY9TB_wl=Ziws63yWNCjD z6_|An7h|%2%J6!Rx)16utcf(_jZyVm79^Ev2DaJ0CoOlw5<^;pC*FZhd>%>`lPe|w z2k%Mxe1eUtX#_$Kw6u&#a>58|U1X~Jn;O88YH#>TSM-&qY>n4P*e^)RHxG`{uGVW88Nu!ody=y({VTJyxVZbJxC%QM2$a2lG z(;Y`E9*I+xozma9EiUtHt`V3zr`C#lT`=s)U{o&tX8HlCQGS{hp0y z(d6bSmEivrV))KgGfUBaoX?lf1i1C-GVbL)odzF_7SiF8-|H0UJL~Rc_m_i&nWiJGa-&Tg__@)%J>iZW0f&@;;3C;H){g7N@TFEn`22Rx8hSR)4L=4h=2R73G`U}gN8zW~7!&6(QKv9G^gf_ljHr}i z{OI-N(3x+g_n^6FMi$SxQ+LZBl5Ls>7f%dLfUJ;W5_F-LkrA*|@4t(MZ z)MjDJ2@`YHP*CeXO#2g5Icz8FQ!*xPNfLjR>!w{2X+3q;w)xgjt0>eTWXM#Cv0;tT zT;qcmky%-P9!AOmRJ+PLLxH_48(V;3p{cdM#B#Z1%p477B%0Tp$&q&Qw`LuTFa3Mu zrWy68UBdH zIQ-2uVeJ6S)lnKJAzfpGQ30nVT!vH;OXsUZA}S{cLOabX4RgV~qe7`&q3@m8VD58nt?N1Xk}X)UT;sj*r0Q-N z-_0HyjLN+$Lldu5}x8NC~G}!;-X-mdS4G*spma z$OR6EA@cl+RwkB~uXg&*5e34OA%1o}{%vJldD6Cf1U+D_qn^DE4FZUN^Wd;-u^$xM z!?UnXL+P@`5XW2Ve%<3&)`$|)RKwM!n1b?oD-y#N#^S&|Ij_eEj{nS8y|29TzL@Ig z6_E6$nCQZ3A`BlJnYMt7A7#dTJk%K-exT6r@_F6shN|edHaG{Ris+k8u6>LylxWuc z!>R0jG|Dg)1$@hg!&@}jr|kt;(UWB0W`_$dz6T4#@L@7YYKke&Ue2uH8e%SCQKT32 zs`vN*1`g!ofz4w&F|goyXMvU|bfS*8Vt5@(3JE&m(gQ+3*C?*q>ly$}K(fDUIReB& z5u!+KN0J^tcDZ2}#`ZIHvJ=m;;ydi`*sQ8M>!Ra;?2^6b4pjmmsKA2s{OsiZ%Ba#U zWE}2X82cWM6F4QDaR6MgLaLDv{}~mCY3t-BAp?CK!TG{lC`1X=}0m2uZlX$AX9+_9(?H8 zgq&e~o{8cAi(W>I@_aQSlozR{tEb`xLAoS#B$wZK#dG8fgj_U{-S>FndkTikTgC16 z%#>n&Iw@%Y#baRtZB$o;4R7sHBMRI9U-Y>?<}!4=&*jP~1viX|x~T%%W&;PhjjtL4 z%&!}lKT8I3LRMP(dW+gXP-Ys9@AtQU@$dot$B=8I<)CG6GI`O*ov8JtkFtEo-J z1RE=OhRr(+(8TXPfM_A(c-ZO++OOLWm&Wu>R11l4NGP_UQ~z!(48!ls9sl~ONb6-J z4Z-n<25gHDJZ;-Eu|7T%R66sg{lSJvqqSHb`AjpHKLj(au}VP>z}juKRvp6Q)X){n zWf_oVl@8QNbK57vS}oOxi4X4 z_6s-BEHBtPnSPlSQ0Nn9@o$g;EYSE}EWtn8Te!ggfFs!FBPf%lbq-bkH6CbXu;{Ez zQGEr&Zk45!G{eSw*0qUqee$Lp;Tq;saqjd(( zzU{{aK+I5#UwH`%|NFYul_~BxNtHVzD3Pgl%=Os^!Oih)dPk|DY=8DIvqJ%efM*$) z{*d;741vf``|9biK#-CG!C*A~vnv0guqDFZSZL6k2lju)UTR-dgmV9geEXT@1q;m| z=Z!1-;*lRf#*;&=Ov((BVJ8L$HwGxO#hzNEcEP1Uy4i3Dsx| zh7X2g>PJ|l1VSP%+2yF0eI`c4ILeqHRiqOB-2X{3H~-DCbz!KfA}NC(VTr+p^K+j7 zHH7=|oTH8Zdt};A#iV#IYh|5A2{@XpP1i`QI8dd01|3VXo;Va&RV%9nddkIdOlvT?|GDY~_KftYy)%A3-j2#A<%$sAXOhLU(i{6=k9S(!nHRJYi)AI?c$@N@`9A37* za$l)&?WdANn}ae%n-5gmeTVErV{LqFPSA9}WcR!LB6NDW&6Z_|%jE-iH+1zj+~6uUdMF z=H%e3mW_{;*L|eYwTTl_G#gbnj;<5tp0gLL%n9y2@-IX)xf!%=ew3h}mU*)?#TI@Yiecq%W7!sIO)DrMtFBo18zCzC?p5AN6T;7fm zk_4GUi4q*fq$kY(-938ju_A0ks@*ADT^@cd9#o9JgSNY9`H^CUNakVCNns(6 zQ(Ut(EzbTw*Ks#gc?_CTAwA#RK47+18=|tnZUxM1;b_?6+lO^0gusV-VL(DbB<=%L z7-&DD7HG+&^=gx|i*D0SEzeA@+f-9KOZ+&9dN|c949+CcmtA*?Ds3=k;PJxJj6&j=Pcvw=oNF7PWas`$N6M z1aOd-l`o=DlzHsJG!GCtkSa&Po;F*8T!pwXGy4-3y9`Gom0m7cf!`g|;QfnLmYLmF zFUswGG`lom(E*)@Qnuy{n4j{*bmV`wgLBM`Nny&xeNHunsGQ zfl`%}q{nDgfj{ZEKMJ-|{L3rCEed*#G0aUV;{)@dH+v1F3w}whSI`l8_*N$GcbpH? zFYhDYZW99*hfPIBfD9~v+)RXfQCl0e);cFW6GBZ{8;($2Yx)KHp`PZr|K2mB zR(J4P?wj%Zkcce)gNwscD#;A+LwXg`8VkC)(%4_Bo+tbC<56)5>q^){pI7J>Y#+i3zvP(9v@+t-U>>-F_~4 z6`9A2VRf4d-l9{&9pFF(VWju)%@BQYa0`zMMrGUnwZ9#!0pdI1pS zwj9r-;HzRQf5jK+onH8@@YnWUl8p`Ij{N8cEZic_^RnUYh4`km992UbS^%uW1QaUhiC=Hd7D1L#Kdm$E~pi(ZF)^rxsbo6q|t7(~=oZdTxA zE<_K%tM(Wn-!mK_J=B(<$$actgzgAY zy?lf;aM%E=h$^o(vp&j9ycKP_;NGr872&7~`=Q7TlcEm#KMB`MY>YJfPL9-q@HgjF za+S&ZEsi3tPpiTyR-O1Gy%g!)8dJ?PJs23vV?cw9pV77TU;m!(#8Nd@ zr2cg}U5KnQZgdxE@XNv6zmifJ=XZYLYlFBslBfdb+6XqC{6_UmG9BcVw(E1?^$S+)F7^<>b(~r$DO^vxm1gDe_xc2M z2c=(;U3Rh+TGnL4AI>(YzngkSoRG6%NhEP=N!=G@lm=i~Y!D}qVdS&iLxPKq8I9DQ z)YY&&O$Ecq-Ypa|Rp;-JeU7?T4BXG-1X80rRfKu_=YWXfV6RdIl`=T{i{#&JY;Novq7+GA8rI3YcuJLY){)diUUAW5l&xK#UO9*YAU zae*p@l-kTV>*}^U)_Gz1d{2#ArFgIm@JaWzO4T zX;<8lwFv@ct7SZn@Gwh-6`(OZAQ8eAjWXf_b)ef}CNAVswM{24?}EisWSEAkc$03V zk&&?zC(XQo765E9ODMZ8^tF3ZOEps-^`qSY)Dwuv(Ys!rfp~72{PHLCGqBwOpFICN zg={W>F7m4x#;E^OUk5|Wv^g+nX8d+q0Yn#g|0rAoZsCE!M zc>RyvV@`^= zGmWpE1bLbTI<#6G-NW&0#893EBsN z0}AtZ+oX7Tcj`e`oFd_Vv_Fi(gLpFB6lW7O%&{SmxQ1A##a?_0b6Dpv()ISyG9v|3 z@>3Vcu*ars69}nL!A(gQ>T9I-5#pEY`89=Ub*lMe$)mJWaddQ7+luR8!lgrnwH>@9 zchC`Ctuc$s?+nP}_rP7F$d-xe^6-U8yU^NMayy|>UJs5v|Ggg-v|VcYTZ`1;rW zMp?sb4G`JQ$titfC{F zL4@>Qd&7~4Bshy0S>#9&HHe|LO|4WoivVz~i7At|q(e+-Xa5f~b|MkZV3U~axMs0} z%RUg76uP^J7V>bw4vG|1$2;+FCHmIsY6SWM(fn`t!tX>{}6OgFTlmMXhre(!6FOoxy0KP?4 z6rac?^QZR=*b)3*Mxqy4$^j9A{6IgLZf+V}h4@Z%-Kn8rS#%UH{0#e`6AcNp#ckVH zmpUm)MbXc{7NY)JwY6XCVDMwa{th>TIc65B#8ft1haKoghf2LJXl=5@GP%kvblg^h zp!qs%t9$8Zl8j4stGY7zgRIC;d!|UrX5v#SeBmNS>yYiaMbpR}{X2B*Yo|Fr1iXXD z0dXHK&(oyXkRT{D@q5AClgTaxI3TXu3pZLcBa1^qjrAA23}MeQ^2hpThZUwW4B0SQ z(^LT|NX z#?T7N6VZL7x!{hRN}}s|p$q7ObXiaJT%8SDQ40Cze)u&J%;ey%2#hO73P%x%9HtO$ zeHTebOd8fn7nSZUytTevWxOB*I8_E(#R}<~((;o}su@G9xem)s3{N4hIu1AUNv!q` z<~z5~2Z3r++a7)6yJV87fnwM_31)&ioQ{k1Zz21j!ag(5s{+eY_uu_YvD}a=gKK_E zhngfKC(0i#$M9N0%)>+~vMD%TK{l>t$=H2=OK5<{nl@dENGAOJ&pMmsc~V_tSwOl* zbJ7tur^FFXC1~J-Vp{>}{b)c?+4$H{`m41h0ojWnrI^2b%e5-ejf~5WlvY!@DkYh5 z2AE;$p@Mlx*PQvaI44HOaDvk?aL+2mF%*jy%+tm#e9X4pQ-I-cR{sM@E8sUh+5S-z zGzD)Ti}rR=+DPheH@L6=s3+~{FhHnhQy^J`&-a99Qg?rCn+0^mdYJ|GDYEBZDZ5y3 zT__izC-BM0VZ31-E5egSFSxtq7gimf=M@tFKPGQ>Z$so*!_e+JaCk3lmrbhDSg?3Omd4YCtw#_!niNQ0* zjc+*=gv{h|w7C?LB~-zovW-xrm|Y5oB*x2-`T(K(^_ki|OrBxqS5SK9CAU(a}A*y9;Hf zdxhl3OyK+a5zjomj96P-c}QI_!@HNh_fO*`mpJH}Zzz5KjY0@({SFjawS>6m!9#v8 z$R0agj&>*^0z>#iW;%UkbZ}}_kib94jG%#6@LhNkzk|pco1ss7eFi#=VI2-f%k76g zTF$&99gPHksY$dfOmbw*5|1Av?#mDk>bwOXu#yK2mlFd#CVw_0cMey|;4M;qFh#t0_jI*GG zm%t813S`Lp;Ic#ALLjS7Kt4Ba zm7dcI7B5Uus?lZP`2IUj=xNGfR|9BdYw!CVS)moQwg-dy@<#27)r(%kPdUj2PSlLO zX~W43(RB1oc3}KbW1|;rHNuR&A5&tG*c{h|Ci;!4sf*%5k7N-hT6}BYT6KP4&9;a) zzHvOT?)bZYO-q08hYuqogDlaOyF#eCmI_MiJDs~v$Xo?Wi71r?!iMyipFhYhB1(6b zlHiGZwvueVzB134097}GhD&p$(-bCcRU`3cHw7cH0$@5mIjA44?nN)h=5$_#i0e)= zRr{CSb$d1<5Gjo&gz5S}Tx)HZ%@N%B*8J^cwsjz4~M4g}$KO#P+V1g*x{($8d} zCAsk+L*`(FJJ8_ayG0+6W@<{^ISok&tpZy)V)(qOqV1C$A3s4%mGnuDhijkp3Io$9 z^;9BPNX2#KwfwEl7HTUL?QtsmFq+%rXq$ipi?N38LZbWEls*+N>~;OPziCwZJ;-jibKV{bF1k9Wlm)FUlabhn(D@*^c6p>fy) z0C~iy8Z|IdTv*G)y&TY2{N7?gW;rRnE#J~T7JT9TQAKh_ro5vR0MeWe7`WUNeID0< zXNIF-!7XWCrHaB!q67l10<>Pax|#9vFA$w6PH&zI!D#HJQOv8je$0n>CfR8*5b$PB zZ#Tq4lM8GuWl1+58Ku{M=8XSu6co&(LXoRlS~!Pa^n>b6r5;Y!_Xk9*Zt_}RlbPs-?T+~Z>_7fWiFaED*&dGOSlWwBwRk&f2gP0cU=fpWao{n~Yr(fXqF zC_P2Cf*<@G_~kO!zKS?hhOD~d%xWc%J~}SGe{&Ytp%PnN%VTUIygZ~zKx1%`ls?7M zQaiwHD=jLv0`iFn92j1>O2D6QLAn?;i3Sx|3{EfeZ+-*_>LmhW^ zU_Xyi`>y`k9pvN|^jH(PY5^!yBjtZp5m&Y@RX_DnRU z(esLEqoG*ZzE`Qx2wLze&_CY%%9-ugbCt=C!8{b8A_t)y9hsys-(l+P?#Pz@ z=+Sa%++6^WnYFeywWXq54`&|_((m^BN zB=wukvZ#}W+cpV%XvQV9Q3N}Nh@z1m@^ApE+28=il0KqrWuAQ+2rcFUe(5} zHMvp?u0{QJ@uE2v_Fn5B$h}<2FOH~336ykHp!zUf>Q8Ehe~l+){lnS%%F8bwcQ(&7 zSG3{#wiT@yq4FE4+{RQt=-LWk$Z#VDUAGw_V6Z>?bD>Y!@g(y$3+InsFUU9T&ah!k zD}JmVCP1m@nIP8B(Je`|k)9@F(T~S8A_@Ul&de|5Xw)!VPtEY8)QwPUHteoB5HQ`< z$&_mh6kqg+;^B`M2@QJGY!{>_iaf;c_n3MJ6PQ#8Gq6?BOFjX&F zFKh%JW8y+sS$wMZ>vHI7){MUhjgmYM%26+oe(APJ-LT7H87p`CSrNbwtspc18 z>kzsBZBTK+4zc_%rh2Bn-G^qG$Z!P@L(v-JM6tCEcS@O;CO1PjYSU+~GtL!xwDUvA zcFqq()}{do)_Hpf&y8DWa3-c|Ji9vQ>_t$pl+BK#dwSS|-6Yq+ za7F={WpO|d_6|9=YdcG4x`|S8N85fmn0#qntmKo7EDyO=n0n&dgW9bBv zt@L@yS+d6H!=ngnO#b^c{r)XX0lY=px(i*Os_ACPfBEc-62UgXFDrNA34MiDw#?_4 z8L1xM!%!W`R1w{&Fm_sV_!z{)1YAN&scl7pXNQo(a7bN^i`JOHxT=jA0#F^T3EAR+ z?{xs=2W$dPu4kAuav7p(*4PHUuFXQ-$WYs)$c4j3wGL4A=4GkVWInyClo&xr1~ zF;}fiooz{H!QF=YAd+%Hd6fU6>oSndY{Y8S=l@lokUnwC)BUEEf%4tMx${n8b^@HS zMPW4Wr|SLc_&))j81}@%h1qdqj!K8orVd@d{j(h1>Y_tj(1#+axUulyd+hbpn|2c7g)pIoW1l(y0$(Z4TbyA_KPxs)rJc?^*hT3V{%PUr9NPXp2ujSf&o!+-o-0Xm}&rZx^<%KfDlPL*WEGP z!EY4JS3%qe(qQp~3nt^v<5Nm@{uyZXk>tS~sN-bA+7|5 zP0&F?!i_eug0?i~RA=7i<-b1?e=N|)Z@QT?+afWn*rPq~{v7MyR90i!{n*D^>%aZx zbKR&O9undK+;;;agyvnkU;$SdtRuRbjkpiQ`SHwEXXvWY2xNDB-NHYN5$+!|+eka7 z9L5I-`*~Lw+JKlJN+j0t@Cm5uU?bj=h3JIH7d5Pj%dL$SXjUE zym-DHOQyq47LGpM!nHEzf^?!G;jw$`bsQYzmlPKRA z*X|`f{=rXXGIgU-Uh?n-Wl+F!>Dz}cJEeyZk3dG+% zTk#<#%OaC^zVod%Nu7^wGT9R(eVIWld&_U0+H@I$35i!2Yx_oMuJ2n$LyssWNX2Vh zNll7VuB*K^?C&_KFcH`fp}DvNei-G)n6B;gXh`p~@=zyaKnxP)5a67~4Fxrf$3TXM zd&lb!E?Ik7v}4J{)aQ+G9`K%~sOxQVqt}=abGXv_ZyGnJ0-mCx4~OWuM#wj0CteH` zl&PVIGBb2@ogjfCnVI6jxCQ>{!L8*3mIq(x%#)vh&OD!V6#fZ7qem|nM>n1+3%fzM zld)2*shz~KmbTjTa4q6{0(!bB$am~a0@kMhS(6)T9n0z=rE~81gC1J#Btx$_B)<(j zdCTeTndePFAnZI;=S^CIsN*J%OfFCHtKB{fLtSY%(n9+pVAts%3VUMG-m0$}r6VSu zx7Ki;O-1a#7oK_P);?7#%;GII@5iP;|JA8!rhQ)I0BV6M+u%MbYGEicKEdR)sGutf zWi%j4ZyrZ*mOeCc6UTzn6^;LJc5U#VB9laCu%3@hOt3OzvZ02CZ|bz(Uy9R~a{5LW?^>ru8Hl&p%p zIpNC6CFH%pr*v(juJ6w|12gPf^h9j!eYCZ;jPwVv;Bzxg|7 z?CinkTyXN-O*x~_nJMGiiFN-o2N5r7n-bDF9hWXl6oJKqNPY-r%%>csEV8+%R01a3 z$i8|Gw2f?;UYmgYET?C|G^%w-Lrk{G{(mG#qmYAtk{4uB4R>i>-_JG1N*`nvBv2#q z3WcK3*&27|FuS^H@y&s{HE*XLX7El=zz;Wk)vj?q<-D1`T1JPgRKe#P)%Ts4h4fg9 zv&%d88!B1zXL`1U5M;2V`zvKWPC!qFUVUE zA&L<=4dDWlY4)l9GlhT&eL3Kibxq}T9Vdqd>J5--K-V6TIdyF zcUlC5uzm^MJ^J_mZ`Bl6S-Onb9oQ2;VTNIK;T4xPaslX1Os5nV?3-v-zp=UawpfTv zx3=R!qp(*6X55wHT5;xtMZTw66`7NC1vxD4DsFeM)$FgspEF^uPBY6}dU z%5XJWstxZOv@?2{L!*%%Wzi2K14@zfDq4UEsAle$>rgCfx>u`c7|mXmT3LUx;$r=_ zZQrStrXfoTJrFXqu?+Uc#iQNJwzqY5VGTvcK77{Rd;7AN;jzqkn_>z$dkGJmhG$y` zT>*-~bJCEW$Rrk`oEj|jV_xp?A5X+J^<#{~caBdbov7io8HP#wR;^D^bFwyQYJVyI zZLBw(gK!%^Dsl$5ZXnV4hvB9#l*I-DDxe#_7^LW*GupXuyF~J9_Un3}#|0)O1Qep} zQ|YF&LPf zCR)$Ibysm2?5b@}>j`G}7of}m7pS-}hBfi_QC@!4Ps}Nzmy_++Oy95&53^ne9!LSb zww5#{zh5j(yPxVUZ27YFR4vD0xP#8x5|V^tj>ii_zF+iuB2m*9-*d(AwpMgx9 z^8zn4U;i+RpNB(tK56Qcm}fo2DZ?KTa&>P%>g-%UqNU~D>xNxn?+aL0M4glfW*I2| z^~ln~pn{yc?Whb4Y)B$XF?N%jPiEYJe9*+lawC_{3V_Fzi8KsWsBf!J1lCIgp%qsBtCRz#O?zntc2Ti`T8kI_LB_sjI92XFZOM!OOMGO>G!u!9gfsgCoGLA`E%1p_fU z4CKy8Wa1PXIn3q^XNB`9V_nuJ9RXz1KQ`N`R($tkSRSjRg$Oc-BuLK5$6HES53{F| z4?97YX|)s0+pujv7s?q)zO_3c*^<(a1xaAtC`75G`82Y<2D6r!)o-5wRyQ174(?jc z%JdEW?dSMXxr%&BGj|(#Q}iU<=+HSP1)U*-LHqr@Oa@?$;0xLlbxy%(I-jQq%^uo_q9cRqcOcDGHk z_v{W$qHKTlWrVOIKvgN2fSS8unofPMxo@yN3u~@HYFMaAobe^Zz647_zA{u{(y0#u zN5Ka2R&8A4jrjlS1dv9SBCJZ3`4%xfG0C2#j7?TC}(3jLHA>ejkT$=2{50o=tsO) zAtXg@b7pX^-Skufuo4z{c(V$#0_2vKB}Q?Lpx#)SoLDE7c5Piahn}4NatJO63QbI5 z7E3kM&4YGJDCav0PRI(g)i)1U$IL&+24>xf+x`=1OGoRT5zu;!kFqJ|>Q*devVL~N zD!*^)U&nZnuSow}OO_`{(UYlbZ6sU|1uiNu-X&f0N2Af_7p7uT6Gd#7WI?`vr^85D z6WS54html;%h2F@2zsZc4^Ru5zXoP&a^5R$6~yz*Y7qm1VavaXN*25A z^NT0TxCOja71ZaKc*kEN;7T<)q}LDL)-Obg%ygcY5LFYD=(w&lH8~P&b^4w)lBQ$7 z_T{xW+TmY7Y&24=P*t-}Un|xensXG-0I?Vuqpn4j$W1w7Id-tO8&A0=GEz(bqU*|( zSj(jma|?;8d+8(OfoU*ZUO?F)ruw!B# z??1E4RR>2_tK~t=Clb3>(O+%ZmHDXAr;tG_hfk}~XVnqX$h^YG5YJOY=-6lH;{szVPp6CXzSLX4X z!u6dQEH7i~ApL8?l@@*&*g6Ai{xpCECeV{2Av51RIGH-s>O;#pFH)=}A1%4=S3z!9 z$EkI0z6CT7epy0esP4@H|K_h1mP=Iwb;I(QP=H_qRR=q>M5jc}wz+dRew{7HjGHwW zLDe&U_vx(*4=I53@x0x_+6>Oc@unPe)VsiOA9n-GebeujnaW&Idyv2Ci(qw;N>%R0 zzwhfbDvhPLJ=1rfk`A&aT)hBjvf(3ivZ{$j&LAprK7a+UjA$5ZmtB+ddFv9(a2WLC?Fg`-48cDgWK7q;sDXb&pvG6 zu#o%Qw#C1?ikqZlGk`o`8rHM;mhr%I)f!M$zucdTzCF=!g1%Z>M4cSHjO>rR39b7@ zo3+74&o)kwCsP z^eq6rmM@^Yu7CmU5ymPZ#@0LXP;VGxYr)7mhHI&%L7FJl{@MAxDpZ|`KtY@f2*5X> zI9_fwaQ7MXBO8(&vG(Mp8_M)hp*`T;64O--nb;j1Z4$@>7#|ci3pf^b%|bu zvId)900b|GzF9A#657QERU(ckb>=lLO}#Zi-=jJMMfcHH8TX%zGun4uKZ7V*?6Gl0 zUS8^9HJ?^B9{g^u;V;n?YUYG4P_46`;AcNGAZI!}s2adD?s@}G76dGiq0b6ey#;v_ zsl={^owBAwpY$dcem1^L3Wp_1G!3CcVT+>`z8iEUHG;m}zGE_kvPlU=q!#8ZZd}+G zWOrT*I4Fj$LxA@GMY&1N{}vexZMbGFDvborPTRv^dv)Sl zs(awWq`e*9CrpLDS48@kbg2Nf70bt)aCJxlO-^A(P&de+q9c=-SI4o4QaGjFkb56Q zdnr}7PXxJ|;UvhC4)H%kE^e%1)-%)uOvvgQUD7y~D?=SAf%209@;E0WrwJ?2!@ zPJRe~%&7cjcPo0P<^O7UWXyZM9J{ZgQZRlM4f5A~`|6+-6Z|mHsMCVflTZ0^x}7@u z@ds3%v~?hC=Ep(${F93P$PVvV>msHBK_VOo^ZbRIx{`#a49n&|#=QPw<|{Es`xi$8 zP|MN&(ygbY5J6a7igiCs8Z`K}r84aq?Vmdvk+I_@RxOdDnvOSB(O$}xU)A_6T6jgtU z_zUC2zQjEm_CePnI{c%A@M=$5C|f~ETdNECExr0?vnQ@pFVWWI>r!3M5iuas#U&`^ zH`tYtha;N#WXCXr9nx6C&~5MU#>Mopdj05-C|M;lZ2; z_+nD&ffh!TTvsU?mMPuM>Gd#io03Z5F1Ba{{yAIICT#|3(*pJ`8=A-4jcrSmL@A2{ zywqd4t8)x-CPhB+c9-(>JiG3@Tsygx)%J34{>5e&rX=dDS%pKX3!#(>SL~o$Q`I!4gk2qQPz= z#DdFHcjMPDXs9 zNA8=BC0!equ-+L+l&J~m>AQ-`x9VEseUT7|Bwc1E2^?C}3r}zaF)}+$ehOUTTj$-= z-wt18`u@%*?k-KJ$!rc%Hb(vy{Kq&!Z~Ek^zDmX4*GZp}!mjF*ej@ir5N4>vja|n- zDH&3B;`pDsbv;1fPAEl2pfPvKgTAYMxun?}!6B=rR{z+Iw0mPB9t>Y97hZ-R&KZc` zCAQMFink(~H$OGDtU%J#{28iNQIq^36bg6uk*Jo zxyhwRrC9cd#ZfqQVub{ZnMxo1Jqgcp-xVfM+XesCE3);IRufM~)I0)X7&ic2lP8JB zMrtkJ0NTodLq7S=0qT1tl6KW;mWEh}9+X<6fVq(bw0Ry1B_uLI{y1nQJ>1Dls4}S~ zHH+H_>~DJZEFh3a74O^^-v+Q)iYnf-YUm|%oRQ}jl;TI;ief*AL^tunu58&#PEcSN zzQ`oa$}L1m=RYln_KFZxlntstsTg7&5eyf0Xkve7+!7XmkZEmAaqxLjJIjVYM0mVq zDnG&k9?CD8PbEDZg<3X8fP8rTu=CvIFY??t22kZ15IUg!-|?fJNsMvA`=8E^bO<=$ zV{zG1|EjZB0ocmAqdv0%iC!%eO^7Le1N|TbdRmvpEa~?37|fR+fk+@km!%z4ce&Ir z|9)$0%2w4^rZ(e0F@L4Azbp!!-Hy%{izsTn(i&DWC3ePPiWA!WygLibxj76bu`E>7 zVY^ocFTN4VzP$Uk%9bX2%S7(75ge#j&h{h%FR&to^SfqA(iWofy`GlBz@aF{sb)K9 zX?=fU3(0pj4DQF}rK|4LfU~;A9_|Fno8q?@kh&6iCZ=$+8zhe}O9mWkAsuh%PgHxs zG8%>fgfVY&7jI_;*p1>a-!(fD?FSiGV@s_b{zxoZ&=zXP-l(5-8+)SIY$~;o>n!7 zn_}DQgKf6|*y0m5_994^f#}M#%!wvHETdbh>Z9CWV#!(Wq@-6|<8*c^Swc(ZxLpF~ zx)5K#`EEwK11scuBM=lu-zo_BQxA9u5xW{C^0~;>)n_pDG?uYd?ctOX`g2hc?(;$4 zg@>AeV;AxIK*KpXt3+RK2Y!5Qi=fP$2s5{*2b=Di0m;o* zT6huOnO1+mTbdtkPJ9$#nO|M;Jl}M={_SBtnpbz_@O7dCFO`vm5BStSP?3KqJPS8O zTrD>FQ*jwiX7JnsnPk2ia?m#*_0-kgJn|NF)jOwp@gGgqz&u6)!Cj!^9S4C&oWv6H zZJtHJ&=69lzZPFMPK~hzwf?}bo6u-h1PrlV>;-_u;9=EsOL$qpua@*ps<)A5t=`eW z6&9W{2Y&SZI;Moc;{cd?xt+pec*p$;uo=#-OYQP@5Im@50o5c85y?Zpf@CALwH6Em zT(xO-W==Ui$ZC@E|9+{?7LkLhNvr(Gr;9qcz!;T4>f4($lF3IgI&}D zWnN^)=P(nF@k-cuOpTK&AdTX4HaQ^x(KjngcGf6}@+oQO=>DHPw!^`|ewx!t0g(WQ z-JgvNtbB~?Il~i8(j8JJCzQ=DuK1F}IidL`WOf!gI%Xrb8c#xaxtXC_yRJT5Q=b}t zq+i@yb#97;i>U6Wx<#VgsY)K$=5V%$**87%79#qp7ciqVOF1%9>w=v$&>U?&D+xSC zN1T-8`bCT?N|oI?E_^~VkmRCl7uJxKCY<8%$_+`)$_hqFrs_}knnVQ^~;R(OgLsnsSu9cIXAGAO#n7G&02JOvly3=7N*fn8E-@ zaoEW}NeSWMg+?F4g4cRyT1zZGsu*2TGlx}+1+Xt7mL4jv!5_x(11wefNfBrJ%!4?f z#Et!Hi%j%R9l=9VXsGZ%@`w8yE?=emwN;<@d3);Ca@uxTP4<2Le^w<*_&A>?uU%9? zCDxcHF*^2`+Hq1oSuUaHjn1`9^dQ`uKO%_Frw}r1~sjG zMQoVZc`)66Ww2@Zwg#NQNFYbF`hoRFV^INO2cWF*M}u7H_D%59;5NJj@H#bq)+1{G zT#!v0_v##3C;lV>ZNMpGc1l@A6H6cJ<%~q^12G?o;ytH{R8)~ zgV*;Xi0})!#?*#vh@Wo$v9o?&c-zO^FWfyBHI`WD2X}zq8_JrB4+s`%q(28+m@%B0OqWcLk}{^JEx5;dFGdNN5Klsg z&|%jo5%)V2RIJ`w3YUw^Js$Z3%+mz9{N;|yTBzQxIve-gu+C5|k7)5NM(}bGF`7Wl!?op{l1EK zUmaYL2Xla*0wi@GAtop;L*3!MP)XB#LAsKzOXG%QOJ4Xhfba=Sb%6}*T1fs`W|5K| zRThk!lU&1d;XA7=9~DJ+5k*NcckNsVae71)V=UFI1lne0u-%PSLv z>1nAwr$D$aOIt2c^kL2>BlpEgPh52~7x6^$q% zy&Eft3lu{6E_I0QWT-4XHb<|baL5vWVD1!~F$CwLxOlT^#23x17+!yCm*abt;fS$V zN-o3#GMW)QKk(9gdr_a>P3M%41vL$*07XE$zhux6ygE*B@YqUd9()Stg2WVYPk_0q z6sK+v@8Y=>{?|Fp&Xq=-Or6390UObY7yca^j7@_P?@XzqkqA<^2Wz0+-q&J(w_@Wm6m3%ym=m)YQGdJd$ zZ2Xl38BRe!nwD1~4N7DcGRlH4lP2=*&SH$#5bL~-Zzgos0hR%F4Z26!5R96;#cFFw*hjPXcXyt zg*s^pC5z1WrtY|?1WmeEYb))WTGo#SW7b_8N#u&!$)9iR2gF8nx>pyQt79?}iccwb zyP|M4*TBd%7#7ytIKwBcy$Mh~pzH^UR0c>!g`H5m)kHif>i%iS_Yl?yB}o1CZUnqK zl*XS15M|dI48hpt#lyEJu!(e0c}zdSI(rFtfQn zNV`|A%cW_*&4$G0z+1a|lX_kW(E<<=qT-Xb?)c}f&rPvd!0h`hfMrju4OlcZ+9@1= ztxQJBXfN`@0rH1bNz!NQ|0wSMiMY9auu$Q=4EP_r7Y4%KtS7`88R^UMDReJ%KT#K8 zu8W<~NhqKwPX7fsL1U^@x?d^Kz&fk9A2k2iui)I|)aC*RIO5-8@Rmr~1RBc6DktLdP-jVJr(3>Al#01;DZ3n=UBu=bu>;l%koKPyY z+xlb@-JE_NXMmk~x0XD0TC%CT6c?A=B`XrjI!gf?T@dbO)z(`llzVeuY{zc(do8Tb zs16{KUXjQC(>9B+)GNzqGgjZCfG;ZE#6Zv4%y3!oN-tIhzvdwl%nu|&=O9L2SD;`` z`J$LyiHcQupfQTcKkK900_bb}2$O$wRS?%qk@Ndmm>ftqEhU=vBy_c2 z)1L^5xnR-}s4^645nD_+LHpQLX9+TQJ+_X!mb}Bxdd*hhA$#GGVNNaZ85ndF-RmAPY}FEt zKH113IH15ajq|jGN9h|`yIiGo)=3Jn=_6WHV!%~0k&v&IiiM7&%e#Q4Jlxa)uGS!C zT?9bm-w;q&QAjP#jtTX3|L-cHigUL_nSedg&gTb##y?n5P?`sC@4zP=kgEG6F>Te~ z3l90Fpt9coht4A709u>gzz4P&e5f6`hKs&s36Q-O>mYlYSSJZDewpK_!t(KPz_1Y$ zAGI$0L%*S|SR4@3HtH%jKpKV`8-!cDmZ7jLIqdnj#S*JlmxsX)jNjKi4I1yXJM5Ad zHTJnD#ActnS~dqZTq6e)h(XWV1Fm`Bj?TIA5V-d;wu`T%tvV~zDd%uTzm;(!j^Ctc zvF0>&4gAgWp9Ctl;M!YRX_@YIphi&K9`j)_hGQ1I4czHGMgf0>Beb{3r%d^oNHG6y zee|-gk$tU4G+}EQX{zp`%(LxX>)31gN9cvS^^^o5IRlRBHq^Uz1IcSjEC^v<1n-J! zztaJ137&OdcpPb(bL%}n)YJ{jH@xY3Y?%0`c5;4-D@px1Wa)SX+0hhV-xTYB7mFoF zOX4=Wlw`=e`$EQu&~Xi#@(n(K$0uucjn2>8?U%++V!t~RBF`{CAxBGx34mPXY7mqT zk+G&+I7#kRHGQV}5D{^HM>gCfE>^x)s|%fImVUxf1z6%r-zPJcDsQqC<${xE?d z_h8(s>0<_93Cib(d!uc$E%$i@#Jq;qZw8dmN-01luXt5KdXFr zY&qFhx$V}+{|%l|Hxa13_{kc2vQ(L_dbIb0RIfhgGU6Fx(gmxOvvQ=Nv9-jj1!uO| zoPHa6n6c`Rd#Woc256D}`4t00ZxsXYqP2M#$1qDIR*_A*6j(muK>4?u z=Kr01vMH?9yp~)kpJX-cKFiK`^5qTAqiIxQJezx`N8(!+B}iy9tPXM(=5bR2*9xX@ zYB+rBfO@^<`!TAz+m64$!c+nQ9Z~PQr2EY-UKl0z9Qv^_)HQX8#Xd_6-o@siFO%?^ zK7Rsq8f%Cu5&rXfagu%EK!uHW+al`u<75c(KiADW^i`XohfGgIQEQQ z|FWEsd_D|LkI-t{%+$4whmdtSLH3civHvOW%R2;w`-TIro9y^hFbeY%O3ltx<94Xr z{`{^hI*rlDcv@8#cZFuWXz<^BK)eSXB1Sch_X>wKz!3dG<{wnn1pWDGb*rOd_EM5a zRw_d!-vCoDZPtXp94K$M`MQg5WIAxfJUQR~+U`P#s#!F%L>W+if7I&Gvnb`yW^_=B zZI`4>F-ztbTj7s(bPsKYtSQzqM?(*HvXLG$}hDhM*=DB-H>4ozhG&q!+VZ)q0JK2XLtd0V5d-uOt zKtq1BvAy^-0iw=ojV`h2PtPJxe7!+@p5~$ESi_<4)1za>7Qpk%N_44mlhbWc4?Q;( zqdJ^e_A1Yw&^Sq-68Kvp>+0e`vR@8qt@EkHs=r#|TIY2;{$fm)VJ_*D#K}|mW=6Wu zee#TvFf~GXp&;$%DdY>u|0wX;-D{35_>uBL@V4FQewO^8F&2h6XqH-&PzW<8BYD~}n9unZqmQ;$N>Eh9pIf-(|{5 zbbE&wxkrDst!WSF-mD)kiC2$x6NVFzrJ5)yxL#pRc=Gt%8#(fdZKoad2#a~P!Q#w_ zboZdX=JA*JiQ|e;0{g0pIhaV2W^B%*Uk9!UrEjs>_a}9mwIc_A#4oTH-1Kmd5aG?T z!Ez7h;KB1Q*Yeym(g4YaCe=muneFS1M+IzSc1e_ofPex|oQKBf+-hV{hVj+HZ>vfP zJWx=>N^ohk4CpO{Q>m3d;DJgA*(>B84Ul@e8DXuMZk;&nJgkP8QYIEVVfcrr!+z9X zOBU5k&WOM3)oqTU4gN>E7GDTG=iRG2^dTgBNe?%xjg?k#7Pqgx)yhrP2@v zrS&W+CvmX?J6>aQuITIG8|v`S*o2y04)wecfGHo1-83HJmM6sJjHq{mT6kEoLeQt) z7Az+_?bU?TG8InYr8?+5B|r$Tmg(1k72aDmUcqLijG`;!U3$F`FIVsx{_hDE&y6vertcwuqq4NpcoNAvx@r%HI`&#~Ie;uIo1Ob4#!f*UzFpbkp3i z$_&7R6L7js6|LoL>*5wE9=00mFWYU}*C!aVjrT5UZJ6Mkjj+*caGI@mU3-ij+S1dzU@xisz?0TUTlfht6jNq4N0u2}UI@lm^boby;^ zb3SDgHgz|QziSiA5lt><+Gx-)Y_1aM+cWUlI2}ijVfru(8-H$K@qm~aBh<^L<8!^_ zgYHmUc9=Bef)fbN`z)v5zIqQkOy)`Fc9$BR)01~9%xPTxLUam&R7=C(WI5>4GMz^v zYpi8-1}bDJ7Z1tMb~aA=?Vr7j&zDk&E**q=3HHD19|vwdvKr$#;XPM^m89*XPrOSj zTv8cPyE%8LSc9Nf!K&!Z>MrX4Ot@K>Io#DDAI`P&`Q-XyNV!^my65LLnuoVAket+! zXw2iSzGcj*tP>q^>as2K1^a+Go_IjCJv4dVo)`sFayTp+dpnM;(rG*KIw&ALj`&y& z5<4*Kb3!h=PL{iEb6W3$4VFJ(iS`JR;I--97-BgIRzZ`9HLp*;qdWMXP7JOqNXa`Cn7X4j?yN zoMYZ%sdkQFBrGv_LPpIy>)O9%aonfiov$|kbmIfbRxTsJA+6QTi9t&> zuJ3gC7BHC z`L#kwlB)-dBSTOk)KYQv$d6*a8^ZfBNFSbb9@Bj1j--zFBQ%T$u{<0P&@qYWtEEjJ z+3ROy4qYuf;5I(;%{Zlh`!F2^fMci{2(CP9W}=iXK{8-u@%S~b66ZY2CWf)UMtj zxnCGjQIxxwr8ZP=JORk>AgWWVd(iuBFB7pHCyM9o&{i-$d4eeUkoS*%3F*ANb1z?U zIJ1vNWlF|@kas@Pm;>kH&{Bni?`s5Wb@=5_u;x;?!^fd$IUpsm*Aj4RsKx;|dHJKg zpEqj2w`?sy`{hs@CcPlAvfyx@-QkkU?OPt;Sp;aG=X~(z<4W*)+f0p)7@1VOnu(v{ zcTT#iE^&YQ7?2g*S*y@pS@&@-#x5mMza>fmR;r5@W|qWW>0CmcmZdOPFyzLr;BuI_ zCjdZZhtPq|DRUVT0Yx1ypV`oq)Sle%FgbG~xR=Ob+&=&YT@qIrk2SbK6vCynMV*Vp z=i?1H8*2!%T>dLTJtY=r*r>ChA8n7>auRW7Ko+ji__$(arg}I1be#}7XT2cp5Q3D; zBsy?CL&_~8MN&XVTz!|#djt_A?OEX6Unf+_=32N!KPf#xS-AlNLm%x-Yec=s7k z2|R=^rzbLt{^=de!^dopHliy`V|!rDg!3_ZHni^GN|4?{Vti}az-eIlslIg8+Z>VT zmO^;IgdQn@K+2$D>UJ*TNcaymKDL3@+TgM?w<)GM{bbUD`2RbK?mnr4Eh))rOd)-b z^nt(TlRt+^04>ihy)aT!+mPMYfD3`INi#z3jyaL!*%gJ<9-5q-g2PK4BvjK({zBhg zHlm&T1&`W3$)2X@6kIx(8sNJB>7*_HFwbqd5jhaCN_t>JBB{OwC_rn=8x8}G=WEXI z>dM#&zg-6A%b}YuFnG)3E~J`T>wj!70c_(S<+`<`U5f)%b!WTXE<8m`FPYaC?jutZ zR4=n2!(T#oIyKzCIM8^r0?8IEs9Fb5slP&_htu8<;f~hIWA0bPW@*pGNgO{KuBsuQ zd5+!krb%W2I%so}CwWP2x!7)Ti^_IpHRT&J6e7p;M5`HKt1h|qu{`ysu|!dnkip zHouRorVkAgh!sv9Y7-*?fbVMi6`_-@F z8~vWs$4;qc|C)$jFFj!O$`S}Mz*DUS?`cs3Wlz4$1s%DL;RE;<2zaXU2l8!eJ~1I> zmL-8`VT)+>BD|}D8=VJw>}As9_UjWsutwh+`33Us`2)6Hg+pO12#809gEk4dLPu|< zw=JmL=g*pro=2C3@O?O^gvCyx&C-0 zwW6?>Qu)!j!$*@kyz^n2X@>K-2kqm(&f$3-xP25FDqA)kQ%oeP^U@i{9Q)eZFh_na^t9)`x}KB+|+${2`4`8B%R% z8P8O^mjUWl(vGglgs5(QQhmG&NS%znn2r+iCtR^9jh+^tbAEeJn@hNYZ_;J8RN9ZP zS=1_;#T1^ETNy=D-C=WbuQNHMRE);r$R2|j17|%0u2yw>plczV4N7tfJ)-Bx$dNr= znb*TP^!l~V9ab$~jGMoyj}@FQ654z2?^5UdeKV5>|HJYWa1jOgD~&n@n_Rg^h0OL? z2hEnFZ_K&<9KDlP-=n<>ZFHsa z^$Cq}G3BmvP^p9U%G490`lUF=AdI>hVVS~ocfYZUV#nfV0;j6ZBh%&Lf`(qQ!6CCyFRx5L-gRof~Vk%k23CHj?<^$H!Pf=bE&{Ay3Cgs zr-JhYc%aHJeSh6om&xeMxtaOX{cNMZVF8eBoylySVyqG4PXpRKO)%pCEr|%;8hEE= z+Q+R8)<6F8$^am@x-C$=bD96C!RA0g;Kj|q)1+FNkoJMMCTi38o3;lY-7n9nR-gZ= zC(!NBSd~TiS4RQ4bsG#VNGp~k>VuR=*(1KbU4=*^9W``)stlD8h0aMAZt>UUT#(9f zMj?z$tUR0;Bvmn-P5YrSdcH+}A99z2>3-=2gzCdrCb7Z2vcfAX+$y*nn$K-P;=!MUttq%vQA>`UvP_BdZF$pPeSM|GE~R0r-@S>1q8iRlIn4Z_%ZxRcZ8YFi@QUm(6QB@H{B8`g+S~L z#!pP}^HF*o*;*}EkE>niU92f2!QH4OEfp2^y&ajkjt4SP{4gs@n3D7WNQrP4({tPT z5f+b zmB4XQSySR61;CgUmI@+>CNXy_xlRr*L+^!^W=3tKIN-3ss)LsdhH&Yd+GBx^UKkYtR;t=I1PN*yT79x zW~Bu7>=tV8DUY@Tm`T&-D*WN=_+Q&bVr)C@V z-|J0A{S8=~4Yn2D4@w+IVE3gAuG;^th%BIY6v)vnx{ly1a{OliGtM#{P7cnJNHD9B zfwe$*O8P0F{$^1B0ue>?Dm}iOBzUWbdm}P)0Pj)lxdc*4Q9iSJf|d^*{ur~8$`hYj z*cT;;1%IS{s>-JGthrEPw05b_XOJAlZTvtvO$|73^2=1>iFdYQ)QrC3d2TZ_c`L4& z?|fKjUZdOA+bICax&qv32X4TJX(WT2z70aj=OPKzF$Hl_%ZA>H0td(-cz@; z#~DsTdy!y5HAC&wT{;)>^`LOkowHheeSgUXcWZ^1r|clcz88x)^I$2H1$Z*S`Id}rRg3DO0T-QRwvHqR`H0E<55w48O!WbP(5_mRjC zHgTfJ#Hzj`AXrlW)ShpmAnQN)hlHj?%;Ksu2Qu(~SIuWmoODWudkTZ;TZvweP3=!u zLsbb6-J3zC#gh^SkfJDv82R3&@~DS3(Do4V|9RbxlYsiz2k!>c7>a4ME8btjO*Hqn z&Lp(W6X*Kk(YD}Ixnow7JicVE$zglYvfSGbfBF;PYEcSKEOj4e(TnO9FW70r!e_Y6 zWPF=o0plB43O=IaBXCczn7^~4;>KEFv#Ff-#frOOmb_1lvS&seBaFA=1eY?e5MBmDi;RDNKhn=~ILSRkgU`)&9OdSl?T5O~a zdOu`|ic|3y)bSxGCYB_BG^RSCZ^`##TKs)!xTD$L-v|m;eHXJ4m+q$U(sgvQ-CeZC zLe9*|aToFsdEk7g(o>CZ{nPKJlhat^r6e)gn*>KZ zgMD6FV516l^02bi!@CX)tz!lXLNIZ>xW%|_&^ELx|FiAYf^OqWPi01F$RCjJ+p=*1 zI&1c@FrLi2d%Yhob{aKHD+;6g4qsA69r?NC)5y|2~^SgyH0SEZxmC5$3WD$*r&mb$R#!IWCxH;(>Gw1UYmY*AX%oLL> zwY@e~eh>&NW~4A4r8m~5NhA9ytj}Oq{ZAKLXSJ1|>f)*K5J@Ch%i9-WNY{noNU=1u zZG0C~&o9w!qv87-@k;=|R7*9wQ=f;)HUptUH-x(RY+~CcQuSX^hGal66)q=!WSQ)F*@)PX#r zg73o^v-*DKN{@yE?_}P&HjrHm{h!LBG3oO40h^Ti4DF zg?aAwTLUh_!@5gnTiAKT64A8qjeI0Cx2 z`~9ERSt#rFF=@J-;0N^{=!8qBi2R#y|1#trLaEUlyZGwEcns_es@F9w26_%6{vHzj9{+;-HX;Cypb*lI`Z&srKBnZl6nkkct%7D z(VbAdE#2_c&<5*yIFFv}oC7uLCAHIimmZzREnm1KoJhu+`}J%6yY5JwJoP}yj-DvE zx3*wH6v>L8=!B(S8juJX)qL4!3BH9-V8*L*nCU-XAf@t=0IM+eFGHy`Fo-IK_sPf< z{kMj%oGfc8WUBL7%=s7#CAY}BvU(j#vTocf-dNQ`U+4PzS8Rq!jz0hMmacIu@Y6JU ziP-<@c>IP@yWzjYO*?GN^7e*1!X70``R$_iHNkn`O3zhv zE%U|T_ukMebfc*Fzk8V-@7Cc5V9!ga#I1I>*Kd1Xq))TB8>=W8zlkeM$N3G-{T+a& zm^2BF{F}VXTIiR>>-q_QfQ4jf`O;eCij9xYm;YEr{Kvq$w?=-Cmr|4T=tkg&@0a zx?@Tq6}6j+zG6)n{Oub7w(3hD>ndZlEmv2_XJi>DF5?5HSkm8iEfTQEk<@KYLcwv$=!FW;Q2^usWZ_DsP4gJ>=<%CGzNGT%u%F_K& zGBV=u*reWbOULJ-3Aur9fKJjCx&GJP*f(u_MyJr72D9`CE;^*W0#U)eT!#33dEP0{ z$%twfWS8|T@jHNg5u);t-39A&7SDXOEZQxWF3_B$=RbLr;)Hl9B_{<#Dh_pfPj`63kjPpxke} zZSMHHgj2*Lg2{WkF>{jaSuG|FX1ReFLu)76^&K{Et4U&od7m@4@k5r)iCTJS$hy@&=p9`Fo)PAw(@=Qsc_?UT$id>owJPpf?SP$9HMI zZzkk?3%i~Efrf{jp?dTZa6)eGF!8urg0J>q-75iiX1RFuzHfxa0vQ-wr4yXV_@>SG zGqSzC)N8*Wi6C)c{ZH{L4VszjJ!@TpN;A8KFNT?E|4mbO;eNHuY(0Vmilx(>Akq$5 zh`$3*2=q(HTF)&Ip-VHQ2JEE{^X+8h7Ox*XI!^l)aSUN`&$5Nb&N;BKW2oa_PSJS_ z5eyj6X1F{g-OqF88Y8`rn#2rroL+8xPxQ0@K~z8SS9CW}b4^)M%k#AYR= zG-3vWgQo^d$J`^V(D3LB5eZ)fsgUob@Mca(<1$q`Az6y!TP5-9 zJ)|QiWt}F}0>FeR=K)YloZoFig~r={?p(($#jSJ_iwCo8=`iPdJ~NWnw94R8hu}ZG z-F|}FOke*Z(&=OXlORwE1HMo%9=2tVXx!L37M4x(-8o{o4l>qVDEM9Vw9#ge9>j<1 zAqUsEcLsG>63imYFFRIHHrnT@6vpDuwExcHzXyA{sqc>$;S@wsW_H|m!yT$L~v@G z2kBz4NlE!_eG`tf`?|uhY1w2MEo{t=39oCDA%TO8`r*;;CvutoAxm{ut=f%xHia5s zPJ+x3iGSX;Y-U0mtt6MQGYdY8UT@aXm@Z6C`jv}h5r3QRXtra2)L<$o@Q}x*o9N`m zNXIw$)ac;6A?zW`QAFY^j{ zkr63PcdhKTBTdYnJ6aQD9Vr%oGa!-(EAp! zi%$g5e;5m7T7ORTD&b9*I@DvsoiNlCA9Us9@~8<4ExM~^6^wGY)<>vdQGF}}{WOkD zqE?)J&Vc|va>bT$Ro*ozGiH^;+ySnTz5{e z^en>KhsV`-z@Oa%TlD{js_YMkS==kYF=L{>Ao2T9bXLZ&xlh+#m1aD;H8YY<+F=9iT4$hc&aift5_6 zSO$CK;KPT|4)Z9RyWXzR%zQ0KNLd21JTPKKq?22_{pg%meSg^b^>J@5ElU zWV>kft&VVf#7sApRJiyxplYX*$k3f`=dD0ipYGQAwCJ8tD$zQ z?#v}p_z|usP87189_*HF7aU;va3ttAM<%o0Z3wH3!=Lp4a^%Rk%1=&;=l`zuZn?xT zxc&N5EAm(>v~ONMW|&O7VTLx-r$JJxL5rwa9 zSMCUX`pc+oIAcMb`cdLr5lXF&xKwU#A=%Qo2!VnG3jNe|wkGxOLFuw1rQ{@&xnV%N z>YD+t=ljzr!|(x8kzt&EIGtAsv9Q)))tg04)bnPgH>SsincAfinB~MD#6KF5Igo$$ zoRAq36DEgVe)hD;MmJfrgJM={ZSETM*81d0sgd#1;Qel+QgeKJU>asVb|Gt?(@sG}Fq;8E7rh+xV8}CcEpGhY(S~tk1U9l0#2sco1}k7bM1o4 zq4mhcJ9{Syk*SnMW{Wd|u5}8lz@ignyu)jAj<^!RKg0pM!`M9q1Bf>YN6#`iaVx!H z-F0%&3r&B0I+a8np7QmR4@;6()$%9(g4q0Jk3*3EVQ8fCck$_FU#-kozmg0L>MV-= z`%|g!5~`{%)Um^%kfRoE3|BE4f#Fvq&Kdp^c`vmj+}$YpqmHumb1{}L9yHW3H>v(W zma)Gi^7DHyrcGG@(5FvK_}y9K*|=~>2_sm4X~yS5^+lv1d+R>DrLy5gXWeh?NDUa& zd!!Otx#>;^1EW2cT+QzmmlFF2N1{(v;STb!=t|dj^6t<5umb!*R+K2i4BMG;1-aTS1Ckq#_++ZIhZJ@@+u%W-N9@jcxsVqsR}} zOsagZK&Zh5sEjBT+&VBZZGX1gKI1}5uUc0F z={&1ifa}jMWzZiz_RWY8+G6(q6LtKt8%$}NVqIsM@_?+itaK=wtVQcX?K8s;QIA_2 z5DZX8nSBMMoy~k+>>^OW>z|C-Trb&J0*og-2a~L4pXd|xEmYLk8m}E9HJ)KX<9y)G zMNeSl%XI~inwJq)_TQjZYIf2z(ro@v1rIbh8liUP(Z?x6A5oJ5bA8TNkM#-8enH8A zIo)Y*=gh(0jRMy_bm7&5Neh-BcTe#bZ<=yH%I8_zn*z?1yF14UigD}JRnI#^jW_Wn zT7veLt#|qThEtOMD4W|#}VyuuL4yc#8s=b)uU0xld<=`8F;skT|Wr9zQ zX+@9Oj}L=nOx#%LU$!-aw5`R729^B2%LB^z`jT}Iw1U#WQ~ChbP9IeVk?C4>>pWPx z8(;4Oq1CL)>N&`g1o$b3x<0_gg;z+6UTk`$fnvwy#Hrhx@LT|yU4#4xH7MFTq7H8- z75~vt{%JJlU;Nz%#hEHgni^@G8*kpVHH~L^2uo&l!$Wq<`w&Cnrf7lg-S@#Fd6x-o z8M}9wG3+9}kth8lKNb6SWTjtk?~`S6P^SJa_6l7StPEMu@k^|Z6gUVUZOMb@Y~PjC znFI=$YV#R))ax^6`h*6ieZG4m(kTx09H=&CFi9zolYK@E#+-5DTTh(d{96`IZ?8~^ zT`I4vNF`jX@KxT54}v85(tO08nm53j!a_|o@cGK@t}YF3+$!Mp8$t!0m%#}52NqWb zL<)d5F5Cv7@8iNR(%}Db^3u1eL(1;4-oCgRCcCZM0H7x;X z={o4QkYz!`rox`3aJRP)yym~5D7?rx>jEZ+g}K+K(^I3JL(;FU#=I`#tw`^RcwvuJ zm>!7a-+|H)r&zt79lO*=8Fi%y!JXOu(^#o^EkdoB4&vd7sG9tL&ox-fxubP$htJXm zHSf2>I`$-t&0AR4$5wHMFI*wFd@-%5xBr>HMm(JM%ERdu${ya_1;OpidJ4o+Jza0_ z$uW{kX|YQkD2Dd`a8h6e@(6%nFNcx62=idAj%+v^PoMiABtN>o$0U$HY0}hmdl8X$ z+LiUif7h%mW8}3csk8vjFB4QU>N-#HM&6cl5eF|AzrI8y18?RT?R@ng=`KvH%kc~r z@5Q(|=eNU8%X;Jb>yK%W)B-EJPC?^t7R5g?e`6aU*>DQKCC8Vwh!f>ZM2fvheN*`* zA_>D;_U6)A>IrERM5;_4zAS(QR|i2eMm;1HvrDLMR$#*FIB$&~C&PC!!11R*$)URQ zeQf{vZK_8w8;fI0RA1FqLok5KTNNq3MHJ7Z!qzZAKukCC-gdi^QN;JiSxGhj%Mr)( z)aV{SlE#_ym`opg-Y50!HL!evS(83a*xON>k;IU}GavOchoB6F1g z>){EkdRS6l_jO~q)2*WF-Y~@*vN{L+E`*4oZ;JYgcmqNi2#g7oA&1M*i(ez0bS@Hj zuMXZEtdsHNw#@%dhqaOx~6EX6OS5F2^DmD0*^*`Hya&Kyr z>eW$X!mO{JQ*^BJg71PBs;V4|@A}fcVz)?TP1%P4%v5{YP7P}_QMC9xEW-x9i4S!r zFOqHZ|F)S19XnjW)Bc2-syimcX5f6c@!`PR+jZ;LLW2XDF17MRjWO-m;YM&jGlA!A z!&PcW0@tayOcQ~(0|J*?VU1y;udf!sU}50$_DQ()lpwKTB>nd-=C}P{=f8FnB%8p^ zGr438l6QB!uot}Q3$5l>$;b+dJB+z{R)ak3J|r_hL~9&bPc^ztvsH_~aQ75>3XqMg z*WgMzqRpx&t6)NBcJj#BWX#eidDOZhRpS$s%DdOZNV!x3nK_&zXfAi*U8p&vjxKo(MF# z(l7u%-C}}vD$iX(^0+b!+C*yVthohT)g2K&Oyruk{}~Vvcb}zv?jr?0Ct#rRuN&7P z56RQOG&paKP3DbUfLg}nuP*1jgYW-scv*_e@?a~0j1=Jj)cb#yi5Ei0XT|^u<@ASV+cu_67n(+`l#8E zb#x`gUIpZ8!VE1>ziKOLwWfyoL?B@MfvtuG6g}-V|CdLlEzXxKr2d&a^8fzGl0lhZWDcd zFg^{?Y7}#}FLr}nyVk<@6uX9%`|BaE@3UP|Z$~h;|JC+y28gX`#7|f1a?hs(W~+`F ze+n`3(H6y*B!!F=IXeO(*%ggdD>u}k-VhpPOQb$yoYEJD)SACkpQh7m_TGd!J-gNWEhAJFFUQ~numHo zPbA7)Lbvo;>00x{XA5VqRbq^+E#XN^sYRXScn?6#_TSAmBFKQ9ZIi7JsIK z>dmkFv(o6%e?;}_uOn>>_OFM&VJN1(p8yT4X-*CnVV<99ODu8X z185Nkr!ki~TjSm08QaM(uPM1%sPXf~WH&P7^VW~73xg;;rM&JPuRCbL9egGU8Rf=BnnC=GLX?J?D4+qJ$YsNb{Ac)APQ7rI#4>d;i3 z$oFsNn;r9ExGAxs^Je%(8@Vy69daxI1abM4yrT*rm9WzU&YhFBJ3YgG#F>X)CFs%L z2Y10(ie~F>wN&h#UVYQ6YEvOU>W}3iyORUW?V{gZj58=BrKlNm(;mE;_JuEn1WdRC zDl2sz@w+14^QMsEap8`$8~z?`If6lbi0a}wQHu{tzcHO8ZARjsdEoOq+&VxK@deQ& z{fDiQ7&P)W*|Hfz>Sr|OUjm!!*wC&*u47=;>}_z9Ero3`Picp6KafAQpQ%MMhqLUh zirSr{kBn$t&~MFek~EbH0xpOKr3T&1|9m%)S({UdeP8kKwZ>s!H7rb~S6KR{%pDpx zWrY@lG7}hvJH9bK#621Scwu5i+h=&aA`(7hi>jS!zE$zp$KR-TA!18amO}xAf;Z|O z8WGr6Ts!gLdgx&FHYbUImr7>V89NNpbQEDPk~_o7M?zR#(3KT^&KP$-peFDyCh-(f z{^NB!oe=IDVmbJaXhQ&}9G?-j?YV+~Z(iN)J{j2wdff&t(#?!IiEUwZ^T@${4T|QA z;BFO`r_vdldS)ob`b4rYvY!ScK+TdVs|Nf1 zGc~h0k8H6S&{M4qK3@*u;$t<<*0@l(#+Z$0>AKLS+-Ht`-@NaTF8IliiTVRGdE zozk(pff1z(&-ty+ox6NR9mb%JJc!fx;9cUCo}c^wQ*B3Ua|QAL;yv?dbQ9ii@6*v9eHAZhpv&p93)iDQY# zPgF0`$M#LHO-D3eiY#7;1=Pl=4VdIE-K&kr66?u78%XasGH`(By-zNHP)ZzLu?z)u z=-2qF>K4sQwO{AnD*i>AL}JZX0Zus;^NgW9n4rcdbKLh>-(p_$8#0pT8yofXk@gEjQ zv6rjlsuo9%f{aM$t!JUS5Q6&v3vL52V;Z6p%7ELGB>?tl7aik;&4Ana zQF`>*^6(8yZE2B%Zloqxs&-M4$8>k7Znh*+7KA}AnrA}xJ?9CcRysA}sB2#7p5%o~ydHR#+Vz&L8ZY;U7)^nE zX5(A|?(Q;b4^yNc@6MMswbPB&y3=;E#sA?+Ec{k}WAUzhB=OdUI!GHVu*0RN+faXe zDpmK196QApy+2ySCK~14{ikb}ldVQ=2MQwjt-GRoc0CZoFzP(9z*>W1qz9aSY>S`} zz*1rZh_hJtwA}#-PPKL-`&H6?jjFx>Ki3ew1dcAG@x2uW~ve^FGdLT+X#0Fa6+PluICW%TE{ijlkwVi}80tt+4? z09V$eGy>b-!04;=JCZ3PxYBg*;6yGy5)=dJR^B{ej@GJ8C9QD9$!$1|4iep^LpE)O z|ALVMu2aPc&QD4Q!a&NN681F`cDHR_kThum9OjZS)f4&FR}QjjMuF+K{OL-7tb_Wa zcVQ^Gdm~J@GfyzuRQlycfG)F0BV=}#yo&{wyd0_Q&s!NrT>GH zkNN#<02bkL%2om2Nj)2g-`3bN>uY|W(I&N~rQo8`w93gT?nz2zdsUx6;`NCSuWmcx z2i>fu<@>)4ZLTaP453YpMk=GX-W~fywQP&^asfF5zz3XkHc-gR^FF;%#xzsG14u+T z&VAy&%2uaLWN3M9RwE+nbk50aeNQB^hqhc=vFk5EBC0K`;XhQv=8pr5G6De@ylrlI zT`9jdX$Yyq=5n!>A!(Pae;eFTc;egYQ-@QvbIV~R5M+++Co-aW_;4H z*bW}$Nt$O)jxLuKQT9U&3G@lB8_ChOUx)ZW9wseN?N_%+X#6w=LS8G59Ch{SCHS=) z$GbGLqeD=t{G?Vv#s|C*E2ZKq?t8DbL`r}{B8|`PDlxHKmgPodCMNs!6t#_B2S;w7 z7nM77Ev(I$N>JJDXyOdQe6zqDm{%93K_aTYK|}Q&rPcJ;J1DdS^Mh54JEIwUn+8lm zROL~E#gCCq7we4||G_u9l!y>}UuDIobj>%^#Pb2GdIJr}Jdwsgd_QV3K~Ts>pL~HZ zyb&`r+wo0M{59ZI;)rrr@NmYio-!ji^k=?ZZkl=t+t(CKe4Cm-952pA%z*Yd$!Hk3 zZ+bS6+RC9^bJnm9FGzB+V|NkhK}>TF1D1$ zVGD*~95jzI$PD96ex}DL5qJ^O@PQy|i)@4W4g%(SJ{Sw@{A+d;a}KGc@IzJ?KN7kY ziM}jsJ3fa8YiL7G+y3EOeT5!t=t` z?lcSmk35=UpZH&R4_EOHHq6d$t~@i(R+TOTI=#|}ahLoq0bP@^dy;E+5JZ_7@pSUB z6JVk2Ad`zGMKb89If$ug6x-Y(;rmL)xBPi@!S;UT2FQt!*j7zL{sl{gXIBEABorrm%{-4Vw5KH?wb;}GJ#$#xCio%!NWwJsLXysS*{ zPCvj{mmkfi`gu=gu-o-dM(AMe!2$xcz|L{Zn*&E8Hs*YNf!!aHbK?%^LJ&fCS_F(W zmIk$5wRzgPb7z?d8_3_`K#zMUB@(a%x^Bh#=Ky2J9Lgbnc}k>cB>eWpWlGn9)>PsU z6Ej8m(kDU8M$`J9QijSwCsRAZ7H(*i7F&C-7FyJ0qpS!IQ(|` zGdKX+ndmsX*}PuM=Y{w;eyyq401~eFKB$fO1ds(*QV3aF340mZ@Qk$~b+-FkVbR!? zsos*_-pc)o8qvr{0&)!&eK89agSiUtAq`mla^#!D&K;~5=*_Ya#I&KdP!Q{z{QYgr z;*OZ1#r4^^UW+R9Dw~94I%K$|v_pN@s18(#=@-W+LxS-e{`uBHO+0!IFt6>Hv50okf7u8OP^Qz_@Grimf}r(+sHhIo*>5NW(W11e`>Lx|0v6C~XVtDEJIHFHEbw|9Xw8Wrvdq4dk3+D~*!oEhTf& zfNDb{AMgxCk(F!Zr`=t^urXbOAHFkU9B< zjsJ=gf5SIl$4G#}2MfS$?r_L5>QA32p_z5rpO|6D>EFpiYr7#K zUPCv!EluYDMfq7vz?b=x^=Wq=h9GO33*^=%V!CBljPx}O?1}Z;Vt3+lD4OLxke$Lg zck(0yCWOWXA!#7{L>)9iG0x#GZ~?391nYi&w}O5X)&`Y8m7^ZL>EtC|WKB(xk+tGy zTR-{OM`dg@>3ZajDX=cK`ZG0oS$GxkFa9ZrpvN`MyyleI+ZGSJ3#}zutF4YVx%NK# zb>{3i8yin9e$Qv|lLcgseGL6B{>sk)mU{w15ZYw(fZ57cPKua*J<;?f6@e$NKP&nZ z04EgX%l{oFBPf7{Al0ayMtbb1p8q;v|44=e=JqUhixtc;bb`(&C zNWIXUmg@f`8po61X>zgaiORh6xKA;ZG-)$(@N~RC&^7 z#k*4l$Wv%wdZh)?J`4C70>G`*NH{pp{?dvF3h;RL|qe9pn-&6@qP z9gQBtZR17_`av!@VM0P1J5bV&wG{Jj`@eq{y2i2ZXgcDui)VRHLC)k>czdGZjHC+jEMYw>4Y`F!tm{rZwnPAhPl=Ba}5 z25E*x&@_kRHaCO96@+3l+;@GPfX)g1Msm4S;9y*+Oi_MN)c!zGYy@C00RIvIP18%) zlSEa1F|5kgmvaHsfBoIwka_N%d^`lb16p{j^hv#I5*ax|g?VWg)_O%qXCP8vE+lB} zCc-yGDF&VXmTLR$s%^#Zlk%qh#*@=SXd|2kF8%DW2n&p+)1YDF$v!uzUWEZjZ=LM? z)Zhg26>OXp#<*(W6qUiIV`tm2v}5P5>5oXRG+EAC?1hPy z6lTPiwn|LMzX$-!GiNHyE8n;bc@Y%O$=j~;NST&)-tKid%R2S}Zh#&1hPK;}eO(7b z9Yd@bEyN;aqcm0kP!)1;;zAEbN8gep`-ENX9q`7blo z_hjc$U?(G~uTW%j{a(<#x=UHl8%a+0>&91h^SUS|RRT3gHhhq7U8bTOjW16Z8q*qy zH-32)sI(RTO`G0H?gD&$Ie^x#z1&M9Jc;cY$YYsA#O$%n+|X zi)aA~4xX_}k;0KQBV8owdr-zG;g(C(Rr(L(XCpW{8N6y-Uk2JSaM7{v z`$_te4)p-cLv&>;M_TgYcHaIYlOAcpj9Za4%e{;mS2L6(NkkI0JsTE73cg}`u-QXc z>J^408Y2t}gga?P8_tX!-VVcEt@hlUL0C<6iEZwt?5;Su0Zk9!th+ zAk)W$%_kKJsoj&$?M52?s3?C~x1e7Rv7oKz-FV^QQaOao{1RUhz?!GT<<}X>bB&5j zuI-dq1gjs6)Q@C3PR-{wjv}m+o_)dC_f6YE-D&Ibk0U&zlSbNC(2O@X+aBSMPK=v* z4T$(_C!j-1?t+fG3*TlP$nuLu!~UVZzV+~c{u`qoUo75NWztoZcCtA@_Ed+BlU2b3 zy|xW?bS)d1=RN4H=*FwP7WeXzh7Pf)0fO4z-`Z=#nC#xfDy=^N1Id|ILu|2)U{&d! zLdWy*Hsqw;n<%{_8RX)7inU}N#}UUB3Z7?EleU)3Ht76yE2@;jlA z0t-?aS2p*649Nb7T@%^@x+>HLvTyO#MNJoCdv zDX;=r>eaX2=mdGyRO>Jj?6j=&U=hZKnHzviG2vFocmTfj+aOHk*}UBCm#2r^&GR06 zY{*VRRh^B^_#ahYAds-7Vlx2d!Ui&)6N@u=%a}<$?dDCm2UuF3+#P<;! z(#e7bMRMhsWd$&%#RjqLESMNBb9A^p7<`mW`yygksVI+Jo;r&i>WO3Ht) zqO{sD$|)?EgF6yw=z6NIs;SURzo~z`Y{mF66G64My*_5IwX?zxv!6;q9sRrWuav%l zceaDD2^N!sPd<;0u(;nyF_USL4@Z>Xg-sO+78q#YJ4KT>%UiDg9|d^^6tuuklX@nH z)hV3o?yp9ceO9u?7{^jUKiRt<>iyWHRT%Ur|M>B&ASSwF@7LN|)I~c;p(|iR?WvOt zEHQ-;Ee{F0d6{a(@nI%g9zxSYjsg5K;)hgz#0?DN8`)TScq9g0%h9#Zbg&_(*$VwI zwnO8=znh?EZm($0fgAnlo6#ssQx<7A*iHuSZ0ooOKFdKv65(4)EI@m>sCFC2A}=xw z;t)ChF5M1ep~4&oMlm+#9P`T8usqYl;fOd|{rME%E5)&7nTXM&r3p;SfZnzBcsZ#| zha%_(Ar^>akBlQ_Ya7IRI@ZOMJ5U}Z=EBG2->&+@Hi%~mDoh3X$&N;LA^eSh47;wKLA?poJ7n%A`Ip-r7LMWml~%&-tdQ~b{cqU#(rHGjl?-U_ik{WkFkqJhZC?+4 zi^7=uC^}NGrE8j>b54CP!tt*B?m0+W%>9!>L+LgWM|jUr|2JihXje6z@_bVlS?CN2AoV4f6gizM2P zJ+a+Ks!=!}6qxE-o6jbMQ-0M;0iX8`&t9R|8FAXaDnb35(DaL?UQ2nxx@r9i=9$X8 zK9o)t4Kj`sjxR2Eyw42G_^?E$D41HuA%DhYA6hOI!ZOe)6y|h{Q3Xanh8C8_3x(lg zV35=uL%FGv&rCZIAfJ4Tm0p?TZ@ujSU`NiWDVg6fJe6`XK#?h$A4~9d5nXa8kYOiy z*zi0}Q(C)GaZj1dNN2D9L@bM$`ZAuJf>cwd4xDYshV^G>jd4c0EFA(p1`dv&{(KFD zP?t9`uM77S6L$^@d{6C${%!~0TtV?h%qr<)Z( zyJc6r0WC%PhwRC+w1kO%b@Zw{G*ViL>g|GfzU+rhu_zdpDyh8p@13N~I2k|m20 zQ8sDc_?8(ChKhuT^-NcBpj{~z#VD&&xPwcDc{4c*=X!Rfgx1G=*v{edVdYA9}{}aHtJJkEIS&( z+EX`~?NM7P$=@!h#re{Vw!aTZ9XKb1^g@p4mc`ZmIpfKr^i|~Sgd2|0|D#XjT!y*T;>upK{w#mWH7;E1WH37pO z&Q>Snn||2DJ+9rd5y{oby&DQ<&_G4FLHme_#?4dTdiSuJPl=v*_&+x~l_$WZpp5q@yK@9+PRBnA>z{5%nVAX)@wS0f&jz zQ}g&Dv>!lz0V%Uz6!kapZPm$p_5RQ=7!D^Xg`_lEMA3qlZc zko|bd2Rnw*tSdv{j$OVHg@6Ic4QzcZljPAGpqLPptiQ8OU!3JLV#2Nq?CmDSVc>WB zDF7t!$93l378(RucuZxQ^8(^=7nSlj4>zEzET)5r&I%uvy))|VX^KpQH4$80VNtH6 z>l2iKePw(aVQ>RDelN+{A`sEL(>~X|zy3fGB%bo9POdtCQn0e<+Fe1emT5EBuun;f z4*#}|d+SB*QlXGRKUF$?R9-56LUyER>$gV>GpGY1+?WuVT&poi9d-r}l*)IH@lcJ% z`#;`Ix%o@=(VMsts__v?M8!kJ7#TS~f=-D`5G?5x$YH}F66zNJhDudvBRvt-q^f{N zE6@dU(IZm~pEjf-JuoH9a#ktzS$M$+$6;6I(@+W(I(X$MwiWQm7-WSsmNw3X8DFZO zVz1aWs6AdZSyZBP2Bq5cIJcR8sx8jRcrGYb%Y#R@mJzdDqUm0NQmx${GqbdovBGO9 zaAD)0H#18uLcN05UodVTCqh#INg2*IW8*rx$Zye$16zYbjUL%9Un(D1PVlQL5H%1L z*5J+rf{)Lei@~lQ^cbz0l;VaAS)bY}#Of8WJuS6j`fPPjV#+>O*|ezIc^)%Zf$a`3 zJh4mn<_w)@CYB24$iXkERp4rarjQ-EW+X0QdGEut$c%3j+_ngUITxt%UbYh8IJB5k;Hh zZkjinR(M`^k9qcT)uS)uJ+NR=H3qsaXgX(Z`vzS&t8(Y@2l&^Et{~v`{>kI$pxR;m zz~mYZ>cMkcc*Ei7pUN-?S2Zcx`_`T$mO-;!f~9DJ4UW6*J#uWbk$DU_p4MiP44fbK z`x-utH5&oewzJ2efA@GHA5ZPRc4Qv(cjPA1p(n2=rkA|Y7T$Z~VGe5l9AZVPW>vzt zR^fKO6~&lXB1qc9k4T5GMw&vq82m~=1NHb}+<}&RCShCVV;}AJXb}00dfg_Ib>t_a zV{kjx2ReqF$JvUb_7Y!u+oh)Nx>8a`?;y;zhs^+WRiFvl!enfc6*?Cw4WGEh8O9?g z1PW?85er|^vmsv=nVaGK@9e1PM>xNvX5^DkVwrW)-Tt0yoP!EG*S6=#98mxiUbK0JCD#OLl?DWscBU16fi%KGdqQ}sefFZol=X1m9~4hjQ88j9{TH0Mgg`1E94cprg#M@R zrAz-j97>JKbpI=5T6WX4i9WC0?^tM6<0=8wM-wj!osm|xd-ZA}X1TQlwXBDj|MkTa z?5(>o1~(4kG5SWg3hTxtv!jK#q?w`o{O5VFe{C^JI6Hpxg6Kd)`MyTzanD))q%o=V zh5(;XTb8Mq-;k(bnB&sZz$h-x?ul7Olf&zZKn_iU@e3O{(_ctFR{JfXlOwJI=6jTC z?V(r;KqJ?3SEFn1XTQ0F&z;kfg(q>c1_3%v)e9kPXx{7aZx^~d>cX75D20h;cU1N- z=D;%##&PBz1kY_cS>G{d**SHpTsm@z`u#Zjif5`RKN!a*xL}so7ErXcn#e#5*E6+! zKf_@^Lcfpf;)QlbmB3HcGYsGuL}(b>fxD(lHc>(S@gz3?Ja@O~A1;*t3;v_q19*}vnO?%|g>Hzo{_~sHf z=Fl3&diVP2;LM+S5UBV>5Meaenkf}^a>SH&dX0_nWw%bc+Yy^~Ld~NuZ%eG=nOPC} zp-(!}fQuUEQaPY5;kjXl^w!(*J!EFO#@wB8psGJJtcwm6P?)03rdn!RlXg*rb;q*k z1)y^OB+<5ZOi^v=8;Q3yv&1+2b7~rl&cyQ<^_lrui;t zL1ox}9*omJRV{ph86gw~moBt}&_^8xkgSrJ#iN0(;#zymcwwNMaEc&LrpT=5K8TWk zrtGT9{HeO?ljXg4gvh2MHnKJsK&*{rDa6v^ATi$KwAu*pVk(?TA-jB5y&4+nt|tPWL4b|NCaTSN~-|>>$2oYxu`>A2~0L*0^BH zvNeRDLC2}Z`I1^YCLS8A@LvY%I8kUb_OWb=FJ*nDS7Jsi|4J@5p;dM--e9KUR$p>O z^?NZewMZ6_?V&4{n0h(3=1@?o5FQDxM+zGwZ7?&YWwBq*i4h@6xiNf|C(?>oR&4_v zoH`B+M~3#FIUU@EnY`-QduUVp-wx2)s2Hm{eZ~0{nx=s3;Gq5qN6D3h{O%RT9XTod z=(ic2mA&#k$Y(l5TM_LO8gkc(GwOg1CLkX&FTvebiwNwnuswk-G7nl9wv#Ib1ht=L zmiBhxJjLT;;e3jJTq??sLob~z+h5b{X)ktlGlXst*(3uRjRE?ALOhSnIC(od$g9~G zE!d*e15t^H4VqhZ?C-iR*SU~KwrS?bjti{Tn^h-OPXqjrNZ(?=kS+IMGlS}n;}Yr) z+~26bFDYW(6#ZV+Tum8ArWmtvUXjNB{vs&1UsO@ppjt_2Y_EGJ)H3)6Kq`+%s41pO zJ^xa zf)G@XN=Dee6Leh)2Y|nk2~eI@i|DiAkoK|GeW#5h#5uFgusCiL{O&l8W8wgqA(j!X zSgct@+w&K{Y07f08FNgp7;!Bk?h%>?rs}yIa<50Y_nt|+rtErN*4qj^ak$USNpD+t zklLLMXuSgRqLbbN?im28{>2@>$EhGP{qT>SA*Cj=0_nigpJSaazW6gQ=A~|g2qFP+ zcU=;ScSehdcj*4-haWFl39H2rUfoO#s*!7n@viUidBaJzspu5^$Rvi~{7*Ii&+X(v z|7Mj={Td^X*7Va^kiJ%DO~mCeR$<6ilg3cG4gaMu%NXAL^d5zH+JmK-#p=kHi9jy; zPcW6T%n>eshIEO0P2*yld<|JW>*x%P z#<5)w)=^#B#*J+q3NbQ32JDToPwfO2d4q0fK;N0jm)NHY=4(Vs=}dr3AeLaA2sGQA zHqP-U3FadjV8_%eLY+n(3-=Yd@LF)+ct;NYzV^S;3rLGK$`p#8qt3Evwra2`o>W)W z==7OZ7YOoUdN<26(#ch}a>neMW|lt@@1-*gs_&&!3jf+y`S{SiA^k$M6YYcH?7?0c z>mBRQZ*; z%VxN0z~&IuY$X3+9@Vw$xtQD&Kv+}172}-jx0=+-R+zCMf5bMS}No|HwOAlEgOxz@I$h?FiV2GnPsmrRB*qA*gSzJ3F8`5E3@=v)GvF>ujDg%CL@g`8zRN z#mWZ{s=T&S1F<~7tl1mmf$`kB+psAJZq^B6NfKwAkYRm2bhqsVQxUY>EsB8}yzEQm zP|`GfL(b8qrccB%baib-5N?GFjH4`3TxC$=R#Y$n238B}m&hJRnR+YH&V*f(YaG~1 zE#F|SdidUu#EC!~$!KsYB4-+#&oo&h+=^wMY*L>;hUK=f8G)PW*GK0dMtKB%tWCDY zqfV_JmEE*nEF@?~sozM=Fg^IXN71z{Z54pzOdFwVa`eow*Ip&9K>v@x7q6y)JV2;$ zC~|1cDIBkgNI*(`%0F|yZ^W=mmbctIVUcy=Twx7VWm9$$O$H2;2JLM3_kb$414pLz zsnEQW!L+?F=-zE0F=KUaTu7{0@$+hb)E7sVc>V6)$MjZcHSr?|L=p+fL?&@%LNq6s z+Z}srIp4oaNLuvb##B)7Wr zwvPdn-+5@YrxC;@pdgwRVkJrue9y^EckkC~0{=Jfe^ZcZLVCMF-1?b)}mpwHP&UuHHKq=rd*N+)jk38gh@eec^ zTpyZM-b6rqlu&VpTO7)sI99U5jWmf+z>t)^hQwH-u6#cS$uu@oe+3 zsxKMk9^XkZeO!PYE4<+Z2m{s!Y5uzuX$Y`TEaBs!?98UrSR-#^Y81B8^AI5VNdB3M zv{nPU((y;TKFbn>@(OOeH`u<5*hL!6#*&1^c%*!3^ z|JI;lZIEBHl!?og1R;1hCE8StLFRThNTaNJEb{=+5X}`34vg(d>I-@+qU|fyb}}og z{*GmdA_}3wU>o@8DwokDC~z|s^o0un%6Hmr>j*D!@K{#{j*+KzRI$}-l@Xqb^6OPX zzaS#(3gFCTPjls&DeK<;D`Kc2qEIF|ahVu}ZYTh1Djg{u-%tp!+8^~@8qA|_SA)MV z3YQCxG{v0C9m?xo^-B-b&t*o_;P|mMJSwBGYQtCF$T%!x{L(wpl)|Udjp9@*0M}=< zVQ{PCF}v-qXqg`#k2g3NbvxKM{((B-^<~|eTq0t?mtCtngB5iyTFXOig141?An&Bi zcknevisAifu^*C&lLimsud-#SZx6YH_)#3B!I5iMZvE>Hlz17iuM8R6m6#9qx4&s$ z=n&nucc_KW^K4z($Q`8Ahin#Mxu-<-9Y*eznj8VE=R6-3BW%+M$@Yu73lP641Bs*# zW~@tCwoCKhjRC&FyL4c}NoB)BCMfOG&7q+)WHC=*d;xWF$+|k$4~AmEy;o>#9h@$+ z`yGUj0*Rj}SSXB}!hhN!PIRpo5NZ}E;QF${*0ggND5$*K0w)f0TgHg?Rqh_pEURCrdJ5uO% zfuP`|!)-T;GP7W$-1|vX8~n@oJiyE2(iHSXYGa8Uj;neY2Mn4!=>HUGJzZoO9-txN#0^y3&>OBE1 zs8}l#;E#cRMPH?reKuP35_`SBwTlTqfx_eN&8`ujh*>PW=aQd9 zvl%+gn=ARZ>d&v0SBZ5ax6v4)R|9C%)E|H{862Bf?3cX;iBwOKf0<+CZCU}2Va zp9hhMvr~Y3iVAQA{3o|+4^@d>O4%k8-S2MV-ze*-1@MT{+Xpp)pew0u4O<>e#VY!2 z-IW)j8&Ah57jn{1k^lW@OEPO^o}6;-IflpUv#*DekUiXb0haHY62k>tz&I?|0Yf99 z9c`>QCG%;nOur*8rrHKk%Ecw_S5@JmL`x~3;>Io1_@|-!5c}lp_8v*`kBUR(H=~}x^S7{RJ7L$K<$AoiZzU&T zc1#nveZil83@;Owz@yHYTNYmu7lQBa9IE+#wce zvMp`3Nb0f*TWbdcK8pB(t}*wo1r64(q!3gT<3&--e>Awri-*TRMA0Aj8*N6J!=8@X zrG|bSSSbm?%z&Ve-CW>Lxyw`6t&2y|S-;_oO9F|MXm0xkJjF-W(~%W3=xe%GX+Pu+ zMro;W?^zgXH&X^pqSL{TZih(hyT+(DgUo8=ixKcrhuw2^WT#!xh6Bk$Oyz%4Q{ydk z^KnYWVki9=nV1uISPapalNRaC3B2b#vU^Q)m4*k+(*C?LnWevdKb(ZCtD}0Z3|-HJdv@Y~AStG+ z!IytKEgx&zWd=D4StiVh5LNjnIW6iXnZ6c?>Ed%jK4N@hwvFc$mq!niZb7+jB+-jL zEL00PgWU{v(%=iKA7mXt3n2nMqrfh6y-iXPUUmXgBLnUosDZyIN3t#1JJ<965rcnCu2tmkLT4Hkq zi1zfhe1JvT7O|FrUUd$%qMx0YSgT}A4F;zOi;zgJNHwu2n?-aCtdP`*8_=AC^PHcv z`Kz)rLO?M{l2Np+c3h}>L4ei_{Yx(wMg zrxqq$esJ%~r_CO1f&ntbA_W|)ejl{Bel)$P3r4zV+}%GaJ0Fzx^3w~OCAX!Y7`0Nc zQ3lE?j3H@@$%)_gjb3&gB3%q&lh)tl;Q2z5;CNJ#i0f)Wk0NgFCGnEc%40 z1I(iX+klF5+b`awD@`PgZamk51%f^WbRmLl4}u7={=>>I!3lPB;l9sp6$4!LUk{T^)B&|n*__*}j?|_y(Co^qM_qv#iAKC)~Fq+I7HxT5ny4fE6`FM)4(v z8*v_z&GUU;fiDYl2Ey{5`%t_sx}dc*iz}R0Mjp>FOI_o?L&^Q4u!e)j&OKMRX$8q| zUP)WgpPD|ge0tpYgx^%^+8uy0YSe?0>B;_%jjg`4^Lyb;r~d>+J|M6ZDzr( zW?YhtFwd&h^W_RBE~bI%{RBCNTH>XwFZ^4azaIW2!yWE!t&-puddT9iqQ5255|s1* zSFgCOmpzUUF20ET#G|H=i}2m;h!rz;7>v+HnMQFvybwG9g!O`9aARc-C-$)Bi+U{qz&AODETt^L9qf`R_j9`ye&XNiu* z<%f|Kw}hrSu*D{ZgX<}8l|h&QdVToofj-=?8{;=JP88^kQHv4$fR&wKi)1IXuiP#; zb`3*ps7RB#i0_I_R5As6?N{nkHrdsT{@=1}N_)tln@;ZvEW6XvDZQ}^A?g`Nzw~wJ ztosBoz+GQBp@+>(p!*VPF75!A+<~VqCf0m+2o6${;s8D| zR=`%?>5+6Zp0vR47<7agn?`!gJ=A zTXDb~I~Zsn5+Ni5ewHh>hEeyrpJyAL{EN@O73w>(Y;QxQtE)fZ5Cfi)f8(!>tZr0G zf?;qGIY^Cony#A`+`83utyQtH7pCf+xW@S%ujUSYJ2K52tB6~6GGym-l>uGlGGo%r zSXUQq6_e*9bdf4&g2+6a$g0BvziY5RjV~3`XI|3d!rmrSjYDghfy)sVf#d+_>!&;V zF**QufKcxiDsP->&Y8ATABC@tb~bW+C1c`<^%sZeIEvVUMJ5E?QL^m|qfOsw*rCx? zqD2nYwG$CYZog-^FsVRjiXAC4zAQmKkf@mC`rlSrRVb;Ahd15$ukioRQAb0FM5u5J z{nE(rACz)%FN{KU+Z5E(b6sKM20f&aJOwCG1_IRvH0~cEy9_V8i{>_EL8a3M`q-`h zl;--NOz>Ot>Lz#Yov;c%36WC9h{4}L_%~x8hk|Zm6GRh)L|3jiZ-_cG411`uCeb$3 zPTm1y4dAbH!m_Lctdp?Vp(EeSj=U3gG+;*N)=>LHHI%+G(Ww6%AkOJD%&7WtK_k#1 z!y%9_+imvul=R|o&=Hj-GB>$ar*280E&xFi;I&1`ngs^91szx!6$1V+P%gY z@Z{4Mg7;b84KVfVJevYJuTK(9qRgxMCxmS536|Cn^X-$u$Q4Vph1wTpjV3w_=($_Yk>$n@rCe3@vj6G%V9>(5-F)fX7>t1 zwT#Oqpth92r~Y5A@8SJ!ZKU-utg8L_Lpd`Rec2r2@`e!x{8A{U3y-(kx<6(VV>8j| zACnWoGGr60rE&`EeOwVf6$XEOk6Gau?p9#ktl|FY5)2HOlPuZb%Wyxh{B1#c9=k#A zyh5Bl>*t}oAht(3+)>C)^7+D)J6{ioE_pj-%YgpJDaFn~Mq7g1x@ajz2+lIq^)O z3U{?Rw|_wqBz;ejzfqxw5FsT|4EzscEVD>j&DUJX#C|Nzg}9eo_sH2xZU8HdAkD+5 zp~x{4oJ?Zp+P!bn)2#qZ5DPojB!06q!>yEDnJPyphLd^&Z0%2-3J@!Y;vMf`>Q8au z^Vch6oMz(fmx4}6o?a=+lNhtNBqjk48~awtOr>AV?M!o;ahsK~D_fB!Ln`ac%-si> zfCBcAK1bg|Qji6FD1Ex%D^J4IAJ|8;mQl}>uuF$RM5GuMQq6!(;^G3Fq$b4K?uDFDROj ze&`lK0S@Lx{OOi=mJ%n;q?^q1Q{7J_uM|U#-mh_=^O^W@58S|Aj<4V;{Z;esHH+!wb_AS4$CbcwBcyRM3&=s@8qta&t z6Y3Lgs$yXwkq~W;S;}Gx@OEvmVYMz7o-Cy{Ajz-0C9EH!B~HkKyW^ETc|D;qs}zyN5!HM1!G z^KQ3tN6ts)jf!kTVS441-v9p0jMFCP%^6+Ue+Sh!q9jE-LN9JkRYBc97=JQ6zDQSe zW3zqbrMmMY`*uY>I#9O!3hfPfw6K%~(TJa$Q&6qKZW3s~=`nN0m`l+?D@7Rmbj^l?Yq~&?VRx3r!-wdvK56MxHH*kb zD}2bfeM%;Y+4D60hAP zl{~Q#MQ=>icl1{k@TVWg5sVCv1+0NOl6F?+=$mzN*d0_Zk7h&kf$l$bX!k0)cY`aP z{018`wv^*~371Kd1fwNKUxpis{J>;}HjUF++~lDm@0XDC3{=$zK*s>;~D%6n*e!wH})-P|sE8yb2`L0VJc?W18(qsVkj zstzr`J$h2hcl$Md`<;bHdzl#bZrh$zxkCaV9FJ;{Esz+3vOpiKZ=DF{D}jL`U`$bKHXWB{jgVTl%U(ZK*=@x5 zBirmYY)0;Zu-WZ+VrA;`;Ae36kg%x`7mOlPOXXo&pDe0tAUncjFQ6lx9nu8+2Lh4P zS1ylfC2j4=IuN@ypOZ(h44&;j*I~;QwFraF-V(1e(B@V?qs?rKAw_&jhI#6#)URDt{WI$5(*-xS}ap%kU5V7_~ z`P=OYS8E=>6En!2PFfvLv^YmmdBNIAH#FQ_95KPz4nKwq4g=g7H^fQt#n+)QeGa?A zsQPw-G{+;=KdFZK!17c#GZ3Hg(Fm_{L+Q8EPdDCBBJ(kD3H%(6Z(ZGLW%N&W5O8&Z z;p|E}*#WGbHh={Yt>m+JO-z`9E`3zwy2NP}nS4y}lFd39Ec--X=!A*C)33YPc$*_ASr9kIV{_aQ<_NE+SGED#3V#!4>70-W{lykJX&ta=?{j+c6*k4$F7ZBS73KbM?rynESWcHeXZu%cZkD!n>-x^+GJoD5e^cXgQ9a3V@Vii5?M4c zyr3JP*JZNhUq-%%(kR#`@9Bmb{^D?Z8kjt8L4u&&9SBKOD@~}Ab4O1}>K5h7+%^s_ zr?}&HL?QCgHbM-f?J%#-!M!ZY^N z*yubqJNfHh*W{NzA*PpGEF5v3?y~zgoUq)?-Lu3>c0Clu@=0P~?5TrPvZeMW3Fq%7 zS%%_ujp}xpX+)O1;~%RR^=d-`L|OAq_^7A9@ZX65_<>7h^YA6gN-k|hnI*R&Wv=aq z(G&&Gj@GgaiOXWio->Xg;^p2FE>aBKV?Anr%f)WjXGoUQ)zrJ+4n*q%{NA^&Wn`+-!%$CbV(V6$6~~N;;tN1a<2*=#)~{#pS^O=}KP-hP`i?~MotuWsIg^8?c?Cg(w zEwcICQ`zO$72eF_%W@$_qAQ3VgEC3G44R@Ydzw=jd_o7K&gAfF;T!-b`R_!;fe4X> zYJhgUeEM0_qsAXUZ?de)WPl@c=T*$7dI!Na8*B_V1nXv>)fWENg}k!-Dhs^*cbRQK z$GHuDBa9RUx}9^<&oXVsHVawpPZ~}cJ|Hu8VE+eGFEj@KuQeZ8xerOl<_gPwwHc0* z#pP=G^!AsRGx|=C8B@j<%>sM`GjBi}%-mLfj;heh5S)Clk80|aR-k&r91Cj_N5d8(W97OB!OjdF%a2#4y}ys*ahAM5%AXZnX( zkk8KWQ(qJHv5I4J=`FLgRpl)g*x-xfI8srS>O#P#nRF7L zn)!~&`MA5OSZSSQF#cKyrw`X4N${+-Q`krVvwf}9zI<>95mTHVE)%2Tz#ARHwt~vY zK186p4UUx&EoqVm!5mt*6ga?^mnw>g)4xAQw*_X{Pih7E#F0pwZ85!fw;oItaB$(n z3MUEp9G}9XCH#Zol4}&EorNwYbP{<4t4(+m>TEnq9zzGpEV$}JuCWi2N0VpJ@fXN# zZPzHFcN^B}lefs-fV*nb0m?Vp^Bu;cL6FE-q$=z&r^T;y&alNwBKmGvcB=yJ1oHYX z=5WUB)-F3&t^?qMYb}T0Ng05l2F2Td2kmGwH2X}41?*=vze{El0_?1J5Z|B&Pf{Uw zMQ;6XKGuZfy`>rTABRR#2cL{<&IRs8;!BomL|U$36ZfuFmGvsnC%>kVAXM&O`G zBzSw{&hfatYYC%lJ{4piND zR8S{x*Ga||#4*ZE_V)?gT5 znO`V1mbPN_sc)U|ptB#v0SYh`7tJ!mBv=bJDn-;Vm?V}5kNIoA1*%B{F7zHL$ z#oe!KxxKtpF8>h3c|EG9Y)2kKJmKlwqSKrooe1SYQ|De$VN7JqIt3I%j@+L~Y96R+ z7x_?I{oUKgm+9{#qJ%4kj(#%PcPnVjovhS_#nl?kTQmtTu5VRMr#L{lK(x@yh^xA> z6$Q|;ldC^hK@`u47g@3hK@N`$LunwMqPMxFhc*uE54m=g6nX{VB!(f?M}Y;yaL=7% zfptJBk3Klwj-AWV$KnAJP8Li&Ar`SuHe9NbAQ-7YTFm49MVp#xJyI4npb7Wh&_PaQ{jEn|?JWsx1Qa3=*{Vc@Ez z$)UC~pc_8!QJL&2OK#8~8iAL2)s?t?Qfp`KUMN@E0speuAUD+m$wnoPLUk4#|MzD= zT-FDMsL6~XdoA6&FL>A;unqJh`IxSRwD6*I46o#JU9jeg`;&qHet7 zqCSqbFj=6CQnz=|?0}f{psD`l3{&_`HxOzn@OrEB6ofT5i)~`fEAOs=joa1?8z^v9 z+jt$s!LG-EEBU*-^clKo0}fgGxh&t!eGy5hayN^AKN8&OtvFK5hioCIF?|(B>Cf~r zeTz4nJ`*89K+V#2GO|rL$FXx?ox;N}r^b_aar~c21L}r?|1CZ1bj7?N#_r_M&g-{M zRXN4%k3(sURCu5BrptoJw2z)ic5j2iU!2{P3ISDZ%aq1O&?1x3@aCR=UvJQ+S%-~8 zoxmy-U^5S}lShXqIbb}GtdCv)NgUf=^-In~Ha2MT8_tp?`nKJ7->aZV9gm1^YDI{= zN!#X#2l*0;HAsiFO@Pt>o$C`Kt>!0=8Mg|@7$Rjyh`{o_!;4L0i`NzkMh(8E(6lEH zY++X)_vIbwv9uVpB-z(1O@x~rJa3W z0RA9LwTq(1p+K8UX78YWpH9h4lU3Ha6lkD?4NXcKtHbv*jv!lD)N_=BfxUJ|%3BAA zOmyzN{BAiUeJEaqVii(fgcF&{H>u3YoWY{#eSCqR2x)pY+7lZP(hU1^+^ zxJ=2Nu1l+Nkz~bfQYHux>c8&~iS9sIjx!}8 zx|QxK)ir5NWd(7r7-j_AaOmj0r^C(ZjNjwgs|#A9--^LE**yK`>_`r{>=+$HSP zSZQ^$c29RXq5(DV5m4=HGM#w?(xTEduQ-<7%OMVKO5cZ(WAkcEQUP(9T3N7znHBnk zbLHg4s?rx#GYPp`gnD^a8L7vl3kyRTW*fP~LTd8Kq+81(^pBUVf`~Wj1(QMfD8~cT zA-MPv+U@vnM_JAPxDO4%RZgJhTqDNUAK-Gb?+@;^qhE;6&-HX6!rTVMKN2je?I@t` z@3)Q>WnfwH6AC{{?RjNi-&)>UjL?`?EUDXh?4>adLYQd5L7!=>287|6tto5JK!Yf)t`v!2!*N zx3cnyUp}HNh)0+q)Fg@N?5^Nm)OW1m!RMFsT5;-6U5|p@X8<1*;Z3)YJ>m7DL^54& ztp51S6{rCWB7pc2hY&~{IbjWauU@8+;O(JY5+Pfp(q{)K^%@}_!TKpOR-xrfus#vb&(PQ@Cx&+>mQ5)_$#Ak>DldP} zEyw>Y+rhW^zMsz#&u{6EEe|h$I&BnCi)$SUd8P`(vmwVqS<4*sT=EurnnJ;{Gsj6= zAU}fQjunT@bq7k4rjIRmrx*4L_N!Ws#lxC^Tq{t7#D?r!=2i6<%G^aC-vH0nuoAL4 z6Wzq_PeZ+LUH`QTY^d65o*LPFh8NC87PzV}sw%m349OfEBs2HQj>Tw`GP%JS%pk?q zw|^v+{^Xknr9e7deGj~nhHzr4IM9y^7|Ir$U?b5~lP>f!&v?AQ3AS;84Yz+53E4U5daPh{hdAIV6{w-pHqHvuEuE7WnFk;F{*%)iecUW~r$3I}vCcH%dVEM~D zT<#K#!=4U{wD82A6Q2WX6%0}EQhtKjZlbmEb>a?_qbBKtUr$vPC^%({?_Wg%VrF%Q zj^E^m-;<#m16Tar5SiM|A$s6F(uB}1*q>pl-*Lj|J|gBiR+dAI!vc2&U1z7LOn1K4 zpzJ3D?HcGR^u2omINVXN#(i%$PFiEa2P6Is0+*DTc;0As6IY9 zorujv6@V~jFq~~NplY1#f9%B0-{9|ltPw6lQ9{bHb?w_-uGLp21X{LoEB2E%{=7gl zX0`N>zNAAfJ1|)>vK{5s!rmLlTxu=;ENC3$GFwOxESAHf;Ei<@4>(G)lH*MAK#Db> zn+QsvIrqU{(V+bQ;wx~XdZVfon(zz~O}1K_J6FI#&h5mXDiH?_O>k@RqzX$EP2B2@ zeddND@B@F(foM^bU*sv>hS^_s2p)a}^GD_1NHNR{QIIVXzLpK0P?4aA6^0mOf=l>N zl*L-ttflU!(N)tJ5;0=uDE_K?|;&7GeM6f z!FqTegbn%j_vAN8^qE7lK-@BUyk!Q$dago?pq)3M1v3xp_^!5`eMQ`E`Sr<_2co z%->>>DPe_SB&FcIE-B*3V;K%76Ksm_CK(wbWes>?D77BW_;$lhKi&6lk4L0i9Tn{g z#FmF-fooKECkb`(KNb7C$qV?Vf`pRywK1}sRXtRzS#-a4ok)W5MY{EnBkEwZq(Y!_ zy2*j%q;h#3qVo6ct1dGZ!%kXQ8&@BKY4yUo>sBfCpH(O)10NH^$d}aTna-$eQ9O;p zPciDPh-bC?3@4*K_F0uPoBe7cqI9YbUctaxUGVmw6#o8k2tlTI4)2 zRa9tDv<`BOs&&(Ic>A};=Q0(&Y#_|6#0etz1Z3u$vxqA!T?Ps9XTYtP96ZcTR6@2b!O}@dvp3_3Qn6(FzdSlRXypAe6^Kez)6WfLEB%yVF^ z+c2H9;_F|9U7{aQlj9d-zt{O0wnc{13OlUq5pBO7eIYh)c265fBRy><_{#Dm*lcRQ z7A*yjqB-6MKU!^o^wVleGkK1pW$+S*@w}@y-(hE)PCv^dT_@ zfa23HUVCL&dkBQB0&CCLKz*u;y%)nIJ`MNU3j5dNBm=Nu)7}4v)k&svSho=gk;Uiy zi*N-6SCi7K=^to-A55#cCG?T|RB`<#A`1pKg}T3U56FC3C1k7yBn!HebrgG46Y>po zIJkv&Xzd4|Z|&BvNw^s(KSen<5OC7`u9eY&?vc)!{FGLjF;6*+(8a9`x;An!_1N?2 zS991%i%1O1ialJGhRyWSH~pb~C1ZjC#$u5OB7N&nC(maoqXNT1S{ zvSm|kTt~wDS=YUIB_h5tA}5<*f1FI4XYS~iqw2d{-iEMKv*NQlOddPt01o&nBN*gf z_p#?zxdV9H-uh}m%|Q*qo~x8zm7C{`fP8NMyd6>QOwqGY5*O=V7l9y6f&yu(*`ZU(Bo-7MrMS#5GXS2fRK#k?ll}HXfJSEYS zl3L6%Zf%X0Cps98a2`M&lrj4s4{XU4FKdwzQgOLI6(aauAt+3(#G6UH$-2X$-H@bI zfl7!UBIbfaz{Pv;xFbNpp!wg;X_|9$;k0zG8oTGVQbIAeyu5t#v0}vwfq9jmXclt0 z;PG;jdc#?j#154Nz;yca`Q?)jxtJ8Y<|h4&p_9qJ zCtK&U5`!euXjX}z)!NUQk)o7V8P7B<0n+{}AEE$63lz{(c7D7QIkyt;Z7kFVX~mJdO88>X~ZBt#_rG7Tj#ur zGAXw^57vFZbbyMAoZc#yj8?jtQU`B^Hr}9Y&dXlr`Glmk}pu~bPsPweo-$)gu?aX{IY`ALz`ZH z4nS0_oU^#%m!IxO&dA`M>;d#dD<$Q9C=1#fwAD{-)^u-)aATJufy55J6o~2SrPo-p z9@dY=$K%ZQ!8yWfbZn0UEac@LBRe|hS%9=;hU6$?;k~(sf;DK|NU-Mc^0&SBrt)1HylNMFpdX!fm{CRA=)L-Gk71!Oc5lu!VN*_Ch(hUjUY#yDr zV#yuxjOlpX#QM+g+l3oP%px+7W>1m|cF5n{FZyV6K2$&CECO|9Q`%)j^}RweE#I4* z_5W~s*A&=%K7jhQ@sLF%O8`=MvZw>=b;79r%0qi@c9vvu8 z$ET2h{qgWgz<;W^nx}Yudmg~8R9+@-l_hTcs0xU)LCAyYgQbat2$e7#!8dn*fX0_} z9=Fn{c4B&kvcCQy^8vT*+f|(iQx5oQ#*zqfE)pB>8O~r9@)$sk^V9mzgL5<1!!wjoMNZe^Lrb> zOk}xXyV8OvrN3w!FaY?V(!4gu6(IB#p%Gr~f(8t9rUYz6vJ@3Sl{mGr9WMWKj2yuT zDkVAv71!zBhb z`gZw1z8kkcqJOo)z$X~#%t4SeQQaoVJzW^Xwuc+_@XQxTj>DRz7&fjE0g4-vfG7u2 z&^OCyK;8NuJ;3n7c9m_kdTL!#MQ#DViA}-RbqxD!g4eV}CDyr5 zqwY=Xd@zh2P*^y7B#{--C`YrBZRl z0(vALH+BdjjeOw&*uMRekaBkeV68%zjt4=7%?Gsah(>4~RvTgyPL`X7q@q2hm0|zC zqVB8ne}N0MM}OZ4mEJ|jtE;+C_9QVe6s*kw9a-mzOtSQ zv}+6^B0Nwy3t+Jg5KNR}`~kFlQPg$e0l$RXOK1F|CTF`H(6lNy?=D*Q)Q zDuN6!+A2!e5=EX;p5dAsfDm0?{V^mcGzEXud)KLrI>Q-KtbDa`*h^8$38LCwpV({; z{-xTL*}_3nml;myVnhS4OBXg)Z=mRtQy}B!m-RC%f~DTol1g?^nJwn#rf%M96oa!U zQJZbtQ?{N6EbRO?z%y-y>yWIhfGwbmrmYPcnGA%sfCyk&N>V8@M3ej=e!=;o^1?H) zROi@-Z2cS8&ybQ&vo`?nRy$PLQVyonu{&^VE1O~%Ukc{p$;N}v-%w5W>wP(B{pO_& zv&^gvAsYa<4Z&@63prZ#!VASqGTY*vhujy39&pcu#VpOq0#wNUEn2n=RT?!Za~dF- zg*u8^vfo*oRIx=QSFo##hD`f*tINInT&V4-awuOi_Q1&#AjsGNCDZc4J2*bCkJHeA znH)~OULbd`!vq7lRQte^uXEQmUR`)sWI|)vt#)w^rWN+THyq*Rw#LC8m$_Myawuz$ za|T*28=Fs;8N}i&zqF%ZKxC>}{xbKtQV+ejN^Av=H#*bZBmQb9$2@wuaDaicT| z|Dd`RcF8mp;utcC%c43)HWZbZgW^gizcm2-Ya1nUrHop`iLS{y=yQW%ULEr$MQE$= zVug1pNcZ`;;VuD9Nq_e9RsVS;Y>z(TJDo?U5yR-W0^^SW4Ga5P4N>-DL!2d#X*xv* z{(GPxcyAXXS2l>9z_f3hw=9c=Gec>&xyW~jGQ>~gQWh?#QWytOg?lm`<#DpFKeQv{ z0wYfT4H3uU0|nK+wS{C^MNov*ZyGJR#5u!0N<2Xwv~o%Ux;uWn&z-WZ15?AV=>gI( zk~Pf|;wjj=a~O6>SF5Ikayg|Vf*ve57?uxGvccfub{yC?>qx&j33glsx~lSuijHj3 zT?c1tc7nRyP?^i7GR#k?yJFF%`%Yaow`FD6Uy9X79BB2iAr~nUeGAersR>eNSK#WUZ*+5Ap_tW29jxH_AHj>S`R>NJhYg)y0l7UjznLbdCNS2Zh18mCK}_pmYBTEwYqjbZUH@U0 zNT7WB@r%}D708rRa01-a&`2R!aJS(|!IeI5a;qL=h=8LkPDBznOJ+JLruevUHu$Wz z9#6!t88GmstRsOa9=>&j4Jb#uOWEbhTi|ryZ6|Do*GyjDUI3Q}?_g_@r=L@BuR9Ej zWG?nIcKF`j$2>Tj$7A$Y;LvIv-xY;0_VN8CZI&FQFz?z?l9O3{hD3N{BQrZ{+=rS> zZEGc!85reT=)W@z1*0LV*R(c_OIWj7W?;@!YPBD5L8cvqls)ouW_5AI1|^EYw=_4r zn0~Cn>semJ;P!95$psHIs{sdA45Q~NtrP|O02J0rog^9v#=&S2zW*+)>vWKNg~QkL!5y^j*T(4BE7 z_YuIOX?Lb!+B|%^nGJmqw|b)H{Z1`l3`c+Z)|EaVM(D|&3#6wcy-PEZV;OaME)o#U z>Ue^UkdCCEhrCvf+6$X*on8#hH>ZhIVhazlPMHC#$|xEYsO7+|ULvA24dQRWPgoO_+q2fd89tLj2m3sb@amg~{CF?SET#VuCH0tj_BgwCwWV`J{# z*D}4&fFi(VmoB3gdM2%@r3_UPLM3_PSR*7^eQX+Fswv+`iH9{h z9!n1S|3m=MHIF<4(QwoV{uwn~I4FsYoO&(ewn*S#I+KPh7>Lr*c^83jepooqez||F zC*#^fl3ODh@(1jUa2Jr;lnl(L^28L`HRP3tPP+L^=?^)+`{x)zkQF(hB*`0Vt?ZpN zpWSI#B>?d+n%+ovvlvz=_-QbRh1X}HgtNhVygp)fHczE;vhJ4(Es3wMk-ms~EfV79 zat$a>lQ0Y?l+!~oRI51VL$;L()nH3YXZ*8;tr^n5!RlGiqw<&n5^rz{RcC+Ox9LAG zKmUdvkjoZ5r*I&qK?k}uud%l^WcFCat#e)qS{RDE;A8mMLa=u_)mObwjaW?{DlNwr z6W}k^RNy7vJ4uIS&cM3;wZRrI`$T{t?4wPTN$s{5+ififm!}X|l0I z+i0*m_@Y2?NGF8jl+FdChf+$< zb;KHvzJN+S2vfkOEesA^s9`pKbIFq-YU|EmhwEtD^XkvV+~FWwsFMHR)K_EGBy!2C z0&59G2+W%HnaQd#T|omwasMB|l`~%%T;%a|2OjD5W$-y0$f4-rb?8+XgXKR%KxAu_ zo9@ui?@58fo%@o2V6e_1)G4}mSSwV)of;_(x_HuOT8dKUK?GC72p!ZK{q&Tpk*i@2 zIEWer__trec}^&T#y9nPUq z@|pU+e&;pjE^!Z3s3aCFCYf}Mvoe=fNDvOes3?OGN>aF*E%-EvOA=rR+hoLcTMP7k zzRC;6)_PvPj#g~6dXf5G^CIMiqqlz-)gonS=mk_8ttAzRvMQ;Hm6CXksb;?`<(n(5(||Y3$I0~_Qc;+YfLS}d`cYRwyOZ%F>}8yB)uNke9xZUq@c)R zJlP*#4m3M^qN;fUhT=7q4B6%!p%{m$$3JH&+DtKI1)9|5zNERnn0ppIGR$F1nCMj6x z;J|WesX=h_4MZ%Y^2Y9bji+nX+M;NWY6*k4g`AMSGY)X3%m?}17WbLYziYwoMz{7+&oO+W?7p{1&Ovi#1v$C%o6erif#Olk4 z1;fQ_%|?y1@9AtT11>4hjB?*3Nz}xg3r}%NGlF$6_6yfu;^i-mkF?$ zS_xk{+V~&pW$WLjFkkArKaH z7`8TPL^{^gZTV8xU?{ixW;yX%Rn37!oQJ#Uq`*_-wDfPlbm(d$B90ELM_~`y{&$44R(IfsJ$YrTI?5KViLK& z1Kek5q2$wp22VrY%x@;@C`LwENb?LV?V4GG7TZoNvud|xmkS&FBNJy3Qfn)pu9^rx zD~h8o+s(G)tYC4G)#g2b75BE25H5UgN7E2?1|A@puj|3DRid?VGfzr;fer`E^Eb;yhBX*o9>Cks4G>O0bK*@P$wkuV74 z3q$J(OzyxBlXg99T->WJDLFY3Je;;*o8{1k6FZ8xO`A1l-|eK-XT-bFsFD#wy8?61 z-5gb%JGas+>@&AxJPpZzS1`=RaKD#NzoQkdOYKhjxKieLRz>OdH%r}pH|88^8?0qw z6fHk_IW+Z(Khjk4Jbak_-s?KSYF$;r0iz9K4of4epw`CwS~@rMG9wCIyO35sWt`Z} zRe|CaYw*5WJ_zpPa=SIH>s1$N5lAquGMrHzn6tOXI_)J4I;UnM0po>Q?I@!nNgMx~ z71!=N?a^Ch!w1C9x$GBprfpMs>p~)YB)No}a6#Y?BV$w7W9sS38}SL$)aA6~(d(88 z{7<(+EXD$LkRFezFpreK8imuXx6X&8g{w6KFG$TdcJjjJ{zCGsI!f!iPY8d1o5%f$ zGnm-Ifze&dJj=0-OtC8JYCr=t@eN8cpx`m{2SKdz^t8`TyP)lvitA~sYzz?XMY-WU z*aHcM)xB8t1%7-KZ5ZiN}DLGd|R24tLrU>>yzkm?P*^vz^uo`Ac+cl z4Bf24I*p#A3&@M>!9j%U2K*twv4+i0O|nWFP5G7w!t@gG&;`!i^oGC4Xz?bTfvJM%4bcbkm$cH(%q5ha-6VS2D{szCet zPn&?tX-xYIpRp(nAzSHf#(tE=SSafD2E`1>FjJg0t3v=hvc8G2#PD3$VUpjrgDUY5 zRkAy5ZE(4&?8T==Al!3ZJ8gpW`8!1u%LS)X2LgzErEOYeQ^W+)C8~nQp zz}i0cI3?$XB6rDQ%7A86MALI|7#Gfr9^TvKc6K+loZPdHqtxbm4-XO3Ok#|+SxB@? z5Q;!Jf6;l zx`N(20n(&1``ECMY!P;ghDYUj}hw1jJy3Tj@ZcbrwS8 zCv}St%?=rn;8?IC`b3Ff@}{E-6B$wWyCAk@-T5Ld^~;I{%@C=)Simx^-LCvCzX#{A z>KR|ia6*Pdk_F-u<>2V0XKyb{1g`O@ivi>+oNWYQHP65F25$575|}gjM&*)Wvjdjj zxP&2m6AbhS^7u>ry-VSPWxa(MUP~f_53xYKgBfmNI9p=%T*D}Xd^VttaSAQ9k@BJA z5mXTgy`T_#e9bns#x5}%oAp+g_~|P-SBz6!2Iwg zmg-Tih9dY_=oj0`AP9{I1W1Vt_py4o);biktrR`akGDV;bS}Wl5D!|-t2YH1`C-bm zP14fNZoZ%*OTJXXMY5vHgor4{-V*Yh6wo|Yuw`2STV%tb!uT7ArB>FPG=wkCB%OQ% zY7a3p3xCEx*6$et{5&esT`>nfG>2oY^a*Oo@gyA&G*mZ}(q+u_NiSrRdIT3(V5RG* z-URaP+#oYe-yry%;*Eq(w;q(Xb7hw=7OR^--%dadTC}^g6I`@N$Nj?5^5z;?oLLU% zr<1*52Lri@>wCr|7w8fV?jK=f>nsDyC|{R~Yu$rb8;j0NFhq>d@lPp$dJxAWWbIZryGgFOWG6wGLdYai=JazHaE-65c^ zHjNwz^HN7k)h>wECQvYng2sf5pQiV=w)~7Nk#&1kRH{9QsR|~1ob5np#4YvTAf#16 zs=~k>=$&0x(I}L?x8NyuLSav6k_oSifW~6>wDA~zdmsS!;DF4-oM8Ece1wbs39WjN z#lujaW2Z&hHfGth>@$VZGfDpJp#HvxW09z3Yb<>R07kxGhQ22jXfagkxE9S!Dm|}Z zFz;e*E}+)$?Qr@YP~SaPjQ*sxS=~AV3^Yl&UmS3!JO@+{6~}G6`B~h>R!YA&0va^3 z73ijn7eSdRMPfeM+N?uK8PaRoWFku~%L(!Y-Au)~HGlB?Ss;PBB#=)_{W~DzTBs|D zfsb8cjpb7(a|nYr$-o>@hm-&WO=r+M>z9O$)tBN!Wyw1n8K?~OV-g|LOCn02>o4gj zQ21JwB3-;!{--{f)ESeb2~UwHW*GtrfmzPrM47)Z&o92_-h+NexX67`=9WYf+?s0~IgocZ^7w=f?_M@xpdNF% zT(x%=^ga)w6^LgCXe!?z@NkLj`fs1-4<8C2*n-5guzlVTLWZMg6TM!H^?dAzm{tUl zD}^FM@9UoWTt~>Z#R9;x_5H=cAzj78PG$A(T<$s2wPw(skukx_b^2+;WFRk^UcBUe zj?S2t7X>wx9a$Y7gguiFXe(s>Z^#f6&}RCj($S<&+0!|kvd>TFLd^|erC|Jr8mg)e zKu^!s{q$_+&B?#=bfb<2bwy-k->d)N(xup_mP^e0ri}#l?n+C5qUkoTBz?Fz9ED_c z?K0w}8z(Ge6rjJibdI;9;moX2<0SvYBTdh&0|57Jh}`}nL=#}BJmNIOjKFbs6kM$i#$Yw60drrrNI`h}KA%))a>P1M zbHsm}W6#_0ge{yRpGJjG(@qVUxG^fH!dEh|wwYQAM2WQ>kWU4={2d&~pU;<6s}EK_ z$q@A5r0*q;t+lX3xbsjB=ypbl-G-*v6Zrnd=bMOgvW#si#eL=jO0G5bs~?qK7tf6C zrI^Bu;M5h7f8goY!*+)TvL#IwqQNkYRtUgi+J|zlYEEXA$1(+^a!xd1ih{)%$Fnt3 zp=Q7?a@8^!@WuJp(GGumj037$zeRjsa!`pj4m zxhIMNd2kGA)2+DuC?U*w^{+mz@?UpF%m_+L!mc9VoL%3e6`o z<7uEOB*bpf*Bvawr+`L2ov(e@fpFhkQw7@L@p4%&F4UT=C#AR4xhl;Y2cXBK4R8$u z2};aMQ6T+JZEvsQi|KAg;Q`jIBC5$;HdK71sp7}v6##KIT}70qC^S(3>8WI z!jwXlFbc9uY`II-r9N&Mx8KV*$9>!G@^xEW1VU5^1LYY`m>|gDfoa+*t^I-IUm%z< zh;}Sw?e|P-%Rro#5Zz{gb`gGVAH2t8;!Iv?e;9D0ix0*@D$rLf?ekjKTgWt!0v77L zNfRmNvxJ|_J4CT|sPduZgCnLfPn;5Rp|EjqAzNW-DDciw##RorznG!z#&VKGw~E_G z1AMUb8fx9?27X$~+z`N4fC#lTTHi{8UZ=LnzUTD(XHn?4qKDpqHLj3v`=zKPv-r3` z{3chj&~wkLWE~L3fOyo;y;uJ)?C1QZ3_oWq@{h9ZNoou9(s<@Nb0W^;cOqjNv->VO35+ao7O`3Qay6?whmVaIOG{72 zwFCoj7zXvd9e^+4o_; zmBGh*^dm6s4!IG%Ky#5KJ(wj68gI$X$?t3urH&1a`PmD7p{ z%yWUqxoTd(IJs~;$74^yfL}SJLg`4xuVZTQG!l$#fGGI0&41`#VFzwVG0cvqlHlSy zA9V$Fpt%K2LrR$?|HcnCV~rZR!P1x^Dc8p^l)*a4H*8f|gx2SCPpY*;<- zo&6ti^UoKiq9AUzinN~oIrdW?>*+x^4Zk5A3wn>A3MnBlg<-fCzow|1gvDTTYtiQ~ zDDLnienA&PqY;~}9hl^4O?%klQk>o6Kb!mj0(fbjF2GX9eJCmipVQz+I>= zjRx2yQEjQ2guvIxbS~R|RN+2+qt#dNB-jiQqLc#r{!z&d)K`+d!mcNiJC8mXu~DU( zjtT|{>sW(gC8?b05h{fZaer_1cX8a42XJ$;HWp|UYHw9Bj@UtQrN09w$G}{*9nJSL z=Y-o?wd**J5smOU3I|{(#nT)SCa>UVW%;o}R1~^VD~jdW0>kG&vU38GxTwh05_1K&+PC|M zN1GOXYoOR;8BuD1U|ZP#uai(TVl z7oAJ!rn#7~Av%%Ngn_zolwWTCJ${p2;u&)~A!hMh!I?^bV=Ry59nOioaDvphEVV4KF0 zQQCePyfGx%vx4QMR$AbO>Q{!B_8$6~UGf_DIu%tie@tIV1RlBZrA+`aK+eB$Z0ZmD z)s1v`-CdEf9RBpBo!<(#V8|!_y==SK5|(K2uTjBQW-Y8I7@w zu^d9&2q=J83tMLY9In*)pDD-$9)%`f)4;9Nbk><>{V~fy{k<#MEu|6wXd2`$ z6&NLt@t6Y$`t3Q=s$v49OU&=rLA+tDf!d678AF#XsHW$Q1&tZqC=N&eEaLgaFA}UK zD;pnWK*rM@rPg>eO7rR@^Sy~A5aTMmUq5;RNtag2l(Zb%O3+|_D7}UxKI(z+!T(d| zZOW1|ejE12&bTw>CK!KcJ5g|Lhk)Lt)z^XvAu^BYuz*M34wpqU-B$f6sAFngqkRBa zG{#%bL^tE{h)TvGqZoN(DJMdlxz}XNqUqDIkN&&d2hG)f6Bv4UMK1b=Xyf!_%LlG? zRW22es+~x>j;24__z?P~2-lWu$N4*ZlyW>#dLxhZIGsQ?*k3Qs;kX44us7BrM`l<# zdP|J1u^%Ta!hAV(FfC{9?zPJk)&wfCoGtRgNF9`PN5t2WbZtHY z6MiESH9bVo%9>ph%1$4+`xCZxM9G8itRhV!{^LZwFRr^yqhiLigi4?A&rzh zip?f#NU5-L1misLuRqRJ&;C35LnfJPTQR`U%f1p~d_m&)KhAH?ZilqmyQveat9$T$ zq}|$uE1IAo46~=L7VeVX!s1uOcXWaqkgG8*k&e~ivj>e6(@a&VOeAW>=K9jhV_=LBc+kL?Iw@i|)`0RSKR$NpN-H}Z#{j0NrxNI*aNCfCAjo0I;z$v6 z6t+Ts)3sO&z}?NKp^|c7P|jqOdOh83e5L!Javu0VUDPomR*tcj>Sgft>N7ySLUbLV zV`9G{-itG#CQ(Ny7&T9Zg~RjCF;F14htMLu0rE$YO~&wtP0JvhSH8qiCvm(@Ln}gI z!MEj~&D}yBeo2|Plmm=_)GV5f%o7%wL4EJaaqxyFk$uC4%R-Ess`P6`voW18)6Im(?k%{jY zYB)*9$L@uZ`6bvz+v?!eL*FCsZt+6LAT+^wDJ@3Jx+sGV?fls+@B=lBZKEEbnulHw z1yuKG>kM3zHO`E;)zIo~`nNkOO=W<4IFl8Zi^zHTqdvVbeC&AKKRb3i48(%^36w^0 zGQ4{Ssnd9$#nG0JXsyc5);CKi7>$%Tu>8bjT;H$?;f_C6YFHC3Y&HrA&LW8Jcj9+L zeB}x0;qJ&-wlyy8JNUSYHa-H8pZD*S|LASU7JGrQjM5hp8_GH8;JkW3T9gtQy{4DU zd!RvI0Sn{18X{dcyiM;Heh}d=y_r_LcV_9W?cc$bs;El+EL-o1LlVg8M%IMtzI?yF zLE#}irM5NxoaKHQ{D3*oPn1aq`0gIsx~)p;(>|Z6cm3Q&MO}jh}osl zlSFv6lc3nE$KPr1g`Zg5Tqn&>etx4Ijj3xD8(9>B^wa)}$BieM(sM{Q^svZx+9G*1C zs7GJxbWv0O)g`2Fs062VLu8(2fB1JT6}?a%gS80k3%pkL9T8MO$od%iBu_|l zfb0M*_sGK=Z>#OG04-v^p0~oR_~dRch?5M#%gaz4?`1pUw!SfM|IY?D@I#&>Ivtp( znkq`3yEB3*9})9ajxM=)?*Iiw#EUb!UZ~{=Of#b1kkNgaJ913wL;Dj%QTjS0(s;+t5=vK zvj9~-rD#tMS^(0g-`rE-qIL()Er@14Bs*|(7XZu>!TdW6JG;|=Alo?5!OR+Nu#KPV zJp6_H5zW6E%v~zvqF$P{>?Bbn8Ms*O2Cc^3Qus^aatv4g_2rML_5mRXy+Ty%b^*i# z=h>>VP>6-9#VZX|k#@LhLLgt?<_wl`A*q`2B^~-IFZW1cOr6dVeGveKm*P-|bm0#> zYvV+=(pf=V+Ca7;b3>4q__bmB@VCp;BmXih;7G&@!!d?PdE#g7a=+v`HGC3Uo!3{S$Uk6!8fokugw_;xE)XR$)77%Lqpc7ok2(Hk^xfi&>bXRDn zoivW5Ts!o7qEQGONcy0)z(cPZ&Dj#c}6t-0I;zlyeH zj$;vRTKA7v^y3Qt%WiST;XSi%G> zMk$9pIhgBJedRa57KBhk3_QdckHX@I?Voq)Jhj#XfRG?`f@#WF1Odk!e`bvRTLfc0TSl&cm7!%SJ4no*yY*`)X zv9TvJ z1nslqDXVR1{g9yqSD63S2E|wZ2`or-R@r;sM#1q~LB|fa*EopFzGOG!X33cUm(C@i z&EmHr7}b~ink}G+{HCSf=D7!o(@R}<1{%F9s2Qa}Zogl;d_j?O<%diHW|{>V!n7MO zw(u&dp^s8nwRNVw2l3PXaJbMUBnvwzg`t@8&VUk2G4K&h?It?tjLhOIsJe}|Q39(= z7f`D*Mz#*x)fiAl_5?Yb9rjQD6cUKJ6e$yGp4#HKTa5FZAG;zAd3yrnVWuPMgRdYg zFXIQRc^qR&>AAoeYk zBSONutLOJfony;jgWu;-UImutjuK$OFfvQqPOki(=N}OVV>3uPe-t1+2vD@sR>0QA zzCrv}dfKG=kKlOC+$_VZ-oooV=ri)7~2{mFKfxTvlJsX^7G!J-#>k&DGWDQ&YuckWhDabTlXlen!&C#j>)vL9ng zwoi!<-x%za8pC8(Ml3%}Mk|iaphbeAj`Us95@?tSZ%pW(gO+N<%;E6ewKegifY08k z#A;12Iqnjo0NLX_N{W{d0xo@d$1He%XY(@OqfI_Jj>AULOIIv7U_-y1L z>_E5}v0`}^DBIPCzJfXj8W4IzbBPes9ATsJ zOD^P-mPkbT$QMN(b)<4>x1G*+a>SBs&K)ge01j{j0s=HHu+)jPVSU1TfdxY7H+w!3 zVntBwYNKP^qS=|BfK{)DJyXDYlUWACxEr1;`);hP%bTFhuGjdAx$fE(>!J3;lx?aa za-oW|=?RU}==6kvpvbdw&ali7vxHL(5;{4)Tu5`3e**UuE0P34`%UR)sZ=bvjmI~D z;o#yuK;G5BDxrw>w8M|KY{aOCSFAgHdWjFPi9Hnj-VguXVEb{jsx#t2vieXzJc@W5 zx`4=3*c6l5n-=l(J#D%c^vPs20eD;jtc@j4b=ymecg`u^kQ|}l({Bz**0Gc#0reC> zINJq`RQ|#NVh)lqBkxItG$uva=D37T$id_5BJWbCvn~@dz6Wr?2IUb7D zN7#_c7p#%ufpRw;WVcZ@iwt3WuC&i;JQq1NZcqC{lkW;L$|`}6+}18eLExE=Lu{C1 z8>C`)7EfOZ5ExTpAe-|{t`bA~yxx-tbV7?L?>hqAJ402q>D~H_y&tPlxSBI4K?w(K ztXz6ftHDqB5;eK|_OjaPO@s*;AXEJ}{+s5-~04^%!IsSaU5 zg9cEcrM+lDG#U4Q;<*Xj481iMEI`Z&{RdXLU&y{mHS$GXc=>KY86{}FVUH4-G7^wi z$e_Fbdk^}70*O^9_7<70{ER`q0YF(Tdon3y$jSKe16QiiwbkQJw=H1G_K8ua)U51f zk-KfYF-uDyDw_&eR>lcjRxCEz-m1sqvE`=CJZ&Fg;rsZ;G{6q|B-+ca+m5b7{|>XX z8&0s9nNc{z;)mhRsX~bY9cj;lil6hw88h6%o<|j>TfH3poNBZkCC4XImo*~X09F9J z`gUL;;^M1RIy-6lRm7^()@bK}G{Z97EG4wM`JR(Z{>h7AsrP)1`f2+gkIq%^W2w+I z5(roo4-JyhvPB3{JN(>`*b`rCsc~0o`rIRMLQ(mF*#o3LaDnnW%FQCotHnCF^yAgy zM2ne@bz3{miypAdPAYkuB>aDf48<9H?%r|YMrMQ=gCRtR0;0puAOaCiZ+i;1sUUk` ztac|4jz&svMb4LAl@(K zTnp3&@DIwpT8ap9%P|}^Ap^o?d#&jS;Q^1bTj_}C_%P6CW#a7tKIq=*2I^B(@K_pI z(~jEnt%v71W$`>a?+9q`Fgp{7I)(Rc@Q$9V5-a)phm1$Z@P-GQ_C{`hUTtQvngK0s=e1eF$`Q`nGvMw?<*g5FnF_)t{ z;Ai>szr9DEW>3}iL;T1(zFLfD;s^$NxM!T?VSQf5DK}o1@KyzGOt6^AAj$X{ekRZQ z)iYr84*_wjn2`0w_UilQQV^@&#T-~!CE<_x7}HKC&6YJyEq@f?$5Kgv-T@gH5wvS| zNz?3y5>J0V7AZ4^2l8&F$)N#8U|SP*kfqyp3^9=9!*8>bJE5kk*a8n!4TMI+ znI-yGnQuZLD+X}vTvv+QG}wCwk8y1z|L@mW9UX(WBV>BSuD(t>_#-=~hT_g5Z)SzeQMsM}zwt6D1n3#0=MHIA-cTOI%$g2mMzmeIP@zzu-CS zROYD_d<1UY2zQlp?1l$m26ohswS}5g@X-8~9s3e~Z3Lv<<0mdbu0>>@;+RcdplG+! z#HTi!*L9}^XS23NH#i+h{yE2$ZbEQIqsos)9N)tuA8t+VIJ39<>QbGRQg1$a{m-{R zBf&Sqa|=B$pvkHE%d*11BMb~d@EOk~FJw)U6Qir`|1(~n;={H}LKz3nDhz)N{0GSl zwUZ^AVBbe<6O@T8R3H7`Y%`2f>Q`)1izm&#g1SlK>EB?Ip(>+Yo17` zo>?2W1<;b>4}l9t5>*dK4Z6EFzE)HdF+=WcEz5-ycWd_)v$$c$u|Rp?pCz`{^i#La zsepvYs{VzznUiZyFH#5`sK8qZZU5v{BTL~yb23-K9bcIsb)R3KE_gV_m=M0z2ra#Q zCP_5Qp10W8mFmnO&JAackT@TyFj9XM>Y!}OZdUC=&j39Z{jC1YfR8Q#mg0CvT8@FG zCo-&hG1h7Sc^Rgx4@T%ym=-sR>b*EuiehqI^e>xkoQJ5e+soTP9|}(Fy93f#SPbai z8>G_LAY{tIdNGUY_I@)evP&8mO18C!cXq%_B}0EjP%GAv9xcEK2?+6?pBW^a6hsl5 zM#RkgV(vLiK}QWKE3Jsrj}zEcWC=)Dkh~9?$ZMkLzMRgD!Oxu9HwO0KH(q%|e)n9u zE;)f2&QbYSIMnXI$DxRFEY@?G-W^e5heF{I0IwSSOubC_y`Fl_ZBoY0kBf}P-0;bg zKL36s{lRs5B2Dj8A#uX^cb7BmYnt_RiP>hq9v?XiExi(fkImHCU=A;*o@#F~w>t8b zhCm^+DbhbtNzs5?fk4X-DqLQ!q7N#+>I4X$3e2z`Re|XOu^OfG@Ar-C5!4c{EyFxW zbt(aq!QLxtmw$@Q@EBkI4{P3pihOs14{NY~m};-dTHl*IQ?r0O>Gk3jns8B4TWdo! zRWq+ zA)Cw!=(oON5w85yYh&CDxR+f%fx5f^n;iKB@~-pX0qT?KGYVDQp|lB|?ajJ6zo{gl z0Xn3G=W(%qDuaMQ0*&9Jc%Ce2F$G{6=JaL+Y4zO&+SYw8nrNS3Pnv)g2EZwogYq9o)zJAxL_PFqBu)|^r1k_%-9{d&|yP!BgdQLQ^GzJ9EIQgnHX zLW2n6_>N1%{$DB&bqLJXR%iGr(?kX@-qnS-?0(lTC!HJM{AaiJHnci%BWS(>5Dah*oXPKrW-g`F_Q8b;aL=4gq^*C%!n-ca&X14anMW$V$-` z;G7HlQ#dP7j3t&mLQ&QLa~wxIao_96c!&PPTNg(WWQT+u zTN(txF~@ZyRHzQcg#H&0PFv{jaPrSlW|AcygfK$rJkV3577VuTw)w5cDt%wOTkhgA`jqC2VG2LulUgEED2o-w&_&41v?@%o-YxcAZ=oup%s zgM}Gd_q-8w;bR?SO3#L<$KpmHuDdq0r1KoytlhZL?^-(kQVYT~exhTc{Va~{E>&0Q z=ZQYXh8)RepUYE_w6j@eafTA78lJyLpYN7e#gjFR6}FYP76-$-T0Fc4bGB29@V{Cw zjTo)f(RFI&`1E!NEU|G3dIy6EIqU0rjj4W#{oKp5eoS&ymFwOKl!}I<34M(}fv$K| z9w zzdLg)SHbCKYRS06V692Tyd%jY7pY04pSx+DsM#p-gVwT#LE)Yo7{VX76*4fEE;S5P zo{%wSwJ;Rj$cQ3O>{CWjHn-SaGjLvz){V)Jtrr1I*WkBMRh`!Z_-* zda_s`dGRWjLA=6m9Kyk@Cz;(@)GGA9m6lDWT64~%*Dt|H)?&kM?&8}*HpPDp3vuGC zXc>xUXXMLy7JZXk=4y0mRVWs)|54jF`B`zt&D@7~v#8c=@p?O)B!I&uU|_?)0fOZS z>ysh^CiYeB{h3J}s&BkXT5lW>`%^$q_lQHRQpX|fsrdCwh%pm?Bw+-ZJCTSDoAnuu z2T^~!_K7?(_PCV?3Tu>S`A|?SXce$0Y_oeo$4EvhW0WENS zk+64dniBr7D{wzGbvq>RCU(o{6f8R1_HG&H@VM?E|1Wm`@tnq+YI|-7Rhg@jly7ji zH?oV*n#+JT7PCpDPf@!IZLjTIbI{RcgcRz$4F3{e1{Qtnaz95_FR)2bDer+X+pfSr zl4~k=+7>@JU3n3Dck+7p)(PAs*;=f1UiGw%RJ%DccDvU2WhV4PGJ4mHWJ!)TZ%Kp`Ov9Vjv>udxR!DN7O6jsy7mN-CKc7Q zg*Kiz&hNSHt|_q;ia&y)n`52A6rLC58!Y+HCxzj(%25=2Lpk@meI` zg)o(be?RPx=ATs(-l-|4;>|!s0DnY^Mwn?q()>Y?%;ih{ZIgs#&KP?) zKzT?-ncSjD;RTC-?jgxbk))2K1iI>4w;@*{PL4PV|6Inr$C{dJ(0-`%fKA5)15Om0 zyTQa{q_lX0qvS@%9)d&&oSz@+m}DD_kz0;|K0|30Fl5n=-Wlf&=W#WcA#0SxRdHeu z+a$_~WdtP48R!rcgc-Adzx>%$0Y%;Vb$@=wB7yo_ znzaYFSl`&sRF9c5haxbH1=v9sJu9kxg)3d3BPScuIV@7e4pEgOUQ*HbOp~D7GSD)Tj_dI>JuYRP>x(O7Wk8L#e9pP z2&Z;dbG#j|OFZ^pkA%MRuEl-=d#49{Yv|+&{u|3WkT(C*$pAVCc+<9Q&CX5 zf7z1z>|H1r2g+lB?NYZ(k8pZutD}xF(CP zp6%B@n7nJvPa*`*)8In)<<69hx@2v8g`r)L03v3kxJ=N*X8(4$H@e&3c4Bba5xKbf z&3F`%c5avJIdcKyZ4?tZfzvY@%4pW&m^$`h94KW63GpEW5)A=)p?cq$AAn5&`icMW z4ax=D8bc!Umg>i^Ra6~}6atg798?u^hMKE{H9u^klzXj&DU`eh7@_cqpTW)9fU-c0 z(*Y_iXPgzv^o=S4(%>Hm$Ov( z%Ge~DL`NmRzCKpqsLOZLb01ilUs=9+i*0Mq@{#0~QnpWkXAA+B zUY<^GdgU})t`@%d+?XOAOhGHE3P(}lw~5}j^SecfX}7kVK$wa>M8dC$kn&l0Sg@cC z>G6(MrhA7Ns)(OhENHsBy^BCh?FWS`XEjv{#-m1KcR0;WSz(7d5v{*)l8kElMe`xj*P!3p9y@^~oAGvcFHN5vC8V)HqIQI*N_a-p`j&tZaz3$qmsxu$ zdX*W0>cTF&O5m0lq0{Y+GPPwtaA@B|K&@ep_42632tUo%(Pz3jI$f zja2oq-nSvvPGIuO#J~}ZEWD#Cm==K%l!l4HL_E{hR~8d52Wrp5K-1ei+Ur=9Ro!0y z9U9FEQZSYZ)QE|*h)m`8f?2Rw;R{Rcrln${`!I`NT74q>B)Jff=bN( z;PGSF-oqVf?VGuPmvy*0P5!}BP{9RI5EA)_t!_HR(*Zq;4JkWeapov(%PRWt+`ME~ zdWnCTw7lXo)xIp_Go`6RNh)Ql^;KaMa|_cnK3}Sr$owavlx-))3Pio6rlQy;;qXnvEIcrLr}aZ z53APn&JDcLHN0(CuFHw;b$w=42ao;$7|FeOpvvNuYe*v}GYY4d} zw;|ub(9TNz1TV698W?Z82!l#^@FD>Sh0{(^b`_>PoT*v#ZCG*4&rvLkI~S}sX)D}4 zYqj6?+ds!-EKHBYyMmv$62OHE1f{UXq8fl;F(cmt0*2$6KS zO!qCZ+h@>Zn>A87@vh`u3qukp%8H?eFM~E$64XrPthB3EU&iFSqA>gZMaVFQJmIz?<8@43J==l)QC`-k>tghY^c|!g1#3UN zfE8m;svM9=?P*x56yo77uUYF@YHx4eN&t7AG{7uW|p;bU~sSw zx~gO$1Rw`{_Av(%l5hHDU+vg2<3cSnY#rn*hN*Mnt3j`2*x3I39iN5;V;JPB?ojXJb4vuyG}U)=0wf;t_Q$0N-kMXRmhq$UHa$MTS1l{fPF@pi;`OPKGLTq-&DJ}; zG_(RYl(&$6&A?_2{PD;}ZPB$`k*+7Kp+RC$x312BfVUuYdrcl!OY8BQEGrp5nrU$N zPFLXj#u;YG+#~fhVQz8Pag^&Yj8+1w=20cF@&5O@JYYC7QErC^A=7JEn*?qe(h`b>n`;;3F^B4eQfA21%R}uJH%j;e1e&9u zIfn&wsGYNm9Ak#+yJH*zwvk&GJ1gKW8a7JlYXQ>H3aLEF=^?T7w%_8CUR)1Wgp3-* z!O`efa`76~-zNRJQW{i1Au@zpl0vUPs0dhRl8Z??>PZI6x zXITC3#kDHO$0r$%)Fn?qJFiI8w_S7}+==+g4_|ep9rTnV z@y_WRx3G+y?q(T$Z)J`m5;2)#x7DB5w5QJ0L>k07tYf$kb1r`84Al)1Y=WvuL z-->WHAUac0x)&lbp6mh%D)OTi9UFX&@6z#bD`h|iuXB25vqx2a7LDK&_+oAeSz@V5 zEq{Q{vb_E+`kT$5q5UplD(-nz55Z?Vk1)aW^}{7MpqV!#1Y$rV-ehBmpObaoJ<29& zOwo!(^(GnMPC2llswn-TaJ(ep@o{H-LyBAc8^^)L>QyYkJ!&!n-xE)g(k;rl(&77p zny^&mlLWdceln?v(uFo#pPj^yLB}+9G)d9q`c#X*Kg-g}Qj)oa4+9Mw)AVS3_`$iO zre2!iD`T#EH1I)}gm9f-jv6jq!3Up0V%_k5$w?K-?WMB`!QW*lm ze!L@|?c+FF+P|pG+wcCXg)mu;bFga?kFz;NUlA|cLd`?07HfZOR&vn6hHrZg^&My| ztdQ0eQvrHdydSCJt%KC+zet%fOoce**F=e)Hbuj%33vd1?Sm4LkoJQ zaQQ(`To}oKdSh7XEF#aE$0Gkaa-%m5_mF|_(RMx|NJBYpA=RnDP|}pdSqTACRvm5P z6%z+E7cB4b2`ysQVvM(2OeW=#4nj~Jv>Hi*$7(B>RQpJ&EO+enq@9~SuRQjo$@haozmt$mTf#K3WT-uo`x`)PV-1YuliaN zLu$3)w{u>iMZP)S)&9RXDT%{HKdtKC+P(|hGH9aVh6NRBtO$Gn6LX5LjD?I+$C=Q!r)zRnsm)Wp)B|TN&4X&NP zS$k3mc45|GfMx~rP10E{chJ`^W^k78OYi{z)Vi#tH$ntmh~dF{-UN3mvaUal!W1Nj zH))nRmb%cGVx~`7C)`tu<1?t+`g7)*f{g-uo$@4^8Od)tAp)5JF|f0dx!F4^QUk#` zICI(#WE~VdWzr7~`&!*_eYKezQ)cmjge&O;2$8Jl%XwWaCn|fYtQ}a4hiautxr|}H zu^Nm?s#8gmZBlKj7rR-1HJcTuH(1{@=U?C}$v|dw1B^hu1CO_kqL zz22(2Ux|1i+f#?Rn(!%uxbb7(Ah9YNBjJ?(zHBxN-9%YgWKL#JBC%+o!|t@AX?g%u z&43N8;W^%u)HYpLb}9Sq!sO(3;J?6In*nlfIiaB4VPAFaJ|=jhtsdlC0WK|dRrMj2rh zQ&{E4<*1IV2i|we5h6dFkEzuEr-8sceX@fspE1t+1c{Bxw(Q(VFTx7kc9dAY(E`j> zC!`ihohcMmP9_#btUD?A1}i0Q)$&e#iQ66OTO%hiUVL+^iOu!;1sA|LVg~}EATT3P zF|5WOT>=;l?M_ulMmF|T%cQ0CWY*Tg=qdt`1CRzf+bLLfoVRL=u%T$g$PR6H(_7;< z!)-%}2X~Kuc0_#+i={o&rfh3m7JOwAC29eLW@snNoK?uD}mB?NbTk_5~2;A*4#tSKlfW(k1`pY!q>kg8ZRL zff_oxzT~+l%Y|eqnlPH{1hg`%!O8IJKdE9|r=Sy&&JaF&+>;gSR22b%S3mHa4s9#O zmzuy)DeghPy?&x(`L5l(XUWzE+vM!N5`e?my|2v=Ghd*tv<=e6b>=?81`7L)Pjv+Y!lpiXoa?VDvhUJq-mMz66CE zz)~_$aYrx#0G3qnATp>I3_N&Hq*}QJ<_}QA4@STB^pI z#lV&VJd=+;r1zGmDoAIZ)k2GXF}Z$5kK|QA%;Vk1l2U+l@D!BLk~^E+pHY%8i4E{x z_n!(jt3l~M$;>qeAdal1`4DCdPN4iSE@qrTLlLH4c_fRqE>IK7sS1;HNoqq*^9Biq zCe3BZ;zLZ)(QKlu-$xokrd1i!W;=3Hg*9%yZ}7B#b98P^7JDy$MuEbF7F}}({r;#9 z)hO-Ssk_42fKM0SvHGETcL5cyEIJDBBMlJ*JG*oh#9wJZ<{7u+0Kap*&*S8cszBmm zMZ)o4K-~JbV!N$Js_@FO7TNJ~mFb6JEzJCR;0u5Tv3NE@BZ zSjpEq6k%UsG;om)ZjAKKWV%-QHk(I>)ZYlbGCbN8k^_{_!^M}D6A~q!2k22W9jV>7 zH}Qb!RKS4^$sup^yO{ZFRdBvziz#ifg~6x)Erx;2Mn90{k@_*SPx}duskZy9dQ`W+ z`HN1v%`lmz8-U#TLPPL1b1Po;G7R!T=*VX>h%$#?sjO-Et7bZgbdWx(- z2>Jz|&hDwFdd$m;XhenSg zj<)b!ln{PYaR#W}b&e4H!aT$-U;+|I?X<7tv@M@1rwIPCtx=(C=?J{;EUH54# zNA|TNjfdr9OO?Q4+HaixWFY+hHJ`xVqt$gBY7+G6Jv9Xi2;(rUG(R%_EWuZb%I(UA z9++Bbvffk$8gF==VAD8jjyO!u{`2bpWa4YFCvB4^egqg(F*eU^zmD@*mC< zHD1i><7_O0A~>!%W~QX#fF~;)-(cYFHH&9m$wygM2v?A-*_B#StW$cw`SiYR=uMws zGIU~*TF?(q>EXf#uA809x_%7PC>|~%gOI*rU(Be?c;BDPlE2@|ivrTduV{ zPZ!^*mcMHS&?vul?~RMWMcIF{y*_x270Y1nnON^U9|aRKzNo$Krm&dlz$jLMfuh7j z3>nyj)J0;;DilC)qv*?8vzqS&)JJldAQoCKU{wX1q^Th5NPRUeQKWAixNSutL*dv+d{>Y2>%@ zqGBa7a9>+%2cNLTnFg632YviovXoA1_!FdF=UI6orMDg2?De3+Zp%qi%YXI$8y}9G z-6N8a?h?fVRZqt6(fR3Q)TtRzELI~+FYF&Pk`<1~RJVnCqjt~8;I*Tm&7#32 zTi-pxxgg3}tnp2)(1Le81om~r)3H->sN>kJWudWx8AspLPICbR`oQ6GRyZ}dpGT$S zqc{|wQ~s*t35wcjY+8QS>A7~Ode;^s-d5|IJ%fe5=%68GC8t{NpoN z(mugf-zOns(=Viwi&rLYIsii|40>u4al{vC=_KLz_5hbSHg;@xoV`wxKwxc9`YQ#0 zqMh~^!-Ll}N~57SiAJ4+7NX-6jHlM1V8f*;fmhGoqxsz>ev{V<3$A&Uj>SHn5f7;n zH>#&qZ>Jpr+^0sO9?g(pYC8we;5*an#*o)2t_Lya!`sxca0y9}GJvKj#F`2UD<7c% zf$bM*M+$JUnU_8Yv>O0>J-?z^0BwNL;$QIwNqM(Z&?%lD8Fwb^QPvc+Y|sT#*8uXQ z2*#KQS6g>LaOT;qx^L1Fx$TZ1%n~^&Mq3$j)M*RLik>Wb@i8}bt$}$d{JKldHLvfs z2=)7(5gZWz=m!9(5@vqDp+>M+-_@v;Py;tZJlD}kr&C^FDw&DL*aMDGTOzBBz ztJM=5=UE<3FbGY4`~Yl&hZRWM141_4dBoQ=2YCb1*j5aKtl%dM%^ExABLT^(`|2;K zRM6akp4E!d(=YnE2^1k%ggukECxfvS7~OJ)B9Ti&U;E8(=FU6TgnE^{8c%upT!c#4NeO#>ByNSq4s05Krdhudj5uYzoh%(&mwmp17An_{y-abv@ z5@0>}$v}Tq#&XMW)lPcs&4Ot4hNx}j9Ugigu-}ln`|)Qmq1+h;DO1iZcGhR)G=gVnpDZHe{(>yQ{aCYd$Q{bn=D4niW;h?-i96hqk#X~P$i?sX>e8Kt|kHajVL^5FR zVgGJr#XkV{nSLg{6mM|7gtd<_);BzGG+S#>hKTk0QHNYmAeX&3kG&YHsm#>tzS7o@ zHR%1%F`zcL?H2;~xz4ngkpZPJfr(fFBbzWmC;Lez{!_7pW>jK}f34F+46yeG0sdwk`$GeF)Vl9zZ4s30Vcxv37lu z!W;t$u~S#nyAI+7W={VSd12)ITGaA%v>kR0;HIv$X`k~&8Qihl!VN9qvsl&}OH>q4 z>p)K5_U19`*2{Osr2`t#`)HdjZkBBBx#`xr397t6PQ(8qEjg}Jt8o|5NNxDCkwE$g z9ZZV-^2Qj(3L)tEYD-~N`)GSNj22O58*SYzCyp-bL9+Yt^VykIxzV+qTl(a#bRCgQ z2CY7x4fJTRt(RtM7N6$F6LT-RXGa*GIco&|dmC<>#^+xPU`JO+>sAa-5e13G%I5z= zS1&rK_sp_k0mlN8U>b6ruk0te;P%~~{)I8Rn;W`tZ3QTA@?s!~XJjiiY%c+>_`Y`ugIr*PRh)%;1vGpzlINH?dR z__P+PC_^gqZyuIcUB5^EfEsMd&Nnb(-cwAE2$tnKP=||j%{2hXWsL8r21{u!v+GyPJ=|CGg2o*S&W1PZ*FHsgiVU4x4MR?X%kH+W{db+ z+bmAp8>-|aYaYpE$vY=>twj%mu}iYinfMel?q+XBam?H#G-at4?-jynC#L`WJ4CLf za6&b|IT}%S2%r0hrF!>$S*1ib=br~E;!XtYe<4yd1a13TIHQ+~!*Ej6A~k{8W{@H6 z#=#Ex98f86+dD2R-eL$}xQ7!r?ZJ>{@+7O4-c8AA(VsGBzFq+hzotb>yp}8g<;0S% zaQOty{ypTesSKE$K6%o?VM{+caNbsfe*$ql9YHMk06R<#5W28;4nNz{Mzl=`2ex1# z)f^RqSW6qX%BUZb1j=As?`hT39wLnk!}k&&d?=##{)O)h%%*h{%nRzP8GDXcJ+w2(hBJ0+~w;&kzKI@Flx62OiF+amf#$C^Fb{jc^Uog<%;S6kC)5k zf(HNJfJrZOy1ZnwX2ok{#Q7Bp0=1fpD!eLs@Dgzyup&gSW^tnFl7D53R~9p!>NRs% zfQ(*h*i3p!r~=_2=2AQ?Z9`TynZ1?_OQK%Y(VV1;Gu;FM{e8RBnx?hU>ba<6B7iFv z)pEKDjLEnsv<`_04#%(m*$Pf5ss8i$rG>o;Ju<~*sOW14L^-7!5(Q2%-D8ly`^ z%5XD%E&I1p5Qm7MEhcB=X8HX>fXvZUig%<|`t5#;;%WwK$UOx&8pZ>tiX?3^9Zqgd zQg!Vc9mlbztoYAGNpoWZgsJV6ISTwPU*n6e>m?5z+gc;Quz=6wW>-2>ZXL54KWZi7 zq(B@N^l!XS(SFs8@Bye4*FneHgfS77)x{go12BR7-XVKpc`_L^>jC!@6$%fisexn&vsc z3a?BVSeATWXyc>p0D@@$!n+PKcyjf^*)`1&c5xV1pIEcW=!!4Dzgsok(lxPyVd(O|RvGQ8IeoakUMS0Z`~0Io07d4DBLp>N z{6(MbRg-hcl)x?n6O@HwU9;D3RgC|Z6<|3=hA9g!5(b_ja>}qFgx+y-3O-6tEON~=qG!#Xy1MIL<)W>$&`d$E>LkD>G zRR^fJU{~r0`0-pw!KqFabJ^jv55=%q+Y|z);5HIzw*SNRj|@Ffv4mO_nyK0&o5iIi zqC?>GR3OX%X`X?-3 zhOj7NMH1gCBS5C}{%k@j*U*>*Omnub#koL|aLYuAT=iCXao-~ks+j2nx6<}yd?giP zs3Ct=jA8U+?x&g z)Dv!XO0%t{OE9KB0tX5V8P;LkjD4nA12vCaVB1g7YU#nmpm=pDwPnZ%HaY64_Na+9 z1zW;;IG>G(m=Gd7Uwth%#o(sJ%*%c`;K8VA-Ay%oTm?I2weJm zx4P3+0tu5F5$AA@quysJez*+r+=Fd05H(%3dsa1rAj9=wKuZCvApL(;EL5FB%{*3y zeh(QMl~o_?0H$~p9R}bSaOs$Hxb?a}8mn|lP>xE;U(A>8rr0 z;`tfHX37}Eew}q4J6xyRIjVBNK+3&Q4qP#vflV=S%ceApOlNl|6 zumjzZ9uj5A=n-e*;AUu}$&n6@_~lA9t)BHnBv8{r&px%-+~pAllf&;D*Vg)+_{@oX zW2t9Cfxwyhk-@fASBFVwlm5w?=3VRiQ2YKIH57CAtd#f~!cb`|QU3p}j?64!KY{EOS?hgcKCIC8qd{4KQMw1*uKDl={@TzR=ci0$o)eI>A97wzs8fu}P z+up#_+SQVoBHN=ICaoeO()K3q>7kC~#Y6lDL^a`~d3Q=fvj;s?+{7t$bdw-aUyY~s zJhjx(0vqpZI$#FS4%hb%2VeX}gI)s1$Ll?-5QrI0P%ty0Bs!CtFN&@3mQTV^pNWZ3h0Z-cj-}%Rm&CKa8~fka zb`nz5O`NbnA562)(dA8#nTEM|Q^%uBHo%H(jiUSLZ|-4gupVh`!%WVoZbAdvBFKUo zN3d3&5Vq}WW5m$7lNlJz7}8XFrSpI_L%TfbH`9=(0klxszRGLjgn5L$N{WV@A+zkD z)8K1iJM4KPwzAyvL2V~j_7#h6=lAaY9qaOiw3{`7brTwglAv1mrNA7RzYuz~0OBVK z+t|*ugS(xFcROldYO0jQiYa85QQ+u4z*6l@F5i0Th({Hp}qU zRjN!!l>f_?s<3l&pI5PfV3L8r(IFAPqiT?~YLmh@Heq-K-L7;hhO$w}VDSyjKg&;* z5m1ok#K87Kg)mtJAPV_FPd-)T#d}dLN4zif$ZMX2W~Wuxob7e;XR61}CEvu^OF&{v z8@(n#R^n(n-<_AW?FLd3+soBjqhyM72HQKfIzq1^*zQNU{NpPPF z>6@JG6g*Eun5rM2BGe6pH_Q5s(o`qBTFoveiL8K*w-x$BG+#pdx`12?;2qjNpiHOt zbexlbh>D2d5JFJ)II_YE`XY|jsY2&ZZ6n>)+N=+~Rc((QGIrNJ{kJNp?cyn@IE_O^ zIMP*Fyhs*~HC;$M0K7f>K3e1F&toDeiJqobck>cdr;73ccyh(k0*;T;fYRzue?4Yn z)o;yp9JH!v`!wEuZbyu3YKwppy9U6y7@@O~rr^^@wK(sd=hP zjn0{e%`c+lSuoJazA}T+?HSb9nl73=k%-ZPG_MaIP`re`#JiO)2cBZ6FpWhrkAaGQ>@tSqIAac6y& zDU4tkhpvK>MOBF+cZ&qv8%<>fAKAE!L;jA;4|9qn^GbSSi|aT7E%d1aXH$W6=0~66 zOZ={aCS2~+**HZ%^P&>6%wcBUKeTzaZa^pAn=7Np<%cqweSZ{_Xcw!n& z3E7j)qW=c2Gf?hX>Q&|_wnEw@P$?pkEZeWgpJ%Q?~FRNcQ#WdocGt0Kx=fC0KFJ^+go z5S+^)d0JqPjL5K5Qh9U_Xh0hssFW5Dtp~Bo^X&^&)9%(u%hs}5mBrPsrdz7EjC`_q zbw&aCWx&6$dtBua<@1ohz%+ZC| zFr>RZx`Q>ysV(2{MuJ`Shd#nl>j$v>*`p%`7`htqxqN#F_2$;~ci0eL-sPU{rIkeM zQ?8}QJ;~|xfWA;;{Prl!j)BXU&f zMxRrG{GR#@@XGMfDJw8oBQCUPO-EvPI%8$M3Ckm&*IwV^Kto!3f90JZ)+ew>^5iV*X zB3k-V(biFn+;UZ9okPsqL;Ip^Zks6& ztcgecy*{myx8)o2&N^k!g5^FvXTAl0+cS8GPa zC%^05Vt-d2r!e(_Ly#Xn(&Trm&{L^%dZ$T@iK=xnsp}iSMV3BHgw|*%R_ZmNvAYhV z;o0gm%!=amN&9U>vZUxcQ*98T_nu#`OK^O!SX(in+KE3vnxOI2x=r{|bau3XzR~kN-l9`{`HiNWSc6eVV5y8A*dqR|cD$5ydWB zD1umWs0kYLP#G95eAxt{G}AE08_BAXJDMji&Zx7`Pn!P@i-iB~{^lZ83j%cT#Lwyp z@t`*j&Hg%iI)KobJUdu-Q1R9Q+cH!o>kaO?_MVcQ}8(>Lh+At0nnY z(A57!p+{i7?reiur)%gR4Z5B5O4S6eF#9-9z22 zt5x^Ksqim=TyvttF{38Eybp%i2rfqKzYJGrmvCXKpuu4yQ@hN2w05^%a#fB2 zFDuOx5aB5Fkj~O!3_&O2dD&Y?Me$b^;k%H zBHx-wUl>SzrMu^KSq&X@t7fr4NTaTWXj(Yj zru6%$wcl|-vkwA=8!py#>acJDUS*K)lQm6KwG3!n-b$QUyS>w6Ygx)-Nvy%*iDkH6 zYVvPNM>o?1JLaOZ8gg)QxG{sT5H#&<_D#0+uQv<1 z2Ue0|3n~+SJ|K@p7K&WiB$_G<4n*=w=QeK%APYadc}3q%W1js*m}~qkm8g@c^M-^} zz2(lB{y z2!5`m>_47fIq=i*_$C=!;(1e+P5_WiHbg$-_)tR*u`XFOCugU$@)I%WUj#mG{?hEL!}5eE`L5-j8Wa?@5P{oogj-uZt!{}N|Cbggi*h7Fv)8S z%GEA9Jy9~HFyrxC`0swvl&GIlQ+h7em((i0C>cL=4E{+fD~qa)G55Sk3Rk153VHRU z5>8vNCZPgKFs|?lON_}!YBQy#6*;B&jcWLtvq1)pKuVe3F#(SbzHlspy;*i7Eg!6d zlR9Q+0-CSkR>eco=cUz9=d<2AGgy$cTh)VfC#?m823V1L!`B7|K0W_h^BO8<3y>pY zyEEQ|or@)1X%E85rW2HbY%$7>ZWiq)pkfl|W=iU;2-|x?G_!9=$7}jNm$K?*d90}F zYm^KrI~w#*va;jHXm~7u6D?lD->|R=?;N_A|NVUiR2+W^W#OuhTagLB-D9$9FtgaI zz0RW>-RR3_cbMemKMz_nWvppUiYL&i$L5tO*%}{%~j71E~SEO<2jsey2K%h zi3jLfTsfp5U`iyY9EvuZl_l8?;z_V0d*w{?Z=@o2S;m#15yWt9vzsUGLxY&E?#@Y& zofkp8%%uPC6cKAzfW4Cda7ViyA#w|Xb|)YN%vtzz20@m{D7McBLN)c!iDmBSEhD3c z4l?qpN=rUhiCPQ@kdlHDS%BnY!rb#X5*fP%geZ^X_f4%RK%vWw(Ah_OGt+j1OrDm>^qvf+jAlpTwthgJPq?cAVCR5ciIsaxSeQVHz!H$ z`|{I^>8|o*p?o| z@%g^`gPw@a64K%a{A@ZMMa?uLfU)Epx`K#AKk(^$U!|Qech%~+TSaN3Yk*FRng>?eFc)mkZ4t0!;^EV|KiWs(z0|_<9@3h-w7SN> z!e5ulD^$(@K4}v=&(v{$&;mz@E~C1n#i_K;dn|PAcKqn64CxOysYt+JWf3I6R?4USB%ZemALcIk;Cy1#r(e7l&` z_1DET6LziRtt4G@y-&{11D2-fn68Lh@!K@edd_7!OOe!jHt04om;I@OMV}{XNJfUT z2Hx*ci^M*duyg6wO-(Y(6r#>aTKAYo(rQ7T5zEUCX9#EOC@(nBfM^BADQ@SNG6@}9fi4+wEDg!`>w ziywxWc9Y?F)e~GFIHOF|F}!q2;xGh(wxtSoIK0C7T?G(Gxr+9e{PQBwFh%cU)*XWNthFu|E~Us*6ua;_SHhK0oMiym=t?pg;oqU+?`pmSHLzV0gT=;klqCC0+0s*rF zaBKFpSh-*%FM_YctQAt*@jrxTAr=pmJza~uE+g(GU9!&DbgMP2!**ezdX%%L{pn9x zb%0xNWGn)D##(w1EH}PsncXr(iWu8hN0Nrj1|dD>1di@x>+X!9m7dY`1%h?-l;;f4 zEd`Z5VTuWWZH!6~Ns#bU3O%_tmB~UU6&#czv%(r@R)28NgYPWLRMN#%APN0$dlf3a zErZ#zI8cT>zBLqjDIc0!+U*%o*Cl3^(YJkrArsTB=9=+Zi*OuD6iIus3?7Xo) zyj!Mf=80E>btHwc$Nw!%oZkYrbqclMCnc3a#;SWHD2V6I?*c4fiYuPZXF~em7w7)`u+igg`d9UmjDKp z>_S#EB|yD&F(qeCqE$DtsM`$`6TW+kB9$HJB~q)ME$Uzu_f;n^1vK(U!HK7W1NM|n z!zU_17(FX%+KrSF%q(4&QL5Ijhz?K7naKpc{u3Ds-V(~y3-Ky@{=nI?w;-DXXywUjwmi z$f*OPcKlIMBUOGhrND*h>z8ukm2vuRv7`#r{Yrtn#->RU6&iMP-rT(d#io(w*Udvhm%baWi=uB zxWaBDS6~lJSZkz?!kfc7!hdGci|T_r{K~O0rpr|W$utC1ANbRs>+18p6)g$lXgikM0M*YuhM0M#B7*sM$RWTqjl|HV{pD# z>Q2u4?e}8_m?2<nCc;N#igH8deYNw2~1N0XOvoRV|L&DtT6)q0h+Qj}{x=fe41#RxW zJ7pb5*Ztb)35O-#=ge|5Oz`>$kv&46@{wBtP52u6flgQEJw)CyM$$uXI54(VYH20< zKJe0u2euR{k#jT`3pQqO$9(&J$e5#*5zA*a3t-xz=i{j|Xs^c`1gI}g{Wke~y2_4P zB*-sIS%2Dr_OEJ^Hei$5`NxbKHbQdmw;rr^$ecCmTZkA%X@LRnjp>QD97yzbSm=cLv8F6hp!VgUF3=;M1OF% z0lyH^P2~RXnC1gU@ASC+>T1N!N#`*(_wL#McnNzg{r3OnVzGeC$te5~g=;n+4W$PP1~rCdk<|!+t{e?Bj%T zHyPVPm+S~PwmZF@?%&llG>Q`Q^kVyARIsTAS)dHkMAbOUCsp3m%ZaV{|BzdUKlVq} zsSk&3>`ih`KV)rldoUWoCv6FgI7-dtQXwwAMx~*rMmkAen7|h}Usyu#CrO{@=SEiG z)=arBvl?PpJ7-O>gX{lDgR^*x;)#oBHc&JD$HWYw&TH&c`L{y&G2SCR4P<@p&_%nUn}QO^w&Tj`MH3*!>y+!PR$= zeBe5Baq)l|>47evA-YV!5{Z`yqVBi)eSIE9V1QfZXYaGYp$mYqHGX8{2 zEyC;2$esrPIPxD$eTX<2eiKtm;`dJ?aAkjh&r?QHA+$j@GcIt;)aL5i+QNu(SpZF2 z<;xqaSfXjUx!-IG3xqLm%!StFHfl$z6o!7P z2|cF#*?mDW(nN*J^oP9Iv*2Age~2b!+2oy1D~BND-ac!^Mgzi$II))cpl@3ce(TUP zFYQz!%jmC*l%bb}OI4n5Lz(m5chbsi4Ru_daubb8IahjWE-au!M?YF30u z+OrhzHEBE6LiS9{yse~%w)*$8Y&qJOeDCfYv&5jYKE&XPCoxW@RwM6lI((srp_>lI z{c{~dIRwI*;YEewNHhMlE`^(m79_s8H2P zT0IYO3Pv(WuO<8MrCN17XT+lFAo@Pq zLlp^m3DvRGn_Y|sj%4ZLbSxRDB#_!5NhJF^0s?4*2k3r+4|0VLv0}Y7fV2HuB7I1A z8<>YUv5y0~m8w*qROpqiX(WDEE5-(i?I5b;V-P0z*oH_-H4G`+sdWWTvHz3eeQF z3nA~}H6jcKgh5;uQCPI!e%&zQ-MR5*?Vbi&_8^I7-XP5+#WHmswoPr>KtLskMUHbG zAt)y`={eBKConeM{wLux8TzQKFj=nMr!d@KZo*P;JD^FEzZBgI<+ATNV1Hq5gj7|d zM)fC$9Tk2Oly+r{Kz0-NepQ;2Md#R|NH>W0B0S8S>kTN%B9o^@afds6+$NrNeMbZ0 z#z~Wxl9kb`*Fner@jC1&>lrh*5{I;aX$l*2Lu3f~Y7+ibI(nYNKmZ+nt5i<}OYROAlwAn8ISkMje@QVq& z0w%6tg*vqKf5C4>pkxsBZ?}tmBZjZLtGD>=H_2!Z_`PFs{$B+qO;JBv00GM0E`zD% z>zb%Cg0f?lM?FLL8cvhX{SJLhw4N6{5dze@&B|P;pr)r-a!bIJjg~C6)qiH<9fT~k z7l_QErAm7dcBO};F8zSkY@~b?^`e~!`mj3^aD{q2DZ*@!bt+I;rKA&V3TWRxXTn-zwe&kdYlMdsJL_@!1I1t-%-RxwX^iZAI zgCedae7gVAd#B^=E<4@)&$(>3@I!AM8cUj#27q0XMCE4>aR4S|Ngf?H05=~Jm(K=p z`ikD%wbroW)6`5F2y3}mi{*;DAcj`6*Us{reNdA_qO*Bol6Cmre7Y!df?kUY=tf zmE_8x2@n*+Q3=n8H|#l3DY4`czZea7@hPJ}0fw587SPDWn_;=~-gF*Tyi%N_N1A!Q zk%Y#ngjD#rQRuwKTn3;MEpP6-eF?z90*L<-=0M?o9|A&`>D$Z{9g?I1Nk&~1dh=O6 z9|;TV$O`6HK&C>3k+Vi95_x;W>X?rZlMLE@+pPFcVt4XkBvu#oTEd+9HHKpt`tPQB z8}tsb!hG@>Ep^!apTQGBAmzAVphHw1wX@ZArKb4Vat;rp+!k8&^D|+AH{KfCi%auA zxZMU2umH>;|EQ_}pXe~I%zCS@LBQtKwdpqX@`p&95qu7Zm z2QOe5{2H}tE@c4G?+o&Rn#yJ22<-bz2bHZ+X;Js~gk(AdKYd)IQ7YCb?Hw0p`}m5O zNONZPsFHl;$j5BR1_uT%5tlcO47N#6gucn#d4m@OAVfBC!i9#S;j2rWMlUcf(ipb) z>I)kkeV=lNy-?xyLC~@ceJ$oT*1eCtx9^I1YdFYgSNo-GqGSB^^Rvl?NIq(P^E+hZ zwDs(XP;D{|p2uE^y{xpM7m+_nHiiDBc8r5Ew1ha72PlI7RzORh@l=%N-L>(_wK_$A z*^O;_&DWso@@T|}?Ob4q0o;X+m%@xAyu1ma6348N{Ra=YyP;hTsUQe^qJ2X+jPEAr zEb0{7Sh*%#k}4^r@&antZfNND)oGYh|HBB(^v5gf9f_XVkrc-Ic2!>-Xp48-Yg7Op z<1$-~lNSm=4lY8~t0Ajj2U}-)8H>k@;yb_$wJ?dc()%~XCiI@ay+p7?%mj>u~<)Tn!e;im?tt8Xto zD+!@@x=CAK-=5PiB{DnIZpWJd^eZS5NrZpC8%h`CCEUUUsLPfh#d{vo`49=90YmP<{xLa4T%3ZND|5EJqTh7C+n@xSs$hF#y-E@1qM+q-w%@&9Xz#{s< zC<-oYI~NFVSjaNT8O=knLU}vA2UaJMtlBm=duj_stKRbI76DCvp>)Dp^0vG`4tEav z5qz&lUi@g^4bf4Am{a$0GKt^s<~SH12R1B&ZD~W$&s~s1f>ZVXkx6kL@t);0Hc6bg z(Cq(mdSxaJaaune*cM`d`ibb8-_IcWxPS3|b{%@Lg_htmOX2S>{;~#3W-}8e9yki@ zw<7tCxX#f$;Cd?aUx#J_&u4Nb5yvRx&K(M5E^osWs}~z%SeSDT4usTF=IvO5L8adV7Ztyh7{967p>lQ1EYsC13U~*#c!(ZP`yAzmct^H zKmPI~bdVga#@b)U_YW(CJIVg_+5k|Vn#+griGpNCU+AVKJD5VN^NIIRJ;H5=VtoZp z7N^vW!Ac2)ZRpkFW7*I%ippZR@oxtOJaN)Z>%1m>n8lpX2wtxZu!Dhz-FO&MJ|xTq z7g-G{&j%GE@%*BO1ms^n8i5O24=V)CG|v;M^bED;f>Yn;VB@7plkL^#r)#;yK%S!` z-G}MMa`jNN#8c#$sCM)l(DC}KD|nB z)a;2ENAJ9P-fbE}_p4#nkwnqj>NLIE4E#fr(1JBNrDu{lNBcXxqit)9W$7*sd0xRc zW8^QpJ&SOCjG$27qGG4dHHL9Q>w;8!Ze+kVp@AhGaBZ9A76$I?wFA@M+f2AzrG@4k zfyl?`@N`MRgqT7J-9!N;>|%MoSvgsB@_)RvLqkv+sBu^XzQt2wL&|w{8qMO|rPA6A>)+k#YA@ z!Isk1BtdVdFJrGLrWxu&18NV;n@EU@EFc3`CqYA&u_n_lLu0-IrdTB|X0DmNVWMQ* z3+D8(Xu^97MxiyBv-ndBQjevdu`!?^5#bfQ55mZhQaB!&+W#P-lZ*_@gy9#NC=3G& za98u2D$x7ab^uD&u4Px%FO|-XLV*4K@ue&CxXB!BHS2K5eJDY+JD{k6+UrfBp_#Gd zAV3$vd}4P>XNU=%?LM-ui$ZT6Ndkw{k2dCsXsDKGY~E@BG!pA+;wKiSo0xJrRRm8gN(Y7Pgxy6 zO?_A!8-)oXRhDKi@I}gIs~p?mR+JY=v_K7lhH6hipIBCHGe z5!)i=eyqJ*1P9lrp4NPy5!=MmDoascjKNXl zl3G9GoRg&a89q={D5gV_ByFjq`1s-&zXGL8&NtG;#;bvvc^Au|Y&eboWB;?8Iyg6< zYS)=YcTH9mBuA{G_pQJU=P@Q;g(Pwc@_m{CMct*0 z0umFwz^?gY`PZBzYzGI~X-a(MwEqz#UpwCr=@Yz7pbvIH`I*Z3d|>V&sD`5d^GqY-Z^A z0%mw?sNdA`Y5#gw?-kk70dNE!}Pz-O9GXHI`B>G&B&@*n~yP>~B&{Lnj@c zUb~-(_Q9(^khfLABak=-Yj3^20n{Erg6*oFI4)t1)G5_LLQx)?;Z|07eRA zNfz!K3{fIU$6=$0Kt6v4GcskcZ;)m$I{Wu(|C8+JV8gDVl~LZ#`$j8_*PML% z?nZTOrQDL>=;&TskL>`%^kX}2a#%>v{UoZlsOWqjfP(5yC@;E8)hb+Wo2ER19_nsP z$2KsWhJgD>RPTLCCv%hbprLjbL0y|laYMzTRmlGx0N2g7<@qm5K5$lh*V94C)d9Lq z36I--%sPd0o}cbg71k4Xx<*K5i~q}dydSZXlQyq2}{2XLk# z#0@ALDx5~zs8RBM!m`lBkSoP{iXvsLaWF!xN7}hu1eG+#K$K3dt$#PCQ)z! z8oB97ZsO%1esA^?XuF-PMA8w84YnLy(61XF=2&&gF&+|CnT1}yH{ggY|KVewSqmc3 z=RIjBp=^Q@WPKl(OLE#NeM(vJZ9LM4LE5A(0|WMu>vO%2jmD2m{AgyUTBGUO2tU7Q zUM4rLJPk+8f7m>t-TrIO#rf?_h+m9dFmQcaWOB(T!e^q2u~Wggn`ZFO!l~4hVfwe21vFJyC%4yX%9Zf$3wd)iblIo4WxaQt2{|Mrq?5z zFd)_0!%NNW1Xd>QlXX_UCnfn?tvm)0)aY@EK=qSjU*-+K*K@aG+aB6dtVQ=g*F0wO z85}l6E^IG5FL+cfQi4ia*^HL}zeqr)fw#|-ZJvzh{)PU8EoPUU6gMH4PS;)rHO_(3 zWZw-SVxN&vY%V;xL@ySD!yoC%=bW{bu4`y$GGR|>#a`va4qLj3d|=SQ!``_TrKKS0 zt;g6zE`;OGKE5_|0LETlY4FIQnu0mYYh|rr!;uwFtbtkE5j741EQ)UcZ;~2tZlqW_L_Wu+bb^{&Fp4Ux^)B^TX>|I z2^Zc~R6~mRkol+}#u+1DZpmDSN=Iy;zq`oxL0iWeNLGd2~ z>P8`Q3WKwxoG5Zf&s$)(olp*Rh~wFpa8I@7>J3hXE9v79H58ePEOg&DMBOy@@@10^il{en1hg@J@SB24p{dtU`DmY?7|*=#?v9W64i;d`cbqsI+?fTo%o$5VB~TZkd-D*_Yr|T zd7XcSpIjcwMOaDNx&F!txkJ1Y#A&4$LWJ8Yq!dIM4upP8S*e?#3Nh&wGcrs^Wu1@|#9sfw{q{tjmZ2#QV z;F5aE4E%e_e$UT1kw}>Kninq$wP>0MR+N~It&V;2J>NXN&+o@I?SyBJ_U}JF^5e;V z5f}R|o`}Go5P5Ku9qzl_z-i3z_gBE*Zv|w4nX9b+MMF~Mo|I_fA=!y4?cx7mc+MYY z+8!(#+?0YgHd>-Qm0gJ}jLt$1f>*x5gwRoP^++MkAP;g zmQ24NCD8Uxmp+a{v!#3a5|bi&)~aB!E?3yB22>RrKhL%us?s+8U!jcSj=#{k7FN7r z7}1$L0zKjJeqT3Reoj$6xBbJNMXp!rgP)2LaWf7LEyP)5JF2EnWZVa@m@xp|2WS5m zdpYYRHQ#;YdZ{ZG5&ck~CMHXEiKFcZTJT(X*j>Q;pHBLWs^T1#?Po`Du2An0g(Ljz z3RqjCM8w>wXTmjCy1YF?UUf9UUO2}=8xBhSZS+@;?F`O+i4!Cz;?&>}R_Y@PZ-b3$ zUbo+eP}$PIkef=QSPu3NaH-wj|+yOrpXQwT}p{gcW-9^hB#mG=R%=P zi#9g_32ne}IakC320&E3UC3Xs7GyAN?1%&VWL&3yk65mI#gAiL*s@SPOp2+)E6eIF z!tw*8ihAvJKpC(D?R0M^r-!-kgan|;EE~y5?T1_E(OD}#wuaD7wizy5L7?yIIWXl6 zVr|L#62kxBa&rm%1_cnnxh8P++&?EWNm3MrEhWUajk766VS@SQ4{_gVlAhY7XWJoxgqz6pKaxM&6d<=RlG+72}9EzTm9Zl?N4S!2jTKFPOnK zESzgpq$aU>Qm;w`(veP|+IB~H8bWXPwah|*Oz??}pbc5=OwS!=N)1Y!a4jP>!Ap6LOcI)|h?QV$;b7WqH?kw}3+cwC zw#~=hVy=b8k2Q_JFoP>?KSkyP*BH1S;*cqZOQ<-r5t!Rg%TnYsu!D0X zN(MYMNVA7;8Of2!HA_1EoqM-YzNFY__1~p7Ju6;--h)v3FzR$Dk;2)$7>UV{$V5Ap>j-nPSnRBA3_2u`SqMi-?u5)yHek(K!T+sUxKnr z6~I5doPfy7nIq;2wtz!?!pxk4OX0nU8U+Q;fEAjmFUPShIl;A!<#b`D4g=7|GT{Uh-I=p;a_e!_Bo&%Zx**1XH}?Km|qu`FR`=C$$SJs%__1L|o-QXzVrXy|D2mTTcC$Sz<7f@Rs# zD81{G9_Dx*<7sOD`_W^VC%(LylFcE-JI@`L8)=|iFIvOCHQM$BL2mrMe)QThSUo-I zVYC6eVr}bnpjjaTQJ)}`H0Xw~l8c;$(?&ISCA=xnX7p)5Ax&$_!NdD*i2V)0zW?G1(2>gJ!~U{CMCda?gxA)(fnaiHYYP@* zv?!ONUpZ&>L5~_=o(lEA>qCiQM-bB=Y_su+=n{$)clVYxT#eaVUwqzIlR`0$0jWQ~ ze_)`fW)ANZ_C`;rja!V0Xju_AG-k0YedJq(z>TK2c6a88!^`zA&knZnEk>BjaxbJu zR6_v(HGE3IKBAQuz<5l&eNlJ7#+<<>jYU+Qi$JwIt-p^Y_Tn08(2Cbd&oJe@o3E=ui)Z!+*E3fskDkTY558@Vt4?ZIm~;}7@f4mtOx8Q3$LM7&!x!eZAA(kM zGqZ-BJdLwg4ZAI?|A(cAhn)c$cz>&!8!QVQ4TQW`w6ylS;BWb2mc~}{Dm-Y)ID)sI zGPtEJ-CxwZKvP8)$IlkTR1HBoI&Z>fVS$&v4znoGO`M3L?&!A5bX>?&62hQnkL)_A znP}=x*jk46Kq2ep@vR&n*2lyuASio|5&2;Vqb?S^_K@Jov;5E2|LH4+NmzS%Vr}CQ z)Q?t{J%7r}VtCX^+VOj>bJ3FS;!*&&{-&?=Zyj-k>3SH*tSZI_~mE5azTdzwt%?$<8e2%i4k2lYILlYOJo#K^BO`_b< zr;@iGFKMji5%vSNhQ{M<9AMT)k`1D-KD4&G&KZ{yvHMC3@(Wir%Y3G0(53%hrWJ*e zZMgxo-rD1&)>STeN=zZihEg*3s3C#}QV=^SAXW4})hUvI`&@hf!TiaDd_1J;7fn>! z438dBh55Op*L!kcb=pCtlSCmJ=H+X;5LB=741eU=Tlwg$a=>KQZvK{DES@d-N zHL1-K5_;c{7O_L3ec#d-AcZDgg+#pgJy-{Pc-Z~R-=&^OQC+;55yhrvn*pZv-$arX zTc+=@ou$w^Gkb?ZHyopi7#L9&=Z!L%qdKGGmo2p}+^Z;Xu{3dMAEL8Lhc`3d=(W;#yWBEd8QX7w z#le^iFT4Iqm&MxX33Z+hyRM7|H2|y}QJdp=#I3hazDeXP+W_#2Qqffb9R<`)DzE0l z!5X9#;>mtAn9gPYXTs77bwn{`C1Kn2rT@D5S2-)3z?boq72w9d)9m+m2hV&jlL*X^ z$qJmi{9I7ur9b#SmBe>z-wRljZlp>HFAc@DrREB?6jlCAjk%cGVcqJ+oQGKYZ6+pX zc>hyj{3dk)1g137$k$<7&@HnIfg}@YWCBz8xA3`q z#sL}|P5o46qHV1R;&Q`WcN04%nV$$pZd@|lT>{5M2kL4qjafVI!)?iidgIRvH#ICx z>^qpGg9=TEm!mDzZYo!`fBvrcc5JG(Y)GTWq9f4<3?t#Mn5_qem~PF+udows*m|8+ zZ;+&Tfe!&1q@o_SyLl|+4~1(jA7^2IF*>7fo@Z+QvlV-o{lzR>#|E!6!jR0mVLEtF zqDw9tgzA%vBM9c?_=Zd7Xu$#r*m@*ch@$cQr9)FJ%zyg#-Dskwu0k$goOb+;?_hal zJ`Kiq$N8CTWX>PZWuMll0&SDJewT*oaD&`o?mQiH1mf2LqAp5bIzb0Qjjncd+(SlQ zbzwPWjnxz~ERHm;ikaJ4ZvsyWoT2L_sdg==wq#A;Ael-q@*zH0s*MpuSsZD7^;HQX zEKI5WkbVF$K+eCm^98edm%lhUB;%JIBA{fU>zPh??a^P-NJC(PDtX~0TPXzrd;VFu zlGuqOyGst`h>3XZ&p$J;k%CjeC;N2z6oY zE*9IH@@tHl;ePJ_f!KeHw0e1a2+gaUk!s+N66vxP2s{gNw^$wmdV%Xk;B{V4rYXE)^@5*_@OR( zY>xJ0aN<7^yiM8_Z<8WyiMn~OC7VK~!2HnI+Fx;FGzRJQ;%%;8L8u_^dA-5>Aqk8F z+C#7I)tvw=Ti!X3wd zN4*eeDH^oKi3S?W*s0VqctdCAzF#yHlsb5&OMFEnsCW=?8p17wEzP29F!;E@{(h%q zR2s-K=|=1LHvg@8Z97QXtr-a$p;UO6rAiVQ<89nGla`9_IJUVy<-K;@nsH_(+7^eT z^2-1*s%Ag(HCHD{c z_Ftf}v5H^$xfQ7#g0pvr27_#*I#5}hpF5X!WqgOh=D)|Vry<>+_w#aXU3f-{84jO~ zfZ8#6uNk)vT z=1{lbA0<3&&*eQ--P_pY%f~+;erC0Ywd6x)$dn#)YUAIJ{GtlW4p-eCqMjIVkZnZZ zLrcnvk+EO6dSqp2F4>$Dk6Y(*!Ef2bm^JAB}jt$b=z0)w&;;YW|gH~nO z`~*dx>~tGnKa#smLTFO`gB*~M)tqeZ#h{WP*(5YI73F-p7i^2h@SoN`dT3aYV`;)Wer0`X3r+us#I}fEj>K{UI;gFw) zjccofME8LI-@qc)P9z$w)r06!Jw}tBo({DfW6j^fqXJ8i_**l`3L35cJ{EYl?IJwzAc}+b=zrElTcr2|%Nas_hCYJs`QRt(6G6o14HjCDaL*#$1)U$(8&|D;98puv zmoTAV?NDa>*D3hO0h&sE+!07CgT@)4W&+t?Ns}sUFlZqrUSua^>VG;1%YK@-pakhA zVnJeh__5Z3yvzU|BxD^g;6G@i=sVT=d`M35o{NF}c(qcmqKheQz_|?V_7IsK#_4>o z$o%=BT1N_l?1n2T#A8%$^;9XWqmunLb9f>dh6wXfcZv%Tm0mqy8Fm>P7G5u zL6tWwjin&}x(E}hmL37oY&h~z&KHdc;Bt8Fmb3@r`iv*a ziX#2(Sft=)<*Nru@6fTj82qnY=E>_y?Ba_u;a398UV;h4VF!P-{?bnAK5CO0R zMQ{ivb#%Q~woG~ELExmOl(T!M(*}DQrU1;<oT@Iz zr;~JG3?~-a+sBW`kp*UD5TsV|3+;GFIR=&C<|Jh+H>Rs#JAJA^mlkos_)8*I9>R_1 zGy3*lGx>SzI*$GK-C=fU6Ph`9j(PMPah<)suN*ewLG)C9C8Ef<$yC#wP2LU;fB;o* z^kV8{70Q89{8{%E`JTqzPY~Oy#N7M!U&h;G;nEt znV9-o%9%qhR6T|n}LZk8LF~N7!W4&!S z_u8bpXw3lE@awuQT(FdB95#GaT0d1gVIk0DW$(YwCOFpHI<>YN|(YH+H&woZ}TBIz-T?J#fdU)9=lH3CIsF; zywQ9GTT)j4KRxMc#t9SKVeyOyny!4;F^p@A&Wgi~IhrfFfyXTPul^Aj9;P{qV#tG= ztw|7{2ZVw3Rs-$`-zoGYOIE_;_>tNDC>N#5PXaB=~!1nhq+; z_}=J$h+T+Zr5d<}^0oO(w*96ilSl>2!UTYSzjO>ExnflkUEWt=)R$(`5}D;JhLUw~ z&yLuaVKAQtbjGT+;d!Sli~Zhsj^*}meJ4g+7pYYH0L!%ueNV85As1zEEwy31hTq|h z=q_2MT6bSptW)5nmKWgboUeswkgdl9#u~2eFF^Ku0dv;qgUrtUP`e3+PWH&fZKSuj z5MS?`!}15TwaP>yplSw7H=!hS%04yS2Lb)_XjqR9wbt=b|56#Lb#r6^ovTH1N{joq zY`D;lAj142sIh3XB~jIyC$Y%JX|N-VcVThp_@exNS74{jym?!I8ZdDSRd^?k8ueO^B5v*X_DlCf;CEE zaMdge)Nau_B$M^ex+CI!f+)?%N`;ys+puP2kj8C_;A`e~KiYi&eZtqG=Z3|PLo0!! zqcxCYu5S_oC2MN$B;I2W5_%UUHrQH~D1a8Pr@D@#QFJ`1qE?M_IwkAOYHsT`X3NdZ zt=-9C*fdCIN~TD3`)-C)8_L^FubuLz;Yq2J_bnS1B;D^W!V^K{P$n%nKL%Z`(Tnl* zxOD7Ohg}sMfrx&@R@2upQsSc+kW(55fLcP;CSePq(XWpamI0MwSV4_Yj!e$ka(-aK zw2S>$h>|FiS;s8Ay_X1p2&OK?fkhIcTOWxIT4Dn@(_X&@+4ILav?yMGj%#c^fiy$4W2j@z0a-(1e_F(SedBw4&J8qWLQ~)+!elqF0qZ;jUGuZ;N zU`6u)ch{PJf@?q(BFx~W#DE*X9A3Yr0YV+pf-%ueESwph|lLn*uSiHrXuRj23 zM8Q4u1OCOG6Z9vmhwP|>p1*RfbVDEFSCM_I!Y!!jJKAODsjPgsSy%~HYjeF@pk~yo z=zrZhPh7EAc@nibhC2#r7h^A~S=uSv*NJI&Tc(fDi9kJ5-yB}l0@Z~TtHf;6GxkU1 z!fB`e083ja()JN|A3UHBG1@qfGjL9GL7UX4cG~oD_rxuCMi0w_)joaWQ|+oz+(gq8 z+i|5g8F)ED;pax6Zd!0Cp#KK>oSo4Q032K#=47w_My2Ty=#b>Rl{i6_Z(SyIKDSM= z?L;f;je?{+D**6WQ$-%f=K?Y|%2pxJ63bC=v#v{H_W6fpGmfejbx0{|yS*#Ntc{PE zp6y=0Auef_mWGbN1^WVi=Ym-A_g*l#CZWQ=BI$JVQ(5C&(HLeKX}=?k=Qo!Fnz{@3VYFl zH_e4HkV8aR?XcHeQ~b;u*(xLDGp`nEfgSzvEe{eBP_s%VwVs0Ow*~u%K?2ywmEMk& z>%xBmJ!QZ!xo6*GcJ}0g@PuKD)0|qg2mLU@?&XN{;RN%EotZX}FFttjlTZbp2ezIBggG(zt zM9`M7afd!8EQpIznU7u~4sT2X$s_$Nc9k&-m+#L$d7cxo(Mv61pWpAL(?Rb+fO6f=IWgAk7Qsr2CNN1Us-1>cY=KMETLMHMy;{bPYL4HJ>Br5wY54gH zvC}ZQOStRY0bD4w$n;#?=(?&gucUEQ!eqw2R3z6R1lt_SxtG2uIHr6O_ZRiWLS_Ox z^fTNU9DI>kpL6y3LG8VcAq4LcJHCH05f^F|+dVSe5KLoBUgz`Ro|kG7NaB59p!IuUlm z*@;pWtv|OAY3>BY_`4o2KFobIjyGd6ss2an5Tmvj`qy3y(A+q|!4}t3%H-wAVFwN= zFxsF=BGatRuUH{EXqxhRSrP&FIlx&;vUS+9)d07+O0ro92Eqm$;5dbqbkwJv&APh)##py03Mx*1+957nlSpg9(&*Fy~~ z5?K)%ohcUA4S4N+GuL;1S7q!=GiI(9FUFMMetEm~_p3cx;q^EQWcaI$tJvTy*jWTHZBmjFowwmh0HIM40uXAYqOzER`>meOrsN zPI%?XsErc_7R_Jz*p{N_T0Inqv{%_al_x@aI7 z_QP33YexAQ8$hi_hJJO&bG{nX^hx6)RGD5WC z3I^TB59ttpw(Zad1#D2MD{}y4>(ldtd=by+*SZxXQaHiq9W{iC`VoKHVnlj2lt8!) z<$|YbVe`R~kVA8HwV(Rpt3|O;@s=;euxfj6@CJ-#g3^;X_78EQR2P-gHUnxkz*?Vg zUFecso{@e8FN@*OOTJA+iZ1aTpQemfjkZ+%0qSOr!fj~`MN4)=&IeE;;O%Sdpf9~e zy#K*oc74?Vk98ShM^>=YFtjVZ;O}?{F z9%M%qx~Dld$7wtJ7PeiF#P_qyf&840PX(kKH&uOv|1L|mYSzO3_1G=8YnevobzI!y z3sM7&sS7aL94b?1Nrqy?8IU>A4P))O*JSN(eY{m=>+0f%52b_i1X%`XRVscGEJmgM zk-0|ocpWdlZ3Q4Dxq1OyY>Fj+p+=*fbl49i#H-*~A+BzJlpy^&^Ak&(|F;&~qVTz@ z^GgMu+>dej5Vw#i)mV6#KvpHGxJaEN0lRE5+a*?hQ-cw#*Zs+;fagM>TF#uH=^Q8v z#w{Z@($XK=J(IZ}MRY|ZeVCe-!54Qm~V8JlSUk7*CEZQad6A(nf^|B*w| zCY@g{&F=|hJZpR#JG(Dgp;QMaW&pH+6NP5$r{BNgbiETO$T?^w|AMG8%I949n*NOL zYcv$*GgIPtqr_GGAl)!Pm0_h8txoP)0a;T*3oWtlUxAUn8_mbg{>78;-JnsXQjP}e z+yuHXP05R&L~5z~Z0_(()LzMTmUTX(VJ<;Cmzn(Y*$h&gra$yV{ziq1YeXcK!SLlT zsDLOBAS1iK^Y(B$;0%?ddmX@?2G>S^j*}kd+FH6$x9svy@28t^N|A@Ned-|DPkP{c ze^Jau8WXxW2T{GFgBr_aHS}=#|C~TXkaGm8d;=BN>(nZ&~3*?ZsLcd31!9lT%&VZ(&TrF%1~S zaD`hobzW0!{=w53JdENx3L&}p=s7}AiZCpSG&zR1NxA?3UB%&339kWbNiFB$X*q2gMEB6Qr%&Qnu9@iCU77}Km5aj4Vm`W>Fs+3D z_O8jK7w~4xEjg6_HF&bve|7>sJd!qMjc>f)fJ2b7d&}UQEi04}=NKTz&>k#BO5(t{ zvLSp=O5KJ0f8KX&!$=qi9-Fh)(3dHwbW~2M!If{`di{m0CzP}(>Dm1T@Mw8pln~sh zMwOL${3UM$2Oy)d}5c-v6jft+rvBZl}E2D#Ce`b9s>+7c|t#gq~ z{kiFGI^S)y-td@5xQEws~Y*JTTX82Qgx0#rtO*i7xH~$B)izC5fI4I=6 zf9a`_Le~h@7n6iQ@+q1=j$%SpYtbS{{x1%SUS7uamzT$>P^*x+W{fV=;!C3nNp(uq zhNyXMHci-a%aSu>EC3_yM(pMEMm>HzR~eE|S*j7Ka6sjBm7m1F0SVau&?jne)C5vX#yCp$v5ETN0*kf!t)`%pjXq4iTc60#kN&RH!KB<;m*9yWMD8va2IX<<06bnU0>H7 zMq1_Yhd!7;KH}2@mhQ3CY(p;A`JZhBjm;_8C2SoDs@T7x{bMzt@&Wp|3c5$lz)yUq z=4Nn@3c$S`2=9Z`m=sEM}L?XQ<;2ekQsvkupeTgs`M9TiAes6{L&geg0JIqLs z*^Z60T0P)hbEX=X0jfLtZuop43^5<jD55c+*OuCj3&??VvHIQ>q z=%L*CvD<&$F_9+u4Hr-*#W7ci-HFbc=O7@0IH_X6F%p~i`uE(4y$;0PI&*&5lZY}` zjn3kIW|v)U>tVloZ0c&+Y`_q-KB+CH6=oW4i)VX*(#3sAa6jxSK6|x%zzkJwhb=Lh z|2AuDKE(xGxT(lN^DJ&sicGHGSD3R1fjygq&5dPh>VlJZ2qLM{5p&+q`l85FgYBa0 z6$=#NfEdU-WQ)tctI~1{4U0iqzhM68ux>f~Xv3XThiYgF)u|s8J_X^ZjFyAXP7jd- zZvSsCE#;Fd&PJhL8J!6L%&A;Ntqq$~*qpps3H+sbRn*75fLJ7CCLtt$f>)8TP_Xqs z>5^5TuQ)CU?>xO(XlO}%LR_tm(?Iq4BUfHjDpwFR(v?7kSe)Bv>|*}I#ts@uOaArw zQ`XKd#|@0=upn!8&Q;2&NjtHC!dc$Ic`$q?Y>%w9OerVwYZz`-dheqJ2>)h$xvFK4 zN|PT1oYN^^v#h>PlhDx>@6$PcH(zU`a0tyzq$Cr+$ec93(g6%m#dI3oW*3sEH&w5N z@92_tK&G|Sm0yUcsGJ{f&Z~2xS&JL&>kDjAK{_(SRXLORqv>STHk?DQM)U)`c^;6g*wgGkW6Tif9o}kXZKj+$CMD1&&fQ zVEI>yw4+Aw_FT-pdhwB1mYr7O^_=$^B?OUWxzTb!4n#&8pJ;ndM~4uNQ^Cj*70Ui` z2Q`qr1B7-}k}ZCJ?{X5T6i?0fvs#mtUiB7{X9EjlcP5O2hi-}!bSbu-g#6`8bo?~} zVhT26(3$ZKaS6FMAl4Y-13z#ykPDj$>F=2ym7}j9tZqRt=C5Ws2gnQ@(*-`McY(pyE}6vZaNBc{*8)T#vT3{ zUwL|CAz-}$*3NRwl&BF5kFj%Atcqbj?P&o1GBd}L{1xJy<`C=_cu<%EpR`x1?6f51 z7kOhy>ZDC8UzwhPr{>7g{}ea7tg*y(ltLNG4GEl;oW{(R5Uy8qm#R5`N+6+~c#DkTiDSpGz#Qk{`0CSeOOdAx6tP)Kd%U$Wsb&u}Sm zCqY=b#)0w+k2Cv<8Euud7@0jr%b-Xv)x0!lC)zw(ZaYDm0^nA%Q+qHhFtXa)@|-8a zG#tONuROs)fK!su;Mx2^^RPGYjNd{c=}b>#uA}q{JdE@$bq$WUUB@N7`IsR}BZ%VL zXl;4!frw!^jW%N0r`7F{|7B7p^#-7;lUyfd+Rm;a2y28dKhsdGn$pcB2T^V5M;Nk{ zw359rStGtRFe7a^%LOE=PcIH75ihpD4KcLCCfmI+7Qk)b?X=AlX!Ly(L8Ne01PqdD zXG8sI?^QJ4Jc=&aXh|?&72D1+@c`2Bz(h{yc&wYWWDL_XrC71Vqw|H+z;vG z(GrO5&om3a`;Z%A_*dJQWPuaJmI+icE8?l3jiPi22?2BwCvzw2C z;YJ~QgdbJ9TU{VU2|TAugEfH>zms^WU7}n1<%2gg>Mrqxt>o}!|pCE=EOw02i#5UhgFq@9V$g|pkKA@ zcsXix3dCo@J#sF`PUK5Q}f#r^ZHHUAi;L&tr_P-Cn^5~ zPytmKi)jQ0*q{~#m~o9z+vUMk!EluNg8~ud_KAa}olqV% z9FQWCGRiW~wwLI=BoMv88G^L5&CE^bj$lp-VQ%lY``Ot6N-_vihPVDRUcVEo826+S zJ)&_}A&YSVHS+``JCK*{t^@P7_b$v(9C*UT=Ab(*47De{&vOpg<_c1Zjs_Xg`+W-z zPD|&u2$ML=l#O|!Xb=fy%Nr!jza)Y8)WsHV04O=TZ+0YDvlUD|9mr8Wwv+C_T$?I{cJ;WNjbvr1E%Ink0 z2%Y*>e&nU67M`1l-x730-!$kM%$EAE9P1t8GVkX%w4x=TkQuU}wJOP67`xX44yjaM zSUO%%gyK4DR3!e@e4NsdispsbEO0}I(B1B-Ij-b(zRF@fjxgbMQ?TB=AF*nA<6Qu# z;x%XC+Agj&T7$2#aa#HwtLkVZAxvGxjE%c@NirrqAu{`yl2;#0XN$lO?%C)5H2`j} zW%!t8wiQC|G1Y3T#`V~|ZUOQeqz!0tCMAd$N-})IV$w71xEO2@wkhuex3&s-dFg-M z6OexjiJSoBAgq;HZjQDb{|GzeT}`l|CydJXVu9CHaoZ>EDtEcpH^n2dHZ#JdLfeLa z$01m>K=*fhyk;>Vh|AmdkTl$#jVJ<&d8@y~RLoki;(w+JLq5xO7y2TWlU)h4>jn2F&jTk+jwEJuDxo?U%!zV&-|jzWV69= z1-1d{QSCq4RMPjBPuS){ro_Ekh6q0RDwX=Q`$a7A0B{}VPN+P=-5+m`Zh^10$I1}@ z29b2x?M2#)F;NsFTpu)LTAXhttq$%L0n(odTsp8AK93xw#BJLh>`6C*)qp0i$%MOHZU$JT&Ca?29 zoW&!s2-AbSx<_X=Y$@T}gg2_-x!<~$Xw?D?(u*LuXKg)+f7-T|k z@!Qx-nW_BD_MoINtT|u@YM2X+E(;ped|c;0GUIcnrDXB<*^71Hl73GaSku)k8Ptd1 z5G6B6)MNfeAEth;8Nd$mG(xSMOIC8GJ+?NEvk{lQCH~OrPZl(FBdjc8n}h1zGAIU778U*o+3_}y^L6zeY)#CIQLvY ziDrKR2Y|E?gZ*nI26K*NsY3E%*i5qkQ@9e0`b;c}dBaB8X>qvRTtzRNu9QF{XQ}L| z)V@5vEL@_FEp?V3h7QvU_(J^Lvx3gxO1GbvHAso%>z+HU(q-`>D2(W4YtA%6&YY%Q zC$-@p{R2QMhmM5&l2$QV?qj|1Er#c)?`j+``_`j4t$Dgmq)s{9z_e796qB*2wOP{F zc+{7pz&~Ve*0GVK9-liGS@Ybl#R~^mXUm>B^i>j2&l6M6HbS9*MxDNRS{DC>&9}sV zOX^a~VgGfj76OY5$_r^;6 z6T!uzcIbRIovvt2bk82K@1d%{iqyd@GdBtC7anJTs3D0Ufno;^SPSV<&{9O zzuhS`b;#qkTG4M+!!vCWCHkaYQF`(9E}jgFvTw1EM(|T1FFTMo*c(CMe)c-Kb^yCw zElChwgqN7|4k{Hy3@(5A`X13Z2AG9cYY}G#VSR4sE#w8WeD(@)NaY=6#5g2 zMdKYws?5_>4|QD6@&mjw%}(B-Zp}h4C>b|ZHG~ss``VnFrr8wgC#kjSJ4O+{!skmS z-D?8X8N$UBcFh~7u{Nh{J$pGT8ZDe;rS`pJPReR$qzdB>6g1zt zX?^jRu$2?sGL}sEmsHFSP!G1Z;R|l61$fq9%pp+9Kp_hI#7$FR=J~&~c^4B=%1au@ z^rbvEh3L-|?)G@isGc(XX&On&N124kGOKRpkhO@_gAKyF!*-!DJ8Tu9+b|?%k|V4E z&CncW!0eH_HHKqP&4Ct$F@QUbq9p6ix^o3-?~o5z%Pn$6k~VZ?BeQ9C_BWAyf+ zd3?Y>xN5-qRc{0A+NA|BUI`IbrSWaGIoo91Ei!x!{+*GmF{yw}GImF!IkcZk+~g#c|Q4u%?rHY|K~#O>6ZY zv5ol&xxC-oL56MwP;XWNPeA+#_~#=1<`iFC#8Ih|CC#G zv+>Bjt89?Vh?1?OL6(IIktUyE<>FIvY+V#>*Ag?#F#qMJ18lhW4M#V|g85Uxz4c$e z#&HMq(Wh>NK2!(A-PE&efmvaws+Q|!sJ93(th3M|_t{#+Xa_k^cQUDm?kEO7@YSK7 z{tcMIo;(}UHwXieIm_)%Zq6zRAF#`*-ROa)m@9*6QNM=T!CsX7aTVrZ$^>H=x zD>87y&Vx5&64}7~d$=vlf~UO;##h=Fmwx}ILUHZ+x)yn)>KxjUQzVB<}ulav+F#0m-7I zFME2yE{i7J#6Z1M1u^H9X2n41y4hhOku0{F9{5#|l zy1|eZ;E<^kgh+Kb$(1`=Vx2^S&+RrOaIrCQ)z z0W2E3;H!zXOZG_XPl>UPZ7#b@4E4hP!m8rkP>kMSh|UqzZjoA{jRG-eqz^qTnHCR~ zh?9fF>=`#hJjTo>wQn!7zAz;W8X1?a=I7joyVLOXjID8bim!ft8dVR{4(o}nMnBrC zezb!+((6x6!YeGyX!-js>n-@M=7l8tv$_x?e||3yHL-Xc3G&x|AeYlj9|N;t&Gzip z`p&4m_+rcWd(4@n8tD^KBZPeqwfVDJZgLcSVNrt=^B^EWTQVe)^J!qU}Y9AC|H~_@P8tUND>a4Lg7LH`v?RpE5 zMD*j4ny!kFE#k%Qk;2q?X6IgYOtM_59jV}Y7`qV}Y(!8o0oh#WM;bIA$283KC=;5N zIgUaZrXXV;3jXI384^JM`1T{b*P4kTWdw&xV)57MP7ZuVPEzfx&H@<%_TjO^D?sat z{Q@^`?Aw)BQ)3wlG#~~)FuN*}m(p%oimA6!E_fVC`_@~PrSzefPo18xoBB{TiY}!< z)T~A8Rl!CGgp=%2NRc~jQC6QQuo5)3&(y5u5^GJ}HkN5$Ml*4Oe>kt2;MG9Yv)%_C z6+N=BWBGGm3AExCIM*suV4MD`NFic!0PMsLc;y5#-d`)}PCR}dQTVA4A~6r)Tg*`^ z!k*EC3Z2PfA*z0cxxfhBI>p;|Y7;2QL9O05m}_K-s;jxBLai%Ugd^EjrmoKRG6rws z$f2mQfd`6xUq*OOvbzCV+c+LF&oFW>Baceh8Q34PL{rtnj>H8q?q(LQ)^CxjzRy%G zvw+wfT#+{}>F$pBtZf%0!uLgtFCH93(24&_3)t-lKJ|aA)b6S?VM6ilHLu+s&?S$X zu%hS?7)J(OY9T08>4}qLZkhB_8+1^IAwzXx*hSd^;+m10S^&$R{}R_$I+u(dm$sf1 zCqK+v@Ng-By;v{+kHkPvoa2=k)5T7z{qFSwiy$vYP)p|jqTpX!Y{RYaAV{`6AO?kK=CCy^-FQFLay1$K4xZDzI))j4lS*1dzJ`-3iRY+|2y7nUUYYvWf_4U4`V7?=5U^T;y0# z;q|me&@!tsTgTwU3%hJoO4k=%S1jTEv$Pmp*rX5vnj0-faAbL|G$kJGrru!AH9Ped zqxupH@$Hoy-I)0KM0wfI?-$@Qp|Q>_@Atz z>eCol_zGD!4j$JHMIkwegK-R{1JHtR=~Erm;G!0htagk{q3#eFk4=@)F znfxHdr0WERz8v@(q8b@0d+C(R3!`Dv=ixy5m8CfbK~5m{kI%C3*CLFIZ)V4W<6xNL zFg_s=J9Fg~-emeAI=4YmcP&o@GfX0P@z7=dl%5rf)(`PwhgC^%$P$wd!*qd8JNvx9bR-1#+K$w}XvV{?Rk6>4JA zSrBcq1<_^>0`cHvp5>b7lU<;%2x&`WcZ4R?tl&@J{?#xRi?)QSsXx_$ejB7)rV zu*4A1WYw8Psg!Uc{+IAE2lW&B4m&|L^GRU@S&2^wzFvzPG(R7doHEQGygf!t^Rw(y4tm9NT2hg(?<6?p*!otNp~W}3BXQU zPqhETi@LE~B7mP?rxP3t0 zBqS`dpAZwJ9&2UI0NZ@3RK0euG`;dk$dSR*pa9k1bBlLt(9UyK1}38I00l)tVk2aR zhVVC&d4>=DD1@q-hsZZ0oEwEn^r_yzWj><~lpVygGnnB*{8nSOIxF>F_y2W5x9q{m z;0G=`j$)MOmz}JSz2~}6?Q4GSJ@EzBjotGbo;J5XXYYC|!s$mf)Dv~dQEOd}w=z#B zmad5lZ3+8bGhllQg_~#D++3d4O-}SDyI;F&MUHB2nBeMCue?r#&6_P>&Ox^j2q; zAA~Tza5H#sA9LVIVI8ywPvaly`ra9s4!^Kn^3t>JVONrTP@sGZ;hkg;{Se5bFf{Qe z(I_)aDV9W7?h=oiRszUU1vpiHeC28Y*oRF7i;A``WWV0}m2kHqN%eHK@f{ZyzhYMv zmc*~Ehcy%Opv@%|q0b&?gG4*}N{MD5#hteZEnpIWYV%hHv8Qczet{+w z9WmP(L52{k^t1*II;#{;ITGa!mB!Yf5T@$%T$)i<3=%LbW8JP)qt% zShC)pGqxoWB4<6DdNcK5?nZHbw)QV-gQ>=zhVAS`C31*hNRGuVjdaC^w=`U@+oF_j zP?Bttqa4hRr^^2>Vx(~@cN^WA5t0ixH(QO~q zEUN3-ZjU?@xr*t7IWbq~5)cyvyOXsh65e>W>55IUQ?Neeq?fq=M?o2U6T-U2)fc-} zUAGy(0f`x>fUyc;_<9s07g9loIfmrS95Iy*I)WNt-q+db^J_GG0LmpK1}1&umu1uy zS?2IX?V@qo$R0kaQcJVlaK~OKcoS{}S`BuU^d4bF(_G-;L)xs)=-wx1mF#R6I%Tym z!8R%|sfSk*xCWW0->G@)08Ar-CMxXib{`VZxJ%)?44kU>=<5`jQ`uGNCDWAzND9*A zol;=1G|{EjwxXq@J-)|lzM8zkjDO?n&)8*cqH#7=-&*PobI>9J(twGH*Su%nLOVqtm zTS)2(3*N3VdFQxXmkU3&1Y^xRC#^6~>s1khtomHL_=Z`09 zBMV=*`X)Y>KE1&qF~~nOX!S9Z^h|Fa2;Ai*?;;l@`q?`s10%SPbG4(udSfrsj=5sF7?SC?tUEq=502;K=EsmW&C;I zR%%GCr<|SZcfET9yR@wR64rv$k)^FvZ73lza~y7KTTERMN*0U`br$LC2*L&Dsn|&kP+q2mw)15N0&t(6Xn9c7pVxTYZ4$WY^V3?qE%u1@}*$ckUbjp@0A=fM<_wr@= zXSh~ksySjSAtr|rhuu}yk4k$JlRp~w_tS_ZU&8c zVmBAZ^hQM|j-G~|c|&)hSmVB^Q06x!J_Gq@bv8+(s#ntHlNaFauzCM46aiJE55vv+ zI?mdvMEJ~}J0eUh$%QGNnq%&fwdDX9F8%@t34L@b=B_fQY#)b?vm2#UCY7RQu-Jq%~D+p5iNLk?8>NiE-M*&R;Vc5(sPw#5$+0@ zBQ1xCWS~XCKNmcEp*Cyxh3i0IKv~M^xrWx&HNh71?RJ&$jEKVU@-euZ`&VLpK$vo? zHu9WZ?|ZTSgCpq9*=0E>hf7b>g3(+5X)ct zHO3ybksopDDVEB$=ao}vP!`~lU_RakX z=i9q?AvJkxQW_tR05d?$zXJ_eFqr9F(jR@95m43sPUlM$=~{a}r)p6hvF{}m;JCk4 zeV%j)VEe&ilEg%hYf;l}c-jNyM5WCsFvcZWtgNw~h^*}+wMM5Jp`F+xU3(vo>g2dZ-;z;J)C81 zpP0#3j6*kEj3uSKZm@F^jr>^a!DE;=P**5%XAkCi@uv{5xMCax@Aopc&4=Ds$@fWr(*55qJ585W&miGOq4e43)dtV(R{0HnEQ*xQGm&f zT1y=Zk4ko+JHr$_D=ilt^f-BSln9B!r5Kd+caw8WD$|@Rkd)jl^+J2{NP7F_1YfY}ujQn+O`7oHM9*Bbmo?vIj*@eaaS}(ZioxT!QK!q%TRT z->)RQ<)V(w|2kk(4MkHzr_=mw#_XDY>%z{In}qS?XUZ)Jl2M-5uFP~N2fdpMJaIg) zyr}w9#&+byq618f;B5VkK~sJLfNPRwDN=nef(w2zUFSRp7gRSY5dKgG z>48W-ieS#&4jWRQ1fBF_zlejvq{cP;=_eV?Yb)$|&n6HaQeS0(NV_EvbZ-?qS?k1# zdAbphksC=>?&BMYOPU*CuD0!H@NOQTueZ#D#)gh9v1SDR^j74WI{M-2?3*4C7!$iM zya*8^;E7|3w$UMW_jS!t4Oj@3=b117MZQpRP(2d@)Vf`2?HuqeuIF?*`#FOm=Na`4pyHq{c7Iq z9(&NxkgqKdN&?vnUVCQ+_|L;a56t7*%S?)vt?g(Nd;(<5SupF#Uv3Ga1C+E&>n2^^ zHUomE>KmeVamdfmj3Oc>!o5~i|u==nP@pj_G70`@&SBr%aUH0VZ^f+gk z2RH~}tVuyOVko=5;mEokiALJLNN+j^C0|T-qF2MK!1}$n1T7Ms?QQ}BD)COqa+wsX zKyVQlgfI_&k{oBUu*s@>M#k8xEy=OcZh~W+B_9P;lDt z4@O!9oK3c6vQ=gN;}igU5MD_!EeEyca=N-CtF7CW(!**d2OC z3y)~^Y(sYle{)f7FL@fB9Hwz+{};!4&T?f4sCJP!umP^iDH3S+WzO*&M-@(XZvr}y zT*bZcQR-H>=%FKPZwhJz#A6qS28G&m<6P3iiz-+IfYPStEVR!_YpBFG-b%k=1j5PQS{zeaGZ_ z?@n4WGp%8Hvq0;uE~rI0(U(DO3*vd)R=F?Z5f`1PT@=323USLjuZRaytRwj4;3w#4 zytRK5eal?;v=4f1>Tv&X$l|0^@=GbcazHnt6RakYe=C7P!cBbyaSB`c!yG~l9@XA zUbg(k7beWS-<2e`??|)wUljT$b$t_#37_U*k8K1l ztfe3R6D*^zg%7~enZHbZmvjBxcHH#{k`JQPHnQ|?xh+Y9^XKk;OHxtikIlQQ;RMfb0yjtWM!;J5IdDO3 z3gnxH(t{E)!s>RU6xQ)=7uSuap3Tg`licEQQ4Yk;ifuO(#z;|2-kq}#4sOhK%Yhm8&6OnE`hbqiQdxEBFw^`o z`>{}iCkfcRnnotk1#bpbSzYuE%F4w%DaUgQH3+yNN+Z|_z69(bEGn%0eRmcEM+i8S zT%~PrRX&hU+KvhbNefYPDd7u_JR^89y5`Z1p_UL_fY%tgdHlc?bZb`FhZ_gK&~bN! z*&NS&8&aXaN~zz}-S0%|`t87Ui#sp|Vd_ihu_VsDybw3q?Q0SLfkOlGQiTU{C6Ag5`rm>8Bw3iP ztG>fcGVhg>>jppaz+53~oZ^GAaQU=Pd(g)vgyNnT63q2Ep*B2=4#H0~g!WvW0(3Pg z6G1T1O~amqFU1765wfMb%+=3jb^{7`AB_5s%o~t^p~8;>Y$H6(|19p|6t^}IC@4vk zz0HG6S^VW3+4cKCTVJRbpMI_`c9|d%1zZ4zVhf_7ljQF2UhI4fJo7TL_;Z0Td%lJ( zkZYciP2rpYi^Wm7#nQhF+K%3GpXKuu4oadkZ0h1Yz7Oj<>UVL@khCkcqSg@KP^HY4 zCzGFh?9A?(;y}EaQc+c^^0TSHGsP4J~zUS&Z za`RW2e$!FIf8fEvw%1DPs8KG}A95D&55igVz@Vs`C+MLh^oaS!hngR!7~&S$zX9Wf z65NK|KPw_Oa!}hrgbi5|fitl1-PEBOd42Oq8NEaPcrOINFHCoM*TSs{CYxVfDH$*e z3HUsejqU$~(f1La90?^!D;1}-6(O69T7GOF4!P34PLtWVbtr*;qqtadp6Q~!IDjWP zgI)RJ0$tO)z4R**9YmTf?G}NmHt<|&I#z*9Ru%U#5ikD;RdKGWqqyKd%x?J19&eyF z%xLdv&^H)CO-RDK6IawzANt(nI0PC+eu+$wK6Xru{qlOSC?;pJJ#@BeBXzR_28E+_ z0_}Qz?Duq>)lA?Ndb)t3k5jGQ915<9x4^Cb-Fufm2Va8S&DD4s?)Bl{YGOknV1)@0 zrXxG1(;Z6J?y<+Ypb`WaRbsRpn{Q>_3_eCR-9q!-98wilYEe$z>_)m1BUIYy?$!}_ zLVwH`0{e_45p&-v5kx;f-_v?T165)yV=w6N(EKxA&XwFdVmH>{#gU=%#f?cNTbloq z2@g##fas__=I&ZX9L%v@BsG<1xi`E`e=)ItYJ;FRf<=BTk*PrRIGskqRpDtDUd8 zCYARWA*%2WmX?QqEzu2Ma51P*_@v8~Ze{Jy0UwP^oMoXI4zHBE7Ay43D!9aj5D7J# z+zB!kUH;1s>FSP%h15;0gK_R-D9b(^I`>Hu-Sq*L(?`JPP^Z@N-h@$V;63~Y%nyWd zvnGIz8n%Z?@XmhXhIy*#wk@z6Xwt_XE#$AP@=)bftCNnTKV2p2vY&?BH0nEBZ1B)5QIH^1wikaUXs z0qDQA_uU0!(4l73v#vBfya`9kWew$eb1d!*y6VAsRyif9aPO%{cKo(zH3wyA2G~2X z%4_tU!^{f=kTdVO{+n2}&5b^~4*+kdVX78B7h%(4dtW8*J`T!uk)0%{cbsAAZA#)S z{r7WA=~T|HkjIKd#(4JGV@WM#C0)o=?M&_9p?Wo6-8RIgjsM7p0&btjEkD8LC^Qgg zr~7J^DTMp=bql;C!OJ}jH)sS%iVF=mxm0lZMdOJxxcsS#?9@!ye~KRB4wQ6qI^p4{L-1cF~lXGmsMfzZZ@DI_({?$s^$_l zmY3?-RPgRL@Y*`@`>ECgzEag6ptEFCw?>spiLxa*zY)TL7-p6nv|0{tg5Ni#xy#7o ze|3Z3I{VGEFKCCcHdxI};G*#XyMOSujfQ9+O9xeN<2#LCD3My&Xf^swR0g32c1XMY zAiI8&+Fny#z9%+)z?oZ&uUv&+ge9mmb@-7nsn?cXS-j0XI9$>pdpHK(5*091IX!A2 zOsgN8cPlZOEp8NE&|S~G3p7;(*nsR1m+S$V;c9ivnv*=DN+U{+MiBqFH?45~Mt7g@ zXJY>@6MC(9gl%}fVsL5V=1y*Sd1@OzcyWjKu`4mS4=xf?{dj3+sfqRa-hAC(#w9{} z6nt;{S-oj2Kb95SYSr66hVBYuKDwZKoFPQ0X)v4%>?1cRTy(-dPs5OP={N7Yqds68 zLd4eY(?Do}J|VbdxqPlhEmE4IEo?RT07SF+z)Gj3_1ZKV$m=!2DFjt!@9UE!PzPB- zODjQOI07+~Gtb3DXrSP z2U5W?UmHw_7!UxgZ%}8SBlNOAZ6~1IX=?=-Vla0r-S_c3Yd05>VUCq-aFq;i@wMu|Z+PlfA=MuZ;?=x*HfNU-*;QTd^&m0FG5$|4k73Lvh5~ z-40!Op)bY_iSh}?7hL=mBST|K;Yz!~A!0{g!*K=~H9PH+;PHy~vua0^ck06&>qZ2> zir!sF@IUsW-PnQ0fGL#FjEaKNLD7!>w+wU_xyUEPyBVR-K=jPL1?sabUx({Y(Bp-4 z^eAx`yr#x{xKaY2s6@K{s6KI)n?Juz)Q5Nr5&xr8IiQ^$hb7@MSee@BDpUGjn)bTJ z_GihMfNT2sRjPBBzx~=03-eYZYY9f2g~7(vD#?>|QjwuPBb(z^U8f17hfV>&Bn^Z^ zI8Y<5{_!NW;X$=)oOm&&>L*JRJ;^CfJ>0y}G_JryaZ>`_>haEN={BupOFSqUyl|pOVc|{66zxvx-%r&LqUyCsi2$zL;N*M+J~9 z4DY?)K)a+f?ZsohS~MrS4?A^=;7D&-bJKWz(k@w@kE4HS=?kdji^7s9uwP$^v4;V- z`K}_Yq`Jg<@Xjr8pr|Esqw;WVRqtUw8FuNM|6`X@_Koru@c~x-}To>vj(1Fu2Yr;6# zDkZVdO0&+kqlD8f0c*9$-!_@VSeb+C(}M|k1+k^wbiZ%c#;q{PQ5gAExs7R z9R#^MoQeZ#Oy*hE*qyPe{gPJ(qxAKfM4Da+0Of*XgD#z42o_K!H1UFh)9IcHkTb=- zdrWU${m<8uM7Ap<4)Py+4%l0mH!OH@jzthbw&#eL^M&Rnr!^f0bT>%rjk5~v1d@Bu zt_23tdz}y4zcq#v$}| z`Y`wOp>&gz^K}63_>brorll{!YQ15ye@LWX!dTsp<@i1ZhoA`0%dM6SfKHy^b34de zuX&gM`m;(ZxUE|c`)8?`Cre>IJXz!AEFevx`Qy1cep(}AWc^z#A%KKkS+bx1NMmki z@2?b@%_%!&~BUgasXcjj_)J=;hPAXcWG{s zhC0(>_3l;yNsN#64uGjRAin0%2Z;j3>-{ocHB=zAL76Vla%jr^|?7-bGJSOU2q zu55aJg_l+zRHU)q{$_t;e)p5CJ4zA06$tATcdwTMi`oXKfqlt3_3A? z+w?k1_3p7OU~@WDkOYQdO{|{|-1u2JT(~5{b}f>I^Wrn5K`3?+QT18mL)AOTK=g*q zq70Ox8Uzga1zNV|STpR*dz3Q5-9h+Ofm-HRHAkTK?E$E=bg7)<4sFy7t#HJ>_K8-L zBgXu3*$tl&*ydb>>Z@i4x}#J@Ra$qHT;n%{AITrs^N1K4#U>cF=UbQV;j1F`W=vEM za-%WYxE?U|M5pJ^7AJ#C&Y%c@KpKg`t%y(UFH!8)@%_c zAAXVzzVr_^4Njh7B6NFBx?92J0lJ*S3RG;cQFRe|*;VfREhQQSoM78w*YZ{B9f}iC zEbhf#p?|C*>??QeWMZ{Lu98*wkp8n=qrdyEdXk(yLECi#NB7!B?k*y#!Th?Gu@2M- z)DM53z%i!#+gNlnh_!IFaxRZv56cau;6bfp3V3@{A)fT@qdaGoQF5UT&|x|;v$dqL zJ=n8Q#OHNEc}gJr55(FA1-29TxVjygk@OOSL)spS-}v%x>IxJOn}^hPlHe+s!oEO`rmsK9!$|`s2=%N z4^uo%19lE3R3n<`&tv0|FwYiDmEn(kunVb%7FD_wUO$|93!27W&N(r3h!s2?WR3Vx+({n za6k#Qhb!6Kw8-SSCHpwplw@p;SbnK?Ed-V}-2F4BWu0ZRpckJlDM}1o4{2_KDSRQA zKtg_}j(2vbX5_l9C^3vP?u6FI;5PoaiZGnh;3t@VGhz~t3HuZb(Mnwr)7&MmJlUk^ zMkX=p%5gstO>2;@dpT$ZGNZdsK;`loc0K!mYIh-J?3YMS=;ZM(1H0ZlQQx;UC-XKx zpS*Y55H9ZH*~%gb^;fxM$nQ$%4^j`{p;aGv9cC4DuQ3=gcI}Kc(FTWpM15r>PU@KV z=b9lad~W(3{Q1v|bR%W-LC=4XgTRd`yg_~de(QNytqMemv@<=(jQ^zVidn_x4!E9uu}qz@OwHY9sLp@e!ShZ(~X&VF;@nr3+?G2=3CtJ z`r!>dCS4a95DbGjtr~Lb!B2oBTP~ytC_90UI0DbdJ^2^9!6Y*4XI~ z{p%iUNkbPA1)Zr!)k3Vg8RT-l$SmB-};Y=i6RqRG`5NaP9W)x)TLC4io=%umNkuQT5`-$ z&HWz!O`7C5ib9$1=qO}v8!1_@?UsIbm_wL_W^WI2W6kN}!Bi!I&q#nVyT1#3EiODv z0ZR4Ofr$Wu%89ROTvv_%XN>i4U!Y2`BT(U%8#4Oolll*6Jw@QX`xaNL+YtbHMGQ!l zwxA6LD!^4;bM~w881VH z+qvX}I3B|zDZO>CeFD%q4MdY*?1^X$Pt@@AB<7pifS4@|V6(;Ge5bxz>$a?L z%~g`HDwYfbgA6*xYWrWVSx)5j_pNz3@A2?K+)FzCnN?3B_5X(s6{9r_tedJi{nKqv z-5N5x!txemE>5fpXp)7&Pl*p<{U6MvGD$+#S}nQ-ihxhXvUg=6&DJpKP^WQOJQ}8B zfwHAkGNg~L&~`$#jW5a3rJXmT{hkQgqH5EgWnYYTdAZ0Ck;a->1T~t-F}WjdU;!l| z4}K>i`tvm;FO!Hv%1{0^uVSQ3w#@v$X7Q9W8Z=3}`pE%eTDvPr4KJ481j5GXipA|W zch<2qwHFODZD9p=)Ze_?QJ$j729X4fMQ0KHC@0D=&zR3bq33Nn6qAJIfHPek<{33J z9rGV>qGNBzga1`0xB(t@Ss~~kX>={+yJ+yAX@Fm_L`P*VQF{;HM#e5b;*YqKqruP8 zs7a<@{df}Q*z+kVx#Io}d(iM2W0yDn44gkAu9B~>O7(*0vCi}+W*M2Qi~K!|F4^7U zLMvG0PE|2+PA;&xT=DpTI57Dg{$sjkBop-1Df^;=R<3@H$HCsM0&@D)v_G(KaHSFR z)lY2M0jS|G4c^+sj_aT1&D+Smj`~P(F!GY!#yyY{254o<@lm55;jrdDs6Q(3_uD#K zn51S|J5nZi!aq@w(K4?`+VxXK4(c!F1t*mz&v~{|?sf3YZ2=$}U3s=x6-cWCRLehG znen%k`3bneIk(GpyUpv`q<|~oxtXYixBRES6*kjTQp9D0CEX3dD9uS@<)1}g(0jBjN|Sv)_Fq-GqsKARq1fDpU`E-xN`vF3um4Gu7!$CPV$**;l#EgXt=UAV5JS#iV(X z)4e#KhBs-zSpx*+88GSTmsOZ*!9fUyA$x+i7>`Qeu zcT#WBmU@D3(tN+{aLDYnpi2lracuE=e+cslB=lhtrTGw#eAi!B-G^^bSYl(n!kzFYT)`S&7V4C&}Z&g0467eD!mEqip8`|UFS6G_N? zi_M~fbJV)G^49$LOonet-yqL6@?>>gT8Fmh!FAA!%T9K7TUSbwr@IQs^>9&jAeM7% z4oE~danR~UyZLL9QK{H8^bV02wrky#I?^lrT-dWlG4f$wTfx{f2Jp(83S!&h?Qi8F z2(XbF35_cA_b*=W2ZDOj%iV@|w5z2mP>t35BXUn17xeWREa(3+OX-hX zWu`QO+e&6y7?^z3N}Q%&ZC<-G9V{0Ane~ne->4LO8rFxN78WNHj@kEPu{P zPhE+-f3ne-i1eB1VaV$wH9~{C8zZ7Vk(Je*%vqG7TJ+FTvq%`m9Z_n_GLJgmNhT8S zVc%Ur02zKYRm3%$#?2`?bL2NfzFUGU42uyede~F_$e!GS8`%AvDM zQCsT6dww?yIRw{HR!&J~N&vyZQ;qMGcx!Mh$h@H8c2pw^Ch3 zk{*RYX)R;tTUnBmf!g8MG^cE(qQzdFp;8j=2Qp8hwC&j;%-$}*URtNP3(D^&=A~l5 z<=ZX&tLbbm9<(C4%Az-`j8d-LjI_u(ie>go<4-KeYr@u*pp2jtn^$AD4ca($!Ys3{ zK!{Q658!?OyUATnORPmbzWq!+b=T~6%OYO8fWajgt3l^mYiD)++;7#XZGv%9&3hqg zN{>UBt?CEcTpo*z&k9GBWYMZ-J4rX8Y%9c1EGAhztin!KLA4iPX#9m&r6vDulAENi zU7))N^?)*zk15>$GzI4f|3<2+sj?L+SXJyQ!R-$w z1tiyP41%yKfNwC1(9xs8hsc~K1&4tmIZw-(W@EA+;zrv=f*Sas;61x(;OcZ_=DMu1 z(WZOR3)IB+6}NSK7IPyKGapfDLr#4R+nc4% zTA*VI!)FW|$1O)U@-8^y4CuKcv7_qyQl!7n0+Yv~QZ}M{?z|_Wb9uQQg(Bcm5L%a! zL@ZYC-+YeI>|;+0ymj;UXC6VJp!r)!p~CK1%Af^z;`Zzq-^qPRXi#%@q zO-3<_IM$ZNJ-khh5FI;AA4fEE&?{c{k{Q=-4+^XE;1hV2*JywqTcG{uSHupOe2qNU z`;2VDPL}wz4u~|(OmOTE29Kv=#McjbVxIf&DB9e%2Lf{N_p~i5>Nq3F&ftO4sEJPN z!%Iog@Wz|?0&yoFxJ;3#TyUf^&Uat$z>jS+x|X`e3%@VPQ7TayHaB?+jULo`Z<`yq z{Ck7c!rpzb34|HF??cthiaR=gIN$*Z(pK7 z)r2swGw27nfkD=l+B>2M*2aRj(?cku-zZkq6%Mjvpq0$Io%lj~^Hm)*8;x`Tv&{*U z=``wb!MDfyRY()oz$X8XNkcnzYzf(D?>eKefFD5eXmpTgqGMv}dsA0($V}4Psnv+A z%MgLr?XKrNnR7jPxU$rpafiK)f8hs(i8+!&=Xkxh?A%hu`Hu{P9jcy0A;4)lx+oz4 z@U$zGX2g3@#1ic*2YnRLfWmh5HMKBOFUf)#CA|+Ubkgnd+E6E@81qUuxZ3aw-)a$4 zujPf>mV^{nu?y19IJ3wRvsPE?J5mEuKGrb~25Od-Ti&$LFB0CDUjt6c z5#q;TaBwM?4=EidA)4scY+&*;e1fe&@!>M9$`qJ1s`NF# zpiqK9fCX&?@ks6HJTuw-HDO=)56he{rWfdl=$U2Fq6NFXA-p;6hmq;;mHiRVL*U~V zdVcC8##*`yI!50hgw)3L0y1?l-*J}wJgNiOWuGV#%WAA{`@0}bW`jt7)T4&;v`sk| z##VIf2biKgQZRR<$d3>zmKZ|h7;okZ5-Q=j1b>srp-LRGiI0ceJCyrv?KtVvvU&V2 zJTneZ?aaIN*5}6`|B%gBN+YJDI^6}$7t0e(FL2T_kg!-VDKDL(!YIThx6_a1MExY*7rLjix^D2m8lmOK z323lKZ~pt(uE5!Lv%z*vFTWNW(Uy!Ql%eO~jT}~}C7Zp=U(L73UWRJrkFGd0HRZ!R z<7s7qEGcOj9{2P+wE!-+EzRYv7Ts*3`f+|j=>#ajHItD7_00~?3N%<9I)lD}>u_Cu z?i#J46wWQ1=Waz;J!+&B@cnZHmdNCzKwRkE+9CFS*=Plqy`QKzN&J)_Q+^A!nD9R*5__cv64#7&U@ z;0oFsb3JBp?{ue?n9eWvpe3G3q3}5p5wVz=rS36>3)3DN@$dSiSLCK1q07)4J&y6@ z`&r3VjzB4E-TIRWtfx&xk(ad)%VBe7JWEf+q6&lf$69$v=T@hkN(u-FNO_u#aehio zA$DM}_8l@LAw{@8d*`n(daEpE21ahOuLog5{ExdoVtR>@0_Ej9WGC5q3f+z-3CDL* zI2X+0ikJ^eGVwXjfQ`PK-gttLP?i%v{Gwb2Xy{}_Fe0(%J>4IMIzP60p z#4SzL5^&ATdVrTHg-mq#njT(?%*(Oq3+IR3Oa(xa9?yo(rXs8}inpvK$jvYat4cIV zi~z5_I)wi|Pf4&&eFkV~t`48_^f*5Tkc(;*ehfkLz>mnP*}H9p{gs25TOap1jb6{N zYzd{=jpm^-CzqqswD#}UP2YbUp}yJ#`Ezt*NKlZpYBbR26{mdF@p8{%M0tSx!Jp)B zq+KCTk8ZrO7i%rsJu326r*w;*aWeljLqvgKV=bnYO}^TkA34fljsSWv&q5R-6#}hWx|E$p5bFb7 zr}vG75~(#sAmVMMZJGEnl6$`HBXh8%iWn^-0^M+~=<%~d36H|GxMH!aLgBD98bW{p z7_t58-WNBV=#5LgmkN+NZ_B?w1Kn=L$*-j+;J zjO+R}>6XOANLDzLKh2ybzfi~N$ss*UwB_Z-{o!zQH)beA6FnulPPA~SK4^+T zRclL2Gmr^qf zBtJXmyuf%4;dP5447&KLq|{KXUy5lvPkxYv)^hQwB3KZdUYLADOC1xJP{4fYC9!A7 zB8Z-HW77D+f#Dd$c_&RcDuF^2Wl+v>be^EDZyql6-K=)W-+-rFG~z$rEu@^OG&xNY zhsxcpsIuIMZYazZf~c|;XwFiyFBkXKW5-e7Lu`5$m77|%df4h47t!#pdaC`+ufL=u z02!jvCeBnqnt2BLPZP%9UJ1j^Tn=3ribRK6I5(p}k*##yyAQT{DS+hnuCEQeQibp~`88STRFk&5M1_Hz=!?}~_aSR~NFEeJ z;D>9kD4|JCRUVd2&-$1bp3Uf7y$pzk!Zb^w?{cf~sv=@E@TY8;IB*aNz}$Oo79$2D zW+rfy#ZScD%HkEPz}f)ykL}AMCh1g3mKU3`A!EreDB3qxv?$lT9a)*vfE$1ZSoTJH z0S!N;pcfYjeHNWm`*iN#gCY>J!~T@RZvqABix%X~zCiK3G2py1jJ}bUq3vhl>#UqSSisO9 z#h_yQ-GO1RN4ksLoP%pzAEQ{?V(=EL(B`x=G2`v6As+ANuel(GQm@nrmhsbb(SskC zv{Qw&9NK{%d&Bvm1JKj-^d@j1grU2A0kHnT-V}*?9)+w_7P77-p5dmXgNRIqsyoaN z1Lf$1DsjGD3>|MaNpu13KcQdYJPeZ-{#Uu?MWKp@kDw+^OQ4pMI^%6uKml9Km92_=OlYhK@+1s}fU(cNusIQ~b?8e^Y`lOfTQk*2D_glMut*^+Fz=AK zPvymQuH@gnP7`M=91Rk6JC&KLw^azP{S?3eh@SQOUn*$d*!{V&rr_-DWCVT*I{ zp&yKH?)$%RCksil1yS){6$}SaH~=Cq4)qD5t}dn;)x5{uubi3qtjmwFRVtQQAA~6V zZg=`K7%A*1S{jW$TCkM0%7*4?8f5z`p`+WBLeMAQIfI@^MV&d$=876v4kmabCgVW3 z2I#pP8aRD)u`vJhh;15+Du)|F{)02lvHv$4wM48~mEJs;(GQtLd^gmUp(cVK(aTG% zK2il~xV%B9agzAW;0Fhp3=RGro-H^*eo8-_D?{tg-DLF}@-X)dI=r@uQz!l3e|8^D zONf-6X#3*cx2{)*_D)XpC34H4{we3CE|cKtNfK}YJ)Hj(6f2SWo@}f|F145m$ZLJK zRqq0T?x_lIKrHn=-XZ*o$KIv$^VO4tZjmVqs3FGM953B*8+cXF&0AsFISl2jUPAb; z>N8EP;na^pMlC{%TUW!RfJI}k;Oat{?4x+^N}<^t{YclKsyMt@veTQ0I@eO%Ri`VM zZbn|^Q@+6+*Hokv^`2;WbDxIw(^YE}0s9S_R z*Qc0lThm&7t(kfGPKPy$n$Gm^e{PS72)+~!3Gh&_5Qv2uG3}0psd}m~K>CM%$~3J% zpg`N=TzM>UREqSingNdwc~itz1^<6y@XdA{6=7@C_r$`gX2v&6x8~xpO{h0+$B;>3 z@JmMhs0}L_Z{e(0amp6#^~)cO#;w3^EU;)2*>}T2S1%0?9iT+avcSCwEk2#eIN#^Be&cT1O{ESkT{9;59zyh@qm;p##rO&*j)$+7!I^ zf=Hj9G0&xu<#?}DxEfY=V9;MY^X9^dpX1pT$E*Mm8Q(>^dfv#@YDrJg)WCE@JU|hY z@!(CpVU_rZIn%}F!Qw4W1}CC%6T{iEPe7mTK>{PuZ3@!d0E!k&qB>3>Il$P->ky2s z4D;UF%kkF=jdM7R!2{d*iJ&7ax*`C$`F{L;SbE4cBE7m9ufytr)zKoodoeOIv}Uqx z6ekr`zGS{rpf|=MCmT(1QSrr>FqFYPiKAAna4L{6`Lykp&srOd2_LNEc+2=r_VXjG zbzj_LBpAm%KycO&QRoKgN*w*I@}|hKHrFgscyI*(d;vnK{NR#G3=VL&l%J!0zB6P9 zbRM7XC0!`-@^9`dALF@imp4+zkgk&dMY*aFZuCBb6Y$XUphYs(h%tcX>ANCug7Xxv zJOH_oUCNU>vXQvn@}Mpi_9w@lVxL`RTJ)+&B?O7Lqqa?Q2#(4PZIJdxB#P%)cQ^wT z;p76CWfsT+9*E3~s(NH2rcwtmA`Hez@&;1xaNPS1p6O(Oaf5D+autV09_2}$@(^S* zCeXVV{Ka3G@c}Gm_q7F^g>|hCG7%8OD3i2Vp@906jFzxNR-TtM6%o@2mW>O2DhE41 z@2mzCo-D9@Lzc+PG0N`8px!;p$o#!Rohah}gzj2dLbU2~8RhM)5`|lXjkaJkI&@)d z8sz-tS+p!*mkf94*+s)8rIh$YFS)Zm*mYDt@%F z7a$u%VjSFO4i$=IPSLeQh_|65n3CzG>M~RWg1BMoeVx3a%mqhc8Z)`eg4N2kWy4JC z<0735`Z|q{tZLWWDhOUa_B0*+h#7m%zU?`6Bt}Xelho~Epxt0~<#8(g{5AHTSt}HL zQF_Q8b5*LZ%%-e0(>bw#t8-fvW~vx@Nm$rFC4meLbq+Nt{}obCgoCaaY9-zFJMadH zurX;#%Xl{uI936%1#nC>2(WS*TB(9BDdt`q^o!)-tUn&VlYMqCsHChur=ZkG0a+XG zhrH%Fr#zFs|Ft?YDJT)ZKjV4C` zDqy0_bYW)L1=n59Y~|8wpl!$&p+v*;0nnJH3CsZptB&w11<}elB6oC)ihcTh0mH;* z`4SxaXZJjp(lpXhrlyZMoj$v>iD4pRDq0Q!;2j2rbdj!A{F2Jnv)zCzN7dh46M7+J zA=CtD8uwRS3aSN9HPblGnvR|-g%^~X3J?=o;!#R3&_58S-70GTCo&Ba05Y4qB82$Z zSj3TvejVvn@h}h@c@x$k1=W1Bz9Uo+Lj;LXvl3bmJ33+RCkM4+Z`fTOPsduj(FEC; zBZZb*%%kDN2)ct7kQ7xMdpn>NXAgGNTV_K` zWT%7qz_nwz*SE*aa}OuxwtRb{=b@?~-k5HKGG@Swr42H?o$ldGuX*E5^tpR^whYQl zEV;m_ZXEjYj`LK)aFvbFC%4U8LF=QeJg%;&D?*!;WG4^lm_Qp!@CS~yEjLBs6NAwcCcH0@GY<*k%4!`R-Q6p$1FCf91!?kl~KiGj! zX~iBnRD``ZI#{antje0O0wRW!x)2Y!ZW5${ckiXPL*r)pg!SgP1_)S?QA$;f#z5}K z8lWPdGp{gB1gq4KR2~Ll+4>sgh|D*n5=8rQ(LMeta5l7)6u^kIkjI;4)cPIsxeBpq zHY0;O1+gyb$!@PLo+9R{BbyiEPTKu@rK`Tj?FMZ#Lk-wHR@k(CZ-pSp+i^j6h)fig zHRNtCqmy)GKH~HCB%J;mADKx{G{+ro4%`{+ZaoPg@1(TJS=uHYXK;Bwc)jgc z*#5&5x}0SG)(qqh<;2nJIi$r z*`XiHPO$5loV^N*D=^k^$2bL1A24lc{Ztab^G=rXbK9G6fl2a0SvI5@gIM)e7Fbz; z@*;B`a&V9m`X-zH0z>cxQZF&kwM8%td=KHmQJeVbn!YeQ(Xpo}n8+A05>dq}`M+tH zjSm0#eHFDVZ}u8ACe0b|bE!$+Y(!9E!&@Y?%}7ne$voJ1+zUwMm@p~hjt?%w$-bzj zMVh^)_<{=O`HBr=$#^IjY!!sER&zUBL8=?4%tnpvRC)D6P)9+>ILQUHN!0MEL0z1- ze?L)qBQ0&WTu9wNS^-DbMYN&)YRx14hJZLuwHCQqL2o!i^pRiPf!cMJ{BAc}ncr>N z1X2itmgbfg_l{#a#E@D~2Cn~EPt=$7iY)dIfhw zEew;G)vA6J)UGmE}M2$fhJ9D58Jt;Tnh8Ncb|R?i>lXx6}|9~5DfB! zY0j3|s!PHP3Bs5yK|A|gDUWq}o)QA!E4I{;p)|@W+1CJwjsi2WQi#WqE}7BKm_{@z zzceD09*j+%y98RA7wbH^$2FiH04Puai0sF{QeuS~2*Ew3x-~iBAQwqK=3fO$D=4W& z*WJs96uxxfk#Ju@LaiuDS4iiMPf;=^I*JPH$z0x2)OEmce&ojucaxTJkeJXLfFZ)v zqh1RvDyV*%@|FZa1jH$u;db3fE;0Zbr{C-l=q2q_O$2wC+>oXqq7_c3O?P|@xm9;^ zM?Nt-QM(vPfgy2>0U!39Nknk9q}wBbDg@53eO*+j+SHE`Y^u4p&=c{02=zu%xB^O| zuFzhMlxc5VKbpdAmJ{N7iZIYARf?A#%(hO>t3s+;2boZDTz}m~JsoOe@C)SO%yHwK zFU^vSP35&4B#fyrFPD4_P3#7$L?Wj+2>fwiX00LfAPVG0YrOdt3$F^B7yXU43Wmr91NQ5j{wW#|SJ)rY4FjEFVz5+{3jm-gK1L{FoNLdp9fnFOTlfqYb`CL#XIT?lO5g zCAo#2_nuu6$z{*0I$y=K-l(r404YG$zfGZNM(EJ;yV z+#Zn7Ec4jfOfB$cRWE%GB0*%%*A6^ZDbbPc-erlwf2bK(zKa<1ZPY`}=+?r8CC6|e zvcK8dO0PxY{6dc+(*Ztq=94;u7RRfMqz9V;PvSEh5`KPWkH`~yOi2zmHg_jitV;`+ zQVh*wxDNcS!JQhC4$R)=qX51|o084|4y@$Pw0^C=Cab}+&~Z_2v|_1#Gyguw;$krEFDZz6Dei?rQ@ z(NA~VFwuDxQZ-kUoHoi3Alp-3*3fqVSNMXKd=aG_$ z!T&#HW{yzI&kffimmV3?x6+Rd%-0H1n7f;=PQm8I$12rzRPCVIZBp4O*^n@^;)3MW zhZ)5jr#?aKQgwdKA0{(SXg}jV4hh-$hq$A{6gEYA=|V(7rme|II~xGSoEdkf;bA)c z*_@*O<@R(VQ3&|Maw&Tq{Msl^kIx-SGVNUa+|8{v4RrAn3|gl}m$?uQ^o>Eio&9FX zEg%;Yv{3Zm29acz9d-G;1*H3WXjRtZzg+jV!qnnMV06qn$aOda>{={>N(Cc=Nzdm> zh@Z!2sAFM5=QxU}^#pa0fo4LOhqWiw4xdHW+iroi$?xPy-QIrX0G@s0CR{30O=|0B zF(ujSQ(ru#ZF|-INtmfmiD~BQHjfGH#unzIpDJWzOot?j%K#abun$**q}dsosPiU{ z1>vEsGllEsL&u__!Ax3QZfryvSx%COn>;LL+piPhjvTI{3|z~lgqOc||Bs5lsYis< z+2iNowzSIfl1Yqp*Oh^B{#N$1)M0Lz1|^AZe1L@D)^KidS0~FjaFUC|p>r`L02c1F zEE{SBScAE)Je@Izr)xLz)1%IrokE)&B$xzjeQVHBuXs|GbLow3PtAz#b9yCvfGEos z8;bgZeERnab~4wlRYY;NBC@YNWdhvR7MMhv5gKt^Gv0UkNVFPl37K7db5R5%A1!I z61-^IIx0(Aa3Gf(cOOr>qP%_mv^cyB%c92WgP7CZZ;9ZK%kQ5AA1(vp(4CQ(Mf$xj z8(JqdtssBqrpKws{?ouA6ZCYW=CYfQZ{B+~FGCxH;z5194pR{JS7qQTXe&}CrZxmG zXp!LZyBSa7%l0c{1yOxX?uUmLs)+2hC($gey2ziPHYIpfnklo2>~O%p03d#+EE{|! zP;r`8%fD&d8TJ>m48n$@eNGvtK%Zi|ZDTLbtR0^p;sP{9_)+vIMULT=GG)3V!6UZ{ zOmnc+X%OVK(%x->%TK!Ks?t-SuZo)(RlC8G;3|Y`Jcj4V$DO~`WkNx&+bBLqDx333 za~FaV17BDiIVxQzKJIXVpKeR*R!_74!fIBs!5z2^ndM5zWFjc;rJAw( zMOlV1`q(rpqVdBjO55jNj0TWnN^mP_@rb7#NNlTNG z*j0C%({?LN1v9tGWRxlFzb=ITzO>&L%n50Zc4lTi3nm6SPcW8*Pyc=Bs;CF2>$9n< zq`!GOG45AJdlxB4m|GE1O^Pn8tOLe|m zLUD%a=BRri$ep)5afq{XWCsl>?=&5jSR&wJS=Ycb4FsNU7yCcPGamaPpBs^D^``Gx z@F3`O%h$M>qKiim+YI+c10yhC3X#W2n4mV5NZ&$lV78~`UqOk9nr4Ml=KO()~X;$*zhFbm>|zh@^?Vm8gLKV?cqdo)13{y86u1bG#B3sHNgwD0tEs~8nCMb@DAr0 z`owWYo^GXO8+J&C$-*JUjZ89OLyY)fXSCfOqk&#lzsKMqJu+orXI40yq3-JnZMzL9 zJhN*cYIGfkQ=31xJuAm_k2J79cmr*+1HaI9{Q?7nSf_#ya~sRo0j~cwDC-StEDR-T ziO_jB#$?on<^M2F+v)*sQ5zUy48G`M~Jh$`O-@^_`ZnQoGd@1GmCfAZTGHpo_O&`Qr+S9pQ!Ug-KUh zE!jRa&--f_DP%3|oFJjZXEk*oTKznOo0f=8h{aiQx)wNpP3ZVUU(oZn2dxpI4fW5P z?w|{H()ft{o%9)=G6HTy2bPE-X6cX*)>%?tVWk*elKBbvdNCbfG(GH-r`NJs@s9>c zTa0OU%GbZCIF$~pW%*DBANymMw3||XPduQ;-{ot>s;c)kJ*2{u=So)YTpv*bf;4O9 z2jQ;c4l(RVuv3(TF8!@-5b`stVM>;qvd#pMos~xCO(E_6=(=4tf3@H9h1Gskz+qU3 zT%ge}W6DE8xX^a}BuAk-&{s;N(t$|?;Q4dHR?;$0avrduSU6o2L$=cbY;hG5Zni_c z@E_Ui6$SNR3cE_PKyq=|mAF$BEE?lVjm>;3M@fQzQK3a;qu}5^x6A(^u)8YJD2C2aZ0a)FGf`&*Xp1k4WR_wvxc2Al`9VqJF zAUgFkbc^Q+-?D+cFm0tY=@Cn0IG{68HeoM}o4UW^eUeP6&dCxqx zcs4X@DBG8MQj^PCF-LLHS{*c|x)VStnH>ENz~YF^wbFY(%Mo2ShcR1AJ3K~se`$_J zGK9rOiH^4Onk%)tJF&B~+Y+YEiohs8hsC=J#$5pOViMt-`KEgY1deAWr&Q77!S!u_ z`hOfT5e|UJqk+^ISvD>Xq92=v``c#0p`%{trDFnq9DRPJY=)C@oh_ltgQ|Sd`_R`H zvC+!&@pXXCZ@?ob%N+zjy=`y@U!o37Et>x$Lok2%FiPN+8rrL*Md&{9L^>9>_6Uf~ zfAjW=)^FP!ix*%wzZg^e90b`VRABtioQLs9CIO4!6@a zpV-B-7nu&T!-aco<4;&g7T?kouZ{8z3pwHX8tcku*ejN3O(StjkDAjaO|G_ijHa+L zw-Yw*O1f6U*3Y0C^L`K3Pet7pU$W59~#lva7C!H0Y9yuGFM35bQd39j%79>>MtMd})C zm2o(ICrW>aR%*sVejZfS=Cu$7s|R;4}H_YTKRd)Cf+l zYF1&fQ-^vlpRINRe81S65=B-`D5`52x}+Aw;#gV{%feY8XC3mY7wIJv@S3J zn`#%WgUuj2!pIp#5Pk`JAJ9MWJF5@AC`$0azaa_ddqsAjTI^#Tdowha#X*?^#nS(S zR?4h?bw^RmmJ{SiZxLP`#*;0euiqA(R-E~_Oi{FhYH#U-yoreAPWI?!_@4PKUxq5pLZB|9Adk%E@ywf zM|~^F#t?9!(E?xoBh9QGw!;;AnVul*KK&pvS;b)Ti==2cTgtMqn&QrmIuV%m=vB3n4-Dataw#Edy#Rl|aFGcqZG`Ypo7?|B{V<_L zybJ9w>iKrBl4(c4?!d~>@9OEnQ!@o6TR(l2{IV&ntO3cM0GNV z=ljeT?UevVv2?p1w*J&v_nn1Ns4}dtbnRmtz&8IF396?l1h}mnD2!jy<*Camogj3h9VW<;`kh0l(S(x z=tj;7*S>nS$O3?hk@kQHU_4^)=m?_;u@2dIz3{Pj%l zZU0-M%Y!_EY<%{f7<12H% zQi&3$Yynszo-M;Dg{>4NhmF5;@@tgL0ai*BqU{g5O_<4jhU7+DA{k!5SsS^-@K+y^ z_MZR$6^i^OXu|ADMGj8Kk?{Cc%{Gt9KQvV>d6Sy$6aM&a{aYS$2LV8UnW@WRXwwmv zdMtadkkdz-80oK5i)+Bt0Jce`b@)oy(%-~0k8YnsyJSc$K-(aZi8AXBGs(Uz_z$(Mc zoPreMjpNMjOJ`?I`HmpqnA|e6SRW3gvTq{@c`dHkON2!<+{=1Jm?^vS* znXL}>L)GTll({mFpQ1)l;0*O3Us%}o9h#5ar$~Xbp-tRv`u`SF`pi`x^S2@DZ4byG z?wRP8v&~7~{U*BAF5CKrPpw7W0{ErLTC@_!Xv!_alw$Sd#Fn>)R8;?24tw(Oy%5cy zki>f$wrv^S(b$f*6F%>t*h86bwKi-c%3c`<0_dD)mtEote3BH*^=Oqa^(=(I4}b3} zfB71773Dda?Y3OLC#rOiL??{BCaJX|!rF$3fKKOUiG4el~MXnpCTs*{Pw2AU2p z32c0g8jfxDi{vLa`5PGE#C&bL`WDWXFx30(S$eB0d(Yl~2FBJX6#-z8gzOvtI(uRw zF<&OdEi=139DeAU$w_ywTJI62BwrGikh;ZWbCSt(E#dmLL_-L2a8KkUv_>QlAR5h& zdke{`vxh=tv>P}gd7#^kvMo|VDVn{K^|&C^;(3i9(4|QQ6pabmN3@0NJu{*Ib_}iU za2_8({FO-otARDYJ#-hBZtUIHTE1<4c^IA)3Ee>#;&hm-sKt1FN7rfY)Y%p)9yp!d zf_*s0_+|-hXB^mAi1VV_?G;gLTT=?st(DXZ>XFlcEvYXo2y{OHskHNSuTqy}eG-Z3HNz7a5=t#v7(VS?Dy42gH}sPKd^Dyj<_Cm2VY4n06*rb= zRX@rO%M=^i;)!}-iTfR|21=s(yCzEC%If-%u3qtP39}y&J^eIMWx`#gOUakZ`uZq< zptGBGa5n;bWitBbr5SKAZ4T2AZ4nhSp$x#MR705CC>+}J8Vn;`FRmP^>A$3}0i$r6 zRpV%zaU$qTG{NaHFFYp=*ed136Yv6HU+a2&o>@g5Z3`JeW zQrIafrb7&>QXug}OC<$c%m9O-Aa()l=cY(dv_;$52wRWTH|)23$G5nJsu0f;yCRi2 ztZ%t4Nu5qAx{++xP#EOoK6bm&a8q{cE2s+V7Rjf*LVS{*i2*&XPD4e4j%ZdhJ#HP2bjJrX>7EbW2ok-;&8{x_YRIkuhgb8 zXBa;At!2s9y7}9(`%Ey36=7C&vm(zElCaC@EuJg$SCTwwtSQyf{aM#e+`i~U($MPmuL+6o%!rwfJD zDLyNlTuUE6m`%+$bSmfxkbEVM+Q)RV2Kib4(V`m6AQiHhDOqg{{@%@N&Iz9_T4KPL zE$u=)wOvoP0>R}4aqRAIUc?8-#Zy)+SOEx^qYErLfMXXi+S0d347#21P^lV2Q>Dio zyQq*ef+YYHS(atAG~q+2N!ByaASZt-^6FIh&IC2^ge&@TmN( ztGAVm#~AM)u`Dsdl`JC&HXB!Y9ntGKZO^Sp9Zc8vsbBsAyf%P?py7Eay$we)t6Wxb{Lp&-_)k#Ryj@REH=ZS#6|SPP8{J_t zbhluc_2i-h*vOx&ERjz_y<4VBUz40bQ!_5;ZWdFE3oJargKviyW!s+9pQ(qaZFOPr zb4J&JrX}ohgAFHQMX%=O#IBx@J`NctUNOKL&+;07*&^ZddAd*N;Z@eUqA(_ooU47< zYNAMZ+ft=bwX-~YL1fW_f)w-{x{t0Lo4?bRl-N-`1KX4LzZJ;o=+nHAtrvQZX(Z4&6(?RLeAlHc^6@hmcj-qD8_KaDOsoJ;)Bx zs5{3#W=O?TvJivfou6K~%R0yCV}lvyTd!Y34jCacJTYnzV6H5q@UeTuf*X=CVR5gl z^j?OgYx8V|-c60veZFy>COHcLj_tJy}+> zQd7sfUs=BBF6uLNwU;^v&HEBru`)yOg(gx=91>o-}HYE%c{NcJYO=uIW3gzgh9SRh%F*ctv=MMeO_>RBmXaCVRH zN~t*~;h;M;Xi8tWwm72CQ=prS0xnwQl-i;Wu$S2AqM$(SUg7FaYdqi189z~;J=6sX zq~)r@N{|xV3PvAarLpA0?KYVX!48kDM{qN3!1n)3r&G^N5gL#kBLjRYB$UFLzz%u1 z?(LiVB9(oE1G7uOtvUBrj4RP}q8U_W^B=2?ZG_CkbV1}7v&L1jURZswKdCK|W!`i2 z*l7IYu{qijWp!p*AZ3!}ScE6_iBlvHL>6-qDP_iP;%9x4K*DCYe~~cQ@fg+>opn)i zovO25F$QEus&?Xy64C%o-YAr(2q-!s)m`0GXPTr$Wp_~n+kWWtyvqdAD>s*Cki4&l zNXST*8O!ZAa5JR(FVa1e*ZFF*vlo_#aX#gH1_q;}C_C<<>_MMFc;L5be2H$&#jD!% z=dSY+ij}&qi$f+hhPaU0NGaw6j;x6>wGnHI(0YWTpkXfYcOxCz#?0*=R z+!PPdn|~HEF}J*+vJJRjfx#+Y0aO|x!sPj$xcZMM(j7PJRD~SWm8~|K<*p=EM@BRP*5pEyF0Rp^ers|}NRR(^Ky>`6xLOHY-LHcAT$Hl3q1EH$8 zMpKp3!Ww=MLz;-JgNVH^{4r!VpAdYS z6NCkAGK$7_*QK4!1s}!BeOyJ^W%U#jy-=WpGCf07RCD9o*eJFehe)3#3Y4PDq!@)e zmd$g`&4&Gd((r$dl+-Z7N`QV?ZBO==YHw|4ZG zpM}th;7VqYUNt^}Y7tg`D0vvSfRKLbOvvP~0xMiXoMzk1FC*0AeXxHfzY=7f`2{ii zZ%wG4nf=ew&`@&=*!^`a>Ol3CQ$XzUFNbHVFjbqs9ZgCVfo_`nEE_}WhbK~hz2}lkcc|em!L-= zMl45@Y7YoLCDh+_aw(-){pHC)#=su_8=g~Tu7Ecg4<@!y(;uwpZyQ{Ti=}pj))CHD^5}Lvf#Xj( z1A97mdHxA`2(g$I^DTKv)Ec@NfhH5JHJbUqOcmE2l`wqJ;)0XGC(`vq zPS0!Dw$osz;lwWSB;R2T^~bzW^&SkpClVpvj&|_RA)X-_e;uEnBh2J*?HYW3yNG4s zKriW$cUSIAMNP*IAx}@hjWQcSUJu;^evRZ0g(h_?m+HN`aaCYp;%C@d@5dRRNfOV= zX|Fu^B+n?(T1#3I1s&ZWz?6dT431@wOK)UDkIy5S6J$x>HvmBMwM*HD*^(%NatBXG zazu^I9rF{4XXE5KBYD>XN5@mh%9i)4oaN!vTF0P3`9kqaRLVo3PNvQ6F zhf;Ec5J*KyzKS~Qh;{EbT-3N5Eg*_p&yt#HMNl|`Jp{#Q{!1|2waKxM$nx3ZCC>8+|I`oDymR;q zqWicl<+gl9P*8-1BCt3zZ4lhiVRl-w{WOY>o;4i0xIZ71Mu)65KS~{s`B2q7CJMI? z@{%~kBj00c%O9FV2u;{z$0h2Aq<87jusqxGL1n?e{qHOY8v3kCty-yd29IWXcWo!; zdpKxz4G+B2B`3p94&6%_?}Y5f>Aea-Wk-P0HR8DkeLfhCwf4IEpj&5_`_VAtQUZTw z%Hm7#4>xZ(I4pi3-_=(#^#QBX-!N|UG=h{`di3rj-O5a8s(g_1BBKj>Tn+ET4>X51`W66Ol@oFHWKgJCQ8fZ?6#Ga>q*A=&B@JzWI%Ri5`EFGd0q&va z<}wBW9Wn?3i3%Z3G=<&%g*pQXI_eD%ydoy_V|d`Xs&1?W z`p#*FXvIy3#ybYO30H7qL=hJ?25>36B7khtp%bGZi#5fE{r4gLfkmm^qi1o{t$K3h z3_$q}&BZPSQn2b_ch!RZFB7(?jI!;yPP?pm0Sy$XS55YQ$z(S;+rofeOt@EU-gUxj z&tGpU`PJ@l9kNYHajIXpHMYIFK|&N#J6~R&N|b&r&H_uEjo;7wr`ShQ*tP2!WI*o^ z^E`-H4m#dG3^PC5il5GAX}OEP*5Y$Cvr)#V5VW-^C#uJOuKubd*HZr8i9OtF)Uoa3 z(m@^^y&BetxOL~DyHnQ@oC9$Ld})Ll`^A)=8#Q;6h2qGI3*3u<=2&eEB(0%bzVdCV7 z!6Z4Qgeew2^(}o8DK&ymNg%n)#9Zem(*n$(|C7jUaCuk7DxWNnEo+*%GUD?}0klY0 zx?}w}usBY&qskMbUU1Lj&IOEBK>vl#P>Ha1@kF^*=2I=d-fi4bg`Mv8o6Z@mYN*Jija)S7wy6!@*WNc#V{wnt3FA9Hz?WK4 zsV?O(3h*av#j#+1T7%yRd5ZAc@@1dU#!|QVC0kKcZ*1$PzfsxzYVa8#yDc)+k<2@U zl`Td}=Jl)*+vn)M=oK@!O!kKwZ56dN6`bgViZCl3!oCfX{aKP-=^b49q5Kb)Tl0ve zD?pE&%1desXs=t;sc8}P9g*#yAFQ-;?5o`u3Q`UUP}-E?@}R89l{ro_^;Ezit5WKZ zi})|`G4D14EMS`Rd_$+XDF$n)&rHO%13z}~ELprMx7OBy}ZQPa*Mu{%$ zHZf`I91Kv+_&R>o*^hIaOr^vYXy66bpeneQjVS6)Oj3WACD+KP?a2NzHmUXEYWG)G ztC!sE0&z!%TbPtee?xdV$EHKy2&UV4VvL|_n+mFGEi&Hv!WwbEath-9rl*4!n>J|P ztn0Svsu$Da6FY>{J=^{34qKH6Iv7_Yk|*H=BouJ+R)6D<2?xg9HR~1~&ThJg^rs+G ziZQq4lMt#OC=Qj33y_q^)Ac$|_DzL620z-D3vD4=fNOUI7d7`oL_5G^2;VVqw`l(+ z6IM9h<3zrF<*0JF-Og+XfmoOq^Q~DR@JF_>arF`QZD*iz3?~z1S$r?CDp7FyIbdTl z4@O)#GxP&#l9Wrk{cgZm4?6QUy;}N1eQ}ep`HRxhp=FoJPlG>sH<)qt4==5Y(VT_R z31J{4yt&%oyFBdQY4V8%H6Fp^`K|L&1pr4mt18^|wFHPu!ZO0R&TJI<59Y21m^=6e z^E@TUrC`n=BT*%ug|L;L(;KAC2>Q^n_G{(zzfI4;KP_uDuPK-J;Ugl=3;*Ha%FEpz zS4Y7EIUR3U={7vpbLk*0R`iXy;Gf znxSd550&SRgJyi3PveABR^~+SJG1-Y_fF($|IY~+`ri`+w#jHr&*prn#Lldq;`*H+ zKe1a)40X)G&HBMpXC+T8+zhRh=d^3Z043hkO1eD}5rqzY|D>r~IyA_BEEW87d^|_x zw|gb6Ncq6?L8?c-&}Ep2IW{eYvp_82f&cn6V2&yNk}KX|%s9a}0lFdsmyS!#55sC4 zHT%t3F7T++e%z5RpjtO(RqbFSUD-lPD!TJ8M2>FQhgT~yw;$z;m&gf@uWODfO#D=L zHY(pXwsu*WklDo7P0OtDUcht+k~a0GR1wkj78?O(*5UMtgHF!GdGm*8o#hwLvsgHo zx@ga*Y7frHCuz%vL}R=9oe~DuPkYh#!8pAYjs&;v10{mi%Uj5NN$5w~{`$<2L}h*j z7R|Y0amA+fS#{sFuJ$(Zi-fdo!PJkrp$t7k0-k|Aq>2xs%1Dwdu%H4n=(XhqR2%GIA0p5UD|$K^e^)1`S@ockeLHtn`C$ki8`Lo4*y zyKt?r28J7b>oVQxgbFE@Nd@~_k%1*6H0`k!-k+X=_S=6$nF6dC!JW*h0Cz9y0xR1O zXSfd+HSVd;7t?ZcT<~#0sE-rC60g`89$({**^rWU7HSgqeFifiim%!Oh4fdBe+`Jt zk#*l#f^rg*lrmY;>lqfB6|M2V^^Vsy)=UR=$3|Gl$Txm&bRy=6MQ+%#@OqsWZLhp| z!Y9@WZJ(y+q!f3NXk6ACpkr}h_AyCUj@J)?7v1Qb^gwj+GzBVo8K~*Y(hpqlLQ)jX zBej=F)})9HKH1OimA@GM9t8WX0?1i{2ObkBNdK;@!Mzs&I^^2?6QQ+mmI^|dfQGh# zGGN6V84rMI{6|DwPXfdNZ#a z$;FacRm{S4cs(eS7`J(DUu*U3IQ0g*&(G zYrCFWI4TNdNNi)fj$afDczo-sCO)1Ycx}D1P4}6={eTPhB2&{G2s8veC3CF1poL?y z*TCy*P14)SC!oJ-D;ZmBSMEMuUT+)SrIWsK4E~tco2C{&HoThuK;e5R&@pQ4ZeP4l zqrwMo@I2rZ=czpr>20JAnRG_ON9hT+%Q-2MIR6RVyRo^>9x`GXaq!=p=s3M4GeVhi zG_gEMY8yG!rmOTa(EKgZX%e#`3Ac;*xbrI)v{w@Sbg#He=Nun^i(qM~{xW(?UO&&f zD0Qm|viFE8UDDjCu1S!^VB+VYHMyA{&7_qo3!u5u=*rGtD6h5dLB>QaUc^Lp9Wsf` z_25+^;D#1%<*~8xEZ)U9*WC^Jpa^Bk*syg@F$tX*^*IJaVr#Zx`o0Kj9PZ)7*xw6# zK`4(8k+Pmhz+O(^P-|)cl&g)RQ;J#Hcz_kZt3v%Yx8m!E>1(0EpVFMZKH7Ky(ZMZA zO?iP_xB6D^?-FKzCcf|n8_PyM@aH*%HSTQ6vU5|XC@e5V$z4I~P~s};u;#HV4{9b{ zf{wRG4Qk23_R=D58N4ah*2|OZJ&5_#c=7UyY+MbBpTQG6=QJD+I!got&SqeB{Mx6Z z$n$lm;y%TX{^`FW!qGBDB9(Zr08XDUen0=I1FhoOrPyItW`f$pIRCr#PlW+7r{{xc zX+Jr1!@9)kyuTyR>?+tdkV9qDGU*u>LOM2IVKQE7)i9BHs zTGsZDS8er&0O2cUTzE|E>@mm{`NX~@+|3LA>`ZBLp%SLIN+AT-|ONA$;_l=b})uVbv`|Fv7N(6!qQ5Qn;ySz$Q; zI!ti&IFt5I${52zzAU|f4Dy-%%4G1O75VUocI%D zu5FjCT2;IT1>QH+@yDk7uo3FFKjMW(gfLcs(%l}wn=I0qs@ZTAmkRl?dXwHwOz0-t zV)LRI|K~qcybMsX6_OnDf~a0$R&(m|p2G)y7S&jy2vw&5MWV( z9j1?qX<>KTfc-tM&)({R>JTHZt$FMQ$exLw7s z^?p8FY&}SKI%m*3ku(ca!Dw%0#rG(P|0m9#;98G;t&UuRxzhz&Ui^YD+k8Lbc^!U? z$btX%$&&Qv(Xb#}Trw%?4|qx}!lz&>%NjBa@wEfe_Rhh5VE67MVCRC5g(?L#)zWNA zeutG-vl3RsSr)#JU=O-bq6KarMlM{LHk`)JFlV=924jkweg~!9h9UuKU%Pwdcru#5 zLwM>qLgl)7ef%)ZZbRe~Ju1(=bahsn`wD?)900srIx?6i0XL*LR*CGE$Q18u6Wk>+ zY$Gw8to1t_Paj_yz{~hgIriF#prl%NYJ1oF*5X*fy8!)7CDLK&8O#Gb#)v~5cF?Da zcZ7BiG1c%M585YCmdPVJ1E9H-XS4e+2-EQab39D*Qs5tL%lcufXo(6%&xGt(30~(d z^)ki;jI$YcYmkpkSFza@ej+6NKDNcbow~RQQPH}t5Hbx}JTT7t%Zp-0wOL;G#K4#lGRy-djOh# z>zPQ)tgO){9v;y~Pd;@$lKW||0vrjQ<1KQR3b>13@b_aymQ5k+PR1u3U?N0=Tr~+6 ze{ATtzAS18DaI)C$Rz?0YhRPH%eaoB{O)1jAC~Z^n|1fPzE|YQjhz4njvbH30ma@i zx;h_e*mu(}O;z+J4t?R9&YRc>b4Hv!>f_+%+&#Ta_kFn9&1gH~#5lAdZwH~&l^Bb(NkCq3unysj{# z`M~G4Qzp*W06DIqIObD)%R>Adm*>heGn?x|;m>wt0_^$qu9_>hb#NY&y~XxR?vEds zjo1K89a(>tIUtN6-k`wEJz+1HK5;9za5S8{j*?56WZ5mNDWF7i2CCzk!q=u(v2re# zR{k3@O?(xNSF=fPO^F@1(Q|)kOymb-{Kaa69Z|eMoL^7oJ`e31v1~&Te)q3y)FA?1 zx@OVH%a>38G7Xv9+HZlc01wt(3j%^Se9+xgwza?jaB_5T$ zcg$mrTHjj`TJ=|-etRar@cCxdy*;YRD`2kPs)U`n&zCN1lNS2TdNldl-ItY(^jGJ zjdtA(Z)aZQCCn_!<-*0+7hb8QOO*~WI z0>@T(VRG_3Tp9%+!aZy0iS?`vD(*t=J0MLLZQDjMLS|Ry+q@ zOz;K^Z3aJ_xjUc2fAQoANKY%3fBuYPbq0BD$HV?cz5VkJR=XHG^eg()oi?!&rp6f< zS!+vQGF2*V-c}zHl?l%pn_TIfReS-2t3V;;gw^t59sZ|gkZ~mK!MCQ`b$nD1$3S6M zxp?~}^n(|K4|D@0R|sQqe#Xt{gO8t1Eq2VM_pSoRjFHgU5wD4&Sx-QF? zeKygkymL}GYLO3hA>dv8O;n#Wn}?=i=|7{8GWe5h4oJKdu&C>86YD5=#VxhXuhYqD zr2u_3rb#!sAHPW*6aMW3I4KVqKD6_0>CWUTTheQ*USr=WMc~|M)Wrzs)lgZPhN$z{ z_l8sdY;GQwg!6{|)s*$0B=tW?0=4QZ)3#Vx@$%t``rxAdL4yhcup41aO)od=$hH-D z1QOasxCFp+9r}Eo{8{NCZ{{>)+c@~{(#kF|(>g8`FM0#>*+!Kb!Xg>jEpP1v;sRC$ z-MW1Fhs3WqpSF5W<-{rP^vz~E@b@OtyQelZdNOw!719{LK(>|x0isb8WPVeV2IYns z49R~7GKjPT`0&d5I^rCG98%Su@31?6*~>*zAt_HH;ZOXd^kH%C0|jceO7nK`nr)rL zJ32@E)|w@Jwe?wY&qIB69~{k<*{cHdpQ~yVGsw9*5}_Xjs(Y$phep`Vngf zkHv2`_a(`mfeOx-;31p}JKJ}|W=l$|_fHL2l9xmUSP#eB{n=+66Hz5O=ur=pboty_ z_-A2b?TYn43tzHHiiYef7YV#~m6jfpzpPs3e0!HtYYsVy&E_I40C15CUUELx=m%*> zS=np9z8m4ibfT>U55-djpF|LY$GI2b$F3Vn3V@2v7IEW!i-R)~n~1#oElMR|cDG`1 z50}Jzda#h%c5)y2-eYjuqeRmxykG#^{!MkMsH3~Io5L=j$g)rc10|u7BehNpD=~HE zUhNbJG2)1?RSAEs!-eilt?7=Bc+kZICU`-7fTx020D=?`)$@^F8x)GB(F#Pw11cgo zvPA>pZ&UYjGD;y2T_?02`{$maf&w48QGyxbKZQS>S-EI#z+tzh^H1{Ot=zHOTV-aO zBtRSXFS=K4b!w1s5V*F2%3JlQ()BR zXiDVe{f?6^R}u;K)03#GwbgV(=pj;LcC$r}zpN2yf2~$GbNjP|5eifU1#Zu7xG|xu;UzOxmZ`I>I`SMo`%m4Q zQ{EvqFm|+6>I_L{c^3546_N9Z71|;ND<~##05PyLw@XxiVkcr_B zD69rVrvQfS44A}CWF3>0{Wf8v`H>HAh`!vMI#PiKTO;VGwaP=q_cJVUy}MweJ#1P> z<;_IQBg3b>Po3mnFgh7KzadE%0MUbhzcb}As^(hMuaRWXtFxaf8ckR`m3ZLUxOnYo zpTaB?d=-4jv-%=Pj&Gx+2Nqu+c@C!O@yvRsh+sRX8IFtt$iT`UYuP4dI|962oN`2n z)XXW0&VfR58p`RX7l@eC9Bxt5M#vLe-TU#|ajisdYHLL3h%<=ilPAU%joy-Iov5;1 zB!+nduMb<;rBkHlCZ0~O{r!lB7XFfZrxc7Ek3z%-+@4?hbbHgw`&iP%Fox?xpC74A0Z&NeW8ZR&(GeZ+V&N?(&N_F8!cc6IAkN|kNJY5!S}weh8jcPTzJiN zt`(r()(R@hgxc$YPi70S*eo~Foo6ZbYFxq+iL%|X9tv02!dgZ~COgVRO6O;e&3eGc zNm*8$kF7#q!SG6fs-P^++G^rfITL9{Q!(|Jy6H)R2&Qc5%x zwjIn^TjoElHM`Z2K(gQ&nio-#z`Vv{KuVNe@_LuZdO<>Vj}gZyRF0A@(PSnnTB47# zPyl9Pp3yKu^35SZ05F`~vNOuTkl0#YCMEA2{}$n2^Q)p*wc zb6(PFFaqTTjGa`DZ-Blx?{IvI)~Wa4(^jrNSSSC&&yfUz7=wY2aexkLs20B_Kpc3t)41eP{~G*{+ePd;_~Y`dHb z!O+sk$+Qr{mu6A0;uZPx?usx#q3OUjvzx6Su|=iJfk!WicnB(CALzb9+v(NK)XwPx zA1WfHyH;rvNC;#FOzWi#Y&;;|RXxv_en9k70~#kXEK?7wifFrW2^CCvRa1l`(Mh2g z12r-gpR5xg6}q;x9tHymi+-;+#Z)1N)0c&L!%bAq5@-ZFT;T!e;9WLr2ubV#>DM73 zm{QH~PC4OL3uMUjS8I+m{%sTTKH4M}sA)K_?{8uL3C4~rqxV4xR#?{4_R6aC=GP#C z!S=;sGzE6mvcwf#b%)7+yV{ijF$xom>UlF!aeYz672QInZC%=H4G;5B>RxHGpMMoL zRJ?ezT z@5vccL$C6Y;LJuoI-BeQB_57}`>AGLSmaz6BdtfR$sTb8_nGc z)8%45Dl9rPU6ATUY^JMi&V%s7=ZXvVV^;3AFb?T%x?&J6>KczpyH!I=OyJhp-6m6s ziY-~JSzvMUq7{IYPNC^)vAC9_EHA~$*h3c3-mBslHvuOTY%{GY7=er{K_>F#*KL|z z2r@vrl_{Ji z_;)}1?-%KI3dc9MVztnCm<`7M`GP-gP;a2E{X3gG&y?q%gvQS$a$<v#TTIoH3z;&945wJ9WB8q-~OfA!kVg`Q$EotW&g>*Bn$o8 zx(|BQzHXhq2)X9XO7{-lk@8`JjoiaSbK3GU>);rM@$Vl3t?8$V9pZmYYCGW(15Y5S z71jx_B_R>UyTG)o4~&h*RAd`7fm65o&G8AW@} z2Ler`+`C2W0c0UPqM_Oh{t|oBxlPn8aLfRDdXn_r(oBJ%d0?$+JBF7Khh1E0P`Ca8 zc)aGPJMTI|>jRMse9D+VxqkU}wX>8y6Y&u)1wd^XsS?n*U}TCc@I_wBz^J=y8X4m@ z(0#6cK_-1ahWmx7J_6#tHo11zUVotV62}8f$8HaIGC&P&$@NuW4p+$r#goB~stPzg zn7vK^%Upi>D|b%q<)oKle!0MsXc<$7!bs=~hdFCw^!9u{t z{v+KT8bcmsc)lW-ednSC-1h7f|Di&%xSO$G>P^m&O?);A-u})Tq=MZriZc*QQ@S3< zJPL?GZS`1yHOmukQxUWan%hwc!gi8&7d8&s9#Jfr!ABePA+@4U1>^jBjrhM(_=)gA zVvXVYV&z!>YeA&7fZkQD`$^!wu)7DP93!l@_m+z>$cS$uMm&2 zhuq>pWBRK5lXM8lhVIad@@XY$0BeIN;v)=rRJ7oO62D-%{;>%e%Gg3gGgDr9Uth_E zw0_A>*L%0;rBQ@DfyBN@Y!xViqi^?0B85+^ID6v>7EEtAj5l6R%~R#{=!@A8hbRi)2jB)@W1xG zlTT}o=mviYAy`HZ?rDph7hxAF*Ql+gNjVnV{8O4&M6t~5eF&Or{1#teV{^c zAPFLIsSdCfhxj4^w{EMAdFoI{sai(1&sFkp4{?ai%} zljWt@uZ-XIfieXLwZKeb6nP$3- zA#7M(RM+%Mx_8r8{ANhpe|6+0_WG4F(>$tk>YPk4M6-AW2FH}Dp@%qd+p@LRSJHsB%VSK#W%-?nkKJ4Iglg9CFZm=Lq)oQ-6dzu#nH{vi5T-!JC`z=97(_1C;336 zk0w>HV)`hx|0E_?tQ7&?$qCZ1LvWO>U*$|F>UDmT6AJ~n7EWvDk{hbX%5a!4g<`~` zUyRDza34wrx<}!&%s$l!6$%rhkD9g_V#7%`Chnk(XH@QDj79?&_#->xsa;`H)2c(bjg#vbM|ssbz_CLxJGrrfUA$o1P7 zG^8e75usR@dzF=m5v zGSP8x$6@xwPaiuw+r3$;JY+Wr`9qBGDMYA3_RC)fcomPazjo+dxI+T!4@yWcXez(l z&hwuh@QLzdz-CHf&(TBY5Rs!mcQdRWgi%Woyd&+L!6OsK-FoV0mty|-OnY|j4}~31 z0NN`cmWO9*9bX5ur6J7?bv-~;e%L(R%0*Ojo8Cc()G{BL?V~ZDV^?OPLgJq_hk3^+ z-!PK#*pQiwuJ}b1;qr&vG@w=@=hNZB?#o}UdRH!eP0VV>`GRi=PDh5EPG?rkoXb$- zrHoYmHF)cn^KMh>k47QiE;c_yfs4>l6O5BE=i zySvKw+AT}je`k$pb5K)+9`1L_A&Srkkh_iS_-Axx)|P+{9VFMOY&JcbKbYi;`$F#F z>}mKx{bkM3Lr4imuxBS-{g-Wb;-?^e@GCSPK%wJ$wGQ_#iu}jgbXANvq(vy%)?Tc$ zALmKve4t9YcL0y6BcPKwH?>4fsB4V$HhJNHDBbN~^Jl<=xuqI3cJFUL(6yd6z+Hd{ z(({g9zYlc5rFC}k=5d}B6?zr=NS-6U4Qq^|M)!y(X1@i<0fUv1 zpT2sPnV}_vd<;ewDqMXH_dVe*Gx|Iw*y3X<-_zpij??7^Y)U2#Gz>n(?0)~^ zG?2WGFoSq`k*)yAbqI{^@3Pt}#Iai$R5p9;8S@-@(4hJXvlaT2RXUO8tjZQb%@6W3 zwpVYBnhO>}OevOT?(tHhg7jiQadv7mhoN zh|mN#G&gep2A0=@WRArnd$}?JqzvC+J$w#KHKV6zVa<}(8abm%g@4p&aA2LkjB@_V^-uktb$K7p=lTvFgy6^F zQsGrxsYXL9>`-ZY>}$FAMAc^O*>}l@qN?w354Smt!Ez3SNwsM#{Tw7Oq?CbJe5rsz zoOfBz|IsDbZTH-5D@aLZXY9j2yM^XfTA$x>El*1Vd_W=*Xx3~blcVGsT@{3ra3eZK zH`tfNW(CpQ*2tk3VaVPKBVrq<)&5sy}7Z@PS!~sv>Y3KlET8ZEg8#FA$U9kg`8(j*I`VU z9KAeh2X5l1*(Z};oJRq2=}`Sc9*dr2@ZYG9+r6;Ufk9^eO~Q+HNLcuOM>N8$^8l-; zhRbO%5#kskxZUZSRISSYqrimQ=_iDsZt$z9)zkfeBE@b7E65b14cPw5&C|#vSj(bu zL@0pRNQE8$SZNVnteW%H;PIU~nR36tr^#L2a_~zAcIPDR@%EGY3k7!iBP3oQy(#{F z9z7(Xc=WfsLof?crpaz9IwyVpEW-D^v*o2G@0;jOjeuCXS&X;;k|-4->u4b zO5wm2G_>97FBmFyW|+(hHH$?*Qb=@_orgb+etEzVM9?|R66$03t2)+!g?84)!7j)6 zLkHArGTQ{i*84lvVhP1t1&C>&Mj^!bfB{-_il~=v_2GR)y9y8k-szooZjju&g>k{J z1>jkPRY#X-yzqgwa4}z9s3}hgAP3c>woWI-kgwz^L+{3RmzsGwPZuDB`ooCgZ7dUN z8%$pAHxn-n{Pl%@8> zbf+cF?C3(+;``!Z!~Fqjt8hlIoic|~Br3IXaWcXfFrfo`uE|O@ z%(-+6dwC+hzlxbuFsCrw z9!n?_J13Zaf>_|D?527d*iE;-g26H2t%Lt) zwG9Vv#1;yEnzFO%LY+Q%dJ6FFAu%7gyFQF-2yghXp+vH2?`9bE#{nOTZs(FNyB}rQ zpRxM&p{?6*07GCxxoiWojzu}(iQ^>{skG59wIg|COy#*$mlaVrq9P=%!GswX zn>@a;8l|eMW1>nza%lJ)FD6t2;`k~_f57B-H3nQcc8#4^FWmM`lo8$2Vm>-Dlh8e3 z5S;pShxWnyM@^oiIA`^cTm1tw$Z#r&TW2WjXNKjJ8kgc(?o*AvPYrz`+lfS=4dJV7 zVK!t*v=YtF#-Mc?pDM`wzfi=asyWro^Q(oTyh2!rYCyV(@36qttWG0~%`YEQHJ;_q zVFG-n_I{Jy_jXt+q`cgT`C6WI>L*~{D~U=d0wSwtAg-K3l^^C|mJd3@6uR~pDNZy< ze~|!45zF)474`2RyhytQ+hMCW+g9NdAC|{&Os_^nr~HkTdyrj|5pfG;(*oa9zD%w| z-Hg@#HyT*mWtDG7OM=FSJpNRX{~PTtX~!>)+wc39;+6TyambTp3)M zp<8*#V+}_3%laWmtEYbC`a!ipyj-N>og#OZTh8%cU^){gJ$LjhS7H_59k>(_;xzuv zRAbvHXe6?e0}u85e^Wnb-Ye*IC*E=Cq)~Z<1;63&p;Q-=0->*mAk8m4 z-%OPeh9#^AmA2sRuCaMC6)ta)SbV2| z$sY>p_H?H#OP*_98G78{x{Cz15nQ@^!1a2E35<@oEQ1fRuL(JdXk~ur4<%y4;EcJ& z_$=(A*Y_*<7ii>!Y>wvO;pfVAk#lE$@HRES=cKBz+H9%sR2iZy+5&31&NVUkNm+bq zR!}_ctqg*@gtY_T)HvJ1nXd3=5@bH z44C1*kp7iij;m0|tQHQq9vw2CO|l12>68}p@&*N4U+(6aaad~4(4434&b65YU|cHUyXTg6ExtxH%0+s@tefz-|!p=cw=~}u$tRk*D*NxDti&+i|G*0Y}jC%zq7h#7d zOaxrmxnIgmCmx0_p+8Rtn z`r-^M?sl88x%!hZl7(NiEka9QE0OClnu~})kq0+T1O^V$y4~nKdI+J1sN^9Dfg-Cnx5*+s8c}<-I zBg;nqq|&G%Shn~8d<0!PR>{HgMf345J-L}DCVvCfBXZk%5`x&A)~`7>CofH!WWMY` zGG9Vt^P^TW!kol2R%nj67>ubSWNn(r31(f8kKJ)ToEFiN22p6(xL$&6o?+l+992wrX|9F4Gh zlZ>?)!3`xw6ZYn3^3|`m%t9i!&u!U~U%H7e3kD@5wq5}vW!pYr3S`Kw|1tg)>(QxN z?N~Yj|K$pGq~%AK>8gW72IbxTQY9*ctDl&4MA*EZeLhSemTGh}jJnfeZeuqkMD%<% zWJw=kg?j8)ajoDj>(~6=Yx6j6DNUqlU#WtGbKqqkQW6qXlmI0usAn-w5e%v^wk%e9LR;w4tDuC9~9DNXkS)ZkX3!uKd)cfPKf9&Y#4~YuIGeyi@X{F5b{6Y zks?axB3QQqX*bq=6&(;iD=!GO${pNzIz}A2O;Cj>N&rYTaT@Hwf2uhk#U)zN z8zU`F!>Swh5Zdc+{bm*Bv6$J2`M*p*PAo%oqw*atpst3@L;TJtAAV4_F#m*dJ-&i( zy~(E8Py)9bJ2vFv{p!C7*dm(d3FV`yX!Spvz<_@ToIc!IqA^Q+sM|h-I=}Z~0SaDy zt5jv~!MNSAzxZUUmYoJvsW2@9yOww;bw_1TsBy z?)*u0Va=qr!gO53*xMd52_0zDgUKatXrS@aAh^h07l;LT_6b7!m{qcDg<4_RsUX?F zCWYUTDyyT21c&W_5_=;~BhIhKxvmj0c6~g?|7vK6M0-v~%t>nI^Ys)Sk*BAAC=Eqn zUx0EYg(w{&uUwYfvaS; z=${p5VnfEETf#aIN*l^N=wc07HKmEtYa>*U$wKEr;@+tK zltN)Zre^!|A7in~j0=Ob*@Ta`nWs&bjem)-2;l9A6ffm~2VznDR2_0BehUYQ341ba z$8b>c`fM1eXw5O#UJW3u9T9gL=al$iVHj?w{c}hB{0~7(pYJJJ1ooQB&s*B9&m2R* zr3T)j-Ccc?EuI|p**s|A^)6i`(DFWi&%HHmNuYfM!V!_t5cH?(9eo0qrpqcPQ59bo za6bCq*jHNw9Z_d442~N{IIpyz`yXvm3XKSuxt_-!quI@LZ57Smo?1cvn7dssGu+9g zK8qUutd7NNjdX!eOUI(G@Ba82+#6s-&w9J6|NpWX9at>G36YPsrA|lYye7#u#V@?D z(3Sli!#5C8Vf^Ms$4P2)x&E=SBhmLq5DeeI=yKD|K5Vt@0s16BNxje zYLncMl~M7*R10~>;}Q!*huuOgjO^O@(m`}@wwtp3uUGR_L!zsR6-4m?w_N>Cffz>& zw8xp9T%rwlcqn3o1t#&^jN5|BjMRlG1akY;ahCQ>qFUC!9r}ypA+Z?kpIJasi;wb5 z4#lPAfSGE1k_NR_CZLTjnvU$DrsZoDx1=!g9|6sxjBc6s6AEBp30FUP*>j`DIEQEt z?CP@7rE+7O^!&syIRzf}e=zM>&#CMd6gwA_{GqT^*x=D-0dAYhVs-BHqK`~rSuU=% zk;Bh-ke%Es#g~4)MV)Xi!|#^c~{?f zFsW*K1~)2JO0HAZ*(f4sx-;7c@^T~u9={0s%@{lr!E|Zmn##7#1x?SwaHwM`(u$~L zyn~dkU*8=Gjnc0Eu%<85N2hd#FsNsKVK~n^KX(p%I81|cj|rFfXg>`NDA-jmpGyFI%6UQvOZ|#5F#o0VX z1ScWqmirce8`fZZ85cF~VRjqP5lDKPY7J6Y=Z}+g?iv;Y$%aNB(z3}<_2@rIF?m5T zCxjwN3~;Fy4sq*fV_IT3aVx4A-w007O^OedAsee2t-80P1SQ=85Vjt^cht9D$OGOY zmw_4hXH%5GkxL=I-**lyrXO4*l8{SbvR}}F$5jTH zGUzhDZ+xo9=j8|FZMJj#YI{56P}9zIgzPJ&L%teHK@z>nAozbK2i9P>E^>U#9|3#P zeN2UiGS_)2zOE#?!#9lw{O^O`)QYENWCTdyD9w&)*A>-(AO;C-x0x&VV1DNh)zDu}HP-9fu!7$w~qq)~fA zX)vNcOqE8aFV_Xj<}&J}6QjnTQnaJUEk6|0BY%MDCgbgQxa^x?DRS;X^#x{@n!eAs zDEM?83lad6LJH6q)_8z%!scv*`Es7(yehSUV@yfIw>F=lA+lT)=&a)Q1{O3fqoEL{ zV8U>2;v-bOqLThyAdVO)XbewRimQy(u`yS)MTaTyWUx6$yxn~wI=9$I4whyDzsjf= z=M3SBouCp94w2v;vIS#>&dy)0z9t0%z)o>Y6^j z=GlW1ZWny)m}vA@4+|*!j5aKqzQQ;Xh4fZn=YgBqmtYMCmt#R6Mkbn}fr<`9w)rmd z$5kE_-F2E+Nz(0(c3FaJ3u|Lj)y~d*8?dHjM|t@_+OyDHaUINo{N-$Gio5OiG^%xX zb2-6CC;swtu3)yx#detG%W`dhgZ-9z` z5_T;aNMGQ&Gba8h7n?^fpn29?V%NXz6Xjfq5R@fz$VxH%5m!PjWN~hM9Lt9!qEbH;`xm!*~^ph*sDD;`z@YGZH-4uff5z$!<7|qrW z3;IVXdvvNOPfCO6PX8*+l2*&b@>V+_o-ag+NS-7Uw+q;j1l){i8-vyn&x~~a#ZtSI zk&U6uJYVFbJ7h^EzLTQmtj~+@QYzJNvBu7oxPKIbv}?OTwA@AtX$Z%!iV(0!*NGC+ zASTa-Lv#~*k0E}DggEbb{9I=sHnB(iKOjn%)V4503Gn25hO?Ab??*|hp+Z{J@vkP> z6;RfgYHtfx>DkcIZmUNq+Mb(~F$1p*KVyl4hQ=G{ zXFmRq13qv$4&Xfe*+K}gC8vCjQ+W-(>1_X!2vNDu2sx)uXl{pj^gTe?LYc%H@%^AU z*cfj$y-zJBCjQ1~A3-CU{b7^Jxuv|zElc_x4V^;%BQ!pZ9<%HX=1_P~ z1ANP=*?~gubGZ~ncl76^a%`ZHY^wAV`P?2?A2kZ(%&u9OOb!Y9Jc<8dXM)6K{Q8Q) z0}+Nq$-rL(H%Nz5-vye)y!9oQCWnwEEK8`0v??w_tGu=4qluusFo0JgXogHUih;E# zuS&g|>SHC?RQAwg=1B~d46?GQIQJOqu$%0nZd~j>bkY==8$l{; z3GN;x+Lq%LRbjK7&p#?rnT`bgZiD4=-06!sXY}-EcnS%JeJBPi$Elr($f}w6c;+P6e&oMe~^UzcS!p=adjoJC_70=e$bRBH@ ziO7fnMxf;!W`gk-{xwm)JSaBPsGgrFi1YLaa{ACA{~?9wIc5rQ!gQJdnDf7kcu=E9 zUiPjGN(3sof(AN;W9xY!{SX*l{8qpp)h+I!7OaIfYjG-<2Dilr3aE(E-HJI^@-}<+ zD)Nmu3qYCqcv5nx3DRj(? z_EJ9r*v|^I;VG0l5R`H^7MKkqcYj#uiKdMVH2g{@>6Q+0xjU)X>LXDS6P$RA(~A-R zq)#myLfE5%WuOokqK8u%>=96YVImM5>G$W*@cV`F@dViHCxvsXSAt~72$hgJb~|5M z;5#3BEJOpu?;is1I-k%TNuQWHO0^jd?kib1(Dx9351748EKnZs;`>;sh9d+@% zC#gRdKO0TDmcRbs=V&;5P;q&!qmIL}qCO8Zg)^NK&39hI3C_7W$QEnO0I|>cX`k0s z#8?<*J;4OPYsJ+U+gKqWCr7SGu6S&dyEQEXEzt^>IjEVq)4z>EE7+RD(N{Ki$Cv3< zim8>IP61c;`{(!e)M{uoS9p&iLM?8G%GmhPKT9d4;=9oh1}O4eSJmKiUlH6QKKTR7 z$_e>poj$XN3`l0*Au^>w#&q$(mXi**o3h4Q0lHv87>SMammGLPqSe8ArH7X~A^7j*_J&WO5BfN*AL+VmPCb4J3LIH8oC(HZ- zO3kZX&k(pWQ>?7M16Sny%J^w7)faS}E`3wDTg7GCFdRzb2IAwA0Q;kX2IHVqA)EqI z#gB^}TUNZXPrMlUCUyo7%BJL4FvymLzWxWF!Y6QS7Hx`JkvH$E$e~ef+MJmr_xrZk zpFX1pG+S+l=aP72l1Gy+6H%LSnv2S=O=WP^sCe~b-Z^niwvz^u>xwoAzmu7Mc>gkV z+SMd|Kty}XwDK|41<0G%ILZ@~rDZ=}fy4Q=ZzkHsY>#gmJlNkS77 zf&rY&@1~}qR43XApMKwiRBc*0w(iY%ZpWK|5o39fn5UR)wO%7dr~j{?ooDDQ7A1vD zkIHX?O7e9mi8I{h|B@q&w+eBM%K4yB=CD{$Cpkm&c|_4C-=NJL9m*G^7wA&gr&A;v zRJt(YOWF;gc~}SYH`{lX4SH8-kBkP!!-Dmam{hp{0KJMR(ITcqVbXK2?p`TjX^*=o zJ1r?YS>aJNz%^3LB5+*kR=$V} zNpobj`XibZo#NE^L>DkAxivDZ!$Ax-zh9VIqJnGcF#dbW6kRsD_P^b+hF|sZ77Yu> z!gQSu0%Mi|NAqVq7PC_+9m{o=BhzDXC_Rk)@42iKY0olKM>zIaA?$RGnLVD6Ip=Cp=Xgn2~@1^vcIRPZ1L76 zy!4hL5Q&2R3C(O}3CeF*6y>mlAsbx0Ub(rwMym5BD|{|7>Mnq>G8m)uciQ0gL^3|K zWnpIO{CdJG?WG+ARgBXNb2qdM4x&}+D^DV1X#3If6UgJY5`GdNjrhbv$Zb8bx_j2oN#;%k<(!?ea(a?~`up^7dz1&qGD1s(_su%z!ioQV8tyQ~5B zY>t;jNvdaW7-&D^SF1hL0)kdR3pL$UpP zNG^nvVePe3Zn(PE?=b4$aUe=;+%}0{pE%U)7zMX{6bki(!{K50zYVAWBjvQ%ua$Jr zl(eddjCMlHT2-$Egc}#pk$MQ|2I**cu*O7K46bxU8L>rBeW_|T7Y7rSIQS0nJLN_% z!`*EInie%sGr$jYLP&~_N|(r~!yE|A1QHjlH-zQeNW3HO(lM|skOZc`4+-PXxjtXXDcd$IA42$PF*|HR41d%RKwVew2w1FufG4QkA?A-NtVSjm zy%2f35W%}kgyvzACWNiUvz{O6_Vd9sTNXhS=+BwdnLNP5FP(9Y;91^506oA|#mwLI zBEcYpKP91~jGKb$EH6zWof(Q}4KYfb=&HYs5_D`bovjOul5k#0*Cui*Ac#IqJ`w02 zK#s%+oBn367DTH9@pxur9rXfpv+vSO;6T%_DIRY~-@7H-&@RXb9I>$I1WV$06NSkR zI#>I_WUZogg6G)WZSkPoifhP05uUjTV*a-B-FY_eV^ZpJdo?iGWvk}bZj6>DfNILF9GGYF*8=0cOR|$h4VzswD$}+8XTuXPWC7Q&9I)Rw0x|Hgo=w$f}c-- zK$vIU5P`*m6a>9M*z>$-HO=FRkhjDEu*JfPcIl!YC!?Uox%Gba9OQN>h~F}b@%&ex zlIBzSm*(1m;mE<@&!l01;lR}`kq**Xxvn>pZ0qGM0gm~UC2Igt1MwaWT0_i2_&D7Y z3>Z=;N@G$xFpI(6!8bo`a0dn?U27MraTBbtumI4;ww2%@Pd`2Bu|52z>^i6m!PbX) zz#IYAd@f7f+y8XosJ?D1CjSr`Y)PFiIqS26!C{Kgy^YL7gz5c?an@i~u?m3bgGxCt zzcGgV@c=Lnj^}s8`~I4KK&~4oTPxhmz>R|rAL$T=F&jXz?tdk_JaKD|@}`e$OT#^# z0-!Gwx@!iC>Mxdxw#M4?RHvu4n3gB%UAJz^*Y0=Dw!#wfZ<|;ac7CGHWKDXs*ew_|DNh=51g)wnSY9plG&AP`hMn` z1Ygh3>!jlRoG_8l4rok~Z)US8*=IFQ6Emq&$Xc$EJ-%oFd-@>^#R1XDX3|7}M0yiu zup4D^&S!lLmNJOD`RWTB!fxJXo|yEetIb#Kured|O#w7$0TYDEGpT6xX8(HcG!H?z z=m2eFDdNP5)1NB3YQhXrch->e#P($^j%$o}FhA`OGY8F4#D}aQLo1goyJ~LA){_ z045eRX=jLHJrty9?V#%kCZu9eEEOnObPEvI?;H&PFMgT?WHLNh#5)*i7eBAaRtz+F zU3c~oJ)&UTcc^8IoMxd6IEPx&-csi;dztsO$IHAa%spkhtt#LGuZg?<88@~A|u||Jr-$hb1Z}UG?*{$Mcp=-ecy5Klh zef?MD-4^t7w@{L8ytik_Xg)uU5hcnK?9B@)#!23^imcx=h2u^kRab|@7V1_ymtpJb zi{$rTT0cc%L|H0YtF(ypgF!} z>bZF-RdB~BKDLd)TMh1)o4QNl#HoolGAXOa8Bd?0l|dnGUF%A8DUk;nU)Ja@qU&?_ zPS0x?J?X*W?PD35tY+JIxqm{?=dTxA!ph6wV59R*!s@K_3Xm z`G~0V*C2?Ch|*62>X$qEV&P2Gw0^m?XX+1XXwEp80NL35L zuhO}kw>%36nN_OSJM7i=U8Lm9Mg4m_)4zZ&zko<(vrTm42okBR%z4!o7z9m(fKf=$ z+fegZNBv+H$bPy(779QF7Xx*d`Ne8Q8&Q4e%kkAf|vg_S#s7s!mVpp#!IqPAzWe6F2Q z{BfP$dqZx2F3ys7x*W8dj`@rE5$~wZ!|x{7`ZY z?cA%qyhoZtI}L(oX8sL(Vb$PJnHW~KF5XX;kGn|Y52_HW9{|-}A`$AXY+=ps@3{ie z=cy%DjFnZ#;D$rde|O?WnD{lT_DHR`j+=DE)M z=UVO zRN<)sdqx9ETImivo<(aaytCeWWgqbobUVM+sHXe2zh{h#F9O^8XxTC{Ci=1@PXts; zsPQJQ+O=o?w_gz4%;;AcB|`J-w2BOO3V{fck8S}q8^rQ6>&u@mC*L{t8(qf6z_-r; zuG$yD)q@|B?zZ1B~DtRbP9OO&B+Z%cE}Mr8_S$~ERC@1as%!IBKPOz|M1cHY{L z)T&F!80r+%>dSp{swipClw%`DdLB{3^#Z~|IKL10`j&#?HWq?J)T8lV%Ho^XTMrmn z^v-nlha@-%u|B}@mGs`*q8pL{r`|iTs;vZ_`J-?L75kHK<0+}_1Mkl|?0`LAX0847 z8QJJb8c7M+#gboTM-DfOpN9pf#+aTIRDs%qzQU))7SW@S&Cm;z-ZZ&OnV2KUJ)+;q zinjfd{6H+Ev!m=De^@T%xsiXSG0@@Ml̎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�gf{tBv_EVbe|=&3Zgb`0 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

k`T@?IZu}!{Yv{i~rB<~%tc>*v7 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

Ed7lPBb$ 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¾kidnqoF+4;Dc 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

  • nJ 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ï{L9s__(}VdkMp`Bd}^u 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

    @;LIq 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 z zL(hu=i2=Qdbk?lb!DUAr?a++E@-1OL>zd>4kY3$*P-e+G=b(mGC}+iqY2Y{Acnlr$ z2fUGA0yoKn-c108;Ag7_K>T1E{3`}H>Stm{`t~(ub$EDvG0o!H+%#jkzr>p6vQ!rL zUX8AQInfDs*wE;#Sqt&Y_a9aM`BcEU~~-c z_9>nVje|GNZXa=tVsl`_1ie;X%;!YYKhhdW>UsbBs(z&EB5C6~JCpg4zlc@>H~5V{ z^G7A%hjfMoseO!MT$YsNAA;Ndft24Y&KpD%$0R;yPj=H_gU>ns^CpEvzr@qbZnn@$hX>8L=r-@ zkd57?t({-FbGXrf6zE)|#xng6>Pf8Kcc%ke4#EN}7D#sg8J?((LF^jMEWIPWGBI=A zg|cK1#rbKWS(`aj1l1eerubaxb9pjCvmR`}m#e+y>a32i8B7Ckg$I}8kJ&8-Ye$t8 z`E9sp{vv`RntO{c_SZ`=UrzlqBrfBo<=;bxu?H}~HltT}PNKPk<5>o`}%C|5de{{a#_5s;XvWmax4W_@mkj* z89Y28yx;HVG9EuP5-ZgK%`kBqL<~zRs7vog|HQ#rXjVBzQ=ET&6|g`3b>5#hz*;Zv zjL65yxem{fJYpmBC*x(ClFqXetI~;d`O0eK#AKZP)Z_I@zi!NYK3T$#JQgh$_N-In zJS5k4%m5F!dE#5~TWHTCbSt|#f*bvXppVqtWxfPVU-Q0Z)igM7aPkVLfnlqnkZ>5i z(dn$v<=UmgUFLG^)6-_L71Bf+qNVpsSzfk zq#vo+j^8y5((#HbtSbL79n+%&!v6=PX+ z;~eFMA2GkgY7B9%EX>XpBht}Flk?y0MeZ&>F~dp~?yfbVqKoJykQb%2-lU}7BqEj# z>TwAnt-Pc!DLHHn*#kF$MM5Bsv!-UI^X3!zdi%fj*ilPE=sDc{_DpbB_J(hr?o8Es zgG?<#pgch%Fqj{_TAy-hWJZ^k+eT=WRk4B1#aS2Fz6ALZHqwuO3j`t2yAWBOW>vil zV+a9oY#tsNnlp_3LcE)ZEV`P5c`aMSix4c){M_~RD&3TXu4cv*UsZV;R;LC|CZ07D`A@VGP6$fZd4;#m(y+?_pB@0|b^FL3`h2561kP=;D zPBylf)o^lSkSd0S);PQk1uhk;QjeW{V?WOazi4S%@~c&A>b_yTcU8HD%mkjsnpgCI zzk;OXGx_)wpa5 zYJg9||I%}rYt*Ii0=P9_bd4`%Trfxk;OT-;_=WMT3eN~u#n~h+U(o{BGvr*g zwL9*Wi2!m;xF0A2x#3gY+t*kfaHpR1$OMwoNy20nPKtzu9d}?@|QZGqR z-WR=yAdbX!r&<1*jsKButF8di8l=|g7PcOHHtnI)79_NKai-j=HW}J%{d$pnj1M!L z4RLPeEg3)R`f{G(U)*QCJ^CKel$Ad(g}L>yV0AGlPI~mS|EFO-cqXDI<3+cy=^J~Q z1AyAD&SPSU@vhkX*(UISot{Ba`b}7+8|5AJh!QiidSFiSpJ>RYK?D^l8HJ!cS5#L5 zWn%1uI)TQ6#(m03G{*rON`Wyl2YPJ|UES}#RkoFZ<=q6VF)R$>5bS$qKmF3lgzqbO zTj`Xx_Q9S~>T5+N%ulVeMgQ+DE#B_be=j%}rtz@;%xH!kw8};CuvFQkyJ-lL#B^ak7^r*ebAB zOVP}ClC_i6oCEweweWgE%$4GOW5X4k@UjacLIyKF6vwtZUF3QBGZJI+uN0u)S$9@=x$L#>TA^^h1 z5uihPA8rM%M9tS{?;%01Rsd2?aUdnL@$rK%dHQLk@VAIVv~8(>2sw3_6?5=gS$Pmgvr<$C5M0W6kCo+bF$e#7tEfzuDZz005`N&w4pLI_8#}y9Cj`)H z{vu|RVDa@u_MJU*3IsBOG8sZDJA146lE=a8uAS1*%zotj`oUMy0!DXDk%D(}48(;d zI-5x=1y$jhKW97ejePu&=Np2ON-4;~Up|rGFqIJ8IH~#8=nT#Qf+n15g0*zK^Jm~Q z(Djkn%fRI{B-Y8(z?4oA^Z)Lj24BI1wnNqg9^iVb3RxMNvGvLfl+ftvz@EePT&>@& zY`}YBY=3H?o_nGK>6*|k<V5m@N!Ekd8b$M_U7>OwQR3#u-rln+F$Hh_!!KHpC-xQa+3x2Zu;jY<`;lEG?w#Xw-)hhb%!z!;0gSUpA+x(U2RLy?-$XJ6tG z&Si6PA0{8Khrfbwv5J>l)B}%%_@fPJB%?)BsPz%L*@V7@e|0jNlS!mW+@MDsiNzN% zA(`NjjmRf)_P^Nuzhp5{DzE~AG8xx-6goO^dwW9Lu$XBU!g?qpF%8+{u)W{Q^I0iR zn%Sl3*|A#@h^Eo`D{^7liLJlKXh6H>^#9)baTQJ`AJ%4SQ~UZnW+=!*p#LLy?C^3b zr`&aFbfLZ$dC6u=R1oBgnE!#I%P3_!q%Tj{ZxGJh{W%AJ^T6uZS2!rB@O>)Pa8?K` z$Lff(LQG=So#4&G*iwJ}_t*wA>f04-iWD|AA zTK5{gsh9o2Qv2E=QA2pn|Cn&<7Jaxh`~~+~U@E5RXym)a85uVTrzYLq)qfRMGkOB= zcs7B{`k9WCHq)nnA@VqcfxH0sL0cY zvaKY7_J>0C`CgCUkSZ^Js2)XAN+7mm$+v$JefjK_0f4RL&&3p-Y6AWc1l8?MYk`5O zUsl9EnfqnDeyBhUrDPlxfzYXvHT%s708GaHa~P1(4?PsM{% z)LtW*CVub;)Qx0m3E1!BaOsU46qhwL=M)79SSd}6DnJ%xk2%FTJP={aV~1Q7Y&iSX zj&Jv5v0V!J&m$*8B}AY}ZhtX9KYRMuLi zPO3She-OgWjpg>#G5|aarTt>ZH>ZsF|H z*B`17ow2@s@A){85eTxQ0;V1Ni=P!!G3}tu+e(OM!DM8PX>dWw7?M6pM2Y+k*GZ$2 zk7i*Sm8ftXfwkj8$aWn)q=VB+Xm)gngw`5O%CI*M~f zp=W1{amqFC{*Zq|49OH#M{8kjz508$j=ZMg>O}-Nm@70V3V?_r%o2ywlsE^yZGA|W z0KuXm;bylZJ@<&$&fo}<8PCfS^K~XQ07M%2aAR{%!V&FvLD_w7$qeE3sE+z&s#v8- zfX3SBjZT}G>lduIY%J@2lejt%OoWr?sNQbp5ctK{*|<~**x|0wL4Ymgmbf>-^0S@X zCV&`412J>7qPg#pef!|abiCA;gS!B8SMX55R;FAS(8yhhX!Y)3PrI-|e>PS216O)6 z$wDs;VHFPmnNnuX6n6(d0VwE@>Q-t67DbZ={zgNQqwf%^e5bGInEgSICf|xaP=w-^=!w%O!^?RK57f zW4B={0H$P!j*!~0_#H{bXhZ)Xk%d+Y#Bsdgwmq{*w5z5n6AzcVLe_10s8}5Pxd^@c0hyof zeC?tn@O|JdY=Qfy2OH|XtOCn42E;TWXBrM0I3b)j1)G>Wv1)Jlz+nX-T3crCdz0_h zf9dJ6$9W$vQuSAx_P)u+Q;yYj_E-4<1mFU zb85-7&#N^fQuA6W0*TxQc*ZT6l!dWYg~@jySM122J!lJnV@Ms=@FJb1h1}B&PEUp8zR#BTR#NAr8nlKL4T$Hy}_9FSW6XhpE>GM&< z%-8O-0j0vaOm*Sc&JYm4gZ=qv+o7zebgTU3x}?Nxv)b|G!%ce2r)|b{n{4oFRvpA&y_0Q<;II!4Ox>jMLQbOMUk$5CBZ=`$l`JUSx)i z)(yxJ%CBH-n2}}+61}d-ntgD>VNfhNxYIo8*O7*!uNa&kds8#Dh}j82>p@x}vxY4; z=Gl{VI?XtZ+rYBf3QX__BTsl-bl&}+^x$DINFL-&# zSy8`{&SuoG!8QQ&#IGC^x$TdIW&VdoLgy}mZrUz`jt@USlj8SIeKcjE5Nj12=%s!V zSSYRv4oL z&8tvMdQMYhv>*AX>~6WPye1o8pqi5DSiDWb%St!DZ{%`6Xs|~Ben0u-y4}1i2i3&v zF}V;W*L-2_Ujn;=okvH=SgB8A+g!xH8|N<@cej6bDYU#nsB}{2ae(NPg8-EBrL}vl zx7D8};5~bYkqd^-L!dMDaZJPA^V0BDWiaZ>y>+g~f{7AZbcp1-Y4CViWm&lb{8**J zXc(VP<$Tv>rgA0Pe1)LQ`oEe%qmQ|zpHZ~9W!u>HKsB1qAEH)GeGVoRR=gFXb%wQ^g^aJ7OUi-`L|?`nr>5A*TPH3j%}V2SUD^&>2) zcgM^p19#Uh9K|{H{D*3YIQ2*=WThl*eeDI*L>y*AuL7^tv3VGSS;j~GDYiU$`Tjn77Hy!&lK$@UWdD=nWy2!1 zcwV&24#vNfW+AH4>8dQXhZ0m~o)+k71c|{*V*sCm%^U^WuFgsV*~Lg4SlA8a$wLo5 zW$U`<%xL1o9<{PPftTgT9(EWlVF`ik;X0y-8IMh+S^u(00k&`dV9$H~ltZj*&Q=uT)I1$%~h0!T^q`yL~>9{d4`o&0!&VrVCYVqxaa1n!^OA5laL(F!IYh0(bn{ms0geMpP^18)$v2IL~sP zvzpH>+14SEqBG4h=v%ulXY|rZUpghTMcZ)|c&yI@`}v}q-v%b7WA&3~&DXI)U}%u| ziW+Cxjrj5@moU`t_O^J-T71PbyWWTtC`H*6ivxb=Dcp($5vAji9Y z)d5|Obg4P$;I}&JtEO#(*CDOk3pvxxMftY5W1H)cTT^Z*lM?(Cy`~zTD~z6q0a#9- z<|;1>qt7#;Z>$ePi`%(4d47gA#sfM_RsMn6W6A^WQZgR{T(dX*1xXHj3B}3 z*I~v@^*IN2H^T^XRUi+M+!E=;FTRG5``x!RZmfdtKJy&Bf;ZQRzx$JgRT$$Te8Jr^ z7VG?=aANy>;|3L~%oEaQdZ67Mgh;J3q-S9GhFB{kgNWG0rg$l_(H|7mF5ASk9;zDr z6E`JmTAIC?Zps*rE(1U%vurDVtoSO)g04EcX`Dum$v_<(BORnxMs4>~!;?Ijx{A{f|iIGAvY3#1hrTo5?Rv z^9-X0LqagInt9k_Pvig;YDTP~<4{vAI^Q)eD>3=(UY_Xjlocv_cDpIF`Q8 zBF!CBJcIOAoFRSC&qzZ&c~V{_Ufo#<(HmPxN|DSYUt_m;Vi3Z0v3G+Bv}bpGb=%mb zQ>|jC4t)^~OLF^jVT!LI59+TCSdLkgD(hIEap}A}*2NZ{U^!uN=0xf9r%Tz{G)Jx< z<6zjo&RX#?I;BaE^5FcW-+#C3R^;g``9cF~l?ZiN<`^xB40jUgJ8-x?#Tg(G7TV3V zNQ>29S;NJ=29qvHyC{{sH`(@IYypokg0Ynmy*mA}+mZf%S4G@XZ>(&AQ|sOme0$RT zePOtzVKdV{k+qr?YBaK5*(Yu#4JO$G(J)I?DE-2H|6zDU~{&QW@-7 zP%*n?jQQKtrV9}V?5?QpcO?{uKvtT{P4R6FW!dO2w^|VCruI^}kCr#QQ5GIS4iBJf z9HPrfhbXZXh&&J83Cth0*dkEox2ixQSEJ! zCmJsKhmLX`LrVvqV`66DL%&mt>6GHjFqo+^Kq|3&n&7Z|6f2+_f7K7@NX9g9gvE#* z(tFU_RsT<(HUbF@Qk8~m*p4z<&#BXj_5*!I55INUMJ)F{{AkdzPk_3X#JR__y}7a$ zPMHIAv4-xT5+CcLJ4jJ`p;d5I^IEZmA__kHmznb|ru2V;-!%o)_7E{x3K@?jnmKtA zZMpk`T~YW(zWyMbcYI)_k40#fRoo%AWA|fC*J2Tq62n-?uuIGfpItMeh&kr*0lRr) zY&R5M4e`O(mG?P)!8$gunz+w;7$|yu9VQ3KU&cxFF&ntvq%t zohJ)uvewqF3J#^bBwwhpb_{KglP5mi5W^GoQTZXk{~6}(`rOitQ{B$KQl9ni67y(? zcGL0(auqbnsY!`BAeNH6ahc78GX~fOPu#@NUR#HC@#=yLg+HOp_8qX(A@YPhl-;J1Z(yYBvIeb37zg`P_-oP~PdY~s<}^yI1I{8Y(&+p(pSuoHG~<3HOxkDFL@2^(SSh@2cU{epK)`4zLFcw? z$1u$O2P2vr-`KlSo$G^v8(qwWXpzg{;d9Z)&ZIY%_a&tDWCiyJI)0Y}mG1x3yGm(O zSvz`HmPt}Xa1}xis=+-^biwc{xyzm@kWc77_OC4T7Qkbyd2+CpG+X zh=8L$(0iP}1+>c-23KSQ3+ePU@y1>33oJWjWKZ@ik>`$7XqWyNT~b2-V*b9_WYNV8 zhDFVVr&0DzG`=!cse6Yy0;t9=X7?*l)$*F~TLVAXPB-aVh(GcY$CIl}wR61I-RcivLix!jFC`m$J$B6MC45<%(}(O}_}8Wo~E;(Yrha2UZB_kf7ox`?6Gy z*Iz(7-wJu+c1D5xh*UlCojy=aK;dNU4;juW-}oa5qvgU-X#(j=`lU0;%;jUUb-j9( z#-&~#x1JaKxoM6zD$yGZmmF%hSJva~M?JUq@a5a$CnnG)Es9|_$cj0)qW{NhZ|3Qsf{k~XoQZGIZ$k|V-U58Im$`=`OH@w9vJvvhyDc{ zEtd^_2SDYV5364n5>mL`rjZk~OecsGRD38F?+YDn@MEbrY@6qUvG(upd<Tn zr*zujK5{;*1ghx%bc;71s0shp)!-C0D!0Q802pGtvFcS(2>JGPJF-x9g-t!&%-d33 z{*Q5J!Pe>dq1`D&BC9s=Sac1_?PL*9b9iIj)J$=LRk9Z28-tsBQHkvd3}AsrjHr;1 z|0vNXuuQIG3u-(*VmM<+jf87S1NaehZXC&+*(8-ki%j9d9On&lp^*R(9g}Q;dI{|L z*Z!`3CiE3IsWxSzt1cmdiNLJF*RnO?$%i7mpxd;{5WM@|En2)@20VpqB4qf~6yMnD z;Vf*siEGvzm~!>_e`p4KH02_hpT_+oTC|w|Nhz)x=a+Ue=IgGMx#cXK&6k+!*H~U; zV&CTQvX5AAQCA-uMZ1rumT$AW1tsy@5GUXDP3o48jkE~u4gWuhdGH18|9+M02v#Bm zpFTAjU_gk%a#-Ntp?L0XQie>=fm7Y%&e#c>96f`VD2rrX>r)9-7K!n&4(ygO-3S8U zfqE&(^H$R4oU9Ozxp%3qDlZ?uv?(Z{Mz}?9Z{Qs5ZF5pfzJfT4I9)XZv47mc^T`_? z1Q2euW($1D$$3zJ;;@Tn$Kw1uLeLhqqlE#)vPpcv)%y#_GRm_*pcO}c2?o>jj^8l} zK2wAaRmh)A)JH7%$_-AK+VilW*}sfF7%L&J4d2MlZsAOKPVe z{6=G=x?6MK!}i35$}p!A=N%}eo4$WY0Pc~bLVRe%?)f|bbvdgXYL|0SYEP7#L>mM1 z#7L=!>Og$a(S4EnFS+}rTebiN-0h7wwHveF_5gDc@(V{ILic$3D)=T#@2}?F=4A## z-Etog1X9_U(daFo9U&aHa1!RoP=wUhGc-U&==Xa+hd$jgR>PLv#p70)TsFL@#|wMX ze+*n3K{~Y?X)stRD;9-OqMueA|K#V?{8EvO9qYD1$Y(|0pv@kl-Nnem`Q)%Xs_&5n8NLVo+f*4#r|c{S%f3bSMENAOVJS{RmAV9xN(cCeo5aco4Yy}1}|1>b3YP)5ABY@{~?(O;xjmnj}IK{=}n z%a3ra)SPBaT{F)Z06-ZrkSk^&1&g17Qo9aWXpcDChBwY^6bSE!m5Adt*nC&Ak0E|E zTP4c7+ENr^KzNuK>a_sfSzc>x>CNADupXAUqqd-_L0Zc7pRR*)CUIQNjB=!OC}NAq3D&;Mvjdq_ zSOn&J>UDfw>hL9ae?_uVR_6BrtK=kb>jYV=V&U70-B}2(L~7<_={+T>@tbGzG~)VY zuF{8{saN#Q3VSaCD=?+t!Iay}hYj!hB6&0Npi+f&?zqskxB(TNsYEr4DP*^*ajaP# z*H=1~#c@a;mba-SzVw*1rY z_Ygw_Da5axFW-;)m9kZ$0*+$W1^+SdJaHQcDHrF)MFXmhT2rv*)ViO(J~2l40bTqY z-FdPN2LTd}Q@%O2N^$rIz+$v}^j{tFS3AcW3UEPUM&`TRx?e&C_>X&69S)H`+K9@- zhLKSf!XO>a(a+5h7dsY*h64O-iVFKKzX`A@NZMwtw(Aq>uI+MsGi-J1uQBv?Q0t+FN50YV-drs}!OnXP7k;5-k8mCtNfS}SfkY_v zR$mq3I#AdnogKT~U=Ao7wCojeLh)C$r$>tQNAUARtN)dzK7UoC)60`9epe_va0f(_~h~t4|hecY+i7X4Tyv?k0bO#dFd zm)!-ayOO1i=O#W_`c+%+PFppDiY8Dwd0d4BZ7~ZxcpXOF(#OMcBw!MCIrlpm$N21O zm4GF%o!J|%(&^W&wnyb=rcbLI4&xc(1k7V^DeLoW8sSfs*m}a@jTBB}SE}sw{W$v% ztBJotaKBqK8pskjcI9EQKhe&K{i7U{_o<;N1Jg+it7w=Ncurc3ci)O@XoJ`!<@dG3 zcgSwEx>dY5w4yJUVjh+^=z)9WEguR9HMMTHbez{fHcDz&t{Zc+&efV1b%}oTNOl;Df?j~wUH z71@N%8V5cd72DG&1shTqd)E?%AlM>GF=tjjgZ4pbqz-*$5Zr%Dyae{nP$9QVS4Y1n zuhODsWEZ9b;WoqB<6U3?b3-*Hw2kSbOl8G{yWJ)49av1bjTwTnO%W#!rpp?zaH;e?LK%#F$tOMDo!6KupsdP?C&+ z0Cn*%4spT!ymIP)>X{@o4BBfWB>$j#te)ec2Z5HmQ zHSL=`$WS{QsrX=oOYr6!DB}sIVtlfx5j9)PS#+f;&t1Y7#-g=;$1~%Pf)0gTORuDM9<^+l;N)D1<|QDQT%+%8l7ng0egY z_!d?`SRkcQ6p3%SvUR{sE0@iW7$2L<`6}l6tRUffE#o1=>Ga>ZpqOWe0i6z-EtQtq zvrx1{LCq9AadLyyETIRajyGf*jXe0A`P%`t&2pcTNm`?Wdl4Hv?q8_}@K9PW12RLh zS0=_T0KggtR1J`C6t++Q+pl)WdnQBauiJApQen=nMS6nt&L3?{oIvg1Fu^byZ9*^j z=SSW&_j`N8hk#T|S3 z2%2wB@9rAzeL`^Ew|BdZ9r(Z;e|Za1h^FXh7IwFgusz8YBa4O49&k6=f>yS^BH) zqSZMSB3(ely*JJfZKx(4RMP2q=;Z{Gnq!85^|Uq6;y@bRx4bTO@@DLGjq3y36)|8mka{4Yj}LtDn^p1d_^sZH6+7KT=!kVItW~#p zRag&qJN!Fg=?^Ov0(q-hm9OO%Ar=;P`Rv%~g`W`{&cY8Nj^Sj!Jb^8uNyJdIEX=C} zz`i0HgfZf0`~2M{&84P0PB(sOSIcPJ6GOfci*LkT9A&vjPOi)zISG1L!He&ksE?T` z9#^F~o(uv>3ux)e&D!WwDF=qYbFTDwTy8;sPtCl|-+_T)O@~h&JQ953BrSX7MFG!aiNSno^K>o$@Hgsi}bb`ycFU{?DL*Sf!cBp;N$HS zo$!W|U1jhN1;{uZr=hJZGfUTYx{6o(542<9N@8d)O%lz_7#1GOTQW-l+C-MVBhg3$ z4J&sGy|~VA;oDOuKa~BEqKX73fB-9So5YH#-&HwaCvLfNZb@b?ia*Ukn-ob7mn24a za|dOx?{D3LxG@3tDBZb(rcJ$Z-gCdoVTzWn%mplgMjC`)hht&3hagS6Omz+gc1r5O zM=PYqrZmoG6s40o#ajkxbiGqAX0wv{6yDRWRx-*g7P7{KTM$77k`4PBwoJ>z1VNI{ zI+Nl9Wl~t)K7wen96}M4##G!MLcGCA(~@~LV`r+hS7{3Og>5ews`%gwK=isA(l}NE z4D@);p8;>To*6QRD^mr&*$}x@W;bLbgPb+j8sTg(gyHUgm<7;Go7}4D(qoFc{?BQQtYHcgRW}8 z*AxqOY2g@S_EFlXc8FK_TkV?H_hBLAA3)61h@!iqCYRP4XD(^-!g$K8g(tmPahlcU zpegPbO-G7|U}pe#=hN9nfmau+pX~I%(|0S3Ktdx|3W61&E(kYXgn7*hJnW|Oyoc=YHEV(8F5*u+7#1wpP+`PiIPeeo7!1L)_#p(b(5m z)JqTJXmk;>gY_GHZg$yQqyL!_LzZ&R1zFmQ^I(j<_bfEpG4E%4+`(6lqPV3FjvENq zn&NcM8bqaM7ZA${XyOah6*(K_$e`0xY^-JZgX7gz>5`+Tvb54exHC`}a!W-XK1Ro_ zVH5lP{wtb7-uHvPah=l5vMP)i9JJl{0o@Mn3OJm z8@FMfWrMI4|8E?V!)a|J_~f2N=)~g~V^a@5OA7J26)6_O5N6i5%6$b5?UFSAk*`l@ z5BkL;j1Jf^vVu=~ssk5KasRb!+y)h%#VQowUlNW^+z;0SPDFi+DiG$~5~k_JRoiQx zSFZ*Mw15ZO2CZKXH2SJuPw}P-@Bz%(M1OW%?0JV(B5ry^S|s^CHAMZwyhadE>oM)i zaK933MraGGK+=LeXrke1>6m$mu=Z=AxBe_E(yZ6J2qJx$E`Xb3SX5Fxi(XnwsHZN+ z-H74rnk}i}k9U_Ldhp)c+iF7iJ-w#&s&Pwy+BdBU{aXYFBhPJ~Q8~hXtemmtCgvW( zPfA9}Cb9X`D~J59CVfi)&*x9Z=d&0WV>}iZsVU)n zW}ppO;n}A&6~Yw&)1+3&t5%-< zc*#`|8Ay(`^M6aL03D2P3M9gs8HMLS^}_BA2tRTam`kYu$7QNqQz(TS!H@P@WY!U8 z*vr2xWW(0Kq^W<2A+NCwcB8_j4>B4JhQIVM4CJP1>(-ZwWV52Kj%mY2!{R9%@x>(e zZgc!6W?el)atc}qJUrXfD)kV4R$ZteXLy5evu;~5BDbeZAcEYU6UlNA?&XCTGxvbD z5i$wGQhe<)6ZN>#_|}O9feIsh=DJGxM$z|6ipljA+CeS(`zeVnqTRBCwcml)K1v4i^_O3EInX@WRzGH~1 zEM55D^aO^=0>*!D`rF_`N_SoPx?Ds9Zl(Dhr+42T7!2vc=W=sQepq2V=7%#(Q#>iT zWMUjr-obuP=B2eKIN2RcMzAQDXdXXP;>ymfF;+xhbk7=w3KbU%mL>z3HdhFU#FXO` zuSff)Fvt+x1H88Xs~V4b1&wx1`0036m8|bnWf;IrC4L2sCTtXwJd4*z06$ayd5SCo zUC-Djky4NttNd_Mp81Yyi1He9m={i5TeK8>n7T=CGn?lz{JU+tkB}%vY!$ghdIQTX zgY)^YZ&58?|DGVsOsX9-s4z~-q6?M@{MW{lSrK<=$RR57LBL}FZ}FE3a$2Yoz)&Zb zwSW1#L5Dn`R?TtzTG8s4L%LO^?;1 zMG{!f6P zD^)m)r4ZkPxdg>|AOv}+{q#&0JE`ME=*6to#E*?1`fq9oewbjQrg36uSs^8`kE=kJ zAVvLd&kB>mNmor{LC`cqnHiZ1S;{Fi1Bh4RqxMY=qa&Kmj+h#*^dGTg-#`sEo4~FU z>z?ak7pR&0J0!twfG=pj!Zm4xIvG$x>ABU!c}i2KxZ4FI^yABW1+PkA7=XzvrlCO5 zDr!y49w6B1o!?;+`m^R!VfX;^xc{6HtSw8#^!+0aTCIOo*^=Ec3+YM5ak+oXr>cwG zp-|dOq7m{)%(qe95C~VMrESv`uP2*2dyN*oqh0;;t%y8FL3p+zys4{D>Az|!!MZm| zCD;6t44Btl>U31SA4ZHN2x|EwE~YN6BTy~~aUmSx<%dc_Fw7O|ow|GrLT9IaOBz#a z269-aI`_EE;L2dZyk1(|jXVwreYGU`YJZXgRs%w<0=yB4(1t57PW2Mh)rV2cy#;Es zn7mk$fhI;)(8_$}8B;8B8O&9eZbc$10=h!Lmw(aeWq}N77~M}AHZtqepa~$OO5`Dt zyA8>-qD48v8*UY?rO|1}Dj@-+-y(PZQ`#rAJRm!Y*M7zeZQG%~!??;h@OM4@=KeZS zg{{?=puXv?wB@)|$YCp-KifPV`!8hdP>~8tKs)NGf4K$aG^7Z9$>Vy~^-qkhy#KBH z!}(1T1&H8^d@E`^O#piipgp+DB&s{tLt4rVv65~1?ufQ6rP;b<%PsEf&`3BWpvnPD zt06hm)#SSfZNKsws6`$iq-Ykmbqiw?t%6X&s!$buqYv`2uF+!k>_S+f#-{aviWp`w ztc{ddOue6l0iNMWoD6z{0)nWHv9?EbngaNcW!5+@TI^13iu5nG-q$XI>} zOFK&2jXp0pf2~)=U#`ubTe$T0I#uS)dviYOSV(|!W9glWzhm%&QGSN3z6=1Hs|>i= zz?=&+BgL%Tp3QyEX;xX8^PXNq&4eGlwM{*rqSmccK&KqP^x|iV^~iXGu)LDho+KuZSv0 zuVH2(H(h|8h2keZSrDcFoKFZCt>|yDm>(I0N{NU!bR@dMWO*&(_PO@8ye9P+q_f-Q z)=6Kkrr&-_Ne&{>Ot+~Q>37L}f-#m(-GqU90F$O|>Aay=?6@Kfr#u2I?~qZ_r>Yw` zz`A2OoTa$dC;bQ?CDeG@f0gAg)-pVX*PU`ri~a)&M%#ew;kyn_U+rk7>H6I#8PqX_ zIHh=m}Y$hEqSvc=;IA)Z5=12%7U}jogllF51Yc|I9Cn0dMfMRH*VN` zq3v$WpXQQM19;zo2CT~{MUXAMoAbQ2!D@6tkI?&4`Whb(a<giM zjHkqet{@t7M9XQc2}$JKU)^PtUVujH0KQvs&k^Q3*0n!GdEkK$fMHwFB~MR!&O;E_ z2u>jygNo0j^%x!4`>f~~MAQ!SqQ)l`EyT^*N3*@KyFHvW8DKu5Tw5-pjWi2$y2f@i zHIGf)+>FEg9`TXpK5WMo+n&VrGI}AD84kBd!{et zf%x_B2NfDw^9D6^p_AVx%x0XLnDX15zEjJj9Rz?JB?oy*}}l(X96h$3U3{me{gx zn$896h)G!Q4WKoR3swF~!M|KyM>cL=f5*r&k4OC%9Yt zYQ3u5yOM`HUNQ73Tk0%B=iQdBGcDFtMJ1Ejsk-u7V>=SA$%}{7&@VDAtiQ$?){fAkyGv zzo$`8A?XR1hVr*@Fs|)`y4u7+WcC6`UjxzmA-)pq<)=)m07}2!N9S@#jy+hH-z1e^ z<~zomomFvM7?6wLMQdNj1|ePytU42(LWj`3Efbv5TCI^(i^(E=dn$a9iDmNO?y=`pm{Z!@U>vYs;)|ZY zgyLJXWD_pZO)#1_{UNmG@ll{PN7o>ko*h3~A=Hu<@@bZ`w~KceOjW7B`lo*D64ZAC zbw2hAjV^YsD6-(u{K_OBoG7U6K+@sKJxuOpwPs5O2UvLatGiS#Vg&T49fQr7rsyyR zrx8Wrk!x}x1rP$+8s=unubbBlqCJU2oBxYNBdag{ewTu>gNr;F1_+xWLnWa{g2v5} zZ*}x`4H``!A@xqRN3)ZRyXkEa8G^5JtIl=2K7Uvz+%j3IOr$xj0|@+ghC$#XjxgA_ zWq}~3)2)k`yv33|qIdVnmu5}1>6-yaMh4fOonKLHFHc7N|0Kq6<1}2gAOhx)ch38^ zn-xk(@jkAIiSh=s@WE~o@7gHVfEzf*_nGJ@Mn@clc6)ob;|f?R5w+FMA7Y6omYfvS z!2W_>Z|e_DJU<_KukD<(kdD3-`+?b%9i3V<3?v zRlgF;qRafbJ1cGdCS_AvXg!MZmeM&+o+DYAgwtdO=LkB|)fY(VKN96HcC(Eb*l7iS zO@MB~ZEqFqPj_ex3i;tRyW%OTd|qf5>;$;kv%9k8cqL!vRDubZR@xwaPy=UI4JdmW zMwQm}Q>p(khh+!N@W$(ueN^Y&PPyEijXLhR?Zo{qa|;56N_gMy>X97sRrVYGh(NrW zshFT;B4^FdIuGk`^0`qcH)ViJJD_Z(3QZ}g=y>t9SOM*&kIJ(6Fw;IvFP-X1N-BEK zJTBAO&earyyd?S18 zjTZ_40{sw2B`#D001VBFRzr>;#w}C^HW4m{cQ5*Pk-N`zXJ$z+!*VqA45ne(9`5+0 zYXerCWEjo===qUDNCBMS{rlmbyTeX6Yq~(qVD!LU7)3GB!V%s@shN$ChHLgq?m23% zl_HAa8QyTmf(Ql27sZyGKH1nl#m`UMHBH;9#SWLVC+zc&fK4;!5!f3)4kT#?b#zf_ z9yj&OyK693r%#PAZBW|VaK>LM4oPKRAw^~tuZzO!S72|YYcoL&&nKf8vk> z2|}q6*>~>;r7M_%C*Rkw-a2NA-pMR-FNH>e-HNK z;eN+|K3)TORGK*aT#LI+UZ`~8nqSKa%#5Db+lg{Y=(^ER;pteJ>iI@?CCM#E@{!rb z^4Ken2zgRWrpgUo4oCxx4sNS8lKs)Me7RJkoSK6Z7&fjbew9;S+=IN%By zj}ZSHkpxJq$X{?erH7k$#XlW(`;+@aQgs56@`>|^s&aqr-6$l{13PKd9@hUkq7Vaf zG+#j%DTH~$2%`Vie0JO(l={F=SaMYbs5hHIzG|x)Mp67hRpZCat-NjX$64f?-L>tV^wfF145T(V#$7uk;&-0yRV~Z%S{fV` zU7Xs4?g!(1+0R&SN;^EZ!k!73vb5nx-a)gTy30F^nr9BD_n3Y>D<5EqBTbby4sF<>Ylu9oNPWoM04Vh`-TLp=XA;86VSt}uqO zp_mFpToUsERB@*a6BCDU!5W*t?m(EHdcfQYj9}aJGmN^F+_I=EC~R{T*bXG(=t(SW7lrzXSiWt{n`I+v!L$8w3&! ziPoi5V3?ApAMGM0!NwJ7pl(EX!P!u>|GU4eV=dI06aLr|A={HozHQ*ch5Pq#?&`sKlf+t*^(eRH&*cCWdB*zOvNT?BQ79?m zTTNMZ+v}?msW(1;>gzS(WN0thLp}V$_&ksLDbA;K76$|H#tXO%D3Yi*JJ(lLT(OxsYZDGl)UN&!|KUngFyk4 z3)B7x2$jP>zyJZog$lI#$&&4k!9P=!g_qUvesw9y>Q;`sr#9I_A4JcI+L91J#Vb@cq$ecOk@r_`) zx%+U-ae5h3lhi&Df;4Nc2kOu~0B`;chMhFv+^ZR$O(v~DyT|>J62Gz&>;N+LW;P;c zbok7SNm<9tq)X0(V%p~ll>d0$(L^O^rMpjcc6{ehSEC17<7p98KPO}O6t7I-9i|#*P(wyB{rhvR-^cuon%*@}--9kdyY+9G0=to<1@8>p9t z5>O~+1nTQ7H(Vl)u3%R|(dR+@NHvF87+fqro~=`8AOmLiq7WEwLd~e0ji{zzkaS}G zZveh_e=XC-0a(E~F*i++^r&aDfI_`B_$`@uR`bLyk4>4@k&TI|?}c*Yo{lBNtaXfF zuX>aIo?@LVjupkDR79Okx~ijl#+B2Q3F;D9aGX~oD0r$H_3hb&jQ2V_-c8NVni|Q} zg6g6=utQ)uR$a`=6qn~3o$8*^N{niY8M95NJGr+Z5>(tuJy4uM!SkNeDVxYmShGJW zB6ovE=osvfvVvSyknyl1M>?59aFRWip>#hD(Xmd7S{Fmaom4j(ETTK!`?=F|kFmmL z_n7S;)H7UR`oyP)7X0lM`u;4SouFy+`Q@h+o$DGZ|NHa<4MUtz`3)7=GaC@K%ypB> zm^e_7jFu}9&OH`MIvK8+bPqh=*o9v``M?c{h9+bc) zQbXdoX~~5n1zcWNmFwMq9{*btIFgAZn>^vAh`;MCygr)q>pCCAr)l%P?g3_*p}NV6 z&JdR|HyJeX^i`92>6#vjI2yB2s?@HuYjk%+*yL0eFO3Gb2o zuO*3!O~iTlP%`VTdVhs~mkPHUxNw0f#827~%p9?=tiG8WDlK1AZ9M+tqx(utEfYx7 ztbRi>5}R#mNuoEr@pz?E8n*`)0c0I>-hn~mRTOy+g6(}%XgYTdf!;ZYQA8taw?)gd zkNy~UIIV^_hRu>GLE@N`D8Cc^XEPPnz;M5WsP2hh$uZwX&u1Y;KD849=+}un^zX%s z-#{&9MuZ=0>LPu_l#QePjIb-{ctsGi)D(!l^JJXP zu2=nbLO!r+Pn34jWn8bW`Ab(%Y=fOo8`d0L(8Jntw8OtWjWUfF&H+o9w%+R$&`q6D*Z?umKzyxXW?p)h(M1m&MV z*AKv8Hp$B*^DOMZ6jdg&dAe51=jY`77@yY=0gOW19hgCRVu}g0He~@coE{&M5*^Y~ z4atE4#j-up-2*8%OzJ5hrGIN4q=d@OOqO}p@8=-|K2j}YB{m;rOIXdz5Zo^Axey ztI9d1i#T(&5Mtwimh|b@UwCgE=qIS~2Ilr|GW>dZzPN!9AtT@fw4v7`O$TN+D4$&@ zvnbo^$H(cl>^P5g`*Qy{{N~CHsRTc&CMbDx0Ts)CoUN?u?w2ALE=jcPxt3*gaAhJt z$c8cfodZrWXat&9*P`BM0wQ8^A$#xp88E5DdDP7f{zzTNWU4nUDVg-nbElNZ=*_3TB5 zzsU^}ZE@+#%pdq4h@80zwzd%FAbUp%@~7w3cbZ#TR1`aEvqA7i+Of$4ULiRaxq9@I z&cwBSbY=omlFDn+)BSsN>KruC$KNh8%}6>r8+6S2y)!$nFy>Ni@i7JKq|2$o!|4bS z77b!va(Ay=CbaZM1z1BXTv?_sZg1y5|9}{-`*m~h_&ZA4cU3{JNDb|J)w>aK+%k}uLKqT<#<#pb(IX~ioh3tPA8#dxZ$YL7jMFHJxdj&__{?;@SxzMf_ZZ!Oj61| ztrT8_lMCB$%H8CX6v5)Qc!ha4vUUAf*sot{Zl+$3tczI^K2mb3xg7oC&p4Qaz#;gqqBVe-pCq!?My+(cG9c zvU@o;F?kpxej{2iOD*d=$}DtR1B{XSUPV7iZ;AQ#6w6V|NmXHpHFTDwRyBEoL$AHE z$BQr8UM+XWt7-L*Z29!pe#zq>-UpzPUw1Zj(O&w^m;Y}rlK`!HI1u`mrZkS*C{Y2m&{3##koJL`UZ4Op^@gd8S_6u9Fh2o@JI`J$O( z$tegFSLNc+*Mv~|dXNbZLJ&0=Q$~I8JA&w)AqyF;0QRtZ%QLY~*A9FbynSVFrSMiV zk7IvAi2t`@<}L8S?>Lxgy+0l2hhcFd!Gx|XNNhz13~y>X(1yJdZ4f{Jnt%ZOa-z6;E%>q@`|qy2|AS zT*QhdYzDJ@;-aa%SIvq`Q&<%1v9o}2p?=C#t{)^_I*LrFFUc#{!uCPYUk4sG@?cSKis;n^yN!S!FYh5IDTXgJ~8Jsf)3PN`BL>|*7Okt zc;!vu>}#2_S86PcN+8iJzm2Gcr!*7g72d0G(W`%U?KH z1gqt3!*?v@y$FiL{+Xl_Lr_3>GttL2bqDni`6+Q2=-t;NsRBPIdNG1q(iJI*sw5$& zgPYGg#$ukD!jUg{7eNxK60%mm+Z|s;034%p@0z{1;O~~A^+wLwCe@N_al{4=+pXw< z_r)KK>S!%%PEMbjIPf$16)ZIuMewTvj+Kie=nbOzY4Fz+e|m&$hfNu;{Di%&^}`9q zt$khWqr@>%lqF|0p3`cP5v@VK8g8{R)6Jn`8vW?Gk`m`BHY}nJ8_@JFnJg-3baOzS zfVsx`4Gqxlc_)KXZJ5n|8<6w|sM=W!(4%U@0qJ-SDf>9aT1W`bXQhglHnsb@mQw6b zECJhesJCaiymps&0$AXOnIe&%$@&$MLf3vGDK~<9M!8^u*;ASO1xdyRpb!sd$d^Gt zQ(<|imvNB1x zz^cLN!HZY6A~Le{5a@=M3!W|bwSe#y!WA`f_8`d_)YwHvUspSdl=>I+bPgOCf)7Kx zE`D}|@Rc}PfIE$YuorV^zbjp0tGA90sodYBRhVO<7norodI@%$k8MT;EX%3nyr-ZL zR{ws?{`p+${eo5ojs1ACJn8*u1w5*mA>0dox`H;`mZvFZlX(~;M7t9qDkG9vzjB$P z3FNhX<80+i{_}BY=}5)1jc+BNv_2wZNh}H4>@Z5F#zAd$$stMPcz7w8KIvUf26?+O z55D!^xhA8j5L!n*daUCxl`T!DtOAQB7Oz|(U*%%I+2tL4#D8!~h?RrYm~gJv+JkaH z^5U$#g26l|kn~bQps=r(9L;Zbc1+P(mxtsd8L`oab!S(dlN}RG)#qL2#GypYj^_Wa z7hen{!aEMz>elw>S=b{g379Lkn45MalPrbleQTtI0_e^7*wSe(Bg8-Lc^Yq+bl4>? z_4=guo&2g!6kL3%rfkPS43NBlTj|#A=lxVaHe3Mq{A-1h`n^!pUzU-XTi7|G^W^SV z%klj5JmCn%seG!-#h@OGrQS|%3|a^SIgXgKt&QI*Htmw|TCLC-JMtjp=F$B9q%mb1u3=!M%)k{|qNMco$<2%#`O8`n#0 zd?e6C)=RNbMN^* z&2IgRxt*YaRDp`rFVywYOE~NNBJr_`%0>i6PJ|I+p=JVsUx+?UT^6)5BDiBnaTtErPcB+I0=_-a}TU~d$ zqHr&LHxAjkkjRjfhDlufOONej$3R}_zoiFg6awo?2h+z_rT|ICUv%z*e66(&@s~KW z?kGa@Bid@)0L<$|sdfGu|B55B)I$$adB7i;4KMP@nwa+ZSuX`N^T{30+wY15jgCuz zvv5yv^3vgYc?MI0{SdXg!b)P7f)sQ^2x~CPg#7oBIX9YtU;a zGaWlk?;ckzYylztgtQ$A^r+XPSu6vZ0jtDF=i3CFH$=T0eRXciI2V41rLM@ll`?qt zah{bC(KjyilZe_6oURNQOdRna-d7+p4v!xbT#HWUeatg>*l^xp>%edI4I_oC?!!Glf`e>wiTlILh1zy;{4@E^a(852UF`zBrE5)sakr}ga z0%d|?dxKubH}oJ~>lvbufl&HisNmp{wT%^&HF(Mb8tM&BVwT{pQG|<<*;yygk6{uf z7yAK(e(Kzj$kw%gNx3tt)mq)iahwo9<+orfInS)eu8TbNhk>UTmnI z+D{HUqQwLu`QSi+Qt%hzaTY_|HH-CC-9q^vh`^Q4ZmYVmIAie(jmJ|>X6}L|2f6E8 z*J>&VgU&;BU$_ifcjjE_UmK$;L&YE9xw*$$5qbd6^`(x!ko;UcSa-8-7h<*nx<9l2 z*7c_#DNTO*XLQ-XBxL_ZAxGI=3e-YbP!{Kj&-SAi)v^pqCJSxLVuI{TcC>Cp+R!D~ zh5+Oq`js+;KlRnkv!*imU8-0^^UY{{F{Q@-e$M$WeZt-^c0@Q|7*-l<>Y5FEP&mLy z%TKa`9XFmq{5%J&y{0W}uP3Y5Hn2qxi^YSnA3-Atk2p}OtB8MWw;a}N-zH;aOfJzq z7Hv#=UPkVky;jUDKF8V+`BYn>CQl$T@K%Ca$qP{NK;zhj^=x?dN<~u54DmEFL_@MJ z!|{E63Ul80V`91!@=z-?a?L(7g&orJ9MIw&oMqnD;)8=WMn@p^Upx(^<+n=ityAYA zdfdyAl_H20P-D=*%RxPAP82%p<5#5Q=cms;43D6Iw+*2nEkc9W-cHc1XWTXdWXOzt zD~3`fpnXxdFjrIoXiJ%VwS_f=^5qxr*d#1ZLe8d$WP`oekaB7XoO86h1y(ddYWM8<@%=a!KS}t zI7&f`jqM<=&g@b(n^pPE-!Phf05od!!Po9)CrvYPsGrRf@;cJ0$(~a1v$$IB`DsBl zQ2`kh&Gw4FM?SN1j;oYyF6_p!Nn<|Ef|Q93Rc?bc!#J;>PFcE=C%D&^X)geX4%T(6 z^7<_#n^?vXMtqoRUlD`*12HXWFZ!R@2jnoAQNB7n7QSx}RAE^3gugLoe## zV2LbSQBgW$3M)7sJ|&zKt`DcJ--YQI74>Z&qcROl+AB6l0!#!eJhMBBstnifiq7Q3 z3hZLD=$g#Mr`((0o=rjc#FJ!zSS%EJ$70JT8WZi3eD=c$ogHO$5Fe*>DLxLiI8R=}8^IEw zj=cxU-W#vhw8_++TyjqcJ+iV{Y9_vm$C5-WW8M&O1CP;}WPY8|{xPdDa08~%(%_D2 z^1x^ge53j!Na+Xi#to4?<_{3eXglE2(DUv}0e9_pyS&?qlC-dJZ!Pk)G6ex|9~-mt z_c=Q&taiGIqUJ0DU(H*`|5{}02bxHmCrJdRqmNnr!LV^se#Otc-vt}LFEk?1BV+Mx z3j%Lh?_*2wn#r3@is(y7vi-}X@Qsa%lSC}*s06%z1i&R5EU$-o9a5Ta_(Jj4>cQ~Z zj6OSHQa!Vl3h@&*tfv!z=Xnf7G~_-qw(v04E;CEfYt@)xC;aQSZJPj z`Qfmdmrt;N5UWI?j!@kYKK0L4P&pP@tL#!ZL~a$JJbhOknweS;!Y9;AT9boraaoT| zLqZqV%!$>P5EQP2S;80IlYX6-dq)i2(n{8VJ#plob}?~{C-VE#45>P5WY@ihY{WAg zE`vPrRihxZz4vbb5BcT3*~fgfjX}5s5Au3VQC)A+^Fuo}&D@ie)sOfJ@t43`w(b=^ zl+Vn`t0JVq0jkkiZw>bp^xD!Q@m`P~ydfzNk3<9o%2;X7!@d34wNa$Y5iw}mut@&S z9IX#vh9!rKYZnYhrYluY6gDagBQ4|MTtOh|A0ad#9N@l`nNcmRM1Nnp*7A>M;*{k? zTM&JKq5m+*{8Y(7vmx~B`iNVVDk=-8LY$z~8oT;H+PYWAq`NIS;V*sZFZm5W3)_0j z;Uz&%S?Ve*6+%6NoVwWCZq;*ds7?5)ThF5$8jY)UvYKC@4F7{eYOMc# zHNgB-_40aP2oJHe1w9_*=7J*_0DZtbEeJn4JQ@-i!fwJC#3%Gm#y!Fz_DhrBT)gWL zKRx9qg0i3q$x2%K7pNiNdkz|w4*-;32-!ZHA+y=aQt_si%6-UcHY0r@&M%`u{7D?R zgG%h^k0S<<*5aQKn*2Em$~owg#wF%Wo^4nr;1OBnYI6EZjZEZmCGUZLdN|CoX*XtJ z2y__?SqaNp!l{3?Eb{_s(S0gPE=^yk9XRussCV2F{87I6ONG2gf_>swf{LF!Gq|y0 zY+OY3Y8_3uw51k4Rc6MEx-ZA>sUm6)UT{aG`kkU^OUps$h9_cfejy?bg=_nM&sm4P z*w@;M{a-v_`S?N-#tiuU1^=aH`NyEMIN!5J7}R-cN@vE+AdmuVXq6%?K@5v0T5*{x z{e^cNWB%N7ROm@PYTVH)slZ7>dMKV9Y-mZa!1Q%cOE;qWv2wqBboMofg8{k!#f*Sw zBo|}TWKX)luQmOC-tTzBoPexIqchDWeC@X`8u!7NaxLMxe+H5i_z zsD0MkV)wy^3eUNIoH|itn3SzN#tP&@n(-PpQEG%$c=AJjg2H%#FRM1}*cv|p2MNQ! zpCydp9(C%@8_<5R0r`nAvC3L0Qxl&SG+T1Bd+$V)*Ocs83Mkzhw%RNXbk@IbLhL z7#5$1LTq43W{~XszxH^w!+#F5|Jy%<=^~kDdD!w<=H*Xk4s7OUR`XfGr{_KwFRJ` z-GO|7q3!A7L{KRr&R<>i>q~CzavVI5?3P%?#83j=D1~p<8)k*C)7QII$l5x3@+N4a zHcbAz2r4n@r~fI!A_U`bVA!^U1Yfoq<$iEM!-ZwT%q`h0p$HgvnaFw%D)smA;Yn>5 zxf*&gispE)8bykFLn(w0x5~Fp zk0fccJNWz{V0$J3`Z~?!^~ehzoF5#xjvDu#uF^e>wnO+i(_LEPJW&%{)Vom%4;mQY zYY!bZPOR`vWbhw?iY>Fofo<~(3e+bT1K=kUl6Tg78-lhhE;5XGAN}$FjC#Jo^%$N} z{=`8m(kzkaaSyQ4G-^Cdt$Qy815{Wvn!(o={!+k{CYI*!$EvXt_%h1?oA70BIm1pi zzay1E`MDl+#D7-GW+2q8EasdaiIMLU6kN|vgl;INsV%IuRx3!n)iAP@2r?{Rfcnum zY^x^39lU84r`|y&b7O8H+ELbSKuh9Kj4mKl37va zf!Iy@PbdugDrZnkRifHVC!NpNY21If?pn#NBKlHSxGO*7^mKWrrJ|2g;v3|JmRDO? z3&)jx1+Cq({J&-)NIjWuZj~K`g6_y=s!Z{{4Ix6-o>-#8%lRpBv2ZtuI$&$K#OfN8 zqgev+)GRn>SuKa~O@E=05iOh_imrU5Vh^-~1L1DFfEtp@duX$)CyG~~Z_nD-woJU8 z$xYCyc_oWt%>l!`o%HFC5Jw7;O5HQF5GTQ>4uQ0qdG5y%$nhaOjy|H{lY-)We1YBs zd=E_X^H`3&KN8l6Uiv5Mbln}Pt&;jslF0;>)h%Cgjo-l_J~i@b1c5k9=KU$9y1w>vb@MkG>h^jUGw{ecpuy0gtOpJyf1 zt60DSAo2^7Li#`7&HSBCxb#P23W`*ztKo287l~lEk2M!J?#3eVDdnv$@eGXCEvp9| z51^M^f%ciW4bsYJiZ~l|ACnoFEDdf^z7ECeX*<-LzZSJ~CR4`6zAnug{malz$Y8~K z8d70rn)}WOqu<~tmf-EP$JI;>i?Lb zYga(0Y^ZaVwjGj?Z}BS7wS^C(@(wgYIk8&DHVP1}x=*Gf#?Iw1g0BZSjfY4rl8@$Cu?9Yj0C zoU!WK{t5_xm-w5-IT)XCBWQi-lT(i*&(|lq`pb}0soJy{d3<;Mj!{W!jHE9DtewkD zys?Hsv0eT}G+ww!EzfG`2G^1K$-rqX^WX}afbQZ^B2^~7;r?tP_eApDgOUdTnku3u zVRv(M7@v~eq2BTP_*dk6#tI8hp2t^kBYIDdNHhQ?`a8NBv|~HRIjqmP@s#L;%qIQ{ zs3Bkpx3qJn9tpA=bHQy*7&0}<>pCZ!L-U$OD1~3V(8#xfccE;a+JfnJhfIJ?Wk*!T zr%T5M7%SAoJz^pcPT2_a|FH}@%%}ZwB9t-UN=CsgEeAYT&a)K%>#b}SXspff!UHQ- zDde_ik2?dLos!O(S25xYKpv7-_{8NYDEu-0I+(Yo5hpW!L3vKht`*Hg(n@ZdR*5OX zbPlAPz6fBrh$<;pbVOM$FM{YCOtE6ibx{-(|J+X(`BVV@joMRnJ4y<0nLw3niD2Q5 znPALi^SJtuInaRly7k;y|2mGKQ$a-p;XN>K-xfOYFJ&q19T%vqLH|8E&z^1g@U86` zFWoB?kGocNQ85$c{oE1*qczJh2md(0KzERILC>TB(EU3$_%C~Ivzi96w{zn=B|lEW zL+ZNngR=i3TCviZ%9Nlqm!Q&53Q$JD=`u-vEDh4x_)04KKda~e8nTfAEhIZs-Z=La z9=^}7SHTUEWEs60xQVMGErS|I9bi^HfT2uhi+T0?^O{cTE39bZ7@9zSck?@|4($=D zF!d^!-W8Gatv7ykg;LQwe{Iu@0zOY3Z&rTC)28wVVKS`+QU^&9hVs$!r%w-HA`ccG ztgrey$N&T~Gn>grPy|AdAXOGOg&W%DIeiUcHIRjTu7Jk$xA8WUsA2NhxidQ;C@?jr z?sL+m;5QUzk{$7uIU>xo`yH>uE5z6&JO9o{=o(SPaY$Y@Lr?f#yH8x^7|x9AP|T`M zKs2L%c30kQ#nk@B{w)+*e6X${C4}X~-Z7nfz^omw+W+%>JmC#BYrnURJAh7km{nba zlmBkX5oyE$r}C255jNz}3}Tv5+@X~|<0it9Z0v2J&Ur~YrzZQA88IW)yOMZi+e#WZPb9H;7n8#E5 z7MhJDtsW_Yyb9RR2!mP5?qwx34#v9QW=je!|E5DlAeAQhn(Z@(wJ2zpv$si#Cw6~A zHAXVw6u6_yU()e#7ip4nK44`*OlnI)({arVETDN39xQpnkg)=OhdU})kD`_)#MD;C z#xF2ykpJ=X%yn_wbyTOr z!>q<>o*4;Q8E7%tqS$a#SkZ_;V zZh&IlLuzTtq~}z)l{Kds=Db;NbKshAa|L@&A)QWPar9W%Cr_jwAc$ZUF@rND+oeQB z@riV7#RZ^eI7I4ckO0BHBn!z;zC5Up8hAx<55f~C&x`dBv39A}Hf%QoW}2#|#>wF1 z9WL&RuH{_m8_1eEq&Ij9yCe?~xtKk;iSCl9jf;}Cp8|LIkV5&Xl)?|Ybz=2QeXtjm zrd{ACtw9B&t+?xPNH+HdL_RX1(M44|$ntbvuM5ApLxjaQ0{_Dx`q2G$$|u_e#=D_c z!w+I-BxKjjA3wSBDw|X)>bdX4IQ>JKt|<-)ZfHSdcAA&Ry;RP*4^kBx!UNrv?nnk1 zfG<>OT663AH>g7C62pepBd1NQoOy5J&c#%CY@)gQ#-^Nk=vK z=DCs`ssbrfCI|lK+T|7^$qVT+KnE+aWzp6XGU2KvV}jr#4$fDF7mc%q;~feReP~p@ zl#W}Nemk2kOyi`J8MMmb^5m1kHxrh8ZLm*!f@oqUi=rBx)U^TuNwEZB692R}x8jOS z8!rHu^D{BD*QGrIFvr6oT`cbCdeyw;=>O-%Lcdu%{<#fse#;`j8YK+=h@QOw7+FiB0dek)hN)2<@FF6%-5ff&wVufHk?XSrANLrp@Ya^S= zCtR(!z{E5#c2~i+jz;*4DJzrN-rVwGryPNUVhlpWu&k2}dk7S4xK@=^hOM$IG% z#0)U-(?&B$13kb7>$E#3KFPy8alaAIl*q6bMYS2BB=A zN%VCR8L~mn^u3ZW%HJv?VJp*_WfcEr?pNyf(KBemmLg{th3nj+yt0b`8>s-nX!cau zv8({NI6HGb2hg&~d`J6NvpVh7n9YN95GQ1>Fngvm@Cr3fvHCGvl&4APN|}DalhS#5 zCLy~u`)VAa9(8$P4->zG{7a1au?>{D_R==YdHU^eoA8Z$>}O(@g^(**1Sc+4n>ipq z+WEgB5VdXkMhHBN$S)_?o!}uGB@;cM2?nWZ0h>-UF=7KTZi;l zk)Mav;TRlQhWh%4&j#7)7E8S96j!>i|B`o@kN`x|=J69-v%-Plj)sjVBB*CIu45Kt}+lw7tP#<*k9Q^e$G~$|CBu6}jbX|mxP{v=^rRO6r zaF^HR!+e7W@+q)89C4kN;R|g#$Q0AK`y=o&4Fc5j1>?86d=;>3S)OX0jO2)UZ@P^z z)XeEG{v#_(OAVpI=OPV^r;zZ|d2>V7?31?7OE|cu5v%N+F&pNApYzt=q-yqQ&pjfI zU)>D3!OeiUwfVBPCo}MwWWKaj6tXOkeUKEmAf46h@2*RLJoad_XAiiWqlw2?5LeTy z+rc=2@T~}|R8BGegv4!=QYbce4pmR_ybhlAvzd_nR7r3kUG>156Z%>6o)@SSE_!El zK6i-8giwfhw|ng-Mx(tk-M=vbn#ZP#BnB!Y> zqsIWlV%>uCrr!w?T_aja`geDe0)nWgJbXw$-fA0nGYf4oofKIppgm`2R%v_gBP=Y| zp$>F0X~8VJBu>6+wD~3uJwaB)vR4C9#7#^F8K2i*L3IfTWWSTUosJMe4Rxf4B|)Ab znwL19Hp8Kdg2F};(KjG*=lkS1ZoJWpQ($i2dZz6|oT|!6diKufLAfC6AEbpe*2-6= zZfO;YVK0*qa11;0)*1W!z@EY_j^!zF^Z^5hR5J4wS9~ta^Z4`X(`69TqD~GIzJmWz zv6E%t7R~}q=42Y_=uNM#C;zs7(8Hpy1B9g&$%oxz4I9R&KU(r<*XCgu)Hmw^GT|`; z3)#G>t!s3+FuO?7PVubjnQqw@Ix6>xZHug;N|~TkRvU#jaXCnyUJA6xOqXvl-$@ds z{0lR}2Q$Yxs8$EHb^FvP?i)|QxQSM!&w5YZvMm#Uow@TNvvead(7=r7FQ-f#d#E># zlpYO6$Bn_nAJ`p+_U~j%L$hKag-S>xdXN`E*2mCdHPjxY2F8AE9ijEeIIVcUj||)( zY{c|ynEki9)zxkC5-`Sqk;*A2_Za(FukW|HHV6(g{V!MCvWk#q2Bm@vdO14keA!fA z;6!H7A~bv@U``gt4iFJF(8 zEVX{Ok{wE00VTnUhLl!s5uvrT0_2NN$g#{q#7%LrqVa?Gpg8 zg$-(YjzOr`Byzv#`oXt;4CR^5%?ff?W)MCytvzw4+v;O$4ZjKaC!=4hzxfaRS}{c$ zy4?#~dDI>7Jm=iB`-mozI%${}^N z4(5~Ms%}m3M$&Yi&KJ?qvLDg)%BYjlA6T>-(i3c)#z$MZTWj%p8(xszcSjxDM8(8C z#45Wd)Od!25x#h{%q8Ra`9rMNLWR$Glx3?P&rjkBoAJgt{YIy~mIMAUSd^)lw^CU` z%1xh6xY(oJ!ppzo7)?nhA2~m9Ed%fab_MOyr%-H8V1VQ$^#kYx?vT{5?fl1>@kw{P zepHyjZ+O-Qd-QJm2#KT4PC%z zE;qv>;{}U%BlrM9Yksw3C)MI5zo~Y6I_nQZXXkIanyDDcE!pR65I`==P3P2y6~<`W z+j{SMge;%hFr|UvI@9|_c8Oa#U3N|wQD8Z-mt?0RCfa*ByHZ{+F}h&(8K+o>O6qF+ zCsC?--)*Z$I>j$;cbT~rZFBPOdL5rAV76K!m}sL$+wv*m#(*vJWg3^Jq4#&%`1=jFs_f0bRNSmV# z5#?kJiD8_C@BSFhN$p8~sM$JxoS=HKrk5Lt;)ixR$q|~jO8OyqbaOG*3`g=pwwkVQ zjs`T|eWVV!4T+9ZY2UxmEmCw^o!*dP-Mpd;vjs0jii#|1M=4e83-sxJaYZ6=(nt_Wk1#%6qy^I`gW|{qP=f^5YJKDV$RvWCv<0;5r~D}khzfKZ z_dvwX>}J~8^yDW;(czljb5x264Ph(n*Z$LEb=QCQM_^*)m;?JamH6TV{@0T}fWndE zW`Hbs4+<{$(}8S1Qdt(H1u?rkXFR^en&s*c@@598;Osy)XX-s_J2$AM;|>v!y|1Fn zo(@ZpnXU_SV!TK-I2R^osnU3vxB@%lY^!V^R<(GfHb#j1mTkH%^) zP(XPfW7T!ry2m`%T-SZdAhr6L$l@fbq+eMsDngF%<Kj|%-QXS#m(jg;Hi|GqQhEBZ|PfQ)9)rOi7w@XFm`F;m7Rb7^62|0h8F z?b*4kHq~OjlxQ}|QvkL}3H6S|4KQeIre%|GaT1V>GJ52|@Hc&A1&t{ou!tm6tDkyF z_On9t20~QwhY*;5El`3XVifbJ!JO^xXfpn5Xc1j&brqD!mvk^4hG5f5SORkf?xZrY zr;q&Y{~4f_B_4E#2{_S;ZcozI_Gt3W4E$S3A*{{;?25!t{v zP|?DD5-&cQrSEL_tnRmlH+83i>7kg`^L`_P*N?oV{B#YQlN4?CSC;=(zeXtF))&Kf z=-V*DHuSyWnd|Sblt|}_5h1L4c*?3q&ylQ2FQ=ONurNlN>jLv`^%vQSXD}yeA4a%x z(H+*$FYfpyjp09RT;stDL*@$l?EpbA?=`ME4JtPhRiTit(%&)Dz-Pn4b|jH{|3t%6gt1FK zz!NtnFg*oeUmBIUWxeXlv2tPGb(;2PuW0k8U&gm|TA^#OL}Z~$PYSp+oQshRbpL3L z7mc*ZnJs&8c+a5bBU4a{zKnznlAgZm4+OCiBSmxolz_Wxmzvpgjg4Qzb8{N^@r2>2fJwBh_iGOH?^TfVG(r9o6L}*I}Jj zqp)l(380!sPH~K|;|7*}kOo;GiP}Dah!87pO7q>@E5;V_x2WEzD5+rhi#Rs^1E?)2 zI%REEAaiOiP;{f_5KZTDjcUnDS_`qbJMbMv3Cy`jIbYN-g;LaYQj*}!vQFuOrSw!N ze@lwZi#9ytF(1n6R{PWOunYg{v^+nF|H7LaHyhD$~f*JCaul1vXimpYunT82an#{2Qo6AhX!>+ zpq_t}H&<#7zxVhASf`Qm68?eJ0#hSi#Ok>los)oI%%&w?qcSTpV)*UP2+J^fwu=Y0dOYgzYqYVmF z1lhSpnh25cYyM25-{4fM;WUJe5qS(IX!k=S&=PYH6SCku(8b0(TJV7l@B4QRHnv8-_4r1lTTeyCuO_24u*dwpyTR~AW zIpx|@+$_A1@Gr=X_fGg$zJWAWLMd`NnbcQ_^*)a4ls5YG;Y>WK8%UhGOxLAgGzSCi z@F`D|2mp3A!H{HEnv`lKv*3Z$=Gp($<(>?m5YDnvFWg6vO_-2tib*R<*9Z2HnCj+h z!HmT-;a_g}N87)(;Q)6^i!rS_06Y7z)eJrsKb~t9T>_kwkjUBOH6`vgCnqksPROZ7 zp#VfJ7z@W*C+^fiV!uS?U}|xp+r5;^ z6?-cM+BS$NTtAoVB_IoTD*inNmPw`>=cJ$z`|tYvOIan>Lo?)$Tf7xmnJVLXzcB8N z0_tDGs@eV_6m$gcO{7>XyVjBWr8)5T~ff(emmjM!2bG} z;k98!OT0iVaGQyXg_;YEs~Kcjnj7ruoWDoH;Zs?cy)0tJt44dOT>xb8Fx_8s*ty__|q)W2lf!}ENGHzd?cotpg-K1 zb=X~_l1Uz>ye^xf8t&0430MW+qs0_KWg`*5gri!prSufi0ZS%|3igLfYi~#Z zHK;?g&EV`nTey|g%L|?zfQLiVaB8c{z|W_yiCO!F9;CAz&w5djEn!IENYCQ-bs2-O z_S!fpJP8=8R=VH%={?xSkHqO`u2NrgF@`lcz3D-K+Ugo!x|1D%vrzLCUr$mj%g|?> z>6%ed6@x32FB1+yj$JO_D)yCx(ZpTNUv2QYPERjYlIv%v`fa3Vl1d3OrPmhltPiY- zem*W1fT+~w3TS`*QY^jwr8z}JqB;YH+oqWcZ3@HG1-#(s=-hD2d>8y`0VWRd#(Qv; zu~cF_(daYn;|l9x7fZ2kBj_KT4;M9Dx~>Z0kr~)((qd377N9Z0A4q#46ki$hv=(ap zR4|^G!CuQ&5KuchIJw#yS!YN-%P?&W7aEl7qA9?=Uz9?)yK=OP1WM;SONnkf24etE zK(N1%JQH$6!UhCGEd~@pnZ%1|>2_+p{IalW!SnGpZ_I1&`Ir_vQz~O}KBp@{Wx<)L z^B9dp`jsP&Z79<%6}#Hz(?r@3Rg(lTd70wFwX*2-%PZ%ofDU91Axz~qW8y{qQv`Z0 z^-fFKXV4#dSWeYz+`T;~Z|xljVMsXdT`2%bmO$6% zwnRwZP?XDdJZE%+Pt#xB71er}TbXD+*`a;_2ZK)x1ziukD3$)1n9>@Uk_ufX4LE2i zXE*DCGG4hb=WXoY(|1BO%TPa+=@VTiB+WASbJ;^9MF66sM3NHl_$k-#w&2+lx5WHm zCshHD!)Xm+SUj>98wWcXcRcz*SKX1-sHf0F7B zNz;Y!>@>+K^DcDMh+>GG_+BxYX|p! z77W#FtFuJMRv_^F@k|LG(g|R4D2XyfC7P^t?KdX+l*IPh#y4HtZSKXvd?}eprlKht z$4-Y)`F^GA;yoTQn;$L^>DQ(EFut@g4T~>K{;klEKcLQ)T)x1%ly)t)wGGea+KLV< z9Z6^@_Z{Xna5_{y3@ySAMDOk0l@eX<{^z;TB(2kQ8FNdR_MDF$;?Ab)Nbx?UX_Fse zlvvU- zP&!ZV74S0LNOL=r;$4NkOO2W+G&I>k6k|{_Z@O6YTYJ*O0>B%QDR)e`ivqGa@GTjC zd+DTt4b77XXpp$QED%pE1ozI2)I&(3y3i+R3mMCUthi?W;TfN&@bnvEz$asa# z_;;N?@qxtzLk$^Y`ll9z>lS;zKOdGSB8jQZyd*^y0y;(q{KcZ39u-7cE_7=nr#7{% zqPn2*w&et#?Jn5FKyE4)dMW?)ZsDkh0Ull|EdT*-`&;pRif@dy5p%94 z+mV@zl}p-v6J>=#tT^6MPvco?^3$?5uAIja-tXCr)I5^F87 zEfZxxCNV`U5N8gU0c1L~!4)5cwE~DdC?#y&+qSL~@FO7n4i5Bsue_2s- z#pU?Jsgi2^DhTW8tdk-LmES2lLY_j^>s1ksaH#BL>%Uhg9mX%ZkT(l=idW>|zHG%z zB2Kt2~IiQ<+ccMfis^nqk_Km$~i#IP1UpBPr7sv@YpYb&chCWvd&*!!>J z_s^>bh&gyw0TA^${@VW{W%}p|-jvft1GgC!j*V;AnZQVr&5CwNpyJ9R5p)>^Y9-N`cI$BCa?GaloA zlhg46w=Kvlt>kc*M=JSe>|uTBvRY<+Au$K0z|vI3AkOqEmI51AbV84I1q$SlV-DAk zYj)%6vURbj90{b|_hhjtbk{!W18+iB+-!a&VLMx`Ik2|s7VRyw? zv83QYj2}}xCDR#+`n{-HyuzLEl|4EbllKIdG3va?DwxbPyH-8wuGCkztLIBDSlVm! zV+o;`^;q;NKV(ilf@kufy{Ih9xibkQbxp5Ca0H*wo~$##1SEk=y}Bq zv?xv^gNykZo$SrOk%jp^qS5vr%@@`%8;$IXsAnF%B`%@!29xwb8E-8`t(AO!WxXVq zuA&9G-1-*_J-AWruwE)v`&cXIu8FVDP?;g$x5S1ntX6)flMy*dTeq>m0t(3=nbz6m zK(c0npwn5?`_w;EfKQ^H8`!x;7QlN|wJf=@ht)W~&x3mm^xD&!EbEq4JFZX#EneI- z=><(%id($9V@WA;yi){kn>lr=Bn(oVSk2mrn@12|A^BlkTGVmqWDXYcx((Zp```ile9=a_5R1gZliOCOGLHO+y{5Z(8@YR+7 zOUly`5GL26@Lgs`uEK_I6|lBRhqM7PqU*)3-*}AEcpu~J(d5SFl?0~+C2l7eu$lB- z;auoG3Pz?9+ANL-q%F-5&h1&2lagHQ!*l`}HHekKHXGV)>A~*{4f~DO2;T~6aq(70 z#Q3Mz1#J(&=f>)h_t}5GV3BVk?3(L~2zW}8M(2nK#f}(Ca0$VUar6mX$k(@0QWC0X zyZ068G|RVjVRN|i^M0&8B4k1KVz{bky@>wMy^J4QAOCrd!BDcFbcNwi0xy>ZbBGTG zoygaJGeK_w(@gm)B1C6mEB^$+;RQ$nu&Xvi@g#SBy&!;bi@Weha;xFV+2~lC0-p`7 zdV|aZ2qD%Z$1w8Mg-R{Q7yWk(ycM>J$Mm6Jo{dS4zFl7Yeq*6 zP#!Z(6P-(kQpGvi(c$YukX27l;^%+eo`_nevJdL&B73h3s>EZ!_=^a9NMJ&>EjlAq z%%8nvZqRiL0|0i$WbbN}SAm;EA9|5fE$LskN?d9q0vYhArUWUu!=p8_)=yD?I&g^9 z;`E38jV87G#PQaQ&k(G8dRW{N(^y<9Bljh*_)q4ULh&t(c63G*#iT2_+YszLhOt29GKHK>cCF_U{3in`E(aUuc7W{(UA zfbQWie)=dlJ)ma^ev$kqi68n|xLBrX)lQlke{={FDPPDu>Y!pmX+nFTF0TNd}1geEtlWspOCH~4SEm9$dlFparfMKX?xppDW0^8gX zvOG3f_BJm&JguAPu{FI-hpsEL(JT}ix&+v*dpd*kdLRVj$r$k4Y;X}5Eqmum7`+8} zf@RaB_yZ@6G2Az^NJ|t^*$jGJ#eHHGHQz%|KgBBmXS;7<`c@os^OBKT*3=-MFrw%yX7BG*+A> zrqn!+h!m=jTpm{V-bl;|f%?DJPqk(e8vEs&>gil^9jQq{E!sHRe(w$8Q2?s0+Wk#V zM{qUOG`b#l&A4=^O%NV~xT>=OZDEMgIayRBvp)91l-OOp^xkC5yvMPnNe%%tzg6l< zRJ5;Kh>+nr;)N%ChPnm1)^o6>y`M0sh`%^N-d2O;4PWRTP|PdgLd#2eSg2f!6|*c2 zoH6mUMehb4>uO&XJ?dq zuiLC@ZcOt|MF|4kY=JbX_@M%7BWq4Zr&!Jm17_@2P;VHAgjr4;s-L1Yo0kW^u{CPV zGZJ9KE@Qkez0_^HRupPRkPmN7)*M}OM3nqf+f#3GXL!=ZC?#>|xf&y(I{$N`qa@-? z%r2uHJ-Z2Xz-O5BJmGOIO&fPzF}bwvuAct}G||iWJF)HmM>ZRkz|yvWyCiwC=tuFCZI2IRyPs2=Fh&k7uwl)_mbaQ_ti-({ej7`F zz1fHmKOvq^b!z}7i#vIB)Q+fTom)<5&2+?QubFh}$|gpD+z_=Zb`~%z0y&#)2gIgh zl&U6S>`iikONSNCPpW!9-a0OahK@s ziCooCL#8YXu$kdZgQH#}NG@ZEbAnoh<4SfNvUC%*b7xxe!rA%NWTJ2Ulcn~I^jrMO z78Bjy&!WJYYy)El;ot4Sk{|StW%Y{B`|S@j!K5X-hiSDm>Sg1J@QL~3xovMQ=F`3z z!@d(#S)n++#BRP(^SE*tV?eHf1NH&Mlb@W0YFKv+hJ7KCD{^~8PR)^gl|ImcVipCx z#7K%Os8?i>1EWE<3PFMIcjj1ZQBJ(xH|TxP2%CZFH_XrJ4X;EEZc6CMOcUwS2-f&7 zP$hk?+B7>L3n)faWy-IE%>4j_M8~BVEKb*U{(yj1S`Sq^IWl_|HAU%+m7$x--qq{b z6P_e8Id2bj#n&R-Qdp>)7c6nE(hNVSxaP6-w^Eu;?>0V-#S2x0iuW%CuofVVtltTN zwB3}DuXAWldB1G6Ge@{i%=S-Fe-yHRL*qMtwOA(vn-{QTPk(?r`9)B<$n{W*{C9wV z0qV7$MQfF#gwJn+Mngegbi4f_k2X^Evr~?o2<;9#Aa@>Fn~bLepra6Xav`!Hbo=&g z3L|+2W5ke;4o@c3o3I`C6aulJ-8CY_aw`@^J<2>j5M06p2Y>CChF8KE+WZP>o4(u% zm4jmK%mUBjOp_aZn0`55l_hWxsSI8wy>=e|g=qTXKA4k)BvK@A3!0{pE=R@6SmyD- zvfx>DSaVKBtfi}R#K5u7et||Ep@FyMtYJzj89u~IEgi_-;Rgfm&5#P_yEbU|$ zo(0Z9@Qv&O2Nz2ZAiyr6&8O?|ZQnY5p`_AWf#rtvc*UQeb6I#Pdh`Sb3&uH4tqvyu6 zzh|-XD>92l{Q^j8Q2w$i2zQS(KJl(T_aIqA8YEzoSz`r0azQ$CrWE(zSf};Yw+2AF??Nc z_rprar?7D=S;u=sU|9#C?Jf^7yK)`$%6G&-_0@&#g(UzWxV|I~XMl!0>mZ55$&%6r z3R*$+qxgtem^!tt_dOFr3ZVkQwvV*WND`1`Pd@mQJPS#!*D5K*>p+OmH8_g7G~k1? zL=+8~0^^K?fPCZ_Us7|0`J!*2th$uA9wjpSX3o~;ZTG0DF@Lgv;5?3myEg(>kua6g zk1fE8EV$O~ppmL!&wG(DJL8XnfrbDfY?v4gaTk=qtT4f@3U9{5f^L7%`Tzrp?2V;e`W}`XO-)R_4Mzjh4IM>~qf@{FCIB&n;01OoMIZ!YX z0(cSc9PrOYG{E6@vv~BYQN*yD6dK3hP79^5A26dax`R%UX?Q$2h=xu>{C&^_&tn`+ zJkGq_#`hh|E;7H>q~&^GAP&cOQH`Fisj=P!2J+h*RZ>}Ch9Xj53qYDCf(x_BFxW)! zAA`o33Os(cc#<%!wws4MkdxsSIiu{)XCgQ#dr%2)nb1B+*%f|H zS3aY$Tz*14N%M6$n-Fy|a2cG)XWz(66HhmXICIt_HUOc>=2niY;$%NIm4Q{$BHDql zdPKUj_Cn{AkYN;=tq_Ec3u5I?@)dAnLM%tTS2HTmtYM2 zVQ{D>$3&R%FX1AR-W;I1!z#DiG+5RXG=MHy>c z)qgnLzRr{(Om8xwxYV-WN1@r^(Z^Q&XhlS;7 zIB18a^Xl~84K@aNVJ-FzZO5QU;F1~^a_NGCgr=2m*>|}fQDn0q=}G4|%rxtX3|)}p zL^WX#NnM*y+L2FpbdX#GK+9Qm4Mrt4+)pdOTgi;F{fQdX1)b$+OUx;_uLq}<|AXi_ zFCs(jvZx{t>T9pOVzdk-CFl_npLQ4&!UO;)ms1#^lfGxvh5C{#>&SEej4Z>x5Z<;* zYSS}18X{hPsIv^V_r*K{FM^}L4>T0~jheQiJVsA#nX^;!NDV85+7H1G2RqNE^W$2> z1Bb(t>ok0iXK2#!xo_0Ex+!Em(^r}u`-^Cbp^B&yc|p(T0hhP%I-Mvv`~opI9v+K? zQtL!yK-pF4_5Bmd;mk$-0M|`U6ky@$Gr5Y)8rEfNgaz3jr^q&epGNDBNb4+@9r9l# zFca4uEvtg!oZk3kEO)u#lJI^ppL<Aj-5I06Im7Ax)++=SMza@R?;-k7DP~?Jef8+-E&v z@H`ydBq<>Cw1A{*f6!HI z>5oFXxlx@YBS0y~mbeu6lK^&>%Ms#KpgKU{hEjB>9y%@pioj+e)S$yBn>EGWVP$Wf zhflClJgvk9V4k$xI$by!Nk7!!<#5b4!+8#1p~Rl>Tc~vInRdsyWW=K9Icc>(HpKrt z$?QZ2Q)HeRcg>@){$Y7C@1*UAkvC%E(0m_5!B@L@&Xsmjc>~frHqZhcR9UaMa40k7 zY0j5@U`T#{O7MX;Q*iLrnt>CG_j-?~Y7r^8)xNNO_K=pmeWWB<#T5ymR!*)yn&&F? zf*Fa*W+VNqLK6id>Ii#UqPojT-_9dH+1#W+ayfPHZoT6ysYhH<3$^6j>T{|XA0V^X% z&mdNh`>hpWbX}wVf5sKJ1{Gzu3mHxs&Aa}MO8AzN--F;P4CPmlFcR5vdc{SlEwVV0iPentpP-}8X-pswIp-mK_D%UQL{q7 zEu@fm8Q7s!it)`@Fd)cdX{N~F-e zK!TT;BwR_%zsu*^BIFF5rN2#pMA);4~j#0Tg{|Hz!{scZ^Ws*4&v}VNlzi{ zZNeCN@V<%vTiRxF!J|zm)uF_uv4vNu1-wy8sIt?b@MeIrWGND2sp4?Bm-Sz~cqM`v z0_#?^(QI*WBnyArG5YBSP3ZMH*JiK6#SJM;sf~aOKh;*3gCI7iYMAx2%&hA9uEtcC zu($2+$=A!ry6Ep%jf36RZZ|uGtItm!THe=F(508M>%Cmlrnt04O_lZa4C9wwF;e=p zqv!mzcex;_q*OYdK|4wX4OMdWzd*E5b-OH<2%MgszKzKB_I^*1z=AOok;W&af)x0d zWC_U^8G^5chyqeM4Z!rq--kL+QLS8W(FwG9P?udIoZ#Lf>s<+z1%xQ4 zF@<=(qZZkBjCjfPjs_6FDH>?t{NLRQ?4;DicXWyVx`Tog3(sW^oMtlF$GxCHu|a&itA)S;)mVT%KOit zKaYZkEbr|ow$`lW&aKN9UqaX`F*&rfOlTd4vgxRft&=$EQaetA108~#6dT0<9^dZ6JQajUo=SAzz2 zs08Locq+S<`3eKjcJ6N{lB<>C29?l zjv2H#zpgy#B*)AK5uJij>Ocle!LEhTIOut?r8?24hO-MKbQuhtM|ULc1|fur;kvuZ zlEohP*cBB7s8LL{_gjX8o?wnp4Vx^$#2HpeSTBpkNHQ}+LmN}A@R7;=`>4O4-tJA~ zIHg-0bz_k@F$T9oi{~PqeoSrfIwRwe;&gAvF$=gH<@WVwxc$)=B}%!&1<;a=Mdy#Y zz%sX*Io2Rd;J3=kd`^XKF0NvGbokZZue(p zBI4vh(I8TDx>2nWgB{S~DYNC5CJww0?lYQySmOw{#jDvE)>!u)*a4Ryqg$xvnE=f&$1q zYB)PXqW)3jhx$=Y%3fe5^wtJ><;=w6yB}A?<0X!^g#^T(=-6}n zg(e~X1tp7T*c7vgOHVD$Js^NeMz>S&ksd*904`fJ&*t#{H1PHGcn39>1 zqyEiVj*mEOyuF$7R){WN9l0z;6*qAHYPan|VQ@oT-M_{abR3I>*nOtFbsrR8DQ0L# zP3y-)ulMrU&2-BMX)WPMS7n81ICIY=FPHt^>Lgg$sn`(hCpdM>GLeJ|GzNM<+K7#s z@K`hZO$6N)Y(>px%wgQ4&5GVAXP#TcSZ`~fL!mLM8v0(f{`rjCeF?VKOA4qJ>T0I)9=Et`+Ac18Vj3<{GZ)2X+`2;lR)aR&N(%xdileoCAd%AgHL|cRJ zc$O~2`!nN>hokMThstICbHd<0@E>TZGo3U*)uiLY`Ylb{^k?+vW22?5BD2Ez%(>mS z4g)ddwlYStY&FVQ|2ViNloy_*;QhdEm&@w&MZ?H~YXSF1olnD+1uA5C20{3pu=kGH zcNZGFVT)FJ>L-k;cPaqk+zky|ujQqjN&R1QJW}w8&u&yV=tG_D?|pbzR4*f{&A9)0 z0%Cs@`s?@%ZB1{P?`sUJQ2C^{KLc=0pGoLmB=hc;Cx7GQXS1{V&TEF?IVLxuRH=fh z7QJFgJdjf2vEV+a1NRChgHm)KqlcGx`5!W8PKaF&&_?RAF!{^bwSpJ7gmZOP(JrD4 zUtLeNQbW@Zrlc;xkFa^yh%!HsJS(YNm=Zu+me<~{u`p!vP16z_A^Ac#2!(^ySbpXf z${++FIHLG~m(F-L4*PbUXckY_Pv-+;vJ$3>E|XY7c)`Y_YS7j?s$rSzV?{0JxMvOx zk^4Q&`fpT>Kj+d+$uVo!1=ec7pFEJu5^Zr7U2~uL>N|qNI1xE`H9*qH9UXg91+L`y z!0<~6aL&-$_N3Zuw*CC}OA-A&A;Omq+QAQc&@8M7FyhVabXlDrv=^Gx24hnU{R1Wk z4#kf|5RIEU7FZZHrR+(@6nr<2p!!xg)qEJ2HyGj~dsUd4@XH{w2%iTw+0QXNUVUhm4}AARiPwxGs2qD->zdd=SEm?QSoZO!~G(4%+QVOa)EYAL?p$Oa{8$F^p;O-AfoGK?QTyK>eeg6*=CSOf_E=C&y9vjgd0V zjJ`nCJBUH!gW|0W;RB{6;Hct{N7=6; zz#B6v`34Kj22?0H?N8UEl(Wr!wcjCAfU;wfGW3k4jzl^4*o+{A)dA8_I zT-^qGnkW%*vt&Bqz6d1|d1HPkB^Bq6d ziPQ}(CbpK>1xez@rh=GOvXYvueX&&vQ>#v$VD%h$;h?j6I9@<#YCiz(_OKV*MpUZPn>Ln#P$&u>SnbID7xy4vE6 zK`(vTD?)cZCayBj`>viTkBY#kU|fp2AY{JXn})%d>E(;**+R9{zaqXFO|v(_lb<$3 zF+Vx13JG7nLwSw+q$_svmVqPHG;*fCp;A1 z1aWAWu;b~eLy2i#7>0U6!x8)8GK_ij&?&ZIsnsB?#&F?B-cwZ|#)nhVdb%Y!`yjO@ z62qkEcD#7#4Ju>(%M%M$+)0|U#r=z=RotSi`Drz(_p+lN3* zF8t_%y=@}XWEGmEvJ-RJ@8HE?&h}GFmM_|Syqh&E(VbGChFviX+u>i4G%85}aDLTD z#LV?bV2)CtFKaJ3Xx68^#=V8s-q%_A8o2V5oAoa4zM%?TCj~Cf`0S{zV;Z6=f*|!* zsM0DAj|%MK*56z!S(Gae@F`Y<05K8o^kOkAh4<^JYi>fZ0QOj-mKxFn+5XuDUAjQo zz<6TBg=OAmwSbSOc{?K`ojxGpnSBUCEVM?#pefP4iIk9F&|QZj4Js$O=n%OvBI*v0E(bl(kTvs)QHz! z6q44|vHH-h-y;aN_^I=Idqk`r{AkOc97~_#S+0q|0%Hf$F4}KJ*HZ9Esz?}})i$bL zrge^37`BkSJEn5?v#{$W>F6t1271T$j2TYQCSJsZ_n^P)?0h&hk2$KK&GR%)UsK=G zJS1?$q(=4(k6AzG-QjzUpdDVSgT|n=k$p3&b`cK4iL%#PuYlXX2|FHQvCW#N7q}`m zkcCFnG?1#6`wamziuq?Bdk*{I`(2DrgKFWcVGQzJX4TA%@#?7Wh9%}-dR^1v?a0w z&)b+9beh%ZTnAZ?_5JKCJ*8T^>fw$Ue20)2fBj!X)p^@Y=n&KAd|uSpEP3MME*-FZ zA!?hB5MOuGaerB-06@aa>p9=)Pt>m>?^8H)!itJgSTkHHq63y>>K?G23pzsrW2O`P zM*#DGLT^$sS9(dqU=`0zx|d8^QiJRK9^4`0-jgBbNTAiFs zZSVvbihx5YuaCFJhFL&vN^Z1wC4%+a;3ei6%VQ3s|IyEb{>vjDH_%v#jo&ySDPhwx z{A76>=wSl_3g=mkh12M9MZy>n3GOL!|K^`^*Kn|W1saI(u%sov>d zRhc5;N-StLYt6i#^2St%PTkv?4Q_=iBja9Vy0K8Px{axVis^kg_j*rIWE&YUqVOf_ zGre9>MB9^vBvKU=4^WIkCFNX+Z+=UCRSC~}4XE#-MHpZXJga0pL#Ci*S0;4C)llZB z9EZ*0T38{erj}7PYk_(EjvgK;9ZCFaK|YWuZ5txDd#)ptKQNRcB;f8nMR+1Ca71ohvdO;{6|7%ls)}@ z`EzpN?-O=cK0za-zb=7BMdEybiM;60U~4W{XaAR<;<6Y^_V%Ysp_`qy7w4B0kPB#f?{?Oc;*v|TMIYKFVYhY>Gm z6!3Gar#A#sLMW}Y_18&!F0=S6u0L>M@8TQL(P+BXcG*_HG^iZh3P6fY1lcR^666Dt zVV1E&JUA7bzY_jIE}C!_wuvzK7Da1h&tF@dy@fxpPI^Yon#WATqcy+_!Fhn1SSpJq zEjv-0Lst0Pz6y!bP@5uSt)a%0ys2gp3qftm!N+Dk)i%Sc!=_@TM@sEGwzE6~62E95YE!fkK@iVANY%Ut9aqdc>D+xe4TM3f#duH|L3Z-_Z%F{omXqnJD-{e*cH zKme8skY}s7DW`SVm|OliwD4S|YvtRkFM!1QBbfu@@#(@Cj1#;ZR={@8P4&hw2Kb%B z-yt#k#ow}m<7^lSS$fQ&h(!hl5>Kfc%iBzwqDDpmmlQ-bldRev%J1+{%Uwz>QNbtb z#ED8`>SMBGAq9+5!ym&IR5@p8qIxlZ?=7CXX=avfhGmJdS(ivv@fx1Lu_aMGe`fc( zf4&Q2Ui*{Ny*2nnJaLpw{}Z|kTOqAbCW84Vk~5p~C&~5+<(7_#Vghi7ZwOQpIH$@H zNC9Y+q3=nkzUV$4T&|*p@Jf7e$HG3dKpZZmlEEF6%4awy<@SD%r&SlLs%z6_6>qrT zcyR|bNSu-w&Pf(@@dSW8M>idfV%r?k$}G{Iaz8Oq9>6GgNF**N7#I^#_GiEi_wfG085CSJvTVr3pz@YL^&C7p-@GA zOn7Run65>CAo&FirnZ5gXVi;2O?{|6v_ygP^HHZsx$iU22|t>aL?F5LLL%jEqrU6N zo6pRKkj@ZsOSDBSz0>3hW|m`UQREqU__?>5Nuz6X3yi1#E0UPCxvMtl!3LXHI|ItW z?({jQ8K!DfXiGR4w1%(d)U6hiz)3Rou)Fg$1DAdo!2HL*euaNL%|FSWU=Q^{eiT)c zP^QfR_@muF(u>J<+J=DG8~Ly(0mMtsrA@_q4345GXZHMjCAhBDyc8qV*o|?HxyrVuS7Hf=Y(%FH#`|x`6eA9$oj=#(K;7ni62Mr5L zm>j#2@};6{%!U22?-l2K2Opxs!{8u)`56XMWsm*HBb!0@aw{on3X*Xy#X8q8j$>_J zKMDg@I(oPkv{0@tfE%yL|IZ&*bTCqd8{I|S({D=+zeFTXeHgfr4Em9ZaelbV3}GK` zQ3t*`}_IOq|D z4rIwHb50kMjln_9WK`{dEk5~DO|pJzE&$z9tQl)=z-^w%YrWdF6%lYTCCb5`)rZi` zW}|)@dN|{^$xpq|=wZKumE#YTchtC%RJQL4c}R(BAP*!gZeai1uWvXZX%;N@ccC@` zawyG;;n6+7$eXxxrbm$&hAH1#EXWr}T6xLW$C(A}%Gij3T~#Q==`Q-Gwqu@Szi5;t zl-c^{=!g#8@T;d5K?&QqEM!>9_Q|SjD1>=}NiGwmijt}3Lr3?8@LuO3vAKk+`!i}H zF)e<-|MPWSbZ_>0=vKemUrw&~G}Bs}Uz6lhah?=pr!f)xBV%(T^5U?MvWpoOH!s2l z;&_10Z~oZ*LOqbb2)p7F>sbq1nD|=Tvlj=dj7>S~afmZZJ{~UBjKWGVn>k5kVF|3? z>M7tq&x+K2bj$5~qA$%$MAZolG|D%A#@KCQkYT*Hs_!0-b0*%elY^AJq7lc+%Oru; zDYwYgdP!$eQLMG&8ThT);)?5Ux^mEge_vH2cT9SByVO-IA6vD0ByYNl>I&S&&wy=T zhdpsdYTbRVl{zbv_E4F7NgbZqm7xKSib#;^=p!|EjQig8NmL9cu*A9sq+YZ967v%) zl#JY5Z<=l~RHEDvh>FbPuDJijp<7hFB8rJx}9&-7eYh zhdony(Xdr%NM*mp#a$eo1L%(vnRCb6KIb`nA7lFXy=tOUMHXg$*@|AaPsf6QS@}=k zLU%L%sen*h$hvVKH~X}K%do1>JJW{Gps*k<>gs(cINKnf{^z(E`U#7D-UijA$wP3) z7x|PUG=M{SYoou#0PQVSmGE$M;x+J>T%D^#^o+etFPQ;c)~da)dxP`BpSRvj zx4Gf`F$YXf)Ea@V9of+$lKAiT#sq6CNVk>q-+u%bGZx@~h0SnElgH-P*tO~%evFDGO*!%5BM5nwY8$XM%FARNjYOXb*^QwY7TlT?T)?Z*_5 zU2Td@DSLk_2%i zq)sjuRuSFi>~9HDD5B~Go;!&;I1dqeX+w}7ItmHJ;9g~26+ zteCK%XNGHlru#?u3{hLNj5S2qwNTDY&9W_Y!kPQG&@rYM=XNMv3`2iR#r3%mCG+iNf%!N(GshNM3nHz zZRV%@I3*OI8KJ(3#SMSF@T37xdL_=CW@`9QB#GklN4&2?Cb)M?53Lp7Z6ChC6*x!* zcLHUEee&q_+8Y8?_SU=P077SIsh7<7!~@4+wBAYjOh6})F-@6Ge~Z6}8h3CIM57?3 z!Qut#v!0dxLD=WA3Y`0WF09EHO4))6X6@s()}BNEW#K09Z@9*5fBube)_hYNsFlubet~YyEP|>JeZ43{q91e9=D9AbtMSL-BjDTB~urnd))>8 zv{r_Cq@0eMwqnJp7feGBXjVE(XCfk%Qrxa1ps{*b$Dl3O?8xnm%M(QvsMK-8IiU}4 z4EgTDx+938%<9bcz2Im1{ zZzT1tW6vZqB0i{zA<*j}Y8?BfT=QENqG))cOHS5hu{2#v@K<&8{awN3XPusAon9Ee zdSL2;g)N3CQ&Cs@8h%kiDWps$#RFR7iqQX)8?_NCoCPkJ3jSA_91BVEt zr{${E{@576L<3g63_A~hJgyHq6|<>;hCyMevVnTkh#s|MU$KyWGrw5rl3+f3 zD?3$$(oK9}8A*MLYTgma$p3lTLv2ZxLBDF@x)JRl!3Tv9326ewlr7u*pi$2;bHX*l zDNNJx#$Iof&VeU>zm`(z3g++rf3O{>MWeaC2QRLrn-SD4C>Q`i;filc>OuV&135Ve zunswL>9QK?HG@#it=uRI7>Qk=HqCQB^?s^IEAs7Wd|7c4Y(82M(v{* zX!=dNBHuuZxBey+~`i&-iIFIUgv3 zE&f{frIE-^X{E&c@2PAbyKCk9Z1X*VO#o=kY>IWUd-y1kSqZWd1-nh{7kY&E|Rcroa7%FDGx6 zs5&?Y$=lPHg$1sY$m}%44t4{kns%`B#U5RU6k|aZyTU0RaSE2z(GMNo0kJP7k^W`` z!8R#EO@}s=-0C#@%NlR{fu9i@VaLjpsbTyYpL^dZ3_Rd8_UxNf4RSl1T?-b2QPhYh zuA%VJbB>%DeV&5WU0ShYV^5sznFN9S@IE~iO%RIumne6WAI4q%WP&XY`|8fq7*AZIqq{TgBxqmgNncp~Aql&4D}l9%LiL+& z4EM8*w{Nu*&=*#<0sPL-$(#6K+M0=St*QPfgEdi*&+*y zUO}8e(~=Q-)bH!UIZXMfn)}me;4&I0{dLUaRT*|BQY3ItS6V0mawpu0j=(HBUDwRm z7mwkIL{poRptq35W4#}2Pi6J1GXLvwwc^*qS}YR8@+`M5Z&laDi9x)UPppZNKwA%u zY`M7J`Bgw|V}eQrLw*Y042{=ZrIyJN2%ocsp5^Q0LjKFJV8_IfjI{leKgy%*I(Ex$ zI5ThE-XqriBFCVSfBbsx5T@r*%8R{mOPrD2UG769D2KBAgy+L?OnR88kw}F89vI4~ z4TZhq*pUEaN0w5Yp0Ch#|IMOIeuM*7=Iw-Hu}~FAK2OF+r@iHmaS7IJAH9|H^nww5 z6GK`o6~c#9Kxu=2*TZAv0Ig2E_+~AvSLU-C@~hWp8Po(E1Y5#hnn{>k@r0`c?NKLE zu446w7&lr(-u|pxm%g^+|et2DwNBAw*x?C1iVtU|7>)Zm23?o z>DXIyFQblL;QTDAC?C8#QIe}NE!^IlIEe9P^wT)SF3p?T_VX{_uEw9UDq(H02l5s<8o#9HtnoE9(~jlmGND;;4`# zr+3Z3D{`>7z6M{$_?W=_t(pLNjC#+$qZBG3l9rO++%6KQaR5nmB)Y2O#gb5(H96_u zK^j+X9laCK)>{>#CQgV*v4K+o+Ot?8ILlLXtvy>wB=#7VhLmMkILYK&$FL1+qS`bYpc9vhFCUle8DCii}ZSOIzvb@$lZx zBcZ&&C2h}Q+jI5TvZ7O)MjexEU?Zvw5uvb=bqk5$8(N8T##`xZFR(C{36${WT5%22 zk__;5G`n{tkA&ZJV*Mb9X3|LvGHmaw-i>uIpe!HHGf4XIXOIB`dVHcTyJTt|Bt$PO zz1Up?!jp3UReDQ0_5u!*FzBHRovjY5c1gtTw>B)}Bx;)?I)5z}1YV1#TZeBKj65<- zcKNK~q$G}fJ@|KA#AtE9azT=}GP^jV<^tNgPMYccf-DbhJTY&xhHscjLl#O2eaEYg?hnQ;v61}#kEj<;KnT-J;MIt2nSJ21w1wo@quX6~op zMS8D8U!(`?o?LuDZvg5US643+VKam$OXdw>sWw0yb1|jtm9-NrUpuWFrpXI&`G(D32%Qf z;sdWt;X@Sx!2JxknQALGK4atjXDU-|Bf-RN6dkOSS?DPxv$~;FP|1V4@QZ3^ut3au zo{pEQbb&;MU|$#k+7mZ{?#Luq5&e1#mOf4TIplZ-&{1JE?UIG;6(=5@wQ@Plb6p7` z<~teR=TeuV1Q^}iknWkSC$G$9rHb@5_tXp$WC%-OC9J9iZbNfnZIA2s)CAxqkC4x_*dHjQk z)xXQrVstQ*>k_%5x!YfC9KW43=VUug9AP)Q{)7H$Xwl)ov&D4S7rx*(Fd6cTuhoP} zI-gFd-$%0PqU91N;fW=M7;DeXbFz2G=9SOpju*-juI)M+?5G@y(3eUUbjLl7+X3qe z(rDZ7vCC~2eGGx)!c49@+E`9nY;3>{RUlggM)Z5M^hSS*J#Zw1HD3il#-&A;$Q#1U52rzCumUDIZ zqBtbNom$M$bVIJUB2*<#$^Q^EyJaWRc3BNJxH#tQPL1+9Dwg5$hf+?Ug<}Cp$2a;v z!gtn-jj|uQ z6!ffh!s8(oi5WK`y$bd&>-s&3GHFvSHTe^rBHlmc8WW2TATuP+19UilvW=@F`mI7i zywyx;JY1fY=lzDY^9t*t#venQ+-;$(oLT~cNeVtP3TVSiiNIl9eLJCp!PzbeZY<@7 zqxlTn)HA6~<}mrs2JK!>R1q6O8w^DjS-~1$g7SLu(U@_GC;zn4NYw#|NKZXQZj9}1 zPu50(VF(U_=sP+}_xe5MlmtI!$_cnx;{f{5HB8vz6(+Y4R~EKSIYNQHIFr#=t;>9+ z4h-80jqZKR&XhSrm2`MI=Cc%8cU=*@X#O5CMHHw_Bk3VMU!B6`_`K~t{3kkm9ab&( zKU;VP)hF#&gI>?WQ1p>$k<-^78hlR9*a%IasUC~7wPn4R``F!cqzd9te&t(MimZ3N zr6$H>^JysqA`_&0?@-63hPkS3O>r(Mxd6yOTUY=!s(y{{7NiXc`X%)H&Pon<5Oh;m zAO1`Uj@;~<%s{V_$cXblY;>{2L-djImAxgU1S1!~uoc#E&?G;HW?X`qOT&r3;eYDb z5&F{gN-kiK`OVhAec(Wt$oMrC>;!jf*nenyM9vEKrdG$BI8hCnMWL~_ebXX>!k2wz zn7q%4xu=rUheh($hXJf`Hw36Q)_r?di6b4OKL2XV{ptPWU)P4 z4h)e)LeKzZpVEw)!A-jaNNx5n@}gJovd>*u>jbo%L;tZVOuDg))TGZlV_8MfgH)Wp zQ%uhW7>2)3R73rf=AFQHytFwDKU7T)GIk6Qvp`7^kjCnJyl@YrA&OPi#;@ zrDjXxVwRLpCCbW8$^x80gz}Sr8Q7vmnk$mI z9?-ptT{Wi>z2R3XyYtbOg>45wZpWaOpQ9@w_m6f}Z$=W9^R!F8KV!u*(>^EX;EVDM zFmu|wKLA#rS1o!Z9R#3u{cG`R8tj?cWQBu(yIb&0OH0>U0ER76YCV0@#^&4Jeh`bW>n z*LHrb!m1ia0^8C!L^E_OXydRx%+IK!ab^vNH4Jr2C_gaY8VesR2Bq}2>H`N3T8&La z?*nX!sjxzm4svM6kQV!#61QsfPShjGSP}c*u>`uZR(lA!ZkLNpQx6N>Q5V@XlJdnC zRZwOlE?qM!wv47WB^WM|ksxPVCtV#$OaAZRuFB_%QZh^=r58Zbt{#wh6RjCWqUi)9 z;3Q10NF~GqQPv%#{a%7y?Hp8rb(xpsr_2RK9r|4I@#Gf?L59L;f_10Ad}~p4lu?FT z=1~UF@ynVwEVgKY`>bp8d*DFu6Vp(1xA;#*82OnZ<)h%}Zk_5}wtGK9aiU^}mD*JW z$0bx@Uw7_{n71h!piv+b{mHQ{HUI2&OUoSIMiXZhpp6P)2t4QaUE@olcb%_R*u2(W zzJUu}@a^u>^^W_`f6dj`drm91k8wHK>gu1&0Q~kTFsM)zS9d!zndF9t3$_|UTJf;g z6vJoNymLsHk^Z{Rm`?e^w6ijIKZ3CU%W53byQ@PQin}4#nc_#O#_|j&n8@NbFB+sm ze9ZVvP|N4ZVSmuEHsTrOR%t)?K{tEv66+{#jVNTgI-%Z9pL0ZTmQ+2rw)p_SXBT8- zYWcXp9tp;Vbw!^vVW%u}1;mLC;&fs5Z_TTY)Z14nsecBa(Funcpx!?0 zOf-3D5ci5#+I5{J9S4eEJ)7@n;8HQ03TTLw9dw*Eks1JMbgN25bA2}hkGZRIn*m=X z=2{Fk@Xqu~^v1U_hpTUl(4LI^Q#>Q|h#%nHu_wI2y>-lX3a+-Pbxp9>Qt++|*08&sqPELbP;oN)<}PU9Nx%a4kHF@?v?Wvx(z6A{r}sZ1h}Ku7#-XvhuR zGB}e7r~;73Y-KOiFFuiTqYmydF~TX9SMDtb@p@9PbfemOLtb04V_@F3_SG9eESFUX zD*U{a7fh<)b1oPR(s|CEbZgmKFC=R}#?|$;`zUSTITZNN-5;jY1xyleK=O)sSRSic z1;E1iO2aYeeXWU0mVWQ^R5<+|d6is;pvF-)q^1Xq%oF2@G=R%}w>*pUT^QpLqe}Ud ze<#4}ulqHtncw2b3PJ!6Su+C3tS;C?H9tE(qm%P*oEK6&_Mmd3Zw25g1^j4Vu1VT^ zm~?s#Ht(j6F)GPewE$L2&C(F89B}$K>RS9_YT_)h(;kPVif2ic=6NDQB&85yaSGhA zN^4gU=`JsLt|$_smTQfzg0KGBm*FR;oU^~iQIdjO)=`wx5PwVV#s=8=C@&w*W!ft; zz%!P$PM0P%emt)jGn-pW5SNb!?DSL>p*ZKm7}x2{j?$ttW=UM+! zD`z!-EP5`f;Z8SJBaPCG&etuq$2(UI#eW;?I+MM`=aJ629VX-=^^8CLpC%=tjOB@Z z^={(|z9;rtz2VM%K%tEdC`+uh4=`;^a*0`l#PjUd47nNBdLzFmixu8ZqsOJJdZVm3 zy$k+A4HyZwh}|jx*z&qi|G_Ln_sTPYgn_Hbw^#f!z&cHB1#!^a5*eX3gJt<@_NueOAB7T z6PIhC;(6Pi6)4yX6A2DEAw=_)M;;_vrDXV|+cvxZ$W9AsTvRsxkH16VruY5v;Ywz**8$m4w;j|NAeNdOi7VgLR zGrKLXD)v19s~T!YHsWOy)sj=Plk(o1tFhDqE$a{mn6}YjV&SE^eP|*&uf%5TE-v8_ z%(EYQlRt2uMz)Vlodo6gyAq7nG? zkXl(`|Fn`Q^`(pC;F-Qt>gmMbPPpBU9f`7>5kRTu#7~1(d5nzr^+7$9vCu0f467r& z)DPqtrI#5{#9O!-wwZd68{{-y-$xhN3E+ER;oN=3X*X(Jru{I-X-}6XUY-akOeghY z1L_)V2Xj`+BLg>SgK!dex#RI_S(#rY?VmU^BIx9#_4Bpwz~(i97Z-e?@yQgf7y)hu zOwpY9O4jaKe*(8^e%bv^8}v=uQ;te(bt(-W5K*6(d9rdN{4T*iv~PnG0VVPl+6K31 zIXYyexy)xEcWr7j`7#0Aveq{Mhku3U(U5|t1P%dS+K;tWPBM&4M1$11$arD=R5pJw z8bg9qvI(r+nfpyG-*7A_;5Ii1Ikse1Hi~}3z>i4e{&s&shME>XbB1_cJb|6ku=1<3 zl{LS!T^qz2AygcaSu{T!?f%;03v{izvDzUuBpDkcy0h^(pwN8OYbXAcNG>)*wB@1p zuBN3J-(M5kxp{vqh$z}RX(uKewVt}Q&_2YuQ#fP_K~vKCNFvALWIJFm?rjVpLn+Z; z6z#5uq^|lBidn(GJEw#N59=?oOY*MF%Ex$PsyHdA6tq@QBz6fM(O3=9y{$P1Vn1_J z7Ke>ssTln|YI0{7*3U{qAz*Og(?Z2-yImNRaS@Xgo;>0qg&-|sb9yF|cmU4KJ4oQz z_NqxhkxZ_UunRnQgyF@u-xyrEhwqG-v5q=M&z)^?Hxxfq6mOp4M_O1AM>x>&i{lToZgQ*^ymVT@-= zGJXb{cWfuxucNzozvFjjGdzLD^`^I44-$U6hj z;od*Xd8A2-G5Tc&KK+dw$6(o~(*^wQeFFlp23~dyE|OxN}rAEo6`E5(mf(F*o1WKCCRiRCfWR zSrt8(#z9vXW@S}#z6ZIY^b6b1k|SioO*5m(Cu#s!?B%(0TiE`r|1;-u6ROft5LEf< zdLAm5ibT0kQN@drGP+3M2I1vjb-R9}I`*EfqB`6DkWOhp%=b)|eeZKE=#m6G6c94u zvsv-pjGEIB$!F#msQ*G&bbj#K7D>34d#SCHd~_M@pvp?5hS?n1LMy${WGx++?a}y_)wClr_Q_?AR%S z5xhC7VZkg^oBEDlk8nLZQY`Y7c&Rx+T{0o@S($+lvgga4I z1w+_hH;thAI)Oi<=>Qb`kEcG#FJkdjdwyyU6Fp0IyW<90+~f&Psaki`KANYbFYDT@ z)Dvh73!F2lGAG;0fLD?uF*2{d;;v6b9w!%^czUH1DSj_a-@RFu4wU~w6O3)N*xh&n ze~|1mP;&kL|HvPl&Uz8o$pre)|1#5yi}&^)BPEjBk6H`ZVD=he2TzsEtt2+2l3A6z z%kn5-he9)8bqXGq?r#El=_!>nr++efx>vAVpMzXarPf{(`pC%9BQaAwG- z^-QejIu(!zv9sAY=7~{vcuZfVr!7f9*TF9E+-}2ik}2ynU^~dy9o@ec=8j&X4FDB= znTHWme4Ru&gv?sV71D}rknx6Q+bYD{&tL?kRFg7Bx0VAD!1hC*tKDdZsEI07KeS5k)b{A{V}v9CTv0meNt5zS}5kPJbB*LE&6!4^N?rR0AOyHVlM7!+xZTLDe^9fMDQL3YLEw9YEXP~CV z(Wk+$CH=~S%v{TjPH#9*+~kl?Vy>dJX&S`pKuaDxwMkUSg(6vfQ!v5Q&`Q(3U92oG z%JF8bf(dW_fY24hxWiLd8=XnpoALvhYa4cxCX$$^!65t~#L)-Usr6QO9%5J z6uaEV4cb?(z&)>RtvFU(!|g+gq7>mtX>7A~9{*S+E1qU$AcfoxPVuKZwotKQv?Oko zQan;WqPw)?g^zskstda9Y;mi-vT! zbGG1(U59pbF*Ks5*E(J8PQRIm!NsOTm7?|Skz>zr_l2gIPT)o#h&aT2KQgc3Y$>FT_Oshsi|yIMDnJ%x6D81mb_jHRL-BbE#!Cpl^08pp{l%%B>j z2KY+?{F4LCnPr3%aK>L0UAb~*z7O87Klx*dgCmba$83K%{@X-2}5B`V>Z z-wj7RT5#o6fAh{ffb2ZBwVEppMQG(6uy%T0eZK*rk1R(GO?>e-mq^nQ=_gZDAS?`W zDOj(2>d{T2T3QPJ0#{RbK^RtiM}|QbDIkt{WBuSkAA~sv7%9BXN_v z#4SM_3gVb}Rbqnb*~+DwST_~kZu+4>CUc0xpWY*-V{|zq*O&zz`lMI{+Ok)bHg?h+ zH-)i7I)8UuzfK1WQXd@)uyAfc@6|(>lBYX;sO&zV#VUU~T7U9XL;KWy`>nTx)u|VW zFmjxYU0A~AUnt5kxygKEuudF-8H!FdB|o35K7SC+Dzgd~jodOvlL*cZH%XH7)yD5? z*{)@39P&u;j7GiLIxj#~n*XEk6ArG8OkRna_HZdtLF~Z{Dduht(tny$2qh0S2&vDj zcX{HgO(A43gYIJlo+9@;d6CfnyiC}+O`_y6KWn?PHx4=oB;23celRf808Y-xoSp^!8NylSmX&_?s}y&lQko-%o^I1(yC#V3sZ9KCuIq?P zylAw0oWD^oa#%~zJ&r2JGJNp;uFjkvG!mRJaDXh8j+P$DH2lGZas}ymR+el;8dkV% zS4oyxlEfifIVkx~T%G4NHL-nSZ@a63a!6XXUIj1 zdT;gcjYRmEm*mJ}xLP2rA#eTcP*mkDhf(p^bTcTLRUajA#yZqV3*1DNhEK0R%JnTx z-!3T(UbHKbI%ElDtU@Wl#`8GmWz>7%z`2hfpz!}?|>)?5DEr1ndsD4s*a|ton zwjgz#$DtlC+*719*uA+E*O-=dehK$gU!~uM3xG$wg>u<~s79Clssq zM2x@|&k82HY=?Gzm1MueLg-sg#!ah8OusIT&u^XFXdbYVxqkd_oAXzW_#;&vx$ofjYqySQ`%=nrNJzUmz?e=a9hSbm-nF>J2VHnl5M6kfJ0#P>pT4WWZ}AC~!9NAydpHjRoTwd0g%cML1#n z?fcc{Bye)Zcyx^^ra0} z6X+~p*27p|-aeA#pizP{uDiUGi_h_3ohMZ@Ok1%SVK+el61uBe_~4qli%5xdLuFMy z%TGgPE#&Z9MgB$KW=FI;I?-*?kodX||g?r7VBhDOT<>_vx zOGzIpHN_#_<#DPHmdl;bp>iIr-bf&t6m98L5&NP;GU^h`oZqL-V2(@q(~8>hf1V_q zDtNI@Du$u`Vf6H{W+`I#w%vzm{vo!iN+yW)OI67h3#=U$d&Daj4&A{k?4*?KH1dR0 zKUcmO_6rSU50R^(X88+}rDuD}fJ{MP8d|7+L554S*{snu1oStC>1f|WKFd5_V~$Xt z-pU@qb+Mt%AbaW%=s+T6`aE3BqONb z49j49Op!foVX|c+eo-p^WMbKTMfyi}&~?E;d%d=_1-lI9CZC3|Pq>hP<5E=#{N*Rd zLas!eLFP8+N~N=hMPraLtt!IbA7}5b`B9U-(v$c&i&M(IL$Xp?Fs37+&ZFFhTJib| z9+bj{r@8<&=-s1j(;*ino7gKQJ{FH%syqy3s@9TZQsT2vN^Bp+z!@c936kr^7}kt1?W z!fYpv>DVVMOjjOY?JHOue|e0DR(?Q->t*Up_7(KR(_iiOyDIsP;z^+5=7+$4?1)(r z#7iaaB1|)i*-($;&O%0=k%y%7Y*r>FDfk3D7R}3LwWy!=o-$lzS?LLxxSchc&wraR zw)RkVY16f7m;8nta(?0^8@PE~#Go?d9)qscI}b|Xnv%Zq*)=!?aY^u}9? zlSQ&4eAO+^Zm~%PpJ5Zo@Z(CHw{!E2-N-m(M+-P6EgM0Yr(Zca3~C5O2kq+;E_S~< z9hJrLLUPqY=h@MY*iD~ziUKd4s#1qr9+S-sF~W?q=)J{92_8(cfU}n3q3h~q%wrhZ zG|DO;k-+HN)c(X7zZ9+s=%?K1xX7?%kR$@(_vM*P@tdsGFuprybAQp$@i{82-**4f zP-l6yeME<|8ga)Sw%?u#t97zrcAF#5Ds33zh_6A-dKw%l;O-{6#0A8P=F~#`U8@4e zWTR!+QYn9}c15tfJ=!RT>`7`+3%zC?eO7p=39Uv(V8a*@$v+tc(>e0Qh5O0juqkvPrsj5yK&$i zUi1fJ_nj6}PZf2*+9g+p7A)r>VLQCNp0Mh4bFi# z6%GBI5-&Yq8Sgq`G)8UryVmkR8``Ob`@mkVAh*&Lmm2_7@7$~#KI(@$MYpX`A_&aT ziRM!%IPG1zF=07}k&2AqpzW`bAG)O(FR@H1y zO*>gftw+|IZ94!pRoIF$%1t#f8;l2(o|+a=*#N#wrblT{O4tpFRy7~Q{bw>0_eKH0 zCaMYHv;3g!WN9McXq>x=^v9OJBd3QC)pUNR#yL|ZTg_QwJf(zVd6r_ zNTpw$?M$-lpuarlvT60O24O0t`iR3V_}KGw5);7Rbu7T*^0bN%v}j%jxGB3)5f3w` zmMmk&0dSmQW{J3NwdSwXI=oSm__%#*QzE2UMliO-4;v@LdktK^2RNZ5;4sJ}hp(21&v_FBSLE!Xa{u#?Q_@Xv$s zv-fc?IhzEfR-AzzL1116h08wovCUCTgE~Qq%eW@(tfzj{6z(tnJD;Ne;z3teF z>|<_Y@(|dn?!RUwhC`;L`lFncH%DI=o`r$c)v?CF2QyDwxU!vAUfn^&zBHry)(@1Q zN~*nmD-`BYcPGVWFs0VplwJtUqTIZSP4V2ED%vULdn}yAUN-~es4k~rb`$MUw6B1Y z&Jj6F;-U`S8T`TRr2mqiG68*`Sr!^>%Pb)Za(^=$ysqo|k=I55no)yU7H6&{{nT*u zdSIFw{Mz+|f_rT9d@Ki9=A1XRChHT*PTc{lu|T8rS_`f4!F$Ef4I8U>$OH79RzpD3 z7ixuqiXREJw$qjrP3d=dahwd-T4r4AlV#;C?Q&0d$;<4wJo5ymcg~r*_2f`RM2fJx z)TMWg!-xe4fn@TGiWV1|FTaJeodCVk?Lgwjl`j@iOfEt0o6y_%W!sEZWHY%IzH{Jnt@vFy?>g%$bV9joly*a&F~*F>qiv~ zhk7{s{VYiySfsly-HG1F#h14Cp>L8pwIl5*t>Uu@$53k;PB6 zn^^vPXI~qV(a;kG5bm1AeMGdcR4~;?25zm6H+K|yI2jN*mGR@D3kM_5*fk#;-vJyaTxpnj1ATy5s)$VNwN90!Z8a znO_Cw-cx;T%M(^5-Tm4M^JWKLhHi1)UWXY0kVs@wOCYu{mSn2wxJ*MoKz|R9Dz8Ad zHTDo*nY9y96)Xltp;G?T-&?1cIs{UV_X90&wp&my*Ioy!*$wg^n@H{?wDA7CRf2koEm#*}A1RT1t>3zJJZX4A$pj)Zr+N<&P64W%PH*u(j$Vj}? z=T%3`B&37tZGj;P>^YPQidrS&!Z*PNhEvrSHfX z4DYxrcKW5$InUQ7MlP4x(NJzP{82?LcY3b#nrp@$!xJmEP9-#}jb|{tssEF`3mjcR z*C*-CSOtdEzhf8B<;Y|$Q})j7>i92JoiP-btR4@$tKupOQNOh_G=(1* z%K#sNdVG0CaG#LV&gP?4XX_jZ>bnr#FZ9fkyLG!i4EsjeM+Xkp3 z+<=OsTDTxFI2iGthN-{%y(tn+7A={NDO?sA1CRev%4i|gWrW0G7h(Qu{d@r+A|8c5 zSMg9_rnYI0L7VY9TSl^KjVpW5sgSe%4QlPp-D5PsqQF26zf~J?^0jIpS|&7s)m;D2 zfi{9@KI_f&Q{88dJ{0>o8=Q~W!sERAL!I`x2fD5mA?Ft zL_$ia`u##V@SZrd-JSJAh!LfcCY&Z4w5>=BPYpb|7?0kwv9-Yy^AJmF3fKUph^(yk z?jEj;?X`m{Pl2)hj6Gb+15v^Z&O&KaM+iT8vk^qsJFxx?S5zC3@SI*gu9P=F{eV-O8CbDI9YB)oV_rTnu;~Om_{H z`a&w5yv#IHJZywbOwu?S0jCFi2}E`gK}P-4#|PcOP7q3Bh?`4Yb69% z-dne$!r8Wd2=bsc@OU_VehXN9%k+fsZYP{4LGA{ft0WgZU|j1Qtbn!~X;zyp@?mKl z&HGTO8`Qjy@<%PR8YJUqVpf;y2(FOFyt_MloXsHQa1Fzf3wfp~YjSHz$<&L`WXmh( z9Br!jc<2xImTql>AuKoC-j9tu5x$()C8(j&jgq_f2sg1}x&$G&Ldy>jhis#mXqFd+ zqWtC?muWARQ}z0ty343zC84Y%D$`=MUkKhWF~6tqPrvwQm!V(JC?xbiDJN-{15a>H zcl|_oA4-?O=)bS#`XUzSR>B_bfMcL^Fe0#BJ$Xo|HWP>e=LWf_$w1^<&Zvg z;Y%cTb+APsVOJ5y;{h$6<_5_1Rab;M@rCQOBt`ih*E-oJaS>yorSmUzADQ$H!v+?m7q5?9pSNdF$+N`ie?Vi zD?`GWfX;5^mUxp6p1pa;wN9N`b^oKkFTj@zUXrSr{pFBQt_WDW7G6)pHv0W|N?QD{4##0WfXQD&_{~b?CY|Df#K}NQ(nGD-H##6har!l(S4p@WN8gQ`o*GjV=B9?elJGo^cG1Jft zD+^T4H29eQ-fZ4|z{181;>QQTh=f0G{QPzWk)LH=MwQ|4E~ip&q`__GxNkU?Y?!_> zu(c9i58oxb~|oElCVPt9|Z$w9{J6Yp!7ic!%G# z2)2LLV)xo+wwr_lz@~0p1`;7j5xF9YBN@N1jpOL49@WoEyeEmFwQFT_GTJ8smLsEz zVB}i$k3)B3JE5g8M|~`BP{HYFCda0Vpt|X>VS+<}he`K(eVH&r?7k?Q#{tlYR!k}x z1>?!ENq+4?fGBrz7oxLup|tQGD^uC_DV$B}u6abmEMyQSUzLa}OUvWZ<@Epu@N-jHbTFlMe=J+V4WaM*rvb`9!dH z^pG5cn?}la+-(Z@AqihNFm4@bu$PHW$u0;e*)f*=Z>)t0{ZU&RBe{e>myvnwKP;c? z?Z#l#Rb@}vDUo!G|EGPeC1D%K=?0k#Ubbovi3TS8wTHT`As@%~vC`0}Ipj3zAQgMRnvupF!kUK{3IM z@%T?(yJd9Kop7UgbmtUs!I#s~Dgc6X@b8rfQftR2m0$$U6bb0E4AdoRb-(ET=sg)m zwzB*MzrLk)W28Tj$82vV9n7yabmmnxpD5eBrLEa_6?9u8(oY=F;j670mmkikVRj~& zNS)4kgn~~$YWk*ULEF`qQQ~CbUf@>&s}#4ANQE%IQm%%*-8@(41OIaFDT?`~WtsCC zU{ZJ)=Z5ils;}HDnFk`?>Wxz*^HU2?dH;@dAU-CSSXva0Pl!a;S?L(KaTJ*U*{AXgD%rO^Qx5+W;Uv z<|TAD1|Z}6o}47C-#2=$Cc)CuQMb#A`S!+7o{2QcW-Cv3;`$ZqE2Ir(hkMHjUfyx{ zv|36-=J^r=z}UjN5a}iYpF+LjDjWP$g{Q01m+KB*7BktwDEZY=pERbO zR)@rf9QN%zQF1U799-Vgr;`CRr>}p4sCa|HHF@X#MUSqeOgEHbQNX3 zHeSIr-O;@BQOoDZNf??@hfd^9t3!Rv|72uOd4{=7x5?nv+9*NANHFP~fC3(~@3`>D zvxt?t4E6d7H0$4JMkxAOC)yP!e?wY@Nd#-+;2zD=oc^%Hz4=&`Q`CdQ=G{e9#pSVeI!CY6yWu_hw2T??BW39$k zpGTccO0($1EvVIK1k1Xl!h*>ZD?(H<@PJ+nCe4CC}wL6v&ZUboDT(r+2W*B zG8XNCl$?BF7iEa<@DI8E7Bv40|Bev7vjqnsXf_WKNkKZkxkk=S5bYP{M?R5Iq)I3- zAEX%ZpK^4$95P25Cx`dGc>D~lQfuD`9SS2eX!E@TW3%Yqra2Ziy|Fs7Jk;^;kh(pC zAr>BieRz&FQ7s8qXXT{51PMEbuO0>IGPTb`BjtUKI+#FY1qAy}W9><+Hluzi7 zH%$QY)iH0sTOniRd|!Lr09lA-NEJ1Y(x}ad#!C_K2!)ZdxF*B5poOPn!uG?rMW7cp>4-lUDDB-O^u!&tP;XCn3U+%ltkOd*%yI`&d| zgmUL`UD$_^Zv@hN(S5yC7)XKpD6WpkLS-AJGg2b1B3+Fv8rb%{i>_)Q{WGsOg z(Hm(!SPn$BM@I)Ca8R(_@KkI=QVH;S| z8Cqe9G&q|HcTAnMPM^>T8wO~BlPDU+tK-rWCwtGc8JX4?g(v>Mf^n@mynw4BESV`} zua@J~qq%Ap)pK2c0KikRPb?7fU2hj8%M@QlpHEn7>g9a!WX*h2weH(kpHe}U5q24q zeoC{Sd-iY^t;rJUMHE^b3A|jxdL^wOK%kidB@+vD4hq1l>kU@}%EQ+T$=!%r$n}fQE_5qzL9Jg1EWX<UxW-*-VnNd6e^)Ms+HSEkgd_aS#rIFZb+*l9dQViihXX@8^G71ujK&Bor zrZZ??8*~d+$ zdeW#zw|-c%i_N$tW3HGa)nyr0mbWRkg$CkI)o?GL$fjk3A)8%+G)Po_qqRRx$iQZ7 zgt5#HA>(WlTt?F_!|_2a7b`}AX0S|Ozh=6=BiS#bIrZb-u)dQ`4H;^c;I12>q%%dm z$sPt_+Kk5=h8K_qKPIG9hM=wUYS<0s=+tRzAG=H`ftTm%r3@K6r4QAWgNo_X`GwCO zR?aWbIUC1HGPbI__{rWUO zp=@_sX}15cK#af|M)nrJjL&e%{r;rKn^|}S?xE5wxMM<2mGRxoMPR~f_a{8smRnVk z>9b+KNyq&utY{W^A-8rk`^FX%c~6Y&%o0!ac&~K)b&gQ1*Ev z0FM{6v~FtMlv+;#CMbFB(u?L(ycLcwKOV7ug6qw?0-rMDaYS-_OGC}N1f!dz$?kITgrSHd_5;l{$#&|S%%_mYZ{w_Bm`Ev;pPC1GzDBy zZ4Ooau+Q8lD!NH3?1F{ZtfG52)y?nbSO{k2r_&^1Ofn$S3bcIV0&Qg{Wb#%I*l>#2 zO6fA^WVN^3!uj$)MykvfkUdfZqZe=sizGAv<1A{rXW`LgEy)`SU1aEs<&@yq%L`Vt z@+&zf;SD&TncGN6OLJ%~5+bERUq0Z{hP0uAVc}$5L?^rqzaqYf%&rLnoOoL-zQ%>v zm(Cg0A-xrXg|JUD^v=ANi zKIg-Xb&&_$Hmu6+=R5rfIIn6+GjkbmoU@IJV+1ky#U2a5HI4#WFP-k+H=&NtLHIZn z)TSmHf!oJn4wVb>Rd@>bT086Y%JKo~_$dL@3BeM)vw0t(D_(je1l?|15hLfIr?LEV z`t<;=6Y_gn40zK&TmvQSExlPVx)Z5Ox75$lAYvu;^x(&aLm#BJVg$TbwKVLXpy$?3fIyWS_hG622=RlnxUKNIRF8LAzTP=f)2);7tg!U#pg6X zk-LV4BP9$%-o`JIzXHhGt@Es|v9Hs>vYxg|fG6NMChw&j`2KACme-x@ufnkD zTCfL5B*`8x(B=ZU+#xEz@8@SXVH)`#hq*bX*eC;xXQ zgWlkrI0Ox(B;AWh^gN=V4^(JSGcjG_u~EwX|!}}d7;%N#-VWbMd6UY*WtsEXE*kslGx-jwe{x&&hU)s8dcT$QtC>f zNPp+;pJ_|3)(}X>ZKttlu+#GLZm*}=LB%UY0poP5H&wGCUkD67DBVZV03t*)oDg;q z1JVG_Joo{A{;2Ln5&ir{+`Hf;8K%ezmv8$1Oc|+o>+GmTviqYlIIK z=^4t8!yq!hZ~_6xSc&1*&>bl1I(;8&gws5^%UbvaDMp0tjP(a+(+UI05+d7wxh~pB zd}e`z06J^aAF1YmwBaP3k{p*W!s3PSrRC@zyRXsc+A9`SP6h5GHw>s?4?)E%tJ zsrai-2|bOzw_{+b`)gha9wY9R46dqaBX|71n2HZFVp_!dr#l`&w!RP#9b1+AN!A+ zR;@=5+pZ?G!{x&e+jwh2-HxYE9AD@PfLN<~gGY~ngd5dS_?y{UTSp3JC?VeE2L_r| zycm;mLALB^Kc~Y5dIx220B)Z+0xGo}lA?a-$Ej2R{RrpFGI|s(6NaW{r?kpY)jxgs z;eN~3$gIjQtN|I6dD5`2n)71}b$AWpiEoB~?-98N8DbML0&--mCNsVp;+1-~6xzdD_n_ho`f5S5MoBqsLWQuR;dn${VEinEud7;}4 zwE<$|HHPSoskUprsA%DjmH^TmqEK;cAtr`FJ&8u>2XaMjYiC+cqwF8+!_q?R$iEGn zr&jvd|dWJme&tZ)dMM(=Pk>?ks@dBA<2teDKn~pimu2fjmEjz#tWz3vlV*{N0Yh9Z4%&#gBFHc7Ckp_m@86}Qw|m_ef( z{MF9QiKf_ONm48k^3k;KGTiak_fzDuVgs3WyQ_DKxF|nTS8wYR8r;PcX2oo8wttCv z_^vKYOrIxVRyUQ{iSnhEh~x}$u*kh5WXDVPN>037Z?_<%ceZw+C^}2@uLd?n_8keg zb%fKZhT4gk!%xtXl^l_x`DUvlid;!Aamw8yooZc|v4)cF7(EZVQZ!`044V`P%G{2j zq2#`j^^b|M^pEyR+ZjK%)f2b8aA)*$UPJNeq`Xt)PuV*b=!$0y?59GV-#F5I`x@Y$ z9wx*yIWOd~P1J7?a<-i{R>tVcBQhs+(#sb-jnYRW*B~TqfxHRd!2SL1Na$)zVact8 zxdSzC9*3->bRr7TSdLYiET%_gjJ@ilL%SoGkJOogK(n5>=NL*tcV3RMKWw`xC4L{F z&Odk(`?0!sb`NgB!<5KhwMm>RG+%}5n#pj+2)%;H8UnHQ;i6VT0K09o8`ZWO!=XSf zL*?Jl(@3J%6Jv6*Gh?(3d?T=ypGp-vP9!PTxSRl`xK}iGE#UaYRnMHf#d`Hh>JT|u zr9c1gDj!tUJ>tMO7GI+~N_KzG#H-YXjna#63R-P|s?ckor_qN^lmG$?k;LImMFsx& zGOPp$p@;OC;(IL0Yr3RCMQ0@XWWi9wZ37#r;(7X$^jWKHwak+$DA4fA*^}Ts$wCjY} z}NLZKCSKh?qDghbVfOwWz&LfMqJvwY}nKK@@|`dO^O!UdiV< ztKN-DqI?LXBenonb0ENGTnB!2b>Qp;@_6^M<9kjBpHdJ;Mk+lYyKB)8<_Z|z)&x|M z69;-|9U{|~LQ9*>h-dO0@O3yWzFOT7 z5s(U}e|&@V>}l!X{QAt?5!;)eq%V7U21v_|C_H+kD2d@GugpMwY=M^Td}GwLi63oL z{6v<_S(^>j(O>&T#hUjj#VY!qYkliH0-xpI)|1aQ;$|Iw0;<{TCO(z|4d`SGj@k|A zO1H++Jo@;wv<2aM*^i1E2EUX}EV6SwJQGBS_pDCJZt}^$>msa#9F}5zh#Ty$=%9UY zU4Tq;zb6nwaX;KfX&vA9YM3pG53kf*DV5eSAkhTneW#T)SNNt|ZW(5#={`b_=&Wk= zMZ7F2|LMp+Z1LFY`gEgUCRmsjp*NoK$pGqeQx#xB*TvTkzhOrW?Da`qz$2?)SSiD_ z!pV%%5~S>YG1?TbNIdlgp$c^p$E*;!_AqifOFr>Mo(%4L{Y^yRsvsCg2e8Vh56JDWAk@AXi9cs}bzC<1!*A73v+1|nT17KPR=6cE=wM~yFIFSD=* zzG^1(A8Spb{~Pi_c$A@y!g|5oQU&-%7hx7^gl$>Z=k+gVrHU18*p4XwU62!LtflwI z1_GlEJcCRj!NzT^Zm)leaM$4@E`T~PngI8|o#_RqBwQJC-+|2Zff$3)rzjHM=0mT* z3J=0f>jRT)(tB5s=XSBq>F@GGlqL65@^Icz#it8dleYv!irq|WQ!9|JC<9PXESF*B zy$rzcoz6<1(%#?#-~h<45s@`Oso5!!DE7jse5B{4{-nKzwU~^_y#x`OS`cPL6a`xC z)di`m+SRb?E85bo<6lo&g{_z|rBQC!TlnXenj6x^gR&ngup=fxu3h0Q{c0~a5!KDX zAWp$Oe$}fAmjGF(mM%~P3$-j^#h}44@mGI;sqm56DsP~RG}KUqmZ&gwyS6B0KhNSj`f^{6(9NP!F_qq{ZG z)^WZJu!^>OSjs8JJMm8)E3VUJP?v%zy2}=Bvo@c+N1^^mj1Xg=QE9`2v0HH0(5MoY zDELI?i0DB7iV-Em=d-}wC4=-(d&HbBq>aA~-I{i=@V$a1u(#Xz++fg%FPw4=28No< zA=&kMP{EIvI*mEpa+`fx^3RCLX+P&$U@J=(x!3B)LAv?nP@N&^5cP#ifbj(4qvQcP z>mK`+?zWK+RFm?r=q*fEYQ=y&4IL;+vlIc1HC`TZ;g{XWjH(CdfDv8lxoIFP{?pyi za~>KhZdH(`NP03*NifAc?vGUXV-cf;6jzuy2BxFl(Fd#|7HfY$=s6i}(DpsdeV%=& z=CKGfoHQ!f3T0D*I?XK&z77&B>sD9xP+ezsoItIonXK2I)0Nhz(z8~i07{5EAwuPX zjx4|OIdEiWxH+TygT3}=m&_bWJE7n!d>eFMI>oz}jwUE;PTuDB8}oIGcX~b$>6oZ9 zh^B;n)L#Z_*ZJ#gpS~o{`WK}4Z?+-0Ma}VL`cS^*)Zj0wvmVCgnR~60(8g?`;aBt~ zC2$7S9mXw_JJL8>K_fL48^1i*nQs;zrr`Xc64VjMJ{t#dh=qt8V@zk%UJF@gw?k9- zr~2<@=fD@uM0C%90d`(0+NfVP*WY+*`%T^%>2`N_!sWQ zkmNBto)f}Z%zAlIgPq!7&MX}Gu`)l83Yd4vdzT4umZVf!(03m%Pt(-Cf5*kSu~xF) z9U=wXjFQU2q!~oHGjz^fcbXKki{*btLs_~#&}iKqIl+BeGaN{OIagn$`)$>S#B*=i znzr$cyYZmzfS2ZW-P9YW4s<;ID<%nGHDq{Sxq^j>_h3+BLCEv@H=GvOF7^ck_2IkI zgXqRxHzKb!Pf6)$4ryAw-Yeu78^^-yh6t^$iR>r2^IzISM3n9>ALR}h7LlcZ1f}L~ z5{H&Ej_?5hX4^=8sX}hrT*Om z7$pSlFsuN2lmwRrJItYn`ZkU+P=WNIbY3ie@nA0#nx1IRsjp7r!O;KuEU-P3m_e<| zI{e3m|Lag-YRA!U@fGMh(hDqO-K~@fD>z%4M@>lq&XX7cOKtXno|H>Y6RZ@a`*RsE zo0P31$^;iEUk~^C8~8otJk)^hIuQeD5*7c?x=MpDVD9#97A87@XZ@P+CQ?Mu+V|Uu z(B@w_ShEMovV|QoQnGwo=nZ)3fd;7V(~cn$y3=5<+P3*Oeq(yg{?L$80YKS~zyK0yxHJcIKAD-GN_0PWk0{3gL zY54{)0;qWl2I*B^V}VP-XR2|6b-+T@`8S9vc>oTl(1{gJD-UfWf}>34@lwWS$$L@& z5g{0VT=+7<#%X6<(957>eb=_l1HX*1{*&M(y}y(cFS7{Zxn#RIUJ3%R-Pi`y-1JpK zwnA-I=O6rOEeEr7`FP?_-1-Jk5lK3d-R(TG#85-#H>1k&@0GYy+<1)vOK95-@zj|) zktuy;Nnp#hy-Iv=D{Pz&c9vXA;r`FibU0^`B|_YiOuK}ylR1mdZyz$CTDX@Bt`^>Y z{Tans?5xzk>LlXacIu(=BI>2#LEDqtwE@!+L2-ikl6DTTD+_uFw#*K8I?cg)ToavB z9C266B#-F5u7KCJYW1VrM0FZgStT2Zw3C(3HI&LW@i0{5{BRCM$AT+CsMqTcKQAb; zL6J31l=YM%4Hf)u@L#`*kk?CLCD^F4cjZy7^k}dB7Zn>^5IH0KzxGuhH(^vHiyqw^ zypKoKZm3CcA|E|h%1acgswcEo2n;T&08}Ylh@G(=YTEi=DbAGTbn%Z=y2a^^d8VP2U7s?N2>EyQaP0RYFu2kX{-YcgoBfsdyp-q0a@LB$R$oV2gXJ)8h5roLO*>A3ApT%4N5h2C)(xW1|&xikC>o+pQv`I$6$0le_}i%uu?8lSGrq0=G+ z3&z}wFuE-^?f4wzT!?lvHq}M!2G)5P`W~(qb1-Va7oV7qW1eNOsUFSKO+L$I!I*y^E30Rf9jlj0#aaluYhD2yUj~eZIleN!m)WZnDJD1l^KH^y zEgW=IC|f&M%RRmo)#}rSF+8H|lqV)fNoxppR?ytoL~hjv;HHf!0O_RO(c?6}X3jz4 z*_3Bs@bZ^J+Gru>4>wbcci%|^l=};m+HqG3{8l0Wo5#rotb%d<^sl9R8&z+FiC z@W+@Ww(t#N0Im30BD!j8FBTdy5^rD2EV?mA9n6ZsaDLo|usa{{F_HPDV0VzVNlnqQ z=tt^)cv^quS+KO3s{HAuY*xSv?sR($-oERmITK)LrKq4X1fw2Avu3s|tA4QXteH{c zSN|*0Ah>tfMH`1TL~}=QydmVdS3^!QTF|6h=M|4el;{lox(J*ywsh@4L34N+P*Q!E zEKylN9e^ys{*;UuT>S({_a*P)4@q`FzD$kZppICg;R_df=RcrVJiztC7>%+Y1+@U~khd zMLagTMoW1Jw`jYe@W@KifpP%hZKi~5!!C$NrJzwKWq%@1f;s7~-n+)(8q7uRY%y+D zd(O_2>oV;o3Lhm8gd~}q)^W_Lv%~@?Nq^59%;B)c#lc$rsO^4q0VDTjua}d_c~B2F zS&tVYT2Vm;s~Rc2Odmaa!@PYg#Ns2(o4YCLd!ks_@ID)ft%wep-(|gl(m-G-?6n}V zK40{i8QnZW5j78F7M3yGp=-}aq;1Pu8O_u%)6^pQ$DyzEQ6pgRNeNswdk+uQ1aAOd_3a5*`ucRczVf_1WXK%e)?#Iz;{+*0aCo%*wmDW` z!-;W=z2z}Q{d+DgRiHR^5|*97(T{;?NDHZ^n;=KFt4QhFB(J zM7wy|D;J?Jjy76*hH+mgF7Xql_Kytx?grq;JWK{V(WBT0|8o?BV{#2E1s+#7$R=9$ zyySKjo5zihav{P~Ds4JJb5)FPFLu!bD#c9nIh29}$@+*1R+Y`^$OXdlq>M=m$0=E$ z82XYRli1?s@LAdCDvorKsq!=;vS%kskQ#zT9%wlhBvw=TwI1HUJ;_z&xOg>HJ&R8@ z0sQH89=d8+=k%PzvD(L62?dUXRU+Ke@uAIV9vx+FKPFVjz&vgSO{orT1!Yu3`X`eN zX`J1txTn9$nfIRiKg`DqZArg?1KXSBQs~UCJEDUZBsF8KT#Nr*hLK=ZN5@(8QD5tE zkdcyJYUZRiCjtZPI3|VhrG}c7Lr>{(9#8G0!Dy806V};1n;A*b6u{C{5%ScTgl5A6 z>XQy`-55FFh#Xa#^fm3Es#qJqWIh@7;{1uj`=4in;vrV6()Ua@at&k`pIM1f1!h6@ z)B3*%5%zW&$bxQq!tZTqu{!LnfL4bFfj++}FPI$5;}oLRLhKHru3>I{|sjT#fEG$rJ5_LB%rlW|3Q2SJ_R8GoKp~|1WG@!JT zW_Xzr5qc;_01G5L&LCmR@P+4_8(^n&i5{?B=ZI#!MQS)7JeSjQ#0rxpRGQ2qcQ2)c zm%A=MQ$$&Rj%VP#6 z4v`ft(HWWVRKTAp>+WL2^>+~*{E{`U8IR4U)6tSn4)^UmT4~Paawj5WK=N<7+r&Qd z%wH-Uip!AAv*qzxn!Qc1iGJwu+Az z>&PLSSB5Xqr@Bp3j6_7s3*A*wo()mVHvqM~@1yCaic1(M9DimkMFq%#ROav2h7o-z z7P=GO%h>{FaA21%OT1f+{2_fJsvM||dcY4=p!SkFDD1rcl3T?ohS>~huFd0@^Q~9r z5B&S0BGl*9lgob9b*h_&-B7h$h?D7?uK~}meE8_&zFZ=WOGdoWLcDxBl+gEu-%p2W z``cuH97X^m?>{AOxw5wMBV0yrCp9_(oT{;!2$yyp;be2OrUf=%biSn@?YHa*ZU?iL z7cfp+3%dlf(D9WC-_Q-}a?4^|vT^)jdZ^9C^@CFsGo#JU5*0&PeoLoJ2R-58$G|i$ zELIboRB=Us<1F>x7^@6d2B)FY0Q}=St~p}G@2(ex(&AyL>FIctt-CD@A0@|MLJx>Q z334_6ChxQJNlq*46k265tUu`FuwhcY&-%lnNrzkf`)cxje2EHA=&Wnc*E_}Fu^le( z&V+|5BLWn{u2OgVBx`E4(+~@{rI1**=mXIQIu(Q zI%-eeJy?1<^%R&UKWFAw8e9A?H>ZN{k<54m^k8~mn4!Y+B?cSR2Y+Mn;(R~5A-XiE z=A)@gfnB?$&vWYI6@8Sjhd7*0xZ1gNlkz0AsIWEhJ;sueWJ2!$jlI-muf*dBw~Z{x zes$tR`svHqD^v&~B;PX~e@`|q`{n2WJ#-|q1sB<?n>W6L9VCD3uUuV4{~0 z^RU6C?hIV697=6GRh&eP1#;Fjb9@@#yhDrIOQWF$NKRlzDD(os2{)Wr@eAM%bvPy5jAj%+34Swrolhn3|U> z<;MR14*>j%Y{w7Rsnbo{qSKLXQOArzsQWM%e7-i2Q*;;ni>yaFDQpV8$Q4HaP~{)R zf}+~wb{8;1&#N~#t1fY(DHR0{H2GX(D5(M9yN8?Y$V&j7c)Np}iz8qAzddzL{?+s+w%UH?O(_GIHwkomQZPHrkDFcAm|P?BNd zXBnrvprl8Lk#i`C9g899H$8rFy=-#3-eC;!c(q_IQhkdF@+X9rwP{p{TL~d>QdggA zzbM)N+?n{~${)DeCvuFWE)S6uPhq7MXT>7~Lo7XncHI@tQnbO-PtLReS#L4>wek{5 zBm{KbZv!V87=L$v``3^l3m?CvET5`Af26I-{04-ZPz6gqnCl=j{Gb39y;FR`-r80j z^m{6QW>_xOJJK~TOY5QV+o$<7D%_&)8mJNEzYP{ci(R~XEpB!8(1OSTs{;iOQ7)LR znc>?Jky5-5j^shDC!^(WS1oNFaINQ?ZTDcz@L$Nc4rvgHTEZ9fcpNM8PBa=N$1qj_ zz)Fd4ctJxnUVsusTUTHQ5-PSiBvfWFfp0bQ5gQ$;_gr&V;IX?Q!z|05nwp0cv`!3k&Jt4KsQ^--Zwq&0OBs_w7fV5@$`rV5vUlFwd;({ zLqLZ|VxMLF<(qlQ6+jgOx6h zi^M{} z=eQP0>igkOp=!?JIUivlfPJn0iUx1!~6s_{Q&HsUgj*lIR zdR6@JbU}l8!X12lW7NLGB9#dl4+gYPbhr+LUT5_M!UdHZAHEmtk)w#MUv<#l{gr#j z(Jhdtf8$~*)#Ztc^WL0};T+BN<-))m9BdX@<$Z6_61=_u;ZwiO!EM=Z87%0#0}q@T1ERUD3|7~ZKHm?ph;ROJ`$U=Q9MXci=C8;*4tF%uOAs) zBR!!Cll6P)#n+4n5C4mQ+2iJphZ68t+m1<}$a$D{wkosE+OU78naH78H1Rmdgxhs~ z#(`eEa8)3*NGH$fU>3bFL2c*_S#301XeD}50&X(CN=;sfN>3@#$9mM8vCb-vzfO`s zbD{r`3*8;)F65c|u$}MsuMa>V%ieV@58(Q188zM#Uv1J8l5m zN`Eu6D^!eNIMn?h4bp`C=NNIV$i<7F5+NT3lbE3QHRN$FnXsN+ptehB3WjDAEQuFD zra3#;b1>zr#M)I#E3PHhgVsW|>p#^saVEWf621gUbw#daMfNs3DQ~0|Tx1mX!2nWU zoMg9EjFflAn}23SOZY&S1X7KBiQq#ISRpGfg3l^ntOvUMI%;_K$k=2~qV4L|E3{|B z)9Md_TmtY6%HY)^iyJU*A1K zL>gQa>A9M|&EWHxa|iuUQ{HWmrD8u)&Jl08F6QsZ7^6^iQ6XspiCo6SnQK%eP3Xlk z&=0C|eqx^-8#$x51~zJ9JNy8T%Th3LnUIF+lU94@*3O}$X|Qd&#b2Qt(dFuV%b3|;gBJwL~Jr=*HvNGzDz zuB;UqzzCGz1?yKUokXg<7QU86{1av%mca)uhdrm*%S=;{WwWTHN?YO0*{_u!n(O&Jzfj+}>nD7+6C9;wdH@B0 zm$Ls$VB`f*40p~2bB(4MUpPyjJL${EI!7U6u%BFlQC+^h8?Wta zwN8G47wL6|hXORQIdqTM1ws`gftmudE13zqsdR5CU_$d=Uz%spzQXbs=!Htfqdf}o zW7=~HwhB`daRZEkAsgDuiuh}?We(RBgd!A5=;h2fD~u=D39rz@iX+~+1@&#BYUad= z$+!<~p+gVQmH{nvFvb6pLbfWQTwq1pUNBV=Jm@Ivb1Sjf8TZ{4uL5?YlD3sdF9$1F zbv8P(u@+TvcmTd;$u2|(;vqvJ#s>{NXY09$EJIzb)zqNrjyMzu&y+tdEbJqv>f*8< z(|{=)Y+a;FrS0~z2OP=X>FbE0Z)d0ODl`<#(Z1Eyc!f;h#V4S~rJPj*A8fg+Hw%ObeDbDL?RW5#BVN6Eb!~X|9 z_avx7UTqrfGP62qaaTV(C5%#^-6`T_E-MoHjR|v07>_pF*UNa0??vWbFAob=^RRwvV z5Xtsve&1|Ft#Fp|SBL^TUN^nZyVPAI;C?6H)J^6!DtxWO1V^g{OXB2JD!$^Mz8r0Dfx+`yy{?KaNTgzqm=o9+xCZLwv&Lp2FN-%`VJ4?f;`h|m(@_NYAx2PeL{=Hp~M z<$#VUSZ62r@^HvzG%?>AY?J~dT+>5{@(B~laJr61MR*Y=vJy`aA|9Xivbf+=Vr30c zA9g?)JZG&KUkt6|G^#IcLy_+gu8l`ft6x_0i!6=j4+A&N#1sh zben+p8=a|g?QV9OFPBJ2Y}h!8N`$@c8D7AgTeq4LA_H(ncEqu>91HNn8V=>awQ>RR2;41^h^8trkGX4=Wq8nIyzQj>i{`kng3~Mq4Cs{*n z+W;h=!9etjxu#AW*EnSSJ^d%YcRUp0qcrdS@loAMLdo#_ZAo}y;zl$eNovdhQu@0; zvs#f-aDpklzhqIE&XACc0Cg{k^5=wGQ24*y5v1y^V0i6vG^KerLiIJnJ%FZ=_)t0^z)QUA}{b)C=rR6 zCId?Oz(hk<-{O^6LV}n$A}UzdUW73Wy?Pi*@02nCMY>^_<>@58pA0|{`-CP4XQ$ZM@qmlE)~HEe30Trf%$>S<t}a zvEN^>1zi^QLFhwq>d5sUpS2||7Wm;nQsl$=0Cql9d81LKP)Dz45OZdD-gNgt{-{UA&Q#;Ztk~uKJ|~Ko;0#mb4}Al0>UypPG30o3;C$nigP;O0&D`XkJUg z0=E-VKgoSZiF6}H!xN-@Uh7f+1*YK5ji$z9c0VJblp`fAu}rXd^{#3Y$=&nO@3~gt zOn5T&VPaDcw5S2%R*B~2ZIB#DHNZgfJN(FyMt*{U?Mor$?Wz*}h-t?h&K&F+*o~uW zRAOcywk9X6>8+}M@MN-7aJ>NY2_bpDp`@7m7X&Q1NF(mr|Ji%$%3QK*iE z!Ja5B)oE=m3%dw!es~Rwa5qghOW%Z$E+{|-r`1z!04eTK`H%630ax~Fq98N3$3 z8~C1tmAqW54;(*<=e+G)RMkB;Hs$njcDL$qcA3TuxVh-q#&fvj2;4MeT`S2?eZSp0C-yTCD%NnLA-xTr1Gx|H_Lr3bg##@bMMEnc zrUoG4S%GUcxYJ`|2AP$0aF;?tgktExT*B48=PAHo!+iJo6&@P`2;x^q2*1@Im zw(dZ8iE%9FnY-ND5!Q9tODCFLP#@gQ<<=b@&habPUp$w020jm!y|q-QXrHl2${=uc zxwot(C+Az)-8qL~lm{V2g(b>z5TP&3A4V-t2!HjnW(d!>w5tRriEs4CwBpQP-n436a!*+7_3@~E%F0z zsEn?DwU7x_STaGl7Alnw#c;eRdYy#H<$c|VPzA$QK8LwK|J$_a^%GNO&PD~aZLs^j zI{=5iJuiWbUy#tNcYbIhTa~3vS?=%#ejH|HiH8qrI1sy-O$S}I=}GbvUAtzUJu!En ze{5UBLZq&csyTer!5|S&-Pi$EsUY#b*veF+tyV4=04L_mpmjix<5Ycw=IA7?EB|1f{tsr^Yc<&MXY^deO?W^_=M5|wE6=SlCp(-t6Fqsz$i0VfjG?@q1O zeW_TG@>B<9)dy(PLEazVw(t2;JzCsZT|aNR2Ea1B4?tQc&L6YJyiGQYY_z`%eqMO; zwl5>gKhbRyPSs6DJjSqEs&@y?mo8FTktX!Tsk&=C|9R>JMVrm3;`@2pZ5b{Lcm4J`tR!uUGf0~pX-RB zdxQahnbzkAy~><5Y(ob33X^&9roJIH?;ImTNe!9J1*g z;He1>C`}@{Ojd>Zs+h~L{NnOIuOUI>z=C__c^cZhbVYIcomUuWgFeW(8W=#&!e?o( z$mQ?AB0})*a(N0B!IH75egPfIxbdBpHuy^}FQH@t0TE~=9s3HABo9fa(tZIM%*&_= z9K8xxCa^L1bkDx_tTo08~>m@K)ztt4*)w?H3r1D-`w&?pCafrxVVURCYwf#Sd^s0KPdqi%%_NIWqK4OwPI9so@84_#H zdBr!TA@Q6nv-&ZjkOOs{&3y;v&22vVJ-a(XnsX_1Yw9{3yLGElRx+j}@Aqk9 zK^@?BgC(~!m80nkRVRGKo~JYvbe=a3OSu8^ZN&$@$MrtCSy{~pRmt&LoH8%zz1WTX zs#VHwaKNK;y;1`{?X;(LV(lhUUhvnm-`0>8>0f}ed^@(DP2UAnq~>5_Yv@5$s_no2 zBIosFfT1IXM}+_0JuRP6eys*1Zy5im=tu%;(cOW;hPv$!ZF9pK@Y{N^%F93 zoH)jbC)MdcRwdz62EQLa*lKJ4DnC)O&5T zbFq>v(s<9O#CFyyaf5zKN6QxZ;KlT089XCV9t0lxh5u$@9-1roF?LJ9Wi^PB$Fd2C_YJR0XwSHuJ&ZKj3-WKJnqJN9k00#E<(ts`_o?l3!EMb+!pY zN_2vsk>~w+XOmPV_HiggD@iNpl?uTi(}ckZ6ps6*ig zY1F8|T&blJ(!jZgrqzc?DyhXMc*LILf%kSC!$LGrNniDLI0HoQy&MN5{yx%XTyR zmK$A#Dn;1>4qUyza$_d8@DHC#lIzpLo5VkJ2&X&H#OjlokFzLTaGZd2ehywgt+Ms3A`8c0ZHzc#CUz! zJ&KDOJaG&)$@3QRnWc=?>S7rLYxG0BfT*)hg|SntZ7 z;_`s(RuMBJA2rDKv>H~AB+NL%gm@LZ=-#NK4pwe9eG`a`qa0d*4_f5 z%N3ERU~kib=_VOp+We9lt^k1X(OBK-l!88x!orp|_lBmsaE4?fhZ2cb(mcqapfI|5G>uwdKZK>ig;y6@xZlC+wYZ`+yV=OA7)qp_Au-I3;ZAuOdK3R z-1_9G*tlq1SQ+ylX2n&F4|@>+5*tu-{SRk>@}OXLeoVvTqwML4MoMdF3}&Fu5kWJ> zCb^$6p(6K6r-0WYhfT~H!9u7j<%ki*cJ)TN0 zgW{LaOzfH|SafAK5IUWnuKqN^8Dz6&nvw9@Yr_DdAx@@YDTz+82JZZ}15!Ct`@;F& z5nvcw|68xNDZw-W@+W$}I`zI@!6Z#K<=CMsRs%C`gisvD1D8Psnzx#}jW7pUpZM6N z;zz+yJ2iRu669~Iw0i;c;8pL}OcziDmr(bg)I~9uec;b)3G$70+@pEjIxUE!BA9oe zeIwPIc7=Qn+Ve~kQ$(qF|0{z;^>sl&_=srI1F`GZg$9I)jxr(j0z=UR{KO)$S5g$$ zEAN%%w4jR-_5B}Rf-n-NeI3tT-nCQz5Kyj`pY zdRda>-|uqm{(ibY24jV3N3=b)s!z!lVzU;sUIYIsRbDH;C%sYvHsjIz?}b>Bn>Jbpsx7;e zt5dMcCmy`i8@Q6SP~Bq7r{^Hv$%+f3svegNnUsBm;H1P-em4`#gJ@+M3+_jJ|8#L75gdJb4~3Ra>teooT`TjLH3ErS7V~W zo5szTFd$vBdkSh}*;7RTFF?@0Fdgi(v>NQhvQPs$H5R>~A_R0|9IwSa!S#T>zQk`Y z`PXDNQ{*x*D(BgI{<&veNxdv2FPVaIIX6B>F~PK3EFq+Hl#P&N*uF$|9t~WoVwmxc zASpv&VLyieQm~X4?hS=|oyKYIjtD9;kJ<&~E)hi7u^vq#S&z_C(<405Ivvu_y)OfKIRKS{TvD5^N&j)x)r!`Y7 z&uK1+MFTna&F*xk$gd`SErFcN#TDRv$MXr33T8L`GUL}>qK0&%j(^dW++ z@c0&K3>J-k16E+0EF}E5e)iT7y=G|a2Q&?6-@SmthB|gzs*ma4_a7R+Dj&5x|ebNm7|jNzBS zGZJB!FY(;hOXIvqZ17?<(wnJwP>cn{->Ja99?OIT2oKqx8>nh@qs@NSaekP;f8fvB z8M_}B`=ypGdTZ(%MFbyr>20A0IWdIE0S!AP-Dh$JINd;j*l!|T<;|U zCYsgqE@9X;JxR&~1y+%P+M74=ho<7YiZl7gTb51UyD$5p;zHN!jh}AmQKgZN()Hl)pWx-n3b%~{yHGg zlGWpy3=c(4ZS34)c7;fNX{MxgN1Fe0Nn{b&s&WIZV-RlHP~h31>S;!+6+g*PhH1COJyf-EpQXUo! z_I7ZRPe*=K_iD(_vPwUp1>uQ_2cVn6P^hz2$Zc+5+pHH!5e+t;7{A9|CR@pmXoH(%+m|GKo#>4B0{*mI7mW0 zobeU@lFcZ{7U>IJ`ANkUv~lkh8P{u5Wr?LbZ^Vv zrXmCsr9*3+gZfqNtQQL*0Bu}K5(T(QOfRNzW*p*RC^{aP_qWrK^qG);r3xiOn#8@b zaBxfDRK~nh^)O(wP$F^3<^Sb;sXIxw@Pl@YPVV)y1pGW?PfUD-8}Cj!dl4Z373emvhJ25X!P{nt9-?5=Xf7 zz!3vFrx5s#;E4qN#e;%I?lZx`XvD)}nSl_orba#<%`4VflkSMm!^$uj2!+auqD(3_ zJOVW?8NTW259aUiP>H4EPw5e7Y>f4pCbFxCmL0>ZJli>p*lUq>DqVSj?+@asVu?A^ z6ksV4Yo%w;6M-^-@AEZ2^H$F%_Y3f?nGl^=poa>U;foGdICef41zWCW%KWc_?d6KD30)KF(rJod6W4P{x?a1W!cuXqQAyWzJWP|qaOL}Jvy3DP+YP%R-ku& zgm$MQOIrx-H8y^s@i3H!SyUc}b(`)-6tl`7w}DG(Y$N-d_kesfu~)Fg(m+t`^Cgj6 zs-nsOs@ZzU+hlr29!FVGMev9P*LJ4svwE1UL;0zLd}I(SAG6LGwF-t-_943$Jx4@n z={(2HXb%)`P=vfH{nA3iX^2a0gO4MQgE|VU8*@johbnJm@#yXY=Vxsq)tQBhH5!Aa z_9I&?7LSPT?nPaW+B0(s-fZa|oT2S%8s0a+U+eP*M#(HquBOebtcZQ0rURB0v>XbEvw|=bGQ}T@d%-pmpGC!qw9BeAB3#o{>HHq zaB}D&u*SCxE{hs8j?*2#>9ITSM0)Jk*1FkUVIms0;zf>F8$7%JmiWJDPKkLeip@?* zAiRqH*E2k zy^c*EPVar{(Vff__tnm@TA<4gfdilEUT9xd`*mnSPqk2mRU}lAzJ!UTGS~#la)!Ik ztQRk5TBz~G(J#mpky|(_7ASdB&Kewks{F(8rL^}jUj?tnvEKQ1QHyOF09o5~eDu=q%vW~&O7@h8>0vKM^!|CXLbwQk!C_ez1#p6C!gBJ~P zn=I<_s5B8w^=GY;)k`lfKtG|MH6Ch7q&AR*wpa5Oi+MLTflRZnOMjlVNxre{*Dnri(eG{NHCW5_{&n42-HgPVnPbn~F2s zy3iQiLX3=tH?j(DyTk^kFU8wVsq?rP{4-;zVi)w78SArb!hy-+c zae{c}8K0we)+ru|*woM>`k!($ZpbUh6s$aW$NnkxH!6`1kx|BHPr#vreFQHwF*a?m+0CA^BctWA}~SsbUQpE9Ivq|$EG(JJY!{q zRvG zdc%S@l5>mc%Z~6Bdwu5K#{h6t_k7KTC#%y%%_gRHPTcDlNbE5>2l7$j4meNY? z^>X(H=12$?OeQY~BiflP$Ueb==~Za+N8;fTeDF<(YxrD$kW+j3qmpeEV}$KapJ8OS87jy{yfu&l20=dhbd_*o43S#ACqi4M|zgJR0QuhRo zJefeX-YNhtoQ=^CY_v3oG?R^kY%j@!^n-tqWQ0ld2qb>srhr1e0Lq;Zkl$6iTjGXa1XA+xFC1Ay-_n_e@BQco>7TU{b`;nF@UeDN`cK+bAVnvTrjTba^3Or^slf`NKIQnQ znUk7~D@KU7{c|TJ2G2eBODbAU4LTOP17bRyudb9)Sg8OJ)4ZW7#Zl*%t8`&gZdy_v z|F(W_DbLwdv^Yfn+a_$;F$&R>o`xl7?)m4HmKK(bkF0Y#^wH;E4G1gdPV%e^2AREu zNB~~3%Wr_KxR^?e1i84)m`AKIIG$-`g;e!l>g@8HEo&Kl&Ra1-eM}Ap^*ZN=&rN@09a8PQ~Mpl$k zzl`b|=L$lA;DabFW`|v+6ILp(B9F=>Ivi4VG%T$LpKlJ&#d^YduPdGQSxWyw*MWgm2q`bA znM4~p!Q2@eA#xcr;{j0saZn%fdpPv-Q=aLAAh_A*^9Z8ZGkTAe0^MoQ#Ec)Ejw1DJ z;3FeEci!57QGrTLl5p@5#bxfs#4QKU3gOHUYD@#~93alGwWRBQCrTRoL+lciEYO*4 zaX&k?68S@4#Gi<3WhTKT@{jC^p@Q5O6Y&A-fy^)4)kWpWqs!{}Gc$o0#DCAgpp-tG zr}gQVkn?LutMVvY&~BdS<>HbD$0Y5Ch*Ho2hscb2=dBCp2bM^*kTYMu^9Mrl z5vQ71uGQtvPS^l3R1CGR=&vEMWp{p3 z!-&lKpeh8b&tXx?-h|zQFOM!%*nRm3XZmDZv=zR;f~+2Cg4+wX(*HkhifPP*qksB- z!v4mFmA6expC+_jj;m?)3h2-CXe>O@ho|V6;<^Y#I@br;oqmT3;;K>l*S}M{4k=;K z*lKRk;-p{qc3He^%>VHclxysq+(3QJJfODK;QGy24L}uaA$zltT5A)l@9e+dG&@2J z#8QDEq(3Aqy%~HdCdQEmr0c4<$wW@CZ|WL?JB2;k_{LphoG3*KbLy9;V$&Izet-Tx zuAGX_eNmBD{*hS2*F8(-B0{v3dJ6~PsBP2Qr#k@)SWon9zb9Wp<)}G}WsQ<3&MK4z zs6n$YPfV@F{gkw$0rh)WaW-eQtu<~h@oI#FJ4(U0OI4Fu@?1yV z2wgQtRA&MVbDWkr)Zj_uzAZK>cNc8VfrV%f9>1jot~Qs0o9;h%La^QR3>!`hhSRMrrrLA! zuN%aI3BaJu!<|n)bzlr^3^@h6Q%6eIdw<2S%itZVh-zCm^$y_#e;-8{Ap`PauoR(Q z1SrTf`Ogk2Zt zxIx&JLOJ+brw%7IT;F4*Ai{nbo0KI@MV9HCnZrdRTH?b88I|oyMj;I#o~O8dC0Q2G zIJIQodU>j=zRoj#}Lg zIE8K^$&P19(oT~jI@VU1>@yG0Mlj%nLU*ZjZeX%+q`U{*Vc&;AdUcaK*Yz(=RP%3t zON-u9Eoh#zTLyyQi?G9&pP?%9OQ(rOKW}b=*23>c%4t7kxrIfPUHrzu!IA^0Y z2(vJ%;@Vpn2r811aF>st9_5nL7@5mm4Yl1K7m&JnWeH2oCv(DfAqjw z|CdPA6}+;T0cEw4Nyw3|;~C?LT*^zNEkBMmSEk7{ulir(xz{msKY7Ddsw!$5X08c= zw^7uxSbvh-T}?!`d3l!r5I5VkCx|0+sKj>j0QAB6@@&qDX1+fE_>&KfbZ8&9m#GVr z!z)La7oCgAR&x&h3P2vzHZK~KiPZ7!L6sH-=Y!>AJr2(e=eC|0iaC0^HIw_1AEO=v zn~~at_fuVQd=&}U(wuSHtybsVNlqF6;F6CHYOXiEA&8AMaPSqu%sT2eXoZ5%f5P7n z!7MI)ZYs5%;(8FoWP22*A&XW=JWOLOQEGN9!jmV2Nkj@@m19eRP#mFa}~Q%-mf z+d*$Y&~U;>9r@-@j26YjVQQ~vFUbE_yP)-4t zsw1a)0e&5c*ms&Wj&D7#Hc9CQil})BO~!3a)Cg5|SyEi>@vpW#GD;s~WZlScC^YV}*$x^gMcmdT{Q&!4!k=0fPuYwm(vpm&AeN&@v<%g5B9A(p| zeG z9Tme(9#ct{;IYnB0Y=WvbCi<4t^bB{ovri!oj(PLO9Taev7K<;O z+u(W?;5hegbwB3Uik()ab8W-)6y<)Uzh~}mbDcacvW%BzBY067z*n(^`C@(M=$gxl zJjFLc3t}hoJQ~uwnrZ$Ubac}qVO zpqQ=m&DfI7(LPA{I*!r3ldmQXyx?)BLyPDxfB0DUdwT$YqHuvp?6LMWZ5h)djn{I_rd+x#9BbBF@8| z3)Wiae|=28cRIgw%vnM1`G|iWRYvN45(AeP#Zubsmi@_Y+{#^L@sVtFScf-yQ5Wd@ z!wua??wf=v{n%PV63Xqv@-1H@Rga+-YQ5QE`+Wg;GLBSkmkd#!^!GZ={kM~7Vg@(6 z^>l!J!4J}v+sQSI3Q^wi;79+exZ%{Rph+|T7&G@3Aw^k6K@N%(@4!X!{ZRQXv(FvP zpl0&<1L^31g^bSD7>F{JfldY$3dP0bo=X>=Xk;h~#dm5EH$bZ&K6WEn1S@sQ1jOSc`MZ&A)HH1uCNVQw6W>LcfdoLW2bK z=A6~+fQ8O>k21?vDyuvzmciSF5^lNwP|5U@JlYm4)+1^Q8x4Hv8m6GSO3l&=$P*i_vhYPOxb65iHL!?_CN)yYp*;~v?R2G zpo`rR!=P()`t($Z1zX(>->Lt>y?Nt)^SvGk7E^O~3~05hfoKNz$!F+ed}6cP)R1ur zN)yMn7`-T}J>Rf;mlO6}uMmTwztX&t11O7`I1nz!Iyy>LD4KuGuoDs{$CN}QzOeUr z-cJnsA2;P|*mLD-I}bFHH}r$+MDpwo#Ni)2(ul{dbr(_+9Hg#!uEVB1F>Ag>qn7h@ zx=#rUCcuKw%l^}yD^geH!e^Z%dyb&jH$0=5D?|5HNR*f6;@}{Fj&i998Ja`w)Y1XA z1I?vO3cPHXu`0~ir9eT#aOUtK1YJKZmL0Wz4eqr=`_ze_xrFl;9bW#aGUM&`&hYyNo(KHF|5dE(2kc1$5(!X?!WRLh;~T?nbcv_ z?QL7dR(%DrTdVMO2pPKB``&Fi00{bRZxNPuWoLc`UT+p9h5o0Lcs0X#Nxse<*J?YN z%w_-Te_#Nns1pAL06&4lm(ab>(QKZYTUj;J)Au;NaLYq=2;i)r{v`%b=WOq}_U!fO z)jEZ!{XrghDdhNC6NSrMXeS|!4bhXxO^c}3+~;{{C$qA2-`s#TaLc)I$T zAYn6Z$Cnhwai|Qy&d6HWLPg&A?Mlt1EOac@EMvyh6lK(*N+B1`Gn17M%)~dke_G9|KHm{D5x^`03w_-HxW|z!fDjy zSaGg)``A*QT2h2!_f5yv)p_i3_Obxdj!M^av&0~SCM|x3wKdYdANC+38y|CTf%AHn z4FWn8G_G1>_KVX^MP?3B8qCNzZY{py$)4(C8<6wdA1d%eUvlStOP9>h?fCZOchk}uIS>wa4F7IaNXf*u`?<1K!U}% zMxK7dMo1o7(KcTy9#WIG!YxzcK-!MJtPzI(uGkjF@Zj zu(f$Ou~D}Hy#J`s-YVk%l)D0=PDuhBJs2tptp?}p^W0U7v}$GR(Jo|lP~u54 zk^KAkfv?D-Q%L{Vg?R_s(w((XwuzL0394@27>vonw^@Po-Ps_)M7u8v3bKKTDCamm zCeOm^uvD~dt!!`j5}uO5EA}faAo@j&KP)Ag`xya@oIHqt)pBIoJU{{0QJoR5aR6+y zZ2j8!fnA_H!3fKSb~-1fV#qMYk`asOojM_4m!UwN`2dT)xTpOjoBuL>R9dF z-U-#1EP}gVu&>x5bx*eyX723Q-t|YH%5U*+k=0Tm-{i@T%b|i_o8b1bnVw8nqnR-= zWKeRjhYTZjo3G2Sl!=gSiZHf>2R-mf!6_^h8%8Owgae+&Q?AItNdXids3;!8F| zlk}9&$-iN7$eghVbXgrt(YFw$(4A-mWfzI76!ZP?o)k`V&p+c4Jzmw*7gfR>aISoT zW=o*!%6~YTY+H5DY$!>l$X(<^IswOnAe5~+@V-5N$#jY`(yPo zn}0{GR2I`Jx6m<$ItF$RwPJk=#$(xgf;#S(CZW)2Ud|4m+aGFG>-}KI2K&(ew65yJ zguO^PMA&m3%;mD5v8r16C<;F+0_t!Uaza2D^2Ch*Yeq|t$Khmk`7W}E;&~Vg46)Ri zgExBfz4Q-4M1OtVZ;cw>5q0!9$JciV;@)6YrZT&8E>Wt3p#8oTgJSp?zy{2R_V^I$ zsJ2))1Va3)O=J=4^_I*cDjOX_ZPrD-rt>D2F$R*{f-AJvP#R*Yy;{lr3V~4ai#cS@h+|TAw+{S zc&rts_JKf6V>VGADoxhW9etu>dV3zas#KZ_ewf%ZFeNi2yaIHVkEaT?{KZ$UPBOpzeKwWsrKmm z=3oMoKal(%!Co2+$>C!TxyHhWNPRGX{c@@>>4z=>QB`vX_+<=wWsB<}vY%6URToG&;m2O7Sm zKaVCktd=YlLy^g>VYlYHDIvs^)hekiHB5hPzSdIK%hJiNu*jTpwJLFz1MhU*s^G+1 zK0awhPZd~<%3xo|D$-V)iiE997`wkTLoB#wI1_fat=6f7?EFS!l!~9_Q$KML%eKCF z@toS#L_eG#_ez6y6$vZG7nyaXZj;|}`A3R3y=}1Xq1+V-z?#EML4x5UWzKgdNxu|D zw&pE{k|f+^v$t+L-j1gzrxvzf-{A(3SHtV+k_esH5nw9GeLUHu4>zTvMrfNg7oq4= zw(s`ZQ3`AnYA7??#Y8d7c=ohWnm$z_<-I7!_IkAyqVZkmx57bBmfG`g@_6daNj zY8e~c>X5uyrsxm!k!1QnWYYlPI|IuexIMw)9IzLhSSJaVQlEn_rxB=YXeFoEgxDfEbpoLtD_aY^;v&p*pobKq`e2)8whYCcutxIQ2*I=C z=C0;vxgXmYRfqj$gj5~z39p5m2$m@JS_HqiDM#Nc17URjyeu<2)yU_0ygPV{? zvG&?|59zM}?v~t{@i?6}oql-*_Ni(3%yF|AAawv;mybUKyP*Y=Pr9Nz<{$mySEFOm zq>VishRq|kM~hEQ))$Ty1#ONaFpU}cvN5vjJlB6WlqrEzCoS3!YdbqVLw|r;@o#LO zJ2X#z@_eO4r%3ZsX`Ogjo^{sG7e%fjW$H{=E28y_K4x1 z*XjS4e=CkpRL%V(ZP#2)zGfm*F$v|_9=%XgL7c5R!s@06AS&6uLi0Y_!_A4d>Q zFtpP$m-*?@4C$QTm4w`zq-aj6Cxr9LCgN_zI=l2U+AP^)YezY~L0P(%1U-x1i2PQszy)V+FL(_l-?&dLoL>qXh@l8F zBi1m~yVoXsXP`rR18WOS+rX;5eJLtMR=8T7I6iMzRtL`&kEchTr;T(Z z&OsD(*E3s5)Y~86zlo~=7d!tsar0s`am=s6@A9yxJpkyiYcP?Vclax#fgx#fZ!`97Z_gTp@%? zgF5lDwR#;&pb!t+en$U)fie|gQi3W_Ca)TKFgDid88$O}oM~g~mCgWPo$j^Pb3yr< z1`E^z3?BtJPtX&)q<2WQ7<|ChQ&`%mw?!n5Xc=fIV=VTKu< zj`_8z+WL`i24O7am=H5GRXME_?rZ#5a{koeFPpww=wPVb@=B7D!1~kmT_jLdr*z>p z?rG)uwJWgz^3go?Yp|!f+q7usHeu+#eY8{MOQtX+3hl2sQ`2SZHst1-PH%;%wO`6# zu!Xmc_ncnjI){03AOf}zz1H*H0@sDHR4v8Zs9+iD<(F!(91KK@nWO-WgL}W?mEVu) zrFFupU-qE1Km=&O+sL1)d3N`-WO!|D7i>rw_P}}213jfw)WP0)SeQoRVhb4!#4OsBk?6pZiUdtJE z6tZJW822yj4GFKVvN7MdN%rda|Da)@wT1Yx&v%;qpA(z7=AT!Fcn8E0k6A#`tJPmT zQR}Zv&2A34A8t!JJ6#`I`z~jt-YWRp`Z4W>EUQ&QM_%0=y_dm-{^T;Gl^-au>C`;Q zL-ywR3Ve>TUW+s&G2p=&`o4RLt^wU9zp-Txt(R6It(IHCKx&x^LiDIhH+|Q zuH?K9-47XoXNeu$#S#g=B{D7+SGjz6#b_~fP z5R$!lw2@AclnU8)w=qp}16|&MGu-43tDTPetkuV5_i0QfI8MJ40}47=M>Om@oZO)^ z9pbhp5CDv3T;I_GS)f-or0um9n6C%200s5DhEVc6 zwcI>!GW4104_5E^NYc#oUHkXS7?$R{Tl0&0=oLty{*84xAR)|Jc66=z_R=0vf>xL` z&Wk6SmWJ>?)~^pI3wEd)Ag%+RNz`G*HrMj}qN*YeUbql^6!BbLPHR&;RT30m6g!%t zXIxae*UU$`rEEgt{o*HSwjV*%H$w^ER8w62KSSq)Jp8K?Oa_kA6b4x&9d=NG(A0dt zwM7uo0R_pY%tT=2j-t0qq}mo6AdIY0=KlPhw*x z9&Kql@5TV$VEB!pA`)k^Z6mx@&3=dTX#dZF`6%#YFLqw4xyXl~(w`4|N-#Y_s`;D= z=z6dvbA1hS%je5Ioi$&XcGfxxK^VR`cI4ttYIXk(&Lq*l<(;j$?`y4i^rDb;u?$Nf zr#?JW2rN$F8jBg+>C|M5dn zo&3>Iz2Xr@umMB~pHAjKj;;=;#%{17W^>H1jv%X(a-o`uk$2vaFTw#xzeQtr<2UQz ztu$o|z9Kh0vH3VKSW5JYi4{(J8o*5(WYTnu$HlqV@6`STH#0K!+v)@e_$lD#JMyJV z<*m)kCi8UHT- zs1LjK6xLZ6k+SAqKcQ)_ETusR0AeTED4mQFdo9s}<1D*DJe~o9Ev1IvlngN>9Mo94 zAyf8P)|M>5IgybG1uK-*#N&kFl-^h!T0b!D!4q<8EK&7I&YQUnLi`zR@<-Qb^o|Uq zK>u6`u)9Y(#QdumE2LKwdZn9%5m@_JucI#_z+oWX0FDD8+thYtF!778Lz{K4h$A9v zV&R69vN8_(3jtbt)j)CRlRaUenf(iplAab&y08P{Fe--&=HBvprRWc(!yS7M45F6d zt$M^?Ce~Y$c5_i*MBfnNnP_WWN=QaBfpg)Q2ZZis6lmzHG-O2%={6T1o|9A3kEf>GmIL~}MU0y#r~w1Z)MA=v4@pGw0{1P&T_-%$0PF@dU(?z(E5F=+pF@{pzdiC8s zE+kKM25@YhSLf~oZrW-Qs* z+h)-~wS89ESEnRFXz1GVVsx-q6IKN!DzwG0Rr1Ty<4?6A=h1Z$Znvk_!{oyN-s_h$nNLrDBcaq2uwn&rjzj%_Zuw1s(}HHEzLd z0L76YF;@=ffn2YJiPM!yWt?rz9G#cMY(~xoUd`TE!F5pYJmmok9t8 ziX7ly?=y~87X%`Iu{3Gk5U^DRGJGE`ldBvEY#q8AmT+(SbMdW-%R{Is;3ghn)s(|A z220Zj6qqxpw??q%wcNYO$OW*zf$AMC9Hp*5iDdSHySzu2-MKl>xf^XVOl=vRJ=)DiTxlxVfw|i^t#s^hTw)mmN57!V(OtF(C0{%hP#W ziL8We7)?nLEV2El(1rP|!Lui3F#P00;_O&!TBMcP!-RU9B<~GfzS_w4zFyMG>pY*Q zKex^VEcV*$?rCQ^9! zuZ2}2q!*LqHSM9lesw9qQZx3lHyCdkgXFzNCeRI_()tL!p|#L4E=4F4yc=!)VOn{y zW&-bve^vz1!a}LdUqU(ircswGZHe&)y3SIb(iXj5#wFL)EmZJ0)fW~7G>9^fEN;5m z*Q)jUaXm+4f^w>eoNjCD=1QNomvOrhO8sRNM6uRO+$ zCs`;#IogZ(%rp3I!3#Dlt0v^K4zp?u~vc1JN-D*-l0_q-Z4 z+jGv<8Lkp^xbyM3D^~20a_7giT9~8z_e_-O>Tgbk$~ZzUQF1ks=Y=NB;X{fNm#yDd z81iqDD(aZUn%VR1ci1utSX(EjjfB@poj>?`OnRKt9q0_={1&`#KyiC~5Mvn7P#$EK zB^6>15ngH$IgtX8)IO-AD_{?&vjp7kk7A?FOoN)`$Uj2F`D9Dc=fR4l^E)cigBzG*`6{NqMzsHi>%5}TW&Dh=uykf~jClAh ziLSpm5@FR+rqe`47&p)ES$t*zc^RSIUTfUlQBsTvYy465eKL z-fbuMI%=H67nGvS!Y|vGk2CYu2eLxAATS@(Q6t#m?OexOa6XwNo9A9xi#9r&53wTu zvGOWu3>R1Sxr+`QCj50ht%0&N_*H~WG*`8IExsV)joJ(g{1KB0D=5I)=0@ijYblh>X9XVbWTz|2Jb6tuR-Tp<~ zy+`I{FRMyYzIS3dvB-d>KR#3|jZIXbmYULQukQV?yN}-k~M((hX)+n%FdYmcOy_z z1{&J;Q&w-uUFbhI192;cnQY_lw37BgB9^)P^iD-A6PA3K-$PJ62TZiTue0@()HpZT z5sW3Oe6o|E7rO-USzPh2Go_7Iak?$fKUMJ`*u?QZ1`lez5TQ44a&`)|*PWINS`hNf zB!-5(j;kFlFyei1KkI5-aJ^zVzHT%eZn9{!LfJ|EoL1f5OJS$(agO&(#q5vfivuEo zDnO0$7j=>@MRp1^U&=SiYwV2$*Kb%L1}_M@6mT?`E;aw95MA)O@l>6ijd37HgW9Ic z!sCpEhNs$4sehl&GzNxlcQ5PGJiE%f;4Ej%}Mwx{a5{NDT@KxDy$izB*4D*Ho=YtHzB?QhxYcO-)qB zx*)Ha12j#~6xeeb=7dkbcXOMdRWfXy(+9;^1m=!KFT&}3#6av|hEj2M`1?+<0iQ^O)9(EH+ z&19j72P85agL^nxBO{jIkh_vDkRYbAv#^IaDU*5p@IM0IK>mAgbH2k{0A?2Qw^12T zJmbv(GCaoQAP@LG3vrHr^S?A;5OT-VQnW|(7e8YSZ9<5S8w}v;4N-Km1MOIvhneQY zBeWf_$es6Be(ZQ1)DwU0Z8Z#1##`ID)(XgU-qS!|_FoZ|B&Tc*3!duYldE;IctLo8 zowyoUU|hnNaoa!Yq7w`5>WtACApIQY3TfXe93EB zXx{?9;-xwn3j(9s4=<0P%5qN6r<#;H=Z&{<8Zj9x%SNnQr zUFBF-$j-#=BNtrX$=j@-%s5WZJ(oT9&aYkmp#z|mKPG!bRGbO(n46NkngBn!EFdpE zbHQYFAL^eR3AOfOU@O8%<5oQ~Fe%Btmsm~2fjXs-6}Kvzg5xA@8*Ip49EvC9U^mayXI@`tL{*1TcIe#?w>UM$Hz%U&9aY?M;ONX3en!Kh1~qkLCl-aLHd zq3@(=#y8_1A9b|~Nc&p&3fJlUAGTe5VAE*pvS$6xn1o`dL%WdkhzG7^gTu9BELD|5uVNpe2K`!Qw@$gNp z*xn8}eRr$Lc5v0CSCC55LTcfkarp6)tTjS-zSB%QP@pYWCP>Snc2G?Du8K784akY6 zCl6-eL~sp+r{HjKi31)(c0G6^gHqU28D1RdzO$<%XwTlwK4bChq}Z?uD8>^^*HozM z|EZp@7Z2fs`9e-8u^B>Jhdy=ovz%}y9b=#4PBqy~lprx0l`b1iR-Li-e-ZBdQNCcd zu`?o)@XrxKcwO16*TDUkRn~Q6EpNyRNHzx|*g4`$KdC$>0w$Dvb1ZKtAvlDDlDq8z zVpVt7f0IN|sv)Qi2X(qjHhX>D%RkM?g|WSKK0XA1=&j;$%?b4rA;@>Z9OgL!f21h?^i&9rnV002c@_265vaj z<1IO?u@2RuGzW!^Sl@~^ja%W(s2|iyXav&WXyGKWl8l=+jw3r|!oE1M%C?HFl} zQvx&p0U-%p(kg;*9O}xeTd_w20*NVNtRYHxh*fL2?vC&0*e*ApUK)9MTCCzwN!5T< zsiBEjhB4*zt1EzfJQTGz>f@4al5-NAwT@~ z;}wI)_5vUZ4W*y*@8&l)=|gU}sdB!jvK>at79TkRGT%Ngy~_tjQpWZRpP8)M<&aNZ zg&Fa`qXw7pa;r&+w)xcSZ)1>D>RgQd^bA{lv5biNY|WZlEaNyLc)XW)Y-@hn&G3J! zz{w4T)CZPYR|m`H-Q>JeugCC9gje!#(~pYviyEkzglPwHn}J1dEES+FXyCx$sToV? z_UbkL(nBbu^SG()#W2mbEs>Gs!m#fhSJ@HK zHfQGy1%%1$^+&b3&XDPSV^mS83=n~{a#rB5BukxJU^ZB1wL`O z8#_bygf0c%e?|h!H2OSTsB;pZxeEyj>p;B7)R`^L6G`(#{@}bX(gm@y+Z>e>m8|R- zRhm!hhSk-oM;=daNHy}?Zx9ia()%5uAI;Es@jDyGN!@YJosmvQgw=E*?g0)+4M}z` z%5f!_)s@R66{uaSPhtuqQ5AoS;kHc$8&cgBV6%5dPuf-X2(TNjui)0&Ou;>n`5rBL8Bmdw~CS5;t6-Jy42dJ z87nmqo0%sBJf8HTrLHmB?(e`IwvmH=JUmXo z9zo#%_i%ccoPh=@`WM(y1=HfKvvt>JG8RoUHP04x@D@EYQM_!$Z}@lNZT%gNw`?Qi z`$<-oHGm!LIufT0mBTg7|6cTpBtM)p_^^|2-db4||D3dW^g<#J4MY)P+P0OJWH>^? zT6-!mq$oRo30l;TnF_|3xs(*H1QqX0I5s$BBh-bz7D@qEsShKeRpm?}AaZ>T#%%TbTTiLx~HaL*0=L zcwj5?sfE?rMlhR__W9i0yO?>{{^t-My3M9B;cMNGJrEP=rg{k#jYY_WH)!jp zsdZcfhA_Ej+~w-5MFpZ2qIQ5d_-AL$Z-^TvP?0d+$nip)opXxrT=rcNgK!&{020#Nx7$HB~IId;M{Omw^I zas0KjyNWl4AC7>GU+Am8L+dq-Cn2w7CS<=8YAHcA`E~%5z=i3y#8mm_IM()Gl^@jfz65eZIyWcMC~0;wsaztx8E0UCGK0jW%*Xl`mMJt=JG`Qp29K zMGh#;4phWV1-;919;e^C4sU1E8*J0?WDX)SO6o+47E(MhuYAc8SF(e3X{t46K`#+* zmOdf)Q7tDr;3n|r`PRZnK5}`Q_B3E2w zo0-YrCfP(eXFneD>%*IX(yL1XNH}W`^UGTK;doXei{x^O$U?Ok~Q!fS{MCu;oIN?#={z5e5!qLXM{$W!M^6kL)Aq9%)mf;CrX zRN3_a=RPs1mSu3xjZblPs&RK8lO_a3v@sgadXHM&RaN<7Nte=BB#%-UREfwDoUNSd z^gD_~-cY90mg;S-f&<`c4AdC0N{gv;q9~-w8Vm^kOeJ5$+T4LBp^F@!*mQ+=Av7mY zGDvL+>Y5Ukx|{)R6r;Yfqw@t0y8HHsslS)mA-;o0ZbeFnP26Gh@Bj0&J1Ce_AYEX1 z{yZX$@@s!!8uTWaMWz0@lK3+jC5phGLq3Xic=^q(LUum5gg1Ax1Q;)+E&KLxp;Olm z)kw2?jgEmU_Ds6VE-GRUl&A-R-Pc;gNGFs&3|6kcrpj>w-&;w<4fM5Wp5PjU;k_Q! z7!$dO3iTnK+0zR2+{@>OYr9MQ+1fR!g$63gv$UO<^(#&w*rE`Mwk+sr>LaeGd2Cv%8W|%1AhXKvXm*Em=4!^n6q^ z_Mq2%N$}RegEw?<0~sh?c!*S>7wxFcM!8}Iaf=5uM{B1~f=0HP80p<}_vQ{hU&)r| zQK$@@ZsC`?11rVy{ao3+O?9U<4DHyQ-Wx!YTm`|DfOfT#0c`24hVW~J9-01Iw3{M)0*o>N+ir>uMqf2t@4Hj{zU*|Hw5 z$Lcf<-Gul44~4W4RZFx)B~foeWOsSDyRsVnKMCYhKGmWIP1 zkIs8>wtPOYM1_RU(KqrH(*wW+|4_l80Ihh4l>X&0o%SVE|6;KmoxSApiGfYziPV8I zYaKQ*?V9v*Bx}>cC;J!GbG+RCbc6?4cU0f^{oJ(|$gR-?olZBbX*Nw9RH&frjmpk{ z-3UAHGS5~|*Ae)mDl;E-xlw1eH714x0%G9&j-@^KWOLwUfO%&5dUXY!N6J{hHDfGN z3(t)wP4uI^R^k@QLe*FJ6_UgccwDw3ae=9a(v!!^4k+tF^ig~-KiBPQ15Be4y4u~( z?bo}8_SLkynpU^H6InG;3|pg?`6lT_dFFAyipvd|kMEkhZLZ+C{6EG^VsR=R<*S@O3FLwy^Wt&qPdPiC#^I%;Z9oSYL}w!* z3An}!zOjku1@p2tR=RTQINZQ11rB-ohZ_f6BI9Q!wPhg;exMAMlgeUuqYF1q-pvVP zWS;kVfx$oBAHd0bh<)5@Ef@LxCy0ubN&bu%t1T%x8_KcK?Fs1!9c0K|W+n0~Q9Lf2 zq78pBW4V{A+JXuAF9x8}Nq6n~FG*29n&Q+(h0#FY_bPvi8AvY#sCD|>nc#2OeyAP% z3U90~#h7no${1sWwrpU9IRQ@67*%=={ltIcV7a*iMD+C8?z$)4AsMEcYH(E|<={LH z%sLAS+ob&k^e6e3!ZFGRfItJIrh@3i$+BN*pd8)uL0~SQtZ#)fX!hEM|G0E(5L82o(`XSi7Uv> zQwi?xyd6agJ{K|si*3+;SwhXsqdLCN6-RT?{n z(C+|^b>Z{|)d)k4RA`*~^acOwh3oC0R2qoDz$$O#U!$QI&{=e}<2E{=Mcd|%lAmW9 z{$l*q0$n}4KhHa!CCkXE_gGP}M5%(73|J_Y>cIl{_UW*6C*ebu>5ayM_3*Rtj)@1L zno9|dv_3yLDQWXbfxdJC9nCYh%I;b%97ixzM@=6nIwo#af+LH+KsS`r_*wI!?WY`= znSY7I7^&E`gvHHDMz;WeTDqyrhFKvi<6LnvFg~VEda?1Xh>FPLa<-VUKSLDK?|V&x zEW3G~6kQsnji>9$ z*4cv6c^8Gv3e;MOXBi57d8IQ7@tpTCqr(Z(KOC!(I@-Ao*R{*p2>)EoFXe{tvN62_ zr>|F|HQatv?J%JsjeaauA{_8Lde^l|2Rm=S@ko)Mmop2W8Uwg{t|uZ$HEXm7&3OOp zl2kj!tz?jd=ycj!+fF;$o|IzOR5n=vywfm6vq2uH)|wxjISN|ye4ho`#z~tP4wR<3 zjDezH(Y9l7vR7Bk;R0dbx18& z72)f+HF55^cgWytde+1h&XsW;`TY+^>!&WvwbSU#^OK=pIAX#CQ{PB{ZJc`C4AQje z2vEIvuLH`4LRuBl21J~V)2ktKLTo?R4IWN*wLg3hKLp?nbdVgZ@lrXcmz7f&Lv5yx zvYa#HWmGxL1WR86c0QU;--;@jRr`^9K6ttAK19n}yY0EzV*dlM4gvRfv=V>}!f*9L zEYe{69PJs$tiZ1Ly@&F?907J7`+uI|dSliS?kAymJByO+F-57Y13&ie!Wuc+n4(QY zLks{=eYp$h+N80KXfW=l=+;YZE`neaujGA-gh9rzOWm@GKZI_WHmykAcI=UsCVxXx z0qGEhh(vDEL{v1zctwmm$S@z`Q>Ky?v-1~k`kdgNPtCi!(}a@cc9pg!40?bKR2J=% zv>8v|{YVU+%=b?$RnJ(lhFpVz1miHrz~v5YNN`I$h0B$txKQ>n5$dUD zFbIZf<-mY@UE{hEr=!&DGc|zTd#$QL)ooCq=k|$NB!d3B3!esa=lkrBwiUW(WGaE#%*WuvsM!Z(U%#OlG9e~y??lDuS;r=@4-Mfou zNC-jn#-!;AsgFN&l=e09Z3I%c&Vps;fi!3Bv9`;!OnwAwzq`0I2nzYgOQxhPbeEs3 z{ca7DXpOOSQq>Yr=-a`Twj9g#_iaM={l_!Txi5e^^U%*+l zvn0#1Z8yH2ywTfBT!BP_9wT!dB}bQ1fDzJ1aj>0BIb)VFr*}FI^OBT5R87}nYQ{E)xnDXlr zF5}j-;L-!{>AoqqWKfW{mNk7VAxZQyMkT)knQ1QowO=VqqDeZnAPv1*zq6NNjf(juNafKa>ptoviLr~KaM8ae1E`aZvLwEX^v~5rdYdC zR6c#y0a*OlS(4YT(Z;E9oiVRPZl^h*{{vxG(o}gzQ8ViGYSZ(9=w3fa3icxEJgG`5 zok>f5#=z$BHH4BRG=DX@`4vxQP*!|+!2G(L5jP=X^|3RGhF|Cl)qR$r)xd`hm?Rnt zNfUrbp;LG>Ac3j?+a_HkW&w(&khLQGa!^^eAXABhy% z8=w#3Cfu2t&Ge+w5*|!M9Q{9fu{*yj#lEAmrH*J*wzOWnytAHrrv7W|-SoH)wGO}Y zF+aA^pU0-keo}Gf%{f@>(ZvU7Hc1)=U&^}Qw7n@ia4*CZHJLMvO_0w&@u}KvX?G$R zix#pg2{vTM8+yXf&Oa-i3t-kUlL1vT+{mq^!gM2_YlD7TGaD2{Y(1UPl(2C{3c}tK zYTD|-JhafmT{q4-;XO%>{)vkemD(PZh}3bVEDdP zuICP?qB^_zl;6lLgzi;?eP#b-!2F7=&3YG;0X~bru z50)iN!t`vOpdf@gI~8@{#3wh1UDD^s=d1$LPzNL$%^~lSB@*|Co_vHT2em`VoxpXH zb_$O{vXyx=v}=YtN_~Esxwn0Ao=qF%C4VWs#M;i4gWy#?cb@&z=c00OaVBC@h1cZ_ z2#%d_fnL;{qQrI^8a9YCyM6q);}e^3MFU&oTm3Emi|%TRK?!ROdB_9_ErJ5wm}wjd zCbf~~K#r7&-^|z!w(vz%3yFH1Qw^cjwdMjXdr0DqW7u+q=XqAX14c9qX|IRM29A#W zeo1R7!KyE&g4G0t-ORhgtZ8ggeWaMMxkp5{Y(vDpL28m9e7E&~_%8JK27u$LY^}MB zzR^>3y`+sNEE@c7v6_wP9V~NxubzD*#5JqTKptvA-5jU`)s$yFtf(PL-qD||<%dSS zyE~hV1^R7|Fr$e_1_3e>|4lGb1PKJ~KKiq}B}aLyE0b6FV=jEgkxeTJ4@$>?&7W4m zRRvd12}o!JRlF{H1qX>qaREB41_y|eraM0?4dm5?h$HU}ZRUM!7EFrMLOM(nQo zBeKkFb;ku8jx{%%O_snf6PjFYoB_au?1T4%N5rZXrlB-u+&;a>O>N$bZ{g|`YU5ix z?l6S!MwL&=COw8O6sY9~iP?FT^1Y-lqEYv*V&iE^5NH&1Fccz`!XvwOb9{D?ILbo%Qn!X)ob?kB>^RWYb%Y}36eNT#8vpP3uw2I(H7&QMHV{=5f$Bub zMaBsaIvJUMyf7eznsr4FomgAa3@sHbp8= zU1(7Z3h5+mh{NnaCw4%iI4NpNoIVKwk?P6ZJngG^#CNL&U547xwm3&{Sp@Exc&jd`~#T zqYNrslg?X*w}$q&Bcvxh;jJWStmOb^iWqVt7=gg;lydl51|*(nLEnY~*t-59!{aL3u!*gV30QVG{~sS9s?sllTY)j{!7T&l1 z{dtP(Nw9*OCbGf7&~FaX7?N^;pQ$7DM#NG@)2wWa7XhUwW$KjU05N7hWq1D({$lCn?%LDohhO`W4aPCF2m4`TQNgs)vwKQ`5 zc*|iUj*Zk@xzWRpD6^>_A237goUt%_0T2&nJZ~b?od&c*QtMWw18XuTi8nVhW!1L6 zA!v&3+%M!a%#2i>dL~}0RYNq}@P_a;99PS07c3oKP+Yfs2%L!5K#DnL-<&YrBhP^e z>wOP;SkpH05Yh@a2D5g9*x&fC2!oy#y!f+>P$#pE874n^v;hrC)%*PgMopLGRdhPs zA~g3#bgDQ)3YCx9{G=gM;Vp*Qqjd+bLtM6#1wQvHL~SKg{T<8a4BY<6|8fc}653fQ z_~~jpm)d#v9$rT#P03YJr$w>{MCt3sW=g14#<$-#g~z?r0D@UZ=6V^19u zX*H(;IdWKJcf1C@*oQT8?AJM;2ewwb10H-vB2Le;2!m5h*1u{UULy-Z|8CI=Zd4*_ zHf-mo@D@$WhX1NGb;}biKWH?=IQ>RD*7~k^ny|=VS zP3r6szJdkI9UnZoi(Tz&;Y&?ISN@RLYMtv&Mdlv?IeHj#5Nv~bUN!G=(`r|OzX%_h zgLX>QN1Gp=bd4k%K4RReMBM+6^)1Z(c^DG`qdHBSeEv^ErFBzHz;UqNgkQ9J*6Ej5Y;*F^EHoR!; z9Et2ANBRIW0ofJjzoVIZX(nV z%EO_AmG#*hj?vSsshZxXckpGa`X$25c4!r5^8&OXl={_y%yeTzPGp*rfw2@H+mS08 zZ(R@h`y}H-sAfc$^Mg&?o>s@}VaxcE#DHrt^aG?%wvC_Q>9C8h4w`s51D1WgDM4r< zKesow>lqnIkmWfzA$k6WTcar;A?+_q0YEJS@jU45%$XoJj5~*UADcA zD%~(E8S?YdcrcVR?FNTO5gcN?{nGOyg}FDE-W0!}rk`8|9wlmxzE~yTaPsBMhtxfO znP#+xXQ9$2Uq!Qq&GUA@ZwfkVA&2r)=OXlTov+@1YtM4x@_EzIfKJJs0AU`=HZ=a6 zBdQ{t_tYpx-3nZ4XamSyBp(A#cArN`C8UU73idvEP3;2gU@~IDG(d;(&K4(P)y9ce zVJE4+O$eLJ)Mj^}tig&>ajh%2Uih&?hVce64C^pF^&p*`!Q}+(6wnuN-U{pI80Cz8 zQz`vtW@K8qOC+QELu|6_E~xC;R+sIa7%XA70S_Ps+Is*{&s~yn5nQP>xd%K%7%?_| zWvHVt^K~_Qp|<2}aHXD>*?$w*CYTHE!Gh`1P(K0e%5YV7whlOat=Q=_TGTbmqQ$-9 z@f96}DWc+lCcza)r??`uF*0$k8Sp@vA{^IDSBc};&C=CO zd?Wt+48KuO`1}jpHjnn94Sh4AN6B?)Q=aOH10Lz>?LwwFa18=M4+^()YqFwz^(rLw zMzXL=t&Ntz{Mj{1moCH$B`!c{x;fp8zIvriLQWIveJ%bLLGs-YbF|d0A@2>ltr*pX zY{L7mX5V0t)WFU}H;U1}*KT~x4BAAr!e(eAa9mxqXHjtY|(mXe7Wk-_n-%gbdJ;@`i5p;&1Ri#y52kw?%pD zhebz&Ins?yn)pG*<%93M$f7j;AH#s8hQ3u|urFDm)TX3);&K9*Vop-EcQJwiLJDo3 z$sy1>Iqv`QMpOCo_Q0j~#0#;9l=2IcJm1bSQi|<&Tt?{0T<}~>t|5kd@lPcqJHPQ| zWq^84zItBr#mq^vz$0CUOpcK18>R+e@cu}3)wzq>QH|k&r~w&&R<66EeLV4Vk01B% zLmgofjgkPc>Q3O5g>TGVXsl=(eg&T|pmC&LjxhlGuK;uE0c_62D0sW~2a zHi8~Dn^8m={4`XL=ZaX`IUE<*N}^1w%-3?>Z9+*U>qXUVR0Hoz&I`XHF$CX>uXa+O zF~utK&W8evA?UK zG?VvqT!|&54K&J8fe@@UV!pNWN)%QM2^5wO-$d3^_yWKNs?7`3m^zNcN5tK3gx1;) zwAX@dQT?)IBrSn6V9IuVTe-cGW(VO8&L#?MY#MK7FTg067i@Z2MRr2KN<;PC??B0U z|1rAV$3Lv%*N;mq9(W%8gR;K?yduGEY~vS_<>!Os$`X4mEU_InTOje>Rl}-b(S^2b z^Q4!^PV_W8CF5GRD0;I1a@^n9o0)6Ou|1Fwu*X^zXcGe+gKQrOjH?V6)xl7{W;S*A z@y4zUM|tgr!!X|X1IE!>;eqgZ0RVfkQ$Ozz0y!an^&7Bkol*R17)TEz|6SSsH<0cw zWsZ5I#QbDC^{Aqx3gXs2*h`p8g<>URiu@v`AX-dKP#v-4ly@MVUSC+x`po^fYPyB= zL6F=D$gwuo66Nw9l;n0r7+?t@g6cU{wglN3%#g$IFdwhHUNLn?X(?vf$T7a#K)|9u zc%gGT=xcA5wy{{|w4xuT?0Gti%=E~T61Tu+w5_+e62VLdK0MSDm7bz#%!%g#95i?n z7n2mST+6wwsu&&ybs1CHJQ~(07xVWWoaP0&elgixyQZZ;D#8s~C!zuvxFLe0V@xEP zCE5nx2ysqGJEVbF#5JEy8|y>G7{?_pRbI zZRxxLiCW+F*<}F|1uJX1f!0?K#^!DjcE4Hx9)+#6w_ymXSC~Y*rxheJQ5c$VMzI_9 zH01^-D{(ML(VU6=ry-iq8@>&A4I;^Ze01H50m`zm--5;EJm$U_N9FLk#(>1tk z(Y=+-TMT$WpGynlWb4`QgWk`k!%;N&Wa$)rUbduTrl;ewJg(FnSgo79>Z|95uUX}^ zn(`jU{c(T6;2`GIB2WN2epPw9^IA{Ryq@@Z#x^;|*2F}u1!a%2BYT6vFnAKfkjERM znOB848b!$Ce;zxYwQ|stT7Uebg9dBAF$Tsk+3-F?m_K4f-6v2{-UAY+^hclJHG>L8 z9H}`#GU>q{J)f{*i+pKgxT!9!EO0$B*5#r)f}Ixbk_(@{O##hP>nv$20bSTSDm!4B z#9pJV)yLU=0y{EjM{0f$>e=h=tB_g;!5g2G_R74TXb>qZI(6kX=9bE*j>IsL^N{A7 zeg|CG$dM)IVeg>ta>D5P@r>+)02%QIus`LP_|!Tz`-~}SOUKpYNQ7Tz>TFd$PVp>M z1D6hO{RKArLqOV}PkGVB=ZPSixZw~P^h3JE@#}T$zE->PMg^+*ltZA6R|-LeO&^XH zyrh%0`G)7aV%NtawL{5+jXpYSEVaAYR66CiYV$P*(L)r{=GkYQa7t_6nGy|JFJASm z)dj*#T9q?;*0jy(2r6=&cln4(w|i_S+TXxiX-Hcs0wSHcu-)l!t@gf&=WPzMcHB)= zoy$f)85n-@Ye-#2=@0x-X1>qbJ;l;KN@!R8+6qixbrOH{zZI5unLftl z4^xF)qnU}G#Cc>##7_)SRpG;`3UEn2cEmD2D}|L!*wzuJ2b48I(+e_O$6Mrx6A!0# zbVa`%9rtJe`QO7A&v9p25KRab^l5Psk>~bJjjylE%_69xaN!PWeAyXuneP9M8!T*{ z@WEc>PY;!TFUh7xpznUyeCM0>sX&yu5K-jLJ`}y+InZ}mOlIz?yB!8W+Voa)jcV&W zNPOK7)pNtC^QVGRa_^^m+z9)9D=%eQ{Aja z9Amvc)2v$S(5qZFMKf&rDw|Afbk@&O9Ye}AV>|*>XdNFpz$a2g-2CmM|+%O^KAX*BCWdPQZtI`pG z)+9?=toJazUR#7=K#inO@PD1h`d^Yxv3(D#SJUj&US*ulHRjN%uww2PTqkFgG}rgFOzv; z@YEzYaP$NL_OU>IP)jZ6^~U*Ls)wv!DCPB3)3BG3j9hDtQx-;luCQmHS7bg;dTDW_ z9PlO%=@B}+#NtQNPj1%Nsq4FrDjAi1lgCJ+LnL{_);#Y{HeqO)h>Xa!#*3*b&NSYQ z9=lSvf`c|%ieum@LZ|S{j=bcpEd3iK-0*n&sEd-&$m>2(Cw8Sv@M;97?l}rR9yon9 zd*leNk$35ZinGY47JxG0@ASSIF$x@I-GV|WqJ(scXGj9YDLwx32kz!YWZdzB5F|q> zrQJx=%)%e&|JtMi3kp|XC$QC;kJA0odNK8z0l#z++I=?Xr#VwG&vA_n_lUar3rZ&b z+TqQTiL9iaW7<#@s4<-$0^<~B+SENpa`_mvba?}Ox0Uch#JmJzm`Q0PT9u$Vvc;2SII<#sCDDr5r~ zD$=_(4Km~-b4Ww90PYXg4&RCg&i7Erl(j7l!qxBF5MDxu=Wnt@>|55CAKH@sZb{s> zEhGQvOgJOLI73A9S&~&mOP^$fM@L&mA0i!J#{p4P6^3Y|J<5ZckC+gge_mb1&Ih0z z7L5d~^v4gASJua@T1sY|luE9ZQZTp-Qt>I3wdCu*--K!Y0Dh;5itu|X%3Z>H;4RDq zRL^<|EP8_9SfLG#y5gz)v|0#%q{ce0Yc1?Eu{wuYFL$)eO$wS(xE}iLJR0#4NE>KmOV?+#!CG!71q*VGvlTAI4Sv>WBvD-eW+=_M{jpdBvuTsrWF3FOzAJWSk@G04hW z&NEgiYBgPCCM1$g(rQf)WeG*LWu2-Wy-^rwy7QqRdspK6TPeQoiWvRGu^93K%rl$*ypR_ijj zCUcW)jL~LZM2W<#V#mxn3G>0!yPvI!!Fke%Sy>Cq^te;z3XlITuq!>5wfL(#bq7+Ykpem$-Z1sfNf&+@AQZ1Z=QHf3SneGmrKu+ z%2`?SNgj0Uz~+cPG7Q%Ewdq4Yv`fi)pG8VJ9StzV_ySRx0x!37m*urBgzR9pL8xY)p-P_So**(MU`n~jwBm;W5l<}wfH-qdl^J36 zcFwH?n5IlDxn-0;Urxd@=f|zv>xrTU`i=)I-t!z}m{e$E$5Q6eOgX!Deg;|fyv~2m zOgeW`1WJW6TnZPT>!d3t^*-?W@115bRJ27gkPr&g^rXbZ>sw9CUp)sj?EkM=d#_rZEj%mPU$Z@k*b2&e*ymh9K>aD&YGc;0+w z?Ks4A<$WEZj873SgEqYV(?nGRV{Ux&vGNj=7)FUlz5TH*@uRd}FJz6MrhUGm+v zFU!W=Pt157=wbsjo6732KlPQGrE^@@M9b=u&>SHuai#;x5ubz608q$*9r^+9&L)2J z9$*EBh&w}79PIKs=z~>r04CT%G{4*9rU6&deMOey(cPskPyzD={FGa0dl}oRH@*Fp zNqumec+DJYNeRfhWfplz;aI@9f&XNlhFb9#XBB2|wx4qw&eAeGM$`j+lc$uwHG8wQ zR#R>Xg59ABGMXY%9@MhYYw2jBI-0$YYORAwzxXCZc>qQRj%uRk?HqvkK~6~)`$C|bS< z5c02ef+UaRF}a-jV7mOT%Q1#+XOMPZfw@=i z{44Iwv1|=m|N6oos$97FBbG;`f?(h5dbK5yWzCv=N>=W1>l>Iv!zr;hxCplX18U*! zn=cB=;?n~xiV1`ZEojm|Ce;VMP@F7bH10Ps&R8`)yOc{UTcYPq)a139_>3m6uxNwF z%|4EE&zy+AC|w4&uXR)lRcA4q99Il;F!O*GMk#F-G7`$5o?$iPUv-x(FAhiB=cXM3%x^DbAk9xY?lS_ z(MEXqUz<$jwzPAjlvxmDM3X_~o6Hy|D0m_32dIwr_#4f3$?d=+lJ+?0i9)#17fOP%UVP6u2UnV2XqB1u5;< zwY8w3uG7K+;xlI#>@6mbk=RWG8t|W0dIcr%=g|A*v$rtfAPd}m&=j&asq-t(>(b70 zegD0JBQd7q9yVTyVq;S{tS=RhoH;K|ASCcl_@NcU#50y`~&`&I7IM;9fUzuUT=lQJab1>3qhQ`=D?PrMbgwgtrm3SF7Bq; z#+QrIi7Dq_ob!&)t3Q8wTRo3|fl_JmU7*rb(@oH%EMAquuvU3^BYRgS1H~;y#X>&P&LG=t9PhKg!Cl2kgdE@*32f5 z+_VlIl1e;f&+PjhDn{-lXO9`2j7{YBO8y+<9~ zSI(k2IwtJ)`--V!Vi~H3UIqt_ewWX8kH9EdVcfAs$<_wgSTFqy#@X;$MR&bJE$P`roB-V7M!qt0T?{vD!Mk=2 z3hN;nRA1>Cl%_opBKDWn81~5utF!k%rL-LW@>S`$9EG5VM&rwqZDOr2gu)O-Snul+ z+kxfGAg4IT<-t$VsI=?0snT0{gHSrFN%erdH0y z%fsLAZ`j01A9eiLt$FLBfDDU7ZfcyUty* zvJOvSW!9D>3RVCmr%m7T&So*8pijPZ;G)V>yHjalUa{QbXPrWP@CxT^u08t z7+#LsK6X%D+-2cIeT2Rtu<@otsaD38kOu^qR23?+B^5?EtlWZWmAE_P9IkG(^lzg} zEhe8P%?Nq9!cF5>W=oXX7{wE*TPZG2#BrhXAxW7I!uR=!TjR7E`>C|ZK=b^DudkMJ z-qSvWun_iPfYBQdV-5Q@_5wQPYgsoXc&%#^!mR!H@q~4*cy2i}_bnIqKvYQ*?K*w~ zdOe-!Xp$!&5}`IEIg8=aPpUV` zZZvDarzU?z1sK?@w$Qd2i@Lq##u41nG%U{7N=XB1b${Kh!KJj^zTRAnBe-KfXKwk$ z_e~nzA>%&V zvK+%`+4S@#-H#9@>5~A$)S4$2&=I&+31Z$E6V2XPt};!0jQH>+{$@yj3fJ`VHQ|-hr+s*pzScwfxmUyilM3QKJW6b&Lh%9+e^u@0VvLbAev`Zf> z@L1P+LoN6mINw&{A4oi#2bJ5mJs9|uB(yFR=JC{~seC`2umJ82W=Mvb1|stJO=)?) z4m)lBC_fX2ub_=%A-8nF|23Jq>>t?u+LQoiGIFi&jWZ4Cyi+~Iy=L7)sp|NBEwY7t z5Qo{P&l?f=$Nj=&DZ&-WOXY4ZOuSanJO1o_SRVu%Z@ioR^ z6?{66BG;L*H-nktPVw|m>mhDZnPlXzJ%j&_>^hv7hcD(H5&G^0x4k2m$f*l1-Z@T5 zY_RVn2S`K6V#)%SaN;IPLts=Gt^qdIxyt3TbDJ-0zQfpo%ed91+VeJ_$0H-^>&p=| z_)}de^@I@k!sPgP{f411)&tiQYPdOE_jJM!z-2Uod!!{bmX1i-S={`DsL0ft5CY&? z4)IZ*FmX^)mZUyUMw+6Gcm_VoK!B(-VUw-a$Z!G@45 zD2~4$=KIUk@a->O`t%MM@;y!Q3;sN|Vj}BjTDhAZ7=pUk8%L02fw8<8mW!H12C&?V z*~9d|n5sFtjY0khqj^{|QR2JHOO$TItwAuoFQ-n_zJ-PaGBIN842CFVHk#aAB|5C7 zcq$kxzUV-7mXI>T+0q5|+V)q+lXiuH0SJ9GW{$}-0 z5`8*M4gLTsgi2c$FOL@?s64v3o*vkiOk*Anf6(K|1ZRv$tMGK_G;?P%3p#7uq~eAJ z;oqZrj?N;JW@M*?==P~?nc!+g)~E1|9? zhjD0)MhE{FNk*F!u#O+l4@KUd$Q?j39d^E!XEka{ngo6q>6}GC6avfr1i46YMiyGJ z22C^CbGehYvyFCwmP=$b4nMixi1^6)cC{&SpntaF5C=yG5)3+2y9}4xweTp~hP?1( zvsl4LsV>t;3h5qn#KsnnzNdzPR}*bQiWpuk-H=e%1R4$?or@nkyisG|1p=Q+8SnL@CsLbj$Xkz2+$y1 zf5BhEN~2wjTt=}Cknk0>LQjwIF(&|-O@5>mXy!EE*Fy`?)X zkq`TA<0V#^?Sdgld+9GP^_*dTtqM3$@i%4;-IWbaHGb9OAz-aQmwO2F#cY3b+hY_tnfJYXNXiMvgm+e`@3E=t`Izf9Bm@; zErg;*rs4_SK(3XJ&sKB*MsONkVw#&wj*=>fDWtm`GBJr_PtAcP@4IZCamxW<1OL!L*v~Of~D(8V} zxk?l8DZ49AQS$1zoWoy*cf3@}}(HTJ)at|+&rF}}g8tZP5hx8Q4VAOU|Ar8K%+ zhZqFn!RUgI0$_+M+FmeDC~; zat8(-TIbZd@*K!&&=^V5G}>V!*}I5!-rf78cfDbIj(s6XuL9w>aE4syO7kU2vAqEJ zkx?W}TbSfGSW+ug9z(ZjgAiqc(D>MPnuiSjth^89l$f+p7BDSQniBCW4?jl>$XHP7_Vp!l1s%foc z=TG)e%ysFgGyy6Yp0?U=Z3gZF@D7MtrAs9tzPcgb1K_^B>3kRw>T^Wq=iCnohGe<~ zE@ffN1Jhmuz-T?*+jTIWs+H6-e#9(XtU8HmqQ(&=n%dpT8~Is3Tw|xK`Q9o)!y;xY zEE#qB>93M%(Z*N`%*}2W!0dTyYT?|kL0{v|%94y_Za4X%Qt8aGMVUR4t8C~J@O}HG zY@DlbUoa6g&SLehi96E1HP4>ua z+XA-8dq&)|U$;nsaG)ju_G%9Mq@4oi##q?GZGLO48`CvJ3`{D$1KUt}-UH8x8t1`|VOtHQ z|CsYjd}TJj=>ciVxda*~YkvA$?YOU;#0~)1DB)WJGPXfu+Rsq(pW=Q$u1A#am%elK zqwLdL&z4BTW(i#yjLHB7H7_STf?Q3>sDWtsbS}1niB`8e?zPIi8>PFdak)6&I&~W^ z4Z51-f|#4`IZ5ZG?hfwFOWQ8fVOShwDtA04dX|tbe!jMcT$i38++&fS%1*&P1!e_e z(sCT5S)aB#004xSH><J^1uC~sE_2v?_W0EiIH8PeWv7PciTpBDV!5~>bstC5b0 z!$2(?%Q(0hT{4Z7l;=$;X#FXHXxR+7s@6AI%2eC5DEGn*+5c4Mg<5++IAPp=(>gG{ ztS{d91GM>2hdB{%Af%^SG!@m?3Sm?`jvHTK8k7WC`3nWAbY4$I#5l@dE)%Q#m(G@= zmJSNE{ht*DE2OH`%sy-03_8TFx*iKR+dKtlIN3 za_bd1@xkYfIMkX0t(ZBI2z4!Bh{qFcig8EH&xY1oopUObwd@eSiO^cD;sPSMrUniO z6e<z`If#m+#Q_RX`xpct>u^O!?i~sWf%Y<<98?(aW=Ku~Y>DYx zRg__9{0R||oKkBZkT?9h=mVcH+2=(%Z+IgMOCoKBBTx8GPjkd3-A_){8}tJ56SB|}lpKN^Kl6mV1Vs5*L8 zSkj~@TSAR(lD_?wAj<`?$A z__LkYA4IJun(LFIGNRaYVlscgRSjzR`VUNWOO$ZsN9iv1_qk8+4#&~=D?3J0Hy9&V z1fu5Pif?$)0w82>QiX5yS2R^02wDc8S9ww^E^M7c{e1(BQP}Nw+5G&8E+>`fRESN> zo+@x(b6Wud-B6fvP*@-gQ|VkUi5AROLGlwY@zNHpS^OU1++jD~j;6F<3qpy8^ea+u z=3HC}HLe@6L2=&{f;Q<1Wc;M(dh~txhUO8xKrlurIqAIYO-b~D%*I=Y%w2s4 ztoxh-YR`Q9t0ap%Mx{-v)$d$dCs}VD{r#ejhPZR|MkBRWaIs)CKcMSxVT!IyR>g+y z@EAI^ZuHYp{R4^8yjAt8wEB76firygcj{lr@BF$uZ%n=CxTzW{nOxVVWPaf^ncfAN zb&ato(v0GgJ>@s7G-t{d8t`4qDN>IIz;no?zKF7q1yyqmcj!dl^AqVF?56j97oaHY z+|WLis=ma|W6=*(QeV7H+QdVMZzg61t`Afsi#89ac`IW>7V2Bz_T8PM1Ebnh%7TVR znxQpOis|cgef5j#P7QfOYZ-MEb1?he-B_}yyGY@rJXRTvR757F^%^u_y7_UBJPA!; zJyT0jfX8Zh?D#ajA5AZ0GJEJ5>;$IVpOMXK0FUJ0Wt3b;t9-w0;MN2b+P#B+?*Z>5 zV32D348(_bFi=8Ur=K9IU8psrY54gslLpTI7-+;pt(@XvKVzk=ms5t@_mpa&?9C|- zZkf=z!L?bHI|EwNd~0?YDflA5EuqCXGKMs?$>_g_AEAIv)!KHB1yVL+M{qNHqBp++ z^GR#TEi{D$H<;U?<2>e4yhWFwv{MQ4bWm7?s@F#RTY4HU*@xuB99^5% zw4|w0Evj)SIez_LS9GU&IgBQi9OuXSRLFFkMsKr0gHmY&(7-mgE+hhykvyQxx5|V~ z%5PC@og}8J-x*BOYkhTdJ`ZsNofc=fO~-eSRsiYz+voxWeYKY1xo=IRdP|YWgQB^1nIvN z5KFgtiS7#&srfk%_AKMUtl-k)2R0mn_|qMxajW0jY88zAah-`=mp#*REhbRr9WGU-Z`F)NRzQJ&k^X}^{W#wX&|V_Peo~L^9G-x) z>)0ejW#+4{kv&w*v#6e@IXA?%g%rq?BwgR0RC`Kkg)s*<2suen+BWu(&1%p9zorhU z>*0q8KOslw%s_N8$5Yr*d3QvLEbi6d6AF6*429eS_A=zT3tQsz86j={AMPbN^Exwj z7Y8qMDQ3AfV9#Qk%1*#(uos4H+m@U|jywuhdgsaX6%pdw9RSDWJ~`S0wpQjuiN>xK%D>`3o;xeLWTf@K9+{p&GD>m#W-mJ+mv9oD&rY*9e>nW z$l|hxgWKev4>y|q7!_>R5WyZLo(2?!*r5=F3b`{oe7?G;7eO@MpG~i-qA1a93*J1` z5F*OVZ71+3HDs%Krccnq({-JYjLV$rSgG`;;i{$(AT4V|(*?J5m}YodoBVB zJ>!rfQL-uE756t#W9~Q&AHK;a%q!9`q| zW(2tipFoRq@y>11v9GS6k}`m2qQju?Yto zgTnjXkewC=Qd-9YzmXOzSn@GGH83FsJ{y{1jUS9G%i}f^ILMo6AB^U!2!W1fA=E<-qi!teOh%ps zIfAvRgeD6j^V9+ZSI~^oF^0eV^^S}+O#qj}g$)um#l-8>1H8}^@jGR zmmH>>Zi5k&&|EXu$<0e7d$a_~d}5gj=H{IQmjL_q2%^QO7OkF#j(#wmPV&tEL)-OW zK>|S~406b8(4=~fcy>GGxOs5tKf9upLwALscJOx zkUZ-bV@lISVMU9M|GelW5sL_y#(Z%Q`iN$re(U?W{kFr2K`U|rdR~dk`KvWnsI@*A zTv*OqY6dsmK}o=%@mLG3v6st24J$XW1!dl?xBJV^_uZgY$|JBsa#R3<;_1a?9NQl% zoLA!<&d@<$5&fF9$)+D$EfJXE*v97~@Mw|n+mnvKfoSJ+6=XtSM%|;{Vi|G(F|bE& zd-$Iat0P=^##Ep(k-ty!a68d%i_Ej*tXIJdv$;3Ix^V;jhEHd4&^ca32q?QMK+Z2!0rwrM z=KS_cbP1E>l_dc4=c^#_L1lS1U7cO|q@uf{D+_(}giA8p>Y_x?kTTHBjTQB@=JVZC z1j{b_q{iPZ$Xe6cZGb_V(jt_Bx+N8%>?*PEgVm$s`@k6>v@1VfS% zE^APOH-Z|c0$pR?0*b*>m+&FF{A3tZ(Ub;5%+n!CK3G-WwRIvRyh=G9n)=9fFQ^X= zDI`>ve=oeNzI;PZgKJU7u2ZNbFbn0?RyYAD2bJ^Ehtx~yniaUBM&hIs^OZh!x7-VO z)N#+gZ5^%g3?Z;NMr6N0IqY!uN#2#)Q+&nDzfK}h_ZC#_Of;lY1_$R)xKye$k1K;i z$V$Mhw&I3Co^}zrz^#ptRu_dRt6tuUTQnF3a3^}L_2i)O-(OKRz5RO5#FGu`9jt08 z4OuMEr+K0QP@su3nHpnJdYJ`Jd!HJ_;i_zJ$)54fIy>w7)lNixkL@j)z`GwN4ys}E z*`O=5wP~okSoROIv#oz+$Zh3NrP2t9>O*?{kx^Qj0Sr^Fqw6 z5Kq<(zpI&K8GM!U7>R5^>yBYbHum!N1{i@z)f`-Q3RxJ|(K++Gd3Tc&G6ODgnzYo$ z$azkiXw#*K&$t744<;yJ>eqbx&p8+I;85m+-$10AOzBeN&~r(CthJA1!z0p&fZk-3 z;;K^a;u*rrt>|4cUD5=G9DtCOLxfUM?o{(~&WrEH$6wle566De#)WT1{b7D1d67ud z8!aOwq|=7KFiy;|>Ow{>#w7MP0Nb95vKpufW%L*EZW!%G9;-5ip?NrII=*snDga%c zpYOoldu2&OOBre2*EEIrrB|r(aH<2-c8>9EPwntu@ZIfo9xzInj;;QpO&vK7x$!R@ z>1~Qv@1|u5Rk`m3eKKrzKgxx7V62-jT&|RJ=%`(jK_a!q=sARiWh~y*p((|sr)SVS zSK5Cd(#Q?ZvM^w=N7z8Or}+_6t`KLrQq7?C%EBX~LsY6cwGG?#%lGpWSGFnvO_B{o z?B0DkI^#WWQPX{-fr^k3;;3T&WC3z4Y`7lcu&uXRgLH6aPBV1w)uR5aDyp~D@zgHA zIKYw{Po&4`xS_VFK{01X$nk=m(6aWS9JX9dJv+lyFzzT|%aKp}j^;Xi@E&*Clc5c<;$Uad&Ei2@vJg*EQ}MseX;&sMGz-(7-QTR$e| zu#{7^F^`|B!8?zW&(izss0bG zUKUC1hYc~+T+@i#TRk^|X4=>QCzMb(8Y+Nc~>XEeqNMI6`&jD0m?qB}IFDsnr?TKJ#^<10;bF z6>Q(a5eb|6E{|uDfkIAM7MTr@yu&c1-;_H8wT5fkFg~0?^I@yh17*gxig5aWkScrPpaymO$fFV#G-HezVFP~;*lN(90 z>fM<*>i;_lHfeMsnQ9%1>U`?LCAN5`QzxLOO78bEp>4}fhf2eIueedZQR$Chb@&;4 z6PnVH!F=18wEat6vd-%dPWgtE4cHF zl#+036y1>c?bjxb!O4CouzA6fO+c!k`JVYPfg8p< zKV8(($=cXL4_k#bW+I*8^w>!4lc4XmI_NVPk@0!A8`SwThnESEe+@Fv`Q0IUNOa#K z+<5XBVB7+!b`vWNiI?4S3YdOB^a*3!f20hL8Hy`K^%9mhRB8z=T=TufK@3Ej@R%;B z2u;PT5b$gS&&?SZrH^0w=uS&QGGCx*ET@tFXcXgf6R`easq%)+mau!?)JO;#pmY$)-sKQYb0B8G!Bpv>An|1 z?2E>oLXAD~@DZ$c8r#RePHl1di2*-@=V; zd|AdTpco}OGd&zKj;b%df8^gcm=iKYYOoW(7bK%7IEeL=rq0H~e!_jBU=_U+RPRcF z=Q-VE6lSP)faFLOQ+;3~`lUzL8%kGTTc>^VRr}k8t$63YcVZrlFSWEg@vBomKCT?< zXU}f-!e88$hYKPCxt}hf)SV+QOL-wTuQM%VY|5B-kk5d@7ZAuVi0jD%g@~HrJTl%F zFxSY3inEY#_?U-5n#GyB|DKEzS3($=5_pT$bN)fsEHd#^`ihMI+428})Cc{Z>Dbq6~yc>chR~kT2BWi#1_2(=o zHSWII)NX-ZYTfGVphZ#{@#NqIonU=lW;x)t8caiFp5W8{Qq$tk}HLWhZg8J_QNtg6TEF zLR}H9LS*Ik-R?hWHz1~{s* z`L}sYihFVJ87*?$*T($zTt7Q1=EmexfJoLQ=T?oY&E2`5e|yvoTE54hMAdP&mC8aB zjG#ecdjvlgH1RH4VW?u+(6?U)E!1*v8C%xM7sF(NT%|QNSH6V+`5D^_==0B>IFMd2 zJ{pnCHe9u(nANqF@uqx7RzT%L?GAHFc;=5u)GheSEx{bw(4%e24%-z^Us{nAZ$nR& z2g+0xoN6S@Jc4CO&IhrU?8D|@e`dV>aqE>PCy-{K7*{8F`s(9D3mbDTB3J?@F>aCx z(IZ7c^BQ(uUvee`kF4`4&J+`I5aKrc5c=-%bmhmhy4jF?DzPnUq3Mas%+y)-h`$`q zN$X8qP^$0pe8EfLEWofB#*|0fp}c*H;z+7Q^!|8?gt*JHb#S6LAG5Mh_hrTwqDQEx zh=^pug`jKMGAum|h)E|lZ1;8rR>C}|t4u`mYCYvag7{RaB&GGWOGfpI8#2TJ<1Eh@ z8H>fbU4%lb2ew#Cd6=8T(>om-O?n}rHLbKL5`^*tcLcO?j!_Rg$E8`Pk9H6Q()qkL z>NXDN){l2LLW0qUn)fL`8!yJy&bh^R?5iYp`g7kg7N4C=WIc zN4eSY3ap66t+vmMi^J`>Nt{K@G+#c?sO5wVTZVF+0m)!bEoqHv`EUKkQqb{ABe3so zk+q|?wbM@1nURz1RoU*}afo`guO0D$W~&haceouA%G zAp|@D-`gA7l&p5RobkBoAKr$=XVdxun9VYmjeWgpu}vv~Cfrf%1MowJ8*wq5pH(|K zeGwLS)n^~19eWODrWcc^5!ri=zqE*E)u=bja`PSDSzItyU%KFU#K=)$-i z$Lto@Oci0qem3UsF?YPBT*D5fud{dpCQii}_dS{L$p*_7jT-ZfWNg@JFriBc`E<)+ zXpX`WGj_#eG6bglnv;n`+blr+*g@L5ZlX^UucQoYlNXzT;kuWEd^S;Q^3jLWiD0!$ zVXhxV;-3HMl@V}`6{DT(j87#OYCJse;`E-J0h-qX&q2WTA|lF<5s(H+iqfv929l>)`)OsK&Ctc?9{; zFqIYk{MXT(Dbw}U6?&E8?duq`ssGockFr}I*E1kI&Gq`t4p)B>89(M6p?%+) z6Q3IF{aGfiIKsq9=Tu=syBwe#WH5A#k$mxC2#RJhU#FQrVN~$u%K(Ps;SD!dnd`vD zQFNfvxv2J;=<7wS)GA;&Zc@|MTd%)gx(6kK4a!F79KiY=RXNcPPgOlj^(V~tx%S;_ z6Q+LeV*w;RdAF-PI#r7Pu6snd;`@xcYoz=#7JvWyd_CcCeey4xOx63bF9%qkLqp;; zImMJ6=M=`}!^g8P%60Ht)IUj&2@6S@Iur$}jlOjZ7T0wYf*h?odi|IaVL{z@!+)i9 zC}ZVAiEl)k)Iux}Nf^SUF|pXE1j}=XK~a;R0m7rcR)^X)2XVH_2Ifh)c>#=Att%M} zAq6qqC*19a-XvoNSwCH;`GxpZWmT2rqbqTX?}fd}*}G1qY={n*-XaYpu^*&QlWq%7 z3Xf&N#)S%aKNLqX?)p5Cc&xPvlIJu`Zx)^HcQ_HnVdx&22^&bE!XgP{ixUZfIcsck zdTs7nW~)^O-efPj$cdmmx6xnXTT8(tsyzHCnl)ZP)PQ0d7#HW4OW(pKkDKu<3F`Cb z$%6ei+o(z)V~1jTG7n zVWUsp^&?b*dC;H9p2PJK}qB{^$q=1C(_U!xLUxD-R}7G^kQTmb8TT_&fvQ-1JbdwBkH2?LW> zo=^wW0SebHn{fFkIVczX9?$avh*bMbS%Nb+?-X^9Bs%HsIJ1oRts-m_8rBH(6AZHHfYt;+O8Tc;gNVBW%n)B}%3^ll5)a(f3;| z1n#lQXPKOP`~ag+IJ`){)Hzj;jNscfucwyhuZ-$8V| zZ*i8PyM>LT3Ru%~!fBb=+`dMeN#uP?gnMzB1o|^W9U{r%ECCOa8Z5$=D;5ecgdlYm zcJ3HwvhoJV8NFUt-)DJm%M*SJpfiiq`MAwtFdDXPCHc<}EwI{!;8?!ia2< z#rXFGJl#&G0V+Nl4mdpRgeXr{*ms!=7HBajB2hBx>v+B;PCh(f{jk<4-Sv7Pv(30m zy1n4RKu!CYakW8c?{j{OcCjrLp#HLdl%9(^|4M;cTFNci%kpd1dD@u)GEFElU_6T|{;imzmf?v5PnrM$)@ zBMeRiFK{k=D+Z>n@VqqJ08GG=?%4;#lbns~E!f2{fo#!}HEn;beVi=YU}&H$M&R1p zE~bFAtP7~@lC^CR+Jxh%uto0TTrNf886?!^CwnPlzl+Lak1&GW`8egt*orZI4cXBh z7SDPG_H91Cb!FQ_0zXe!7oY$-)I>%G44DrzB}5DW0`xiLofSp5;HM6Fc2A+Ba0EGD z5QJz#2YQH?Q8tqM@s^kQ%64=nr*v%?RJUkFri}?6B}{s}xc4YjYJ{ux(+8OLn3wsH+@~E?^Q7 zyFZr@y~_>n&3f)^kkA?h-ZYfT7qGa2e;N?)*KU;G14Ot=LUY!( zcrv3ihNzff9ocl>!QYtpS&Q=H7I_c9G^nlx`_*E`{yc-l2Kt0XrErk0ko9-u!(ORr zAO21QSSJyw8U+3WiV;~deMDd>pgPbLz{gaqlZxS#^KW5BQD#WheJ($~S1FUZFH?{E z)7~Uz^#SIK7*y&b|4KU3wF;wc)mi)Lfy)eabH1?KP*>c>TMKuS9;yI39n zwdR`C1g!xPcptm`c_((JsaL*Qw-AksgH1=?3NYh*UQDs>?@idEWk=$e2aoUeGOi&6 zJ^)(II8}2Mcgv{WZ7!loz11~p9<-G+B@|4P>hdf0^NkJ4soH5CPp42bx&fpPQk2Qc ziAzTt;D6Nd_i*fSGZrC-Gif8p_=U(r`B4H~iD_(Q%||)-{}oW2hQ}8fdLX$~!aND5 zL*S{9^d1GaWGuHhRBL5IQdTFJn}gQfH*?xFX>_JqO1OWG?Vrk^DAB7~x$;6(2{3n3 zCaVy!T`x03f50@JGg4wDlgw6HJB(bSH!f zj)s-o-8LNblQ{e6fnq<8YA^PSh4wsOl2*ERX>_reofe~vP!r{F+bUj3jF@vN;)s&} z@-tHBgJ&cNhz?Dpl`FTr%z%XLjwah7+z_IK=2%iQ6W;d}?Yt=3O|D4#nv*9)&#E=r z{T=rFhFmtSa!kIEOp_W{wdhs@5u5e}a+{9!u7UP^{yF~ZxZaN<)z~A3uB%z*S7S-= zLx*F?4~mEu3#*n6IAax%MSrzVOwHxmn?dq1-ME(LTG!xcD{dvDZBv?(>YxlNCZ-ro z&zHXk0Ga<#3;(m1&#!7E-YXv0NI`hX{@HwX#akI**OlX{<9bg^EJzmI_`>hD& zxQsva%VVZ5lQoLemHkfxvl+LHit}|#-?^Cezlr`2I}w9OP+?ML;lgpbK4=i-n@_ns zCS&|U0JOQZ0GgckO2pzCXjpI?^4S7xnx^vvX@&f&3a6n$4!P}95*8dGC69sF<}W~Gf1^_P8*0s(>s0i!zL_#zl!8kL!M4x%@}%aLl$>8^B2sVQDzGi` zEZ}9yrUN^oLO~8+--#6rOz^I09K*l;@!W!S4xp);j)9fW^tP-5^JU5Z?ok#sLvhvu z5Nh!EfiiC_$1Ql4KoW~=Yh1hZs%PW>4cdqUx~z@@JGxqq{|Z@5=o-TJqzFDr(tjg6 z5(4nsMk9MFo;aWzh>Q#zO_4=;y=`(=Lp9sh1gwFVFB>-az5SdvC`w{rn4FT;Azu0b zGIt`kjdq`&=1*UKMAJo_hX4JuCBqdKxhN79bq{vrI^avUL}H}wya^ub)O?|?C0Ru5 z4Ua9`I*wmxGyy>eUd2!ih_=k@G9k%hH{|faA(LiEcQxfwh9FLTlq6>x% z#@YB?G^`JkOubVac{-y_Cqy8QQA^pFy#4}C#9Z+X9ZwetI7Kf(H;cIiGgh-ur$iuZX&yfF-*n;W2jh-_ z|&?h0h@;g(@=0Yi;df(bGnGYKSm>*s{tE-k-(`J^%^GBc0S*y%Vw4gdYki(9+ zeV`(CRpgRJ(>X^;&sRVWnh&M`$J;!??M*DCt_Ky2^qxN6K4DXA8m~BMn{}6t$q1~F zv6Qs*;dTCI`hbUAhI4u2`TORag^Lux5p#}}vKBm7lRMo9&z3foP=2JuA|^V6u~KBN-Nf z)@ZVnpwuZ|H>xmvPVr+1cPn}FX8Lzxx7VWB(|wfFpI-(+n>%hO#->vc8;Z7s<&(|} z_`{YJgw!wq<4T$v?KGKk)Qn=7d97IxQSg(ty9jlXMfpKVB zPbIV}x&?C~Yid5#%#HQ`JIrscmz)S0Pfm<(h(5M`PIaAq&E|O4bqv#mGwnphU)s8o zFwU?1O?6$>Fk@ORP+hGyk)q>}AG}%8sl-WSD|Y|5LV%NR!W3)o&*e7LRFJYtyLr2Tl%VRDx)tqv;s`1GtkNw1MxE`xoTU?zjG#?i@5)s14n zAF+}iRqcMg&|U@3h{FeXG4lqk@vC--+1Lu8k=St2e5IN2CZQay?xt(mcVmBv9vftJ z!4O56?AH2r{JGIp$A!RYkR(|~2;sR_#pmq%-Gta8Ipro#gMuPm?+Bztp|nH}=6^3@ zG$Ky$K{^g8S4`K{v@PCw`9XHjJ#{gH7YwmyV_=m1yMpk(l%3J@te)vhltEE8w0hX$ z$yUQy#TfOrO3f|9Tys!OB-aCoU-TCVpjT=rxbE{Q{VzQ2T;Y7=!rIsflGW1Dc9ef@ zv!?VXOXor#Ow?a_`68kCORZDUdC)I6tmEc}w2yjAZcV6wlSjGSkYto=I-vnb^!UMN$~cIxM&NUW1g>KBJ!^0}gyET0 z*h&(?Xn=>5ipH((dnP~ZbDjMXFBHE{*5?h4xnI^FEifv7(DShvpxfT|W+*TzsebSX zfbX?u2<$J7&%*C68P!%^YPka@%Kvb?D;B#7w*|7`!P-*zzRzq6@z>ioTH;ooI^I+A z6)n@#Mmw~|Vd_7Z^R6~7ve0f5uqEy6h{eULH-zt|ExO1s_UWvwph#C!E7HGq1J(aF zvfKqD+I>?o1@+T=%xv%QFxzv1Xd9ij{PYtysKP#%d{J`}?v}vt_;~d8^m`&i#rwD% z4+e!zY_INH4syRMf?Ay5Di=8Q-ao=$Ayx?EZhqaynC3vBf>fX0wX@BnlFrfanc zigV>od0ON*Dadut7|4*$jQm}y zWxG2`;5JaKj?0Ka$DAZ;$oAvI8$N~Yx}!Chqe{*PQGC!?24mn|Y>&%U^E!)NJ(pE+ z6y#!;X}|~hvjbhrUwv-}lBq7Y3im5bi64B?AC2z8ulu^uo67XqV?egWKZ7%|Te zoyF3=zrpdw>=!$*6@W^cDgBXKnSJls-nH+QCYn;YTZ-svepZ5Cj{cP zWFc2Fi%;y6PS70TDp_ODhm{Y#gDnF-PUS#>T&S>z+V*u9H6H16P^b=zmf!LU&T_}+ z0bPqQx->5B#i#TI98p5Ke9RoP7j>dws$Yy(<-wSkytW&Fog zTZRwj%B%!a>GEh4U$2aUNe*YZM=ZE<@k8$c~p+wF+>40RG;oSga3&u>dLoRwRN2WOF%Go|=PTi0{ zEMv6yeEHy8)6(H>UgA&T_od<=Uk&j8k~ye1jjbS>4vX)|!_u`6MA6>R=UaS~{+-7a z6;Yyg(OdP29138U-uZ&!+Q3Wj?=x;$K&zfpNT~}rP{~yDHfRCc?KLDyfRy&cY0wb! zvLsE8XoUJ#`-d^_hhlI^ci)$L6G$G-fmXCSaS6y5=SOp2+!3A&u=!fNJUCVqO`heF z;3-nidAPi^+FzM%t0m%bp*Sb~Yr{_}u|E`*$Afm=1YL)#cz=>lC{=n12ECVBWNwo#8k9G}HsL z#2BK$#Rx-dK?-BTj4$S3uq^^GwsX;UVwP7ja#B z!yN#hNrgB02_}a!$`3OA79E&An;N2757ClBc@U&c6~-3fXtnnReo9{HY5e znLgZC0UdNOd9`=761V@wENn$ydD4)KI$K&zBg}2W7FgwQIpxTLEbKQ&2YRbUo*a5` zEbt+uYg8vx=NurSa0%NXkzij|@;#b=0`13p8|n#qCLo^OUpvQ$bL@ZnuDqB$vJhVD zo37wk1`MCyd~t^F>jma3zCNfVJvBavFOgADwOaSo1(8H#^magSgt!vo$_DT%m#ukz-u;=H$ z3^^V|@N%yd1}ihNc4M?(F=tMr-&1xWMFy1q+t1TD$j)Fb=P}qY9F?Q!_tEWa@@Qvp z){PW41eqK=US40_mKI%LjjC!ehA6W~ycU{SV2it4thw<=@>?`ho(#2?hLuqk_!U%9UJ5%;3P;rl%&4zs&-l6b|)+h>!mq1nY)vXrY`EmX%S#aC8h z5%*2{X@0xTMqR0uRj~#XrA>?e)gTk7Of!U)72P`)FHYh=z<6JfUNH4CUz4FAf&eX^ zk6(B)LB(VqTEe+(Qf)!f8>*7>(b_>R=~ZWyor ziD5wi!oFtD*gKG8%Ic!I`5Bgx(8X{2RP+?&UnFRZ zWHPuDd(#HyNqi!3C7ySDg-mm4Jc<-jJrzVAMQ_Kf7rldEn}mjVc3M-D>}!68=f-ci zCjc5cirKHuV*ok6^9vb2*Ue%ppXKH>YVdc4@f)W^@j}i%9uAu6XmJ+5P|i3A616v@ ztl2hmY?vv#h^91m+hJ+D1SZ2!*2-bojqGep@!avA23&J3Hx3!2r7xDx3Fs+L;+ zB=#56T9Gex#Win!gV>O5hq;aP&&xui!P^J0qQN zbhCLK!RBn2el0?fOhfDfai=Z7QHXMNq&>kFPo3~Jx*Xp^)2ofkul z^g1uWHMX>b6hIRlc~$=`U0=u^Bcs&V?igw+NwOfRF=4JFsYP8Bpt1rT&c8 za(re4p1pTxy&(4oaG1TCJ?gt+Zw*G^!ZqvB;dVmwkdF zjkp1||J)7ajrXs0-=Ux!tBc^?r4?Z zB_&>?BZtfG=3_El7Bm0$D9K9dcc2U$gRKM*@ca2FuN!Fl`Ak4RVKY=3BsUSpS;<0v zw6ac>H`!lCgFT1IZOZ?r)q&Bi%+#?HDoUtEC*yh)UoBcjUQ2+Ym~&VG-LLYT1w&D| z*a17O$qUADSSf>9Cy!UxxQ!~R3AWV3i*4)En&K0jR+(nRkm(k&GCeVds7Zc7xN*M& zUB$3to+B??*B=P)F5n@vHzu0^J3z$0%susl6dS9b6@eTzgohL`F&BGXwQ5C9j)Gf0 zKpW0+1&;$25v$T?<(+ed-z_r{iLP{>JB0v`1^ucHZ5V=eAa}qQ!=2vro}?hIg>c`GV4)3BSbooo8)8}4x0vw?tqD2 zAcO664|#IEE7|*iDZ<|KU^56Gs~!N3=3W^c1oTx(X)r|Vu+>G{+KTkr0MzWN=>SZd z&+nZ&yn$yfKs+!HqKGVIsH-p)gr)O22ebHGSm#;kCexSHu`qqba-dj} zHJW24233$dyW;Qv_~}SN#>?GkI1`SM2NF<^PH}~DtMj|IB~~QMl}My zAS3_upi&&@D>Kvi0DWBCx#Q-AIFn^(IGNh2S9@`;2FeGyN2D?0&b*^34$b%nrm?DR zORO!{K1~9buJ@I~*gF+5J{h{GEF7a`+JNk@6dAX7}!^Bw~4q9wS6hCVLEVlxlg$FHL;@UT9`bh zW++puX70vqmu)fa%A+y*^CSS4KPz5jJ`3!6xI}3~qpUoZG%Nx1GP`Y?lK97I(~LM@7#-fya|YAki9RdVHb`jciWpi>h^Uw>%0tHM`UP zE{KSaGMgSI(zJfhu3O#qe0<+Ut|GZsT`hpd^4%u*J;ATc$IT2Z?WK(UyDqRr}*zY679^g5W9)2~_|E{I$f- zI z!_XF$mj}woEdTq{nO+Lu>Lm2uc&zk{%}n}~<0kxOsHp++><)E3tg#Y`aGOi}6?|0H z=3EYY*EmQD|4Kq^;i*hCe~GX>!y&n=bE16vz(jQ4V5I zHv!NXwN@>9qF~r-96h@H`tnqh%tn7MyK#kR`eP*JVH4-?!fe7%qHjjT^Y^u|%R%ygL=%AG4hn3whT5F^B1(Le09C z9=q&yt*sFM^p^5@~D5Wh?)CE~(oP<=_B` za#W8_nP>NQ2F9_E{4hmK64`g?(*~wHg?pCwhu4@HZ~bCjf{4H*w##gy9!wexD6OAq ztvrWf<^k~>^GW7}-FaRN`@6oo3-jW5U^3jP1|_qyy#$BYkP^;FTPzr&C}^s%;*9#v z`=EiD=pT@l;F+Y2JzC8K=qUPZq(YOgz^Y+LeHI!N;H<85e`xB0WpQ@_8LV#3A(Yo#`@@Ojs#fI7@G z2T`uxn!GzV4}tDcAL##Zl*{#X*Aa0sN&+H1HTk>;!9!hGM=MMQm%e4!v5N=`2!n7- zyD$T7EA0nUf)M4uMVaz;aR14sm7;g7d)<^3qI{Ht~BdY zdW1V;nVSOP@YjmyEvH3IlgZ!jt85*g(LfcwG1*C$K67Ua*r$%Uxf{u54W~ib+qphz zYK$T#8lC~JPTumrEDnu^S}TTKstxKub18FUzX2TgS-lQ2<|YCxKWnVEG|OKjI#Y_t z6||W=HMZ@N?ulmcZW~N+>U5K(h5@JsZp3DOENp_^^biIbG%HdHgq`l*qsknJNzeT^ zZE~l`{xh{AHI{H?%!F`+eX<7XrVx3=?)Tofw5g}9UGh(N!19%K%>2xd8nno?eU+?rsG2`mx%4F3Kecr6EA5G1hp$n z(y-!vLs-+fqbK|6h zhBakb(Bi!tu^P3-!d0cgDmjr4PWGpw9pfF3$&Bk0ri@|$nxYc8%wWRaLS`Jt z31Cnj?+M7IW!$XN)^9Bw%a)3o;#-$QcOk$WV7BPnA~{0)?rznH&3a)fGW)TQHOBfo zl1Xso(LD1$pn2&9(_~achrKD<)~p|i+}yWEESlrp;8L+FsJHE9(G;_C2LRWmZ|9%u z7fLG4vp6=-j#!ugL}-c&A33M%q|0^V)6omjP|8C3Xz?_vrj)RzPCGktJKm zAR$(vU*EYLHv3MwOd1JA1?2Xxv;QKPT!Myg6Jl7kvh>q8pj;WVAaW`Q9BK6K?!Q(n z{nT@j5KO`DmWq#&oyIYuKH*J#EX=CcU~7@o0{TZ94tC&gZpaGZ)LGWL^I+xX1g%Pk z5!N#wjRl;IF~mD@jlkr_JF#@*eS4?Z7R~sKegB7g66GbvoPpv2 zZNRf!=^lmXY1K^B#y@V@>YlkiSMjooZAiuKa#_gPjEsLeon@6<9wit_lueu0Kb6qf}#lVGv}5ZCO27g{nYYkU8BAtdzsG)QiSBOyDb7Yd2TIcxK(;8y4vZ>|S5Rl(Pu{ zmi^FPZ%cQH$6PQ0$$wvfb)*^&QX>Lblpr6i7v(__RjFfo9`wISa^>wiu2O>fQ{$=< zX5Z58DlCjW5Yz&q=h8vQtEWrT_d#X2a+%Kt_t} z0|*9_WU4M)9H8L>bF?Hs;(3c0bHzW1CgU~(HVs1|loOcc z5PaIeaPh#Fwn1hEU<~Z?tyAw1yBq36#67UHIEC>G_JzQLrG@^Hr;5?%?epm&^84nE z=ZS>$Rx_?_m0(G%daS!73bi~#N@w|9W}7ff6rk59bRFCCdo_zia?5A0P@3|c_qt7f zhorMmc}wk=k;7IfCrZ<2s7>eDQGzRLaY!4FMAutz!@~HnA@&qQ{-4zoa7na_YrVHo zT7cM3t>?^>ltu&gwjm=FY&ey0t{iu~qAFBYqcnI6R7JqGBnvy*iqV%{S-1^?XH!Ttg+m zw1xeEJqd3GK%o+-vpOSW!gYkF_;z3Rf9`tIL{XcF{1UDn0h<%L(^k`N>&dLR{(=~- zpfs5|Wib4A8sd0as0H->o3~3H>4wPHGCy#9PIulg(>GL4)IfZ{WHszgGlz-Be?77W zv{r{{002QOG6Z)#8naq4MO|{R5Uc^ASvF)-hUS0izd`BcKu7O{YSz=2G{}hX>1O?~ z(gsHg0Tq#kLd8%AL0j$%;z~SRb85jAW|;7rL^!i|^eVf5EMZ5f*V!S^ygV_9x(CiT z?$7im1PdAkle9Ly9}3u)l^!a^5#i~F7*}WFMZTeC8NtLa9CvyAW#Ki+2f^aB3ZzYn za#k#=pZt&UG7Ze*6#pTFyQ`bX**0628T)jaMGFDqO2h^~K!+L-MC?u&f7nL88W%@L zBfELoUI&aZt{RurZ=@?)F%Nx*Azd~Cx);{EEiKTLwV8{f&mcoS8BNjpBCIbTyY@jv|SktX!R_e3PS!qh15 zrl+@H{A%3pe)FAm>$j}f>#u@ZvyVYUT*fnNge`vcxQ-Xy|c22makKsAcbu^0$nXLdy zDzw7_)K$W1S5G6r=AsG=&s>o+4;UOX5o>>PIuY;=>P} z7miF@;qRwlURfhD43ps+&Pm=zA~a?N?9L^o{-m`!A3zm%AcR%U)ZC&3Qe6T^31yiF zj}vo718>e0M{6;(VB&)qP{8hD+qZ(!OLQmb1(ck}srh|rQi6#kdLA2AO&W!#E~Jr^ zlV^4yKmsM?dM;V;Z7rnLfA%fyOex`w>-p%Plf*T#)|Y zBt5Z-JrS@lmUw_9G7trjf{fD$!@8)*`^wq)uNM=HEiq@&$R1TR9*vKp%mk}X0r3%n ze{Re6^iawW=J`c;W{_>J-or|I{f-ehcWJZThc32w)6iPCvQ4Gua^@7D*50k^i}kWZ zzt7~Jp)}@3VZ^VMwsZ_;EkDW8*Pdaz;uqKCICvzFW&%J#$MZ>{-D)p>gx#u4`m5ULa(R=CKtXj0SBa=?ywj=F9g)XMQR-dNaQecR zQ`3DYNp+d2;GaaNw`6T^v~)@+mn^|G2NfBe`5TxQ<;KBB#6%w=jmh6S{t*2Pk+Ogy zJ|NQA?l1dGeAu)-+NKRkJ&#h$+mca6U@lbizxvaiD`qAC7Ik)IncTbMOz|BEW{ zEID9#6k^eTO?0RO8kW^6>kziz@MDVoWD9i>{Bk(@SZuWJ7IFsFs>aQT(TL7MJq%O_NTLg2ZS(g$; zA!Iya6A(R~%IWfg+&ENgKacj*LyeB=jWAJ7VTjf8FWW%M5qmP*iPUCVxf8c4zABN# zrDQ4Q;dKy;FmCg%zituldMfrrz=D*p>+*?)qF}oOx6odMX7F!P$)~@GpNcsiood`^ zMDA*THP)mB4#k>sc0$CMCCXq5d!~z%<>|FZ&BJzNXDizHOD{-BdEt@~u6)Jo?8rm_ zM}VQT`Xd}^0`qyCR`|(nn1}x@oUZnx$0&Q;Qa2?yA61g`kkIraqUvvlpEDpWxCCL= z@3dNPnJQ5l#EGj1Oqc*oyV6Ow#|0X!WNT{Bvj@2_Y+q{fy!o<=k$073 zn>UX+Y5SvKNWUO7L0^AEqsnn6B-GWcVOq7Vnz;h@lXrod0(bl=QpcUj7ngR)78JHj zIUHQ7?*EeP3{LCKU#i9Jp9bQ90oglh@UF70#QSlH)48@B4Xb-Cs!8FMKJd9WSU2@X z4r-j?%ml{@EO@`iQZ`^gUD#hO9aTJOCB%9RD;3=^Xky&N_()ISLE23sk3{^{K@t1G-VN$x-!@1 zw`#+mxGBzG%bZYxHpGaC{5r7#l>^p?g-ZyBmiHaJ(lc;8Rds`ZH|4!j1tkwX{UA>u z7FB#)|2lsn^)>Im4qGRX#7BFC|KTU;U^;8bEn$g4G!np4yM+oCVl;o{=O96#h(fo= z+$jbvFa);%8Y;f;xXPd*P1wadvMpo{r}3DSf2UjZwc9K&6ubR0tyv1B9@j&!3+j@c zN~T8te=tf6cpY_mQ<)|CvymQ2>xxs-!(hPo`z6`Fc~E{Z++9<57}Na-PWo-mY)__m zJuHVaj#WLdQy30%NB3@aKE!p`Vt=!~W86@rk?=~@?tp(H>>j;TM zj?oZK7)OAL9XBT}#(E1m>V{6tIoZXgY7h!#Qx-Y5fh+=Fd@%m!+N8-uq${x~;$%kir#sVG7 zROV2NNhUWCUs;u+Fl>qXPJ@0RxeMX6lA|4bHJ4@{ zsZ3Z0$=7!(jamhGq?C9y3P#Mmx72#v5nvnGW0nu@LPU_P=&P-cMPr_meieLD>_JNi}JT2DtSkV!M7Hy@>^ zw6yuSqJ`~f&i$xGla!tw_JOItwJ}nSxGiJ{o2~yL!yN4F%LBW=7#nBwj zs_PjuhIGEJUZ1$FC>Q@VzRX_PIYJfDJ5JekVb1!hjvppkYYe6ocm%HI-H%} z=yhvMJ-R5fPuVx9*MAxMcSR8G^OUO-w4E#6fSyp(a4)s{N4gI8Yg3%ks}bnERq8bY z04KOaE4wrIaL~x9?gk(M$Z8D3Y8oOBnUey&pM1-(`vZl4ltLmSyHjzxzq-_&d8Fmr zw(>lShax&&4f^7U@JS7pB|S7_5%6Q#>S`{7^4bcgQbt=z5&!;fQWm;3z&@2LsSkEu zxKk9dR`IF1D!@OuNz9fqH?65v0&}bn$Sbm`)1QE`bi8(RY>hr=KO2ha;|>D)u^n@v zqZ-!^b(NJV^`nB(HtG4DhbE;KG|%NXVLIduL8(V!UZ*~5w9xH$p0()Uj(xE^>7r53#K9=m@MdlC*S==R7Uv7_S%;287zP-Lzv z;?@l}6gGRd%?XCH_dWEv4$euo?^GFu29?X#mvd`X(UI^6cT2HP7%_0QUAGk~KJ^Y> zrDKuY2dBw&vgDnylx0mAGF<^rap?DXFBrVdNeOlY!f&g)-Uz#bwW{IL^rq2h#R$Ez zu495!6fL6y2uW(j?%AaYZJ|}ZRE8Bl&-S-kjo_M=aK&U-1R<6?a&yyG)$lDCb1*Gg z*Rbg?&g$n5FBb)2uzUeKoA6*CeGyMQRmguzopad1UqoY@u(XXnlUGeWzXS^vs8!BX zTcRg(HI=#Whfj-RI8fgxdA{fer95vp#4q`g^9Y;wcUX7;PxR!AZ)KxuWLaWyDySK3 zaKa?WwKN~R{t}AdF8Re4f9q08)Ws-;BR_Sb7=n?^Y4O1v$Oc`$-Ug$aywH+oV5H}p z*yE;am5_^HX>>5c^*pTOT?@M)hPurwJQ=3C@!&T(b7`P*SlA?W5Bv>Wl`cThIS{W^ z%YO@&*CBIpZ&dh}aHp>&&4%%Q{Ndi5UsX|OFd(P2=U?dX3I?4;!4`u*s&f*G@6&vp zogMT8261)d>L12iAW96e?Z)4_oXn0qdTk}#PM2~T->iB1;hV(oVC5?j0pfZ<-FztY znyrP^OJFyyWSBU*C4Lw!ozQ|yx{1+7G$X)BS#de-RZj}CLsNT@nXg2R{=Fbab2N#c z#loiKPPWhg>>;5$Vyan+(2ox={9onz@CvcDD#exG3ypf~fG|@<(A5UXFrpv34OJB2 zv#8w(5cuvwr>RR~K;`R)ydTe)SLkG6u`pFU+84k@s(ck-^3nW&pfMxJ^%;HhELRKU zSE7ue&>)XfkYIT%f#4W_-+;aN zbYp9Ac|<7m6G*9!$7Z1oS|r+D|m!E5qC19?C&B)~qbb z?V|J51v5h|ZS_zc|HW-S@5Y2rBJPe!LLK;CaX%DA=0r?=Jr@NC47zX8u) z%94d(RJ(|R*=(tLN+K8GewN>7WNpb(dVbjS0i$n*TOSu`bV2?lhtPGiA{*#&7ik!; zk*aV?cQpgi@=+lbb*!62KOJ@>)5-RR0^77d78$69SadS6bx6`S3uio6O-_F`G*2NQ zZ+9E_AaT8%T+IV=q)9G9l{guz#DyI8Z0R>BAORuNPi*&CPYPV@t&;(7!_h(P@@$5S zbjvq1HbXo+jDItVX}pQlEhiZu8)&E%%M4jQF^0cIT3z^joE>M>DRl-+afXXN)8m;6 z3{+V(A-8h0z-XJ=>X48JtAOultms(pNy96#tVWH^z$Dx1HF7kq)ZqA?tR>@h;&=iI zK4CS|o?&g&r59k))_(z)2ZUIRAgH-AKjmVg=K(bI6jngAQrlYOMq z#5PF3Km!K;fD-LtkGqc&6=k!}$YhF#p0JoA1t9RnV>_sPMC7$=Jp+`(n(K=RZ0jrf zHU*=6<=F|@TAM^B)v8mOPL`k$$>*%tGg9Z8}|E(AEuI2$uYC8i#ecGM?g8}CQ zlCyaTc!poNx|As$&kQbVHEY*Hr@8X5zQRUYsRvqyBonez5w!y>C>U zBt{$3G+srh1_G_rvFm*p`SQ)(m7qwb46LOWbmpf7d<)y9{B{==#jVDzRZJ2}ooB;i z%oXyWQrg)#R7_V^eZ1z0dg>k5Ez1iE=SX706lTJ2Sq z)c@41@-nV;sKq4)3|)B6$&=~Q-6p%X2A=nY&f{AV#YQZ6I4;oaj`i*O6Y6XvffVTpL$!>^R+5#AiAM=SV(K!DWi7o!)M8yq*zY4XdC%8p8CZFQu zR}HQ+Nh)m#(2Y8j7Gb@7vhbY((hpjJfEXb~Y#F@Q9#R0Ke(D!;0=4_XH63R0J3ww9 zyJcccSWuJrT7!nmKS0-*yv=YZ^~L#^aSW~h}Rf^Ep)6hC-MPLR(lHzYj zz~mCnW;CBXVhH}4sZ*Y@1HQfCo<*m`N7bwkM)AMSh;a)T*yvQ{SI&->PAncWU0R%O zBZxw#w??LK(&XtgxS2T7NVD&}O3G(xmiq3Uj{;_+{0}X!RD1v2TghayFxJWJu(4VE zY)FY&TP z*Ll;5{d!)(?A5aI_R|LzV$O~PpsS7=`5}l9U5+OJuEw3y891(uk4jW;ZCNazXkG65 z{U9WgZM|iD!s>%=GYVve(|a;bIMc4-`&koICECB2cF5U>!?l9hL$)Xsh2yK=l;m%!7YnDT=~OznG^(G+=7XNzq-T_kWg}Anvk| zH)X!VGnHIo*lbCQS2x13w3`IFBTwx~FKBjZx?O$h59mzIW12tX(+-TV$e!5#YdoFl zx*S+1k{{!(&fFg~OQ*;kHYoxeO4+ z`5;y{Iy5_2Q>`U2@b_KZcqQ}x^@j8da0^RYvbuHF0+)oQ3az(1&YdH`hm_bQQ|&aO z@T#_s+p00%2Z&0=dCGCcbn+y;L+VJ8q<-owC2epShG5AC-V0KaE~DrDKS+a)SM&iu z+q5!Y_E?3b)@RM(GR|5(_jRmQ%$;!)aAm`=?;J%B6ZKp#7#XNaAX6p@0?x$r@>e_Q za^AIGWTY>&Y&1^vYMM5zIa1zr;^P_+Ij9g-VzH?25x2S=fS6(&rDEnvm#u$<(0t8r z!}%kV;aOObeHB?*V%r$C{fT}%8hQZCPigS~*lN)q;lsXg5~X{;)fK`M8jTkMp(SshbN z{I88UB;Xo?P6uwQ`0~^=MZ^9B?G;ELQX0LwS5~FTBJd{bBV2FcgZ?QYm8;#Kd?o02 zBc+|AG8O~7xuUI0bWjjzrxJzlBs`vAS8W}tdEBxZWrE;h5HySS2N>*J3JoU80|xN& zFhg~NL7WIKxPiou&wP+}E+RiR`86_~IV<0uASRfKIw*0c__7y3U`%8hjnd?nz_zJh z(UDSx=igy7GZCTD73=-dD3!?F8g)g2%DI~)zy56;4?oUPjZ0_dh#3)=!L`@vc5;@-61-4~If&ROA;cAVS0{E0Lw#h>4boQJ_JrsTood(j0C4E}@Aa|B z=cmWw9q^-2*+_=REbg0_tewT=uUpGIL(OaXnf8j->HWe?P~lh+=0aB9m5un;2U6*H zw$M;OR1j z&K2(}D{v=g%@U-kZ+qcwCHp^5hD{fe2Yz0{+z%!`R|Gd7O^VS-(ZXEzf(0Q4f(>rl z7Z&ZlO_RwO~a+(_dHCcX-x{<5PvnVmajrG%U+wGjT zB|AusS)X%7B+{_(G-;*zlM+PrvDK;YFD=i6t5kzl=0L_&=wogg-*O z|Dj)g?Bts7GOjUEkXhQlTyV`oa3kZA4wXKcBOwLy*B%tUqQA1lw@?8-^Ov$=$vI@u)8+tsPk9yPA8OXCy1N50&<5oA1&(x~A(vPx!+hSaK~97IQcD)^$|i9n#xU3Xn!ENCbrS<`kMI2P8h06{ zEaVYUY+Q*M(~wU-UD=Qo^1-OY;2} z39qVed`!q_QEOH=7yVt~cmTRsW$yTxDeauZWH%kL9;-;(1$!R6>7>3UB|5JhPpIB@ zD=~GPD8;~Vnxi<{)8Qw+u!`~=++pUB>z@WLkpM64>1sX%&dDzzXa~`HzQvB}A%o<7 zO_>Jb-oglkp!A>KFc4#r>87{f-zpF$1_R8Qu*4Ol#@q~XfqxC+mabs)qk=`fi z>9>*+s3SBjwf^BMO3vgetOPUKpf}*yw-(&e@XfPk%T`NJG!T;EE&wc>inrwpTc-VP zj>nlH6c9#LL}Lrc8|QJ!Cs>EGdrhvLNr6vqtUZlW4&Pz!#O4p(-|uTPxsG8Us6HH5|(kT4N-+qg)li zg{^Jm&x`jyDi{q5y^BXvGT5?cNwo%IYE*A;$D=PG&}%T)W>K76Wm%*3H0@kNr3yKZ z(6}=M0R}|kq-jPn(n8%@e`%1?+5ccucZ>u!7sj<Mw%Dmhttc)g*+gbPGB*iH^hi&t zq{Tm5?0Ch13p%bj2+~TdhiXO4s|vqM3dU&9DmNgT+hDW4z_+vIkVRvyy&`iGv+xUGE(I7QkN$I*pUE6>_W zikGovZf=*j;Ip~M*GTevdy%ei_i( ztT9i4vSWr@o5n6Jls$gWYAtv2PFmXSWS2OhTSZ&G?~7 zk&UZ5Db-2{0gj+8P){hOE(sOWG5g1M$%@{4Kp=R*e>GnNCr$#yWRZFPtbvgvH_;g$ zOK00Drvqw#6t|JDAIODuv~Qcb=U62cj<(mvF26x4CxQ&Be6?OyP$vW2(j9**_7SSm z2gLP;j$tZ*y`hV27k@D^v9{K6Sg)||{-`(HlnSRQRqdbatUhj?xS&%W{w%e+KRNFr zUrqCfw(S1&?HkX%;^OFyW4$qLPC`jY+C+ONHttiW{VmY|4L{FKbauME4Sbnl!QI*N ze2rpnRvDxKw%fyYuG3zZ?;OU$J#`7j?3%%f1RIMR;=xDaPnL^Ciu_YT z*0uWo=D0bur@J&y+7pUWF)`%!lCNhAugOQ{OSqc{#Rw>+Hb`?K!6mWDH*Ce>N4lj| z`|`k7lh^Y30D!=axz>I*lV}3r4oJYcsG6ISyRy8#^3`k3BZ@&~3T+h6Yc{@tNc1KF zC~KpIU<)=TE+`V?RvMJT)V{^Zx(4&<67Rw#y-eC=5K9iQ_}j>5#g>ygg+1w*G3yuQ zO^@KMxJ1aA*7{=dadETpiKv!AC`oTmeK0>^o?jsJy{DI0IhmfUzz8~I@X$AUzKDEW zR%qRn;cv+&kmGWHn7WWncHI|?c_)uHO2AcTpi+|e5rVpSoE_t#F<|`odxgY0W=@Jf_ zJHqxlIB{IH3|^xumJq(w%uj<2^;wi#wI816g5Bfw-SRF$z%NZ3J$7ptg1G^0U2c~8 zm_xS(rmj`sf>(JZ!Z9H4IS7S`AC42$9(@&|0nySnO}MXXFBO#J22fW=cZN;=ITU#D z9iuOP)`90O+*_EtG#n#eIog=3=wVP&BixkWVO{&Csf-9cGzHc!=2Rh8>z>Kioz)bz z46|(xRBb;TKQyphusU(mQrx#8(@tqLezggzCr3&I{R5Q4$Gz+!`7-DFVQq95qYk8R z+Qdc9gOO6kk6)#lp{Uad#c`J=^ESl zn};`(9{^XTJ7u>}fh5?)mVuw8uoqlTsGr@*>DSSBMp+UYFkslL&QT2>?Y;H-y{m-U z4?n{qJwT(I178O$f*xxMFGBW{vggo>{4P$8zclk4M?x8gM-o}tA!Uj~FRw{y@RaVl zd4Y@Yq0V~Ckb8n74SU-!1~73~ebGHGQhsHVK0FVIa32%h^}zaC+P+9NlC-b|^fhH_ z{d{v1|HHRHrq9d{i0JvIXT=?+!D1Dg53V74uY$kQlsP_@G$*+A?~WZx;vaqGN^}4-($ROf zKxMSx{7Mz_&#&yLDk&{hFv3W|s;W!jwdFR-)-(7k%jKrJB?}E!76iSnV#T9V#^zbJ z-GYMW$|eGN8oOnN5wsu))3Z_eOtHer~qk=8ygU4O)O@&bLU z8Gs`?nEki-_O;)`RS6bXYm2qSJ?GH%ac6Dlif9albyjhXw&Bv34yDf*2|!)3d#4T~ z5Srrw)W6+Ozz|J(AL$4s%xCZA_St_r4$#gDCW$z)Cd9}}l45`F_Puw z=smL+-8ED}D=KA|_?NUJJf*qK4g8E)OG8nkCg!r`&RP@=Xw~N}PV1CcxB$&!*5cBh zhXDW49~L$sD)@C?JZw<%$FDy`BFmN_;Ja+>W1*SCf5okhvH2bgQr09gqWO4h{j}QL z^J4l5md>mU%ZGnZB4!8!0drVaP_F+u@m$Z-{5Tv6chPI;ZLQ+g49_pNo`FM!5n? zQ|1C(Lxn{3vg2{>=&%cNe32E<<0;BM&^Tqp2*M?{qT9+VZ$|-xY(*F=4rGTm7H1#! zu?*|X&{C^TG(s{SH0EK&*aC!p*-Xk zFI^8&(j4Vnd)q3^cQ|;$Hq`TUsOZp@yko3gewst~a2N2X>dHjF6O^A@+b$~Lemnm+ za=~pP20-oMEMqd+B2kn_TWn`=QFMqk(Y1Y)+*=EGtev1E<8E_tt-~`R{nbf6s4KFb z#qFPW2eD+#ULey8+hk;{QJS=sV#V;F?mAX0ie>)|y14k?vH6lwzv1LZS)HR^`=? zPxTz3!_g&ZG6f#$0u6KaVfe9q?i<=5F{i*1(*dz&sn^F8eEi#x98QH|b{IQf_@;_$ zlKX8^)9=K2f`o&a$(IqJG^+5X&2+Q!O3^NHHl?G4@D>_wQ1pzhX8z= z<8n8ZPJRu7mpUqQlA%L|c@p`%dl;t%Z37>X&&&QnHs}h=QOG=BwZZxX+y#(oZQz@<{dC<~NwSRZ=@ zx#Ri{TD^)`u0DAO`$E|(H`z-;WQQQQcxx)^0yMu*TU(*BWS>I|LhR$bDf?xj&p{E? zBT*JEEL+g_*6#i6+C{ym!ERWy95AfM?`W9F7gZALZi~NpMx*p z*oo{7KQjZYF}wxQs^THP`&3aa_o@Ol=?xth3phc{8>4z!&02$e+Zfl__C^*Yeo^U} zNXl)HrtlB<8&$22Y}Ez&$G%rThjC@@tcET0*Qs|?vkV`D!`6PqotN)C|BCXQf>s*u zQ(S|Mc+SYlIUEcc2$Q=~p)W7dc)kO9pT~3lPUoNrB(y~X=2-4`DgT*jdC$?ve~r;F zOppZ<(Is)q@*q;U&})iyk-SsvSao0lWLbWU`6}A|2=4Uca_Of!j|Zy}2WJQFaHf{D zGh>0-7C2)3g#|?2U~m)8OPqdhZBKEirLue;(W&ux3Vj+-ZOyT&)x0Y})Z zqiB^u%KVuxNyZjR<49cIA>rJ1U`3-d)EDm)4sq7`CijwOuR&#NQ&0eZWi&hm7jc5IHYvN7OYqSAv`4 z(|_b3PkW(jM5f2rm%n>K&xKaKoYgxIOW-FD-*j1#O!D_$RjGw>KJBwQ4kCBJRZpqB z3mUPC?`M*zcb6DcjGag_aQ6Sj8dd^v*bbv0f6^4AO4sLgdYxVORsz@$CAoL0p-HH> zqG!zqeia?B;V@p?&X&jU(?G+iD_UD*FooWY0vvBUTsd?{bgDF9Z`sibJ=9Y`&LmSrI zdK%E?Usob*FV|k6I8vwX;c59B`eN;&)PCmZ@ zRbY?k6Ms4wGcN~Geoyl+bx^^f3jbus{Mpth(;F#_&gTi0xo8g0X@rXgKdIKfs*D{0 zS}!8|GSAn-H`%y)!U(N+Mj@{o=K41#6NUreQzrXzfIfgGj1OG|%R6GHXY52g@3Mf+ z?-`?x2yZsHORe(%n)&*XMT=$pFycMdb#UnFf{l)te7vf+=@8S5|65~GRzi(0RffEe zM#Q`&e9ZvyL{p#(-~WUw`k$}FWuGqmIRR({=i*K@y`yC&#Y(8_ z<>|<5zPlE8ab<$Oa(3Hx`xqecS%GA%K5L4Iex zZ&!EyP2Xe(s2T2EK(c1UUlVCh>m48(LeHSY7|F=2arpUU90QwQD57XU`=eODJ8*sr zhLW11Up~>wZf&|4c1ZZ=L4S^@u10J=}SnkZ-2od=xIqOB$l z1|iSSmWJDL8Yi078(QxoQi#LQYMZ3h-(gl3Uu$7hLn7Q^2G(G<;>CY*Co*tXf@vDs zPu=sLYnb1{x-ltygz(K0@PdzjH=O;n+}7|z!0k%eQ15$z1ZFo-o=PJ)hzd8XVSE({ zve?7zsg2ta1*>2BMSou-U1?#llb{`Z>&~XJnS=%~Zwp~zv|&Y;mk|<0y9Yd`n1-_I z8W-A%azCvBWL^!M=cj8hTq`Q3IJTT6q@DiNDYdfV4HS~9ZmOt`>2TKKB*Xtv33O{Q z&m6_ZI78V;q)$955{(bZr-4e1YVsOT(#h?eG{@xl9IO;$dZk1j=xl8Z>^T1w{ zfv`dMEm>nbhzvh^FYN^EU|L5`)ImNYpxaUy^PvPosz*w0AePQ)AR`IdlUa$ZikO6- za^!Dt)HVbdOw0IJ3KnSDe8ISp)tp!X1nb+UZ8_>s>F>-?fzpvH$$H+D=;-Hczae0E zUu`~_H264ie5#6~QW%CBGAizvi1$<_dI5~1K)-c)z%47=5P7G63{1@v{?hT)TwB?h zb@wDMDiA8!x{Rxh1@8D*PmX_TjKH_y%v0tZlEE=RUM3J&Q~q*Ky8}^<)(IuaEzcjHIh29QX|8^M?=CEdxe3>JCuPRWi ze}-6Wd3&Q|8U_oh;u^=F2(E8x}t zjOm}Eptyxf-hTir(U+6$|hL~fvXzxnQW4w{d_CMy5){lCR%8I z5~84!M!8LX!{S4?1wl)%=AOAtd>_m3ae;D1mq`(pR9c6`QNpaKEl(yQiT__PCTmax zdW+((611&Jr#h?Dy1LXmiP0=|9*pLl)mdI-I4!AW&da1Zuw1z39 zqlHzIO|hi_e;HOCG#ar})gdq{nz!j;RfZCBO3=nn%B%<9R^dcF80bYGs0@>K>iNb$ zPl!_Vc@34Yy`-6vRS67!XdJ}G>RhX+)DX_3H`5IiQN(1QSED?#$TckNAIxy%z zvp2FqTC=na1{-T$x5n5Gfl1$F3(N?m_3Z2>=jD!l!gZOaPqLZ4qPNL|SLmcW_V?h#QiVwTSVV5)sa8_!+24??};^4iXTvj;B z-(C%~q61ezrLKKK$cDZO2+3G6aK2;U(tir!wleCMkxciE4!j>gs1H;l!m+>UksAok zpFT88xr|<*Y`)KA4obpPFm)o{Wx2RwX?QwIq7%4SKf3kno8%gn?j6V6#l`}rJ~YIy z=)pa>Wx>PFivc&Q@jY}ru9NnSxU!TWc%Kwi=#p&4G$$Ne08GHg1e5T`SyzKO?NDQd z0PXIJ;>YSHagD)FU9B}l?Ow0ol zn%QOK!_#iTD#wjQ;IeNox~_GBN^#a>}c+T+Oz00e&ZHHa2x@JFrNLrc_#oX#_nR^^V|rRiw-Ao z$Q`8`qxbGV%y`e9E5iRZ3WMO$sworBo;L!Pp=`YQt@gOd=6>C~ucyuSI<3#3+LbkyCD<28~yu)idVPFx461OM5 zd1!bcpCj3A^4NrnGA8eb=bZnBVzfh#f+s()3ktR_j}5blGG8H-)*A}+FE7?TTF#u+ zAn2G#@w~~ElL*NJ+qhSzReYMw$e*{kTa|82a396+uTnUOEmT-;i~OS|;Lo-rcd}AZ ze{!($3ud0C<*ha7cV5NDoaJrdodQr3!i6~+!=K=ExtXiZp~%t~rQOD3@04evgZ=`N z>gx%i9&&7LvztM9Kv56W8rc)7A%N#gH}19dUMF zuiQIHRV%(y$i)Xug`ABp;YFX4<4%ay*H7)L_KE0}-1*Y%4w_e06k^t-Alx^UQ$c*B zk>S|WL+skUsgxvF4(G%(nAG z2s#Cj;G43pRN8<6{a3Pz{liy@kT|t$RW-EFvg(V*{y!A;uVsGZzMQw)%i-?v$<`~u z1pD_`g*X+jV~w~@noD@XDUepkhHwIv3VH$G!zi(1oJ1E)l{qTJ+ZOU6XKTGh{-yHD z|H6rO?v^rLmNsQLj%~q_U(R)2QXQP_5La!>4je@BAS%#sw-5;saI~AQL&GMEA#@(x z?b*1~dYqr=9{Ii1h^$4r7Mr(4-&ZS>Jdbe@p1)>IJ)-e-;DRvS;%l1PWwHtG^0Pje zrdA>rI@X#!K_7?Ir8?TvQ;+k?sa<`dX8pRy4bev?*cEcYyGyH&`zV%s_r`7VU{LYX zf9&COdM}S%T9cqOnEEx6>>TO1f?0$G7$EmhI+VL%G_i}rr;J73KdL0gh0%0j1N^WZ zn4x*jQ92NobAOOUgV8+V9))*z3%vZq^Iv}o65P(7)-MPEvkxx;LtZFNav3nr9nw(l zIobT^JA2`P$P)0TE8)InR7VU6R?`pTVM-8ZTi+2ANnhx!C>(zKTRD*Nry7NqB`(Sk z1yCf`|5S{*Mq+9iomiHO;fT8Js}4PSdjqL-k>4`Z8y^~6 zd*cy|lr%>Y8QI|iw*tH>wXG>P5E}0mx0KLb21Ei;J3A*X_l1_sye9U9vfcDk zVTOxx8q^sWYIj3>-T0|S;*r(WBOz>}D96CVpr*4Ypi=eiva8~61N4g(4xA{_DlmK ziIoxv`war5qa1ikzTqkXZ@{Qc1|c{S@81zyD>;OtepDzQ!JOFC+Wl5Z;RVAw-ODKb z3VJ;?(HuhC_@sZ!bf@O}m{C4+f|(4N?Iu`__T=g3eeDcV)-z9>6~;@EXsT%su-Tf6 zf~55Z1iVQWd~l#aRQj^zbUc(rqt^nYzSePESG{Y)`312A;!iHM=e=tduVu`ER0c?5 z9Ff=BCCUj18lwpnzM=LdYIo$mm3px+UY^<>eAsk~XCTNLwT(eF1;u-w5`+QoDfMhP z5X}&std!axK;4OAi`s-_Th}WE%p^aE@pPP!S_qk8c;t@C{DeUDn=M0wBP+~JdsKWb zpZnB1zSSck%>?=HXv^<~QbJM~5IWUn=iB6V@Xvc08$YXjZ9~lbHy3v!u^35j>qHB_ z3233LprE8)sY)4M`5HUdDuwhUhSElS$V@9#DAj0u=zh8WDI&jtrAzZG{{2gvM#UBC ze0Av@@9kx|tw7Yn^lR<>i-KllNh@3>CsGpBRoL;E(^Uz6jgDY!Tm|Da*7Rr-2E3;f z`Uo&q3*}}_tFTO=%3d*C9-+G!c*Y))3mMCA=w|3avIH(-w$uncc)MK4LpWe=Li$6t z-K}MF;FcWWDQz1v<1cYEwHvvoQGnrHDvp^4nNENYkSF_0f3r(*$okOi5F_jmy#`qw zY30#EkM&q72sm8{vNMB!EvR-bkaqNvg5_TxKGCzVo^e!E1SC<R%mR$8+3EKU5)su?m7f;+lzaa~)AwXm8W^Z%K^LYCJOvF(V&>k=O}x zyVb;bK~&868P7~;V3b>SA}t`Ou0m=)yh=Qg8UJ_9z-le)4Jkw8qOC7Qd!rOLb}ZV7 zlP<7?DI`KN{xKswtZPwJxXJbhad~zc9{YE|udLH2l3@18BZ#hb?nKTj;1tp1QkX#^ z6&e|B9b!V0H(%jxMg3?Pb6$B&t3xZXv*ffuCX)%EQ0QeIe|u5SinL*EGf@LoqrKj- z>;l?*B{_N5;VnS}Pvd9$)&YXyUM62w7+)i21u@$)P!IJf^^1}>$?J*Xj91FrbaVfW zy19o^Bp#gbaU1&Ln;=$KB?d@?EFat6zXVk!4VtGedZ@3ufnbbK@>d(Ez3vJOulyY% z02mBwTHD9e#)LQFU3~(szoEFE*NM!|Nz^<{PJK!R)AB%^9R2?YvNi@2P5ESW)h3;vBcxjJi`!}(W{&u0{`#Jb#+Ls$;_I|&W>(Wcar#9GT zdU`iWX%J|k(vTlJ-?C*IHE`}?5ZQv6NNxkB&DZe6NnnFbOu7OWC1tgq8B1jLaiU`7 zd5S2dItx758Z0Z?7Ijv*KF}&}WyC4=r^SG)CqSJ1jY(vdn)9?x;_RNA+n-avbmXv1 zt|~;3Lku0~(tzKqUWs}Fh9)Syj{Ts`dWWMwJQ+T@3d|P8NFu3}XHt(0SmXJMn`gkl z8@%I886Z#U{rQL~c5NmB7N1?QujyL%j7Aa^a$#g?x)cfoCcW$(Y-81Ymox%Sd=FNX z4z&&aE{)mso1m&8It(LKeB3ezzSL`MsT-=H=F9%dU}lu@XQJLI9|A3)7#zLU=#Ik- zbSFrNpeKU{kS>FUb# zuQ3KaM{Yn60ZQm0KX{zT^Li|aBs#UCTiHrAT!IgvP3|tUA|b*L1+hgEOA)7=#cFURv^Dp{fn{*E+Ob&0o-?e;|2#!Tl zo7q!K(7}`yp(PyS%k%}-;D?S)!8Ylj7a=~}i(A)~%10LICGs*?TIyu{!^fgaMiL=f zw_>-dLCP72K;GQjmQ?yfl%bsaT0R#C$8qzyDrN|w1WRp_*{!J)W&qPkzo6t!LD#4?0^qUvp}+spR#;2<$e+txce8>^K2dP}^&zIX91CcS3DpBJ zfjH-$2QrFZM73$P%{er>uf3Y!=e3FV?qdd|Ln9TRSCBQ&%ZoZ|P`%2+7+o*4KwGg| z&uF_ACg4oqn$}h*A7~VOOHT0v^j85)DgD-&_yu%lTLs^3%*EaZ%kPpZ^(}F;HlklV zf-#?LlA?%Vt-I|_0O9-cQ{b^ zAR_pbSS4xw5iK93vBYqqM^s2-+}>J6O?a`JrQwXnhZ<`HA^cHEAz_NhPW|U^Ir8k6 z!qoOL9$_KwmxyMR!|m8-h?5EU@Y@M|&~Log=QbpTO+AcA?5_y(Dpp%rL)eEqhG{G_ z9aXd5-P;=aJdJ@SqFob-#1EP1bnAi3HXTW4Bx5M-#@&#p(!jsrvzdCs~ z0Aqni6q0N&N^fdy92Fyev1LZMhYf4l0)>WBZ+^2EnvWYQEtD9HqabiVU!Z{%8va+b5@Wc#XPP z(u;GMN$df?LM|xwPKG|JE4p?#U0dPPr}c9ei=&F(&yRH6wxB|NM@C0ht*ox=m`5k8 za!(Xq-*kmiI96zZDCwOzPVkeU7BCO}nX9L{Ud$tB7D;G{!(BG-JpawJT-9<83k!EUaPp z2Q3m8rz;pRjhvZt6KmykK;s{z!%965*Ly^Juy{ek!&9|P&R3&41lde6kx z6s!7&>d!5PELCAy3V1)M|58W>?b3F1TO=9|T~M(qHf)zUJoXlCnLucfO-n68U2U&T zu2;t&Qg}QH*PIFte}`7f<+i-kOWl3uq_NHDH@Cz!^a}@Xd+jtjCecbETO!dT`;h__ zcDZIT9j)qKCZzjtV55d`h=z7Vb8j1FLnDW~AH39K>aS7 zo~L0#s{#ncTKOJ!#uNFHoS*>QThhOAlq>QxXq|a-7)ZjyZC_#ul@ic`No42`RCH0p zqc>37gUxS5l9fz-Rf0O~_rlwDg5F2~KKxAG-t(C4VbFq(L+fTaHm z;;AIem4LJCdD+3Bg);3YFk*WR%DJBIf6e^Va*zs`0HMZt{4%h(eEK5bc1ohNQT(3ri+_#D-o8Q24@zhRRK zentPEuN5*9-vd zEX1#}1nl9ZXSWevOIV>_(V%#jFg75`dC{Uh3Q_=4U)D(jBukrFL4COjwMH%O%EvTi z<5nyc7@(ZlayLSUqNmYvW+)kie;#gV=QiPv|A@};MRD#VBt}UD&7pStdQq4R*QplDD&u;1YlU^(HhGGpVGdXPIUrf$!m1a_$Woe+&ir#rp>(I?646i@GLCd%pL3$%;sP00&%ehnu7Tl zG}wi7QOoeM=nwf23Xcn(=~AfYKw^KPJ(V)B(sxPBi`I0C1( z0a$ROW|_Yh>LbGL{)=)JLSC*!bN%yw_uoN3($ztB990E!NESZ690d11kDo-F`AI`) z9#Ijo3~?{xq8cgM4&K#Y7&b8D*O82%gd8`xWXa#@Oi||6Sjv~AGDg^-6zA3uG2WCx zO|Y&m{iL=P#=7)ps=$0oys{SAGN>Rq853X#W|Ak!gSnD#cr6=im9?bXdl7RPJQnSk zA9aO(8p~L6{P&=1J*%^v^1@LxUvKkV992l~d- z2mcLgNDBRgAYm2^1djjil?36Qm%G6l45?o7*RVVAS#8gHyZSOq2U#_)uAKJQ1qSn;`#wtJ|vGsm~}#Qt{T@zC`dGTmUQ4z z5E`0o9Ab}mV<)P5m0Z))*q8i!&V84pQ-a8y_^cgOZ6q=NH^vOl5VtSi85L8(WzM%F z)Cu{$mj8&Azt^B8?TaRKw-_Fi&gd3yg8qsRRIiIkt2~ZmegL-k$Dkv!0m6Qgc~=$E1w(_UQ4B`RmBP}dNDF4Xh>jf4 zsV>e1O#oANdoQUQ6bzUL?=6@?#QF+?Ik7n$~xuEAFzCc@s-TF%jw@~!Yc%vd!Q6Z?ui(mEPb-6a)sqp828wh-S zbz5h`bU>=_y!Pd zdJ6~$U-5az!Yqd5ia0*wB@1@!qbFzv7EP{^!PO8tnWB#W^AZRC-I+@mr;6uS&~R2b zhi62{!;5rhWqnU7l#o@jv=w~Mx!k7zvl-~f*mP1N;;ssJHg8o7eibPr{8ZtPyh?IW zBa}C6A$=~JxB{%4i(v0po|M$VdTgZ|jC}~RZSDiO%D_nHj1crX+Dwm7kWC94ZH1qj ziTeM+jGf{YGs#h0ouhr+A2cI|hrURN9jFAZh@QbPuNyAm`A0z8XG=ISy7tLM?FlX5 z&O({MvSA+sJ=eVOhhTl?D2*efIMHXLGzBl-{;zx03J6j-7QE4u6LkqnQE{({M}he3r)~GR7TR>4tF6VGe|=!f;~-twGE4eCakr&>RfIPqGOP zoz}4x2f&=7Z(el&t0AMA?(Lqe2?~XI2hRM3?_Nel!j+3AO)sIFj&&O+n5czHrOR)= z3UcOT8(8~5&{vEWxitXJqhzWX`A2Yd`f8*xw1SpADb($QKg+%*_M@z_lyF{3oF<&7 zX%{Szr|21ee8b!YP|Vpsm@nhNtx^)g10Uh83 z{Vf@oHjn*Yr!2i$ZX(;eHUNZq^nS(i)eNG>Qj%0YSO&?e5^W7Q(NI0G;)A%LLAE}6~{EjbR`W3 zhv^TR`hR0*9&O+%VCk^|YnfEzF6aC8(G##y?TugSm=~>QN_9SVqnq4o6RJrim+Iea z#1Eh9_7a7j)M5-@v>4-Z`Jh3e8{JxFnYlb{VefA>7AI|<%vEl-X1UY|M++C^P0v${ z65tf|z5ZOhn<^~m;;Q0^G&hG#Mg;WxYzO-~kW2jr8HSY4Z-1A^Pw3YO$2UQXh`X|d z<{IRXOjEBMQBkd7U`jpS+>}WOio@P>!IQwfhz%WUw~@>6qE+OGR}ML=T6Dt(w^1&V zOKt^ED{Qix_f2_M|$W2AFbxnVnZgEU-K0%y_??am@SS$W0h#Mtwi94$7I7J z-ipd)o_FT)LVxfExdVM{Dq^20B``QI!Q*c)yyZrYC4(2@p7KEh+TiluDsuf3;23jT zoNZRmqjQYlGf9`^Tp6xl!^Jqn2(5jQq}&};VV-*h16xi53DzyV6KjO@1t zhXk?Y!Fv8p_y{e$Kc7@-_a1jVXoP%Ers6>ZgG*+p%xzS_w2q@(MfYnopx-+3Klu$N z>vnndZz-uWfv513uRQ5L#CmeNQRAPF&E4KLVT8>7HLo2GV>U(eK|mg1N*)kF1J?M! zC{P#s31^Vk#KbDy_P-L?lt0W^7={>_H$V6o@i{F!_^E)T-lg=4IZ=4VV}Pe&gcxRb zXxn;{OnO2Cn^(L%IyWvnOSSOESq_1`-OG(9gIDKdb%c#woQ8#>79gBuEkm zu@8lXKBNF0kEhs59O{W8)kd<&mk&@0BfoUW$OWWhd#4>TPe4l;KILx@mpM|~)}&(i zWXx?t%1O1?vGk$@K=90INLCo-IM)R_{hc#ezE~n3J;6$sgQ*cVk2C^$qI!ci-T%Gl z)YspjFew0NKq1OGC_~kBb;Zell^pq`++7A? zmq|sclH(G<>qDNI5?l5pHWV0hPT)(I#y=zUtW8-ti%~hWd}=+A49b~FR2-i}@q}#n zfmr|fJO5!SsCF%&Go)_O8CD00RUkfsqutyMlaStxjp8W?<_{d+fa`_%`yS0zW0Re} zOXp5XZ#!e{`J@UwY6 zsdLG$4VD)O1{CvKvJ#Ws)$q@kLtF1y@~9EZBu&_};q`{uKZyg1K}Msus-oHHXqh&jL8!HNaWPy=Ak~A$52h;Dgv@52;l3RjMh7N) zXl<5>oKbTOfM8%k%F6vHc_x1w!KwlqxfbRHYCc1+DXv=InLUoV@Kb|&O`#~^Lxn{a z215xY2#=z!J#;mfFRLJz-HZS@PcZ8aQPwbtAn%*pNLoK@3PW(Gt%I zr{O!0#T5Sz-MVllNkBhW`Lk55v7m0yp-gWri@3c>;d;O4Vfu*>m?_yP%k~)Sg$V|` zJ-IjDI|`%`vK{vhxtm4wCU%Uh=+T@?3B(jrA!%%v)q?Pra(bxT589`V0mPzq0pSmU ze5{yR)&A%?oI*orLG?y*-ki1mh;kL3v_Ht7;)~&N`7;v$y!kcSmq4c6hi&7wQ*^1$Ez#58J)3k@d21(IHNq=A zh5V*Ik@F#Se_|3`BMWqn{};2=+(fQ;AFR>ac+gS1CCo2maMIMqT5X^u5jsXH~be8 z{L!xG>GPz`dB%jg0N1H=9e-X&@_9bAjB{C+C`{XU--fzyL_hbyOU(>5XWUIVLB6~j z3KyvVmWw~jZjoioQprOpk9~Z(pqz{FLItBap- zt^h63@eU=edmyWm7p|qnd3(gEKyZyC7Fmn`5RwV zH$gO5-K;umSV4-c%8R!*j^ouB1;da48PwKJtI;WCO$e(K-=gzg42qv5Fx&+S^L*ff z5Md@7w#4wsZ$mqlt|9t1m@nQ2U})|j#hqh_t8+Lrbm_M^Io;|ll=x=)5=e3)565S( zdtX!y!pd~R3EP$JNk-izGW&FZh0L^8bLVhAt44*Ay6L-kvRcwxZbg@8pD=>~eC_%< zIRxa{ChDAr&CwEFx;=tSlI-*_e{SVtv8Hxs!fNM7RB5kj_@Xc+^Byf2=S0WL@wM9z zYv{mQwyrHVs%%05>IMp9(!2v-3dd9kaUI6(4ar{8SlRvCk9(ygpv2wP)Nl(q3UjHQ z9AnS?5?lHOhaj?9LuklzeLCT=E49U$?Qz zaCz{t?~EwG2}xtp@<5&QoIO*zysgEVsPht##HWLk{6j3O)AdtD&?-g<+Lb*kmrRZ@ zjrZkVjaxZX3x%ZOBQ5DMI1^Ywb;t@m*sY8fixI=I%`-an;G16~zaXHlo^GIKOYg^q zA_J6Aj4SB(BGkIFh%nVF-9>xOd@@!$mnF);Yh*+@{;vCJkLW(y_YMQ1F}u1ou)9Hx zd1tJAytD-Csgw3L)fouCHB5+hc9lb6KQodHzQ75)>MX`_?V+DL;bUb$a;q2b)5g)5 zVGxZ`LF58zP|fd2PH*kAwa?K+&p_?9M1Z=1IB2`NcaMWL@T#iRf_TC%i4h?GaDMVE;@}7iB1^bKmU?aHF}s8ZR($txTW^ndFOTB4jKu3N4eR>QHEL96LQxVq!68Sb^O3 zUdUCwG0ZgYfCzr{q_E{AEJZO#M&1h*8&Ghocy0SA+7@ig9Pw0kQZZ7kJt~V$`x)(B zy`G{{mpU^>cI=`EmH(r6H8>X@V0!h<%4nFNypi@5pK#EN$;yqg8N9&u2fcxocM|v| zbNhaeGIsN8^q5Z~EnxlpC>ZEwxZ2r-*2DNxU$D8YOIhM5_p4n zh`4f2yl!kSU3W)WXi@y`f=SR${yi#EpflO#0%g% zFHDg*KP?!;dE4LfO>&fzE7L;sCummbdEWx}j^Qv0Z~nA~D@A-5${S;ri3@oy;;{xu z3=1qtj%*#X)vV?Ya0^UFw#z=2ga&C;RbKdqYcH*hQGlw86i=F%HSS$Erc^Fb_pMvowY;LOnZN% zj7<3*2icO~Ye=UY^Lg#h5YgUSiH(Y`Lz6zJY|Qm2F-0gn`rrk@Tk3tWf>Ns>~h)xX(1O??pu%N)2ddxdF zTGUM_ziNRF^{dR5BZhrXCA_Y?HIH&;c2MqRHXEr^M6riJ3WMHzhd`WI8!_rB2Z+?s zIx_Xe7WmLCIRZw7zjOzYYC1RX^Lv-`m*OJrIIXM)A^}t04R2c{IEsH$gj{{Pmy0Q6 zn%4dyi6)X4;ec@lI|6ioZEcf6s-ItIwM~MX))GJHxcg^)AkDiZuFFg&i^1aq3~L`G zmUb4b1&tsEp**}!{|Hm))1*qS55O#J^Z%KWGYN>8Eypso&(3((&2o*|rwU2L1h0Y8 z2|u#%RkIV5lec|H{Y1ve7*VuWyWjo@zT5QldVt_%)Fas7leE^l*aJ;)x^kF zzear>xi3{CnOY79l4wK&-7?jfe+9dgf<}<)FLzVpN|Jsfmxpc!eGldL-=~yz&pFcj z$A+udWW`z1QrX91SDi_VRXD_y5SlgL4@t%{&JAsWNlA&^S&^w1TTVM!o%kCW7{x@^ z=JP!=?2fULfX6AgxN<^lbK4lcBEWTLv1lFnT<+|g`d)HCNBznYGg4yyjGKpP`-64< z7&n+b=0FKyT|Zs%@RXwy=8XlQ$3a<{t_7XtZd}8&z2+XR7WI-zwmul2^wwQ3iJB+` zt7ch^3xndcSqa#HPa)3xio~?|Tt4YbYb&fBXM0xcE52-p*@`kpm|lC+N4xtkXbngO zUB|-@eIJzN(bcPXW{yty^=t&~SQvHhlW{hhbX5x|bQ;HDDlKb^@9?;R<9PAbXJT7XMgTFly zu8n0QlqTCX_x875VLFaA@oXmysiT!mbril^&P=Obr|Y_i%<-&nWm9S|P6p}aitjBp z*D}&%J7?&rDP@PUY>0ln`u}JgG~V2ec>m(22V9b|8~3WkV8_~($OoPrAXnPvza8m=>+Q-N!3|kgn!hLuDej%x;C@8{DMPWl;{}Wwgu5on6zRe z8Ek5j&p0uPb2eL}(I!XUkq-kU(60=x3l2P;o5*lzW0~#8qX99JLS~ha*|D53Wi9Rt z6y3hj)kkx$jzDViz#~pKG~U#iA0}*uyX~zyK67T!S=4-4#AJztMa6hFM~up}49I_u zH7J*s9R(xcJ1_aVjgq<+3rHdMztlt3MAM)+?Cn+GH z9RNjVkvyj&I|4mX9wnyk#XN(sh0KAKQ77@l#=^>KEL20(4dO!7HFL|$#H^BbLh3r- zF&7!Y$DuA*yiKXoM8k*>6x_gazF4DUs6J2CW+daQ%;KdjzMd_K=c$W9rLIp`Gwxr# z3MIf;ga?0H*Zmp7ZA7l{Q~Kx1+5%)}YKf@pt?>PQMh7q1brBfan?=m{jgp3iDk7et`)#Cs=kLZc~xdsY65d}DRBpwNf%861BkJ&hU9DdrN z-iYhoh?8_zSS_KhA_7er$K*aEdMb5+$yu#~KvFH>QN0HdoFI@f%Le$4!P+?BbhM!C z;C*8;$xv}UAgPYFZrTQIV@KGM{Wt-P!;9WHIqd*8y-f=JnRw4H%8$%@`OpOWsWv=Mpy%#y@SohmELEt zpH1sCPhiyq1h1RhJ-mZTC;Mz>sVi(YB8)l!rpbXis%T3QUujc}(<4uLRgbmP{#(=k zRyN!O9<5hAN$qDo=blb8`aXNdGg$1BLqZP|x%5pX;hh{gFrZ5vB5nm%bvwi6vKFr% z!*@w^40K6Sl^vKiJe~J37n#C>U8)jP3<*{J4TBp@j;mt*;0hQq#lE-<{aHu8K(KCO z?uZc1C%S*+oZ5_Wy0vDVX7~bWoO54C@LV~hCd_HE*tTkhAHV)POlO^aTnKo2H&nKe zhV;zdhLogAs&BS6b2bkLBQ~H)cS=QEPSx-%Nr-O_>z1B8AZtSGVv@b0S%+OC`7?ql zGi-px{;zP8B1GTp1JL7BKoKC_UeASsE6{wM*OrRwrb{<;NZz<511|5RsH4V+n(D=8 zG^^a5nzI#aO1YuNL98>up7tMJ=ju1yp^j+lsOl+j{|sJ(eD|)cEG0}*an2E>LF1wV z0&@rCES%cXnJFHx0_Iuf!)dFt)gUPNyFV#6+0s6k{l>|?iWnBZ$FMN&@^ zCzgD|wx=~dx=OW^#2HlNAV@JLrNHM*m8i##a36A=GwSLE3Lg4^0slUP#~ZKJSy84- z>*xRqw$)%*CKyjqDx^!!Stw6`SSO+`244hZ!&`r(E8Qa;Rn& zcxHpU6SlI|`pX!mhv}tPqL0=T;G8a}j#0@_&jU?3tW*l~m=anc9TQ%rw>8R1%umEJ zu`M3;nHMs5^Q;;k{^+g}-n19+Dwe~2k1)IcuF{MwAd8y9k|7Qieq z*Oeq=kX)7CiYm50QarbjRG6%>uI!1A_n|e(R{Zuw(bUf{`I1%jZ(hxMGRBV8W#sC+ z934>B#d_MMp=viq8pZd`{+wV*<}LJt*wD+jAW{IRbJ1o{Lh9o5yig%m+7}?Q{B&hG z-_e3pO17~w7>4>siMXcc2ai3;IeSzwt$Y}ytm?2=<=HyG*PCAZS!8RvIR$9bFVos4 z1;Y+sBZj_?h-aV6vVV&Q1=W-(_YYoJ3M>R;EmR6V?ai~!B5ot5&x?;sPf_h_&eQKLDS$t=Hn%Uy z4qo?$LFMlBekA`G{Y#chG`ef=czm>NE5Jnn8$Nr_7~__Bc~|MceAc8+jRA%0g|6;E z(kiKjH(t!T06##$zlRnCrbwW5D`e*c#8WNgz?KIN=-?wpmr0GW-!YGji~$Jg`sL_i zXf@~sHOdQ}&#xH6x{Sf4o1rc95FaRO)csw6DnLMFGKv@0DUN(p+uAsp9I4zbD3OQ` zJ9ffb=s_Xg_)nhXHapzflT`wCQBN8fkRCf0wWV~Yfc_k&#`Uxrs~2+B;qZBjD>pcs zdBs$GTDxfJtMg&B$cW0IA!8t571?48bSHRu(PFIiuqBe0hhJxjPDm1pAJH8K$1J( za<#V9fer%?ts_8^Ll*F>Ss-Ir2SXy5%}BmApK?%1UO($)r`sqPL#}kqoi?(!vnZ-y z@Ga~RRlDs;0*r*Crv2}>>!MmjqEomXL;t?CTC*pA2>K^Gsk~H=dsiIEzCod?{0y=pS8V?bE&{%Kn{LBg5C35xV7>;0b$u~|fb=qguN)vJU6on;UAtY62!vW^jD|JWDHBa|ebW4I z0ucWR>A4-BIL+hjL_*rPE?_n_zx21pD2)DMin=tfxIk87D2IEtuo#12PJg-K-$)B! zIxt~qG7VHy11(h+^IGr3n^*G4pm+TvP|c)pj)oM)un>b_Z}MFzbNHcc^a=Eo4QxNn z?jP3qUG``L4gHd;KB6)LIv)n7@B}8d@y(n@;;|uCWD!PPWiLG-@5f|u$YLbAAke_P zogu{1Tto?T@J0Pu35|Z#fEjErt25%@$)s|2K&@)LYCmPiuimMbZG!*R{YLo?)u0#Q zj#tT5Rd1Nisx}jQPJ?~?70^wu2(|1ODNAY#o7N=7&OD(oNXENX)b=zc&#A(sATGh%=Djb~}xAx)+>XxxBh|Bgyky>AJaPu+> zk;sYC8e3;Lq6m@Z@a2QD$cZ_c9$UDZhn^*ViyASj+F%W$e?=2isNm7#MouAn5^R{I z4-T)Xun}_AI5bCO4|pZEA)X_J^GGasYRAv2wcfZQB;|tve1YmC`7SXr2b(C_j@0cn z5*)Wg8zK~fZK_z89e{qn%lf!Hvgn7gz}jtmk4E6^8vic0ib?vj%%2k4CoQi50A8^X zS+@6OATY$jhymf#sX#&yINA@3q##x&Sp6=Hr1>?-0*5E}e~JrqBnzc2==J4gox3M+Fq z9Zxp(EEAhO$^4VKrHhG~GW}(fMN$w2d~A(rG!aYLjL0B;MA{RrEtkc((>ErMZ0Qzy zE9Xs$M{gHO{hi$jG~kOUK)6$1Nw_uQ6u9~1$D=I&u0WRuM38l!HBkaIXFxH~-8o;a zd5CP`=}BL0lAydX1EU9?xtdc~mUe7rKlJYQ1VI-m;-CuJG?%`Jc$ACl6Mfbqv?o#M zsRp;tqEjbk9rw90aa$d=?o!Kap{4GvgKj7a`?CHcqqM>QSO}$PMI?Y(Shd2j;=)9U z4kJ{xrd!A4DMX?d{Vk{<<}ckA8)gx^2Rq}EjBT#RQ*Oq~|5l%nxFp(6Z)im!=9IQ}`XT%mi-mOyjqfF5Q5jt-Ld?7kWvZE(=MM_H8Rkm z$jpz_)_7;Ai#`wnvBq}$`bM8?^Z{N zp1kRsuI-H3T1?oTqX}^1-9=aF_HWP3F!b=s*Uez z)`~Qs=POJJd{5_XlqBZv#UPL7l1N?X9Unk0_7`rWhrxSRN^zaJUm-BW0=0JR;*zxISDhUCNHI-MoD@WW$k2o z#W%K!ImOxa08iB~qExYGbY5Tuz|Gq(-qMebRm`mHVMgztus&h6Tq3M?m5WwQ-(f8F9bX})B(JcA*eRra|LWO46 zoBL@Ucb$tEb5CFZ+|PdIH%0>A4Sa-}Gn!qd3{&35D$H?d!-xf*arbHQ26@!d=RzO% zUlzB`|9`YOsDbj}2?i@-8}Hh8K|PNUaA&wh%9jz~Q1mq~v|IPOgBSGA<#d+->PC}( z#c}C2x0ukr$0a|=kwgf~#MXQgsoinC`(Xr4DV!?#;bRoqKD){YcpC>|##e&XA2~JS zTuc=@6~2;Hifes9YsRe?NSnpVOP^bKkCGe%nULJMoxB_NEP)H_oPg+VM^0z%h18p2 zT+o!D#CAk%l2On|ModW1J9P63j6KPB$=s#t5(wBtG3^cy|A>TZAeXXMxk9Z>FBU6r zAwS=RzF4j>T4Jix^JReHUE?{h>}(F#FB6q^NXC(-_qE5<&1-i_R8(V^KF>Ng;Rn?h z0AMMur_8ANjw&KQxA8yQ?jU8SrD4;X*H8d}n^7!Z@%C1jhI^0yF+X8J*rKaWqeXQI zX|b zrJ;~tPMqU)M@TqbsQZOI<~v(dU-h+UDH3k@=ednKAeC8EMMb7*t<)p z5=$a_<$!@1geuWOh)r3@t$G`OoYjoZG7s$-7EFchA_QD?$;|Y3OI^b62O~z6W*#)O z9J$uN{2_u%U+s{t6*{3tC{J`ZKGYt$H~b)6Yu<0E|5T`$jQ1IM0m0}VZz{X9&y{41 z-x>#=#hA3C{`%|{L(q=94TDs@Rau*=v=rShakFr_HQ!lrta?v4u$rXR3E?;NlGJvU%gem>;YS@r zv6-2qArAAHuTn(C%?1!zw5Biz4YZ{4AeAJ`tZ$pSNVcer9TMyPK9pA$iTmOmfLRF863 zseahOR8`hsp5XuJ>>*zKqF?G<(uGBsrFAyBZe^t%S<@>-^*cHm)!{5S= zK{oPB{4U~KlD?RfM9GhU;fqId=HTUIYOb@+i+$4|)b7hnSox3~r=$+=O~Q+&b7VNRnZ~hz3*kgX zL{4Lp%2|9vVHMe;jBmaj;V4>j985e@YwLD1=c~7~EMdVa<}nL0#WI5xfp0H!WAwwT ze3$uV^&jE|mB0w=G&qb9=~InxVTGMGIm`?PaZP6U~bqGrL(U zp5Qag7BeaTsO306^S!*%8zMm{G}M9>#*O#4zgf^Ip2uiMCTVa z&z(5$4!La}xVf1m^Hz9~dMw|uX6qZcvfXmGLa&Mi9a$WQJPDDIay{MH6lyM3#Ds!_ zZlRH}G%Knc#OVTJYhX$#2NvGJ4OBiQ&~1aR#~O7#u-xmw#!T5{PW`2><1V)_w}I~9 z>N>1gp;edFF<^_Y#pi1PE`3GXDyY*sboL!i>ImTeQ7*iQ3uys$TTqt=#$W9pAw?(W zvsuKlQ=8?%FmJqyzo@r*4-l;jWh9Y2UTcbCg=dFexKi{>9Q?@~2pFYsqn$#Vr57VI zA4Z>ycg^e(UP8Fjvd}YHlCQM4z{*Q(hco(R==1Aq&tc-^ng4MEhLpc`R)TyhGIUpd z=?|eajrDo|HQ6HJq(xgH;>~aO*26b1Bxuw{$M4=uavsquW48-u9{LcotbajSiseQ+ z^K&VWm&C1hrBZqU@hWpt!AL8A;=zKelQec}A#^=E>MA~yQwCxya#}XzKEvzveZj^kCkalrj2?KclmgQ;xCeK)x91vl?zx@m`ov;d zA2yn=^oJH+)j@E2>F~qkceZUh);8iMDCRTVIexQ+BD%zz)&Ogn68AIkkX@TMWzz`~ zKnu{T@dcl)Ts=9X_dVU$^J;_6)wqOJSy1$!39G=QT6R1jrH+-Xrj3cY4S z9vjzQEw%=~;zI&yNpho0nV)c$lR%3vM$buRq~HU3LrVs#!pba|HBh@peIRqvGr7g( z`~XY~@k|QvqnbQPv7ZR@8reV1K9d+{7OB*>VUjcnPwU^5RHOq7; z*oV&C^r9pmYr^t+eoF>)P~yhtXcPzsA@{{}aww zj@jH(e46}%ZQcVwBr6ik>qpyDx`b5YgZj29f4jh1FDf2Y8Y~&!e)F?gw$u8&*YCGfLZMlV_8NI;1ulPN{syjlcdz@r(`DJT zCTSyDcz9BI1c2&Jp(8HfokMX%bB(EHp0gHVR&nqM*h?G%u1braj&e)HTY}|A#a&z# zLz?6>wrsNZsCMsCd2|KI)gwB?=O3i2UO^MDMT6iro-+MaAx(>57Pq=A-3RHI6}DAX zDf}($1)PSz&BKp(%KWRJw+|5<`3!~zZBQITpae}KT|Bxg*PL#?@#Hb#^Xi(gPC?a`7-$O6Z3|aNK##n3Ae%+4o{I=z_~kUn{s{J zAn@U2gcEtr9(6k)e1psHUHgatM$Jk_vB!~Ut5TRZwUL$0=Lj0Om$4{^G&`%-+RJ_6 z2Ad+(Bt_6*dmG1B*l5#RA=8<|rIq=KO0kyb_vb(a1U(gP(&gVb;{uP{yAZ@W5^eS(Epp_Vo3;8NtrOeC1 zx9a&naO}Lb?^KmH=i&wVafy~7CnL$A!7WG@En%HRPuwWmaYEM&vuWMNlkx^m!~%8U zcv`DVi@)aM=Z~uoplYQ#*+JlNgY186h8M4dMmDZ8ignQSBOl;|N`|j()BT%xnubH9 z*rQx$IFnyp5QL>bO&Xto#+DJ1oXN+`O^b~Ur(MIlMFRHb88d=hr3xsCOYKODpP|Y( z(ehFd+qc3h&og1|Q|z1U|F7>_eO)^#y4H610Jc!WM0k##f7M?s476z&jy__1rE5C6 z)QL(wWyt<|Reyy+vS_j+<#PU1d7~5T&5+ug?wo-L`Ud9ZomzG=TwX~SOsCLMFtRDE z#xTI_IXT>322gDJd+e>e3_NG~ySP|^|wVGsy!f$n=oWtIM2=7LEqqgS0wC~jN z8Ds=ts;+;bW~~`;c0zigAdbS z2npO^e2r8-7}BRzxOaP;DgGZ`yD35`Vqrj7E3)Yg{?c5&7YL&CME*#g zlNbP_tJRj+hzv5nX-O92cEbWci#r1JtY(~k!jD{+)?{6%dT7ZNt}~(MS40l|PqXUs zvsmPhQbRXKyIXKycxynpcU1)%+S~ufC(Mbs+WKeNd~9+6dY2z7#{hL?5xNUh?Ko^K zXdN&r-&^$rFwUq04yKzyyVyqGQ1a9KW;q?25z*+lZFzN0&t3b@^*D_i3t32N%e)Jp z){o+p!>He(UUWeU81sP(+uI?Z%xZPsVaT?Px4;@N97?Ec!2X=RRoP~r5AyF9ueYc8 z8xZ^|@Pf+EO3nyb2iyhFN7p2^%w$|?r+8YQSg(rYU~MO(ucx~=c!Rm$Hw<{@7ulzRp;1MKV zo{?DcZY<_!SArrxtG)~gFblPEA!33HG%TrY-eIvC!qE#Ywcf#a17gv_zGhI2+2 z6prrPi|i)sZ=hT#VGcsntb*Q#no}>>Tr^_^Rsk&CtVOUHz5YjX%{FKVCgKENtVbkthbRnB0c+PdX9Z{?o*-3TJ35*8kAJ zaI*3N4X#QHW#jV8%ZrqfDMpk*4Z@7|&x&nAMPxBZ>s=ECU~?t;EsA7_(ifrQohthl zn;pGB@BqOKD|q=j!(+;qOKt2*dc^9`6&BR(>&AIgSm&e2Er0#`uX>1C`WDHW)rh1W z{lR`Rb#4#z?{E*;pG>{JX(yy0rO_q|LzPnabT$uM^2G7An@9vxe+PCa>_Kd@eB6WL zCBaP@Jyi3A`6B?})kAj+H~cu!saoR3bF+gE@=i|i)+2K?HnhAO!=6QdXWf(IIP#%` za0_<4yCTWrxN`yr$`t$?eeQoN$54I@L@cPUD-ecUj4ckUdLnUmx2d2NaZv%-sYO-C zCv}v`L+r`s82_T&vHlJKtrnQdf#Q2IVIn|}af9!Vpt)iFK{$m!9F>yldYjBqG#W8w=(B*#tR6X1DwfR*F=nf0xO8xC5V(8#psh9o7BG>>vZ!dh_hE-ikM1-5?gtOVHyi)4LYIYA#>pvF?afBu(lh{nl!AhhN zzFg0RnzK}%tB=%^u+rgZ_J)`Fh!U9H$94?IHQSX1bGw(HgKr+bnc^qYzXu(gvY59Z ztrkIvgU&JVyThp;?t-vp#9_`(;rsl5vyOrbKfoEo)E{Tr6}Gpi zO%rc~kCr#0?cX%?>q2`=EkP9I9x74cG$q3CaMmsGR*=gzW!Ea6Xv%n794i zV)OK*>9VTid$EogDxI^{rhBYI!MR_f2oSr5`SNv!<~ZaowJ-~&&^W~MO5hGZk}j&zTxB#vC&c&KS1lWen(V%P5`zb}{tCOOAgdAa$c<$x5# z?19&z7Q5n)_f``z2g0yBzm;XI03Z|CrcUnJlp11C-;=a!Ub1Xp9kf(zy|N_4VVd-l zz@6t{89(f+M5UVuTZC~^rXqMok7Ya4Dnq{55`?7FKSa{fk_WUN5I%m`e97Lb9$MZX z6<#x5cB@S}qtB@2I2k@kb*gDM#tDyMI-Nb(zW(2oB%5Nk~4P-mZ91PAC?kF6N1CCSG`gD5$iC83H~?XVlCMsL7;5UiGwpPMx1BMhAVB=DR@tK8$2MTO3%% z^R7le&Pw?j?6ry0p#TqlQ`{p$soY$uCl18Ga%t!=grs0aHmP7!i`IzQu9rz2vI9{OD_%nmX1bKFS_ zF!eGeT6J4L5|X1D6m^a|Yx&Y!i!#!44jkxN{wo-=c)KBcZ>=))yliR42U~-$Pc5{U zXGNKpR$97{(F<47cSEin?<`1Jdr@HnWT(FZddZ$zC(Ty=67b&!W@2r(=2y|J6)w^J zSe(mOO|lE97%}y5jUeQeKMyLhQf`>5O?Ru`rq?g;{x*6U@mJhpJrN^F^rEz~RTTHk z1HiaF82`)D;bg`hOEq|KgpUK4us_&eEMcR6MF~3#)aBDun&}?fK|R zF&%$LE~axA#CLP(m#vt`)5gp}M<0#8m7a^Ph;L!}S#o$u7kOQ-q~rae$mXGJmC|G= zU$%GXXC+ej{MfdO4T7=vCC&yd`}Gi`HFk2 z2`_*q*9fB6SSLt=fToQY#YsarSX3Igg6KYx=rmo}H3RL5$vC}OZ^PTWa?xsAdwxoX z_a4hD%Lm3Eg${V*NWfk!K&_k!SqK@HiW^^UL2z=~oRAfm4)o~D)v)%g`B$VY`XfJI ztcRo?2wMjad=R^zTFTbp*C|aN2+{&@@!7O$_M#i6=^>BF;rW$MJBxganb0T z9L5kkVGot6=qCz~;sDBVx_d#HLQ=B_9WNJ86AOvKL&60O(xo2Klo@?NV{hv1ca>DI zN#`yEjYKZdHk(w|)k8i6+aa(*JF(YTI(JzAhh+8fiGeYL8qC2JJ4puV;bBpkXFh;F zKF{=f*+YidZOIR2{&6QZqaD`hBr6@=ym5O_vf6PMYXTbAZdv4Ea^Hz~9P4_rqFPIL zKd4m46(;rYu)2^nb|N@1t|Iij91d2`D{~@%f=&-l#HkcGQF*~6%4u?uX?dnZ9~I+? z{$Jj$ALsyXNN(rwI3JV)QVH)y?o}`YkJ0cycA0NzH?lp|TO-u~}51CMgp%4=^ZJ#iFG@U;FpH zQaO3?g18^^^H)}BV8*^h5&(x+ue0VBXw_!NJY*N8Rd|Z&-3(z=K2xTbe~}varmtU@ zFA9ud#kSb~?{>W-Y}Y(FOB3uhK?&DTct?7ayUEPB9e&sO_hZSAT1E)7qyrGc5RH zCd?;d(L>}KhE7Iv;VToDD-x|2w^T2sKw|w4Fo=pCgooF-pny!KTvI@Ra}8uh6|XIJ z*Bt_NjnGlRz%MJ}v8smwtYVu=D(xB{J+xS)TM;PxuV9gP{H&d{!+Ck4s^B97PW1@t z6It`vR?gbaZ9`MVe(fPrQxI`lfXO@ymng8uqA>qcn)h^2g{qTEj`4^q_#2MU)~+$W znapKCuvJS@=fuy|9a`Aai;^&+s>JR|=g5{rcPd}ZKd zM~&k-W#zh&8WfO4u8*(4U7zQ&h-WdS!;>UXXW1=?7A8KLrIG*2%0cZYJ;ffgVWZi7 z7|HjpHu54dEUCQdg@|O>P{_5bzi*z6q%L30?4=C;Fh4-}eYeAfOKtUadc)5fPIC^@}T83TS3_KDa%lzYMZX z5))rx?HghR z1Cvu6o1WjHGNk(?AKU{yb2QqYhj)^En z1IG!@k0RgNCUIRw$N)O;`3$aK?>)y32USgQTq#M%g`fm6k<#XvkYUPa=5zyKF=lq@ z^_Dh$e2!Z*0k_@^PQ%??R;>Zj@ud&q(X^Wr4=uK z=fP$GCDAP3m7nZlEUP;q|JlCw`vKz-dx|{~uc7Juk0SV6HY-=5{P#0~l*N9Kyb&38 z2aF4xdqd=t-xdxQi>4CWz|X#)fDfO)h3qp<{WAJdZHm+Owz-7wUUdCo#@1iaFNGU) zs!Vm$5MKSKg7tD8uQ6=kALB9+Pk+^`9sIz$q!OG3tl&%!6t+dMj|{Z1%GL(~T#MB< z+17_}b2!Wak}UY9^RZ3Kn6sm2hLm`wp%8pNS9=+$X2Tn&J3EIj#(EE!V7^HWfjA^O zMT~!_q1!aeX}0+?Az8l{J&Ho1)Gm>`OKqR2qvf^N?#SV#)`iMVtL;4^y$Rq?;7<%z zWiWf9oCgVl%btz6p;)A>$8C+mTRDKm@DbB;%8QHKL|U(09-wTk;S^l_UFYli5D|YR=Hf}7I{FdUgAPAPOboFG&=10 z@ip+$u8>oqtse+4tkZz9lJi6+cCiH(#M>~P%ic1=T}#ZBautaT5} zK&`5*4Ro{G`;M5@r9b2F&xYvW+r!|)6GymrFHL+PWxBplnJHiO)2os!eg`D>$N)em zDKw%`Ca)~k6-0d&bJ3ZtvrM7Jn_z=$m4%mLyyLq4I>&;XN2k!)*KYNd;;C!b;>b@1 zu!$tjgvJX%a4ehDP0A*9)4SK8xn6YWVkukeb{R;&fQ|S`?|hX_wOMe~aEJ z&{)gB8PsF+CAn_IWZE@i;zcz>MMPp@VD*YqpJe6V$AyT~cFpCTlY(=PnIWl z3L|NcORK1B)pR){g^zJBTV;RzqUz6DhIbS(uW$9|fSN6oQ&<7u30{5n8d0}wy8gcJ z5HOK2E;%|IM`?-AxUT0D!+BeEGpdE2BZ+!uKS;P<3Q##knr9=ck%w8@;~uItHYq=K z@~(4_)yeMmSkFiAo1hv>9$QN+w=^2X7ddTkp*{~|7MILcK51R_Fb<#);h|+yXW)gh~Lz)w^#aSo#J(&!iIqk$5FnyAhz+w$h;&`ywK?cFE&sOToXMPJuWwHtR@| zlG}y^fD1e>n_|&s*@^ba*Js)&g_x(wm~}1bK(VD^l=nN;>s4VV@>a$zl~pG~R=;H4 zjXSsi0}~ltnN=sEh`Qb5e3|Njv)VjL5CIN;7{_FPFyHK{6y?LkE@*%ZOV6>XD=uky z2JVAX%{pm^L2oD|<}wG<rqoK;gwj=hj5>$?t6`HS?A&9i&)1ibGyN98Sonbb&lZLr3BFNXnKPpsD z2|nCD@319u{}wDuD?i)HUJ+Dh%{c8m=P6#%WZxwHg>Dq$2uMTtAiatz2(nb&qpV_k zPkUE9Y}et%ct~lxAe8onA3XwKT8fib+cW)Z3z18vz#nfufr8@uRdue(^>ISGN;UW5?Mu}Kh z13JbB0-eeRy(|D6B$xmlgTRQK6tYf}@Odp|Fl?|y)eMw-!S62DbWA(GY%* z0>%HWOaKwtxYOK_5j=I0U>tYXx@ONvctZ*NmM5tmPi~Bo7?Z7uPw+$3rf#ao_sC9$ zBc3y1>UThe8|WkIB_|*qe8xcc!eyQ|pvF!rqQ&{P15PT&0gO-Q-OO}_@DNpHY*}%E z1!GLLEK74}?4u&JTIgqHBcq~?@%N>V8rMOAtFm6KeCwmjUtgIa!aqQZN*5^C87U zDbU>R*6!;e$AP~>?C@$bv4H@(t{ey9V*#q>>Dt0@Tnsu--R#yFA11(9YsQUMJ31@JAq<9VH5B_INJudvPJI!;MsY1_O9dsJhKSLzw~5f#B2mzk{e5MXY;c^(hTiSnv_W0 zlCfE6S<`)e;a(V2GjDT{Yq5;|s4I{h)Uyog^`$e1yt9|Ozkvj?SY5^M$$^JhWVQS? zrrz;H+|DMPZ~EF>HY9IL%WN z-V7^*t957cpK*LOj;xzyTpSMNk|sdq;*|~Mm!OB*P-rP~+XIv34D7M^_KvNIaM!qF zgB1l{KbqbruXYuEfxv@j7eTbRj%%QSUt7dZjGhS=7&TCblO9dL*nCi7Z=;+NNh_ z71I(hOcuH-%gfxR`w21nZJECw!W~&t3%eXEXM0;oTfwmEJssn&k?tcAt*#F(@B3oR zUtxtb<-$i9+!{K-wRN`S?I%X|8z|?XTYVG)J>ye$cnlmMzIP1Q?Hs_qc>+#UM!6gp zI%Gm=yx#SYN19+jKr2iWe8R2u&*8A8BFt)!IsbQm&KYWrA3dh_cbU&IBpRvWUUSP) zMz#O?g=A|}PHJ{m;KQRq!?P00)3wga>eUKp`)~KxNFWG=T$CrLiN)DVl-^(PR;d%` zTPSP_b#%~{iF=Gi`>&A->$&9v=w2=dRUnfq0HNgS&LR#7;;z<1C-2wNV{mxUB4H5D zGNFlMW*$n@2~cWdhy+TI%b`C0YTX8;x9SZPFAoE84LPCz*={iIP{mFpZN|1>xyn?l z=t?J*11`!gQk`xjAAH4~cBFNqWGh8R-<*EIO)O^`R1X=2rs{s3tqI!Wu&bOc*D)6d zX~JXlcRGMOU#7oLuXkn|-`fj>&R-V*{b!UXE|0hRns&sdd#rqJzR>%5|8??Hu7I-t z$FI)jV(I!#|Iq*qa0YlY3L?|lAF#CirlmW&=+XdNzt zusD^2SwiFnQ-21daaCDiLa!=?=%CghEJ%n4dal3U zPxc|JHn04W=@~DLKJ0HGT+kyE!jzxB@jR$tOWsL$F~(?!3r596IJ6-^GmmozYB*7s z$T7Zc>t}I9Zf4ORAREy_Qg{O7C5rM+G)}6C8sgnrSRBGXw5J_nGJEUnn}CpCt-HzZ zMwcG50%8Tlf!TP3!FhyT9)AC$F(#y%sx#{emrK0U3U6!&6J12Il~H5VH6xIPQ1?7d zi-pjq6TXt6nXWtQ(JrKBj4`UyIerkt5RrJ1!ES$JRzU(Jh(UOH~F35H-CyTwXq&VTyRl(;*UNmC8Es#2XGYDw9 zFg#+M?lDd-h7R?k^emF{3*6J#4G*^>XaCvGC}uF-%28}=7HY`8n0fLP<&2kJOUya8 z1gMmmCTK$AJgC#cx`SyeMrICku6;q5u!&=Zg=?--jqLaDfP8 zl2b{+@bY;(zCmc4HK!35nGW+4rdXO3-mj3VPSU=5=0OsUlos{Z+*PX}q+E#S72!c> zU`TJchOM(>Sl9OsWg^g-r+KllGZ6b;t#`4L7nM^ofEkz9)KK*n^~G8owkR+%-s<|# zppY+!lq)AA1I;(Mvi#gY{5iJx-gS_Ez#rZC{HYFd2@js<+_u#A34;zve5@$YkFT~?vwkxj@>a&f90in*{aZ=86`5%dYMshI~G1j1Mn1fnkPJ>cZ z1PQeQOV(X|klw!gLyWuC&9fDakX2^}I{!gbsCgSz=0$FN5HO6h8(bxG7Di-ty-LW4kZZ0# zrJ6DG)rzw|n&apzD(Ej2pKQhW0_@>Ewc3B2$Qe(?zD%r9!av!wvk`xqG_1Q`Lj^1F z$nhaJ`$KUao)P>_<5l_f8u55npnnnROHC`>bX2}Wd}vnQi_ot|wT@`Fs1bU2JV zDNePHE&;di;>cH3cNoQ7l}rF_h4OG4(@0^sODW*C+u_j2KCK zryBnLw{@g2p>^4R#pt+1XszX8BnWBT-}Px8q->OI6xlY?U(*I_R#v}@lAJp z+bYoff&Nsl4+glPz`-bl>CA%#P;3 zQGr(_I^*jE+R%n%`4xC*Q3ciT7q_fAw*;f*xwPL5>y|h1hP@1;F`r&n6BzKDF^;xBqs>VYpwjV6dsK;3 zj;Um2bDj~p0Y-}hv5s|RO#Dxa-N0lwhP;Gv_apE$xabY5VjTH^f9Tuodg#tJoyk$Z z6|(>fYN+uAqZ+S6iQQ))I4>#9-tOV!Z`jh-EI|Fy8_8aI*>XG^ad*T$HSvbpaVHep zJyJ#W;B?)#OLwFicE**IfWFvol%-pnLTi>VH3i@0)9Vvt0ey?GP_TK`ApX?pQlxt~ zDm)Wg8bGayK(Ke1|8Mi=Q+WePdKD8n2E@Az-}<2mgVf3qc7UO_8$x*7pO$2h=dL%s zk16ZKhiNFOJvVYJZrFwAjMgac+L_g0!n~!t$^^y>Af?blH#+WX7!?!7Ya|DW;yIIE zK?bQ1f-u}sR>Ro&!%R8p+WD7BCGXmODwavWfBK*RA_Jvl zHV#I#Aj1cy&JL_!X!hHj4BnWO&7ISx;h~xI=&cBO{7eXWLpygcs$2$hJfjlI#Y;mC zd1Mi7pK38xKwlUzJcc)v#ax8N1#^*a$NEy$Zaf_01_eU&^|mRv9|l zP)s{!cqP^YR<~bA?LU;atT))Q9?Cuz#?J&D-ndv2LAz*0Y)t8#te_qX5_(~Lm9{$z zE3U)h&vB4Jrq-_4%-`Q}yiFm52xu%)OmN*DXGaEYYKO}_)Fde$J>NSlox(t8Ju5Z( z3Z{jKDE0CqUr2>qru+$QboXD@o`&Bi0}dTtpm|g=A|~K{V4UFYZS$1C()twM`(4;( zQkpWJ%V1^IR1$N6k(})Rnf$%cfFwIuUNtKMklr2nqtvNU7hgfiO^_-aBg?!Cu_sXj z-<_^7Wcvxd;<7@!JRp@!v}L`*D&xDb5D4`ZV=jq5jEF+Mcg#iL?e#^b9&7sA0I~<9_}cW0*^v3M38V3<6V_G_ z-U)py9fAb6Pu*C+)|{d9LlJ3mHLTvC$Gu?xrLTNUw;Dpld*3!hy}9P=kbpXrq5XSX zMu{3Y`!w`oHts9bP!wi9G03}I=>V=`LapexBctE4 zxHVV0^G$-;_gdp!ia4%!P%)Wcay>osgvcNbH6U0E=LzORf}K51=7=Un)yZKBk#9xM z@2LS?jv85XAOrRyhL}Q?Vf-D!lRqGoiQjnBWi$-LNLo=Fn>-x|^GqJ)2*h|a(qu12 z^xLSe#3bdmzoU8hD^d5S0El49FK24I2=o7J`WreV-=t9mw}Th$GK33FZr)621ZpfR zyL;0OQ&>SBZ@A!1IXsZ?24nvspSu$*4&LV}+k>L6d`FUU);^n;1cpZCsHaJoqRqM4 zAncGpD_)Z#x=oz;Bl>i#dxcCYy?5PJ23qd3#qD*O`kt!NH>?J-Vv$iuwEy1M$*dm~ z`aqDaxW6L-tMH{C|8ITH04ft^@(to0qQJnUgtxueGcgsL>!dj(F6z!oB5d0|gRAH- zE^_5O7)VV69wqX;K00qmKpaQv%PWzRA6ex;Sv2oR0$+?k{rO1xZof{t%MmO7RI~Vz zfyB~M*2|?EJ3%g0q@1{u$W()+)^sGbc=xs`QcQ7LZuo$@nC6BR^Jg!^a1LReM&FA zx94kEa^ZliwcsRmrfbalcOwng$NHcIvYnAm5!XDt7sJgZID&rU=;M3MogYY~=Oc+a z;HsPF+^2p_yQ$zS-$9?as8yn=Kc5-f>w|x5Y)lrlFCDhEasz(IHtsfapi%QSw`>E< zYQRL@K$Fe=|9@qkD{4ptwu`XE>4P4P)hIp(N>2lmGsIB!!b|1!}g9i0?$3)c5A-KFy+Gd7&?5NfqTf~%R1}xI zTg$ps?XK;2mp|$3#VAg%CTQDV4DSA6D_ZB3g7j{9ndqyNLi&hP7!18(vh8r(D7 z-N!_04Fql+9v5|MA8jEIUqlkS;RYJT8!CTWo?9>UvXSB+VHr(xt=ECB1n7&del?_6 zaJ(`49c?C@7z6dy8x7IkbT}xg_B%K?0FWQ?*I)$a=&!mg`KU_g&wE=3a z$dhK+Bi4X0{7KxLScaZ){)(Mp`mod8gk!0i#%4=z07$P~J7^nS+nG3&Ecb56b7tox0=ltZ(47NdO3gZJmr?G?meznojsf*% z0)NxbVF4*t!E^EX~CnIrupNWJPn zW1?m!4>@OKu;3pSpzLr$}xG0iRVqvW@s~94;G$M0^RI#5C4lafam%hlM z=UV(_LKlWGP`U*br0a(GZ3r(?YtY?~s?!OGQ!nXhWxeh!{~b|D;t#5obyu!8%!U<( zy-gyda29Y7mLEy=&n925xJjd#W2nWW(dU>Ot>jWv+73+~6Y~Y6K7Rna4;&zx#o|et zmPr@1qpr_+g=;dKAYxLZwk+)e9sNb;{{_!O`g@h+B;e@3cAUGWdK@hw5CXki%kz(S zrpFJeuJ$*G=MY2;3t>T>Irvo>tUD5wr%MDu5aExbVJ;EhNAJ80h#j_G$(i-5!BtEuMjYNK7Xgd@7m;wOa+&c)1CCeioY^U=PZ)gtzbL8V) zSKkIhduR0lvw#$Pn*CBh18>hw`R!S3> zkJXF@#^@SpZXG2=;qaxtDdc($LUFI=5}aoMuUCR?j#BCtJ0%CfXuXrGaD&sLZq=6b zK%kSR$_0%Qv_j9D&a`5imw`(!Ea@(cSKTIjRDfQ9nUv*q8;07BWu-)9nEGFImq>wO zt%`Op^{btj!CvA&265VRY)(JA4O`oGFv0m+;1^mibtS2dd+47P3hAYvLgunG<-Y{C z$^{kMYo)1aysV%5P?&1?m-4-1zdZdqpHk**+0uKQ;qAE)JWzpY^JN0Fx2h&%6>T%9 zL6jir0C~qq?}$l>_Pos~w3CDo%mRg3l~1+G`t$DLOH5zIvBuF0W-Hm_(LMr4_fn_% z6Rt%i1@PxlhB5Ru_+`;jsi3yUm&Ur-m@JEHO=MJ(@00#c%bVlb)qU)~6Q+(L$J5)u z^|Yo^wC$|6mFp4-lhV;mnx%8hW1KPq$ZEwYp~z4SfNmBz04MJip0IOG{0rkW4gf%5 zq#4c=uwO7bOi)SZQ4aze(&(2@wj!*sxmRC^z~SJ!Yxw?VHo%`A)1Fv&B}0b{R?+?Z z?r9qjrRTB5`KFQQiJF*Y)%W{>>qif0PLhw7(ThKP)@VMRLwt$IAaC+)mM$XaXT>ky zqu`1|ki;kRuUo3FZC2sHlbm&U9wXulGoTkHE?yXq(^bUJ_GUjcEG2xaqKLKy3Vyj5 zphNO^X6dVNT;5VmI4N4*a(c%%mSXuu#RP&=mca&Gounk)HRM^U1D#nt7DH3g^ za-LLUwC6NHNDQS=&Vl3(T%H*}9Tx8L9LM5q{-kP+3|kB&zFt&8n&K`HL8@HWj%{xIm4e$MLcNo~9!OF!GCIo#vKH~m*<7=m4kNJ+PUCLYqR%xV?PMZiz5K%(dR30k~c;QJdAXFH~ zV1CZw8Ff*xx)z`9kr8d3^3>O67ZFG!;w(@_dB*o*0o|snx-k-~O04=Qv(^`!IUkfJ z8AqQ42OduOmicU_863P(RNB&m*3h$|gx0LP=?GB`ylMDOePwPx-Rq26$0HsHEUR67 z@m6h1F~_&VN%2efQEqE~;jxw@dc*(9??WGXn<> zP0!4_hQ~u>0|XNo<|D+(0LN8oY(9@Ze0(sDma*B(xn_)%c<*j}EZtHk7)UE3B*Kcr z)`S_S6BPlZq{m?_8U<0Z#j{R^Nb#)tP6#KnJkeHBnXAlcAmy3*17`Tmk(M3pZfsF2 zhB+W(u>kY@WHl|SVBQ&Ax7YQ0(ut*e_sNrWK8Hk5=(LHG8|kHgjd&SYy45Ja@%UV< zE0sqdYio1tjJt)!1|;eYFgMyCC}dJ2egdMdmcU_SD163ekmvrIlh1d}?g`O&}P(b)FsJiyIOLQfT zgA#WdtokB;zozSIZz$<*f@?sRVXzCg znlFarbKpanmE^i|z858?9{i(FN)GOs5mrR!f%Z#Ai&0;Gz^K!NlUX@$G3iZLx4(l{ zjZ7gS+EU*CP@ZH_IXlGd1nhhaUCUO(+$}DY8d}4513pW(aQF?Q=-xD37xfwm4kjFg zJ{J`G*i$S#z=hOMN;1;04k5WAx8gEtnJMvC`e|o^G4H6RoHp}N$d2xNQ}tU%>}N~3cb6^ArwDnO{7()tWH4RBzR?ZVPACpIAj+i_p3=4 zMJ7-=aPnj*s!KefV_$#^1dN_!B@cp9w>?wTY2O#3>MKB0o<6MnTh$Jra#ZTH$qfm6 z&=OIg?fsyNSefzGCBip>W%$y%jbR92on%3{I9rht9|kgJyF7?OOX&pfwgWZKyWG`u z*k|W{B+t&{abdH>{bRB#tQ0m4eq$ba$yFY}8~|iaV@8OKma`&aJ{d>>CiUH;{|C7# z2IOtf-;5-a*5o3d7q`okT;cX}s$@Slij117zIPq5l&btz^|Nz)@4nn9YjM)HCxu3$ zAfVD;Dq~>iSfxfH)1LqzLnYJ$bkh}tk`{n1fsfNkYG5&tuqF*PU>diw+i?KU!7zz}iUv zLxU&Wc5!8&DUsSh8%*R|9s=PSIBgX}M9rmY0OWx74RY}JcM3j*m=AL7S2|9E17}}lrVPZt;7M-HiHh#vZ!Xw_i9sXd9!rvRF<{AjA^^XW}BGaW0RStQ*E-J zpUPGhgocy=U(g`MBk2GEjRA#)j$trw1NHNZ&OiFkxr6FaQ|*F+I4Elw0}Kn&?uXjGdEzi5I3Q|@l$=#%D& zz?_V?LwBYQMk+s&4^m^)J+J{EwQ~71mP~D^ZD5eVFI{{!r8?Owe=p~7so{X+7Jii1yBTvLuhE#EPa* zscxF@XLmM`08*$mD@aL0zUvdNkfyQNj!7t*k}ZoXs`1=A=DbM7Ww*mPY}%pC^5Kf^ z@0!}x>OTR09p631f=+F#Yk_#C$1I^Zo+}>+rHc2ejXyAUF#ZkLC9`oDLzzZ!Gg3U=4~1x zz?fC`qNi8f1s6Tzn@{kSfg!7s(LKW8AJ7sfZ=3vhid_zapw~^-=1xY4*e!zgn4pQd z+!(VJP-`iRJe)qi_f7;5oBGN`<(zZTLw_%VRbkpWRa}H+@d%gVN$cwTxEVhWosKhc zq8};A3$oF}2l5%_Wc8|b#)eq%Y9_JQF)szEdZtuHEWN%2p|A0~NK*>xJaQ7uO}d%v za_MP=vJum%1I2$VP)w4TwjTTt4VerQvY5>IP!qB~H}ApCJF6Bd2WII;JH+HXxf&iTzW1e`{nWsr}+LIC> zhFO50D75dE9#Ko=fIBk+C)DOiFLWrxJ|;?p_~4ehX1oGs`N!y?O8;*s{+ogrT>ri$ z|7KCv_J>f!)F$}qTD9LxfBqk&WHm??lx7B1vh%h4k|28rKqHKx%le%xs3Eae( zt@XlY$gjN>E4dB#O}vWf#>&Gg*4mOyp7%AIU(A|lp_>zJBU}k*kLPe>V#m)U_~ji# z%0A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

    }!BZnH-tFYHq*%}h+|Vge$covwf@A>Z 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%0D6sO|8K6OF3R( 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

    $|Ii1|LMRVUJ zD6NpZSoV0Z`)nSd$_Nd}qe2$9`_4ne#l~nkM4nevrt)&ITP8!rH5y2H)B)kH#dezJs}2#Lo@VuAw`E z5>S9re;dghfkK7(&A!*1e3NczmOfoH{+j${BCNzJlplL}i`zG*n&y5J5D~2l5FP2) z=yF$~Glp=_yke%tRXbF@Aqx598niR{7soU)x*_X`eS&NC@EIhxJXtDCG<&99{1DXh!>MDC z4h8giq5;FKCr^AGBmU9BvQVdqFxw%8lFq~}32iDEss>cm|pX^H*0Sgu0<@Bw6q2y1>T46+e|ESQo>E;!92=VP>4v`;+MQfOP z&7If|wPW1Y`vn5)Z=e5}48ykMB$JUGra*bgDNH}W{H3K1u57J!TRx#qgcQU9k+OXk zv)1?w`;4jGlL3sbC3D=_;e-jcxhf*(b%6E;!0Yk%XNJH;*~KZmQCIH|#sobtYpswn zL{x`MMS#u)9cMB;cM_)eL*rd|6BqOQmkkNAfv!HKe8Yw3knzi{r*1-MKBi%W3DJqP ztQf$M`*=VM-vaW{CApZo(RR}qu{~d~g_;B<1Da@|0uVDo*A-w`KauUo{&4E?w3|K4 zt3)@*!Q$X$(GNEW26G(0XedYMmg>mH9~*@ zwzw(MYa|mFaNgmt8-qX!@mG)`)vd{e{3eWP4KrA7fP2UKP&0f^*3FiNMq)Q3xd+GL z`oB&2^bU_#lU9jbkB3?leuf9E!5{{6$Xmx0iR*R>IvVqxh@cWvC&2oa0_$wo_@7HI zQ~W|I|2-K2-0>SSZ|@r9n{qvzhp`_MsH`Q8NMQqed*lDl`OWb%D6R;oS3LfuA9Roq zN*5M#B1l$D{aOHkdhDDOy@Ti67B@tQi-VohFq{9e~n)QQXVJw{0 z%!c+xFIfgzFeZ1B1G3rmrnPF~o=9Nm`-*hO=Rd<9P)AnYSLb%00_V+o%}*lOo7>iD zQ&W|`H z7qO3?Agmp7TNxlgM1Z6qdj;I>WUft;iB74H0B;Pjw??^M-MadXUnnEnc@_%y{_v9m8v9v3{CD<`9~@H0Q3%_dRG7th3�(0F+1FEmFXcAJV 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�A%Oa=^yafR9~3he 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∈(x`g0$Q&FE!UaBDbw~}plG#@2&pdj5M8@n( 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νgi$LOmtRKP89GqL=u~i+o`!+kZ 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ⅆ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

    JORGldqh6L)pwCyLyq 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

    mb`Bn%j*h%?JOihYEcUQk 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
    YTrx{vF>>UW?d=GA#P}qd^32Gh_ZQ!+cKD_Gw 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

      Q$)Yh7D9f= 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�E>H>wOE5Xc7WgfTjOpur<|TbHP-3uhMU|#F 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 z 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

      )k&OR) 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�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

      wqDHWNFG0hbC6nS@O`hwR~3V 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

      0wT=C)=1Cbq~kj+!2F@?pfnmSfOq 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%0A2tBAY(41xR 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 EcDo?70ZMjGrz}ulqb%gHf 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

      j#=&L%$Us;YmOg- zt1a5xoQWhJZi{Kbp)jkGwai{&mgP;9*{GVz>$fefO9_2~|K>M3HQvH|5}K@%+D?>k z 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%0AlEqUF%R^Q z;fRj?xip2?K>#PvU>TxC4QcGcZx5fPE)^zyLB6yZqPQ zYX+Lf2H27RBt}C==#e9n^UZN*LE5&0i6QKep_aInT|%fEwWXk>RYnUVx%CZfUgeRO zF)pJd1)Q||r=>393@7L>98Hv*zX1~J2D5k$Oo&wc6((cb zg6)1X=1zNNUcpLOUW{3J={o`jS5NH9efYLZ5_jO4Q)W67uz=e-l(ZaZX~1}F8hxC+ zu%ccJ`?Of81!j9$6Zxy37E!`pv6KRXbX-d1nZ2p) zDt@A=lh@iwkA`<(ivDf5=O|>YYl%_e@Lrkm9ExnRZ2w-6vjTFLx`=11)B5RW%~ocR zh_zP1Q!&EqttpkM*e79-W|d_1C}N0js@wFmrrbr5FHjF#QqQ%(`j&$6eMcuh$=5ZV zj^wi!X$0OnPPH-)GL6di@95)Ck90vQ0f3n|)C zXw+O<1zpHS9%t;S%JPCtbB=Nb0%9V-13L!6J&&Hgh9?Ks8hNbgaAgBdV1;%bq%V6z z=7t~YU>eTC$~=fQC^+H1ZG`L73l}wCHaQ$IbPlD>LG-m5Br-%BS5Q^hb=fIM-f^_+ z-2Id+glHH>g9g3{a~p%V$syS1c=No38jw{Oki$O=hT;1J91Jh!H z{ZXMigz$5^6-GZuPRrwxy%RvQ4Lcp#(X=ixp3FiJ%7Z?6ZysHXStLdj(fv|gbejZK zle~Psp;q7A$MLtt5IJvzf)7bPI^g3@g$jZ1xgAtINrnzK)P0T2?5sLu#YCCM)o)0(Y>^hnUcqH*pY>XY6=}DE1HP%yvjmObG{`|CknGgY7Io<>f6g zbz+>ZGM3wGFnHcGw(;d^{>fS25Fw4aDRb})Aaf)&(L+VBp--s`P37AcTUYku$7}^H zkvItYDD76^&?;%MbTt>l43$o+-|SpFv^GAPgV(N-2}hoi31;vOfZ7XBp6nB&!nz6) zz7s_Pnwr2UebHdXup|7Eb(U<$+kYB{qUM8p>G)--PV+wssHdR;>U(VOQ7b5}=lZL4ga_i97^(A=N-6}006m@Z>wzW_{9 zubIPCOTF_*IWL0mTY2tkh0F!8yd^xj-O5<8#cnx@mX5spjA@-`Q3JmKIIb*eq&0~5 z(8K)w?<_#TtNHXw%#Pd+t+_ounr4IMP*lMs#y8`iwIO=Nq!j*QeL^3=8OR)^ z3!0Ohw8Z;C47V}(OdOj?<+Sj=$@ndW^mmlPP)lg_&7i(zzsdC*D|qc6qC0;c>SPG{|+H_Vo6wY+K?kV&dVrYihsw{A(z5Rl>TajZ8A{eUnv6!6NyLsNnaR z3h+mSoJ)7;^J6{{Zzz~7Q9~-ccVqM4!;Zk&|4Gr-Pk3$yD*gbaH(R+>&JQ0PiQG13 zn5Y5&q&W6DWGB6%GysJx9vmCfccbU{ds~;TUARvu#rudgYNfMb?JY3mYz@(5+B^K zAiU0OUIT3%XYP+FQ&ot_LIW+F)j{DEUH%5-uhS!Fixp8((Dl3mE2G8djLW{DJT~85 z#6uN9wp?g$;dpOS5i@D0ENx!^#h7ju!IafNzB|#0(q>Xhr(lJ=uBt+3QzLO4?33{(1{v;^}mop?us|_SD9u(|VV@P9+PKZ;zY~4Z7;WDB) zWV38aqb`EVBH&0;&l*I`p%zZ*hse$Qozfu){d)Ad<9NwYO`T7l!6R?Tvk57%A5g6u zxAGg0$9mFWb)|yOBT@4r0X_YoMqQa=9^Q1~y9!vkm4Ws)scGIcw}=snEQNjkP*z9z zR-Nm6H>os<{Ezff1l{=$Z>J_T2Iy<@hZ!;($-66+F;gNH4K?!p@QTnY$+|`>FwaJG zixKw-uhkm^As)QWJom=D!pY+CuRxf$EsIghee#*9$0Gtyope?&$O#p@sAFOVWB(jS zyXsOdLsW$1p^D|V76eiy?~3?D2uau{7)w-?`d-0(P+-03qh%Yi10+|tGY;aZq` zABq{VjZHyzK=@)}1{x6ljML8lD@e;Cf!jjPqAJ>v#R-c<6qr5v&>Dg=iT(+La3f?X zoqQ!Qp;p$z{&ZY2I6d#Cq-I)kgm2I5uM&tO>8oJ?W0&y((4ub0$So6kkX0#8deH8M zpnDI?xF&ML=A;_;iZK@W%?^)ghZ{R}6$Xgf^U2PHfahI1WWQ28O-+0w=Ot0>h^0b^y#J6}|sLJXbfM=2Ajo@oG zdr!)o2KyqM8_*wAGw1_9PTuCXW5822uh<&}DpFc~70WJ8R{Vckj_-RrJz(-Fg-U;_ zf4LP-&-wcs!>|*t<=a3xzd+d36Z?-dJo2k>^Y2I%-sHl4!;CJyjcqS3AO;wG{*ro9OYG;Y%0Rh;YtaD}+)1D5fsHw!TSH?V>me|I`M@&^(s*^cLecu+QT-6O78SumlI zG-FeyrJ>;a4j=f|)r%R0#-I*e<)Z$Jo)=vTG%0K&_Rlv}6*%JBph-q2yCr}#Dw3GA z0m22ewcG{?Y_K^^zg2sw1%iFWZ9<@aCO^`{E{6xB^Qetyg2k)On|q?VX*{UyWzo5L zI`=LB9yHQkU*L%SMy7|>cg8~n+qG^cFjI=aGi3`W8$i#DnmLUFQ>Yozh)1%7|4?dmqTY zi_{<1ies!c`usTw`?0~_5Yajspmg4Lf&$&(C&HTnSvspmaoVciS`4XG63}Z4o<5+u zdpTc+r&KUezY=AFz;{s~b5*b1FHbg2UBTAfdY|IaP6$-vPqD4cNS|l&-4kP3Q-aZ; zXghchfJ7t?NeOiKgXA$-=8cQo{WU(Fc=(e~tMlfaneiIrW~c+nH3m9%n55(^Hapfg zH69mtgsa|;zWbV^hkP41NvPnR^Hu+&#ZgLA=~6`3p>lVd6E!lwr;Qus5rL=z0mBc^ z#!#_{&oTX3kxLMl+#TlxB!ifDMDK5bm@|Koppb>~!gDe%~1=fW-r|nTb`x0_|NzeHBfN_)}BfF3z2V^X%Ki4_>TZhD1da{eid69ewqd)t*;n zGa`?-zni0)BeUo$hd6|S^V8^QPhBE z-H;3;r1$=P=Z5(PjRiN>Gk*=2FFpgU_zqKb$Y(8-$zex}DGkhzna$&ZRdBrZvvEjc z>Hv=U2ucuh8f<*K!Mb2sSs;yfky5Tzz$$aw99J}rI`VWR%*ue}x#vD;qkn(T`Qwxr{+IyS$CeLn z%^q)p;jzN8GPIWP;59}6qTF&64NxAk|-CrNEy?Jsf-R&bdQ~XI&%@5rCVVES^R1Mx8XQ zcSNf(5(wcK5*?jjpNE}?C+`ir`~DtKG(m6P+t@HH&QQt6uykP0yVGjd*gYc4&1JOz z<}4@#c$|9(1-S!d)uq65)FC1w5lMmT&TEbhQ!#n7;bkfgxF-EkCC=>kSIG|(B7cId1tLqF zC(Biqq1(+Lzrz7zN}ZoAfzD$u_d#7c`KDnkbKn$}%H175xMS>AsSFQZ z8_H>a?`EN{FGhbl^?RfB5=<}7v~(br=*2Or$U!V@gXLu)WYO`0?mrcXOj9BDo|9lP zy1qEBI>wzX)rfVLBtxB-7p5eG)x=asuvRuSOlV-f6MLYle?_u4bX|0b5IOA_3y0mg zZ4ERkzk1rNLPs1p$)KcdS}V-#q71C|1ZdZO)%`5f+TwwtS7Ai~0(BFURf?0UBqa2- zb>KTGP2$9S(U&de?)*WWmZiR|4@Fc;0h1$US|Vzg#wb07Ovd*}G~$H76{rP0!)3nu z!f9Qi?T@pYMdw`LF*M&l6#LZ=IzD7iZs5F%spy0qczp=gl`5AHKNkAa4|d$ydn21< z@<+2-y)u+i!QOhjJH z+`}s@Yk8uu^dWaQv|Usl_QSqGy8&GgSA=FWBqnwn0Gk@<+O*EM*P>wF6O216-etjC z(z#*$yJ=U7thpznZa3fvH0FTe8KoKO19?+h6+ul*DRm>%(_XxVr`9rzd8HFh{VFzq z$V6Z)jVA5kBqy}ENBN+R#Oo$?OrgP#F0tSx%zVw;w|!m6bH5L`9&o*ly z=NnK<=U?<=B=GeC;kR%96Mtg=o-s{`4ip0DU?kOXH6xcVIwYsk1!3W4h4jMF_e_Tv zBTcRW+qNDvufbUp)#_~OoN|eFJS%oLj`8LExD$a^?}YIGLj3uks>eF16(qQthpGar zmm!MY-#?9bu_v>E_$TX=R(}`FtpSStqHNnxBXaA2e!Cva{Nx+LvOOzdY zR(z$!7h8RSP?LeWGDh|8!_%joyi)1v+k#W=iL9cOigT=eoMz@}wb&#l?!Ziv6b&3I z{V^Skd)u`<&U+82`DtTWzf3`E*|CEl#g3QP2i@zK^$)5jG+jrM{_<*|HETnTwn#iP zmd(LExB#cEV5Xw`L^;OP$L6gv^<-hyku^5f4d& zf^T^2BMLM}gLx362@e;&NZZ~Ch0iXQ-LKr|IE%VVpoovaZ2QIUE7n^cXfOn&cHfuVXZ(Q&)<(_87d|X8+h}gKOP|gP=6)p>H zc@|ncZ_}lM^O33q37wvtFaa8>ZF(#)L{*31-X8}Azg*(O{-OAkJyof} zdF*PK{%`hBz4<$RkT=0|_|WVNZ^@d<#pzbX%HO@Y5bmDfczteMav_U!gCj3t?$f>X zy`am+=&?3K#fh>vs7DKUx>f|)h)hu%E<-o$F31ig4rW^BR;GOu8;lO&@91>lgw`Q% z3MYbxAB%l_%SM(IubMF@0EMv#}E zfPN@yjlZMt!|ygQbgwHtr-8%8vXsOp zwsRNR-*Hs+#C?(5mz&rrws%{F#HZ8Iz$JkQxcMWno7@2r#8+;GOF@eLv=#n+=mXSX zy5;ybr+UZ9;V+%8^Ha~Xys@_H#~@9n@9hg#FvBDsNtc8#oWo+kfH*&(G-#axNa^X# znkJ)+t1T4Z2PRFf873PRWcLyHfkk*4=gb4pAg4KqV@@Ff((gOBBmAq9t}hzJ9aOt_ z72}tyIohOV7c1_6S?rQO{H&t&wBx7X&%<5g^sYt-lOnI4_95zyOUA4>n;ZZ`1-HCM zi87gUg`O~=db8RmgU1e*lmXUeP`(vYJ8j})VcIiV^qxaXAZ2RYL2L2Z{AhhQp9gFH zFdd&k&Ey-x=W+mI$RQqI=#pM+m^xd@h6|*<*=eO#0>EZFK#772K++DBP91-K?C8o_ z->0qHb@q*>d3Y+O#KET$v{e^1|0NiQgp>7tKsLu#$gJ2@`A|X z*bTEkPoNCB^ z*Wx@W@h7o1hqlS)l=%-FLm4=CI!z9GeT%AFefy&CY+4$Xnr1e3tpw1LJQFKSRr})q z0nV>H_;ccSKhb9dxzDeXybBMiGcCk*7Ri zM0mS)PLb&F)RI4!E18xr2ijj?cTu0mrr3KFs)UFNl~Wu!k}Qi4TN~st;Dg{oIgjSo zz86u84jG=>I?Wyl4FzjI(%xb?_*&xi1uxj zV24?J+bF(WEHP9{K_~&0sHOfg1;o;Cb|2xiq_S2*K{7%PVPjP?y+M4IRTCI@a}L+<--3(i?z9oE_DyOv;wS63Y7A>%jd+N&rF zch&4^`c6`pZv7yaLmbklevpg{I{yo5)60v`(D3{-$A?vGS|&$R*V|`8+LAaF*2px8 zeXiY*TO;{0*~fBn+pr+Z_jxvXc>nB#V&76I^tJD&__C^{RmB;7wn$wQSXmMaUqk7c zKx6#LzFsIp%5jx9yyHa#BTkHk)qos~k>~)K0D0cX9O17~GfcrChBxw3^1&m{adb?qkxd~dQ`2t%=*TJwkeg{-CQ<67IEqFJ?4^Fg z`teh!zFRg|dqOz}cO=x*XHM6Nqh3aNuHmH&dUiamNd zOHUHAvOF|0W(*v&)ShcqMVK^cjrH%Y`fF3>786`&r0xhjCc2cOCQ=fv%J{lh?d3_r zsUsLv+M+PIgR>wNz2g#>T4P2|gzxfi>0}@D-E?Nj0p_1qN2n$dk(PZU7Bt9WJEZsP zuPa^;RNiiT)az`_w zd3m8B>ArvAL);qdl`@K*nsW^zM{^35JJJ@}o(A4U{;dur6j>!hU&SOaQymMcR-YfvN@iUzYN^Bt&r%41?M5fs+ zr8-Ho1;g;Op#&m-_P8LxSFnzk<~i0pR(jD4xeM- z<L1euxrnk zk;AK6K$bkipeg|!tUM`4(uZJs6Vf~vapu*djl$ag4_0PZ+V(2pV|;^j?mD zb=<-I_{LTVBW^8&ab)4n1dsF)z=OpJNbM+hdtJrMjwUR)r6Y22SeJ4l`3= zQM3QGNsFkO6W@PY%k%6o@MUMtr(Xo<&NSUqvsW^UICo63q_K7^qZ`_uT?{Y( zOZ+Q+tnU8f!KxnDES8Wflr7(nB>!$PHv4rh^12RGH|DwawBptWf7L*Penwv5TTyKk z=x8wDYd!gQOEx0Zu3D(%G+K2qWdR92QF9Jsv59CRp>@s91bn|O*1ZMr}=@K3`k|qbYqp9IHX|0kRjV@Ml&T%_iwA!9-$=| z2L0lqBOxLSdZG#WE|`zFZeSLTalP2*K8K&Op6j)Mq5)iA5NO1uGe?9U7NGW6(m14) zJ?iurt!jvh;dnF@A(*(g0p~X&LG4G~m;^HVG(%7Dc!*Ig8&t-QD5?H-h&>jLVyXpq z>#}1;Vfb@rT(d*H)Rp`(OO&cq=N`bZd1d9w)`lH@=U&2V8P*|anK zp<4Bp?+4?uI(N-E-|E)_w^xr4#aPM{Z|}Bp$XYSoHd55J#iyT4PK^g5&zp03?53z1 z2SgWO1&xbC!uba&^_XXN=lUnq=%2L0+W*|DvDGbfR485d80E#yQ#uw=EYrYKhr|svSG8BOf zyX8@V^~=$BU{@%3FSB{sxW7@6$0hr!SA%gM0xjKmo|S2h^zLwR$~gA}-#CeLKlS_> z+w(n)kWu*cUW7;bxCS#GT3iFq8@IxSd7k~6oqt5mJfFjX-^xKm#XKV4=y;mC!dDQq z*i22{p`*(DHEHSj!p^1}nwR|y9~8}Z7q5P}9tphRzH-I`4DYRpJ9zP+cWMCls(=0C z12ZFnf~Gu7ApB^~ExzThv`CXPFjED8L0?c6gc{IF*!nYJzzTrsHVk zznI*Fg4FYS=R}oC?V{P@bt3%&1#>_Y5iur!OuHBX@7C1X+|w;9!>D&tV5N(j>(jo5f9oCPDGou?I%0MM`71asrJ1{ zDm-7BvGeUp}-dFIvM zE^{;k9ryt=Lzp>Cl}}vZ=fRPLKFxWpj_f%pHlw=_Mrk+a}gHiQcOtj#UyM z)Mr`v;#ll?plrvy=&A7u&WFP@RWxMvl1$-R8G?Hu%A&yuB7%i`S^PV`WUh%iuyZDm za>KmoP2?EJXiePGhU=+;?>tVOmn7 zj?^h%-l!50eO3;0#?MbuA0bq{VjpL}I8?KdhQyE12s;}{SP_3Tu_CeT2I@1*EnECt zD25>=%?~?lW#hNIUOn{g9i!Y_aA}3e5FIXtAY6S zUuw4Yx$&3t@3SWM?@jawQxf-Rl2AaSwzOPOXI`hucVV3cHwnrn#n9w9rmyJN_&~-4 ze26K6W7uo*g1rqOyKpWE--&`XKoBpQfg%f&oOi)Y#0_`)AtX7;lfSwj30Fi6qq z^u)SJhOyO76uYn13zBsmq0t$Lcd>lP@N58N%ihq$-#+fSx%BYboPwWx|R7(=Iwz)oPvzI-! z!FPYQeSsY&*fnDqk5?yvT>3} zaraAWk0oN4+XlKsIJ6xzTnJxLHCv(H@?mviXGf*Ch%oMksIE_m#Ks8rHI^p!gl?#2 z*CI%kDph~_Xcl5OI>wGhKGr3YM(be-y)`$iEQ}t~V!0KMoIh_y3_CX2RTuV#^>!rJ!euyt8FTxb()7Q`Bfmmz zxz}qB7Il(-U9?4Xh}Tk$Ey{|NH?rD@o70D|x-P;y9*p94j?Y+8S&(RQLOh5YVgV#D zK^~h?vr=Yi1IPzA$z>{TALNun+Ic9X6)SE;CZU{~?jqQdgD*-xTRw6PkET^y^9)J$ z3f);vixQXoZ^0EMDA@#mkDT80CzDdeK8&o86SqS~_C99*6EpmA^4nTZoaS+V!U`q~RI9=~S93Z5 zGeFG0$}tW0{v$vSclbKz(cEwE?3%&;|9o9j9tjil1%cX~4INYc_v4w<6&X{AgX!f2>0l8%73ts*{_h02%UEVbPGR%x0&*lLn*V1a>5{McWwH zm$gem@<9vdJ3qV0cB$?*He@9kp9gvS_U@sbAY~nrYxm1z&K*)^vXSSXI?Wroeb*0u zMk{}`r8dyPy_R4{^>@058G8R&+GH)9(V#S1m8n2gI%-(ZL1iuF4)1!QOLj9+Be{tV z*?4K^H0sXOV|eSD~zCj!9R8<0O(<9h>a(@$gtu z9Xmu8-6L%<;3593(wsR8fHjMo!TQZJkD#TJTX|T4u~0X}AsjECgdprX?Eu zr+`QeuK0Tb3s=YIfv0hLPosL7)-i-P4>SNn7aagip)>w^UZ{-W*5*u5%7#?iwI){` z8#EIEosjE&opzy?tBO-FzOIx)Kje+God{=mTS0HMNfhkeh)FyYpQfzR*Z`Ssg=ESYWcJZ*!&z%mda{;xm{fZu^Q-jJ1LNk;B}vZS0WaF;O<2zm z)9y=`ajFk-x9F!-d$iD#r=rb~;NQN+hNe9bF)G_Fy{Q5`$*sLotY5wa@bwICc||+% z&J#guC7(CGWVN@MO|RRbC;B-Dq`@-Qpa(NoDYkiK(z*lRTrO!6LW4#o7dtYV(I}yD z2#$ESWK+)4FEw-|)$OHF9?naG<$g=0M#tHU0yS#7ULq~=;u#i%t$rR^#Gi0Q!w_D| zgy|Mo_p@h)gj#FG5>S>jMKI;YzB<1Ct>~1VJrANgWlHcGsu8JckMOk5B0VA<>o&zc zJe`Bt6VX6b1Z`yb1!Z=$-1|jvgo~?BC81XSutdotsZ)I5lpv8lZR79Wr)rV%r~KOb z|Aw1eWsbYB4g>U=gk;Kqd*h&%DMxQ!%K<0R`u>`pqm8nYCU zFk(aVW3B3?0eg<%&D5(5pNNR9%pB3-?oN)A9bd*OrM#cN>f|%30;n*=`~;8A0eA;f z+VInKeO6R;E8ywX5L0TU$8;X!zVZ?MesTvrUFo~3* z^}LPoNuIWpS$MG{t#}68$f=i`)^-=JadG|?TBEnR!_4*0(B^S}a0x;gOMN}d&}8Yj zWglz2Um2ZL7nxu$06G4Fx!p^TflxRfs{A$D(sb}6w7~O~tCJpK6!ji|nd%Gj!ub6? z>dSuJ`S&=$n$pdZ%ZjM{q5g6sFwx{WgW7p?2%@K@0h{*#M@ybf*J9pr3^heRS&NXV z+i3y0l7rv7eK2G4m>K71@ioPYRah*yA%b{t(zJ&?+wwg=pO95==i)do>GD2y%pna| z%p*k$aO_OvpsD^o*!=i%F(>m7xa+xFqK-dvNY$^CqO+V6_roc|sj4(~L<1B-s&)tD zT#^N{M@A-SE={CkB<@ZejkrjfhB!Ah9hB+E0Ah^AvZTis=_u9@@fh7Hklz<2Oj%Fl zQ5_YOuZsXu>A!g;H7`0$b>&wndKcNe@)&G5rQ}z6oX2URnXAXWQPKg}X@@DlQ%alO zj%9Sgl%?(=%7x1L;^tCyTD3)|u)*+XiR#)rTnQKiFiU>Da^;hcNW-Wma3#@~9fL-F z&2ZknSCVO5?Fm;3z)>=~4;|W>3DMBq^*w}r+k4?%t#_G!%hJUQy?S-Y2EGd)QPdnv z4+e+xBahmTjgQ@Ff54YAN-u%GT)Jv%mfxKV0zZ6A%SpvrDB>jdKgh9rdAl=NVaWBt z;&%NK0X?-3*BSOGn|OG%`R(id`%ocBv|D%zr$q9O;DMrVT-} zkE4~a1gQ%1Rdvb6Klf_S|O8FIm$RfOhi)4~6)~u!P=()Wn_v}mcy@?ImRmH-> zgOke6MZL*8b;gAjZRO}l0G0FRu(K(`XZDIYr3RDxJYfLX*@M4JCE-{GY_pj1T zw^xgx@%;m>*_UAyT9rtPZZ&`2?^+uA?WHBrM(}SsyKGMX`a@d7`1tQ?l(A5&uK{Qb zr6-2}1UO)Q!GJlW8zxMDm0lVPNjn}&5ZLu!tuqj%PRXts|C`>ay#|x_0xdkH3k^uS z=oRMrd}o!PpII}+j0Kp|nQd0S0d%M}1{eUwF<)C2Sfskf2gx)F3f z;A4quAfB zFP(r9Lf-%&mg4A9KuD;6|3RA7|90ut@j2*aU%Zx@5?By?F=1Q6!auDxlwv`NRz zBDkUCg+!891M(F3d#D35DrHtr)&M-Z6g`@3T@j-ZF3=|+KOE>TA1=1i;Jo7rEQV-l z|Ll!!0!*QSAmA@$iub@jvwtOd#L%C@H`Z4biSdKMqMVL#De$3j^MoOmhYoWt6L-u? zmH7mxRwQkE>a6TcM!iu1VQv&kWo*K)7S-VyC?)^6yc1+kG;$p{;xTft4xZRIO4n7m z@)zC#to%m{Yt72;AO*%n)Mg97;r0U-+o+k%DHiNqw_4K3VIUk-Zft~&4@aNZhKvN9 z`Z{)~OcUA3b>G}Tp)TP5)A5ZzDiuXL1mX36@}bQE&{80`>+fKSAq5OL&xz3CXU`#b zzg#@Em=I64S!1S$VD=(E{3YFz*Ii-hi1ds=@hA8$hs<4K6ZMNEbD;7+!C5W}Uf=q>&J0q5v!Qd=A4si^$FCAix zP&NZFt9JwcMt!%&+ zC=aXBlnEB>V%FpKGFqBv1`tY6|Nj?H)~_k=)|W%?hn0i`dCMU3H9oehfaC8At@}ju zm@;{wo_8&z_FO#`KleN!=GpL!V@SN4II)x3X6AE6%S>``4B_SQVGRj7k0Jx7W(A;&|En1=mv1JvbTYSLQ zR6mWL=8)s$TRp4PqBzCALdQM@pz=pR!f!Z@QOqrv%d>aua?r-wK_6=#{e?a+cx$0% zJfVq?zJ-uu_&^iG*pPGnG=*W#|9o=j8Hz%q)y>)%7tmT zVHC?Md|P$Q!&1D%T6DrvcYWR%6<2$^z-}b{hX$Z7Qj3J8ff29*JourmAbuXG(gG@J zaR}`!gYelIaoDdndACJhQLS*>)pe=74n4s*-8q_~ir!_pm;R|m7oC?^Shh8|mjfG-;@_aFI-)M zK=wRL0A%ejVTG^(rI1>_<>ljvlmy5k7I5%(s)jTb;cd_ty$@0=`P8I=c>1Jv=>yaw zX?OUduvf-g5?bQvakECkfr!;i7cE$p8o=aGBimf zkQnjwi~nE&8d9ouc1dbXtk7&o0xc^Cn_Pk#5#Iy>5=-!S@p8XM^k(jSp7QcxT6}q! zjcfV}WX55E(GX0|QWxyB^R4~W>&4h2f1-ygypI)9}X zak6v}8^nXMCc%S>NdcdtK?F9oRm6&r?FH$ed|&<+8W|6CRL4=Nl=M-3%oM0e&J z0YDlPPz*+&(b^Io{b9-JvDx6Tf7l{7nOs1-XJ$Uee%?_|c8Qzm8Fk6WO;@lenr)v9u+BzZJF}#f%XpW>( zBkVBUktR*(Qz&S-QTfA0lEEi1boRN>W+v}4tyg;)b|XccyP!y#{1oao_- zxt)y0oxu6*m~DyKuVB@sJy%MnLd+v0<8){bOQTO9k6uaKBMrCXpdzH!=al3P^mbZ) z8byiVdr9+*S;cj4ks(4VVq8u}liP_(Ce#}+=-H|&VLt^3yuOe!axN-Eb%8Z#1@MsTasU;tSM!Tm zP~|boTT92SZdRnu@wNP#50-cCBQlvNf<|U~e0FjaxY-K)1V0_G9C4S!NFUe1-AN?t z1M3_0G6SM8u|BP5c_gkJUmgC_2f?B}3QwAk7$w z=_CE^m7-&8W=SAi_H{M zcIKp|3CzQEcl;dlFIq;?7MQ9zLL7q=$hZ>saN=SSYY^%r^G|RUwHE`j{7yp|HF&V& zymP&sr)W8CA6e-FLjup0!l|E(; zn&8wtzQRAChHa9=hU_GYb~(Ad8h5R0p8D~VC8+1E@N}|ip;oJvB}4Y|%_rYo!_XYY zk_QKwr(xs&%f)pPVy9yTW&a@>;=(q&eOTm{+q=WqoL9RzKFY*j#iXIq7Ujxw2BT!3$gJCEuUbLG4pmMM?(O zCC`3sWdJw$ytYXs=r)JUZJlD-iHGNRA%ooM>C3%>Lsd`by(m;vmR8u6Ss$u`ThD{*?dh2#1GZUbBgeEzi;&U<)_0hMdC8c;j z&s%+_-HUAvFa|pV21}(!O(|PN-Tv+SiD<9!K0R4G^5+iQ(kx`hvzgXy$0-$bz2s#0 z6zxkl95L7iMj1G3`| zQSVpM2f%`ehvfxT472amL~5WoNnZcUrYwxnl6+^sC{eiDJ?9w_SxLwxmqvb<7F)_{ zl~&3bg2u4rqcwGKCe+3OdU0$F&Hpk`fnOuV!2^lECMc<>W!i?dm`Vl;bz&O|8lS%% zk`ks*tuvurrCm?FsB|%P79+qKaZ+lF-SQ#v3E007(}kV6eCV&q+4!xWYhf-IBht47 zwRt15hJ2yrGEMiYEY#gIkSU=e?c3U{1x-wnAAZgv$gcO-&}$r={D*!K#;ybr$l1r? zp3ABLMmWFwq;luuTRQSl*4LgB;CJmNXUjd?6bTsasHp7LkseyOj3K5(E~9mCfI(GP zH5bdr>GJ$ZdUJwuMqo==%J#Nr*oiOHm{vtax;ZM=r{8*slczuoQQ6jKo3!C3JlJo`2>H0PF7 zvGW{Ff!UK%8T3N?FhABa$Hxv@2apMqBZsb(CcZ@ag$IK4AZDUl3{O_}oLUM{q$bfv zyx4bLpR8ABYoi~w0OcdUmE#Az+QyYCpfQfQg^Od@vMFsY><%-TTN!b&)X<)U0vYzH zFKiX_Rb`PJ?cc<&_!#PH;k8*ax`)~x5f(Xv7L_{?{0K6unlvir3OZWk6iU5!fvngV zN45lt{Sb)MfR19ZUaB%4f>)Isb0D7ehyn(iC%K@{B==&z%}_*7VvF3%5Rw(2{G1L@ zc4(uqQAQPaG0BP>9Pa1iPs@CRgKxpvy6}Xux;(h#K%T`V9>tqTqrT=#P9pY++6yohC$&{$f$4O}P)Wc|R5e1CF;8OsZ%=m9)OS*ipmT+{4> zno;7aqFJiN zzlM|2FgFf5p1;`~@Dq!PyEvZ<*iS7!yH+`5pzXh&Pu~)V;sF1j-bH`i=h$@3RwB6; zZzP)46*Pb2dBVYFEN#LeQsNry(gc-Ag33YoIl$t^Q!-6Y(Rn>1TmL3cvu9P<}39i^0vAGd!(&H6TTlY0pn=?oZ6`O>} zY*GH7Vl-6mY6wWkNI&$9#g;#p0ieO<>!uo%eQx%djXFjPFfjw7ukLP4)QCCaoN(&~ zjF&D8bpulGVTt{Q1KM(pqK$q`UOpa>LJY&P?hnaf;}L_TH#+2AAfennY~9$^Ozgbc zg0=jBMHN|AxX)5U0n6(y0%IURp7>6Kb-jU-;Dx@QJu|9;0Qqe)L2wEpVEhZucGiEG zc{0kn)>dj>!C3krMNg+i2czRxsTIVaXy>!p?-92Rzb0DH1k_fk_o0<)FXP<->CW$b zPII|vyBKVcs*@Or0K`e8cX9X2;-@W=q|KKquGMc()0M})q(pK5`BcEq7C)j_7)gPV zfr2Eh7K>mMqOznzwYQ|-KsVDe=Qm4^nUb34=)MkQbQb_uKxnUGGEr`p7Zo!j0+JVUa+9@j8Y25Qq3lE+6rGF1>RtT>iKOi; zs8D9E)WdVscM9>*S0Zt&X@D1R_`w!K&>b%5zEgpZMvml2HU||njE|n{JH~opltiF~ zu|bG11N~)Mh+DnDdO5QA&3_255ytL4dImJ{t34MUJ6tBEFBCd8lIf~Z$|4A#{{515 z0QGTfpb^-NoCm;~geC$ke$CD1z5WaGY~FW}<4AxfM&WEc|G`ivhk5UqT^Keg;%B+d zPyZLsi&(kTv}jpTCxt((G>dZQ1GTtkKEDa8!lyT8d98C#!_103LTzLUeSuwjZa4w9 zhFEWd%QUS6nlANQ3!K3gI?gGY967Gn=A~t}!VoG071-g#8y7T`HulZBA)-gDN5C!4J~gc2w+BX>v&(lVVJ~6ou>T;yL`z4=_V!WewjD&IJEA%G z#p{?E&;sIL+KABSuc}0;Z@fNT7bc0ci*kUMA^tHHje&-@!G+)?%V$;eHEMlI-^c+) z*He@)2zR2%@r)h^gJ!OpPSf+uq9sE!xBt0KTZo0(R*4=sKQaI7s6Q{zkBaNmoQ6cP zYBB7RFAN`#u2Gs%h8*LDWcZ00#`e3gwNlmEXVyMO_qj7=#n5eY?X(yI2?XJ0@|BDP zMFaE;lIwnsr(Z|d0@5`NGPbnx{Md(-|G52jZiM^lH&y}fq095-k>T>vgr;^1*Mg?{ z2G;k745Ms;SowKVErW#L8{Ef814Ehm2}3Dng)pdpxRQ>o!m`Y|>x@1pef&SMLh!y7 zBw>(LZ+U8JItIT)t87>FS?c2Rhh)wWp$TR4K8OgvT0A1Lbs(n79e&k`G_m481;gV)YF0kv4m4g~!F9Bb$q4 zERb*F^YIF)QsZEIJ(8qi&~c0rQ0wJpMG{A8!dqk+d-7SW*n!##)}HcYB@qz@JlKMZ zfvS31<$Zya#JRF)!j-2=FujERgJ{XPqpP*k$`s>;%l$jjYFv)ley^fx32qQFT zM~|8u?lUBdue!_+*w~iBqj~1R5;#v#TDi}@-wq7_F-@Y^@NAWa(=^@Eoh%{WEhW4d&tYc+O(oe;QNxy3BN)9BOv zHW5SG=jkox@qXmwrLuFtMl*@L!#+8tH97KXY}0NKKHvdF76|&k*LEWS>B!3T->_6b2AX#f@&Z(6Ph<~6SwQldzNS7jH-wiv<4~05_Mzik` z5&jT-I4LyTmh!&(hKO4o<5xbUx_-F|qrjf3Y3F*9c5f8@-1mp6AKgnoFP8-!6Ab_8 zdL*L(1n5=P;By5`;E2Chq7l|V-(^gYM2rf3QwK&(JS@w>h{vZ8@-vA!A;y5Hb>RmK z_BFm>j3;or_~ES#&`cGtTy)~0VBvNCYvp1@#==c+pHO?Vnv!I}bIN%wvUF(H;t(N4 z|1506dKzD+{H~ zMUV9InCjD-(fGPIEHzdUar{4>P=U1*_`tyQYgc-)Py6z&DxrSG{N}H*j}~IdDbQ&} zQAu=b2yapl{4Qx{(7g+)Hv1n{@(xoYjtWmLj8RPYV%=j{G=;N19VNSS%t5$c!Vz)7 znRI2^nk3UOp`apT>Fh4z1nOE4IlmzUmsB|+H=Sk$vU0st@A}y}5uTrB%=w$9H{2T- zK8&Xmrg}Kwh6ywyQvw;{h4jsKiMn^A%~$k9PZmV@H2=q|@ZGp4Cr4$JPGg~wV`-(8 zj`Mt>#{!6^m}MA~=R{(e-DT>_<@9+35tB(BT5nIZ?b9W}_mg9t#8@o>?J@U3s7ljN zZpiA~LBaS0m+?X1jZ!>LfoXED_)n?P1AOeaB%wK77idF^`@Y0VU|3gJjpOhWI^5N8 zjbW%)&hR77A;-PBctGih~dnTp^;5prAc4T;{- zTfY`8g|#!jR6k!WWSGjJdV0f=;6)N{maE91PMB?3!jJ*K2M6zXCn)XzM`^x}hZF9B zpu`rE(8b8B#B@)=2&r-0D3Uh${LUymZab4lk_||yBl3CFaL$$*e{&4hj~={MC83{x z0tC0dxY&F97F_5k5fU7DRTGLbhR{oVi(?Ndn9mtNTqc^6qPl>CvAA+Oi3E%lyV=_8 zVlr6vjXMdE%R7D^BjD`UD`x|K-Cjlw*OSQ)@?arJM&Y1H`7{G@%{+oq+Z>x+GYM#K z24MG&rf2qO`7Pw)7dC-%#2nrU>!2Av@o8y{4xde0v8F0fG00~8zBUe{nG5^>Y{G3> zLmlALOb4onQa^eab(z-fyvZsEslIq~r-|o6Aw07bM7(fbCW;i*peaMq&J&0BZn^FJ zGbgdvlqlR+3es0hrgHa?nBCvnKYeiW>gpa^9Kp7YhxBmbZes=*a5$X0?K0FrB3IBhDMbt zvZ=x$UxuE>8mR(eNjpuUncEbFif>E1QdEQYtyB6-hzbaAlgJc`fs7QJ?_S)I#~t+h zK<(QsGKT9SvKy04IrEi_kSaM#a+-cp%7WjG{y3TU;mu0+i9Fsa6omh*5#~7}V&y<% z+G6E4*%nW*c38`r4|a|rm)}Di4Sd4_hS26}ZBf%vx@i8>Hb1~QU7-RhBD7DxoJDpE zfdMr^U&*^B^Fz+}<;-wUe#aang4T3{@MR!-!K4dR{)i*cX{p?(H}jKB`pl=~*)`zJ ztCY^I{WVPt;N)eSRbF7{vhMt68v2$Oz+BGSN6o$t1{T78e#7VJEzvT4Z(35^k*V$S z+v|y_OD0KNkG#G-3wc-yL6wlku4z>)e+CS^5QBLB-l-jW=@2i0sESkX-zF1t(-W2q zu+)vh@BuWhcUDry8>94!qI!jN}>PpKy&UM02@kt$d zQi{anYC9B`l1(hN-M|$!qcm3xi*n6Tm6~P76Bc8*)tVUINye`TMA;r<|eQEIaLNk7hT8P|WjpY+=Egt00n_Mbl!B4WvCB~ZU zTg<6Q&s^9jpM5)Ainl3HOBM{Gc~F7Nuexc7;{4)%?#&h$ilbI@yltm}(%fnL-~nxB zM8er=>s34^GIlc;fy*znuP6I|iuu1CTaS5KU5WchhwOO0vL++Ivp9pO{gn13MWQgR z5LZB=r!LnW7+8IW!zOHQ@2ML$o5c+k*jsK_a9@-fq^MmDvgZVAtYStlEa*exh-_{T zEYPv%0DbEO5}w`qjmR>Xzq_Y`L|ev8lSG}VL)RrnM59c+M4Q@aU1xCmeHkinUDb_5 zbhFdX;`+0s+rB-z-@0dl8BR^U(Je*yNkf&W2)abuyFTf-5CP*~{?eXK-n^hoB92x= zZG+p=O4L@PAswZqn8oL4vN3b9Od=Mm^z9yO1UshRsD&6VB+e5_mdQJE8R&>FZsT)f zxIj9a*$K^rI+Rb7U;1|ue0FhI32APrGv-G1m`~n9L0W%UsL|G~cp-q+^*rgB0A2pE z$OAv4+Do0TlI2NRUB#v9`hU3t>mzhyj$3`N*$-~y%+lz+m_2`H;V$_|1D=+EL0u(k z7!GZ&5hc$$(Mm3u$@bFu3biDUezjqxa}em>EE&l|GyFGm_@hD-zXJ|nfS{@)H}52k z@a#@{U`&2p5b=P-h8GJM>W>?>o$n3QWXFvU*a*M7GrPG7ye+!x^}L18ho$w&`+xju zpgurhxpf+=Q3yqE4Q_$fLfkD%Pi-+@twI~_!BnFA11w&}&ApO|SoBrd5C5tY zFWqxv)aBoK8HjI5Go$xF^e`26R7}G-x-1}~Pt%ICuk=i+8W>TsGd8A*gc*lpdJgo) zyyd709zM}(NE>T(lTrvJik=_fij5l-K4cHeay*zhEuYsYdVQ{|WGc)xAl8D}J4z;O z0gooLcuZ1Re0iXa*Y4_I7&EgvHljy!inv(x*`<`s{MbzP^tmQ<03g*#5_C~8A^=dB zUN+G~3&+9;8O)Zuz!v`9>C)!4_2wQX5}zMyzLp{Nole(5g{)?6Q)~Z4O$XG$A60z< zEG!WEXE4l}DHHd^A;+qIR~!-S$A}4+*#MNe-$AArU*W~f?k3x|$2ijWs{zm-FFjR; zj0H*6$uHED7zJ={j9=8-^U*(UP3|CXy=DSTR-keo6iDT@7)t=s(#ws~d3DO_MquK; zCvWMtiGo8+PIq)6i5)32F6Rfm-#Y?p1CZ>3O1`t(J~2vkB-ZXvRn0`omKEkMM!Vhx za&v_&07(_9-w0Ibxe+2)?8OkESd`ZSKw0kF!>FWDOMx0Mfe zOi5BRyol$0@W7#Ipyznw96x$E(li;E*%)l^3Q)r?p}w1jTQKFu@Ub*uq*%a5hCBKfK}|uo5-ifA6M$oWb}#(10P@!3-0=pYF+=rjZUk zUh@}k<2R_9XN~hWywJzc>yNAhjn=P1hR3#0cngR%WA3X$ug=7s#9EktRx{$afG^vL zbGpK#oBXtJq0#%0BIi~H$jMkM((sZ}N)U6s;?EUnfnhJEoI46oTOH5fWYrQOmuD5U z@ur@;x&KBrb-7$b%j+>kz~cD8AWZU!!g||U`Es7Ow zlM>5Ox&B0VV++~Dwp;@MAA;yf~bGuJ09)h{>0GU#@G33CdE?bQ>KJ z1Oybzl^FAXoc#fHa1o|(J(M3M@q6sFN3rqN*a>bX9YX&lF?Iy06*24mb>1LC|HF2b z+A}t3=uC#N+;kemavDO^1%T5ms@l zM0&|5@G^2))%)En-zU9rZ=?3FDdxzl;9t;-jz_M^HGP=H1^~1Qr>6$w4Ems>9R^v) zKR*bYhGB>x3yBHfW!Q1+CJD13wXYDAVeK}V^i*O!DP7+GOGd}h?9?H&trneN!9R^9 zfI2MbDTPE`^FGr`=Q8#TI<>vj_fEdUHp3>93qn+47MS&VEoRwfbQ;)^XRu5jJ#jOR ztNy)_JUE5eKIZE~AwC#n7 zy2s1NBN_giD9nP-hgcg$;$^lm#y|LukFI#XjvYRx7q>O zEvRvUTTo8XmI6wLKhl4OKA5p*^BXu-u0qMT-UmX|AvXfL9s&}0pSOI>FU@s};(Ns= zYbFxbl&DJF^GT!cutw#|t-GmDY~vR=hrV`|oAyHdSY7H-tL0dBQo+zJ=2M4Dp(lpw zN4$u(0}}bC8Z4HV;=hsg$>Eh0s<$$wXR_B-s!|Un&L1Gkkmzk$D}f*bdq1&U%sIE) zygvxu_{-mn%jJJb4o`!*$j21x$n2f3E2##T3n)CIS=p({?ggMH~oqY5X~&WiIb z7K+Ojk-UN5Xy6$#EKp^gL5I_+QJfk|J43rTsIl+^BCy9t<8b3dfV{=9B0C``w%rPT zxKxG9;Zn*~JNDE=zQ3^PNIf~P8;`1+Q3Jk)0Q9@dJXf4}|7#6wmW7(auJ8&yZqmkX zb)%AB(BoO}mCUd3lS+zDct-|6{>F%|*bJa20s-~!(!mnQImW*^Pc=llGtS8}@hBsA zS<00*xxH?4Nj4YA=9+(9F%^ZnCo@48Qn_sz#89~WURvSt3*ePHDm7m3z<=(1^$Jdj z#=_biHEbW`6D6_C2pK%^T>dZ>t7}MvDKTI zCK-80hTe5f|2m3ocDmoDz3suPLkT(IP-P0Mh>y$Pf62uGe`Bk^V;2wn0wOPmsIYh8 zKV&iEN0=YlsS zKU!b&j&yzr*Q4bQI!NqopNRQhI5KtIDP{z$m+OuijI`+UB5?m8o(W8wdDdUF6HV~l zfs{=do6Ix@m%DByr4V`OIK11&0vtK5U_o4NSQ!;!xOo!=ib7FN2?0_r#i~2$@JL`RtJwjQ}jd2JF|ulQ5z2>%(xCt)(_cg1H8 z8l@U^)uoWEph2MvGk5Hs!eRib0JZik!zpM?xsah5qio8eXNUsw%X9?jKfC)7+!T*! z?d9zzmlu*#LkJs`hMTo`!C=t}NF3iQ=KX$Cah1vZ941vk zd}iS@inRsxuaBMYl_-Ci>D1PXBHA2}`%F=OJ+k}Bu8i`$DhY4~m5t*6+Vl zR(L(@MC*;JZoB@N9t^OE3x`$pl-1r*6#6D*4twY-)(zw-)$u~#VlZb?c3mpQNl|4( z>Q$!q>g{1ZA$p!L8##8Lm0)CpOn-h9Zy6%=;VUQ$@VP`HY(Hh6CKL>KIv_a*Ws)x# zJ%(nD@|$JII8XF={u{ytSwtff@(B>LDU=Nq!j<2DTjwrx} z9vvp-g4B3rRXyWw5TZ&c^ z40<}5C=M|O;+w~bk5!$-*Z_dQaFtMk#waoYDfzyGB7a4}c=A{lw4Yn$b{N3n%_5rp zuc+g>|w0y|9=efdjN3TMT|rVE`|GWrfp2 z<{6;lLW6X$ne>(~WbPT;D3*~UA^QkGB+p!IX#Cg><<= zYge4{fL1Ojy{l11)7oks_&e*KwJG0QoY<%XS^98s@Ru?_w}5qfV@=1Nn{nD8H`MK* z^9n_Cd9N&mK-F4?l3kSQqs_e3-wIlRQ)AZ}5P3TfGsFPReCA9o>RwGK&11d@x9vuv z2)LUzT>2~bvx%9qYh?56qEM=PcO6vv(czNf0bozkt~9Jz%}SRbsI&g>?^Ok~isKM^ z>~(IjyviiY8M6^x+L{9)*0OI!&HtcF>rrhln{kKD{5&bnn~xt&8*RHrW|RD)P-ga- z;T`Otu!mqHOWYz;R;63LtiJt(yVTaS^*HJoSXRJFH~%{3CqJvs;R!nxUg*2jb) z$CI#=xnoZC7hY{q!ojF3H*Vdaf4I;*NnCCK1@s1ugEJxy_C*Kk8AxmgO@Z4RCZg0R zhzuk8GhK#no}xN}EC~sRfZ5g~nbO#t7QBeH;e;Si8qrjJ;grwwWJgD%ZYZc!K~}93 zB|NQkZyqLyF&Q*8K_HlWv0k;LEy){#jg^ci3F=BFCnEqdI^L~(`Gn;gxejcBAmA;CaX(kg#zLo%Ax2}Fx!iVg@0PeiCwAoK8fvYFq@&^D7(6L&Z!957-}jdfsO*hWM5(hr#)wn3 zPZiSiZ+~0}UAtJ8$@=Rv(I&P~fiZF0{x5j6Z1EJC2vo#*#|X_e4nCb)-cdFz+?z)< zweSv|c4#~6T@8T~3YR&B8uu(A#8sT~?imH|%4R8t6<4G7qpCeEx`_fUTk;XyLTPK1 z(v4aR1H_Ifk{XJXE1_RID|n^4eINQzd)=1Yr63bgvNHVk@ zh1wNgqD_GEeS-dvRp=_)A9m)Yrwl#>MQ#>Db7ZJ?b>@%1@unD#nPbp~JbgTZUN3ty z<9#nT{?(}~DhWS@vZeE8+GU_;vaUm27U>iWVY2|n{Q9Un4L6Cs#?SVa2>A47JHL0% z&X;YzB?@fJd>TIui}jb8f28ep36~b99;+gBXUmN0s8U?rP}^xR{BMV($p|YXR~k;Z zc1$xuvX6Zj{iIv?q7D%;uEeIa5^!A38J3w$_rbEHPNBC-!d;nu5o4(EsY};UoM=R@ z_)T{eAgvQ-=!1#_pHfjnkg~B)i1L7OL={j4%ou8uo^62SUq|CHq+XCz(+9FaK>>n% zFEHlQp+=sZf23{z?wzZA7x=^wOx!TUyDU11?>LPAT7_OsztV$S)+1lYxidd!iDVWV z1^=FSH#i8BYZ@TEi5ZF=9+bPswxlOsA@u$a4Pn$;{+9uEEdU1&(PXJOu|GmQtDcJ` zZ2>qdhC48a68AJt>cqZz$cVJ0D{@CSiC_iK0a@UB^z6vB!mM37k1$uqzpN>UG{?R{ zPs6$?BSlyzaze?dM$h;9ByQ+DsQuHV!bON^ma=Y%H3NM~Y=MVExCu_~-oR@c<>ss5 zm((tY0qgZXwzA(%=*+5ceB@2mMrD`&+p&6Kto_i9lE?qm2;uK4B z$QvYF=;ZUIq~6HC81<#wI8NXpqX^Eq@1ny8f@3GG`aEN9$}Ro2J&uYUAy-A%NjI>K z##eV!eBk30sUl5#o^4&oNA+P_(C|#euX4m^oBCZ7PF5$mkIJ2qnp$2g{@5!e!LPn& z93{((f4o-FrEE7v?`rFb2%s#X=Ek$ z<8Y01qwF@DuzEAXi6Q|@5*vP%lhK+tphvjK;*6xCKSYf5cK1+)1i$t^_Eo;#PeaCu zHaR`CK=KqCaR8yX*u&KQNdEFR8kUFmi&|@B-{29e{f|~61O~^0@_mj5oq!vL^VBna z3c!^0FnOu$f+CW?*!t_uM4~cvcr<|e$h+YZdcS6T{qWqa3yva4{aDP)?s>QHk!^(t zd3ED=++u_lv0h{^!*r=TW*~8q@^g?(az+4vsEs$S*7g$EhDXfn?9f?;?CchVjL|NG z_h;dO-tpm}$NEni3?a!*B;U+F%wi{&E>$~0h?jRvfFEAJ8Gt!P(7Ok?x@vxw^84mj zc-OVBTrOWhPm`pcLu_8dBd$+pbm>B*GVV4|RV$lh6V>GqkrMGQH%l2_U3c0yZ`-~< zfP3`;M#)?n%WOKZcSp2TsG^-D;2i)iM4Li+AN7GiRY%Qc3Y|?}r-MpJ;~H>ExE$ea zw$o~O<#6>m*IDUsSJ?iDS~p=P<~4tvd<>LDsbi~T zQ`L$2(42PuX}qWRt44PmstYu-x|wxofipH2R{NDz?6L3cO)4=XKmFw8K3r)Nsc#BXdJsULYtZG`t4Lg&2m)6`#YwH1>LvZb)NcqdjLE$2Xu`O=WPSp90hrJYfa^*bSVog6@ z)1R|SKF_~-Colnk`n01sMmlBI-afjtT2M4di-@dCLcE^uey~1vCfxqIDQ13QD&Cw) zHD6;mxfTEhM>MR0tZUzgz&b2Z9E8AJ6-RKzxLbhGwW}$i(-&+WDx`7o>kb6|Fv8!+ zTq*6}ZK~I)FNrAF%QTGi7^AvwgvkA(h}(=3ZR3|r(FRaDTuPAZmOph@jnn+Fl+VEA zT%Lw6P$@F5j!{OztlYJD-lF!}t=Kn*VoXRfNXQeysM+s+BJ>yC%mcZB`=}NQeQz9Z z-awQ)FOZUhf9p&qgMh$nMa{+6UUd;YPy5GNV5Q3+T&Va5-}DT3SU;{woLf;5@UKSZ zyg!0FbIHwQVm*BDZx(qSV=CmPUT(w>XuzBMymLhWK2yrEP}wb(DaZ%YNKv{%9E7yb ziu`f`?C$%G4S%9u3!cCvkA;Nm<(S!ksMj*KG690S3zcU((qP50PLo?j2)^9|Bh{#Z)CRmt>=YljF z1CnVu<7kmj@q(1TB@pYR-``k(nOA53$fqxl9!Wew)vCJ#h|dYy3Vtus!}~YEF|7YUv#}Vkc+2Gn739c}G7sK39SG;souQnK} z4wy;v5i4<|1dWyle*O{)&5Y~?m$9Zf_rGt}EiW^DfG!7Kz~nM|KjhX@AIY%WEB6K= z%U5Vi08frnjF~Q=<5fi)o{0xA=j}FA@s+aBB#e}{#?GJ>!-l<}`&e#^uji3k4nx!* z;*bvn3ynAYlHUAe`6>`cUIe|SD76|7S*|uPP-9pjK_{CbCnMDKE<2m_IW_*2GDbB^ zo4qRhjdWLeWHH^AD6;18a8kG(dFRIwa}h=UGhK5}Alpp1<00o_&r-Zh-o*a|x~Bhe z+q<>DFE}lmB2%eZCJTeEW9q?Zxhi~Alj&ng{pr|0LY32fj@%>U2Gqq&ZU(A`v^Y=v z)d}ygpl){`w>)mFtf2T!;bu;R0j(f_N{Gvr#(*m&VLid(Fqp7BO3$kn83>W>Zh))! z4z(AqbUd#%>SnGm&;@Na-*lAR`?!;1O{c?eg0V8Z+it38VI_sWzb6fOX5Fd(Nt>7z z@q^f%0ml~z%pLxa70Zz9SAH4FJL-ubi0MT!Fwz1R1DYknFrERW(XudGCKL#{4(6;h zg2!%(nr#2ZHcOL>slrXg2cM@Az%Hy9?>OkNis&%2-QQ+;39C_%*;3t_wXoD7X4@Fa zWx&S_5j$kMTA31%|a*D1DY>aHPFpljgOFWV1(-CBO%l`?I%KN{m81u3Iqp zzxSp8gSnv|u`kG5mwVOL1+vS*{&jzqI7D-66Fo!K-}siK5~h`@Ay`lyWxwZVgTdB4 zP8K#LIVtJK6JQvwe1yWao#a!uqk%LYk1lr7X?LbOZqABXHul_I1Z8g_HhK;A*FWXEPrx* zL_(1BwX@DerFgz{S~T8IKG&G;TY_Gu>3Xn8#o`Ov=$}+3=SgqdQc|hZhoeXCxswPd zyGipu&V^480Q)Vj)Vf~KQW3a+s(4p^cq+(!CPKBESE6uhcq4hC+Kvz*(1(zN}W+9Y61jJC3fRFbK&18b0f5=287PJdo** zIx>F0J^OWq(!d(d1dY;O?*!`Pna+@Km?y=Sned|SnsYVJsyGf+B00aVm2PsqgNMtd z9hCP*Y3>HwwQSAWo3V%Ws~ZNIV*8XFzc?jq%T9e}VPB2;O-mJbo<9~y;03VL2)cnE zeF?A?4?!H(83Ky@^V9|1e@a(1gvG%}rpswcLB0*?M{@t;eEs^f0h=439Hc=Y4;Z*Z z-kiM;HX8f@ib^RV=d1g<)C0aq8?hwb!$~hYE;E#$*(z-&#MU)rTYH6K~(mex2#G`2)>rd`neR9&}T zK9evgj0%hqYy4pfqfHv>APr{zu}+qN z1ndq?+r=Q9qaOs>@rvJx-sm1gbr|NCK8q}VF)Xt@gShIsjfk4xSwPy`z^KCp5JOw# zzhJ$;u-Hc^n2wIi{K_r05`45%aotsHd>5V-;)jIdOc;~7e@b|PS7c7%r`Pn4M8c;3 zlZ0&!22J2(@V}&3vAw5Pj9Rv^0Z|Uu1;%F5{s@auEkNrCW*uRxfWoZf#`x-5PnGx#9#Y`k=npPe zZMQft->mft=`X1=f`{^TWmTW$WxG28>teRU5LdojPeXU4 zlo9(TvBgfa|H6%t3z6dz1QD>7xUFtMMqS!4A*hh&A+rEPCc?a@AsH)Ek5w!qmhMF6 zKh&x>tkIR^)|o);CRGF24xuP`$0!cHAk8#Yi;;cl8Zi!xB41?5^fC32uYFu!fAF7Q`F&xbM~n;U~YnZ{C+kncPufwG&? z(q2m)6Wk)vSUy?fL<+*j#HaalI_2=UZ7hq5$-OTR%VQHp;dOfH#EE7FK@Y}JOPC_KfjJ2HIStZ}3{F@UyExJHcTeBRfGSsz5$BW^_dzVxRC zx__~8qxbCc3``4$Iz6i z&rPv6&yq(&R*(t7&4v#Jo4tEc*hiJ_h@&)1U=59L&kf`ALwp=3=+(EF{`_%|e@~4U zOcY{_5gr4d1_gdT^=T!6-y6(F~HAc5}Pl; zh)n-fZ#;rCUP%c4Xj$Ry&?uN(tV%(UL**^D&P(AuVp)96Rkz-?ttRNJ!;Y-u=GenTx=E|)#oYJDG8QFRv){`Ml>Ml5ZNVNVa=UMr+;HS?Q4cgd$Qk2HGAuOn)Y%WNnp&)(9kID@5@_=RZxL>sdTOcfbKTdu_^Nc;Pr zAhg?p_F}*~Jf+W4;x^(@W`YL!dw7!?-sqyTZR!I40)34$FV&%Ud?6s(DtV+&?QzFS zHX5#lMQ7pMn~tZ=cB={-cr2Q0_M*1R#BFaFe~;n5i@p>39r8#nYc;;PRoSZwA5d-N zYj}7@pkFJM|Ab7JvIhDX%X>Si9nm9J+BW|?$#T=rLfD^VT(0nebIM5iuE^FZ>(`JUSjiUyqWx1JWG2YEAcy5|BWKdxSKS`b*r$%hG7F zVD2w$cb8OkF>n`j5gAVGrAL!Lbj=b>eTT<>U!WV<8cR=Uf|A%)jVD;SH0z8v^yUF) z;9Szo*Sp3@`HY%OBhJbe_TU?_HO#{w)@Y(8BIiAviEwFUD}1=NE8ISt7UK^QZf(u$ z$62+uFnSu9d2(2~k zd?{n`+H%Wab-hfLBeoijub}8D)Ob1PQBU`^<3GM=gWYVzX6yjB^wgEtx55pM)|EsU zAD)sWoJx(G?IREi(+@K2(XrbUIP&2x#_*JZH6E)#g@E&Ti`rn$k;rGMvl zW}HAlw8Ao6qI|bOtlJl|{_M|SV36|R?>_U{PYgm&EfWiOPEKOBmltj8Q zYoOiBugMq50aIzO6$8dAEe?1oFb5tjhphYG4a&#_Q5aXq=tXbBbO&x+u2M>OlCscA zT?5X%AF$kb4vZYguRZj=_zRmpb0nb(3N!8?>s@iz<~Jq0vQZ;jI_`N!h)Hy9|3lO* zaUgh2)WMS`g4qTIM>KF?7vH-?-->AC;4uF^ z4Sb4~tPi$cJKA9Y4$Lf`6y`AJ4AzT^X?z0BIuO%j-nP|AY}pieNysX~wPmDVE#y~?Y|T+b7|pxkE~of+m8@fs zpcoX&37b64GCCbFO-_*B0w-{9t`Qs9}33;&+gspL&B$Pt{N+h09gDiM=yT1wB8KhiTAY9>6{naUA>$$?lBawrv z0_z(EouU?RH)+i753%V4>`ML<>!^zG$4s9_$Y)~xc+d{w)5!t6i^wpg0eF{in)N>$ zU)2|u-Baql#lA8hJ2v_SosXxAAC!5YHpvd{zc`lc)eS?`X>r_{WS@mh$ zKDg+nR0J0Uf@@llQe&!S^ps_NaS~UcqktG4ih3MWMGMsa`^$JfDw%h{fp)o?Z^P_p zQ9TCGYkMPV8Zo~>?1-TeHL+2Uv1ld$tu!V37m2thK$Ed9tvWjcg$G&Abu^1 z`h5`o}>vR!+kfHz(t9B zjJPA9gY$EK`K4T5FipA+$*%M8qlNQcE>dviU@RuxYqrAWZIJe1jQ5VpgJa8&K4#KY zh8H_MX_!P15;Ww^gX%08T_Y=UDpB2n8`H76CiZKwQwX|V+EkA|OvwL0h#78FR0KxbLzDoK5@p{*N#|1|GAd6ro|NN{O@2qviuue-DH^IZKM#; zv*S7A9Vm0=l?r%@D_vY2x*kt!3bEYyi?IiRL)PBxp-&*l*z6l^?+>6K0BYNPfbzym zFxq%d)HAHM@672mmk{|cig3zooZ#H6!y2GA6?*LD{VLnKS?MF+)}q(hf@?>!Tat&0 zY?QHahEPj{Ja0GQ9j=4-t9>YUW;BTf@#XPCnNt>8ECpf~3;c%Dqs%ve_YZNf2Tb-W zPQ8ytZ>f&|Gi;WCIDZ0njHxH166M%#TOx_Gr{h3%j=&Z zRDPv!%7-}NJqj-*a?;JFSCWjbNKHC8)l&%kT$Z5^&D>A~&_c8y*W5%vBcbRF3kT%l z?N~_+YHbMQH~B(;yEC2wCS_bPkLb1ZXC4b+C5AP3*U7&UKxL{Om@$q0s;_28>GmDk zRDA;9cl&xw8?hVNi<}}kcYsG`OZ@)&;ncNVT3Sw~Z#p)wdk23iJoN=;)9}XG zq0twKh85O_93-0c6)(tB5k)8tg6{>NNVhN^Tpz2|`zhp>xuqWjlXA{mN0t|siDiCN zgjcMM#zJ3uvhsQ$O-g0G>cNTSXaS)VJUVJt;%zRio718P(trqFCK7?9Ws!JCs{7bl z4zbx27r@c{k&^7T>6_&`X||Y>px8!3S>#J|yU_urP*ur7-BeN5uvBySfXV=rQB^~< zpXL0*Uvtv@cJ2v;v3T#J=j8w6w0sJe4M6ze&Q-lSKPx;D8%| zpl6SgRD`5WoPZ!KZ6jbChaZJ&q19DYBG!ChBS zIX5~c-}Ao+Y5}2icx#7hULqE=TVNVOoA7i^)s1$ls^+_LUE@2Uf;T%c{0HC0D5gP6 znHc8$(|DW7&aXNs}p93=FJgcod-etU+Kc+s_V+!v7r-M+5KYT!m?a0xNed#C{1(a4Cv?9?7d#d795qVIG&0o_2IWXb!DJJkoPLN_ zV6^y>&UrcexLp}hT!_)YICi3@M&HMkJts2~Z4(w4;OYKs*_J0Q0BuF+ld*O%VQVAv zaCVTaFScl+`ZA;GF3Wx09g1IUf3}_`XIq*aZCj8G{J0jr0~l=#l+Fo$;wr+=bgW_QytpKkq)fM_zy+HJS&t1V?^56c;iVH^Gt% zSd4eOW@x>EGlzfzg_e16GC+t4Gv1wr+g)0+tjpyjQ+YVSgs9z}y)3`o8u`B}yb=2y z%9aS=vWB1$@NWeo4tsP7lP4e?Dix;dg@AW?!BzpOJ@} z`%2VbP*9Ccq-YsyldL;%eMfg{N)spqBf&oP&@^|+65wgJNDU;arc1%Fm(5pUGhz$U z4A;tBIp;J&G-CZjAMmSX?*3B(K5-$ZSF|aSdm!U;}Hs^%~RS}nP zzcJ*!U$-*^i#~QNOU(?x*k;pJSIDx0O0p0G0*YM8Pw03v1)P|ds^wQ!uf1-qg)?_ z9}PuzLN+L$(zvMQP;e6fsLtI*E_282tka>jMi!L|0yE1B{Z(drn}%0hIe+-SFzdIyPoeV*t#_ z#H7mkF_%*3I(4gFEEL#K^~fSU7M^OF6yf52&uC9N1e(oj*k|prJx9XDS(@lg?aG;U zW&=zgn{f{2FmA4e=a30pH?;Ygsx95S?P&qc3DZirBd`)CL!cTCrZCKB3(iSR2nh37 z?wQ3kt2|9v4ccdh6C{+g$b$B=ju{t<&JiV}7A1qv*aAw*Qa>v^6kEu%U-|HCc0Q-p zf*AVbqDdJQy?>6d^GM~igDWv|UJ2nDq+$D^34EPSY(kEI`b7ml8*ZZDrxyu3n8-+h zg$mS^CG~cHXnN3seS81PVEz*x#)P~j=G9`R#LLVh<<}p;JC^i+d(iWnMO&v5fUJ0V zysuA}zxXfb@j{&AW~zix812s|FXJs%14E-lqq>7{n@pMmIH^m*5RY*iEZ|A0E_#=S zdJODM`=JVma8E!um4}SO3}dzj4OMYTACZexAuM=X9$7(MrdU8=9UBigReAl|f4`gA zV;Y^}dhSTUmD!AORj@Aw*8Ix^H6~S|^7JJ$m<&b8?q-EO%$Dn%)W|Zc-cpU?6jnUe0--9_GS6|6dy&pJ6(IPEWJ0G1K1~VmA*KopM?H zjy7pSH<5xjfsmg7#}{CPS^!7b-RH^hv)W^%xJtq0lHFOkNAFYC2H62vAYAzoV9r9S zxD0LF%#|0~RB&7e2V!7@)KP&8e6xjwudB;)q>FLsX+KWI4Sb{2ti?`*epr&Cj(ld- z2cA!f+#*cA?c9kM{O5@Vq&u4x8unr;Zv{Ic=9uqpZ6TD6l;=q*A_fG@5|aa9kWB5& z85e{MWk~L7#6NSgc?H-~rW_cQ$kGchM`cw=La?me*Q}nl+7Ha%1Y)|#sRtJP5(dF^ zl8_R{4>LEM4NgF+H-xEpVA-&3iH&Mo&$p1t*H%z@{ia1@!FoLg1&N#qajt8z@tcIl zok{FZG%L5XZvZ+}%2(PM2UBkr=<{Zr%qAHE23wD)hS~{n>9xG=xX%w&UU@wTshO-= zCnySaXTtaw_=ExYgdnyNcNCOQ9iFFf1#ZPSNeayzeG^nXUvrNz2pB0Qa3izqKAlkTcS zi&}Y$9Q@+4n_VwI+-go;XNVd#!CnxKk&NBPt?g*UCbvw^4oF~T9KPWnH*dc;b{VH3 zx-Qql?tV2-s(yU1cF=vm6hEcyX3<5X>iQMQm{1nHVGxamoD*{>T~QuGvcj3A`hdf9 z>jnHr-E_EBL*i%E{p&5UpO9)RimPyRcJAiYJkZ`#J+$$L`<3aw)8s8AZg1jG86UWv zMeT_m{7is)buXRQV&Jsnq8&hc{!Ez>(6jqV_{rY+I_+dgZ#yQm?l$V;ZMwA^czXjq zdkf`w`-(;DivfzKAHu?h1BrIU2WHxBwltrVDHvdln0(Gq*xyxu&ycH`C+r8Y??BH) zd7Jgjg$CdOBK)MaZq=KuYNZ~nCxLAN{fol~XmzOQh*|0}OkufMDuJrF*DNVZs4N+` z3}8RIXhl^R?GKFsI0-YLr|V6LrA4H$A~!nsir^9N;Lm2jIy1)9&3XTPxP&Xd@3&sATHFO@J}|5>1%GjYjyf^(Z*{lY!VMU|B-w4uqCV8g`E z{2Q0M%1E#n1oQK!DxddK7cw%kCi-7NzHRD1uk~CSu|U6X+Zf)R?&0(!_99#o z13FvONr+j&tb3H8%# z=vaW{7xv{s`yvIuK8J_m-FO=d;s{_wN=+z>IGnSppN!LUfe(-IRX`Ksc1>xF=m1za zP7fCJPE1?}M&;*7yoEYI=zv=z8<$^%ALmkmQb7ut>w8a{^1?$^g58O{xJ51vV1m;M zqWPZ5UPt#iH5Z|PV$v9nuET!QczCeGqQyC4cm=K|o)+e0CQ+^w5O`{#XpVNw)IZeN zML&nZD^i+<5+Ofqq~|(`*ON7AXvm}TH~$=+yI{sQX#R1PI?}n8dC+IGsSZx!?1xis z+-O8)Gp&#OwiL!>t$;;+(CRAy-ygh;Q$F>auC8$NrG)l0!u<8sg0r0NG?W-f!*TbZ z_%Vi%tLfOGE}*bPe3z`cr6Vf#BLUq{Daqq#l#}g@mYmf?{@S!u<^)%&3y$=v7z%8d z8pPBO6Mtt>;&2IGtc5Ktv?9@PB0>Mus{SCl1I=ow4!&L$!r=$A+|^2*Qe=fB{Frh5 z1@6x|R&oSHY}I1c+)|53nANw;{Alf$%A{MZ5En0Tln9IT(T|tMazmmXaWH;G|R7@sVF>DRHyE|mn6=QZ5S&FLjyYh(Kh>6Qqw{dkV_&i zijZ+9gr^9v#;N11@roEszR(5XtkzJQXx99nO2u6}xY;wN(lKSg9N?w<-BA~GTM0kp zA+R3e)rjBCd2^u*uX@|_7HATiUULh3?j0(nv3ZKm)>*a1uEte)aD0t1;5+X5ylxqsz+6Tsy18T~ptO>4 zJ)X8aRnx3_P5LBRQzk@JhGotTiocA~jo>6UVdHLS8d4!xo!Tl2YUVLz@SWnYH-TS!{h^ZHY`=^SL(xvI z^3Y$5!i5XIXkYUPs-{n2LXLX$^m$a~Ex8jF2J28e8UD2!N3*Cx8-7_9UhLf|Utksv z-YK7Njw!yz-rR}xOZXCwX$jymh|B`2NsetWvaO9UAwh^rK+ z2Ne#f+nD930_sPy3{L5!jpVkoK1GvZb$%Lelo}+oM`Ob6aRQ)?udX3r37K{}?JDI04x+T2UyvZ>wCsE0BH} zq~r9^eYISQmj#2H;1(0V|(S;5ia}|_BrVE{pxP_ZgCvad%VM^TVTGYI^N!5TTEv8{ODhdo zK{^TwBjpG3l$+2_)O*)6zjmp2F)!d;18> zlXELw8(O>PxuL@>3Izg`ZsN(~26u-&rM-H3i~?V|*LP$N2%D`8QS2eqzjCAKS$BkON)nMyaCo&OY&+%Ytal^gf}x$bp3*WUY)%s9Eh}JTiOfj=!!!+z zGqts=mqcA6h}Qq)#f0+x`582a$Q7aJAcz>1q1^sLZeOBQ0R=U5e( z=;G>7a2;{=KY&U$41gsSFm{=hAw<^wA=|#MzwXKM*-l`c^-q+?#&4T`;*^2vgX~15 zn)K>c2HX!q@Z9!;^yn6{^mkCwq>?S;j1o8ZN>%Bq+kmpc-~pG$M!@pr7^Nt0%dJ*<2C|e&vBZ}iRW`C_30Z1A2lyPpAh#x{?zwe4 z@n)`iXgA$AhC*t<^Y*0jY7zmeIG@1cy71GhzNQV`BIUh@33T216gh!Q`KTTeLuqjg zGK-`)B8Mgr7`-zTD7M=a;Sq$Tyi8BZG%A3HW*K0YN*SN=cvwDluAj|J+*T>O21mm+A;%;hsVz6tkoK~A=90WP;%TJRg(-N;J5dM$AFE6MM zX4Dwrj#R$AjoDaNEvVx`j}y<5LDQ zrqQ4)hSkIDx>&te@e2+Cr&EsFkx!LYJey~Oy^Dr_uN{q*o!0ltAO?{`EBaHwV?y_` z5xS$QLuqsYiv_1T^c{aJEBLtEt5Gk4vDzBUQcI)S$#heFG1gz?^!fH>ePhiB=t*`( z1*{RGJ}f+#sd&Hg7jI~@r5+GlT9GI=rM}xWP(NNrT&%3^8LWLdYJS#VVDS;q$tD zV9cn|>_99Ur6CA#Lco6M6us zs~evmj90T?X?Z;zo^*D#pd_#L&v6alI&E$i)}Ti!-svH z;vM*wIwa+0AlxAh*Naz}S;IPE&xnV*%fmsYLdz*Kh^tAPn@}h2l7ee?g5m;u;;N0MG4%87#O>`Zs?qjM@W|KHLa*kd zc&q7-+z{IsTU*a5vRk_!hmJiT<;_L{o4`{!4(+mN7{D7CKIRhn;$RHa0yBKRl$!yn zfwpTt;xs2+%)7stuZ~YIkP#4Qj_2gK1WF})+0YW{(6Z_ihChGLg#_iIL?YfP7_;k2 zW;gDwWOwZB6aO=IcV^;zDnuduGGOwe$%up(i?)T{D^2{y^n=7&%C0E|Uq`<+&d`eC zrF)iimhHY1dzBA-wWR790909EOG}kmnyB1NHK78PUH_Q-xd6+GqBq^bCiwv&-w9zYkePgIKEP+ikO8UD9OsqWr&jD*`-43IYm?D z_AM4!V}~L=d?r&>#kl%Gb3&CXTJWomZIk_%1~?c=FaDsU#E0C^Z2`*HL}OI1EAPl= zbsp^>v|;ouk{0SQU{xjzo-|_Tfwk@>YDbUFS+^yHgHnoZAwB?5aL+ps)Y8!sucO$e zqhIW`d9VU>VY9lW-J(j*RNLF>?XGMl1UL~yUGaE_+MbyIYY!VxChoyOFr8pvvvSzr z(UIjC<8n|iVm9L2$Q5)`DQ5x&l(4tr5o_LDS(!}(i(cdqq7>of5uJJow(WC5N)iT3 zk64y(UVrw_@(JJt?GKGzu7%8yNV{}Xz?=5RQ~Nu2u@5?y<-II3&0I@3#9CR*=*Cvj z6+V!Xth$mw*~IP)c5jyzJ>beDdzC~w@1&`|W`f%d z?(h}&H;C3dtv2p7FdaGeu+nhBt3OJoj$9rw%%nk6K*tE$zQzjT9+w>5B}{{XxlY1C ze;&vjJU+w64d zg%F#=Q(;pPgG{WDTqfc&xrd`zjzNeDTjL3Gu;9txvGzg|`HuM#SE+m7fA#GlbRb7R zj?AZ}@QLbdWhJCwgbVU^{883GO1&j4Pf5}3VA^>lv{3_l?aj$i;h<(zPfE2FHacF_oN%?l+8eS$cR7WIzBsJRCi}%(Iu{( zcXW4CM{1`IA9!Usj;T>H&(=!Sv5q16J%{ke`5k9F_OzPG0<1wD@;%`ru$s3)GIfq8 zq4(xb?5lkjr?8W5xL<=cr1)%rtH>2Gq-}hiw3z&In0eSvDn#OR?EQ<1I)jj$KgYgW zh|H%xh6k;@Pl)>@@2kIN!me>KEfDPJ#0> zjuWNoz-8E}s2SSf4w*H`>c+8ANcTF7w2gm^DY^5$^ggIu&`81*dM6AkvsghAJyt~;6q#+tsH=;9$sv@mgQRwJBM5mq1L^n?aucnDLf$QAQRxX4u@j)z|~!5q-`>1Gv`9sqWSDV zd354xqz|N}x^IWDSmmERg3mMtJ`g}?)Ku^Jb%t+c7~|l3c2Z(A%>A>+*?|qc1O})r zD9;YFotJo8Y1Gc#fwY985t^2DIW!f-+M9bP9`=VY?LG4O-k$XI`v7D<&U7aLB8(YH z`c21A0A*yqca$SZrq?6f2UlDG3YQ7#JkpUoPq9R_7L%qPGXZr=hva3hi*`>+(yr#! zGt@m9VcGm@s( z02I~MwLxV;n+@+D|Cl2~F@(tXsryF@ zNc`RLRYc^nnftnC+N^E4O<0_BR`4g!T6&4^37)_7REdTb*Wv@4|1xRe zxyyZkK1M-Fbsw@G1_mz|?0&A^+)!H0^V6VNCdYtvs4+iG5J zx)1k3Pp@$wTUI15I>^KD%`W_^eQ8vw4J$uEk83E*g)AD6Ka=w+>*%E#$Mf>N8PO8P}T- z#?!P|t^5ZeGm@vv%huOM0;qQohCJ1h8l}Y9h*dT*b}vFY?m*yZc>0QmQzOjVis2)8 zYQ!=!GKxm%vrq4=rq3=Nz7|d%27rIxu5``GFR4Ow|A0Qcag|3EFAU>fAP$ZbpYN-A zSYTS!!#L`L6cRIHt*6LLx~Cz6L@^S#v`{K+CU;}!(=IW8Nb6Lhdk1A zDq})pDK!1cpaGx?qH7G=UfpIkogm3De*R&yBpI>hk;+0AHMZ=F){_*|5h=jVp~+f> z|4`XE?R13XjaOxankklZ;D{Rd{?5X!5uRJY;u(1iOZJR${$XCtpMX`h#m5w^`i_h6 z0G(uiH43(_y7QtEle$M@{+H7ENQgt$t@Bm=P)U@72OxD1ggJCp;A<3tC#$+HW}iWu zfBr+sT{TM$C7qPWgT648?A+8I`Cy&R5Fwx|gv^Ap%U&=PX7pn=H24+tcZr>^ zwgSb3ah9DhPlPc8g;+j89Y-vi4&O0Cz7`(xIg8I66GD7?|5s+KevD~_n;#c>Mxyg}kyQ7Jnf-xP}Jzyt6>R4}$e5H@??>nFSV+ zKLlGa5oUjhQ~1+pv!Pqenpu!dMN@$YFiB>J%-o5TeV}b>K3=8YrgYV=x>Is402FXO`Z*NX?Vw773;>&{WFUyTxF~=e1S+o+|8{PmfKmcOU&6o48o@dmfw%+w}>?uQb zsvhh@CY){)puWe|-F1`u{HhvqZOo50!CsVNQb2KT^5<9de&3*3PG*tu;)H)E`GePW z^Gzd5aJy$dcZGuKZ{J$%kxQYFsWiILS)r20C(Z)c!9};`^9r;_o+DEl%EWrD^TN+h zu{GS_+;{J#c7jmOx*Gmn@;;i+VHct$_huRK;(M=Pvs~EMBD0%bS2Ic0Dzn z>8;~Ul?s;jyhdPU6XRE83v7yKGvzAQB7;^1+-bj9&9leDlIY(E;#blKx10k}`A5R( zqjZt3xJdTw(cD(LDZnU0E`0qZ$GUwvU^blBG z97GH|8j_Y^Ti1dQcGWF>oH<8mK!O80D(v^56Jm5hm@XsmU_FVEM$h+YC_1GcMK;gW zkIzUeVa$aE2MXJWWbc52-}l0ouG5u@<8F%CK>+@x^^Q>6%Po=|}K+XQK&B zc`<~cGhzeH`IES)_b-)5YgDsIIyTho`g_S)4OGKJD}>7sYsmE2{C@{+Cc17v%3|`r zmxYyta{T;WBLVnX({ZX--4B7MT(g`Z`Mi}pjHGaJ2AISig7m_e3x6b1jp10+iV+k@ z78dD;#;U7+nAQ&G#0iS82KC%8WP?$`GFkKfE*@16LFi83y|@0zt6A=lK*art-PypD zTocaEttl1>WtdRaQ%OtFNH0(MG3v_zo$^^3)=wP8t40xQYP}F#6{!u2wk45f#*P+Q z%mMy^Z1V$>%4_ktcdy;5j@l~gxmxVe^cp}SO&&vKqc_u4)NFAOA4GgQPu@D6c#~snE>v7%r?= zzFDhujMTE!UFsJ*8SKPW*JVe9)zh&pdylzZxX*Jn4Z}YjW@V@Z zeVpwaSzlfP>^0N=snc+|8lRw4a7*zqp=)v*)!3$bHahy__p^?hNsXXh2R+X*+~h|L zNwF+IlxPZ+yoBWfT7NZJTWcuw&+-S^n)WVU@H|V^*i`Op1>5OYa62fG! zqdXlb>DW`Y|M@BN2QJM`i{mql@9b$6TuHYQM!wg?t!oaEP;x&wDb%WP*2=^s)V(~~ zwMfNy3RCG{AGGo_OA~(O*IyCeUG@=raY+2qf3Z&e6}N;zI>f?tDS+zX?)hY#N=30@ z9lyLGxffT7bpFI z89bTb7KVne3Am<#DC1c>J3|_=zb{0Lf0|OWn&p9xIt6UrgqgtSS_!c?qWis%#2E8^+~6u(HwQ(eP|uq~2Lhqjrnpz`qC@GXe(AP!elG5&>!Hkux-!&<#~GzF0I zK~VZWU7bxbL(9B9GJ|p}1UlPn3eoAGJXWZ+jK0A~OMD5l0xT})WRo-gUC{zpG>IPB z4^?g*Gys4J3oaznOJ4_-m;KmUGXOk5!@pY;0wPFjBp%*s#v$&j_2-G*@_{u~h@rfB z?w55soOu~~iz)kRz7Wqyh-8_LJV4$r)`?>Tn~s@a>k+|6!2b58I!yT*!WcT<$%1RP zeE>?&D;y~JCKC-|hVfO9|PSjsIMDd#+M+M0)d%AV=m0q{A3Tttq?tQw}NqO3!FJilG;1WObf=$ATJsj zm4*7wat*H|iZWP1dH9EE4eglis8l(6F~4&Yw-S9GLY$SSmme|0mzrc%RfzGRFd-PN zu0Y(^6sorngACaVY7E7x>4Z=t za~DWSdVWD57RW_xX9HL&lI_kD#uxzoFWf9jlhq}-EAdz+me52>x0Ll9FFkI;_VuE# zA1=o@xm3R9?|t7pJ_yp3)^cE(N?$}9p<*aes}j-2*+CeCs-;+dKuvbV>5fAVNz-k? zB(NKlJMnc`m%jSHf*V5@uuDIrVY@MP%{ZYVS^>9_T9Rz~#~P8jpLhP~V`J#JM1&!!0 zgMX%7v`z({lf-obnU8028^3)We+eBbFQ12H^VCA(`{@W9i)v}`vM!X&Cy{a}D)lW1as2a?x0mk3SY+b(~WN-PvVu2>+tx5V8#)aoG`0T$Lp z@G!8NnnA;uTX=WL$^!26J*ZWbzCe;qL5C;n^S1Pqf=3d->ONPq&ApJM;<7JWJUf8I zIMVS-9!Y!^MH_`RJG^06tS~9NK2-0F5Eel0yTa~$yrtq+14P~@2gG=a1|xD?jcoyA zuNq;9Bt}WOW~XT`!I+=;K{7(*6PYH&m+2Cz7>l-l|LGj7dhQNKI^3;13?(qDTS1#h>y}+dT^! z3yj%PX}K$4zP6C1buq?*a#M%C9kR;JV!wl5*k~BSIW1pXwyTH=cLj}8Mzb%4v*Du+2`3QnO@^hk1GpA9j&FP_Xsl@MyL_>wYS-IC=W{~Pxm zY`|fO{hU<;NL;JOgFC+2L=H^hbFDsnu!R4>i~Rfry;W+z$iNq=3)l!R$id!Fn2Q}KRqA5|gQQRXk zIPAZ%93(ShcaOd@P$X z`tH-pJPObevAcgo#=<&X4dv!jx5dV1F8j^U17g4V9;P*t`?HzjSiGr+Ts$ygr(;z& zS*ryDkP7D2VF@u;$f_l1;@gtlg`6zGK|tGQy3;+9<+zX!lnatUxw0w&Gph;0x`32Aly1F^KSwHiCeNE!$RZ{66fz!+aL>H7pS{p+Cs^Kzmp<|?8f6LGlJB^K(Lq7q!g4>lK zR(@&~5-R zruev1(;?=4m2IYpSDfy7>j*idV#8--GX=koW;y-O)V7~HVmvb_0Rn$S zi)5(0IwzF95wjw>obe{_=tn^WSlUNpEBw@A+k#Yz@-UOA-jM3ms1^tn92hkVt5F&3 z*(ml2&mB(w19*9osEL%7re>8)-?LvIRN42v6ye*2Ag$HCFBhRT{`ST6ZEVi%AbU0g zJ=$X>$6d)vH|T>6!1-+&?#)v95!s;u`u#k4R(>}~wL=_)F|_;biFX|MQMu7ii$ybjx%c(&;tS+(QG zPV4yUp3qjIewD4J*9KVtrZE5aj=ptC5dycM6b1#a)2=M4m_))it7rU%qy6eZJkdR$ z>zt8!qEk0$*9v&|{9WImLULhShMm;>HNS}sTH50!_^Z{I3~KO;CnQT-<+AsjvP!1b`7t%mP5+Oe_^-fml8`XP#It zRn-@uh)HAdQ_iF@qv3rKSLpx3A_xNl=LG`A^IB@|-!YFRt7rN?ZBnOs(p?^caJfQo zkTEokH1sITb(^IV8W!Wh z-X+)%5(|Ca(+Z=-hu)$v+v`QcC9iPP09O{BwSdL7IDvm5#~QvDMJKH{HjAHsDMWnf z*g(Z>X9)OgP@zGmj5H+4H z$8o_|tCAfvMD&>LNLDL|+ss2HbnG?QV8y;ZdnbM{mGD3v(gjGBMM-P$L&(Tvstqbm zw1IsmlV9=yc;DojtAU*>mDs_jB^NWUd~i5W-1K$)P%ygsE0GnU#Asxex{@Zz7^hUQ z^}-`aq5fB8j(tEJi2s|1STmNlWy{S#l`5sQ!-axMAglG!fj=$~xzsA#$+!Ry@f!6( zb8U(lIOjzQ1%!K@M%Y`8Vubm=GZp68w`|wgVN>Jl6V)T@je~D*aKvY`8#AUQU67bh zuzk4TGzA_PrWSX9H&hp^>$s)VzU3$~d(~bWS;|Z#vGy3pn+;7ST&lId&lJ@a+$bblp8b^f@kY-TQ^YlRei)RdKEivOI0QIIy?tuOw`SA z-S^})8SBF*B7xwd@&${~sKT*hZc+}a)|m5{06=jL6i)PNE~H7wBcIh&(5${Vt5WHPQ1Nr7YTZ%^^$dw&-0Nq z7Kx5-Iq(g!5|8N$zL(ce(E?NRQ_-2;lAjO;&D6agzAfCW)@&0I;m<0>;W6CXIif3a z@cyN)woZ~}XGbvidgt%U2ehsaa>3sC2e1eoj;TZWcc$6~Y*j!}m)K6Q{H=}_Xb@HM=J(G-8D>>!u7%5 z6|A&A50+?KYy9iU#~Gm$C!>4WJd@R36vnv$UCFub|UVD>xE9% zEzz?CvNYj}Rv`?0ZO}Ngo$v*~>>vpocmE1J*pwZ;M@Ck_EEEA0b;<`Jf&k2$88V-5 zJFG(D?H;y1X;-^aA#An*b73!d)5bB`7w_L{I)!mCP@R2}G+L@`7(7aj$W?{stK?(h ze@)~NxfXTL5&-D5x>qwN@=wLBO2n^m-_hPBd-r@StbYCPM&5P>K9=&GqleCue|uok}vgFSCLRxXuy4 zlAkh)$QnQXaw)jJl~7X}kUgbVqUo^gfCtSlZ0)iT&$CPBr;SWk?&=R}kT(0{r!@{j zbkzt?sIyyXDcQodb4FtvX_-! z2({AW?IB#s-?U@MNN&6+p0!%fi)!uXslrt_qkN&F>1aEp3Xh5s1UW>XPiyruoUsSz zq7rMUpZUea9_D-8Sl*Vq%HK^|Fh~+$r%{`kvAMODt~pf`rVeFr14CJt>~`U`Zz@5a zfb|8SXS>ISE?HgZk>p8RH_jHuV(f&Hl)73QSQM%-Cssv+6hH;&jQ&}1)OElWkpG4t4Aa1 zlW&}$?m9u>c@9Wcup;v3-799)3*EIl5v?tLk+GSUq(*GghU#G8Z>Dxf#lL*KX6a$^H7!mZA&UtYEPHYR-cDSG9180*q$NIw8Q7OpxZg z`wsO5<<_*}bWA|Hkzr0EOdT!jRuqPw1^8a@UwcRH{`{XF2`p&KxXzK85$Wsy9t54X z5g~WQwD9M^JCV_LlXCLp#;pdIf4a6nTTv(#{2{Mzk3LdF%a}%G+EkTCut*>Z&jh7E z)njOToaGC&ca;Tkq@x)WDnpUjGR9)51h~{sZb-wfSGkCGX32VU>GrFW(mU(KoiA6~ z84XAKbhPIse*12K7pBWJb^A;se#ls+d55WRA9B?SvKjsl9&MsG{b`4E`Um;GWkR-X zW$A9zpP`;Qd`DM0CybfBs78zY@wMxt#-|B5p2$~pxhX;C$M~tsQ*$_{jjLpO5%+ z(+JKNvDrEz112k%@oT|_M_w*)sT~9xMmh?c8Aiblq4Gk^+B^dwX=<8D1j+c57CaWNT+t=~%oTLHFuyKZSIqc6X1Unsjf(Kpc#q@Wp9wWN;#2 z$^`nDEc^J#Gax)%hut);-1*&Dor$m5Sx1)G-U^A#{mx?id&CScVmh98{u#C~YB1+E zI0kfx3oRx3acAdDH>wn=~~kS z+8~?9sX!0`*l^}efAZTinump7C4>6|#fx+i6AXv6$*#E~9c!_6aB{LatH$Q8>fLab z63V$JXcrl?yJ5wtv()T6Kc`$kgJ&ul{=0J_1#!#uWEHQhVQ1M+=!$Exsag+>BK@^b zq+0UMv_kn?*D$yK^o~bI(`(M|(HAp6Y z;_qQRjjt{vc3|Fdb3+;_mFjw-o1et*S~s4H`=|77V@AwB%sS1U#;+%U3tky1Pc1Gv zz5@KWPrBa4uwblWl;BFDBUWh*rM`4^+oNtGn9A{jJ_emBqrN=JO>A&(9OGHyX}M|y z(;<4xDmSy5Mda#4d(C!w9--(OV{_3~u@L3l<$pom)M3nsdpKn3q$mmszZ7m-o~&&< zy{4Ce`xDbKE|ob5=CAFZ0$ufn*j^$fcJh%}kXjytGZc-MM^Ygi>lfLrib(Ex!QBsE znvMTIjl`^sV1%<-rn400!J1Po=_xYq!%`9goFW5T{fq`G!tt` zt3SzH;i;w=*h%fOpB*L3OO>~kdMQ?1d?Jx<{-L3xjK z1O1Ds-AaeUve5O2>o>t+-#tMn0arb(kd+bIs!c|va3eahp-ZD%pC%@`?5!F>P*_q0 zV^>Jp@5T^51?Xo;g^Rk7W;;;w(M}(0thKS}B(!6Dx%E$ccwd5GT#F=)MpeGW@< zS>=6H#r`Anlm(n7NWVz zMD#V@m2f-Xm3d|?l}kL;lm`k>7VE?l8_jsG7{PznqO~RbyN=0f z-JW!0YC3s7*BWq9S zM1!o`|54)DIZko+00JYe;!zW?yxzv+1rAH4kAVDXXcQ7chLE6TQw(h?i?@H&CKSzs zmgtCBewe>D&t+$JqP`>%ilRpBzW}Tj4IR$Hva4qWagUJUu9b=WGVS>Nz^|Gcl%S8s z%s&x;$;|2`wv1Q|*bLPb(quuA(ju3LstTOLpVC`Jb^uckgm~`iwf-N(=9eV%dsv=K z2%46>;ZL?akI?@rAfC13Vq|0Rs9v>;G*D#_rZ%#4S@b0Q6DYJ>AOKw6sT}OVuK3w3 zIeU6Be90!4Y>g`~pvwRUmcHJI@@5fyT{byY>>zPG{QWenO*~0r$V_SL{#~oM%AzLP zS~BWlU_BEH%qewZv7=CAz_hPigsV+*up zxAaPWZ(G!G5k`t9_{0O>?4tI0!KcX|@x}uMynv0!9$`+d5ml!k=Q+nn{te+{g{2I5 zW7ms#G@x%>)&C^Vb5JfW6TWyNzfk%vW(~F`ReP7R_qrNjiL=V+a!>I9X!v?t2SK=sPZdDx@4PNS#q`>oUb7OE2@_g!VP~i0=BKg ze0j16`yW#uoWxSS)py^L?winn}fTs(g{yN zU!=yEgX;&_ObXI^Cu$8o*S5bNIN?;r_D1xs?+U5o`#rU?CksEQ8BFK0KJCl1=0kGB zA}5ZbsDCLi*ZxNKMR0T)6Bg}1a#&4;v3|-M zRz1ui35(5nwqFEB3A;xQBp=$Gkw_WIrC>x_>B0bP!Qi*|ejzQOCD6uPby#yxaKdY^ z13a-u+iw1Qx?eAMNBZItX>}e8oM1@*yR31QEN}=b#>H9)pp9fd1|_P_0g4Xl6Di%Xy=qgLP&s ztn>wTrQEJ1P9=T=V%VGl;h0J9=sZ_RT3#^jYyrt?uU&TZ6DcMU?s9qS{kOy8dxGF^ z*vJIn=es%oD8P3i37HR=x>R#Ufzl)NVh-hL6(}Q(9tSy+%gZ)3Av^?b$Y{7_pVCFX zzed=KhUmXZc)&MQCY(W~Q$N@Mtxui0;CWXB)lbCotPwsA6W+XpneRe>@kaU_2Lbj* zV+wX?Nwad50d+?2LlwO*NivfXSCn>7`Xt18r#0!^A)%cDrX*LfP_oI$A#OYuOkWV| zNdK=gdK-9(-mAcB$7`{Xa=H&Uq>$7aSB5p9lEk-+Vf&t|h-BWm27iL5`(^#r2evq5 zt93)HDIsJw#i(Jihr&tdI639_N3{I~jTD3iLz3R>XnEWUKf}V{wvMWz9mrm!^9{S32D$)g% zuVZ~7UI?tJG^uJKPPe2Kh%`ya(_<_xUTY^r&|7#KzaNhS0%F;9+N4wr&(|zAX0cP% z&mFJ*Ao%9!XR^@eroQJgHHshm-oM`>jH}mNSL>7NBGD_*uPIqXw|9|dTXe&Dp(5J( z^1fLkyfhAt4Kf5Ftg9;#Z}TL@@Yw*B4r2!IwmSdlIV0-R>NiFLj=oI3vAdX+#*0Jc zh~9tg=y_VF{jTZlIbs8b>xuocq1x8LyRzsog{lfZXj8Y2bI7o*n;LBCx0s+;Fpcr{ zkfi^-BvF(OIcvRd;is8>k&PH!L-3~}!*-3W96E6MkdKR{7ULte+$~cMsrT*X*=}*)* z6sD3t6X{3x&3N}tO=&C8o+R*@9gXrdkV(*eQM<%o{)I2IZ9TlNRp3iwTGHQ{aX`Pz zjgf3{8hzK8U-kO>;wN0r2{_k~Z9-muQ%QCi+JGZKAk8p7J0r}cKVfm*V@H#D)fd~y zh;SU$8dvcap}&zR)n+T8U@pSIbsyGQMkDg(`NFp+pGt6=#!64{37PvWP4Z3>L^Olq z;|yJj_Xn-)$prR9j~(szl~Wr~HPOP-ensNPiOiAf4Ee+oM-wYU2cN(b?0TJ!^USxy zjU~3}2FqxR(eN^wFx05+N!`jFq72CGS^r)!*utsmRD$2OX2-i6mx%7Z(2w(3q%hQ? zTvgD8*RC$ssFf@5Z$uY>ER7VJsRxfmz>J(|BV5#u>Q~uon?Q3BlD(P%AZA;D^TGug z;xM}wo-!B<=*XP(igYxU9VegM?b*zd{@2?7LxzV&VU+q++c2<(?_bS5p@qvCO!ZKS z1Uo07@ccPE_ecHua#tTy{zI?vqa}gVnHc=BDJKdKb@vp7C+}W{cq_xVgj!DDJ4R?8 z6LW%jai8Op;N#u^8MFB%%Ztq3RvF0ciI3*D2;Xj|l)jquTfJWZK1{FWxyMvhE3t7> z1mMra@XUGgGqWKRcZjg&wg|~u{HV3lE&B}QNIaP9!PWR8i|!DZ zLv#M8D*4+fw_owqgv?Ffj*EUx#^MTggRi2|ZZ`~mXT0>eN>J7H75aeo)q-MJG+CA+ zfodbPVC!R|170NU(LyQLz_`UXKm8V7Svta!TR$^VMzr6({+>Umh!oV-<#HTCcw8Kd zXA2_G`IJOHqWmH_YVQ*Nr!;vN@0&+EuS*wZILdV0&$(96VI|q@ zrHonazcB0Eww4W?_r{*Rp0Fovbtaz+&tN~SKv$ z0G=^O$guafCgl7OdA}iV_PVEHPkwjT0{A5d;;}}{(q;A+wQcB^pKz)-jf@T4k z1l2UMPM!UsR0UhbE8ClqCv;Tuc$(I>W6JAUM#5E=yf*Fr3n$I!YSAmx&^5gIDys=7 z^i+VMyfmH2U-WKeM4FC>;(IbGhVdsu?_8t}!}mss+vpgDgf<&OnaJqmJ1X$^uQffm zD93cuu3sMP7>iELt%i)L<-)_Lvk$MmJ~9FjwVcT9%xfEzdH9md1oOnAf8jD@Kk__8 z#1`y*Y+bf0%%1}uNOVXZI6;L1zm!C=4CH;ySQ1ZLjb3?p#b zt2#kg@g$oYeEN$hu2KqGcZuqo#<~dftcOnv;XTxHDQWV~-bGTV1KcWlb*iyoNcM^G zkftqUq3rzV(NMEpHvH|)o7*w+hf;d~4UA~K!#D*OO;ojcrZ30LTIExwKG89jC)*EA zeq^UOSw?=L$9X8x^H1iQq^uAbE)cX1pCq!&<>D+5k{C31Ch~kh<)OX8>!FW^L! z_Gy`oa@o!>D^6i72Wc{0wU65pHsat|}kA8k1ZE8Yb2vjEPRq-dXO{z&|#TVLdlj9M_SPYj&3P!yL3m0&3m?GfFDu zrJnN`n{ED_3|co@+jYPEA!d8s0!(8|`9x;iY^!SO1Olv+B@0u~EVAajJ7|Xjf9PZ1 zoJ*>bYvTzysX~j;(x?*ZUt5PXWs$kd(CS z)#J#0*N_2=@!YV!c0P{*^M7M~vN}wN2;EQU`>qG0s4%0Yq)Tq5?x}GBPLf`pu-ohf zstyR&C8a&?s4nGQeIRDDm8v>Pm{>0Nz}D3tbLayC)Y3RHAq)Cc`TrUGd1i@F9fZp!? zE~YOzBYOnWb*NB-Ze&Yv8tiZv5CxZUd6w&!v!%=7flHt~t;k>h<^48o{}Yf;wAdG5 z3>VDN1Lc})%5|H&F`p#dJUq7>EwQ67+o!`#hFv9JF$bw2%RB(Cinrp=tuW~zkQc&R zPdiTEYrEd6@qP4ZBZAhKK^sS|o)?^caemDqiEhw_ro>_BW1s?bYC?3oaxwS6u}JI& z$4p~xwZf;`-{stlM>)5j;j6dn8f1OQ@@NoU?(7!1rj3h=3Xgi9)qLvtZVFrQ+Kf=r zTv`ThaqQ>uNi-0&C+GVxCy0%Lvf8AD!59>^>7-4mrP$j>dP1THSw%?O77a>kga-td z%AcnQFv>}<OIzeU8$i&XpdT-Pw)n`Mc=tAY!zLJ5s7c=T0YV?HL4^~L?_JVZuYg6gFwT?+_2q*(iVM(;4HMHd=;7MQB*+Jf#n+5wxI-zQ`? zO#D*wB1ZAXL!OWv<-_oS19{E$ICU0x7nBy?B0Cmzx?YKl7R%Fq`D;J-7@Yuom9z%( zIs%@VpNh`N3pfu%p7f;yD_lUg2} z;0*xCSphT6dUrZD_n3TX!csrksh&DxCiD7{(bHP~9wABRw&ePx{dXWI_g&PX=~>%N zHakZ*ttyU$kjjyS>-Q7ncQePlBT9-Kf;e>eduy%!Zg23PaBp|ZX4FHcrKJ^<9Q}6B zhKr!kPs`JT{$lsW%*%7b766Hl4aB&~>C3wn&Vszx2%^Y|^FbVDDE)u{;Bg+8dGgKB_BcNpdE+%xmFvOpe zckwCzH&%7cbqLtKFspa{YQYaNK2lcz|D14&*cET{m|AX580NM+;$daBa>Yf!>$-&J z1)D0QmBj*q2KqS&3k~%**^fn5C-~Wjaz!AMdOmnA#oUYQu@xx6ujjDs>q_{qb-H9{Rt3%woAGVdtfo|*?O z@HPBx$Fg+7X{@Zs2t+CBjj@H(rwy@*D1orAjw=I}`Pcx6r!@JTtaBbP0Rz`(*6LG@qHcxyT(QVreP# zy@+#}^?BKAZGluTmlHT%bBySmI>-k^_7Jx<8G|I22N-m;bGUZ_0@J~BxF1*530JW+ zQ9gplQt?m)BIRQHU525({uu2CGZ6()%6SvciJ>9-5yN3z|SJG7En)Y?76oW5sM-svxZ7WEXt@>>4o4^V5La#18rZf2U)p(#AT~MKs zB#~#T%T9`_xhIkv#>JVeZ1>4Z$X`mEm>@I*Ju9A1YFLopWCVB$wEHFO9#}U$?t%OK zO&NvdhF-i#R4mnCr!v_CADZ>gD>A4}mcMfPw=JFxwSDfHvJ1SSviA=PR1he!_h8ZjZ#w z>89HE)o#Per}kR>)7*@eiojAj*&Neu9D)8os8PU$pQUn>AQ(PtY*Z1Z68bm;+$%({ z92qx<^vZhXimb3nDR~Ylj9U-MWg0dZJvAko&@Gi(ez%zMlPf?~2a|WNrS2Ew8Zh+> zb#Y9goB3aBS9~EMF7e=Hg^ay4P1;RfMZ-DJnWwBlDF{8P8;rt#$7~tmi#pcVM~yzr z9rUeYQ8ItP6(mBV;ynW|ckpE}i?~vyWQH@l_KwgIL1oXSKm92QP)WH;)2{2Y^j*CN z7d>n(+05AaF9=UZqXfZ8@BtR+5e{HAe%4I(QWzp+ttFZXe)A1cUZhhk!tZ)_?o_KZ z-7y-08Ct2ZM$FG@(n6(!p7wsF@u`NE5;2?mjC7_qed97%T6M1!RKf+5x89yTgU76Q zwOh*z^#wfr<~USDqu9Fytau*=-Hv|ZqRcjASX3V?j;hu$DTbj$l89D@m=uHi;pNYnfvCwXpA19SdWa+}AMy+gjh563wFrWinP4 z$R5x`?c{3$uVq@LfzHr*qx;#^+=M}#BG+d(+^!EMlq-ivk5*l3fwHP(z1Gl49$80H zX83njFv>WcVd;MdlpPCK714{eniQ%eU=tI71jyh}i`6ForHfc;Sn2IKJFC3n>|59O}n z>?&MhIUpM5;2(q(pihO9w<46Wj@f84F+=reAhmYl91^SdkpQcI29>-ZNw&zJ)Ot?*u#FPcVN>g|LgsN;_DMY*vW?qygqyK{eZs*nkfluo1D* zL`NiT-J*yt&XY%(5JAU5HXr#PusAyaWeDJ1qtdLDZ1xF!e1F*2(q{9nCoSx-+_K1c zr*qje0IF6y%qj!SP`VE+8ZLa({B4eL)`Io|kAs;)D!)(>xjIRODKIh9S;S|;acF-V zrT9}Ir@0veApMjUKDIm0k}G*8cx#u`WLw?n)$0)1hkaY8_A6kU;!~U(R94W@Zxbbw zC~7NL+S=5xCJOd6S*S&V`z~<1>SpJ`ZQkuv0#Zl%(t26hu%!0qIEYT^rfqI6E$>Q% zE2yr8tM6g z!3<1MKvn*!lJ=3A7*Audjg;J+Z(ciEgmJ@Ie_vOd)~G{fgjASlQ#*y(?Ga}HgL1)} zcvhX%i-5?iDGhD(wTzBBZ)@`1w|AFKHut42q)=(0<|66@LFjORpov(J((!=vhzq89 z^o_4FNKG%S+6G4Dcik$#5U&ou*iHkXz1FU3C-5OZshcROUY?Zvt0EDq()}xf)a*x+FX-Dl3k+UQMF z*X?V6ue;5o@&S7^3xBFt)+^B<(UgLvvAG=%^cBST*dn9GAL=>L-LaUwkj_@ooJLfm zMJTR|tOuiq&4?SH$_h-0f15^LsuqcGww=R`(WRm|2$^hZmjIic-ktjGQ;Hy&e*8zj zYJdzxA5jZ764x|}a&(Ud#cGFbeJBp&awawdsvSkR@Ig()uIQM2f;sym(_HoYTB;RO zEMH0=nKtpcC-Nm?V%g@OzJoWPC}D09&_RD9VnkS}jxX?D`6^sM>#<~BVuJRcDu4U~ zWJI`D`UTmm?m3Z~m~UnGjTJLqx`>c1blj`N)C9mp-D<;Au z5A;S!@);)yf3v=0e(BO1Fu!$nf#T3GQ{5J*8yyPOM3LVH?jK6WUst)ya|=~)=7omP_{oCz)yGudR2pvRi+la0gP;WR|mS zku>>A&7o4ko&xqX!Tt_oXr)fL;+9mSObErz^7P-4iWHlsbDQhkbbxONy3&TrznFhqV6ivE;xW4=!b7x2 zOiXK9vL2#bzcPh*VoxSRU^;1F#&s32qE_FFDq|O+wdcZ(%Xu<5i8+QP;gPUhnZ{Jj zUZB3;X7(f-u8`{G%5@3XUFDSZ764QGM%w;pV4Yx-4Jc0K-7PzRQ3xv=VY~wN|MH&| zc@TWk#qmN%e!sXMHn!`w)z0)bqFCQZJ+z8t)eo1_f*8`8dIjXp5#e^!BS3R)XBcSl z>%bggU-JmuI=dv|_waP?I3%Fs+u6$}cOL$cvca+<*%0zI-B3>Cjs~5PiipSPn`cv> zJb|R$1p{?{y3fET_n*_I;XXTEyfV+UTDm!oOlWtUmdS^~EyrWns2?bZuM*zkI z+%-Y;X!!1dZme5!*tJwHS_|esuhYRMoB@y;H2nE^Ki$$iYSmrIo#{yXYL<}{nw}O$ zbTJUei-}7kBS=j*PD?{{j(Ah9E(@XirIdPnx*apWuzGVO6`xN62*zYD4^;s56Lpnh zdyCqYFsJ>6c@k{>Prbu@$)9rqm;Mg5mdhYYLLCS)yNy|F$+biaMgTZ?IUlxIlC?)M z+r6Rm9Wf*77h4+UbvE|nnz;-*Y12La`8m-sIBQvP#+ctK+004lS? z!9H$h_NN7OkBxgZx~!MHUJ&9B_+BTBxuFocLv1cZK_K>pphgo9z&y#wJ^Cg$>n$>_ zVlOhC-ja!pEJICUL@iC;l-_uR=+()G-{lVm8_5C@DVzojAa_z)X{%&g@Va1Iov$m{ z++4505ClCd2!TAHgZJK-UzOR?!{2?!XtIZc800+h7v zi3~7$4{zrvk>*h_3HT>oOf^1~)D;oCU8^JxSf=P{>melr?%a528gu?ONfeLS!yixa zdrwgQ=0EfPNoqB8NhUEy0zNiH)Q$ih@%_4R;6vk&yGqfR#3xE2kOyIV`<(;}vMcVZ zJ#%xWVH77#eiU#+#b#P%<9KR-aND9ZF;eQIJ2V~i7bZ0)TKTv`_T6XxT9T5X!-?~t zukmUlF%+qqgs$Z)aXTAX4xyXejH`5(3vzU_EFx*NNvmGV$u(>zX}hJNuAjKYg`2K zUk60ml!P_8{8k%09(8aID@o^t0lls9vrSJ9maO9aDEZU$Q^(a1{02m?MDirxaEW&6 z*)pS7@%S|}h}QcV03GFeZI;F zZY4Bw+QaEGOM%(*(4*)8;G$HNk%Jm$#F7Oh6p|XP#=trcznvqtZq~$w9qS3AO}VtQ zK{*%#jtTv|nYERIx|M;cF$#WJCD_&tok8s#E<7%lZuGB~!|)amS#V#DuBjMWEs zZi$JGQwVoIGrVmU%<4!G(1~Q4>9k84O_3_?i#71(WHep?X@$k-YL}YM~Qq_SyL(PhavWk@V*1(5j_Avw~vid(^Pm~ftq%egnih=v#-KtI45n8~i#5n{7bn?Hu zYe4k4zw?tOE=A?Vz>`vjOktZb4Nja-p`>DlzZ+7tqimHKI(Y3JB?;GLo48%KPp`(e z`pr4dHx39zn2D{$Z+>Y+t#*SCX{_&6BMUxZj_fEgLe=zb`Wr$++Aof2N!_P7CJE(e zuTvu`wxE+hH2I${y{WXE+Q;pQhxd#?q9(GpV%sO)<0h{xu{XP;X5xfDm~6jwWc65; z*);SBOVfVtdTYN1=kCrJLXi&AO87T%sBzH%1OD~j8HGH2gCzhlK+eC3{pqu8dwNay z$zlarhyy1oJxxNC0!ltYWhgm#1!icIZ+G)8yMjDWvsdWj1E)48D9q zVv{tYfRMoS^b&9(N^Ls^R4L6Y_J&KFQ2-bbFo+}ZHxfH}(-S`DIoC4g*fXi544Qsv)Sjl?h_UYZS3&$;JeAnL+gA& za+z_OpCQsd&u!ly7tHwC_Y=VD*BNxG7V(aM5Wd&DC*$*03CIfV)BS&2;Ij<}An1@V zCdUI5sw<3XfU+l9zifMd-T$c>;8WmNv{=brFnV_+%SNCv1d=m|09~<$e2k9$nKIr3 zR8doV+g}uz|IJBF4*65{%WtJP698t_!d46bPve;dAJa@6pAUncvt9UCE-%Aq9MqGG zZ7GX1FZrt8YNM!+SaMsu<=7wO!F{RLfDN~KjmoDBEaI3MqboIFb>sFaHD)AvM9cVE ztvWdxn$b!XeN%bZS`xeqD)SkQwFORT+4cAr$nK3?6FoR>MMx?CfQQ6-w}iDE~Y^W$P!e z&spH7kix$4<{A^K=|Dy6+mwmS(n=i%Cmr_U)FAyItzJiC{nWnpo8{K5;<4|vvliBJ zMt*UQLhz0ZKAWfQi-(Fc*xK`cHGuiwj>$RgoPpC_M0~}!-;V%)>P-IvyZeLfvhUt5 zlW9U#uBu@pIE%Zk%l?YiO&v2K_Mg?GM~@DeflL_^B+n9~+bL{qp)f+WqHhNV8E-F7JqNOe4I`hKf z=Q_H^jR?s$CQ(lLp#DfFdsrExP)_7+tpN4$=lyfAeJ8{|_vnN{85R9Y5&R9vChlWl z^!+X{=$ftpq3798VG~x}UQjK%jb!q3w8gk>Up6+R2XA*rm68J}CffXKg(^^gU1I?e z>S8&}0Hgx9NqC=+NOMK&;A1l&^v`Clz}@1N;nsOPtg6qX>+1-fvRSmt4vE~`6kt?Q zlIeSIqjK;Y0J8Quh|lz0d0r}yio4Bd<_Zh{-$&%_m2e$cEj)*?Pz${JjHO@J0epN{ewwhoMfEir>DBi#y1F+7qOgyr6DPrHUUDh6oP_0*<4IwxyC)2 z24VrKWUe14*h zz^$jHPWkudDk{uz3sFbV{wDm};Z@D;^Gx~O7fImRe{Ds*IbbEtTB_QbTAfHSub`A3 zc80gmc=#Er-8!(4`_6DSRJ~?+umsoY{wnEW2#pyldaSLQYrEqaR!3lVX^$gHX`0|( zV^sdYbVVj`uNHu~!U~F~8o-8qEfzA&oXNg0{qMfnt5{$TGBZsjTY3Rln=aWUVdV;<$Anp**YQb)F0@6OWe_*3tSmV!tON-6Qt}zHHb-E9G#Vi1tJUQH!>>i2i;vn zOA1fq0_T?;(F?_lggChPMR?rB%;yaAHujctX3ZT5HI_+&0XZ=a^q&(ewub3a(bR(w zF|?QOINgUWX&R5fQ%&-Ak#J#hI6%$S*YXqT5m*t0~WoeEN^@ZMku z$c+687@uoWLK`nFwIdDkfb!G<*^=d0!H2a#-jLvFmX@*MM`Q`B-%(>)8Q6yeBOTW4 zUT3g~9Z`$Kt(qYdlcDTjMmnc8lDPaiT*BqkZbc%*9iCfd5(EE!r>?M?&+Y02TkI0Z z>dp5Y`J9)6A;fsa$wEDiuo%gQ@G%!U*DLpe5&5+YVw69)@JJLlw(!)|;*IUP*w9p= zu_M%`$cy-TC~B^_)w$w$DM5GWc)!kawgE>7I($J5qoDT}tephDGcQA=boU(!x&zCf z*@=S2Y{ZCtIIi|$72b!OK|KH63QOBk^B*&(?$1%3c=S)XN4T zy^zL$pwdr=O~4dXkk#L2bGUw(jVvoEV$$p(=!21$Ts)uwf3n!F(syj#3*Jmm={Uj4 z80uc=e@SWD4SHj)cTN$z?I$Pf4rb403r-cP3WhwXyQ){Ov)&~~43hQEf(%iWTVR^( z8K#PyI@;mm7AUK;Z6~_h*X~CCe4&#J3u@waLFa4Knogw9cxp0^T9M!$RO*zQsR{Zq zM%D5Q*VtnF>R5?`&v}4Wv0Al>&ewEBUa^;vhroS0do_-OAxAH8T~ySxl6kAv!R~hwduw)jpPmP zmQrO-vZP&|(d_36-FoP-NZ071N7k`R_zQnVCb<`y9Be1 z^$9xiF(;(3BX@)UDsbfSfR8;|crsk2d-RHXtA&!i7jn7JoHfP$*f8R|8{9}f8YrGJ z>qunsH5b3#W2cnL8L)sz*`Te)FS>O1kax}7BMi3KYqMC#unmAdI5zm+I~E(BA5Ct4 zfJ}hm>L0@%l7<1ocLmShFPuAaL>cf5rn_|N*Ti4W;1(Q^BCcuHyEX!PwxJ4^irPM? zy=-zu#zS!EyrNpY7el}bF|brw2V|vBC2i!&9=IO+7&p~zgD;Q!nZ{BPj1IH=5$)|c zWhFc!JU*tfVZeuSKJKs0NIyX|U@|~;J|n7Hi7E6#pESjw{%MlTBrrDawb?^h*(dF` z^0!xEjG!f5%R3~nsEQ#1udv*Sp{dFg@X6Tt2jWAkQrMQzf`44vx~=V_cU=iis)1c5 zHSE;G9{-@R#Rn`@5UlsZQ@Ed{%aU=aW&QZ{+coqc^{m=uPd1N83k33i!zzw-P`i2@ zQ~eiH>gi55q$#~&0lNE2=gpsxfl)#!eiJ*LJx&|faG8HRUkiPDq4{-DYBGdYONR4V z-qj>l>Ep>nL|UnqNV|$&u%CmLRNmlnW{~D>W@f&88e}5(*PYb)*BOg4>;srTaxXOC zwgY7;tiXh+VCm0eWc%(B>p@&J8328s`5G?s(JFRGTlZ;SNfS{ zH7K|vve;`1@7@Mg86rX(9`gyv&!V3kp6M{v{1ZA1$cS_s^$i)vTtdL<3P&`q-)MO2 zaD%{9Pga+V1+%LFpAFUAf%^-2p&s-1w4Sx%Bs|s>7e~=&P(he3FH^oC0H!p)JwCh0Icd!Qs0Bv+%Ae0ieYi2xX}{S2z)T4im{}!# zf9Q`VaR78%djr|z=E@%(qxPiBFQLuV1aKNhQxtm95nw*jyR1YZM(v12vGpcA%vuXN zHaGp?+AyvR+HAszRsC9BhvrB`qCtIUYWZsl5d^mhSaa?SCy*a9(@$gU$iY=^4-}lw z_wpN#*RhKO9qpW>9-8-}yj0P{y)Iv>4?as~LXZ;<{}7Y-ad=ty3(fzPC`J#d{CwW~nlLU_ zz>kIVgMq+h#3fVslC<{X2SDNshABpLp-aC-J-52rOUo8?`NK&!F*n|rveDexMsgL9eK`FP^ILyX-FLZYtjW7y?`+((GCQ5 z$1U5U4bJ;N!8|g6;u4m=3c>QkwH3@tB>m}sdILb>m0Ejfk6Q(TDK~nQ2wIgh-AG*6 z@;7!6e{1Tc954DdFrZmy@R2W^1wj-t9AKJC#JS*w)&4AmTs6U44(=2g6>QOZhGd|( z%dH^yPbSt(&P12j)z>GfI|#?9mn_Y%K}UkoY;V=;bw^?fFBaE|EGJ3*jT9Y!}$i{c8ie&3xk3K*%`$HKQ_(|o zPOPCUkI$Yy@XQuUU`w!+lod~LHb-2T(K(6yH=0a%22=@v|7bsAM`Xl=JYP%c1+LfG z`|`(6MsHUu^qQ09tLmc^@3?vQPVB7v7nvcQdTgNm_hU-$t6B2`v1tjQlYbq-B0mc( zgo$k95Ww-*HPnxax8ra8>6rsg{j=zRLGyz1^YcD%cS$d}zI9m7gDCB0?nv}wauS*> zE5`(%rkK!g8(wEW{FR#p6ibswY$gi4Y{z4;xB z9$IG#sbb2HQNY^CWTec8(M7RUA{c2u&$61j@UlgH1!c4V{uMJSKT#t}>L`t?qN=ET zZ|&q4zSn6OX~}hus8b=N49jD}B&S0{#WKq(yL$T#k33vV*6!af-5#>5$(jG$o@GvY+NC)T3yC0=;4akn0?S|Zn(e=S_C@EgGBHVm(K5NHLkF72cHkMFT z53{8xCRU_eh{dK&hkYAnN8xKKyTAncoB;MdxHzu#iW}WOvmTRHNL4qS!zgyP`hqk` zT}J6PBmg^ZCqGM&BkZ#*8GYObJcxj&Fj4SJZ6`vaU#~`~)MA#VJT~g*$?b5IltrKY zaqC|*ou!aUD8ltKvU2keSQjP)Mp$52CwcN1_*zFF0`b7iE5fb!5SBN=>~Mwy z(kHnK7-GhFJb%ea8B-F!mM!ulmpOWXL=Tw}H!gnyBQ_wx|@k&gAo=($%5``2+&^|I2MG9qUb;|8^ z-~Gw08mhts6CMc5yq-~YY7yu*q-vK?=Zj_Z=P1-e57nTrF=Fw>NxRU=6cW`X_7ubx z@u8;>HHyn@SN#8L1s$QU@acBdF!BuNNK|+-@-b#g1Hg@qT_6Ia=Y^x6m)99~9>)3#z1YeSS zQiDN?Cof~Sh|f3Y(W!g&pmwKzJx!dQ0v$9PDIB3{BD4fLrzNncc&bvAgzrMZ6wIPJ zpCz&~e)U>7*&MLYQ5f|*SlGCXatuI2D-XLb6Wcrb1lQ~9 zd4K4E2gqoH`kS}3k?&JG?L>Rr;1bj(24Tr`0#*LKEj%Viz+ke9M3ZKVn=`CEjh7p@iZ=)Mf@PNh-;j^ zO=jo*`wLDL*M%d!Z?S>KEZfC<$S+ye!S+!3qVES8#fr~jYkmfkz|Q`vf>X09ia**; zvn7O*@X}w>8B)hk(1D`eh{Koy>vRUg%QK$;GTHhUz@IxloKbBnM~bnaCbs=%)S&NY zrDLY<+u=lYT97D~j`8-{*#MQv9Ll-Z3<;tqu_{R=1jIAnGvd7!Gd25QiVDHngDk zbr%XxT=YR`5ib_wQwN= z+QK^Pc6`y@YdEy?BSmMwBG9-T6o@_cU~Z!#y9956?eLveAM#ANGP&!C!S|tQxb7vT zztcCc0u;EoNiqHA%WfURF%BatP?_z5y>C1jYyjdYeq3V}Dnt(t-VVr#?;Q~H*8Olj z7PPdWSvn+*zOPU-6v%QkS|^N7TautroaCU24XcII>^Lrnq-^HO4j2h^om7kllW|ur4wKQXXc;%o2@QG<$ zyS1gFqM-`-IvB~%z+sKL{LBv_q=6+atavsRwt6;{FHvl3@5|D^8?{FbXkwO4c2 zC?)~8H%Zj#_Rnk?jXb5zMK|mQUldh0vdRp~E~Q{OF`Ey7FbCmuCY$iCM4R=0+*cjc zkTH${1%7Sd1Ib_0Y3z)XiabW$7^hCL%#$lY5Ac6ZZWn1uk7|pi^8yO<+4&qGvl$*dZVHhml zvjdOULAn_l4WA*pTeq>Yh3&_{8g~X#5m#XmSi3CZZu5+m@wAj-#V7T8Z;R6@j0HF{ zC>$duT=W7)@#0~r|J8Rx64I2&W%yrx*FxKj72(gz8y^_ZD3!1Y#Jw*nZ(f*cEL)6} zc+{fm*liJKeMDa!G+rFnY5Z-U9xM{6ywIc&yTj`OTY^(eV84*4Gf99E63lbnd zWVnN^YQ7Ir*?m0!iv984rgGNzf}R+u?2CYcTQUEazaHp;IIYkkWpgG_Erp8t5bo_`Wr~lrxF`;RfK3W4_8?tYOXgVZ*n%6 z_}=UCKc1Go@F6U62bmX=7JLhm(=mIZ`g^{e)FQ_(o(IA^^Tu0(lvYX|K_t!Ts}5Zw zPR#fvT1nc-!)hNV;eU_#OSE(U`7H8|-jscH9b^LJsdasC5lE4j$0g`|G8>TRTq0%W zdQc^tk(ur`(S9o-NN~aO8&KC%W`}W^^<_YHv87#IIl1G{4)L}j-C+qrp-bJH#ER6> z@MBvFScjC5@e$S<)l~%l|~=V!p~K zpe=DX$Qn4l4lH0wdXL@z_ShpCLr#9F-E}>cXS&jZjYrQqM3ckZhlgmNqW^M=&OBI_ zbT9k1mg!idj%X@zF2jp|Qh*)53BUca|E_Gx&NZknp;}L-s z7nSXS5RZ|2jigy+Eyk%D?L9(5 z3m&_SRdrxMawDv5%I=qGX?%Z8hW-_dEySCp#H+_*9~=?FaOYAW z$nJ7f3~ol1EZajnRuGK-QHd2A%&V1er}CQCqMQP2l^iJM>H@97V0;3;&&=1-(Eqx{ z1!dW;9uAj|dco~xWDcZ39D3W@@K}K@O4+;K^eK0~#FGWh z^+Qxt=V!fa#G@;tDn1Niu&{flqioC^T#c>EP6=d$QEe=ZU&(%ID6vq$;j5p?dc{+b zczK^x*p#kUqObX?`qL+1_G5S(eL2mxmy*P38VV_xQx9|-Mc=M)b9pF{gl_cy-_klx z16Qb$sV|T+B=d!<_mTsKEo}T#lz*oXDqf@S<8ti|q}T&L_{P?rPQ20Y)Bi=oZG&MP z6E4*5EJnSA1Tr=wu7*jqtiT}}czM4@Pyszk($-Ge1;|gX%c&jSg7k6ZC~2XOWzV|= zF48fVR=88>M^g@W*uV`Irk2H=e~8sOS%ZjQ1@Nw32ZD`uIQ`8VD9f-XrERA~`=<(i zqV|K6(R#3U#%a3q&+Y$kr70E~GLQM}_GLlQh2EV9&Pd*Tl2X1lOY?WhXPQ=h-4CK` z1`1%U#l+-174Mm3k_;(|Z{xGSluvzqZ6vU>VtC|rJ+dahtzudNGqKrLdfXwN>Fup) zD=4Ed{mh=X;|xuWPy*YQm!1`k;KMF0qN(PtP5CF_f~NQxvR+zS)FZ+@ovDw1YhrsB zpT?Bl@RyOI!PZfFiCHJ z(FSUx4jRD;ZNcaHO9K=J>Gi0dDmF-l^BdDF!Ab7~rX{vyN{AH=Q%90``0hWho)Kd? zVk!~d`*0rA?iUP=o{Rons@D}x;NzY`mB1GpU=?7gZPjq{&us%NVNMbG;yTdpJ0Jmrh#|Ol@FB2|6EobfeSi@N zl?kVp>okngegxv>+P1IC-zKzuyNu8*CWveYzmC3^{cGMg_L>v?LZJ4M@UOEsJh zX1EI<56(YC+^(1d=y?SXg-D9&lc}_7%|Qc)7>m1i_=Tslz!^u8>OaHFNz)ja{_SF* ze8qfFAN_KkI%XdNPI4&Hq3=N7c8A?rhC1YinonyA(v*lH5oSKDciR(rn9E6Dje+z` z^gC}?bd;#y^2<4WtV7RcI;i}{5?ITP<7TbpMseAV09o(2fq`ECcXh!V){K?Pr zUCA_mW(6t%%sGUtp@0$>&T)Y$okDZixI%r|xhibwDy=jvctHHO-j9aRUA9tDtT<7| z8r?!UZ%45eKqySvIjagu5neC(65pps=~dS$$BDOl*x0IC+F|NQ%(*e~o-c6gRPte4 zNqHz+dcGw*M9%hO>-!+?p#we}^8=5pT+sh>f6SspE`j7%YkEr1c6Hs{ZbL!U$sxI& zwX3M7!mcDF;EeJF4f}IP#Jn~7a{IA&v(ygKHi@`)hRSH7Rlu4DsQJ0wt zriigJvBb?%nl84&X;o&e26oAT<7%(%)RjmFD`?V0c-lke9#h~~*H@XU@bvX-a+1PiE`T>mC|vo?tUbzJ zAhkV>Jly8y0awqQVQpwsF@K|HPY9|`)2W&lO{`ImkM~)~!17BnN_5T#c)EN)dznkR z!!?S-d@RnRdEA|Els!=HS%+g8ZXxN4aM13m+e|Xu*&97UQ8%ILf~!O@)2^sySvQ0% zG0jMeH4AuoC>Ig$#{A4{vNeYZvBHI9C~!ytXqOY&h_SY1O@`4~TOQC?D{K{tU74lN z$1K9c;J|up(t!@)AU1=MI)ga>V#UU-`gr zr4vWuZpN%h9G7WHHqDFq7tzJoNHnDIZrBPV>2P)&Y;%Qmzah{U2@tM zRo~fFP$V)x74eR~w0Su$;+}y_uhml<)2i`0!1`MFNA6kTT(71z=T%&co546kOt+H}Zu-c8K}rwi_qf8a)162%4JMcxbSNNu5I#>z=84s$fUI*wfCV*Y)Pu${;A523eYp#3rLyYIPi%4)I;6wDBuNOEien_2ER)eCr>Co{sTR>?S zBDWVsVC~=1Mkdkj8ln6Gn^ugPjB5Rb1Vc;uo=W4>eiCifGL0zmd_@0dew5L7Tg#X= zk^*qwX!m+W>Jo(5XDxT_RRi=$*4xcGdGK!bEa$swMvqom{(1!J0r_$WK;9I|#`s<0 z0Hp6E^T4bi0w)dj4!D<@K3^E(zak!`F4*Dygxd{=4EliNaY(EsOfL?aUv$3o3oWwk z5O7Xa_Vehi9Wggw+eo`!yf#%jlascfdN4k(8gM=qd@y1n!HzcGo;_ZG_Wr_c-EB~@ z*ow<3QDvKIK1hKoT7c;D^>$Kb3kLc71%%LgP><11u{YLBIrsPzzMN+4zkFIu2jEA3 z!5~FwzwWg+uswkOY5(d6@`JO-+(NY`k=!{kFHd%;S)rptzR;J!0!%CKRtk*A{p0nn z_}+X}SJJ|)6C$n7!0gC3!tA0N(I(f^($qs?Tddcs&D&|U0101>&4}$_(;6Cu_+_I7 zVd$#|Nrt*wj=#5yxG=rLejYQZoTS?xf`P1&UQEwF?Jq+qp>`nSH0%XH$R5|3UoU?6 z+IQ$D%+5!lj1MB~RE5O}w{H4s6ZBJOQ=D>gApRld)D9RkV&WIXr6q;`e}p`G1Zl$thL7y6>b~c z-5LVUiSgb#2#HJtECU#TXfRnK16?QfNH|Ho2l0f4LEL-g;|9%ohGAfCO+bf@YArEiZLYm%H5zSGPro(Pu9h$zKv@;=KTiuL7b z=JY%oy2FsofD^GhE+;Eng_cC7h_pbsE4Yd;dGK#}oh=JK__+lUo0n$>NN1F%``tuu zfepBu&zy~MaGZl`lVA@19vk2yr}s}2*1+=m*%HoJ8Lu?J0C@+`3VJ`RI+YlbYdSto% zZUS!~Asqu}xBvVbRE`I<4x;BL8LuGxf-7RHXz>-Xag(3G?l$@NeKFzFfys#3Cm)p>w+==?&uw*FTB4fjPJ>2kvgrsxC^Ac^ zRE2jz+?A>5=jfu6D(Sy%fXuG=;P8(_$F-ypqVGDpAh5Ib*e>B)*c13VC|C)KAvw#t zNajeI9)~PeXkc`dR@9K_tJL@GO4yh+7D^a$NA6cCmsQMO3PLT#Z&BNrRVqfRs> zt)(4QsN+NT9`>eiGUJP%8&D7|-&+x1j52+bVe<@n?rUP<4V=S)L?P9lY*{(tA3nxY z5j*S{SkA}|&kAV$4~R+i+NURGbhjzmGZpYLZVB)(2&(z+cA%g6sBR33r+^5j(!dDvjvXn%`Bc zVfJ%&fLoT(O`R9koq>k2eJA{G$#S#ht3U0#AN3Qsbmg-@s2zCa(T`b^;MgaTQw{th zD0cFFD&8sum4V}P0mYS?iU!bUC8x;XQlLr2Vhy3%^|9&b5|bN*hg8-9YeJi{cRFhg z@S?x>itY8T_TUjVbFIDZ5J6Lg0vqzREPWL;rp!dWCzevmZ-r`g*m~(jz37Dr!qo#E zRhfqA38p`a7+U)qKd>(yn>?j2u(ngSSw}E^)BqUp?#t08dXb5TYfz3V)6LIj9<$?b z+)}dJna&au+(N_Fi2^<+$&}SWIr3eKsoJhK1|C z*PWEm^@FP`sjPU3*)nzklNFwW%5|EAABx$1a!O6|xhOKq@mwe9O*MPE z7v30LUIpB{QTU3QQbg;C=rR~dpX}=M$37Se(!&-egy73n&$iMG7Xyl*J!Ln$EH3AW z3R$Q}Ru@7;=TqZ)>L05QS}RCC!2!7B(UR_sW|0gwn-lR{lB;Gd%sB z2YxSaNx%$))YH{Hal24Xzr=!5R`B%ZgBB4>W1{oKFPg2DySg$J{Y&ctxmLqIM2P0d z{@eTm`G2jdNt|w5_7Hg<5NNWbe^d+&>N5yHp(xsH%y3dI6eX8=h%s-}r2`Oy#<&1F zGEp|IW=(#Yh6ZK6OY#ZpFvQ{j3QWC)pV1`6?^KR&I&1$D*~(;BnRfaG{tZn{2*rxf z^5sn6d`W%cyzOQ2b%a(9k_3ASb_J~elr5QzSj*B(_{~ijg)mxNT+YTWOUbXtjiX*ip-Ol_WfX^6!oWH(@ju;MJLXckv?(9I^=~l4E z-KB2&Q#xU0q6a7D>{H&VrM-NR2SUrU5@QqQm-f@N0omA4=dRnmOWOR3drEo&co*IF z3O18@gh{kmbjRD}A3-~P!eN$hCp`C$cA=rSm{U)JcTeLu#d}vb34T9I7$adtM+^r; z%v^qEBu__7%)WxyRBDIxA0VPF-7@h1_8eYE44&)^IVbPoMdI zD17xq0zEsfItLsy!@Nq&1Mp`xfZwh2jP4{Eyl?^y6&vr8LJNBhKHb)-{1Xq9;2d`E zliB0<5>Ut4zD3~W3E3vH(%vU57+6#c)kB{I< z1<~-Vs|RJS+~!c0!1BIsS`^FfSd4OZ>?Ld1Utb1dcsCS-e!MAp{;n-Maq|h{bbtm} zTjiH^L*b&m{JO#r7+ZiVNpc}3z*cCy`PPe%r>Fm1C+V(*bhCdFJ~AqxO#ok1$>a1j z5xW^Jgh}EZhODSV9LH-os|BvDh#3KfOLUdcT=qE!CDcR;u1Whz4Z=zFgi-1M7x82} z20YTqb{qb_r1>Z1tZRm8ZiB3ZS6Pu1PSNgY%N&)HamS(1`-KuY0J^n~1GgB!l#!*) z3kNnKrx`ejM0EJZU-0C@-aeB8;;p;t7Uu%7u2bmQDd zW}v5dJxC?6lk@1}=MZ_Z*jmqizo?74d+#5h)v@tk1up(AbI0# z_i6u7ODvqI;Vq z4|yad%ej?$qUw>Wlx%p>F(#+T-yK`MX^3<7Kd&5i=xL5ZeCQmMTq(o5H-%;Yuj%G? zUM&I;f7C>{`g5dr+8%~(ipdTG3yG_0t)UpAm-5EYFEMA&hMcvnbkCG6`ptzuj+uUyZ^si+d6jq{S~ z$#%IFl)NNQ)S?JEi3Z5j>rTE5K`O9C;V(MXe=6z~hvz;sY8S zVzhs~Xq6PK$l+W_(BqtvQ|tGjpK*j?+CSqMZP&OwEG3$N@2_+*`&@a)psQ>nAeTXd zxHasv2bKFdZ~f%T=-Pzpj&2$WWIDMw8@PmNF5{g@)V~s|3Mh64+EV(b0hfUjmDcel z(Ke2ewVhPH%tl#n!0O(BO6X+$?3+9DY7+LNj-ul=5YjE<3iOb4I=L94uz%G zW2xulDvt_FPQQF@K`1r7mNF^{e}BQn>%EB?hEc2!(h@}lz2Sy20xbooZ-?rm=9sEp z&xo_maV*&42eGaJB0ASV12%1e8?r7BM4fw>#*2E6_QoOFuAF%=+DRE3aeOvn9*{qJ}s{Onm?@#ck64$ z8l9||7GUEJmlCXlw0iR_LgwRe3LC7K$Oy=!b%VNIUt!l<)22YABdpHY@VIkpQkK>*HkRAp~3i4OL- z(`0SO4m59`rZyAfyG3AlJpG$_=vedrLua2|tSYClhjsN|C!ogFmq~P@m2AjzKC^Pw z{0gQIFal|vO3yvHN8ivhqAU@#mkYh*mFb+BX=a~WsrK>==TZsjpDZSg8WfaO6<^9l zKYNnqL*VTBfCn*&66@rk2)uT9vq%$fsBky9?a_);kv)9F4C&@C zgY{l63s(YgJ3El8Eu424Qz%NUG#hOPY4Q$?(}~+~+Pa>VCz%9H*Z<|*rNosM4Vsku zbCfAvs?uSweC5cG#~=2i;9f8Ld?vR6U94tBW>lJULtL%>$Su*xEnB18dwRVcz z9gSt|w1`Rp(-TRn_*IcQRGgmcY*ABTPwOc~rlr}(TsT;LowW|0H1yLvIG%7I#?TC5 zZpwuy$3S>0qNldqe#95cP>m%j-`cQYB{r`nqQJ2r+!64_MI;t>zLE=R3|Yo49ZUaQ zj`}0t`i{ATpxl7(ER_o7zrG9)8(?%0p$eBAAQm3H<>oD1_8E_*xkS=RH z_kZXnmO-6z8K@7AdpO+b(H$yBM+*Q36P*k=gj%T*uu5J0+VfS}3PL zAlIZFc4!>JP#v); z<*>TPHB`6D8Vc-KB0I~8yu8s`<8{N06x7Gmn85~r@+TC^J`2y5FEN;qZwE547XY}E zRrK2^IIW`g-J$7%7a~XepBTJSK+(^MzQv`cB%qSWL4l>2C_o>U#B8_4`h^0U>qVUY zz@8@CPExfTM-I6oTn4Um^^P3*N9ft0tC3wEF5^k}PA9S^K+vAs)MYmP-Ahh^C@CuX z1Sv04B3Q#`_>+OQq**Bieg)A$ysNMA-gT1|(PM;GI1obV|8ry$oKu%1KcXDIR(~k=8?A zS2qjb`Yc)q)d#J}6N?mcDjrkxA~GRzN5|YzM07gm=b%QefBX*l(tfjXJ zw|%1`i0q1iDY2&vo}{fV=7(M)Wu16v1`Fc#R2=o*I-qBadnl^Oh*-QPuASvn1?-Lz zyGp~7qvon!Fp?LQ!yWG$(;74nwka6JDB`yf?)-oNd5j7HVFfGXm?!RiV@=(D@OZF- z=jy0S8l_Ir+QqZcTL1re00? zS2-77W%vJ_Wx9o7uLN73&zOR#e|s)(!OG3u^3mP$tCGr>?&VS1%0FPfi)SkzL*n5Q zW<9s2FBFVKG|}v`PmN=0hJfjMx{Q^IU+v(ZQ_D6unUVooq#1T0v)dH2@T%UJlES&s zV*YOC9@4VWs@L-~?ld^tW77SSZxufYa{bUGt~h|jllf~>Om7a*EpALzLfZ-NCvx4= z@aM2^YbGasFlgkP#DPVWo8*Ry_}e9!dfLlkjXofE`k-KQ9sHS@J^Dtz!14p`chwv5 zdu&jBJ(7A8Kkc98nwCNM2Bv*f6E)W$>LY6V%|$=i-92J5HA5C_RmTZC?PtuV&+i-= zuGeuSts>_2Decypo=i$)1)F@;qx z(=KyUz-DBWr};UOfx2`Iz%#3@3p0>0$@~O<^o+wkuDc_ka53=7=|raZ`O|MZr7&*P z15th4f*6WcnVTXc;%Pos43C!dK;VrpHL;N8T5=YyXJotC3WB1h3v#+>AE=;|V;k zktFhY1xzicd!z8TLqYP?==MXC|wM@vbb`ItSk4;r1Ljs|-(sQ#M{vG6c7}R-Z2bcxfPi_C%?;r>7nZ-K z4eQ|)zh>%dQ;@7)Zc_~mih54+wY+wkQo*KAz}9P2V|uJ+BmRrtP@Hcxm`ZyBZjsQi z`}S>j^%TVcqxpB`JYJ2!rYFsd#rS9c@`Y}FM=N%LwLFN7PCuuf>d8F~`RTdccV-;8 z6LZ{c5HoBHQq=I9(g;_3G6P{vFu9)O&{>wO$aMAvyB$wWC z=eW=uG-wz2MT$FzVgPQ_)VFA91Z~>hvyHKz>9#hQjN;aImCgE?t;+&|<$hUSBeQ;yn%aEBcl9ndGAp zolZIQZq;nKP0Hc)a@MzDlNvJLM0}yNG%?L?9Xwh8bH-!k#GCWXyeS8V>6jvFQO!BC6Ju5`&80wNX=CdBV&pv#cbd;CJJb_g%(;r9403 z@QSZx7eTx)C#lN259-5fPm|B<8M(q!x_EjYN3DRnoovIu)_iffuJ|hA0Hqc{Zv=Zn zY&XwyAw!w4N-!5}?@Qu#-!ASqQ+*INqCEq^dAU%A#tf^2N}7qk{>Wtb=-|ood1jXT z4B%2$)UTeEDV8j<9-Q<`Rom|)(N++v4J7ikv?5N0&otlkV9^>vl}$#hX`GHtR=j%j|Lhw99CSMt4W4quX(zMzQ zm*QNYZ~>x-`1U#zFUZQB|Blx!l*|}-9|2qehNQfy5+kM6yEgC8K1>pv>a}tHaGdGA zl3@ZvS15}wjAGu<2S5z)F#>{_2F`Y|-Ie)O)qz|O_&ouZ7w)bTkXpuFm|0>9fmV7L z?ABWrle?Xe!JmS{{5qeOk6WOFo~0i9@XC3~t8r~=UcZbov936MCc4rs<-t~cG2ry{ z+|@+qg8#5UxOW!wprR1WWV+c+gg~Bu)i_)Nt8%741yAi94@gcS1YS5%+i!_L-26D# z0pqeYn{>|MIq>Ait+9M!d+kHMS5U%>O2;7q)PmwM_;B3jDwG5C!Wio$0ybMXuqna!GvKJHs5#y$gGZyEU&xzBDxqE00_ z?jy$^0{ma(9RbfJHK`r3J+p(ZoQoQ}fHt^02Y@CiLz+~^+FB$hng0kDSK|RyM&M4s z%~xy!j8qPsgZb?BnTkaygF#N{;11N)>vI1lCGrkor!OHRCGz_VRt9 zE@HdGbt%sctel=w^v9prr7vGX-5v=!y9*SM+!*A}t|rF`?NeTPY;1~1OC9bx6XRYd zXfc@*fVT4T^e!ORj(fm}(O)qCmFaPQ{K)S0+pXd$SvRM9ak5wv%a`L#Hv)lDed2HO zdPIRSzPTh{t;_BX%$moE^ZG;3-#L3@8#l&AAK$2d@6pdL^MAVC)(gC=TB)}WxvcEG z67UE)!nD3swHQCo-~o8^_Oy%>el2?|a4qHzh9Jp!+e%3EvHm?&Jwt>5^lnqzR`VFW zp}i5WhiLMD+UTbRozY$c$xLW?@z+J3%0P$y)Y4+96Q$}V%PK4ciAF<5(}Y=);FU#M zJ20o0f{c1p3I~_Ox!YxQqy0{Ij%7wQ)*9&Y3pDQo;$OW$#tz`vOA)x}utmF9h%ndj zFbyBE@xBkg4oDnwT-~KgFJMbdP6dj4?`G$CkJM^_khd$(-87lN!*PkLy6PbNoc2rL zqHvpwv)yczA7`3euNr3Rdg~^Mx{W~b$ikXF@&X!@BQ@s)e-qt|jIfsA1zp`QK*7tDEspci zTE{~5IiKCnL(^VGQBvyS?nH?bX?P3l%n(9vNRwzYQKu(xK?lCIca~# zu5)(`pb~D19vU&H+);&i*L6KxO^_mT1@X5*?*KYj;LLF& z9N09MqTo-rBG)za7kj9Xjt-#Mqc?FJBHSL65N#rYoh}UuMe3UgnMre9u0=)T*_nSQjGxj&NabimI|#BqUMcVgQ>AawsC zGh2NlkxrpR7(CL(p-`~sVu-A6z*1<^s+bc^Wd9x-)Da@s=Y}|XYKYH2&-%QuxSL(< zATPp&v8_Y>}fGs8#uw0-wC`yoKPkfwcm)q2?q2AU?IUecxGX2cn?K_ z(&*Z`gLWr1WU~_mZcL8nn?UZE;m~5}6n;M_y48#e$&9f+405k`&PEPp-ce~*Tr}6P zwE`p}TCUeeC&AN+xOv%6EOnS4RKXwjfZP)^xJ5vXY4q&|PC~=S^fkEY<=k{(2y8~n z<0n}6`i!W&L*PY74kmFcSN#t~(rOdbjQBSinvok~9Mo?lgSY;2m-a4Vrs*8SY|xw& zaL(jYZSe0<16?hUW8!Aw5;wN4`6E#|>j^S_Ct$y}Te2!5A7f`%%`?Dq-Nb)xZ##`HvWGU5|HA`@EwXc(V)cpG0d3|K6UqFdwwxC@g@#eZSl&Gy@2AR zYA`X$(HMmlx?}(_L#wiyxzjsC;LAUz$rc7 zwGkhl!4z&VOl>WUU-W|xeLF<-o>@?kk9l{&X?c^RzVbg&TyJQ62exi`J{x;mRRn5h z{^o~=k9Fzxa08-EAf~>9uR&)AW2uS$$>CzDIcn_=%1?E|1ZTA$m8~GEe;MdGnN=A| z!5?TAPEBe{q6ZRUf(#!N_M>g+fwW@SRh@wv8BI(MkFW*r;F;QZ`!TItZcH5PrRi-| zwlB6NVl(uCdw#L=rIvW&pWq09zSJRO1ntSj;b)Vc>*Xq<_$sJ2z$m1&wfy#K}zbP4$?#*J1pm~vO*gYMr zJ873laa?_aNG&2=j2t|#$3W&e=Ne_b;5W;`gSLF%XtT_9qZR$zUz6KalY!}|QgcKY zrBn!YtHvhzjd#T!&2zkDfgNG4KHmEVk%E$cvniGnh5wjEjFO@e`{u1rDSdb-Ia+zi zBAQRoU;;*pKQ!N^EZk1{!6hq}eSlxwnkb=wZgGeHZ578CQqF^D4+z76mXD1nIDB5>2&;koMGD;njzJ+4%zw=9iXqH7;%C2-wpcDd zokt2IoES?Ja|Aa2suMQ}MBX|}CN{h&Dy7dK@A+gfX1@H-0?t+FC}4A1&}!M4hgcMI zFM9V_#n1NwZ5kMPV>iZ`0 zFv=h$WxfGbkq~jRQlk{ntp{Rc(c9c;%Cg^iKnkc6o#nLDn>Ojxn`8uq?cMyLH zSxJxnwa<$a1)DrkkL>yEQ9cd|zht5L?1T*S?@D{C;f7)SHc}`xPw!XkqZI4n-z4i? zh`x$vX84&2+HA#3iFaaSIkm7KJE270vi3$S?p3t%OI4tz>%zRHRs#FL^xDTs$=>UpU>)7+hD$f#qq70*w z`BALuw{+KOR3(G8h^XaG{%4a9>bAP>hXR@kF?$9KrjOgSN4fPLtW1=LV%7-cvqUNd zf~>ohPHs+U0|2h2-Ax}(6Lzm|gf)D47{_0y9%JEU*}~nV_3VQvfjb$jGd^zfPj{7} zV5n%6<7o*nBq#U0Z=57cxqHkYxoRA}HrkY{-v0vorNs-YdfzqDs^6gz(?W76=&+br zzI_E@cuZ)h0_G$AnIm{l{?@Y_(4#5`RdiAqS8x5h##p_t62E^#l1X(s5TdY;r(2OjM{*c{HSW~^r)O~HkD5>!+JfjF|r-pt0Wiw{2t7Jvj*z`Mk?8g z6`LGM#%o4`scLP^T$PqzoOZ9)%WOr_clBX>O`MU)enNVC+BQXL9cW0`g^l)}LQ#Zu z+=GV4`S!GKN1g;8l}~P_VdP?o)es^EA{U}dEvgCOLQZ*}_aX`p^t|Am0z>WZE_rT7 z%H=2~A+ae`v44hqWVe)*sYqW$ala^nmb!u(JE?A`TneCsvpJb4kD($svUVdsfoM(1 zpitr3b+eHNlcHipf-j%SQ17zPK85|PN>6Pw;kqZc{y_p?dz{3y5(C-6esrq2xv17j z>d0C7OvCe!MF`NKb$t@!*acn8Jf#GCkj)fI9s@fV@@~+^iwrkjOVd_jCw$^54HnLo zOT9ElB?cHZ8J?txty`n3x0=3f1siVEpCEE8zFl~0IAAXnqnjrf*xb}7 z_D!r8nOT~3)+C4KS^M{gC@rUg%068BX$ZYnxu=Dm*}=V)^^Erv*=B=E4&~^QQLPS4 zWlUrzt-icOgbwA)=~NC6vKt2m#M3cxG^oh`kjWvHBwx4z-3@%EMQ*yW(9+mGga3aIs)3I77zlmmcclfWv`$Qzk@ z_3DlGY|2osAAsPUTt9YHDz5*ywXRED-698_T6K%Cq?z!NW01o_C>|9PMa#&?p)^~l z*U6*x>thczyrVO~y;54(2&_8$FC4Z~)K80-aN=tZ`ififU<(EUYn#VmX5+Xq0+B)# zl=V&J)rz65I9;P?ZXhuuAg58MgW=TtNu73+55aL9L5+n@iG|9Bhp04y|I><4WP-vje5AjZc^NQgKp7)$QOv0Hrm^X>qH7~ z-&R(D=P2(3G~xs6U)|#VW*H`>58iJPkpMJ{y5@qcjOWu1>1IOE%@}1ZlLX60O5~enQQy$;?qq`3*n!< zzYT*q(eW#Wyur)UZ?LiP+2!PzxMl;(qp^Rt3z_)FNa?l?MN0p3!%Nh;@vp};9LOI6??}?+x_1C8?3t`1luL{ zCiRxbW!jnpSdO%OS0hWkUTnEFcs$t%gCYA{e(6#{TjiWsyOZ4UI; zZbJ7S(2**>cEds=cM604f2)eEXN$3LfAi(l2sy#u9SzoDQ{HobSYbRHldOMvMfJ}3 z9Yp3PShI}v{*Bz zD$}>xS|2tZWplqVAZ@$~*Pco>VYG!XluQFE*fp1_3 z43W==CD<0v^%9gkhYg@FGm#ctTO3^0`^zPos1E!jMGYW% zLD5SPO)4a)iO=!1mfZfe(LXQSqMF*t%LHb6Hkj z^RpSL6;9!?e8MrpX)&ZZFmq6cB0+0^K(Koki_^8>wA25Jm(?K8Xh>w?LFpW$vPFao zyd~+HoA#Wr`!_{*M91OJXne`RGW54fQ|3^fWKWpco%277 z1Da6Mf)EWb$vlKXbvW@Zv7*u*`606x=uRQ3$M37ZLl-#V0QRmP=eWvcrC)~NER72Y z06=iI4K=<_vZ8w>VA0gC5Zj}SCMNi6+Ke`0aNUkbyzshv zxPeR}0pBEM*7@2G%LS7rErvwoq?kUeykn5f>~;!S*P>yS-YoAO=?eGWv;8_T+g}f$ zPHkc@?VH>DP(-t(>WBY|1&Bznqj6PwqJk%UYdlZjrZt@9qYP!H!Ratk%?2pF0Pw#B zKyCsPiuh~9}90y3RuA6!V95TMs3j9A)F5gQl^9}Il7D)^~|{>Qnj z9U48@0|-A~?|S1z_0tLse+^4Aq_bvtAtMAc3@F2K1xX=$+5zSSyN6rT%G$k4?;WzJ z+GdNgQUuh5Ujw|{&em>7F@maVbb>d{F^BE6wfGgbR61D?+Ivs_OJd{M?&#ejM-GUi zi5WwA)Lc4C|BUyy)TbV$FmF{7pSTfIFJ`rA*yb@CcRxb z;jbvoa0mwA&{URS>rT`L5`@KvLoEJbntfS$qJBUu5>|6Zsg5IV{23G+{C?Z$QPh0l zE9udYpm;#1mA-mIbXJqvRBIe40q}O=={RD;9480pZiaknJ5O)$Wj{GjixE(JZ*#1x z8d6hvay4Qzp6Y2(tS8|jxh~j6U)};>48y9hH)4PcEM#PH(vJ`XIo!zNF0MQ}rM_tK zxu97WBbn}?zfbUtY>1|siM;h5!aQGU{$a|&iSz=+XDZzWWv!zBJBL$&EX%bnf3&{t zJ=AZ!Y>+G88*sHxaxDA_`_qW&!Q4Locs#U|Jqy6JYaWv`jV0RiSymw#mckI-Uz`m; zUEM&#)eMk&i%M_kYbNKlLY)>~T2hzbAp_;E7Yg`G9oLAZh-Q*J5p6yc1XN6KA3LK@ zH9e>JB?()Bl3aKMoV0z|_7a0JTFz4u^yz7dk0aI{f@~r-IoZvWQ;6T54D32(%Khn= zBX0~h_*5BAb-`UU=m^py(+v$jEy;g1}{P}wfe3H6HDH$IzFVV#IlzK0DO-hGdTFgG&$uWHn(P6f}&7w`bs~Tg{Uwm?t zy4Ij1ChsAZAxFo9*6Xcphm^l^&sLBWljJvMzdyD*(*s5MQn#UsnM!oTq>RUu{8Cny z`vDnpLgm-%YC)e&7TQiw?B}=VLE&BzVOz-2;qt~7g|-D;k&HqWyR`*tUZX%Xr#v8_ zdw~~0`aK;JifrGuCNQU7(L#R}DNONs>tEa=uHN1I46}iFxBi5mGFXKxHgDc&{yNFa zM1feDJ@CRlK8;Z7NE3X;%yX2>yHn!0Z-_&BNI^kS4`kE|+DUQ&{wYU`bVj~x&|#^$ z6*3HirGVa^|6rQ&SPyx;pIWfsugmWyIL2rbtszxqK~Ogm|4)Wr!Xm|RI`02dobW;5 z!!d)dg0ZZHc}~ZH{AJ9|DHZv^E9y;$-{28(4%KI>dgt4uwHq z6kM9hR9q2v)0|obF~4zkKs1G#0u$YR%JT9yr}}bGV+|?ebtP}%q)A&R*&dtiwUW~6 z@RRqi0~CetUubtoUFZ3*LP6)2kTb+Fy6Eji@=jZxy4tRC!JnFl@me1tNBqBpd{&4h zq0=MO{r4(G{)6q}9fh&&6#e9+xIxCJ9;WT^?JkGbkZ-JAhuIh=Sa5L zitO&0S^c~cfF=OBVxdDwsK05dUBZUlAZ9?WNF?*Uz+ z7ES~f+dcz|Id#7$cheYf!@9DHzMQLUY=D&`myTlI?$;n3V+VX}5p}VY)x482v(`%V zGPf8xT5EDoaz6Cz;a$L;%Xqbpu>F+s`xH&~VwpBy;ULcXHG+{+8~}24|FH#vA69Od z-vh$-TWAV3JmePC)h|}_#qXJOlz|IMKh%yhCO(RKkZNL(D|LkvW*4&iSvTm2kEC}- z8BAJb^u7kpXdgd!9-tKC_4Qp&)Dj5n>Mz0eQn5{m+P5`Z40w?CJ9o~XgWnsB0SrX~ zitR)=uvG5Cy>tdEL8bvs((XoB%;#rW`Je9Lsk2@9%<7FNh0J?Iklx-=Lin={`rQ=^ z!V!(E^(t-n$VuRI+!42*xLu&(C89<3aZm5&HfA z5u-qxmF`b4_H8*giAqub*40 zKrX`w`s_e5KMS!Bc;`~nnI>-RuGB)Lr*z-vs*>y?tDF=}Uf9GxL{+KSnP^koJ;r{; zl@AFc+RIHJ@|F#2`61jhO&d0SaiN7kFvJIHk8C|ev~Sjls)oNOD~*b@Gcvs}r-vrX z7rw9$%Gw7DeOKS&5OWzO{s@bU9NI8P6gq+05T7vXJ5;d+$%T6TS*MB+K)I$_@$Wuu^!W6;zV>REYr<&+w!Eu`FC~L2_Yjvfn+{1FJ>`p1t{E=~mORdWk;i>tfr3~+Z$N_ASQS`Nb1H}&<1Z1(UqV2~PW-NBhC#l2 z8rYiizZ$rR>@U`^u8W02|K@eh{s1NrCYF`vsVG$plOfjQBa6mC*h!)DXbP+;JYbOP zI@CA!o>q@N49!z;VZ4Z{!nWI$pFo7+L(02~1y5QA+E4XRZI97j%F?W~sKArjO~UGX z!~)~W66LDg95GX^4i6Y_P?eVKw$<|k-tzV zn1NKdv0l|WZG!gek8&c{lTjcn{CMBitN)B;eI9uKbdw?gnk5n;^g8)}pqkzd&Cdsm zmWcWj4j+V#w{L9)q(6_g-sDa{fbXY6xWtc~q207jQC2^8 z&$HJ*OETI-AZ52TH*KM16dusV(w@|EM3oa4Cpt*qXd&h64 zU6}AaP|^01`4OQ$5b0r+GCGeBiskmqZTt zb`3U}xPZ;336n<%nJhpKa3Sdqux^&_`gJPkDtiFo18IpN{d(YsKqK|HR{4oKRSSGb zEjX!%kV#II?c0)ip-l0k4*(lKz_+*j9(N>RpYqYNZFCxU(G4P4sv9a82zGlAbmwEa z*_VG_?h4_WaMjqF>`75G3as9at9AE3uz;A?%waTW+@7}0FDFxnb_JCAw8&7td z2>SyFHoBBjBUC-kGifJD)KXGii(4XQS}1M+tg>5dD?mL>fLA8oyz;C;Xlaev-FcPm z_;~ct`#hpbdXIG>a(D>5r z)2Ep!BPh6=fOK%{(3;rmo6_W_m;UNGlD?o)nS1V75HLiON~EYD zJdVS|mf!k@m)m_{*k=EE0+2UbueGJ{fbv~6PG9@c(Dh1lDma1kkrSdF4=#RgrPWo~ zVI+_)^6c19jGV*~0^>Uop_2QiN)(<|@k|3U);@VI}U<Hdpa!tFkvg2Z0PvieQmgu%q( ziLgmQR)$#VMIh%WGR41A0@0PzeHDK;WPeHwA8lbaA%M1<)ENDx$eM826gu}45NQPt#++FZY!i04d?y>}2FiWc% zT)cdkf52gp;=Mh>B=Y^1sp9&-VS*Lu6^Q-=CAcn8W&(w10^$eMQV@d1qJ@BsV_Wk6 zP$2@Z-}2dwW-=o=pu*Cf&Ken_MKqq2<`%RKB+49i+2VuO2&Cq(lu}3#2S;$7E>JNFLCvM z;k@;Ivr+`P@tbaoi;igPch4@`)Jv?@TWo)U6Pk(NOcvq;u6sIpE<)a@->Fsa_DqQ~ zMYxd<)oe$TDK50v1gTHpL779n`}Rpl-OdPt6eliJNc>y{Zpi=L^{mD^k55hy-9m2P zCZa>DxMmHl2!BOkqNR}l zDR;VDF`-ZAEJwitBnLZ*6cK*1zWPrwJqTQvzz?HiI>GUf`K4l-3|(xmR|CdGW|rz@IY}uOA_t zwbdcA>i}9zi?8!59Dr%Gn|Uc$QrY9o`f%~ zEi&!dIle*(m|m+Ejd7}i5zN$@5J-$SzGF#l2mXfaU#>lplb^=(!}6=9*O>`ndK=b*BdnUaFn*M=&b;G z9jU#quJ26q5muk}BZ3;{n~Cn=USjh{ZqfpmZX0)kr1c0;DTKM|jzDapP@?dN`8E)P zd@%`&=KUkea0xdP{~T08eGRbrpuZE+C^=cqNTPkOVY5z|wDhCcV?E!l6~b|7Atusw zObpD|W+ycao_mkSYaEP+0$?i8SN3Grm10*z@OxIox9fC35Avr)1Mwh2w|-27k!BYE z9oZ?oPOimx>R%*f%E_QkOcg~j$PX8SBK{t6|N1XTT&sE$7p}`+ddOC`+#?StF?#iB zzp_b0IvMs4!=wzs=(fY2>A78nw@bvrX4k!>moZ_WuU^ug%?fY(!j(CahKMavz1ryoM246amb1S5v_XNQvYs zH^c%Jt&+N_t@w>wuU@xc@d<05+e1&3kbYm|HnDEiBYthNXNqm`64M%FoUB(MGQN*j z5Mql&c=glLUqX`QmZXE%F-dRa`0xB0q+j(x7xO{Zp;3H;xJ%xo(VP|gyJpvJ+n13SbsKL~Y*J)gsGZp7kUQSHn+zGSP2Bowg>b`OKK9d+;)!eA@JT3{x2 zl)io*)^un#((NCOOse(P%Nrl6?o(=BNJ9>9gFT(c!+=w&xP(fte_<@YARa9fh{Oo*8g}kP;Ho`*d{;rjj|>9*6ew#W9KwkwsY z-&b$el9rpu$vMPMG7zkygaN$4FI$?WS1WEF2{S4P*|ip=U&b} z_CKg6&(rs-F+>^-BC+_VVydfc9Gey3qRixB^PVhQfRCc-PO#~$6u9u6y@$}E(S~+r zO60oUY5JHR9`*0f^%f-%v)MDOoG>6&co)9pdt{s={`G7+^f|eHrp>LYcg$iQ5$O$Z zx_3I0_GMZ!2+FX^meIID~ zP6VVDkcmTrQ4QRG!g|{`m#eFajjOq~Fh8Llgt{zqKCN@qn_if1VXXl8ZnBl#POcnkv0u z2;V33ZpQ^3d?A^uTU-&>QL^r`oY+z9JPwwSI1VK^0E_4b)ysk;A)1CS2@Bb$xwYO4e-n~SQ_2yxe(QP zG4)sZYmH?y3UHIAW|aL2$B1`}j3+DpW&@`HrI%8oZNz$JKqrccrJWM1v9r#B!(YODrB2VrGc;CYP=TnXkHyD?%RASs3l0;Bmo!N~>VtZ>ND+!t z?wVN_R+4^BnbFDdOl47GNA~*4mH)Z`&9R>EH-SWqyk~qU>1^<|wd1WnxSb}y@Z;G? zhK*{2rgU#A%J8WP$A57$?Zyj3>ckHXqE3)C1Mlo#>`(v%CcEVsn~DSQTrEC7Pah%o zj8jUuH=0+vsIl`fOkSdYM7?hp3HnyqRlLOPRi@ZFiJ(hcrWHm|-w+n#&{O<=9E6>} zu#FWtF1SBH3pK~m%?I&e!OQ>|xhT4(WmF82UJjB!iMJ)}{9y3ob`SZ@A`VtuH)Q@T z?hCqKrqhZN01HK=SsGARX_^>Fp-d^h#nk`CZhYix?lhO>o(!!J>mxEssrYIl~u!acH9hO?6ILb`Q|MdWLRslr&HlwPSg; zz4p+%U~hE*S3CGS@Iot=K=FutIT_)DxnBSkC-|j2AEiSx%bOT;u;Bg}FlUa>E>A`A z%HFfxP+fy&bgjwP}GD=S~=!#`mc+I9ue8nE}++81&;eb=gd_ez7xWl+55;Tz@j z>d*o|GVGB(??mv0{2cr#XiR-tn}$gRm2J9BFXP+RISJL8Zsj}enO6ba)O=7mZ&w$y zNAq@5HY(ow4y{RQikuIg^v!j!O}=f-XFtKu6F~8c;1wSi4Vgnk@b&2H3Y^g zDV08_`8axhKwMonX9+DgxV^)5T|ds??M|0GrIUF~GFDDl4TrJ^^9(;5A^(L07Whu` z5%@rAyHm&eCX}yd^2HQB-?F=gWJK;Hu%&_gvmW*?MM75)fs4usjFID>D~UG(v8&ts z`dok~)aJeVGB1Npzn7q6zHTdN(6WBtG3aPK8egY`nT1o@bdp20QC$OF?-LHwq|RtQ3BR&S3JEupi_U24}&d zZ(Q2=njI@)FXE+ zdV+2*X~cG!wB>0MamNCf^INt z-ukTT(wT_MlJdi=!CUxV{>i^dw+(dIh-=cLuQ{%D==BEMa6qS=Eckygb*e{hKF^N! zN(8zQ83Q%|S%yF1rq$Vw#H}JJU-aO9M+*2fKg=jQ&;Uc54G(T9e(cagM_cDU&&IMi z_A2Q|v2(;j(OvmQ4*-EM(W_ROs?u7G<6ljj39 z3vpYh(#t%-XU15&M8QXTQLETzqJ931;60DiLq~5{`KRZmw&sM1>kWr#(G4+3e&LO$ z-7 zKn76%7s&Vb4rS2??c-{f1MTU2I)xZ*9`3qlbJ2-9s`$zaZ#*S1A3P;_$+0F2q^0cm{$IdzaiVUNY1ez|X>td8V4@r&<=nU3bC{@Lf{>U<5$gb%4TT<} zIqVB9;`J_|CNXNx1gwColGMfWY z=eB;s(2Q`-RxG(?@KYmoFcVt4;5MMMXq53+QGM_urJ4jPLj~Hjl76zH5qYRD`vTbe zWEA_o*!#`W6*SM&tGt_F?z^+PYWf0&g^0nYT%dMJ{=*YeMG4@90?JD|%FjHaN2}3i z`8CZJxW5TkLEX#plh(zm5~EO}fA`g9cb}nMg zV&4Jcrz2ENy2_6g!RO*!{jVb(RBz1DMc3VvQyyTwHc%v(^XJv3IC`xw6dO;XX~DyF zWup%}dkk}p_s3{AGZm#|xps8lgiYIN_+jC*5_CQQ%{mttn_Zh|NCQtXrNS$+uxUhP zM5wuxl0o+*PpqRbpq0RqcQsqZFLh8zwErOF~O|od4ON_eg$`NoTzNUPch&i0%QyqE{a-MxA|=YednLovI8p6Llu; z)$Bf7O`3vcdOB>6ALZTUai9Xn4&1|sNhDUkQ{1b>8XsT#9bz&_sZ2k_(=8@@F$(uE z=zCuKmnt-c?m#xDnp0c6VJltfOm0A?)&D1E)%&ZoCnXCNmNurmP#;#5 zk{Dc>xjo{Sy@7h}=7&`_L7OJGObf9Hda%YxHui+5LIV`TsXAU6DKW8?sFA0rH=dQZ zd5`Atg*Sy16ji<@CzANhEqnA`t70LygV;Ouqh2X-m^IgqO;=4itDlJ`#||%yb@g8{ z3j4dlXkJlShe*yAmsfdGFJLZxQkEn+c33qaG?&pRWwcW@?a$PfZMPD5nh<`Ihk*Ne z-XuIoYckN2XSALWt;_l+mRk-ax=-nzP0*DYz^A|d@HfxfJ7(RID%9Co%XDXGSDwtD zb#`JA`~YhYl!h3!C(qth2?gTJ!84s;`s?2BQ=A0%40?{=`(0Gg*1T5lU{jRa_(V-s zb6}cv+uyEhGVtRVREwfldpG}NzilKl+dZk=-8NyJ_>`$#nOz^NYCpUeZ-JNIK47B$x-nmDS=(4b*0l@C4wqOV(s7EsbWylVWCX~EJp2hDqwdX8vmacyDP{^4DPtpvefSd>i(fVJ{Tofdy1}D-!!(|*F|{6;1J@#qIeQf#C@rtjp^xei?Ivq?4%He- zY-Q4lI6S~}KcAeqLPdJ(-Qhr1+2(i)=+5yiV-6BgJRUC|yy{3xHfXy1y~1t78zZ z6trMO^!0hU8%%Om4j-N_&YombSUasDtJb~m7b=S3JrYL7RP{J$JdS6rhzFUSkklRZgx3zdZP|1aOXn>GHxN=K)qqCo1;_eg5&{Q{2ZC%LxD|4CS`mj6ja=bR6 zT!Rea*+}5Xh~DS6+f>B%spqh@$$womr;+tVf_pw!K_j1DC3d?KAk-}98D}i_)^=)? z{x{FIoqnL~A+B<9wh8N7j0uQrg}vpk$09O^>?%jnqWynl#U+ zBg@{s-8@;WZQqn)`LnzcUFEEt0Edj@p>iD)^U4i>7X+rPupCr!A<1FviN0xWB!Fx1 zh`;Ks@F5NXxw$%;_c(3ce0-|)u)OW78qpm4oYz{nhb%n;d z!fPlA5_{VvhrFTo3?mb&ZBEf9;35grKnZaH<^IBkdsKfX$nNH3dlpnqb8yR-%q!ez z*OXp6tDdq~YHe?~OqWJH8WSk5Su~v=wWMHrj;EQ8jt~_#Vj-0puLx0GmS*1~VhC4_ zPd<07@^5bFY}mLsH51NP$ibASqOB|hBdvWjbNs)ZLOH>s2yL7E2Zn8^nJG<>p?u6= zcOPtz~?t zqa$53o7^RZBA);~K*GNczQw8NN<4-Eu?W6h;6RW8GbNf`@xLgxK+F#Y_i+%U9im6l z2Yli+F}G>eEGUp{XhJI2Tgij4tFzlHO(+V_R&yEzCkL2wEHt}n5W#(D?^YjY^z%C& z{%XnSbt$PdsAVGzO~Ob>`3`vJkGsPDD)qxQ1R-0MF8{5{?zxMCIe`flX7gk3e7fyE z2a(m44{bomKtr7lUI;XX7oEweY0GB^$hlpqFHVtPUQ-YouA^w_PQPDh0DSQxX5XQz z0>6POHV;@ox>+iE7Dm!07foi+*0bdw>JhKuDzI#9FpSyL+*wiW4gT7QE+=rAH32tm z{f->F8{WGr=LwL4Go@>;c3o7Zu4?i`+)1B&+ZBaEK9y>YF)9z_6CHMJJHdu8Y|ims zxk_DfEBgHL1%?$~v+KV865x4L_~57YHKH%JVw6>i3s)X(QLw{@xv=kk*GI#u#iILO zulIk0MaGzT)I;~aM5%C{H

      A69pecsH#llZkw_KI_EXc#`nh>g_ z_6krEogPWS(C;*>h`DeX;F1-08PnvxWji*QAiV)|^N7tn3qp;scFX#8p5^E$l~|w{;~X zBbBErHwmSGcSuNxxjL%u5NPO~ zQ!DH8PapMde7fzt(V7g_??t!@EJJqZY64fSh_3N$S*knnJ%DNOj-#cN>|s`g;jHjV_$;t0?}Ko3aQky(4;*jG2q@d z0>ZDnS`3Qks3NMK-nrR2_6ZuVBLn0J=WU(0-me&belrjZByOa zE{lIKUhbMp3siP0)uPJR>UC%-9PXAweUUu#b+?{?3asWOsy3m|o4jfdfwC)bwvJf( z4;3TnK~yh%5=(qzWZaHZp1dA(q5~JAWGW{`3D8^@F&0-rvL{=%#7dQmsk1ydSaCca5P2` z6u+_=Bwhe#lqlN?RI4NXcvEL`C0xfT|9j3z5aefxz3u5u4sQaYSsA)qf@Njuf~~1a zv*p#eoQIL*pjWtB2O=ze@^MAb0vow_bOFQQ^U(hERG*5%xAiLu1?}jg9Ux!4p&aXF zL~&W@1R9vQ-0&&VLURg88_{j9toPF*RWx6Xvd|6EAI5Dzdzw9gMNRI3(iyFFwL)kI!1-(?X1C%7(A{cWpoDz^N@rU#s%5f@yZIri+1Vlzg3m_L`BY64e|?bP)*c(qhj!O8eZPQ?V`a=Wlxj^sdrc#r072tcA%q$e-nVXlXR|0$F2R_f$0rI5!3}a znjEutu}KgMO;M#@=C}C=V?dJfA?6@)OShmOH_FW9D_;(e4y5z7Bl;;DLe|w5_{i+T z_;42h(0w1fA(ZLYUEa(h%)s}LP|jkmQToHVRmyXOz`d2(^anKA>_NiuE#6J3I9ESR4m{QIFswNB8|5u@1b?gM(5v? zIf3#Cq?qEBJV~mGVZfBg)oUIWTZ(Idv3NFfh-j>KCQXSoXwMxs9HnN+0l!J3%n7L9 z^}UYz&K*8y5HU*8S!+IoB9akk*@LyCJ}>4oY$WK&)g-v1ti5P z<#sk~#*@pg?}ji}LTjkuaO-`q1`slT*Eq|?3HUH{^%EU^rhmH z0-f(Q^=|t}6xLboCMu|^19J(At~drQN7O3TwXIMa+KOYH2qP{-roj`Uon7`Cd9?Q0 z{KuX5lXy3?$|bmiJ%-bd^lGJ>Gu|TuW4nua2PLJ(>FM;0)-u%AgdBes=ALQT?^#Nr zxRSo<1Jv*8YhEIwSFauAr(qIN#+aCPgr9X19R)br`9v~hPQgntR~U>)U2ipeic)$4 zRBDk@iS9v$ibB^x`$1FF-N;eA{3%TVJ{y<4_OBZ1<=qW^Vr~#BSG?Yply$;LtFP+61RSrqPDU;)k5@*aBm9^@Je4?Z+LmlEh0G?rAiNnr! zgVn!M+kG_X&3bJc%i{^rv$~G2Rp1E>?mem$J2|U-{anFSrh0Xqt2b+VlAI3H6R#-GmLPE{f-$W!K)Z-D!oOHgH@1#b`-=ytbxsA{&~ zkuU_|ZSuf5U2^*weL`~?3Y1ecQ$$Y>Y@^ts;Z4ycr~TB5tmtndO({N$I%QK-5I=g| zz9o1$Y+Due)8kwSqJRW&Cf7PQC}QK=4-*73MH}P^<{$A0~1}e?rL57)kSG1dSNASw5708P@xKF(7Y6tV_q`3>ju;u*LoyLw2F;j2 z5mK<|3p7muMqJ6-LW%cgfVR%O(w;Kpr5*Z46^=&JNK=xDT-&O+fHPh~qS!2zv-1y( zDq5`b9aMQ4wp^1N<)f6%c>oxQUp!)t;H?KdV;?vzVzzx75m@r4Q^TfYduHdmpd zYPh)|QeDpGkR;H~lt9r5SmH2eVS|m4(8vQa7^t=o#%1wSfJLf~xFw8y{&}cCi$nXch+rBb5F6UO4{37w}geK-fisI^qdohK}tNzfm zY7E@WXW*S<-3S$u>$#5rcV1Aq&A*pWRjA(@d?*A6Z|3Y;pY~!J@yBm4iWYs(d@sY-YlS2#Zz*{e6Kh)9+}eilxBSW>)Opih!Ee7W#bM%8Gr5cB(*CkpL0|5{af$K$? zCDbeHkg^|dT*p~ku!5?V{Up}@crY%O92(QCbYAkmy!k=LUYB;!gWkZx)JVTzH+Ld@ zJ7P>aC`)dBdIF_Z)7DZyr0#dr(O7Laj|bA)>fz6b5}?Ga6Mr%Fcwlx`)Gj5h#FoPW zWlEYNBz?W)K5R5U_aS~LM_v^|o7}VeXIW?+ob-E$sHId<_e3gbRCA?i=<83d< zlQ#C1ycq8=^!%+}E|m_WdKfgExmkFRjW#upgDdcJenPxS4o%->kD2*{OZ!P5LaqN7 zBdec>l6~Zy7jpg5!grU9X^snJpk3wV_24s@MO3!)jjvhq=7{wP6J_p#D2`?>eiZh) z2(lpkRV5U9JIGw68JZ)yN?*<56?>TX?yiFeKa!wFS}oL-@$1Ce6I|`F5V9IMCa9Hbr5@+K-v~IyQlJ;L8_x{h<;0-X>I8eOr0YN_V^V_e1%a z7!?9wq2q{zsXSHfY18nT+7&0|pV#Y@FL725eeAr;;J%>CQa>x36pt zxF2>H+n?7)hul}NiK21ly_vBVo>FHFppgcOt&&wFWbdu~i6dL5cEtd#NWT^AFQx%M z$_muuXnDXB6(oJM_U-DId?SyyhAJ;fD15f4b=(3N7OyI~NWB8&2y2_<&#}3o@GGmE z9o^7nwA`M@y44zP4V*&02sUuFU!omDaSB0MP5{ zjT>$Q?Iy2j8T3(0aIA^iKz_7C^;8*31HvY)(|L@@uNP~{N*zc%nY9qeLh6oK9MhD3 zLF<93dRY$d(}mIWw@Rb;37YZpXj={xOP}nl`H0&-9qvxymEIlIvw@l70!d3TiL;1JX5?OVXpUpgGaoF7$mVisG7XKU#+BqHUAyN#qF+t&dm)tQ zp6wXJ8zM7@L8AcG_HqO*_tj{x?;=WOr~!`loBNc96b%ccMyq&Wxj^N}g9Jjle64D2 zdQtfbo>ucV5KMXPE`lFO?>z**N>+eFD5D&S9(ha5WXzu(!f0Qi4<$GXYCZSbll#_P zk*UHB0(-Xze=Z7!*A5k`r!t6 z;(Fw==YB$zUHRe!Hhrqe+>7<8C_h$n6U$MD$}m;jY~D`V>YVD&(X1*q=1}H={@ON| ztKP$2Jg6*Ma}Nu;c@OzyK9UchGV^eXA89$MbQQGqibjq-Mk1%E$G2mfp)jHjI2sI) zaw4E=0+ZvvwoK@czmD%j*m&hoC;W_`B${y`&?e(pGc~6-AzS>H_cX;==(XmYXq#!~ zO%e`IBRcT6>JIINheWKZrx$gOR95nA(!6wkvgCFr^>pg48{>dr(?A0^(bySaqx>>p zv4%xU_U{-dC$c1b@skby%rfJBkxe-c1m2g@vHR%%#&&v&#hh-ef)0NY~db9>~{RBF_IUfVZ z2(|WIEND%WIjU}riK{8n52C?k5pNxwFD7YQVe6dUSQEgBY2-n3B+ z0<92I9(MLIB&KrE#t`F|wDpx`lZ2~D!C?v?tZNlY9k`4Kvr>#d(A31plF%qQqxj^j zuOBhOI*Iev%i<|EU6yav=cF%7bWQ}Gyl1kwQqleW*`(h=z(I$`o4g%V=b=+gZ-NOA zpb^x4MW?3Xv+R}A?RiRt?g?Pt62z=y<~LvRFjPpW(8yN4IX(6k08`~mjHduzs%M6R zsKE2Xya0wr0eSLuvb{&gZR;yB9H()NxZO#{uik~E7W6yK7hZTSO|hE>7*p+>I$)bw zu~LMt=CjKT?6;YRBF%LxG7A?>bLU~TKaO32!v^o^<2C4NJ5cX;t?|O2GebdCxOPTH z5#ENsysb_7o|^>Mw`JFbjvF73^qY=pSvL)y)(2n|Uz>)fcQ`0T;*qst~BIXo@RxZNEPGtJVzLhrVS`-WT}lwHR)f2-4Cp(Ztk!L=k=0)L5dsbPY#EZQC-GC4)(`XArZHa!D)67Fpv@u!?)g~ zycBD5VwIRg3nR!5fEjLI#D_X9IXNik;iWKC=0){*@YyjJaRwN)apwb zmO^BZT{@>6e6fUQu;S)24G`BMBK&XDX1PjqGX+lD>OA%C{aBLoQofRiWZ_b^8p8y^ zH9rQc@zZzSCmaAv!`YGz_s<7C8diiS8f=p8N9{QNz^I>sA5nXu53UsED4O(T=pc z0HnI8??ft}0aJQozG?%vUiUw;WlrtskiAE@yc2!+EMM_`b_NPjvuUN4bFFY3+-0D$ zsLM{%ohNI=B6T&{;#yq-wiu(-SRx=<&$Z#_&+MVMGy)jm+~et)IR^QLXVfiN+=Pcr z9xVbr(-)rs{FXnJHZZu=;I65#=aHp`1ana-NN0SR5ad*z!q;!JUUET8DHwh|{%$BZ0QwV)dtQm5c+4>fk zh7X>V><74T*1cMgX%D#8aCY|Gq^)G-m;aW*|t4td>=k=D62A3;V z-qPggy2os~I$P zji4geJ+k@vlYuR$E8qb}uTh`Z`?e@;%HMN_X)KZ!3YS#j^UEJG7{{StiAsUB_27@f zV$wTw712hTy=J=fkaI7D7!vi;6tfA|+o7;0%7Bty#*_I`B&R)&2rUrNJBo zY{-OIq6*6jV~M!f!pxbCqG&8o z2Muiq$wr{mX-(uMJ2idi25JtMv23wwd!^wrk**_hKBD|br1d2k;bz4-G`aosn>cE< zvMjY*9T4(|dBwh+t9687BI55N|2ZVjm55Zq_O4k4v(v2ss^>^j4(n~WELMzLpWS{+V zDEI=Sr7fOmK5N-eQq)NO`FsK%g@5fy>a^KNhmDEigs=C4(2j*jc%-XEx!^;)vI{X#3#s&Pd~8v~;QJFkW{>xrp61d?$ax$aYaw!HA5exdYtMoJZe*HgF43T=+en`U4SuH8ObW}BLPMO5LcGrSc?a)syk_LtH`chSPut7MJeL z_mjSN3W3UL;mC#~FqhT6tK;)%VRv2z z&#Efz+(Bw&@|nN@;JE9PL_9*Uq1j<>4A9U2Ca zEa-&T(J`!wHw#wZaVxrDvqj_KZ%x&7(rTS%a!@cg7Eusa>wX#f1D+(*UDk;t+H|Vo`OSMb%8*|7~RcdeOrYuWry6{4T07NKGcWhkugYe9< z_M@+^hj4l;s!Im@lk0AIcAlWFv9cVIfy1hmJKBh;Y6{Y5e<-qTXADO8R?#nlwFuJ5 zHdB?J2+e(k6s_?;+|8Z#ZgBCPFLCA}yn{c9j9prOt74z#zpU->0+i8}3?3156?nS5$m>{udUHmOlp+ZH z{q3^N7#z0|2*Q&cLlllXPDPcP$5#pCG?lGBs3%Rrz@H^i->~2X#N`C_es={G$aBN$ z%E#;5&D^|>tSRx_o!3qtjzy9K4nk|Jv zz!u%m+i$QjPX!0%{M+)MB)iIv&t}PCCj(W(SgB5Nu0sluT=mVMPkIO-K!r}5 z4U%-XUsD*hIG_ueE(|?B)B~pyjI@xXK2!|Lgx-(J)8ZdXE0$Ph8SE$o2UtUu(z~SYOpy-u8YirlQzh#+C!UA~t73=cX!{ zHiX7n4d}c(kwY>&Jqb{0%LXGYQcQs2O6KV3-HWGNOFA!Z;1`t_8IPwFG(j{w44h$N z!I%wKXAAMPg zC#i{FP*;K3w^DyeyNiWdn@>#Xm?I|R`=lJ6JFtKjYOoCdx|^U}5?hpGl|jD1)Gfat zQ%AQxL%!@^AVwg!;TUQhmpIkPC=ja@vOVww6GagasQBNXdS5`-s=pI`SWO@7VmwSI zF}+;|P%F4}V7d6zl-M$-I+Bq~KLF|QQT=tt10w59ytf<8-zt9%QKqp;*{vcBOgdd@ zV{kA|WGmTHoOpncQe#=%_qUHOsXUCYoP5Gr>4=4;Bc&xk;%F9WY`3apM?GlcBs#Vy zGFgt4^jM?%!t{p0jOh21C4O<-sC1c@nxASPZLE}i#6mGx!ebvppZGnu>69ry?%=Ym z7wbgZk8?bz87wQ|8!xe2Jmcty$D;EToe8iI^eHN6^~4>jyv+10Ln?9??S@gD*BP=x z1;E&T++g}=?8?-4}naPb= z8KEf0ex$%N^rV>%vNriIStrpkP1LQ->Z|!;)JFMKvZQa#^u#Z?+1G2B6}<3aD80hi z$2p#P@*s6+bZIw|1(OvgPP=^D&yQs2_V9rJ}U7j$h=fVzb!QFE6in7YegSy;m| zZ2GZK3EYTOMUOwBzO%Gwu-gz?MR6lN!1F(AHJH4wK$ArMV|JEXd7SF^n%El;TvVwC zoQnO(gi?UvQKYQhA3~j0%W$F%Wd{qL_?ah3z72aGTJnoHF{OCBD%H6tQNF=2PjOFJ zHZ|;c3Wk7!!R2!e+?VI&28_)K0?jQrt;YzqR}c9bPH{Fd`tj|S)AwgN#E{TIiSYGR z`gUZJah)c`xfgR&in(bL1iH24~X>teUVBSt1xqCK3U_kwHJR}0z_Bc87_Axl0J-xpB3 zEuMsMz0g5$bO-!+s!5R_p}ZwLP3NWe*apOq(avh&Tr7Qi62iiW4EAW-?M-)bV_iv! z6@`<|2qom}U0cani93h>Epn;UQHCkPks#+D(#q>w+E`Hjwuv6FhrLJI5$_lb^_k&t>~Jm9IpC z!ZrU9v5K`%z#_^xD*Xp-viDqIQwTVok z(o$IFhXrkXDB?c;x_8DN4a;7r4aNG-I8a(Pcj9TzPxCvZddjU zRE*nj8ltn?#Xr*ANV8Yh;zcUQLA(bX_^o0k>Y>E4V4FCPcEmX!4Ui6qE3W14O`WQi zQ_fi)_-DcvaE;o6SmxQy460A`VU9wo!=mb(&Ly!^$duW6geuN)+ z0kjiW;6m5wmGAl){FiTmBQ}wU4*-#vt3~V*dyzu=bPgdx+2FMgm*5vK3u&e-R2|;K z{iG@+i1h$y^Ou>(zwEHRxcF*W&U1t!P|rOlu#6M!qL1`a4U2|gI49M?$T7%|^$CcQ zKIlF*nw|V8IPD~AXNTn4K4Mu05OsC$MXL)wYgkzR zUmoftrKkd4s&D`tvoE)06%lh+={)l-^c`YVc@xVMy43p|eE*7NVq}I~YjE#Q=TY+< z+K)wCbmj-3VgeI&r^wTLSX|t1xPLCtt0^1V6em~uEmr25u0ih|qUtfGYzS~>q{!;e zr(-g}h49G-*5Lw*MI~u0Sn1=`i(nE<-_y$_z??Gv0|o$PX6(ha|)r%YmG0wxZCz@@W3? zl?WWx<-8fDAhCyireBS}xjL2b{@8bXg2Yi;lD#FPh4llaD&MnO)7tMKu-;;NtqA&8 zTzw(F->yRvq!0?92G6T&Bx(KjwVtM1jm%iE;^OTN$)X)kQQ8 z^Ymwj35#Vw@WdrFP$SQ?z8Z||5`@#A44?nhJURK=&)KL`<2QTkCb#fTJ6oQFGInNZ zvk)bMItdW7~=x?r2VG)YVSyNnuP$iFO#>)VeSA8freh=x}TR%T1$K}Q&P+x0p zuiKeF<`LfHBRFd=_1)S!$OK8|ITjS4*j~5ataeoTzz1!2@Q?@97rx?`s=|18>RrOm z?K8z`e}MtmC7bG*g`fImfpe=fs^0M|x6A0cqU-oPnV5r`1sq zibE>;%bT&I(q-2T7Y8=6-1Ax4OAC zrp*t@&u*(~G8|6u@54W->Y9~&tJ6KENW?N2e%2ZFZ|f`>b;y!| zsGbAtPlhHe%p8@q-SO*q^&*dVT&SAQYNnx)MHj_^!tk*!58iD?{wA$ujaSF8vIDTF zn^?y;thY{h1p=h(9fmX1)SSl#;XGB(SHc^DgyXuy6>Ep) zc>5J0_Vt%X1n0ne-+xwSW1yIU=kq|Lx1_76zR=NCrQ{~R%1kPtEEe=7TlCr_%n8G^ zHftuDq7bbOi8563J%K(D7;nc*C z{DMLrZ`Yp~b2&y7c+dE%7@ISFc_Il*yDlcHw!lc5l>wFO8o63MJkHs^DD@Ba;TR`hLv5b(|&CmJl~I=GdU zh@%`MVVdxXglJG_B8nPlqoh{_9yS5VJ5;<;!Yr90U1N%L1>+AKvxrU_F0GjTH5O54 z_dg~yNKV?=2yl6rZY<%#^DVX`)Z3l?R<2`2rps#`U#tx}|Mh;5=apucQ8R63lZ<`l z3Zqsh zWx4^I67f^!$4#vGaww>KT08U*bA_B);yQN*jTvl?e5V3J687b~HR8raCxmVn?!@oU=hzIr(>@NGc2nH=aucV3$hVDI(HH z<;5VdRXk*F9_lzP(0Ey{lAJ0o>+s=Imp7ofpx>FljMQUNgfL)jj&?GVJb8AdQs}aX z6;|7)m$*0=$GBDcs4Twh^`QeEcRH-6SBS2$;5{g?9_>)g{I27HM|2|=utVw9Vfx+o zSM%u;oQ-JMuM?=c&?Cn;mGE3}hhyrn*C$gqZ+!pU2* zylxyturEaP$T_GY2m)^7eg?{xSv?^{^AJ7k!4n~x!}o(f>WcGJfS7DjM=%Z%$t_H?uhN;`_B`;jOoudHp~+j zvQaMpKPDKE+Of8zurNt^DKZeETbsz?k2zcVcGPyJO&j&RJ6bP(X*$!p4A!2=|m+6RE}slQf5s#9>ycKyRJ-tcx-%qC9^ zv-00jsHwcZmQ)^MKm-Elvp4~l_wunsC<5QWuVb21VsF)~>}>20SW#?*n_ts5xrL(r zVi?HNf?9Q;lB~}qQv&XtbeVG|kvsP&St9*as8?iQa+9K`!jcf4RoTfh1BfLC4kU0O zj5t2je#y~>1wIg(X+Bo^vEKeU9KYFoV1Chaa3Kfi1&;(OIzgMTSqijN2+=M!htCBv zaun`?*3-$$^IAkhGL_{tBw4+>$FPb4G#bG!Vq588Z2RpOi&O^QLgZKup%tBR^(Gbc zznTN2fEIhKn|FPmt~g#TFBK_l__|g6CamT8~-HG%! zUszL(5(FX+iZz?eaHklj*+b}_#tF9C&<=iTBVy34)3&V!Z~bjYrOvH;l{l^2ap3J> z<+<{CU_eBevX+?BU%*B+OYz3n>*?(J^ha8$5`CWf3$o}}hs^{qH*Ui0Ik-g>hcm@Q zkNsM*(cYH~m8{4uUuzT#am<2}hj%}t{=GhZ+So@7F|h}wK*SjIs8Rf)ygSZdryW7k zDq?jnE#qd*Fpu2MNXoEe<3JqnGAWN3;_WXH3JhBc(lRM4$7Al+B0Av>zTiN$LNU61 zIs3gnCIFbfvAIKS_6d3{I3`2u;0jr5G7{rVnaDC+!V9@Q2q@}4Se!yBk~v&WYhZgs z7ouU9h%tLb!<+}4dyt*F441%mOq(~Y9R^L%Dnm!|kEspy75}2Grf;^D)1me?OYtpo zIB;l6G6rr^P;=dYjxU<$0|R7bC?40j_YcO9S0B+!PW@prN<%g4k7zMlp=PYN(|0Oa zGwTi3Fd{U|77Q<&CQ1b@^bd+}xOpHohs&8A=6=r^w!~i}j+Z{*4Z4+EDg0NNYv5`7 z`S{_B*+kj#y9iWomOnfoW+;W;d+ow2&X__&k@X=+xqF{{|Y-NLZ&72C_^$7P3l8_mp^rTmgK)%eGB4ku2D>!-lGjB(5=7QjUh<`+l@ zuj#>dkrg%HWKf(pDq>4Hogb37*N(01U3ml*+9^wQMFi>C?{4WPeu8DeC;;PYV3gib z`+@5w$c#_%vU#Zf1JfvGq9?VzhHUp)a-o+5a)g0Q z?8ZMt80fLO^l@Iy^Fw7vpIkD-*7)8gmVy`#J;g{zSdt`!70!+Wt@uDd%bkF0+duIA zx9^tGB`(i)X;mTSfI5GoEC+%ALCk9y>Xm!7#S&Ss_f!@%lfFH{5aZ|-W)G4ON(4ElHwXkzzg@ujaM)$*J1u#{?wtT%)$ z5Oz`W*VFAonm8z*L^x%gi}rc$(2*papXkO$fNa!Ts)IQ|H~hvu)ynwG!` zn@Ey&QCVk7zoekkmO<_{ar&6I^WlH?IgQv2G#Ea*tUSwstkFzHJ@WyjQ^iXL-LO&I z#H9@VHVus21y|?{(IO3)K6iSAHiV!C`tEL`&a3@La-AIsWvLg*LhtKzct$8Uq=U}; zwCg;`fdPRZ56;+2l}`bBY{*%xyBNOxeAr|Xnn|p-%%eBCh>`CxJ?!8 z^aIe6+3fK13X+2@mubCWdpf05X_de6Z6l`mo7mL*M zPn!5WbQqz@H>vu6b`$~-f9Dxt5{+pZ(=zAFd zp{<1lEFA@@J{pzjEzM%(N0KT_ya3E`f(%zCxMsg}7#(8$X(1Mi57ZK1N|Mrc+xejX z%&KE~F#!k-CJbP>{c$79jbv5D1;~AvqI+eW8Zua35G=-XH{FnXGXZ!=;i+I;LwtXy z`3j+7^6$<=WV&z~-(5r{CFif&ryzl?$4J=~MXhi%hO{-Wc1?1E%$n4jlT(MuDbT?L zn-$ubX$S)pisGWKa74=6L!ciwhw?kZbOVP-DHvDT%VLQ6&hE-TCrQ_sjbY@u51Q?k zvj5-4l9N(~sr$kT{C$#i5bLl=u!;IG!Fig*G^tV*-!#huXm^WarQ8y2AF0+_^P$J3RD>fU*0P{H zI~K;fGQ34W2Pu=Jglp}SUQn|!sSt8UJIqTcd~7^PJA1o{WW>;@fUd8V^MK2^n#L(K zUnLnfZ~RRRF-EH{Owpgx&Z~Aqpq>NH=CbjpQ8*P{ke)}IVJ$6WT`0b72pZp!S(WhV zsL=wnTm$8|+(@#}*8v9X$F+TB^s|DE6?yQd1vvM6I@P-HSBw+Zl-aJzU^m%U&n zflBe*ZwKdUSIm38QmR5f7wNh?sWcyCy(|ZY8~1Bs)k;&_O2fJal01{<`2LKyZ&ZfH&Q|d z2A4?Ijs3Nd6@Y*n3uzj8UmTR#d$(vH;6Ts*#~9p z!P{^NVvTA_>RLEJSn7@z6-qVDggS@aM|i&I-*O;j_)4hWqyAhLD!TT0=vqlF66Zc^ zaizy@*|_>Y5MCy1gtfr~ciM(KJ;s$WaCT#w&JX{B3f2vUMu?XNq0)>+U-?QG+|(n* zHWvo37IT&1;PJBAJ+4K#DQMd<9H@&SiYB4c1FeG3QW2#y@J1_Bx-N~ZEMxK20f9AY zqoTBRb+c-Hkf2aPu>3)gwwwbX2BoJ2UuyE@08Bu$ztNdPbdgE^^;wd6&!+XXV8Kcr zf02S0KMn~nOi7aTo4B~zXIYwFcMS@1=MR(x!usHpxQqChmmbVC;Blg+-?;=}-1bPS z5Jc`B9q$!hKbP1jP*(((VzrvI3+Zs2OSG}E6=ee3p3i(X=m-hEIy%gno_2gpZ3k6V zvTheQ_n1NFV<=(RvxRuSd&{r!5t_Rv?_T)pOhS56H?j>W6ub^{8wsd^Hy73>(+Qm+ zJ@f`0rHHppLlq&k*Rf#jvFrnl$^BSK9Ga)3T*k?P{|LG#rRryVAgRFn>}{RlhF$y2 zJ7X1v@mB#0gKOg+)?nSn4|tM9I)!#P-4p+!#gqvD)kzS!)eR#EG{g@=Ha~kbK_Mw~ zR^$|{?_*YPHV?;$Jd z$gl&*Bemg&&x=w#7kBQM6j+cVcXd^(8kXJ%vUUb6G6 z$HCpmF^hG*$KcXSU^P?0FTWDHPj$WFM%p(0bU_gt<8IubVl# z97hH*1&zQSN5gvyczbQ=X>P@x3Rtt5L6y7Luf@(n%!3y1h%+k|W)IwMEc7a{V(W|g z;jdZ9)p)h^(8xY85016(TeK_t?zm^1DO2ru`d7-rC7MRXqr`0B4$U>@VzAsFZEJb0 z=RE-;CS1v2vkH_lu6K5jel7R))0>?=g9JK%x;r-hZAyk-p23YQ@?7SKOrH<&Q7Iu@ zDylKes%3=68x8SdZnaW;3Q>dn@Dg0H$Ssh$LbaRQ|J@j#;Pjm2$2#+p9s4l7b10aV z+qOG7W+oV|?214dUlwj&->DCkHdW0n4^qr<1h30?_|HK*_%o^#Yt256tBTw2qh}#Z zOV7)Cl{HhinSU<^5pMPBHRFh$k%q*=psYt9EYmE0L5bGrhG6IaRH`kWYD~z(*DYjB z@w1#*Pf1Cuc!G}iv9Ah&{JuqK)lqJ2yK3vZUUxX8?+3N9uP_L5l3tIP5FNO0bmJa= zK6m8WLieN0%*=><2^0Qru0HyZPrW$~cj>SxItPv3CzH!`j zzALq=7G1-1h##3d-WMyUp*MN*holS5^JgvUBC@Grj zWKsxk_2^->SE|Ip>~LY9q){n(Rn$9~<=4fmHd?h(VrAqE{})j5FG$bgQg=k~qJFl| z`g`fRxq3UOkUhZ5HH{YE3`e5!MYVDvP@{5jGJ&liI+m|ZBL37KtD`ggY&QA|z6d{cPL5PZ_iji4(|-$X@?BUgoqD>Uqh zKVa_d+Fe0;qYK4o>2{1S%q&ds(Q#nj7<5aumJ(iu2myb#P;Y{xy{;fRON&CImC4oX zwc0_wq1Uvg?!IehCltWaxQa`ED4KAiL_M1 zv3hpp6x0HGk$~(3gYtW?E|zvi!}_dXOH0D5qoz}kS*ryZ=9DkF0mMxC8z_tr_G%U{ zf>(t2ghQgS$-^gZ5Q%_DEE!u4rO zUejkim2+80I_JyxaLOOgwBeVN8$1qfFczZ1Hx|2&L-ZV?Nk*d!xgW2(F0YL2>$xe} zYN2nGB|YI4yv9C-`bpDXpL{d8LjW+kj9@gW$YDm^BVv$lxw0Cv=Gy+gB*TLV-V!(d zPpVR1%8BSiRL+?Tvv-G5>w`F$>e-|1DuG(FD2|yQ+FCx|C5tQ5`Rp~achjSng+`31=WhV%j*k8j>c5p;JUeKXdQ|M@ufXpYFTNRD zgnBlm{2b3O<>kA7gixZ>%4OPcL9W}79r3B~~I4&W^PL`)5EmVNH* zw{I&{+9HkMMrh#CjVH&u5LS^L*P42u$+&|K0^Xf>3{Kzc%W$wBb&ifs?ZQyHSMX`N zaQQXhY%)JoRVNMXqn(UbL3R8al+GNwK#9QB(TDF0O)xHDEe7+ z4|RZgF##Cn?=0B)(D@Tqah5M{V8|yeeYeuF4;KM9J!5ws-?9&41y|w!8;r{lzQ#QA ztunZz?eh}>LcTfGk3SO@4UWc$rJV2@eUg&7XA_u5iUdPQS zCsdY9R1sO8_#oEikbC^$q6%Y?5q9PvA&IXWF##5CcuB}1%a1I<0SoUr%nW3BtASl} ze))hU%-aM;7aFV1%hM}T@Eevp0y?f01yq4t8eTP@*0zGClQMn!CM;>_vxsZ^L(Ndg zYln|?ud65kpZ_XRz5su!U~9n8w#mq^j8gqjD4-KxfL}3xj6|vxD2wMXGm(tE@`228 z0Ch2T6RzkY-txS$iLCNR|2Sv)W$gZ8I&*iv&CseVH{@;5@k5toqx5)Zfd8G}&=%P% z-89ke(Zz<&YfkCQCqunI;^C8-{tP1~rO@SgZt9-GAIYY^xo+H%K23xj8VWmgRozV- zw$jSBU^$3?eYIzSVq4d@56*F}Jkp3i@JjZC?J8uQe0tQbC{lUMbXsWgaClP2&6t zEz)qdtv{t=Q0WdrSW@s?!pFUYXRgz)kslo0j-O$2dEn!!PIj=?6{E_X9dK4tq8gQI z$-v^LvkJB_}gKEQ`4u>DBAK6}H|-O&=$#`)y%b$8Ow1vvXm zsAr?`o4?{v5ao3=vtBeW?fCD#MSO}43zj}OL_~T`p7j!0Hk;v)a+u@{SeY9#qfC|H zvyk|Y7I4ejDForBXS>Y{%uJ({5G(&^cr%=wx{~)f#}Al5GTD1J1x~I;!@7gCn_5sf z%zRxa7^7>sec`W#p^7A0bd%m%(=GJZhPOO0P$hl+dxBLh64!bW(1o`Y6(643=^?7FM6 z><<9_rlUm@Se2d|EUE?8F&@z+l)^ivqUCe*7Yt%Mds zEeiSU0Val95Xb&Jk;(2`NI04+kQ#(x7`BB$YJ=cv-Lv2-K!z*m+`IHA%M#q9Wg)aXX7`mDyMgSkIXaYy|Bg{5qI{ywI@yOoCeyl91R)fhy{P%tS*1 z>28T(Wn&HxE5&yEgDE$6_{%99-80Eg9L=r8<119~Bm(Sjg@2}dK)0oL<~8R{iPExZ zP~8oCI7<-q$l%Lcz^oZ(xzTPr3H$6(aCjZ9T4>ZlZg{Ihty$1NnR=@4m@6*Ds`zrf zc4%wFR7!ddkd`s zie`zQx6Z=$n>h#K@yY94%wXQnce)v0)_9 z|BAT4N1S%Iv%1k0fYTyEm(wCs!GsE(!YHGvbgKQa{%Nbx^kJ_HuR;zTlIs+76{y|t%wyIsnNhWu%cb4w&0*RAM{J+aPBJVwQYGY#D;8QdT?*8qD;UCe-CecI%az?Qs1T%uBPjMEy?;vM>PgB=w_urlE*}B^v z;ePGW8#{jYc3eb_)o@HUU&i)CAN%fVoLIj_whdi;!!nW4uE!0(z zKHyeXr#Z>NsRgAA=~gG&yZNU^$K0?&x`rW~_>`!jp{JuC;Z67=bMvv6dw#I2iX134 z)l#xUpHLR> zI@(pON_?yfhbeNUn&i~RHW9LSVb|ZJdsgzznk_9VMO|?ua%E`hE8AWno?xMASe$}_ z+(@<>FG|Co9^}dNF*`EBw)~td{*FlI2Qd!|jP}28tY;y&R-I;2WndF6^6YRixb3yA z^uO4;-6J%tplaJUB0QctwJNZ}ldPa}E8#msq|j2LoxsdhrDbgLZQp39oj|du``l!& z#*KMx3c&k1<_a?JeOZN5>~?Hz{PVYHG9p!45pDyc#n8eO`XcW`BzL@3|HRQ%x#vwo znvXYZcQm@)%_1>2wF>u;8iqP^mK-!Cals3%FJ`6@-Q@$I=u_Z`?b{g@!)7f49CFKB@_Fj7K4y3|G&!C)LP+7)N5#zWO}1Sy$VRTPX0onRaBDHQVGJJG=NrJ>jNdi&ePA9JCk zg}&@)$gk#uI%~MM7N&9_{q>m!%AjzC z(P{wdPaPfOY931V&hL~YGg}}wuX!8Mb2Lc|?Lp@w(sF&Kvm>qUHb*^rIiAOMEkR_b zrDwU(+$}mhB=7W{&n&y^Xs>+{MbP@k&ngN`i(=NFc^?uKt1ve zUOsXBnbwZSGMiHfgAhP_jGpcK9lBTW2kbj4Z(zpr%-Db_wV}QI_1bqHbssjN zf6W5#(j9Q*S{C#=Qh1;Mhs~LYwZjyv)D&3B)bhFy&Dn`fd*&z8>+Q0+2Jd&e9|x9y zEw`Oe3YlXR4=Agt>>ld%tn^WB-yHMP!;&Vu4SCqi!m7@rdJWW7W&q{9%u*-t2KkNS zTFo=KUhd%Bd|T;OoEjk{qu28fnFYUx#w++w52{p5kp!{H`SpiYUlCGX*&CEleOy#!G7bj zW?|v67i@O4fMhBO^)edQw~9RPr%*$%=LHV!O|mJ^Ask;oNokFG#$&}}ib{eOv}!xj z^OFqY-rW>W^j+5-F{2}^X%s^L4iwlD*@_N)FJmN3vNj-5i2~fF{ZvZ*9@2%{wb|>1 zDDn$sY}LtYOdmRwoZ-z0;)79{(dnB7rKlc+-x16Z?wc||-H_Fo@J`RwouEBi51JDj zVjh4jleB&4%7M}4_TmwSFhYLbtvhdiN6A<{l15Kddc~eE0Hy>+hTRl%j&>Tz)P>0W z?Lw{OjWm~9lIVt>!O*U2qUJ_CCIo{#+}xkZN1>Rs7)i%))@>3)j8mVf+-efSGwKP2 z(150Un~g4mzU43dld`k(jH;I3w!PRXFb_4U512pgZ(Dbjw&ew~Se#V>zj~v$+bW@K z-o24^blxSiRETE_xIUOOI?Z!*%p$UO+Iqb1;GD62b3r!)boKYgNzrqVmtk-e6=8)t zjU-I$Sb$%>^W>3LdZNNw*1YK*iP(Xhwo#g~g_D?P< zF{`w$_ZP-fxjTtwqjiM?qT4or;P{ql*gO1uQnI(X_7<_8K7o_ZnYwSjxWxJO-nomm z{b$D=6gtwF^Tq~EkEqiN^$O+aBl>z>(S-H>lSeseDGF$h1x6w%tGC}ojf(N`!@Kc4 z{{cs=#{;PNIfJ0rU$8$G5L;J2TOM!E5;5p<$GG`J=ZWQ?17^l@%fd;Lcg9sAfo1 zW{XL)nMs3Iqk#N5&z=!%mTu@#&^>RZk9e3HcM|g1K!*9zV3>`nP_vK$8O*I8XWooA zNPpiQ+P4lz;ZPH~DcfHY6ZdPKjlN;oP6(fSi#Sk^PFuQ!3eI<%8z|PSM_DN^o}SAz z*(lj_scZN+$*|JTOSMnoT*-3-I3{~bkY3_`H960%@w*rv+jq9q&p{@YoOkEdwwq-f4LV(i0EfE@`vKuvt02kmM z66&YmTn~PK?}47{G_mmo{j|W{tk9?y3mFX*xQ;FRWONGK7=VF5m5W~C8#ODcuBT0z zBRYf>sTbUm^(1g^CgyZm%C8Cc`&SZeqq1bSZcu|lkgaZE{?}VI9*b@}GO!gW@l@w{ zS}xKM@Y2sO6Bhzn9A;TPOyN+k_Q0DbM^N%ar!2?Yr83E`Z3WZK{p*v1J!_UhA^e+Y z<{|7-7colUgE?LiW=^}>txz`s6hk(Ml)ol1iH~q}kZ2&^mn~3fSI<@^I9wWlXE1$` z=eygMWGKxxNxHeDUiYvge{NgoBq%UDJ)owfQoYGNeR3Ws8h}TF_M3&o)mTRU%f&wz zJ&fa9Y>VIAhNqLj{1+rU=sUS}5T~NhZwGe>XhqY=1~K62hZ}1EAfYWaIMKp;QFt3i z+^6~B!NvtJA8~m3@XzMdZQ~FR+;K59N_QrtvZr@|1-G$CyD2y0j)N&JnC%=T4PxsDgy9$z|6q-?ig!Ao6;rpV_gm-BMpql)1^ zn!Q|=b#_*C(z6pTM?-h5+LtAN2>iBZGq2d93i!taAQ&X)`O!=!5$IkRVz~C1SN^|t zx-~|>VAh-5>#FJfXhN3&gf%Ac#)NxdUpppZ@1h9cCU=#|{(J2h-YEFZ<3!@VMS*{@DK_Q)#x1CphsHViX=*3FQi(Sl|}C^GM=x7VI<=BC*V#!wUdWV z?-c76;x2ek27p!&1lcFG{2g;9U3gjI7!4jjXA#y4x?u&_9MY6~`Jkp$dPb-k6d^HR z{wf@yMkwY>vSTFM`uTv_yrt|`v?Za?HQki@4`{iKBFK$HVliw4yZ}LNglDE zwQ8b6^EI4Lf@1xcVN1N=w-W9!jmT)uTPv%zv((>>{z+NgxxS~1^Ttj6tnG9WJY^jo ztn$l{7j?n9IL zk>;4}z@mOjzU$()GDQbi4v8CtMn)ylSgDS{Ui*1@&XvxN;;ms5N^_hEG;wP0mIwFu zy)>r6a38 z4T&6LrXcIyUI%%?w!eTIguq-A!lw!Wb{-$~Qj3gk!#g0#CP^UM6WYF_SFpbR)Idu~j?LUQ^pla}02|dh2rhuu zKPv|=qxLQgDJC9aLVXp)+>EiIeWER0i&(#8UJuXH80Eb*$Ud~)##&U|?=NTSnjRNm zC~p=ONAE)E5vdd$d40%oG(m`UC?t^TW(TDmc*GJ}lNcyn&90(EU=LF+Ox$jjoph3i zL%OPIlrlU;D|E25gB8KO0jK<7Q-#A)WtXzGa)0^9`BB*;_b0pAYyKc`>W3MSLZVkk z&pAcjIiSI)C|FcH&P^U)|qC`d7rb@?>u~?8ksJn1(+hZe8 z0!p}JQamO8Jm_El_-3fAl3X86tOC(89j_QTM0(5upGAx-xo>Qo;3Gef{bv05iFknS z@J8DkAr0yp7z!@b8Ggs8y|SBI1)x(#71-P3QTwlu^oO^gT?Cq{2NAYUe?JeTPobfJ zi0scTu+gC`e2QK}eLF4RP@y77BziI|4z-o)V60i5pCWgbpc1An#e$FS<0C-F&grEX z9d5!$&zi9OA146J*m41O0djGx1nAizse5^dzLuD;#&#cq=tQb;0ErVB-Wa+)&`e$3 zdC?(%uLK8`ABRkY`1`||zEWpg;qH_70D^JkjcqqWrojesh0LIg7`TOfi-EDU;I{_w zgc3yzK5nQnix=Em%J<7%;C3VX9{fQpGb*WV?GCP(Z%}&g(zBt8689!Fn7X;eiXQ|G z=$8O2we;4a-3Uu04m;F}QR2C2>!N7vb9uzXBY68#)a%7zz%irPSLf7{y|4U5lbYhP z>JW~#f$TuI%ZDd=80wgkc>S+w<{j>Ok+CZ~vW6Eog|Uy#w_?gmlfg{Y;4^36OErX$ z6SwsQNi;pWKG#R{r~ns=CX_m(wq-iaA&oNizzJ!`xW^%fbw~z*BuKH<03C_1m%4F( zz&on6*W0kvQNr}5m8c1PZPcua^vKG&x6QIvsT^=I)p|59>SN=VTdJup(#cc_r`n$S z!`!^t%bgYS&GQ-(X|um!)M;${)ZZ5=2C-`=74Isg;>yVrBlnEIMgX<*bVai;0~Qa! zoek*1I+q4~hK}`IberQ)_>KDyVUE6;1|>KTXklcq0ZxwHTEWK9Xq3sk~(i{Ff!86?u>vW z2f5JW{71h6jjYkDMf3_F0Rktx z4^sfgG?7ihPnDw9P*Qm}-s~YIWns+@dxirDI9nn9JXK;4Tu%JUX>3l59gcE0aq=Gu zuPv+*FYI-T(C7b>HH90zHZ?!}#(ac83-KFupOhC8Gr7*^pbMY&bm|uZDf*^LIgB2y zK?SpWNuBSQi5(F++hy(h4gE0ZFYZWAR1p0Rj$DsGIqjg&Y;*HbWx7U{51FMBjr~5P z_HU;+j-CC@B7K}k@oz#1Koz#Tv=GI^Km?ZIn7`$jWGi0%!x5F*q4-D9mIeblcYTB6 z>IBMcqLLsj7u=AS!uMsiC_!Wud~;236PY$dZ4@Xx{s^}N0cU44GiVP@K%~0KC22>8 z%Rd;1o6^%)MnG)6@sD>0-24a%Y!rB6KfqrEu5lw;qdH#8G{YEZ40WI&~D(3@qSAMH1ZOK$z_wCTpeicMoX@9<&lVD*tw z0OS$4&(|wZj42qZYcJF*Mcrkv7@JdNfIciaS&W>ozrS&lK*~{7udDA;6YJBe-Myh4 z6|7tn@985rRgR?T269ku{d)F9#cmWv`sp>aJiD4az}VPOxS>Y?C(c&+(~#ro0;;rj zAZ;3-D;5gd?-ah)HWItM2!*|v2G;Pt@&_6DII_%wpX1uGY)AHp?krMnRe+)RljBTm ziIGZ0><1$I4Nmjx>k+6(fFwRrgOA9M-_XdZOIA{-7gTpibOO#7b?ACE6`#+ zRY*aQH0599i);!dNVcs}fS(^IyavzYBRrRRpu>F?=Y|bPx<#9gCL?aY(iIH)-=fJ3 zQ)>i9N%KtQ+Htgo&&7|gM*9emK$lsqn;NC)J|;p}37Ps5wYM7JD<~#F;upBoRF~7I zBkyVqD8!@SnrMnj9t z+B4+|?3ol7^DWVGv2hs*PfhW#0H0ex2r^Hi!W6-&#AWq*XREz$9c>#;5d&nLs;2Ie ziP43OHoFyokqpq%67WXkgzSjKZ$;y|U+Up0fj?9QA7XnTsdEZ5Uf|Xl5s0n{i(|6p6kbmJNFW`UBGeghZstoVQ$9LJbl*4h!DZMk{wZ%_xYg5|DOMK{k2m?T?A zde%Jqh}_Z@u?ciwj1IS#|1=M8o1oJ9GAqX20#!{4%2l6lalzUaD*~)&V>oO%@F;m+ z5f}-Sf`+`OB+gH^?v^k?=l3{K))#wo6A5eu5~CN1M!2t1U554AEq=80WS6>aI-zC{ zVFo`wg@?ovqIWqsO>d4S^1V7B$KZJTU=2!_t}aX%dE78mDiDl)khZp0w~%)N-wKV> zgl8N)OZd>R4JpP1Qk2UtClKQVDT39zo@ujsQ4e($K7ZtkqTxotnbO3qLcJt%Q#I{QI7Jo(C`dI_ z$ExZ=qN^G;jiFnH{zXn0Gw8tr#y@!jbZfBzSlP{7i}o89wd`e*68<97P||Bejr!} zynqODtafg5*pa0M07A}Ur2_8}>fuCnr+EhU+g1!96H~zL_x^g5{vFK~;ohv(+H2pw zbrix=I6QBuay3YhbECu(Q<~==GA3&(DnZ;p;`IwL@WO9O2+@5ONbWRDvHRT-^5;)q zr~AgGF`--o(HSJeztAjat^Vo`y1N#=uZ| zU|#|S=p?}t^>Hz?!gGcw`aZ_PxZ;f27z$4&r}%zX8m2U*3cPHlK-BEqEGCP{SyHRu z`iA2x;K)-s5Tv-Ir9j}1HsP)*S3o0az)(fHswUELENy*mqyzmSboIpXruK(oIvTL% z;dS2budx5XlP<%iKmFT}sv11&bP)(w<0f9Pp=4 zV%J!&uM4lWW%@gbtp9;4De=FmIkKjl4X#%rP80qtBOivd2(UZx~#wO7$=a<|w%(1~l zBkr4&X4t*yG%7uaLcXB^*L#~4+|C2^`kA6LjaFiitv(f+jEJ^Zj(S*wZdCJXvK6Ai z(?)bLq=BIDNQe!}P`!%#NEx|7K7LE{PTx52;`inB=*i<5I;&ZJuyh#J7d3RlW;yD) zbVjO{xp;LcRefWkn%g^;)4lztVBClzy7RPoZJi&~?{Cfrt9CXDb4ZLMh4X_s2A9U* zrg9*GZ(PFGg!7#CBzzWHr>g!J*6o!#=2N{P9BAomD3Y`_ZfF2rZ=l4$pEE|6ry#Ew zcay|MGnd~cjA4iyywa(is8xO}K?y6cSI@mG8^X-pK80K=$)L$J2#?M&_wrRMzzqKm zLJ-FAOkvpF&sx{mR5us{2j`1Pt%RJ%p7cmL(dnsTE9gUr>)i%CFUBzxYdStLp2hB7 zCAjqu2v&@p@2!ceRbT^l{Q}i3R#fYbmkt_-RJ&Kuc7Hzdof6|)IgcOwUb2d8S_zs> zN+|M`_gS^tgUhirOO2x#t2T|CMFMf=mpW9Y>msJ_bt5Z60Pnj-0u|<^W3M`uyn}*o z#paI_wLL~-E>nJvwBpEjS$}_2zv)y0bQO@RF;m8=_K?ZYKMIET2v&V>4*6l^%G9-Q zCiS~Z{B~qWN*OcI53kJTPOng*ZE~CWQiUXk+0zREdG+496d#r_9_~W8u$?5&9cW^D zz{7Dv8$Q;eML&{Yt0aB;KBMe@I4l+J&M zZ^?UU>&`$Y$1L$|iHYwJ0LlVQlN`8wHA?tEPYTd1!8&ZxV3JE&9tu|$2~MC~u$AD- z6PXVnGlj#qy8*MomFCw(*Qd_DVBjt2fDlvyw1k0286$`GCN9?COOtzyWHM=Bgc|Yt z-dY`NFx#$C`C~ChMipiKc@G}2Bda60inMa3Dy6(#$(fs^h^yxDXt>?8+=AmM&&03w za@Iej(avN#?i3ESz$;H;BgToGpg$!Q13Mg1`lhX46#cE73+{mK6qI5e2e!}+j?v~L z&k8BRMheY2AdV=cCf^M!tqpooJCQt>1-(deq}jDhov1grS-_GNquR&wY7DWB!H=dT z%p|t#={nX|Ji~KbcYblYbEr|GP?B(Dh|YV)0&9%$NF z8D7?e2H4t>Cp0ys@$}>Q@cxo1M3_sx8?kAo0q`CABFH_T}>D zn*o)P4yff}Sv`tHoo|`PQ^9!Yl!#Bt3QrN0IENSimHE&en-kO;S2=s#H9;i0!ld)+ z&f7D^j}rF0LOD8?HbDTVxlVcxUP7<^QS{jS5+uaOGmw#d2D}*6=u>!`CdJJn0>NT+ z)YL{jN@a;8J({yf`Fu=lTQL;qv#&oU8ZC)JJ*4s)4>gUCJB}`g3Ft>E;AWh@4DDaO zwFY;kEKpoMf(xc6Hp2n=a8r8}e1>=>mbgPRhY`=tK^qI>ph_Ol2 z#C~v1=i_&-0g&>9+63C~ONnQqsYhD0aV&^-#>T8P>L8TO8uGuiwpD-P#}gKFM!a<$ z_DNtRwL#B&AxU)0wpWeh-ZK~@T2m##i1Nqt3NQjRMN>`R7#wHUw*qr}NVYoKsi1r;o1t`0MYRvPvV}^hdH#|G2%Sxa3St|=qB$5nDJj#7itcVUI3j$ z^o=b&byYh$pYR*Sv}FG8CU#@jfAS>>RupYb3s0eve|?c~{h1EjRDPVU<4_I9z{Z&U zj{tWhXn+CA@bbPqloup@>QDJnD{V_Bj;DSAe>?qsdZ+B!8f^K}8kt_z(!AmPY|3-& z1Jm!hsRA}(Kpp#JpcM0lS^SzP3ecM7MaeMV^m0Lb&z;wT78nwgZ3AFsc)A_)w5k~H zlt=hYiPxNSH?buGASGn#N*F0tHU!ltL-0X%v=9J1V=U2AZ?{O!DlgHA(*^&qvOlqx z7t+h$i;9+A-6?XQ%+MFsQ|VcnTKr@$k23hvXL3=$XQi9|UDUAw>Hg!nyWmzSyQcWJ@dCBd8II{v2BrQj_!PZ%QRI^=kE4i%pX6 zlKY<}h!`?{%RH@v3OvJQUL_5~1Js|R;I~H|-|_r3?+$vltgpzYx5@lai?+E@i(-jz z?&qFqqXJoBxAG>*eJP*cH`ICCLm}U#q(|ze$7oATmVP*#)mk>St;SRY>NYp5Y<%#} zjx=`uLmRm)cz{Gx5-D~Zyrz>q?uR_wm1P4>wXU>mRi;#&N*j99g(9M%Y1me&NK|L#1KmQc{0p~V`y&W-G z^|PNOf^nHLJrlq|+oJE-JBT8Rm=nB|HXaQ-I`~{V8EL$bC{-cF9y4n~$jhHlbuwKz z(yMdrx5VMEEc*3El0etKChL-&QIy@8vn0&zUo45D6?<7oXtZauDIOa;m7le7L!%64 zKW55n#;)Ct)%9bbarO?UJW5{8*{fet;-G|wPhd2jY}w`-;wU_|(b(f9Lx5mOMWF^$ zDaLf67r-o7kL26ZKHirgDKHaasJBpXZ%EVFVm-DW{fY+#+Dg0j{Tqbll#$lz>kxS? zYzesXe`iN$OW789zf_LKuh8V@wuyg%)P0e_x@SzL9XGS$n;z4@-{8Kx5Qdi(bvr^! zI!di3kh8pfF)j^tHAa{=cTp3&Brr@JL;VP5x4IC)7L^6Y_(4EU2#;hB#X203XYC^lC2g% zAvKv^LXp9C2JQ%)PP`PN$g$EQL|Ji75aG1r8(ClO>v@(w?}?A@Qy$SqbrIaW9*lzt znatoDs~&hR@UKd*g>GDFQKXYkIrZ#>WQ+(i#I~6N0rBiZ#|od<^C<~?#Z8(tTY!-FqihctVdp40HbajLj;C)2(@zBZ6p921S< zbI8VsOBY9|J1Gu_1L5QC2ZLETjOLyE zh8zSLfRf>2+U)2TS9<1!AF$ZAjlcw|ZL9?t0d~@+3ksA#q#vDza$9k}F3lPfRMfy+ z{ci8ItK6~8pK790K4<0mVIF9JHRcgr-+3vGqVMo2ZR6Oe*Pk&|Q`=hkubW{z8_^@Z z7jY~3etSc7y_Q&Es&wW)dm%0D;275z$GXr<->g~V+X_B{-&Bew}**t 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�$r8oA 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 d!<(RmB<^<}^~c9i}4o8Sm-r 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%0DV<`lyJpp7KB0KblNK;XY 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

      =Q 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%0DXNTF4iyCiU)XNpmjzKyr6nXbPTeK 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 z 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%0DX6)aEF_;c}I**#eh8&ndhE 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%0D`v~F7ccI0Iv`|0&rHR&b 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®7i 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

      *`S<-d2p$X8F64RO@f1Wle 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 N_<0sT{b zh`?tiWy#TBXK&0}nI*o`o)2Y}{V${@^O|+|6Oz3QG9cpao5aU6RsM5ZPznu`7#wIa zrpt7P52Zk$(`JC#XmWJ2$ny`j(&h?muTW}>iJEAowq;zGUAjPZqe*~h$Y7AAPS&?K z;ATx;2yEI1Fmgmlf46fOUM|VWWbmI=g`anNHPQ(f@(V$wqw39Zs0mYOKS-$uFI+o# zpO6`Q&no>o4p1PEQoKfb7BsC-7w@jmW8`VQ@76~TO0>6v^|~mfdFZHz>@KK912kT@?gBMZ5YD9I}VITiuoBg7iNboBx?zpXZh zAz1F?rv%~^(l>NuvqLM^llirHRWHxDo1Y=*Dh$^(RLbZm=#50lJ9a7Z$d*BCDQ9*gKMY&mIts4*Tp*4t-(FYTK~-@`DD=nauSPZ>Y44r^D7B9iQ?Bs#_3p(`8AJll zoPm#Wn*H(nfABFo3+SbaI^iwXJ~y5E$rrf+Mzxj5Qyt?|ie|c9Pc5$*=Myh9&_Ob# zE3~DDKj-h$OpUZn7Gnbc>#TVd+ zk5Oq$%BS8qb&46@8BY~K!)Lta--DXjSARp8NRaoBmB`6Jgn1pNO)rxtXlS&G(`ig- zv`mgdlPZ$j*_h-|8erbh=6BJS#4|&~MH4t{*gPUUIu9WSsd!XO<0i=F4m1T6@&3(q zgy`2%I2pmb2xaJTl1z+MBjf7m5MmRI?9dGG9y{T$WzLS{ zJyn=DX4u?o#- zWnOa@2)f|XWP&R7xLFH|8RTDGVSS9zVRKU5Q<;8Wede5cigyo|8)rI^BEPsHX{X-c zFT@t0iHs3y-CZ6aw~4SxkL$5!*(;Y7`ilzNPYz{s zL?mi`aGQ_%e^n6`Ol-^*vlyoKg7W)>jc=k;Rw7gzmr(Qj)}uuyp{CMgIBb~%wX?G_ z*i7t=z%dPL5(PoWtBrWVQ3)G|V`hyA=1_8O{(B|ZI6=XznP#Ba3#yV`8cq(SFKFZl zySTYR)0#JKP-b}+?GU|e{FlGflFsB5NlUM2e&G8-(MwgAxIh^$&;uPboylg59;$GF z0Q!9xZW(D{{9IMHjS%r2S*F!xA8v{u?w6fc7qgJVj`=bo7Q13R=D1BY-t5^P^O8}E zfw*h)o!2zOr7v?~?HS~~BDyFD%Q5eGX2hZD4wzY?PoC5r*|6V;jV*IMgkt-tsXsJQ+71J0tmUp_OrqLxX!Y!3Zta>qyKot3J}uR3ZrQe*{Qlf) zuGnZ97|tuM8lf01M}Z{+L?g!P82rcqiA%u2@n23`a7?4U)8GEut_o?`V3CMqDvwtx zOK`{>t)gb8QngI#e#}`>&^87)TE_zgXsR#j+a7jOGnjS)Gqf>Ey>MC55-!^4t2}ea zI|aoSQ8m#RA4iM18NHdh1+$jBI+Q7$z+h_l{`He}zLl*eKu=m34*?-)^qC+N7x|jh zr8=JvC5RdZ0c#DI53^nkO7pg}c;2S$nh2sL_^?zb9|OO|OP5s~IrjbGcnGR#1#ZM5 zznj;qww`oE-a>i<*=%X3#X=7NN|3sL~pC)VtgFqcg;nFkMspPT%f(WgrvW`v; zQ^0puRPb~M(g}e{7OWTA$JGa0;pFv;j~t>yi;Rqfg9|dM_8_&3S!fs9i|vMSTaGo= zMRRArgYm~5PCTm!bAdgKI zUe4d|oG=I^%vr~joiXC;aRL%bJs?=*ImfH0hz;0BcxWm2(|7Di{Ilx)I^m3>W2vjF zA;$Y3k=;}~gq5AqAviv5YE2|PKIO%%j8cAF$2U{Bf=Sb=%5WdL>|WnTfw2A`8Z&|M z2lA8a<#H8jSsk^jq}4~VB3C5gc&*nOId;XA&3TvSFXs=B244BdqEN-Z&6N8vg3I8L zpFLa&WdMbOUV;e3NE_49V4ywRT{t-4d=6TIcjIH$oQBacZ;eWbE{~57M@@r;Z}}Yl zKg+F%0?8bO{g(iSqk|KKW*Xwv3C4}S; zBi4yk#f(-@5I$%0=K`}#%2WTab++TX9q zZ0x+CCUy-4&y5b71G3ChN5_xU(QpGRvj9k3BN6X zA7IZHmJT}uQ?ao1FJROLA5<@TdjMWNO{(wTYps*heL`M2$hr!cBOZt^&))i*VBLHD z-Prj(rqR%Q99d7fWpj~&1UmY7(;rkTB>$gZ+sc>sKLvp}^JaldVJzeMrKLMlqw|I3+W+GYd8B}{f2)+E zk#Fhhn@s@c?4RW6RtYl9`S=H))^Id+D1@_QVl>52ExB2D;Y~MxB`zQu^b#KElXF(Zxv(7@{|7%XY>bJuA+X&rNr_JLsux>+DgZkT;jZwZUBPwdh}CexpqAP?W=_9jZW`FW)Qzj_v9`o_V1?deePi1V2$n4WBz&XVp9Yx&RHrrr zLSQ#T%vuX}h8T%GuFxUasJG?n^l>xa{3T&zWpC=9DUTy;+8AEatATB+adQaF6E^yF zt`^V{MAZ*&5~qI3>lqq}(`(cKoN#bKWN0KMl8zsZ7gk_T8Llx@>mwB=b7-VB633qt zoj`@VZ@3Vq%b_lFlEmlKl3p@AqqS@;9*lJI({dKCrxOpqde4Xp#P$e^=OK`6ykCjc z{=R#N@fj^XO)AV;VCtyW2yO`KqTufcUyy^zA&tf}pyk@=w6pNCRB}52$O^H;P8>TE zrA{N)%N4awp)=}mRKm2MaZ<_TC30|ULZfM^QlU4jW>0}88ONF|T$>J%Slkk(+Ox7# z-02e5;Q(X3gl)-Q>keEUH-G7!A8GdD$GKq)`=HV}=STvk4zHtzsp&jdoG>@Ol8I=n zjd3C(w-3`*a6>%yNXb;Ry40wv3fN)d8ntv;p_r=QTP+a6#vF1!4^XB~*>`3EKJ2C$ z@4@R87Q8Fq*Awg0xf@-49|#k1_vk`NaxIK{?Z#}7o6FlEog;8Ua|^kFQM#zb241+B z9y2^j(+zpIhvG_b;eAu86oDFXqjm|XAl50Q33Omq_ht8hE1_2GiIIqza5Pn33bP;%cySp(~i2xs4V_%EQCfWPVB7;A> z8OqHw8moe2Vp`SLCED#1ZK?g(_3V8~%jVR|zN8J`=XI#E@DJeW$F`*d_}7}mubBk0 z*q0*J0tzRvtyA(~P~)2U+3W9X41F3aEY?r=XxK*?T5xO)d`DP;&sC+nMWuCW0tauV zK;LxB+Nk01-J`4Dm|g6zQ}8*bPHLX0trC?@lPO~Z$PKl()c5?Z$no|YRJ6Bl+h@pD z3E;cLG74LmfP88l9&=2(H#4_C&Gk~FNYS?`;4S)!i$ED95yncXxJ9QJ*+*2&0+)-- zOwu&&d6VquIGG*(+j)xJK!O);I{H|=0a87eB-tpe{&^7!9XxFSm>h)x#S_Sj#QBCg zbfli}?o&xL>VWGaOfoa{1b}9RV$;)OHj07eq#H?~TEX$RXnDe_aIUJ3*67n(`z%Y8 z?p2n}w(=*1{C9kj5V6HtuTPYOEtxw%^&2@SQeW_eXgPHSyaNUb2EE0_OqjAXXiEw|k-U5U9 zDiX*wrNC~y*5zF7b_@YTMU&5^&RB?@5VQ?A#Y;(525pA!LFtyM(2xN-@ptF)(&5an zaa4&`(bB^MbJkV&kjS??_1Hl*bOgR_e}ERE2iVZF06(w@>n5GrvEKYii44C-#Em`7 zAb@9X2b^)A88J#pqYjHU>_WzTT)3egTitX!E=)13hd&oT+Aoeka&o-`!`}Uh9dgxv z6PN9Qc}-fN1sDebARreEBw}2yGre^T76X3pjC5J-<9!wkB6spqHoF)mM{MLN3XVEj zVS?O7K)E>hN~!F;SO6`>P4$14Y4GOi&OXhQVfneIPX{!dHU|i77NRe%2gSo_vYI7& z0m9!#K9<2kP?ZC?y)^>4dyhliwlTm8o_jV`ZQN>$p`Q&nNhj|qkVqBK5mo0;?4~Efhng@2up_rX!AG zu6&~4hN{7~AHw1qgdG*%UN=TQLQ!Ro_Wv#!&15-YkB3FWNtc*n$i#J^HVmg#MY7J- zd1^yM;^>K(-f?&u#jMnkA}p@35XzUv)^)X>5NUGA8WrmMCV?r zm5{vEvaCSeyDe_lJQu^@OoVve*?Mn5O0N_x5c2gEkiak{M|&7F^4GNRxkfEWDzu3_ z3gl7ei+;p)XgV1Ak=OeJh$b^tm_0OZGy?5BAA3ZIiJzL}9k-SXSc?>saV|2zeb;)X zgm6M}c*k-kV=d{YrH}3O#>>pO=s)b|+Llj_MFc3+K|oTGy@GgcEI~-_XpLJIeh_O; z-vo@o%d2Fv|2cFjd0aeL(`l@u(gG>(algB}+FtX*aZ|9)b?fkhh28W`(^L1pqjh-r zd4~jc`anEBKzJG%pc+Cwlrnz}<(w=~nfoo4lPP~UMU%q}JkhG-F7*g$7dl%;V2C9L zU-Rfoc&T=NaGCXJwL724OOz`q@!n5eb;x1_bGV}tSM6G zEFK#8Ro`3y z>h1HXr^%KbRy>)^1F>Y3J@cv0o8pavkAzUE(LB%eDe%Nvk|Qt-YT$k1WoHS|K818A zX$OigMULZ|Jyu$mb!)+H6E#uUOx7@!r+1btHhp}m*L9|$PZLeh`er{_Zh}#0qP$FbQ5}zQ~WT|kC zgK*rF%FgN>gkF6^8h8)*1v!~{N^;DlnCbSy3m-b*h^db^aoAbe&Psxw92r|lc)PSv zW>=+SxB0emRXCKXvUt`@J;H`~Vn)Zry~`-yx=I4ahY`@4QA@D$21le)#{Zo*^#wMO zn3KGD*k`c0$drMz{=ZC?Hcz=r=hdyOGSiA+>FAd)fdbi$Gy8z#03l)L=+w0830nsk z_$PS3{UlP_|65K!dcWF2p|-|Mo_|;PvGsT9LpOh9O7Z*#H*% zOX3DZr7~0kaysb2`{GS1hDWzgh@%{C%FH>yW9In@R5M#so$AqYv+EZ`%+3zahtes-Qo^TLv)>GA}n3!_bYDi7VhS?{B`@%Pu+aIPkt{4R~+#TDsFR)F&E_iye$KsQePO!XH6dNDQn$oZNh7YD{}{JQK70I( z51y=Rzkd$K!A6W*I^3{afKgfKmx<(?5tD1R7{U0ru4)~z`}rQr>KvNf-FxZgHkeJ| z26T!)LtKx@)@Q)3K5t2>`>0Q0r0xd0;^izit0oXQ7g$u`QT&kc?uf0|O|vaY>fZMj zcda}>Tj&(xQH)D+e4j0qZE1`57%Li*G|?YZeTA?wg{}hZ0t7pT>xo%z!Y%t09D>EZH2V<-Sgw_? zk9QD{4*2HU$A9rfRfRFVLKDVGmF2M_&07QfxKS<&GD%j%FVGC2c~oFzXWgVx5wY}l z)i#JTH-ceDXa_AgiqEv29*MFbt8^4k`?Xq55sdL~4HHsKm&=!zH!n!LH$oVM50i^R zgr^?A2THX_giK+i;{K@!#l@GU?T2UY->C8X2@uaS{Lc}15p7DaO^7qfP)YqLq4YPT zc!0KcRUXKQWe<;S6>h8Wz~E_aJOAbA7p4NdRLX&sB=q5-0@G5tz%8Qj;3os08b9NF z^d632BtL>@Y7B?!qNh%tG*i!j%t~Pjk9kKXwy=+tVgBPDQ}R zEz&lZjl|W)(b%@7&G1fF*toh8lPK7g&v5U!oBOW5LZ88-Cw$?!vtUVmNPjH;=1qihmEE?Fd&tnn!bAV>4wsi!y$>BTgHPq zgpY$PoDI{5#oaqUH()Skh@gI^fy0foVSjK-O}(KE365=ohg5*yU3$U+9zGBYOKL(S z1f| zJs;ij9KY#s4fl*=-=HXa<&szvQl_>GF^SV84-gUolgpELOgKPBbl=5IaJ~(F%h5cQJ@^gU zgsLYngWzj-HgjwxDlu+HJ2`~=c?W&l6uW;tTym~1GkP>{{!Y<zZM(X) zGai)>`NJcNYFP6OrcQX~b63hX6fR#HzQ*fO^xb?e$J0e$)|Tr#e!_nbTpl}XTae{_ zl)0Ni-Hl#AN&4Jln3-QXpFCjR$SL4MI~DOammS?V$Hj9YPV)w`ohxmas`tyDIZxz$}1f8_W!U(T@cZqj_vuuC8$ymp_fWK8? zp&gK3`kk}+T?4gbCiw)Sppm%8P0drt&_<`YvZB>@9ENyQitQ*o=x8XiELmy56wot~ zZ6Nxr2cHdOCE_Cu;!0GWJxmqYdwh!=8+^md(sQb;<+}$YOih^8-L>C#sU}sxh>cWl z3UbHX{j*elHrYplQT!-)H=zcqit9&G>50MR=)C$7Cr3=S4oy0O_fMGvme)$hjVlm> z&_X(_Uh2YCUF$h;0-Cz~zb>~1+GT64Sn`wlMMN+&zx~DcE@y%r(Bgf&N+ob=>s#sN zSl=>>KuyH1N-8M9)~;6inE!6z)-ir0@^eKAoekQI+{j~&V1f$g_N*qQf{c*ufDgg&uOzrK3z$qO_YauA>D^kFD56`tH$Qx~Zm&A7T> zV3wO6E{taYUmOTm?GS7yM!85|7~Rm4Q`684us_3u*D#Wtwhr(Tzlmmla1%E znQQ=*)B4C)4TD4%H6Mf7@G_8|T*b2Xwyr{Bl$_@ai#j2#U9)jQO>oo@11xU|L!E^C z2#sYmqf&FU>uO2$kQw#7Z2Qjb;<3$Dy2@kVjM#G2!XRrzSq1&6l6j6fSt<-t_LlX$ zMi!OQ;{y4vZzmB`_&F6e*M=0bg=l0Ua2E@WyXH3Qf z?i5n4^$Po|*Eoo{?k&U94+I`7U=b^w>8^SdD2|#LcY1cO+Alk(`*N|AkykF6q*URw ze_yvrPk3b!T;@Ogi7L!@??V`oDnts{Tb5-To4U%97WNqUAinPCJ%;DGopFVn-7#$} zr9}D6Fn*yU)g8pX29wfjse$*PWItQuH_^K<@xOctIF1wo7H-iUntCGLw7&Q^yrU98 zwTtTOk3h;8iV>;Gi_oQcx1F%P9SausF%@Ts*Y3UnjoQ_sJ$d9OI;>IFU`5#LVdn`! zyhJj_EF0!{P6i_S9)LY(wX)ires|^-X23kDYTgD9^r^3l4$5-2;At{v9oZnS4z(YN zZVEB`B{TkYZbbfawu?VKUEjllBO~zhYu+HHhv*U(BN+xNhp9H|gMVY6=Jf&bJ`<{w zUfhw}u;VH{EO|;~Sur~Nl$fEC<@tgZiS1{EKAjXTE0l;FWb9F4jy*|Y{h{kYpF}ry z@b9~&=DnwTSM~p;osy!lHS7r!6G9&ZA6LBmSgNEsYpwwl`qEU>hRkM!Qc>>sXWrMf zKYy*M?cn6C99!LihF=l{FHr%sUK)0qU%(xFEn$?kvpnCk7_O}$Z839ZQCBYx0>5(C zk=z*e72#9Luq->%=MC3=brQU_4!ioyZQ-<_rNBm--nWyQw6IGfmGXt2iGYgX%6-)E z9%(Ye6nr(Z={j{=qGeK19i&}c8*NFSZAI*SnirFmQ z%F?d8#T0GPdzLzR&hA-Ip{fRHdaH~m-qN3-_fm@eUTRiaf}H(v^&G6e6kzY=mr@8! zf9?BCj0xec)rnJuDxFp*>uS}pRL~&fAcTAbi5h~SrS`(%c);WQQ#)6P$Wzsp)C;`# zq_nsudC)4TzkgIT-U=&WM@sy8Maz_&OrQ|903xYaCdQx@!o_==Asdr2oxf_<6D3Xc zC&nL{M&z`;m1VZfChzB@J;8RLdrGzFPBZqkTcgIqa9lcz7bMwtO{Ioj-*~&L)v;Np z%m0ui`hZxd*=03_(G9?lf?`~o6-$Pvi9)qpXDIVk>?)#Ct&{aSK1`)Im63$Wg7Vo7 zHqNnB7*!aQxMP($=;zT$o1HMR>*fMFBLeX2d>nM|EKhYPI(*WXiGl z1R8=5Npis_3M!qNNnWKnVOIDj#Z;gMlY_SwC=JEo-~hN^6>6|&`TR9QR@#=|w|l%A zHK+_ZpKz0!6Mbn6t2~iw~c}KDgYe9E`PYocFOClu|)mi?cMN)BW8N7V)|7t zufOIsqKizX1tl>z`LjQsx)h6ASVh#L+j*SP)H)^6Uvv?u&uoa&<-T~UcO)ga zZqUJ%VS7}N`;nNV0j7%%>kkXU765vW&dlDgP0}gnDn`YIJ-nUr8tvg#BlFIT8yM=^ zzDm&*%E-1aRH%A0`ow44X!bj{4 zbOels9*~6=lk75^=V(u1A8xo}-^9^faN#f`vNR<-8qM2)cN;ok2lza0%$+W=b=gv= zhL>Zs>IP}wROxH@UfhmOT662r;nZ-f_~v^wJ?$-Is|pfi6c*iw2h5+*ntUT@llY3Z zO-6ddL}?4ebw*u)ePnJKR<>4ARTIJX#|Xn-Tr#V07@Zzlyg^C^0pmIn@>P%UHjKTu zv--{t*dGJTD0pCLGL@iWRaMVXS@hV?pKdrWScWSM>V&Ub{|`QkkTJ56&%;MP{ewIt ziG^vc|C{r!&fERLkl7|UmlSf3^NjH4Lp7{~QT_MJ9||C%FH77BoZ2g(atuv_zi!%_ zhU5XufY)VK#)>w@={0-QKwFA2V0>{D@}Z6@H>3eUq;8lILUDN4m9XGi8rjeCs%yYO zhRYVcIt_7q)SXplffRTEofBIi;8-igUGWlUTBi@N49hq!p$#A3$G*_b)E7=*B2RT+ z!qB4uw1X@fHP-=ktx@8}K95xFmzNquS1E%T|2) z+6b>U5j6iUO%Gig-4|vVPCJ63qkv!~PA0r}h!C?A09P0Xw~blE-ZBF)VA>}nPS1~O zgDZ9f>tvl84=rsURX?iz=)3{b2Of3Ub;u3B7Xsikl?`mM>BklvtdLa6VJ#84PpE|V zmE5P2FT`dxX5&8ZR7eYrV=vpVPq2qY=zg*6pBgznMs$nL* z@V5mvJq3o6{zUk0u9le-VL3r6|kVW5RS!A1=gUtMs<`27i-Q0s=uvJ7=} z@oGtA-kq`gnLF8~1E%NI^>DM_0shCmXOmHDm%A zKms_ht$fVLV6HGDfx0e=%@Hym@0q|;5q}F$YeF*&BlJ4|l-)PJk}e<#O&%n?fe4r; zxidw{YDT4*1%q0Dv_HE8_~^t~yPqSrmlb$e205!bhaPJO&pQ41bo~gWi;Le4NTx$7 zw|6{wt?S0U$?YM~( zqx!x;SeZgQPMH4OkJEwukgLkR+e^ETP5lFWw`hZmOBo@033R~ier3x!hDz>+0;q-K z@a@SjaDl+8Oru~oZ0`inQ!UptTuULW>)GF#Uj~EFESYQh7C4f|&)Uue@q7CGa7P3j zaIyVX%%ieSD0-jXLB+!CBAVLySbMKLpynSSQhe6kUI? zD}0uwo7+y+3Em{m+9FOR^2L_S!Xdk9x>%%Xac2)M>iDw6%$8>Fj~-|{-l4jG-$$3x z(y5FGNw*w2FuN@eFkqkLQ^KHO44N8*Zvt&8*>dz`hYGnW&><@@{ld7HvvvuhZ?bPF z&G&5Qv=t45j3zxlHIHv=r-z;PBaYV~2bx93(uCHe<)5HGWgdx?05^r>jXhPhC1;zh z)ETXzOnt1*pEhv@IJ*Vh=~I=)@~h$9cVeltcFKp$?7RN=#{gI{sugDHEf0x5KI=66 zEkOSv^r&Tcx4YZM0?h^2?BX=MizS{CSFS9VpN=+s0XV!mK@x3p$rdfZuv<|%>|#+@T#A$p?|JbP>ZdMiF~qfS8L8PQ{r1} zG6qyYi=<^a4Uz5RkJWGZbZ^#z5%{PA@@R*Jv)={EurAG2<3LwE5Ak%kT}^2E#TWf+ znAXDE{V94n=LXw{-|%zJu3P}X01P!Xf7NV6U%vI4GyabBn#*y2 zfy*aJu30}6C)rRP$EGpK*WaxL8iv#*H1(>HVDk4}x#fHjBv2W#PedyNu2FC0M=oHP zzGn}Z;?4j>Z>#TBqoOs*kQ_E6(-5K^2?*eM5vL&FFG9r-3_YI-S4#L}8g{_rJEEsH z9qdY$u7pt-x0tY`K=`pI#o+7kddF1xvDFzemflyHl|q3f{%9i8;2L8jC*7{us@<22 zLOI^{&lKHP09*#3xf39H|Fi74{gWo1+_fZZ$W-wlakqhrPM=pHESXVz^Q1Kd<0c;k zkYbB(q-5JM;G0627D-vFO52fxg7il*?-L7gsElC2eS0xDRA&#qY-}cDJktC};oKp?-f!WMOU&%~{ zYv`;RUNo#)iee+pOics5T>=Ff6IFZrrHbLFMeDW(V}&R7Agp)Tj3>%E<1P3h6=hj$ zJZAW$j8de4a{c}2k0B(jtQ1&hO-Ocdkn}Sp#p3-ParWiH=4P#zheLbPHI3ADNjgGO zsD)xuj}UT`q9+GLsD@_CP6w`<@G!|13c0f-b=uV6i$$^E)*L$tGM2?z&uB ziUKf2ViOSlx=+irNzva5Z1GAYo3L)bm$p6qpe8;=DC$*=_#&pVN0Q-^Do4FFQP3mk zi6nd#05J_5N$ySp&b~4-Dq>>s@>jq9mL%ZHM@*SVO^w%*cq50j?srq;)!}5#UvG@6>L4*3{;&$QRt~!8_52)vhP~A`|DeggZWo1 zYyRb&uaSwcWoy5T*A99<)L(=X{85<_ViI6xK2Q)(01LAD^eaQ5tG8mKAYuMS%KT%c>|i6$S^a%oQM`}er9Y^5k@gD4h;XV2mYZ)<6y97YS-ulS2cW# zUl%)&^mqkYZ@NjxIEBl1!o_oN%_%SC@!)%G#0Z>riBX8~@ezJEad$vyT?oM$94iG) zOPFJfcYtx5nVHi!qh?2WAOSWEV_I!45EtWv^`>X{OhVfHu?(txD4=?9QX{MSW7?RygB^XO zAH#SJRCVzJe`)6BY*mW;MG25dy1U*MGGQLUCw-46wS16lbf~&Fo}FNKpS8uWC2{8P zn;XkQBa#FL5C99cH%e+Yxrdb+p~XoQa{C!74U`PzcGS)-+EpcEz*R0Va>8_%MJfTi z0W>#i!#R4NQ{RJf!c_#seiXH^_E=r&`MV1*CLembJspqBs~j83mSlj=j#NiFn%{8} zprh4=gqz5-FOVn9u+%8Wm7lnkqB`bQ!vaxzaB@aOUOI^xXna-0tBg&70MP|B4HS6e zc3;aQwG8}zxs`vhLLmz2c^0=BC(f^;rRpHweG{(_h)<4xV2YXix441N@@T)i~gO z5uT4gjD1f{$jz^7N!V(|^Zm9~1NBKgGqpqf7MgWy>gExykw+a(6^!F?XVa>FYh-Ay z{4@HcpMEneAyv5w%`$<(25o@Oj%w_3xAj8XZf87rt63m~*y%4156C<+{*eX5d)@}BIy{8wp(}0CJ;CC= z7(wja)|hGbv=M1I5d6UH8~itoJ!{_oH+b(WN7Co~4My^ji8!cpk=xg_d`_#n_@cVv z1_v-45n+4v+H`!IV(wR)xCiMWSzf;i$L)I{0sN0jNN&6CQY-yu{>K_iHk>h`br26^ zEPoOHY%%zfwa3mw6*M>!^nrFtzW*X2HEoFBC{A(rbb%Th3e7_1;lRpB81AZDgJQF+t zf-}3NF5>O-)jKPfLe{B(?TR>?(1LZ#Vd8J-8 zpB8QxrzQgqKorvPTi8_WYA)-J$Mb7l{ToLsx`VPccgdkh&- zy4;nQmc=SntII%|&JQHqp5y$SY2(Rsd0Ed##PK$Z^8P6ni{rcG!4C#KYe=-JkHuwq z3~?(c-;($$?+pEE(-Jgv71zWlpZ2AO*8STHNf7!u_wAEZ(a6s^ZkdngGI$9T5J*e& zWdgwX!J}v7vEqLQ;w@d3=)b^4O+L=^Ds3i06fD5>K(;5`I0@4o^tT;ZBH$%xX&LL{ z_ZcG?7+g>=zf*!KD;NmHPe{7m?|dxO>EN+n$+!6ZPg7J|DVcL13j%nb3D^XA1j_>^ zIzdTu_$b|0EsrZOoMkWJv}krt?C`KVmSjjuxf}6nEd-lTK6(^eE}YdroYC_nYsdP` zo$=|j+cNrG#ZR?R^E%f6*u88K2XOK1bOhWqDy?+7w+8tY zG%4ui`-si$o^GeoWl07-Y_65Q=O=KmbqgS^_iBD+ngl@po;(p>C;xMR;vXtm zNxJs&-cIa;QUEEO?@|;lo@NNXiwY|R7}G%#AF)N7(;_)oxqztWVd`2*=lz9ma0o-_hGA@T0I ze_kW1V8iA4qF8KzP8?2Lrfr_mBlb`~wE?NQfCF@5%*#)M{KlL~4~n%vuOmMpQN_OK z7V+Z1Bm@^ITBm<3(JniYjB}-bgic`(v{o}5@fa0@m4H{6%~)PHs;MLzSeaxGh;q4O z7B_PDpQs3hk(i<%H|&4Le2HUe(eh}`=?pGHBY4KfbjbA0Xuo_I4G&$$g+kXG%p>*p z_0jWcnn#S!gt51MlY1sq55Sp71)ygz$~&|OlI zF`8cJ!*IG3UABvErR4RNnYDOpaF5guSejF4>@boBdj}{31&WCWtkH$#jUa4D zP(bzPBFEU^#!7WzPRbyhF>O~;WAJU`MK1#`KZEbibQ!lll7!l=QXyXTHjgtYPxhQeF_Pwv5N=S=xGSTTB|DArOMD0BtPYJv8#on$e>wyWjEWc2 z=(h>HX~GC=UJldSxQ^~y6wU*=8|V6TALPJ2~Z@^`Ho+I&=IuRij+d3pq*A7Z^}q73P(Oh zzrW`hjG{&_fnLhNQst zW7araF2C0Tpqn$GNT4eBf@zAV)TS_|=#MzW4Fxm-f2LTl>6B>JLGD7vdt_@5h1lpz zMnJ{XUHwq>>E*pMPxRCCg{k;kC|e=CSg!!PC&xkZB_J+{H@UTv)ocFycD8LpPlY7wL)_Yvtz0y&gYaG`H#$^&I+3Zc zrUxg05Y{RWvY00Gmt#|I;Z~Yju(Z!WD3kYfG2JPANfZFv73)EtuT=KF{zvq-azmb_ z=b?%Ci&@7b;_>76&a{Fr-EotG!K+}IP0sxhSlVHMl6FmeCohnymV3lsFRL;BwL2j@ zrp|y4tiuixl-K(sbs<+3qzWxQ2}3>>jAD6dOz{Yn@x)`1vS-F|FFP-Y^OQTFkt8N$ zJRe>OyXgxp>O?P?^Gdve)PB~QSH9f+cQ^LL?*^kh548dyz^Hy9?|Sr@`+b?!wutN6 zs*@)v^9l&7!k4=046Zw^F3_aI5{Gv%>v~P!2fR%1S>wjbmg#jIWu1l~-a26{M1pR4C zqMdfM=(-i_lUqlI;;OyfRERy81*$7}Bnt*U-<f+) zL_DvsDcw-!CVYhfx!`rMMz`QWhlDkb@2}Yn#zy{=yRp;xRgU#%hhWP|6ikTosP{>+ zj`8b^{J-@^^1^8xXn3HTgMG$+b6gx4nGU!xkTEb1{$0QFvO;y9tj`4Tgx_Y;jIjDVA+o*WN<5>4vKTL+ z0E{g4=DQk2Oa~^s082}sHmVjpP9asS)7J)Mz$KB|`Y|?lFvbqF{oigzM#sZimV}3v z+S!i$nh_-=5SF!sfR;mZ|0P2jYUNg#RwVL-)G%Wv8Y}U^Y4(lz?Y={CQq}-ug(uT_ zM_8kX!DcYyudF#7(GP2s=ERmk?}%FerjOxSgv)!>j)$taPmwqL#M4^q&FMRMX)hdb z@x9SKF3d}VX8~Rrq1CihX$o~*)uUiF{Kh=#BX~-6L6*rEY)=Gi&(Io*LRLHk569w$ z@8;k}ZVP>6iAu-pp8y*v@+VNtH+{k71$ABUcvU*vI#RwFvAvbI2*B4!pMk)+hK78k zYeBCtU{;mtFkaL=tv5ofE(h|!F%W=%-xs}gwV)WfEx5vKkL_f|7uOMZZ#_UBQ>(>l z?-fFp4H+hO>Fh6PwqskYei|qi2I?|qi!}ey0DOnN{QN;g8nIlA zwkTSRw(K@z<3~EgP`#H4`GzTx(K~r4FtK=N>Bd9FO&L5ccb#mV1Z4RGU5A`p@X*?l zLiW{Ad~SAyDi3CSA=d6=QN;X%Ri?_BNpm-MusLTZ1%}GeR696a-z~JPjrFh&FFJI(v);MT0i|Tq z{+JjT!n~@$+@UN@bczbA({M{(Bxf#geImh(K5GlR&|yyUY4PKFNZi7eO%CMMXX}{z zst>tPazq@h!R^|d!R?N9>y#aI(TwqbR!u-#p2A$VMaVaJ-#~$(+h9rKZd)zGb{6a&;>~&S~D>aX1>jIBj{#d#l~SaPrNrlyq!o)DLLnn z-f8e{#!ykLM@4(0`nznPClYn>{Ys$%Z=~W3cO?*}Wpy@>gjw8={&lN4S`dVVNnfQ8 z%+)vBTyKKr%UfZZ7fhmN7p0CX9d;1YyaMv=;bB{$<_wQPZgS<)<_@VeH${!OlUW`~ z13tsbgZ7c8)7CDHT(N1lmzUOL$z7vo?0NgaSsSTe$NiNW#{}v#hafpj;SGY5_W{j< z`Na2(QKfiyl$W(UGx&r34V4Qp9oe5-bnIC-XUF=4MU*|svb@-AP^DRq_0;vi(Q z`rZ&qO*omi)of{OC}Kf~EOV?=P75jhFbXmu=I6Rfx)N zu7Guht%e>lY!OI7B%c<8g7EpdC=j9{xbku_?Q(kl6sklhVw6IVvu7>!xtdHvTvlT7 zr{aTbbW_HtSmpI?e$ERm=BbtJwnow=ejt9cJzI=x(*rCF{`W9}Z2-kQU@VOO*yn~= zq&`rGExvK<(hCruF$#5ZYd>EI++?#^DiIcjay!M5?Oiv^CAv-GS%26@j(A(D^h(Ox z%JQ&9!Rw~aeD+`$)Uy+63;CC=tc0}Gmg31ZIGQV{o8AFC+pv7!T)KU91%%>aUidLh zoSP9BSO{csnnpeoLg4G7>lZC31v#U93pA z>8!}8>&%32TO2IbzlA}X*2o4mb3Td#&?3NYO^6B8m>B_X80Dk{lYt(lD?Dj^RDb-U zX-OoI3$BI#d0msMI`?K8lfq=ZNN+*%Nge&BE|%2$qn@>B#Z7PuIUY*M85wc35}&6| zAdk*uJk~~E9@1TGET?AQw3zOF6JHKfG=v6YKKOy^wN(q*d5xQ6ke4EDF_(p>W;j3u z_FaRq@iq`?1?uY{Jqp|gdcs4vq2tPBc;pYd>77b@SQG^ec6rsjQP?Gl{6qp>q?HJm zjbgz$M0;l)QK7-RgxYaN+%-qWXhm+L-y}dAtFp+_>Pv7R*rWDhC?g4|*nkKcv|Jl`Isf%kAw%bor<18sYi^melxKy-5 zGdyfS1ROv;CXu~VBBfY~Ja@iJ*bC8yoxo@U2v`LBxP!&1ba!kqHT5=#8B9Zyc7!n7 zY~RdcmnFIF=ysI8HXEI`rj`OaR6xl4VK{x)^{R1MUMNg>Vvse?z+VnK@t;UUQ>jJ$ zPta$qj9r88U?nLwqXPj^|zV zCA9#wKkTgY*+_eOW)S|0wdhM0)kulZZfMG6&B)=nPec0zP6Jh$eo<+iW%1*AjujWK zQC}n06B7VDf9}@oY@@lsTD`&$E(d+dC!Jld&fTz=Crp3j%07??>Ho3fGVso2{MD4; zi$8g_k9uoEt#Pyk`T&F}wNZ;zwOKfGJ@-i>*X>S&jm9haIwq!STH8@&xkKQ*>W(W4 zhV<-AhM(Qd^(P@*A8(BsC*6lTxjsn&JHv`7ADag`A|ynOr?sNAm;kpxy;ibLz?5sc zl|mc4JA$3n4Sn>uh~l^+K+S~ML+RSBd6gFddmj15J9K^>GI6VBZ9zq);3HZ_MELk*$p!%3;L{8t-R79QkgG*BgZ=v|yn-Lz{wQxVrrRF-trYx4{_EvVW768O*% zk&DuZj)2wC1cAX6E@3_=MYT7XU160jHgqG!8jJW3x562`NX0cXA~b0nkBd!~SjRk@ zK?Qx;X<-*$N(m*5voaGE7U7-5ziY?~7~B%LF{LahVe045)NmdH+#w8T%|;=5hxm!G z)mmZL$GVw|R%`>3i6yZ!LrBz=n>1)nE35Hm#2oQ{74=^+1&Fvt5_4+7A|21p_{ou2 z6kglN%Gzobsr+?{5?(1!Su0pv#+qqKl3=v=9zCf9ZO%*c^SO<2I)e_7-DoT;?qUIR zVT;1iV>x#CA8iQ|6vj!MtHc}{(Wvo#Hal7HZ&*F2oG3tocy^V@nZGx z6D?{8hO0TD%8EQQ)M!TBbfSX^X1z?a)OK;@cus?PWcA~B)l(v-KuYE0Pn_`~;C=e= z5*wy@bbHX!``x)8aTq75BzS5fhpa6|#Y%9Dv-N(aHyz(w&xLSFP2Q90b^#iF`fClq z<}kT@GVoW@Go*`u^T*Z)H;|!~aTpAM%+zW#*CK-cP_peD8KM}W7);c-56_|2jMD(a z4V+yOrqcvp;9%yVfXH+=zjS?Y?I|0^7ZVL2M;*{Wb3c46tBB# zLB?mHIw6~J&egi-(T+lOZV?4z_@N`FEfPnczkOBOeh(`75P&vDs%e%@AET#Atc|w5 zhylbK3z=cH2Rr3!=RPDnW9HszniU{iLWDW4>Y?_G_#=)r9@T!W+|~WuwPQQ3&)A)Y zM*s}(24C(X%>x!!Yt*I&LCy1YiH<{JKSV4&)A zSVb55c9dyCeCF-^Y5f$d*~RL#pi$j8*Ou zqo18vOk1xozKJPuE)WgJG#R5Ma=Atm0ex?5+3@uW5OqqIw4xb!8-8$rha<>X=*i|2 z!TMNOY9wr{!`#g(Rg1`nxF(A|Ef(`(m=hPS@%yNJy2L8@&Bnp$n-eo8N^=c+2V9>Q zUf$E=+EWhy{ zcwbx+D&Js5Uu`REWbUe<5I5sB`mx4S+HG+V%k`Da;mEIFk3L`XR~rjBAX&eoI;~k+ z!SEoqYoqU+y+9(|y@dfss&qWQZK{thOG=B`PfdSTIfbD*BAwB^Vn&kURMJ=HMP7B*g0{@jUTFdyb70Cvo+uI8k2 zXV%m~yL?UV$<8%WzCR74{S;=uuWEM^o2EnlS}K+KtPn8xZaAi-B)Ttw7p58&KRqIw z@zcH!UL9ZW3Q+0sT;znVsq#A5Cc(_VHtc*8Dyjs7L+Bz{tDOK1QesC9nnA^5xJ1=) z&UtT_aiF?mTLk^iOzCc{nm&eqCU;X^XzjSIYvGs4`lf;Hug@SGcyAjeY<)33WFGSG zLa&nYUvz1Fy_Zc%#W~`KcBs{y3S2|A=@UYNhOcu*fhD0us`l*y(?T&T`+ho$HSe$H zV#rPpIuy89FDRAX2C58JV)X_lOd{1!O45ibmlVUuXbC-$2+xVVpws4~oB(iq%|8_N zH;emZV9vNqP@3Hh8l_IB;mywcLcdpdHJ_D03Q?L2WqfNf4+cUd+%zIN=tlByR3@O* zx4y@6uv|x$3M*cGhvP~k)Y!W`(ZQtoHP35Fl_}f=OuW)Ls#MlDa6sumeSH^B06R7s zERi%tj&T%jqws4#TU?|IzI#wOH5scsmf6f?HHch&u`>`DnjGuVYpDKdnf#M*KLM*h zwN8d*Xj{(@BN|O0!FVL#Llqwx-N_a0Q!x3P33-%|lry7X9CTO0ojYd>Q$d6(n zfe>;|e=Hadnm-;Hgj;}YBKk{TpuufHd<6b-2|&$GGqZsv&T<8PrWFspUB{8aJZw6X zv!(l1yo%l^yvD6kpk9`)?TjHGD4w}093yQ@j;t5qwH|Hx)fLXXB_n5Z3@geNK{9bc zd4+nlSol0K$ctCjS?P8N?X%jwxA*#5ElooEI24sa~?6O zIr|o8cXqp&ogB2Hk~LKN)IWN#`8N3ntU$Y9s0=*GMalcQMzJVnsT$t27OyD5$%0%rrvAUgn|hd+@&B8 zB0$>B7BPy|fH_n8C)}NXwXdMd^oWhH4`VbL0n56u13zL(g7rFM9q+oSQi9}}y52XW z@NZ7j8j}*B-8OMD6W4+MA=~8{} z!53vp)z0$&7e4P$-r0$130Ah!gMfK~WufeHu?Hxbjw^s{y0r@Zyr>Dr%e=n6@cvcP zW3n3Gi7L}H(M#WHOEJcTMT$-sa#3SOr66g$oP{?pmP2)l-GNvR0%E<~b{eR#HJReg zIaLIy-q%7;BYQ*1+N8?VD0#AmB}v=QA$Nz5DCaoneX;C1vKxL!wcr?neYAZ|S)R@u zrPD{ibc@lHUTjPXWqKWy{G=>?*q|Ldi{(8fWhW20eX>R0cZ8Z--{@3JF#@XH>GR%Szh5kfX!!bh)eU4c)hQFtkD9M~#D_%7AL3f?X(fn++PFU%Z*elSqTW}Xxeu#s~;z!O@Z?pe`9E8EKeQ+)qtZJHG z5~W4gb8HDrkJwV{C5k}W1&U52hlyuW)cR!Yx|$;6t(s!-#H}m#a)wYJ+npwG!RQQ@x3wR zgAB&!6u-8?z(HUUaE!LCJSmM5qtvG%%`U8u`+_eEL*1_s1I@yQE{K1>+KJ+PMnEcj z!R@L;kI_lBSp~hC$9TIZ!4{KrWH*>3Dog@%JJg~re9T0jJ<@VIRgL``M!d>BDo zweWYE#q#WuiL4V#OMvEq0n+}>ELL7xE8InxtfEOeib|DnjyPi0eN=Ar_pdlG#YlXy#o7W+wCW8N*~2f z2@>|%*u*)4eWbf5c64Q?Vs?E?9UqwkOjaThytVcW&#k-8U3YT&q*ksNK@@L-ei+^A+${% z7MDNP89H@lK0=!jt^jv@ne5AGgSy*^@n*k@Uuaik_NimpO!?2wmHOXP7<~- z_3R=sJgVPECMs>}hRD$R*9Z+$Eu!sjOcyzQcw&(|?vB@5appPsbZ6mTOcbN;X8m(r zb$Pao${{9RNPLaX=$0*EKH#wOE@E!B2ADXf9SelzM^D>Ip=I-lzt4&yUUHZy(Uk0$ zSb#m)_{K(n9UARox=^54)cVv*2maTP=CUjDXO7uS(4NF5H!#0Tgq?X9@Dk{51pXDu(cTvUxyajm>X-2e+Q+YYuC{xEGdrGiP*c!5Iiz+!TeFm?!&iQcdmUp^KjZk4||ytlA++<42(K zUffZwMOus%TklD>9LNDBOaOTX>{}mp746>H=hL(pK_d2kvC`v2e)+!QxxyZp?`d7fF(JV?rMphoJP zn+lpiuEN$z++7ZEB0bo}*qNq;#9v`!4g}Bil+>K1Hy#m7D>d$^)Fh-cDQ;EL>AWEl zpb*z_-1zgnUo2_q4|S-3-v^DB#!aswOJ*ZK0@Kn^G+6DfUd{DIi-%~QKC>R-_ocG&8uk5@UU{NJD7^Gz$VUW@?DtNXB>nlq zt>2deMXk;hCtM{#GSR(_1S~qm*7;Db>a@=3E&wt(W7uamZ{nitGpm{Wrv}OU*{C5j zuczy{PTj8e;nAg2M$so>F6ph)Q)BJ01Ek7I|HK_2TXp>CNNb0z(90nrQ~-a`igOD3 z3X)CmMDi25EAXl_pWjgO|1PPakNmMD{JBaM>7z99BgNg3c=(T z(h`&f$8n^)M~ufbvcRQ48ZJ5$A%324&1=7mX9L+XhfIn$yxjmNuA#C zP=_>#0aGftSTyv>C&}hhe0n4hl0sv*he+@ZI&=wMLv-T6%+qm&939K=i^2&pV4Hf0 z*w6!O&^pYJH-jD-IzkzQ!ZnW}3*w3JI;n{1ZRMneNUwbek#)xa>AIgK3nEqH*k@ET zQbKj7kQr+XE)m+s+}i74u;X*cv}-|81`GqNw)|MbY4E?Pg1q4_1f;tZqB;0H8TVZ*gmOHGGYy~_6DWH#&iL9FO& zz%a$3LF9mLFtKEd9<-WCFTiRB9g|8$;n5YjVU0zuTxw$APLZBjB8qL9Q6P8Bzr+xd zbNj4Qm_+pbndja>=YJ5yQ6EsOM?M;3%V+!sCZJS6b*X3-!>$b{2;}l^b@WfWrwtAX z^$avw$=@Z3Y@ey<`l|azgvKOuNH`p&AW}ohfJ>2Bp2tl^b8#fbKa&hyH-h7qF(R9! zf`H5dMq;OvCT_GR#JT%^UVV{TLx6O}KFiCuY&W$k980us5jjpB@H@M0oHP+=l7E=S z!eD^jg2M6R4vCAB<(HKoEZhMSAj;Oc%V$TXUlW0~8|Z(@1}&7Im^017K5|{RjMhT; zQ1jJqD6MWmRwrIdI#UwPAk?!vG36O?=da9D5PJEvE?;Jg;X63~pDY=0?o+0PQvPcs z4**eHa@V$&oB*PYC^K3)KoL#{Wv)HGtBsRJ6A;&KYuEHd{vq;`n}YDY2EbHJ_D;|r z$6ZZ4J zXK3o4M}}ezkwd)bUvl|8PFb1cWIc+ZigK2eAyYE---60w=_?L6tr2F|z5fV$X##EZ zFMt0;_RZ+@Vufjk1t^(pSeq>aV&`#jh*K>^27~EF=VgJ=G;T1 z3Ena0PsgkT!d`4@05Jwc9So~R-X(PkX-;fxU^b~aT}*<=8x^6!u%qg z1;%MYc1E_4@Q@Fl{oGp1leI_pr*tM~AS$F&%?TQF6r=|>&H_l!Gj%Jz8m2p0+ zf@=EU(nwiA#)QQ%d()7Dff8B#XU?0A*EE$^s&lzn;iCh^~jvV#fHm`QfJ<^pK zQqoh4)|o8I$+JnJSDlD@abtZ-&p}u||89JIAsN_91(7`2&}D$6W}=6wXFhkJ=x}dB zWq*yzKP_?>MDtcn;120wTYqFK0>9HN<-pPW*=ETPl{2m%8%^?depZq{Vo1Q1M$1^| zBE-5sGf_Ck-pV(%$r4Hm_Ho*#e?^+)ga}XyY1*lS zpW&&Lm=}_z(nBSzIb(J@j;w>P$GHnXH4Py&+65%%)>;}O3B_2QYo*R)SHiu9T1($_ zbqWqr!P%lSYJT^SF0=3Mtrke>ZSBLmI)CxgjDBWKti*3?bVA)OH2?>vNa9RlT-~gW zl|{B$;Xxr;IiGwoi@Gw*T<@Df*oqeCJDTJHWI>pvogX z@F3G=Ij4+R8jr0vz6L}aYrepGMcZ8`SFrE`;~F=U^6?exNP0l!^6i>&b_|oN`o>BA ztrh_xNt2@zg($`yH(ks^={>ugOJNl081K~`n_>0fqihQ^!aOlg z!&g|#T!WVp-i_l}lDQQ!THKV#xc+M2xJYc(lHvyc@R9RtnwK~0Q3XoeEYZWjE^6Y_ zh;r8?yDfH?ig`62Vs?|0yRWc@fo(C#W|pGy5qrDAnPQ4T+f9?(s5stg5@!4Vdcrbv z#@Gm7VH0Wkkp2WKn2-L!cX50Q2wFt5b8^A10$iMy_RjC+K^HU=VSH#yIvqDhj;Je{ z_j-z(?UEBjkx;$uAowbvxUX#aTL1>SC4FQnR=cvTAd@OUO;uhZ9dOgj)dG)@yNXs( z&Z@`)M|QCA?p=Qt3GkcyX5V(aQK)|c9FDC{D=GHAvffykFs<hleKH&Fz6 zj4Mf=O>EshigGU>=5gxiB^V%U;iD)jF=CxTam}F z6T}F3+?TM{dS@mo|A{9jHRGFba|~4D4_pc|L3BP~EUeuswPLs;1+wlv zx1sVs*raC@JNr*B5hr?myHGiKX zvjDxkZI?AJJRCG34-MZ6tq{P44VS8H56^|!ownl_3y4#efV5hl@2G#n&2_{RkGKwDQ0fV7g z8xp^f1~KSV4JnfU*81AHfE(JIDsx7W#6O3ER$nlE^f;@69kvJdhfruUCe;!LnNR=9 zMezKX3Gxs^E)G0QT0fsZY0y0Cce4%v7{0bo4mnYLR-9GObS#RSf@WM9mxh|biO>iW zyzvu?sM~&}+Iu`JsY#<|OhUjjFY?)oda%QSHXeAHEu{Xt$;25yDoNwNd4j^-sJl?4 za=0moG@H-e$rSR>)|KnWRCCkNBAl)obnI>1Hy>Hs(o^KNWRgH!TUQXy-ogC$*wgxkRMq`AxWzpYuw zih}XtLoMS}Q{>n0porp%%D$3`ByBg1+};5W6DRzefEOK;AsQRM&zLGavpZ&Js4*B$ zz+3Tg6HS<8V70Og77v(!$F~zU#+q)?23+Wu)Z#b@y2xOjcGIUKWDnk7JrSzHHn%&H zzzJ#7TD|Ka(lleAk7WUcTLmPsf00)9v9sS<)u88EAdaRI@B(0tarMuPu0c>=T)o@X{jEL7L5Hg5iJVuPF%= zF&@v}t-U;du%4RxR;Afb{X7Y`% z!Bws4$L(U!N7uLqHUf4;njA!K`diO4mh1cN>xB9lhz=DBWVxlFPYN=xI&P#KQ2E>G zd0g=s!Ox_K$F0;^x18tguI*9idjy*Xz^2c1wA#Ir>gqrt`T415gnSysS5yB;OD>>} ziWH~5^Tu4qB{XUdY}TL75x{Pb#~v`n$T313f^2#b>{59ZZuG%Gk3rQJncFczS?C)D zuMyvv1RP=9t$a4XVb=$&W2xiLh}b>c&vyo`_w-X2}5PP1v8Zr7L*I-xJ`qzDL88EmIkVzF5CE>`iU$s$$7#O5af+ zq(us$`y@Fw&uxeha)Q`R!8$Vx6Da>=d}l(AJER5(b5*!S5wXfn2qp2lvJzBxkr{Lj zo(K=V3HpepH<>fq+M*(btG-6})`0d;*{W&T{_Tl4D+BPW{2zn$P20aVZ+ea05P`zQ z(2YWj&AHV>Qfh<8BI*p^PpG7oAg2DZ&p8n|6&a54FqnY$q>XKf*IQ_51Ua_FYQ*`N zDi+>ds#H4XmU&bzYp9xG<5hHH20EKoU?Wcq%X#Eq^~5eWFAq(?!$ok=CzLG&7lhJ{ zk&}I@L=8@iA*Z)_o7saE4(_CXWpx&+i_eCgb}yC+TEgco=X}2aAwmH#gEQCYuzAN- zM_9nc`~l+o(?{FY{9`zWoDE{kZQEQU7aYk8?{cKi$WJ)>U*^~tU|MtQIXDpK(3ij| zMMEcS(^y-qudpBA%*i`jx}KyF+Ln^LzNrlKbKunSj`In8(Bgmk1RxA!g;DZaFN$uO zi*$(iUj!lI9QWa0@6cYlkpkuk!!K-Gev`A#!a9b%J{fJaXh<~7%6OfqMXi5Myv!0Y zr^)!*z#U)Q7ew4k0UnvGE$=-JTmq*X+I$nIe^BE(`}`=^eDQV$aRsJR|nhic0rk;a^<>oczA+* z!IdAYGk+#MA>xGmC$r!9{9hFS%8d0d9uzhI3id}OO# zzU?TK_1-~k+^xR`8O%PBon){0_k`EGYg_VN2ES?N&!SHc+nhA*PI7{~vSg~MFVO~G zubwOhN)M<}Yf^J%qbM;PmtGr60q{U5DOqmG973v-|G~Os2i_gL-%!jt# zfq&v3cJ)_NdSn}uy#la+7Mt%P!u zr(6lh>g0N^UR7%J&fJBb12~E9-c<@Af0AF9cjgHzy0ysA3aGG^8B4v^W{bP!L6h)9 zk;>=D#psUCKP~zlQ-mBG1xI9X#=!QWGh)gzzk67ikweYM(V}F=WCHkb1ja9cXAgAy zVE*1QCU>y}Q0vwF4ostGvgQDX>cvOEp(LeG zP^3c%Saehl^uQSmkPz>S5pt`FFb7hdDYEql*oUNC@1K(HZH9_pwtHJq zupeyd$XL2-q~J%Z5qYJxihslS;wlzB!zYD+a8R^VF5wHul-@!2P$gvO3|vwCldV4` zDpIbw?F(07moM}VO_g)$NJrBc?8bShrl<|L*&88BpY zn&>+Ph2mYV%k8Y_(*FGWzP5e_AUDZcKryMhKOrG$8S?Nn^=TP7b(kkz#(}jIT~1xR zV7Qf|UUU!)R4V|OQ(L0c!h2ni;`T;c`k;m9N$sw9%#$gtWMhvaBup73P-ut&81S<%&c zDznpODv?i8W-j*p2twSVr~Wn!^{{&AWOF zjIjfej}&@Po$jm&nYhcLSImPaNXv}ce@EJBcq8?%sPC@LR8gC-jLMmz`NF57Dmqu~ z1`D5{*F(PSjVxva#I1331|t3wH*ru8&gGeOOr~(l5g%Jfh9~>kN`dVl<;{uNLbsRJ z;B12d`9b$Z43cDgSb@?drKSPT_(+cu!eMNQDPDaxMmm~SbM$J+8G3p5yOrX0% z>(;_H>l&N%k3F^n=Q|a!YTYdZw`WNuUJ(coJBwR~;O;g`aw`E4Dg|N!;%-+$^mQcA zIvZ6=d~uxT_W(Q+t<}~VRj~qnCh$8Wq6x(cVG|N}vpudV`TN)g#EyXG z;>$@6H!^h!wE-$JP&40=9KRSB9X$8wDZ<WQ62Cm=yy;1L&ki=$KJqy@mMF$Euj<0EF9934)CQ%Uh_b^-L+PHn%dVC)n?Q zjsbmu&-AdX=z=dn%2&j>&oj|jsFyd-Xv@3JY$->rlptYBdd>W3`k@#n($4c)ytRGdA2!6j;qbIgnThIDx&yGwl%E^m#=Yc=d{Pv)Oy;@wQ-|$Hx zQ1zx67b4De`St$5g9BwjdBnsG1B<4Aspg1Bd8b=?7>S3R%np>5s$O+bnnG;kb-o`x zy(u&{Lzi&XMVxym^mC#I5P4mZ_5ChGrjo`qLbt)m8|$f-W6y8XC&|b}4;Tg#P(=@5 zH=iC%_>pL>7%*jWWPXG!r5|%ie=@1uP1wa-H?DY@2ay>_mI3{r5|A3%NNfHoR_{Rb zBqqWZN)lV;4n{FbUw{KXCv|zyZvqilRY7~ND}I|TGLIwtOF|1B_?GPEjO>CHD*@GI zq5(%^5y0&kMRN9HnGH5nR}gxf6{0QHYz>DasN(3Yrl~7KxF@&;M%fB9`~XprwWm=cJ5YfDmLG`;@45us zZ)~(o!HKO>+ar}##`nk3xeYlzz)ZJ{b5NYwp_YrOoCp^8+m3#TxoPy~&eeh0T0r1J z2r$Hbjsv~|D#08ITa>40?eZwr$8r-8OZB9uVRUfnb+V9VFJNNq07sQzVG*aYm9hAMD(@FCU$Hri&_YLx#M1tXmQzY8e4enyMr|!vj?!pnPq*R@Wcvom_N)x$)v{ zd@EV!qo9Lu=z*DZ^N7C>TWK>jb2TthO-e0rVX5j#@S|#`cltQYr!KP?d*Z_iMXhy# zI%domLIC8)SkqbsJ?f*jllo2yWEkWNcY=~Ccxh{p`@!?6;ibXOqM$Vn)-A9x$1GJ) zVg0vgAsr<1h~T6z zKN?b<7O$@EU?JRshvp^Aqf?U^2NT*AOem7k1c1f|xEJQ}S&kqXLDUfdWC@s(sHlw` z1hO%ols^joHI5<1DpCvue<+#xE^ppQLqF0enP#ZfNnOt(tcUL9d92p)Wm;z%-;vR0 zxbs?PiqhpzwF8m!sW_be4c$~J@*oDmn{A1 z1y?4&TiL`0mCY)4_P>UE7;Os>Z^bro7#u%)S+fxBRZvHfP&H{d{mvW=qB*%Kutru!V)rVe{^qot2j1{* z`s!fP%jFnt0tRZaHzWy*WL!BHp%b4!117M4W_aP5yi?ics*@1R&=VRjqoMvjF&=zr zn^O5*b5bsnJr*{-_@giuj~N1c`(q%8+({4EAyZ#>aDoi2sY7D_E7E^ia)jP$!}Ihs zlU8z#5AcWsyqCJ(P&{=lf{MhSn+}df;aMZ&qSW9{a9>X9w5e7U$tvxhNb7^BjzL*# zCL=x%wRNR5sS)|bYO->kcDWj@%0zo^G1AjJX&+sm4b5Qf_Leik{kCuB=l6Kp?CSwH>|D69&$H zo@E^V0T&l}P!2951rA+o;;NwxfQT(#O7L%O_UTurLNn|GSF&~Fzmg}f=V`>LJKRau zZOfQ+B`K)n?L;M64hcEx|4$q;s;zfWI&>cr#T_t6kv;pKp}Exz+;3xr0#5m8WK6-usbS|zr%aCyIC zuz&QzB~@w29B|Jf;%TIbQ2`6CSc?4^M36dbPx(t*&7XwN9GzN%nqQUW&~8&4(`ygX z3O_&g|<$Mv|xDNLpI9{$Gpo}GeMM-ZFC^=EhhOCQoC1m$Oq^~WNN zUA^!1q(8cG>0I-Eeq`N0ezhZ-4{5P3jm z89N+_w>nz=G;QX(^fJtEyk_{{rniq#pZqHV*Vv3jUt2{B>cJb7)w;e^Nsa9q1nK$w zdI8@;qZWtFI(!nH^kIg+jx=>f2)gudHHCvscBw_b(=#iht=eZoqBEw9X_SUAw~Ukv zJDr$lVfY!4nUt<&mz{a4pYGDem(U>#v;prJ3X~A?HcN&c!^y{m@SE~457eC?oVAyx zals|E0}(+_Rk|R5QT{7UO2L&ImM0CjD}q-Eg|^YR!I?X42$RzYg>nGgAgPdQXe1R& z#_5<83q77z;F?+u&7i0=$Y>L-{KL<*FGmvpg6K`ChzdVoK@>v;t~>z&>~(QJGuekG z%_M0#U+DMVzxg6Ej>ubdf24*QPj1bpP4Z9G2oTI52MKW7?%Hr^eHa zfrZRmaWY0yoZNFh^e0pmdh$aOE}P>DhLgc zDwtfWB|g_S1b5Z_Ly78}N-FRpu|!)>g-B>g$)1_qk!u(pvbPK^ZC~L8MHSH5hSo5U zW^;a36bcH^bEoAcB)3)l+1t6;tQbu-6uMmmxiy5l{VM$)^CbhimX+xwo*78Vbd&W2 zMCOLEPmt$s693DE$3reQR(kVdKre^Q0O*eWlmLsqkD(Bxx0YD&O)oW6m+*rw-+DxD zGQh}+YJ!-YCQH#zmT9&O0NeHa8@c_SlX8Sz2*LTT1XPx(>!@OHhM?ei>6;~ibkOaf znVSWE!9NE%!k4$)uM;&*<`IHEMDj4M4yDZ0&5QTY&QUZ$%qy{Xt)@jRq|CVM`$K=R301D!~blUEh76TKx)W23?FAtthRbWqg2CS&QNJbJ&q zIgS#gt_&xf<#V#Vtg}S#!j`lNHLjQ(D@>vPbb)e@kOV{^&O@r8Sx^p6i;)KKEEBs% z+^Pi%i0xt7Tr|#gfk;b#6aO2A;F6yp=B4r5DUIIcN>KG_w^wRX6z&~0xjY!`D13!19b_9eHIN{W!K;Lf?(2L?!_F*BsCz{l?U!e{>>CJ=s zh`;ON5+O`tY9W&4d4ncL!c=5xMp=jqT7mDJoDFD7wBQ?b0 zxku{4LE(8CdK=@Kx_P+DkixjC+Bgh3Q3F6O22991R)9YT7bm_U!hjqs{4@LOg6K01 zPWAo798bAv#{^4k1lx5S#H82xiwhSWJb@#n&x1rP^V#PWd6bi%!DD-QkBE=79}8#C za2d1&`E{xgtb@pDDc=|teEyYApLN$7Zi7)6@h|py@hDud+HolCXn&rQj?OH|n7X~{yYXi04rQa>AQk)^52D0IEw_Vys~pY8r4W2# zpU6S*oPRyhReNLLc9YUPB4z{eD7I7DY&MEajN^VI?Qx2!SoS@$eq0ViVF2Hvekf=i zN?+*@7fORX9^>mAcBq%@J@96%gMd4TSn|{?hT2*e;0phYiAmQ!G=fUAB4=st7(Ya8 zNR1yf!JPozVduU&k%2P;-wv>llHP{@wI^4OfEyS4qIC1)AWTl-KNmR$@c(#UioD7U z{-N?Z>cGGlSs)NinKq$tn+EEFY2aqe)qK(LOv_re`>_C&B5>N4VsKWtR*>_z88wQy zh=O8xDRs{EqCl7sm#Q*)Q&kk|eeqW88Rcx6_eB#7ZojFj?FmE@Lh$RHP>xbBjgX5F z89pWf2@ws<_^DmbL*v&up7x1_ruoQUA7mY4`2C$pTfK_<#2fEUQtYOP_O*du0g1~y zc7aHd9CX#_?G6z!vp!Ht)S*7_EQ)S4@S$@&I;K%!l|F9HZ{Q-+H-djf&CL)}4B+`f z6cCCZ^mMy?fuHkIsWNF?fAg4OgxjtBEt8MN48@Kbu0l+UspEp`ZOL*DU~JeH(@R$& zUrn4Wdx=l=-$Zzk_A{iI2EnxFEB4S~Gq!NGmSFBGc-ih3v=-{Ke%Nov?0txD{j^c;9J`CS_F`Bk;^-jZ z4EawNYemTq1RsoefhreP>s9E28k>sqn9Etz!Zq3O2*4zdsOb=&IEsiU@Efd7C%kL$ z(a@Icxh`}1kFn5YKMro@UH~z*UW;5E!?1l>6=4r4C5c!4tdCiedNGNlYNeQBV<|+2 zcbh{5kiAe82#;a?;zD${!_bLzbIE82(lwbxFDE_K2mw;d%foC07dxvbTG*Tt3FlzO z^_aSaKt91y!AkaZN#bKw8$FK;hL1!KK%f$_%-lS5d$gOG16vtk;CQ(`VIhFsKPj(8 z?8aP+i=P75pfU0vWo?0niER&LePo(CtEW4f{zw_JiZeKFZ8*VW1*i@gV0c*-U#8DKGGLZt}0)jk$L~OQk^REl0~xFkTMMhYiEv7vujx+`VAUr!d+{ zgn4-08j!Br?{7D4C7)3yjTO=cK)+E>{(f)gWJHhGEhs%C4dYg^cjnUgq?sQ|d;kML z%}uiltSnrk8pAszepL4(f*q~<6M7!4If=l-I|+TYTa&86pKmIm{BV;}rPg+>0_aj9 z&9>BF&l=nPAfB3q=@dYhPEkow#_!_?yf_}3rVbB@l9*CM(Mq+EP*b-Xm9>OtR{V0% z#;$GoJ&G*i2LVextQ*-%O@*_F%KCda@|bZG%C%g~*&(eOlfd6MOXMl4%-tid5WVTc z$M=2jyl%&yVeT}@pC$@f9-Cg$0fFJ86J4N9-ecLFJnJ~gp3)FK17T2mb3zZIincDL z1R+xrs=iAi#X(x3wXQ)3byr1^uDxa=q0Vk-vK+N8i)!MQ9sc#2^~}o>ktsp3DtI^} zQ~{$1inPc|{UO?yI-P577bkc#Z&XL<{5uA+)0dr#lhjt2Up_@Bm`-3u2s_PojMey($u1Sf392)-7=^qr?D}`Yb;7FhC1_u`YkX#(UGv zSze&=8}7!fBv_+607O8$zp4p+Fb7w3<5F|y8$Sl%@*#pp3Qc}@k|Dds)f@fg-9kU`JgcjWol^v&%I_O+rjuq3IX{v0deARryhXU|G9NSTI;6;;% z+g+u)+@yYwOVuCfe97E>Wo{*A3n-GI0g#X|ty2#$l_KQ7I*q{lAvR(bt!ue(Yn5%Exc-$4_t=QHARLND}cGi&0a2cbJVWdrdImga1>9td$qow*WA4c5Du@gVhGF< z)V1%R#Qg1_YDUO>iW1QV6Ex3?Jb92W&8kpxNku7|azAHU6=bQa)`$4n)$2I(UW;nXPi%a(QbM5zdd7sPJPhBLD! zPx1fCZZ^fu>K`#HuSf{2W8#@!w#G(#{zb=FuqT$q)+gxm7P?^;0eMpWXRmo#^gmeY ziNRj#VPQJ#A9n6{AdOKhid2-@-&=EsJU$(;TLY?oU+cfR+vhVm z>lb^UgV=7Cn^Ks+vz+O7N|@)8S+vqI0q;Z)>PgrH03={T3Oxi0I8O*zw8cWMHk;b# zihLYwTA6np7G}Cn12>+EoJ}(+V?~o7)ko7U9-$@vR|Fu?UvfnkSbaX@m7iMnj0DWg{zDK#C-4>zE3pZyiv$ z6wN6xzWujQ4ky`i)lklesu6|pfIA0#$O$z9#d{-m%?kxLBIv}#$nM> zjRu*uw?8%shdD0Jb6kjY#hgq}qvWLuoSB4`^>;c>%I1{kyy~Kge`z1!nqF{UUvoHu z8UaHrUQbUr=jPNzn~qZ|Ki6~Vq=mfh)3v!VZ@nVK)(DBG89OY`mr$)9=67Z&T&4pP z%>58c@1fU!z3N(>Vv)aS7JHB@yYl8*b=kcs- z3U1qGBD9mag~2w!4Jp~R_m_4aJ}~*dUyUXI8#xa+r>$g`|4+^_CwdvLW*Gp_&JQE7 zh0}loW)o}_xy7+0)VQ^XZm#Efi0oM6`H;lX6?6s3O3qk_#Jg4-+P|fwp09yYObS-> z539!k<+x;*tr26L?A$P~d507Oz}ABW@t$PWqI2VfzFZMyU>Aj?ENMX=C|N#o*v#cs zvF!RTt{{-)n$zvAkufRH8PI&a#cu=Tz+{$vw_s_-$vuM?ue*3>UNi~<@)8!)alC!r zPHvyrYO1)Clk==^k+#UFpKlnFVnVw(CBF=2SUejJj(?}?<|gvW;`(#;|1qwG<&ews zNZwA@;2N^2W-g|)40-dS5HychyAgWIBCKO$tL6NUWc}wUFV%rVbHhuT( z;h%&BCM&vPkBany>hM}E=&=P3AjubHbfvB~6Y=D;8q{r|GPy>3|4mrjWkP^h#q z9^V;PNXVk)hwGQ#tpE-^UgTKEY?>L8=i0<+)WL-idYvddHLA$+!-{HaI{GcjV56{+ z0c_hq4RyQUa5))!fC+hU+UYUC)-5Od9QJ2v^reOMFY+l#)cwcRBTY@&_p4b{FvobH zjkLGEd)eTuPzZzo^}XZd8kYvc%8!DZ!dqm!X@$^D+fDbueREDsk#)S|X72O=P5y)% z+@jbdz|ET9J06iyP7w{F-CDL>?V-xkfBfOWn zopnnjQp#|idO)$`b^Oi|MoWw;sb64o?-fq%SUpTeK)?1%QJPXRPNUj%I)MipV??Vq zKDx>iVLb5qqk1P_ZzEV6JU5pCOuZ7@uK#d0`{yM$>#gNT$P-}KgU9m*nY0;j-3OdH zHRBbx=8%F3*SDxFll1v|mMG7&)6m&!2%H2bX1k?2WO)-*xR}<|AeutLN;v{?wJi6b zZunFNPBanYRetl)#-hVTLG*j*QY+s(p?&?gm;JZW+waoYf?GiV7AoCBe`ki}gFX0g zYvEZEZQzb(ukZ0thFg$;?G5ei6b)qG10Lt3;b>M*kUyS^$JFHnm5n>I4ogr?04DQ# z!~9^yaLK)+oy)7mH+P4U_?UFvgU8z_Gz7Q_+46qco#cSuvjxz?r?L^y=G?oYy_zI+ z7z5_kGHTcm_F@?qxw2)r`K+{Z!k08d5hLRg9pV1Z-@Jp^LLoQPU8 z1|rLUD;=eR9UoX>r74;jj2*9-ei#L134!W<|!>~`--JCm-CxBpf9ME}j z70xSI2iw>yEo-43|0eG^@A4}Rda|)5PtFy{LeB>S`NrL%kR>z?p3>s5S40=XlomV0 zF?XoqD)8V?v>Dq(CY7%!k$X`yM%+;C_7SDAF?Ciz^~5hVf0yB z%Kj24EbaWj3A=`1c-@y+oq2Q63+t~JxkEO4{b5m`SP?MAq+=PZhA!W&9 zWK=m}FIX$AuTd7$?ck)l!ML#q2lKn<4)^zf*Ecdy%(RW%KmKjCTq)%19C!gLStt1T zZ+^+zG{Hi#ZOBV)y$D#PJO|mi^zf=@2n4cEB`agOr&8XM9d9RyL?7>ab2RiIdmLh( zqW<*M7p0pxenBj78!OVN?aLs8nBzw)C|@X3*7_}ltdamdshWHy^7Rdx&}@M&%=Yu? zB6lgLKr4lI$E8H(xaEm(CKWE#uU7Z<->Y^8mZ`#^nh!Xw`;Q!fdqP;r>hc?^bQWLS zYJg~3PtID=^)~psWK6FTVZbrt&KqmNrG>c_Twc`jx7AG_5o0kjL1BAr3?P3APi#0L z(y@56Y!=?vq_~m<{E=narl|tZAQ^4`!XG2Gp_k12em`j!B`j=ibvpjS=QK#&DcZM7 z?YC-hbd{StwgHHbPaJ$Hq!nY}VN5PykE=YRjn6DMv}DA4G-B*M-3~~ll@y-2iS{UQ z@={t(hRbq6YwBXdC<823G4y3Iknx>PKQI%7xUZi&ad4ssDcgqs39S}g1>q_$S%r(B z-r>gLf(L)3jxc>xyD}~=TOviXm5{@z;h}K1DSps$%~3>pB3#bKLLyz1(;F<30YE-=!DM{h=?@9hAnRZ>@%~G1t?Bv!Ex#og&aUDPdgf+&WVLr7dvYNHZECbaMB^V)SzCm>MJJaq#^i!YUHl7$_FR6|MN?FeD?5a;iY~?i4 z*j#D(FkTOgxDU_;j1ar_{APF8V08Zb6c^W>ob7ahqetJn%#|Q)ijCq7jze-#=jOWV z*ea~Axg;bwZAR#p-e^x$4QGmy5i)fhr1IY_e#3G@U=?Ke9@@JZ?DC#-aa_ zU>Kmi+1Jb`q|c9d?=XT^KzEQwp>toPr4qaY?h+)fCF6DyT*kozXz-~mi!V)(m1`gv zRu*rWvSEM23yr~}J9Hu6cMArNj0~YNP%1b#>Vhp2%^V4m17*C++vie3#}P5~PS2?$ z8?7UY_;qaEDN>1+LNjuYSqxM5XVAQmAoIQ%Oy@ZM@*-0BKF9K&(y5S$bDg#tC{_Wj z3t*A~B8+GRqw*?q?;Q5HzFVs;g6CVLNXDknHyy{bt&SwQCKDUwWiLL9H&bX$GS0p+ zxVqAO;#*ZUvOi660EF{`Tn^Q01Yx?JlPVegaU<68_bUxDSYSmY!ivgfAxWBkCR9BX z%masC7GCE!s*Ct8>060&!yf%E{Q_%wz}sy+-fhy;hwRVlQ-h~-sbJ9#5DGVTxP2+h ziVErh%OTG#8P66YF7U%U$Hyie89OE=x9t#HSW3o4okoXbd)OaCd?6);ps2?-%)H$- zUvAtCz>x$RE_HBua}2~`&9K2L*mUV_aPmEcC^-?&vd3-pDd{a|Yg5)FWK04?rHXzn zElG3Yh_^NzFU4#(ne~kd#)uCJK#TaMTW-6@AMpbs{lFlv5pk8C(y{)@8{S9Sp?RzA)S$@_DJ1C0JW>vDm86;h8sxsP`VxH0_#*sx{(sBR)Ewzj|=K<;%;ll$x zoL#|UzO^n|%$#}=npH;cIHfAFnpv!$*`%r zT*GFdU8jP7#DX}DqUi3Pc5s>?4aTMUgFMD7;vJz&W^GJ;tQwJ}mm(y6-?9@QZDLZanshBZFoZ~iiv>8h znT@?TKiMGS#S5Ccp(f}lt~GkqyYE`luzFNSjA@1?LOG3MruU!{TqnFjTTMDB$tAb> zo1y$pj4>YhxA05Iz->I%ye7L>2`B!@AgRqa;{W33N1|Gh;C4eo3sR1CH+MYIeVOdZ4ip-sX9U!M})1#PfN)nv25 zNIX#XP3s`CjcFmDoRh!cv!a?euWY&Z5&^}4d6X2fH+4hCna?P14BvqR=0-kqZJduq zr=Yj%`G9eacW`BS+T4d%Gi^ye%B^@q1z%Uoe8}sc{`j^}0QA1bW@wXz|4h)XaNy*< z;vJ4JYE>RLTuj?=t)Er5Pwz!d<5lrRk~d&zL|{F3+0HbMdh?JXJQsNARnnTl?M-!( zyL1sm>`)3+eh|ckQNYJ4iP|Gh!|5uzcgz3QkU**Ds|v9jbQu3=!HihOuKcnwe-L6b zS$Y_w(VZ@yQGG%d>dV2GPWBdRe|S)+7O}@Cjfeap_*h_%&cq?P!LrBe)Wm{!#vD4n z*}4H*M~JR${ia*3+#oikJSE>ypSjo_!wXDi+oD`!_l3M%(L#>IZm3|oD>{)w!&7dM z2Nt0{yg~8rG?j*eY_$N@M zP+Lj9ELq17C*cn?v99>@1wcRB!`;)3NE;8o#rk9bEr^+4nY=!eK-|T^eZEgc82d9Y z+`@nP&mqQfz+CZpNfTK^hWEDj-TxPkC_9_C_ai?HHti4o%Z0##HkWGgeNw~YzXKz% ztvMy5ET-TF_W9CBf%(VCrG}I5#Yjga7xsf;lpoKrQ&tnqgs%+t1?6ywYX&^S;Xp^u zcLc&ba`G|$|M)9qD3^rkk@?)9t9F@nQ8o$Xe8C-cMuaH_k(|`)05DX?el5vd8*ESS zwcQC7;9dJjik)7wVVDRa7s`8Pts6Qp=M=@lK(WrJQ?OJHCo~Kd+4$qBjA@&}k>xb+ z;VQs`ah8H75PrAhtmYnwJn68tx}aFHq-ZGoW1isG`dfcVSfn$|`ZX&v&5$JnyHD31 zQj>Yd`On{g9rKuS#!eKOnW1;4uebH)xCB*_VXQrUZKY~rX}f9#Ks=ktY68_=cf#vT z#rU8(%C`F}5bV1>Uk%WJ2w&TO2%;FMQM;el=DSF7Ehxkm^?Aw99|eYWHj7t&^$?za zfIgp5jU8?R?o@OunIRtq=@nv!l8HX8nD8ntv0VJ*$VGj_!)EK`;P8Q`1Xt;m;1Aow`!e%V z8Q)U${yt3jDzBhK4nYrbZjno7MHz)A4B7e#B14y}QpXg_n1s>{6JBL23eS?94dm$2 zrk51sSQ-6|y6#1dtN%*%qC|Lth-&6QjBm2O(aM5l^4=1j79r3s2g8aNbR%EItC-b? zB;T`-x|X!5$<@JR8pf}Y5t@XlMmtbr%#1Zq5EL}dgykmJ)ybx@cTudJ(x$}baUUdB zXJH++jEY3#|3}SnhM<9Nu$W6(yxjy~X}E_c$I%|*I$i;!T)(}I8af;2{z@Lh9YRV$ zfO$XZM9YP!Eh;w+2rV=J9xz__$=8Qg&SBoCrxkfkheHLodHN2GXHdGZ2d5B0prx_EXRhE66kX(@`-o2Y5!7=m=(4@NAsmJbC- zp`BPT2&g8Z!KS33#X}iK(D2H7cB?9SP|psn3FkGBGu6Xg@f&%Ewxj0rP=so^IxHAI zHSm`zZ+}>9qoGM^-Ch0J`?e09^C3QHR%k@Al%?R|z*cq#np-VmTO~Vb*;da%4JKm=sHX~KF8an2yy5d3ueJlpb$6@#U!i->UiW5 zoJ9ewD9*BChV*yEa;i1hroxcz8!h9Y0|6y(0M407G^`ltt^D0IB&QtuF2lH@Q)7%h z`pvwvCf^+YkDXymOaK$n3VS}4Z0|tM+J#cRE$Uaof5>pV=wY}Z6SL1ves9A}WOQn_ zgvqND{DM{L3PuHIT=OD+nJ|L?x07d(hS2ztz0P<$<5-hF+QVMr7fB9>*%!Le?qyE8 z4CtG21V21XjY;2X)FFpi|0s6Prh1~PIy-&l;h7ek084vl6vg*fjaF85tNO>n zCpSaSLj00lM|I}9x4US{@4hu+;|ht| zUbbQ`gc}F;5VcNA<*LAOkZz#cMjQQ_D2i9Gy#hVA)#S;Ox`x2O#I+6u;U)5Hvy^eF zGqBD`e!Nv-irWl0)i16b3tZh0q&TS=ss2P}{f)0Rl=EYtVegW%$~^zg^pICdx~%sn zaoe+KNu=pVdrjjIX*5<*y@d)gCOarmrJFH-OV~aU9^B%H?trfy$ByN)GF!G#b%d1r z7U+q@1m38BmMH-*1&XVdZu?h_j>L5UUH+Z~9BYqg?){2b`AA?hB(uenm_l1FL3^z2RD3JL_Z5_Wn$z% zKaD#3j1t@Q8M%w8f|n~k={pV=)T4%?Wv~1rA&Tu11ly|G%ZNt7g}sw|m*DTw`Vz7xfX;@vZ&z8`|7hzCJ}8=7jpgAHz0E6dknqNELN;oUQw z;1jIE);vZ)P{Gp+2_0TU(C<6RV!?yt#h_tvKNU?RWLhFYg&bi`+OCS8+-~r`WQzMQf6_s zYhRQ8EQIA0BKecfgU_e}(4+AyO?1$s*MozJok{@ULi^Z2+R-BosW;0`1=g{059(Xk z_$m+zKH6f!=zD-khSk(tgoavekG$Y z)8y9JudTU2Z?B7z1DKyciPxhH-<~W8aqmsc28Gyl zmUQT`*k3R~THj?&>jFK6R+L>iTvNisH~sMtsDRTidkHVX4@3&BWp1KVS}JcXH^&TT zZU`U1GxlIRHv<%{yXFX>25^~)KuK+3W^;Q};+8LWe*f61lC}G!L^$I7Av+FOlc7M{ zhui%>%H=;|gNUm`U$h3&egx~32w zHuux8i2cnmYbRMy{F3mupWi!rEfp}auMRL$>q%JMi6Lsd1;DtiqV*NM@NT-`C>SUfOQ{^U`j z^dQL-cmT^0ga#`DPU`7EpqiNeKwj8e*}(|@Gqj8yo$%R6;<8PNF7{XwB?Kskq)trF>!pd8*?Zc^)drPZDWB)(59aa-^5S?)`3wAD4=#tuAjubI!x&&6ZFGkf- z{oWs@Y$i!?Fyq#ypLps49tle6g3zQeOJU)x10L0O;Wqq3Eg!;-T zHSvxvEg1dU3d(CJ1d4f@PF5OEk}^}e4Qz41|mHV1++? zRXAnHI4c5W28JbczUP8$921<9fZPsPPaZ>Dj@`0S&W`xuSqPnr8k~s4|CI~3IY*5o zbR4ehW{}-zw7#2F;u6wP9cCCsBHt*utsKe}{sRh;b!eLqe9|4SPPkIFDgh%&e=}n298e6;!h&65W?Ua4h9i4 zFvhZ{?NNp(7G|W@YI!vPjfqmIFjEN9RA$xGodBE2*K}OkUU{S9@|5?ErIG7k6nXj{ zYI#4%nV=0fP4VtWyMlLL(7ek!BNy0VSjUm?9I*7TJ|zqG9$$#yH*R@tM#C(AD(kk~ zc;U>;E55#@dwTYHc);!DL^pXeNm#59Q$j@<3_ zi&xyqlo(d_IxSy1iz(kR+S@G9%OJye!Lo4#L_8RIK$Tma&~f_+BV|Npdq*DuWMOy{ z4o(Q4%4&$B+Td)$&7v|Ua{13l@3wCD71-W2*yq-S`@M%40S0YN0&6RBF|Q666GAYw z#qj(R`@1{X_4~?rnJwHYNU^2rbWnhH4C@X@I={a!tg%KeYqJl<7aJ$<5VO#A=R2;6 zt?acO&?o14iLVo)#Cy*=J%7S!x1K6}v-GCwCVPV^u8wZUAD5&YAH=@6+^@92BCeBD zkI(dD?1z8Bv^MM3b)Ci!TnmVZve50;QdfT}X3(aJCv+brAKO>st+TdE)0`lzw zEWF{+!``()EbfLTT$ZbRgB`%Ccn%P^bXN{#RAA2*uxH0!SA>1d6~Q6{PFOmu_uFfS zBw01C|9ita4=-1^cpZM7B_=YF(RBdrgyQvYb!A|j^eaCtioBJXmCb5T%q4ZO@^?#! zC4ne7CvWHU`WBuIzhzB^kfzR1CJ3GRu*UAV{5uAQKq&fU>?2e+R;`sybz;Z452zRP zl^xCvPHvTR2Rs~UA?z_gU{_k^d&qS1@DOguS*bXVY2O$-MOKex$0%w`sd^b!O$p~{ zTl#-;5i+9t0tAbxpqz1!Cge)#Km01)Oj@s9Rah%+ib_7UD@Z>K>xE)OjXQWP+DAO&;r>6xWkoOSvo-Lcko$<_3M!VeDmE~}%wkIf1 z86TYH((KcB`nK}VYDwJn>9gE#5ags;ieG8;1wfe@b7w1h?c=Mh z^?Q$7G3{&sOB8u zj#PGg6ams@e`p!5k(wNX`7c899T?f1&QvTvF&Po9Nx3tf;At>_AUBUK4kezW(;9|2 z9a&=pOBrQ{`ly);`?ZL+)n3vRM6U{^-qR@md}kH4!w!5TSqEcMCXK25C(ML1B|jab zZ9BN>LPw+8A`)P9psxIN&li2Y{S}TrpGrrMPE82tl+t#H)!neOdMK)ew_z_#FiHIf zm?X5<7%JnFbc&1kbfb!qq`Su1CSs~0Ac%)YSx@7>7?gbWYQxZ879mO%E29WmfTr(7 zPMdxC35c=dyYqzFNr9(D+W)!ST0#+0@;lVJT4a7X!9eX@&?}NRwKiHr*Yg_=7 zDA3I)o+!NSy##4DldB}NlHSbiP(m(AfCYE_Wpo&5hl-I3wlwo;tY4$94i1Fgr;nd> zbJdAQwTE9iG7h6GR*~pKdk^nSkT@7`L)-}(DkFxdxzK|ZIXZ;S6e!pU$gtb%a#)<- zChxDw7CQjav1-n=UJ-X2C)Ei67zG8w|?g3dAZq!8U4>P~t6=y~`xEFD$u*8rt8CygJ!X#-xJRY8~u=n1#F zKWko*SURL)eLyZQOabrDmR&!kCFdvpGB2G5P`@FQr^ zHg6%mOUn}u!+%a8k`dG9bPF(a@sPXpBzSlJ;E|63vnv71*w;|KM>f?S9m||OQh2By zJ)~GYXVZ(5d{Yx2O)3oZrEMeANc{U_wzkG5ZQgMWcEPRx$?IpGRC?Jjcpjg=G|AAN zGS#{5QJmP7ib!+I8BcXTqxyu9`#Wz;S)6zTd|q-^wT5Z3D)2iqI`bWe5a?px0KAZ{ zfA)7df6@$8gQiUq$Dn_p!^Q6iG>Xs0OGtSawWx!AHyHM3FcXkM^0~oNZrGa@4}l!} z=plW+b}Gg6NR^UZFLGAWGN?ZFa*_ZHT7qDfK;01aZe__!Ry#&G_;dUSj=l%|tC`_K zjJhs+RbEl_t%HdZ4fv}p$koD44!8D}fGiRAyO}s{_od;5?MR^*8H3Ys$$5f%yCo6s z8oT8PTyPslAnNM6LaXp`&yHq{aRD-|K^Cepae^v(qFnIc`hyV|aaX4%Bs%>IlG}IK z1S6GOn+D0-eucru{pB3GW*d2H(|%G^Vbk2sW*)8)MW$j7(+HY4drd>+=858*sB4WX zsCAX*Ix~W|nv0=Yn=7@6_>9$hS${U^I#q6UWzq2BJ9U0T`_>{PjdKFqTCy0%UA66x z=uP{m(vt|c)PJ6S852x@!I< zL(MZ6!-n7X0Q2cA&+u$Ci(oit`FsW%f6<#ae>B&vJK%k!a^EylA<>3kDq5!X4vUEw)5V$K*9^)yGK@OAMm={v)$h*1c!O$B z2>rc-R%jH>O5tMkzl>KG|&5BXtQ$zy-XVf4Jo6>kyht_2k8wJO*h&Oh+!deb>iVtQ!#bH6r#BZ_yfs&iI zN|0PSq0l^=b1sjPwWva9422~ZQ1#@q?pLK&;}2s&idFjVj3C#1yBjwUKPuXKcd}Ga zVl~~J9Dd-;3+tTFe>`vm_!bM(uze{n&m%-87D`!Uz`#QIPz4;quu&5RP$@AR15VTR%(Q{1Nw8CPY)K* z-?X}Tbs=Jbm>x@1*pN?^J>~LR|6|wwMXb=!e1ImrM?4-MRRD|0R4?qAQrAyP<}rsT z3T&81cZGYm7_ROu1W|mV@a2B3&_E+14muFF@??f;U@orK>?<7Z0oSpgTPQ+ekf}-4 z2K;hCqJ=Tbe%CF3oUojPWR*jsx&`FGPgfXw<)(w?Y(^dgKyCy3D}{(hm1p?%)gw^f z5#~V~=bhMR^18I}7?6NC7Ot#N@_&cmQRjcYDhifs%m@tp)g~Wx{Qih7aOHhG0Gbq< z!8qJr8&&tZsuGYLSdGDO;u;})$4}6s`Rg;6_`BeD4fqL$gQpkc(BQ)!^t;93#Uy^+ zzmc<6MZf(-K?Ij5H+^D*LA>TO@s=>Tok=huB>rRJiG}EXaI}}QJHJ-iiw+!XYvSc= zFg~F&`^M`%5WXACNgDT>E^?I$-=J-q&ooVSqdzhcIVH5-pO6rp_|e4#7YkLHg88;I zjy%JX2eL||^5STnj|%Rslv|Gmn^wTQi>{AAjWvcv%xNlvfE$-^*AlPCB0lbLkZ`Vl z_;G!7Wm8@Kb(G#2^W{GMy6d&p{MOL^d==FG=Oa+Q3w2z1YYL1DRW&7I>-KBl-mh6@ z=gh5it@2mWC&WrqygscNb&=qkUnEs+fo%$T zuUKu9yL-xNkH@@@**^DBx8r)Usxcd!lyUsb;fw>zn3#GEZ6iF}6Eou?E%iak-1$Fe zSwVs4fPRH|N_Fk%kh%sE*^4Bdrd%4TBdk7}fCS-2!)B%uXrA`+U3tc+&1s$jH;pLU zSs2BahDG?d+gKRYSD~1EUrK(puwJ1!pPpjwfU0+`(_%T!5H1GjxL)$8nDp{_-+-{uQm(RSKMbd_T9NxIf2yHluD#a^K`S zmD!Kg9K{#lu8L@fh5RVF=vZ(%<^tWfdY?c4G6i8265cIG9p6~p_}5Awj|5u47|T=E zTH6%H#FB8dPM{w6j+s>V#D2_UVoJ7~s%BdXW-ku)aziSx)Lp=P783X%n><>XOl|EX zMc8eWIwgF-mrv9G9Nm568=3sPGg^)PNPNWrriW<`*v8*=UxW@L&E+VwE`rVkbJV7Y z767Q;LD)s{67Wqp)mJ8VDl$q13V)acEc7E#NG)7(c_@XSWgSk3Eq5U&F+5-8-@2KT~4a6_U26EC>>1E&NkPl}tEEq<;S*>b^8pVeb8Wf2#?TMt! zoXCjXd$wxwJBWI2>Wf2?x@t9G2z_kWfL=?1EpYtTqPg0jVfTbJd{6OcUHq3kb`>Cy%kX*I$sf ziss~Glki#Qx!4j~P)N6v16~0!qy$Jx6{nFf;SLE!{>y}fe?e)*xFnI0%~ z?dl=^hXZr#(M&EAde$HNk(Yr}hRl=o3VFmKRib(qgpR8tN$HZpv&}n%s@YKuvsaWf z|9s!hQXr*Lvwl)Vn}=}Bl>n0!BKoI;B^%_fG7Ko}L0uX(Vye+Yt!}*obCd|R# zmK#>p*MI41YN%ZS^9izyl0#Lw0>~X;%Od+OWmbHoY~FFf4Jw23!`}}&_%pr&sjLl13l?M zugF}8A}xr~8lqz#@#B2^+OfT}>BA(PP(-N#3eE8`xPvGfz3YFsayiP}=!!;P+8#a_ zfxo+&p=Gp%;3+#=s;937Y_Icn>n`sVCiQ`ky<(dQEj4})yph&7b3 z+@YRRe_Cb!3CrP^NxNL7T-r4Y`%^eA_k8Z+CilH94Pxi45i1Ni1eFTE|6Eb$`Z@29 z0C*KCC^Mn{B8>kDGnWQ}>^IYAgqb7kg4@-Vt$vke862Ctf3P3Bgn0X9?!8XI2@|O; z$CRd|@rM5~oI<90<7WasxHL^Yqgm0RwRz+sZQ4}RL!ls_XV)627C(O1itIVj9c{1vgnzI_Re#g(GG+EbSs$iT^7q0oxu2G6T#Qq?<8_>1JR}Z3(lW zvMourLcn95z$q`h(q3JsmXp$zv)A(o==DayuyQVCz-Fl z><|wI5k0M5!qCT)To!Yy*E1NMXh=LhSd*ipA&ga5 z2fyQ;Hm~}$X7D7!OxM+PIh`t!NB}luM8}f(uj|}!%u4N+*2rX_>0nolXG}Ff_kv5q zQ{2eAImAnS*miom)PjF+Tt75sFnSw_qQld@kDp53#P|=k9Dc)lW)4*%_P-@kWHE8O z?A&WHSkFzX4=RNX*Ifc zl$=2{jV*%N@nG@q^Zu>&MaA%C$Sa$QOXY0-(|uwpH$fkCMj8ZJaWn8y6h$A<16^q$6umPmh9`h+-^z&M|dshSc_E5jp zJ$kM`ZyH?3c;Pz5^J$H$^+BF&0INWV2^5HOM{%c7ak$vmz@FErF>z@f7fl#Id3G(l z0a~oz#0vjok;wZ0kfh!7`^ryHZOyOUlcX9exkK228U|(!UmWWuFn?G_wulheW zo`O7_!hoTtct3*8icR-muq8U zmW*OuRPlLA2|8I0C zwKTfpq7P{i>19mxqMO6C)I1xTW>Q6@Fof+;{zU7B6@-~)KwdO`dh!;eXK6tWoxj(W z6f{YTPBJJY_#M`Z?47HU1&vT1g>FOXr|H<0StD5!3kipgS~wS!bZXGIP8_I!jwO0g#O8Eq z4}*-m^*g!$3$vd@9(dFpHLY}POMlfC2Q0}zV@zA870}|*m%n4ciXNn2vie1se>wu{ zj|i#C9bLjoq&GG$AMfU9Zt(RFxA_4+DR?mE=@xWL*L3z|4e?rXVn40CAA~vWk+A1t zw}|1M^1Hg}6d3{1+vezf;LqI@919ZyFek*Ka{-QTq<%%RO4^=8FjW@m1}w;=Va{dC zzK(%sey!(!)1$ZY8Ew)jg;o1@-d3Dj?AMf%a6~IBD9Zi&R}1{!=T%S_QC$nrvJ4V@Ljsq|zv|$`M~! zwfbBlpzHpz6g}Ii#%5TmCc9A}EIy;O!Zr(zn*MW2rMihw<)GZ)-SwwuhZXUY0TjPe7;o#agsXbn9_XEv_@TY7beJp?(q0oRc2{sRw(`{hnN zju_uZKU#&01|S9HDMksxHJ8V$69OaCP^Oc)*}Ul;Or~o}$o7WM z?w~-Tz^eSTWo?gw33GC4S-fsmQ`t;uM6TdjECxYkkJqzi*@$odQ&5~NUpdAXWJkO_ zmW}PTrxPy@Ndj)nfoJ9&k841e7W%xV9yhO+W_vqD%v_o6%_=tOr zB-qhMVOxP}c>t6op-&#lYS@$+A4Mlz-mtyZY3M@OIP`nOG@S7nX@cY-Af(C`PA^0~$}xN1%;+gSyMGQ^-{^^^vn~GL^kw(X{3fd)R@5XF%Zo zSdNVDK^HMSe3-r~eJMimjsoGkb&x^?kWhuTtVkG3_z8Yhpz_r~)~8ta-8%d8MGzx3 z5N`oMkFwiKA{2jIV8^tYm(2}_mk=iNkeeb}NwRk^qwKGf3#83PDq3~2X|zadR@{l` zjHU-j3`AYg@9X%v6u#TgGb59p5wr_0yEQRk=e?R zQ8e6muF<@OfNDv&G@`6UK28~^LbpPY?_onpfKJ*?z$M4*w02xArNA>0Dj6A~SfdU? z-tnOCfo?Yk$ZDExuzH7ICq#b!3^n8wW^(&5B8K+B*%>1ro3Urp+zA1oNjb}D!O@&{ z*j>}?pM302d*QFd^)6S-F`lTxIij zCFAr*wc>!4QOBs6&=91E6lYImek0w_Oy_l@ySLR@;;^kmxJo#M2IctW{~HjA$D}2}1I9rQyi&yf^G97iVBLJRTCE0qOjbrD0c{bt>2< zZT|8wI0ItYVv-^>t3$Gwnh7cTT~fYJc6*n#DnIlZ-l)12ki79lPqqhCZV+4_x8J8% z7dOE{9n^(m;Y&YLFJ+0g5&ZldWWwo(&ko9wszeVVQCDcL9OGL%-nTXL>KkJl7n*A0 z&8HAJLJM|Ub#VRZa0~DC_ih_IXynZ)AIit&Px1x@jZQD#8&23ws#&BW08t>{j8Cqd z_Ufzsjpn{8>Q7&B>1EDIUb94vRMp4cxxr-*(_H`^#u)1=<^VfD#J_=V^?`mcha91k zdS*2zneiKdoFjrP8>wf7iRk1&{vd}znWenbC3qTDuMOI#LVxjf1-TwUI&Brn2__D| zFrEt8%yPOXY2fY`_DSnAF(36i1?4tA``FsWA5qN^WEzqnC%$f``<%@R3HRdYz&a4# zR+b+pp^%jb{d${+)2IC6WLq<~w1E91hp!h_)v2Yr2;@e=QPC!YBHVuDC3}km*$`sD zFt_Ia!^Im}Vso@0swdwW*bRj1*pkX4z`-w`A zK@-lOtxeotNv9=*Sk>&7w)nXER}Uo4MUFty!m0fyBvU~an=~j|So}N)8dKh<`USE zZ03+m;wx>p#69|@6%-w`P#RnvUBoUaCo>3;j(ACy*=krdsSEK^bZX6}9$KXL{y51#SOjqWiIbyCd|0ZS*vTBpv1aVYRBE=*ofpu5Z z=A#B>j!Vk$FTK$f6K-}z=zL4Qwn1x`c3n!}OM-1i)D}k*UhtK|32k^M^d4NY2@6x+ zMyL&eU6wT;XLc(b!22fp>g=lD>()<6a)z(aM|k zo)AV)zY_3EAu9XX9dlqU=-!o$`7NP?Z~K2K1*`OjjcDVa%nqux$dW9Zs8?C!3(Cs$ zM%2`AgUfoPfgGQHU|`|lg-r|=e)0eK{G4nkR#+TrcweG4&~^_9;39eYEREk{75-Xt zSm*MEUg4oQ!S0Ohmll{`iHfZu&0_ih-LZbMWXQ;Ocg1uoqh^=M7qhCmtGs0Xnz@?n(5uTLPgLAX;fXUvw&|qFT(~BcQAcRlqyN8dL;Cj8jr2SznP^idE zx?>L#sC7dZ-Yz3iD zl5?STmxNy?!1rX9aH@IxT4DGEs^i{OS~@21zQw`a7NzLAGzSUpKx#L6C6h`ZI-Jh% zcF=>?#!%KZXFFB-X&v*Dc1z2!j2k5d+bni1iz+QF=`>03`!xwJkNIlH{o%#M7gNp z(c2GiQJ|iKswyj_o(jVWeBU2-e4GUm_wvg_>RkId5;eqB(-Y(74sf@ktWM0Kd}oQ~ ziY(64{gU;4R~n)(vTj&ulHx5mZZ~Vd#{LetZJiTu71LQl z)1a26@uh+*&rwgS4=Nnw<=#q$R)8mu{#x;g6nhT8(nU!YtrQduD#htLmj1 zDoQn}uOKbAV!|x^6?zx2?Vz<+Wf5HIG=fmv0b)d}i18}b42iJat>cp4iuIR00+tp| zZ{g`js;_8t~(C*XaPXjXPI3yhe243s!WyETu;j8RMHP7Y9{GXOm2P7 z#NA=1g5teV??GRGCs&DxNsfX>6tiFiO0m1-5fun&ggVJ@>$_+YrE%Js-^EK`VF2h%tNU67R*n z=Cspi#Ysi@do`GLyuuMBE{vU$qKn+8WhY_x>wo~Kk8vMY(^v@$?MC?psd4quPdb2o z<9aVv8(g2+Zh;)E|7e0|PKT61a93?6K@%^o;q%C=%8(I$oXo$$!4 zW!+>*f0`S1Y+9LctQwBKi-&<*SkB7q@{J1TB_c=UvYwvIb_;XO9?e#G&8uYm!uLg! z4L8V$G+bvo&TmE-=JApQUxlRf#cNX$X;GbW#{X?&O*MVnqMRo&{aw*+#EiHh^YdoY$e|~#iCaySOhN2WPEW}deDzB!b4V%H}g>~`W%w% z%l#;+=bD7IefkJ!ypIlo%v!ItphYC_q{U>ji}oyHj2ELlzPTL;(+sLSy~P$cOg)lN zgMv(M213e4Vviz6v2zi2E2LaC^)(b*Qf# zkxxMvGQuMrpZR9)I^%5@X5qhl>$+F6s7}4gGQqtFmhYzNdVGzUtYD3|%}@k^yx2Aw z*7YrsM;*SFWz09J|C~$#v(%c)-mfPGvC;lF;%F0_^VWXmo(Zs2^(Rn(?k){i7d3S= zQGpe#UmuT)>zt@PdIUv@vjnvnpPN4}QkgthG>a9iW5YPko`N}z)gDUQ0Xh5H&=3bWe{^!ZsfeMCCDzdI|sm z$=6cpaK#kb`aXDJ^p(CdZ3*qNOOO9%J1*1Xx-WOM+p&;7Oq8+T|LfG1%t?WlYG}*J z2E?(7y!e3YdYX8EK303PnbJr1(JS4@Y_8M-c3Cxie{-#G=e073l%^AW{!!Msoi1!5% zF}+-qp^5u-h+@~d<%@WB;mao6b7?+4-!S(CL398kD99u;XsP?RWzoI`i*@Z=l7`!Q z1&8&y+Q(&G7)605;ZAV{W&1C1lUJG-fRevUP zYsdYa0G>SXYpl^Mdiov4#X$3wGo{Mm%3cA1eF|c>UT9l~<7877ms|cU#n;w?;~TVE zbie?V=PSzTa|7J@x}A2cW#c^4Tgj+KX%Cc(q1cqc`tl?#bkfbiknNnrHYu|+!U0V} zNuLIDwn|9>M1#W7s*{nVQnVxw6QDcOC)`i)PCnE&;6&q*bB_`QuHFHzRqqFE zI{!JHjj434fij-&6ZkbA*T6**LB7nJ8ACX+8N=ShL7itcJ~a2&j1r0c2%wxpOA1Sd za7i^ORvbClDq$ssI-Fo@pO=@DMtm`5fK~rj9`GN8-G*ZhJ^7$&3Vv9b1o~=!11R@L zS3@&7Oq(CEK&U&T#u*tbosk?%Kjsn^LzX-Ab1K}4Aa`{5N~9h8+M)R!k$WEGv2~ejI`ZJ#bS4FktA()E{a2RO9p-I-^UhX40k z*HH~8pgGXB*uvfPj(|}dB?w|06=U{nb}$TlFb^7kgUwVn*hUPR@*N6?#Y@`etJB3&p|*`WiVW*sJnt2ihH>kAp_>i8s?(UV2iU zw0PBjc%nh76@En&Uo9pQzx{P1yqK*n7^HbDyAFicN?Ip|76P5e-S9-PiJAl8q0@&> zRVaIPW_@-?M-Dt$drCdW7%#E;i6@P3PRpHVQIG--67}O52+NQh$8K|;++k6bxR3>& zu6$evCzbo3MflMTMYDteE@Ov`w|{|f9xe{jD4-7=mHZ_bXTyQ+1xcxILp9W=tf6h3 zF^!U7(5P@IAc?~8F)Nw4oy*hZsl6@8)#G&gb3@(@b|ZlM$cP{d6wECL1PNpsmwQvq zeLjg~cu=6Qqu&Wq013y?T)ctu5W&k`vy+Mvt2BKmPY-S9N|nd6nw&%aZL&F6wcemN zD<(1%2tG(hWbAVms1b_!n!Vb;ASYc_4KAN8)U*@I2BfW?X4!CLlx?3QJofkjn&PjW zo#Z%-NKTA{(%lrE2_XxKg}Dd(kvNggOYoj#GsyP7uFjGPa zb`b*wAzNociMyAw%4p$HDIVE~uJ}%_S&~C*Q704lWt`RkTLx!DrnH8qHI}2naG;Hf z{_PjF=ty;lF-J?uv=j4g(zHT|p52tY!$<=;gK1`lL-5*M-&W6l8LZpj9*y`I6C@h% zWhRY7*Qv0V|!oFEWawKHbAy@OX)B|?p*IIl@bR$^Tj%0YL(nUsPwwp9t zK+5K`k5<$|J!N8*cc&KTBlDJ&Al0yX5*1m{Fp!G1fL=Xx!}TS#6rKM}$?gMe>Btl8 zNOh2}dBtR7Tft_`?rHp=h4#nH&%j#?S6KV4(9kZI78PP9PGlXpHT`78Bz+DBCX?)X zku;d=v_-mu1eCW#F0vu*BFOJq9sZM{_*>EgmF_ODd^}_CUm}dHg4@Jv!1`23cucmEbPamvUImLj)qx z2dt1kx$Sitw5Z=Vdau^1^^Cq$NT8g*Y^{|y>EnrQzfThBpR$%h5O#Guw-^!-j7h6H z{UU`V7Hw^_C``!V)rMq%ndIhf3ANhBG@lNITX&N4+%0jX)TQ;-w{KTdj=Uk~owN7hqJvm)0+iw}o#0=bV8?hjNu2Xd?BeLMe z6NFL4)VS}_3p3ojM^PCzg%K->A&3p1A`Cg$m4sjVgDD&Ex(*^*0D@yIZV#-)4|^Y4 zyu~Jv75HsdI1&9ZM5w&S`=((2q4dx&WvBfNfQ&`AeNdU`qXJpb)Soo|k|Vje8GZXp z%zF!z!>t$1HFX;@dj;URB)%1g4)Xd43}8y5Ne$l>%qo-=TOMgWh@|yLCkxH-LA4V$ zhpzg7&vdN%YreU?6XB|I+@aa?i)J)Wamyl9)Fvb*h6EpRYV^Jziz(MQ$IgWwq`LGqv8pyuhW+m z>fbrnVQ9nP=kA%h?X91e{7!nvfH@6GpuY!1iQ6{7Lg=e@ax~0ud@%(OS?&)CaE>b4 zs)S2(GC}AF6v<831ZTE8adtHQr3r2L9a-s;Rp@x0^Z0!K_~W%$$1G$-^RjF~3VY74 zcon0@P>rVASJKr#=;V$*^*2Tp46O=0Znt8sE;5mYc^SOinMP}$DQ3K=S0tIK(YRJDeVJxImI zXyAcZ22F8R=G=7o(>xb{(B-D=Gp}CG^d$IgSKd%Zfy%hXYxoaa3>hj2PDbW@1yNJt zshjq3F#mElk5c2u7wh5g(35Ez^jmB2QXCo3V5IIpDqJQ^<=G8UR?4KkiPE%npQA@v zV$LQ|&=2?@ev}5ILur^8m;)bUh~Hu3clMs=KfwCg4uK?ZK7U`O)mo}^+pQn0SIZ|c zmmC|=vZ|fL?)jCv1`Y7S$#0B~7-d(G%R0BSrC@p*>C#P znR1TN{7?RMQ;y6kSN8($!|-j>7vdu{ZGljRCsv6sI^(zpcvJ4zOl_fc8e^{p-E@*N zJ7{|)mN{#>*l~wJ5uGq_(mHI&@{)!b_^-D-@JB=`VouAKPa6DX^V&4_2* zn-PXP&(ZQ)iuB3uR=<|asX=;p!uNDUgISOatI~=tO1ahEr8%ZR*@cwpEqZf7BW;ls zUI~ViiOKB&0o!_>1zqdBLu89+Nuks9zU$~g#$2_=R%03gH4PmZ#wPSK1$Q-il>Mb6 z4K3q^+QTh+Ttv9%R;Y9Ejy>=mXjI+9%DcDF8MBA^%~0{u4sElT)0Aduq6UCjBx-Qx1=4 z8pYY|At*DX6%|y|&h%A(b_{9RwX#WD+c6Bv13N9+<8yZ+4$$3}VOT`&s(0Bm9@WjM z<|_0h43_MO!VIqSX)@aR_t5&IrB+-y+~gZp9R!}dvd~WVAod%EQoad~L$)dx!C++G zHRoIbiEJYQ#=!)lv%?UOs!?T@Uj5N}8%RDwkFSAcC++i{tqmSFN-Ne?ubqPiq_p|3 z3pSqxXQI+Cr8z^qqJATpq(20QzK{P8zB_@tu?4^vL|z;6N8Ql0R%*-n1ln(oRQO{f zc}1hPnw$v~_3$P8S%Kco!5k&;AjF_G29aUiL_C$K(r6$Lmf@hXEz+_^y{1vCa!@V1h;e$}#=Ers{yte1tsMx~`Tb+aa(I zxb2chjc)2C>B(X2r^8apjo!(f^=Gcr=)%cESlFuLn4l8CM4kDyZs@6B&?BmRUk!hJ zx7(QTPnFh_e8K?v<8v&|OEl|9=7~R36oIJT4cL8akE1+w;GXNi&+Wl3Gr#&$iMI9L z(PEqr6K*j5y{~&oG0^LIpUJz-7>#8p+ce;Mo2pWP<51oqGG=vRDaUA@k9vKf7V8=s z_D|8R3+g~O?M*j=>UDg1wMgk{SJ<$JN=3lpUl#0-vfOqR@MG%i+f=u(>Uz zl~Wm!+^*~?-f{A?R-v(l>s{;L>z~4_-kKlZk zl&;O^zZk+#lAR2j0rMi1NH}a22+_`deGv@DCty}T&YnR!Nt>H!zLI&uKR9!M2y&R1 z3+j#*CoH)v+1eoeRf@Wh_5?Vlpgg)*|VBi#b2hMYos z8y*nvm$`_>@prv&2H{r7i=M3&#&(QQ+i7=kfpy&5pI+8AjM-p=-se+&{H5;}?^`9j zh(S@OQfH+*^(18uC97|^6rwZWfM5U49pc-MQ5`kFk$jC z7n-wJ)0Xo1WFJoV~f{c!(Z=uPd z5&TLy_(eFRnA#JitYLdnf`VT9jZh^o+BwWp9x$0|W`#!AKMoRSa@klxlje=)jsz4z z$X6Y{L+;z|wf+Zqj8`rIOaS7l6Q8=GxYePfs=Q^-#o7+ET_W zF2<7Ih;=-Ra~2tL1lqPzEA7Ql+P6+f99tz!6Uv6*BG1{!Us|OcE15FB6!=mj!d!H@Ny6Qw<3HF@NszwV&9oZ>J*jWNN(_k0S4A=Po) zA)e-9Cugt!(J` zv3ufPk7|`b(sv+^qD#*Pj$=V=(AOvaGDJb&>OFc}H64VwNbR8H*4Zv_wG#g>3o=xF zrp#RcM&6_8g$JmL4r{Ig@iu#Lv}V8}B-A~RGk^WklXk0qlegBOS-0I?M}jf=F1)S9 z)*dPQf`?gmBqkqZ?cUp%Mwoe1lt6$Dgc>SGXy21196cA=1r{#e!}(T-Fz^MCdm(j( z`u3UhsbhFBn}>Cj%+p_jS$7F)P7GND33?2|N5?%L0GUd|t6qB|H1p>R$8d*-n$5XQ zqOYG?6Rj;R0#d@!RSAH*UF9{G;xkzq)Uh7_Kdn~*8?G^yJ8rnTP4f<~k-J>c86o`K zgJG2V*Z1iocE+&EUpCxFnglkvQO!IZ;OP-zO#t28E?y5c?RBvg&?v$cfo}GGBO)uT zww!>Lvd2aAIB!>|M2cy5bQ9F8a=fB4jl11k)Yr=vYr{F`QqWxInuT68d6~f6;2j*F z$hvL5eQWp5Z?lu?HRa>66f;8hq%d$trPsIk1Ld|41a`h^1q)i)9euVEYinzh&bV|F zWp$3Q#gY1*HSL#14FE_t>E-n|wy0f8$T|mi&pF7Y@jzV@S`cPmK#aN^{YFh%T?f^8 z4mm0>2&cs}1;qX^UpE(mE58!~fn#gpOVuVBgRkTNK;ozn2(c@IqpZ^`SaCH;!Y$X@ z1Y&O8aU3m%_QlgE{OrLAHgC3#v>qb71V+s^R2gE?j6h;-P5*=}BhTxrS)pz@Bkq|4 ziu4z$?%sq*EfHxq!yShEX*=a0x`U)S&~JBnF+tW@Ep<%0XeB&DL5tuw?NC zxu}HX+P`ai$9VmlaoTf~Dl4aotHc&QmOj=uS?=!j&8r8l(ei-t-bVjw2O zXtgN=2XU4Xx_@>RAu!+$fMPaEmnKK@&SOyg7i*4i{!XYD=}f-wv3jVo!cNZ>RXko1XUe%z_m#ry z;M%5uJH4E3td_4_kXpNa zSzKa~{k&N3RUz+SmCfwW*87Jo(0VU99RnK46jYl%N>nQ2RN~?{KN|CR^thc^QEtm;*Tf$tC_|6~f7C%$n(ym!?;Q z^*kP}NrgEQI?9iInc!;0U|<90N}sYct|cffpA*Um!{L?!-!&`M^rgqoeEU$HPOh#^ zjz@kI03FGdv(O=`Cd2wyCfFeH2kdY6E2l^q*slEFSE=GO@#*=;u|NJ$48@IT29`j7 z+5>PGJlmkNE^rcU8pgorP}J$<{c?1R|bI!&Dw9 zeJ&l0)lJ5Y?RP6~iWFFiYPVx%FM!^}qDZ2#crvq-pu^Z7m?y%R!BL7$HsCx>?k0FA z+TSN&(RjV<(OYJ&H+t^FkHB!Hu9q$Dr6cAiE#?6^2hiZ@$tUT5*0k#@@?Tj$tg)RV zHn@$&rj9-}CsVQx{0^PM6lo|Z`%+aKp4+?OvIzM+L5bpfFb0YGK}2r`cLlf=N&NNJ z1g#sm)5+37RhlZ(5#TG*!K?(4(T3HteqPn#gf z9A@J2ZU9+C1T^?c3d5@I32U1ME@$bxf&5Hc&1GQOnj&zFC|q$^*vpvd5uqO?y1;9m z=A81Eaee$$S?%-TW-7}2$d`Yf7Un?YFXc_jf8yf&c%qdFB>~A(IYUT`->83RjmiVR zbwmU+Rer%br{$sJ#(qWksBTg=&)hYNy8k6(B}UgB0+ZHSoPDj!S)<@7O1syaqRqzW z|DM5SK%^Tm)bQxPBKTXl@L5s1PPKT#NpfHX;lhS8^D($rpXxqPV4?nd!hsrb=WoQHpKN{`kRU7vqPum_j#*aK#ef|2MPNffkB(J$rRY38&kvx_xR{4rDt7Bh*WfS7< z3>MDIrQE^Kr5%m-=w!h7VZXru3~hSymcdnJ>;zLrb~TGu0C*7~#4QW}T!V%oY5WB!!pWy{ufLE}zAi$buVPS23xN7| z_pu=EO}!J zZSWfrvR51r?b0PNVtu*t>Hq%jCew~?PH3t^ zL%{aiHHEMPWRbW8l^yw>J7;v^i*%Q`rKGAY2~qoM&F;6(|0U$TKfK4YXm|nc1Uh~T z{q(95Kfx!5Wh-j=E(r_W`f$fc*Hp)S+p^l&+co5#XH(7}KomMmo_6YI4h#luW7tE! zLpF(`Wgb)!Zeuc0@xZ_l@Q1%q#xb;BL-;0YM61`W_hd8gp6a;{&QnNwHH$PJg;(xmxi0yhVyjhi?f$ZW_eq#?iP(>9K8WPqvQqo;8ilCK2ScgJSY~-s2ioa^H?p z`^h#;iy*sHyMk!i6Eogf}=t(BDLlv6bKM#1$|klrrz)G*{iEF4wmdZ)&*s0R?OV$UoSg^?>06$n`8!D4TfL0A9KUXObRs+yd7TLU zD5YquN_^fQ66tBT{-Vb7(d)TWiOu~))zF~E9|6x^UXN{3M#t50+MfpFF?QtC1bvd8 zQ+?&hzJj4hHDj($^6Ts5yH`)h4*Xb3LQ+L9rmE%BTL_mT(-;O6b&&YQpRaR6=YB@~3f3F>se$f)S7F5t5;Onp%3kPtUh{qUtpgalhxm2rBqCm#ZBPr-x2m zSa-}y1Clq!`~DJx{?37;707Rcnlp5g59fIujuyP5x?Brv8hop~;{bI=nnwcV3(LosjoA)+rAq|(gFvz>&g<%t+^wV-}0Rd<&z_0rwU;l)bPO*X?7sYEpr86#yTvv z1m-&1gH*Xs<@5SnyvITXD4Q z>nRqBn~1|zi{DSgCCt1_z%JBcKEZ+3&Y=U9?jyTWUxJczULf^p2a5X4ik<)li&{k< z%r~Q&MyBjoK<;w;VxdF{GZq-1rkwFYW=YbGuCMRfKHfS_{V^Ck;6NI;MA%rdpwZX4 z20nhrX{-s?qDi#%ErEtV(0U9Tf6mw-7l^9)YO_P$&ZFlomGvo7c81B)tiK1>Qx43F z29kmk{zXEuU;Et7T}q&Sq}o3_6M&`3(vnVqYCu1?+|U<#8YFyvxq4tMj=TM zDp&mK44l4Ch2de&d{6m)G%R;;QYt8f6mn=_Ofp3IXDjR8rVHPrQA7y0d#_hBBgb`p zwO~e{wB{WZGS|kOPXZ`M4FuDAE?WjqWkdv_!wARQ;B#AccFQQd?gj$;i9Q=HvKWkt zTJ>*VS&H+;#zX;kE5-}I;86Ao995$m@jaufQ9bd=Ot;?eT}UWtTf-q%E?c1I1-t|ywiCcE>y5GxaHs$^y?7G6l43dW%QspWws6AL!! zNtf-wb3|@mUrNg`d_<6=$_A;JEpvoG3Miy~EFgG?O+KozC$(9C=2RSH+{N?JRrb#Qj4<6gJB3y~$< z%BTY@Qt}M$U z@YOJj#*k5=*(S%%wbt=xnUqTJFDP(y_Ie#583dWlGO*{IL7$#DXECIylh~SaXgUPl zgMeOBO;JvVm*jqLvhYM_V(`J+@Odpys5V@U?rvrlroMy&!ousr=%a9YhURLjFXY9m z-Yp4@VdvSKc)7%4-jG(n!@Qe8fyrq34sx!d8Rkj)^2mDyO+4O}|L4 z*A)XvdD{`x9qM_wz+|Ef^(=41FywJt*q-_Mv!YRijGNDbtOQ!6i8$bqL$CzoOg)%m1)B<21SE|TmH$Ya@%@cws9P%!9nJdLh zVIz`x1`wOuH{$x_!DFoXs`BDBnORT$nGN>(pFU9YId5~9kuM>j0*sX`bSG^RxITHi zai&A_>@QzI8xMwKDzss;lNJTUrPcCF^+m@TNV`DScKMIA>Y2WgI9rWRVYGjViME+! zJO+@z*xek+oT}lBW9wQ!BRVI7hHY5=MED4o(!AwIyTV=Wfjl2LrgUpzrA8*W1@#{5 zP=lEz$m~i8P`23#X&%7|!krudNkI<*0~_aO`;B9F=WR;S(aWB>nFHo7VMf~j(%y2^ z=OId%yhZ)NDX!47wf@9j+@`5iVJ=~Hqts`t&R@x7tUGMk_fA#G4c)u^ML@osN#_xn zo$C+B@JQ)-((rVMrw0}mQd59^2KxreVp6-R@oKOnLNT=SX6N>PtTJp=B3bq$^3K;& z-rsDC!r*9>x5Q?2It*(88fSw+5Wg+Ad9PT#ZlPk%0#{~9`4 z6^X?7vz5m3P{aLx9MGf(d#bf@WIhT!?SxJt%OfwsPtc%;-2wjAc>d8DGrZUk%fD=Q zedIDE2pe1=keuO2Cn1^2^^geVPG0 zt^LbwXvmyxu=|`GcFUl@?XH6EN^z}osZ9!Gc6o?5C%ottHY{`>R)S}Kxp)Ul(0y_s z^Xw++HPDDE=Z&w%%$uc(v?4C7x#p#d@TE06mvoz^2k3Lr>D6Mh_*k9V6Gpme<+pzv z{QiJ0sLsl87S8o0LB!M2skZp5)DjtszNe!P5Y$x#{N91c` zb@y(1^@BVqv}XZkrABacQRSe~hMbs|*O)R=W~?SN&E&KjIZqKdA|hN)s0D<`87F_4 z6-AHNmmFaKO#VKf4TsR$E;`@=+7CEiDb%Bkdrx(Xo-mhOmUnfqk?oFB(cKrdt1WBh zhaWg7jx84Tv?){S!w%u?PlZ%fzuix7i_oZ6)Q9Gjxo^Ky?6Yci&mci7xePgH^zZN zLz3Icds28Na`mi)-OfehRm;Jg=FN9il+6 zomU}?>tt%A@1H`G7aj>VS}Jk0zo$O^(Z6#`)OiLj!o7i=cvk2uev%rmB>=x5Pfc8( zXl?tKRh2x;8u~6#`aL)(-6B=GNlmRbpxEC&y{pXyNrcLmH5WhZj>eAIr7mzqLm-$Q zLvmiQ4pG5*@^tP#z>HXA&alS@XvC6!fuJR?wF?fBMRGwO)-OI8(*hkuFOdcO`(WPq zlpajxF}M}*=N~l)EA$>Zn+T>MssDTQ3oTnnR5nWzU62GKyf%)^Rs7kDE~9S7=$PZK za8p}35H+!*KIW3`!>jAe+ibkG2Ew+?@9{wH*YO+{kit>Dt{87%;7EVn;M^mgAt#3@ zj$(bBS^vE@>Kj*=_^($;;qN$}*Lvb^n3-GWPo1AqJH?)uda&CCQ9OH_*aZqi$&}X{ zuAfQWOPKs(R=x^Nw)>yj`j|lHIAMQA(%P#1K2}9`#lH zaB@))Ob0Lc^&RYeLauO2K49S4yMrm_^%VartL9rzpNFelZvIAB+WSpAILh1&&eN*} zJr@zlM=4v=kbEwNqtPBkX1uLLy#3>oqwh`$_fu2ikXR0T4Q@i!hvmv-@)rp(%l&6y z?1iXRa%y~xdOQ1}#!DW9!HT)Y>|U&k6RFf05{q^Z(LbWRo>&Qr_R~HiELr=?>$2!HD*Xy4`O4r zLbL+4Gkd-}$^a&M;zutUYyB~Pq3M68;s(#kNW|ZX%*SkH+v3Vv_gz@T%^7|=*o6D) z$BI+`A1K^j{bjL-+{UHMADxdnQK}}V{+>V}#ul1FNu6i8C)i7 zh(O32p#nv$H>YrwjI0^a#`H;Ah8@wmXrs5I8M1_ddL?6Rx1kfPS}-ulU+~M$L3u`d%P?SGe&IVKy(IUgM@Fo4mARI8ft^k!gG8$Qduz&pecAwX z>q%cJT<3AhpBnCodr@%KGf#F)(UZ{SF$*k;MI*Dl`4_d95N54-CWywbWCxiM33atI z1i80L4bkgCl+(`rA4>Nv!2}sH>E`a|KFDuCJPf@ykd-o7GS!88eXhyN*PYixp90$_o_Dhi{k##UmZoj5j1s(=C} zD5j?V%I%69R5fqK@KmS+{W;B4FYlwntQk@H5`WoJwVBw?Lkm39ApprvkHVmESl$W- zs!e9)2alm1B9mfV}xqMj9DG2e#!zhALH zI|40|q0O9WlC??De5NjWV@h(u5(BFok5s>^j}&~}GGtniyV z(y!Ime>J^zdY#V(nvJ%TT2D4M`hF!_W-Qp7pa3NX``=(pG#3CF`U=AC;E znN(?v083)@2Kq4s0O8bN&If3uls< zWi?$;ns+K|uEc^uSN0Ua3q|~t#rPm=RVUPSafmlZypH+;eI9!`@l`C&={n8_=Z!Px z7W*zoLt&Qwy+5y*^0+#A^$`OQbF*!q9?#u9VcMja@ZvG#4MfF9A8n*5Rm>k7H(PVm z_TBt(y%2pbwv+@Tx-|MZ<)4cPigKu`?|Ym!@0V z9!s0Sbed_uhS8AqBi6Po<0i{?qgzS5+x%zgB>ePg!Pz%^RWsMsUrO^x(0K&jZO3Hw zqg_>ds>NX}O!#92!2AvU-~>;+i@IO-9%L^!t)6Q}G<3B~`4T=8?g$?@9`Eg~)TnjG z%PXp1d@s`Mol)oX7U>YSGsO3g(8Uegf4wLTFd_J&NpZS^xw`ZdrUGGjg#5%->+5?v zZvRTT$V^_7|BJ-tr}b`2KzPCQ^@wDA+;1k}@@q7sZOEQ-Uk$VCw{n=rzQS-_Xl#=j_Mx z6Rw2Z)Ys-0b)RH~hy*gZgK5b>vW-RtC`^y;>@dhd^-QzVF>cfi6bW|)krU(o$DfL4tCBrLFN3=^O##zF038E>PjwXYR6h! z#Bg`gxSq4V;n`FMQ)4>?DBnIcP-N3q_qQwoU8VNJhQx5K@WSWBG?4Rg2j)xHo0jlS zuZN1UwEu#ds(9+yM)0}g~@TkNfs$_Z&}8`#qj z+yFa3#J}BC#hryPB=o*JF^1&AAm-s=aCHvDx$!_!woj5>z)KH{QY=4=6gXE7s+3<#OGQg zJ&QDWr0W6^z@$%k87k$?v2*e`vty=K7cej3+X_J)wiO=4FQelpS?ld;U)Z{O=Tlp5 z`W{1J#I)Kb^?fY~9r{OOY7V(JW>wqYM{iz~cuL_jViFg9fU@P#*|K)7bfK6rh~K9a zJ9JugwVm9xqcS>a%c9v-aFt7`bN3D&A^$SPM+Jp^EdJD;e&*zk3p>{VJyIg##O^;i zKYms^E}bmu0d-@&x5dfj3iK0B+(Jjt&%jBIUcuW_mh8CgRBiB#H_Rylg6-3e#tkJ7 zaT9A%WTJ76*h2c~2Ke4fEAdE}!1wl3Uu6(*Sr)vaM!(;#0hM)F#lcaGp7C@R(`Ij4 z3dwBNV!wvlH09!d&ej2^fsL`OUqeN@Q4lp25|*oKS1YqcwOSPLe^Ih}d_84KUJR$4 z>bv1_Pzpc_7HZcGJQma@D{2(3A6utDV&0+866IL zzBqLhcZoMEN|n2CF4YZG(xEU;YM)4rRy`kSC?MJEN(aBUelD6EPFA#o<$xT8=+9Hl z+`v6>%XK29gB3>ZdZT(HQn86&lk0x9*6kiSHm5kd018>NLe|*w#m59qYme+EKp&)} ze2?ASTHKrbRB+sKzQb=k>P`RBoC-)EMVtjW&YA)?W`&Bb1LKrEw_xyYsCtCFRHdwM zD!yXiq(3*C?2!P9Cc-ts<=MdRZ7no3L5Or}fP6qeHhab(HZOV0@a4(R1@jApn+7AE zxkWyKKG?rh4=+w-GzDIr$;x02LX?*^Zk@_JTQ6ol3@S7qb%_HJK|uz#Q?wJg&%SNhpb!BcB*b*V(5>1|nm|>vzz~38P&*I=AYvCn62P8VMTkAljJV8JzxBTG zv|u?!-@w}+{PNcgCNpMFNd0XEasaVgtJ9;Yy_qHVJ}~lGq_fm)0Fn}_7+_uTCTFtQ ziv)7c-dE-*44_~-6*3~>$c^|E;1EmDGJxFvSCU|HahBHD5KU0y^5-vp(=GEc%Sviu z_^(W%C9rDAx*6ya=l;|oW6^TA*AxLYy|qw9#x!GpWKNzrY1K+mfWt|cn1Ne6tC^xS zneUegeIbO?9e#bne}2fds!4NkX@J5h9^5pC4t?~GPPz=N=o{0`#|qAG9G<6)_ucxt zGU^3F+nI>A=P4DNuEEhN;*B&q%IN_BJ}+LXr7RRnni|8j_-x5lO~)$;h9%$l@I`ER z!4D~I2U~$K2+$*$1RLh>IPc93B;2PLG4MyY0zehmfTJbhh-A_oaeoPu zfVCaIaSOw$w8rIlajj3qQ4=5 zx0jbmq(qCyo*6_@(K0KXw7XXx=wm7?A<(eCG}@ZXNDS>;tN1V(A6B^k{Y7-Zn7A40 zJ9C8AJl?s2z+Ua^B2ora3#)+?GVy$}DD>?2mI+hCZfGOrh8}sPBp>alZ~OxU@>E9> zr-?;WIu+9BBsSuWM}B>Vs*vO~<%0?P&JP;}3LKuKB=%?3;YcsioRw}cU81?w5;oj> z6F=($uYW0nwVc0eAEA<0C0TjKj8I8CiF%uO%Cw*p8R%NK*4-M|vt&)TK5CHcWWM}K zt7R(?B5G~M!6+~dkOB;0vEa(*=QbojMqxHoFElX*uFW4iw3^C z_9j`=L{VpjnoiT5q(c}TzpQw&W^Qbqfj#V7xDXCOW5qjBrDd`_0s2^;;tef6^zGe1 z?Sai1HuzS4%u*F*a{3V~;-Is6_harVR?aKhbGF-}2~7s@NUQli4bM!)<#pUhs&V=l zJ4PthhQyOTUD#wR<%B{}i5@XP-LPe5M}VC&>AHLH zro+g*%+nBU*?^PGjBn0No-B?xCx4U9`4%DyW|3*4r;WVT_JHXHa}2Ru&B~?4vq^O# z&P4*#+3g}zdeu;}U8wDZMNiun!XV=O3?=>26T+PLHkRu=@J~^Zbwwn6fA8u0nhW(Y z4ULd?yv!_gpXld(bn*ucf<6QsU(~U_&tKQS)_2yGYxy>zLy3So0#Qtg4hycUSh2uN_{iV7o}TQ9c)=Np&W2DFQTF$_ zx|PeTrg~o9{U8}j+PD{8M+YFTjUCVbtzQh(t!~^v)iADfr}N;f=FXjvhc6j?-=;@D zZpdK{L8ulztc6$C$^b|$<)m+ZR#f;aV!{0cS$fEazRABlxw4S3N=o^@ zxzfmWDk_SI@-sX4!0@S&Wqs>et(FRF>hvL<1Q;fpTlH=zoC2^>U9@<7<2EC{7kns8 zjebErxC6-RWUqQ#iRIoHeC7BabX7aq2f75fl%qEH-EWb^;rqCQvtPMM?mPUR)) z{+tT6jsk%TEkfYx|bj#?lK-PxM7b(%f)UQahH#NQhI}OAAlixE=fgP zz6c#`F{tY5%Gf$W!E(ora-Zm;i4KTHebPh&b%xrQXsH^d=eh(%7+Er*at+Z zYD`No_R-44EEQy*uu2>Unr8B{-~P_(Gfn#bX^b1HqB_AbEr0tyk>YBnp8}*20TUCr z$+~x$ahpK&^DV235TX=~$D$J8m@6Ju-VFkw#;iY6Y>d*Fk^UOgMz>k!Td?KYAux51 zV^G-Vd$w&8O<4tLK@A4OF7RfJeGg}l2>_q=#O?W1pvA4F-O0owUJ&B;?YLlXvz`%51|2O8=eno zkr_m;axOQH91-r=!GP$aCy@xMe;p7y3_-f_GFu{UY%NLl;vt972LalTVcQ>^w?H|MQ?Q#uJ$s9OhcP%u;6rqDrmwSiuWZnA#G z&YL;|ltRg2@MzJXRXeA8x$F&eHcasCdpQbz%o8M@cW)jcs)CkJecO14X#`(@o$sCe z$N~}Spm)gNAA#{O3@w^JQ>K9e8al!kDd!+VJ-N=^ex()#kGG>wyFx|oV*Tz2zUFduqe-zM;vb#xxtjeOF3Sc8yhJz@+XIi42L zzx(j9o$(XuY_gMPp2U-p8<04PKukJ0{R@q>63e2YOL%$g=odp+xupML#& zrpl55B&_)FQj*cz_Bb0F41qndM#+dsJEe~eE@JhbbB+CjtnCn?uJ|H2CJNenl{wN4 zoCZOGFWy=$7E(W1IM=y+hp4R_GCtWbTYp7pEao;r3I8Lr-Ikq!>Hl(`!+bLHJOKUO} zYS$ovv#*J?v_3zN=A2L6;5^i?&M0V)azAzamm~+kQCTSKBV=9*0oSG$@3pPGmuwtH zEt}hBf8p>~!~Nrj=#&?7JuqQ!`Jx%}4Q!+U2&?UJn6RwGT|KswVpI&3jsI(mUo$OG z5o$xnl!J3Mq@ODoBH`nUQ{u<~opnr@4u^~Y);|4*g7P;pxC%IR7hJtjTP`1I>~qpl z7f#-Ur;z%BG5@r<*CeKTrOf})=w7ORxmE*0;gqiwpE?;~S2D__Eck_&EV7OFPFrF)9S)@$l|}FM6JxBa~5& zAga1~Va2Q-lGs%#17F zjF7nVej9rOpui&Jqg2k2`DRIf6}>N)ki)qPKSGQnk5{a$a4ZcLwbakYAZ&N=VHd5m;FTM>y@dTY6jcqKwWosjOj9-?lbzVj^4>GmOsV^yLBGX!H#BUMeW~wpC z7KzyC zu+ejG=v5NvCakL>?u5?!G?qrU;7fIku}hMhZvpZr*Y#-Zq=mZ36VR{jOZ0j-ksJut z8cyh-)VT2gxFY)z%suw>mbBdSo*cwEz1$9~$si%`jXQ=IN_p~*8FElC(J~rm)+5{Q z=nSuR`W)FBXX9-8Z9AmRvtoE|!t zdC!Cnb?t;cIavc?h1yS?CuI(p`dQjHq=xAl^*0N$8%%UGDxf}Loe3U0gf%1ii4)vJ z#W+iZ0l@gx~Oq5T(pPyZIU(4OgU!on}beky&H_UDiDnmujo-{6V z(VuWBaVfLG`uamx+kXZR<2G%-Ont*S-D7VcB@}4XWG$FBYuNdnJHf~H0=5 z34qQNV@X1lbwv_|{;PAHJJ?hd;2(RkS6eAj;}T;U{@sU0&=4aj__w z46GE;{)~)U7VB}*Zv^0`2BM3eg7>P)NaJcFd5y49_^Ha-Ws)3u&49=K(c=8_WuSSw zxIc&Rdbr!&@6%x-In8k5P=wBE_%2bu>gL@5=RVhn=Fb$bQ}vpKR@JF)4JH-hB^+cx z*FGlPE|BF3RGS2eyW=`BFwyKB87a-}wvAr5F*V9R*=Oe@eD9S`sD+5fE&KH>O#Kwx zN@`uGRC6TzA66Y{PI~%RKOXOm3ILeCl0qXpCFE{7CPS>Duvw3%w3zv5wdxs@x^SXS z$cxUoo$-}H`Cbe9>Rj9G@6Q(al>UB#1loY*>STf}$|7B>f0h9M4NE4Gt~xrui!LMT zDSAHZz#oWraMHgPW_TJ)$RReuM&!;ZSwi9=9f7zBX2nmt&h{cRh-_-prK^4y!ZsR0 z20`4+14?%x1a_{;pV$7kAdj$yhg1PX9^G0_r3A~Yb`0&V3zCE*<=ZfGbZ12>C(t6r zYGG7>m54IfPh`W+St3yekadAcmrw9hEUEU_;Y*k4!)t3C7BCslq}fM>5!;f-X^s~j zhS7r=!3MsLnVNOj6n~bCBzikW!FKY^XoJqXH0!U@%{HZU(i}fU{Q(tQCX>gvFcah% zNS9{C{Ue<$3)S}@^HQ^!#|K79^YwZhK96u1Ia4fg3EA3h;qz1$hSJ9cT<`|PSj}g8 zWiN6#jp&v4hf3`dlouWMIWQ|KL+P*UA{s=;3YOw>K6*G*7Mxt_4?COW9c{7X+C9td zU({=WO~~i-CA+K6lGuNvN{8S|W)c6SDLf;`@hB9n0XSeni8(=;f<^&Tp#&E=Urg;c z4tv6HdhbdX*fqaLsppC`OA24cZ%fY}2~iWc&s+u!lR~Ck=(%7``UC{hsgch?hcG)^1<$GFQ!YV!;Xg)E6n=(zR3?26}xJ8O6|S6+^r{ zK3!FHS;=P5NR*#q*W-|n#QiB>Vj zf%l(OGi`7!6=5P@eYaCc(V|!nvfNl>vJNz6jb4!AE7FzEqFDH#c?f>873f;()E&zIyv3fAH;I4t^zCdxSAfl>kStAu3{|9RjBrDB z2-GW?k^Wl${^nw+2q{UNN(nW|;(L}UO!X;F;#D%S78)|T#o>7M)H*FX=xOpqOxEWc zuk1b_!gCG9&si=PzW$4t^>_}y%w(q^`5(n=Cv@f}ISq?CjOpY(t!!k)VajwcE(mx4uyfdt>nhCT1bf08DNCdxT(^nabk>5A}JMDGepjgXwrN`X=rbul~&>v%E_j79QT(ws;OlFZL z1EGB*JwZm`OdH@WnDALPnj^OrC`Gt3dg+j0(1+40f1@b zbBHzdAZp7#)@}0HF*aw!DFDK_y2C-@y}}{$ug!ciS8$f+u+UdLfhzaPZ!S39e?cW@ zzJJH(aI}9Gdd!upYe2by_X=YMM2Nm*#|rFpI2CK08gpA4eyJj2Pq=nwfq0@wsFQ%E zB+sGy4Kqe{qQab5+~KJh%pjbAWBef@yLVm`{I`oXz042^)3zSf>3Z#g3k*?980tsB z_?VXeP}o}wMb6*XZSH#Erwz&XuNrr53(ZP?chw|PfnB*z>wV$NEp4cDiC-Xzj>qGf z&2Ql55eOdTxcbsPjko_W!LGfMyws-jOOjVh&nfj!(4a{oN>xuXkaUzRF?dMiK_(g}a!c{mt`USZ3?h0^8rGcm2PI@D$k3#a#s&shjDekZ|HuJ1{e z3#sfL&C_iLRsOD7jbgYR{PcSqs}QkxD%}#8{2vnpy#%+CAOg&WX(iuAhA#?$-iW(Y z^Plq<{F;$&AAKQ7YtrhjF>%xd_Kw!ak|A@`dKj?e|AfjipF((%e(6??y_XeBe(SQ~ zKQm8Hp>+K@gfTZ}w66}oShDS7e2Pa&7V+JY)y9TM(Sv&N?0HD@# zFZxZyzC(X5B6?V8qD&H-D93F%(#k2pdNtvF-iC~+Bz2!{Vi#klc4DQXagghbtyScT zx{=ZXWDXW3+MK+SjfptA>N=Lr$YX<>Y_ESQQ{Zn8uvgewTojFchLzdlRG0QkSqJh* zkFf$DQ`4D~!f{NDdgSmtqTB>&2>lS!4n6*Fv@vBdA^d5Zy=^bNq@INuKF}V35v-h_ zEnT87PYNNhq(x*AhpSY*1zDWiMed|jz!Yii8M+8D7~Czw`6G%FKqJphzPwnYWm8>v zYx%9?r^UKMf-Pf(*_|HDbK^LLIE%xjQ2}d;r|z4sP$9y#IXp1?lh|j0CFVPKN0Jii zJwUsLmxSnl?Ai#LTDPyViLn)%vGLY>5T>bldyp_bzab->Ov1P4W`$oFw3(6TsRD^h zJ~X55b4fo2fm%W9nE+Kc=Uc;Kv<^Qv9YD%?3sA!VF8#8E36I!qREYVw>ox;Xg|Hra z$(T6lv>znuyDqn73~TU?KAlSsGPr=P!M&G1)V_0mGL6ynT4Mwj`)>@vjOj_|hTN7& zJL}p&Ca);=RyHh?I_MDNGj0x5W;Ihhedz~?P-27}-pk!0f(ci~GnkNNvO89xrnp8) zkq4P7J7=2qMNeHdvGgAv@G)_{d;L~y#*n@h4u|BNe%LYqPD9lLuqNm}Wtn(F(XEeY zR46p4=x`&wUm^6;WjjC~r?qShO#)9pwhY|CzSNM;6XNuI*qZmmD+ z+9p)7p%^Wxpct)7P=5rpdhPS`LI`+n$6t1rnbT2Y6(-^a+J4m2H@|AF|$2(<$AWXvs6TuVy}4FOM=2d7)EtNdI$xYClh1iE%%lNlFjx&8adTDXhjd=`T`_1 zA)I6KNa)#z(C~MLK{;v(G9OfSk}4s`C6TiUwb?PeS2%_obOmH=bI!Oway0Hl`)2^|7qUj>u0;OVLGMXP$+RX+{@( z#|Qk*>aM8bC33u$>Ko@eqfGF|r6PApTkr3s?%e>~tXAy1)apH?lXe}@m* z@WKXs8A%TAuFs4bMB5X!wK@*{qjlXIG%@088tf3?GQrVd=0G7|W)@*<{e1_%S5RBt zGsi(4R(PJf`8Way-wo_k=do0MdVKed({*;8f=J$+rbdE5jCEWi6+M{x%;&3`$&kq- z`OqQWi?Se~7CfLQiV*!7%(9Ye@4wv~YXDvOyNlIs~ ztr;;>n~FSuv}Lt-$tqoR+fE5{;jj5e-ZTCrReq>N3_a{Zn!CtF-ea9j4;Q; zgn;)b+p`ro^5NrWmT2GTF&j%on7y6sEsO@HR*=n5_~<@C1X^yWoKmxXQ^VK+S!nk0B@Mm(|lwXXkQ*cf= zKYrj76X;ezTZre`e2@11dU#|@Mm%qXE->2T99eEPOofDWm%>=UK+1bqN z%Z$}%Gy~lCWH@Iva(7|m{Ws&K-IP~3^9Y7EhAf~OH1IdjNf%Qzvw*90g7W7&LRaUM4v`KWd}QCB8V@l@qNaww9#m=J3NqiPjF!FCk!Y6 zL&9RDve)Ww=~JPEgsB%4n^WlJ3oSM|_9DJ91Q#>vdSU_akmV}IH|-<2vp#ie+eT=- z2iQ3b&!#~`Ww8d>>;T9Bh(UFCGT%HF($=Pio<$a|dG~&!?Ph^kUTLq86idLI6w5SP z+dq#1c0+6u+cJh4f9CyiKZY4Z(=2&*$0<7(l=}reT?mUjgxQPX91&(?1WRBt1?u1{ zYwejs${_k&5t81)nAJxKAb!NRNMD^%9he{lN0DO~$oN%f&Bj&655V8AZ2RybR0E10 zglh7UseEuSp>P)9h|%?DRfl29E^m;w692m$%G>n13HNG4)?ATfAkg`3NvI7g=5%G{ zen3H+#VD3W?EsF-$pyc@30nejp2mbzhHLisyeUsj$z&1t0#es9LVbPuzMwOE{1;eY zCtcE_1@tE%2-azV088G?r6R^~F!6cVrzuf92+I9-Z>+oHV&~P9=b4E4n0lBQamF8} z)Ty{>>VA>XH8#2eDe3(9UD>2U)!WOqSD$oMl@2s0j9ODBx7n{@JcrYd&rVhieyQlg znIUj7MR7jua>UQNT>+-{ypu0lOZNezA1{R2_sE@xkEVz7J+0(i^4p z5Z7Nn$dOHKSe{W$+=!uI^TKkItDh1m1o}JF)M^0sqmLO#bE8Q`YGX{B`$6}M1h-A; z=ZyLw^c~be`~IPIXWNBbRXxA*`u$Kelml^xT8a?1MFP?lDu87qy@Urd`&Q*J+I(Mt zs$xJ0$!7j+dVK7zDS}(dXk$vqsP%1d2Z*uSXPr(QWW0?YUmT$@hGu2a*VjF94j0Oj z#hUM1mvw;vm### zh{9_cW^=m>F813|&GUlmcUzOJ*>(t5x%J$+OG$(xPqye7t<}h;vp;XHdimgR1KS5d zjt+t>RG6a4f!zO37kXQ$4i^N-o&<01eIV+<8Gp4gVFuA9ne@6Od|@HMm`H>30=hkK zZr4z={GF}_A)Pc}l7+{Ied=^)07SD^q)y2JK@HA(z77-I-4=b-@Yn5442>i-s~)`; zuapwRj9Bs23dBRfi-0IXNXT$*QnW1Jb$_R6Z9;P|Zzy&WhRk$%2%`debB_&gP>et9 zGHkx7EI5=a^b!|3dBm(;WBG!`dABdhJ4*1ojhxY|gm}yiW0-&3<&NG2yh%Wc+R4wX zd`_)?&pte)J&PQn7yJe>HnTxC16$0KQyS^{>M{QPJtIK!bwM^`gHTWjhL4A+bL3Ay zW1fqZ1-DO~-JDNnX5Ee@LqE@$yo)&Q%B0V2_eJ?_fQ5IbtF5aqA1^DUqT4%=%NpV1 zf9A?~v)!~sy6f)NavmXhj>_dU0F}F7aI9{tnus);xcuaP|3@hB9Nz}JX5i&Vz)g_ z&Apj98|F4Q{HQn) zQj|@ZE9|Ynk_@J9Ilb#njByw>doe{!a2{@A3_|enZvR~FNmj~@^N5VNXV9;b7kbg~ z8T)NZecnjfaB(yiKERS!Y{||1%^dvswsIwvjIv$s9yUI9d39VS;;wy)W22-5VkOMEiya>425L$A+arHVC%ohe+NTW8{aRS*jw3^6hHa_rubR9I zu}@84k5*BjQk9Yp5~_lc1Chp2FF}8?X5Iem{WC)~7~*5P0wc>0*Q%wR9qDdxjj#ew zn<$cNMYbn*3AXnIumX?CHz%H$Sw0)jYE+7)>Bqg}PU%RSu-Doi9{&?nYaDm3g!m!p z1-4g?lqB9~GfxKgJ4lOo@ZHBzL7o-*b@_e^-%iDFS=Byx_!xxQIGM; zKRI}bjOUY^SPj!oF>09h;?YLmr1FW&w+&;EfDaVs7AG`bDt5$6ft=ANhCf!O&AbEU zS~7$l<+?eJf(m=>6}P$MQJVFX!0Im6Ts@#j@Ireq81RnBuwTb7H1&sc840Id?;FC! zSRzw(8%!FT>|ptBK4e?b_P_CBA$o=iTOVbYb8%;vDp)zc)^9*#%;)7t9a>w__jWd z9;Jt0^jC(wCk)HCS5b^Diwm)VYby4dbWAe?<1**&gBw3~-lO+DL(1sH`>OrKPmW<@ zfv;`DzoNZxA~76Ivi9JU&iR=P^ZYH`O4lM z(phA%Q9?=+Jy$;Cj*XHh`E3Zj^L+W(dy#M7_#;(xU*1hc-1!FwY5+qfxp?2~#hIy# zdQ-`4g@#MaAGHM%$_O9NP;(79md$?Mw8uvmp97=B8;H+3EK(PAT7DQHI%6<)*SSXc z>3B6?;21eR3eHN-6Y343{#x?C4Lv2rwKvcJvd&?NJf@Dd0I{$$PaNgIhVNRr?vdl1 z+yGxM(HF6W`#KsC*!O) zn{UT9fI%w4?Y5wrFHm&(WHx$908Y*6oo;yj6C7>P)yW#Xd_)LjHjg3Ksv|eICM>*< zh0X=KT*K1p`YcA2EbB5InyoO2; zs@CmoW^?-J7%5gx%KGb1_Zc>uUVmZk!Jyci?;D2N_uslfQjMo%8GloKqa+qy;Y56` z6+|s}u;~u6->@%yy?4q1{bYAnASU0IMt@3 zANmZ+(z~$+zs$wvr5c70ySv@d052@KmSRy@w9+LF4k!`}A{h-F2wl7j8>ofdv!@uE zc$c-L7l$=xThW{HL87hN0t&qZDp*Wj74rLFf(219s^*;mKhdz6XM$gDS*=3+^_r2t5`{~Y7Ths8#smMo3qX>+ zEYS~k7`9*sZb^>W(UoZ)sNOt>XEaw!Rg!4c%hEBk)&B0`@|V2wkyN#)mr6B>mowh~ zi$;3|@^luT2)CBiGw;>6g)hHvO<40g;UM>Pl|1siEQLZW81;t68OaHVJ7~fDMdkLKSN!nualvYg^1w$-wUqh|&Z|zliaMyF z)ais@_{PbXwX4JnWmzu!nVn?FtyV*IfKmn~%}{B{CN~Jr+K~AnIfpNm&ipZhBg|I} zk~z+pjMUpjDgPQpWOjmO&_Sl8k_>ko=07+H-pSfT$Kn2Jq}5a5j3o^3>Wt1T#TF22M;@vw)tuzv|J|R%i2rv89MCR}GJhS}3K}A?X~@Su9uo0FfmyN* zj{|paXll~>Wx?8q1N#v=53Q&2c~U1>V7LVUHazgZ8IcC^t|pA_i$!fx^5-41Yc=d~ z%Cp^(mM@9UOwF1oS^dStNj{bYyzf4aM+9 zl{zwN{A5fza@&+__7OP4D)Dh|nJ^@{JFzD-Gq6X4@E7%-sP?EIM(I zbUFQmNgqp{Dgo6y+J|7tm*{kbu*jZk)(Ks<{j*R?cxly0b#8;*>Se68*tzM2uOmxX zB7hRpe;)%=pTsWIM0hpMrI+YCQF2-TUk|J*Db!yt2;p>h#@+jl&y`od(^=tGgc2Cp zY4ZaY1EUdp%nN&4yN6Oz69DMKfdQA_hm$6b2#mk@bx^q-8S?mqq2<60@H3SN2yx0> z8!G#}cO@-12vtH;B`mrW_e`P_+Nm{naMejC-Ehy6mtnrYzbs|0KL1WT0dI4geJhE8j_KAWGs&e(<)--;^u&dL9nRv;N=E+K zOJsWK4c1PdgXbf!r>1!YkpBn6WTVv2@+>5yCavhzH7B$O9uoZ|n`NAQ;`d+X>GF7| zY3NXloL*Th3Z%MVM_h8A7~)$q62^T?{&Xtyzecgs2o1|O1)kfpXr<`EKr2>bTz-oq58|5@zR#cdiv0lLWxCU4Nz>4QNKl7KJ){lxFhdJ8&>8v8GQ#ut9W+LrC z3jU?%-DJzco~&D>Gdv9UDHf8StPG%CSo%pGwa2hex~26oHA;7w00aZ7v9`({1EAU> z|M*>y@SdolRGf;H0tGhK?+t8&dLW8nzyPdrBk7f z!;j6QeV$NmO`ehrCsTZ0Su|@|+o0L>N`nMO0K-XkZiI`e#cpFJpF&BdmK#Pry+Z=9 zwV~d}iWJm3ZPu2VR(BV17tB^K{0T^8U#1~K?EX6iRJ$o9W}1Lv`%wLO)jIQR)L*(N zAWL{0Q0~@5OnzY;v3v73=JHfW;7!WoG(Jg$9tCyK-~(f!z!r}Ra5xoj55>b`IWBGs!Zu-gg}fP3XH zrB`coZJ!RFwMuv-=o?)I*r_Hu3CQEJ$!Cxh_Lc%Neymg<#0* zc6y&cyh#h6O1z1^6Y^B?Z|Z4PRt#A+yh4}u>+iO$*62^9 zs9f}I)e={Tgh7iR=0%P>M?KXS<>Ox{a-plhm`=4fUjvHZ%S2t_*NV&m{UB9Q(pG|wuUP=IXWh%OD}6= zLnI*CrzPc#0EuR&q7$R`AVMJs0QV)I=NqD}SmQNj<;%+}x6uipJxhO6J38Z3<%knL zYkTVN&Rp(`yF0=y@M~9EQXd93)4m5MRQ!`jxN!Jvp2o4ubBlOYFU08$$YHpa}H(x z=84*UXyaKj2kj(i)gQ9hvS0UyS+mHuC5M~QV_|{1$NBHq!?Q`!dA&OKn_L})Wt#mR z63!fMTJpm$w62pRZREHm6_9rvNnng;F+&m-lZSCL2Xhi6aOz3iABUrRfndn>Sa6nEi$n76C z4a|LFh5BeJxuWtq|0FF0BR=T%u(Ncf_1VPTekwHqE z!Y+cwbM>@t)tqIS2q6J~V+-#i0=~u_AW)AtfqeotUBhGg3&rP2z4|J(QeEoo*gi%z zR5&h)u+%t>icgkWW9mgE2(d~IO_jC%uWNAXIe$IZl}LX6W180p_--rmWS%Sum=ayo z2Uq)9ES>H$)Ub_CZKY6A7S`VfBAiw1$Dtb#;n5_}7=5#+1C9+MXToJo=I>B)Ug3S7yWm!V8ps4xc z?1aX+&@Q<0T1jRs{@Tc6KTGG&bV^a0S2iyQKzV9s{%f&!&g z0R~;Tx=WXipQkVD%$3kT4NHHa{Z(M@f@?t}>{tIxAzxsH;s6CtwY|2Hlc%qDH3Tpo zlPH5ub0TXtUC*`jg8`~3pMoquR{*;i@tEQe$-iY?m2t5FWzX)nUPI!rB*>$OcFRet+VWX1B<-(mMYd!?V|i^mf~~y94enr<@~y!U{G2c zFo3jY>MngWipXjyz&QnM^Zxx@r0sry?V&h+uSalXwdziK^4nrTaQ~hd4WPg*ldjaG z*21Nfy|b8D@Y6OK**f-%@Mf+@Q~tOb>9l6hH#s+rX|*G1M2y25aYgx-=2T+KrOkfb zpCE0Am+NrjKX+G4T(>~RC8 zH)_!oT}KNKhYRq%5clQB1lcT+rtEO@Fi5rks3*3ZdvpJ_t{M6`mb(8QF$y-Eo6;jm zrs)G+{o^j}T?viL8&x!a^b~OgAM&_T#_Go@^U=;#Ox$1xwHo6aH{)+n2JRIo#8{3B z@;I~7pTu3W-&*@qwdtQ;6WQdT;vwww%6qyp&wShrP(?Qr3MvyvYAMY89ZoJ7j0U&# zC&QF+fKTaty4rcd6QU{Cas72!#3NYn6$hZ&P;g_$%O5e;`tj-HQ@6cu{0P_;7eHX6 zV4Mv&j$Zq99%OBvUfA0v(sGA^`fhA(=xCIfzXwm6ihmt&Yvf;-M{}mDx1cRNvwLA% zBSTD#k_>WMzQTIO&BM|Ud1+n1mnhgfn$q)SrbYv(o`ZZ&%qX+?k$l)Wfc(9iU}9lu9c2`BM{pHTs4|H z`F?o&ghik|i|z*i(4}rD5p$JW~9TzB0yG;1!S6W-sNy6E7?4#f|+ZTBcvT! zQ8w3zX5SAinen88^+a?S>PNb6ZU(tVL8J=y?J}pzsfQI94YAf*-tiPTf0a0BBm!QH{VDj<2b(moc^$-}65{E*HMHpj_sEOxaA&#@mwgJ+7UeWq~WMZ zBrM6$+}zeycl;S~AiXSOEqhqZ{A@=AKU#Nh+EKos_k=^F_)guwi(g$};fY6+Oo+!hKe>}k8ook|W!BN%Ke%;zA}o?H>UBa_}a zqyt?CzbG%GF883dOFaMSaNe!^e{j40$2g!=>88c^It6!GN^oVlipw^Mi8e1^)!a0b z((j#Y`byUf9Q=@Z>V!Xw77I!1|I7aj=BOBr+74oZ zLa=9IM=nte?Zra>y1$LdJy8bLVT`?k)m>}fb8pw@ZzJ=N z?LOT1f?7mQ?+Xw<21oU4RL-D76L_$oGz{8`%yrp*=~)R$jGlJ4mg>#&*T(If*j^pk zmSb%^ugzshj+ztS3Ao3<1e*1aI;}IyjAS>tK1fpva!`5`aO|p$m(g(FZCo8$y%U;c z$Ows(Swr6{*}%AB=4z|GMQH(I84{dJ zoheU%H$nT=%#={1!zfT}_4nBrh6#Bh23Aircp+!75lS0(Tm z2TxFY>>f-JT2|Np6nmMI+jY%s-5DFsg>>JF%ORtmPY9x^LQ%(~qbQf#-=U?tYFF<`lTZ(pzMyWKJEwsq>J$drG)Sam>;0S zm#sKiuTvQ?e%wX^0F*iD_7aFf`lP>LcbX5Pzfqduo zc^T3z9@#qD0L2S8M(+y}xRpl}Cs!nm)I5MG!IN4y#aDmwYWc1Ps(nOU6G1m`Vrqmj zeG8mQaK1s6VVmN`rvsS*r*?_{tIyi$xgNQ80ckPZ4`<`Eu9aaab)9k6;Gh$@P+L*! zU$;n@{vBv!g9owZPsp`B>esqXBx9-eUSgG;z>8i4vyLCtt;`^_0E3xV55~wYM4I)E z`fsg7u0M%yFGa+xz8WB7LE73cwIJxQAsc*$W9-XJ0Dwz#{K?Mec z-pv&pntZ&V$q;F6B#5u9l}CL5rZUd(@hpD$C3%D z(OMOP4PbTK^{8rm!wd;hb+^N08bn)5omLziHC4NALatBLiP^XgPA-WaJS8hl>caA3 zE8x@$;$pBM7E)$mM8#Pn2%iYTYZQK^b z7E-w-Y{hv6yPSZT1K{W8hi+S$zyNDaufZdl&X!RjD1cZLoEr5dKDMs-FBjvh{h|9G z-7#P9n+oUY7{z5UG(;WzCUuT9!KYRQ;gIj+G3OnUVzv4VU=xf<^1n32;leX4={16` z>NG)zbdw?M^_7Cx6ja(Y*Sj>ipFuM$&foXzQ(YWV-m}sU=-@>u-IJuq+it}A!YgS6 zi-Q5`Ir|Pqf+5_=kX7VzW)mJQTwWFJ_fZD?I`J(ahA`9Ehq6DfbI+d_SG8hP|p z=7$#?Mp^GkY0NLP`05|FU~G>_N5fZ``^a-j>bV<(hB%}4SboUCb zHv;8^ny}XBGNPD~n&w^}-hntptElxvFM@G1lYL>;rtcx&>;(WRLU1>2R&q0&q4o>O z0|}y|JX0)}In@FmbLUR+4*)+vz`xq*1thO$Fu=|Hs~YK_jQ@2`5;Ss48n;&4%SZ&Q z+c@RUC)Y6Gg6}i)KGeJ&@uR*Z8|b6ob!C-|6|uTV3`#bS{DOsn$D-glc~2HWW9Dkl zBw$Snn2maBe_HY?@~rWqkFQQ#KLy!eh_z#U^xLKe4+gBJ9+=zr)YXiQ47S5^)s-#! z;r4zuXg(PPmq$e;i|w@_ZO*<-Spf^)v;Up%CcwfEJg% zm`EjTwduZyBQ1ab&F0KBy}eS9Q*Y0e2_XTb#PYLR9{L+uHJ4a=xF08bHr%qqp}N%n zD;d~4?BsLY8ebJ*SMj{nf=iWr4m%(>384WY%gbAt?|41p0_5c6eyjOQMi()5t1V@G zvYItphNlKQaioQgl0$Jc;=m#~ne1d0M z_TxV~>YFA^0oyh5v9SLO=B8E`2Y_A8e;q|!#JpByD}IuhE9%)!5;QA0;vGcs8kv;!hT5eE^e{N@$Ldidjn$&radH?FVRld`uo(7j3 zp_EBj0+*P)C#bMMo_nz)ikQ^h(WnQS0bj?*>+(7w1&?(>S?S~mBUe|xaL-Y)|puRGgq|r_q$9M^3#bKtYfDEL6*5lu;sZHqg!4;w+p^=>Tvx4 zNXCTPY)q5=oBYDfq{FvR?$XOl8Ep7_Vq(|-r>QJdANpRNkM7#>oT`;4nTwrx>(So5 zU<-@`FM^U>5TgM{E_AYXlp~E+MZt1I{TJh&r3}i#Ki?xk?TEkPH%pgTdC7nz!fr0v zOVN1u!nSxcnB!vLx7>>S0l5^a|8wnQ+n;2h52nZsQ-Dgwd+35_qQW)>{`@@!uwz4G zeRGOv_J+Q&hQ|2F=vW9?bV$0l@ErAIEWLTS4<#=JjvXna#>!CKOrE8c4uzzq5v;P; z?jx3?6?IMc)}03CBy56FQt2PfY9M7+chPQ)$GX>3eX9?K)66e(A3T21!;n;1i-q$KHO7wuWMSz=GEx0s+F~Y>On5%|N zkCQq_H>R^(?C(b#uBlUIjT1%J84zMoA}vW#b~Bi!*V4fqQ?8LKSI}mh$a{0Eo~TWk zr1;qZX^(@vT-5N1fwCEcc$kYnwurs0d~It{7(>Ut-^~nb2lf3`t9b4g+AIdn8wXYG zah_GbXs)W{T>s$(xY;VqI1FFkd*DndqWZ&4z|U}9hc*E2U*a-u)v*D!Fg zWik5Vo#D9&W*jV39k?huD%5MMxs<-8mS0C(OE1_azw(Z8=1q9yxmwlE=^8mc+AjJ^7ori>bnjTSb_4`)jRAmP zF4z!w)&m+!KbdU<&|nUdM3uX-In*@QF;;FvuI&{Qe{^+FkAbBO=Hl?6GKucAKz(dXiL~xwDxa?4%)sjE`k{mlobD;Y4bFj zMjkQQPpB2MDLUfGwrs?#roxBcbnPnk`58^xl4 zYR5h~Dobek;{c>n2|9SR%-uqWz$5f}C|Q6kXNYJ283nc!{2rc4NE6S9Xj3 zFU8%r8T!15R=g_}V$5uR5LJD+ zY)k5Je&V!#N?WSm_fQpRewZ9*T8@6jtmiVb&Z75lJ#YAMq~4SyyGm;y4DkSm zyz-!#AXnb8p#{gZb>^n|<(!`hGG_Nn{AgM6W5mB{%B`-Ugi!RTM+`*R3GP%hJK@wJV{O8o?|Mj5fVXS1rGs{7WOym)K7dr`z>s|Mux7fck{MV9Zf zIQBF0xZ6CpSS!U|QKIL&)p+If0e#$?s1E?2{{PlY0PJ&9r|pd7Zy8*D1)}DoJ|h|N z@*){DOHX&In+5MOT!P66h`GuU1V|YIsld;fotGPyVT4+_0|P8AB#e%eM}ym$&nufa zk0K?`&~wcCCA{$X12Qjw3Tx+b&26rwCWL`5i^|W~?z7G!7POPnGKl_B4OV*FnP@`R zEAvR*MgFdr31&=HmcXy*+>$VIvW`4xGz)NPnrfyq6L0^II80;5U%=D12vfy18egj- z;z1-yCOHrRI!SIjC%S>mCb~V0`e<&>T?aDC@{445o{ax@KZg$z2 zejf+>3egfLh2-});Mncib@Sec4lk}VSbD%*gMGoXMLEOh&o1fM4XZid+4nJOi5Y7R`|~oN*spkY%aBQ&N?ImSq*Aj!^!`H^0py!OUJAp&zGi1A*iS;>!{B&%*1aGXIxH2fz|(Sc=}Xjg7eL zHj^L38W%RK`-;H`g~$SW{b;EKdE|l#=BJ%x&}v;p{;Yep!r=u^j&=K5(*Bc>ZE1tC zov5!PANsPk?f(}Qld*REzG*VM*vcYoh~bZi2P)rejhqoO9l4%uXsQfKk`%|puQuBd zU=nwx1yR?h1Y9lG9gpgG9}|K^**CQ2J@#3tSRY<3lT0}3L)5U8{`$J_sumO+@=DS- zbt5`8Uxmf14#KC7#PWmPrSrHQ#V~Im^AIR-A)$Q5%g5>K2mySC&_qT()@An6S~0Ry zdyTQ)gfBhz@Vm)p=Btw@F+J%@C0x?rgv}~+;mka9HPTlsU&@biXfr2^YCv%Szh|Q> zq!^M*6XOnrG^cHg6~G>nX$Txvc#XyAq)yR4GMPDuNJ>eb z>!;!X2h?tT6!OzO1Z9$CpzFOt857333P=dWL04E{X$!HliW3TL_r=7xxQC4bc;Z2d z*!J$?29bTri#%Kt?AMn9{c_(!%83sv0*h}fGLQoPWN>33HFN3#x$v^29?!XdAC>&a zMYGf9k}%llmGZRrNn@*`#t698B^&A{7@pEVCZyfX!kk`?q0Hfk9w5Ax@kvNpoIrUs zBrLE#$v_il=|ehs7hNWw==2IzQ`lwwQ7y=z`k4V3R)*57cKe~jMYt^6JV}vi3|zBB z!HO8&L3O5gMvL|OS^s+ee5b#NK(eQ`NGLJ+3CLCdIZ892wjWmNi!h@(Z5USifOU}yKY1vV^9@F^%F1s}re!OZ_c&SUox^v=Ra z)C#_C;Y`iUd~VM@m?wEo;qt$0$L<3SBdVyvSbU(H3`JeDi4XBtUNmSHa?`3+ z?c`T^4Sip4uF)HPebiOK=mKWLc`YcU_Af$ZKu1>+hgI!(EWUpZ{7;^ZUos5F!AN|7JXr zLv2s;L&mCrDsJ|t$H;nn(DTo1DNTD}2iRIMK;{p{KAH7Tl9SKzbG^mW69%Py-~A;_+(>c)KkuS}%)zK+_y;w@e5+-Zq)Yw&I;7CsGvND0;6g3lyCu2 zptDz7i0u;zA#Lj;4DUMuFghip&}tE|>hBMm)_Hhc>@|~I)lr4W+K=KLqS=Q(|BLdO z1Rm-n%b=XtH$Hv?xcL$yJA)q=z*fGXD{+SlCw&4G2tx>&c)^vnF~-A->zmAB6dm#D<| z7)O7gQb*Can9GD3_`Ag1wDJ%$_%(hKjK%SZD&zSUP!0?W8rL2{r`&&Db;cA3iep#o5!k>_Q=qS`k6JmO9_x=J!=v78G!VV79MnbFR zstT{@#e?>e?gjvl|1Ae#rN_wMGu|x{R+;x%+E6o$`R>MbRbpqlQ{eaU;}!oNL*^Mi zV(y<(ovLId&YLMP;x&Hk7mZ4r7gitoy`_aIx8e4cALL4h$p94ecs5yD)3lMM;P}RZ}%itRU_OD}w4_I9kyVDY34A`*XY0 z&-!%uNYZmF;qNo0Ply2M@^ihdKRwID9bA91`ndnj>fA{@#)weOl2MdyiGXLu^dwrZ z4~ZfO-UjhY znQxy{m!N(5$CxT$PzwW09JYy&ay*9KFYI|Lj#GskNsZpur_^Sd^&^$S;>pM(42WY7uwX6Tq=wk ztZhH^_Zbjcjl%r7ovWIczRw(J6E?1OE#a}gslVCu>|LLD+iNVA^?_CkW27@}UpSOL19Agg&xnoZ1HUlGZ95#f^ zWI)U%1|ADAW$9eTOKdpWE;mvnMojUK6F2aDDjba><`QOyvC}_+u+EJqUJ?c|;_-B7 zw6g>)x&b@h`H@Dv(I6W-6mUToX7fkoC#DKf>>ri)wue%K&A;x}wK3MtVdFiE0DEjF z)TiV^rjr*N@E`7=Bj*uI7M{s?Rv8%t_fTLlopw()7Q*^^b9Z^iVbuvdp8n4i_!Sh1AVfIU05 z&dp2nEJBt9FU^T)qAv8^SJyC{jc_eMJN&Yo?eK*c zg)1HwliT)3qS%uW`97zusDGHAA2#AqNS-$J{vF-5=ZK|va+)L;MeiU01O_Q2zE_s{ zi6wH*>?R=5q-q~<)O_>i4_fR*hB1rqQk~Bs%e2Bto7Mpgx2p8I5+|tKWvoimmv)!- zScXF>W%u9<@1qt^Duu(DadKqy3epI@f{wf!xK3AZn!@))uaki~0=<5~B@b%#PB(0s)NG9$ z`1#eV=}OTY%ey%i*uk3Emqa!NkSEY!<2TLVXyAe^|nmaEjR- z%B+fM30Ufek&fk9@L&HEfSRLKe;1r!6CbqZQz5B)EDJ^mFw2*}*@kc(o`X_(bwD#{aIda>mbP$U(0BLb!rOV>kR{i7Yv z)8EWhRnh#DQ}JcY299+6D0o`YYwVst;`fKFY)4`k%;Y3Jwrv2GP};Qw;FmFCsf%`#*T$0(^Ud5*qp47*c&)2fUtVDGAPAN_vf%tZFxim7)TAqcPqw9Z^`U z7B?X~eTpy2rjPzyXBv+(X-cjrm zr^^!conR#MFr+oN)C!-Y9m1XpC6ib#NX=xkK4588bFQSRD>mk(qxzMm-X&YGe)1?p z>V&YnpR0eFd;V*t2K#37luD@HhPiSEB`-fZYZkdLH|@&Xtx%G-0u#9B8t4xoO z*}=B4`}Bo5=D7a;-<5{@ceG_|Gyog1o)HhkUEu~D8@oJ;sy(KF(W?;L$ZsC+MAUnXHF8L{?*&{vywoyY`^CW>%Z;QPh zwQpif3V4NCHI|l@u#DhDT=U+z37+r19r3$4g(aYO-#X0cV)!apaRk@n*9jvF1cMdw z^U0z@YIzGi*&I@B8ZiQ5CC~e2ePv1 zAwOyG{>^Jm_5%2nC9Vl&y4#z0F#^|g{;vtfsDk$6`_j8HhK!rqml-u)#S{+=9pZ}?Venh ztNEYLI{InEoTPx5gb6MW>VwiB-D4qPYp+JdF1wQCMBxaqYN$FC{?MZh*kJ&61qTdE z-v^6V*cc16@KFO>WkqE(4TVDktdlY0L*OlSP{S-!ia)Q1-Z*x`ejMyibr+9i!vmC) z`@Ny=^G2Mu27iK7EG?Q&1{~LyI7*_)ltt#gIhvwl+()~1iJ1jw@>h1oq)SbH+A`WF7y@AvIhvD@C` zI-|Hk;5TIRusbpO!X{m^&90~6$Ss**>7odBR^f)$waB-VdcF_GgFx+@X2zLGkq|sqSNr@jWm~2O6+NvVq$NX3NK1ngxC@Ry{RHetx&AAo@rXR$7w*ai> z=hcGlMQHX)hZxp+6w66}2do1FYDT4(2`1UvQ(k>-gYX?W!NI~&g0oiaEPcQPExA^( zK4(oB(JIqNjlI4dwC!k?nxU_#)x>xPEqkv7H3XY;B&D+SQFFmlE`gz@|GluWiU1!+ zTE(`=N#tuwI>YRKv&U(~Q&)6{1AT1g?GC+lp5)NAW9Bk=rEeN=Q-kBGYR62JnpFjf zC{=9jm{&OrG_TPdzh^!fGu+R@0JvaZY;1_pai^^#Zd45)?xv9&N2*+F4(qoJxIN~V zE7ql)xJpC-E9hOy0Z~|`noOnaBOku3457ylm{ltHs0N(d_{(z0T1V6{_glAHe#7hU zYe^35m3q^pi6AvQ~->G!^+g7nOy!A1!g$56?1Mt1o%!IE&UutHTpRZjh&+Gay{E9hpwP*lzUvJxS4J zm;KEZDEE;ACTwIkxdVRT`BRtoU4+$D()h=q!!w0ETPqyJ{jTo2s0VIP?mzT}JgGAm0Iu(*dm+ z+mZUmHX>;SdrEPIo+&2?e)nCJB9GS^o|ye?!8au0`F{srYTHGTKl{-cd4E$v5u7~E z`10%J^X@yZUcIZ2ghk|Wv#kq`P?7rRVK=|XLuDRw{Y_M+B09F0?&m+UHDec`Gce=K zMFs*30220ButA-eFK=-Z2}3lCB?9PMZQz_0v8QqT@Sxe}9<@om-F6Yt7jM@*xAf3k zoF=iMRb9h6L5mQ}b@oGbotPccy{$(~V1@xkin22$(v7m6%HxP)Ixmz4u9lWuC--QO zp}ZfU`nmFc4Ob6%?!%eI&lldikuhcx|4b1T^Ma9yd^W~!F#ZzZW4?+^kz3bK#H&ab zQFjI6>FGw;lM*bE0=B!BJWYn&!OqZX23{ABTI;c!Pm4}_2dTEL;gg8|$Z z!=MO-gNaRD4=luZj~NMBv-+5>5CUheFhitgU?8nk`j3Z-!?OEr^e6lyhJY!L zsDe&Pc_J1>x_ZYk2$KgQpJB!~C zd5f%>&uK8ts*v9?FjY>{P=`K)4;|gL3ucvXK*|disG1sOGi-_IG75VWN$Km@m(*-9XsL2g9i2-19ZtiTQ}Q2U0Tdxh(wjbv<>zr z5|vu|&*YT90!VHqWkQ0pg`L}_1`YBzME)@5MT3Amc(`RGT){L+>oUB~PNL1gKzIiC zb-o8-{Vao`U1Z7U?fvvVTwE=FNX8IKN>1egORn~RolyC2akY6F7BF7riGMFE{PTDE zVnN7pxXb!e&cL4`e*&wiVsYbn(-=`H-D+a5s23o#ZgFj{UnPXZ%wCjq>sk4tyj~+#8++V6tBE7k8YcIY16TPp;>}O8`}h$ zm&j)M7b|(pwr@24c)_f45*`4#C7&7nHDEhXYh7m3lxxb@(qxq{%o-AFF(!{q@!JEm znV0)NOs8WI#$9)8bzAtX-r!noi z_d!bD@LND0>NJZ!Q{{4qtBT+`58A*dqzU`C0TuI0Ql>5R6*m6}a1JNpuL&2`8RY^J zaWKWh{Hw{4uQkwzp5`rT#qz+H=b@Y{U~Q`!!Bi>g0a>@To<2I`mV-e|K3uItul}+V zH{@KKsZB5mX4Fa7N1)8xkiHKiX-#o!8a_5WE-^%$e9om(XP1VBVh-6G_$!h>#o86 z;SpkRpE#<$2=8uD+K?F8yd}LO?>-?Y48dDZCp6B_2BVD?j--36#%`WXsNPoQ!nyKD<_eA z3WPxSAn}M_vozPIL&Ay+B1<~4bx9vhn@v*G;OQG7U;ovZWdXxr+o|!`;azL-p8?v% zb{4?!nhg#pH`|AmW7H6vCoB*KS}yS&y)`0XQR*6n3$1j$)<&I_Qb04E5Kfzr`Ig!;){q&FOS*uf&VnL-Zr0%6bOat19l*X{8rLfM(si zuKeI41YPD#x&n1}Xb0lZtjS8caFM;kdPrg&HET!}_Dr>i!L-vA&g5OxL8eewqbX>a z3=(Y)KbEgT;u$-5(@^Bvn8axyLnOB9LANHQOOHtQqcWL(8Xs>A^GC!)b45?uaNa6v z8ARVSJ5w}PUn39e>?ZlX^lZp-|`A@gFniJTmSV6q`IoBe{-?H!P?>DB|Rx(Up|7wOBp`gR(3p zAN#Pun$Ne-ywxE)P-!z^$BB8RG(ucFE1ympcGa>V114;7K~3u<=jkLQXCJ;*S??^s z{z7n<85aKm$!nlm)QQS?jX{}nB4NNn9H>DBovOE|;WiHmIr zQSMW}u}0+yJhj)`l+RBhXs8|SOucGPg{v*q?FFf~IOQKKile4AY1eMwTzmtRP(=nF z?W(DBrAf|wT6p5XNvr3pzXZKQ0rCr|3M-D3Q!yq2^WX#9QT8}W91Uq(BUSTzx2&AG zHcBJUF$=mz90p3gCP_huvX6&wQZV@?6R>l$XukhI>Z*W3TFS?}2_ew`WmjZWRJP_6 zX=7%W70o=-CNG!g7Qe$~OXiz?L%Te75B+VKKC?6Ba2K(+^V)2(fwAi`LaT14;uVHj zqXOElJope}s&VN^BJWh;^9}pC8{*%k>VjYBVnKOnH@+tOFWyDih>PThzOB=Nx7_bG{ z93ZZg9kyT~9j^(9;UM4^!Dj&@6+%CbtmPlYr__h}&G9%g)xf^IKE(XtUhdi5pSwm_ zgwV^46Cz86aU{&2YT>yNgC9d3Oq$*P{GUBHCp~^AE5|F&Bx(ko^B)6__t#hIp;iF- zl$(;!GyFZ$UB-E5)`wZCg(Xz)7hi(#afT)p8kHmLTZKP$vXdgA*$0e}c)bc??3MUq zFHgffAdeFI8h6p4z^Q@mRUs#)Q2u(j7phM0;yv;jdPz-CUnUeS=oB zF-25OrEKwMv~$+ytbm`RV490BU~qH8dX7cWc%!PQgc@Yn7wJwBb|(Ude56EIz7S-6 zHOWgrJ053JWs>2}mXLrYDe1`9H_y&)@!a*^oYFfnTqKxY`t&H&;DrYM^vd*kN8ngI zzoTm?QT2GfqfCXN8KYDx@X2=y&+OOTe|EoBrUf}Yhl6J-USBfVnpg)2S!7f|j>qL+ zQ%AnjjFiyR5W2h>b8uxHd8u}y?wIkbZ~Y;?I1(;;u9%CmujFiqAw(|lBTIK-ov3RY z=NZ9smkw8PrAv@fc}*zCWNsAvJdL7&Y{5q?SbMA??e_tX%B}VL6SIhcB}c2mDkQ(c zNwIJw_UpZaMyOlg(ukEIQXk>beiUb`p*|KCh*u@(A*5-I0yEcZ@Nb9$htLqL17g~i z9Mu%l-qa!juH|Rc9+jtC1||0Cj@1^+YZjuw%eVp6>N^HRU|^I$Bg32Uur#W@e@oAk z4bQPu4&Sk)`K~U@DBE~+3a)Ps^Hd=qIlfEMpUxE_6qrW<_MO*r{&|M}HrXFc<1*Wo zItKlNw63f%2t#BaD}Ze>!R9w|0vxxLF^`#_Ar51`9>=&@NMp9<8j7$6AtN2KGsarz ziwLWH{S#Kb9Qi#gc5}d(t51D1{`~AOfi;bPNM|GF^ zpny>NjgKByTNWEQ5OBVwqr}#OIJ$W}|I#3S)pw^*T47oDpJvWsst-a|wVFqsq`840 zivgzJF1W(NiZ5$!>9mx>i^6scr>O>g>d6x*L8fy_q5unGs}Qu}c&t@xnnI|i%mL6B zY_Md~4Fylkb)zbbYPM0SiXLmwDQ4?9coR)YFzz!gI0cBw_!lmBnj14khXwB=Tfa(fYTj+kf|T&s&_e|R&<%% z=yN~*=%s|)Q*0jph3hT(PUL^1pp~C`wcT$VB~okUPR31yeITBX;H&5<=h{mnYy*uf*{){rCviwO({Oy zOv=|WvslA47ZA4T49MK&^I7{0qEG2ZUB%krFkaJoxDU4?PK zKN(sTzn`gRHbZ2wq+WB3LQKg@7lLA9f3Lf93cJy3fa2VIfYO$WAXe5JA+-X%3W5qv z+%e-%rL!y;M-?BtRJvLp1QyHIlW=r{(q)}Y3vUwHq8`g{(J_4Xc*(0+pQ;hS3vn>g zN;0^DHuDszQwVEe>gzucb)&HV&|hNKYpcCHnIW!fjo-=qy`NymJlA1IGZ!lH0Qh@E z{4th8wIo26-`{gQdP+U$*D*0L)aiv6DVq$?p)J* z8XzK^g8cR{l5F9PvaTh30OsQ$RnyLrRj%Hske(^$mf0-V(0Y=!4aV?{$!LSunh@o> zQs_93uHOCCsq~=0IEdL+nV?m-YoS3(#TOpvdo z;5G7v{0{cj)$Me^;Wa-b?*`K$Q;Ck`qK23rFOga2HE*}nki#qrQuhq6GR#`=zFvb3 z8Qg({jOg)y)V?KX$nMO|jIgwVpI++)P)pTbCYZK_+2w<+v#iecIG3lvCQfb0ZAWF{ zB=7Ng-c|TjCFf5kQV^;!;dT$@UkCR1p;=-Ph9>cZzO*UicLC!MBt9WBbzro|X4L=B zkRR_5O?6powE4PE(t)G=@}wQ!=IX#S<+IM2Nzs4=Mq}2Ex{qR3&_WG&b>n1dEmNfg ztsKvwJR6k_Rx;UtSmLp4oAbeLQw+(va`h9A4)0u*Gnx>fs~B^G-{UCf`WS;%a*pz+ zSb86xTgP@t7YKNYOCbPz(EF8f7=L(n8y1k#P7vZ@K{#?=5_G7UKaowdFIs8s_nRkG z{FOiHj{#a$3fC$L*w&zOoxK@OF`o;&cP6BQ#7L~)p+bI}pp+40#wLuJSR_`LsPysDkWRAr%bCcJXc#+#Jom~M!RiQ=b|9Otzr1eV3|WnS+f28%CTZ7N$aLQC zt%P2Ad?I6^KChMR8VtM$9r~Mk)S0Am+T&dI$L;dNNhlyeXaPqVH@U?&Zv8T4r4C8W zH0%Ta9%@9Dw;4SpegL1U$2A*WN9ihm9|QB8S|KMEuYapKFO@Fi$EW?_qS_*#16jFX z49(qmS$%qoJ}C3kjD)npQpO?Ufwo5Q$@NUA{*?!x{DqFfKn^1tnQS!gT2Pr&F!7g? z0zE)9Tf7u>(VzxeH9+jWyCbXLkW~;lS3MRIxAxv4U@2JW^A1Tc*Cxndu=%8s9+Hfg zBxH5|a|%yX>;|1F7g~XsAMWwgaZN9`c}K0HhwbA*0PiQ%Q_95eb@g4b1EW(a`OjPy z%<$bFjx5ySqQ@r$Y~X{biU_L7FZ@6taO?B`HZIk~KFl5&`NMl$Mlt)bq$kg(YM_2k zAb2zY6O=%nv#Np|Yux}y1mr@wtJ@|mp<)4+Mm@DNo>g7p(K!mSxCIUSMJ9fDQH{?!ziewY0`um}ty-^eLwFcWo29dewNP9vnswV+3Qs_b(c3=`SK5Rzz{6P?nq@)} zulbve6yk45r8?ZXm=bAaup>uMBc0gc~FdTQ| zj=mSp<=wkaz`_8M;tL-Bsz(vt-Hj`x0BxpdYEhG}+EivFro0<(Q2K##C}CxrqMH z=RC_p;-EXO$ zRVvKS`$(>A?Z@Z1ed3XN7Vi4HLuy*)p!)li537pX8rd#-<7Q3Ar5-A=^k&^@3)}r_ z($aD=a5q-%L?)u5l-m?Dg_JKdd+bP`aXvsz|4eHdc_#JmmvW= zUoe48q!fgB@$-Ht%tua>MMrvzphR=6O-zez`0O8l#%t2B#7%^jLbitZ|nk z_N{Kc?fb>rTZc$N0GD9RZo&oQADx+gU}#l|aqq>}&sNX(xoQnN#~8YN z@mDUE&Jt=#&2uIK^!n9%j^i)m8T46x(&heM0xFv79WA#NLVNBlu%1Ek@(E&G-6%HP z&≻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

    u(@yw-+qY@;S%zICnndVJ@FT3Q_K1 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 z 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⪻*NtMiij=)N!?~8>BSEQtOFo8dxV@E2|%qX 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%0ACl;idzU{5H&s@%Zu>h>WaV2YBjcEJSS4p3 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%0AaKhn=EEQJ)w5!|7TQ;sp|$Q zk7JPma?{}O3O|I!k%XrmG#|FUfJoLTD<R$+gUteOk>@@M=7aCi_&*Qz^`F+Ra*&@X2BMKS;gK7p)f@% z9+rDrrxJ=T1A4N)BpkEXJJ!jcWy6v>C8WFizFx2lG&H;8SIG%uVh-K|U-1S-4&K=^ zK_3It!!oQLd_Q-8@vY}EWa{yt&a(=w`?X@y2DM4qGHOX&G%L6AOJukv+CV&X@I^&s zLj3{^X+!z5j|6QJHvE)VEh8F~dtgKO)CXt>AWuN?c+C8uL*0r*S-)04@#-j6 zJyGdu&b-Q^*oiI#v|a}+?>&Z$n0o+u5pd$|$$EnDNRY>;={?$EzE5zcnD}zYcW_Un z@#=#t`295VNzwj&Q|$ZqvvvZgliOews`@^nj{<#mvNu6w4@jcC(#np&0^m7nedkHh zm=dDx=R0X^H1#gZMqxf|Tw%R7mJnY0Tx6Q_!ki@<1r0zKsLlHM9E*%L6WpHoPr^8o zPFS{9nN@Up(dOFH|D5Nz<=Q>rryDDcxHbJGq9_K)X81o#@R}H~0nQUu zw3yo^Ka(X8HVRM6$$mmMZ6f#?O(z3?wxDT0uS@NOu0>ABc$fxjvW040$+TYwYJKi9 zWVVOn`m_`Z3uX*uW>_qe!J8!{g|eFAcLuxyEu@Kr>Mh_MWfZ;)7S7Zby2t>MZZI^g z>emOkk_)Xd&iqW&8sHj)J6UUU9-H<7(m^W!X|*V&^KG!=izh}F)#_>+Vv91)|A)2M zw{9Cj395PAp64~u2L95_1qN~o5QO-vp?P0HmvN!oqQ~o1G2M8qs!)_eavZ}M zML|hE6|{_~^oj&ghx2ZEnXD=rvrfr_eCgX2SlH~R^0%VJ-NtUE$oP-gY!Q>ef-=?) z$Hvv=1q1V{1Snpm4iv>8;3dP;nO5{Ogg)dl^g+(M)cJ*Tvy_$0r1nwRfCn>+h;WiJ zqci$K-G`%Bfj9x4Q=rUG^_`%U9^bB2291y*0H9<@cVp%FJe1u!m42X=p~WWXzQW@U zqUeKz!LM;Hy@CzX+~=`eu?w{9N@G&&KXQE0rEFc@Vl_&H`fF9}4f-Iws^D+WZcP9d zCBh))$qm<`LlWlbZzroL3gT7l``Kht&^=yRLR5%F>Rz6lT%IKC-;?FTWTrq&tNAO3 zzpaB6`U7yLbJxjvI<1%Ws~^-|Q5e~xWlTM09(#2L?W7tDD%E}bmp$~!SpIjyI(sA% zxmT0K`|uG!FgW;?krb^7HY39S@9JOZHi-4?(YUmxJ`vHT^3n0?%@wQ>f1Jnl zN_oI;n6njl@C>MhEE9I~{=mWB21W~j4AD3UY7b-EbE>*O1_ge90UkyTJ)|vsru+6? zL*Sk0TR{bUhAv+g%|`=XAs%OKyiZY&n?a&{4^^1(u8z>TjjRGhCpIe=eh@<7{HL!2^vdR5DgzsfRlVD(Prl25UOh+_V2yvwo-2D$LsyCNb+ zK;|=U3{gv-zigiqD%?k*nTis1&_^bG2Ay+$-%3BFj#GE1H@%XwGZy%FVk6|I)(C6$ zSvaf!Km$Wh#_I>cb37N9)L{(r6v{wQ4qYa>x+8uXoay3ZHP+*QB3*L&4==EB9O!t^ ziYp^NsY@b2XqVi?G3O7zlnjT#^;@|qi@8Swjf3QMof|+l)cMbw&Rtm_@;dLEC^LKS zXyAcDqQEN0+oQ0*SdQBNpKm7qT~FmO9lo&8bT?q#wY>i6o*o0$-3TYr`r09&A% z(aJ(-6bfc4WV}R=XKa*yr(3T70~JwSaIhn zWOi@AQbm`@ezlNC@YS_pH2;eL9(+kECJI*Ion<>0w5OAr8M$}o2GN=kd{Vb<%uwPf zZa-J3_}#WU6$&I7o76k`+wX0~-}6!vW40p&>>QtAr_JIUh3a2Gp-(Sb=;C!_rb57{ zhLArnpHvDAC|_V`PBnojB_@mjlf*G(4SC60fPfT)WS`xiWG8KlHhh#a{*4zZme&{W1A3l~~+3F=_c+UaxzR)7?$5>r7<>BwmeTO{ z)6Jdl10APB9)|%Xi>W(nrY(c694na}MY+uKN9)oMKf$Y^NCfr2L6VXQ39~vu&3c1D z0?@rkCRg02=f3VHap--8@rGl!WzmG`0d6&^dQU2g9vdY+L^^{BHydPF{M6? ztd1*%4vU$2V6y^B00Lk?(RpWtz+w}7WT2Bk`c;xfZ~;SHyQNI0*moF2xa5n`AjgM1wqWQY^WWasN>3 zC;}P)5nbNZuvXrCcVpt}ipJl^gv{MKD7f0deYbcEOk{k^5AdW%KVaibk>}}46P1&TsW_Ua|URnr1L+DCA9+mg2Kue{KP*u{~S`0 zz#$mMKHQak*F{^0uUHf^_%}xqz`$l}!(3y`#Wl&TRS~z6#lP!x$n|rBOH13mk9o){ ztvUn_>XIXotgwHvS+Rl%T1sj*rSx!P%wK_4z4P_)0c-vX-0?TPtXS+PqD@eorck+H z%%h!{5j3@x?z;vx#d3NYudJIMII?6aXW_UTZQwv?jZ&3;Sj!;5d&2lz-GU;^I@bBp z!}XE1li2HN?}l^qen6QDc1%AFx2=3CrKssLs~l|lf~qMX;fT+{N(v$yMQ@Loe^G_B zs(pvPxy>c52)r#RRv(4Gauu7+lGcelVQ=4&q5g?}JDV^i_%TJKGs7TgWF!};i6boR zg|2DDzRm2pC04l>K5Zk82ZV)A!4(Jb%yX9oO}*dUSb2+3aJjyp%=l5i<5gzc)E3JA zUrBsEtt^%pBZ+%}w|~ozdHZA>MtGugzB38|3K(|;Av_$shkTeM_@C}9K+ZCdp?QlEET5LJ+my zACRA$A!_+~RqAw1Z^jbdn`k40H033iBxDBi`ImruCy%>;I+JxR+ZYK2#Yoq%!}^iJ zB&eVEMlx~rVKX<9sCXm?i>439aCMh%i%|J5UKO2|xx%5?G~;9&%aUPnktf%IcNO3y z?Dt8h79Ho5W}uk4LJEd>?$f3v-H!i2QZxH!*Ngztbg^Ojs<(E9D~2`X5y0s6@Qzxr zbM0pcL&GnsP;Gbyh$~mxT89_u1DI#(3VL#GcPwZcF_&kW+e@JK^*pO7YU!*mG#Y+< zQVP|d(Hw)C1o}cP(|+_9TKe-`_C>Or+jZlr(Nihf9qcbn=T68ZO-qULlwPd|pHtra zdAZEo{b4rMAGp?K<{C8-NO1f6lLM~C&T;mO5P*Aa>9ovF+O-PFofC;Y_xP1m&yn!) zLbrrJ0oLZx03E~NFkjsv%!#|6YMppaSI7V#p07GXQNV?!`9-va7LdoutWF0hVOGXA zxh=55w5|m@V+k=9cGCrVbt(I%VWxQ&u;?w9-z@Ij$@CGi4~WDlYIov#L4JsLQ;Eq> z`tswdp}dipnD=D*)NyrGRf3Ku-nVf0c|#v81|SqlEyy>;D?NpCCScwwV+=XapH;V)%D{^yyaeP zx(txgDWA}__Dv%8??m=97wZO&f9$haQj_p+&7F6AH+s|LKe9ULlOpNJ9Wm{9FnTxl zwiwE@Ey_A}MmU9W&Rk*Puq~>pb~==x>A(07cnB4_4`P5|2Eg(l=e2MHI@OX1(HP(# z^Jl2hF)qQV?r2x+$m@-&%TOcm`Vcko^2311gvS!srRnf9L5Z#wbQ`a6GsSfE3&scd zHbQ3*^)5t!1%H}3Nu{z!^Row-pg*Rs7{eu&wSbS*F186ZzGByyJUNZ1HEi2|i<76>=1CspCX2M$MJNsHU|tB3rhJL&+}qtK{JQw*ga} zA4wk|tco-x>R-Ar1Le-&tMK<-(N6v8C^S=3QDZ&n3%PjC{r617EiH0s_rCyf5rY%= z#lKc15GTc_u(^fXRg=bz?sq{2gBMIeCmo@teh15B(FBEXIUd`ez`Ad5u@D#XOicVStByMXcy#cYT+T?$ook+En?ln`;0uu9CRQ^>CyWB0!1nop8fLJH zET6fjvq#|jBah{84+|%^yp#>MW;e$Bl)KFi3L?Hru606Uzn0^c#c^Vjf3=%)C7;_) z52(9x$ski9YVQ%@Pwhb!o=p0uU8suyE;B~4t4bvw0zZLl%s+{T`VKT^Ptj)hbTeCV zgLW~ds}Z2X62tg{3Y-xGR zh1p<1GUfHDzN{?4{2oHArE}PCWWe>7)Af%QTF+m(m%Ot!bnzy((rajetFsvMjtMr5 zWHNAdB&Lgjek_H}Fmmvup9Bt%>qIB8uAr1VIx-Q*y%g*t?(pvPQIVx~NPv zzNpnLvELWQ1WYIERB4-$+;-IX*Ix43?}iD^E8wPIwoEpSO8l0+K@RQh@=eg*v46IDPEy zm}{aN5>i^D*f}1VT{8e}2?qGaFbeC+13C9%FsgiZT4M=WxHyZl>+xC$kIKXQ?>kol z4zAm%rN^Z!*-tb$8rcA$jf?Dm1S2cOgRF*%W5|<;9CCbw*r6HN!tj@Rd))fAfSog8 z)4U09b4&#PfZWV9(20hFe;V}4tHk=_!n@}&KewD1m`yhI_XFRN^YM6#%HSbNZ7u>28y1I)7bLVC zS}J4$GXNVSU;>-1t;20zXVEiqJTK2eTDzQjYyDawaAwr&7dKKD?z6~_#P$pWUj*HY=-#tZuno739Jq%3Q!HS> z56ULD^`#K|9Fs7-*@(}y=3J-JmD&Y%lQt>+SUgJ4MbwmSH(`MSd*m4#7b^Ko_7N0J zBjWAgSlT6VMH&w2VwXdpUi3~~O&Vj{h0NJvXVWrB7sc=*Q!86j1?V+O zyQ|o&t64IkBSU6<&`}Y95Hn2%3`uX;L0HWFSeXN*(xOHi@m=!hbBy8R>!Ow~&S`^* zwo{06+tp^4L?TD#mLQlKQ2GgS9Pi$7;<`fnWoPs%){=}nv?+zneKWgy~ol2S0IqvwJ zCE3k>eEvbmi(MIL$Nw?SMOV@>(v25U0N0V~h&Rgj6&aOYMs)fs#^op*%c-u}kJqZa zL(r986!G#mKTsryGidDZ?&H$&_~LgOsfYKPK?4IHw~h$-JqK50Gcc;uUB`i;e|Gn~ z#SF7cNq~FBKr5#G{}fEPQWi8~e#Kav8` zr;^`Cw}2b|&Ush``VpqduJ(g)WVaV3!@oOcY>~c{?~k+KI;#YJQt_S-k7U5rzSZ9uJAO2*gi4qEV0!(Y-bN0c!wyYW*_!`jC?JQl`^a}v zb%Q6-I=Upg9#k4ZiuSRZOhahZOw5RJiiW7G|>p z0K6FzdH!=`?sNX~EsrAX=TaUa9S~^dy0p}@D$Gm|#EunX0piQhf+=rXIN4s3@97*} z7luUW8sYDi1y0XG5usw-O1SF=W|<1a!c1J;e0Q9a@b|$M89`EF{a_O?k9nGK1>_j4 z@3i|_ImqOEpXwxVCB zp|L}oym19D6_2w%DwmB7y`F{Ltqxu(97T2kVQHBGneI>iLzOrnPMbF9Rsv&d(j9}$ zqc>vm$1lzpT$Ne`9LKI~Lm3Oiw_$!;l@$>^M8EaTJLGQ6XbC&87u6cp=|*+X4Y=&j~QL@b1ezEK{}e>uzVX2+^6R5iZakh zYx?#oaMyL^2#rkX>p9;I;Emq2BsAm^i|YPOveA7kQ=LM+j9-?;U3_kTn1dz(#J1!- zmc1fE48+VF&gUlNO~An$mGU;9p|WhBGfnm6z|@A7)_b&jHF~8$OSZD~upDtf4!MMC z$`vqF!~^r>U1z3)ROu-fZAk#|G$4MltH=cLu0+hy9usAG-O$hQ&MkPzG5wSba{@~q zn2146pp6)P*Ef5Zxw%c1fzxUsJjBa-n}3_JbI-nBdQczK_|ey(%6Qil7A(MI3RTdv3Z(FUikEEspDwa&pWm4*f zI_9=y&9wiwU^9ln1Xhd6Xs>E!QB~dM<~Xx7Dg13a-O?(u$xx}fXzJ|Z9`6#ega;=G z=9lx7q3o#b9guOC^&g%-iL+IUt<<9!{8$<`;V>syh+?Rfe)17x!Aq4t@p`b1UOS(J&CcEOq33r<>EqxaO}DcJ!J zn`N%aR(9fgJ9gTa=NYWnzu2{BdFi9SMGa*h=2UJ*r7tUJvU85vnm(=*&a!5i-2pL7 z>TIPYh=#W$erh}pB}OXZD5Dy@c4@ryn(f1q_Rb*(uarxUzH$2JZl#W$YBCgt#FN&e z40sZbYYUpTMiIVXIBjud5#L)Iq8K{Y2H$A|IguVYLTfL?2Q$m25AB&;Eim(DWO6d=7tKW+fDepA+AfXGet+mfWgrmIfH5UM4YcViObLuchZ zmgu6=xRVcLt{cbEzN$x%aGhyhypIDL2BG?FS(q1V-!=Lmz@}=ZOJdE`pR>_66dZf6 zxqF%M>t|QDc?|dXZnnpYsr&>(CC?AF43K==kgR@m+NZJ4QdhLAFm9T*G zN@)IlfS6@5*rLB(Is7ED?wK`HuI|xpe{Yk5&FfY3gt_ zopiuf3Zz|2Htbw2?dht!>YK`8^*zyJ#Y&{tbsp_lSFo(63f-*9a>jsi@mGoOc-qEn z4#*fXoRKwC^(9*HJoiU)o9r$|>A{zYMYrExc?yq12axCADTHBA4rICI z4-kzw^ji0dtuNDuy-+~-WAF%Y*uAJI8a3!}RJbq`LGW}tLrC!rhcEhB{Njat9Xj|? z)tqT0PRkPTo?^?W8hNN9!;tYCot8GV?H{=-dsVyh*i408p+0G2EpJ{r@-+|z z<0S(VO=JOs@%6Hm;%GHW;3l7P#4^4BICSiN42szIg)ZeAQ!3k*l8pwek)8}|AryG3 zWRM2YVp`T@wYvrXT_P;gr4 zx@b=)+CaMmcQ;>wa+crEKBak{vltsGD^2-gU?3=uxBG zli(`ALm{XLUmuMnjB!S4)C)HzC&k>mE8S}v<1M`U`r3GzzeMxqFy=KlSt{>FzWWyl zu81bq)>h+yxPGvW>LOpJaT-AFQ?6Q+h%RLnq#^QP36H>~+bB8t#9LH~a~SnE;73;L zK${9Pns3w^1cm0fgohknv2AsS8KGM!C{|^pLss@jUd`j`A9Mn1fqpmhe)v=S%

  • RZ5T^JTC+kh0F?eAZ@6s$B@ge#L4WG7zZ@E6! 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